split UI and DB state
svn: r5049
This commit is contained in:
		
							
								
								
									
										12
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								ChangeLog
									
									
									
									
									
								
							| @@ -1,3 +1,15 @@ | ||||
| 2005-08-10  Don Allingham  <don@gramps-project.org> | ||||
| 	* src/DbState.py: separate database class from display class | ||||
| 	* src/EditPerson.py: separate database class from display class | ||||
| 	* src/GrampsDbBase.py: separate database class from display class | ||||
| 	* src/PageView.py: separate database class from display class | ||||
| 	* src/PedView.py: separate database class from display class | ||||
| 	* src/PersonView.py: separate database class from display class | ||||
| 	* src/RelLib.py: separate database class from display class | ||||
| 	* src/ViewManager.py: separate database class from display class | ||||
| 	* src/gramps_main.py: separate database class from display class | ||||
| 	* src/Navigation.py: provides navigation ability for the history menu | ||||
| 	 | ||||
| 2005-08-10  Martin Hawlisch  <Martin.Hawlisch@gmx.de> | ||||
| 	* src/PedView.py: Better autoscaling; better ui management | ||||
|  | ||||
|   | ||||
| @@ -44,9 +44,15 @@ import GrampsDBCallback | ||||
| import GrampsKeys | ||||
| import NameDisplay | ||||
|  | ||||
| class History: | ||||
| class History(GrampsDBCallback.GrampsDBCallback): | ||||
|  | ||||
|     __signals__ = { | ||||
|         'changed'      : (list,), | ||||
|         'menu-changed' : (list,), | ||||
|         } | ||||
|  | ||||
|     def __init__(self): | ||||
|         GrampsDBCallback.GrampsDBCallback.__init__(self) | ||||
|         self.history = [] | ||||
|         self.mhistory = [] | ||||
|         self.index = -1 | ||||
| @@ -73,22 +79,33 @@ class History: | ||||
|         mhc = self.mhistory.count(del_id) | ||||
|         for c in range(mhc): | ||||
|             self.mhistory.remove(del_id) | ||||
|         self.emit('changed',(self.history,)) | ||||
|         self.emit('menu-changed',(self.mhistory,)) | ||||
|  | ||||
|     def push(self,person_handle): | ||||
|         self.prune() | ||||
|         if len(self.history) == 0 or person_handle != self.history[-1]: | ||||
|             self.history.append(person_handle) | ||||
|             self.mhistory.append(person_handle) | ||||
|             if person_handle not in self.mhistory: | ||||
|                 self.mhistory.append(person_handle) | ||||
|                 self.emit('menu-changed',(self.mhistory,)) | ||||
|             self.index += 1 | ||||
|         self.emit('changed',(self.history,)) | ||||
|  | ||||
|     def forward(self,step=1): | ||||
|         self.index += step | ||||
|         self.mhistory.append(self.history[self.index]) | ||||
|         person_handle = self.history[self.index] | ||||
|         if person_handle not in self.mhistory: | ||||
|             self.mhistory.append(person_handle) | ||||
|             self.emit('menu-changed',(self.mhistory,)) | ||||
|         return str(self.history[self.index]) | ||||
|  | ||||
|     def back(self,step=1): | ||||
|         self.index -= step | ||||
|         self.mhistory.append(self.history[self.index]) | ||||
|         person_handle = self.history[self.index] | ||||
|         if person_handle not in self.mhistory: | ||||
|             self.mhistory.append(person_handle) | ||||
|             self.emit('menu-changed',(self.mhistory,)) | ||||
|         return str(self.history[self.index]) | ||||
|  | ||||
|     def at_end(self): | ||||
| @@ -109,21 +126,10 @@ class DbState(GrampsDBCallback.GrampsDBCallback): | ||||
|         'no-database'      :  None, | ||||
|         } | ||||
|  | ||||
|     def __init__(self,window,status,uimanager): | ||||
|         self.uimanager = uimanager | ||||
|         self.window = window | ||||
|     def __init__(self): | ||||
|         GrampsDBCallback.GrampsDBCallback.__init__(self) | ||||
|         self.db     = GrampsDbBase.GrampsDbBase() | ||||
|         self.active = None | ||||
|         self.status = status | ||||
|         self.status_id = status.get_context_id('GRAMPS') | ||||
|         self.phistory = History() | ||||
|  | ||||
|     def get_widget(self,path): | ||||
|         return self.uimanager.get_widget(path) | ||||
|  | ||||
|     def clear_history(self): | ||||
|         self.phistory.clear() | ||||
|  | ||||
|     def change_active_person(self,person): | ||||
|         self.active = person | ||||
| @@ -147,15 +153,28 @@ class DbState(GrampsDBCallback.GrampsDBCallback): | ||||
|         self.db = GrampsDbBase.GrampsDbBase() | ||||
|         self.emit('no-database') | ||||
|  | ||||
|     def modify_statusbar(self): | ||||
| class DisplayState(GrampsDBCallback.GrampsDBCallback): | ||||
|  | ||||
|     __signals__ = { | ||||
|         } | ||||
|  | ||||
|     def __init__(self,window,status,uimanager,dbstate): | ||||
|         self.dbstate = dbstate | ||||
|         self.uimanager = uimanager | ||||
|         self.window = window | ||||
|         GrampsDBCallback.GrampsDBCallback.__init__(self) | ||||
|         self.status = status | ||||
|         self.status_id = status.get_context_id('GRAMPS') | ||||
|         self.phistory = History() | ||||
|  | ||||
|     def modify_statusbar(self,active=None): | ||||
|         self.status.pop(self.status_id) | ||||
|         if self.active == None: | ||||
|         if self.dbstate.active == None: | ||||
|             self.status.push(self.status_id,"") | ||||
|         else: | ||||
|             if GrampsKeys.get_statusbar() <= 1: | ||||
|                 pname = NameDisplay.displayer.display(self.active) | ||||
|                 name = "[%s] %s" % (self.active.get_gramps_id(),pname) | ||||
|                 pname = NameDisplay.displayer.display(self.dbstate.active) | ||||
|                 name = "[%s] %s" % (self.dbstate.active.get_gramps_id(),pname) | ||||
|             else: | ||||
|                 name = self.display_relationship() | ||||
|             self.status.push(self.status_id,name) | ||||
|   | ||||
| @@ -88,10 +88,11 @@ class EditPerson: | ||||
|  | ||||
|     use_patronymic = locale.getlocale(locale.LC_TIME)[0] in _use_patronymic | ||||
|      | ||||
|     def __init__(self,state,person,callback=None): | ||||
|     def __init__(self,state,uistate,person,callback=None): | ||||
|         """Creates an edit window.  Associates a person with the window.""" | ||||
|  | ||||
|         self.state = state | ||||
|         self.uistate = uistate | ||||
|         self.retval = const.UPDATE_PERSON | ||||
|          | ||||
|         self.dp = DateHandler.parser | ||||
| @@ -462,7 +463,7 @@ class EditPerson: | ||||
|         self.win_menu_item = gtk.MenuItem(win_menu_label) | ||||
|         self.win_menu_item.set_submenu(gtk.Menu()) | ||||
|         self.win_menu_item.show() | ||||
|         self.state.winsmenu.append(self.win_menu_item) | ||||
|         self.uistate.winsmenu.append(self.win_menu_item) | ||||
|         self.winsmenu = self.win_menu_item.get_submenu() | ||||
|         self.menu_item = gtk.MenuItem(_('Edit Person')) | ||||
|         self.menu_item.connect("activate",self.present) | ||||
|   | ||||
| @@ -312,26 +312,24 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): | ||||
|                 update_list.append((handle,obj.serialize())) | ||||
|             else: | ||||
|                 add_list.append((handle,obj.serialize())) | ||||
|  | ||||
|         # committing person, do gender stats here | ||||
|         if key == PERSON_KEY: | ||||
|             if old_data: | ||||
|                 old_person = Person(old_data) | ||||
|                 if (old_data[2] != person.gender or | ||||
|                     old_data[3].first_name != obj.primary_name.first_name): | ||||
|                     self.genderStats.uncount_person(old_person) | ||||
|                     self.genderStats.count_person(obj,self) | ||||
|             else: | ||||
|                 self.genderStats.count_person(obj,self) | ||||
|         return old_data | ||||
|  | ||||
|     def commit_person(self,person,transaction,change_time=None): | ||||
|         """ | ||||
|         Commits the specified Person to the database, storing the changes | ||||
|         as part of the transaction. | ||||
|         """ | ||||
|         self._commit_base(person, self.person_map, PERSON_KEY, | ||||
|                           transaction.person_update, transaction.person_add, | ||||
|                           transaction, change_time) | ||||
|         old_data = self._commit_base( | ||||
|             person, self.person_map, PERSON_KEY, transaction.person_update, | ||||
|             transaction.person_add, transaction, change_time) | ||||
|         if old_data: | ||||
|             old_person = Person(old_data) | ||||
|             if (old_data[2] != person.gender or | ||||
|                 old_data[3].first_name != person.primary_name.first_name): | ||||
|                 self.genderStats.uncount_person(old_person) | ||||
|                 self.genderStats.count_person(person,self) | ||||
|         else: | ||||
|             self.genderStats.count_person(person,self) | ||||
|            | ||||
|     def commit_media_object(self,obj,transaction,change_time=None): | ||||
|         """ | ||||
|   | ||||
							
								
								
									
										154
									
								
								src/Navigation.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								src/Navigation.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,154 @@ | ||||
| # | ||||
| # Gramps - a GTK+/GNOME based genealogy program | ||||
| # | ||||
| # Copyright (C) 2000-2005  Donald N. Allingham | ||||
| # | ||||
| # 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 | ||||
| # | ||||
|  | ||||
| _top = '<ui><menubar name="MenuBar"><menu action="GoMenu"><placeholder name="CommonHistory">' | ||||
| _btm = '</placeholder></menu></menubar></ui>' | ||||
|  | ||||
| import gtk | ||||
| import sys | ||||
| import NameDisplay | ||||
|  | ||||
| DISABLED = -1 | ||||
|  | ||||
| class BaseNavigation: | ||||
|     """ | ||||
|     Base history navigation class. Builds the action group and ui for the | ||||
|     uimanager. Changes to the associated history objects are tracked. When | ||||
|     the history changes, the UI XML string and the action groups are updated. | ||||
|  | ||||
|     Import variables: | ||||
|  | ||||
|     self.title - name used for Action group name and Actions | ||||
|     self.ui - XML string used to build menu items for UIManager | ||||
|     self.action_group - associate action group for selecting items | ||||
|     self.active - merge ID for the action group. DISABLED if not active | ||||
|     self.items - history handles associated with the menu | ||||
|     self.func - array of functions to take action based off of. | ||||
|      | ||||
|     """ | ||||
|     def __init__(self,uistate,history,title): | ||||
|         self.title = title | ||||
|         self.ui = _top+_btm | ||||
|         history.connect('menu-changed', self.update_menu) | ||||
|         self.action_group = gtk.ActionGroup(self.title) | ||||
|         self.active = DISABLED | ||||
|         self.uistate = uistate | ||||
|         self.items = [] | ||||
|          | ||||
|     def disable(self): | ||||
|         """ | ||||
|         Removes the UI and action groups if the navigation is enabled | ||||
|         """ | ||||
|         if self.active != DISABLED: | ||||
|             self.uistate.uimanager.remove_ui(self.active) | ||||
|             self.uistate.uimanager.remove_action_group(self.action_group) | ||||
|             self.active = DISABLED | ||||
|  | ||||
|     def enable(self): | ||||
|         """ | ||||
|         Enables the UI and action groups | ||||
|         """ | ||||
|         self.uistate.uimanager.insert_action_group(self.action_group, 1) | ||||
|         self.active = self.uistate.uimanager.add_ui_from_string(self.ui) | ||||
|  | ||||
|     def build_item_name(self,handle): | ||||
|         """ | ||||
|         Builds a string from the passed handle. Must be overridden by the | ||||
|         derrived class. | ||||
|         """ | ||||
|         return "ERROR" | ||||
|  | ||||
|     def update_menu(self,items): | ||||
|         """ | ||||
|         Builds the UI and action group.  | ||||
|         """ | ||||
|         self.items = items | ||||
|         self.disable() | ||||
|  | ||||
|         data = map(lambda x: '<menuitem action="%s%02d"/>' % (self.title,x), range(0,len(items))) | ||||
|         self.ui = _top + "".join(data) + _btm | ||||
|  | ||||
|         self.action_group = gtk.ActionGroup(self.title) | ||||
|  | ||||
|         data = [] | ||||
|         index = 0 | ||||
|         for item in items: | ||||
|             name = self.build_item_name(item) | ||||
|             f = self.func[index] | ||||
|             data.append(('%s%02d'%(self.title,index), None, name, "<alt>%d" % index, None, f)) | ||||
|             index +=1 | ||||
|         self.action_group.add_actions(data) | ||||
|              | ||||
|         if self.active != DISABLED: | ||||
|             self.enable() | ||||
|  | ||||
|          | ||||
| class PersonNavigation(BaseNavigation): | ||||
|     """ | ||||
|     Builds a navigation item for the Person class. | ||||
|     """ | ||||
|     def __init__(self,uistate): | ||||
|         """ | ||||
|         Associates the functions with the associated items. Builds the function | ||||
|         array so that there are unique functions for each possible index (0-9) | ||||
|         The callback simply calls change_active_handle | ||||
|         """ | ||||
|         BaseNavigation.__init__(self,uistate,uistate.phistory,'PersonHistory') | ||||
|         self.func = [ self.f0, self.f1, self.f2, self.f3, self.f4, | ||||
|                       self.f5, self.f6, self.f7, self.f8, self.f9 ] | ||||
|  | ||||
|     def build_item_name(self, item): | ||||
|         """ | ||||
|         Builds a name in the format of 'NAME [GRAMPSID]' | ||||
|         """ | ||||
|         person = self.uistate.dbstate.db.get_person_from_handle(item) | ||||
|         name = "%s [%s]" % (NameDisplay.displayer.display(person), | ||||
|                             person.gramps_id) | ||||
|  | ||||
|     def f0(self,obj): | ||||
|         self.uistate.dbstate.change_active_handle(self.items[0]) | ||||
|  | ||||
|     def f1(self,obj): | ||||
|         self.uistate.dbstate.change_active_handle(self.items[1]) | ||||
|  | ||||
|     def f2(self,obj): | ||||
|         self.uistate.dbstate.change_active_handle(self.items[2]) | ||||
|  | ||||
|     def f3(self,obj): | ||||
|         self.uistate.dbstate.change_active_handle(self.items[3]) | ||||
|  | ||||
|     def f4(self,obj): | ||||
|         self.uistate.dbstate.change_active_handle(self.items[4]) | ||||
|  | ||||
|     def f5(self,obj): | ||||
|         self.uistate.dbstate.change_active_handle(self.items[5]) | ||||
|  | ||||
|     def f6(self,obj): | ||||
|         self.uistate.dbstate.change_active_handle(self.items[6]) | ||||
|  | ||||
|     def f7(self,obj): | ||||
|         self.uistate.dbstate.change_active_handle(self.items[7]) | ||||
|  | ||||
|     def f8(self,obj): | ||||
|         self.uistate.dbstate.change_active_handle(self.items[8]) | ||||
|  | ||||
|     def f9(self,obj): | ||||
|         self.uistate.dbstate.change_active_handle(self.items[9]) | ||||
|          | ||||
| @@ -22,19 +22,34 @@ | ||||
|  | ||||
| import gtk | ||||
|  | ||||
| NAVIGATION_NONE   = -1 | ||||
| NAVIGATION_PERSON = 0 | ||||
|  | ||||
|  | ||||
| class PageView: | ||||
|      | ||||
|     def __init__(self,title,state): | ||||
|     def __init__(self,title,dbstate,uistate): | ||||
|         self.title = title | ||||
|         self.state = state | ||||
|         self.dbstate = dbstate | ||||
|         self.uistate = uistate | ||||
|         self.action_list = [] | ||||
|         self.action_toggle_list = [] | ||||
|         self.action_group = None | ||||
|         self.additional_action_groups = [] | ||||
|         self.additional_uis = [] | ||||
|         self.widget = None | ||||
|         self.ui = "" | ||||
|         self.state.connect('no-database',self.disable_action_group) | ||||
|         self.state.connect('database-changed',self.enable_action_group) | ||||
|         self.ui = '<ui></ui>' | ||||
|         self.dbstate.connect('no-database',self.disable_action_group) | ||||
|         self.dbstate.connect('database-changed',self.enable_action_group) | ||||
|  | ||||
|     def navigation_type(self): | ||||
|         return NAVIGATION_NONE | ||||
|      | ||||
|     def ui_definition(self): | ||||
|         return self.ui | ||||
|  | ||||
|     def additional_ui_definitions(self): | ||||
|         return self.additional_uis | ||||
|  | ||||
|     def disable_action_group(self): | ||||
|         if self.action_group: | ||||
| @@ -50,9 +65,6 @@ class PageView: | ||||
|         except AttributeError: | ||||
|             return gtk.STOCK_MISSING_IMAGE | ||||
|          | ||||
|     def get_ui(self): | ||||
|         return self.ui | ||||
|  | ||||
|     def get_title(self): | ||||
|         return self.title | ||||
|  | ||||
| @@ -88,3 +100,5 @@ class PageView: | ||||
|  | ||||
|     def add_action_group(self,group): | ||||
|         self.additional_action_groups.append(group) | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										110
									
								
								src/PedView.py
									
									
									
									
									
								
							
							
						
						
									
										110
									
								
								src/PedView.py
									
									
									
									
									
								
							| @@ -41,10 +41,12 @@ import gtk.gdk | ||||
| # Gramps Modules | ||||
| # | ||||
| #------------------------------------------------------------------------- | ||||
| import RelLib | ||||
| import PageView | ||||
| import EditPerson | ||||
| import const | ||||
| import GrampsCfg | ||||
| import Relationship | ||||
| import NameDisplay | ||||
| import RelLib | ||||
| import Utils | ||||
| import DateHandler | ||||
|  | ||||
| @@ -53,6 +55,8 @@ import DateHandler | ||||
| # Constants | ||||
| # | ||||
| #------------------------------------------------------------------------- | ||||
| _PAD       = 3 | ||||
| _CANVASPAD = 3 | ||||
| _PERSON    = "p" | ||||
| _BORN = _('b.') | ||||
| _DIED = _('d.') | ||||
| @@ -69,17 +73,19 @@ _CREM = _('crem.') | ||||
| #------------------------------------------------------------------------- | ||||
| class PedView(PageView.PageView): | ||||
|  | ||||
|     def __init__(self,state): | ||||
|         PageView.PageView.__init__(self,'Pedigree View',state) | ||||
|     def __init__(self,dbstate,uistate): | ||||
|         PageView.PageView.__init__(self,'Pedigree View',dbstate,uistate) | ||||
|         self.inactive = False | ||||
|         state.connect('database-changed',self.change_db) | ||||
|         state.connect('active-changed',self.goto_active_person) | ||||
|         dbstate.connect('database-changed',self.change_db) | ||||
|         dbstate.connect('active-changed',self.goto_active_person) | ||||
|         self.force_size = 0 # Automatic resize | ||||
|  | ||||
|     def navigation_type(self): | ||||
|         return PageView.NAVIGATION_PERSON | ||||
|  | ||||
|     def build_widget(self): | ||||
|         self.notebook = gtk.Notebook() | ||||
|         self.notebook.connect("button-press-event", self.on_show_option_menu_cb) | ||||
|         self.bootstrap_handler = self.notebook.connect("expose-event", self.init_parent_signals_cb) | ||||
|         self.notebook.set_show_border(False) | ||||
|         self.notebook.set_show_tabs(False) | ||||
|              | ||||
| @@ -99,16 +105,10 @@ class PedView(PageView.PageView): | ||||
|         self.table_5.connect("button-press-event", self.on_show_option_menu_cb) | ||||
|         self.add_table_to_notebook( self.table_5) | ||||
|  | ||||
|         self.rebuild_trees(None) | ||||
|         #self.parent_container.connect("size-allocate", self.size_request_cb) | ||||
|  | ||||
|         return self.notebook | ||||
|  | ||||
|     def init_parent_signals_cb(self, widget, event): | ||||
|         print "PedView.init_parent_signals_cb" | ||||
|         self.notebook.disconnect(self.bootstrap_handler) | ||||
|         self.notebook.parent.connect("size-allocate", self.size_request_cb) | ||||
|         self.size_request_cb(widget.parent,event) | ||||
|          | ||||
|     def add_table_to_notebook( self, table): | ||||
|         frame = gtk.ScrolledWindow(None,None) | ||||
|         frame.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC) | ||||
| @@ -123,49 +123,10 @@ class PedView(PageView.PageView): | ||||
|         #self.add_action('Add',    gtk.STOCK_ADD,       "_Add",     callback=self.add) | ||||
|         #self.add_action('Edit',   gtk.STOCK_EDIT,      "_Edit",    callback=self.edit) | ||||
|         #self.add_action('Remove', gtk.STOCK_REMOVE,    "_Remove",  callback=self.remove) | ||||
|         self.add_action('Forward',gtk.STOCK_GO_FORWARD,"_Forward", callback=self.home)#callback=self.fwd_clicked) | ||||
|         self.add_action('Back',   gtk.STOCK_GO_BACK,   "_Back",    callback=self.home)#callback=self.back_clicked) | ||||
|         #self.add_action('Forward',gtk.STOCK_GO_FORWARD,"_Forward", callback=self.fwd_clicked) | ||||
|         #self.add_action('Back',   gtk.STOCK_GO_BACK,   "_Back",    callback=self.back_clicked) | ||||
|         self.add_action('HomePerson', gtk.STOCK_HOME,  "_Home",    callback=self.home) | ||||
|         #self.add_toggle_action('Filter',  None,        '_Filter',  callback=self.filter_toggle) | ||||
|         # add the Forward action group to handle the Forward button | ||||
|         self.fwd_action = gtk.ActionGroup(self.title + '/Forward') | ||||
|         self.fwd_action.add_actions([ | ||||
|             ('Forward',gtk.STOCK_GO_FORWARD,"_Forward", None, None, self.home)#callback=self.fwd_clicked) | ||||
|             ]) | ||||
|  | ||||
|         # add the Backward action group to handle the Forward button | ||||
|         self.back_action = gtk.ActionGroup(self.title + '/Backward') | ||||
|         self.back_action.add_actions([ | ||||
|             ('Back',gtk.STOCK_GO_BACK,"_Back", None, None, self.home)#callback=self.back_clicked) | ||||
|             ]) | ||||
|  | ||||
|         self.add_action_group(self.back_action) | ||||
|         self.add_action_group(self.fwd_action) | ||||
|  | ||||
|     def disable_action_group(self): | ||||
|         """ | ||||
|         Normally, this would not be overridden from the base class. However, | ||||
|         in this case, we have additional action groups that need to be | ||||
|         handled correctly. | ||||
|         """ | ||||
|         PageView.PageView.disable_action_group(self) | ||||
|          | ||||
|         self.fwd_action.set_visible(False) | ||||
|         self.back_action.set_visible(False) | ||||
|  | ||||
|     def enable_action_group(self,obj): | ||||
|         """ | ||||
|         Normally, this would not be overridden from the base class. However, | ||||
|         in this case, we have additional action groups that need to be | ||||
|         handled correctly. | ||||
|         """ | ||||
|         PageView.PageView.enable_action_group(self,obj) | ||||
|          | ||||
|         self.fwd_action.set_visible(True) | ||||
|         self.back_action.set_visible(True) | ||||
|         hobj = self.state.phistory | ||||
|         self.fwd_action.set_sensitive(not hobj.at_end()) | ||||
|         self.back_action.set_sensitive(not hobj.at_front()) | ||||
|  | ||||
|     def ui_definition(self): | ||||
|         return '''<ui> | ||||
| @@ -178,8 +139,6 @@ class PedView(PageView.PageView): | ||||
|           </menubar> | ||||
|           <toolbar name="ToolBar"> | ||||
|             <placeholder name="CommonNavigation"> | ||||
|               <toolitem action="Back"/>   | ||||
|               <toolitem action="Forward"/>   | ||||
|               <toolitem action="HomePerson"/> | ||||
|             </placeholder> | ||||
|           </toolbar> | ||||
| @@ -195,32 +154,26 @@ class PedView(PageView.PageView): | ||||
|         db.connect('person-update', self.person_updated_cb) | ||||
|         db.connect('person-delete', self.person_updated_cb) | ||||
|         db.connect('person-rebuild', self.person_rebuild) | ||||
|         self.rebuild_trees(None) | ||||
|         self.active_person = None | ||||
|  | ||||
|     def person_updated_cb(self,handle_list): | ||||
|         print "PedView.person_updated_cb" | ||||
|         self.rebuild_trees(self.state.active) | ||||
|         self.rebuild_trees(self.active_person) | ||||
|  | ||||
|     def person_rebuild(self): | ||||
|         print "PedView.person_rebuild" | ||||
|         self.rebuild_trees(self.state.active) | ||||
|  | ||||
|     def person_edited_cb(self, p1=None, p2=None): | ||||
|         print "PedView.person_edited_cb" | ||||
|         self.rebuild_trees(self.active_person) | ||||
|  | ||||
|     def goto_active_person(self,handle): | ||||
|         print "PedView.goto_active_person" | ||||
|         if handle: | ||||
|             self.rebuild_trees(self.db.get_person_from_handle(handle)) | ||||
|             self.active_person = self.db.get_person_from_handle(handle) | ||||
|             self.rebuild_trees(self.active_person) | ||||
|         else: | ||||
|             self.rebuild_trees(None) | ||||
|      | ||||
|     def request_resize(self): | ||||
|         print "PedView.request_resize" | ||||
|         self.size_request_cb(self.notebook.parent,None,None) | ||||
|          | ||||
|     def size_request_cb(self, widget, event, data=None): | ||||
|         print "PedView.size_request_cb" | ||||
|         if self.force_size == 0: | ||||
|             v = widget.get_allocation() | ||||
|             page_list = range(0,self.notebook.get_n_pages()) | ||||
| @@ -295,14 +248,13 @@ class PedView(PageView.PageView): | ||||
|         self.rebuild( self.table_4, pos_4, person) | ||||
|         self.rebuild( self.table_5, pos_5, person) | ||||
|          | ||||
|         #gobject.idle_add(self.request_resize) | ||||
|  | ||||
|         gobject.idle_add(self.request_resize) | ||||
|  | ||||
|     def rebuild( self, table_widget, positions, active_person): | ||||
|         print "PedView.rebuild" | ||||
|         # Build ancestor tree | ||||
|         lst = [None]*31 | ||||
|         self.find_tree(active_person,0,1,lst) | ||||
|         self.find_tree(self.active_person,0,1,lst) | ||||
|  | ||||
|         # Purge current table content | ||||
|         for child in table_widget.get_children(): | ||||
| @@ -429,17 +381,17 @@ class PedView(PageView.PageView): | ||||
|      | ||||
|     def home(self,obj): | ||||
|         print "PedView.home" | ||||
|         defperson = self.state.db.get_default_person() | ||||
|         defperson = self.dbstate.db.get_default_person() | ||||
|         if defperson: | ||||
|             self.state.change_active_person(defperson) | ||||
|             self.dbstate.change_active_person(defperson) | ||||
|  | ||||
|     def edit_person_cb(self,obj): | ||||
|         person_handle = obj.get_data(_PERSON) | ||||
|         person = self.db.get_person_from_handle(person_handle) | ||||
|         if person: | ||||
|             EditPerson.EditPerson(self.state, person, self.person_edited_cb) | ||||
|             self.edit_person(person) | ||||
|             return True | ||||
|         return False | ||||
|         return 0 | ||||
|  | ||||
|     def on_show_option_menu_cb(self,obj,data=None): | ||||
|         myMenu = gtk.Menu() | ||||
| @@ -450,16 +402,16 @@ class PedView(PageView.PageView): | ||||
|     def on_show_child_menu(self,obj): | ||||
|         """User clicked button to move to child of active person""" | ||||
|  | ||||
|         if self.state.active: | ||||
|         if self.active_person: | ||||
|             # Build and display the menu attached to the left pointing arrow | ||||
|             # button. The menu consists of the children of the current root | ||||
|             # person of the tree. Attach a child to each menu item. | ||||
|  | ||||
|             childlist = find_children(self.db,self.state.active) | ||||
|             childlist = find_children(self.db,self.active_person) | ||||
|             if len(childlist) == 1: | ||||
|                 child = self.db.get_person_from_handle(childlist[0]) | ||||
|                 if child: | ||||
|                     self.state.change_active_person(child) | ||||
|                     self.parent.change_active_person(child) | ||||
|             elif len(childlist) > 1: | ||||
|                 myMenu = gtk.Menu() | ||||
|                 for child_handle in childlist: | ||||
| @@ -488,7 +440,7 @@ class PedView(PageView.PageView): | ||||
|  | ||||
|         person_handle = obj.get_data(_PERSON) | ||||
|         if person_handle: | ||||
|             self.state.change_active_handle(person_handle) | ||||
|             self.dbstate.change_active_handle(person_handle) | ||||
|             return True | ||||
|         return False | ||||
|      | ||||
|   | ||||
| @@ -42,6 +42,7 @@ from gtk.gdk import ACTION_COPY, BUTTON1_MASK | ||||
| # GRAMPS modules | ||||
| # | ||||
| #------------------------------------------------------------------------- | ||||
| import RelLib | ||||
| import PeopleModel | ||||
| import PageView | ||||
| import GenericFilter | ||||
| @@ -68,38 +69,90 @@ column_names = [ | ||||
|  | ||||
| class PersonView(PageView.PageView): | ||||
|  | ||||
|     def __init__(self,state): | ||||
|         PageView.PageView.__init__(self,'Person View',state) | ||||
|     def __init__(self,dbstate,uistate): | ||||
|         PageView.PageView.__init__(self,'Person View',dbstate,uistate) | ||||
|         self.inactive = False | ||||
|         state.connect('database-changed',self.change_db) | ||||
|         state.connect('active-changed',self.goto_active_person) | ||||
|         dbstate.connect('database-changed',self.change_db) | ||||
|         dbstate.connect('active-changed',self.goto_active_person) | ||||
|  | ||||
|     def setup_filter(self): | ||||
|         all = GenericFilter.GenericFilter() | ||||
|         all.set_name(_("Entire Database")) | ||||
|         all.add_rule(GenericFilter.Everyone([])) | ||||
|  | ||||
|         self.DataFilter = None | ||||
|         self.init_filters() | ||||
|     def navigation_type(self): | ||||
|         return PageView.NAVIGATION_PERSON | ||||
|  | ||||
|     def define_actions(self): | ||||
|         self.add_action('Add',    gtk.STOCK_ADD,       "_Add",     callback=self.add) | ||||
|         self.add_action('Edit',   gtk.STOCK_EDIT,      "_Edit",    callback=self.edit) | ||||
|         self.add_action('Remove', gtk.STOCK_REMOVE,    "_Remove",  callback=self.remove) | ||||
|         self.add_action('Forward',gtk.STOCK_GO_FORWARD,"_Forward", callback=self.fwd_clicked) | ||||
|         self.add_action('Back',   gtk.STOCK_GO_BACK,   "_Back",    callback=self.back_clicked) | ||||
|         self.add_action('HomePerson', gtk.STOCK_HOME,  "_Home",    callback=self.home) | ||||
|         self.add_toggle_action('Filter',  None,        '_Filter',  callback=self.filter_toggle) | ||||
|         """ | ||||
|         Required define_actions function for PageView. Builds the action | ||||
|         group information required. We extend beyond the normal here, | ||||
|         since we want to have more than one action group for the PersonView. | ||||
|         Most PageViews really won't care about this. | ||||
|  | ||||
|         Special action groups for Forward and Back are created to allow the | ||||
|         handling of navigation buttons. Forward and Back allow the user to | ||||
|         advance or retreat throughout the history, and we want to have these | ||||
|         be able to toggle these when you are at the end of the history or | ||||
|         at the beginning of the history. | ||||
|         """ | ||||
|  | ||||
|         self.add_action('Add',       gtk.STOCK_ADD,   "_Add",   callback=self.add) | ||||
|         self.add_action('Edit',      gtk.STOCK_EDIT,  "_Edit",  callback=self.edit) | ||||
|         self.add_action('Remove',    gtk.STOCK_REMOVE,"_Remove",callback=self.remove) | ||||
|         self.add_action('HomePerson',gtk.STOCK_HOME,  "_Home",  callback=self.home) | ||||
|          | ||||
|         self.add_toggle_action('Filter', None, '_Filter', callback=self.filter_toggle) | ||||
|  | ||||
|         # add the Forward action group to handle the Forward button | ||||
|         self.fwd_action = gtk.ActionGroup(self.title + '/Forward') | ||||
|         self.fwd_action.add_actions([ | ||||
|             ('Forward',gtk.STOCK_GO_FORWARD,"_Forward", None, None, self.fwd_clicked) | ||||
|             ]) | ||||
|  | ||||
|         # add the Backward action group to handle the Forward button | ||||
|         self.back_action = gtk.ActionGroup(self.title + '/Backward') | ||||
|         self.back_action.add_actions([ | ||||
|             ('Back',gtk.STOCK_GO_BACK,"_Back", None, None, self.back_clicked) | ||||
|             ]) | ||||
|  | ||||
|         self.add_action_group(self.back_action) | ||||
|         self.add_action_group(self.fwd_action) | ||||
|  | ||||
|     def disable_action_group(self): | ||||
|         """ | ||||
|         Normally, this would not be overridden from the base class. However, | ||||
|         in this case, we have additional action groups that need to be | ||||
|         handled correctly. | ||||
|         """ | ||||
|         PageView.PageView.disable_action_group(self) | ||||
|          | ||||
|         self.fwd_action.set_visible(False) | ||||
|         self.back_action.set_visible(False) | ||||
|  | ||||
|     def enable_action_group(self,obj): | ||||
|         """ | ||||
|         Normally, this would not be overridden from the base class. However, | ||||
|         in this case, we have additional action groups that need to be | ||||
|         handled correctly. | ||||
|         """ | ||||
|         PageView.PageView.enable_action_group(self,obj) | ||||
|          | ||||
|         self.fwd_action.set_visible(True) | ||||
|         self.back_action.set_visible(True) | ||||
|         hobj = self.uistate.phistory | ||||
|         self.fwd_action.set_sensitive(not hobj.at_end()) | ||||
|         self.back_action.set_sensitive(not hobj.at_front()) | ||||
|  | ||||
|     def get_stock(self): | ||||
|         """ | ||||
|         Returns the name of the stock icon to use for the display. | ||||
|         This assumes that this icon has already been registered with | ||||
|         GNOME as a stock icon. | ||||
|         """ | ||||
|         return 'gramps-person' | ||||
|  | ||||
|     def build_tree(self): | ||||
|         self.person_model = PeopleModel.PeopleModel( | ||||
|             self.state.db, self.DataFilter, self.filter_invert.get_active()) | ||||
|         self.person_tree.set_model(self.person_model) | ||||
|  | ||||
|     def build_widget(self): | ||||
|         """ | ||||
|         Builds the interface and returns a gtk.Container type that | ||||
|         contains the interface. This containter will be inserted into | ||||
|         a gtk.Notebook page. | ||||
|         """ | ||||
|         self.vbox = gtk.VBox() | ||||
|         self.vbox.set_border_width(4) | ||||
|         self.vbox.set_spacing(4) | ||||
| @@ -133,8 +186,6 @@ class PersonView(PageView.PageView): | ||||
|         self.vbox.pack_start(self.filterbar,False) | ||||
|         self.vbox.pack_start(scrollwindow,True) | ||||
|  | ||||
|         # temporary hack | ||||
|  | ||||
|         self.renderer = gtk.CellRendererText() | ||||
|         self.inactive = False | ||||
|  | ||||
| @@ -153,14 +204,14 @@ class PersonView(PageView.PageView): | ||||
|         self.vbox.set_focus_chain([self.person_tree,self.filter_list, self.filter_text, | ||||
|                                    self.filter_invert, self.filter_button]) | ||||
|  | ||||
|         a = gtk.ListStore(str,str) | ||||
|         self.person_tree.set_model(a) | ||||
|  | ||||
|         self.setup_filter() | ||||
|  | ||||
|         return self.vbox | ||||
|      | ||||
|     def ui_definition(self): | ||||
|         """ | ||||
|         Specifies the UIManager XML code that defines the menus and buttons | ||||
|         associated with the interface. | ||||
|         """ | ||||
|         return '''<ui> | ||||
|           <menubar name="MenuBar"> | ||||
|             <menu action="ViewMenu"> | ||||
| @@ -197,175 +248,54 @@ class PersonView(PageView.PageView): | ||||
|           </toolbar> | ||||
|         </ui>''' | ||||
|  | ||||
|     def filter_toggle(self,obj): | ||||
|         if obj.get_active(): | ||||
|             self.filterbar.show() | ||||
|         else: | ||||
|             self.filterbar.hide() | ||||
|  | ||||
|     def add(self,obj): | ||||
|         person = RelLib.Person() | ||||
|         EditPerson.EditPerson(self, person, self.state.db, | ||||
|                               None) | ||||
|  | ||||
|     def edit(self,obj): | ||||
|         EditPerson.EditPerson(self, self.state.active, self.state.db, | ||||
|                               None) | ||||
|  | ||||
|     def remove(self,obj): | ||||
|         mlist = self.get_selected_objects() | ||||
|         if len(mlist) == 0: | ||||
|             return | ||||
|          | ||||
|         for sel in mlist: | ||||
|             p = self.state.db.get_person_from_handle(sel) | ||||
|             self.active_person = p | ||||
|             name = NameDisplay.displayer.display(p)  | ||||
|  | ||||
|             msg = _('Deleting the person will remove the person ' | ||||
|                              'from the database.') | ||||
|             msg = "%s %s" % (msg,Utils.data_recover_msg) | ||||
|             QuestionDialog.QuestionDialog(_('Delete %s?') % name,msg, | ||||
|                                           _('_Delete Person'), | ||||
|                                           self.delete_person_response) | ||||
|  | ||||
|     def delete_person_response(self): | ||||
|         #self.disable_interface() | ||||
|         trans = self.state.db.transaction_begin() | ||||
|          | ||||
|         n = NameDisplay.displayer.display(self.active_person) | ||||
|  | ||||
|         if self.state.db.get_default_person() == self.active_person: | ||||
|             self.state.db.set_default_person_handle(None) | ||||
|  | ||||
|         for family_handle in self.active_person.get_family_handle_list(): | ||||
|             if not family_handle: | ||||
|                 continue | ||||
|             family = self.state.db.get_family_from_handle(family_handle) | ||||
|             family_to_remove = False | ||||
|             if self.active_person.get_handle() == family.get_father_handle(): | ||||
|                 if family.get_mother_handle(): | ||||
|                     family.set_father_handle(None) | ||||
|                 else: | ||||
|                     family_to_remove = True | ||||
|             else: | ||||
|                 if family.get_father_handle(): | ||||
|                     family.set_mother_handle(None) | ||||
|                 else: | ||||
|                     family_to_remove = True | ||||
|             if family_to_remove: | ||||
|                 for child_handle in family.get_child_handle_list(): | ||||
|                     child = self.state.db.get_person_from_handle(child_handle) | ||||
|                     child.remove_parent_family_handle(family_handle) | ||||
|                     self.db.commit_person(child,trans) | ||||
|                 self.state.db.remove_family(family_handle,trans) | ||||
|             else: | ||||
|                 self.state.db.commit_family(family,trans) | ||||
|  | ||||
|         for (family_handle,mrel,frel) in self.active_person.get_parent_family_handle_list(): | ||||
|             if family_handle: | ||||
|                 family = self.db.get_family_from_handle(family_handle) | ||||
|                 family.remove_child_handle(self.active_person.get_handle()) | ||||
|                 self.db.commit_family(family,trans) | ||||
|  | ||||
|         handle = self.active_person.get_handle() | ||||
|  | ||||
|         person = self.active_person | ||||
|         self.remove_from_person_list(person) | ||||
|         self.people_view.remove_from_history(handle) | ||||
|         self.state.db.remove_person(handle, trans) | ||||
|  | ||||
|         if self.state.phistory.index >= 0: | ||||
|             self.active_person = self.state.db.get_person_from_handle(self.state.phistory.history[self.index]) | ||||
|         else: | ||||
|             self.state.change_active_person(None) | ||||
|         self.state.db.transaction_commit(trans,_("Delete Person (%s)") % n) | ||||
|         #self.redraw_histmenu() | ||||
|         #self.enable_interface() | ||||
|  | ||||
|     def build_columns(self): | ||||
|         for column in self.columns: | ||||
|             self.person_tree.remove_column(column) | ||||
|              | ||||
|         column = gtk.TreeViewColumn(_('Name'), self.renderer,text=0) | ||||
|         column.set_resizable(True) | ||||
|         #column.set_clickable(True) | ||||
|         #column.connect('clicked',self.sort_clicked) | ||||
|         column.set_min_width(225) | ||||
|         column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) | ||||
|         self.person_tree.append_column(column) | ||||
|         self.columns = [column] | ||||
|  | ||||
|         for pair in self.state.db.get_person_column_order(): | ||||
|             if not pair[0]: | ||||
|                 continue | ||||
|             name = column_names[pair[1]] | ||||
|             column = gtk.TreeViewColumn(name, self.renderer, markup=pair[1]) | ||||
|             column.set_resizable(True) | ||||
|             column.set_min_width(60) | ||||
|             column.set_sizing(gtk.TREE_VIEW_COLUMN_GROW_ONLY) | ||||
|             self.columns.append(column) | ||||
|             self.person_tree.append_column(column) | ||||
|  | ||||
|     def row_changed(self,obj): | ||||
|         """Called with a row is changed. Check the selected objects from | ||||
|         the person_tree to get the IDs of the selected objects. Set the | ||||
|         active person to the first person in the list. If no one is | ||||
|         selected, set the active person to None""" | ||||
|  | ||||
|         selected_ids = self.get_selected_objects() | ||||
|         try: | ||||
|             person = self.state.db.get_person_from_handle(selected_ids[0]) | ||||
|             self.state.change_active_person(person) | ||||
|             self.goto_active_person() | ||||
|         except: | ||||
|             self.state.change_active_person(None) | ||||
|  | ||||
|         if len(selected_ids) == 1: | ||||
|             self.person_tree.drag_source_set(BUTTON1_MASK, | ||||
|                                              [DdTargets.PERSON_LINK.target()], | ||||
|                                              ACTION_COPY) | ||||
|         elif len(selected_ids) > 1: | ||||
|             self.person_tree.drag_source_set(BUTTON1_MASK, | ||||
|                                              [DdTargets.PERSON_LINK_LIST.target()], | ||||
|                                              ACTION_COPY) | ||||
|         self.state.modify_statusbar() | ||||
|          | ||||
|     def alpha_event(self,*obj): | ||||
|         pass | ||||
|         #self.parent.load_person(self.parent.active_person) | ||||
|  | ||||
|     def on_plist_button_press(self,obj,event): | ||||
|         if event.type == gtk.gdk.BUTTON_PRESS and event.button == 3: | ||||
|             self.build_people_context_menu(event) | ||||
|  | ||||
|     def person_drag_data_get(self, widget, context, sel_data, info, time): | ||||
|         selected_ids = self.get_selected_objects() | ||||
|  | ||||
|         if len(selected_ids) == 1: | ||||
|             sel_data.set(sel_data.target, 8, selected_ids[0]) | ||||
|         elif len(selected_ids) > 1: | ||||
|             sel_data.set(DdTargets.PERSON_LINK_LIST.drag_type,8, | ||||
|                          pickle.dumps(selected_ids)) | ||||
|  | ||||
|     def apply_filter_clicked(self): | ||||
|         index = self.filter_list.get_active() | ||||
|         self.DataFilter = self.filter_model.get_filter(index) | ||||
|         if self.DataFilter.need_param: | ||||
|             qual = unicode(self.filter_text.get_text()) | ||||
|             self.DataFilter.set_parameter(qual) | ||||
|     def change_db(self,db): | ||||
|         """ | ||||
|         Callback associated with DbState. Whenenver the database | ||||
|         changes, this task is called. In this case, we rebuild the | ||||
|         columns, and connect signals to the connected database. Tere | ||||
|         is no need to store the database, since we will get the value | ||||
|         from self.state.db | ||||
|         """ | ||||
|         self.build_columns() | ||||
|         db.connect('person-add', self.person_added) | ||||
|         db.connect('person-update', self.person_updated) | ||||
|         db.connect('person-delete', self.person_removed) | ||||
|         db.connect('person-rebuild', self.build_tree) | ||||
|         self.apply_filter() | ||||
|         self.goto_active_person() | ||||
|  | ||||
|     def goto_active_person(self,obj=None): | ||||
|         if not self.state.active or self.inactive: | ||||
|         """ | ||||
|         Callback (and usable function) that selects the active person | ||||
|         in the display tree. | ||||
|  | ||||
|         We have a bit of a problem due to the nature of how GTK works. | ||||
|         We have unselect the previous path and select the new path. However, | ||||
|         these cause a row change, which calls the row_change callback, which | ||||
|         can end up calling change_active_person, which can call | ||||
|         goto_active_person, causing a bit of recusion. Confusing, huh? | ||||
|  | ||||
|         Unforunately, we row_change has to be able to call change_active_person, | ||||
|         because the can occur from the interface in addition to programatically. | ||||
|  | ||||
|         TO handle this, we set the self.inactive variable that we can check | ||||
|         in row_change to look for this particular condition. | ||||
|         """ | ||||
|  | ||||
|         # if there is no active person, or if we have been marked inactive, | ||||
|         # simply return | ||||
|  | ||||
|         if not self.dbstate.active or self.inactive: | ||||
|             return | ||||
|  | ||||
|         # mark inactive to prevent recusion | ||||
|         self.inactive = True | ||||
|         p = self.state.active | ||||
|  | ||||
|         # select the active person in the person view | ||||
|         p = self.dbstate.active | ||||
|         try: | ||||
|             path = self.person_model.on_get_path(p.get_handle()) | ||||
|             group_name = p.get_primary_name().get_group_name() | ||||
|             top_name = self.state.db.get_name_group_mapping(group_name) | ||||
|             top_name = self.dbstate.db.get_name_group_mapping(group_name) | ||||
|             top_path = self.person_model.on_get_path(top_name) | ||||
|             self.person_tree.expand_row(top_path,0) | ||||
|  | ||||
| @@ -378,117 +308,29 @@ class PersonView(PageView.PageView): | ||||
|         except KeyError: | ||||
|             self.person_selection.unselect_all() | ||||
|             print "Person not currently available due to filter" | ||||
|             self.state.active = p | ||||
|             self.dbstate.active = p | ||||
|  | ||||
|         # disable the inactive flag | ||||
|         self.inactive = False | ||||
|  | ||||
|     def redisplay_person_list(self): | ||||
|         self.build_tree() | ||||
|         # update history | ||||
|         self.handle_history(p.handle) | ||||
|  | ||||
|     def person_added(self,handle_list): | ||||
|         for node in handle_list: | ||||
|             person = self.state.db.get_person_from_handle(node) | ||||
|             top = person.get_primary_name().get_group_name() | ||||
|             self.person_model.rebuild_data(self.DataFilter) | ||||
|             if not self.person_model.is_visable(node): | ||||
|                 continue | ||||
|             if (not self.person_model.sname_sub.has_key(top) or  | ||||
|                 len(self.person_model.sname_sub[top]) == 1): | ||||
|                 path = self.person_model.on_get_path(top) | ||||
|                 pnode = self.person_model.get_iter(path) | ||||
|                 self.person_model.row_inserted(path,pnode) | ||||
|             path = self.person_model.on_get_path(node) | ||||
|             pnode = self.person_model.get_iter(path) | ||||
|             self.person_model.row_inserted(path,pnode) | ||||
|     def handle_history(self, handle): | ||||
|         """ | ||||
|         Updates the person history information | ||||
|         """ | ||||
|         hobj = self.uistate.phistory | ||||
|         if handle and not hobj.lock: | ||||
|             hobj.push(handle) | ||||
|             #self.redraw_histmenu() | ||||
|             self.fwd_action.set_sensitive(not hobj.at_end()) | ||||
|             self.back_action.set_sensitive(not hobj.at_front()) | ||||
|          | ||||
|     def person_removed(self,handle_list): | ||||
|         for node in handle_list: | ||||
|             person = self.state.db.get_person_from_handle(node) | ||||
|             if not self.person_model.is_visable(node): | ||||
|                 continue | ||||
|             top = person.get_primary_name().get_group_name() | ||||
|             mylist = self.person_model.sname_sub.get(top,[]) | ||||
|             if mylist: | ||||
|                 try: | ||||
|                     path = self.person_model.on_get_path(node) | ||||
|                     self.person_model.row_deleted(path) | ||||
|                     if len(mylist) == 1: | ||||
|                         path = self.person_model.on_get_path(top) | ||||
|                         self.person_model.row_deleted(path) | ||||
|                 except KeyError: | ||||
|                     pass | ||||
|         self.person_model.rebuild_data(self.DataFilter,skip=node) | ||||
|  | ||||
|     def person_updated(self,handle_list): | ||||
|         for node in handle_list: | ||||
|             person = self.state.db.get_person_from_handle(node) | ||||
|             try: | ||||
|                 oldpath = self.person_model.iter2path[node] | ||||
|             except: | ||||
|                 return | ||||
|             pathval = self.person_model.on_get_path(node) | ||||
|             pnode = self.person_model.get_iter(pathval) | ||||
|  | ||||
|             # calculate the new data | ||||
|  | ||||
|             if person.primary_name.group_as: | ||||
|                 surname = person.primary_name.group_as | ||||
|             else: | ||||
|                 surname = self.state.db.get_name_group_mapping(person.primary_name.surname) | ||||
|  | ||||
|  | ||||
|             if oldpath[0] == surname: | ||||
|                 self.person_model.build_sub_entry(surname) | ||||
|             else: | ||||
|                 self.person_model.calculate_data(self.DataFilter) | ||||
|              | ||||
|             # find the path of the person in the new data build | ||||
|             newpath = self.person_model.temp_iter2path[node] | ||||
|              | ||||
|             # if paths same, just issue row changed signal | ||||
|  | ||||
|             if oldpath == newpath: | ||||
|                 self.person_model.row_changed(pathval,pnode) | ||||
|             else: | ||||
|                 # paths different, get the new surname list | ||||
|                  | ||||
|                 mylist = self.person_model.temp_sname_sub.get(oldpath[0],[]) | ||||
|                 path = self.person_model.on_get_path(node) | ||||
|                  | ||||
|                 # delete original | ||||
|                 self.person_model.row_deleted(pathval) | ||||
|                  | ||||
|                 # delete top node of original if necessar | ||||
|                 if len(mylist)==0: | ||||
|                     self.person_model.row_deleted(pathval[0]) | ||||
|                      | ||||
|                 # determine if we need to insert a new top node', | ||||
|                 insert = not self.person_model.sname_sub.has_key(newpath[0]) | ||||
|  | ||||
|                 # assign new data | ||||
|                 self.person_model.assign_data() | ||||
|                  | ||||
|                 # insert new row if needed | ||||
|                 if insert: | ||||
|                     path = self.person_model.on_get_path(newpath[0]) | ||||
|                     pnode = self.person_model.get_iter(path) | ||||
|                     self.person_model.row_inserted(path,pnode) | ||||
|  | ||||
|                 # insert new person | ||||
|                 path = self.person_model.on_get_path(node) | ||||
|                 pnode = self.person_model.get_iter(path) | ||||
|                 self.person_model.row_inserted(path,pnode) | ||||
|                  | ||||
|         self.goto_active_person() | ||||
|  | ||||
|     def change_db(self,db): | ||||
|         self.build_columns() | ||||
|         db.connect('person-add', self.person_added) | ||||
|         db.connect('person-update', self.person_updated) | ||||
|         db.connect('person-delete', self.person_removed) | ||||
|         db.connect('person-rebuild', self.redisplay_person_list) | ||||
|         self.apply_filter() | ||||
|  | ||||
|     def init_filters(self): | ||||
|     def setup_filter(self): | ||||
|         """ | ||||
|         Builds the default filters and add them to the filter menu. | ||||
|         """ | ||||
|          | ||||
|         cell = gtk.CellRendererText() | ||||
|         self.filter_list.clear() | ||||
| @@ -497,6 +339,12 @@ class PersonView(PageView.PageView): | ||||
|  | ||||
|         filter_list = [] | ||||
|  | ||||
|         self.DataFilter = None | ||||
|  | ||||
|         all = GenericFilter.GenericFilter() | ||||
|         all.set_name(_("Entire Database")) | ||||
|         all.add_rule(GenericFilter.Everyone([])) | ||||
|  | ||||
|         all = GenericFilter.GenericFilter() | ||||
|         all.set_name(_("Entire Database")) | ||||
|         all.add_rule(GenericFilter.Everyone([])) | ||||
| @@ -611,7 +459,270 @@ class PersonView(PageView.PageView): | ||||
|         self.filter_list.set_model(self.filter_model) | ||||
|         self.filter_list.set_active(self.filter_model.default_index()) | ||||
|         self.filter_list.connect('changed',self.on_filter_name_changed) | ||||
|         self.filter_text.set_sensitive(0) | ||||
|         self.filter_text.set_sensitive(False) | ||||
|  | ||||
|     def build_tree(self): | ||||
|         """ | ||||
|         Creates a new PeopleModel instance. Essentially creates a complete | ||||
|         rebuild of the data. | ||||
|         """ | ||||
|         self.person_model = PeopleModel.PeopleModel( | ||||
|             self.dbstate.db, self.DataFilter, self.filter_invert.get_active()) | ||||
|         self.person_tree.set_model(self.person_model) | ||||
|  | ||||
|     def filter_toggle(self,obj): | ||||
|         if obj.get_active(): | ||||
|             self.filterbar.show() | ||||
|         else: | ||||
|             self.filterbar.hide() | ||||
|  | ||||
|     def add(self,obj): | ||||
|         person = RelLib.Person() | ||||
|         EditPerson.EditPerson(self.dbstate, self.uistate, person) | ||||
|  | ||||
|     def edit(self,obj): | ||||
|         EditPerson.EditPerson(self.dbstate, self.uistate, self.dbstate.active) | ||||
|  | ||||
|     def remove(self,obj): | ||||
|         mlist = self.get_selected_objects() | ||||
|         if len(mlist) == 0: | ||||
|             return | ||||
|          | ||||
|         for sel in mlist: | ||||
|             p = self.dbstate.db.get_person_from_handle(sel) | ||||
|             self.active_person = p | ||||
|             name = NameDisplay.displayer.display(p)  | ||||
|  | ||||
|             msg = _('Deleting the person will remove the person ' | ||||
|                              'from the database.') | ||||
|             msg = "%s %s" % (msg,Utils.data_recover_msg) | ||||
|             QuestionDialog.QuestionDialog(_('Delete %s?') % name,msg, | ||||
|                                           _('_Delete Person'), | ||||
|                                           self.delete_person_response) | ||||
|  | ||||
|     def delete_person_response(self): | ||||
|         #self.disable_interface() | ||||
|         trans = self.dbstate.db.transaction_begin() | ||||
|          | ||||
|         n = NameDisplay.displayer.display(self.active_person) | ||||
|  | ||||
|         if self.dbstate.db.get_default_person() == self.active_person: | ||||
|             self.dbstate.db.set_default_person_handle(None) | ||||
|  | ||||
|         for family_handle in self.active_person.get_family_handle_list(): | ||||
|             if not family_handle: | ||||
|                 continue | ||||
|             family = self.dbstate.db.get_family_from_handle(family_handle) | ||||
|             family_to_remove = False | ||||
|             if self.active_person.get_handle() == family.get_father_handle(): | ||||
|                 if family.get_mother_handle(): | ||||
|                     family.set_father_handle(None) | ||||
|                 else: | ||||
|                     family_to_remove = True | ||||
|             else: | ||||
|                 if family.get_father_handle(): | ||||
|                     family.set_mother_handle(None) | ||||
|                 else: | ||||
|                     family_to_remove = True | ||||
|             if family_to_remove: | ||||
|                 for child_handle in family.get_child_handle_list(): | ||||
|                     child = self.dbstate.db.get_person_from_handle(child_handle) | ||||
|                     child.remove_parent_family_handle(family_handle) | ||||
|                     self.db.commit_person(child,trans) | ||||
|                 self.dbstate.db.remove_family(family_handle,trans) | ||||
|             else: | ||||
|                 self.dbstate.db.commit_family(family,trans) | ||||
|  | ||||
|         for (family_handle,mrel,frel) in self.active_person.get_parent_family_handle_list(): | ||||
|             if family_handle: | ||||
|                 family = self.db.get_family_from_handle(family_handle) | ||||
|                 family.remove_child_handle(self.active_person.get_handle()) | ||||
|                 self.db.commit_family(family,trans) | ||||
|  | ||||
|         handle = self.active_person.get_handle() | ||||
|  | ||||
|         person = self.active_person | ||||
|         self.remove_from_person_list(person) | ||||
|         self.people_view.remove_from_history(handle) | ||||
|         self.dbstate.db.remove_person(handle, trans) | ||||
|  | ||||
|         if self.uistate.phistory.index >= 0: | ||||
|             handle = self.uistate.phistory.history[self.index] | ||||
|             self.active_person = self.dbstate.db.get_person_from_handle(handle) | ||||
|         else: | ||||
|             self.dbstate.change_active_person(None) | ||||
|         self.dbstate.db.transaction_commit(trans,_("Delete Person (%s)") % n) | ||||
|         #self.redraw_histmenu() | ||||
|         #self.enable_interface() | ||||
|  | ||||
|     def build_columns(self): | ||||
|         for column in self.columns: | ||||
|             self.person_tree.remove_column(column) | ||||
|              | ||||
|         column = gtk.TreeViewColumn(_('Name'), self.renderer,text=0) | ||||
|         column.set_resizable(True) | ||||
|         #column.set_clickable(True) | ||||
|         #column.connect('clicked',self.sort_clicked) | ||||
|         column.set_min_width(225) | ||||
|         column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) | ||||
|         self.person_tree.append_column(column) | ||||
|         self.columns = [column] | ||||
|  | ||||
|         for pair in self.dbstate.db.get_person_column_order(): | ||||
|             if not pair[0]: | ||||
|                 continue | ||||
|             name = column_names[pair[1]] | ||||
|             column = gtk.TreeViewColumn(name, self.renderer, markup=pair[1]) | ||||
|             column.set_resizable(True) | ||||
|             column.set_min_width(60) | ||||
|             column.set_sizing(gtk.TREE_VIEW_COLUMN_GROW_ONLY) | ||||
|             self.columns.append(column) | ||||
|             self.person_tree.append_column(column) | ||||
|  | ||||
|     def row_changed(self,obj): | ||||
|         """Called with a row is changed. Check the selected objects from | ||||
|         the person_tree to get the IDs of the selected objects. Set the | ||||
|         active person to the first person in the list. If no one is | ||||
|         selected, set the active person to None""" | ||||
|  | ||||
|         selected_ids = self.get_selected_objects() | ||||
|         if not self.inactive: | ||||
|             try: | ||||
|                 person = self.dbstate.db.get_person_from_handle(selected_ids[0]) | ||||
|                 self.dbstate.change_active_person(person) | ||||
|             except: | ||||
|                 self.dbstate.change_active_person(None) | ||||
|  | ||||
|         if len(selected_ids) == 1: | ||||
|             self.person_tree.drag_source_set(BUTTON1_MASK, | ||||
|                                              [DdTargets.PERSON_LINK.target()], | ||||
|                                              ACTION_COPY) | ||||
|         elif len(selected_ids) > 1: | ||||
|             self.person_tree.drag_source_set(BUTTON1_MASK, | ||||
|                                              [DdTargets.PERSON_LINK_LIST.target()], | ||||
|                                              ACTION_COPY) | ||||
|         self.uistate.modify_statusbar() | ||||
|          | ||||
|     def alpha_event(self,*obj): | ||||
|         EditPerson.EditPerson(self.dbstate, self.dbstate.active) | ||||
|  | ||||
|     def on_plist_button_press(self,obj,event): | ||||
|         if event.type == gtk.gdk.BUTTON_PRESS and event.button == 3: | ||||
|             self.build_people_context_menu(event) | ||||
|  | ||||
|     def person_drag_data_get(self, widget, context, sel_data, info, time): | ||||
|         selected_ids = self.get_selected_objects() | ||||
|  | ||||
|         if len(selected_ids) == 1: | ||||
|             sel_data.set(sel_data.target, 8, selected_ids[0]) | ||||
|         elif len(selected_ids) > 1: | ||||
|             sel_data.set(DdTargets.PERSON_LINK_LIST.drag_type,8, | ||||
|                          pickle.dumps(selected_ids)) | ||||
|  | ||||
|     def apply_filter_clicked(self): | ||||
|         index = self.filter_list.get_active() | ||||
|         self.DataFilter = self.filter_model.get_filter(index) | ||||
|         if self.DataFilter.need_param: | ||||
|             qual = unicode(self.filter_text.get_text()) | ||||
|             self.DataFilter.set_parameter(qual) | ||||
|         self.apply_filter() | ||||
|         self.goto_active_person() | ||||
|  | ||||
|     def person_added(self,handle_list): | ||||
|         for node in handle_list: | ||||
|             person = self.dbstate.db.get_person_from_handle(node) | ||||
|             top = person.get_primary_name().get_group_name() | ||||
|             self.person_model.rebuild_data(self.DataFilter) | ||||
|             if not self.person_model.is_visable(node): | ||||
|                 continue | ||||
|             if (not self.person_model.sname_sub.has_key(top) or  | ||||
|                 len(self.person_model.sname_sub[top]) == 1): | ||||
|                 path = self.person_model.on_get_path(top) | ||||
|                 pnode = self.person_model.get_iter(path) | ||||
|                 self.person_model.row_inserted(path,pnode) | ||||
|             path = self.person_model.on_get_path(node) | ||||
|             pnode = self.person_model.get_iter(path) | ||||
|             self.person_model.row_inserted(path,pnode) | ||||
|  | ||||
|     def person_removed(self,handle_list): | ||||
|         for node in handle_list: | ||||
|             person = self.dbstate.db.get_person_from_handle(node) | ||||
|             if not self.person_model.is_visable(node): | ||||
|                 continue | ||||
|             top = person.get_primary_name().get_group_name() | ||||
|             mylist = self.person_model.sname_sub.get(top,[]) | ||||
|             if mylist: | ||||
|                 try: | ||||
|                     path = self.person_model.on_get_path(node) | ||||
|                     self.person_model.row_deleted(path) | ||||
|                     if len(mylist) == 1: | ||||
|                         path = self.person_model.on_get_path(top) | ||||
|                         self.person_model.row_deleted(path) | ||||
|                 except KeyError: | ||||
|                     pass | ||||
|         self.person_model.rebuild_data(self.DataFilter,skip=node) | ||||
|  | ||||
|     def person_updated(self,handle_list): | ||||
|         for node in handle_list: | ||||
|             person = self.dbstate.db.get_person_from_handle(node) | ||||
|             try: | ||||
|                 oldpath = self.person_model.iter2path[node] | ||||
|             except: | ||||
|                 return | ||||
|             pathval = self.person_model.on_get_path(node) | ||||
|             pnode = self.person_model.get_iter(pathval) | ||||
|  | ||||
|             # calculate the new data | ||||
|  | ||||
|             if person.primary_name.group_as: | ||||
|                 surname = person.primary_name.group_as | ||||
|             else: | ||||
|                 base = person.primary_name.surname | ||||
|                 surname = self.dbstate.db.get_name_group_mapping(base) | ||||
|  | ||||
|             if oldpath[0] == surname: | ||||
|                 self.person_model.build_sub_entry(surname) | ||||
|             else: | ||||
|                 self.person_model.calculate_data(self.DataFilter) | ||||
|              | ||||
|             # find the path of the person in the new data build | ||||
|             newpath = self.person_model.temp_iter2path[node] | ||||
|              | ||||
|             # if paths same, just issue row changed signal | ||||
|  | ||||
|             if oldpath == newpath: | ||||
|                 self.person_model.row_changed(pathval,pnode) | ||||
|             else: | ||||
|                 # paths different, get the new surname list | ||||
|                  | ||||
|                 mylist = self.person_model.temp_sname_sub.get(oldpath[0],[]) | ||||
|                 path = self.person_model.on_get_path(node) | ||||
|                  | ||||
|                 # delete original | ||||
|                 self.person_model.row_deleted(pathval) | ||||
|                  | ||||
|                 # delete top node of original if necessar | ||||
|                 if len(mylist)==0: | ||||
|                     self.person_model.row_deleted(pathval[0]) | ||||
|                      | ||||
|                 # determine if we need to insert a new top node', | ||||
|                 insert = not self.person_model.sname_sub.has_key(newpath[0]) | ||||
|  | ||||
|                 # assign new data | ||||
|                 self.person_model.assign_data() | ||||
|                  | ||||
|                 # insert new row if needed | ||||
|                 if insert: | ||||
|                     path = self.person_model.on_get_path(newpath[0]) | ||||
|                     pnode = self.person_model.get_iter(path) | ||||
|                     self.person_model.row_inserted(path,pnode) | ||||
|  | ||||
|                 # insert new person | ||||
|                 path = self.person_model.on_get_path(node) | ||||
|                 pnode = self.person_model.get_iter(path) | ||||
|                 self.person_model.row_inserted(path,pnode) | ||||
|                  | ||||
|         self.goto_active_person() | ||||
|  | ||||
|     def on_filter_name_changed(self,obj): | ||||
|         index = self.filter_list.get_active() | ||||
| @@ -628,9 +739,9 @@ class PersonView(PageView.PageView): | ||||
|             self.filter_label.hide() | ||||
|  | ||||
|     def apply_filter(self,current_model=None): | ||||
|         #self.parent.status_text(_('Updating display...')) | ||||
|         self.uistate.status_text(_('Updating display...')) | ||||
|         self.build_tree() | ||||
|         #self.parent.modify_statusbar() | ||||
|         self.uistate.modify_statusbar() | ||||
|  | ||||
|     def get_selected_objects(self): | ||||
|         (mode,paths) = self.person_selection.get_selected_rows() | ||||
| @@ -652,7 +763,7 @@ class PersonView(PageView.PageView): | ||||
|  | ||||
|     def build_backhistmenu(self,event): | ||||
|         """Builds and displays the menu with the back portion of the history""" | ||||
|         hobj = self.state.phistory | ||||
|         hobj = self.uistate.phistory | ||||
|         if hobj.index > 0: | ||||
|             backhistmenu = gtk.Menu() | ||||
|             backhistmenu.set_title(_('Back Menu')) | ||||
| @@ -667,7 +778,7 @@ class PersonView(PageView.PageView): | ||||
|                     hotkey = "_%s" % chr(ord('a')+num-11) | ||||
|                 elif num >= 21: | ||||
|                     break | ||||
|                 person = self.state.db.get_person_from_handle(pid) | ||||
|                 person = self.dbstate.db.get_person_from_handle(pid) | ||||
|                 item = gtk.MenuItem("%s. %s [%s]" %  | ||||
|                     (hotkey, | ||||
|                      NameDisplay.displayer.display(person), | ||||
| @@ -713,71 +824,50 @@ class PersonView(PageView.PageView): | ||||
|             self.build_fwdhistmenu(event) | ||||
|  | ||||
|     def fwd_clicked(self,obj,step=1): | ||||
|         print "fwd clicked" | ||||
|         hobj = self.state.phistory | ||||
|         hobj = self.uistate.phistory | ||||
|         hobj.lock = True | ||||
|         print hobj.history | ||||
|         if hobj.index+1 < len(hobj.history): | ||||
|         if not hobj.at_end(): | ||||
|             try: | ||||
|                 hobj.index += step | ||||
|                 handle = str(hobj.history[hobj.index]) | ||||
|                 self.state.active = self.state.db.get_person_from_handle(handle) | ||||
|                 self.state.modify_statusbar() | ||||
|                 self.state.change_active_handle(handle) | ||||
|                 hobj.mhistory.append(self.history[hobj.index]) | ||||
|                 handle = hobj.forward() | ||||
|                 self.dbstate.active = self.dbstate.db.get_person_from_handle(handle) | ||||
|                 self.uistate.modify_statusbar() | ||||
|                 self.dbstate.change_active_handle(handle) | ||||
|                 hobj.mhistory.append(hobj.history[hobj.index]) | ||||
|                 #self.redraw_histmenu() | ||||
|                 self.set_buttons(True) | ||||
|                 if hobj.index == len(hobj.history)-1: | ||||
|                     self.fwdbtn.set_sensitive(False) | ||||
|                     self.forward.set_sensitive(False) | ||||
|                 else: | ||||
|                     self.fwdbtn.set_sensitive(True) | ||||
|                     self.forward.set_sensitive(True) | ||||
|                 self.backbtn.set_sensitive(True) | ||||
|                 self.back.set_sensitive(True) | ||||
|                 self.fwd_action.set_sensitive(not hobj.at_end()) | ||||
|                 self.back_action.set_sensitive(True) | ||||
|             except: | ||||
|                 self.clear_history() | ||||
|                 hobj.clear() | ||||
|                 self.fwd_action.set_sensitive(False) | ||||
|                 self.back_action.set_sensitive(False) | ||||
|         else: | ||||
|             self.fwdbtn.set_sensitive(False) | ||||
|             self.forward.set_sensitive(False) | ||||
|             self.backbtn.set_sensitive(True) | ||||
|             self.back.set_sensitive(True) | ||||
|         self.goto_active_person() | ||||
|             self.fwd_action.set_sensitive(False) | ||||
|             self.back_action.set_sensitive(True) | ||||
|         hobj.lock = False | ||||
|  | ||||
|     def back_clicked(self,obj,step=1): | ||||
|         hobj = self.state.phistory | ||||
|         hobj = self.uistate.phistory | ||||
|         hobj.lock = True | ||||
|         if hobj.index > 0: | ||||
|         if not hobj.at_front(): | ||||
|             try: | ||||
|                 hobj.index -= step | ||||
|                 handle = str(hobj.history[hobj.hindex]) | ||||
|                 self.active = self.db.get_person_from_handle(handle) | ||||
|                 self.modify_statusbar() | ||||
|                 self.change_active_handle(handle) | ||||
|                 handle = hobj.back() | ||||
|                 self.active = self.dbstate.db.get_person_from_handle(handle) | ||||
|                 self.uistate.modify_statusbar() | ||||
|                 self.dbstate.change_active_handle(handle) | ||||
|                 hobj.mhistory.append(hobj.history[hobj.index]) | ||||
|                 self.redraw_histmenu() | ||||
|                 self.set_buttons(1) | ||||
|                 if hobj.index == 0: | ||||
|                     self.backbtn.set_sensitive(False) | ||||
|                     self.back.set_sensitive(False) | ||||
|                 else: | ||||
|                     self.backbtn.set_sensitive(True) | ||||
|                     self.back.set_sensitive(True) | ||||
|                 self.fwdbtn.set_sensitive(True) | ||||
|                 self.forward.set_sensitive(True) | ||||
| #                self.redraw_histmenu() | ||||
|                 self.back_action.set_sensitive(not hobj.at_front()) | ||||
|                 self.fwd_action.set_sensitive(True) | ||||
|             except: | ||||
|                 hobj.clear_history() | ||||
|                 hobj.clear() | ||||
|                 self.fwd_action.set_sensitive(False) | ||||
|                 self.back_action.set_sensitive(False) | ||||
|         else: | ||||
|             self.backbtn.set_sensitive(False) | ||||
|             self.back.set_sensitive(False) | ||||
|             self.fwdbtn.set_sensitive(True) | ||||
|             self.forward.set_sensitive(True) | ||||
|         self.goto_active_person() | ||||
|             self.back_action.set_sensitive(False) | ||||
|             self.fwd_action.set_sensitive(True) | ||||
|         hobj.lock = False | ||||
|  | ||||
|     def home(self,obj): | ||||
|         defperson = self.state.db.get_default_person() | ||||
|         defperson = self.dbstate.db.get_default_person() | ||||
|         if defperson: | ||||
|             self.state.change_active_person(defperson) | ||||
|             self.goto_active_person() | ||||
|             self.dbstate.change_active_person(defperson) | ||||
|   | ||||
| @@ -57,6 +57,9 @@ import GrampsCfg | ||||
| import Errors | ||||
| import DisplayTrace | ||||
| import Utils | ||||
| import QuestionDialog | ||||
| import PageView | ||||
| import Navigation | ||||
|  | ||||
| #------------------------------------------------------------------------- | ||||
| # | ||||
| @@ -99,6 +102,7 @@ uidefault = '''<ui> | ||||
|   </menu> | ||||
|   <menu action="GoMenu"> | ||||
|     <placeholder name="CommonGo"/> | ||||
|     <placeholder name="CommonHistory"/> | ||||
|   </menu> | ||||
|   <menu action="BookMenu"> | ||||
|     <menuitem action="AddBook"/> | ||||
| @@ -132,8 +136,14 @@ uidefault = '''<ui> | ||||
|  | ||||
| class ViewManager: | ||||
|  | ||||
|     def __init__(self): | ||||
|     def __init__(self,state): | ||||
|  | ||||
|         self.navigation_type = { | ||||
|             PageView.NAVIGATION_NONE: (None, None), | ||||
|             PageView.NAVIGATION_PERSON: (None,None), | ||||
|             } | ||||
|  | ||||
|         self.state = state | ||||
|         self.active_page = None | ||||
|         self.views = [] | ||||
|         self.window = gtk.Window() | ||||
| @@ -160,14 +170,17 @@ class ViewManager: | ||||
|         hbox.pack_start(self.notebook,True) | ||||
|         self.menubar = self.uimanager.get_widget('/MenuBar') | ||||
|         self.toolbar = self.uimanager.get_widget('/ToolBar') | ||||
|         print self.uimanager.get_widget('/MenuBar/GoMenu') | ||||
|         vbox.pack_start(self.menubar, False) | ||||
|         vbox.pack_start(self.toolbar, False) | ||||
|         vbox.add(hbox) | ||||
|         vbox.pack_end(self.statusbar,False) | ||||
|  | ||||
|         self.notebook.connect('switch-page',self.change_page) | ||||
|         self.state = DbState.DbState(self.window,self.statusbar,self.uimanager) | ||||
|         self.uistate = DbState.DisplayState(self.window, self.statusbar, | ||||
|                                             self.uimanager, self.state) | ||||
|  | ||||
|         person_nav = Navigation.PersonNavigation(self.uistate) | ||||
|         self.navigation_type[PageView.NAVIGATION_PERSON] = (person_nav,None) | ||||
|         self.window.show_all() | ||||
|  | ||||
|     def init_interface(self): | ||||
| @@ -187,7 +200,7 @@ class ViewManager: | ||||
|         obj.set_style(style) | ||||
|  | ||||
|     def build_ui_manager(self): | ||||
|         self.merge_id = 0 | ||||
|         self.merge_ids = [] | ||||
|         self.uimanager = gtk.UIManager() | ||||
|  | ||||
|         accelgroup = self.uimanager.get_accel_group() | ||||
| @@ -259,10 +272,12 @@ class ViewManager: | ||||
|  | ||||
|     def create_pages(self): | ||||
|         self.pages = [] | ||||
|         self.prev_nav = PageView.NAVIGATION_NONE | ||||
|          | ||||
|         index = 0 | ||||
|         self.set_color(self.ebox) | ||||
|         for page_def in self.views: | ||||
|             page = page_def(self.state) | ||||
|             page = page_def(self.state,self.uistate) | ||||
|  | ||||
|             # create icon/label for notebook | ||||
|             hbox = gtk.HBox() | ||||
| @@ -291,8 +306,8 @@ class ViewManager: | ||||
|             self.bbox.pack_start(button,False) | ||||
|  | ||||
|     def change_page(self,obj,page,num): | ||||
|         if self.merge_id: | ||||
|             self.uimanager.remove_ui(self.merge_id) | ||||
|         for mergeid in self.merge_ids: | ||||
|             self.uimanager.remove_ui(mergeid) | ||||
|         if self.active_page: | ||||
|             groups = self.active_page.get_actions() | ||||
|             for grp in groups: | ||||
| @@ -300,16 +315,28 @@ class ViewManager: | ||||
|  | ||||
|         if len(self.pages) > 0: | ||||
|             self.active_page = self.pages[num] | ||||
|  | ||||
|             old_nav = self.navigation_type[self.prev_nav] | ||||
|             if old_nav[0] != None: | ||||
|                 old_nav[0].disable | ||||
|  | ||||
|             nav_type = self.navigation_type[self.active_page.navigation_type()] | ||||
|             if nav_type[0] != None: | ||||
|                 nav_type[0].enable() | ||||
|              | ||||
|             groups = self.active_page.get_actions() | ||||
|  | ||||
|             for grp in groups: | ||||
|                 self.uimanager.insert_action_group(grp,1) | ||||
|             self.merge_id = self.uimanager.add_ui_from_string(self.active_page.ui_definition()) | ||||
|             self.merge_ids = [self.uimanager.add_ui_from_string(self.active_page.ui_definition())] | ||||
|             for ui in self.active_page.additional_ui_definitions(): | ||||
|                 mergeid = self.uimanager.add_ui_from_string(ui) | ||||
|                 self.merge_ids.append(mergeid) | ||||
|  | ||||
|     def on_open_activate(self,obj): | ||||
|  | ||||
|         choose = gtk.FileChooserDialog(_('GRAMPS: Open database'), | ||||
|                                            self.state.window, | ||||
|                                            self.uistate.window, | ||||
|                                            gtk.FILE_CHOOSER_ACTION_OPEN, | ||||
|                                            (gtk.STOCK_CANCEL, | ||||
|                                             gtk.RESPONSE_CANCEL, | ||||
| @@ -396,7 +423,7 @@ class ViewManager: | ||||
|     def on_new_activate(self,obj): | ||||
|  | ||||
|         choose = gtk.FileChooserDialog(_('GRAMPS: Create GRAMPS database'), | ||||
|                                            self.state.window, | ||||
|                                            self.uistate.window, | ||||
|                                            gtk.FILE_CHOOSER_ACTION_SAVE, | ||||
|                                            (gtk.STOCK_CANCEL, | ||||
|                                             gtk.RESPONSE_CANCEL, | ||||
| @@ -501,9 +528,9 @@ class ViewManager: | ||||
|                 return 0 | ||||
|             elif not os.access(filename,os.W_OK): | ||||
|                 mode = "r" | ||||
|                 WarningDialog(_('Read only database'), | ||||
|                               _('You do not have write access to the selected ' | ||||
|                                 'file.')) | ||||
|                 QuestionDialog.WarningDialog(_('Read only database'), | ||||
|                                              _('You do not have write access ' | ||||
|                                                'to the selected file.')) | ||||
|  | ||||
|         try: | ||||
|             if self.load_database(filename,callback,mode=mode) == 1: | ||||
| @@ -511,19 +538,19 @@ class ViewManager: | ||||
|                     filename = filename[:-1] | ||||
|                 name = os.path.basename(filename) | ||||
|                 if self.state.db.readonly: | ||||
|                     self.state.window.set_title("%s (%s) - GRAMPS" % (name,_('Read Only'))) | ||||
|                     self.uistate.window.set_title("%s (%s) - GRAMPS" % (name,_('Read Only'))) | ||||
|                 else: | ||||
|                     self.state.window.set_title("%s - GRAMPS" % name) | ||||
|                     self.uistate.window.set_title("%s - GRAMPS" % name) | ||||
|             else: | ||||
|                 GrampsKeys.save_last_file("") | ||||
|                 ErrorDialog(_('Cannot open database'), | ||||
|                 QuestionDialog.ErrorDialog(_('Cannot open database'), | ||||
|                             _('The database file specified could not be opened.')) | ||||
|                 return 0 | ||||
|         except ( IOError, OSError, Errors.FileVersionError), msg: | ||||
|             ErrorDialog(_('Cannot open database'),str(msg)) | ||||
|             QuestionDialog.ErrorDialog(_('Cannot open database'),str(msg)) | ||||
|             return 0 | ||||
|         except (db.DBAccessError,db.DBError), msg: | ||||
|             ErrorDialog(_('Cannot open database'), | ||||
|             QuestionDialog.ErrorDialog(_('Cannot open database'), | ||||
|                         _('%s could not be opened.' % filename) + '\n' + msg[1]) | ||||
|             return 0 | ||||
|         except Exception: | ||||
| @@ -588,9 +615,8 @@ class ViewManager: | ||||
|         ScratchPad.ScratchPadWindow(self.state, self) | ||||
|  | ||||
|     def on_import(self,obj): | ||||
|         print "import" | ||||
|         choose = gtk.FileChooserDialog(_('GRAMPS: Import database'), | ||||
|                                            self.state.window, | ||||
|                                            self.uistate.window, | ||||
|                                            gtk.FILE_CHOOSER_ACTION_OPEN, | ||||
|                                            (gtk.STOCK_CANCEL, | ||||
|                                             gtk.RESPONSE_CANCEL, | ||||
|   | ||||
| @@ -32,6 +32,7 @@ import const | ||||
| import Errors | ||||
| import PluginMgr | ||||
| import TipOfDay | ||||
| import DbState | ||||
|  | ||||
| from GrampsMime import mime_type_is_defined | ||||
| from QuestionDialog import ErrorDialog | ||||
| @@ -39,7 +40,7 @@ from QuestionDialog import ErrorDialog | ||||
| import gnome | ||||
|  | ||||
|  | ||||
| iconpaths = [".","/usr/share/gramps","~/devel/srcx"] | ||||
| iconpaths = [".","/usr/share/gramps"] | ||||
|  | ||||
| def register_stock_icons (): | ||||
|     import os | ||||
| @@ -183,7 +184,10 @@ class Gramps: | ||||
| #                                    self.date_format_key_update) | ||||
|  | ||||
|         register_stock_icons() | ||||
|         a = ViewManager.ViewManager() | ||||
|  | ||||
|         state = DbState.DbState() | ||||
|          | ||||
|         a = ViewManager.ViewManager(state) | ||||
|         a.register_view(PersonView.PersonView) | ||||
|         a.register_view(PedView.PedView) | ||||
|         a.init_interface() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user