From 116d26e69f89b358a2cc72387f2607dd0a178b8b Mon Sep 17 00:00:00 2001 From: Nick Hall Date: Sun, 30 Jan 2011 03:02:38 +0000 Subject: [PATCH] Add extra GrampsBar functionality. svn: r16502 --- src/gen/plug/_gramplet.py | 6 +- src/gui/grampsbar.py | 520 ++++++++++++----------- src/gui/views/pageview.py | 60 +-- src/gui/widgets/grampletpane.py | 518 +++++++++++----------- src/plugins/gramplet/Filter.py | 146 +++++++ src/plugins/gramplet/PersonAttributes.py | 2 +- src/plugins/gramplet/PersonDetails.py | 1 - src/plugins/gramplet/PersonGallery.py | 2 +- src/plugins/gramplet/PersonResidence.py | 2 +- src/plugins/gramplet/bottombar.gpr.py | 104 +++++ src/plugins/lib/libpersonview.py | 2 +- src/plugins/lib/libplaceview.py | 7 + src/plugins/view/eventview.py | 6 + src/plugins/view/familyview.py | 7 + src/plugins/view/geoview.py | 24 +- src/plugins/view/mediaview.py | 7 + src/plugins/view/noteview.py | 7 + src/plugins/view/repoview.py | 7 + src/plugins/view/sourceview.py | 7 + 19 files changed, 881 insertions(+), 554 deletions(-) create mode 100644 src/plugins/gramplet/Filter.py diff --git a/src/gen/plug/_gramplet.py b/src/gen/plug/_gramplet.py index d4bca90c3..97704b7ee 100644 --- a/src/gen/plug/_gramplet.py +++ b/src/gen/plug/_gramplet.py @@ -172,7 +172,7 @@ class Gramplet(object): """ Sets the tooltip for this gramplet. """ - self.gui.tooltip = tip + self.gui.set_tooltip(tip) def get_text(self): """ @@ -229,8 +229,6 @@ class Gramplet(object): Set the textview to wrap or not. """ import gtk - self.gui.scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, - gtk.POLICY_AUTOMATIC) # gtk.WRAP_NONE, gtk.WRAP_CHAR, gtk.WRAP_WORD or gtk.WRAP_WORD_CHAR. if value in [True, 1]: self.gui.textview.set_wrap_mode(gtk.WRAP_WORD) @@ -275,7 +273,7 @@ class Gramplet(object): """ import gobject if ((not self.active or - self.gui.state in ["closed", "minimized"] or + self.gui.gstate in ["closed", "minimized"] or not self.dbstate.open) and not self.gui.force_update): self.dirty = True diff --git a/src/gui/grampsbar.py b/src/gui/grampsbar.py index f32d493d6..430ed7f2c 100644 --- a/src/gui/grampsbar.py +++ b/src/gui/grampsbar.py @@ -1,7 +1,8 @@ # # Gramps - a GTK+/GNOME based genealogy program # -# Copyright (C) 2011 Nick Hall +# Copyright (C) 2000-2007 Donald N. Allingham +# Copyright (C) 2011 Nick Hall # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -19,12 +20,17 @@ # # $Id$ +""" +Module that implements the sidebar and bottombar fuctionality. +""" #------------------------------------------------------------------------- # # Python modules # #------------------------------------------------------------------------- from gen.ggettext import gettext as _ +import time +import os #------------------------------------------------------------------------- # @@ -32,8 +38,15 @@ from gen.ggettext import gettext as _ # #------------------------------------------------------------------------- import gtk -import time -import os +gtk.rc_parse_string(""" + style "tab-button-style" { + GtkWidget::focus-padding = 0 + GtkWidget::focus-line-width = 0 + xthickness = 0 + ythickness = 0 + } + widget "*.tab-button" style "tab-button-style" + """) #------------------------------------------------------------------------- # @@ -42,20 +55,23 @@ import os #------------------------------------------------------------------------- import ConfigParser import const +import ManagedWindow +import GrampsDisplay from gui.widgets.grampletpane import (AVAILABLE_GRAMPLETS, GET_AVAILABLE_GRAMPLETS, get_gramplet_opts, - get_gramplet_options_by_tname, get_gramplet_options_by_name, - make_requested_gramplet) + make_requested_gramplet, + GuiGramplet) +from gui.widgets.undoablebuffer import UndoableBuffer from ListModel import ListModel, NOSORT -from QuestionDialog import ErrorDialog #------------------------------------------------------------------------- # # Constants # #------------------------------------------------------------------------- +WIKI_HELP_PAGE = const.URL_MANUAL_PAGE + '_-_Gramplets' NL = "\n" #------------------------------------------------------------------------- @@ -63,74 +79,41 @@ NL = "\n" # GrampsBar class # #------------------------------------------------------------------------- -class GrampsBar(object): +class GrampsBar(gtk.Notebook): """ - A class which defines the graphical representation of the Gramps bar. + A class which defines the graphical representation of the GrampsBar. """ - def __init__(self, dbstate, uistate, configfile, close_callback, defaults): + def __init__(self, dbstate, uistate, pageview, configfile, defaults): + gtk.Notebook.__init__(self) self.dbstate = dbstate - self.uistate = uistate + self.uistate = uistate + self.pageview = pageview self.configfile = os.path.join(const.VERSION_DIR, "%s.ini" % configfile) - self.close_callback = close_callback - self.gramplet_map = {} # title->gramplet - self.filter_page = 0 + self.detached_gramplets = [] - self.notebook = gtk.Notebook() - self.notebook.set_show_border(False) - self.notebook.set_scrollable(True) - self.notebook.connect('switch_page', self.__switch_page) + self.set_group_id(1) + self.set_show_border(False) + self.set_scrollable(True) + self.connect('switch-page', self.__switch_page) + self.connect('page-added', self.__page_added) + self.connect('create-window', self.__create_window) + self.connect('button-press-event', self.__button_press) - self.top = self._build_interface(self.notebook) - - self.default_gramplets = defaults - config_settings, opts_list = self.load_gramplets() + config_settings, opts_list = self.__load(defaults) opts_list.sort(key=lambda opt: opt["page"]) for opts in opts_list: - name = opts["name"] - all_opts = get_gramplet_opts(name, opts) - all_opts["layout"] = "tabs" - gramplet = make_requested_gramplet(self, name, all_opts, + all_opts = get_gramplet_opts(opts["name"], opts) + gramplet = make_requested_gramplet(TabGramplet, self, all_opts, self.dbstate, self.uistate) - self.gramplet_map[all_opts["title"]] = gramplet self.__add_tab(gramplet) if config_settings[0]: - self.top.show() - self.notebook.set_current_page(config_settings[1]) + self.show() + self.set_current_page(config_settings[1]) - def _build_interface(self, notebook): - """ - Build the user interface. Must be implemented in adervied class. - """ - raise NotImplementedError - - def _make_buttons(self): - """ - Make the buttons. - """ - close_button = gtk.Button() - img = gtk.image_new_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_MENU) - close_button.set_image(img) - close_button.set_relief(gtk.RELIEF_NONE) - close_button.connect('clicked', self.__close_clicked) - - delete_button = gtk.Button() - img = gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU) - delete_button.set_image(img) - delete_button.set_relief(gtk.RELIEF_NONE) - delete_button.connect('clicked', self.__delete_clicked) - - add_button = gtk.Button() - img = gtk.image_new_from_stock(gtk.STOCK_ADD, gtk.ICON_SIZE_MENU) - add_button.set_image(img) - add_button.set_relief(gtk.RELIEF_NONE) - add_button.connect('clicked', self.__add_clicked) - - return (close_button, delete_button, add_button) - - def load_gramplets(self): + def __load(self, defaults): """ Load the gramplets from the configuration file. """ @@ -163,40 +146,41 @@ class GrampsBar(object): for key in sorted(data["data"].keys())] if "name" not in data: data["name"] = "Unnamed Gramplet" - data["tname"]= _("Unnamed Gramplet") + data["tname"] = _("Unnamed Gramplet") retval.append(data) else: # give defaults as currently known - for name in self.default_gramplets: + for name in defaults: if name in AVAILABLE_GRAMPLETS(): retval.append(GET_AVAILABLE_GRAMPLETS(name)) return ((visible, default_page), retval) - def save(self): + def __save(self): """ Save the gramplet configuration. """ - if len(self.gramplet_map) == 0: + if self.get_n_pages() == 0: return # something is the matter filename = self.configfile try: fp = open(filename, "w") - except: + except IOError: print "Failed writing '%s'; gramplets not saved" % filename return fp.write(";; Gramps bar configuration file" + NL) fp.write((";; Automatically created at %s" % time.strftime("%Y/%m/%d %H:%M:%S")) + NL + NL) fp.write("[Bar Options]" + NL) - fp.write(("visible=%s" + NL) % self.top.get_property('visible')) - fp.write(("page=%d" + NL) % self.notebook.get_current_page()) + fp.write(("visible=%s" + NL) % self.get_property('visible')) + fp.write(("page=%d" + NL) % self.get_current_page()) fp.write(NL) - for page_num in range(self.notebook.get_n_pages()): - title = get_title(self.notebook, page_num) - gramplet = self.gramplet_map[title] - if gramplet is None: continue # filter tab - opts = get_gramplet_options_by_name(gramplet.name) + gramplet_list = [self.get_nth_page(page_num) + for page_num in range(self.get_n_pages())] + gramplet_list.extend(self.detached_gramplets) + + for page_num, gramplet in enumerate(gramplet_list): + opts = get_gramplet_options_by_name(gramplet.gname) if opts is not None: base_opts = opts.copy() for key in base_opts: @@ -204,13 +188,9 @@ class GrampsBar(object): base_opts[key] = gramplet.__dict__[key] fp.write(("[%s]" + NL) % gramplet.title) for key in base_opts: - if key == "content": continue - elif key == "title": continue - elif key == "row": continue - elif key == "column": continue - elif key == "page": continue - elif key == "version": continue # code, don't save - elif key == "gramps": continue # code, don't save + if key in ["content", "title", "row", "column", "page", + "version", "gramps"]: # don't save + continue elif key == "data": if not isinstance(base_opts["data"], (list, tuple)): fp.write(("data[0]=%s" + NL) % base_opts["data"]) @@ -230,226 +210,286 @@ class GrampsBar(object): """ Called with the view is set as active. """ - page = self.notebook.get_current_page() - title = get_title(self.notebook, page) - if title is not None and self.gramplet_map[title] \ - and self.gramplet_map[title].pui: - self.gramplet_map[title].pui.active = True - if self.gramplet_map[title].pui.dirty: - self.gramplet_map[title].pui.update() + gramplet = self.get_nth_page(self.get_current_page()) + if gramplet and gramplet.pui: + gramplet.pui.active = True + if gramplet.pui.dirty: + gramplet.pui.update() def set_inactive(self): """ Called with the view is set as inactive. """ - page = self.notebook.get_current_page() - title = get_title(self.notebook, page) - if title is not None and self.gramplet_map[title] \ - and self.gramplet_map[title].pui: - if self.gramplet_map[title].state != "detached": - self.gramplet_map[title].pui.active = False + gramplet = self.get_nth_page(self.get_current_page()) + if gramplet and gramplet.pui: + if gramplet.gstate != "detached": + gramplet.pui.active = False def on_delete(self): """ Called when the view is closed. """ - gramplets = (g for g in self.gramplet_map.itervalues() - if g is not None) - for gramplet in gramplets: + for page_num in range(self.get_n_pages()): + gramplet = self.get_nth_page(page_num) # this is the only place where the gui runs user code directly if gramplet.pui: gramplet.pui.on_save() - self.save() + self.__save() - def get_display(self): + def add_gramplet(self, gname): """ - Return the top container widget for the GUI. + Add a gramplet by name. """ - return self.top + if self.has_gramplet(gname): + return + all_opts = get_gramplet_options_by_name(gname) + gramplet = make_requested_gramplet(TabGramplet, self, all_opts, + self.dbstate, self.uistate) + if not gramplet: + print "Problem creating ", gname + return - def show(self): - """ - Show the bottom bar. - """ - return self.top.show() + page_num = self.__add_tab(gramplet) + self.set_current_page(page_num) - def hide(self): + def remove_gramplet(self, gname): """ - Hide the bottom bar. + Remove a gramplet by name. """ - return self.top.hide() - - def is_visible(self): - """ - Return True if the bar is visible, else return False. - """ - return self.top.get_property('visible') - - def add_filter(self, filter): - """ - Add a filter. - """ - self.gramplet_map[_('Filter')] = None - self.notebook.prepend_page(filter, gtk.Label(_('Filter'))) - self.notebook.set_tab_reorderable(filter, True) - self.notebook.set_current_page(0) - - def remove_filter(self): - """ - Remove the filter. - """ - for page_num in range(self.notebook.get_n_pages()): - title = get_title(self.notebook, page_num) - if title == _('Filter'): - self.notebook.remove_page(page_num) - del self.gramplet_map[_('Filter')] + for page_num in range(self.get_n_pages()): + gramplet = self.get_nth_page(page_num) + if gramplet.gname == gname: + self.remove_page(page_num) return - def __close_clicked(self, button): + def has_gramplet(self, gname): """ - Called when the sidebar is closed. + Return True if the GrampsBar contains the gramplet, else False. """ - self.close_callback() - - def __add_clicked(self, button): + return True if gname in self.all_gramplets() else False + + def all_gramplets(self): + """ + Return a list of names of all the gramplets in the GrampsBar. + """ + return [gramplet.gname for gramplet in self.get_children() + + self.detached_gramplets] + + def __add_clicked(self): """ Called when the add button is clicked. """ - names = [GET_AVAILABLE_GRAMPLETS(key)["tname"] for key - in AVAILABLE_GRAMPLETS()] - skip = [gramplet.tname for gramplet in self.gramplet_map.values() - if gramplet is not None] - gramplet_list = [name for name in names if name not in skip] + skip = self.all_gramplets() + names = [name for name in AVAILABLE_GRAMPLETS() if name not in skip] + gramplet_list = [(GET_AVAILABLE_GRAMPLETS(name)["tname"], name) + for name in names] gramplet_list.sort() + dialog = ChooseGrampletDialog(_("Select Gramplet"), gramplet_list) - tname = dialog.run() - if not tname: - return - - all_opts = get_gramplet_options_by_tname(tname) - all_opts["layout"] = "tabs" - gramplet = make_requested_gramplet(self, all_opts["name"], all_opts, - self.dbstate, self.uistate) - if not gramplet: - print "Problem creating ", tname - return - - self.gramplet_map[gramplet.title] = gramplet - page_num = self.__add_tab(gramplet) - self.notebook.set_current_page(page_num) + name = dialog.run() + if name: + self.add_gramplet(name) def __add_tab(self, gramplet): """ Add a tab to the notebook for the given gramplet. """ - gramplet.scrolledwindow.set_size_request(-1, gramplet.height) - label = gtk.Label(gramplet.title) - label.set_tooltip_text(gramplet.tname) - page_num = self.notebook.append_page(gramplet.mainframe, label) - self.notebook.set_tab_reorderable(gramplet.mainframe, True) + gramplet.set_size_request(gramplet.width, gramplet.height) + page_num = self.append_page(gramplet) return page_num - def __delete_clicked(self, button): + def __create_tab_label(self, gramplet): + """ + Create a tab label consisting of a label and a close button. + """ + hbox = gtk.HBox(False, 4) + label = gtk.Label(gramplet.title) + label.set_tooltip_text(gramplet.tname) + closebtn = gtk.Button() + image = gtk.Image() + image.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_MENU) + closebtn.connect("clicked", self.__delete_clicked, gramplet) + closebtn.set_image(image) + closebtn.set_relief(gtk.RELIEF_NONE) + + # The next three lines adjust the close button to the correct size. + closebtn.set_name('tab-button') + size = gtk.icon_size_lookup_for_settings(closebtn.get_settings(), + gtk.ICON_SIZE_MENU) + closebtn.set_size_request(size[0] + 2, size[1] + 2) + + hbox.pack_start(label, True, True) + hbox.pack_end(closebtn, False, False) + hbox.show_all() + return hbox + + def __delete_clicked(self, button, gramplet): """ Called when the delete button is clicked. """ - page_num = self.notebook.get_current_page() - title = get_title(self.notebook, page_num) - if self.gramplet_map[title] is None: - ErrorDialog( - _("Cannot remove tab"), - _("The filter tab cannot be removed")) - else: - del self.gramplet_map[title] - self.notebook.remove_page(page_num) - + page_num = self.page_num(gramplet) + self.remove_page(page_num) + def __switch_page(self, notebook, unused, new_page): """ - Called when the user has switched to a new bottombar page. + Called when the user has switched to a new GrampsBar page. """ old_page = notebook.get_current_page() - #print "switch from", old_page, "to", new_page if old_page >= 0: - title = get_title(notebook, old_page) - if self.gramplet_map[title] and self.gramplet_map[title].pui: - if self.gramplet_map[title].state != "detached": - self.gramplet_map[title].pui.active = False + gramplet = self.get_nth_page(old_page) + if gramplet and gramplet.pui: + if gramplet.gstate != "detached": + gramplet.pui.active = False - title = get_title(notebook, new_page) - if self.gramplet_map[title] and self.gramplet_map[title].pui: - self.gramplet_map[title].pui.active = True - if self.gramplet_map[title].pui.dirty: - self.gramplet_map[title].pui.update() + gramplet = self.get_nth_page(new_page) + if gramplet and gramplet.pui: + gramplet.pui.active = True + if gramplet.pui.dirty: + gramplet.pui.update() -def get_title(notebook, page_num): - """ - Reurn the title of a given page in a notebook. - """ - page = notebook.get_nth_page(page_num) - if page is None: - return None - else: - return notebook.get_tab_label_text(page) - -#------------------------------------------------------------------------- -# -# HBar class -# -#------------------------------------------------------------------------- -class HBar(GrampsBar): - """ - A class which defines the representation of a horizontal Gramps bar. - """ - def _build_interface(self, notebook): + def __page_added(self, notebook, unused, new_page): """ - Build the horizontal user interface. + Called when a new page is added to the GrampsBar. """ - top = gtk.HBox() - vbox = gtk.VBox() + gramplet = self.get_nth_page(new_page) + label = self.__create_tab_label(gramplet) + self.set_tab_label(gramplet, label) + self.set_tab_reorderable(gramplet, True) + self.set_tab_detachable(gramplet, True) + if gramplet in self.detached_gramplets: + self.detached_gramplets.remove(gramplet) + self.reorder_child(gramplet, gramplet.page) - close_button, delete_button, add_button = self._make_buttons() + def __create_window(self, grampsbar, gramplet, x_pos, y_pos): + """ + Called when the user has switched to a new GrampsBar page. + """ + gramplet.page = self.page_num(gramplet) + self.detached_gramplets.append(gramplet) + win = DetachedWindow(grampsbar, gramplet, x_pos, y_pos) + return win.get_notebook() - vbox.pack_start(close_button, False) - vbox.pack_end(delete_button, False) - vbox.pack_end(add_button, False) - - top.pack_start(notebook, True) - top.pack_start(vbox, False) - - notebook.show() - vbox.show_all() - - return top + def __button_press(self, widget, event): + """ + Called when a button is pressed in the tabs section of the GrampsBar. + """ + if event.type == gtk.gdk.BUTTON_PRESS and event.button == 3: + # TODO: We will probably want a context menu here. + self.__add_clicked() #------------------------------------------------------------------------- # -# VBar class +# TabGramplet class # #------------------------------------------------------------------------- -class VBar(GrampsBar): +class TabGramplet(gtk.ScrolledWindow, GuiGramplet): """ - A class which defines the representation of a vertical Gramps bar. + Class that handles the plugin interfaces for the GrampletBar. """ - def _build_interface(self, notebook): + def __init__(self, pane, dbstate, uistate, title, **kwargs): """ - Build the vertical user interface. + Internal constructor for GUI portion of a gramplet. """ - top = gtk.VBox() - hbox = gtk.HBox() + gtk.ScrolledWindow.__init__(self) + GuiGramplet.__init__(self, pane, dbstate, uistate, title, **kwargs) - close_button, delete_button, add_button = self._make_buttons() + self.scrolledwindow = self + self.textview = gtk.TextView() + self.buffer = UndoableBuffer() + self.text_length = 0 + self.textview.set_buffer(self.buffer) + self.textview.connect("key-press-event", self.on_key_press_event) + self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + self.add(self.textview) + self.show_all() - hbox.pack_start(add_button, False) - hbox.pack_start(delete_button, False) - hbox.pack_end(close_button, False) - - top.pack_start(hbox, False) - top.pack_start(notebook, True) - - notebook.show() - hbox.show_all() + def get_container_widget(self): + """ + Return the top level container widget. + """ + return self - return top +#------------------------------------------------------------------------- +# +# DetachedWindow class +# +#------------------------------------------------------------------------- +class DetachedWindow(ManagedWindow.ManagedWindow): + """ + Class for showing a detached gramplet. + """ + def __init__(self, grampsbar, gramplet, x_pos, y_pos): + """ + Construct the window. + """ + self.title = gramplet.title + " " + _("Gramplet") + self.grampsbar = grampsbar + self.gramplet = gramplet + + ManagedWindow.ManagedWindow.__init__(self, gramplet.uistate, [], + self.title) + self.set_window(gtk.Dialog("", gramplet.uistate.window, + gtk.DIALOG_DESTROY_WITH_PARENT, + (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)), + None, + self.title) + self.window.move(x_pos, y_pos) + self.window.set_size_request(gramplet.detached_width, + gramplet.detached_height) + self.window.add_button(gtk.STOCK_HELP, gtk.RESPONSE_HELP) + self.window.connect('response', self.handle_response) + + self.notebook = gtk.Notebook() + self.notebook.set_show_tabs(False) + self.notebook.set_show_border(False) + self.notebook.show() + self.window.vbox.add(self.notebook) + self.show() + + def handle_response(self, object, response): + """ + Callback for taking care of button clicks. + """ + if response in [gtk.RESPONSE_CLOSE, gtk.STOCK_CLOSE]: + self.close() + elif response == gtk.RESPONSE_HELP: + # translated name: + if self.gramplet.help_url: + if self.gramplet.help_url.startswith("http://"): + GrampsDisplay.url(self.gramplet.help_url) + else: + GrampsDisplay.help(self.gramplet.help_url) + else: + GrampsDisplay.help(WIKI_HELP_PAGE, + self.gramplet.tname.replace(" ", "_")) + + def get_notebook(self): + """ + Return the notebook. + """ + return self.notebook + + def build_menu_names(self, obj): + """ + Part of the GRAMPS window interface. + """ + return (self.title, 'Gramplet') + + def get_title(self): + """ + Returns the window title. + """ + return self.title + + def close(self, *args): + """ + Dock the detached gramplet back in the GrampsBar from where it came. + """ + size = self.window.get_size() + self.gramplet.detached_width = size[0] + self.gramplet.detached_height = size[1] + self.gramplet.reparent(self.grampsbar) + ManagedWindow.ManagedWindow.close(self, *args) #------------------------------------------------------------------------- # @@ -477,7 +517,7 @@ class ChooseGrampletDialog(object): if response == gtk.RESPONSE_OK: store, iter_ = self.namemodel.get_selected() if iter_: - result = store.get_value(iter_, 0) + result = store.get_value(iter_, 1) self.top.destroy() return result @@ -487,7 +527,7 @@ class ChooseGrampletDialog(object): """ self.namemodel.clear() for name in self.names: - self.namemodel.add([name]) + self.namemodel.add(name) def _create_dialog(self): """ @@ -507,7 +547,8 @@ class ChooseGrampletDialog(object): box = gtk.HBox() top.vbox.pack_start(box, 1, 1, 5) - name_titles = [(_('Name'), NOSORT, 200)] + name_titles = [(_('Name'), NOSORT, 200), + ('', NOSORT, 200)] self.namelist = gtk.TreeView() self.namemodel = ListModel(self.namelist, name_titles) @@ -523,4 +564,3 @@ class ChooseGrampletDialog(object): box.pack_start(bbox, 0, 0, 5) top.show_all() return top - diff --git a/src/gui/views/pageview.py b/src/gui/views/pageview.py index 72d3d984a..8ce3b5024 100644 --- a/src/gui/views/pageview.py +++ b/src/gui/views/pageview.py @@ -49,7 +49,7 @@ from gen.ggettext import gettext as _ import Errors from gui.dbguielement import DbGUIElement from gui.widgets.menutoolbuttonaction import MenuToolButtonAction -from gui.grampsbar import HBar, VBar +from gui.grampsbar import GrampsBar from gui.configure import ConfigureDialog from config import config @@ -147,56 +147,28 @@ class PageView(DbGUIElement): Returns a gtk container widget. """ defaults = self.get_default_gramplets() - self.sidebar = VBar(self.dbstate, self.uistate, + self.sidebar = GrampsBar(self.dbstate, self.uistate, self, self.ident + "_sidebar", - self.sidebar_closed, defaults[0]) - self.bottombar = HBar(self.dbstate, self.uistate, + self.bottombar = GrampsBar(self.dbstate, self.uistate, self, self.ident + "_bottombar", - self.bottombar_closed, defaults[1]) hpane = gtk.HPaned() vpane = gtk.VPaned() hpane.pack1(vpane, resize=True, shrink=False) - hpane.pack2(self.sidebar.get_display(), resize=False, shrink=True) + hpane.pack2(self.sidebar, resize=False, shrink=True) hpane.show() vpane.show() widget = self.build_widget() widget.show_all() vpane.pack1(widget, resize=True, shrink=False) - vpane.pack2(self.bottombar.get_display(), resize=False, shrink=True) + vpane.pack2(self.bottombar, resize=False, shrink=True) - if self.filter_class: - self.add_filter(self.filter_class) - self.sidebar_toggled(self.sidebar.is_visible()) + self.sidebar_toggled(self.sidebar.get_property('visible')) return hpane - def add_filter(self, filter_class): - """ - Add a filter to the sidebar. - """ - self.filter_tab = filter_class(self.dbstate, self.uistate, - self.__filter_clicked) - top = self.filter_tab.get_widget() - top.show_all() - self.sidebar.add_filter(top) - - def remove_filter(self): - """ - Remove the filter from the sidebar. - """ - self.filter_tab = None - self.sidebar.remove_filter() - - def __filter_clicked(self): - """ - Called when the filter 'Find' button is clicked. - """ - self.generic_filter = self.filter_tab.get_filter() - self.build_tree() - def __sidebar_toggled(self, action): """ Called when the sidebar is toggled. @@ -225,20 +197,6 @@ class PageView(DbGUIElement): """ pass - def sidebar_closed(self): - """ - Called when the sidebar close button is clicked. - """ - uimanager = self.uistate.uimanager - uimanager.get_action('/MenuBar/ViewMenu/Bars/Sidebar').activate() - - def bottombar_closed(self): - """ - Called when the bottombar close button is clicked. - """ - uimanager = self.uistate.uimanager - uimanager.get_action('/MenuBar/ViewMenu/Bars/Bottombar').activate() - def get_default_gramplets(self): """ Get the default gramplets for the Gramps sidebar and bottombar. @@ -446,9 +404,11 @@ class PageView(DbGUIElement): self.action_toggle_list in this function. """ self._add_toggle_action('Sidebar', None, _('_Sidebar'), - None, None, self.__sidebar_toggled, self.sidebar.is_visible()) + None, None, self.__sidebar_toggled, + self.sidebar.get_property('visible')) self._add_toggle_action('Bottombar', None, _('_Bottombar'), - None, None, self.__bottombar_toggled, self.bottombar.is_visible()) + None, None, self.__bottombar_toggled, + self.bottombar.get_property('visible')) def __build_action_group(self): """ diff --git a/src/gui/widgets/grampletpane.py b/src/gui/widgets/grampletpane.py index 3cf5e4fde..cab363a14 100644 --- a/src/gui/widgets/grampletpane.py +++ b/src/gui/widgets/grampletpane.py @@ -2,6 +2,7 @@ # Gramps - a GTK+/GNOME based genealogy program # # Copyright (C) 2000-2007 Donald N. Allingham +# Copyright (C) 2011 Nick Hall # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -31,9 +32,7 @@ GrampletView interface. #------------------------------------------------------------------------- import gtk import pango -import traceback import time -import types import os from gen.ggettext import gettext as _ @@ -147,27 +146,20 @@ def get_gramplet_options_by_tname(name): print ("Unknown gramplet name: '%s'" % name) return None -def make_requested_gramplet(pane, name, opts, dbstate, uistate): +def make_requested_gramplet(gui_class, pane, opts, dbstate, uistate): """ Make a GUI gramplet given its name. """ + name = opts["name"] if name in AVAILABLE_GRAMPLETS(): - gui = GuiGramplet(pane, dbstate, uistate, **opts) + gui = gui_class(pane, dbstate, uistate, **opts) if opts.get("content", None): - pdata = PLUGMAN.get_plugin(opts["name"]) + pdata = PLUGMAN.get_plugin(name) module = PLUGMAN.load_plugin(pdata) if module: getattr(module, opts["content"])(gui) else: - print "Error loading gramplet '%s': skipping content" \ - % opts["name"] - # now that we have user code, set the tooltips - msg = gui.tooltip - if opts.get("layout", "grid") == "grid" and msg is None: - msg = _("Drag Properties Button to move and click it for setup") - if msg: - gui.scrolledwindow.set_tooltip_text(msg) - gui.tooltips_text = msg + print "Error loading gramplet '%s': skipping content" % name return gui return None @@ -205,11 +197,12 @@ class GrampletWindow(ManagedWindow.ManagedWindow): self.gramplet = gramplet self.gramplet.detached_window = self # Keep track of what state it was in: - self.docked_state = gramplet.state + self.docked_state = gramplet.gstate # Now detach it self.gramplet.set_state("detached") - ManagedWindow.ManagedWindow.__init__(self, gramplet.uistate, [], self.title) - self.set_window(gtk.Dialog("",gramplet.uistate.window, + ManagedWindow.ManagedWindow.__init__(self, gramplet.uistate, [], + self.title) + self.set_window(gtk.Dialog("", gramplet.uistate.window, gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)), None, self.title) @@ -279,7 +272,7 @@ class GrampletWindow(ManagedWindow.ManagedWindow): if gramplet.row > self.gramplet.row: pane.columns[col].remove(gframe) stack.append(gframe) - expand = self.gramplet.state == "maximized" and self.gramplet.expand + expand = self.gramplet.gstate == "maximized" and self.gramplet.expand column = pane.columns[col] parent = self.gramplet.pane.get_column_frame(self.gramplet.column) self.gramplet.mainframe.reparent(parent) @@ -287,13 +280,13 @@ class GrampletWindow(ManagedWindow.ManagedWindow): self.gramplet.pui.active = self.gramplet.pane.pageview.active for gframe in stack: gramplet = pane.frame_map[str(gframe)] - expand = gramplet.state == "maximized" and gramplet.expand + expand = gramplet.gstate == "maximized" and gramplet.expand pane.columns[col].pack_start(gframe, expand=expand) # Now make sure they all have the correct expand: for gframe in pane.columns[col]: gramplet = pane.frame_map[str(gframe)] - expand, fill, padding, pack = column.query_child_packing(gramplet.mainframe) - expand = gramplet.state == "maximized" and gramplet.expand + expand, fill, padding, pack = column.query_child_packing(gramplet.mainframe) + expand = gramplet.gstate == "maximized" and gramplet.expand column.set_child_packing(gramplet.mainframe, expand, fill, padding, pack) self.gramplet.gvclose.show() self.gramplet.gvstate.show() @@ -304,89 +297,52 @@ class GrampletWindow(ManagedWindow.ManagedWindow): class GuiGramplet(object): """ - Class that handles the plugin interfaces for the GrampletView. + Class that handles the GUI representation of a Gramplet. """ - TARGET_TYPE_FRAME = 80 - LOCAL_DRAG_TYPE = 'GRAMPLET' - LOCAL_DRAG_TARGET = (LOCAL_DRAG_TYPE, 0, TARGET_TYPE_FRAME) def __init__(self, pane, dbstate, uistate, title, **kwargs): """ Internal constructor for GUI portion of a gramplet. """ self.pane = pane + self.view = pane.pageview self.dbstate = dbstate self.uistate = uistate self.title = title self.detached_window = None self.force_update = False self._tags = [] - self.link_cursor = gtk.gdk.Cursor(gtk.gdk.LEFT_PTR) - self.standard_cursor = gtk.gdk.Cursor(gtk.gdk.XTERM) ########## Set defaults - self.name = kwargs.get("name", "Unnamed Gramplet") + self.gname = kwargs.get("name", "Unnamed Gramplet") self.tname = kwargs.get("tname", "Unnamed Gramplet") self.version = kwargs.get("version", "0.0.0") self.gramps = kwargs.get("gramps", "0.0.0") self.expand = logical_true(kwargs.get("expand", False)) self.height = int(kwargs.get("height", 200)) + self.width = int(kwargs.get("width", 375)) self.column = int(kwargs.get("column", -1)) self.detached_height = int(kwargs.get("detached_height", 300)) self.detached_width = int(kwargs.get("detached_width", 400)) self.row = int(kwargs.get("row", -1)) self.page = int(kwargs.get("page", -1)) - self.state = kwargs.get("state", "maximized") + self.gstate = kwargs.get("state", "maximized") self.data = kwargs.get("data", []) self.help_url = kwargs.get("help_url", WIKI_HELP_PAGE) ########## self.use_markup = False self.pui = None # user code - self.tooltip = None # text - self.tooltips = None # gtk tooltip widget self.tooltips_text = None + + self.link_cursor = gtk.gdk.Cursor(gtk.gdk.LEFT_PTR) + self.standard_cursor = gtk.gdk.Cursor(gtk.gdk.XTERM) + + self.scrolledwindow = None + self.textview = None + self.buffer = None + + def set_tooltip(self, tip): + self.tooltips_text = tip + self.scrolledwindow.set_tooltip_text(tip) - self.xml = Glade() - self.gvwin = self.xml.toplevel - self.mainframe = self.xml.get_object('gvgramplet') - self.gvwin.remove(self.mainframe) - - self.textview = self.xml.get_object('gvtextview') - self.buffer = UndoableBuffer() - self.text_length = 0 - self.textview.set_buffer(self.buffer) - self.textview.connect("key-press-event", self.on_key_press_event) - #self.buffer = self.textview.get_buffer() - self.scrolledwindow = self.xml.get_object('gvscrolledwindow') - self.vboxtop = self.xml.get_object('vboxtop') - self.titlelabel = self.xml.get_object('gvtitle') - self.titlelabel.get_children()[0].set_text("%s" % self.title) - self.titlelabel.get_children()[0].set_use_markup(True) - self.titlelabel.connect("clicked", self.edit_title) - self.titlelabel_entry = None - self.gvclose = self.xml.get_object('gvclose') - self.gvclose.connect('clicked', self.close) - self.gvstate = self.xml.get_object('gvstate') - self.gvstate.connect('clicked', self.change_state) - self.gvproperties = self.xml.get_object('gvproperties') - self.gvproperties.connect('clicked', self.set_properties) - self.xml.get_object('gvcloseimage').set_from_stock(gtk.STOCK_CLOSE, - gtk.ICON_SIZE_MENU) - self.xml.get_object('gvstateimage').set_from_stock(gtk.STOCK_REMOVE, - gtk.ICON_SIZE_MENU) - self.xml.get_object('gvpropertiesimage').set_from_stock(gtk.STOCK_PROPERTIES, - gtk.ICON_SIZE_MENU) - - # source: - drag = self.gvproperties - drag.drag_source_set(gtk.gdk.BUTTON1_MASK, - [GuiGramplet.LOCAL_DRAG_TARGET], - gtk.gdk.ACTION_COPY) - - if kwargs.get("layout", "grid") == "tabs": - self.titlelabel.hide() - self.gvclose.hide() - self.gvstate.hide() - self.gvproperties.hide() - def undo(self): self.buffer.undo() self.text_length = self.len_text(self.get_text()) @@ -413,117 +369,6 @@ class GuiGramplet(object): return False - def edit_title(self, widget): - """ - Edit the the title in the GUI. - """ - parent = widget.get_parent() - widget.hide() - if self.titlelabel_entry is None: - self.titlelabel_entry = gtk.Entry() - parent = widget.get_parent() - parent.pack_end(self.titlelabel_entry) - self.titlelabel_entry.connect("focus-out-event", self.edit_title_done) - self.titlelabel_entry.connect("activate", self.edit_title_done) - self.titlelabel_entry.connect("key-press-event", self.edit_title_keypress) - self.titlelabel_entry.set_text(widget.get_children()[0].get_text()) - self.titlelabel_entry.show() - self.titlelabel_entry.grab_focus() - return True - - def edit_title_keypress(self, widget, event): - """ - Edit the title, handle escape. - """ - if event.type == gtk.gdk.KEY_PRESS: - if event.keyval == gtk.keysyms.Escape: - self.titlelabel.show() - widget.hide() - - def edit_title_done(self, widget, event=None): - """ - Edit title in GUI, finishing callback. - """ - result = self.set_title(widget.get_text()) - if result: # if ok to set title to that - self.titlelabel.show() - widget.hide() - return False # Return False for gtk requirement - - def close(self, *obj): - """ - Remove (delete) the gramplet from view. - """ - if self.state == "detached": - return - self.state = "closed" - self.pane.closed_gramplets.append(self) - self.mainframe.get_parent().remove(self.mainframe) - - def detach(self): - """ - Detach the gramplet from the GrampletView, and open in own window. - """ - # hide buttons: - #self.set_state("detached") - self.pane.detached_gramplets.append(self) - # make a window, and attach it there - self.detached_window = GrampletWindow(self) - - def set_state(self, state): - """ - Set the state of a gramplet. - """ - oldstate = self.state - self.state = state - if state == "minimized": - self.scrolledwindow.hide() - self.xml.get_object('gvstateimage').set_from_stock(gtk.STOCK_ADD, - gtk.ICON_SIZE_MENU) - column = self.mainframe.get_parent() # column - expand,fill,padding,pack = column.query_child_packing(self.mainframe) - column.set_child_packing(self.mainframe,False,fill,padding,pack) - else: - self.scrolledwindow.show() - self.xml.get_object('gvstateimage').set_from_stock(gtk.STOCK_REMOVE, - gtk.ICON_SIZE_MENU) - column = self.mainframe.get_parent() # column - expand,fill,padding,pack = column.query_child_packing(self.mainframe) - column.set_child_packing(self.mainframe, - self.expand, - fill, - padding, - pack) - if self.pui and self.pui.dirty: - self.pui.update() - - def change_state(self, obj): - """ - Change the state of a gramplet. - """ - if self.state == "detached": - pass # don't change if detached - else: - if self.state == "maximized": - self.set_state("minimized") - else: - self.set_state("maximized") - - def set_properties(self, obj): - """ - Set the properties of a gramplet. - """ - if self.state == "detached": - pass - else: - self.detach() - return - self.expand = not self.expand - if self.state == "maximized": - column = self.mainframe.get_parent() # column - expand,fill,padding,pack = column.query_child_packing(self.mainframe) - column.set_child_packing(self.mainframe,self.expand,fill,padding,pack) - def append_text(self, text, scroll_to="end"): enditer = self.buffer.get_end_iter() start = self.buffer.create_mark(None, enditer, True) @@ -619,31 +464,31 @@ class GuiGramplet(object): self.append_text(retval) for items in markup_pos["TT"]: if len(items) == 3: - (a,attributes,b) = items + (a, attributes, b) = items start = self.buffer.get_iter_at_offset(a + offset) stop = self.buffer.get_iter_at_offset(b + offset) self.buffer.apply_tag_by_name("fixed", start, stop) for items in markup_pos["B"]: if len(items) == 3: - (a,attributes,b) = items + (a, attributes, b) = items start = self.buffer.get_iter_at_offset(a + offset) stop = self.buffer.get_iter_at_offset(b + offset) self.buffer.apply_tag_by_name("bold", start, stop) for items in markup_pos["I"]: if len(items) == 3: - (a,attributes,b) = items + (a, attributes, b) = items start = self.buffer.get_iter_at_offset(a + offset) stop = self.buffer.get_iter_at_offset(b + offset) self.buffer.apply_tag_by_name("italic", start, stop) for items in markup_pos["U"]: if len(items) == 3: - (a,attributes,b) = items + (a, attributes, b) = items start = self.buffer.get_iter_at_offset(a + offset) stop = self.buffer.get_iter_at_offset(b + offset) self.buffer.apply_tag_by_name("underline", start, stop) for items in markup_pos["A"]: if len(items) == 3: - (a,attributes,b) = items + (a, attributes, b) = items start = self.buffer.get_iter_at_offset(a + offset) stop = self.buffer.get_iter_at_offset(b + offset) if "href" in attributes: @@ -664,9 +509,10 @@ class GuiGramplet(object): if self.use_markup == value: return self.use_markup = value if value: - self.buffer.create_tag("bold",weight=pango.WEIGHT_HEAVY) - self.buffer.create_tag("italic",style=pango.STYLE_ITALIC) - self.buffer.create_tag("underline",underline=pango.UNDERLINE_SINGLE) + self.buffer.create_tag("bold", weight=pango.WEIGHT_HEAVY) + self.buffer.create_tag("italic", style=pango.STYLE_ITALIC) + self.buffer.create_tag("underline", + underline=pango.UNDERLINE_SINGLE) self.buffer.create_tag("fixed", font="monospace") else: tag_table = self.buffer.get_tag_table() @@ -678,15 +524,8 @@ class GuiGramplet(object): self.append_text(text, scroll_to) self.buffer.reset() - def get_source_widget(self): - """ - Hack to allow us to send this object to the drop_widget - method as a context. - """ - return self.gvproperties - def get_container_widget(self): - return self.scrolledwindow + raise NotImplementedError def make_gui_options(self): if not self.pui: return @@ -746,6 +585,7 @@ class GuiGramplet(object): return False # handle event further, if necessary def on_button_press(self, view, event): + # pylint: disable-msg=W0212 buffer_location = view.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, int(event.x), int(event.y)) @@ -764,7 +604,7 @@ class GuiGramplet(object): return True # handled event except Errors.WindowActiveError: pass - elif event.type == gtk.gdk.BUTTON_PRESS: # single click + elif event.type == gtk.gdk.BUTTON_PRESS: # single self.uistate.set_active(handle, 'Person') return True # handled event elif event.button == 3: # right mouse @@ -848,13 +688,195 @@ class GuiGramplet(object): return True return False # did not handle event +class GridGramplet(GuiGramplet): + """ + Class that handles the plugin interfaces for the GrampletView. + """ + TARGET_TYPE_FRAME = 80 + LOCAL_DRAG_TYPE = 'GRAMPLET' + LOCAL_DRAG_TARGET = (LOCAL_DRAG_TYPE, 0, TARGET_TYPE_FRAME) + def __init__(self, pane, dbstate, uistate, title, **kwargs): + """ + Internal constructor for GUI portion of a gramplet. + """ + GuiGramplet.__init__(self, pane, dbstate, uistate, title, + **kwargs) + + self.xml = Glade() + self.gvwin = self.xml.toplevel + self.mainframe = self.xml.get_object('gvgramplet') + self.gvwin.remove(self.mainframe) + + self.textview = self.xml.get_object('gvtextview') + self.buffer = UndoableBuffer() + self.text_length = 0 + self.textview.set_buffer(self.buffer) + self.textview.connect("key-press-event", self.on_key_press_event) + #self.buffer = self.textview.get_buffer() + self.scrolledwindow = self.xml.get_object('gvscrolledwindow') + self.scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, + gtk.POLICY_AUTOMATIC) + self.vboxtop = self.xml.get_object('vboxtop') + self.titlelabel = self.xml.get_object('gvtitle') + self.titlelabel.get_children()[0].set_text("%s" % + self.title) + self.titlelabel.get_children()[0].set_use_markup(True) + self.titlelabel.connect("clicked", self.edit_title) + self.titlelabel_entry = None + self.gvclose = self.xml.get_object('gvclose') + self.gvclose.connect('clicked', self.close) + self.gvstate = self.xml.get_object('gvstate') + self.gvstate.connect('clicked', self.change_state) + self.gvproperties = self.xml.get_object('gvproperties') + self.gvproperties.connect('clicked', self.set_properties) + self.xml.get_object('gvcloseimage').set_from_stock(gtk.STOCK_CLOSE, + gtk.ICON_SIZE_MENU) + self.xml.get_object('gvstateimage').set_from_stock(gtk.STOCK_REMOVE, + gtk.ICON_SIZE_MENU) + self.xml.get_object('gvpropertiesimage').set_from_stock(gtk.STOCK_PROPERTIES, + gtk.ICON_SIZE_MENU) + + # source: + drag = self.gvproperties + drag.drag_source_set(gtk.gdk.BUTTON1_MASK, + [GridGramplet.LOCAL_DRAG_TARGET], + gtk.gdk.ACTION_COPY) + + # default tooltip + msg = _("Drag Properties Button to move and click it for setup") + if not self.tooltips_text: + self.set_tooltip(msg) + + def edit_title(self, widget): + """ + Edit the the title in the GUI. + """ + parent = widget.get_parent() + widget.hide() + if self.titlelabel_entry is None: + self.titlelabel_entry = gtk.Entry() + parent = widget.get_parent() + parent.pack_end(self.titlelabel_entry) + self.titlelabel_entry.connect("focus-out-event", + self.edit_title_done) + self.titlelabel_entry.connect("activate", self.edit_title_done) + self.titlelabel_entry.connect("key-press-event", + self.edit_title_keypress) + self.titlelabel_entry.set_text(widget.get_children()[0].get_text()) + self.titlelabel_entry.show() + self.titlelabel_entry.grab_focus() + return True + + def edit_title_keypress(self, widget, event): + """ + Edit the title, handle escape. + """ + if event.type == gtk.gdk.KEY_PRESS: + if event.keyval == gtk.keysyms.Escape: + self.titlelabel.show() + widget.hide() + + def edit_title_done(self, widget, event=None): + """ + Edit title in GUI, finishing callback. + """ + result = self.set_title(widget.get_text()) + if result: # if ok to set title to that + self.titlelabel.show() + widget.hide() + return False # Return False for gtk requirement + + def close(self, *obj): + """ + Remove (delete) the gramplet from view. + """ + if self.gstate == "detached": + return + self.gstate = "closed" + self.pane.closed_gramplets.append(self) + self.mainframe.get_parent().remove(self.mainframe) + + def detach(self): + """ + Detach the gramplet from the GrampletView, and open in own window. + """ + # hide buttons: + #self.set_state("detached") + self.pane.detached_gramplets.append(self) + # make a window, and attach it there + self.detached_window = GrampletWindow(self) + + def set_state(self, state): + """ + Set the state of a gramplet. + """ + oldstate = self.gstate + self.gstate = state + if state == "minimized": + self.scrolledwindow.hide() + self.xml.get_object('gvstateimage').set_from_stock(gtk.STOCK_ADD, + gtk.ICON_SIZE_MENU) + column = self.mainframe.get_parent() # column + expand, fill, padding, pack = column.query_child_packing(self.mainframe) + column.set_child_packing(self.mainframe, False, fill, padding, pack) + else: + self.scrolledwindow.show() + self.xml.get_object('gvstateimage').set_from_stock(gtk.STOCK_REMOVE, + gtk.ICON_SIZE_MENU) + column = self.mainframe.get_parent() # column + expand, fill, padding, pack = column.query_child_packing(self.mainframe) + column.set_child_packing(self.mainframe, + self.expand, + fill, + padding, + pack) + if self.pui and self.pui.dirty: + self.pui.update() + + def change_state(self, obj): + """ + Change the state of a gramplet. + """ + if self.gstate == "detached": + pass # don't change if detached + else: + if self.gstate == "maximized": + self.set_state("minimized") + else: + self.set_state("maximized") + + def set_properties(self, obj): + """ + Set the properties of a gramplet. + """ + if self.gstate == "detached": + pass + else: + self.detach() + return + self.expand = not self.expand + if self.gstate == "maximized": + column = self.mainframe.get_parent() # column + expand, fill, padding, pack = column.query_child_packing(self.mainframe) + column.set_child_packing(self.mainframe, self.expand, fill, + padding, pack) + def get_source_widget(self): + """ + Hack to allow us to send this object to the drop_widget + method as a context. + """ + return self.gvproperties + + def get_container_widget(self): + return self.scrolledwindow + def get_title(self): return self.title def set_height(self, height): self.height = height self.scrolledwindow.set_size_request(-1, self.height) - self.set_state(self.state) + self.set_state(self.gstate) def get_height(self): return self.height @@ -877,7 +899,7 @@ class GuiGramplet(object): def set_expand(self, value): self.expand = value self.scrolledwindow.set_size_request(-1, self.height) - self.set_state(self.state) + self.set_state(self.gstate) def set_title(self, new_title): # can't do it if already titled that way @@ -889,7 +911,8 @@ class GuiGramplet(object): self.detached_window.window.set_title("%s %s - Gramps" % (new_title, _("Gramplet"))) self.pane.gramplet_map[self.title] = self - self.titlelabel.get_children()[0].set_text("%s" % self.title) + self.titlelabel.get_children()[0].set_text("%s" % + self.title) self.titlelabel.get_children()[0].set_use_markup(True) return True @@ -931,7 +954,7 @@ class GrampletPane(gtk.ScrolledWindow): self.columns = [] for i in range(self.column_count): self.columns.append(gtk.VBox()) - self.hbox.pack_start(self.columns[-1],expand=True) + self.hbox.pack_start(self.columns[-1], expand=True) # Load the gramplets self.gramplet_map = {} # title->gramplet self.frame_map = {} # frame->gramplet @@ -957,8 +980,8 @@ class GrampletPane(gtk.ScrolledWindow): self.gramplet_map[all_opts["title"]] = None # save closed name self.closed_opts.append(all_opts) continue - g = make_requested_gramplet(self, name, all_opts, - self.dbstate, self.uistate) + g = make_requested_gramplet(GridGramplet, self, all_opts, + self.dbstate, self.uistate) if g: self.gramplet_map[all_opts["title"]] = g self.frame_map[str(g.mainframe)] = g @@ -973,7 +996,7 @@ class GrampletPane(gtk.ScrolledWindow): """ super(GrampletPane, self).show_all() for gramplet in self.gramplet_map.values(): - if gramplet.state == "minimized": + if gramplet.gstate == "minimized": gramplet.set_state("minimized") def set_state_all(self): @@ -982,8 +1005,8 @@ class GrampletPane(gtk.ScrolledWindow): parts of a collapsed gramplet on sidebars. """ for gramplet in self.gramplet_map.values(): - if gramplet.state in ["minimized", "maximized"]: - gramplet.set_state(gramplet.state) + if gramplet.gstate in ["minimized", "maximized"]: + gramplet.set_state(gramplet.gstate) def get_column_frame(self, column_num): if column_num < len(self.columns): @@ -998,7 +1021,7 @@ class GrampletPane(gtk.ScrolledWindow): gramplets = (g for g in self.gramplet_map.itervalues() if g is not None) for gramplet in gramplets: - if (gramplet.state == "detached" or gramplet.state == "closed"): + if (gramplet.gstate == "detached" or gramplet.gstate == "closed"): continue column = gramplet.mainframe.get_parent() if column: @@ -1025,21 +1048,23 @@ class GrampletPane(gtk.ScrolledWindow): gramplet.column = pos gramplet.row = rows[gramplet.column] rows[gramplet.column] += 1 - if recolumn and (gramplet.state == "detached" or gramplet.state == "closed"): + if recolumn and (gramplet.gstate == "detached" or + gramplet.gstate == "closed"): continue - if gramplet.state == "minimized": + if gramplet.gstate == "minimized": self.columns[pos].pack_start(gramplet.mainframe, expand=False) else: - self.columns[pos].pack_start(gramplet.mainframe, expand=gramplet.expand) + self.columns[pos].pack_start(gramplet.mainframe, + expand=gramplet.expand) # set height on gramplet.scrolledwindow here: gramplet.scrolledwindow.set_size_request(-1, gramplet.height) # Can't minimize here, because GRAMPS calls show_all later: - #if gramplet.state == "minimized": # starts max, change to min it + #if gramplet.gstate == "minimized": # starts max, change to min it # gramplet.set_state("minimized") # minimize it # set minimized is called in page subclass hack (above) - if gramplet.state == "detached": + if gramplet.gstate == "detached": gramplet.detach() - elif gramplet.state == "closed": + elif gramplet.gstate == "closed": gramplet.close() def load_gramplets(self): @@ -1068,10 +1093,11 @@ class GrampletPane(gtk.ScrolledWindow): else: data[opt] = cp.get(sec, opt).strip() if "data" in data: - data["data"] = [data["data"][key] for key in sorted(data["data"].keys())] + data["data"] = [data["data"][key] + for key in sorted(data["data"].keys())] if "name" not in data: data["name"] = "Unnamed Gramplet" - data["tname"]= _("Unnamed Gramplet") + data["tname"] = _("Unnamed Gramplet") retval.append((data["name"], data)) # name, opts else: # give defaults as currently known @@ -1086,11 +1112,12 @@ class GrampletPane(gtk.ScrolledWindow): filename = self.configfile try: fp = open(filename, "w") - except: + except IOError: print "Failed writing '%s'; gramplets not saved" % filename return fp.write(";; Gramps gramplets file" + NL) - fp.write((";; Automatically created at %s" % time.strftime("%Y/%m/%d %H:%M:%S")) + NL + NL) + fp.write((";; Automatically created at %s" % + time.strftime("%Y/%m/%d %H:%M:%S")) + NL + NL) fp.write("[Gramplet View Options]" + NL) fp.write(("column_count=%d" + NL) % self.column_count) fp.write(("pane_position=%d" + NL) % self.pane_position) @@ -1101,7 +1128,7 @@ class GrampletPane(gtk.ScrolledWindow): row = 0 for gframe in self.columns[col]: gramplet = self.frame_map[str(gframe)] - opts = get_gramplet_options_by_name(gramplet.name) + opts = get_gramplet_options_by_name(gramplet.gname) if opts is not None: base_opts = opts.copy() for key in base_opts: @@ -1117,7 +1144,8 @@ class GrampletPane(gtk.ScrolledWindow): elif key == "gramps": continue # code, don't save elif key == "data": if not isinstance(base_opts["data"], (list, tuple)): - fp.write(("data[0]=%s" + NL) % base_opts["data"]) + fp.write(("data[0]=%s" + NL) % + base_opts["data"]) else: cnt = 0 for item in base_opts["data"]: @@ -1130,7 +1158,7 @@ class GrampletPane(gtk.ScrolledWindow): fp.write(NL) row += 1 for gramplet in self.detached_gramplets: - opts = get_gramplet_options_by_name(gramplet.name) + opts = get_gramplet_options_by_name(gramplet.gname) if opts is not None: base_opts = opts.copy() for key in base_opts: @@ -1188,13 +1216,13 @@ class GrampletPane(gtk.ScrolledWindow): maingramplet.column = col maingramplet.row = current_row current_row += 1 - expand = maingramplet.state == "maximized" and maingramplet.expand + expand = maingramplet.gstate == "maximized" and maingramplet.expand self.columns[col].pack_start(mainframe, expand=expand) for gframe in stack: gramplet = self.frame_map[str(gframe)] gramplet.row = current_row current_row += 1 - expand = gramplet.state == "maximized" and gramplet.expand + expand = gramplet.gstate == "maximized" and gramplet.expand self.columns[col].pack_start(gframe, expand=expand) return True @@ -1212,7 +1240,7 @@ class GrampletPane(gtk.ScrolledWindow): for i in range(self.column_count): self.columns.append(gtk.VBox()) self.columns[-1].show() - self.hbox.pack_start(self.columns[-1],expand=True) + self.hbox.pack_start(self.columns[-1], expand=True) # place the gramplets back in the new columns self.place_gramplets(recolumn=True) self.show() @@ -1222,7 +1250,7 @@ class GrampletPane(gtk.ScrolledWindow): ############### First kind: from current session for gramplet in self.closed_gramplets: if gramplet.title == name: - #gramplet.state = "maximized" + #gramplet.gstate = "maximized" self.closed_gramplets.remove(gramplet) if self._popup_xy is not None: self.drop_widget(self, gramplet, @@ -1235,8 +1263,8 @@ class GrampletPane(gtk.ScrolledWindow): for opts in self.closed_opts: if opts["title"] == name: self.closed_opts.remove(opts) - g = make_requested_gramplet(self, opts["name"], opts, - self.dbstate, self.uistate) + g = make_requested_gramplet(GridGramplet, self, opts, + self.dbstate, self.uistate) if g: self.gramplet_map[opts["title"]] = g self.frame_map[str(g.mainframe)] = g @@ -1244,12 +1272,13 @@ class GrampletPane(gtk.ScrolledWindow): print "Can't make gramplet of type '%s'." % name if g: gramplet = g - gramplet.state = "maximized" + gramplet.gstate = "maximized" if gramplet.column >= 0 and gramplet.column < len(self.columns): pos = gramplet.column else: pos = 0 - self.columns[pos].pack_start(gramplet.mainframe, expand=gramplet.expand) + self.columns[pos].pack_start(gramplet.mainframe, + expand=gramplet.expand) # set height on gramplet.scrolledwindow here: gramplet.scrolledwindow.set_size_request(-1, gramplet.height) ## now drop it in right place @@ -1276,8 +1305,8 @@ class GrampletPane(gtk.ScrolledWindow): cnt += 1 all_opts["title"] = unique if all_opts["title"] not in self.gramplet_map: - g = make_requested_gramplet(self, name, all_opts, - self.dbstate, self.uistate) + g = make_requested_gramplet(GridGramplet, self, all_opts, + self.dbstate, self.uistate) if g: self.gramplet_map[all_opts["title"]] = g self.frame_map[str(g.mainframe)] = g @@ -1286,7 +1315,8 @@ class GrampletPane(gtk.ScrolledWindow): pos = gramplet.column else: pos = 0 - self.columns[pos].pack_start(gramplet.mainframe, expand=gramplet.expand) + self.columns[pos].pack_start(gramplet.mainframe, + expand=gramplet.expand) # set height on gramplet.scrolledwindow here: gramplet.scrolledwindow.set_size_request(-1, gramplet.height) ## now drop it in right place @@ -1337,7 +1367,7 @@ class GrampletPane(gtk.ScrolledWindow): def set_inactive(self): for title in self.gramplet_map: if self.gramplet_map[title].pui: - if self.gramplet_map[title].state != "detached": + if self.gramplet_map[title].gstate != "detached": self.gramplet_map[title].pui.active = False def set_active(self): @@ -1345,7 +1375,7 @@ class GrampletPane(gtk.ScrolledWindow): if self.gramplet_map[title].pui: self.gramplet_map[title].pui.active = True if self.gramplet_map[title].pui.dirty: - if self.gramplet_map[title].state == "maximized": + if self.gramplet_map[title].gstate == "maximized": self.gramplet_map[title].pui.update() def on_delete(self): @@ -1375,7 +1405,7 @@ class GrampletPane(gtk.ScrolledWindow): return [self.config_panel] + \ [self.build_panel(gramplet) for gramplet in sorted(self.gramplet_map.values(), key=lambda g: g.title) - if gramplet.state != "closed"] + if gramplet.gstate != "closed"] return generate_pages def get_columns(self): @@ -1405,8 +1435,8 @@ class GrampletPane(gtk.ScrolledWindow): def build_panel(self, gramplet): # BEGIN WORKAROUND: - # This is necessary because gtk doesn't redisplay these widgets correctly - # so we replace them with new ones + # This is necessary because gtk doesn't redisplay these widgets + # correctly so we replace them with new ones if gramplet.pui: gramplet.pui.save_options() gramplet.pui.update_options = {} @@ -1418,9 +1448,11 @@ class GrampletPane(gtk.ScrolledWindow): self._config.register("%s.height" % gramplet.title, int, gramplet.get_height, gramplet.set_height) self._config.register("%s.detached_height" % gramplet.title, - int, gramplet.get_detached_height, gramplet.set_detached_height) + int, gramplet.get_detached_height, + gramplet.set_detached_height) self._config.register("%s.detached_width" % gramplet.title, - int, gramplet.get_detached_width, gramplet.set_detached_width) + int, gramplet.get_detached_width, + gramplet.set_detached_width) self._config.register("%s.expand" % gramplet.title, bool, gramplet.get_expand, gramplet.set_expand) def gramplet_panel(configdialog): diff --git a/src/plugins/gramplet/Filter.py b/src/plugins/gramplet/Filter.py new file mode 100644 index 000000000..81bb9e07d --- /dev/null +++ b/src/plugins/gramplet/Filter.py @@ -0,0 +1,146 @@ +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2010 Doug Blank +# Copyright (C) 2011 Nick Hall +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# $Id$ +# + +#------------------------------------------------------------------------- +# +# Gramps modules +# +#------------------------------------------------------------------------- +from gen.plug import Gramplet +from Filters.SideBar import (PersonSidebarFilter, FamilySidebarFilter, + EventSidebarFilter, SourceSidebarFilter, + PlaceSidebarFilter, MediaSidebarFilter, + RepoSidebarFilter, NoteSidebarFilter) + +#------------------------------------------------------------------------- +# +# Filter class +# +#------------------------------------------------------------------------- +class Filter(Gramplet): + """ + The base class for all filter gramplets. + """ + FILTER_CLASS = None + + def init(self): + self.filter = self.FILTER_CLASS(self.dbstate, self.uistate, + self.__filter_clicked) + self.widget = self.filter.get_widget() + self.gui.get_container_widget().remove(self.gui.textview) + self.gui.get_container_widget().add_with_viewport(self.widget) + self.widget.show_all() + + def __filter_clicked(self): + """ + Called when the filter apply button is clicked. + """ + self.gui.view.generic_filter = self.filter.get_filter() + self.gui.view.build_tree() + +#------------------------------------------------------------------------- +# +# PersonFilter class +# +#------------------------------------------------------------------------- +class PersonFilter(Filter): + """ + A gramplet providing a Person Filter. + """ + FILTER_CLASS = PersonSidebarFilter + +#------------------------------------------------------------------------- +# +# FamilyFilter class +# +#------------------------------------------------------------------------- +class FamilyFilter(Filter): + """ + A gramplet providing a Family Filter. + """ + FILTER_CLASS = FamilySidebarFilter + +#------------------------------------------------------------------------- +# +# EventFilter class +# +#------------------------------------------------------------------------- +class EventFilter(Filter): + """ + A gramplet providing a Event Filter. + """ + FILTER_CLASS = EventSidebarFilter + +#------------------------------------------------------------------------- +# +# SourceFilter class +# +#------------------------------------------------------------------------- +class SourceFilter(Filter): + """ + A gramplet providing a Source Filter. + """ + FILTER_CLASS = SourceSidebarFilter + +#------------------------------------------------------------------------- +# +# PlaceFilter class +# +#------------------------------------------------------------------------- +class PlaceFilter(Filter): + """ + A gramplet providing a Place Filter. + """ + FILTER_CLASS = PlaceSidebarFilter + +#------------------------------------------------------------------------- +# +# MediaFilter class +# +#------------------------------------------------------------------------- +class MediaFilter(Filter): + """ + A gramplet providing a Media Filter. + """ + FILTER_CLASS = MediaSidebarFilter + +#------------------------------------------------------------------------- +# +# RepositoryFilter class +# +#------------------------------------------------------------------------- +class RepositoryFilter(Filter): + """ + A gramplet providing a Repository Filter. + """ + FILTER_CLASS = RepoSidebarFilter + +#------------------------------------------------------------------------- +# +# NoteFilter class +# +#------------------------------------------------------------------------- +class NoteFilter(Filter): + """ + A gramplet providing a Note Filter. + """ + FILTER_CLASS = NoteSidebarFilter diff --git a/src/plugins/gramplet/PersonAttributes.py b/src/plugins/gramplet/PersonAttributes.py index d22b00eba..5b96f79e4 100644 --- a/src/plugins/gramplet/PersonAttributes.py +++ b/src/plugins/gramplet/PersonAttributes.py @@ -41,7 +41,7 @@ class PersonAttributes(Gramplet): """ tip = _('Double-click on a row to view a quick report showing ' 'all people with the selected attribute.') - self.gui.tooltip = tip + self.set_tooltip(tip) top = gtk.TreeView() titles = [(_('Key'), 1, 100), (_('Value'), 2, 100)] diff --git a/src/plugins/gramplet/PersonDetails.py b/src/plugins/gramplet/PersonDetails.py index a213b65c0..febf77028 100644 --- a/src/plugins/gramplet/PersonDetails.py +++ b/src/plugins/gramplet/PersonDetails.py @@ -42,7 +42,6 @@ class PersonDetails(Gramplet): """ Build the GUI interface. """ - self.gui.tooltip = '' self.load_obj = None self.load_rect = None self.top = gtk.HBox() diff --git a/src/plugins/gramplet/PersonGallery.py b/src/plugins/gramplet/PersonGallery.py index 2437a8624..52c71e5c8 100644 --- a/src/plugins/gramplet/PersonGallery.py +++ b/src/plugins/gramplet/PersonGallery.py @@ -39,7 +39,7 @@ class PersonGallery(Gramplet): """ tip = _('Double-click on a picture to view it in the default image ' 'viewer application.') - self.gui.tooltip = tip + self.set_tooltip(tip) self.image_list = [] self.top = gtk.HBox(False, 3) return self.top diff --git a/src/plugins/gramplet/PersonResidence.py b/src/plugins/gramplet/PersonResidence.py index aa2e1bd9a..fe8fad64b 100644 --- a/src/plugins/gramplet/PersonResidence.py +++ b/src/plugins/gramplet/PersonResidence.py @@ -42,7 +42,7 @@ class PersonResidence(Gramplet): Build the GUI interface. """ tip = _('Double-click on a row to edit the selected event.') - self.gui.tooltip = tip + self.set_tooltip(tip) top = gtk.TreeView() titles = [('', NOSORT, 50,), (_('Date'), 1, 200), diff --git a/src/plugins/gramplet/bottombar.gpr.py b/src/plugins/gramplet/bottombar.gpr.py index f08c87b66..2c97f76b0 100644 --- a/src/plugins/gramplet/bottombar.gpr.py +++ b/src/plugins/gramplet/bottombar.gpr.py @@ -76,3 +76,107 @@ register(GRAMPLET, gramplet = 'PersonAttributes', gramplet_title=_("Attributes"), ) + +register(GRAMPLET, + id="Person Filter Gramplet", + name=_("Person Filter Gramplet"), + description = _("Gramplet providing a person filter"), + version="1.0.0", + gramps_target_version="3.3", + status = STABLE, + fname="Filter.py", + height=200, + gramplet = 'PersonFilter', + gramplet_title=_("Filter"), + ) + +register(GRAMPLET, + id="Family Filter Gramplet", + name=_("Family Filter Gramplet"), + description = _("Gramplet providing a family filter"), + version="1.0.0", + gramps_target_version="3.3", + status = STABLE, + fname="Filter.py", + height=200, + gramplet = 'FamilyFilter', + gramplet_title=_("Filter"), + ) + +register(GRAMPLET, + id="Event Filter Gramplet", + name=_("Event Filter Gramplet"), + description = _("Gramplet providing an event filter"), + version="1.0.0", + gramps_target_version="3.3", + status = STABLE, + fname="Filter.py", + height=200, + gramplet = 'EventFilter', + gramplet_title=_("Filter"), + ) + +register(GRAMPLET, + id="Source Filter Gramplet", + name=_("Source Filter Gramplet"), + description = _("Gramplet providing a source filter"), + version="1.0.0", + gramps_target_version="3.3", + status = STABLE, + fname="Filter.py", + height=200, + gramplet = 'SourceFilter', + gramplet_title=_("Filter"), + ) + +register(GRAMPLET, + id="Place Filter Gramplet", + name=_("Place Filter Gramplet"), + description = _("Gramplet providing a place filter"), + version="1.0.0", + gramps_target_version="3.3", + status = STABLE, + fname="Filter.py", + height=200, + gramplet = 'PlaceFilter', + gramplet_title=_("Filter"), + ) + +register(GRAMPLET, + id="Media Filter Gramplet", + name=_("Media Filter Gramplet"), + description = _("Gramplet providing a media filter"), + version="1.0.0", + gramps_target_version="3.3", + status = STABLE, + fname="Filter.py", + height=200, + gramplet = 'MediaFilter', + gramplet_title=_("Filter"), + ) + +register(GRAMPLET, + id="Repository Filter Gramplet", + name=_("Repository Filter Gramplet"), + description = _("Gramplet providing a repository filter"), + version="1.0.0", + gramps_target_version="3.3", + status = STABLE, + fname="Filter.py", + height=200, + gramplet = 'RepositoryFilter', + gramplet_title=_("Filter"), + ) + +register(GRAMPLET, + id="Note Filter Gramplet", + name=_("Note Filter Gramplet"), + description = _("Gramplet providing a note filter"), + version="1.0.0", + gramps_target_version="3.3", + status = STABLE, + fname="Filter.py", + height=200, + gramplet = 'NoteFilter', + gramplet_title=_("Filter"), + ) diff --git a/src/plugins/lib/libpersonview.py b/src/plugins/lib/libpersonview.py index 735179441..cfe68e6b0 100644 --- a/src/plugins/lib/libpersonview.py +++ b/src/plugins/lib/libpersonview.py @@ -445,7 +445,7 @@ class BasePersonView(ListView): """ Define the default gramplets for the sidebar and bottombar. """ - return (("Welcome Gramplet",), + return (("Person Filter Gramplet",), ("Person Details Gramplet", "Person Gallery Gramplet", "Person Residence Gramplet", diff --git a/src/plugins/lib/libplaceview.py b/src/plugins/lib/libplaceview.py index ab924e950..bb1846cad 100644 --- a/src/plugins/lib/libplaceview.py +++ b/src/plugins/lib/libplaceview.py @@ -420,5 +420,12 @@ class PlaceBaseView(ListView): else: return None + def get_default_gramplets(self): + """ + Define the default gramplets for the sidebar and bottombar. + """ + return (("Place Filter Gramplet",), + ()) + def make_callback(func, val): return lambda x: func(val) diff --git a/src/plugins/view/eventview.py b/src/plugins/view/eventview.py index b9e016a43..23cd44611 100644 --- a/src/plugins/view/eventview.py +++ b/src/plugins/view/eventview.py @@ -284,3 +284,9 @@ class EventView(ListView): """ pass + def get_default_gramplets(self): + """ + Define the default gramplets for the sidebar and bottombar. + """ + return (("Event Filter Gramplet",), + ()) diff --git a/src/plugins/view/familyview.py b/src/plugins/view/familyview.py index e5afeef84..a55cb8d43 100644 --- a/src/plugins/view/familyview.py +++ b/src/plugins/view/familyview.py @@ -338,3 +338,10 @@ class FamilyView(ListView): family = self.dbstate.db.get_family_from_handle(family_handle) family.add_tag(tag_handle) self.dbstate.db.commit_family(family, transaction) + + def get_default_gramplets(self): + """ + Define the default gramplets for the sidebar and bottombar. + """ + return (("Family Filter Gramplet",), + ()) diff --git a/src/plugins/view/geoview.py b/src/plugins/view/geoview.py index 7ad6aef04..039d84f1e 100644 --- a/src/plugins/view/geoview.py +++ b/src/plugins/view/geoview.py @@ -77,7 +77,6 @@ from PlaceUtils import conv_lat_lon from gui.views.navigationview import NavigationView from gui.editors import EditPlace from gui.selectors.selectplace import SelectPlace -from Filters.SideBar import PlaceSidebarFilter, EventSidebarFilter import Bookmarks from Utils import navigation_label @@ -424,7 +423,8 @@ class GeoView(HtmlView): ) self.side = None self.bottom = None - self.add_filter(PlaceSidebarFilter) + self.sidebar.remove_gramplet('Event Filter Gramplet') + self.sidebar.add_gramplet('Place Filter Gramplet') return HtmlView.build_widget(self) def can_configure(self): @@ -889,7 +889,7 @@ class GeoView(HtmlView): self.width = (widget.parent.parent.get_allocation().width - widget.parent.parent.get_child2().get_allocation().width - 30) - if not self.sidebar.is_visible(): + if not self.sidebar.get_property('visible'): if self.side is not None: self.width = widget.parent.parent.get_allocation().width - 24 else: @@ -899,7 +899,7 @@ class GeoView(HtmlView): else: _LOG.debug("Sidebar : map width=%d" % self.width) - if not self.bottombar.is_visible(): + if not self.bottombar.get_property('visible'): if self.bottom is not None: self.height = (widget.parent.get_allocation().height - self.header_size - 24) @@ -1223,9 +1223,9 @@ class GeoView(HtmlView): Specifies the place for the home person to display with mapstraction. """ self.displaytype = "places" - self.remove_filter() - self.add_filter(PlaceSidebarFilter) - self.widget.parent.parent.get_child2().show() + self.sidebar.remove_gramplet('Event Filter Gramplet') + self.sidebar.add_gramplet('Place Filter Gramplet') + #self.widget.parent.parent.get_child2().show() self._geo_places() def _person_places(self, handle=None): # pylint: disable-msg=W0613 @@ -1235,7 +1235,7 @@ class GeoView(HtmlView): self.displaytype = "person" if not self.uistate.get_active('Person'): return - self.widget.parent.parent.get_child2().hide() + #self.widget.parent.parent.get_child2().hide() self._geo_places() def _family_places(self, hanle=None): # pylint: disable-msg=W0613 @@ -1245,7 +1245,7 @@ class GeoView(HtmlView): self.displaytype = "family" if not self.uistate.get_active('Person'): return - self.widget.parent.parent.get_child2().hide() + #self.widget.parent.parent.get_child2().hide() self._geo_places() def _event_places(self, hanle=None): # pylint: disable-msg=W0613 @@ -1253,9 +1253,9 @@ class GeoView(HtmlView): Specifies all event places to display with mapstraction. """ self.displaytype = "event" - self.remove_filter() - self.add_filter(EventSidebarFilter) - self.widget.parent.parent.get_child2().show() + self.sidebar.remove_gramplet('Place Filter Gramplet') + self.sidebar.add_gramplet('Event Filter Gramplet') + #self.widget.parent.parent.get_child2().show() self._geo_places() def _new_database(self, database): diff --git a/src/plugins/view/mediaview.py b/src/plugins/view/mediaview.py index f5ccc79e9..d29604a8a 100644 --- a/src/plugins/view/mediaview.py +++ b/src/plugins/view/mediaview.py @@ -488,3 +488,10 @@ class MediaView(ListView): media = self.dbstate.db.get_object_from_handle(media_handle) media.add_tag(tag_handle) self.dbstate.db.commit_media_object(media, transaction) + + def get_default_gramplets(self): + """ + Define the default gramplets for the sidebar and bottombar. + """ + return (("Media Filter Gramplet",), + ()) diff --git a/src/plugins/view/noteview.py b/src/plugins/view/noteview.py index 85e6fbe9e..2030160bc 100644 --- a/src/plugins/view/noteview.py +++ b/src/plugins/view/noteview.py @@ -293,3 +293,10 @@ class NoteView(ListView): note = self.dbstate.db.get_note_from_handle(note_handle) note.add_tag(tag_handle) self.dbstate.db.commit_note(note, transaction) + + def get_default_gramplets(self): + """ + Define the default gramplets for the sidebar and bottombar. + """ + return (("Note Filter Gramplet",), + ()) diff --git a/src/plugins/view/repoview.py b/src/plugins/view/repoview.py index 013db4e34..4a47639ea 100644 --- a/src/plugins/view/repoview.py +++ b/src/plugins/view/repoview.py @@ -268,3 +268,10 @@ class RepositoryView(ListView): As this submenu will be dynamically built, we offer a dummy action """ pass + + def get_default_gramplets(self): + """ + Define the default gramplets for the sidebar and bottombar. + """ + return (("Repository Filter Gramplet",), + ()) diff --git a/src/plugins/view/sourceview.py b/src/plugins/view/sourceview.py index d223b96a6..54f12c797 100644 --- a/src/plugins/view/sourceview.py +++ b/src/plugins/view/sourceview.py @@ -245,3 +245,10 @@ class SourceView(ListView): return obj.get_handle() else: return None + + def get_default_gramplets(self): + """ + Define the default gramplets for the sidebar and bottombar. + """ + return (("Source Filter Gramplet",), + ())