* src/PedView.py (__init__): Define database variable.
* src/ViewManager.py (__init__): Define empty pages list. * src/DisplayState.py (GrampsWindowManager,ManagedWindow): Add classes for window management. Still unfinished. svn: r5080
This commit is contained in:
		| @@ -1,3 +1,9 @@ | ||||
| 2005-08-14  Alex Roitman  <shura@gramps-project.org> | ||||
| 	* src/PedView.py (__init__): Define database variable. | ||||
| 	* src/ViewManager.py (__init__): Define empty pages list. | ||||
| 	* src/DisplayState.py (GrampsWindowManager,ManagedWindow): Add | ||||
| 	classes for window management. Still unfinished. | ||||
|  | ||||
| 2005-08-13  Don Allingham  <don@gramps-project.org> | ||||
| 	* src/GrampsDbBase.py: keep track of open files | ||||
| 	* src/MediaView.py: convert MediaView to handle pluggable views | ||||
|   | ||||
| @@ -44,6 +44,11 @@ import GrampsDBCallback | ||||
| import GrampsKeys | ||||
| import NameDisplay | ||||
|  | ||||
| #------------------------------------------------------------------------- | ||||
| # | ||||
| # History manager | ||||
| # | ||||
| #------------------------------------------------------------------------- | ||||
| class History(GrampsDBCallback.GrampsDBCallback): | ||||
|  | ||||
|     __signals__ = { | ||||
| @@ -118,6 +123,148 @@ class History(GrampsDBCallback.GrampsDBCallback): | ||||
|         if not self.at_end(): | ||||
|             self.history = self.history[0:self.index+1] | ||||
|  | ||||
| #------------------------------------------------------------------------- | ||||
| # | ||||
| # Window manager | ||||
| # | ||||
| #------------------------------------------------------------------------- | ||||
| class GrampsWindowManager: | ||||
|  | ||||
|     def __init__(self): | ||||
|         self.window_tree = [] | ||||
|         self.id2item = {} | ||||
|  | ||||
|     def get_item_from_node(self,node): | ||||
|         item = self.window_tree | ||||
|         for index in node: | ||||
|             item = item[index] | ||||
|         return item | ||||
|  | ||||
|     def get_window_from_id(self,window_id): | ||||
|         return self.id2item.get(window_id,None) | ||||
|      | ||||
|     def close_node(self,node): | ||||
|         item = self.get_item_from_node(node) | ||||
|         self.close_item_recursively(item) | ||||
|         self.remove_node(node) | ||||
|  | ||||
|     def close_item_recursively(self,item): | ||||
|         if type(item) == list: | ||||
|             for sub_item in item[1:]: | ||||
|                 self.close_item_recursively(sub_item) | ||||
|         else: | ||||
|             if item.window_id: | ||||
|                 del self.id2item[window_id] | ||||
|             item.window.destroy() | ||||
|      | ||||
|     def add_item(self,node,item): | ||||
|         if item.window_id: | ||||
|             self.id2item[window_id] = item | ||||
|  | ||||
|         parent_item = self.get_item_from_node(node) | ||||
|         assert type(parent_item) == list or node == [], \ | ||||
|                "Gwm: add_item: Incorrect node." | ||||
|         if item.submenu_label: | ||||
|             # This is an item with potential children | ||||
|             new_item = [item] | ||||
|         else: | ||||
|             # This is an item without children | ||||
|             new_item = item | ||||
|         parent_item.append(new_item) | ||||
|         new_node = node + [len(parent_item) + 1] | ||||
|         return new_node | ||||
|  | ||||
|     def remove_node(self,node): | ||||
|         parent_node = node[:-1] | ||||
|         child_in_parent = node[-1:][0] | ||||
|         item = self.get_item_from_node(parent_node) | ||||
|         item.pop(child_in_parent) | ||||
|  | ||||
|     def call_back_factory(self,item): | ||||
|         if type(item) != list: | ||||
|             def f(obj): | ||||
|                 if item.window_id and self.get_window_from_id(window_id): | ||||
|                     self.get_window_from_id(window__id).present() | ||||
|         else: | ||||
|             def f(obj): | ||||
|                 pass | ||||
|         return f | ||||
|  | ||||
|     def built_windows_menu(self): | ||||
|         pass | ||||
|  | ||||
| #------------------------------------------------------------------------- | ||||
| # | ||||
| # Gramps Managed Window class | ||||
| # | ||||
| #------------------------------------------------------------------------- | ||||
| class ManagedWindow: | ||||
|     """ | ||||
|     Managed window base class. | ||||
|      | ||||
|     This class provides all the goodies necessary for user-friendly window | ||||
|     management in GRAMPS: registering the menu item under the Windows | ||||
|     menu, keeping track of child windows, closing them on close/delete | ||||
|     event, and presenting itself when selected or attempted to create again. | ||||
|     """ | ||||
|  | ||||
|     def __init__(self,uistate,node,window_key,submenu_label,menu_label): | ||||
|         """ | ||||
|         Create child windows and add itself to menu, if not there already. | ||||
|  | ||||
|  | ||||
|         The usage from derived classes is envisioned as follows: | ||||
|  | ||||
|  | ||||
|         import DisplayState | ||||
|         class SomeWindowClass(DisplayState.ManagedWindow): | ||||
|             def __init__(self,uistate,dbstate,node): | ||||
|                 window_id = self        # Or e.g. window_id = person.handle | ||||
|                 submenu_label = None    # This window cannot have children | ||||
|                 menu_label = 'Menu label for this window' | ||||
|                 DisplayState.ManagedWindow.__init__(self, | ||||
|                                                     uistate, | ||||
|                                                     node, | ||||
|                                                     window_id, | ||||
|                                                     submenu_label, | ||||
|                                                     menu_label) | ||||
|                 if self.already_exist: | ||||
|                     return | ||||
|  | ||||
|                 # Proceed with the class. | ||||
|                 ... | ||||
|  | ||||
|         """ | ||||
|         if uistate.gwm.get_window_from_id(window_id): | ||||
|             uistate.gwm.get_window_from_id(window_id).present() | ||||
|             self.already_exist = True | ||||
|         else: | ||||
|             self.already_exist = False | ||||
|             self.window_id = window_id | ||||
|             self.submenu_label = submenu_label | ||||
|             self.menu_label = menu_label | ||||
|             self.uistate = uistate | ||||
|             self.node = self.uistate.gwm.add_item(node,self) | ||||
|  | ||||
|     def close(self): | ||||
|         """ | ||||
|         Close itself. | ||||
|  | ||||
|         Takes care of closing children and removing itself from menu. | ||||
|         """ | ||||
|         self.uistate.gwm.close_node(self.node) | ||||
|  | ||||
|     def present(self): | ||||
|         """ | ||||
|         Present window (unroll/unminimize/bring to top). | ||||
|         """ | ||||
|         self.window.present() | ||||
|  | ||||
| #------------------------------------------------------------------------- | ||||
| # | ||||
| # Gramps Display State class | ||||
| # | ||||
| #------------------------------------------------------------------------- | ||||
| class DisplayState(GrampsDBCallback.GrampsDBCallback): | ||||
|  | ||||
|     __signals__ = { | ||||
| @@ -131,6 +278,7 @@ class DisplayState(GrampsDBCallback.GrampsDBCallback): | ||||
|         self.status = status | ||||
|         self.status_id = status.get_context_id('GRAMPS') | ||||
|         self.phistory = History() | ||||
|         self.gwm = GrampsWindowManager() | ||||
|  | ||||
|     def modify_statusbar(self,active=None): | ||||
|         self.status.pop(self.status_id) | ||||
|   | ||||
| @@ -75,6 +75,7 @@ class PedView(PageView.PersonNavView): | ||||
|         dbstate.connect('database-changed',self.change_db) | ||||
|         dbstate.connect('active-changed',self.goto_active_person) | ||||
|         self.force_size = 0 # Automatic resize | ||||
|         self.db = dbstate.db | ||||
|  | ||||
|     def init_parent_signals_cb(self, widget, event): | ||||
|         print "PedView.init_parent_signals_cb" | ||||
|   | ||||
| @@ -154,6 +154,7 @@ class ViewManager: | ||||
|         self.state = state | ||||
|         self.active_page = None | ||||
|         self.views = [] | ||||
|         self.pages = [] | ||||
|         self.window = gtk.Window() | ||||
|         self.window.connect('destroy', lambda w: gtk.main_quit()) | ||||
|         self.window.set_size_request(775,500) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user