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 = { self.signal_map = {
'tag-add' : self._tag_add, 'tag-add' : self._tag_add,
'tag-delete' : self._tag_delete, 'tag-delete' : self._tag_delete,
'tag-update' : self._tag_update,
'tag-rebuild' : self._tag_rebuild 'tag-rebuild' : self._tag_rebuild
} }
DbGUIElement.__init__(self, dbstate.db) DbGUIElement.__init__(self, dbstate.db)
@ -181,8 +182,19 @@ class SidebarFilter(DbGUIElement):
""" """
for handle in handle_list: for handle in handle_list:
tag = self.dbstate.db.get_tag_from_handle(handle) tag = self.dbstate.db.get_tag_from_handle(handle)
insort_left(self.__tag_list, tag.get_name()) insort_left(self.__tag_list, (tag.get_name(), handle))
self.on_tags_changed(self.__tag_list) 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): def _tag_delete(self, handle_list):
""" """
@ -190,8 +202,8 @@ class SidebarFilter(DbGUIElement):
""" """
for handle in handle_list: for handle in handle_list:
tag = self.dbstate.db.get_tag_from_handle(handle) tag = self.dbstate.db.get_tag_from_handle(handle)
self.__tag_list.remove(tag.get_name()) self.__tag_list.remove((tag.get_name(), handle))
self.on_tags_changed(self.__tag_list) self.on_tags_changed([item[0] for item in self.__tag_list])
def _tag_rebuild(self): def _tag_rebuild(self):
""" """
@ -200,8 +212,8 @@ class SidebarFilter(DbGUIElement):
self.__tag_list = [] self.__tag_list = []
for handle in self.dbstate.db.get_tag_handles(): for handle in self.dbstate.db.get_tag_handles():
tag = self.dbstate.db.get_tag_from_handle(handle) tag = self.dbstate.db.get_tag_from_handle(handle)
self.__tag_list.append(tag.get_name()) self.__tag_list.append((tag.get_name(), handle))
self.on_tags_changed(self.__tag_list) self.on_tags_changed([item[0] for item in self.__tag_list])
def on_tags_changed(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 from ListModel import ListModel, NOSORT, COLOR, INTEGER
import const import const
import GrampsDisplay import GrampsDisplay
from QuestionDialog import QuestionDialog2 from QuestionDialog import ErrorDialog, QuestionDialog2
import gui.widgets.progressdialog as progressdlg import gui.widgets.progressdialog as progressdlg
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -96,6 +96,7 @@ class Tags(DbGUIElement):
self.signal_map = { self.signal_map = {
'tag-add' : self._tag_add, 'tag-add' : self._tag_add,
'tag-delete' : self._tag_delete, 'tag-delete' : self._tag_delete,
'tag-update' : self._tag_update,
'tag-rebuild' : self._tag_rebuild 'tag-rebuild' : self._tag_rebuild
} }
DbGUIElement.__init__(self, dbstate.db) DbGUIElement.__init__(self, dbstate.db)
@ -153,6 +154,17 @@ class Tags(DbGUIElement):
insort_left(self.__tag_list, (tag.get_name(), handle)) insort_left(self.__tag_list, (tag.get_name(), handle))
self.update_tag_menu() 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): def _tag_delete(self, handle_list):
""" """
Called when tags are deleted. Called when tags are deleted.
@ -234,16 +246,12 @@ class Tags(DbGUIElement):
""" """
Create a new tag and tag the selected objects. 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 = Tag()
tag.set_name(tag_name)
tag.set_color(color_str)
tag.set_priority(self.db.get_number_of_tags()) tag.set_priority(self.db.get_number_of_tags())
self.db.add_tag(tag, trans) new_dialog = EditTag(self.db, self.uistate.window, tag)
self.db.transaction_commit(trans, _('Add Tag (%s)') % tag_name) new_dialog.run()
if tag.get_handle():
self.tag_selected_rows(tag.get_handle()) self.tag_selected_rows(tag.get_handle())
def tag_selected_rows(self, tag_handle): def tag_selected_rows(self, tag_handle):
@ -394,7 +402,7 @@ class OrganizeTagsDialog(object):
up.connect('clicked', self.cb_up_clicked) up.connect('clicked', self.cb_up_clicked)
down.connect('clicked', self.cb_down_clicked) down.connect('clicked', self.cb_down_clicked)
add.connect('clicked', self.cb_add_clicked, top) 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) remove.connect('clicked', self.cb_remove_clicked, top)
top.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE) top.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)
top.add_button(gtk.STOCK_HELP, gtk.RESPONSE_HELP) top.add_button(gtk.STOCK_HELP, gtk.RESPONSE_HELP)
@ -425,46 +433,31 @@ class OrganizeTagsDialog(object):
""" """
Create a new tag. 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 = Tag()
tag.set_name(tag_name) tag.set_priority(self.db.get_number_of_tags())
tag.set_color(color_str) edit_dialog = EditTag(self.db, top, tag)
priority = self.db.get_number_of_tags() # Lowest edit_dialog.run()
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))
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. Edit the color of an existing tag.
""" """
# pylint: disable-msg=E1101
store, iter_ = self.namemodel.get_selected() store, iter_ = self.namemodel.get_selected()
if iter_ is None: if iter_ is None:
return 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")} tag = self.db.get_tag_from_handle(store.get_value(iter_, 1))
colorseldlg = gtk.ColorSelectionDialog(title) edit_dialog = EditTag(self.db, top, tag)
colorseldlg.set_transient_for(self.top) edit_dialog.run()
colorseldlg.colorsel.set_current_color(old_color)
colorseldlg.colorsel.set_previous_color(old_color) store.set_value(iter_, 2, tag.get_name())
response = colorseldlg.run() store.set_value(iter_, 3, tag.get_color())
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()
def cb_remove_clicked(self, button, top): def cb_remove_clicked(self, button, top):
""" """
@ -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. 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.parent_window = parent_window
self.db = db
self.tag = tag
self.entry = None self.entry = None
self.color = None self.color = None
self.top = self._create_dialog() self.top = self._create_dialog()
@ -547,20 +542,47 @@ class NewTagDialog(object):
""" """
Run the dialog and return the result. Run the dialog and return the result.
""" """
result = (None, None)
response = self.top.run() response = self.top.run()
if response == gtk.RESPONSE_OK: if response == gtk.RESPONSE_OK:
result = (self.entry.get_text(), self.color.get_color().to_string()) self._save()
self.top.destroy() 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): def _create_dialog(self):
""" """
Create a dialog box to enter a new tag. Create a dialog box to enter a new tag.
""" """
# pylint: disable-msg=E1101 # pylint: disable-msg=E1101
title = _("%(title)s - Gramps") % {'title': _("New Tag")} if self.tag.get_handle():
top = gtk.Dialog(title) 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_default_size(300, 100)
top.set_modal(True) top.set_modal(True)
top.set_transient_for(self.parent_window) top.set_transient_for(self.parent_window)
@ -572,7 +594,9 @@ class NewTagDialog(object):
label = gtk.Label(_('Tag Name:')) label = gtk.Label(_('Tag Name:'))
self.entry = gtk.Entry() self.entry = gtk.Entry()
self.entry.set_text(self.tag.get_name())
self.color = gtk.ColorButton() self.color = gtk.ColorButton()
self.color.set_color(gtk.gdk.color_parse(self.tag.get_color()))
title = _("%(title)s - Gramps") % {'title': _("Pick a Color")} title = _("%(title)s - Gramps") % {'title': _("Pick a Color")}
self.color.set_title(title) self.color.set_title(title)
hbox.pack_start(label, False, False, 5) hbox.pack_start(label, False, False, 5)