mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
fix #8807: Renaming using the Category Editor, along with several other bugs found at the same time
This commit is contained in:
parent
56f4ab8e68
commit
b8b6c83a1d
@ -2,7 +2,7 @@ __license__ = 'GPL v3'
|
||||
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
|
||||
|
||||
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():
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user