GEPS 011: Tagging - Allow edit of tag name

svn: r15944
This commit is contained in:
Nick Hall 2010-09-30 22:29:52 +00:00
parent a1cf8a387a
commit 489a3da00a
2 changed files with 97 additions and 61 deletions

View File

@ -40,6 +40,7 @@ class SidebarFilter(DbGUIElement):
self.signal_map = {
'tag-add' : self._tag_add,
'tag-delete' : self._tag_delete,
'tag-update' : self._tag_update,
'tag-rebuild' : self._tag_rebuild
}
DbGUIElement.__init__(self, dbstate.db)
@ -180,18 +181,29 @@ class SidebarFilter(DbGUIElement):
Called when tags are added.
"""
for handle in handle_list:
tag = self.dbstate.db.get_tag_from_handle(handle)
insort_left(self.__tag_list, tag.get_name())
self.on_tags_changed(self.__tag_list)
tag = self.dbstate.db.get_tag_from_handle(handle)
insort_left(self.__tag_list, (tag.get_name(), handle))
self.on_tags_changed([item[0] for item in self.__tag_list])
def _tag_update(self, handle_list):
"""
Called when tags are updated.
"""
for handle in handle_list:
item = [item for item in self.__tag_list if item[1] == handle][0]
self.__tag_list.remove(item)
tag = self.dbstate.db.get_tag_from_handle(handle)
insort_left(self.__tag_list, (tag.get_name(), handle))
self.on_tags_changed([item[0] for item in self.__tag_list])
def _tag_delete(self, handle_list):
"""
Called when tags are deleted.
"""
for handle in handle_list:
tag = self.dbstate.db.get_tag_from_handle(handle)
self.__tag_list.remove(tag.get_name())
self.on_tags_changed(self.__tag_list)
tag = self.dbstate.db.get_tag_from_handle(handle)
self.__tag_list.remove((tag.get_name(), handle))
self.on_tags_changed([item[0] for item in self.__tag_list])
def _tag_rebuild(self):
"""
@ -200,8 +212,8 @@ class SidebarFilter(DbGUIElement):
self.__tag_list = []
for handle in self.dbstate.db.get_tag_handles():
tag = self.dbstate.db.get_tag_from_handle(handle)
self.__tag_list.append(tag.get_name())
self.on_tags_changed(self.__tag_list)
self.__tag_list.append((tag.get_name(), handle))
self.on_tags_changed([item[0] for item in self.__tag_list])
def on_tags_changed(self, tag_list):
"""

View File

@ -47,7 +47,7 @@ from gui.dbguielement import DbGUIElement
from ListModel import ListModel, NOSORT, COLOR, INTEGER
import const
import GrampsDisplay
from QuestionDialog import QuestionDialog2
from QuestionDialog import ErrorDialog, QuestionDialog2
import gui.widgets.progressdialog as progressdlg
#-------------------------------------------------------------------------
@ -96,6 +96,7 @@ class Tags(DbGUIElement):
self.signal_map = {
'tag-add' : self._tag_add,
'tag-delete' : self._tag_delete,
'tag-update' : self._tag_update,
'tag-rebuild' : self._tag_rebuild
}
DbGUIElement.__init__(self, dbstate.db)
@ -153,6 +154,17 @@ class Tags(DbGUIElement):
insort_left(self.__tag_list, (tag.get_name(), handle))
self.update_tag_menu()
def _tag_update(self, handle_list):
"""
Called when tags are updated.
"""
for handle in handle_list:
item = [item for item in self.__tag_list if item[1] == handle][0]
self.__tag_list.remove(item)
tag = self.db.get_tag_from_handle(handle)
insort_left(self.__tag_list, (tag.get_name(), handle))
self.update_tag_menu()
def _tag_delete(self, handle_list):
"""
Called when tags are deleted.
@ -234,16 +246,12 @@ class Tags(DbGUIElement):
"""
Create a new tag and tag the selected objects.
"""
new_dialog = NewTagDialog(self.uistate.window)
tag_name, color_str = new_dialog.run()
if tag_name and not self.db.get_tag_from_name(tag_name):
trans = self.db.transaction_begin()
tag = Tag()
tag.set_name(tag_name)
tag.set_color(color_str)
tag.set_priority(self.db.get_number_of_tags())
self.db.add_tag(tag, trans)
self.db.transaction_commit(trans, _('Add Tag (%s)') % tag_name)
tag = Tag()
tag.set_priority(self.db.get_number_of_tags())
new_dialog = EditTag(self.db, self.uistate.window, tag)
new_dialog.run()
if tag.get_handle():
self.tag_selected_rows(tag.get_handle())
def tag_selected_rows(self, tag_handle):
@ -394,7 +402,7 @@ class OrganizeTagsDialog(object):
up.connect('clicked', self.cb_up_clicked)
down.connect('clicked', self.cb_down_clicked)
add.connect('clicked', self.cb_add_clicked, top)
edit.connect('clicked', self.cb_edit_clicked)
edit.connect('clicked', self.cb_edit_clicked, top)
remove.connect('clicked', self.cb_remove_clicked, top)
top.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)
top.add_button(gtk.STOCK_HELP, gtk.RESPONSE_HELP)
@ -425,47 +433,32 @@ class OrganizeTagsDialog(object):
"""
Create a new tag.
"""
new_dialog = NewTagDialog(top)
tag_name, color_str = new_dialog.run()
if tag_name and not self.db.get_tag_from_name(tag_name):
trans = self.db.transaction_begin()
tag = Tag()
tag.set_name(tag_name)
tag.set_color(color_str)
priority = self.db.get_number_of_tags() # Lowest
tag.set_priority(priority)
handle = self.db.add_tag(tag, trans)
self.db.transaction_commit(trans, _('Add Tag (%s)') % tag_name)
self.namemodel.add((priority, handle, tag_name, color_str))
tag = Tag()
tag.set_priority(self.db.get_number_of_tags())
edit_dialog = EditTag(self.db, top, tag)
edit_dialog.run()
def cb_edit_clicked(self, button):
if tag.get_handle():
self.namemodel.add((tag.get_priority(),
tag.get_handle(),
tag.get_name(),
tag.get_color()))
def cb_edit_clicked(self, button, top):
"""
Edit the color of an existing tag.
"""
# pylint: disable-msg=E1101
store, iter_ = self.namemodel.get_selected()
if iter_ is None:
return
handle = store.get_value(iter_, 1)
tag_name = store.get_value(iter_, 2)
old_color = gtk.gdk.Color(store.get_value(iter_, 3))
title = _("%(title)s - Gramps") % {'title': _("Pick a Color")}
colorseldlg = gtk.ColorSelectionDialog(title)
colorseldlg.set_transient_for(self.top)
colorseldlg.colorsel.set_current_color(old_color)
colorseldlg.colorsel.set_previous_color(old_color)
response = colorseldlg.run()
if response == gtk.RESPONSE_OK:
color_str = colorseldlg.colorsel.get_current_color().to_string()
trans = self.db.transaction_begin()
tag = self.db.get_tag_from_handle(handle)
tag.set_color(color_str)
self.db.commit_tag(tag, trans)
self.db.transaction_commit(trans, _('Edit Tag (%s)') % tag_name)
store.set_value(iter_, 3, color_str)
colorseldlg.destroy()
tag = self.db.get_tag_from_handle(store.get_value(iter_, 1))
edit_dialog = EditTag(self.db, top, tag)
edit_dialog.run()
store.set_value(iter_, 2, tag.get_name())
store.set_value(iter_, 3, tag.get_color())
def cb_remove_clicked(self, button, top):
"""
Remove the selected tag.
@ -530,15 +523,17 @@ class OrganizeTagsDialog(object):
#-------------------------------------------------------------------------
#
# New Tag Dialog
# Tag editor
#
#-------------------------------------------------------------------------
class NewTagDialog(object):
class EditTag(object):
"""
A dialog to enable the user to create a new tag.
"""
def __init__(self, parent_window):
def __init__(self, db, parent_window, tag):
self.parent_window = parent_window
self.db = db
self.tag = tag
self.entry = None
self.color = None
self.top = self._create_dialog()
@ -547,20 +542,47 @@ class NewTagDialog(object):
"""
Run the dialog and return the result.
"""
result = (None, None)
response = self.top.run()
if response == gtk.RESPONSE_OK:
result = (self.entry.get_text(), self.color.get_color().to_string())
self._save()
self.top.destroy()
return result
def _save(self):
"""
Save the changes made to the tag.
"""
self.tag.set_name(self.entry.get_text())
self.tag.set_color(self.color.get_color().to_string())
if not self.tag.get_name():
ErrorDialog(
_("Cannot save tag"),
_("The tag name cannot be empty"))
return
if not self.tag.get_handle():
trans = self.db.transaction_begin()
self.db.add_tag(self.tag, trans)
self.db.transaction_commit(trans,
_("Add Tag (%s)") % self.tag.get_name())
else:
orig = self.db.get_tag_from_handle(self.tag.get_handle())
if cmp(self.tag.serialize(), orig.serialize()):
trans = self.db.transaction_begin()
self.db.commit_tag(self.tag, trans)
self.db.transaction_commit(trans,
_("Edit Tag (%s)") % self.tag.get_name())
def _create_dialog(self):
"""
Create a dialog box to enter a new tag.
"""
# pylint: disable-msg=E1101
title = _("%(title)s - Gramps") % {'title': _("New Tag")}
top = gtk.Dialog(title)
if self.tag.get_handle():
title = _('Tag: %s') % self.tag.get_name()
else:
title = _('New Tag')
top = gtk.Dialog(_("%(title)s - Gramps") % {'title': title})
top.set_default_size(300, 100)
top.set_modal(True)
top.set_transient_for(self.parent_window)
@ -572,7 +594,9 @@ class NewTagDialog(object):
label = gtk.Label(_('Tag Name:'))
self.entry = gtk.Entry()
self.entry.set_text(self.tag.get_name())
self.color = gtk.ColorButton()
self.color.set_color(gtk.gdk.color_parse(self.tag.get_color()))
title = _("%(title)s - Gramps") % {'title': _("Pick a Color")}
self.color.set_title(title)
hbox.pack_start(label, False, False, 5)