mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Add rename tag to the new tag editor
This commit is contained in:
parent
0071554a9e
commit
59b1ef5ef8
@ -1,6 +1,6 @@
|
|||||||
__license__ = 'GPL v3'
|
__license__ = 'GPL v3'
|
||||||
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
|
__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 PyQt4.QtGui import QDialog
|
||||||
|
|
||||||
from calibre.gui2.dialogs.tag_list_editor_ui import Ui_TagListEditor
|
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):
|
def tag_cmp(self, x, y):
|
||||||
return cmp(x.lower(), y.lower())
|
return cmp(x.lower(), y.lower())
|
||||||
|
|
||||||
def __init__(self, window, db):
|
def __init__(self, window, db, tag_to_match):
|
||||||
QDialog.__init__(self, window)
|
QDialog.__init__(self, window)
|
||||||
Ui_TagListEditor.__init__(self)
|
Ui_TagListEditor.__init__(self)
|
||||||
self.setupUi(self)
|
self.setupUi(self)
|
||||||
|
|
||||||
|
self.to_rename = {}
|
||||||
self.to_delete = []
|
self.to_delete = []
|
||||||
self.db = db
|
self.db = db
|
||||||
all_tags = [tag for tag in self.db.all_tags()]
|
all_tags = [tag for tag in self.db.all_tags()]
|
||||||
@ -24,7 +25,30 @@ class TagListEditor(QDialog, Ui_TagListEditor):
|
|||||||
for tag in all_tags:
|
for tag in all_tags:
|
||||||
self.available_tags.addItem(tag)
|
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.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):
|
def delete_tags(self, item=None):
|
||||||
confirms, deletes = [], []
|
confirms, deletes = [], []
|
||||||
@ -49,6 +73,8 @@ class TagListEditor(QDialog, Ui_TagListEditor):
|
|||||||
self.available_tags.takeItem(self.available_tags.row(item))
|
self.available_tags.takeItem(self.available_tags.row(item))
|
||||||
|
|
||||||
def accept(self):
|
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:
|
for item in self.to_delete:
|
||||||
self.db.delete_tag(unicode(item.text()))
|
self.db.delete_tag(unicode(item.text()))
|
||||||
QDialog.accept(self)
|
QDialog.accept(self)
|
||||||
|
@ -50,18 +50,36 @@
|
|||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout">
|
<layout class="QHBoxLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QToolButton" name="delete_button">
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
<property name="toolTip">
|
<item>
|
||||||
<string>Delete tag from database. This will unapply the tag from all books and then remove it from the database.</string>
|
<widget class="QToolButton" name="delete_button">
|
||||||
</property>
|
<property name="toolTip">
|
||||||
<property name="text">
|
<string>Delete tag from database. This will unapply the tag from all books and then remove it from the database.</string>
|
||||||
<string>...</string>
|
</property>
|
||||||
</property>
|
<property name="text">
|
||||||
<property name="icon">
|
<string>...</string>
|
||||||
<iconset>
|
</property>
|
||||||
<normaloff>:/images/trash.svg</normaloff>:/images/trash.svg</iconset>
|
<property name="icon">
|
||||||
</property>
|
<iconset>
|
||||||
</widget>
|
<normaloff>:/images/trash.svg</normaloff>:/images/trash.svg</iconset>
|
||||||
|
</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>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QListWidget" name="available_tags">
|
<widget class="QListWidget" name="available_tags">
|
||||||
@ -69,7 +87,7 @@
|
|||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="selectionMode">
|
<property name="selectionMode">
|
||||||
<enum>QAbstractItemView::MultiSelection</enum>
|
<enum>QAbstractItemView::ExtendedSelection</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="selectionBehavior">
|
<property name="selectionBehavior">
|
||||||
<enum>QAbstractItemView::SelectRows</enum>
|
<enum>QAbstractItemView::SelectRows</enum>
|
||||||
@ -92,9 +110,7 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources>
|
<resources/>
|
||||||
<include location="../../../../resources/images.qrc"/>
|
|
||||||
</resources>
|
|
||||||
<connections>
|
<connections>
|
||||||
<connection>
|
<connection>
|
||||||
<sender>buttonBox</sender>
|
<sender>buttonBox</sender>
|
||||||
|
@ -24,7 +24,7 @@ class TagsView(QTreeView): # {{{
|
|||||||
restriction_set = pyqtSignal(object)
|
restriction_set = pyqtSignal(object)
|
||||||
tags_marked = pyqtSignal(object, object)
|
tags_marked = pyqtSignal(object, object)
|
||||||
user_category_edit = pyqtSignal(object)
|
user_category_edit = pyqtSignal(object)
|
||||||
tag_list_edit = pyqtSignal()
|
tag_list_edit = pyqtSignal(object)
|
||||||
saved_search_edit = pyqtSignal(object)
|
saved_search_edit = pyqtSignal(object)
|
||||||
|
|
||||||
def __init__(self, *args):
|
def __init__(self, *args):
|
||||||
@ -91,7 +91,7 @@ class TagsView(QTreeView): # {{{
|
|||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
if action == 'manage_tags':
|
if action == 'manage_tags':
|
||||||
self.tag_list_edit.emit();
|
self.tag_list_edit.emit(category);
|
||||||
return
|
return
|
||||||
if action == 'manage_categories':
|
if action == 'manage_categories':
|
||||||
self.user_category_edit.emit(category)
|
self.user_category_edit.emit(category)
|
||||||
@ -137,7 +137,8 @@ class TagsView(QTreeView): # {{{
|
|||||||
|
|
||||||
self.context_menu.addSeparator()
|
self.context_menu.addSeparator()
|
||||||
self.context_menu.addAction(_('Manage Tags'),
|
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():
|
if category in prefs['user_categories'].keys():
|
||||||
self.context_menu.addAction(_('Manage User Categories'),
|
self.context_menu.addAction(_('Manage User Categories'),
|
||||||
@ -148,14 +149,9 @@ class TagsView(QTreeView): # {{{
|
|||||||
partial(self.context_menu_handler, action='manage_categories',
|
partial(self.context_menu_handler, action='manage_categories',
|
||||||
category=None))
|
category=None))
|
||||||
|
|
||||||
if tag_name in saved_searches.names():
|
self.context_menu.addAction(_('Manage Saved Searches'),
|
||||||
self.context_menu.addAction(_('Manage Saved Searches'),
|
partial(self.context_menu_handler, action='manage_searches',
|
||||||
partial(self.context_menu_handler, action='manage_searches',
|
category=tag_name))
|
||||||
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))
|
self.context_menu.popup(self.mapToGlobal(point))
|
||||||
return True;
|
return True;
|
||||||
|
@ -655,8 +655,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
|
|||||||
self.tags_view.set_new_model()
|
self.tags_view.set_new_model()
|
||||||
self.tags_view.recount()
|
self.tags_view.recount()
|
||||||
|
|
||||||
def do_tags_list_edit(self):
|
def do_tags_list_edit(self, tag):
|
||||||
d = TagListEditor(self, self.library_view.model().db)
|
d = TagListEditor(self, self.library_view.model().db, tag)
|
||||||
d.exec_()
|
d.exec_()
|
||||||
if d.result() == d.Accepted:
|
if d.result() == d.Accepted:
|
||||||
self.tags_view.set_new_model()
|
self.tags_view.set_new_model()
|
||||||
|
@ -980,6 +980,9 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
|
|||||||
if notify:
|
if notify:
|
||||||
self.notify('metadata', [id])
|
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):
|
def get_tags(self, id):
|
||||||
result = self.conn.get(
|
result = self.conn.get(
|
||||||
'SELECT name FROM tags WHERE id IN (SELECT tag FROM books_tags_link WHERE book=?)',
|
'SELECT name FROM tags WHERE id IN (SELECT tag FROM books_tags_link WHERE book=?)',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user