From b8b6c83a1d2096dcbcf3c1d42c09905a76cdaf10 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 7 Feb 2011 09:29:09 +0000 Subject: [PATCH] fix #8807: Renaming using the Category Editor, along with several other bugs found at the same time --- src/calibre/gui2/dialogs/tag_list_editor.py | 54 +++++++++++---------- src/calibre/gui2/tag_view.py | 5 +- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/src/calibre/gui2/dialogs/tag_list_editor.py b/src/calibre/gui2/dialogs/tag_list_editor.py index ced0e9a505..5e35a236e4 100644 --- a/src/calibre/gui2/dialogs/tag_list_editor.py +++ b/src/calibre/gui2/dialogs/tag_list_editor.py @@ -2,7 +2,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' 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 import question_dialog, error_dialog @@ -11,30 +11,38 @@ class ListWidgetItem(QListWidgetItem): def __init__(self, txt): QListWidgetItem.__init__(self, txt) - self.old_value = txt - self.cur_value = txt + self.initial_value = txt + self.current_value = txt + self.previous_value = txt def data(self, role): if role == Qt.DisplayRole: - if self.old_value != self.cur_value: - return _('%s (was %s)')%(self.cur_value, self.old_value) + if self.initial_value != self.current_value: + return _('%s (was %s)')%(self.current_value, self.initial_value) else: - return self.cur_value + return self.current_value elif role == Qt.EditRole: - return self.cur_value + return self.current_value else: return QListWidgetItem.data(self, role) def setData(self, role, data): 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) 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): - self.cur_value = txt + self.current_value = txt QListWidgetItem.setText(txt) class TagListEditor(QDialog, Ui_TagListEditor): @@ -49,7 +57,7 @@ class TagListEditor(QDialog, Ui_TagListEditor): self.setWindowIcon(icon) self.to_rename = {} - self.to_delete = [] + self.to_delete = set() self.all_tags = {} for k,v in data: @@ -57,6 +65,7 @@ class TagListEditor(QDialog, Ui_TagListEditor): for tag in sorted(self.all_tags.keys(), key=key): item = ListWidgetItem(tag) item.setData(Qt.UserRole, self.all_tags[tag]) + item.setFlags (item.flags() | Qt.ItemIsEditable); self.available_tags.addItem(item) if tag_to_match is not None: @@ -64,23 +73,20 @@ class TagListEditor(QDialog, Ui_TagListEditor): if len(items) == 1: self.available_tags.setCurrentItem(items[0]) - self.connect(self.delete_button, SIGNAL('clicked()'), self.delete_tags) - self.connect(self.rename_button, SIGNAL('clicked()'), self.rename_tag) - self.connect(self.available_tags, SIGNAL('itemDoubleClicked(QListWidgetItem *)'), self._rename_tag) - self.connect(self.available_tags, SIGNAL('itemChanged(QListWidgetItem *)'), self.finish_editing) + self.delete_button.clicked.connect(self.delete_tags) + self.rename_button.clicked.connect(self.rename_tag) + self.available_tags.itemDoubleClicked.connect(self._rename_tag) + self.available_tags.itemChanged.connect(self.finish_editing) def finish_editing(self, item): if not item.text(): error_dialog(self, _('Item is blank'), _('An item cannot be set to nothing. Delete it instead.')).exec_() - item.setText(self.item_before_editing.text()) + item.setText(item.previous_text()) return - if item.text() != self.item_before_editing.text(): - (id,ign) = self.item_before_editing.data(Qt.UserRole).toInt() - if item.text() not in self.to_rename: - self.to_rename[item.text()] = [id] - else: - self.to_rename[item.text()].append(id) + if item.text() != item.initial_text(): + id_ = item.data(Qt.UserRole).toInt()[0] + self.to_rename[id_] = item.text() def rename_tag(self): item = self.available_tags.currentItem() @@ -91,8 +97,6 @@ class TagListEditor(QDialog, Ui_TagListEditor): error_dialog(self, _('No item selected'), _('You must select one item from the list of Available items.')).exec_() return - self.item_before_editing = item.clone() - item.setFlags (item.flags() | Qt.ItemIsEditable); self.available_tags.editItem(item) def delete_tags(self, item=None): @@ -108,7 +112,7 @@ class TagListEditor(QDialog, Ui_TagListEditor): row = self.available_tags.row(deletes[0]) for item in deletes: (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)) if row >= self.available_tags.count(): diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 041f0a715e..fd3530d333 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -1259,9 +1259,8 @@ class TagBrowserMixin(object): # {{{ if rename_func: for item in to_delete: delete_func(item) - for text in to_rename: - for old_id in to_rename[text]: - rename_func(old_id, new_name=unicode(text)) + for old_id in to_rename: + rename_func(old_id, new_name=unicode(to_rename[old_id])) # Clean up the library view self.do_tag_item_renamed()