Add rename tag to the new tag editor

This commit is contained in:
Charles Haley 2010-06-02 21:21:24 +01:00
parent 0071554a9e
commit 59b1ef5ef8
5 changed files with 72 additions and 31 deletions

View File

@ -1,6 +1,6 @@
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
from PyQt4.QtCore import SIGNAL
from PyQt4.QtCore import SIGNAL, Qt
from PyQt4.QtGui import QDialog
from calibre.gui2.dialogs.tag_list_editor_ui import Ui_TagListEditor
@ -11,11 +11,12 @@ class TagListEditor(QDialog, Ui_TagListEditor):
def tag_cmp(self, x, y):
return cmp(x.lower(), y.lower())
def __init__(self, window, db):
def __init__(self, window, db, tag_to_match):
QDialog.__init__(self, window)
Ui_TagListEditor.__init__(self)
self.setupUi(self)
self.to_rename = {}
self.to_delete = []
self.db = db
all_tags = [tag for tag in self.db.all_tags()]
@ -24,7 +25,30 @@ class TagListEditor(QDialog, Ui_TagListEditor):
for tag in all_tags:
self.available_tags.addItem(tag)
items = self.available_tags.findItems(tag_to_match, Qt.MatchExactly)
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)
def finish_editing(self, item):
if item.text() != self.item_before_editing:
self.to_rename[self.item_before_editing] = 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 tag selected', 'You must select one tag from the list of Available tags.').exec_()
return
self.item_before_editing = item.text()
item.setFlags (item.flags() | Qt.ItemIsEditable);
self.available_tags.editItem(item)
def delete_tags(self, item=None):
confirms, deletes = [], []
@ -49,6 +73,8 @@ class TagListEditor(QDialog, Ui_TagListEditor):
self.available_tags.takeItem(self.available_tags.row(item))
def accept(self):
for item in self.to_rename:
self.db.rename_tag(old=unicode(item), new=unicode(self.to_rename[item]))
for item in self.to_delete:
self.db.delete_tag(unicode(item.text()))
QDialog.accept(self)

View File

@ -49,6 +49,8 @@
</item>
<item>
<layout class="QHBoxLayout">
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QToolButton" name="delete_button">
<property name="toolTip">
@ -63,13 +65,29 @@
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="rename_button">
<property name="toolTip">
<string>Rename the tag everywhere it is used.</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset>
<normaloff>:/images/edit_input.svg</normaloff>:/images/edit_input.svg</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QListWidget" name="available_tags">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::MultiSelection</enum>
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
@ -92,9 +110,7 @@
</item>
</layout>
</widget>
<resources>
<include location="../../../../resources/images.qrc"/>
</resources>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>

View File

@ -24,7 +24,7 @@ class TagsView(QTreeView): # {{{
restriction_set = pyqtSignal(object)
tags_marked = pyqtSignal(object, object)
user_category_edit = pyqtSignal(object)
tag_list_edit = pyqtSignal()
tag_list_edit = pyqtSignal(object)
saved_search_edit = pyqtSignal(object)
def __init__(self, *args):
@ -91,7 +91,7 @@ class TagsView(QTreeView): # {{{
return
try:
if action == 'manage_tags':
self.tag_list_edit.emit();
self.tag_list_edit.emit(category);
return
if action == 'manage_categories':
self.user_category_edit.emit(category)
@ -137,7 +137,8 @@ class TagsView(QTreeView): # {{{
self.context_menu.addSeparator()
self.context_menu.addAction(_('Manage Tags'),
partial(self.context_menu_handler, action='manage_tags'))
partial(self.context_menu_handler, action='manage_tags',
category=tag_name))
if category in prefs['user_categories'].keys():
self.context_menu.addAction(_('Manage User Categories'),
@ -148,14 +149,9 @@ class TagsView(QTreeView): # {{{
partial(self.context_menu_handler, action='manage_categories',
category=None))
if tag_name in saved_searches.names():
self.context_menu.addAction(_('Manage Saved Searches'),
partial(self.context_menu_handler, action='manage_searches',
category=tag_name))
else:
self.context_menu.addAction(_('Manage Saved Searches'),
partial(self.context_menu_handler, action='manage_searches',
category=None))
self.context_menu.popup(self.mapToGlobal(point))
return True;

View File

@ -655,8 +655,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.tags_view.set_new_model()
self.tags_view.recount()
def do_tags_list_edit(self):
d = TagListEditor(self, self.library_view.model().db)
def do_tags_list_edit(self, tag):
d = TagListEditor(self, self.library_view.model().db, tag)
d.exec_()
if d.result() == d.Accepted:
self.tags_view.set_new_model()

View File

@ -980,6 +980,9 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
if notify:
self.notify('metadata', [id])
def rename_tag(self, old, new):
self.conn.execute('UPDATE tags SET name=? WHERE name=?', (new, old))
def get_tags(self, id):
result = self.conn.get(
'SELECT name FROM tags WHERE id IN (SELECT tag FROM books_tags_link WHERE book=?)',