Code cleanup in _MenuOptions.py
svn: r9799
This commit is contained in:
		| @@ -1,3 +1,6 @@ | ||||
| 2008-01-13  Brian Matherly <brian@gramps-project.org> | ||||
| 	* src/PluginUtils/_MenuOptions.py: Code cleanup. | ||||
|  | ||||
| 2008-01-13  Gary Burton <gary.burton@zen.co.uk> | ||||
| 	* src/ManagedWindow.py: Revert last change. | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| # | ||||
| # Gramps - a GTK+/GNOME based genealogy program | ||||
| # | ||||
| # Copyright (C) 2007  Brian G. Matherly | ||||
| # Copyright (C) 2007-2008  Brian G. Matherly | ||||
| # | ||||
| # 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 | ||||
| @@ -22,6 +22,13 @@ | ||||
| """ | ||||
| Abstracted option handling. | ||||
| """ | ||||
| #------------------------------------------------------------------------ | ||||
| # | ||||
| # python modules | ||||
| # | ||||
| #------------------------------------------------------------------------ | ||||
| from gettext import gettext as _ | ||||
|  | ||||
| #------------------------------------------------------------------------- | ||||
| # | ||||
| # gramps modules | ||||
| @@ -30,7 +37,6 @@ Abstracted option handling. | ||||
| import gtk | ||||
| import gobject | ||||
| import Utils | ||||
| import _Tool as Tool | ||||
| import GrampsWidgets | ||||
| import ManagedWindow | ||||
| from Selectors import selector_factory | ||||
| @@ -42,23 +48,25 @@ from BasicUtils import name_displayer as _nd | ||||
| # | ||||
| #------------------------------------------------------------------------ | ||||
| class LastNameDialog(ManagedWindow.ManagedWindow): | ||||
|  | ||||
|     def __init__(self, database, uistate, track, surnames, skipList=set()): | ||||
|     """ | ||||
|     A dialog that allows the selection of a surname from the database. | ||||
|     """ | ||||
|     def __init__(self, database, uistate, track, surnames, skip_list=set()): | ||||
|  | ||||
|         self.title = _('Select surname') | ||||
|         ManagedWindow.ManagedWindow.__init__(self, uistate, track, self) | ||||
|         self.dlg = gtk.Dialog( | ||||
|             None, | ||||
|             uistate.window, | ||||
|             gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_NO_SEPARATOR, | ||||
|             (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) | ||||
|         flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT | \ | ||||
|                 gtk.DIALOG_NO_SEPARATOR | ||||
|         buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK,  | ||||
|                    gtk.RESPONSE_ACCEPT) | ||||
|         self.dlg = gtk.Dialog(None, uistate.window, flags, buttons) | ||||
|         self.dlg.set_position(gtk.WIN_POS_CENTER_ON_PARENT) | ||||
|         self.set_window(self.dlg, None, self.title) | ||||
|         self.window.set_default_size(400, 400) | ||||
|  | ||||
|         # build up a container to display all of the people of interest | ||||
|         self.model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_INT) | ||||
|         self.treeView = gtk.TreeView(self.model) | ||||
|         self.tree_view = gtk.TreeView(self.model) | ||||
|         col1 = gtk.TreeViewColumn(_('Surname'), gtk.CellRendererText(), text=0) | ||||
|         col2 = gtk.TreeViewColumn(_('Count'), gtk.CellRendererText(), text=1) | ||||
|         col1.set_resizable(True) | ||||
| @@ -67,14 +75,14 @@ class LastNameDialog(ManagedWindow.ManagedWindow): | ||||
|         col2.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) | ||||
|         col1.set_sort_column_id(0) | ||||
|         col2.set_sort_column_id(1) | ||||
|         self.treeView.append_column(col1) | ||||
|         self.treeView.append_column(col2) | ||||
|         self.scrolledWindow = gtk.ScrolledWindow() | ||||
|         self.scrolledWindow.add(self.treeView) | ||||
|         self.scrolledWindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) | ||||
|         self.scrolledWindow.set_shadow_type(gtk.SHADOW_OUT) | ||||
|         self.dlg.vbox.pack_start(self.scrolledWindow, expand=True, fill=True) | ||||
|         self.scrolledWindow.show_all() | ||||
|         self.tree_view.append_column(col1) | ||||
|         self.tree_view.append_column(col2) | ||||
|         scrolled_window = gtk.ScrolledWindow() | ||||
|         scrolled_window.add(self.tree_view) | ||||
|         scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) | ||||
|         scrolled_window.set_shadow_type(gtk.SHADOW_OUT) | ||||
|         self.dlg.vbox.pack_start(scrolled_window, expand=True, fill=True) | ||||
|         scrolled_window.show_all() | ||||
|  | ||||
|         if len(surnames) == 0: | ||||
|             # we could use database.get_surname_list(), but if we do that | ||||
| @@ -84,14 +92,15 @@ class LastNameDialog(ManagedWindow.ManagedWindow): | ||||
| #            for name in database.get_surname_list(): | ||||
| #                self.model.append([name, 0]) | ||||
|  | ||||
|             # build up the list of surnames, keeping track of the count for each name | ||||
|             # (this can be a lengthy process, so by passing in the dictionary we can | ||||
|             # be certain we only do this once) | ||||
|             # build up the list of surnames, keeping track of the count for each | ||||
|             # name (this can be a lengthy process, so by passing in the  | ||||
|             # dictionary we can be certain we only do this once) | ||||
|             progress = Utils.ProgressMeter(_('Finding surnames')) | ||||
|             progress.set_pass(_('Finding surnames'), database.get_number_of_people()) | ||||
|             for personHandle in database.get_person_handles(False): | ||||
|             progress.set_pass(_('Finding surnames'),  | ||||
|                               database.get_number_of_people()) | ||||
|             for person_handle in database.get_person_handles(False): | ||||
|                 progress.step() | ||||
|                 person = database.get_person_from_handle(personHandle) | ||||
|                 person = database.get_person_from_handle(person_handle) | ||||
|                 key = person.get_primary_name().get_surname() | ||||
|                 count = 0 | ||||
|                 if key in surnames: | ||||
| @@ -101,28 +110,32 @@ class LastNameDialog(ManagedWindow.ManagedWindow): | ||||
|  | ||||
|         # insert the names and count into the model | ||||
|         for key in surnames: | ||||
|             if key.encode('iso-8859-1','xmlcharrefreplace') not in skipList: | ||||
|             if key.encode('iso-8859-1','xmlcharrefreplace') not in skip_list: | ||||
|                 self.model.append([key, surnames[key]]) | ||||
|  | ||||
|         # keep the list sorted starting with the most popular last name | ||||
|         self.model.set_sort_column_id(1, gtk.SORT_DESCENDING) | ||||
|  | ||||
|         # the "OK" button should be enabled/disabled based on the selection of a row | ||||
|         self.treeSelection = self.treeView.get_selection() | ||||
|         self.treeSelection.set_mode(gtk.SELECTION_MULTIPLE) | ||||
|         self.treeSelection.select_path(0) | ||||
|         # the "OK" button should be enabled/disabled based on the selection of  | ||||
|         # a row | ||||
|         self.tree_selection = self.tree_view.get_selection() | ||||
|         self.tree_selection.set_mode(gtk.SELECTION_MULTIPLE) | ||||
|         self.tree_selection.select_path(0) | ||||
|  | ||||
|     def run(self): | ||||
|         """ | ||||
|         Display the dialog and return the selected surnames when done. | ||||
|         """ | ||||
|         response = self.dlg.run() | ||||
|         surnameSet = set() | ||||
|         surname_set = set() | ||||
|         if response == gtk.RESPONSE_ACCEPT: | ||||
|             (mode, paths) = self.treeSelection.get_selected_rows() | ||||
|             (mode, paths) = self.tree_selection.get_selected_rows() | ||||
|             for path in paths: | ||||
|                 iter = self.model.get_iter(path) | ||||
|                 surname = self.model.get_value(iter, 0) | ||||
|                 surnameSet.add(surname) | ||||
|                 i = self.model.get_iter(path) | ||||
|                 surname = self.model.get_value(i, 0) | ||||
|                 surname_set.add(surname) | ||||
|         self.dlg.destroy() | ||||
|         return surnameSet | ||||
|         return surname_set | ||||
|  | ||||
| #------------------------------------------------------------------------- | ||||
| # | ||||
| @@ -195,7 +208,7 @@ class Option: | ||||
|         """ | ||||
|         return self.__help_str | ||||
|          | ||||
|     def set_help(self,help): | ||||
|     def set_help(self, help_text): | ||||
|         """ | ||||
|         Set the help information for this option. | ||||
|          | ||||
| @@ -205,7 +218,7 @@ class Option: | ||||
|         @type value: string | ||||
|         @return: nothing | ||||
|         """ | ||||
|         self.__help_str = help | ||||
|         self.__help_str = help_text | ||||
|  | ||||
|     def add_dialog_category(self, dialog, category): | ||||
|         """ | ||||
| @@ -241,7 +254,7 @@ class StringOption(Option): | ||||
|         """ | ||||
|         Option.__init__(self, label, value) | ||||
|  | ||||
|     def make_gui_obj(self, gtk, dialog): | ||||
|     def make_gui_obj(self, dialog): | ||||
|         """ | ||||
|         Add a StringOption (single line text) to the dialog. | ||||
|         """ | ||||
| @@ -276,7 +289,7 @@ class ColourButtonOption(Option): | ||||
|         """ | ||||
|         Option.__init__(self, label, value) | ||||
|  | ||||
|     def make_gui_obj(self, gtk, dialog): | ||||
|     def make_gui_obj(self, dialog): | ||||
|         """ | ||||
|         Add a ColorButton to the dialog. | ||||
|         """ | ||||
| @@ -304,7 +317,7 @@ class NumberOption(Option): | ||||
|     This class describes an option that is a simple number with defined maximum  | ||||
|     and minimum values. | ||||
|     """ | ||||
|     def __init__(self,label,value,min,max): | ||||
|     def __init__(self, label, value, min_val, max_val): | ||||
|         """ | ||||
|         @param label: A friendly label to be applied to this option. | ||||
|             Example: "Number of generations to include" | ||||
| @@ -321,8 +334,8 @@ class NumberOption(Option): | ||||
|         @return: nothing | ||||
|         """ | ||||
|         Option.__init__(self, label, value) | ||||
|         self.__min = min | ||||
|         self.__max = max | ||||
|         self.__min = min_val | ||||
|         self.__max = max_val | ||||
|      | ||||
|     def get_min(self): | ||||
|         """ | ||||
| @@ -340,7 +353,7 @@ class NumberOption(Option): | ||||
|         """ | ||||
|         return self.__max | ||||
|  | ||||
|     def make_gui_obj(self, gtk, dialog): | ||||
|     def make_gui_obj(self, dialog): | ||||
|         """ | ||||
|         Add a NumberOption to the dialog. | ||||
|         """ | ||||
| @@ -367,21 +380,22 @@ class FloatOption(NumberOption): | ||||
|     This class performs like NumberOption, but allows for float values | ||||
|     for the minimum/maximum/increment. | ||||
|     """ | ||||
|     def __init__(self, label, value, min, max): | ||||
|     def __init__(self, label, value, min_val, max_val): | ||||
|         # Someone who knows python better than I will probably | ||||
|         # want to add a parameter for the caller to specify how | ||||
|         # many decimal points are needed. | ||||
|         # | ||||
|         # At the time this function was written, the only code | ||||
|         # that needed this class required 2 decimals. | ||||
|         NumberOption.__init__(self, label, value, min, max) | ||||
|         NumberOption.__init__(self, label, value, min_val, max_val) | ||||
|  | ||||
|     def make_gui_obj(self, gtk, dialog): | ||||
|     def make_gui_obj(self, dialog): | ||||
|         """ | ||||
|         Add a FloatOption to the dialog. | ||||
|         """ | ||||
|         value = self.get_value() | ||||
|         adj = gtk.Adjustment(value, lower=self.get_min(), upper=self.get_max(), step_incr=0.01) | ||||
|         adj = gtk.Adjustment(value, lower=self.get_min(),  | ||||
|                              upper=self.get_max(), step_incr=0.01) | ||||
|  | ||||
|         self.gobj = gtk.SpinButton(adjustment=adj, digits=2) | ||||
|         self.gobj.set_value(value) | ||||
| @@ -392,7 +406,6 @@ class FloatOption(NumberOption): | ||||
|         """ | ||||
|         return float(self.gobj.get_value()) | ||||
|  | ||||
|  | ||||
| #------------------------------------------------------------------------- | ||||
| # | ||||
| # TextOption class | ||||
| @@ -414,7 +427,7 @@ class TextOption(Option): | ||||
|         """ | ||||
|         Option.__init__(self, label, value) | ||||
|  | ||||
|     def make_gui_obj(self, gtk, dialog): | ||||
|     def make_gui_obj(self, dialog): | ||||
|         """ | ||||
|         Add a TextOption to the dialog. | ||||
|         """ | ||||
| @@ -434,9 +447,9 @@ class TextOption(Option): | ||||
|         """ | ||||
|         Parse the text option (multi-line text). | ||||
|         """ | ||||
|         b = self.gtext.get_buffer() | ||||
|         text_val = unicode( b.get_text( b.get_start_iter(), | ||||
|                                         b.get_end_iter(), | ||||
|         buff = self.gtext.get_buffer() | ||||
|         text_val = unicode( buff.get_text( buff.get_start_iter(), | ||||
|                                            buff.get_end_iter(), | ||||
|                                            False)             ) | ||||
|         return text_val.split('\n') | ||||
|          | ||||
| @@ -461,7 +474,7 @@ class BooleanOption(Option): | ||||
|         """ | ||||
|         Option.__init__(self, label, value) | ||||
|  | ||||
|     def make_gui_obj(self, gtk, dialog): | ||||
|     def make_gui_obj(self, dialog): | ||||
|         """ | ||||
|         Add a BooleanOption to the dialog. | ||||
|         """ | ||||
| @@ -521,11 +534,11 @@ class EnumeratedListOption(Option): | ||||
|         """ | ||||
|         return self.__items | ||||
|  | ||||
|     def make_gui_obj(self, gtk, dialog): | ||||
|     def make_gui_obj(self, dialog): | ||||
|         """ | ||||
|         Add an EnumeratedListOption to the dialog. | ||||
|         """ | ||||
|         v = self.get_value() | ||||
|         cur_val = self.get_value() | ||||
|         active_index = 0 | ||||
|         current_index = 0  | ||||
|         self.combo = gtk.combo_box_new_text() | ||||
| @@ -533,7 +546,7 @@ class EnumeratedListOption(Option): | ||||
|         self.gobj.add(self.combo) | ||||
|         for (value, description) in self.get_items(): | ||||
|             self.combo.append_text(description) | ||||
|             if value == v: | ||||
|             if value == cur_val: | ||||
|                 active_index = current_index | ||||
|             current_index += 1 | ||||
|         self.combo.set_active( active_index ) | ||||
| @@ -583,15 +596,18 @@ class PersonFilterOption(Option): | ||||
|             self.set_value(0) | ||||
|              | ||||
|     def get_center_person(self): | ||||
|         """ | ||||
|         Get the person for whom the filters have been generated. | ||||
|         """ | ||||
|         return self.__person | ||||
|      | ||||
|     def get_filter(self): | ||||
|         """ | ||||
|         Return the filter object. | ||||
|         Return the currently selected filter object. | ||||
|         """ | ||||
|         return self.__filters[self.get_value()] | ||||
|  | ||||
|     def make_gui_obj(self, gtk, dialog): | ||||
|     def make_gui_obj(self, dialog): | ||||
|         """ | ||||
|         Add an PersonFilterOption to the dialog. | ||||
|         """ | ||||
| @@ -607,12 +623,17 @@ class PersonFilterOption(Option): | ||||
|         self.update_gui_obj() | ||||
|          | ||||
|     def __on_value_changed(self, obj): | ||||
|         """ | ||||
|         Handle the change of the value. | ||||
|         """ | ||||
|         self.set_value( int(self.combo.get_active()) ) | ||||
|  | ||||
|     def on_change_clicked(self, *obj): | ||||
|         from Selectors import selector_factory | ||||
|         SelectPerson = selector_factory('Person') | ||||
|         sel_person = SelectPerson(self.dialog.dbstate, | ||||
|         """ | ||||
|         Handle the "Change..." button press. | ||||
|         """ | ||||
|         select_class = selector_factory('Person') | ||||
|         sel_person = select_class(self.dialog.dbstate, | ||||
|                                   self.dialog.uistate, | ||||
|                                   self.dialog.track) | ||||
|         new_person = sel_person.run() | ||||
| @@ -626,8 +647,8 @@ class PersonFilterOption(Option): | ||||
|         self.combo.get_model().clear() | ||||
|         self.__filters = ReportUtils.get_person_filters(self.__person, | ||||
|                                                         self.__include_single) | ||||
|         for filter in self.__filters: | ||||
|             self.combo.append_text(filter.get_name()) | ||||
|         for filt in self.__filters: | ||||
|             self.combo.append_text(filt.get_name()) | ||||
|          | ||||
|         if self.get_value() >= len(self.__filters): | ||||
|             # Set the value to zero if it is not valid. | ||||
| @@ -662,11 +683,11 @@ class PersonOption(Option): | ||||
|         @type value: DbState | ||||
|         @return: nothing | ||||
|         """ | ||||
|         self.dbstate = dbstate | ||||
|         self.db = dbstate.get_database() | ||||
|         self.__dbstate = dbstate | ||||
|         self.__db = dbstate.get_database() | ||||
|         Option.__init__(self, label, value) | ||||
|  | ||||
|     def make_gui_obj(self, gtk, dialog): | ||||
|     def make_gui_obj(self, dialog): | ||||
|         self.dialog = dialog | ||||
|         self.gobj = gtk.HBox() | ||||
|         self.person_label = gtk.Label() | ||||
| @@ -681,32 +702,35 @@ class PersonOption(Option): | ||||
|         self.gobj.pack_start(self.pevt, False) | ||||
|         self.gobj.pack_end(self.person_button, False) | ||||
|          | ||||
|         person = self.db.get_person_from_gramps_id(self.get_value()) | ||||
|         person = self.__db.get_person_from_gramps_id(self.get_value()) | ||||
|         if not person: | ||||
|             person = self.dbstate.get_active_person() | ||||
|             person = self.__dbstate.get_active_person() | ||||
|         self.update_person(person) | ||||
|  | ||||
|     def parse(self): | ||||
|         return self.get_value() | ||||
|  | ||||
|     def get_person_clicked(self, obj): | ||||
|         """ | ||||
|         Handle the button to choose a different person. | ||||
|         """ | ||||
|         from Filters import GenericFilter, Rules | ||||
|         rfilter = GenericFilter() | ||||
|         rfilter.set_logical_op('or') | ||||
|         rfilter.add_rule(Rules.Person.IsBookmarked([])) | ||||
|          | ||||
|         default_person = self.db.get_default_person() | ||||
|         default_person = self.__db.get_default_person() | ||||
|         if default_person: | ||||
|             id = default_person.get_gramps_id() | ||||
|             rfilter.add_rule(Rules.Person.HasIdOf([id])) | ||||
|             gid = default_person.get_gramps_id() | ||||
|             rfilter.add_rule(Rules.Person.HasIdOf([gid])) | ||||
|              | ||||
|         active_person = self.dbstate.get_active_person() | ||||
|         active_person = self.__dbstate.get_active_person() | ||||
|         if active_person: | ||||
|             id = active_person.get_gramps_id() | ||||
|             rfilter.add_rule(Rules.Person.HasIdOf([id])) | ||||
|             gid = active_person.get_gramps_id() | ||||
|             rfilter.add_rule(Rules.Person.HasIdOf([gid])) | ||||
|  | ||||
|         SelectPerson = selector_factory('Person') | ||||
|         sel = SelectPerson(self.dbstate, self.dialog.uistate,  | ||||
|         select_class = selector_factory('Person') | ||||
|         sel = select_class(self.__dbstate, self.dialog.uistate,  | ||||
|                            self.dialog.track,  | ||||
|                            title=_('Select a person for the report'),  | ||||
|                            filter=rfilter ) | ||||
| @@ -714,6 +738,9 @@ class PersonOption(Option): | ||||
|         self.update_person(person) | ||||
|      | ||||
|     def update_person(self, person): | ||||
|         """ | ||||
|         Update the currently selected person. | ||||
|         """ | ||||
|         if person: | ||||
|             name = _nd.display(person) | ||||
|             gid = person.get_gramps_id() | ||||
| @@ -747,11 +774,11 @@ class PersonListOption(Option): | ||||
|         @type value: string | ||||
|         @return: nothing | ||||
|         """ | ||||
|         self.db = dbstate.get_database() | ||||
|         self.dbstate = dbstate | ||||
|         self.__db = dbstate.get_database() | ||||
|         self.__dbstate = dbstate | ||||
|         Option.__init__(self, label, value) | ||||
|  | ||||
|     def make_gui_obj(self, gtk, dialog): | ||||
|     def make_gui_obj(self, dialog): | ||||
|         """ | ||||
|         Add a "people picker" widget to the dialog. | ||||
|         """ | ||||
| @@ -759,8 +786,8 @@ class PersonListOption(Option): | ||||
|          | ||||
|         value = self.get_value() | ||||
|         self.model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING) | ||||
|         self.treeView = gtk.TreeView(self.model) | ||||
|         self.treeView.set_size_request(150, 150) | ||||
|         self.tree_view = gtk.TreeView(self.model) | ||||
|         self.tree_view.set_size_request(150, 150) | ||||
|         col1 = gtk.TreeViewColumn(_('Name'  ), gtk.CellRendererText(), text=0) | ||||
|         col2 = gtk.TreeViewColumn(_('ID'    ), gtk.CellRendererText(), text=1) | ||||
|         col1.set_resizable(True) | ||||
| @@ -769,27 +796,31 @@ class PersonListOption(Option): | ||||
|         col2.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) | ||||
|         col1.set_sort_column_id(0) | ||||
|         col2.set_sort_column_id(1) | ||||
|         self.treeView.append_column(col1) | ||||
|         self.treeView.append_column(col2) | ||||
|         self.scrolledWindow = gtk.ScrolledWindow() | ||||
|         self.scrolledWindow.add(self.treeView) | ||||
|         self.scrolledWindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) | ||||
|         self.scrolledWindow.set_shadow_type(gtk.SHADOW_OUT) | ||||
|         self.tree_view.append_column(col1) | ||||
|         self.tree_view.append_column(col2) | ||||
|         self.scrolled_window = gtk.ScrolledWindow() | ||||
|         self.scrolled_window.add(self.tree_view) | ||||
|         self.scrolled_window.set_policy(gtk.POLICY_AUTOMATIC,  | ||||
|                                         gtk.POLICY_AUTOMATIC) | ||||
|         self.scrolled_window.set_shadow_type(gtk.SHADOW_OUT) | ||||
|         self.hbox = gtk.HBox() | ||||
|         self.hbox.pack_start(self.scrolledWindow, expand=True, fill=True) | ||||
|         self.hbox.pack_start(self.scrolled_window, expand=True, fill=True) | ||||
|  | ||||
|         for gid in value.split(): | ||||
|             person = self.db.get_person_from_gramps_id(gid) | ||||
|             person = self.__db.get_person_from_gramps_id(gid) | ||||
|             if person: | ||||
|                 name = _nd.display(person) | ||||
|                 self.model.append([name, gid]) | ||||
|  | ||||
|         # now setup the '+' and '-' pushbutton for adding/removing people from the container | ||||
|         self.addPerson = GrampsWidgets.SimpleButton(gtk.STOCK_ADD, self.addPersonClicked) | ||||
|         self.delPerson = GrampsWidgets.SimpleButton(gtk.STOCK_REMOVE, self.delPersonClicked) | ||||
|         # now setup the '+' and '-' pushbutton for adding/removing people from  | ||||
|         # the container | ||||
|         self.add_person = GrampsWidgets.SimpleButton(gtk.STOCK_ADD,  | ||||
|                                                      self.add_person_clicked) | ||||
|         self.del_person = GrampsWidgets.SimpleButton(gtk.STOCK_REMOVE,  | ||||
|                                                      self.del_person_clicked) | ||||
|         self.vbbox = gtk.VButtonBox() | ||||
|         self.vbbox.add(self.addPerson) | ||||
|         self.vbbox.add(self.delPerson) | ||||
|         self.vbbox.add(self.add_person) | ||||
|         self.vbbox.add(self.del_person) | ||||
|         self.vbbox.set_layout(gtk.BUTTONBOX_SPREAD) | ||||
|         self.hbox.pack_end(self.vbbox, expand=False) | ||||
|  | ||||
| @@ -801,26 +832,30 @@ class PersonListOption(Option): | ||||
|         Parse the object and return. | ||||
|         """ | ||||
|         gidlist = '' | ||||
|         iter = self.model.get_iter_first() | ||||
|         while (iter): | ||||
|             gid = self.model.get_value(iter, 1) | ||||
|         i = self.model.get_iter_first() | ||||
|         while (i): | ||||
|             gid = self.model.get_value(i, 1) | ||||
|             gidlist = gidlist + gid + ' ' | ||||
|             iter = self.model.iter_next(iter) | ||||
|             i = self.model.iter_next(i) | ||||
|         return gidlist | ||||
|  | ||||
|     def addPersonClicked(self, obj): | ||||
|     def add_person_clicked(self, obj): | ||||
|         """ | ||||
|         Handle the add person button. | ||||
|         """ | ||||
|         # people we already have must be excluded | ||||
|         # so we don't list them multiple times | ||||
|         skipList = set() | ||||
|         iter = self.model.get_iter_first() | ||||
|         while (iter): | ||||
|             gid = self.model.get_value(iter, 1) # get the GID stored in column #1 | ||||
|             person = self.db.get_person_from_gramps_id(gid) | ||||
|             skipList.add(person.get_handle()) | ||||
|             iter = self.model.iter_next(iter) | ||||
|         skip_list = set() | ||||
|         i = self.model.get_iter_first() | ||||
|         while (i): | ||||
|             gid = self.model.get_value(i, 1) # get the GID stored in column #1 | ||||
|             person = self.__db.get_person_from_gramps_id(gid) | ||||
|             skip_list.add(person.get_handle()) | ||||
|             i = self.model.iter_next(i) | ||||
|  | ||||
|         SelectPerson = selector_factory('Person') | ||||
|         sel = SelectPerson(self.dbstate, self.dialog.uistate, self.dialog.track, skip=skipList) | ||||
|         select_class = selector_factory('Person') | ||||
|         sel = select_class(self.__dbstate, self.dialog.uistate,  | ||||
|                            self.dialog.track, skip=skip_list) | ||||
|         person = sel.run() | ||||
|         if person: | ||||
|             name = _nd.display(person) | ||||
| @@ -832,37 +867,42 @@ class PersonListOption(Option): | ||||
|             # | ||||
|             # NOTE: we may want to make this an optional thing, determined | ||||
|             # by the use of a parameter at the time this class is instatiated | ||||
|             familyList = person.get_family_handle_list() | ||||
|             if familyList: | ||||
|                 for familyHandle in familyList: | ||||
|                     family = self.db.get_family_from_handle(familyHandle) | ||||
|             family_list = person.get_family_handle_list() | ||||
|             for family_handle in family_list: | ||||
|                 family = self.__db.get_family_from_handle(family_handle) | ||||
|                  | ||||
|                 if person.get_handle() == family.get_father_handle(): | ||||
|                         spouseHandle = family.get_mother_handle() | ||||
|                     spouse_handle = family.get_mother_handle() | ||||
|                 else: | ||||
|                         spouseHandle = family.get_father_handle() | ||||
|                     spouse_handle = family.get_father_handle() | ||||
|  | ||||
|                     if spouseHandle: | ||||
|                         if spouseHandle not in skipList: | ||||
|                             import gtk | ||||
|                             spouse = self.db.get_person_from_handle(spouseHandle) | ||||
|                             text = _('Also include %s?') % spouse.get_primary_name().get_regular_name() | ||||
|                             prompt = gtk.MessageDialog(parent=self.dialog.window, flags=gtk.DIALOG_MODAL, type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_YES_NO, message_format=text) | ||||
|                 if spouse_handle and (spouse_handle not in skip_list): | ||||
|                     spouse = self.__db.get_person_from_handle( | ||||
|                                                           spouse_handle) | ||||
|                     spouse_name = _nd.display(spouse) | ||||
|                     text = _('Also include %s?') % spouse_name | ||||
|                     prompt = gtk.MessageDialog(parent=self.dialog.window,  | ||||
|                                                flags=gtk.DIALOG_MODAL,  | ||||
|                                                type=gtk.MESSAGE_QUESTION,  | ||||
|                                                buttons=gtk.BUTTONS_YES_NO,  | ||||
|                                                message_format=text) | ||||
|                     prompt.set_default_response(gtk.RESPONSE_YES) | ||||
|                     prompt.set_position(gtk.WIN_POS_CENTER_ON_PARENT) | ||||
|                     prompt.set_title(_('Select Person')) | ||||
|                     button = prompt.run() | ||||
|                     prompt.destroy() | ||||
|                     if button == gtk.RESPONSE_YES: | ||||
|                                 name = _nd.display(spouse) | ||||
|                         gid = spouse.get_gramps_id() | ||||
|                                 self.model.append([name, gid]) | ||||
|                         self.model.append([spouse_name, gid]) | ||||
|  | ||||
|     def delPersonClicked(self, obj): | ||||
|         (path, column) = self.treeView.get_cursor() | ||||
|     def del_person_clicked(self, obj): | ||||
|         """ | ||||
|         Handle the delete person button. | ||||
|         """ | ||||
|         (path, column) = self.tree_view.get_cursor() | ||||
|         if (path): | ||||
|             iter = self.model.get_iter(path) | ||||
|             self.model.remove(iter) | ||||
|             i = self.model.get_iter(path) | ||||
|             self.model.remove(i) | ||||
|  | ||||
| #------------------------------------------------------------------------- | ||||
| # | ||||
| @@ -885,11 +925,11 @@ class SurnameColourOption(Option): | ||||
|         @type value: string | ||||
|         @return: nothing | ||||
|         """ | ||||
|         self.db = dbstate.get_database() | ||||
|         self.dbstate = dbstate | ||||
|         self.__db = dbstate.get_database() | ||||
|         self.__dbstate = dbstate | ||||
|         Option.__init__(self, label, value) | ||||
|  | ||||
|     def make_gui_obj(self, gtk, dialog): | ||||
|     def make_gui_obj(self, dialog): | ||||
|         """ | ||||
|         Add a "surname-colour" widget to the dialog. | ||||
|         """ | ||||
| @@ -897,9 +937,9 @@ class SurnameColourOption(Option): | ||||
|         self.surnames = {}  # list of surnames and count | ||||
|          | ||||
|         self.model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING) | ||||
|         self.treeView = gtk.TreeView(self.model) | ||||
|         self.treeView.set_size_request(150, 150) | ||||
|         self.treeView.connect('row-activated', self.clicked) | ||||
|         self.tree_view = gtk.TreeView(self.model) | ||||
|         self.tree_view.set_size_request(150, 150) | ||||
|         self.tree_view.connect('row-activated', self.row_clicked) | ||||
|         col1 = gtk.TreeViewColumn(_('Surname'), gtk.CellRendererText(), text=0) | ||||
|         col2 = gtk.TreeViewColumn(_('Colour'), gtk.CellRendererText(), text=1) | ||||
|         col1.set_resizable(True) | ||||
| @@ -907,20 +947,23 @@ class SurnameColourOption(Option): | ||||
|         col1.set_sort_column_id(0) | ||||
|         col1.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) | ||||
|         col2.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) | ||||
|         self.treeView.append_column(col1) | ||||
|         self.treeView.append_column(col2) | ||||
|         self.scrolledWindow = gtk.ScrolledWindow() | ||||
|         self.scrolledWindow.add(self.treeView) | ||||
|         self.scrolledWindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) | ||||
|         self.scrolledWindow.set_shadow_type(gtk.SHADOW_OUT) | ||||
|         self.tree_view.append_column(col1) | ||||
|         self.tree_view.append_column(col2) | ||||
|         self.scrolled_window = gtk.ScrolledWindow() | ||||
|         self.scrolled_window.add(self.tree_view) | ||||
|         self.scrolled_window.set_policy(gtk.POLICY_AUTOMATIC,  | ||||
|                                         gtk.POLICY_AUTOMATIC) | ||||
|         self.scrolled_window.set_shadow_type(gtk.SHADOW_OUT) | ||||
|         self.hbox = gtk.HBox() | ||||
|         self.hbox.pack_start(self.scrolledWindow, expand=True, fill=True) | ||||
|         self.hbox.pack_start(self.scrolled_window, expand=True, fill=True) | ||||
|  | ||||
|         self.addSurname = GrampsWidgets.SimpleButton(gtk.STOCK_ADD, self.addSurnameClicked) | ||||
|         self.delSurname = GrampsWidgets.SimpleButton(gtk.STOCK_REMOVE, self.delSurnameClicked) | ||||
|         self.add_surname = GrampsWidgets.SimpleButton(gtk.STOCK_ADD,  | ||||
|                                                      self.add_surname_clicked) | ||||
|         self.del_surname = GrampsWidgets.SimpleButton(gtk.STOCK_REMOVE,  | ||||
|                                                      self.del_surname_clicked) | ||||
|         self.vbbox = gtk.VButtonBox() | ||||
|         self.vbbox.add(self.addSurname) | ||||
|         self.vbbox.add(self.delSurname) | ||||
|         self.vbbox.add(self.add_surname) | ||||
|         self.vbbox.add(self.del_surname) | ||||
|         self.vbbox.set_layout(gtk.BUTTONBOX_SPREAD) | ||||
|         self.hbox.pack_end(self.vbbox, expand=False) | ||||
|  | ||||
| @@ -938,56 +981,69 @@ class SurnameColourOption(Option): | ||||
|         """ | ||||
|         Parse the object and return. | ||||
|         """ | ||||
|         surnameColours = '' | ||||
|         iter = self.model.get_iter_first() | ||||
|         while (iter): | ||||
|             surname = self.model.get_value(iter, 0) # .encode('iso-8859-1','xmlcharrefreplace') | ||||
|             colour = self.model.get_value(iter, 1) | ||||
|         surname_colours = '' | ||||
|         i = self.model.get_iter_first() | ||||
|         while (i): | ||||
|             surname = self.model.get_value(i, 0)  | ||||
|             #surname = surname.encode('iso-8859-1','xmlcharrefreplace') | ||||
|             colour = self.model.get_value(i, 1) | ||||
|             # tried to use a dictionary, and tried to save it as a tuple, | ||||
|             # but coulnd't get this to work right -- this is lame, but now | ||||
|             # the surnames and colours are saved as a plain text string | ||||
|             surnameColours += surname + ' ' + colour + ' ' | ||||
|             iter = self.model.iter_next(iter) | ||||
|         return surnameColours | ||||
|             surname_colours += surname + ' ' + colour + ' ' | ||||
|             i = self.model.iter_next(i) | ||||
|         return surname_colours | ||||
|  | ||||
|     def clicked(self, treeview, path, column): | ||||
|     def row_clicked(self, treeview, path, column): | ||||
|         """ | ||||
|         Handle the case of a row being clicked on. | ||||
|         """ | ||||
|         # get the surname and colour value for this family | ||||
|         iter = self.model.get_iter(path) | ||||
|         surname = self.model.get_value(iter, 0) | ||||
|         colour = gtk.gdk.color_parse(self.model.get_value(iter, 1)) | ||||
|         i = self.model.get_iter(path) | ||||
|         surname = self.model.get_value(i, 0) | ||||
|         colour = gtk.gdk.color_parse(self.model.get_value(i, 1)) | ||||
|  | ||||
|         colourDialog = gtk.ColorSelectionDialog('Select colour for %s' % surname) | ||||
|         colourDialog.colorsel.set_current_color(colour) | ||||
|         response = colourDialog.run() | ||||
|         title = 'Select colour for %s' % surname | ||||
|         colour_dialog = gtk.ColorSelectionDialog(title) | ||||
|         colorsel = colour_dialog.colorsel | ||||
|         colorsel.set_current_color(colour) | ||||
|         response = colour_dialog.run() | ||||
|  | ||||
|         if response == gtk.RESPONSE_OK: | ||||
|             colour = colourDialog.colorsel.get_current_color() | ||||
|             colourName = '#%02x%02x%02x' % ( | ||||
|             colour = colorsel.get_current_color() | ||||
|             colour_name = '#%02x%02x%02x' % ( | ||||
|                 int(colour.red  *256/65536), | ||||
|                 int(colour.green*256/65536), | ||||
|                 int(colour.blue *256/65536)) | ||||
|             self.model.set_value(iter, 1, colourName) | ||||
|             self.model.set_value(i, 1, colour_name) | ||||
|  | ||||
|         colourDialog.destroy() | ||||
|         colour_dialog.destroy() | ||||
|  | ||||
|     def addSurnameClicked(self, obj): | ||||
|         skipList = set() | ||||
|         iter = self.model.get_iter_first() | ||||
|         while (iter): | ||||
|             surname = self.model.get_value(iter, 0) | ||||
|             skipList.add(surname.encode('iso-8859-1','xmlcharrefreplace')) | ||||
|             iter = self.model.iter_next(iter) | ||||
|     def add_surname_clicked(self, obj): | ||||
|         """ | ||||
|         Handle the the add surname button. | ||||
|         """ | ||||
|         skip_list = set() | ||||
|         i = self.model.get_iter_first() | ||||
|         while (i): | ||||
|             surname = self.model.get_value(i, 0) | ||||
|             skip_list.add(surname.encode('iso-8859-1','xmlcharrefreplace')) | ||||
|             i = self.model.iter_next(i) | ||||
|  | ||||
|         ln = LastNameDialog(self.db, self.dialog.uistate, self.dialog.track, self.surnames, skipList) | ||||
|         surnameSet = ln.run() | ||||
|         for surname in surnameSet: | ||||
|         ln_dialog = LastNameDialog(self.__db, self.dialog.uistate,  | ||||
|                                    self.dialog.track, self.surnames, skip_list) | ||||
|         surname_set = ln_dialog.run() | ||||
|         for surname in surname_set: | ||||
|             self.model.append([surname, '#ffffff']) | ||||
|  | ||||
|     def delSurnameClicked(self, obj): | ||||
|         (path, column) = self.treeView.get_cursor() | ||||
|     def del_surname_clicked(self, obj): | ||||
|         """ | ||||
|         Handle the the delete surname button. | ||||
|         """ | ||||
|         (path, column) = self.tree_view.get_cursor() | ||||
|         if (path): | ||||
|             iter = self.model.get_iter(path) | ||||
|             self.model.remove(iter) | ||||
|             i = self.model.get_iter(path) | ||||
|             self.model.remove(i) | ||||
|  | ||||
| #------------------------------------------------------------------------- | ||||
| # | ||||
| @@ -1100,12 +1156,19 @@ class Menu: | ||||
| # | ||||
| #------------------------------------------------------------------------ | ||||
| class MenuOptions: | ||||
|     """ | ||||
|     Introduction | ||||
|     ============ | ||||
|     A MenuOptions is used to implement the necessary funtions for adding | ||||
|     options to a dialog. | ||||
|     """ | ||||
|     def __init__(self, dbstate): | ||||
|         self.menu = Menu() | ||||
|          | ||||
|         # Fill options_dict with report/tool defaults: | ||||
|         self.options_dict = {} | ||||
|         self.options_help = {} | ||||
|         self.tooltips = gtk.Tooltips() | ||||
|         self.add_menu_options(self.menu, dbstate) | ||||
|         for name in self.menu.get_all_option_names(): | ||||
|             option = self.menu.get_option_by_name(name) | ||||
| @@ -1113,6 +1176,9 @@ class MenuOptions: | ||||
|             self.options_help[name] = option.get_help() | ||||
|  | ||||
|     def make_default_style(self, default_style): | ||||
|         """ | ||||
|         This function is currently required by some reports. | ||||
|         """ | ||||
|         pass | ||||
|  | ||||
|     def add_menu_options(self, menu, dbstate): | ||||
| @@ -1126,6 +1192,9 @@ class MenuOptions: | ||||
|         raise NotImplementedError | ||||
|      | ||||
|     def add_menu_option(self, category, name, option): | ||||
|         """ | ||||
|         Add a single option to the menu. | ||||
|         """ | ||||
|         self.menu.add_option(category, name, option) | ||||
|         self.options_dict[name] = option.get_value() | ||||
|         self.options_help[name] = option.get_help() | ||||
| @@ -1134,15 +1203,13 @@ class MenuOptions: | ||||
|         """ | ||||
|         Generic method to add user options to the gui. | ||||
|         """ | ||||
|         import gtk | ||||
|         self.tooltips = gtk.Tooltips() | ||||
|         for category in self.menu.get_categories(): | ||||
|             for name in self.menu.get_option_names(category): | ||||
|                 option = self.menu.get_option(category, name) | ||||
|                 # override option default with xml-saved value: | ||||
|                 if name in self.options_dict: | ||||
|                     option.set_value(self.options_dict[name]) | ||||
|                 option.make_gui_obj(gtk, dialog) | ||||
|                 option.make_gui_obj(dialog) | ||||
|                 option.add_dialog_category(dialog, category) | ||||
|                 option.add_tooltip(self.tooltips) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user