%PDF- %PDF-
| Direktori : /lib/calibre/calibre/gui2/dialogs/ |
| Current File : //lib/calibre/calibre/gui2/dialogs/device_category_editor.py |
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
from qt.core import Qt, QDialog, QListWidgetItem
from calibre.gui2.dialogs.device_category_editor_ui import Ui_DeviceCategoryEditor
from calibre.gui2 import question_dialog, error_dialog
class ListWidgetItem(QListWidgetItem):
def __init__(self, txt):
QListWidgetItem.__init__(self, txt)
self.initial_value = txt
self.current_value = txt
self.previous_value = txt
def data(self, role):
if role == Qt.ItemDataRole.DisplayRole:
if self.initial_value != self.current_value:
return _('%(curr)s (was %(initial)s)')%dict(
curr=self.current_value, initial=self.initial_value)
else:
return self.current_value
elif role == Qt.ItemDataRole.EditRole:
return self.current_value
else:
return QListWidgetItem.data(self, role)
def setData(self, role, data):
if role == Qt.ItemDataRole.EditRole:
self.previous_value = self.current_value
self.current_value = data
QListWidgetItem.setData(self, role, data)
def text(self):
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.current_value = txt
QListWidgetItem.setText(txt)
class DeviceCategoryEditor(QDialog, Ui_DeviceCategoryEditor):
def __init__(self, window, tag_to_match, data, key):
QDialog.__init__(self, window)
Ui_DeviceCategoryEditor.__init__(self)
self.setupUi(self)
# Remove help icon on title bar
icon = self.windowIcon()
self.setWindowFlags(self.windowFlags()&(~Qt.WindowType.WindowContextHelpButtonHint))
self.setWindowIcon(icon)
self.to_rename = {}
self.to_delete = set()
self.original_names = {}
self.all_tags = {}
for k,v in data:
self.all_tags[v] = k
self.original_names[k] = v
for tag in sorted(self.all_tags.keys(), key=key):
item = ListWidgetItem(tag)
item.setData(Qt.ItemDataRole.UserRole, self.all_tags[tag])
item.setFlags(item.flags() | Qt.ItemFlag.ItemIsEditable)
self.available_tags.addItem(item)
if tag_to_match is not None:
items = self.available_tags.findItems(tag_to_match, Qt.MatchFlag.MatchExactly)
if len(items) == 1:
self.available_tags.setCurrentItem(items[0])
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(item.previous_text())
return
if item.text() != item.initial_text():
id_ = int(item.data(Qt.ItemDataRole.UserRole))
self.to_rename[id_] = str(item.text())
def rename_tag(self):
item = self.available_tags.currentItem()
self._rename_tag(item)
def _rename_tag(self, item):
if item is None:
error_dialog(self, _('No item selected'),
_('You must select one item from the list of available items.')).exec()
return
self.available_tags.editItem(item)
def delete_tags(self):
deletes = self.available_tags.selectedItems()
if not deletes:
error_dialog(self, _('No items selected'),
_('You must select at least one item from the list.')).exec()
return
ct = ', '.join([str(item.text()) for item in deletes])
if not question_dialog(self, _('Are you sure?'),
'<p>'+_('Are you sure you want to delete the following items?')+'<br>'+ct):
return
row = self.available_tags.row(deletes[0])
for item in deletes:
id = int(item.data(Qt.ItemDataRole.UserRole))
self.to_delete.add(id)
self.available_tags.takeItem(self.available_tags.row(item))
if row >= self.available_tags.count():
row = self.available_tags.count() - 1
if row >= 0:
self.available_tags.scrollToItem(self.available_tags.item(row))