fix #8807: Renaming using the Category Editor, along with several other bugs found at the same time

This commit is contained in:
Charles Haley 2011-02-07 09:29:09 +00:00
parent 56f4ab8e68
commit b8b6c83a1d
2 changed files with 31 additions and 28 deletions

View File

@ -2,7 +2,7 @@ __license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>' __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
from PyQt4.QtCore import SIGNAL, Qt from PyQt4.QtCore import SIGNAL, Qt
from PyQt4.QtGui import QDialog, QListWidgetItem from PyQt4.QtGui import QDialog, QListWidgetItem, QListWidget
from calibre.gui2.dialogs.tag_list_editor_ui import Ui_TagListEditor from calibre.gui2.dialogs.tag_list_editor_ui import Ui_TagListEditor
from calibre.gui2 import question_dialog, error_dialog from calibre.gui2 import question_dialog, error_dialog
@ -11,30 +11,38 @@ class ListWidgetItem(QListWidgetItem):
def __init__(self, txt): def __init__(self, txt):
QListWidgetItem.__init__(self, txt) QListWidgetItem.__init__(self, txt)
self.old_value = txt self.initial_value = txt
self.cur_value = txt self.current_value = txt
self.previous_value = txt
def data(self, role): def data(self, role):
if role == Qt.DisplayRole: if role == Qt.DisplayRole:
if self.old_value != self.cur_value: if self.initial_value != self.current_value:
return _('%s (was %s)')%(self.cur_value, self.old_value) return _('%s (was %s)')%(self.current_value, self.initial_value)
else: else:
return self.cur_value return self.current_value
elif role == Qt.EditRole: elif role == Qt.EditRole:
return self.cur_value return self.current_value
else: else:
return QListWidgetItem.data(self, role) return QListWidgetItem.data(self, role)
def setData(self, role, data): def setData(self, role, data):
if role == Qt.EditRole: if role == Qt.EditRole:
self.cur_value = data.toString() self.previous_value = self.current_value
self.current_value = data.toString()
QListWidgetItem.setData(self, role, data) QListWidgetItem.setData(self, role, data)
def text(self): def text(self):
return self.cur_value return self.current_value
def initial_text(self):
return self.initial_value
def previous_text(self):
return self.previous_value
def setText(self, txt): def setText(self, txt):
self.cur_value = txt self.current_value = txt
QListWidgetItem.setText(txt) QListWidgetItem.setText(txt)
class TagListEditor(QDialog, Ui_TagListEditor): class TagListEditor(QDialog, Ui_TagListEditor):
@ -49,7 +57,7 @@ class TagListEditor(QDialog, Ui_TagListEditor):
self.setWindowIcon(icon) self.setWindowIcon(icon)
self.to_rename = {} self.to_rename = {}
self.to_delete = [] self.to_delete = set()
self.all_tags = {} self.all_tags = {}
for k,v in data: for k,v in data:
@ -57,6 +65,7 @@ class TagListEditor(QDialog, Ui_TagListEditor):
for tag in sorted(self.all_tags.keys(), key=key): for tag in sorted(self.all_tags.keys(), key=key):
item = ListWidgetItem(tag) item = ListWidgetItem(tag)
item.setData(Qt.UserRole, self.all_tags[tag]) item.setData(Qt.UserRole, self.all_tags[tag])
item.setFlags (item.flags() | Qt.ItemIsEditable);
self.available_tags.addItem(item) self.available_tags.addItem(item)
if tag_to_match is not None: if tag_to_match is not None:
@ -64,23 +73,20 @@ class TagListEditor(QDialog, Ui_TagListEditor):
if len(items) == 1: if len(items) == 1:
self.available_tags.setCurrentItem(items[0]) self.available_tags.setCurrentItem(items[0])
self.connect(self.delete_button, SIGNAL('clicked()'), self.delete_tags) self.delete_button.clicked.connect(self.delete_tags)
self.connect(self.rename_button, SIGNAL('clicked()'), self.rename_tag) self.rename_button.clicked.connect(self.rename_tag)
self.connect(self.available_tags, SIGNAL('itemDoubleClicked(QListWidgetItem *)'), self._rename_tag) self.available_tags.itemDoubleClicked.connect(self._rename_tag)
self.connect(self.available_tags, SIGNAL('itemChanged(QListWidgetItem *)'), self.finish_editing) self.available_tags.itemChanged.connect(self.finish_editing)
def finish_editing(self, item): def finish_editing(self, item):
if not item.text(): if not item.text():
error_dialog(self, _('Item is blank'), error_dialog(self, _('Item is blank'),
_('An item cannot be set to nothing. Delete it instead.')).exec_() _('An item cannot be set to nothing. Delete it instead.')).exec_()
item.setText(self.item_before_editing.text()) item.setText(item.previous_text())
return return
if item.text() != self.item_before_editing.text(): if item.text() != item.initial_text():
(id,ign) = self.item_before_editing.data(Qt.UserRole).toInt() id_ = item.data(Qt.UserRole).toInt()[0]
if item.text() not in self.to_rename: self.to_rename[id_] = item.text()
self.to_rename[item.text()] = [id]
else:
self.to_rename[item.text()].append(id)
def rename_tag(self): def rename_tag(self):
item = self.available_tags.currentItem() item = self.available_tags.currentItem()
@ -91,8 +97,6 @@ class TagListEditor(QDialog, Ui_TagListEditor):
error_dialog(self, _('No item selected'), error_dialog(self, _('No item selected'),
_('You must select one item from the list of Available items.')).exec_() _('You must select one item from the list of Available items.')).exec_()
return return
self.item_before_editing = item.clone()
item.setFlags (item.flags() | Qt.ItemIsEditable);
self.available_tags.editItem(item) self.available_tags.editItem(item)
def delete_tags(self, item=None): def delete_tags(self, item=None):
@ -108,7 +112,7 @@ class TagListEditor(QDialog, Ui_TagListEditor):
row = self.available_tags.row(deletes[0]) row = self.available_tags.row(deletes[0])
for item in deletes: for item in deletes:
(id,ign) = item.data(Qt.UserRole).toInt() (id,ign) = item.data(Qt.UserRole).toInt()
self.to_delete.append(id) self.to_delete.add(id)
self.available_tags.takeItem(self.available_tags.row(item)) self.available_tags.takeItem(self.available_tags.row(item))
if row >= self.available_tags.count(): if row >= self.available_tags.count():

View File

@ -1259,9 +1259,8 @@ class TagBrowserMixin(object): # {{{
if rename_func: if rename_func:
for item in to_delete: for item in to_delete:
delete_func(item) delete_func(item)
for text in to_rename: for old_id in to_rename:
for old_id in to_rename[text]: rename_func(old_id, new_name=unicode(to_rename[old_id]))
rename_func(old_id, new_name=unicode(text))
# Clean up the library view # Clean up the library view
self.do_tag_item_renamed() self.do_tag_item_renamed()