Mercurial > pyarq-presupuestos
comparison Gtk/gui.py @ 7:0359329a1c26
Navigation buttons. Version of the data structure.
author | Miguel Ángel Bárcena Rodríguez <miguelangel@obraencurso.es> |
---|---|
date | Thu, 11 Nov 2010 23:22:35 +0100 |
parents | 2fc6b47dbe70 |
children | 55df0b15706b |
comparison
equal
deleted
inserted
replaced
6:2fc6b47dbe70 | 7:0359329a1c26 |
---|---|
29 This panes are ordened in gtk.Paned represented for the class Paned which can | 29 This panes are ordened in gtk.Paned represented for the class Paned which can |
30 have 2 viewes represented for the View class or other gtk.Paned that have other | 30 have 2 viewes represented for the View class or other gtk.Paned that have other |
31 viewes or more gtk.Paned. | 31 viewes or more gtk.Paned. |
32 The view can have diferente type of widgets to show the budget information. | 32 The view can have diferente type of widgets to show the budget information. |
33 The DecompositionList class show the decompositon list information of a record | 33 The DecompositionList class show the decompositon list information of a record |
34 The Measure class show de measure information of a record | 34 The Measure class show the measure information of a record |
35 The TextWindow class show the long description of a record | 35 The TextWindow class show the long description of a record |
36 The Sheet class class show the sheet of condition information of a record | 36 The Sheet class class show the sheet of condition information of a record |
37 | 37 |
38 The views can send signal to the others. | 38 The views can send signal to the others. |
39 All the viewes ordered in panes can be or not be connected to the others, | 39 All the viewes ordered in panes can be or not be connected to the others, |
80 | 80 |
81 Description: | 81 Description: |
82 Creates and shows the main window. | 82 Creates and shows the main window. |
83 This is the interface base class. | 83 This is the interface base class. |
84 Constructor: | 84 Constructor: |
85 gui.MainWindow(): Returns the newly created main window instance | 85 gui.MainWindow() |
86 Ancestry: | 86 Ancestry: |
87 +-- object | 87 +-- object |
88 +-- MainWindow | 88 +-- MainWindow |
89 Atributes: | 89 Atributes: |
90 "window": Main window widget ("gtk.Window" object) | 90 "window": Main window widget ("gtk.Window" object) |
91 "__budget_temp_list": Temporal list of budgets | |
92 "__budget_list": List of budgets ("base.Budget" objects) | |
93 "__page_list": List of pages ("Page" object) | |
94 "__notebook": Notebook widget ("gtk.Notebook" object) | |
95 "__general_action_group": the "General" action group | |
96 Methods: | 91 Methods: |
97 __init__(self) | 92 removePage |
98 _main(self) | 93 getNotebook |
99 _addBudget(self, budget) | 94 getPageList |
100 _appendPage(self) | 95 getBudgetList |
101 _testBudgetList(self) | |
102 _menuitemImportFiebdc(self, widget) | |
103 _menuitemImportPriceDatabase(self, widget) | |
104 _menuitemOpenPriceDatabase(self, widget) | |
105 _menuitemOpen | |
106 _menuitemClose(self, widget) | |
107 _delete_event(self, widget, event) | |
108 _destroy(self, widget) | |
109 """ | 96 """ |
110 # TODO:* Can choose open budget in new window | 97 # TODO:* Can choose open budget in new window |
111 # TODO:* gtk.Action for menu and toolbar | 98 # TODO:* gtk.Action for menu and toolbar |
112 # TODO:* Can choose show more than one notebook in the same window or | 99 # TODO:* Can choose show more than one notebook in the same window or |
113 # TODO: can show basedata notebook in a side pane | 100 # TODO: can show basedata notebook in a side pane |
117 <menuitem action="ImportFiebdc"/> | 104 <menuitem action="ImportFiebdc"/> |
118 <menuitem action="Close"/> | 105 <menuitem action="Close"/> |
119 </menu> | 106 </menu> |
120 <menu action="View"> | 107 <menu action="View"> |
121 </menu> | 108 </menu> |
109 <menu action="Go"> | |
110 <menuitem action="GoUp"/> | |
111 <menuitem action="GoDown"/> | |
112 <menuitem action="GoPrevious"/> | |
113 <menuitem action="GoPosterior"/> | |
114 <menuitem action="GoToRoot"/> | |
115 </menu> | |
122 <menu action="Test"> | 116 <menu action="Test"> |
123 <menuitem action="ImportFiebdcPriceDatabase"/> | 117 <menuitem action="ImportFiebdcPriceDatabase"/> |
124 <menuitem action="OpenPriceDatabase"/> | 118 <menuitem action="OpenPriceDatabase"/> |
125 </menu> | 119 </menu> |
126 </menubar> | 120 </menubar> |
127 <toolbar name="ToolBar"> | 121 <toolbar name="ToolBar"> |
128 <toolitem action="ImportFiebdc"/> | 122 <toolitem action="ImportFiebdc"/> |
129 <separator/> | |
130 <toolitem action="Close"/> | 123 <toolitem action="Close"/> |
131 <separator name="sep1"/> | 124 <separator name="sep1"/> |
125 <toolitem action="GoUp"/> | |
126 <toolitem action="GoDown"/> | |
127 <toolitem action="GoPrevious"/> | |
128 <toolitem action="GoPosterior"/> | |
129 <toolitem action="GoToRoot"/> | |
132 </toolbar> | 130 </toolbar> |
133 </ui>''' | 131 </ui>''' |
134 | 132 |
135 def __init__(self): | 133 def __init__(self): |
136 """def __init__(self) | 134 """def __init__(self) |
137 | 135 |
138 Initialize the atributes "__budget_list" and "__page_list" without data. | 136 Initialize the atributes "__budget_list" and "__page_list" without data. |
139 Creates the widgets "window" and "__notebook". | 137 Creates the widgets "window" and "__notebook". |
140 """ | 138 |
139 self.__budget_temp_list: Temporal list of budgets | |
140 self.__budget_list: List of budgets ("base.Budget" objects) | |
141 self.__page_list: List of pages ("Page" object) | |
142 self.__notebook: Notebook widget ("gtk.Notebook" object) | |
143 self.__general_action_group: "General" action group | |
144 """ | |
145 #TODO: action group for Navigation buttons | |
141 self.__budget_temp_list = [] | 146 self.__budget_temp_list = [] |
142 self.__budget_list = [] | 147 self.__budget_list = [] |
143 self.__page_list = [] | 148 self.__page_list = [] |
144 # Main window | 149 # Main window |
145 self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) | 150 self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) |
163 ("ImportFiebdc", gtk.STOCK_OPEN, _('_Import Fiebdc'), "", | 168 ("ImportFiebdc", gtk.STOCK_OPEN, _('_Import Fiebdc'), "", |
164 _('Import FIEBDC'), self._menuitemImportFiebdc), | 169 _('Import FIEBDC'), self._menuitemImportFiebdc), |
165 ("Close", gtk.STOCK_CLOSE, _("_Close"), None, _('Close'), | 170 ("Close", gtk.STOCK_CLOSE, _("_Close"), None, _('Close'), |
166 self._menuitemClose), | 171 self._menuitemClose), |
167 ("View", None, _("_View")), | 172 ("View", None, _("_View")), |
173 ("Go", None, _("_Go")), | |
174 ("GoUp", gtk.STOCK_GO_UP, _("_Up Record"),"", | |
175 _("Go up record"), self._menuitemGoUp), | |
176 ("GoDown", gtk.STOCK_GO_DOWN, _("_Down Record"),"", | |
177 _("Go down record"), self._menuitemGoDown), | |
178 ("GoPrevious", gtk.STOCK_GO_BACK, _("_Previous Record"),"", | |
179 _("Go Previous record"), self._menuitemGoPrevious), | |
180 ("GoPosterior", gtk.STOCK_GO_FORWARD, _("_Posterior Record"),"", | |
181 _("Go posterior record"), self._menuitemGoPosterior), | |
182 ("GoToRoot", gtk.STOCK_GOTO_TOP, _("_Root"),"", | |
183 _("Go to root"), self._menuitemGoToRoot), | |
168 ("Test", None, _("_Test")), | 184 ("Test", None, _("_Test")), |
169 ('ImportFiebdcPriceDatabase', gtk.STOCK_OPEN, | 185 ('ImportFiebdcPriceDatabase', gtk.STOCK_OPEN, |
170 _("Import Fiebdc _price database"), "", _("Import database"), | 186 _("Import Fiebdc _price database"), "", _("Import database"), |
171 self._menuitemImportPriceDatabase ), | 187 self._menuitemImportPriceDatabase ), |
172 ("OpenPriceDatabase", gtk.STOCK_OPEN, _('_Open price database'), | 188 ("OpenPriceDatabase", gtk.STOCK_OPEN, _('_Open price database'), |
217 Creates a new page (instance of "Page class") from the last budget in | 233 Creates a new page (instance of "Page class") from the last budget in |
218 __budget_list, appends this page in the "__page_list" and shows the | 234 __budget_list, appends this page in the "__page_list" and shows the |
219 page widget in the notebook widget. | 235 page widget in the notebook widget. |
220 """ | 236 """ |
221 _last_budget = self.__budget_list[-1] | 237 _last_budget = self.__budget_list[-1] |
222 _page = Page(_last_budget) | 238 _page = Page(self, _last_budget) |
223 self.__notebook.append_page(_page.widget, _page.title) | 239 self.__notebook.append_page(_page.widget, _page.title) |
224 self.__page_list.append(_page) | 240 self.__page_list.append(_page) |
225 | 241 |
226 | 242 |
227 def _menuitemImportFiebdc(self, widget): | 243 def _menuitemImportFiebdc(self, widget): |
228 """def _menuitemImportFiebdc(self, widget) | 244 """def _menuitemImportFiebdc(self, widget) |
229 | 245 |
230 widget: the widget where the event is emitted from | 246 widget: the widget where the event is emitted from |
231 Callback to open a budget file. | 247 Callback to open a budget file. |
232 | 248 |
233 Creates and shows a window to open a budget file. | 249 Creates and shows a file selection window to open a budget file. |
234 """ | 250 """ |
235 _budget = base.Budget() | 251 _budget = base.Budget() |
236 self.__budget_temp_list.append(_budget) | 252 self.__budget_temp_list.append(_budget) |
237 _budget_file = fiebdc.Read() | 253 _budget_file = fiebdc.Read() |
238 _read_method = _budget_file.readFile | 254 _read_method = _budget_file.readFile |
244 | 260 |
245 def _menuitemImportPriceDatabase(self, widget): | 261 def _menuitemImportPriceDatabase(self, widget): |
246 """def _menuitemImportPriceDatabase(self, widget) | 262 """def _menuitemImportPriceDatabase(self, widget) |
247 | 263 |
248 widget: the widget where the event is emitted from | 264 widget: the widget where the event is emitted from |
249 Callback to open a budget file. | 265 Callback to open a price database file. |
250 | 266 |
251 Creates and shows a window to open a price database file. | 267 Creates and shows a file selection window to open a price database file. |
252 """ | 268 """ |
253 _budget = base.Budget() | 269 _budget = base.Budget() |
254 self.__budget_temp_list.append(_budget) | 270 self.__budget_temp_list.append(_budget) |
255 _budget_file = fiebdc.Read() | 271 _budget_file = fiebdc.Read() |
256 _read_method = _budget_file.readFile | 272 _read_method = _budget_file.readFile |
264 """def _menuitemOpenPriceDatabase(self, widget) | 280 """def _menuitemOpenPriceDatabase(self, widget) |
265 | 281 |
266 widget: the widget where the event is emitted from | 282 widget: the widget where the event is emitted from |
267 Callback to open a price database from a durus file. | 283 Callback to open a price database from a durus file. |
268 | 284 |
269 Creates and shows a window to open a durus database | 285 Creates and shows a file selection window to open a durus database |
270 """ | 286 """ |
271 _budget = None | 287 _budget = None |
272 self.__budget_temp_list.append(_budget) | 288 self.__budget_temp_list.append(_budget) |
273 _budget_file = durusdatabase.Read() | 289 _budget_file = durusdatabase.Read() |
274 _read_method = _budget_file.readFile | 290 _read_method = _budget_file.readFile |
284 widget: the widget where the event is emitted from | 300 widget: the widget where the event is emitted from |
285 | 301 |
286 Callback to close a budget file. | 302 Callback to close a budget file. |
287 """ | 303 """ |
288 _page_num = self.__notebook.get_current_page() | 304 _page_num = self.__notebook.get_current_page() |
305 if _page_num != -1: | |
306 _page = self.__page_list[_page_num] | |
307 if isinstance(_page, EmptyPage) and _page.filetype == "durus": | |
308 print _("Cancel reading Durus database has not been implemented.") | |
309 else: | |
310 _page.close() | |
311 | |
312 def removePage(self, page_num): | |
313 """def removePage(self, page_num) | |
314 | |
315 page_num: The number Page to be removed | |
316 | |
317 Removes a page from notebook and page_list. | |
318 Removes the budget from the budget_list if necessary. | |
319 """ | |
320 _page = self.__page_list[page_num] | |
321 if isinstance(_page, Page): | |
322 #not loading budget | |
323 self.__budget_list.pop(page_num) | |
324 self.__page_list.pop(page_num) | |
325 _page.clear() | |
326 self.__notebook.remove_page(page_num) | |
327 | |
328 def _menuitemGoToRoot(self, widget): | |
329 """def _menuitemGoToRoot(self, widget) | |
330 | |
331 widget: the widget where the event is emitted from | |
332 | |
333 Callback to go to root record. | |
334 """ | |
335 _page_num = self.__notebook.get_current_page() | |
289 if _page_num == -1: | 336 if _page_num == -1: |
290 return | 337 return |
291 #_page = self.__page_list.pop(_page_num) | |
292 _page = self.__page_list[_page_num] | 338 _page = self.__page_list[_page_num] |
293 if isinstance(_page, Page): | 339 if isinstance(_page, Page): |
294 #not loading budget | 340 #not loading budget |
295 self.__budget_list.pop(_page_num) | 341 _page.propagateMessageFrom("change_active", (-1,), (0,)) |
296 if isinstance(_page, EmptyPage) and _page.filetype == "durus": | 342 |
297 print _("Cancel reading Durus database has not been implemented.") | 343 def _menuitemGoUp(self, widget): |
298 else: | 344 """def _menuitemGoUp(self, widget) |
299 self.__page_list.pop(_page_num) | 345 |
300 _page.clear() | 346 widget: the widget where the event is emitted from |
301 self.__notebook.remove_page(_page_num) | 347 |
348 Callback to go to up record. | |
349 """ | |
350 _page_num = self.__notebook.get_current_page() | |
351 if _page_num != -1: | |
352 _page = self.__page_list[_page_num] | |
353 if isinstance(_page, Page): | |
354 #not loading budget | |
355 _active_path = _page.activePathRecord | |
356 if len(_active_path) > 1 and _active_path[-1] > 0: | |
357 _budget = self.__budget_list[_page_num] | |
358 _up_path = _active_path[:-1] + (_active_path[-1] - 1,) | |
359 if _budget.hasPath(_up_path): | |
360 _page.propagateMessageFrom("change_active", (-1,), | |
361 _up_path) | |
362 | |
363 def _menuitemGoDown(self, widget): | |
364 """def _menuitemGoToDown(self, widget) | |
365 | |
366 widget: the widget where the event is emitted from | |
367 | |
368 Callback to go to down record. | |
369 """ | |
370 _page_num = self.__notebook.get_current_page() | |
371 if _page_num != -1: | |
372 _page = self.__page_list[_page_num] | |
373 if isinstance(_page, Page): | |
374 #not loading budget | |
375 _active_path = _page.activePathRecord | |
376 if len(_active_path) > 1: | |
377 _budget = self.__budget_list[_page_num] | |
378 _up_path = _active_path[:-1] + (_active_path[-1] + 1,) | |
379 if _budget.hasPath(_up_path): | |
380 _page.propagateMessageFrom("change_active", (-1,), | |
381 _up_path) | |
382 | |
383 def _menuitemGoPrevious(self, widget): | |
384 """def _menuitemGoPrevious(self, widget) | |
385 | |
386 widget: the widget where the event is emitted from | |
387 | |
388 Callback to go to previous record. | |
389 """ | |
390 _page_num = self.__notebook.get_current_page() | |
391 if _page_num != -1: | |
392 _page = self.__page_list[_page_num] | |
393 if isinstance(_page, Page): | |
394 #not loading budget | |
395 _previous_path = _page.previousPathRecord | |
396 if _previous_path is not None: | |
397 _budget = self.__budget_list[_page_num] | |
398 if _budget.hasPath(_previous_path): | |
399 _page.propagateMessageFrom("change_active", (-1,), | |
400 _previous_path) | |
401 | |
402 def _menuitemGoPosterior(self, widget): | |
403 """def _menuitemPosterior(self, widget) | |
404 | |
405 widget: the widget where the event is emitted from | |
406 | |
407 Callback to go to posterior record. | |
408 """ | |
409 _page_num = self.__notebook.get_current_page() | |
410 if _page_num != -1: | |
411 _page = self.__page_list[_page_num] | |
412 if isinstance(_page, Page): | |
413 #not loading budget | |
414 _posterior_path = _page.posteriorPathRecord | |
415 if _posterior_path is not None: | |
416 _budget = self.__budget_list[_page_num] | |
417 if _budget.hasPath(_posterior_path): | |
418 _page.propagateMessageFrom("change_active", (-1,), | |
419 _posterior_path) | |
302 | 420 |
303 def _delete_event(self, widget, event): | 421 def _delete_event(self, widget, event): |
304 """_delete_event(self, widget, event) | 422 """_delete_event(self, widget, event) |
305 | 423 |
306 widget: the widget where the event is emitted from | 424 widget: the widget where the event is emitted from |
326 The window is closed and the GTK+ event processing loop is ended. | 444 The window is closed and the GTK+ event processing loop is ended. |
327 """ | 445 """ |
328 gtk.main_quit() | 446 gtk.main_quit() |
329 | 447 |
330 def getNotebook(self): | 448 def getNotebook(self): |
449 """def getNotebook(self) | |
450 | |
451 Return the notebook widget | |
452 """ | |
331 return self.__notebook | 453 return self.__notebook |
454 | |
332 def getPageList(self): | 455 def getPageList(self): |
456 """def getPageList(self) | |
457 | |
458 Return the page list | |
459 """ | |
333 return self.__page_list | 460 return self.__page_list |
461 | |
334 def getBudgetList(self): | 462 def getBudgetList(self): |
463 """def getBudgetList(self) | |
464 | |
465 Return the budget list | |
466 """ | |
335 return self.__budget_list | 467 return self.__budget_list |
336 | 468 |
337 class EmptyPage(object): | 469 class EmptyPage(object): |
338 """ | 470 """gui.EmptyPage: |
471 | |
472 Description: | |
473 It creates and shows a page in the notebook while a budget is loaded. | |
474 The page show the pyarq logo, loading time and a progress bar. | |
475 Constructor: | |
476 gui.EmptyPage(self, mainWindow, readFileMethod, budget, filename, | |
477 cancelMethod, filetype): | |
478 Ancestry: | |
479 +-- object | |
480 +-- EmptyPage | |
481 Atributes: | |
482 __mainWindow: gui.Mainwindow object | |
483 __readFileMethod: Method to read the selected file | |
484 __budget: base.Budget object | |
485 __filename: "file" | |
486 __cancelMethod: Method to cancel the read method | |
487 __filetype: "budget", "database" or "durus" | |
488 __children: the read thread | |
489 __progress: 0 to 1 progress | |
490 __widget: main widget, a gtk.VBox object | |
491 __main_item: None | |
492 __throbber: a gtk.Image | |
493 __animationThobber: a gtk.gdk.PixbufAnimation | |
494 __quietThobber: a pixbuf | |
495 __budget_icon: a gtk.gdk.pixbuf | |
496 __title: a gtk.HBox | |
497 __statusbar: a gtk.Statusbar | |
498 __statuscontext: the statusbar context | |
499 __progress_bar: a gtk.ProgressBar | |
500 | |
501 Methods: | |
502 __init__ | |
503 run | |
504 progress | |
505 stopLoading | |
506 _launchChildren | |
507 _launchTimeout | |
508 _updateProgressBar | |
509 _updateLabel | |
510 _autoClose | |
511 threadFinishedSignal | |
512 threadCanceled | |
513 close | |
514 clear | |
515 getWidget | |
516 getTitle | |
517 getFiletype | |
339 """ | 518 """ |
340 def __init__(self, mainWindow, readFileMethod, budget, filename, | 519 def __init__(self, mainWindow, readFileMethod, budget, filename, |
341 cancelMethod, filetype): | 520 cancelMethod, filetype): |
342 """def __init__(self, mainWindow, readFileMethod, budget, filename, | 521 """def __init__(self, mainWindow, readFileMethod, budget, filename, |
343 cancelMethod, filetype) | 522 cancelMethod, filetype) |
344 | 523 |
524 mainWindow: gui.Mainwindow object | |
525 readFileMethod: Method to read the selected file | |
526 budget: base.Budget object | |
527 filename: "file" | |
528 cancelMethod: Method to cancel the read method | |
529 filetype: "budget", "database" or "durus" | |
345 """ | 530 """ |
346 self.__mainWindow = mainWindow | 531 self.__mainWindow = mainWindow |
347 self.__readFileMethod = readFileMethod | 532 self.__readFileMethod = readFileMethod |
348 self.__budget = budget | 533 self.__budget = budget |
349 self.__filename = filename | 534 self.__filename = filename |
492 This method is called from thread when it is finished | 677 This method is called from thread when it is finished |
493 """ | 678 """ |
494 self.__budget = budget | 679 self.__budget = budget |
495 self.__children = None | 680 self.__children = None |
496 self.stopLoading() | 681 self.stopLoading() |
497 _page = Page(self.__budget) | 682 _page = Page(self.__mainWindow, self.__budget) |
498 _children = self.__widget.get_children() | 683 _children = self.__widget.get_children() |
499 for _child in _children: | 684 for _child in _children: |
500 self.__widget.remove(_child) | 685 self.__widget.remove(_child) |
501 self.__widget.pack_start(_page.widget, True, True, 0) | 686 self.__widget.pack_start(_page.widget, True, True, 0) |
502 _noteBook = self.__mainWindow.getNotebook() | 687 _noteBook = self.__mainWindow.getNotebook() |
510 This method is called from thread when is canceled | 695 This method is called from thread when is canceled |
511 TODO: it must called threadFinished or somethig | 696 TODO: it must called threadFinished or somethig |
512 """ | 697 """ |
513 self.__children = None | 698 self.__children = None |
514 self.stopLoading() | 699 self.stopLoading() |
515 | 700 _page_num = self.__mainWindow.getNotebook().page_num(self.widget) |
701 self.__mainWindow.removePage(_page_num) | |
702 def close(self): | |
703 """def close(self) | |
704 | |
705 Clos page canceling children | |
706 """ | |
707 self.__children.cancel() | |
516 def clear(self): | 708 def clear(self): |
517 """def clear(self) | 709 """def clear(self) |
518 | 710 |
519 Cancel thread | 711 clear vars |
520 """ | 712 """ |
521 self.__children.cancel() | 713 pass |
522 | 714 |
523 def getWidget(self): | 715 def getWidget(self): |
524 """def getWidget(self) | 716 """def getWidget(self) |
525 | 717 |
526 Return de main widget to show in the page | 718 Return de main widget to show in the page |
553 Description: | 745 Description: |
554 It creates and shows a page in the notebook from a budget object. | 746 It creates and shows a page in the notebook from a budget object. |
555 The page can show the budget information in several panes ordered | 747 The page can show the budget information in several panes ordered |
556 according to "panes_list" information. | 748 according to "panes_list" information. |
557 Constructor: | 749 Constructor: |
558 gui.Page(budget, active_code=None): | 750 gui.Page(mainWindow, budget, active_code=None) |
559 budget: budget to be showed in this page (base.Budget object) | 751 mainwindow: MainWindow object |
560 active_code: the code of the active record | 752 budget: base.Budget object |
561 Returns the newly created Page instance | 753 active_code: Active record code |
562 Ancestry: | 754 Ancestry: |
563 +-- object | 755 +-- object |
564 +-- Page | 756 +-- Page |
565 Atributes: | 757 Atributes: |
758 "widget": Read. Notebook page Widget. (a gtk.VBox instance) | |
566 "budget": Read-Write. Budget to show in the page. (base.obra object) | 759 "budget": Read-Write. Budget to show in the page. (base.obra object) |
567 "panes_list": Read. info list for create the panes | 760 "panes_list": Read. info list for create the panes |
568 ej: [ "v", pane1, pane2 ] , [ "h", pane1, pane2 ] | 761 ej: [ "v", pane1, pane2 ] , [ "h", pane1, pane2 ] |
569 [ "v", [ "h", pane1, pane2 ], [ "h", pane1, pane2 ] ] | 762 [ "v", [ "h", pane1, pane2 ], [ "h", pane1, pane2 ] ] |
570 pane types: | 763 pane types: |
571 * "DecompositionList": its creates a "DecompositionList" object | 764 * "DecompositionList": its creates a "DecompositionList" object |
572 * "RecordDescription" : its creates a "Description" objetc | 765 * "RecordDescription" : its creates a "Description" objetc |
573 * "Measure": its creates a "Measure" objetc | 766 * "Measure": its creates a "Measure" objetc |
574 * "FileView": its creates a "FileView" objet | 767 * "FileView": its creates a "FileView" objet |
575 * "CompanyView": its creates a "CompanyView" object | 768 * "CompanyView": its creates a "CompanyView" object |
576 "widget": Read. Notebook page Widget. (a gtk.VBox instance) | |
577 "title": Read. Notebook page title (gtk.Label object) | 769 "title": Read. Notebook page title (gtk.Label object) |
578 "__active_path_record": The active path record | 770 "activePathRecord": Read. The active path record |
579 "__main_item": main item in the page, can be a View object or a Paned | 771 "previousPathRecord": Read. The previous path record |
580 object | 772 "posteriorPathRecord" Read. The posterior path record |
581 Methods: | 773 Methods: |
582 __init__(self, budget=None, active_code=None) | 774 propagateMessageFrom |
583 propagateMessageFrom(self, message, path, arg=None) | 775 sendMessageTo |
584 sendMessageTo(self, pane, message, path, arg=None) | 776 close |
585 clear(self) | 777 clear |
586 getItem(self,path) | 778 getItem |
587 setMainItem(self, item) | |
588 itemsFactory(self, list_paned, path=(0,)) | |
589 setActivePathRecord(self, path_record) | |
590 getTitle(self) | |
591 getWidget(self) | |
592 setBudget(self, budget) | |
593 getBudget(self) | |
594 getPanesList(self) | |
595 """ | 779 """ |
596 # TODO: * The panes can be ordered as the user wishes | 780 # TODO: * The panes can be ordered as the user wishes |
597 # TODO: * Panes in windows | 781 # TODO: * Panes in windows |
598 # TODO: * pane types | 782 # TODO: * pane types |
599 # TODO: * General budget properties (is better a dialog?) | 783 # TODO: * General budget properties (is better a dialog?) |
600 | 784 |
601 def __init__(self, budget, path_record=(0,)): | 785 def __init__(self, mainWindow, budget, path_record=(0,)): |
602 """def __init__(self, budget=None, active_code=None) | 786 """def __init__(self, budget=None, active_code=None) |
603 | 787 |
788 mainWindow: MainWindow object | |
604 budget: "base.Budget" object | 789 budget: "base.Budget" object |
605 active_code: the code of the active record | 790 path_record: the active path record |
606 Sets the atributes | |
607 * __panes_list: info to create the panes | |
608 * budget (base.Budget object) | |
609 * active_code | |
610 """ | 791 """ |
611 #TODO: __panes_list should come from config file... | 792 #TODO: __panes_list should come from config file... |
793 self.__mainWindow = mainWindow | |
612 self.__widget = gtk.VBox() | 794 self.__widget = gtk.VBox() |
613 self.__panes_list = [ "v", "DecompositionList", [ "v", "Measure", | 795 self.__panes_list = [ "v", "DecompositionList", [ "v", "Measure", |
614 "RecordDescription" ]] | 796 "RecordDescription" ]] |
615 self.__main_item = None | 797 self.__main_item = None |
798 self.__active_path_record = () | |
799 self.__history_back = [] | |
800 self.__history_forward = [] | |
616 self.setBudget(budget) | 801 self.setBudget(budget) |
617 self.setActivePathRecord(path_record) | 802 self._setActivePathRecord(path_record) |
618 self.__widget.show() | 803 self.__widget.show() |
619 | 804 |
620 def propagateMessageFrom(self, message, path, arg=None): | 805 def propagateMessageFrom(self, message, pane_path, arg=None): |
621 """def propagateMessageFrom(self, message, path, arg=None) | 806 """def propagateMessageFrom(self, message, pane_path, arg=None) |
622 | 807 |
623 message: string message | 808 message: string message |
624 path: tuple that represents the pane path which emits the message | 809 * "change_active": change active code |
810 * "autoclose" | |
811 * "split h" | |
812 * "split v" | |
813 pane_path: tuple that represents the pane path which emits the message | |
625 arg: arguments for the message | 814 arg: arguments for the message |
626 if message is "change_active" arg is the path record | 815 if message is "change_active" arg is the path record |
627 | 816 |
628 The panes are connectted to this method to send messages to other panes | 817 The panes are connectted to this method to send messages to other panes |
629 """ | 818 """ |
630 _budget = self.__budget | 819 _budget = self.__budget |
631 if message == "change_active" and _budget.hasPath(arg): | 820 if message == "change_active" and _budget.hasPath(arg): |
632 self.sendMessageTo(self.__main_item, message, path, arg) | 821 self.sendMessageTo(self.__main_item, message, pane_path, arg) |
822 self._setActivePathRecord(arg) | |
633 elif message == "autoclose": | 823 elif message == "autoclose": |
634 self._closeItem(path) | 824 self._closeItem(pane_path) |
635 elif message == "split h": | 825 elif message == "split h": |
636 self._splitItem(path, "h") | 826 self._splitItem(pane_path, "h") |
637 elif message == "split v": | 827 elif message == "split v": |
638 self._splitItem(path, "v") | 828 self._splitItem(pane_path, "v") |
639 | 829 |
640 def sendMessageTo(self, pane, message, path, arg=None): | 830 def sendMessageTo(self, pane, message, pane_path, arg=None): |
641 """def sendMessageTo(self, pane,message, path, arg=None) | 831 """def sendMessageTo(self, pane, message, pane_path, arg=None) |
642 pane: the receiver pane | 832 pane: the receiver pane |
643 message: string message | 833 message: string message |
644 path: tuple that represents the pane path which emits the message | 834 pane_path: tuple that represents the pane pane_path which emits the message |
645 arg: arguments for the message | 835 arg: arguments for the message |
646 | 836 |
647 Sends a message to a pane | 837 Sends a message to a pane |
648 """ | 838 """ |
649 if not pane.path == path: | 839 if not pane.path == pane_path: |
650 pane.runMessage(message, path, arg) | 840 pane.runMessage(message, pane_path, arg) |
841 | |
842 def close(self): | |
843 """def close(self) | |
844 | |
845 Close Page | |
846 """ | |
847 _page_list = self.__mainWindow.getPageList() | |
848 if self in _page_list: | |
849 _page_num = _page_list.index(self) | |
850 self.__mainWindow.removePage(_page_num) | |
851 else: | |
852 raise IndexError, _("The page is not in the page list") | |
651 | 853 |
652 def clear(self): | 854 def clear(self): |
653 """def clear(self) | 855 """def clear(self) |
654 | 856 |
655 Clear atributes | 857 Clear atributes |
661 del self.__widget | 863 del self.__widget |
662 del self.__title | 864 del self.__title |
663 del self.__active_path_record | 865 del self.__active_path_record |
664 del self.__main_item | 866 del self.__main_item |
665 | 867 |
666 def getItem(self,path): | 868 def getItem(self,pane_path): |
667 """def getItem(self, path | 869 """def getItem(self, pane_path) |
668 | 870 |
669 Return the item whith the path "path", it can return a Paned instance | 871 Return the item whith the path "pane_path", it can return a Paned |
670 or a View instance | 872 instance or a View instance |
671 """ | 873 """ |
672 _item = self.__main_item | 874 _item = self.__main_item |
673 if len(path) == 1: | 875 if len(pane_path) == 1: |
674 return _item | 876 return _item |
675 else: | 877 else: |
676 return _item.getItem(path[1:]) | 878 return _item.getItem(pane_path[1:]) |
677 | 879 |
678 def setMainItem(self, item): | 880 def _setMainItem(self, item): |
679 """setMainItem(self,item) | 881 """_setMainItem(self,item) |
680 | 882 |
681 Sets a new main item in the page | 883 Sets a new main item in the page |
682 """ | 884 """ |
683 if not self.__main_item is None: | 885 if not self.__main_item is None: |
684 _old_main_widget = self.__main_item.widget | 886 _old_main_widget = self.__main_item.widget |
686 self.__main_item = item | 888 self.__main_item = item |
687 _main_widget = self.__main_item.widget | 889 _main_widget = self.__main_item.widget |
688 _main_widget.show() | 890 _main_widget.show() |
689 self.__widget.pack_start(_main_widget, True, True, 0) | 891 self.__widget.pack_start(_main_widget, True, True, 0) |
690 | 892 |
691 def _splitItem(self, path, orientation): | 893 def _splitItem(self, pane_path, orientation): |
692 """_splitItem(self, path, orientation) | 894 """_splitItem(self, pane_path, orientation) |
693 | 895 |
694 Splits the item that is identifies by the path and the orientation | 896 Splits the item that is identifies by the pane_path and the orientation |
695 """ | 897 """ |
696 _item = self.getItem(path) | 898 _item = self.getItem(pane_path) |
697 _parent = self.getItem(path[:-1]) | 899 _parent = self.getItem(pane_path[:-1]) |
698 _item.setPath(path+ (0,)) | 900 _item.setPath(pane_path+ (0,)) |
699 _item_clone0 = _item.getClone(path + (0,)) | 901 _item_clone0 = _item.getClone(pane_path + (0,)) |
700 _item_clone1 = _item.getClone(path + (1,)) | 902 _item_clone1 = _item.getClone(pane_path + (1,)) |
701 _paned = Paned(orientation, path, _item_clone0, _item_clone1) | 903 _paned = Paned(orientation, pane_path, _item_clone0, _item_clone1) |
702 if len(path) > 1: | 904 if len(pane_path) > 1: |
703 _parent.setItem(path[-1], [_paned]) | 905 _parent.setItem(pane_path[-1], [_paned]) |
704 else: | 906 else: |
705 self.setMainItem(_paned) | 907 self._setMainItem(_paned) |
706 | 908 |
707 def _closeItem(self, path): | 909 def _closeItem(self, pane_path): |
708 """_closeItem(self, path) | 910 """_closeItem(self, pane_path) |
709 | 911 |
710 Closes the item that is identifies by the path | 912 Closes the item that is identifies by the pane_path |
711 """ | 913 """ |
712 _item = self.getItem(path) | 914 _item = self.getItem(pane_path) |
713 if len(path) > 1: | 915 if len(pane_path) > 1: |
714 # There are more than one item | 916 # There are more than one item |
715 _parent = self.getItem(path[:-1]) | 917 _parent = self.getItem(pane_path[:-1]) |
716 _brothers = [ _brother for _brother in _parent] | 918 _brothers = [ _brother for _brother in _parent] |
717 _brothers.remove(_item) | 919 _brothers.remove(_item) |
718 _brother = _brothers[0] | 920 _brother = _brothers[0] |
719 | 921 |
720 _parent.widget.remove(_brother.widget) | 922 _parent.widget.remove(_brother.widget) |
721 _brother.path = path[:-1] | 923 _brother.pane_path = pane_path[:-1] |
722 if len(path) > 2: | 924 if len(pane_path) > 2: |
723 _grandparent = self.getItem(path[:-2]) | 925 _grandparent = self.getItem(pane_path[:-2]) |
724 _grandparent.setItem(path[-2], [_brother]) | 926 _grandparent.setItem(pane_path[-2], [_brother]) |
725 _parent.widget.destroy() | 927 _parent.widget.destroy() |
726 _parent.clear() | 928 _parent.clear() |
727 _item.clear() | 929 _item.clear() |
728 else: | 930 else: |
729 _grandparent = self | 931 _grandparent = self |
730 _grandparent.setMainItem(_brother) | 932 _grandparent._setMainItem(_brother) |
731 _parent.widget.destroy() | 933 _parent.widget.destroy() |
732 _parent.clear() | 934 _parent.clear() |
733 _item.clear() | 935 _item.clear() |
734 else: | 936 else: |
735 # Thre is only one item in the page, it can not be closed | 937 # Thre is only one item in the page, it can not be closed |
736 pass | 938 pass |
737 | 939 |
738 def itemsFactory(self, list_paned, path=(0,)): | 940 def _itemsFactory(self, list_paned, pane_path=(0,)): |
739 """def itemsFactory(self, list_paned, path(0,)) | 941 """def _itemsFactory(self, list_paned, pane_path(0,)) |
740 | 942 |
741 list_paned: list in "__panes_list" format | 943 list_paned: list in "__panes_list" format |
742 [ "v" or "h", panel1_type, panel2_type] | 944 [ "v" or "h", panel1_type, panel2_type] |
743 which contains the info for create the widgets. | 945 which contains the info for create the widgets. |
744 panel types: | 946 panel types: |
746 * "RecordDescription" | 948 * "RecordDescription" |
747 * "Measure" | 949 * "Measure" |
748 * "Sheet of Conditions" | 950 * "Sheet of Conditions" |
749 * "FileView" | 951 * "FileView" |
750 * "CompanyView" | 952 * "CompanyView" |
751 path: tuple that represents the item path in the page | 953 pane_path: tuple that represents the item path in the page |
752 | 954 |
753 Creates the items and widgets and returns the main item | 955 Creates the items and widgets and returns the main item |
754 """ | 956 """ |
755 if not isinstance(list_paned , list): | 957 if not isinstance(list_paned , list): |
756 raise ValueError, _("The value must be a list") | 958 raise ValueError, _("The value must be a list") |
759 raise ValueError, _("Incorrect len") | 961 raise ValueError, _("Incorrect len") |
760 if not isinstance(list_paned[1],list): | 962 if not isinstance(list_paned[1],list): |
761 list_paned[1] = [list_paned[1]] | 963 list_paned[1] = [list_paned[1]] |
762 if not isinstance(list_paned[2],list): | 964 if not isinstance(list_paned[2],list): |
763 list_paned[2] = [list_paned[2]] | 965 list_paned[2] = [list_paned[2]] |
764 _item1 = self.itemsFactory(list_paned[1],path + (0,)) | 966 _item1 = self._itemsFactory(list_paned[1],pane_path + (0,)) |
765 _item2 = self.itemsFactory(list_paned[2],path + (1,)) | 967 _item2 = self._itemsFactory(list_paned[2],pane_path + (1,)) |
766 _item = Paned(list_paned[0], path, _item1, _item2) | 968 _item = Paned(list_paned[0], pane_path, _item1, _item2) |
767 elif list_paned[0] == "DecompositionList": | 969 elif list_paned[0] == "DecompositionList": |
768 _item = View( "DecompositionList", self.__budget, | 970 _item = View( "DecompositionList", self.__budget, |
769 weakref.ref(self), path, self.__active_path_record) | 971 weakref.ref(self), pane_path, self.__active_path_record) |
770 elif list_paned[0] == "RecordDescription": | 972 elif list_paned[0] == "RecordDescription": |
771 _item = View( "RecordDescription", self.__budget,weakref.ref(self), | 973 _item = View( "RecordDescription", self.__budget,weakref.ref(self), |
772 path, self.__active_path_record) | 974 pane_path, self.__active_path_record) |
773 elif list_paned[0] == "Measure": | 975 elif list_paned[0] == "Measure": |
774 _item = View( "Measure", self.__budget, weakref.ref(self), path, | 976 _item = View( "Measure", self.__budget, weakref.ref(self), pane_path, |
775 self.__active_path_record) | 977 self.__active_path_record) |
776 elif list_paned[0] == "Sheet of Conditions": | 978 elif list_paned[0] == "Sheet of Conditions": |
777 _item = Sheet(sef.__budget, weakref.ref(self), path, | 979 _item = Sheet(sef.__budget, weakref.ref(self), pane_path, |
778 self.__active_path_record) | 980 self.__active_path_record) |
779 elif list_paned[0] == "FileView": | 981 elif list_paned[0] == "FileView": |
780 _item = FileView(sef.__budget, weakref.ref(self), path, | 982 _item = FileView(sef.__budget, weakref.ref(self), pane_path, |
781 self.__active_path_record) | 983 self.__active_path_record) |
782 elif list_paned[0] == "CompanyView": | 984 elif list_paned[0] == "CompanyView": |
783 _item = CompanyView(sef.__budget, weakref.ref(self), path, | 985 _item = CompanyView(sef.__budget, weakref.ref(self), pane_path, |
784 self.__active_path_record) | 986 self.__active_path_record) |
785 else: | 987 else: |
786 _item = None | 988 _item = None |
787 raise ValueError, utils.mapping(_("Incorrect item $1"), | 989 raise ValueError, utils.mapping(_("Incorrect item $1"), |
788 (str(list_paned[0]),)) | 990 (str(list_paned[0]),)) |
789 return _item | 991 return _item |
790 | 992 |
791 def setActivePathRecord(self, path_record): | 993 def _setActivePathRecord(self, path_record): |
792 """def setActivePathRecord(self, path_record) | 994 """def _setActivePathRecord(self, path_record) |
793 | 995 |
794 path_record: the active record path | 996 path_record: the active record path |
795 | 997 |
796 Sets the active record path | 998 Sets the active record path |
797 """ | 999 """ |
798 if self.__budget.hasPath(path_record): | 1000 if path_record != self.__active_path_record: |
799 self.__active_path_record = path_record | 1001 if self.__budget.hasPath(path_record): |
1002 self.__active_path_record = path_record | |
1003 self._appendHistory(path_record) | |
1004 else: | |
1005 raise ValueError, utils.mapping(_("The budget does not have "\ | |
1006 "the path record: $1"), (str(path_record),)) | |
1007 def _appendHistory(self, path): | |
1008 """def _appendHistory(self, path)) | |
1009 | |
1010 path: the old active path record | |
1011 | |
1012 Sets the old active path record | |
1013 """ | |
1014 if len(self.__history_back) > 1 and self.__history_back[-2] == path: | |
1015 # append forward history and pop back history | |
1016 _path = self.__history_back.pop() | |
1017 self.__history_forward.append(_path) | |
1018 if len(self.__history_forward) > 1000: | |
1019 self.__history_forward.pop(0) | |
800 else: | 1020 else: |
801 raise ValueError, utils.mapping(_("The budget does not have the "\ | 1021 # append back history and pop or delete forward history |
802 "path record: $1"), (str(path_record),)) | 1022 if len(self.__history_forward) > 1 and \ |
1023 self.__history_forward[-1] == path: | |
1024 self.__history_forward.pop() | |
1025 else: | |
1026 self.__history_forward[:] = [] | |
1027 self.__history_back.append(path) | |
1028 if len(self.__history_back) > 1000: | |
1029 self.__history_back.pop(0) | |
1030 | |
1031 def getActivePathRecord(self): | |
1032 """def getActivePathRecord(self) | |
1033 | |
1034 Return the Active Path Record | |
1035 """ | |
1036 return self.__active_path_record | |
1037 | |
1038 def getPreviousPathRecord(self): | |
1039 """def getPreviousPathRecord(self) | |
1040 | |
1041 Return the Previous Path Record | |
1042 """ | |
1043 if len(self.__history_back) > 1: | |
1044 return self.__history_back[-2] | |
1045 else: | |
1046 return None | |
1047 | |
1048 def getPosteriorPathRecord(self): | |
1049 """def getPosteriorPathRecord(self) | |
1050 | |
1051 Return the Posterior Path Record | |
1052 """ | |
1053 if len(self.__history_forward) > 0: | |
1054 return self.__history_forward[-1] | |
1055 else: | |
1056 return None | |
803 | 1057 |
804 def getTitle(self): | 1058 def getTitle(self): |
805 """def getTtle(self) | 1059 """def getTitle(self) |
806 | 1060 |
807 Return the title of the page, a gtk.Label objetc | 1061 Return the page title, a gtk.Label objetc |
808 """ | 1062 """ |
809 return self.__title | 1063 return self.__title |
810 | 1064 |
811 def getWidget(self): | 1065 def getWidget(self): |
812 """def getWidget(self) | 1066 """def getWidget(self) |
826 """ | 1080 """ |
827 if budget is None: | 1081 if budget is None: |
828 self.clear() | 1082 self.clear() |
829 return | 1083 return |
830 self.__budget = budget | 1084 self.__budget = budget |
831 self.setActivePathRecord((0,)) | 1085 self._setActivePathRecord((0,)) |
832 ## Todo: change page title | 1086 # Todo: change page title |
833 self.__title = gtk.Label(self.__budget.getCode( | 1087 self.__title = gtk.Label(self.__budget.getCode( |
834 self.__active_path_record)) | 1088 self.__active_path_record)) |
835 _panes_list = self.__panes_list | 1089 _panes_list = self.__panes_list |
836 self.__main_item = self.itemsFactory(_panes_list) | 1090 self.__main_item = self._itemsFactory(_panes_list) |
837 _main_widget = self.__main_item.getWidget() | 1091 _main_widget = self.__main_item.getWidget() |
838 _main_widget.show() | 1092 _main_widget.show() |
839 self.__widget.pack_start(_main_widget, True, True, 0) | 1093 self.__widget.pack_start(_main_widget, True, True, 0) |
840 | 1094 |
841 def getBudget(self): | 1095 def getBudget(self): |
858 "Main widget showed in the pane") | 1112 "Main widget showed in the pane") |
859 title = property(getTitle, None, None, | 1113 title = property(getTitle, None, None, |
860 "Page Title") | 1114 "Page Title") |
861 panes_list = property(getPanesList, None, None, | 1115 panes_list = property(getPanesList, None, None, |
862 "Info list for create the panes") | 1116 "Info list for create the panes") |
1117 activePathRecord = property(getActivePathRecord, None, None, | |
1118 "Active Path Record") | |
1119 previousPathRecord = property(getPreviousPathRecord, None, None, | |
1120 "Previous Active Path Record") | |
1121 posteriorPathRecord = property(getPosteriorPathRecord, None, None, | |
1122 "Posterior Active Path Record") | |
863 | 1123 |
864 class View(object): | 1124 class View(object): |
865 """gui.View: | 1125 """gui.View: |
866 | 1126 |
867 Description: | 1127 Description: |
4398 """def getWidget(self) | 4658 """def getWidget(self) |
4399 | 4659 |
4400 return the main widget (gtk.ScrolledWindow) | 4660 return the main widget (gtk.ScrolledWindow) |
4401 """ | 4661 """ |
4402 return self.__widget | 4662 return self.__widget |
4663 widget = property(getWidget, None, None, | |
4664 "main widget") |