Mercurial > pyarq-presupuestos
comparison Gtk/gui.py @ 23:65e7ae0d0e63
GTK2 to GTK3
author | Miguel Ángel Bárcena Rodríguez <miguelangel@obraencurso.es> |
---|---|
date | Thu, 02 May 2019 16:31:17 +0200 |
parents | 7bd4ca56607d |
children | 189f8274aecd |
comparison
equal
deleted
inserted
replaced
22:7bd4ca56607d | 23:65e7ae0d0e63 |
---|---|
1 # -*- coding: utf-8 -*- | 1 # -*- coding: utf-8 -*- |
2 ## File gui.py | 2 ## File gui.py |
3 ## This file is part of pyArq-Presupuestos. | 3 ## This file is part of pyArq-Presupuestos. |
4 ## | 4 ## |
5 ## Copyright (C) 2010-2014 Miguel Ángel Bárcena Rodríguez | 5 ## Copyright (C) 2010-2019 Miguel Ángel Bárcena Rodríguez |
6 ## <miguelangel@obraencurso.es> | 6 ## <miguelangel@obraencurso.es> |
7 ## | 7 ## |
8 ## pyArq-Presupuestos is free software: you can redistribute it and/or modify | 8 ## pyArq-Presupuestos is free software: you can redistribute it and/or modify |
9 ## it under the terms of the GNU General Public License as published by | 9 ## it under the terms of the GNU General Public License as published by |
10 ## the Free Software Foundation, either version 3 of the License, or | 10 ## the Free Software Foundation, either version 3 of the License, or |
24 The MainWindow class contain the toplevel WINDOW, | 24 The MainWindow class contain the toplevel WINDOW, |
25 this window have a notebook with a page for each budget. | 25 this window have a notebook with a page for each budget. |
26 Each budget or notebook page is showed by the Page class, this class contain | 26 Each budget or notebook page is showed by the Page class, this class contain |
27 the main widget showed in a page notebook. | 27 the main widget showed in a page notebook. |
28 The main widget can show the budget information in several panes. | 28 The main widget can show the budget information in several panes. |
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 the measure information of a record | 34 The Measure class show the measure information of a record |
35 The Sheet class class show the sheet of condition information of a record | 35 The Sheet class class show the sheet of condition information of a record |
36 | 36 |
40 one of the panes the active code change in the others. | 40 one of the panes the active code change in the others. |
41 | 41 |
42 """ | 42 """ |
43 # TODO: Config file | 43 # TODO: Config file |
44 | 44 |
45 # Modules | |
46 | |
47 # python 2/3 compatibility | |
48 from __future__ import absolute_import, division, print_function, unicode_literals | |
49 | |
45 # Standar Modules | 50 # Standar Modules |
51 import sys | |
46 import os | 52 import os |
47 import time | 53 import time |
48 import pygtk | 54 |
49 pygtk.require('2.0') | 55 # gui |
50 import gtk | 56 import gi |
51 import gobject | 57 gi.require_version('Gtk', '3.0') |
58 from gi.repository import Gtk | |
59 from gi.repository import GdkPixbuf | |
60 from gi.repository import Gio | |
61 from gi.repository import GLib | |
62 from gi.repository import Gdk | |
63 from gi.repository import Pango | |
64 | |
52 import weakref | 65 import weakref |
53 | 66 |
54 # pyArq-Presupuestos Modules | 67 # pyArq-Presupuestos Modules |
55 from Gtk import importFiebdc | 68 from Gtk import importFiebdc |
56 from Generic import base | 69 from Generic import base |
57 from Generic import fiebdc | 70 from Generic import fiebdc |
58 #from Generic import durusdatabase | |
59 from Generic import utils | 71 from Generic import utils |
60 from Generic import globalVars | 72 from Generic import globalVars |
61 from Generic import openwith | 73 from Generic import openwith |
62 | 74 |
63 # Load default icon | 75 # Load default icon |
64 if os.path.exists(globalVars.getAppPath("ICON")): | 76 _icons = [ "ICON16", "ICON32","ICON64","ICON128"] |
65 icon = gtk.gdk.pixbuf_new_from_file(globalVars.getAppPath("ICON")) | 77 _pixbufIcons = [] |
66 gtk.window_set_default_icon_list(icon) | 78 for _icon in _icons: |
79 if os.path.exists(globalVars.getAppPath(_icon)): | |
80 _pixbufIcon = GdkPixbuf.Pixbuf.new_from_file(globalVars.getAppPath(_icon)) | |
81 _pixbufIcons.append(_pixbufIcon) | |
82 else: | |
83 print(utils.mapping(_("The icon file does not exist. '$1'"), | |
84 (str(globalVars.getAppPath(_icon)),)) ) | |
85 if len(_pixbufIcons) > 0: | |
86 Gtk.Window.set_default_icon_list(_pixbufIcons) | |
87 | |
67 else: | 88 else: |
68 print utils.mapping(_("The icon file does not exist. '$1'"), | 89 print(utils.mapping(_("The icon file does not exist. '$1'"), |
69 (globalVars.getAppPath("ICON"),)) | 90 (str(globalVars.getAppPath("ICON")),)) ) |
70 | 91 |
71 # Autodetect desktop | 92 # Autodetect desktop |
72 if globalVars.desktop["autodetect"]: | 93 if globalVars.desktop["autodetect"]: |
73 openwith.autodetect_desktop() | 94 openwith.autodetect_desktop() |
74 print utils.mapping(_("pyArq-Presupuestos running on $1"), | 95 print(utils.mapping(_("pyArq-Presupuestos running on $1"), |
75 (globalVars.desktop["desktop"],)) | 96 (globalVars.desktop["desktop"],))) |
76 | 97 |
77 # Add MenutoolButton to Uimanager | 98 |
78 class MenuToolAction(gtk.Action): | 99 class App(Gtk.Application): |
79 __gtype_name__ = "MenuToolAction" | 100 """gui.App: |
80 | 101 |
81 gobject.type_register(MenuToolAction) | 102 Description: |
82 MenuToolAction.set_tool_item_type(gtk.MenuToolButton) | 103 This is the Gtk application base class. |
104 Constructor: | |
105 App() | |
106 Ancestry: | |
107 +-- Gtk.Application https://lazka.github.io/pgi-docs/Gtk-3.0/classes/Application.html | |
108 +-- App | |
109 Atributes: | |
110 Methods: | |
111 do_activate | |
112 do_startup | |
113 do_open | |
114 """ | |
115 | |
116 def __init__(self, *args, **kwargs): | |
117 """__init__() | |
118 | |
119 Sets the application id and application_name. | |
120 """ | |
121 self.filesToOpen = [] | |
122 self._application_id = "es.obraencurso.pyarq.presupuestos" | |
123 super(App, self).__init__(application_id=self._application_id, | |
124 flags=Gio.ApplicationFlags.HANDLES_OPEN, | |
125 **kwargs) | |
126 GLib.set_prgname(self._application_id) | |
127 | |
128 def do_open(self, files, n_files, hint): | |
129 """do_open(files, n_files, hint) | |
130 | |
131 Set the filename list to open. | |
132 """ | |
133 self.filesToOpen = files | |
134 self.activate() | |
135 self.filesToOpen = [] | |
136 return 0 | |
137 | |
138 def do_activate(self): | |
139 """do_activate() | |
140 | |
141 Shows new appplication windows. | |
142 """ | |
143 _mainWindow = MainWindow(self, self.filesToOpen ) | |
144 _mainWindow.window.present_with_time(GLib.get_monotonic_time() / 1000) | |
145 | |
146 def do_startup(self): | |
147 """do_startup() | |
148 | |
149 Sets the app actions. | |
150 """ | |
151 Gtk.Application.do_startup(self) | |
152 # App Actions | |
153 action = Gio.SimpleAction.new("newWindow", None) | |
154 action.connect("activate", self._on_newWindow) | |
155 self.add_action(action) | |
156 | |
157 action = Gio.SimpleAction.new("acell_newWindow", None) | |
158 action.connect("activate", self._on_control_n) | |
159 self.add_action(action) | |
160 | |
161 action = Gio.SimpleAction.new("about", None) | |
162 action.connect("activate", self._on_about) | |
163 self.add_action(action) | |
164 | |
165 action = Gio.SimpleAction.new("quit", None) | |
166 action.connect("activate", self._on_quit) | |
167 self.add_action(action) | |
168 | |
169 action = Gio.SimpleAction.new("acell_quit", None) | |
170 action.connect("activate", self._on_control_q) | |
171 self.add_action(action) | |
172 | |
173 # App menu | |
174 _app_menu = Gio.Menu() | |
175 _section_window = Gio.Menu() | |
176 _section_window.append(_("_New window"), "app.newWindow") | |
177 _section_window.append(_("_Close window"), "win.CloseWindow") | |
178 _app_menu.append_section(None,_section_window) | |
179 self.set_accels_for_action('win.acell_close', ["<Primary>x"]) | |
180 self.set_accels_for_action('app.acell_newWindow', ["<Primary>n"]) | |
181 _section_general = Gio.Menu() | |
182 _section_general.append(_("About") + " " + globalVars.name, "app.about") | |
183 _app_menu.append_section(None,_section_general) | |
184 _section_quit = Gio.Menu() | |
185 _section_quit.append(_("_Quit application"), "app.quit") | |
186 self.set_accels_for_action('app.acell_quit', ["<Primary>q"]) | |
187 _app_menu.append_section(None,_section_quit) | |
188 self.set_app_menu(_app_menu) | |
189 # TODO : from gui config | |
190 win_menu = False | |
191 # Win Menu | |
192 if win_menu: | |
193 _win_menu = Gio.Menu() | |
194 _win_submenu_file = Gio.Menu.new() | |
195 _import_fiebdc = Gio.MenuItem.new(_("_Import Fiebdc"), "win.ImportFiebdc") | |
196 _import_fiebdc.set_icon(Gio.Icon.new_for_string("document-open")) | |
197 _win_submenu_file.append_item(_import_fiebdc) | |
198 | |
199 _close_tab = Gio.MenuItem.new(_("_Close tab"), "win.CloseTab") | |
200 _close_tab.set_icon(Gio.Icon.new_for_string("window-close")) | |
201 _win_submenu_file.append_item(_close_tab) | |
202 | |
203 _win_menu.append_submenu(_("_File"), _win_submenu_file) | |
204 _win_submenu_go = Gio.Menu.new() | |
205 _back = Gio.MenuItem.new(_("_Back"), "win.GoPrevious") | |
206 _back.set_icon(Gio.Icon.new_for_string("go-previous")) | |
207 _win_submenu_go.append_item(_back) | |
208 _forward = Gio.MenuItem.new(_("_Forward"), "win.GoPosterior") | |
209 _forward.set_icon(Gio.Icon.new_for_string("go-next")) | |
210 _win_submenu_go.append_item(_forward) | |
211 _up = Gio.MenuItem.new(_("_Up Item"), "win.GoUp") | |
212 _up.set_icon(Gio.Icon.new_for_string("go-up")) | |
213 _win_submenu_go.append_item(_up) | |
214 _root = Gio.MenuItem.new(_("_Root"), "win.GoToRoot") | |
215 _root.set_icon(Gio.Icon.new_for_string("go-top")) | |
216 _win_submenu_go.append_item(_root) | |
217 _win_menu.append_submenu(_("_Go"), _win_submenu_go) | |
218 self.set_menubar(_win_menu) | |
219 | |
220 def _on_newWindow(self, action, param): | |
221 """on_newWindow(action, param) | |
222 | |
223 Shows new appplication windows. | |
224 """ | |
225 _mainWindow = MainWindow(self, []) | |
226 _mainWindow.window.present_with_time(GLib.get_monotonic_time() / 1000) | |
227 | |
228 def _on_about(self, action, param): | |
229 """_on_about(action, param) | |
230 | |
231 Shows About dialog. | |
232 """ | |
233 _aboutDialog = Gtk.AboutDialog(modal=False) | |
234 _aboutDialog.set_program_name(globalVars.name) | |
235 _aboutDialog.set_copyright(base.copyright) | |
236 _aboutDialog.set_authors(base.authors) | |
237 _aboutDialog.set_version(globalVars.version + globalVars.changeset) | |
238 _aboutDialog.set_website(base.website) | |
239 _aboutDialog.set_website_label(base.website_label) | |
240 _aboutDialog.set_license_type(Gtk.License(3)) | |
241 _aboutDialog.set_comments(base.comments) | |
242 _aboutDialog.connect("response", self._on_close_aboutdialog) | |
243 _aboutDialog.present_with_time(GLib.get_monotonic_time() / 1000) | |
244 | |
245 def _on_close_aboutdialog(self, action, parameter): | |
246 """on_close_aboutdialog(action, param) | |
247 | |
248 Close About dialog. | |
249 """ | |
250 action.destroy() | |
251 | |
252 def _on_control_q(self, action, param): | |
253 """on_control_q(action, param) | |
254 | |
255 Quit app. | |
256 """ | |
257 print("Control q -> Quit app") | |
258 self.quit() | |
259 | |
260 def _on_quit(self, action, param): | |
261 """_on_quit(action, param) | |
262 | |
263 Quit app. | |
264 """ | |
265 self.quit() | |
266 | |
267 def _on_control_n(self, action, param): | |
268 """on_control_n(action, param) | |
269 | |
270 Shows new appplication windows. | |
271 """ | |
272 print("Control n -> New window") | |
273 self._on_newWindow(action, param) | |
83 | 274 |
84 | 275 |
85 class MainWindow(object): | 276 class MainWindow(object): |
86 """gui.MainWindow: | 277 """gui.MainWindow: |
87 | 278 |
88 Description: | 279 Description: |
89 Creates and shows the main window. | 280 Creates and shows the main window. |
90 This is the interface base class. | 281 This is the interface base class. |
91 Constructor: | 282 Constructor: |
92 gui.MainWindow() | 283 MainWindow(app, files) |
93 Ancestry: | 284 Ancestry: |
94 +-- object | 285 +-- object |
95 +-- MainWindow | 286 +-- MainWindow |
96 Atributes: | 287 Atributes: |
288 self.window: Gtk.ApplicationWindow object | |
97 Methods: | 289 Methods: |
98 changeHistorySignal | 290 changeHistorySignal |
99 changeActiveSignal | 291 changeActiveSignal |
100 appendEmptyPage | 292 appendEmptyPage |
101 updatePage | 293 updatePage |
102 closePage | 294 closePage |
103 """ | 295 """ |
104 # TODO:* Can choose open budget in new window | 296 # TODO:* Can choose open budget in new window |
105 # TODO:* Can choose show more than one notebook in the same window or | 297 # TODO:* Can choose show more than one notebook in the same window or |
106 # TODO: can show basedata notebook in a side pane | 298 # TODO: can show basedata notebook in a side pane |
107 __ui = '''<ui> | 299 |
108 <menubar name="MenuBar"> | 300 def __init__(self, app, files): |
109 <menu action="File"> | 301 """__init__(app, files) |
110 <menuitem action="ImportFiebdc"/> | |
111 <menuitem action="Close"/> | |
112 </menu> | |
113 <menu action="View"> | |
114 </menu> | |
115 <menu action="Go"> | |
116 <menuitem action="GoPrevious"/> | |
117 <menuitem action="GoPosterior"/> | |
118 <menuitem action="GoUp"/> | |
119 <menuitem action="GoToRoot"/> | |
120 </menu> | |
121 </menubar> | |
122 <toolbar name="ToolBar"> | |
123 <toolitem action="ImportFiebdc"/> | |
124 <toolitem action="Close"/> | |
125 <separator name="sep1"/> | |
126 <toolitem action="GoPrevMenu"/> | |
127 <toolitem action="GoPostMenu"/> | |
128 <toolitem action="GoUp"/> | |
129 <toolitem action="GoToRoot"/> | |
130 </toolbar> | |
131 </ui>''' | |
132 | |
133 #<menu action="Test"> | |
134 # <menuitem action="ImportFiebdcPriceDatabase"/> | |
135 # <menuitem action="OpenPriceDatabase"/> | |
136 #</menu> | |
137 | |
138 def __init__(self): | |
139 """__init__() | |
140 | 302 |
141 Initialize the atributes self.__page_list without data. | 303 Initialize the atributes self.__page_list without data. |
142 Creates the widgets "window" and "__notebook". | 304 Creates the widgets "window" and "__notebook". |
143 | 305 |
144 self.__window: gtk.Window object | 306 app: Gtk.Application instance |
145 self.__uimanager: gtk.UIManager object | 307 files: Gio.file list from command line |
308 | |
309 self.window: Gtk.ApplicationWindow object | |
146 self.__page_list: List of pages ("Page" object) | 310 self.__page_list: List of pages ("Page" object) |
147 self.__notebook: Notebook widget ("gtk.Notebook" object) | 311 self.__notebook: Notebook widget ("Gtk.Notebook" object) |
148 self.__general_action_group: "General" action group | 312 self.__general_action_group: "General" action group |
149 self.__navigation_action_group: "Navigation" action group | 313 self.__navigation_action_group: "Navigation" action group |
314 self.__navigation_is_enabled: True/False | |
315 self.__goBack_button | |
150 """ | 316 """ |
151 self.__page_list = [] | 317 self.__page_list = [] |
152 # Main window | 318 # Main window |
153 self.__window = gtk.Window(gtk.WINDOW_TOPLEVEL) | 319 self.window = Gtk.ApplicationWindow(application=app) |
154 self.__window.set_default_size(771, 570) | 320 self.window.set_default_size(771, 570) |
155 self.__window.set_title("Presupuestos") | 321 self.window.set_title("Presupuestos") |
156 self.__window.set_border_width(0) | 322 self.window.set_border_width(5) |
157 self.__window.connect("destroy", self._destroy) | 323 self.window.connect("delete_event", self._delete_event) |
158 self.__window.connect("delete_event", self._delete_event) | 324 # HeaderBar |
159 # Vertical box | 325 _hb = Gtk.HeaderBar() |
160 _vbox1 = gtk.VBox(False, 0) | 326 _hb.set_show_close_button(True) |
161 self.__window.add(_vbox1) | 327 _hb.props.title = "Presupuestos" |
328 self.window.set_titlebar(_hb) | |
329 _hb.show() | |
330 # Actions | |
331 # General Actions | |
332 self.__general_action_group = Gio.SimpleActionGroup.new() | |
333 # CloseWindow Action | |
334 _action = Gio.SimpleAction.new("CloseWindow", None) | |
335 _action.connect("activate", self._menuitemClose) | |
336 self.window.add_action(_action) | |
337 self.__general_action_group.insert(_action) | |
338 # CloseWindow from acell Action | |
339 _action = Gio.SimpleAction.new("acell_close", None) | |
340 _action.connect("activate", self._on_control_x) | |
341 self.window.add_action(_action) | |
342 self.__general_action_group.insert(_action) | |
343 # ImportFiebdc Action | |
344 _action = Gio.SimpleAction.new("ImportFiebdc", None) | |
345 _action.connect("activate", self._on_menuitemImportFiebdc) | |
346 self.window.add_action(_action) | |
347 self.__general_action_group.insert(_action) | |
348 # CloseTab action | |
349 self.__closeTab_action = Gio.SimpleAction.new("CloseTab", None) | |
350 self.__closeTab_action.connect("activate", self._on_CloseTab) | |
351 self.window.add_action(self.__closeTab_action) | |
352 self.__general_action_group.insert(self.__closeTab_action) | |
353 # Navigation Actions | |
354 self.__navigation_is_enabled = False | |
355 self.__navigation_action_group = Gio.SimpleActionGroup.new() | |
356 # Go Previous action | |
357 self.__GoPrevious_action = Gio.SimpleAction.new("GoPrevious", None) | |
358 self.__GoPrevious_action.connect("activate", self._menuitemGoPrevious) | |
359 self.window.add_action(self.__GoPrevious_action) | |
360 self.__general_action_group.insert(self.__GoPrevious_action) | |
361 self.__GoPrevious_action.set_enabled(False) | |
362 # Go posterior action | |
363 self.__GoPosterior_action = Gio.SimpleAction.new("GoPosterior", None) | |
364 self.__GoPosterior_action.connect("activate", self._menuitemGoPosterior) | |
365 self.window.add_action(self.__GoPosterior_action) | |
366 self.__general_action_group.insert(self.__GoPosterior_action) | |
367 self.__GoPosterior_action.set_enabled(False) | |
368 # Go Up action | |
369 self.__GoUp_action = Gio.SimpleAction.new("GoUp", None) | |
370 self.__GoUp_action.connect("activate", self._menuitemGoUp) | |
371 self.window.add_action(self.__GoUp_action) | |
372 self.__general_action_group.insert(self.__GoUp_action) | |
373 self.__GoUp_action.set_enabled(False) | |
374 # Go to Root action | |
375 self.__GoToRoot_action = Gio.SimpleAction.new("GoToRoot", None) | |
376 self.__GoToRoot_action.connect("activate", self._menuitemGoToRoot) | |
377 self.window.add_action(self.__GoToRoot_action) | |
378 self.__general_action_group.insert(self.__GoToRoot_action) | |
379 self.__GoToRoot_action.set_enabled(False) | |
380 # Vertical Grid | |
381 _vbox1 = Gtk.Grid() | |
382 _vbox1.set_orientation(Gtk.Orientation(1)) # 1 Vertical | |
383 self.window.add(_vbox1) | |
162 _vbox1.show() | 384 _vbox1.show() |
163 #Uimanager | 385 # Toolbar |
164 self.__uimanager = gtk.UIManager() | 386 _toolbar = Gtk.Toolbar() |
165 _accelgroup = self.__uimanager.get_accel_group() | 387 _toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR) |
166 self.__window.add_accel_group(_accelgroup) | 388 # Import Fiebdc |
167 self.__general_action_group = gtk.ActionGroup("General") | 389 _gtk_image = Gtk.Image.new_from_icon_name("document-open",1) |
168 self.__general_action_group.add_actions( | 390 _gtk_image.show() |
169 [("File", None, _("_File"), None), | 391 _ImportFiebdc_button = Gtk.ToolButton.new(_gtk_image , _("Import Fiebdc")) |
170 ("ImportFiebdc", gtk.STOCK_OPEN, _('_Import Fiebdc'), "", | 392 _ImportFiebdc_button.set_tooltip_text(_("Import Fiebdc")) |
171 _('Import FIEBDC'), self._menuitemImportFiebdc), | 393 _ImportFiebdc_button.set_is_important(False) # label not shown |
172 ("Close", gtk.STOCK_CLOSE, _("_Close"), None, _('Close'), | 394 _toolbar.insert(_ImportFiebdc_button, -1) |
173 self._menuitemClose), | 395 _ImportFiebdc_button.show() |
174 ("View", None, _("_View")), | 396 _ImportFiebdc_button.set_action_name("win.ImportFiebdc") |
175 ("Go", None, _("_Go")), | 397 # Close tab |
176 ("Test", None, _("_Test")), | 398 _gtk_image = Gtk.Image.new_from_icon_name("window-close",1) |
177 #('ImportFiebdcPriceDatabase', gtk.STOCK_OPEN, | 399 _gtk_image.show() |
178 # _("Import Fiebdc _price database"), "", _("Import database"), | 400 _closeTabButton = Gtk.ToolButton.new(_gtk_image , _("_Close tab")) |
179 # self._menuitemImportPriceDatabase ), | 401 _closeTabButton.set_tooltip_text(_("Close tab")) |
180 #("OpenPriceDatabase", gtk.STOCK_OPEN, _('_Open price database'), | 402 _closeTabButton.set_is_important(False) # label not shown |
181 # "", _('Open Database'), self._menuitemOpenPriceDatabase), | 403 _toolbar.insert(_closeTabButton, -1) |
182 ]) | 404 _closeTabButton.show() |
183 self.__navigation_action_group = gtk.ActionGroup("Navigation") | 405 _closeTabButton.set_action_name("win.CloseTab") |
184 self.__navigation_action_group.add_actions( | 406 # Separator item |
185 [("Go", None, _("_Go")), | 407 _separator = Gtk.SeparatorToolItem() |
186 ("GoPrevious", gtk.STOCK_GO_BACK, _("_Back"),"", | 408 _separator.show() |
187 _("Go to the previous visited item"), | 409 _toolbar.insert(_separator, -1) |
188 self._menuitemGoPrevious), | 410 # Go Back |
189 ("GoPosterior", gtk.STOCK_GO_FORWARD, _("_Forward"),"", | 411 _gtk_image = Gtk.Image.new_from_icon_name("go-previous",1) |
190 _("Go to the next visited item"), self._menuitemGoPosterior), | 412 _gtk_image.show() |
191 ("GoUp", gtk.STOCK_GO_UP, _("_Up Item"),"", | 413 self.__goBack_button = Gtk.MenuToolButton.new(_gtk_image ,_("Back")) |
192 _("Go up item"), self._menuitemGoUp), | 414 self.__goBack_button.set_tooltip_text(_("Back")) |
193 ("GoToRoot", gtk.STOCK_GOTO_TOP, _("_Root"),"", | 415 self.__goBack_button.set_is_important(False) # label not shown |
194 _("Go to root"), self._menuitemGoToRoot), | 416 _toolbar.insert(self.__goBack_button, -1) |
195 ]) | 417 self.__goBack_button.show() |
196 self.__navigation_action_group.add_action( | 418 self.__goBack_button.set_action_name("win.GoPrevious") |
197 MenuToolAction("GoPrevMenu", None , | 419 # Go Forward |
198 _("Go to the previous visited item"), | 420 _gtk_image = Gtk.Image.new_from_icon_name("go-next",1) |
199 gtk.STOCK_GO_BACK)) | 421 _gtk_image.show() |
200 self.__navigation_action_group.add_action( | 422 self.__goForward_button = Gtk.MenuToolButton.new(_gtk_image ,_("Forward")) |
201 MenuToolAction("GoPostMenu", None , | 423 self.__goForward_button.set_tooltip_text(_("Forward")) |
202 _("Go to the next visited item"), | 424 self.__goForward_button.set_is_important(False) # label not shown |
203 gtk.STOCK_GO_FORWARD)) | 425 _toolbar.insert(self.__goForward_button, -1) |
204 self.__navigation_action_group.set_sensitive(False) | 426 self.__goForward_button.show() |
205 self.__navigation_action_group.get_action("GoPostMenu").set_sensitive( | 427 self.__goForward_button.set_action_name("win.GoPosterior") |
206 False) | 428 # Go Up Item |
207 self.__navigation_action_group.get_action("GoPrevMenu").set_sensitive( | 429 _gtk_image = Gtk.Image.new_from_icon_name("go-up",1) |
208 False) | 430 _gtk_image.show() |
209 self.__uimanager.insert_action_group(self.__general_action_group, 0) | 431 _goUP_button = Gtk.ToolButton.new(_gtk_image ,_("Up Item")) |
210 self.__uimanager.insert_action_group(self.__navigation_action_group, 1) | 432 _goUP_button.set_tooltip_text(_("Up Item")) |
211 self.__uimanager.add_ui_from_string(self.__ui) | 433 _goUP_button.set_is_important(False) # label not shown |
212 _menu_bar = self.__uimanager.get_widget("/MenuBar") | 434 _toolbar.insert(_goUP_button, -1) |
213 _vbox1.pack_start(_menu_bar, False, False, 0) | 435 _goUP_button.show() |
214 _toolbar = self.__uimanager.get_widget("/ToolBar") | 436 _goUP_button.set_action_name("win.GoUp") |
215 _toolbar.get_settings().set_long_property("gtk-toolbar-icon-size", | 437 # Go Root Item |
216 gtk.ICON_SIZE_SMALL_TOOLBAR, "pyArq-Presupuestos:toolbar") | 438 _gtk_image = Gtk.Image.new_from_icon_name("go-top",1) |
217 _vbox1.pack_start(_toolbar, False, False, 0) | 439 _gtk_image.show() |
218 # menuToolButton go prev | 440 _goRoot_button = Gtk.ToolButton.new(_gtk_image ,_("Root")) |
219 _go_prev_button = self.__uimanager.get_widget( | 441 _goRoot_button.set_tooltip_text(_("Root")) |
220 "/ToolBar/GoPrevMenu") | 442 _goRoot_button.set_is_important(False) # label not shown |
221 _go_prev_button.set_arrow_tooltip_text(_("Back history")) | 443 _toolbar.insert(_goRoot_button, -1) |
222 _go_prev_button.connect('clicked', self._menuitemGoPrevious) | 444 _goRoot_button.show() |
223 # menuToolButton go pos | 445 _goRoot_button.set_action_name("win.GoToRoot") |
224 _go_post_button = self.__uimanager.get_widget( | 446 # Pack and show |
225 "/ToolBar/GoPostMenu") | 447 _toolbar.set_hexpand(True) # with extra horizontal space |
226 _go_post_button.set_arrow_tooltip_text(_("Forward history")) | 448 _toolbar.show() |
227 _go_post_button.connect('clicked', self._menuitemGoPosterior) | 449 _vbox1.add(_toolbar) |
228 # Notebook | 450 # Notebook |
229 self.__notebook = gtk.Notebook() | 451 self.__notebook = Gtk.Notebook() |
230 _vbox1.pack_start(self.__notebook, True, True, 0) | 452 _vbox1.add(self.__notebook) |
231 self.__notebook.set_tab_pos(gtk.POS_TOP) | 453 self.__notebook.set_tab_pos(Gtk.PositionType(2)) # Up |
454 self.__notebook.set_property("expand", True) # widget expand all space | |
232 self.__notebook.set_show_tabs(True) | 455 self.__notebook.set_show_tabs(True) |
233 self.__notebook.set_show_border(True) | 456 self.__notebook.set_show_border(True) |
234 self.__notebook.set_scrollable(True) | 457 self.__notebook.set_scrollable(True) |
235 self.__notebook.connect("switch-page", self._switch_page) | 458 self.__notebook.connect("switch-page", self._switch_page) |
236 self.__notebook.show() | 459 self.__notebook.show() |
237 self._main() | 460 self._main() |
238 #TODO: create budget object in mainwindow? | 461 if len(files) > 0: |
462 for file in files: | |
463 _budget = base.Budget() | |
464 _budget_file = fiebdc.Read() | |
465 _read_method = _budget_file.readFile | |
466 _filename = file.get_path() | |
467 _filetype = "budget" | |
468 _exit_method = _budget_file.cancel | |
469 _file_window = FileSelectionWindow(self, | |
470 _read_method, _budget, _filename, _exit_method, _filetype) | |
239 | 471 |
240 def changeHistorySignal(self): | 472 def changeHistorySignal(self): |
241 """changeHistorySignal() | 473 """changeHistorySignal() |
242 | 474 |
243 A pane emit the updateHistory signal. | 475 A pane emit the updateHistory signal. |
258 def _checkButtonsSensitive(self, page_num): | 490 def _checkButtonsSensitive(self, page_num): |
259 """_checkButtonsSensitive(page_num) | 491 """_checkButtonsSensitive(page_num) |
260 | 492 |
261 page_num: page number in notebook | 493 page_num: page number in notebook |
262 | 494 |
263 Check and if necessary update the sensitive state of the navigation | 495 Check and if necessary update the enabled state of the navigation |
264 buttons. | 496 buttons. |
265 """ | 497 """ |
266 _page = self.__page_list[page_num] | 498 _page = self.__page_list[page_num] |
267 if isinstance(_page, Page) and \ | 499 if isinstance(_page, Page) and \ |
268 self.__navigation_action_group.get_sensitive(): | 500 self.__navigation_is_enabled: |
269 # GoToRoot and GoUp actions | 501 # GoToRoot and GoUp actions |
270 _goto_root = self.__navigation_action_group.get_action("GoToRoot") | 502 _goto_root = self.__GoToRoot_action |
271 _go_up = self.__navigation_action_group.get_action("GoUp") | 503 _go_up = self.__GoUp_action |
272 if len(_page.activePathRecord) == 1 and \ | 504 if len(_page.activePathRecord) == 1 and \ |
273 _goto_root.get_sensitive(): | 505 _goto_root.get_enabled(): |
274 _goto_root.set_sensitive(False) | 506 _goto_root.set_enabled(False) |
275 _go_up.set_sensitive(False) | 507 _go_up.set_enabled(False) |
276 elif len(_page.activePathRecord) != 1 and \ | 508 elif len(_page.activePathRecord) != 1 and \ |
277 not _goto_root.get_sensitive(): | 509 not _goto_root.get_enabled(): |
278 _goto_root.set_sensitive(True) | 510 _goto_root.set_enabled(True) |
279 _go_up.set_sensitive(True) | 511 _go_up.set_enabled(True) |
280 # GoPrevMenu action | 512 # GoPrevMenu action |
281 _go_Previous = self.__navigation_action_group.get_action( | 513 _go_Previous = self.__GoPrevious_action |
282 "GoPrevious") | 514 _go_prev = self.__GoPrevious_action |
283 _go_prev = self.__navigation_action_group.get_action("GoPrevMenu") | |
284 if _page.previousPathRecord is None: | 515 if _page.previousPathRecord is None: |
285 if _go_prev.get_sensitive(): | 516 if _go_prev.get_enabled(): |
286 _go_prev.set_sensitive(False) | 517 _go_prev.set_enabled(False) |
287 _go_Previous .set_sensitive(False) | 518 self.__goBack_button.props.menu = None |
288 else: | 519 else: |
289 if not _go_prev.get_sensitive(): | 520 if not _go_prev.get_enabled(): |
290 _go_prev.set_sensitive(True) | 521 _go_prev.set_enabled(True) |
291 _go_Previous.set_sensitive(True) | 522 self.__goBack_button.set_menu(_page.back_menu) |
292 # GoPostMenu action | 523 # GoPostMenu action |
293 _go_Posterior = self.__navigation_action_group.get_action( | 524 _go_Posterior = self.__GoPosterior_action |
294 "GoPosterior") | |
295 _go_post = self.__navigation_action_group.get_action("GoPostMenu") | |
296 if _page.posteriorPathRecord is None: | 525 if _page.posteriorPathRecord is None: |
297 if _go_post.get_sensitive(): | 526 if _go_Posterior.get_enabled(): |
298 _go_post.set_sensitive(False) | 527 _go_Posterior.set_enabled(False) |
299 _go_Posterior.set_sensitive(False) | 528 self.__goForward_button.props.menu = None |
300 else: | 529 else: |
301 if not _go_post.get_sensitive(): | 530 if not _go_Posterior.get_enabled(): |
302 _go_post.set_sensitive(True) | 531 _go_Posterior.set_enabled(True) |
303 _go_Posterior.set_sensitive(True) | 532 self.__goForward_button.set_menu(_page.forward_menu) |
533 | |
534 def _disable_navigation(self): | |
535 self.__GoPrevious_action.set_enabled(False) | |
536 self.__GoPosterior_action.set_enabled(False) | |
537 self.__GoUp_action.set_enabled(False) | |
538 self.__GoToRoot_action.set_enabled(False) | |
539 self.__navigation_is_enabled = False | |
304 | 540 |
305 def _switch_page(self, notebook, page, page_num,): | 541 def _switch_page(self, notebook, page, page_num,): |
306 """_switch_page(notebook, page, page_num) | 542 """_switch_page(notebook, page, page_num) |
307 | 543 |
308 Method connected to the "switch-page" signal of the notebook widget | 544 Method connected to the "switch-page" signal of the notebook widget |
309 | 545 |
310 It changes the sensitive state of the navigation action group | 546 It shows/hides closeTabButton |
311 """ | 547 and changes the sensitive state of the navigation action group |
548 """ | |
549 for _page_num, _page in enumerate(self.__page_list): | |
550 if _page_num == page_num: | |
551 _page.closeTabButton.show() | |
552 else: | |
553 _page.closeTabButton.hide() | |
312 _page = self.__page_list[page_num] | 554 _page = self.__page_list[page_num] |
555 | |
313 if isinstance(_page, EmptyPage) and \ | 556 if isinstance(_page, EmptyPage) and \ |
314 self.__navigation_action_group.get_sensitive(): | 557 self.__navigation_is_enabled: |
315 self.__navigation_action_group.set_sensitive(False) | 558 self._disable_navigation() |
316 elif isinstance(_page, Page): | 559 elif isinstance(_page, Page): |
317 if not self.__navigation_action_group.get_sensitive(): | 560 if not self.__navigation_is_enabled: |
318 self.__navigation_action_group.set_sensitive(True) | 561 self.__navigation_is_enabled = True |
319 self._checkButtonsSensitive(page_num) | 562 self._checkButtonsSensitive(page_num) |
320 _go_prev = self.__uimanager.get_widget("/ToolBar/GoPrevMenu") | |
321 _go_prev.set_menu(_page.back_menu) | |
322 _go_post = self.__uimanager.get_widget("/ToolBar/GoPostMenu") | |
323 _go_post.set_menu(_page.forward_menu) | |
324 | 563 |
325 def _main(self): | 564 def _main(self): |
326 """main() | 565 """main() |
327 | 566 |
328 Shows window and starts the GTK+ event processing loop. | 567 Shows window. |
329 """ | 568 """ |
330 self.__window.show() | 569 self.window.show() |
331 gtk.main() | |
332 | 570 |
333 def appendEmptyPage(self, emptyPage): | 571 def appendEmptyPage(self, emptyPage): |
334 """appendEmptyPage(widget, label) | 572 """appendEmptyPage(emptyPage) |
335 | 573 |
336 Append a empty page to the notebook. | 574 Append a empty page to the notebook. |
337 """ | 575 """ |
338 self.__page_list.append(emptyPage) | 576 self.__page_list.append(emptyPage) |
339 self.__notebook.append_page(emptyPage.widget, emptyPage.title) | 577 self.__notebook.append_page(emptyPage.widget, emptyPage.title) |
347 Update emptyPage to Page. | 585 Update emptyPage to Page. |
348 """ | 586 """ |
349 _page_num = self.__notebook.page_num(empty_page.widget) | 587 _page_num = self.__notebook.page_num(empty_page.widget) |
350 self.__page_list[_page_num] = page | 588 self.__page_list[_page_num] = page |
351 if self.__notebook.get_current_page() == _page_num: | 589 if self.__notebook.get_current_page() == _page_num: |
352 _go_prev = self.__uimanager.get_widget("/ToolBar/GoPrevMenu") | 590 if not self.__navigation_is_enabled: |
353 _go_prev.set_menu(page.back_menu) | 591 self.__navigation_is_enabled = True |
354 _go_post = self.__uimanager.get_widget("/ToolBar/GoPostMenu") | |
355 _go_post.set_menu(page.forward_menu) | |
356 if not self.__navigation_action_group.get_sensitive(): | |
357 self.__navigation_action_group.set_sensitive(True) | |
358 self._checkButtonsSensitive(_page_num) | 592 self._checkButtonsSensitive(_page_num) |
359 | 593 |
360 def _menuitemImportFiebdc(self, widget): | 594 def _on_control_x(self, action, param): |
361 """_menuitemImportFiebdc(widget) | 595 print("Control x -> Close window") |
362 | 596 self.window.destroy() |
363 widget: the widget where the event is emitted from | 597 |
598 def _on_menuitemImportFiebdc(self, action, parameter): | |
599 """_on_menuitemImportFiebdc(action, parameter) | |
600 | |
601 action: the action where the event is emitted from | |
602 parameter: None | |
364 Callback to open a budget file. | 603 Callback to open a budget file. |
365 | 604 |
366 Creates and shows a file selection window to open a budget file. | 605 Creates and shows a file selection window to open a budget file. |
367 """ | 606 """ |
368 _budget = base.Budget() | 607 _budget = base.Budget() |
369 _budget_file = fiebdc.Read() | 608 _budget_file = fiebdc.Read() |
370 _read_method = _budget_file.readFile | 609 _read_method = _budget_file.readFile |
371 _filename = "file" | 610 _filename = "" |
372 _filetype = "budget" | 611 _filetype = "budget" |
373 _exit_method = _budget_file.cancel | 612 _exit_method = _budget_file.cancel |
374 _file_window = importFiebdc.FileSelectionWindow(self, | 613 _file_window = FileSelectionWindow(self, |
375 _read_method, _budget, _filename, _exit_method, _filetype) | 614 _read_method, _budget, _filename, _exit_method, _filetype) |
376 | 615 |
377 #def _menuitemImportPriceDatabase(self, widget): | 616 def _menuitemClose(self, action, parameter): |
378 # """_menuitemImportPriceDatabase(widget) | 617 """_menuitemClose(action, parameter) |
379 # | 618 |
380 # widget: the widget where the event is emitted from | 619 action: the action where the event is emitted from |
381 # Callback to open a price database file. | 620 parameter: None |
382 # | 621 |
383 # Creates and shows a file selection window to open a price database | 622 Callback to close the main window. |
384 # file. | 623 """ |
385 # """ | 624 self.window.destroy() |
386 # _budget = base.Budget() | 625 |
387 # _budget_file = fiebdc.Read() | 626 def _on_CloseTab(self, action, parameter): |
388 # _read_method = _budget_file.readFile | 627 """_on_CloseTab(action, parameter) |
389 # _filename = "file" | 628 |
390 # _filetype = "database" | 629 action: the action where the event is emitted from |
391 # _exit_method = _budget_file.cancel | 630 parameter: None |
392 # _file_window = importFiebdc.FileSelectionWindow(self, | 631 |
393 # _read_method, _budget, _filename, _exit_method, _filetype) | 632 Callback to close tab. |
394 | |
395 #def _menuitemOpenPriceDatabase(self, widget): | |
396 # """_menuitemOpenPriceDatabase(widget) | |
397 # | |
398 # widget: the widget where the event is emitted from | |
399 # Callback to open a price database from a durus file. | |
400 # | |
401 # Creates and shows a file selection window to open a durus database | |
402 # """ | |
403 # _budget = None | |
404 # _budget_file = durusdatabase.Read() | |
405 # _read_method = _budget_file.readFile | |
406 # _filename = "file" | |
407 # _filetype = "durus" | |
408 # _exit_method = _budget_file.cancel | |
409 # _file_window = importFiebdc.FileSelectionWindow(self, | |
410 # _read_method, _budget, _filename, _exit_method, _filetype) | |
411 | |
412 def _menuitemClose(self, widget): | |
413 """_menuitemClose(widget) | |
414 | |
415 widget: the widget where the event is emitted from | |
416 | |
417 Callback to close a budget file. | |
418 """ | 633 """ |
419 _page_num = self.__notebook.get_current_page() | 634 _page_num = self.__notebook.get_current_page() |
420 if _page_num != -1: | 635 if _page_num != -1: |
421 _page = self.__page_list[_page_num] | 636 _page = self.__page_list[_page_num] |
422 #if isinstance(_page, EmptyPage) and _page.filetype == "durus": | |
423 # print _("Cancel reading Durus database has not been " | |
424 # "implemented.") | |
425 #else: | |
426 _page.close() | 637 _page.close() |
427 | 638 |
428 def closePage(self, page): | 639 def closePage(self, page): |
429 """closePage(page) | 640 """closePage(page) |
430 | 641 |
437 _page_num = self.__page_list.index(page) | 648 _page_num = self.__page_list.index(page) |
438 self.__page_list.pop(_page_num) | 649 self.__page_list.pop(_page_num) |
439 page.clear() | 650 page.clear() |
440 self.__notebook.remove_page(_page_num) | 651 self.__notebook.remove_page(_page_num) |
441 if len(self.__page_list) == 0: | 652 if len(self.__page_list) == 0: |
442 self.__navigation_action_group.set_sensitive(False) | 653 self._disable_navigation() |
443 else: | 654 else: |
444 raise IndexError, _("The page is not in the page list") | 655 raise IndexError( _("The page is not in the page list") ) |
445 | 656 |
446 | 657 def _menuitemGoToRoot(self, action, parameter): |
447 def _menuitemGoToRoot(self, widget): | 658 """_menuitemGoToRoot(action, parameter) |
448 """_menuitemGoToRoot(widget) | 659 |
449 | 660 action: the action where the event is emitted from |
450 widget: the widget where the event is emitted from | 661 parameter: None |
451 | 662 |
452 Callback to go to root record. | 663 Callback to go to root record. |
453 """ | 664 """ |
454 _page_num = self.__notebook.get_current_page() | 665 _page_num = self.__notebook.get_current_page() |
455 if _page_num == -1: | 666 if _page_num == -1: |
456 return | 667 return |
457 _page = self.__page_list[_page_num] | 668 _page = self.__page_list[_page_num] |
458 if isinstance(_page, Page): | 669 if isinstance(_page, Page): |
459 #not loading budget | 670 # not loading budget |
460 _page.propagateMessageFrom("change_active", (-1,), (0,)) | 671 _page.propagateMessageFrom("change_active", (-1,), (0,)) |
461 | 672 |
462 def _menuitemGoUp(self, widget): | 673 def _menuitemGoUp(self, action, parameter): |
463 """_menuitemGoUp(widget) | 674 """_menuitemGoUp(action, parameter) |
464 | 675 |
465 widget: the widget where the event is emitted from | 676 action: the action where the event is emitted from |
677 parameter: None | |
466 | 678 |
467 Callback to go to up record. | 679 Callback to go to up record. |
468 """ | 680 """ |
469 _page_num = self.__notebook.get_current_page() | 681 _page_num = self.__notebook.get_current_page() |
470 if _page_num != -1: | 682 if _page_num != -1: |
471 _page = self.__page_list[_page_num] | 683 _page = self.__page_list[_page_num] |
472 if isinstance(_page, Page): | 684 if isinstance(_page, Page): |
473 #not loading budget | 685 # not loading budget |
474 _active_path = _page.activePathRecord | 686 _active_path = _page.activePathRecord |
475 if len(_active_path) > 1: | 687 if len(_active_path) > 1: |
476 _budget = _page.budget | 688 _budget = _page.budget |
477 _up_path = _active_path[:-1] | 689 _up_path = _active_path[:-1] |
478 if _budget.hasPath(_up_path): | 690 if _budget.hasPath(_up_path): |
479 _page.propagateMessageFrom("change_active", (-1,), | 691 _page.propagateMessageFrom("change_active", (-1,), |
480 _up_path) | 692 _up_path) |
481 | 693 |
482 def _menuitemGoPrevious(self, widget): | 694 def _menuitemGoPrevious(self, action, parameter): |
483 """_menuitemGoPrevious(widget) | 695 """_menuitemGoPrevious(action, parameter) |
484 | 696 |
485 widget: the widget where the event is emitted from | 697 action: the action where the event is emitted from |
698 parameter: None | |
486 | 699 |
487 Callback to go to previous record. | 700 Callback to go to previous record. |
488 """ | 701 """ |
489 _page_num = self.__notebook.get_current_page() | 702 _page_num = self.__notebook.get_current_page() |
490 if _page_num != -1: | 703 if _page_num != -1: |
491 _page = self.__page_list[_page_num] | 704 _page = self.__page_list[_page_num] |
492 if isinstance(_page, Page): | 705 if isinstance(_page, Page): |
493 #not loading budget | 706 # not loading budget |
494 _previous_path = _page.previousPathRecord | 707 _previous_path = _page.previousPathRecord |
495 if _previous_path is not None: | 708 if _previous_path is not None: |
496 _budget = _page.budget | 709 _budget = _page.budget |
497 if _budget.hasPath(_previous_path): | 710 if _budget.hasPath(_previous_path): |
498 _page.propagateMessageFrom("change_active", (-1,), | 711 _page.propagateMessageFrom("change_active", (-1,), |
499 _previous_path) | 712 _previous_path) |
500 | 713 |
501 def _menuitemGoPosterior(self, widget): | 714 def _menuitemGoPosterior(self, action, parameter): |
502 """_menuitemPosterior(widget) | 715 """_menuitemPosterior(action, parameter) |
503 | 716 |
504 widget: the widget where the event is emitted from | 717 action: the action where the event is emitted from |
718 parameter: None | |
505 | 719 |
506 Callback to go to posterior record. | 720 Callback to go to posterior record. |
507 """ | 721 """ |
508 _page_num = self.__notebook.get_current_page() | 722 _page_num = self.__notebook.get_current_page() |
509 if _page_num != -1: | 723 if _page_num != -1: |
510 _page = self.__page_list[_page_num] | 724 _page = self.__page_list[_page_num] |
511 if isinstance(_page, Page): | 725 if isinstance(_page, Page): |
512 #not loading budget | 726 # not loading budget |
513 _posterior_path = _page.posteriorPathRecord | 727 _posterior_path = _page.posteriorPathRecord |
514 if _posterior_path is not None: | 728 if _posterior_path is not None: |
515 _budget = _page.budget | 729 _budget = _page.budget |
516 if _budget.hasPath(_posterior_path): | 730 if _budget.hasPath(_posterior_path): |
517 _page.propagateMessageFrom("change_active", (-1,), | 731 _page.propagateMessageFrom("change_active", (-1,), |
519 | 733 |
520 def _delete_event(self, widget, event): | 734 def _delete_event(self, widget, event): |
521 """_delete_event(widget, event) | 735 """_delete_event(widget, event) |
522 | 736 |
523 widget: the widget where the event is emitted from | 737 widget: the widget where the event is emitted from |
524 event: the "gtk.gdk.Event" | 738 event: the "Gdk.Event" |
525 | 739 |
526 Method connected to "delete_event" signal of main window widget | 740 Method connected to "delete_event" signal of main window widget |
527 This signal is emitted when a user press the close titlebar button. | 741 This signal is emitted when a user press the close titlebar button. |
528 It Returns True so the signal "destroy" is emitted. | 742 It Returns True so the signal "destroy" is emitted. |
529 """ | 743 """ |
530 for _page in self.__page_list: | 744 for _page in self.__page_list: |
531 _page.clear() | 745 _page.clear() |
532 return False # -> destroy | 746 return False # -> destroy |
533 | 747 |
534 def _destroy(self, widget): | 748 |
535 """_destroy(widget) | 749 class FileSelectionWindow(object): |
536 | 750 """gui.FileSelectionWindow: |
537 widget: the widget where the event is emitted from | 751 |
538 Method connected to "destroy" signal of main window widget | 752 Description: |
539 | 753 Class to show the selection file window |
540 This signal is emited when the method connected to "delete_event" | 754 Constructor: |
541 signal returns True or when the program call the destroy() method of | 755 FileSelectionWindow(mainWindow, readFileMethod, budget, |
542 the gtk.Window widget. | 756 filename, cancelMethod, filetype) |
543 The window is closed and the GTK+ event processing loop is ended. | 757 Ancestry: |
544 """ | 758 +-- object |
545 gtk.main_quit() | 759 +-- FileSelectionWindow |
760 Atributes: | |
761 No public Atributes | |
762 Methods: | |
763 No public Methods | |
764 """ | |
765 | |
766 def __init__(self, mainWindow, readFileMethod, budget, filename, | |
767 cancelMethod, filetype): | |
768 """__init__(mainWindow, readFileMethod, budget, | |
769 filename, cancelMethod, filetype) | |
770 | |
771 mainWindow: MainWindow object | |
772 readFileMethod: Method to read the selected file | |
773 budget: base.Budget object | |
774 filename: "file" | |
775 cancelMethod: Method to cancel the read method | |
776 fileytpe: "budget" or "database". | |
777 Sets the init atributes, creates the file selection window | |
778 Connects the events: | |
779 * clicked ok button: _openFile | |
780 * clicked cancel button: destroy window | |
781 * destroy event: _destroy | |
782 """ | |
783 # TODO: Add file filter | |
784 self.__mainWindow = mainWindow | |
785 self.__readFileMethod = readFileMethod | |
786 self.__budget = budget | |
787 self.__filetype = filetype | |
788 self.__cancelMethod = cancelMethod | |
789 self.__file = None | |
790 self.__filename = filename | |
791 if self.__filename == "": | |
792 self.__dialog = Gtk.FileChooserNative.new(_("Open File"), | |
793 mainWindow.window, Gtk.FileChooserAction.OPEN, _("Open File"), | |
794 _("Cancel") ) | |
795 self.__dialog.set_current_folder(globalVars.getHomePath("BUDGET")) | |
796 _response = self.__dialog.run() | |
797 if _response in [ Gtk.ResponseType.OK, Gtk.ResponseType.ACCEPT, | |
798 Gtk.ResponseType.YES, Gtk.ResponseType.APPLY]: | |
799 self._openFile(self.__dialog.get_filename()) | |
800 elif _response == Gtk.ResponseType.CANCEL: | |
801 self.__dialog.destroy() | |
802 else: | |
803 self.__dialog = None | |
804 self._openFile(self.__filename) | |
805 | |
806 def _launchProgressWindow(self, file): | |
807 """_launchProgressWindow(file) | |
808 | |
809 Launch the progress window | |
810 """ | |
811 self.__filename = file | |
812 _emptyPage = EmptyPage(self.__mainWindow, self.__readFileMethod, | |
813 self.__budget, self.__filename, | |
814 self.__cancelMethod, self.__filetype) | |
815 self.__mainWindow.appendEmptyPage(_emptyPage) | |
816 _emptyPage.run() | |
817 | |
818 def _openFile(self, filename): | |
819 """_openFile(filename) | |
820 | |
821 filename: the filename to open | |
822 If the selected file has a bc3 extension | |
823 _launchProgressWindow is called | |
824 """ | |
825 _file = filename | |
826 if sys.getfilesystemencoding(): | |
827 _file = _file.decode(sys.getfilesystemencoding()) | |
828 self.__file = _file | |
829 _filename = os.path.basename(self.__file) | |
830 _filename_ext = _filename.split(".")[-1] | |
831 if (self.__filetype == "budget" or self.__filetype == "database") and \ | |
832 _filename_ext != "bc3" and _filename_ext != "BC3": | |
833 print(_("The file must have 'bc3' extension") ) | |
834 else: | |
835 if self.__dialog is not None: | |
836 self.__dialog.destroy() | |
837 # TODO: the file exits? is it not binary?, can it be readed? | |
838 self._launchProgressWindow(self.__file) | |
546 | 839 |
547 | 840 |
548 class EmptyPage(object): | 841 class EmptyPage(object): |
549 """gui.EmptyPage: | 842 """gui.EmptyPage: |
550 | 843 |
551 Description: | 844 Description: |
552 It creates and shows a page in the notebook while a budget is loaded. | 845 It creates and shows a page in the notebook while a budget is loaded. |
553 The page show the pyarq logo, loading time and a progress bar. | 846 The page show the pyarq logo, loading time and a progress bar. |
554 Constructor: | 847 Constructor: |
555 gui.EmptyPage(mainWindow, readFileMethod, budget, filename, | 848 EmptyPage(mainWindow, readFileMethod, budget, filename, |
556 cancelMethod, filetype): | 849 cancelMethod, filetype): |
557 mainWindow: gui.Mainwindow object | 850 mainWindow: Mainwindow object |
558 readFileMethod: Method to read the selected file | 851 readFileMethod: Method to read the selected file |
559 budget: base.Budget object | 852 budget: base.Budget object |
560 filename: "file" | 853 filename: "file" |
561 cancelMethod: Method to cancel the read method | 854 cancelMethod: Method to cancel the read method |
562 filetype: "budget", "database" or "durus" | 855 filetype: "budget", "database" |
563 Ancestry: | 856 Ancestry: |
564 +-- object | 857 +-- object |
565 +-- EmptyPage | 858 +-- EmptyPage |
566 Atributes: | 859 Atributes: |
567 widget: Read. Main widget showed in the pane | 860 widget: Read. Main widget showed in the pane |
568 title: Read. Page Title | 861 title: Read. Page Title |
569 filetype: Read. budget, basedata or durus | 862 filetype: Read. budget or basedata |
863 endSuccessfully: Read-Write. False/True | |
570 Methods: | 864 Methods: |
571 run | 865 run |
572 readFile_progress | 866 readFile_progress |
573 readFile_send_message | 867 readFile_send_message |
574 readFile_set_statistics | 868 readFile_set_statistics |
575 readFile_end | 869 readFile_end |
576 readFile_cancel | 870 readFile_cancel |
577 stopLoading | 871 stopLoading |
872 updateGui | |
578 threadFinishedSignal | 873 threadFinishedSignal |
579 threadCanceled | 874 threadCanceled |
875 on_close_button | |
580 close | 876 close |
581 clear | 877 clear |
582 """ | 878 """ |
583 | 879 |
584 def __init__(self, mainWindow, readFileMethod, budget, filename, | 880 def __init__(self, mainWindow, readFileMethod, budget, filename, |
585 cancelMethod, filetype): | 881 cancelMethod, filetype): |
586 """__init__(mainWindow, readFileMethod, budget, filename, | 882 """__init__(mainWindow, readFileMethod, budget, filename, |
587 cancelMethod, filetype) | 883 cancelMethod, filetype) |
588 | 884 |
589 mainWindow: gui.Mainwindow object | 885 mainWindow: Mainwindow object |
590 readFileMethod: Method to read the selected file | 886 readFileMethod: Method to read the selected file |
591 budget: base.Budget object | 887 budget: base.Budget object |
592 filename: "file" | 888 filename: "file" |
593 cancelMethod: Method to cancel the read method | 889 cancelMethod: Method to cancel the read method |
594 filetype: "budget", "database" or "durus" | 890 filetype: "budget" or "database" |
595 | 891 |
596 self.__mainWindow: gui.Mainwindow object | 892 self.__mainWindow: Mainwindow object |
893 self.endSuccessfully False/True | |
597 self.__readFileMethod: Method to read the selected file | 894 self.__readFileMethod: Method to read the selected file |
598 self.__budget: base.Budget object | 895 self.__budget: base.Budget object |
599 self.__filename: "file" | 896 self.__filename: "file" |
600 self.__cancelMethod: Method to cancel the read method | 897 self.__cancelMethod: Method to cancel the read method |
601 self.__filetype: "budget", "database" or "durus" | 898 self.__filetype: "budget" or "database" |
602 self.__children: the read thread | 899 self.__children: the read thread |
603 self.__progress: 0 to 1 progress | 900 self.__progress: 0 to 1 progress |
604 self.__statistics: record statistics | 901 self.__statistics: record statistics |
605 self.__widget: main widget, a gtk.VBox object | 902 self.__widget: main widget, a vertial Gtk.Grid object |
606 self.__main_item: None | 903 self.__main_item: None |
607 self.__throbber: a gtk.Image | 904 self.__throbber: Gtk.Spinner() |
608 self.__animationThobber: a gtk.gdk.PixbufAnimation | 905 self.__budget_icon: Gtk.Image() |
609 self.__quietThobber: a pixbuf | 906 self.__title: a horizontal Gtk.Grid |
610 self.__budget_icon: a gtk.gdk.pixbuf | 907 self.__statusbar: a Gtk.Statusbar |
611 self.__title: a gtk.HBox | |
612 self.__statusbar: a gtk.Statusbar | |
613 self.__statuscontext: the statusbar context | 908 self.__statuscontext: the statusbar context |
614 self.__progress_bar: a gtk.ProgressBar | 909 self.__progress_bar: a Gtk.ProgressBar |
615 """ | 910 """ |
616 self.__mainWindow = mainWindow | 911 self.__mainWindow = mainWindow |
912 self.endSuccessfully = False | |
617 self.__readFileMethod = readFileMethod | 913 self.__readFileMethod = readFileMethod |
618 self.__budget = budget | 914 self.__budget = budget |
619 self.__filename = filename | 915 self.__filename = filename |
620 self.__filetype = filetype | 916 self.__filetype = filetype |
621 self.__cancelMethod = cancelMethod | 917 self.__cancelMethod = cancelMethod |
622 self.__children = None | 918 self.__children = None |
623 self.__cancel = [False, False] | 919 self.__cancel = [False, False] |
624 self.__progress = 0.0 | 920 self.__progress = 0.0 |
625 self.__statistics = None | 921 self.__statistics = None |
626 self.__widget = gtk.VBox() | 922 self.__widget = Gtk.Grid() |
923 self.__widget.set_orientation(Gtk.Orientation(1)) # 1 Vertical | |
627 self.__main_item = None | 924 self.__main_item = None |
628 self.__widget.show() | 925 self.__widget.show() |
629 self.__throbber = gtk.Image() | 926 # Throbber |
630 self.__throbber.set_from_file(globalVars.getAppPath("THROBBER-ICON")) | 927 self.__throbber = Gtk.Spinner() |
631 self.__throbber.show() | 928 self.__throbber.show() |
632 self.__animationThobber = gtk.gdk.PixbufAnimation( | 929 self.__budget_icon = Gtk.Image() |
633 globalVars.getAppPath("THROBBER-GIF")) | 930 _budget_pixbuf = GdkPixbuf.Pixbuf.new_from_file( |
634 self.__quietThobber = self.__throbber.get_pixbuf() | |
635 self.__budget_icon = gtk.gdk.pixbuf_new_from_file( | |
636 globalVars.getAppPath("BUDGET-ICON")) | 931 globalVars.getAppPath("BUDGET-ICON")) |
932 self.__budget_icon.set_from_pixbuf(_budget_pixbuf) | |
637 _filename = os.path.basename(filename) | 933 _filename = os.path.basename(filename) |
638 _rootfilename = os.path.splitext(_filename)[0] | 934 _rootfilename = os.path.splitext(_filename)[0] |
639 if not _rootfilename == "": | 935 if not _rootfilename == "": |
640 _filename = _rootfilename | 936 _filename = _rootfilename |
641 _titleLabel = gtk.Label(_filename) | 937 if len(_filename) > 28: |
938 _titleLabel = Gtk.Label(_filename[:25] + "...") | |
939 _titleLabel.set_tooltip_text(_filename) | |
940 else: | |
941 _titleLabel = Gtk.Label(_filename) | |
642 _titleLabel.show() | 942 _titleLabel.show() |
643 self.__title = gtk.HBox() | 943 self.__title = Gtk.Grid() |
944 self.__title.set_column_spacing(4) | |
945 self.__title.set_orientation(Gtk.Orientation(0)) # 0 Horizontal | |
946 self.__title.add(self.__budget_icon) | |
644 self.__title.add(self.__throbber) | 947 self.__title.add(self.__throbber) |
645 self.__title.add(_titleLabel) | 948 self.__title.add(_titleLabel) |
646 self.__statusbar = gtk.Statusbar() | 949 # Close tab |
950 _gtk_image = Gtk.Image() | |
951 _gtk__pixbuf = Gtk.IconTheme.get_default().load_icon( | |
952 "window-close-symbolic", 16, 0) | |
953 _gtk_image.set_from_pixbuf(_gtk__pixbuf) | |
954 _gtk_image.show() | |
955 self.closeTabButton = Gtk.ToolButton.new(_gtk_image , _("_Close tab")) | |
956 self.closeTabButton.set_tooltip_text(_("Close tab")) | |
957 self.closeTabButton.set_is_important(False) # label not shown | |
958 self.__title.add(self.closeTabButton) | |
959 self.closeTabButton.hide() | |
960 self.__closeTabId = self.closeTabButton.connect("clicked", self.on_close_button) | |
961 # Statusbar | |
962 self.__statusbar = Gtk.Statusbar() | |
647 self.__statuscontext = self.__statusbar.get_context_id("Statusbar") | 963 self.__statuscontext = self.__statusbar.get_context_id("Statusbar") |
648 self.__statusbar.show() | 964 self.__statusbar.show() |
649 _align = gtk.Alignment(0.5, 0.5, 0, 0) | 965 _iconVbox = Gtk.Grid() |
650 _iconVbox = gtk.VBox() | 966 _iconVbox.set_orientation(Gtk.Orientation(1)) # 1 Vertical |
651 _pyArqIcon = gtk.Image() | 967 _iconVbox.props.halign = Gtk.Align(3) # 3 Center |
968 _iconVbox.props.valign = Gtk.Align(3) # 3 Center | |
969 _iconVbox.set_property("expand", True) # widget expand all space | |
970 _pyArqIcon = Gtk.Image() | |
652 _pyArqIcon.set_from_file(globalVars.getAppPath("PYARQ-ICON")) | 971 _pyArqIcon.set_from_file(globalVars.getAppPath("PYARQ-ICON")) |
653 _pyArqIcon.show() | 972 _pyArqIcon.show() |
654 _iconVbox.pack_start(_pyArqIcon, True, True, 0) | 973 _iconVbox.add(_pyArqIcon) |
655 _link = gtk.LinkButton("http://pyarq.obraencurso.es", | 974 _link = Gtk.LinkButton.new("http://pyarq.obraencurso.es") |
656 "http://pyarq.obraencurso.es") | 975 _iconVbox.add(_link) |
657 _iconVbox.pack_start(_link, True, True, 0) | |
658 _link.show() | 976 _link.show() |
659 _iconVbox.show() | 977 _iconVbox.show() |
660 _align.add(_iconVbox) | 978 self.__widget.add(_iconVbox) |
661 _align.show() | 979 self.__progress_bar = Gtk.ProgressBar() |
662 self.__widget.pack_start(_align, True, True, 0) | 980 self.__progress_bar.set_show_text(True) |
663 _progressframe = gtk.Frame() | |
664 _progressframe.set_shadow_type(gtk.SHADOW_IN) | |
665 _progressframe.show() | |
666 self.__progress_bar = gtk.ProgressBar() | |
667 self.__progress_bar.show() | 981 self.__progress_bar.show() |
668 _progressframe.add(self.__progress_bar) | 982 self.__statusbar.pack_start(self.__progress_bar, False, False, 0) |
669 self.__statusbar.pack_start(_progressframe, False, False, 0) | 983 self.__widget.add(self.__statusbar) |
670 self.__widget.pack_end(self.__statusbar, False, True, 0) | |
671 self.__main_item = None | 984 self.__main_item = None |
672 | 985 |
673 def run(self): | 986 def run(self): |
674 """run() | 987 """run() |
675 | 988 |
676 Launch clildren and timeouts | 989 Launch clildren and timeouts |
677 """ | 990 """ |
678 self.__statusbar.push(self.__statuscontext, _("Time: 0s")) | 991 self.__statusbar.push(self.__statuscontext, _("Time: 0s")) |
679 self.__throbber.set_from_animation(self.__animationThobber) | 992 self.__throbber.start() |
680 self._launchChildren() | 993 self._launchChildren() |
681 self._launchTimeout() | 994 self._launchTimeout() |
682 | 995 |
683 def readFile_progress(self, percent): | 996 def readFile_progress(self, percent): |
684 """readFile_progress(percent) | 997 """readFile_progress(percent) |
693 def readFile_send_message(self, message): | 1006 def readFile_send_message(self, message): |
694 """readFile_send_message(message) | 1007 """readFile_send_message(message) |
695 | 1008 |
696 message: mesage from readFile method | 1009 message: mesage from readFile method |
697 | 1010 |
698 print message | 1011 print( message ) |
699 """ | 1012 """ |
700 print message | 1013 print( message ) |
701 | 1014 |
702 def readFile_set_statistics(self, statistics): | 1015 def readFile_set_statistics(self, statistics): |
703 """readFile_set_statistics(statistics) | 1016 """readFile_set_statistics(statistics) |
704 | 1017 |
705 statistics: record statistics from readFile method | 1018 statistics: record statistics from readFile method |
711 def readFile_end(self): | 1024 def readFile_end(self): |
712 """readFile_end() | 1025 """readFile_end() |
713 | 1026 |
714 The readFile method end successfully | 1027 The readFile method end successfully |
715 """ | 1028 """ |
716 print self.__statistics | 1029 self.endSuccessfully = True |
1030 print( self.__statistics.str() ) | |
717 | 1031 |
718 def readFile_cancel(self): | 1032 def readFile_cancel(self): |
719 """readFile_cancel() | 1033 """readFile_cancel() |
720 | 1034 |
721 The readFile method is canceled | 1035 The readFile method is canceled |
722 """ | 1036 """ |
723 print _("Process terminated") | 1037 self.endSuccessfully = False |
1038 print(_("Process terminated") ) | |
724 | 1039 |
725 def stopLoading(self): | 1040 def stopLoading(self): |
726 """stopLoading() | 1041 """stopLoading() |
727 | 1042 |
728 Stop progressbar | 1043 Stop progressbar |
729 """ | 1044 """ |
730 self.__throbber.set_from_pixbuf(self.__budget_icon) | 1045 self.__throbber.destroy() |
1046 self.__budget_icon.show() | |
731 self.__progress_bar.hide() | 1047 self.__progress_bar.hide() |
732 self.__statusbar.pop(self.__statuscontext) | 1048 self.__statusbar.pop(self.__statuscontext) |
733 | 1049 |
734 def _launchChildren(self): | 1050 def _launchChildren(self): |
735 """_launchChildren() | 1051 """_launchChildren() |
748 Launch the timeouts: | 1064 Launch the timeouts: |
749 1- update progress bar | 1065 1- update progress bar |
750 2- update time label | 1066 2- update time label |
751 3- If the other timetouts are stoped the window is closed | 1067 3- If the other timetouts are stoped the window is closed |
752 """ | 1068 """ |
753 gobject.timeout_add(1000, self._updateLabel, time.time()) | 1069 GLib.timeout_add(1000, self._updateLabel, time.time()) |
754 gobject.timeout_add(500, self._updateProgressBar) | 1070 GLib.timeout_add(500, self._updateProgressBar) |
755 self.__cancel = [False, False] | 1071 self.__cancel = [False, False] |
756 #self.__cancel = [True, False] | 1072 GLib.timeout_add(1000, self._autoClose) |
757 gobject.timeout_add(1000, self._autoClose) | 1073 |
758 | 1074 def updateGui(self): |
1075 while Gtk.events_pending(): | |
1076 Gtk.main_iteration() | |
1077 | |
759 def _updateProgressBar(self): | 1078 def _updateProgressBar(self): |
760 """_updateProgressBar() | 1079 """_updateProgressBar() |
761 | 1080 |
762 update progress bar in a timeout | 1081 update progress bar in a timeout |
763 If the thread end or is canceled the timeout is stoped | 1082 If the thread end or is canceled the timeout is stoped |
770 _text = "%s%%" %str(int(round(100 * self.__progress,0))) | 1089 _text = "%s%%" %str(int(round(100 * self.__progress,0))) |
771 self.__progress_bar.set_text(_text) | 1090 self.__progress_bar.set_text(_text) |
772 return True | 1091 return True |
773 | 1092 |
774 def _updateLabel(self, _time): | 1093 def _updateLabel(self, _time): |
775 """_updateProgressBar(_time) | 1094 """_updateLabel(_time) |
776 | 1095 |
777 update time label in a timeout | 1096 update time label in a timeout |
778 If the thread end or is canceled the timeout is stoped | 1097 If the thread end or is canceled the timeout is stoped |
779 """ | 1098 """ |
780 if self.__children is None or self.__children.isCanceled() == True: | 1099 if self.__children is None or self.__children.isCanceled() == True: |
786 self.__statusbar.pop(self.__statuscontext) | 1105 self.__statusbar.pop(self.__statuscontext) |
787 self.__statusbar.push(self.__statuscontext, _text) | 1106 self.__statusbar.push(self.__statuscontext, _text) |
788 return True | 1107 return True |
789 | 1108 |
790 def _autoClose(self): | 1109 def _autoClose(self): |
791 """_updateProgressBar() | 1110 """_autoClose() |
792 | 1111 |
793 If the time label and progress bar timeouts are stoped the window is | 1112 If the time label and progress bar timeouts are stoped the window is |
794 closed and ist tiemeout is stoped | 1113 closed and ist tiemeout is stoped |
795 """ | 1114 """ |
1115 #_autoClose timeout do nothig | |
796 if self.__cancel == [ True, True ]: | 1116 if self.__cancel == [ True, True ]: |
797 return False | 1117 return False |
798 else: | 1118 else: |
799 return True | 1119 return True |
800 | 1120 |
806 This method is called from thread when it finish | 1126 This method is called from thread when it finish |
807 """ | 1127 """ |
808 self.__budget = budget | 1128 self.__budget = budget |
809 self.__children = None | 1129 self.__children = None |
810 self.stopLoading() | 1130 self.stopLoading() |
811 _page = Page(self.__mainWindow, self.__budget) | 1131 _page = Page(self.__mainWindow, self.__budget, self.closeTabButton) |
812 _children = self.__widget.get_children() | 1132 _children = self.__widget.get_children() |
813 for _child in _children: | 1133 for _child in _children: |
814 self.__widget.remove(_child) | 1134 self.__widget.remove(_child) |
815 self.__widget.pack_start(_page.widget, True, True, 0) | 1135 self.__widget.add(_page.widget) |
1136 self.closeTabButton.disconnect(self.__closeTabId) | |
1137 self.closeTabButton.connect("clicked", _page.on_close_button) | |
816 self.__mainWindow.updatePage(self, _page) | 1138 self.__mainWindow.updatePage(self, _page) |
817 | 1139 |
818 def threadCanceled(self): | 1140 def threadCanceled(self): |
819 """threadCanceled() | 1141 """threadCanceled() |
820 | 1142 |
824 """ | 1146 """ |
825 self.__children = None | 1147 self.__children = None |
826 self.stopLoading() | 1148 self.stopLoading() |
827 self.__mainWindow.closePage(self) | 1149 self.__mainWindow.closePage(self) |
828 | 1150 |
1151 def on_close_button(self, widget): | |
1152 """on_close_button() | |
1153 | |
1154 Call close | |
1155 """ | |
1156 self.close() | |
1157 | |
829 def close(self): | 1158 def close(self): |
830 """close() | 1159 """close() |
831 | 1160 |
832 Close page canceling children | 1161 Close page canceling children |
833 """ | 1162 """ |
834 self.__children.cancel() | 1163 self.__children.cancel() |
835 | 1164 |
836 def clear(self): | 1165 def clear(self): |
837 """clear() | 1166 """clear() |
838 | 1167 |
839 clear vars | 1168 Nothig to do now |
840 """ | 1169 """ |
841 pass | 1170 pass |
842 | 1171 |
843 def _getWidget(self): | 1172 def _getWidget(self): |
844 """_getWidget() | 1173 """_getWidget() |
848 return self.__widget | 1177 return self.__widget |
849 | 1178 |
850 def _getTitle(self): | 1179 def _getTitle(self): |
851 """_getTitle() | 1180 """_getTitle() |
852 | 1181 |
853 Return the title of the page, a gtk.Label objetc | 1182 Return the title of the page, a Gtk.Label objetc |
854 """ | 1183 """ |
855 return self.__title | 1184 return self.__title |
856 | 1185 |
857 def _getFiletype(self): | 1186 def _getFiletype(self): |
858 """_getFiletipe() | 1187 """_getFiletipe() |
859 | 1188 |
860 Return the title of the page, a gtk.Label objetc | 1189 Return the title of the page, a Gtk.Label objetc |
861 """ | 1190 """ |
862 return self.__filetype | 1191 return self.__filetype |
863 | 1192 |
864 widget = property(_getWidget, None, None, | 1193 widget = property(_getWidget, None, None, |
865 "Main widget showed in the pane") | 1194 "Main widget showed in the pane") |
866 title = property(_getTitle, None, None, | 1195 title = property(_getTitle, None, None, |
867 "Page Title") | 1196 "Page Title") |
868 filetype = property(_getFiletype, None, None, | 1197 filetype = property(_getFiletype, None, None, |
869 "Filetype: budget, basedata or durus") | 1198 "Filetype: budget or basedata") |
870 | 1199 |
871 | 1200 |
872 class Page(object): | 1201 class Page(object): |
873 """gui.Page: | 1202 """gui.Page: |
874 | 1203 |
875 Description: | 1204 Description: |
876 It creates and shows a page in the notebook from a budget object. | 1205 It creates and shows a page in the notebook from a budget object. |
877 The page can show the budget information in several panes ordered | 1206 The page can show the budget information in several panes ordered |
878 according to "panes_list" information. | 1207 according to "panes_list" information. |
879 Constructor: | 1208 Constructor: |
880 gui.Page(mainWindow, budget, active_code=None) | 1209 Page(mainWindow, budget, closeTabButton, active_code=None) |
881 mainwindow: MainWindow object | 1210 mainwindow: MainWindow object |
882 budget: base.Budget object | 1211 budget: base.Budget object |
1212 closeTabButton. button winget to close tab | |
883 active_code: Active record code | 1213 active_code: Active record code |
884 Ancestry: | 1214 Ancestry: |
885 +-- object | 1215 +-- object |
886 +-- Page | 1216 +-- Page |
887 Atributes: | 1217 Atributes: |
888 widget: Read. Notebook page Widget. (a gtk.VBox instance) | 1218 widget: Read. Notebook page Widget. (a vertical Gtk.Grid instance) |
889 budget: Read-Write. Budget to show in the page. (base.obra object) | 1219 budget: Read-Write. Budget to show in the page. (base.obra object) |
890 panes_list: Read. info list for create the panes | 1220 panes_list: Read. info list for create the panes |
891 ej: [ "v", pane1, pane2 ] , [ "h", pane1, pane2 ] | 1221 ej: [ "v", pane1, pane2 ] , [ "h", pane1, pane2 ] |
892 [ "v", [ "h", pane1, pane2 ], [ "h", pane1, pane2 ] ] | 1222 [ "v", [ "h", pane1, pane2 ], [ "h", pane1, pane2 ] ] |
893 pane types: | 1223 pane types: |
894 * "DecompositionList": its creates a "DecompositionList" object | 1224 * "DecompositionList": its creates a "DecompositionList" object |
895 * "RecordDescription" : its creates a "Description" objetc | 1225 * "RecordDescription" : its creates a "Description" objetc |
896 * "Measure": its creates a "Measure" objetc | 1226 * "Measure": its creates a "Measure" objetc |
897 * "FileView": its creates a "FileView" objet | 1227 * "FileView": its creates a "FileView" objet |
898 * "CompanyView": its creates a "CompanyView" object | 1228 * "CompanyView": its creates a "CompanyView" object |
899 title: Read. Notebook page title (gtk.Label object) | 1229 title: Read. Notebook page title (Gtk.Label object) |
900 activePathRecord: Read. The active path record | 1230 activePathRecord: Read. The active path record |
901 previousPathRecord: Read. The previous path record | 1231 previousPathRecord: Read. The previous path record |
902 posteriorPathRecord Read. The posterior path record | 1232 posteriorPathRecord Read. The posterior path record |
903 back_menu: back menu to show in menutoolbutton | 1233 back_menu: back menu to show in menutoolbutton |
904 forward_menu: forward menu to show in menutoolbutton | 1234 forward_menu: forward menu to show in menutoolbutton |
905 Methods: | 1235 Methods: |
906 propagateMessageFrom | 1236 propagateMessageFrom |
907 sendMessageTo | 1237 sendMessageTo |
1238 on_close_button | |
908 close | 1239 close |
909 clear | 1240 clear |
910 getItem | 1241 getItem |
911 """ | 1242 """ |
912 # TODO: * The panes can be ordered as the user wishes | 1243 # TODO: * The panes can be ordered as the user wishes |
913 # TODO: * Panes in windows | 1244 # TODO: * Panes in windows |
914 # TODO: * pane types | 1245 # TODO: * pane types |
915 # TODO: * General budget properties (is better a dialog?) | 1246 # TODO: * General budget properties (is better a dialog?) |
916 | 1247 |
917 def __init__(self, mainWindow, budget, path_record=None): | 1248 def __init__(self, mainWindow, budget, closeTabButton, path_record=None): |
918 """__init__(mainWindow, budget, path_record=None) | 1249 """__init__(mainWindow, budget, closeTabButton, path_record=None) |
919 | 1250 |
920 mainWindow: MainWindow object | 1251 mainWindow: MainWindow object |
921 budget: "base.Budget" object | 1252 budget: "base.Budget" object |
1253 closeTabButton: Button widget to close tab | |
922 path_record: the active path record | 1254 path_record: the active path record |
923 | 1255 |
924 self.__mainWindow: MainWindow object | 1256 self.__mainWindow: MainWindow object |
925 self.__widget: a gtk.VBox | 1257 self.__widget: a Gtk.Grid |
926 self.__panes_list: | 1258 self.__panes_list: |
927 self.__main_item: | 1259 self.__main_item: Main item in Page. (Paned object or View object) |
1260 self.closeTabButton: : Button widget to close tab | |
928 self.__active_path_record: | 1261 self.__active_path_record: |
929 self.__history_back: | 1262 self.__history_back: |
930 self.__history_forward: | 1263 self.__history_forward: |
931 self.__back_menu: a gtk.Menu | 1264 self.__back_menu: a Gtk.Menu |
932 self.__forward_menu: a gtk.Menu | 1265 self.__forward_menu: a Gtk.Menu |
933 """ | 1266 """ |
934 if path_record is None: | 1267 if path_record is None: |
935 path_record = (0,) | 1268 path_record = (0,) |
936 #TODO: __panes_list should come from config file... | |
937 self.__mainWindow = mainWindow | 1269 self.__mainWindow = mainWindow |
938 self.__widget = gtk.VBox() | 1270 self.closeTabButton = closeTabButton |
1271 self.__widget = Gtk.Grid() | |
1272 self.__widget.set_orientation(Gtk.Orientation(1)) # 1 Vertical | |
1273 self.__widget.props.margin = 5 | |
1274 #TODO: __panes_list should come from gui config file... | |
1275 # "DecompositionList" "RecordDescription" "Measure" "Sheet of Conditions" | |
1276 # "FileView" "CompanyView" | |
939 self.__panes_list = [ "v", "DecompositionList", [ "v", "Measure", | 1277 self.__panes_list = [ "v", "DecompositionList", [ "v", "Measure", |
940 "RecordDescription" ]] | 1278 "RecordDescription" ]] |
941 self.__main_item = None | 1279 self.__main_item = None |
942 self.__active_path_record = () | 1280 self.__active_path_record = () |
943 self.__history_back = [] | 1281 self.__history_back = [] |
944 self.__history_forward = [] | 1282 self.__history_forward = [] |
945 self.__back_menu = gtk.Menu() | 1283 self.__back_menu = Gtk.Menu() |
946 self.__back_menu.show() | 1284 self.__back_menu.show() |
947 self.__forward_menu = gtk.Menu() | 1285 self.__forward_menu = Gtk.Menu() |
948 self.__forward_menu.show() | 1286 self.__forward_menu.show() |
949 self.budget = budget | 1287 self.budget = budget # Create all items and widgets |
950 self._setActivePathRecord(path_record) | 1288 self._setActivePathRecord(path_record) |
951 self.__widget.show() | 1289 self.__widget.show() |
952 self.__budget_icon = gtk.gdk.pixbuf_new_from_file( | 1290 self.__budget_icon = GdkPixbuf.Pixbuf.new_from_file( |
953 globalVars.getAppPath("BUDGET-ICON")) | 1291 globalVars.getAppPath("BUDGET-ICON")) |
954 self.__chapter_icon = gtk.gdk.pixbuf_new_from_file( | 1292 self.__chapter_icon = GdkPixbuf.Pixbuf.new_from_file( |
955 globalVars.getAppPath("CHAPTER-ICON")) | 1293 globalVars.getAppPath("CHAPTER-ICON")) |
956 self.__unit_icon = gtk.gdk.pixbuf_new_from_file( | 1294 self.__unit_icon = GdkPixbuf.Pixbuf.new_from_file( |
957 globalVars.getAppPath("UNIT-ICON") ) | 1295 globalVars.getAppPath("UNIT-ICON") ) |
958 self.__material_icon = gtk.gdk.pixbuf_new_from_file( | 1296 self.__material_icon = GdkPixbuf.Pixbuf.new_from_file( |
959 globalVars.getAppPath("MATERIAL-ICON") ) | 1297 globalVars.getAppPath("MATERIAL-ICON") ) |
960 self.__machinery_icon = gtk.gdk.pixbuf_new_from_file( | 1298 self.__machinery_icon = GdkPixbuf.Pixbuf.new_from_file( |
961 globalVars.getAppPath("MACHINERY-ICON")) | 1299 globalVars.getAppPath("MACHINERY-ICON")) |
962 self.__labourforce_icon = gtk.gdk.pixbuf_new_from_file( | 1300 self.__labourforce_icon = GdkPixbuf.Pixbuf.new_from_file( |
963 globalVars.getAppPath("LABOURFORCE-ICON")) | 1301 globalVars.getAppPath("LABOURFORCE-ICON")) |
964 | 1302 |
965 def propagateMessageFrom(self, message, pane_path, arg=None): | 1303 def propagateMessageFrom(self, message, pane_path, arg=None): |
966 """propagateMessageFrom(message, pane_path, arg=None) | 1304 """propagateMessageFrom(message, pane_path, arg=None) |
967 | 1305 |
978 """ | 1316 """ |
979 _budget = self.__budget | 1317 _budget = self.__budget |
980 if message == "change_active" and _budget.hasPath(arg): | 1318 if message == "change_active" and _budget.hasPath(arg): |
981 self.sendMessageTo(self.__main_item, message, pane_path, arg) | 1319 self.sendMessageTo(self.__main_item, message, pane_path, arg) |
982 self._setActivePathRecord(arg) | 1320 self._setActivePathRecord(arg) |
983 self.__mainWindow.changeActiveSignal() | 1321 self.__mainWindow.changeActiveSignal() # Check sensitive buttons |
984 elif message == "autoclose": | 1322 elif message == "autoclose": |
985 self._closeItem(pane_path) | 1323 self._closeItem(pane_path) |
986 elif message == "split h": | 1324 elif message == "split h": |
987 self._splitItem(pane_path, "h") | 1325 self._splitItem(pane_path, "h") |
988 elif message == "split v": | 1326 elif message == "split v": |
995 pane_path: tuple that represents the pane pane_path which emits the message | 1333 pane_path: tuple that represents the pane pane_path which emits the message |
996 arg: arguments for the message | 1334 arg: arguments for the message |
997 | 1335 |
998 Sends a message to a pane | 1336 Sends a message to a pane |
999 """ | 1337 """ |
1000 if not pane.pane_path == pane_path: | 1338 pane.runMessage(message, pane_path, arg) |
1001 pane.runMessage(message, pane_path, arg) | 1339 |
1340 def on_close_button(self, widget): | |
1341 self.close() | |
1002 | 1342 |
1003 def close(self): | 1343 def close(self): |
1004 """close() | 1344 """close() |
1005 | 1345 |
1006 Close Page | 1346 Close Page |
1041 _old_main_widget = self.__main_item.widget | 1381 _old_main_widget = self.__main_item.widget |
1042 self.__widget.remove(_old_main_widget) | 1382 self.__widget.remove(_old_main_widget) |
1043 self.__main_item = item | 1383 self.__main_item = item |
1044 _main_widget = self.__main_item.widget | 1384 _main_widget = self.__main_item.widget |
1045 _main_widget.show() | 1385 _main_widget.show() |
1046 self.__widget.pack_start(_main_widget, True, True, 0) | 1386 self.__widget.add(_main_widget) |
1047 | 1387 |
1048 def _splitItem(self, pane_path, orientation): | 1388 def _splitItem(self, pane_path, orientation): |
1049 """_splitItem(pane_path, orientation) | 1389 """_splitItem(pane_path, orientation) |
1050 | 1390 |
1051 Splits the item that is identifies by the pane_path and the orientation | 1391 Splits the item that is identifies by the pane_path and the orientation |
1052 """ | 1392 """ |
1053 _item = self.getItem(pane_path) | 1393 _item = self.getItem(pane_path) |
1054 _parent = self.getItem(pane_path[:-1]) | 1394 _item.pane_path = pane_path + (0,) |
1055 _item.pane_path = pane_path + (0,) | |
1056 _item_clone0 = _item.getClone(pane_path + (0,)) | 1395 _item_clone0 = _item.getClone(pane_path + (0,)) |
1057 _item_clone1 = _item.getClone(pane_path + (1,)) | 1396 _item_clone1 = _item.getClone(pane_path + (1,)) |
1058 _paned = Paned(orientation, pane_path, _item_clone0, _item_clone1) | 1397 _paned = Paned(orientation, pane_path, _item_clone0, _item_clone1) |
1059 if len(pane_path) > 1: | 1398 if len(pane_path) > 1: |
1399 _parent = self.getItem(pane_path[:-1]) | |
1060 _parent.setItem(pane_path[-1], [_paned]) | 1400 _parent.setItem(pane_path[-1], [_paned]) |
1061 else: | 1401 else: |
1062 self._setMainItem(_paned) | 1402 self._setMainItem(_paned) |
1063 | 1403 |
1064 def _closeItem(self, pane_path): | 1404 def _closeItem(self, pane_path): |
1110 Creates the items and widgets and returns the main item | 1450 Creates the items and widgets and returns the main item |
1111 """ | 1451 """ |
1112 if pane_path is None: | 1452 if pane_path is None: |
1113 pane_path = (0,) | 1453 pane_path = (0,) |
1114 if not isinstance(list_paned , list): | 1454 if not isinstance(list_paned , list): |
1115 raise ValueError, _("The value must be a list") | 1455 raise ValueError( _("The value must be a list") ) |
1116 if list_paned[0] == "v" or list_paned[0] == "h": | 1456 if list_paned[0] == "v" or list_paned[0] == "h": |
1117 if len(list_paned) != 3: | 1457 if len(list_paned) != 3: |
1118 raise ValueError, _("Incorrect len") | 1458 raise ValueError( _("Incorrect len") ) |
1119 if not isinstance(list_paned[1],list): | 1459 if not isinstance(list_paned[1],list): |
1120 list_paned[1] = [list_paned[1]] | 1460 list_paned[1] = [list_paned[1]] |
1121 if not isinstance(list_paned[2],list): | 1461 if not isinstance(list_paned[2],list): |
1122 list_paned[2] = [list_paned[2]] | 1462 list_paned[2] = [list_paned[2]] |
1123 _item1 = self._itemsFactory(list_paned[1],pane_path + (0,)) | 1463 _item1 = self._itemsFactory(list_paned[1],pane_path + (0,)) |
1124 _item2 = self._itemsFactory(list_paned[2],pane_path + (1,)) | 1464 _item2 = self._itemsFactory(list_paned[2],pane_path + (1,)) |
1125 _item = Paned(list_paned[0], pane_path, _item1, _item2) | 1465 _item = Paned(list_paned[0], pane_path, _item1, _item2) |
1126 elif list_paned[0] == "DecompositionList": | 1466 elif list_paned[0] == "DecompositionList": |
1127 _item = View( "DecompositionList", self.__budget, | 1467 _item = View( "DecompositionList", self.__budget, |
1128 weakref.ref(self), pane_path, self.__active_path_record) | 1468 weakref.ref(self), pane_path, self.__active_path_record, True) |
1129 elif list_paned[0] == "RecordDescription": | 1469 elif list_paned[0] == "RecordDescription": |
1130 _item = View( "RecordDescription", self.__budget,weakref.ref(self), | 1470 _item = View( "RecordDescription", self.__budget,weakref.ref(self), |
1131 pane_path, self.__active_path_record) | 1471 pane_path, self.__active_path_record, True) |
1132 elif list_paned[0] == "Measure": | 1472 elif list_paned[0] == "Measure": |
1133 _item = View( "Measure", self.__budget, weakref.ref(self), pane_path, | 1473 _item = View( "Measure", self.__budget, weakref.ref(self), pane_path, |
1134 self.__active_path_record) | 1474 self.__active_path_record, True) |
1135 elif list_paned[0] == "Sheet of Conditions": | 1475 elif list_paned[0] == "Sheet of Conditions": |
1136 _item = Sheet(sef.__budget, weakref.ref(self), pane_path, | 1476 _item = View("Sheet of Conditions", self.__budget, weakref.ref(self), pane_path, |
1137 self.__active_path_record) | 1477 self.__active_path_record) |
1138 elif list_paned[0] == "FileView": | 1478 elif list_paned[0] == "FileView": |
1139 _item = FileView(sef.__budget, weakref.ref(self), pane_path, | 1479 _item = View("FileView", self.__budget, weakref.ref(self), pane_path, |
1140 self.__active_path_record) | 1480 self.__active_path_record) |
1141 elif list_paned[0] == "CompanyView": | 1481 elif list_paned[0] == "CompanyView": |
1142 _item = CompanyView(sef.__budget, weakref.ref(self), pane_path, | 1482 _item = View("CompanyView", self.__budget, weakref.ref(self), pane_path, |
1143 self.__active_path_record) | 1483 self.__active_path_record) |
1144 else: | 1484 else: |
1145 _item = None | 1485 _item = None |
1146 raise ValueError, utils.mapping(_("Incorrect item $1"), | 1486 raise ValueError( utils.mapping(_("Incorrect item $1"), |
1147 (str(list_paned[0]),)) | 1487 (str(list_paned[0]),)) ) |
1148 return _item | 1488 return _item |
1149 | 1489 |
1150 def _setActivePathRecord(self, path_record): | 1490 def _setActivePathRecord(self, path_record): |
1151 """_setActivePathRecord(path_record) | 1491 """_setActivePathRecord(path_record) |
1152 | 1492 |
1157 if path_record != self.__active_path_record: | 1497 if path_record != self.__active_path_record: |
1158 if self.__budget.hasPath(path_record): | 1498 if self.__budget.hasPath(path_record): |
1159 self.__active_path_record = path_record | 1499 self.__active_path_record = path_record |
1160 self._appendHistory(path_record) | 1500 self._appendHistory(path_record) |
1161 else: | 1501 else: |
1162 raise ValueError, utils.mapping(_("The budget does not have "\ | 1502 raise ValueError( utils.mapping(_("The budget does not have "\ |
1163 "the path record: $1"), (str(path_record),)) | 1503 "the path record: $1"), (str(path_record),)) ) |
1164 | 1504 |
1165 def _appendHistory(self, path): | 1505 def _appendHistory(self, path): |
1166 """_appendHistory(path)) | 1506 """_appendHistory(path)) |
1167 | 1507 |
1168 path: the new active path record | 1508 path: the new active path record |
1248 _icon = self.__labourforce_icon | 1588 _icon = self.__labourforce_icon |
1249 elif _type == 2: | 1589 elif _type == 2: |
1250 _icon = self.__machinery_icon | 1590 _icon = self.__machinery_icon |
1251 else: | 1591 else: |
1252 _icon = self.__material_icon | 1592 _icon = self.__material_icon |
1253 _image = gtk.Image() | 1593 _image = Gtk.Image() |
1254 _image.set_from_pixbuf(_icon) | 1594 _image.set_from_pixbuf(_icon) |
1255 return _image | 1595 return _image |
1256 | 1596 |
1257 def _menuFactory(self): | 1597 def _menuFactory(self): |
1258 """_menuFactory() | 1598 """_menuFactory() |
1259 | 1599 |
1260 record: record object | 1600 record: record object |
1261 | 1601 |
1262 Creates menus for history back an history forward tool buttons | 1602 Creates menus for history back an history forward tool buttons |
1263 """ | 1603 """ |
1264 | |
1265 # Back Menu | 1604 # Back Menu |
1266 # clear menu | 1605 # clear menu |
1267 for _child in self.__back_menu.get_children(): | 1606 for _child in self.__back_menu.get_children(): |
1268 self.__back_menu.remove(_child) | 1607 self.__back_menu.remove(_child) |
1269 # pupulate menu | 1608 # pupulate menu |
1270 if len(self.__history_back) > 1: | 1609 if len(self.__history_back) > 1: |
1271 for _record_path in self.__history_back[:-1]: | 1610 for _record_path in self.__history_back[:-1]: |
1272 _menuitem = self._menuItemFactory(_record_path) | 1611 _menuitem = self._menuItemFactory(_record_path) |
1273 _menuitem.connect_object("activate", self._menuHistoryBack, | 1612 _menuitem.connect("activate", self._menuHistoryBack, |
1274 _record_path, _menuitem) | 1613 _record_path, _menuitem) |
1275 self.__back_menu.prepend(_menuitem) | 1614 self.__back_menu.prepend(_menuitem) |
1276 # Forward Menu | 1615 # Forward Menu |
1277 # clear menu | 1616 # clear menu |
1278 for _child in self.__forward_menu.get_children(): | 1617 for _child in self.__forward_menu.get_children(): |
1279 self.__forward_menu.remove(_child) | 1618 self.__forward_menu.remove(_child) |
1280 # pupulate menu | 1619 # pupulate menu |
1281 if len(self.__history_forward) > 0: | 1620 if len(self.__history_forward) > 0: |
1282 for _record_path in self.__history_forward[:]: | 1621 for _record_path in self.__history_forward[:]: |
1283 _menuitem = self._menuItemFactory(_record_path) | 1622 _menuitem = self._menuItemFactory(_record_path) |
1284 _menuitem.connect_object("activate", self._menuHistoryForward, | 1623 _menuitem.connect("activate", self._menuHistoryForward, |
1285 _record_path, _menuitem) | 1624 _record_path, _menuitem) |
1286 self.__forward_menu.prepend(_menuitem) | 1625 self.__forward_menu.prepend(_menuitem) |
1287 | 1626 |
1288 def _menuItemFactory(self, record_path): | 1627 def _menuItemFactory(self, record_path): |
1289 """_menuItemFactory(record_path): | 1628 """_menuItemFactory(record_path): |
1293 Creates and return a menuItem to go to the record | 1632 Creates and return a menuItem to go to the record |
1294 """ | 1633 """ |
1295 _code = self.budget.getCode(record_path) | 1634 _code = self.budget.getCode(record_path) |
1296 _record = self.budget.getRecord(_code) | 1635 _record = self.budget.getRecord(_code) |
1297 _summary = _record.summary | 1636 _summary = _record.summary |
1298 _text = _code + " " + _summary | 1637 _text = _code.decode("utf8") + " " + _summary.decode("utf8") |
1299 if len(_text) > 30: | 1638 if len(_text) > 30: |
1300 _text = _text[:27] + "..." | 1639 _text = _text[:27] + "..." |
1301 _image = self._getImage(_record) | 1640 _icon = self._getImage(_record) |
1302 _menuitem = gtk.ImageMenuItem(_text) | 1641 _grid = Gtk.Grid() |
1303 _menuitem.set_image(_image) | 1642 _grid.set_orientation(Gtk.Orientation(0)) # 0 Horizontal |
1304 _menuitem.show() | 1643 _grid.set_column_spacing(6) |
1644 _label = Gtk.Label(_text) | |
1645 _menuitem = Gtk.MenuItem.new() | |
1646 _grid.add(_icon) | |
1647 _grid.add(_label) | |
1648 _menuitem.add(_grid) | |
1649 _menuitem.show_all() | |
1305 return _menuitem | 1650 return _menuitem |
1306 | 1651 |
1307 def _menuHistoryBack(self, record_path, menu_item): | 1652 def _menuHistoryBack(self, record_path, menu_item): |
1308 """_menuHistoryBack(record_path, menu_item) | 1653 """_menuHistoryBack(record_path, menu_item) |
1309 | 1654 |
1362 return self.__forward_menu | 1707 return self.__forward_menu |
1363 | 1708 |
1364 def _getTitle(self): | 1709 def _getTitle(self): |
1365 """_getTitle() | 1710 """_getTitle() |
1366 | 1711 |
1367 Return the page title, a gtk.Label objetc | 1712 Return the page title, a Gtk.Label objetc |
1368 """ | 1713 """ |
1369 return self.__title | 1714 return self.__title |
1370 | 1715 |
1371 def _getWidget(self): | 1716 def _getWidget(self): |
1372 """_getWidget() | 1717 """_getWidget() |
1388 self.clear() | 1733 self.clear() |
1389 return | 1734 return |
1390 self.__budget = budget | 1735 self.__budget = budget |
1391 self._setActivePathRecord((0,)) | 1736 self._setActivePathRecord((0,)) |
1392 # Todo: change page title | 1737 # Todo: change page title |
1393 self.__title = gtk.Label(self.__budget.getCode( | 1738 self.__title = Gtk.Label(self.__budget.getCode( |
1394 self.__active_path_record)) | 1739 self.__active_path_record)) |
1395 _panes_list = self.__panes_list | 1740 _panes_list = self.__panes_list |
1396 self.__main_item = self._itemsFactory(_panes_list) | 1741 self.__main_item = self._itemsFactory(_panes_list) |
1397 _main_widget = self.__main_item.widget | 1742 _main_widget = self.__main_item.widget |
1398 _main_widget.show() | 1743 _main_widget.show() |
1399 self.__widget.pack_start(_main_widget, True, True, 0) | 1744 self.__widget.add(_main_widget) |
1400 | 1745 |
1401 def _getBudget(self): | 1746 def _getBudget(self): |
1402 """_getBudget() | 1747 """_getBudget() |
1403 | 1748 |
1404 Return de budget, a "base.Budget" object. | 1749 Return de budget, a "base.Budget" object. |
1435 """gui.View: | 1780 """gui.View: |
1436 | 1781 |
1437 Description: | 1782 Description: |
1438 It creates a view to show the budget info | 1783 It creates a view to show the budget info |
1439 Constructor: | 1784 Constructor: |
1440 View(view_type, budget, wr_page, pane_path, active_path_record) | 1785 View(view_type, budget, wr_page, pane_path, active_path_record, |
1786 connected) | |
1441 view_type: the object type to show | 1787 view_type: the object type to show |
1442 * DecompositionList | 1788 * DecompositionList |
1443 * Description | 1789 * Description |
1444 * Measure | 1790 * Measure |
1445 * Sheet | 1791 * Sheet |
1447 * CompanyView | 1793 * CompanyView |
1448 budget: the budget to show | 1794 budget: the budget to show |
1449 wr_page: weak reference to the page where the view must be showed | 1795 wr_page: weak reference to the page where the view must be showed |
1450 pane_path: the position or path of the view in the page notebook | 1796 pane_path: the position or path of the view in the page notebook |
1451 active_path_record: the record path that must be showed | 1797 active_path_record: the record path that must be showed |
1798 connected: boolean value, True means that the View object sends | |
1799 and receives signals from/to others views. | |
1452 Ancestry: | 1800 Ancestry: |
1453 +-- object | 1801 +-- object |
1454 +-- View | 1802 +-- View |
1455 Atributes: | 1803 Atributes: |
1456 pane_path: Read-Write. The tuple that identifies the view in the main | 1804 pane_path: Read-Write. The tuple that identifies the view in the main |
1457 notebook page | 1805 notebook page |
1458 widget: Read. the main gtk widget to show in a view object, | 1806 widget: Read. the main Gtk widget to show in a view object, |
1459 a gtk.VBox object | 1807 a Gtk.Grid object |
1460 Methods: | 1808 Methods: |
1461 getItem | 1809 getItem |
1462 propagateMessgeFrom | 1810 propagateMessgeFrom |
1463 runMessage | 1811 runMessage |
1464 getClone | 1812 getClone |
1465 clear | 1813 clear |
1466 """ | 1814 """ |
1467 | 1815 |
1468 def __init__(self, view_type, budget, wr_page, pane_path, | 1816 def __init__(self, view_type, budget, wr_page, pane_path, |
1469 active_path_record): | 1817 active_path_record, connected=True): |
1470 """__init__(view_type, budget, wr_page, pane_path, active_path_record) | 1818 """__init__(view_type, budget, wr_page, pane_path, active_path_record, |
1819 connected ) | |
1471 view_type: the object type to show | 1820 view_type: the object type to show |
1472 * DecompositionList | 1821 * DecompositionList |
1473 * Description | 1822 * Description |
1474 * Measure | 1823 * Measure |
1475 * Sheet | 1824 * Sheet |
1478 budget: the budget to show | 1827 budget: the budget to show |
1479 wr_page: weak reference to the page where the view must be showed | 1828 wr_page: weak reference to the page where the view must be showed |
1480 pane_path: the position or path of the view in the page notebook | 1829 pane_path: the position or path of the view in the page notebook |
1481 active_path_record: the record path that must be showed | 1830 active_path_record: the record path that must be showed |
1482 | 1831 |
1483 self.__active_path_record: the record path that must be showed | |
1484 self.__view_type: the object type to show | 1832 self.__view_type: the object type to show |
1485 * DecompositionList | 1833 * DecompositionList |
1486 * Description | 1834 * Description |
1487 * Measure | 1835 * Measure |
1488 * Sheet of conditions | 1836 * Sheet of conditions |
1492 showed | 1840 showed |
1493 self.__budget: the budget to show | 1841 self.__budget: the budget to show |
1494 self.__pane_path: the position or path of the view in the page notebook | 1842 self.__pane_path: the position or path of the view in the page notebook |
1495 self.__connected: boolean value, True means that the View object sends | 1843 self.__connected: boolean value, True means that the View object sends |
1496 and receives signals from/to others views | 1844 and receives signals from/to others views |
1497 self.__widget: main widget. a gtk.VBox | 1845 self.__widget: main widget. a Gtk.Grid |
1498 self.__view: the object to show: | 1846 self.__view: the object to show: |
1499 * DecompositionList object | 1847 * DecompositionList object |
1500 * Description object | 1848 * Description object |
1501 * Measure object | 1849 * Measure object |
1502 * Sheet object | 1850 * Sheet object |
1505 self.__connected_button: a button to switch self.__connected True or | 1853 self.__connected_button: a button to switch self.__connected True or |
1506 False | 1854 False |
1507 | 1855 |
1508 Creates and shows a new view | 1856 Creates and shows a new view |
1509 """ | 1857 """ |
1510 self.__active_path_record = active_path_record | |
1511 self.__view_type = view_type | 1858 self.__view_type = view_type |
1512 self.__wr_page = wr_page | 1859 self.__wr_page = wr_page |
1513 self.__budget = budget | 1860 self.__budget = budget |
1514 self.__pane_path = pane_path | 1861 self.__pane_path = pane_path |
1515 self.__connected = True | 1862 self.__connected = connected |
1516 # view_type liststore | 1863 # view_type liststore |
1517 _liststore = gtk.ListStore(str) | 1864 _liststore = Gtk.ListStore(str) |
1518 _liststore.append([_("Decomposition")]) #0 | 1865 _liststore.append([_("Decomposition")]) #0 |
1519 _liststore.append([_("Description")]) #1 | 1866 _liststore.append([_("Description")]) #1 |
1520 _liststore.append([_("Measure")]) #2 | 1867 _liststore.append([_("Measure")]) #2 |
1521 _liststore.append([_("Sheet of Conditions")]) #3 | 1868 _liststore.append([_("Sheet of Conditions")]) #3 |
1522 _liststore.append([_("Files")]) #4 | 1869 _liststore.append([_("Files")]) #4 |
1523 _liststore.append([_("Companies")]) #5 | 1870 _liststore.append([_("Companies")]) #5 |
1524 _combobox = gtk.ComboBox(_liststore) | 1871 _combobox = Gtk.ComboBox.new_with_model(_liststore) |
1525 _cell = gtk.CellRendererText() | 1872 _cell = Gtk.CellRendererText() |
1526 _combobox.pack_start(_cell, True) | 1873 _combobox.pack_start(_cell, True) |
1527 _combobox.add_attribute(_cell, 'text', 0) | 1874 _combobox.add_attribute(_cell, 'text', 0) |
1528 self.__widget = gtk.VBox() | 1875 self.__widget = Gtk.Grid() |
1529 _hbox = gtk.HBox() | 1876 self.__widget.set_orientation(Gtk.Orientation(1)) # 1 Vertical |
1877 _hbox = Gtk.Grid() | |
1878 _hbox.set_orientation(Gtk.Orientation(0)) # 0 Horizontal | |
1530 if view_type == "DecompositionList": | 1879 if view_type == "DecompositionList": |
1531 self.__view = DecompositionList(budget, weakref.ref(self), | 1880 self.__view = DecompositionList(budget, weakref.ref(self), |
1532 pane_path, active_path_record) | 1881 pane_path, active_path_record) |
1533 _combobox.set_active(0) | 1882 _combobox.set_active(0) |
1534 _view_icon = gtk.Image() | 1883 _view_icon = Gtk.Image() |
1535 _view_icon.set_from_file(globalVars.getAppPath( | 1884 _view_icon.set_from_file(globalVars.getAppPath( |
1536 "DECOMPOSITION-ICON")) | 1885 "DECOMPOSITION-ICON")) |
1537 elif view_type == "RecordDescription": | 1886 elif view_type == "RecordDescription": |
1538 self.__view = Description(budget, weakref.ref(self), | 1887 self.__view = Description(budget, weakref.ref(self), |
1539 pane_path, active_path_record) | 1888 pane_path, active_path_record) |
1540 _combobox.set_active(1) | 1889 _combobox.set_active(1) |
1541 _view_icon = gtk.Image() | 1890 _view_icon = Gtk.Image() |
1542 _view_icon.set_from_file(globalVars.getAppPath( | 1891 _view_icon.set_from_file(globalVars.getAppPath( |
1543 "DESCRIPTION-ICON")) | 1892 "DESCRIPTION-ICON")) |
1544 elif view_type == "Measure": | 1893 elif view_type == "Measure": |
1545 self.__view = Measure(budget, weakref.ref(self), | 1894 self.__view = Measure(budget, weakref.ref(self), |
1546 pane_path, active_path_record) | 1895 pane_path, active_path_record) |
1547 _combobox.set_active(2) | 1896 _combobox.set_active(2) |
1548 _view_icon = gtk.Image() | 1897 _view_icon = Gtk.Image() |
1549 _view_icon.set_from_file(globalVars.getAppPath("MEASURE-ICON")) | 1898 _view_icon.set_from_file(globalVars.getAppPath("MEASURE-ICON")) |
1550 elif view_type == "Sheet of Conditions": | 1899 elif view_type == "Sheet of Conditions": |
1551 self.__view = Sheet(budget, weakref.ref(self), | 1900 self.__view = Sheet(budget, weakref.ref(self), |
1552 pane_path, active_path_record) | 1901 pane_path, active_path_record) |
1553 _combobox.set_active(3) | 1902 _combobox.set_active(3) |
1554 _view_icon = gtk.Image() | 1903 _view_icon = Gtk.Image() |
1555 _view_icon.set_from_file(globalVars.getAppPath("SHEET-ICON")) | 1904 _view_icon.set_from_file(globalVars.getAppPath("SHEET-ICON")) |
1556 elif view_type == "FileView": | 1905 elif view_type == "FileView": |
1557 self.__view = FileView(budget, weakref.ref(self), | 1906 self.__view = FileView(budget, weakref.ref(self), |
1558 pane_path, active_path_record) | 1907 pane_path, active_path_record) |
1559 _combobox.set_active(4) | 1908 _combobox.set_active(4) |
1560 _view_icon = gtk.Image() | 1909 _view_icon = Gtk.Image() |
1561 _view_icon.set_from_file(globalVars.getAppPath("SHEET-ICON")) | 1910 _view_icon.set_from_file(globalVars.getAppPath("FILEVIEW-ICON")) |
1562 elif view_type == "CompanyView": | 1911 elif view_type == "CompanyView": |
1563 self.__view = CompanyView(budget, weakref.ref(self), pane_path, | 1912 self.__view = CompanyView(budget, weakref.ref(self), pane_path, |
1564 active_path_record) | 1913 active_path_record) |
1565 _combobox.set_active(5) | 1914 _combobox.set_active(5) |
1566 _view_icon = gtk.Image() | 1915 _view_icon = Gtk.Image() |
1567 _view_icon.set_from_file(globalVars.getAppPath("SHEET-ICON")) | 1916 _view_icon.set_from_file(globalVars.getAppPath("COMPANY-ICON")) |
1568 else: | 1917 else: |
1569 raise ValueError, _(utils.mapping("Invalid type of View: $1", | 1918 raise ValueError( _(utils.mapping("Invalid type of View: $1", |
1570 view_type)) | 1919 view_type)) ) |
1571 _view_icon.show() | 1920 _view_icon.show() |
1572 _combobox.connect("changed", self._change_combo) | 1921 _combobox.connect("changed", self._change_combo) |
1573 _combobox.show() | 1922 _combobox.show() |
1574 self.__widget.pack_start(_hbox,False) | 1923 self.__widget.add(_hbox) |
1575 self.__widget.pack_start(self.__view.widget, True, True) | 1924 self.__widget.add(self.__view.widget) |
1576 _hbox.pack_start(_view_icon, False, False,0) | 1925 _hbox.add(_view_icon) |
1577 _hbox.pack_start(_combobox, False, False,0) | 1926 _hbox.add(_combobox) |
1578 _invisible = gtk.HBox() | 1927 _invisible = Gtk.Grid() |
1928 _invisible.set_orientation(Gtk.Orientation(0)) # 0 Horizontal | |
1929 _invisible.set_property("hexpand", True) # widget expand horizontal space | |
1579 _invisible.show() | 1930 _invisible.show() |
1580 _hbox.pack_start(_invisible, True, False,0) | 1931 _hbox.add(_invisible) |
1581 _icon_menu = gtk.Image() | 1932 # TODO : Set thist with config |
1582 _icon_menu.set_from_file(globalVars.getAppPath("MENU-ICON")) | 1933 add_menu = False |
1583 _icon_menu.show() | 1934 if add_menu: |
1584 _menu_button = gtk.ToolButton() | 1935 _icon_menu = Gtk.Image() |
1585 _menu_button.set_icon_widget(_icon_menu) | 1936 _icon_menu.set_from_file(globalVars.getAppPath("MENU-ICON")) |
1586 _menu_button.connect("clicked", self._menu_view) | 1937 _icon_menu.show() |
1587 _menu_button.show() | 1938 _menu_button = Gtk.ToolButton() |
1588 _icon_connected = gtk.Image() | 1939 _menu_button.set_icon_widget(_icon_menu) |
1589 _icon_connected.set_from_file(globalVars.getAppPath("CONNECTED-ICON")) | 1940 _menu_button.connect("clicked", self._menu_view) |
1941 _menu_button.show() | |
1942 _hbox.add(_menu_button) | |
1943 | |
1944 _icon_horizontal = Gtk.Image() | |
1945 _icon_horizontal.set_from_file(globalVars.getAppPath("HORIZONTAL")) | |
1946 _icon_horizontal.show() | |
1947 _horizontal_button = Gtk.ToolButton() | |
1948 _horizontal_button.set_icon_widget(_icon_horizontal) | |
1949 _horizontal_button.connect("clicked", self._split_view, "h") | |
1950 _horizontal_button.set_tooltip_text(_("Split View Left/Right")) | |
1951 _horizontal_button.show() | |
1952 _hbox.add(_horizontal_button) | |
1953 | |
1954 _icon_vertical = Gtk.Image() | |
1955 _icon_vertical.set_from_file(globalVars.getAppPath("VERTICAL")) | |
1956 _icon_vertical.show() | |
1957 _vertical_button = Gtk.ToolButton() | |
1958 _vertical_button.set_icon_widget(_icon_vertical) | |
1959 _vertical_button.connect("clicked", self._split_view, "v") | |
1960 _vertical_button.set_tooltip_text(_("Split View Top/Bottom")) | |
1961 _vertical_button.show() | |
1962 _hbox.add(_vertical_button) | |
1963 | |
1964 self.__connected_button = Gtk.ToolButton() | |
1965 _icon_connected = Gtk.Image() | |
1966 if self.__connected: | |
1967 _icon_connected.set_from_file(globalVars.getAppPath("CONNECTED-ICON")) | |
1968 self.__connected_button.set_tooltip_text(_("Disconnect view")) | |
1969 else: | |
1970 _icon_connected.set_from_file(globalVars.getAppPath("DISCONNECTED-ICON")) | |
1971 self.__connected_button.set_tooltip_text(_("Connect view")) | |
1590 _icon_connected.show() | 1972 _icon_connected.show() |
1591 _hbox.pack_start(_menu_button, False, False, 0) | |
1592 self.__connected_button = gtk.ToolButton() | |
1593 self.__connected_button.set_icon_widget(_icon_connected) | 1973 self.__connected_button.set_icon_widget(_icon_connected) |
1594 self.__connected_button.connect("clicked", self._connected) | 1974 self.__connected_button.connect("clicked", self._connected) |
1595 self.__connected_button.show() | 1975 self.__connected_button.show() |
1596 _hbox.pack_start(self.__connected_button, False, False, 0) | 1976 _hbox.add(self.__connected_button) |
1597 _icon_close = gtk.Image() | 1977 |
1978 _icon_close = Gtk.Image() | |
1598 _icon_close.set_from_file(globalVars.getAppPath("CLOSE-ICON")) | 1979 _icon_close.set_from_file(globalVars.getAppPath("CLOSE-ICON")) |
1599 _icon_close.show() | 1980 _icon_close.show() |
1600 _close_button = gtk.ToolButton() | 1981 _close_button = Gtk.ToolButton() |
1601 _close_button.set_icon_widget(_icon_close) | 1982 _close_button.set_icon_widget(_icon_close) |
1602 _close_button.connect("clicked", self._closeItem) | 1983 _close_button.connect("clicked", self._closeItem_from_button) |
1984 _close_button.set_tooltip_text(_("Close view")) | |
1603 _close_button.show() | 1985 _close_button.show() |
1604 _hbox.pack_start(_close_button, False, False, 0) | 1986 _hbox.add(_close_button) |
1605 _hbox.show() | 1987 _hbox.show() |
1606 self.__widget.show() | 1988 self.__widget.show() |
1607 | 1989 |
1608 def getItem(self, pane_path): | 1990 def getItem(self, pane_path): |
1609 """getItem(pane_path) | 1991 """getItem(pane_path) |
1610 | 1992 |
1611 Return itself. | 1993 Return itself. |
1612 """ | 1994 """ |
1613 return self | 1995 return self |
1614 | 1996 |
1615 def _closeItem(self, close_button): | 1997 def _closeItem_from_menu(self, close_menuitem): |
1616 """_closeItem(close_button) | 1998 """_closeItem_from_menu(close_menuitem) |
1617 | 1999 |
1618 Method connected to the "clicked" signal of the _close_button widget | 2000 Method connected to the "clicked" signal of the _close_button widget |
1619 Send the "autoclose" message to the page to close this view | 2001 Send the "autoclose" message to the page to close this view |
1620 """ | 2002 """ |
1621 self.propagateMessageFrom("autoclose", self.__pane_path) | 2003 self.propagateMessageFrom("autoclose", self.__pane_path) |
1622 | 2004 |
2005 def _closeItem_from_button(self, close_button): | |
2006 """_closeItem_from_button(close_button) | |
2007 | |
2008 Method connected to the "clicked" signal of the _close_button widget | |
2009 Send the "autoclose" message to the page to close this view | |
2010 """ | |
2011 self.propagateMessageFrom("autoclose", self.__pane_path) | |
2012 | |
1623 def _change_combo(self, combobox): | 2013 def _change_combo(self, combobox): |
1624 """_change_combo(combobox) | 2014 """_change_combo(combobox) |
1625 | 2015 |
1626 Method connected to the "changed" signal of the _combobox widget | 2016 Method connected to the "changed" signal of the _combobox widget |
1627 It changes the view type to the type selected in the combobox | 2017 It changes the view type to the type selected in the combobox |
1628 """ | 2018 """ |
1629 _index = combobox.get_active() | 2019 _index = combobox.get_active() |
1630 _budget = self.__view.budget | 2020 _budget = self.__view.budget |
1631 _wr_page = self.__view.page | 2021 _wr_page = self.__view.wr_page |
1632 _pane_path = self.__view.pane_path | 2022 _pane_path = self.__view.pane_path |
1633 _path_record = self.__view.active_path_record | 2023 _path_record = self.__view.active_path_record |
1634 _hbox = self.__widget.get_children()[0] | 2024 _hbox = self.__widget.get_children()[1] |
1635 _combobox = _hbox.get_children()[1] | 2025 _view_icon = _hbox.get_child_at(0, 0) |
1636 _hbox.remove(_combobox) | 2026 _hbox.remove(_view_icon) |
1637 _invisible = _hbox.get_children()[1] | 2027 _view_icon.destroy() |
1638 _hbox.remove(_invisible) | |
1639 _menu_button = _hbox.get_children()[1] | |
1640 _hbox.remove(_menu_button) | |
1641 _connected_button = _hbox.get_children()[1] | |
1642 _hbox.remove(_connected_button) | |
1643 _close_button = _hbox.get_children()[1] | |
1644 _hbox.remove(_close_button) | |
1645 self.__widget.remove(self.__view.widget) | 2028 self.__widget.remove(self.__view.widget) |
1646 self.__widget.remove(_hbox) | 2029 _view_icon = Gtk.Image() |
1647 _hbox.destroy() | |
1648 _view_icon = gtk.Image() | |
1649 if _index == 0: | 2030 if _index == 0: |
1650 self.__view = DecompositionList(_budget, _wr_page, _pane_path, | 2031 self.__view = DecompositionList(_budget, _wr_page, _pane_path, |
1651 _path_record) | 2032 _path_record) |
1652 | 2033 |
1653 _view_icon.set_from_file(globalVars.getAppPath( | 2034 _view_icon.set_from_file(globalVars.getAppPath( |
1669 _view_icon.set_from_file(globalVars.getAppPath("SHEET-ICON")) | 2050 _view_icon.set_from_file(globalVars.getAppPath("SHEET-ICON")) |
1670 self.__view_type = "Sheet of Conditions" | 2051 self.__view_type = "Sheet of Conditions" |
1671 elif _index == 4: | 2052 elif _index == 4: |
1672 self.__view = FileView(_budget, _wr_page, _pane_path, | 2053 self.__view = FileView(_budget, _wr_page, _pane_path, |
1673 _path_record) | 2054 _path_record) |
1674 _view_icon.set_from_file(globalVars.getAppPath("SHEET-ICON")) | 2055 _view_icon.set_from_file(globalVars.getAppPath("FILEVIEW-ICON")) |
1675 self.__view_type = "FileView" | 2056 self.__view_type = "FileView" |
1676 elif _index == 5: | 2057 elif _index == 5: |
1677 self.__view = CompanyView(_budget, _wr_page, _pane_path, | 2058 self.__view = CompanyView(_budget, _wr_page, _pane_path, |
1678 _path_record) | 2059 _path_record) |
1679 _view_icon.set_from_file(globalVars.getAppPath("SHEET-ICON")) | 2060 _view_icon.set_from_file(globalVars.getAppPath("COMPANY-ICON")) |
1680 self.__view_type = "CompanyView" | 2061 self.__view_type = "CompanyView" |
1681 _view_icon.show() | 2062 _view_icon.show() |
1682 _hbox = gtk.HBox() | 2063 _hbox.attach(_view_icon, 0, 0, 1, 1) |
1683 _hbox.pack_start(_view_icon, False, False,0) | 2064 self.__widget.add(self.__view.widget) |
1684 _hbox.pack_start(_combobox, False, False,0) | |
1685 _hbox.pack_start(_invisible, True, False,0) | |
1686 _hbox.pack_start(_menu_button, False, False, 0) | |
1687 _hbox.pack_start(_connected_button, False, False, 0) | |
1688 _hbox.pack_start(_close_button, False, False, 0) | |
1689 _hbox.show() | |
1690 self.__widget.pack_start(_hbox, False, False, 0) | |
1691 self.__widget.pack_start(self.__view.widget, True, True, 0) | |
1692 | 2065 |
1693 def _menu_view(self, widget): | 2066 def _menu_view(self, widget): |
1694 """_menu_view(widget) | 2067 """_menu_view(widget) |
1695 | 2068 |
1696 Method connected to the "clicked" signal of the __connected_button | 2069 Method connected to the "clicked" signal of the __connected_button |
1697 It shows a popup menu with some options | 2070 It shows a popup menu with some options |
1698 """ | 2071 """ |
1699 _menu_view = gtk.Menu() | 2072 _menu_view = Gtk.Menu() |
1700 _item_leftright = gtk.MenuItem(_("Split View Left/Right")) | 2073 _item_leftright = Gtk.MenuItem(_("Split view Left/Right")) |
1701 _menu_view.append(_item_leftright) | 2074 _menu_view.append(_item_leftright) |
1702 _item_leftright.connect_object("activate", self._split_view, "h") | 2075 _item_leftright.connect("activate", self._split_view, "h") |
1703 _item_leftright.show() | 2076 _item_leftright.show() |
1704 _item_topbottom = gtk.MenuItem(_("Split View Top/Bottom")) | 2077 _item_topbottom = Gtk.MenuItem(_("Split view Top/Bottom")) |
1705 _menu_view.append(_item_topbottom) | 2078 _menu_view.append(_item_topbottom) |
1706 _item_topbottom.connect_object("activate", self._split_view, "v") | 2079 _item_topbottom.connect("activate", self._split_view, "v") |
1707 _item_topbottom.show() | 2080 _item_topbottom.show() |
1708 _item_close = gtk.MenuItem(_("Close view")) | 2081 _item_close = Gtk.MenuItem(_("Close view")) |
1709 _menu_view.append(_item_close) | 2082 _menu_view.append(_item_close) |
1710 _item_close.connect_object("activate", self._closeItem, None) | 2083 _item_close.connect("activate",self._closeItem_from_menu) |
1711 _item_close.show() | 2084 _item_close.show() |
1712 _menu_view.popup(None, None, None, 0, 0) | 2085 _menu_view.popup_at_widget(widget, Gdk.Gravity(7), Gdk.Gravity(1), Gtk.get_current_event()) |
1713 | 2086 |
1714 def _split_view(self, orientation): | 2087 def _split_view(self, widget, orientation): |
1715 """_menu_view(orientation) | 2088 """_menu_view(orientation) |
1716 | 2089 |
1717 orientation: orientation split, "h" or "v" | 2090 orientation: orientation split, "h" or "v" |
1718 | 2091 |
1719 Method connected to the "activate" signal of the _item_leftright and | 2092 Method connected to the "activate" signal of the _item_leftright and |
1730 It changes the __connected atribute to True or False, if the | 2103 It changes the __connected atribute to True or False, if the |
1731 _connected atribute is False the view do not send and receive messages | 2104 _connected atribute is False the view do not send and receive messages |
1732 to/from others views | 2105 to/from others views |
1733 """ | 2106 """ |
1734 if self.__connected: | 2107 if self.__connected: |
1735 _icon = gtk.Image() | 2108 _icon = Gtk.Image() |
1736 _icon.set_from_file(globalVars.getAppPath("DISCONNECTED-ICON")) | 2109 _icon.set_from_file(globalVars.getAppPath("DISCONNECTED-ICON")) |
1737 _icon.show() | 2110 _icon.show() |
1738 self.__connected_button.set_icon_widget(_icon) | 2111 self.__connected_button.set_icon_widget(_icon) |
2112 self.__connected_button.set_tooltip_text(_("Connect View")) | |
1739 self.__connected = False | 2113 self.__connected = False |
1740 else: | 2114 else: |
1741 _icon = gtk.Image() | 2115 _icon = Gtk.Image() |
1742 _icon.set_from_file(globalVars.getAppPath("CONNECTED-ICON")) | 2116 _icon.set_from_file(globalVars.getAppPath("CONNECTED-ICON")) |
1743 _icon.show() | 2117 _icon.show() |
2118 self.__connected_button.set_tooltip_text(_("Disconnect View")) | |
1744 self.__connected_button.set_icon_widget(_icon) | 2119 self.__connected_button.set_icon_widget(_icon) |
1745 self.__connected = True | 2120 self.__connected = True |
1746 | 2121 |
1747 def propagateMessageFrom(self, message, pane_path, arg=None): | 2122 def propagateMessageFrom(self, message, pane_path, arg=None): |
1748 """propagateMessageFrom(message, pane_path, arg=None) | 2123 """propagateMessageFrom(message, pane_path, arg=None) |
1768 1: record code | 2143 1: record code |
1769 This method receives a message and executes its corresponding action | 2144 This method receives a message and executes its corresponding action |
1770 """ | 2145 """ |
1771 if self.__connected: | 2146 if self.__connected: |
1772 self.__view.runMessage(message, pane_path, arg) | 2147 self.__view.runMessage(message, pane_path, arg) |
1773 if message == "change_active": | |
1774 if self.__budget.hasPath(arg): | |
1775 _path_record = arg | |
1776 self.__active_path_record = _path_record | |
1777 | 2148 |
1778 def _getWidget(self): | 2149 def _getWidget(self): |
1779 """_getWidget() | 2150 """_getWidget() |
1780 | 2151 |
1781 Return de pane widget | 2152 Return de pane widget |
1803 new_pane_path: the path that identifies the clone view in the page | 2174 new_pane_path: the path that identifies the clone view in the page |
1804 | 2175 |
1805 return a clone of itself | 2176 return a clone of itself |
1806 """ | 2177 """ |
1807 return View(self.__view_type, self.__budget, self.__wr_page, | 2178 return View(self.__view_type, self.__budget, self.__wr_page, |
1808 new_pane_path, self.__active_path_record) | 2179 new_pane_path, self.__view.active_path_record, |
2180 self.__connected) | |
1809 | 2181 |
1810 def clear(self): | 2182 def clear(self): |
1811 """clear() | 2183 """clear() |
1812 | 2184 |
1813 Clear the intance atributes | 2185 Clear the intance atributes |
1827 | 2199 |
1828 class Paned(object): | 2200 class Paned(object): |
1829 """gui.Paned: | 2201 """gui.Paned: |
1830 | 2202 |
1831 Description: | 2203 Description: |
1832 It creates and shows gtk.Hpaned or gtk.Vpaned to show in page budget | 2204 It creates and shows Gtk.Paned to show in page budget |
1833 Constructor: | 2205 Constructor: |
1834 Paned(orientation, widget1, widget2) | 2206 Paned(orientation, widget1, widget2) |
1835 orientation: The orientation of the pane separator, can be "v" or | 2207 orientation: The orientation of the pane separator, can be "v" or |
1836 "h" | 2208 "h" |
1837 widget1: the top or left pane widget | 2209 widget1: the top or left pane widget |
1838 widget2: the botton or right pane widget | 2210 widget2: the botton or right pane widget |
1839 Ancestry: | 2211 Ancestry: |
1840 +-- object | 2212 +-- object |
1841 +-- Paned | 2213 +-- Paned |
1842 Atributes: | 2214 Atributes: |
1843 widget: Read. Pane widget("gtk.VPaned" or "gtk.HPaned" object) | 2215 widget: Read. Pane widget("Gtk.Paned" object) |
1844 pane_path: Read-Write. The paned path in the page | 2216 pane_path: Read-Write. The paned path in the page |
1845 Methods: | 2217 Methods: |
1846 getClone | 2218 getClone |
1847 getItem | 2219 getItem |
1848 setItem | 2220 setItem |
1855 # TODO: 1.0 all the space for widget1 | 2227 # TODO: 1.0 all the space for widget1 |
1856 | 2228 |
1857 def __init__(self, orientation, pane_path, item1, item2): | 2229 def __init__(self, orientation, pane_path, item1, item2): |
1858 """__init__(oritentation, pane_path, item1, item2) | 2230 """__init__(oritentation, pane_path, item1, item2) |
1859 | 2231 |
1860 orientation: The orientation of de gtk.Paned, can be "v" or "h" | 2232 orientation: The orientation of de Gtk.Paned, can be "v" or "h" |
1861 pane_path: the paned path in the page | 2233 pane_path: the paned path in the page |
1862 item1: the top or left pane object | 2234 item1: the top or left pane object |
1863 item2: the bottom or right pane object | 2235 item2: the bottom or right pane object |
1864 | 2236 |
1865 self.__orientation: The orientation of de gtk.Paned, can be "v" or "h" | 2237 self.__orientation: The orientation of de Gtk.Paned, can be "v" or "h" |
1866 self.__widget: Main widget, a gtk.VPaned o gtk.HPaned | 2238 self.__widget: Main widget, a Gtk.Paned |
1867 self.__items: list of items showed in the paned, its can be View or | 2239 self.__items: list of items showed in the paned, its can be View or |
1868 Paned instances | 2240 Paned instances |
1869 self.__pane_path: the paned path in the page | 2241 self.__pane_path: the paned path in the page |
1870 | 2242 |
1871 Creates and shows a new gtk.Paned | 2243 Creates and shows a new Gtk.Paned |
1872 """ | 2244 """ |
1873 self.__orientation = orientation | 2245 self.__orientation = orientation |
1874 if not isinstance(item1.widget, gtk.Widget) or \ | 2246 if not isinstance(item1.widget, Gtk.Widget) or \ |
1875 not isinstance(item2.widget, gtk.Widget): | 2247 not isinstance(item2.widget, Gtk.Widget): |
1876 raise ValueError, _("The item must be a widget object.") | 2248 raise ValueError( _("The item must be a widget object.") ) |
1877 if orientation == "v": | 2249 if orientation == "v": |
1878 self.__widget = gtk.VPaned() | 2250 self.__widget = Gtk.Paned.new(Gtk.Orientation(1)) |
2251 self.__widget.set_wide_handle(True) | |
1879 elif orientation == "h": | 2252 elif orientation == "h": |
1880 self.__widget = gtk.HPaned() | 2253 self.__widget = Gtk.Paned.new(Gtk.Orientation(0)) |
2254 self.__widget.set_wide_handle(True) | |
1881 else: | 2255 else: |
1882 raise ValueError, _("Invalid orientation.") | 2256 raise ValueError( _("Invalid orientation.") ) |
1883 self.__widget.pack1(item1.widget,True,False) | 2257 self.__widget.pack1(item1.widget,True,False) |
1884 self.__widget.pack2(item2.widget,True,False) | 2258 self.__widget.pack2(item2.widget,True,False) |
1885 self.__widget.show() | 2259 self.__widget.show() |
1886 self.__items = [item1, item2] | 2260 self.__items = [item1, item2] |
1887 self.__pane_path = pane_path | 2261 self.__pane_path = pane_path |
1948 _item.runMessage(message, pane_path, arg) | 2322 _item.runMessage(message, pane_path, arg) |
1949 | 2323 |
1950 def _getWidget(self): | 2324 def _getWidget(self): |
1951 """_getWidget() | 2325 """_getWidget() |
1952 | 2326 |
1953 Return de gtk.Paned widget | 2327 Return de Gtk.Paned widget |
1954 """ | 2328 """ |
1955 return self.__widget | 2329 return self.__widget |
1956 | 2330 |
1957 def _getPanePath(self): | 2331 def _getPanePath(self): |
1958 """_getPanePath() | 2332 """_getPanePath() |
1978 del self.__widget | 2352 del self.__widget |
1979 del self.__orientation | 2353 del self.__orientation |
1980 del self.__items | 2354 del self.__items |
1981 del self.__pane_path | 2355 del self.__pane_path |
1982 | 2356 |
1983 widget = property(_getWidget, None, None, "gtk.Paned widget") | 2357 widget = property(_getWidget, None, None, "Gtk.Paned widget") |
1984 pane_path = property(_getPanePath, _setPanePath, None, | 2358 pane_path = property(_getPanePath, _setPanePath, None, |
1985 "Pane path in the notebook page") | 2359 "Pane path in the notebook page") |
1986 | 2360 |
1987 | 2361 |
1988 class TreeView(object): | 2362 class TreeView(object): |
2008 5. model column index | 2382 5. model column index |
2009 Ancestry: | 2383 Ancestry: |
2010 +-- object | 2384 +-- object |
2011 +-- TreeView | 2385 +-- TreeView |
2012 Atributes: | 2386 Atributes: |
2013 columns: list of columns (gtk.TreeViewColumn objects) | 2387 columns: list of columns (Gtk.TreeViewColumn objects) |
2014 Methods: | 2388 Methods: |
2015 createColumn | 2389 createColumn |
2016 createTextBaseColumn | 2390 createTextBaseColumn |
2017 createBaseColumn | 2391 createBaseColumn |
2018 """ | 2392 """ |
2037 Create the columns form the args info calling creatheColumn to create | 2411 Create the columns form the args info calling creatheColumn to create |
2038 each column | 2412 each column |
2039 """ | 2413 """ |
2040 self.columns = [ self.createColumn(arg) for arg in args ] | 2414 self.columns = [ self.createColumn(arg) for arg in args ] |
2041 self.columns.append(self.createColumn(("END",))) | 2415 self.columns.append(self.createColumn(("END",))) |
2042 | 2416 |
2043 def createColumn(self, args): | 2417 def createColumn(self, args): |
2044 """createColumn(args) | 2418 """createColumn(args) |
2045 | 2419 |
2046 args: tuple with the args | 2420 args: tuple with the args |
2047 0.type: | 2421 0.type: |
2059 | 2433 |
2060 Return a column created whith the arg info | 2434 Return a column created whith the arg info |
2061 """ | 2435 """ |
2062 if args[0] == "INDEX": | 2436 if args[0] == "INDEX": |
2063 _index_column = self.createBaseColumn(args) | 2437 _index_column = self.createBaseColumn(args) |
2064 _text_index_cell = gtk.CellRendererText() | 2438 _text_index_cell = Gtk.CellRendererText() |
2065 _text_index_cell.set_property('foreground-gdk', | 2439 _text_index_cell.set_property('foreground', |
2066 gtk.gdk.color_parse(globalVars.color["TEXT"])) | 2440 globalVars.color["TEXT"]) |
2067 _pixbuf_index_cell = gtk.CellRendererPixbuf() | 2441 _pixbuf_index_cell = Gtk.CellRendererPixbuf() |
2068 _arrow_icon = gtk.gdk.pixbuf_new_from_file( | 2442 _arrow_icon = GdkPixbuf.Pixbuf.new_from_file( |
2069 globalVars.getAppPath("ARROW-ICON")) | 2443 globalVars.getAppPath("ARROW-ICON")) |
2070 _pixbuf_index_cell.set_property("pixbuf", _arrow_icon) | 2444 _pixbuf_index_cell.set_property("pixbuf", _arrow_icon) |
2071 _index_column.pack_start(_text_index_cell, True) | 2445 _index_column.pack_start(_text_index_cell, True) |
2072 _index_column.pack_start(_pixbuf_index_cell, True) | 2446 _index_column.pack_start(_pixbuf_index_cell, True) |
2073 _index_column.set_cell_data_func(_text_index_cell, | 2447 _index_column.set_cell_data_func(_text_index_cell, |
2074 self._colorCell, | 2448 self._colorCell, |
2075 [gtk.gdk.color_parse(globalVars.color["INDEX-UNEVEN"]), | 2449 [globalVars.color["INDEX-UNEVEN"], |
2076 gtk.gdk.color_parse(globalVars.color["INDEX-EVEN"])]) | 2450 globalVars.color["INDEX-EVEN"]]) |
2077 return _index_column | 2451 return _index_column |
2078 elif args[0] == "TEXT": | 2452 elif args[0] == "TEXT": |
2079 _column, _cell = self.createTextBaseColumn(args) | 2453 _column, _cell = self.createTextBaseColumn(args) |
2080 _column.add_attribute(_cell, 'text', args[5]) | 2454 _column.add_attribute(_cell, 'text', args[5]) |
2081 return _column | 2455 return _column |
2082 elif args[0] == "FLOAT": | 2456 elif args[0] == "FLOAT": |
2083 _column, _cell = self.createTextBaseColumn(args) | 2457 _column, _cell = self.createTextBaseColumn(args) |
2084 _column.add_attribute(_cell, 'text', args[5]) | 2458 _column.add_attribute(_cell, 'text', args[5]) |
2085 _column.get_cell_renderers()[0].set_property('xalign', 1.0) | 2459 _column.get_cells()[0].set_property('xalign', 1.0) |
2086 return _column | 2460 return _column |
2087 elif args[0] == "CALCULATED": | 2461 elif args[0] == "CALCULATED": |
2088 _column, cell = self.createTextBaseColumn(args) | 2462 _column, cell = self.createTextBaseColumn(args) |
2089 _column.get_cell_renderers()[0].set_property('xalign', 1.0) | 2463 _column.get_cells()[0].set_property('xalign', 1.0) |
2090 return _column | 2464 return _column |
2091 elif args[0] == "CALCULATEDTEXT": | 2465 elif args[0] == "CALCULATEDTEXT": |
2092 _column, cell = self.createTextBaseColumn(args) | 2466 _column, cell = self.createTextBaseColumn(args) |
2093 return _column | 2467 return _column |
2094 elif args[0] == "TYPE": | 2468 elif args[0] == "TYPE": |
2095 _column = self.createBaseColumn(args) | 2469 _column = self.createBaseColumn(args) |
2096 _type_cell1 = gtk.CellRendererPixbuf() | 2470 _type_cell1 = Gtk.CellRendererPixbuf() |
2097 _type_cell2 = gtk.CellRendererText() | 2471 _type_cell2 = Gtk.CellRendererText() |
2098 _type_cell2.set_property('foreground-gdk', args[3]) | 2472 _type_cell2.set_property('foreground', args[3]) |
2099 _column.pack_start(_type_cell1, True) | 2473 _column.pack_start(_type_cell1, True) |
2100 _column.pack_start(_type_cell2, True) | 2474 _column.pack_start(_type_cell2, True) |
2101 _column.add_attribute(_type_cell2, 'text', args[5]) | 2475 _column.add_attribute(_type_cell2, 'text', args[5]) |
2102 _column.set_cell_data_func(_type_cell1, | 2476 _column.set_cell_data_func(_type_cell1, |
2103 self._colorCell, args[4]) | 2477 self._colorCell, args[4]) |
2104 _column.set_cell_data_func(_type_cell2, | 2478 _column.set_cell_data_func(_type_cell2, |
2105 self._colorCell, args[4]) | 2479 self._colorCell, args[4]) |
2106 return _column | 2480 return _column |
2107 elif args[0] == "PIXBUF": | 2481 elif args[0] == "PIXBUF": |
2108 _column = self.createBaseColumn(args) | 2482 _column = self.createBaseColumn(args) |
2109 _type_cell1 = gtk.CellRendererPixbuf() | 2483 _type_cell1 = Gtk.CellRendererPixbuf() |
2110 _column.pack_start(_type_cell1, True) | 2484 _column.pack_start(_type_cell1, True) |
2111 _column.set_cell_data_func(_type_cell1, | 2485 _column.set_cell_data_func(_type_cell1, |
2112 self._colorCell, args[4]) | 2486 self._colorCell, args[4]) |
2113 return _column | 2487 return _column |
2114 elif args[0] == "END": | 2488 elif args[0] == "END": |
2115 _end_column = gtk.TreeViewColumn() | 2489 _end_column = Gtk.TreeViewColumn() |
2116 _end_column.set_clickable(False) | 2490 _end_column.set_clickable(False) |
2117 _end_cell = gtk.CellRendererText() | 2491 _end_cell = Gtk.CellRendererText() |
2118 _end_cell.set_property('cell-background-gdk', | 2492 _end_cell.set_property('background', |
2119 gtk.gdk.color_parse(globalVars.color["UNEVEN"])) | 2493 globalVars.color["UNEVEN"]) |
2120 _end_column.pack_start(_end_cell, True) | 2494 _end_column.pack_start(_end_cell, True) |
2121 return _end_column | 2495 return _end_column |
2122 return None | 2496 return None |
2123 | 2497 |
2124 def createTextBaseColumn(self, args): | 2498 def createTextBaseColumn(self, args): |
2137 5. model column index | 2511 5. model column index |
2138 | 2512 |
2139 Return a column and its CellREndererText | 2513 Return a column and its CellREndererText |
2140 """ | 2514 """ |
2141 _column = self.createBaseColumn(args) | 2515 _column = self.createBaseColumn(args) |
2142 _cell = gtk.CellRendererText() | 2516 _cell = Gtk.CellRendererText() |
2143 _cell.set_property('foreground-gdk', args[3]) | 2517 _cell.set_property('foreground', args[3]) |
2144 _column.pack_start(_cell, True) | 2518 _column.pack_start(_cell, True) |
2145 _column.set_cell_data_func(_cell, self._colorCell, args[4]) | 2519 _column.set_cell_data_func(_cell, self._colorCell, args[4]) |
2146 return _column, _cell | 2520 return _column, _cell |
2147 | 2521 |
2148 def createBaseColumn(self, args): | 2522 def createBaseColumn(self, args): |
2162 4. backgruound colors | 2536 4. backgruound colors |
2163 5. model column index | 2537 5. model column index |
2164 | 2538 |
2165 Return a column | 2539 Return a column |
2166 """ | 2540 """ |
2167 _column = gtk.TreeViewColumn() | 2541 _column = Gtk.TreeViewColumn() |
2168 _column.set_clickable(True) | 2542 _column.set_clickable(True) |
2169 _column.connect("clicked", args[1]) | 2543 _column.connect("clicked", args[1]) |
2170 _column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) | 2544 _column.set_sizing(Gtk.TreeViewColumnSizing(2)) # 2 Fixed |
2171 _column.set_fixed_width(args[2]) | 2545 _column.set_fixed_width(args[2]) |
2172 _column.set_resizable(True) | 2546 _column.set_resizable(True) |
2173 return _column | 2547 return _column |
2174 | 2548 |
2175 | 2549 |
2177 """gui.DecompositionList: | 2551 """gui.DecompositionList: |
2178 | 2552 |
2179 Description: | 2553 Description: |
2180 Class to show a budget Decomposition List | 2554 Class to show a budget Decomposition List |
2181 Constructor: | 2555 Constructor: |
2182 DecompositionList(budget, page, pane_path, path_record=(0,)) | 2556 DecompositionList(budget, page, pane_path, path_record=None) |
2183 budget: budget showed ("base.Budget" object) | 2557 budget: budget showed ("base.Budget" object) |
2184 page: weak reference from Page instance which creates this class | 2558 page: weak reference from Page instance which creates this class |
2185 pane_path: tuple that represents the view path in the Page | 2559 pane_path: tuple that represents the view path in the Page |
2186 path_record: the record path that must be showed | 2560 path_record: the record path that must be showed |
2187 Returns the newly created DecompositionList instance | 2561 Returns the newly created DecompositionList instance |
2189 +-- object | 2563 +-- object |
2190 +-- TreeView | 2564 +-- TreeView |
2191 +-- DecompositionList | 2565 +-- DecompositionList |
2192 Atributes: | 2566 Atributes: |
2193 budget: Read. Budget to show, base.obra object. | 2567 budget: Read. Budget to show, base.obra object. |
2194 widget: Read. Window that contains the table, gtk.ScrolledWindow | 2568 widget: Read. Window that contains the table, Gtk.ScrolledWindow |
2195 pane_path: Read-Write. Pane page identifier | 2569 pane_path: Read-Write. Pane page identifier |
2196 page: Read-Write. weak ref from Page object which creates this class | 2570 wr_page: Read-Write. weak ref from Page object which creates this class |
2197 active_path_record: Read. Active path record | 2571 active_path_record: Read. Active path record |
2198 Methods: | 2572 Methods: |
2199 runMessage | 2573 runMessage |
2200 """ | 2574 """ |
2201 | 2575 |
2202 def __init__(self, budget, page, pane_path, path_record=None): | 2576 def __init__(self, budget, wr_page, pane_path, path_record=None): |
2203 """__init__(budget, page, pane_path, path_record=None) | 2577 """__init__(budget, page, pane_path, path_record=None) |
2204 | 2578 |
2205 budget: budget showed ("base.Budget" object) | 2579 budget: budget showed ("base.Budget" object) |
2206 page: weak reference from Page instance which creates this class | 2580 page: weak reference from Page instance which creates this class |
2207 pane_path: tuple that represents the path of the List in the Page | 2581 pane_path: tuple that represents the path of the List in the Page |
2208 path_record: the record path that must be showed | 2582 path_record: the record path that must be showed |
2209 | 2583 |
2210 self.__budget: budget showed ("base.Budget" object) | 2584 self.__budget: budget showed ("base.Budget" object) |
2211 self.__page: weak reference from Page instance which creates this class | 2585 self.__wr_page: weak reference from Page instance which creates this class |
2212 self.__pane_path: tuple that represents the path of the List in the Page | 2586 self.__pane_path: tuple that represents the path of the List in the Page |
2213 self.__liststore: list model which store the list data | 2587 self.__liststore: list model which store the list data |
2214 (gtk.ListStore object) | 2588 (Gtk.ListStore object) |
2215 self.__active_path_record: the record path that must be showed | 2589 self.__active_path_record: the record path that must be showed |
2216 self.__treeview: widget for displaying decomposition lists | 2590 self.__treeview: widget for displaying decomposition lists |
2217 (gtk.TreeView) | 2591 (Gtk.TreeView) |
2218 self.__scrolled_window: widget to contain the treeview object | 2592 self.__scrolled_window: widget to contain the treeview object |
2219 self.__chapter_background_colors: background colors of the Code | 2593 self.__chapter_background_colors: background colors of the Code |
2220 column cells when there is a chapter record, | 2594 column cells when there is a chapter record, |
2221 list of gtk.gdk.Color objects [even cell, uneven cell] | 2595 list of color [even cell, uneven cell] |
2222 self.__chapter_background_colors | 2596 self.__chapter_background_colors |
2223 self.__index_column: Index column (gtk.TreeViewColumn object) | 2597 self.__index_column: Index column (Gtk.TreeViewColumn object) |
2224 self.__code_column: Record code column (gtk.TreeViewColumn) | 2598 self.__code_column: Record code column (Gtk.TreeViewColumn) |
2225 self.__type_column: Record Type column (gtk.TreeViewColumn) | 2599 self.__type_column: Record Type column (Gtk.TreeViewColumn) |
2226 self.__unit_column: Unit of measure column (gtk.TreeViewColumn) | 2600 self.__unit_column: Unit of measure column (Gtk.TreeViewColumn) |
2227 self.__description_column: record's short description column | 2601 self.__description_column: record's short description column |
2228 (gtk.TreeViewColumn) | 2602 (Gtk.TreeViewColumn) |
2229 self.__measure_column: Measure column (gtk.TreeViewColumn) | 2603 self.__measure_column: Measure column (Gtk.TreeViewColumn) |
2230 self.__price_column: Price column (gtk.TreeViewColumn) | 2604 self.__price_column: Price column (Gtk.TreeViewColumn) |
2231 self.__amount_column: Amount column(gtk.TreeViewColumn) | 2605 self.__amount_column: Amount column(Gtk.TreeViewColumn) |
2232 self.__end_column: End empty column (gtk.TreeViewColumn) | 2606 self.__end_column: End empty column (Gtk.TreeViewColumn) |
2233 self.__chapter_icon: a gtk.gdk.pixbuf | 2607 self.__chapter_icon: a GdkPixbuf.Pixbuf |
2234 self.__unit_icon: a gtk.gdk.pixbuf | 2608 self.__unit_icon: a GdkPixbuf.Pixbuf |
2235 self.__material_icon: a gtk.gdk.pixbuf | 2609 self.__material_icon: a GdkPixbuf.Pixbuf |
2236 self.__machinery_icon: a gtk.gdk.pixbuf | 2610 self.__machinery_icon: a GdkPixbuf.Pixbuf |
2237 self.__labourforce_icon: a gtk.gdk.pixbuf | 2611 self.__labourforce_icon: a GdkPixbuf.Pixbuf |
2238 self.__treeselection: active selection | 2612 self.__treeselection: active selection |
2239 self.__selection_control: state of the selection control (True/False) | 2613 self.__selection_control: state of the selection control (True/False) |
2240 self.__cursor: cursor position in the table | 2614 self.__cursor: cursor position in the table |
2241 | 2615 |
2242 Sets the init atributes | 2616 Sets the init atributes |
2248 * Sets the selection properties | 2622 * Sets the selection properties |
2249 * Connects the events | 2623 * Connects the events |
2250 """ | 2624 """ |
2251 # TODO: to group all columns in a dicctionary | 2625 # TODO: to group all columns in a dicctionary |
2252 # Budget | 2626 # Budget |
2253 if path_record is None: | |
2254 parh_record = (0,) | |
2255 if not isinstance(budget, base.Budget): | 2627 if not isinstance(budget, base.Budget): |
2256 raise ValueError, _("Argument must be a Budget object") | 2628 raise ValueError( _("Argument must be a Budget object") ) |
2257 self.__budget = budget | 2629 self.__budget = budget |
2258 self.__page = page | 2630 self.__wr_page = wr_page |
2259 self.__pane_path = pane_path | 2631 self.__pane_path = pane_path |
2260 # ListStore | 2632 # ListStore |
2261 self.__liststore = gtk.ListStore(object | 2633 self.__liststore = Gtk.ListStore(object |
2262 #, int, int, str, str, str, str, str,str | 2634 #, int, int, str, str, str, str, str,str |
2263 ) | 2635 ) |
2264 if path_record is None: | 2636 if path_record is None: |
2265 print _("Record path can not be None") | |
2266 path_record = (0,) | 2637 path_record = (0,) |
2267 self.__active_path_record = path_record | 2638 self.__active_path_record = path_record |
2268 self._setListstoreValues(self.__active_path_record) | 2639 self._setListstoreValues(self.__active_path_record) |
2269 # Treeview | 2640 # Treeview |
2270 self.__treeview = gtk.TreeView(self.__liststore) | 2641 self.__treeview = Gtk.TreeView(self.__liststore) |
2271 self.__treeview.set_enable_search(False) | 2642 self.__treeview.set_enable_search(False) |
2272 self.__treeview.set_reorderable(False) | 2643 self.__treeview.set_reorderable(False) |
2273 self.__treeview.set_headers_clickable(True) | 2644 self.__treeview.set_headers_clickable(True) |
2274 self.__treeview.show() | 2645 self.__treeview.show() |
2275 # Scrolled_window | 2646 # Scrolled_window |
2276 self.__scrolled_window = gtk.ScrolledWindow() | 2647 self.__scrolled_window = Gtk.ScrolledWindow() |
2277 self.__scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, | 2648 self.__scrolled_window.set_property("expand", True) # widget expand all space |
2278 gtk.POLICY_AUTOMATIC) | 2649 self.__scrolled_window.set_policy(Gtk.PolicyType(1), |
2650 Gtk.PolicyType(1)) # 1 Automatic | |
2279 self.__scrolled_window.add(self.__treeview) | 2651 self.__scrolled_window.add(self.__treeview) |
2280 # colors | 2652 # colors |
2281 _text_color = gtk.gdk.color_parse(globalVars.color["TEXT"]) | 2653 _text_color = globalVars.color["TEXT"] |
2282 _background_color = [ | 2654 _background_color = [ |
2283 gtk.gdk.color_parse(globalVars.color["UNEVEN"]), | 2655 globalVars.color["UNEVEN"], |
2284 gtk.gdk.color_parse(globalVars.color["EVEN"])] | 2656 globalVars.color["EVEN"]] |
2285 self.__chapter_background_colors = [ | 2657 self.__chapter_background_colors = [ |
2286 gtk.gdk.color_parse(globalVars.color["CHAPTER-UNEVEN"]), | 2658 globalVars.color["CHAPTER-UNEVEN"], |
2287 gtk.gdk.color_parse(globalVars.color["CHAPTER-EVEN"])] | 2659 globalVars.color["CHAPTER-EVEN"]] |
2288 super(DecompositionList,self).__init__( | 2660 super(DecompositionList,self).__init__( |
2289 [("INDEX",self._selectAll,42), | 2661 [("INDEX",self._selectAll,42), |
2290 ("CALCULATEDTEXT", self._showParentRecord, | 2662 ("CALCULATEDTEXT", self._showParentRecord, |
2291 gtk.Label("A"*10).size_request()[0] +10, | 2663 100, _text_color, _background_color), |
2292 _text_color, _background_color), | |
2293 ("PIXBUF", self._showParentRecord, 26, _text_color, | 2664 ("PIXBUF", self._showParentRecord, 26, _text_color, |
2294 _background_color), | 2665 _background_color), |
2295 ("CALCULATEDTEXT", self._showParentRecord, | 2666 ("CALCULATEDTEXT", self._showParentRecord, |
2296 gtk.Label(_("a"*4)).size_request()[0] +10, | 2667 52, _text_color, _background_color), |
2297 _text_color, _background_color), | |
2298 ("CALCULATEDTEXT", self._showParentRecord, | 2668 ("CALCULATEDTEXT", self._showParentRecord, |
2299 gtk.Label("a"*30).size_request()[0] +10, | 2669 245, _text_color, _background_color), |
2300 _text_color, _background_color), | |
2301 ("CALCULATED", self._showParentRecord, | 2670 ("CALCULATED", self._showParentRecord, |
2302 gtk.Label("a"*10).size_request()[0] +10, | 2671 90, _text_color, _background_color), |
2303 _text_color, _background_color), | |
2304 ("CALCULATED", self._showParentRecord, | 2672 ("CALCULATED", self._showParentRecord, |
2305 gtk.Label("a"*10).size_request()[0] +10, | 2673 90, _text_color, _background_color), |
2306 _text_color, _background_color), | |
2307 ("CALCULATED", self._showParentRecord, | 2674 ("CALCULATED", self._showParentRecord, |
2308 gtk.Label("a"*10).size_request()[0] +10, | 2675 90, globalVars.color["CALCULATED-TEXT"], |
2309 gtk.gdk.color_parse(globalVars.color["CALCULATED-TEXT"]), | |
2310 _background_color), | 2676 _background_color), |
2311 ]) | 2677 ]) |
2312 self.__index_column = self.columns[0] | 2678 self.__index_column = self.columns[0] |
2313 self.__code_column = self.columns[1] | 2679 self.__code_column = self.columns[1] |
2314 self.__type_column = self.columns[2] | 2680 self.__type_column = self.columns[2] |
2322 self.__treeview.append_column(self.__index_column) | 2688 self.__treeview.append_column(self.__index_column) |
2323 # Code column | 2689 # Code column |
2324 self.__treeview.append_column(self.__code_column) | 2690 self.__treeview.append_column(self.__code_column) |
2325 # Type column | 2691 # Type column |
2326 self.__treeview.append_column(self.__type_column) | 2692 self.__treeview.append_column(self.__type_column) |
2327 self.__chapter_icon = gtk.gdk.pixbuf_new_from_file( | 2693 self.__chapter_icon = GdkPixbuf.Pixbuf.new_from_file( |
2328 globalVars.getAppPath("CHAPTER-ICON")) | 2694 globalVars.getAppPath("CHAPTER-ICON")) |
2329 self.__unit_icon = gtk.gdk.pixbuf_new_from_file( | 2695 self.__unit_icon = GdkPixbuf.Pixbuf.new_from_file( |
2330 globalVars.getAppPath("UNIT-ICON") ) | 2696 globalVars.getAppPath("UNIT-ICON") ) |
2331 self.__material_icon = gtk.gdk.pixbuf_new_from_file( | 2697 self.__material_icon = GdkPixbuf.Pixbuf.new_from_file( |
2332 globalVars.getAppPath("MATERIAL-ICON") ) | 2698 globalVars.getAppPath("MATERIAL-ICON") ) |
2333 self.__machinery_icon = gtk.gdk.pixbuf_new_from_file( | 2699 self.__machinery_icon = GdkPixbuf.Pixbuf.new_from_file( |
2334 globalVars.getAppPath("MACHINERY-ICON")) | 2700 globalVars.getAppPath("MACHINERY-ICON")) |
2335 self.__labourforce_icon = gtk.gdk.pixbuf_new_from_file( | 2701 self.__labourforce_icon = GdkPixbuf.Pixbuf.new_from_file( |
2336 globalVars.getAppPath("LABOURFORCE-ICON")) | 2702 globalVars.getAppPath("LABOURFORCE-ICON")) |
2337 self.__type_column.get_cell_renderers()[0].set_property("pixbuf", | 2703 self.__type_column.get_cells()[0].set_property("pixbuf", |
2338 self.__labourforce_icon) | 2704 self.__labourforce_icon) |
2339 | |
2340 # Unit column | 2705 # Unit column |
2341 self.__treeview.append_column(self.__unit_column) | 2706 self.__treeview.append_column(self.__unit_column) |
2342 # Description column | 2707 # Description column |
2343 self.__treeview.append_column(self.__description_column) | 2708 self.__treeview.append_column(self.__description_column) |
2344 # Measure Column | 2709 # Measure Column |
2356 self.__treeview.connect("button-press-event", | 2721 self.__treeview.connect("button-press-event", |
2357 self._treeviewClickedEvent) | 2722 self._treeviewClickedEvent) |
2358 self.__treeview.connect("cursor-changed", self._treeviewCursorChanged) | 2723 self.__treeview.connect("cursor-changed", self._treeviewCursorChanged) |
2359 # control selection | 2724 # control selection |
2360 self.__treeselection = self.__treeview.get_selection() | 2725 self.__treeselection = self.__treeview.get_selection() |
2361 self.__treeselection.set_mode(gtk.SELECTION_MULTIPLE) | 2726 self.__treeselection.set_mode(Gtk.SelectionMode(3)) # 3 MULTIPLE |
2362 self.__treeselection.set_select_function(self._controlSelection) | 2727 self.__treeselection.set_select_function(self._controlSelection) |
2363 self.__selection_control = True | 2728 self.__selection_control = True |
2364 if len(self.__liststore) > 0: | 2729 if len(self.__liststore) > 0: |
2365 self.__treeview.set_cursor_on_cell((0,),self.__unit_column, | 2730 _tree_path = Gtk.TreePath.new_from_indices((0,)) |
2366 self.__unit_column.get_cell_renderers()[0],True) | 2731 self.__treeview.set_cursor_on_cell(_tree_path ,self.__unit_column, |
2732 self.__unit_column.get_cells()[0],True) | |
2367 self.__treeview.grab_focus() | 2733 self.__treeview.grab_focus() |
2368 self.__cursor = self.__treeview.get_cursor() | 2734 self.__cursor = self.__treeview.get_cursor() |
2369 # Show | 2735 # Show |
2370 self._setColumnsHeaders() | 2736 self._setColumnsHeaders() |
2371 self.__scrolled_window.show() | 2737 self.__scrolled_window.show() |
2377 Method connected to "cursor-changed" signal | 2743 Method connected to "cursor-changed" signal |
2378 The "cursor-changed" signal is emitted when the cursor moves or is set | 2744 The "cursor-changed" signal is emitted when the cursor moves or is set |
2379 Sets the new cursor position in self.__cursor, it is used to avoid | 2745 Sets the new cursor position in self.__cursor, it is used to avoid |
2380 unnecessary changes in cursor position. | 2746 unnecessary changes in cursor position. |
2381 """ | 2747 """ |
2382 event = gtk.get_current_event() | 2748 event = Gtk.get_current_event() |
2383 (_cursor_path, _column) = treeview.get_cursor() | 2749 (_cursor_path, _column) = treeview.get_cursor() |
2384 if event is None or event.type != gtk.gdk.BUTTON_RELEASE: | 2750 if event is None or event.type != Gdk.EventType(7): # 7 BUTTON_RELEASE |
2385 if not _column is self.__index_column: | 2751 if not _column is self.__index_column: |
2386 self.__cursor = treeview.get_cursor() | 2752 self.__cursor = treeview.get_cursor() |
2387 | 2753 |
2388 def _treeviewClickedEvent(self, widget, event): | 2754 def _treeviewClickedEvent(self, widget, event): |
2389 """_treeviewClickedEvent(widget, event) | 2755 """_treeviewClickedEvent(widget, event) |
2425 If the user press the right cursor button and the cursor is in the | 2791 If the user press the right cursor button and the cursor is in the |
2426 amount column or pres the left cursor button and the cursor is | 2792 amount column or pres the left cursor button and the cursor is |
2427 in the code column the event is estoped, else the event is propagated. | 2793 in the code column the event is estoped, else the event is propagated. |
2428 """ | 2794 """ |
2429 (_cursor_path, _column) = self.__treeview.get_cursor() | 2795 (_cursor_path, _column) = self.__treeview.get_cursor() |
2430 if (event.keyval == gtk.keysyms.Right \ | 2796 if (event.keyval in [Gdk.keyval_from_name("Right"), |
2797 Gdk.keyval_from_name("KP_Right")] \ | |
2431 and _column == self.columns[-2]) \ | 2798 and _column == self.columns[-2]) \ |
2432 or (event.keyval == gtk.keysyms.Left \ | 2799 or (event.keyval in [Gdk.keyval_from_name("Left"), |
2800 Gdk.keyval_from_name("KP_Left")] \ | |
2433 and _column == self.columns[1]): | 2801 and _column == self.columns[1]): |
2434 return True | 2802 return True |
2435 return False | 2803 return False |
2436 | 2804 |
2437 def _moveCursor(self, treeview, step, count): | 2805 def _moveCursor(self, treeview, step, count): |
2448 | 2816 |
2449 Returns :TRUE if the signal was handled. | 2817 Returns :TRUE if the signal was handled. |
2450 """ | 2818 """ |
2451 return False | 2819 return False |
2452 | 2820 |
2453 def _controlSelection(self, selection): | 2821 def _controlSelection(self, selection, model, path, path_currently_selected, *data): |
2454 """_controlSelection(selection) | 2822 """_controlSelection(selection) |
2455 | 2823 |
2456 selection: treeselection | 2824 selection: treeselection |
2457 | 2825 |
2458 Method connected to set_selection_function() | 2826 Method connected to set_selection_function() |
2483 If the user clickes in the index column header selecs or deselects | 2851 If the user clickes in the index column header selecs or deselects |
2484 all rows | 2852 all rows |
2485 """ | 2853 """ |
2486 (_model, _pathlist) = self.__treeselection.get_selected_rows() | 2854 (_model, _pathlist) = self.__treeselection.get_selected_rows() |
2487 # it avoid to set cursor in the index column | 2855 # it avoid to set cursor in the index column |
2488 self.__treeview.set_cursor(self.__cursor[0], self.__cursor[1]) | 2856 if isinstance(self.__cursor[0],Gtk.TreePath): |
2489 self.__selection_control = False | 2857 self.__treeview.set_cursor(self.__cursor[0], self.__cursor[1]) |
2490 if len(_pathlist) == 0: | 2858 self.__selection_control = False |
2491 # select all | 2859 if len(_pathlist) == 0: |
2492 self.__treeselection.select_all() | 2860 # select all |
2493 else: | 2861 self.__treeselection.select_all() |
2494 # unselect all | 2862 else: |
2495 self.__treeselection.unselect_all() | 2863 # unselect all |
2496 self.__selection_control = True | 2864 self.__treeselection.unselect_all() |
2865 self.__selection_control = True | |
2497 | 2866 |
2498 def _setColumnsHeaders(self): | 2867 def _setColumnsHeaders(self): |
2499 """_setColumnsHeaders() | 2868 """_setColumnsHeaders() |
2500 | 2869 |
2501 Sets the headers column values | 2870 Sets the headers column values |
2509 _budget.getRecord(_code).recordType) | 2878 _budget.getRecord(_code).recordType) |
2510 _record = _budget.getRecord(_code) | 2879 _record = _budget.getRecord(_code) |
2511 _unit = _record.unit | 2880 _unit = _record.unit |
2512 _description = _record.summary | 2881 _description = _record.summary |
2513 _price = _budget.getStrPriceFromRecord(self.budget.getActiveTitle(), | 2882 _price = _budget.getStrPriceFromRecord(self.budget.getActiveTitle(), |
2514 _record) | 2883 _record, _path_record) |
2515 # TODO: round to decimal places in amount | 2884 # TODO: round to decimal places in amount |
2516 _amount = float(_stryield) * float(_price) | 2885 _amount = float(_stryield) * float(_price) |
2517 if len(_path_record) == 1: # root record | 2886 if len(_path_record) == 1: # root record |
2518 _amount = _price | 2887 _amount = _price |
2519 else: | 2888 else: |
2520 _parent_code = self.budget.getCode(self.__active_path_record[:-1]) | 2889 _parent_code = self.budget.getCode(self.__active_path_record[:-1]) |
2521 _parent_record = self.__budget.getRecord(_parent_code) | 2890 _parent_record = self.__budget.getRecord(_parent_code) |
2522 _amount = _budget.getStrAmount(self.__active_path_record) | 2891 _amount = _budget.getStrAmount(self.__active_path_record) |
2523 | 2892 self.__code_column.set_title(_("Code") + chr(10) + "[" + _code.decode("utf8") + "]") |
2524 self.__code_column.set_title(_("Code") + chr(10) + "[" + _code + "]") | 2893 self.__unit_column.set_title(_("Unit") + chr(10) + "[" + _unit.decode("utf8") + "]") |
2525 self.__unit_column.set_title(_("Unit") + chr(10) + "[" + _unit + "]") | |
2526 self.__description_column.set_title( | 2894 self.__description_column.set_title( |
2527 _("Description") + chr(10) + "[" + _description + "]") | 2895 _("Description") + chr(10) + "[" + _description.decode("utf8") + "]") |
2528 self.__measure_column.set_title( | 2896 self.__measure_column.set_title( |
2529 _("Measure") + chr(10) + "[" + _stryield + "]") | 2897 _("Measure") + chr(10) + "[" + _stryield + "]") |
2530 self.__price_column.set_title( | 2898 self.__price_column.set_title( |
2531 _("Price") + chr(10) + "[" + _price + "]") | 2899 _("Price") + chr(10) + "[" + _price + "]") |
2532 self.__amount_column.set_title( | 2900 self.__amount_column.set_title( |
2539 Sets the liststore record values from a path record | 2907 Sets the liststore record values from a path record |
2540 """ | 2908 """ |
2541 self.__liststore.clear() | 2909 self.__liststore.clear() |
2542 _budget = self.__budget | 2910 _budget = self.__budget |
2543 if not _budget.hasPath(path_record): | 2911 if not _budget.hasPath(path_record): |
2544 raise ValueError, _("Invalid path") | 2912 raise ValueError( _("Invalid path") ) |
2545 else: | 2913 else: |
2546 _parent_code = _budget.getCode(path_record) | 2914 _parent_code = _budget.getCode(path_record) |
2547 for N,_code in enumerate(_budget.getchildren(_parent_code)): | 2915 for N,_code in enumerate(_budget.getchildren(_parent_code)): |
2548 _decomposition = _budget.getNDecomposition(_parent_code, N) | 2916 _decomposition = _budget.getNDecomposition(_parent_code, N) |
2549 _record = _budget.getRecord(_code) | 2917 _record = _budget.getRecord(_code) |
2562 _treeiter = self.__liststore.append(_values) | 2930 _treeiter = self.__liststore.append(_values) |
2563 | 2931 |
2564 def _colorCell(self, column, cell_renderer, tree_model, iter, lcolor): | 2932 def _colorCell(self, column, cell_renderer, tree_model, iter, lcolor): |
2565 """_colorCell(column, cell_renderer, tree_model, iter, lcolor) | 2933 """_colorCell(column, cell_renderer, tree_model, iter, lcolor) |
2566 | 2934 |
2567 column: the gtk.TreeViewColumn in the treeview | 2935 column: the Gtk.TreeViewColumn in the treeview |
2568 cell_renderer: a gtk.CellRenderer | 2936 cell_renderer: a Gtk.CellRenderer |
2569 tree_model: the gtk.TreeModel | 2937 tree_model: the Gtk.TreeModel |
2570 iter: gtk.TreeIter pointing at the row | 2938 iter: Gtk.TreeIter pointing at the row |
2571 lcolor: list with 2 gtk colors for even and uneven record | 2939 lcolor: list with 2 Gtk colors for even and uneven record |
2572 | 2940 |
2573 Method connected to "set_cell_data_func" of many column | 2941 Method connected to "set_cell_data_func" of many column |
2574 The set_cell_data_func() method sets the data function (or method) | 2942 The set_cell_data_func() method sets the data function (or method) |
2575 to use for the column gtk.CellRenderer specified by cell_renderer. | 2943 to use for the column Gtk.CellRenderer specified by cell_renderer. |
2576 This function (or method) is used instead of the standard attribute | 2944 This function (or method) is used instead of the standard attribute |
2577 mappings for setting the column values, and should set the attributes | 2945 mappings for setting the column values, and should set the attributes |
2578 of the cell renderer as appropriate. func may be None to remove the | 2946 of the cell renderer as appropriate. func may be None to remove the |
2579 current data function. The signature of func is: | 2947 current data function. The signature of func is: |
2580 -def celldatafunction(column, cell, model, iter, user_data) | 2948 -def celldatafunction(column, cell_renderer, tree_model, iter, lcolor) |
2581 -def celldatamethod(self, column, cell, model, iter, user_data) | 2949 -def celldatamethod(self,column,cell_renderer,tree_model, iter, lcolor) |
2582 where column is the gtk.TreeViewColumn in the treeview, cell is the | 2950 where column is the Gtk.TreeViewColumn in the treeview, cell is the |
2583 gtk.CellRenderer for column, model is the gtk.TreeModel for the | 2951 Gtk.CellRenderer for column, model is the Gtk.TreeModel for the |
2584 treeview and iter is the gtk.TreeIter pointing at the row. | 2952 treeview and iter is the Gtk.TreeIter pointing at the row. |
2585 | 2953 |
2586 The method sets cell background color and text for all columns. | 2954 The method sets cell background color and text for all columns. |
2587 """ | 2955 """ |
2588 _row_path = tree_model.get_path(iter) | 2956 _row_path = tree_model.get_path(iter) |
2957 _global_row_path = self.__active_path_record + (_row_path[0],) | |
2589 _number = _row_path[-1] | 2958 _number = _row_path[-1] |
2590 _record = tree_model[_row_path][0] | 2959 _record = tree_model[_row_path][0] |
2591 if column is self.__index_column: | 2960 if column is self.__index_column: |
2592 cell_renderer.set_property('text', str(_number + 1)) | 2961 cell_renderer.set_property('text', str(_number + 1)) |
2593 self.__index_column.get_cell_renderers()[1].set_property( | 2962 self.__index_column.get_cells()[1].set_property( |
2594 'cell-background-gdk', lcolor[_number % 2]) | 2963 'cell-background', lcolor[_number % 2]) |
2595 elif column is self.__code_column: | 2964 elif column is self.__code_column: |
2596 # if the record is a chapter | 2965 # if the record is a chapter |
2597 if tree_model.get_value(iter, 0).recordType.hierarchy == 1: | 2966 if tree_model.get_value(iter, 0).recordType.hierarchy == 1: |
2598 lcolor = self.__chapter_background_colors | 2967 lcolor = self.__chapter_background_colors |
2599 _code = _record.code | 2968 _code = _record.code |
2611 _stryield = self.__budget.getStrYield( | 2980 _stryield = self.__budget.getStrYield( |
2612 _decomposition.budgetMeasures[0], _parent_record.recordType) | 2981 _decomposition.budgetMeasures[0], _parent_record.recordType) |
2613 cell_renderer.set_property('text', _stryield) | 2982 cell_renderer.set_property('text', _stryield) |
2614 elif column is self.__price_column: | 2983 elif column is self.__price_column: |
2615 _price = self.budget.getStrPriceFromRecord( | 2984 _price = self.budget.getStrPriceFromRecord( |
2616 self.budget.getActiveTitle(), _record) | 2985 self.budget.getActiveTitle(), _record, _global_row_path) |
2617 cell_renderer.set_property('text', _price) | 2986 cell_renderer.set_property('text', _price) |
2618 elif column is self.__amount_column: | 2987 elif column is self.__amount_column: |
2619 _parent_code = self.budget.getCode(self.__active_path_record) | 2988 _parent_code = self.budget.getCode(self.__active_path_record) |
2620 _parent_record = self.__budget.getRecord(_parent_code) | 2989 _parent_record = self.__budget.getRecord(_parent_code) |
2621 _amount = self.budget.getStrAmount( | 2990 _amount = self.budget.getStrAmount( |
2637 cell_renderer.set_property("pixbuf", | 3006 cell_renderer.set_property("pixbuf", |
2638 self.__machinery_icon) | 3007 self.__machinery_icon) |
2639 else: | 3008 else: |
2640 cell_renderer.set_property("pixbuf",self.__material_icon) | 3009 cell_renderer.set_property("pixbuf",self.__material_icon) |
2641 if self.__treeview.get_cursor() == (_row_path,column): | 3010 if self.__treeview.get_cursor() == (_row_path,column): |
2642 cell_renderer.set_property('cell-background-gdk', | 3011 cell_renderer.set_property('cell-background', |
2643 gtk.gdk.color_parse(globalVars.color["ACTIVE"])) | 3012 globalVars.color["ACTIVE"]) |
2644 else: | 3013 else: |
2645 cell_renderer.set_property('cell-background-gdk', | 3014 cell_renderer.set_property('cell-background', |
2646 lcolor[_number % 2]) | 3015 lcolor[_number % 2]) |
2647 | 3016 |
2648 def _showParentRecord(self, column): | 3017 def _showParentRecord(self, column): |
2649 """_showParentRecord(column) | 3018 """_showParentRecord(column) |
2650 | 3019 |
2654 """ | 3023 """ |
2655 _budget = self.__budget | 3024 _budget = self.__budget |
2656 if len(self.__active_path_record) == 1: | 3025 if len(self.__active_path_record) == 1: |
2657 # The active record is the root record | 3026 # The active record is the root record |
2658 # This avoid to move the cursor to the clicked column | 3027 # This avoid to move the cursor to the clicked column |
2659 self.__treeview.set_cursor(self.__cursor[0], self.__cursor[1]) | 3028 if isinstance(self.__cursor[0],Gtk.TreePath): |
3029 self.__treeview.set_cursor(self.__cursor[0], self.__cursor[1]) | |
2660 else: | 3030 else: |
2661 _path_record = self.__active_path_record[:-1] | 3031 _path_record = self.__active_path_record[:-1] |
2662 _parent = self.__active_path_record[-1] | 3032 _parent = self.__active_path_record[-1] |
2663 self.__active_path_record = _path_record | 3033 self.__active_path_record = _path_record |
2664 self._setColumnsHeaders() | 3034 self._setColumnsHeaders() |
2665 self._setListstoreValues(self.__active_path_record) | 3035 self._setListstoreValues(self.__active_path_record) |
2666 arg = ( _path_record ) | 3036 arg = _path_record |
2667 _page = self.__page() | 3037 _page = self.__wr_page() |
2668 _page.propagateMessageFrom("change_active", self.__pane_path, arg) | 3038 _page.propagateMessageFrom("change_active", self.__pane_path, arg) |
2669 self.__treeview.set_cursor(_parent, self.__cursor[1]) | 3039 self.__treeview.set_cursor(_parent, self.__cursor[1]) |
2670 self.__cursor = self.__treeview.get_cursor() | 3040 self.__cursor = self.__treeview.get_cursor() |
2671 | 3041 |
2672 def _showMessageRecord(self, record_path): | 3042 def _showMessageRecord(self, record_path): |
2700 not (column is self.__index_column): | 3070 not (column is self.__index_column): |
2701 _budget = self.__budget | 3071 _budget = self.__budget |
2702 _model = treeview.get_model() | 3072 _model = treeview.get_model() |
2703 _iter = _model.get_iter(treeview_path) | 3073 _iter = _model.get_iter(treeview_path) |
2704 _code = _model.get_value(_iter, 0).code | 3074 _code = _model.get_value(_iter, 0).code |
2705 #_code = _model.get_value(_iter, 4) | 3075 _path_record = self.__active_path_record |
2706 _path_record = self.__active_path_record + treeview_path | 3076 for _indice in treeview_path.get_indices(): |
3077 _path_record = _path_record + (_indice,) | |
2707 if self.__budget.hasPath(_path_record): | 3078 if self.__budget.hasPath(_path_record): |
2708 # if this record path is valid | 3079 # if this record path is valid |
2709 self.__active_path_record = _path_record | 3080 self.__active_path_record = _path_record |
2710 self._setColumnsHeaders() | 3081 self._setColumnsHeaders() |
2711 self._setListstoreValues(self.__active_path_record) | 3082 self._setListstoreValues(self.__active_path_record) |
2712 self.__treeview.set_cursor((0,)) | 3083 self.__treeview.set_cursor((0,)) |
2713 _arg = ( _path_record ) | 3084 _arg = _path_record |
2714 _page = self.__page() | 3085 _page = self.__wr_page() |
2715 _page.propagateMessageFrom("change_active", self.__pane_path, | 3086 _page.propagateMessageFrom("change_active", self.__pane_path, |
2716 _arg ) | 3087 _arg ) |
2717 | 3088 |
2718 def runMessage(self, message, pane_path, arg=None): | 3089 def runMessage(self, message, pane_path, arg=None): |
2719 """runMessage(message, pane_path, arg=None) | 3090 """runMessage(message, pane_path, arg=None) |
2743 del self.__budget | 3114 del self.__budget |
2744 | 3115 |
2745 def _getWidget(self): | 3116 def _getWidget(self): |
2746 """_getWidget() | 3117 """_getWidget() |
2747 | 3118 |
2748 return the main widget (gtk.ScrolledWindow) | 3119 return the main widget (Gtk.ScrolledWindow) |
2749 """ | 3120 """ |
2750 return self.__scrolled_window | 3121 return self.__scrolled_window |
2751 | 3122 |
2752 def _getPanePath(self): | 3123 def _getPanePath(self): |
2753 """_getPanePath() | 3124 """_getPanePath() |
2761 | 3132 |
2762 sets the tuple that identifies the pane in the notebook page | 3133 sets the tuple that identifies the pane in the notebook page |
2763 """ | 3134 """ |
2764 self.__pane_path = pane_path | 3135 self.__pane_path = pane_path |
2765 | 3136 |
2766 def _getPage(self): | 3137 def _getWrPage(self): |
2767 """_getPage() | 3138 """_getPage() |
2768 | 3139 |
2769 return the Page | 3140 return the Page |
2770 """ | 3141 """ |
2771 return self.__page | 3142 return self.__wr_page |
2772 | 3143 |
2773 def _setPage(self,page): | 3144 def _setWrPage(self,wr_page): |
2774 """_setPage() | 3145 """_setWrPage() |
2775 | 3146 |
2776 set the Page | 3147 set the wr_Page |
2777 """ | 3148 """ |
2778 self.__page = page | 3149 self.__wr_page = wr_page |
2779 | 3150 |
2780 def _getBudget(self): | 3151 def _getBudget(self): |
2781 """_getBudget() | 3152 """_getBudget() |
2782 | 3153 |
2783 return the Budget objet | 3154 return the Budget objet |
2793 | 3164 |
2794 widget = property(_getWidget, None, None, | 3165 widget = property(_getWidget, None, None, |
2795 "Pane configuration list") | 3166 "Pane configuration list") |
2796 pane_path = property(_getPanePath, _setPanePath, None, | 3167 pane_path = property(_getPanePath, _setPanePath, None, |
2797 "path that identifie the item in the page notebook") | 3168 "path that identifie the item in the page notebook") |
2798 page = property(_getPage, _setPage, None, | 3169 wr_page = property(_getWrPage, _setWrPage, None, |
2799 "weak reference from Page instance which creates this class") | 3170 "weak reference from Page instance which creates this class") |
2800 budget = property(_getBudget, None, None, | 3171 budget = property(_getBudget, None, None, |
2801 "Budget object") | 3172 "Budget object") |
2802 active_path_record = property(_getActivePathRecord, None, None, | 3173 active_path_record = property(_getActivePathRecord, None, None, |
2803 "Active path record") | 3174 "Active path record") |
2807 """gui.Measure: | 3178 """gui.Measure: |
2808 | 3179 |
2809 Description: | 3180 Description: |
2810 Class to show a Measure List | 3181 Class to show a Measure List |
2811 Constructor: | 3182 Constructor: |
2812 Measure(budget, page, pane_path, path_record=(0,) | 3183 Measure(budget, page, pane_path, path_record=None) |
2813 budget: budget showed ("base.Budget" object) | 3184 budget: budget showed ("base.Budget" object) |
2814 page: weak reference from Page instance which creates this class | 3185 page: weak reference from Page instance which creates this class |
2815 pane_path: tuple that represents the path of the List in the Page | 3186 pane_path: tuple that represents the path of the List in the Page |
2816 path_record: path of the active record in the budget | 3187 path_record: path of the active record in the budget |
2817 Ancestry: | 3188 Ancestry: |
2818 +-- object | 3189 +-- object |
2819 +-- TreeView | 3190 +-- TreeView |
2820 +-- DecompositionList | 3191 +-- DecompositionList |
2821 Atributes: | 3192 Atributes: |
2822 budget: Read. Budget to show, base.obra instance. | 3193 budget: Read. Budget to show, base.obra instance. |
2823 widget: Read. Window that contains the table, gtk.ScrolledWindow | 3194 widget: Read. Window that contains the table, Gtk.ScrolledWindow |
2824 pane_path: Read-Write. Pane page identifier | 3195 pane_path: Read-Write. Pane page identifier |
2825 page: Read-Write. weak reference from Page instance which creates | 3196 wr_page: Read-Write. weak reference from Page instance which creates |
2826 this class | 3197 this class |
2827 active_path_record: Read. Path of the active record in the budget | 3198 active_path_record: Read. Path of the active record in the budget |
2828 Methods: | 3199 Methods: |
2829 runMessage | 3200 runMessage |
2830 """ | 3201 """ |
2831 | 3202 |
2832 def __init__(self, budget, page, pane_path, path_record=None): | 3203 def __init__(self, budget, page, pane_path, path_record=None): |
2833 """__init__(budget, page, pane_path, path_record=None) | 3204 """__init__(budget, page, pane_path, path_record=None) |
2834 | 3205 |
2835 budget: budget: budget showed ("base.Budget" object) | 3206 budget: budget: budget showed ("base.Budget" object) |
2836 page: weak reference from Page instance which creates this class | 3207 wr_page: weak reference from Page instance which creates this class |
2837 pane_path: tuple that represents the path of the List in the Page | 3208 pane_path: tuple that represents the path of the List in the Page |
2838 path_record: path of the active record in the budget | 3209 path_record: path of the active record in the budget |
2839 | 3210 |
2840 self.__budget: budget showed ("base.Budget" object) | 3211 self.__budget: budget showed ("base.Budget" object) |
2841 self.__page: weak reference from Page instance which creates this class | 3212 self.__page: weak reference from Page instance which creates this class |
2842 self.__pane_path: tuple that represents the path of the List in the Page | 3213 self.__pane_path: tuple that represents the path of the List in the Page |
2843 self.__active_path_record: path of the active record in the budget | 3214 self.__active_path_record: path of the active record in the budget |
2844 self.__liststore: list model which store the list data | 3215 self.__liststore: list model which store the list data |
2845 (gtk.ListStore object) | 3216 (Gtk.ListStore object) |
2846 self.__treeview: widget to display decomposition lists | 3217 self.__treeview: widget to display decomposition lists |
2847 (gtk.TreeView) | 3218 (Gtk.TreeView) |
2848 self.__scrolled_window: widget to scroll the treeview | 3219 self.__scrolled_window: widget to scroll the treeview |
2849 gtk.ScrolledWindow() | 3220 Gtk.ScrolledWindow() |
2850 self.__chapter_background_colors: The background colors of the Code | 3221 self.__chapter_background_colors: The background colors of the Code |
2851 column cells when there is a chapter record | 3222 column cells when there is a chapter record |
2852 as a list of gtk.gdk.Color objects [even cell, uneven cell] | 3223 as a list of color [even cell, uneven cell] |
2853 self.__index_column: Index column (gtk.TreeViewColumn object) | 3224 self.__index_column: Index column (Gtk.TreeViewColumn object) |
2854 self.__linetype_column: Linetype column (gtk.TreeViewColumn object) | 3225 self.__linetype_column: Linetype column (Gtk.TreeViewColumn object) |
2855 self.__comment_column: Comment column (gtk.TreeViewColumn) | 3226 self.__comment_column: Comment column (Gtk.TreeViewColumn) |
2856 self.__unit_column: Unit column (gtk.TreeViewColumn) | 3227 self.__unit_column: Unit column (Gtk.TreeViewColumn) |
2857 self.__length_column: Legth column (gtk.TreeViewColumn) | 3228 self.__length_column: Legth column (Gtk.TreeViewColumn) |
2858 self.__width_column: With column (gtk.TreeViewColumn) | 3229 self.__width_column: With column (Gtk.TreeViewColumn) |
2859 self.__height_column: Height column (gtk.TreeViewColumn) | 3230 self.__height_column: Height column (Gtk.TreeViewColumn) |
2860 self.__formula_column: Formula column (gtk.TreeViewColumn) | 3231 self.__formula_column: Formula column (Gtk.TreeViewColumn) |
2861 self.__parcial_column: Parcial column (gtk.TreeViewColumn) | 3232 self.__parcial_column: Parcial column (Gtk.TreeViewColumn) |
2862 self.__subtotal_column: Subtotal column (gtk.TreeViewColumn) | 3233 self.__subtotal_column: Subtotal column (Gtk.TreeViewColumn) |
2863 self.__end_column: End empty column (gtk.TreeViewColumn | 3234 self.__end_column: End empty column (Gtk.TreeViewColumn |
2864 self.__calculatedline_icon: gtk.gdk.pixbuf | 3235 self.__calculatedline_icon: GdkPixbuf.Pixbuf |
2865 self.__normalline_icon: gtk.gdk.pixbuf | 3236 self.__normalline_icon: GdkPixbuf.Pixbuf |
2866 self.__parcialline_icon: gtk.gdk.pixbuf | 3237 self.__parcialline_icon: GdkPixbuf.Pixbuf |
2867 self.__acumulatedline_icon: gtk.gdk.pixbuf | 3238 self.__acumulatedline_icon: GdkPixbuf.Pixbuf |
2868 self.__treeselection: active selection | 3239 self.__treeselection: active selection |
2869 self.__selection_control: state of the selection control (True/False) | 3240 self.__selection_control: state of the selection control (True/False) |
2870 self.__cursor: Situation of the cursor in the table | 3241 self.__cursor: Situation of the cursor in the table |
2871 | 3242 |
2872 Sets the init atributes | 3243 Sets the init atributes |
2880 """ | 3251 """ |
2881 # Seting init args | 3252 # Seting init args |
2882 if path_record is None: | 3253 if path_record is None: |
2883 path_record = (0,) | 3254 path_record = (0,) |
2884 if not isinstance(budget, base.Budget): | 3255 if not isinstance(budget, base.Budget): |
2885 raise ValueError, _("Argument must be a Budget object") | 3256 raise ValueError( _("Argument must be a Budget object") ) |
2886 self.__budget = budget | 3257 self.__budget = budget |
2887 self.__page = page | 3258 self.__wr_page = page |
2888 self.__pane_path = pane_path | 3259 self.__pane_path = pane_path |
2889 if not isinstance(path_record, tuple): | 3260 if not isinstance(path_record, tuple): |
2890 print _("Record path must be a tuple") | 3261 print(_("Record path must be a tuple") ) |
2891 path_record = (0,) | 3262 path_record = (0,) |
2892 self.__active_path_record = path_record | 3263 self.__active_path_record = path_record |
2893 # ListStore | 3264 # ListStore |
2894 self.__liststore = gtk.ListStore(object) | 3265 self.__liststore = Gtk.ListStore(object) |
2895 self._setListstoreValues(self.__active_path_record) | 3266 self._setListstoreValues(self.__active_path_record) |
2896 # Treeview | 3267 # Treeview |
2897 self.__treeview = gtk.TreeView(self.__liststore) | 3268 self.__treeview = Gtk.TreeView(self.__liststore) |
2898 self.__treeview.set_enable_search(False) | 3269 self.__treeview.set_enable_search(False) |
2899 self.__treeview.set_reorderable(False) | 3270 self.__treeview.set_reorderable(False) |
2900 self.__treeview.set_headers_clickable(True) | 3271 self.__treeview.set_headers_clickable(True) |
2901 self.__treeview.show() | 3272 self.__treeview.show() |
2902 # Scrolled_window | 3273 # Scrolled_window |
2903 self.__scrolled_window = gtk.ScrolledWindow() | 3274 self.__scrolled_window = Gtk.ScrolledWindow() |
2904 self.__scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, | 3275 self.__scrolled_window.set_property("expand", True) # widget expand all space |
2905 gtk.POLICY_AUTOMATIC) | 3276 self.__scrolled_window.set_policy(Gtk.PolicyType(1), |
3277 Gtk.PolicyType(1)) # 1 Automatic | |
2906 self.__scrolled_window.add(self.__treeview) | 3278 self.__scrolled_window.add(self.__treeview) |
2907 # colors | 3279 # colors |
2908 _text_color = gtk.gdk.color_parse(globalVars.color["TEXT"]) | 3280 _text_color = globalVars.color["TEXT"] |
2909 _calculated_text =gtk.gdk.color_parse(globalVars.color["CALCULATED-TEXT"]) | 3281 _calculated_text = globalVars.color["CALCULATED-TEXT"] |
2910 _background_color = [ | 3282 _background_color = [ |
2911 gtk.gdk.color_parse(globalVars.color["UNEVEN"]), | 3283 globalVars.color["UNEVEN"], |
2912 gtk.gdk.color_parse(globalVars.color["EVEN"])] | 3284 globalVars.color["EVEN"]] |
2913 self.__chapter_background_colors = [ | 3285 self.__chapter_background_colors = [ |
2914 gtk.gdk.color_parse(globalVars.color["CHAPTER-UNEVEN"]), | 3286 globalVars.color["CHAPTER-UNEVEN"], |
2915 gtk.gdk.color_parse(globalVars.color["CHAPTER-EVEN"])] | 3287 globalVars.color["CHAPTER-EVEN"]] |
2916 super(Measure,self).__init__( | 3288 super(Measure,self).__init__( |
2917 [("INDEX",self._selectAll,42), | 3289 [("INDEX",self._selectAll,42), |
2918 ("PIXBUF", self._passMethod, | 3290 ("PIXBUF", self._passMethod, 40, |
2919 gtk.Label("A"*4).size_request()[0] +10, | |
2920 _text_color, _background_color), | 3291 _text_color, _background_color), |
2921 ("CALCULATEDTEXT", self._passMethod, | 3292 ("CALCULATEDTEXT", self._passMethod, 128, |
2922 gtk.Label("A"*12).size_request()[0] +10, | |
2923 _text_color, _background_color), | 3293 _text_color, _background_color), |
2924 ("CALCULATED", self._passMethod, | 3294 ("CALCULATED", self._passMethod, 55, |
2925 gtk.Label("A"*5).size_request()[0] +10, | |
2926 _text_color, _background_color), | 3295 _text_color, _background_color), |
2927 ("CALCULATED", self._passMethod, | 3296 ("CALCULATED", self._passMethod, 70, |
2928 gtk.Label("A"*7).size_request()[0] +10, | |
2929 _text_color, _background_color), | 3297 _text_color, _background_color), |
2930 ("CALCULATED", self._passMethod, | 3298 ("CALCULATED", self._passMethod, 70, |
2931 gtk.Label("A"*7).size_request()[0] +10, | |
2932 _text_color, _background_color), | 3299 _text_color, _background_color), |
2933 ("CALCULATED", self._passMethod, | 3300 ("CALCULATED", self._passMethod, 70, |
2934 gtk.Label("A"*7).size_request()[0] +10, | |
2935 _text_color, _background_color), | 3301 _text_color, _background_color), |
2936 ("CALCULATEDTEXT", self._passMethod, | 3302 ("CALCULATEDTEXT", self._passMethod, 120, |
2937 gtk.Label("A"*12).size_request()[0] +10, | |
2938 _text_color, _background_color), | 3303 _text_color, _background_color), |
2939 ("CALCULATED", self._passMethod, | 3304 ("CALCULATED", self._passMethod, 70, |
2940 gtk.Label("A"*7).size_request()[0] +10, | |
2941 _calculated_text, _background_color), | 3305 _calculated_text, _background_color), |
2942 ("CALCULATED", self._passMethod, | 3306 ("CALCULATED", self._passMethod, 70, |
2943 gtk.Label("A"*7).size_request()[0] +10, | |
2944 _calculated_text, _background_color), | 3307 _calculated_text, _background_color), |
2945 ]) | 3308 ]) |
2946 # Colums | 3309 # Colums |
2947 self.__index_column = self.columns[0] | 3310 self.__index_column = self.columns[0] |
2948 self.__linetype_column = self.columns[1] | 3311 self.__linetype_column = self.columns[1] |
2957 self.__end_column = self.columns[10] | 3320 self.__end_column = self.columns[10] |
2958 # Index column | 3321 # Index column |
2959 self.__treeview.append_column(self.__index_column) | 3322 self.__treeview.append_column(self.__index_column) |
2960 # Linetype column | 3323 # Linetype column |
2961 self.__treeview.append_column(self.__linetype_column) | 3324 self.__treeview.append_column(self.__linetype_column) |
2962 self.__calculatedline_icon = gtk.gdk.pixbuf_new_from_file( | 3325 self.__calculatedline_icon = GdkPixbuf.Pixbuf.new_from_file( |
2963 globalVars.getAppPath("CALCULATEDLINE-ICON")) | 3326 globalVars.getAppPath("CALCULATEDLINE-ICON")) |
2964 self.__normalline_icon = gtk.gdk.pixbuf_new_from_file( | 3327 self.__normalline_icon = GdkPixbuf.Pixbuf.new_from_file( |
2965 globalVars.getAppPath("NORMALLINE-ICON") ) | 3328 globalVars.getAppPath("NORMALLINE-ICON") ) |
2966 self.__parcialline_icon = gtk.gdk.pixbuf_new_from_file( | 3329 self.__parcialline_icon = GdkPixbuf.Pixbuf.new_from_file( |
2967 globalVars.getAppPath("PARCIALLINE-ICON") ) | 3330 globalVars.getAppPath("PARCIALLINE-ICON") ) |
2968 self.__acumulatedline_icon = gtk.gdk.pixbuf_new_from_file( | 3331 self.__acumulatedline_icon = GdkPixbuf.Pixbuf.new_from_file( |
2969 globalVars.getAppPath("ACUMULATEDLINE-ICON")) | 3332 globalVars.getAppPath("ACUMULATEDLINE-ICON")) |
2970 # Comment column | 3333 # Comment column |
2971 self.__treeview.append_column(self.__comment_column) | 3334 self.__treeview.append_column(self.__comment_column) |
2972 # Units column | 3335 # Units column |
2973 self.__treeview.append_column(self.__units_column) | 3336 self.__treeview.append_column(self.__units_column) |
2991 self.__treeview.connect("button-press-event", | 3354 self.__treeview.connect("button-press-event", |
2992 self._treeviewClickedEvent) | 3355 self._treeviewClickedEvent) |
2993 self.__treeview.connect("cursor-changed", self._treeviewCursorChanged) | 3356 self.__treeview.connect("cursor-changed", self._treeviewCursorChanged) |
2994 # control selection | 3357 # control selection |
2995 self.__treeselection = self.__treeview.get_selection() | 3358 self.__treeselection = self.__treeview.get_selection() |
2996 self.__treeselection.set_mode(gtk.SELECTION_MULTIPLE) | 3359 self.__treeselection.set_mode(Gtk.SelectionMode(3)) # 3 MULTIPLE |
2997 self.__treeselection.set_select_function(self._controlSelection) | 3360 self.__treeselection.set_select_function(self._controlSelection) |
2998 self.__selection_control = True | 3361 self.__selection_control = True |
2999 self.__treeview.set_cursor_on_cell((1,), self.columns[1], | 3362 if len(self.__liststore) > 0: |
3000 self.columns[1].get_cell_renderers()[0],True) | 3363 _tree_path = Gtk.TreePath.new_from_indices((1,)) |
3364 self.__treeview.set_cursor_on_cell(_tree_path, self.columns[1], | |
3365 self.columns[1].get_cells()[0],True) | |
3001 self.__treeview.grab_focus() | 3366 self.__treeview.grab_focus() |
3002 self.__cursor = self.__treeview.get_cursor() | 3367 self.__cursor = self.__treeview.get_cursor() |
3003 # Show | 3368 # Show |
3004 self._setColumnsHeaders() | 3369 self._setColumnsHeaders() |
3005 self.__scrolled_window.show() | 3370 self.__scrolled_window.show() |
3006 | 3371 |
3007 def _passMethod(self, column): | |
3008 """_passMethod(column) | |
3009 | |
3010 column: the column that is clicked | |
3011 Method connected to "clicked" event of many columns | |
3012 Do nothing | |
3013 """ | |
3014 pass | |
3015 | |
3016 def _setListstoreValues(self, path_record): | |
3017 """_setListstoreValues(path_record) | |
3018 | |
3019 path_record: Record path in the budget | |
3020 Sets the liststore record values from a path record | |
3021 """ | |
3022 self.__liststore.clear() | |
3023 _budget = self.__budget | |
3024 if not _budget.hasPath(path_record): | |
3025 raise ValueError, _("Invalid path") | |
3026 else: | |
3027 _measure = _budget.getMeasure(path_record) | |
3028 if isinstance(_measure, base.Measure): | |
3029 _lines = _measure.lines | |
3030 for _line in _lines: | |
3031 _values = [ _line ] | |
3032 _treeiter = self.__liststore.append(_values) | |
3033 else: | |
3034 raise ValueError, utils.mapping(_("measure must be a Measure "\ | |
3035 "object. Type: $1"), (type(_measure),)) | |
3036 | |
3037 def _setColumnsHeaders(self): | |
3038 """_setColumnsHeaders() | |
3039 | |
3040 Sets the headers column values | |
3041 """ | |
3042 _measure = self.__budget.getMeasure(self.__active_path_record) | |
3043 _DS = self.__budget.getDecimals("DS") | |
3044 _total = _measure.measure | |
3045 _total_str = ("%." + str(_DS) + "f" ) % _total | |
3046 self.columns[1].set_title(_("Type")) # Σ parcial Σ total | |
3047 self.columns[2].set_title(_("Comment")) | |
3048 self.columns[3].set_title(_("N\n(a)")) | |
3049 self.columns[4].set_title(_("Length\n(b)")) | |
3050 self.columns[5].set_title(_("Width\n(c)")) | |
3051 self.columns[6].set_title(_("Height\n(d)")) | |
3052 self.columns[7].set_title(_("Formula")) | |
3053 self.columns[8].set_title(_("Parcial\n[%s]" % _total_str)) | |
3054 self.columns[9].set_title(_("Subtotal")) | |
3055 | |
3056 def _controlSelection(self, selection): | |
3057 """_controlSelection(selection) | |
3058 | |
3059 selection: treeselection | |
3060 | |
3061 Method connected to set_selection_function() | |
3062 This method is called before any node is selected or unselected, | |
3063 giving some control over which nodes are selected. | |
3064 The selection function should return TRUE if the state | |
3065 of the node may be toggled, and FALSE if the state of the node should | |
3066 be left unchanged. | |
3067 | |
3068 The selection only run if the user click in the index column, else | |
3069 the previous selection is erased. | |
3070 """ | |
3071 _column = self.__treeview.get_cursor()[1] | |
3072 if _column is self.columns[0] \ | |
3073 or self.__selection_control == False: | |
3074 return True | |
3075 else: | |
3076 self.__selection_control = False | |
3077 self.__treeselection.unselect_all() | |
3078 self.__selection_control = True | |
3079 return False | |
3080 | |
3081 def _showMessageRecord(self, record_path): | |
3082 """_showMessageRecord(record_path) | |
3083 | |
3084 record_path: the path of the record to show | |
3085 Method connected to "change_active" message | |
3086 Show the record especified in the "change_active" message | |
3087 """ | |
3088 _budget = self.__budget | |
3089 self.__active_path_record = record_path | |
3090 self._setColumnsHeaders() | |
3091 self._setListstoreValues(self.__active_path_record) | |
3092 self.__treeview.set_cursor((0,)) | |
3093 | |
3094 def _treeviewCursorChanged(self, treeview): | 3372 def _treeviewCursorChanged(self, treeview): |
3095 """_treeviewCursorChanged(treeview) | 3373 """_treeviewCursorChanged(treeview) |
3096 | 3374 |
3097 treeview: treewiew widget | 3375 treeview: treewiew widget |
3098 Method connected to "cursor-changed" signal | 3376 Method connected to "cursor-changed" signal |
3099 The "cursor-changed" signal is emitted when the cursor moves or is set | 3377 The "cursor-changed" signal is emitted when the cursor moves or is set |
3100 Sets the new cursor position in self.__cursor, it is used to avoid | 3378 Sets the new cursor position in self.__cursor, it is used to avoid |
3101 unnecessary changes in cursor position. | 3379 unnecessary changes in cursor position. |
3102 """ | 3380 """ |
3103 event = gtk.get_current_event() | 3381 event = Gtk.get_current_event() |
3104 (_cursor_path, _column) = treeview.get_cursor() | 3382 (_cursor_path, _column) = treeview.get_cursor() |
3105 if event is None or event.type != gtk.gdk.BUTTON_RELEASE: | 3383 if event is None or event.type != Gdk.EventType(7): # 7 BUTTON_RELEASE |
3106 if not _column is self.__index_column: | 3384 if not _column is self.__index_column: |
3107 self.__cursor = treeview.get_cursor() | 3385 self.__cursor = treeview.get_cursor() |
3108 | |
3109 def _moveCursor(self, treeview, step, count): | |
3110 """moveCursor(treeview, step, count) | |
3111 | |
3112 treeview: the treeview that received the signal | |
3113 step: the movement step size | |
3114 count: the number of steps to take | |
3115 | |
3116 Method connected to "move-cursor" signal | |
3117 The "move-cursor" signal is emitted when the user moves the cursor | |
3118 using the Right, Left, Up or Down arrow keys or the Page Up, | |
3119 Page Down, Home and End keys. | |
3120 | |
3121 Returns :TRUE if the signal was handled. | |
3122 """ | |
3123 return False | |
3124 | 3386 |
3125 def _treeviewClickedEvent(self, widget, event): | 3387 def _treeviewClickedEvent(self, widget, event): |
3126 """_treeviewClickedEvent(widget, event) | 3388 """_treeviewClickedEvent(widget, event) |
3127 | 3389 |
3128 widget: treewiew widget | 3390 widget: treewiew widget |
3162 If the user press the right cursor button and the cursor is in the | 3424 If the user press the right cursor button and the cursor is in the |
3163 amount column or pres the left cursor button and the cursor is | 3425 amount column or pres the left cursor button and the cursor is |
3164 in the code column the event is estoped, else the event is propagated. | 3426 in the code column the event is estoped, else the event is propagated. |
3165 """ | 3427 """ |
3166 (_cursor_path, _column) = self.__treeview.get_cursor() | 3428 (_cursor_path, _column) = self.__treeview.get_cursor() |
3167 if (event.keyval == gtk.keysyms.Right \ | 3429 if (event.keyval in [Gdk.keyval_from_name("Right"), |
3430 Gdk.keyval_from_name("KP_Right")] \ | |
3168 and _column == self.columns[-2]) \ | 3431 and _column == self.columns[-2]) \ |
3169 or (event.keyval == gtk.keysyms.Left \ | 3432 or (event.keyval in [Gdk.keyval_from_name("Left"), |
3433 Gdk.keyval_from_name("KP_Left")] \ | |
3170 and _column == self.columns[1]): | 3434 and _column == self.columns[1]): |
3171 return True | 3435 return True |
3172 return False | 3436 return False |
3173 | 3437 |
3174 def runMessage(self, message, pane_path, arg=None): | 3438 def _moveCursor(self, treeview, step, count): |
3175 """runMessage(message, pane_path, arg=None) | 3439 """moveCursor(treeview, step, count) |
3176 | 3440 |
3177 message: the message type | 3441 treeview: the treeview that received the signal |
3178 "change_active": change the active record | 3442 step: the movement step size |
3179 "clear": clear instance | 3443 count: the number of steps to take |
3180 pane_path: tuple that identifies the pane in the notebook page | 3444 |
3181 arg: tuple whit two items: | 3445 Method connected to "move-cursor" signal |
3182 0: record path in the budget | 3446 The "move-cursor" signal is emitted when the user moves the cursor |
3183 1: record code | 3447 using the Right, Left, Up or Down arrow keys or the Page Up, |
3184 This method receives a message and executes its corresponding action | 3448 Page Down, Home and End keys. |
3185 """ | 3449 |
3186 _budget = self.__budget | 3450 Returns :TRUE if the signal was handled. |
3187 if message == "change_active": | 3451 """ |
3188 if _budget.hasPath(arg): | 3452 return False |
3189 _path_record = arg | 3453 |
3190 self._showMessageRecord( _path_record) | 3454 def _controlSelection(self, selection, model, path, path_currently_selected, *data): |
3191 elif message == "clear": | 3455 """_controlSelection(selection) |
3192 self._clear() | 3456 |
3457 selection: treeselection | |
3458 | |
3459 Method connected to set_selection_function() | |
3460 This method is called before any node is selected or unselected, | |
3461 giving some control over which nodes are selected. | |
3462 The selection function should return TRUE if the state | |
3463 of the node may be toggled, and FALSE if the state of the node should | |
3464 be left unchanged. | |
3465 | |
3466 The selection only run if the user click in the index column, else | |
3467 the previous selection is erased. | |
3468 """ | |
3469 _column = self.__treeview.get_cursor()[1] | |
3470 if _column is self.columns[0] \ | |
3471 or self.__selection_control == False: | |
3472 return True | |
3473 else: | |
3474 self.__selection_control = False | |
3475 self.__treeselection.unselect_all() | |
3476 self.__selection_control = True | |
3477 return False | |
3193 | 3478 |
3194 def _selectAll(self, column): | 3479 def _selectAll(self, column): |
3195 """_selectAll(column) | 3480 """_selectAll(column) |
3196 | 3481 |
3197 column: index column | 3482 column: index column |
3199 If the user clickes in the index column header selecs or deselects | 3484 If the user clickes in the index column header selecs or deselects |
3200 all rows | 3485 all rows |
3201 """ | 3486 """ |
3202 (_model, _pathlist) = self.__treeselection.get_selected_rows() | 3487 (_model, _pathlist) = self.__treeselection.get_selected_rows() |
3203 # it avoid to set cursor in the index column | 3488 # it avoid to set cursor in the index column |
3204 self.__treeview.set_cursor(self.__cursor[0], self.__cursor[1]) | 3489 if isinstance(self.__cursor[0],Gtk.TreePath): |
3205 self.__selection_control = False | 3490 self.__treeview.set_cursor(self.__cursor[0], self.__cursor[1]) |
3206 if len(_pathlist) == 0: | 3491 self.__selection_control = False |
3207 # select all | 3492 if len(_pathlist) == 0: |
3208 self.__treeselection.select_all() | 3493 # select all |
3494 self.__treeselection.select_all() | |
3495 else: | |
3496 # unselect all | |
3497 self.__treeselection.unselect_all() | |
3498 self.__selection_control = True | |
3499 | |
3500 def _setColumnsHeaders(self): | |
3501 """_setColumnsHeaders() | |
3502 | |
3503 Sets the headers column values | |
3504 """ | |
3505 _measure = self.__budget.getMeasure(self.__active_path_record) | |
3506 _DS = self.__budget.getDecimals("DS") | |
3507 _total = _measure.measure | |
3508 _total_str = ("%." + str(abs(_DS)) + "f" ) % _total | |
3509 self.columns[1].set_title(_("Type")) # Σ parcial Σ total | |
3510 self.columns[2].set_title(_("Comment")) | |
3511 self.columns[3].set_title(_("N\n(a)")) | |
3512 self.columns[4].set_title(_("Length\n(b)")) | |
3513 self.columns[5].set_title(_("Width\n(c)")) | |
3514 self.columns[6].set_title(_("Height\n(d)")) | |
3515 self.columns[7].set_title(_("Formula")) | |
3516 self.columns[8].set_title(_("Parcial\n[%s]" % _total_str)) | |
3517 self.columns[9].set_title(_("Subtotal")) | |
3518 | |
3519 def _setListstoreValues(self, path_record): | |
3520 """_setListstoreValues(path_record) | |
3521 | |
3522 path_record: Record path in the budget | |
3523 Sets the liststore record values from a path record | |
3524 """ | |
3525 self.__liststore.clear() | |
3526 _budget = self.__budget | |
3527 if not _budget.hasPath(path_record): | |
3528 raise ValueError( _("Invalid path") ) | |
3209 else: | 3529 else: |
3210 # unselect all | 3530 _measure = _budget.getMeasure(path_record) |
3211 self.__treeselection.unselect_all() | 3531 if isinstance(_measure, base.Measure): |
3212 self.__selection_control = True | 3532 _lines = _measure.lines |
3533 for _line in _lines: | |
3534 _values = [ _line ] | |
3535 _treeiter = self.__liststore.append(_values) | |
3536 else: | |
3537 raise ValueError( utils.mapping(_("measure must be a Measure "\ | |
3538 "object. Type: $1"), (str(type(_measure)),)) ) | |
3213 | 3539 |
3214 def _colorCell(self, column, cell_renderer, tree_model, iter, lcolor): | 3540 def _colorCell(self, column, cell_renderer, tree_model, iter, lcolor): |
3215 """_colorCell(column, cell_renderer, tree_model, iter, lcolor) | 3541 """_colorCell(column, cell_renderer, tree_model, iter, lcolor) |
3216 | 3542 |
3217 column: the gtk.TreeViewColumn in the treeview | 3543 column: the Gtk.TreeViewColumn in the treeview |
3218 cell_renderer: a gtk.CellRenderer | 3544 cell_renderer: a Gtk.CellRenderer |
3219 tree_model: the gtk.TreeModel | 3545 tree_model: the Gtk.TreeModel |
3220 iter: gtk.TreeIter pointing at the row | 3546 iter: Gtk.TreeIter pointing at the row |
3221 lcolor: list with 2 gtk colors for even and uneven record | 3547 lcolor: list with 2 colors for even and uneven record |
3222 | 3548 |
3223 Method connected to "set_cell_data_func" of many column | 3549 Method connected to "set_cell_data_func" of many column |
3224 The set_cell_data_func() method sets the data function (or method) | 3550 The set_cell_data_func() method sets the data function (or method) |
3225 to use for the column gtk.CellRenderer specified by cell_renderer. | 3551 to use for the column Gtk.CellRenderer specified by cell_renderer. |
3226 This function (or method) is used instead of the standard attribute | 3552 This function (or method) is used instead of the standard attribute |
3227 mappings for setting the column values, and should set the attributes | 3553 mappings for setting the column values, and should set the attributes |
3228 of the cell renderer as appropriate. func may be None to remove the | 3554 of the cell renderer as appropriate. func may be None to remove the |
3229 current data function. The signature of func is: | 3555 current data function. The signature of func is: |
3230 -def celldatafunction(column, cell, model, iter, user_data) | 3556 -def celldatafunction(column, cell, model, iter, user_data) |
3231 -def celldatamethod(self, column, cell, model, iter, user_data) | 3557 -def celldatamethod(self, column, cell, model, iter, user_data) |
3232 where column is the gtk.TreeViewColumn in the treeview, cell is the | 3558 where column is the Gtk.TreeViewColumn in the treeview, cell is the |
3233 gtk.CellRenderer for column, model is the gtk.TreeModel for the | 3559 Gtk.CellRenderer for column, model is the Gtk.TreeModel for the |
3234 treeview and iter is the gtk.TreeIter pointing at the row. | 3560 treeview and iter is the Gtk.TreeIter pointing at the row. |
3235 | 3561 |
3236 The method sets cell background color for all columns | 3562 The method sets cell background color for all columns |
3237 and text for index and amount columns. | 3563 and text for index and amount columns. |
3238 """ | 3564 """ |
3239 _row_path = tree_model.get_path(iter) | 3565 _row_path = tree_model.get_path(iter) |
3240 _number = _row_path[-1] | 3566 _number = _row_path[-1] |
3241 if column is self.__index_column: | 3567 if column is self.__index_column: |
3242 cell_renderer.set_property('text', str(_number + 1)) | 3568 cell_renderer.set_property('text', str(_number + 1)) |
3243 self.__index_column.get_cell_renderers()[1].set_property( | 3569 self.__index_column.get_cells()[1].set_property( |
3244 'cell-background-gdk', lcolor[_number % 2]) | 3570 'cell-background', lcolor[_number % 2]) |
3245 elif column is self.__linetype_column: | 3571 elif column is self.__linetype_column: |
3246 _measure = tree_model[_row_path][0] | 3572 _measure = tree_model[_row_path][0] |
3247 _type = _measure.lineType | 3573 _type = _measure.lineType |
3248 if _type == 0: | 3574 if _type == 0: |
3249 cell_renderer.set_property("pixbuf",self.__normalline_icon) | 3575 cell_renderer.set_property("pixbuf",self.__normalline_icon) |
3253 cell_renderer.set_property("pixbuf", | 3579 cell_renderer.set_property("pixbuf", |
3254 self.__acumulatedline_icon) | 3580 self.__acumulatedline_icon) |
3255 else: #elif _type == 3: | 3581 else: #elif _type == 3: |
3256 cell_renderer.set_property("pixbuf", | 3582 cell_renderer.set_property("pixbuf", |
3257 self.__calculatedline_icon) | 3583 self.__calculatedline_icon) |
3258 | |
3259 elif column is self.__comment_column: | 3584 elif column is self.__comment_column: |
3260 _measure = tree_model[_row_path][0] | 3585 _measure = tree_model[_row_path][0] |
3261 _comment = str(_measure.comment) | 3586 _comment = str(_measure.comment) |
3262 cell_renderer.set_property('text', _comment) | 3587 cell_renderer.set_property('text', _comment) |
3263 elif column is self.__units_column: | 3588 elif column is self.__units_column: |
3264 _measure = tree_model[_row_path][0] | 3589 _measure = tree_model[_row_path][0] |
3265 _units = _measure.units | 3590 _units = _measure.units |
3266 if isinstance(_units, float): | 3591 if isinstance(_units, float): |
3267 _DN = self.__budget.getDecimals("DN") | 3592 _DN = self.__budget.getDecimals("DN") |
3268 _units = ("%." + str(_DN) + "f" ) % _units | 3593 _units = ("%." + str(abs(_DN)) + "f" ) % _units |
3269 cell_renderer.set_property('text', _units) | 3594 cell_renderer.set_property('text', _units) |
3270 elif column is self.__length_column: | 3595 elif column is self.__length_column: |
3271 _measure = tree_model[_row_path][0] | 3596 _measure = tree_model[_row_path][0] |
3272 _length = _measure.length | 3597 _length = _measure.length |
3273 if isinstance(_length, float): | 3598 if isinstance(_length, float): |
3274 _DD = self.__budget.getDecimals("DD") | 3599 _DD = self.__budget.getDecimals("DD") |
3275 _length = ("%." + str(_DD) + "f" ) % _length | 3600 _length = ("%." + str(abs(_DD)) + "f" ) % _length |
3276 cell_renderer.set_property('text', _length) | 3601 cell_renderer.set_property('text', _length) |
3277 elif column is self.__width_column: | 3602 elif column is self.__width_column: |
3278 _measure = tree_model[_row_path][0] | 3603 _measure = tree_model[_row_path][0] |
3279 _width = _measure.width | 3604 _width = _measure.width |
3280 if isinstance(_width, float): | 3605 if isinstance(_width, float): |
3281 _DD = self.__budget.getDecimals("DD") | 3606 _DD = self.__budget.getDecimals("DD") |
3282 _width = ("%." + str(_DD) + "f" ) % _width | 3607 _width = ("%." + str(abs(_DD)) + "f" ) % _width |
3283 cell_renderer.set_property('text', _width) | 3608 cell_renderer.set_property('text', _width) |
3284 elif column is self.__height_column: | 3609 elif column is self.__height_column: |
3285 _measure = tree_model[_row_path][0] | 3610 _measure = tree_model[_row_path][0] |
3286 _height = _measure.height | 3611 _height = _measure.height |
3287 if isinstance(_height, float): | 3612 if isinstance(_height, float): |
3288 _DD = self.__budget.getDecimals("DD") | 3613 _DD = self.__budget.getDecimals("DD") |
3289 _height = ("%." + str(_DD) + "f" ) % _height | 3614 _height = ("%." + str(abs(_DD)) + "f" ) % _height |
3290 cell_renderer.set_property('text', _height) | 3615 cell_renderer.set_property('text', _height) |
3291 elif column is self.__formula_column: | 3616 elif column is self.__formula_column: |
3292 _measure = tree_model[_row_path][0] | 3617 _measure = tree_model[_row_path][0] |
3293 _formula = _measure.formula | 3618 _formula = _measure.formula |
3294 cell_renderer.set_property('text', _formula) | 3619 cell_renderer.set_property('text', _formula) |
3299 if _type == 1 or _type == 2: | 3624 if _type == 1 or _type == 2: |
3300 _parcial = "" | 3625 _parcial = "" |
3301 else: | 3626 else: |
3302 if isinstance(_parcial, float): | 3627 if isinstance(_parcial, float): |
3303 _DS = self.__budget.getDecimals("DS") | 3628 _DS = self.__budget.getDecimals("DS") |
3304 _parcial = ("%." + str(_DS) + "f" ) % _parcial | 3629 _parcial = ("%." + str(abs(_DS)) + "f" ) % _parcial |
3305 cell_renderer.set_property('text', _parcial) | 3630 cell_renderer.set_property('text', _parcial) |
3306 elif column is self.__subtotal_column: | 3631 elif column is self.__subtotal_column: |
3307 _measure_line = tree_model[_row_path][0] | 3632 _measure_line = tree_model[_row_path][0] |
3308 _type = _measure_line.lineType | 3633 _type = _measure_line.lineType |
3309 if _type == 1 or _type == 2: | 3634 if _type == 1 or _type == 2: |
3310 if _type == 1: | 3635 if _type == 1: |
3311 _color = gtk.gdk.color_parse( | 3636 _color = globalVars.color["SUBTOTAL-PARCIAL"] |
3312 globalVars.color["SUBTOTAL-PARCIAL"]) | |
3313 _subtotal = _measure_line.parcial_subtotal | 3637 _subtotal = _measure_line.parcial_subtotal |
3314 else: #elif _type == 2: | 3638 else: #elif _type == 2: |
3315 _color = gtk.gdk.color_parse(globalVars.color["SUBTOTAL"]) | 3639 _color = globalVars.color["SUBTOTAL"] |
3316 _subtotal = _measure_line.acumulated_subtotal | 3640 _subtotal = _measure_line.acumulated_subtotal |
3317 lcolor = [_color, _color] | 3641 lcolor = [_color, _color] |
3318 if isinstance(_subtotal, float): | 3642 if isinstance(_subtotal, float): |
3319 _DS = self.__budget.getDecimals("DS") | 3643 _DS = self.__budget.getDecimals("DS") |
3320 _subtotal= ("%." + str(_DS) + "f" ) % _subtotal | 3644 _subtotal= ("%." + str(abs(_DS)) + "f" ) % _subtotal |
3321 cell_renderer.set_property('text', _subtotal) | 3645 cell_renderer.set_property('text', _subtotal) |
3322 else: | 3646 else: |
3323 cell_renderer.set_property('text', "") | 3647 cell_renderer.set_property('text', "") |
3324 | 3648 |
3325 if self.__treeview.get_cursor() == (_row_path,column): | 3649 if self.__treeview.get_cursor() == (_row_path,column): |
3326 cell_renderer.set_property('cell-background-gdk', | 3650 cell_renderer.set_property('cell-background', |
3327 gtk.gdk.color_parse(globalVars.color["ACTIVE"])) | 3651 globalVars.color["ACTIVE"]) |
3328 else: | 3652 else: |
3329 cell_renderer.set_property('cell-background-gdk', | 3653 cell_renderer.set_property('cell-background', |
3330 lcolor[_number % 2]) | 3654 lcolor[_number % 2]) |
3331 | 3655 |
3332 def _clear(self): | 3656 def _passMethod(self, column): |
3333 """_clear() | 3657 """_passMethod(column) |
3334 | 3658 |
3335 it deletes the __budget value | 3659 column: the column that is clicked |
3336 """ | 3660 Method connected to "clicked" event of many columns |
3337 del self.__budget | 3661 Do nothing |
3338 | 3662 """ |
3339 def _getWidget(self): | 3663 pass |
3340 """_getWidget() | 3664 |
3341 | 3665 def _showMessageRecord(self, record_path): |
3342 return the main widget (gtk.ScrolledWindow) | 3666 """_showMessageRecord(record_path) |
3343 """ | 3667 |
3344 return self.__scrolled_window | 3668 record_path: the path of the record to show |
3345 | 3669 Method connected to "change_active" message |
3346 def _getPanePath(self): | 3670 Show the record especified in the "change_active" message |
3347 """_getPanePath() | |
3348 | |
3349 return the tuple that identifies the pane in the notebook page | |
3350 """ | |
3351 return self.__pane_path | |
3352 | |
3353 def _setPanePath(self, pane_path): | |
3354 """_setPanePath() | |
3355 | |
3356 sets the tuple that identifies the pane in the notebook page | |
3357 """ | |
3358 self.__pane_path = pane_path | |
3359 | |
3360 def _getPage(self): | |
3361 """_getPage() | |
3362 | |
3363 return the Page | |
3364 """ | |
3365 return self.__page | |
3366 | |
3367 def _setPage(self,page): | |
3368 """_setPage() | |
3369 | |
3370 set the Page | |
3371 """ | |
3372 self.__page = page | |
3373 | |
3374 def _getBudget(self): | |
3375 """_getBudget() | |
3376 | |
3377 return the Budget objet | |
3378 """ | |
3379 return self.__budget | |
3380 | |
3381 def _getActivePathRecord(self): | |
3382 """getActivePathRecord() | |
3383 | |
3384 return the Active Path Record | |
3385 """ | |
3386 return self.__active_path_record | |
3387 | |
3388 widget = property(_getWidget, None, None, | |
3389 "Pane configuration list") | |
3390 pane_path = property(_getPanePath, _setPanePath, None, | |
3391 "Path that identifies the item in the page notebook") | |
3392 page = property(_getPage, _setPage, None, | |
3393 "Weak reference from Page instance which creates this class") | |
3394 budget = property(_getBudget, None, None, | |
3395 "Budget object") | |
3396 active_path_record = property(_getActivePathRecord, None, None, | |
3397 "Active Code") | |
3398 | |
3399 | |
3400 class Description(object): | |
3401 """gui.Description | |
3402 | |
3403 Description: | |
3404 Class to show a description text of a record in a pane | |
3405 Constructor: | |
3406 Description(budget, code) | |
3407 budget: base.Budget object | |
3408 code: record code | |
3409 Ancestry: | |
3410 +-- object | |
3411 +-- Description | |
3412 Atributes: | |
3413 widget: the main widget (gtk.ScrolledWindow object) | |
3414 pane_path: the tuple that identifies the pane in the notebook page | |
3415 budget: The budget (base.obra objetc) | |
3416 active_path_record: The active path record | |
3417 Methods: | |
3418 runMessage | |
3419 """ | |
3420 # TODO: make standar: "DecompositonList and Description" | |
3421 | |
3422 def __init__(self, budget, page, pane_path, path_record=None): | |
3423 """__init__(budget, page, pane_path, path_record=None) | |
3424 | |
3425 budget: the budget (base.obra object) | |
3426 page: weak reference from Page instance which creates this class | |
3427 pane_path: the path position of the description in the page | |
3428 path_record: the path of the active record | |
3429 | |
3430 self.__budget: the budget (base.obra object) | |
3431 self.__page: weak reference from Page instance which creates this class | |
3432 self.__pane_path: the path position of the description in the page | |
3433 self.__active_path_recordthe path of the active record | |
3434 | |
3435 self.__textbuffer: The textbuffer of the textview that contain | |
3436 the record text. | |
3437 self.__label: The gtk.label with the title of the pane | |
3438 self.__widget: the main pane widget, a gtk.ScrolledWindow() | |
3439 | |
3440 Creates an shows the scroledwindow that contain the description text | |
3441 of the record to be showed in a pane. | |
3442 """ | |
3443 if path_record is None: | |
3444 path_record = (0,) | |
3445 self.__budget = budget | |
3446 self.__page = page | |
3447 self.__pane_path = pane_path | |
3448 self.__active_path_record = path_record | |
3449 _budget = budget | |
3450 _text = _budget.getRecord(self.__budget.getCode( | |
3451 self.__active_path_record)).text | |
3452 _scrollwindow = gtk.ScrolledWindow() | |
3453 _scrollwindow.set_policy(gtk.POLICY_AUTOMATIC, | |
3454 gtk.POLICY_AUTOMATIC) | |
3455 _textview = gtk.TextView() | |
3456 _textview.set_wrap_mode(gtk.WRAP_WORD) | |
3457 self.__textbuffer = _textview.get_buffer() | |
3458 self.__textbuffer.set_text(_text) | |
3459 _textview.show() | |
3460 _hbox = gtk.HBox() | |
3461 _hbox.pack_start(_textview, True, True, 5) | |
3462 _hbox.show() | |
3463 _vbox = gtk.VBox() | |
3464 self.__label = gtk.Label(utils.mapping(_("Description text of the "\ | |
3465 "record $1"), (self.__budget.getCode( | |
3466 self.__active_path_record),))) | |
3467 self.__label.set_alignment(0, 0) | |
3468 self.__label.show() | |
3469 _vbox.pack_start(self.__label, False, False, 5) | |
3470 _vbox.pack_start(_hbox, True, True, 5) | |
3471 _vbox.show() | |
3472 _scrollwindow.add_with_viewport(_vbox) | |
3473 _scrollwindow.show() | |
3474 self.__widget = _scrollwindow | |
3475 | |
3476 | |
3477 def _setActivePathRecord(self, path_record): | |
3478 """_setActivePathRecord(path_record)) | |
3479 | |
3480 path_record: active path record | |
3481 Set the new path code to show its description text. | |
3482 """ | 3671 """ |
3483 _budget = self.__budget | 3672 _budget = self.__budget |
3484 self.__active_path_record = path_record | 3673 self.__active_path_record = record_path |
3485 _code = _budget.getCode(self.__active_path_record) | 3674 self._setColumnsHeaders() |
3486 self.__label.set_text(utils.mapping(_("Description text of the record "\ | 3675 self._setListstoreValues(self.__active_path_record) |
3487 "$1"), (_code,))) | 3676 self.__treeview.set_cursor((0,)) |
3488 _text = _budget.getRecord(_code).text | |
3489 self.__textbuffer.set_text(_text) | |
3490 | 3677 |
3491 def runMessage(self, message, pane_path, arg=None): | 3678 def runMessage(self, message, pane_path, arg=None): |
3492 """runMessage(message, pane_path, arg=None) | 3679 """runMessage(message, pane_path, arg=None) |
3493 | 3680 |
3494 message: the message type | 3681 message: the message type |
3501 This method receives a message and executes its corresponding action | 3688 This method receives a message and executes its corresponding action |
3502 """ | 3689 """ |
3503 _budget = self.__budget | 3690 _budget = self.__budget |
3504 if message == "change_active": | 3691 if message == "change_active": |
3505 if _budget.hasPath(arg): | 3692 if _budget.hasPath(arg): |
3693 _path_record = arg | |
3694 self._showMessageRecord( _path_record) | |
3695 elif message == "clear": | |
3696 self._clear() | |
3697 | |
3698 def _clear(self): | |
3699 """_clear() | |
3700 | |
3701 it deletes the __budget value | |
3702 """ | |
3703 del self.__budget | |
3704 | |
3705 def _getWidget(self): | |
3706 """_getWidget() | |
3707 | |
3708 return the main widget (Gtk.ScrolledWindow) | |
3709 """ | |
3710 return self.__scrolled_window | |
3711 | |
3712 def _getPanePath(self): | |
3713 """_getPanePath() | |
3714 | |
3715 return the tuple that identifies the pane in the notebook page | |
3716 """ | |
3717 return self.__pane_path | |
3718 | |
3719 def _setPanePath(self, pane_path): | |
3720 """_setPanePath() | |
3721 | |
3722 sets the tuple that identifies the pane in the notebook page | |
3723 """ | |
3724 self.__pane_path = pane_path | |
3725 | |
3726 def _getWrPage(self): | |
3727 """_getPage() | |
3728 | |
3729 return the Page | |
3730 """ | |
3731 return self.__wr_page | |
3732 | |
3733 def _setWrPage(self,wr_page): | |
3734 """_setPage() | |
3735 | |
3736 set the Page | |
3737 """ | |
3738 self.__wr_page = wr_page | |
3739 | |
3740 def _getBudget(self): | |
3741 """_getBudget() | |
3742 | |
3743 return the Budget objet | |
3744 """ | |
3745 return self.__budget | |
3746 | |
3747 def _getActivePathRecord(self): | |
3748 """getActivePathRecord() | |
3749 | |
3750 return the Active Path Record | |
3751 """ | |
3752 return self.__active_path_record | |
3753 | |
3754 widget = property(_getWidget, None, None, | |
3755 "Pane configuration list") | |
3756 pane_path = property(_getPanePath, _setPanePath, None, | |
3757 "Path that identifies the item in the page notebook") | |
3758 wr_page = property(_getWrPage, _setWrPage, None, | |
3759 "Weak reference from Page instance which creates this class") | |
3760 budget = property(_getBudget, None, None, | |
3761 "Budget object") | |
3762 active_path_record = property(_getActivePathRecord, None, None, | |
3763 "Active Code") | |
3764 | |
3765 | |
3766 class Description(object): | |
3767 """gui.Description | |
3768 | |
3769 Description: | |
3770 Class to show a description text of a record in a pane | |
3771 Constructor: | |
3772 budget: budget showed ("base.Budget" object) | |
3773 page: weak reference from Page instance which creates this class | |
3774 pane_path: tuple that represents the view path in the Page | |
3775 path_record: the record path that must be showed | |
3776 Returns the newly created DecompositionList instance | |
3777 Ancestry: | |
3778 +-- object | |
3779 +-- Description | |
3780 Atributes: | |
3781 budget: Read. Budget to show, base.obra object. | |
3782 widget: the main widget (Gtk.ScrolledWindow object) | |
3783 pane_path: Read-Write. Pane page identifier | |
3784 wr_page: Read-Write. weak ref from Page object which creates this class | |
3785 active_path_record: Read. Active path record | |
3786 Methods: | |
3787 runMessage | |
3788 """ | |
3789 # TODO: make standard: "DecompositonList and Description" | |
3790 | |
3791 def __init__(self, budget, wr_page, pane_path, path_record=None): | |
3792 """__init__(budget, page, pane_path, path_record=None) | |
3793 | |
3794 budget: the budget (base.obra object) | |
3795 wr_page: weak reference from Page instance which creates this class | |
3796 pane_path: the path position of the description in the page | |
3797 path_record: the path of the active record | |
3798 | |
3799 self.__budget: the budget (base.obra object) | |
3800 self.__wr_page: weak reference from Page instance which creates this class | |
3801 self.__pane_path: the path position of the description in the page | |
3802 self.__active_path_recordthe path of the active record | |
3803 | |
3804 self.__textbuffer: The textbuffer of the textview that contain | |
3805 the record text. | |
3806 self.__label: The Gtk.label with the title of the pane | |
3807 self.__widget: the main pane widget, a Gtk.ScrolledWindow() | |
3808 | |
3809 Creates an shows the scroledwindow that contain the description text | |
3810 of the record to be showed in a pane. | |
3811 """ | |
3812 if path_record is None: | |
3813 path_record = (0,) | |
3814 self.__budget = budget | |
3815 self.__wr_page = wr_page | |
3816 self.__pane_path = pane_path | |
3817 self.__active_path_record = path_record | |
3818 _budget = budget | |
3819 _text = _budget.getRecord(self.__budget.getCode( | |
3820 self.__active_path_record)).text | |
3821 _scrollwindow = Gtk.ScrolledWindow() | |
3822 _scrollwindow.set_property("expand", True) # widget expand all space | |
3823 _scrollwindow.set_policy(Gtk.PolicyType(1), | |
3824 Gtk.PolicyType(1)) # 1 Automatic | |
3825 _scrollwindow.set_shadow_type(1) # NONE 0, IN 1, OUT 2, ETCHED_IN 3,ETCHED_OUT 4 | |
3826 _textview = Gtk.TextView() | |
3827 _textview.set_wrap_mode(2) # 2 Word | |
3828 _textview.set_hexpand(True) | |
3829 _textview.set_vexpand(True) | |
3830 self.__textbuffer = _textview.get_buffer() | |
3831 self.__textbuffer.set_text(_text) | |
3832 _textview.show() | |
3833 _vbox = Gtk.Grid() | |
3834 _vbox.set_orientation(Gtk.Orientation(1)) # 1 Vertical | |
3835 self.__label = Gtk.Label(utils.mapping(_("Description text of the "\ | |
3836 "record $1"), (str(self.__budget.getCode( | |
3837 self.__active_path_record)),))) | |
3838 self.__label.set_alignment(0, 0) | |
3839 self.__label.show() | |
3840 _vbox.add(self.__label) | |
3841 _vbox.add(_textview) | |
3842 _vbox.show() | |
3843 _scrollwindow.add(_vbox) | |
3844 _scrollwindow.show() | |
3845 self.__widget = _scrollwindow | |
3846 | |
3847 def _setActivePathRecord(self, path_record): | |
3848 """_setActivePathRecord(path_record)) | |
3849 | |
3850 path_record: active path record | |
3851 Set the new path code to show its description text. | |
3852 """ | |
3853 _budget = self.__budget | |
3854 self.__active_path_record = path_record | |
3855 _code = _budget.getCode(self.__active_path_record) | |
3856 self.__label.set_text(utils.mapping(_("Description text of the record "\ | |
3857 "$1"), (_code.decode("utf8"),))) | |
3858 _text = _budget.getRecord(_code).text | |
3859 self.__textbuffer.set_text(_text) | |
3860 | |
3861 def runMessage(self, message, pane_path, arg=None): | |
3862 """runMessage(message, pane_path, arg=None) | |
3863 | |
3864 message: the message type | |
3865 "change_active": change the active record | |
3866 "clear": clear instance | |
3867 pane_path: tuple that identifies the pane in the notebook page | |
3868 arg: tuple whit two items: | |
3869 0: record path in the budget | |
3870 1: record code | |
3871 This method receives a message and executes its corresponding action | |
3872 """ | |
3873 _budget = self.__budget | |
3874 if message == "change_active": | |
3875 if _budget.hasPath(arg): | |
3506 self._setActivePathRecord(arg) | 3876 self._setActivePathRecord(arg) |
3507 elif message == "clear": | 3877 elif message == "clear": |
3508 self._clear() | 3878 self._clear() |
3509 | 3879 |
3510 def _clear(self): | 3880 def _clear(self): |
3520 del self.__label | 3890 del self.__label |
3521 | 3891 |
3522 def _getWidget(self): | 3892 def _getWidget(self): |
3523 """_getWidget() | 3893 """_getWidget() |
3524 | 3894 |
3525 return the main widget (gtk.ScrolledWindow) | 3895 return the main widget (Gtk.ScrolledWindow) |
3526 """ | 3896 """ |
3527 return self.__widget | 3897 return self.__widget |
3528 | 3898 |
3529 def _getPanePath(self): | 3899 def _getPanePath(self): |
3530 """_getPanePath() | 3900 """_getPanePath() |
3538 | 3908 |
3539 sets the tuple that identifies the pane in the notebook page | 3909 sets the tuple that identifies the pane in the notebook page |
3540 """ | 3910 """ |
3541 self.__pane_path = pane_path | 3911 self.__pane_path = pane_path |
3542 | 3912 |
3543 def _getPage(self): | 3913 def _getWrPage(self): |
3544 """_getPage() | 3914 """_getWrPage() |
3545 | 3915 |
3546 return the weak reference from Page instance | 3916 return the weak reference from Page instance |
3547 """ | 3917 """ |
3548 return self.__page | 3918 return self.__wr_page |
3549 | 3919 |
3550 def _setPage(self, page): | 3920 def _setWrPage(self, wr_page): |
3551 """_setPage() | 3921 """_setWrPage() |
3552 | 3922 |
3553 set the weak reference from Page instance | 3923 set the weak reference from Page instance |
3554 """ | 3924 """ |
3555 self.__page = page | 3925 self.__wr_page = wr_page |
3556 | 3926 |
3557 def _getBudget(self): | 3927 def _getBudget(self): |
3558 """_getBudget() | 3928 """_getBudget() |
3559 | 3929 |
3560 return the budget object | 3930 return the budget object |
3569 return self.__active_path_record | 3939 return self.__active_path_record |
3570 | 3940 |
3571 pane_path = property(_getPanePath, _setPanePath, None, | 3941 pane_path = property(_getPanePath, _setPanePath, None, |
3572 "Path that identifie the item in the page notebook") | 3942 "Path that identifie the item in the page notebook") |
3573 widget = property(_getWidget, None, None, | 3943 widget = property(_getWidget, None, None, |
3574 "The main widget (gtk.ScrolledWindow)") | 3944 "The main widget (Gtk.ScrolledWindow)") |
3575 page = property(_getPage, _setPage, None, | 3945 wr_page = property(_getWrPage, _setWrPage, None, |
3576 "Weak reference from Page instance which creates this class") | 3946 "Weak reference from Page instance which creates this class") |
3577 budget = property(_getBudget, None, None, | 3947 budget = property(_getBudget, None, None, |
3578 "Budget object") | 3948 "Budget object") |
3579 active_path_record = property(_getActivePathRecord, None, None, | 3949 active_path_record = property(_getActivePathRecord, None, None, |
3580 "Active Path Record") | 3950 "Active Path Record") |
3591 code: code record | 3961 code: code record |
3592 Ancestry: | 3962 Ancestry: |
3593 +-- object | 3963 +-- object |
3594 +-- Sheet | 3964 +-- Sheet |
3595 Atributes: | 3965 Atributes: |
3596 widget: the main widget (gtk.VBox() object) | 3966 budget: The budget (base.obra objetc) |
3967 widget: the main widget (Gtk.Grid object) | |
3597 pane_path: the tuple that identifies the pane in the notebook page | 3968 pane_path: the tuple that identifies the pane in the notebook page |
3598 page: weak reference from Page instance which creates this class | 3969 wr_page: weak reference from Page instance which creates this class |
3599 budget: The budget (base.obra objetc) | |
3600 active_path_record: The active path record | 3970 active_path_record: The active path record |
3601 Methods: | 3971 Methods: |
3602 runMessage | 3972 runMessage |
3603 """ | 3973 """ |
3604 | 3974 |
3605 def __init__(self, budget, page, pane_path, path_record=None): | 3975 def __init__(self, budget, wr_page, pane_path, path_record=None): |
3606 """__init__(budget, page, pane_path, path_record=None) | 3976 """__init__(budget, wr_page, pane_path, path_record=None) |
3607 | 3977 |
3608 budget: the budget (base.obra object) | 3978 budget: the budget (base.obra object) |
3609 page: weak reference from Page instance which creates this class | 3979 wr_page: weak reference from Page instance which creates this class |
3610 pane_path: the path position of the description in the page | 3980 pane_path: the path position of the description in the page |
3611 path_record: the path of the active record | 3981 path_record: the path of the active record |
3612 | 3982 |
3613 self.__budget: the budget (base.obra object) | 3983 self.__budget: the budget (base.obra object) |
3614 self.__page: weak reference from Page instance which creates this class | 3984 self.__wr_page: weak reference from Page instance which creates this class |
3615 self.__pane_path: the path position of the description in the page | 3985 self.__pane_path: the path position of the description in the page |
3616 self.__active_path_record: the path of the active record | 3986 self.__active_path_record: the path of the active record |
3617 self.__label: The gtk.label with the title of the pane | 3987 self.__label: The Gtk.label with the title of the pane |
3618 self.__field_liststore: the field liststore | 3988 self.__field_liststore: the field liststore |
3619 self.__field_treeview: the field treeview | 3989 self.__field_treeview: the field treeview |
3620 self.__field_selection: the field selected in field treview | 3990 self.__field_selection: the field selected in field treview |
3621 self.__section_liststore: the section liststore | 3991 self.__section_liststore: the section liststore |
3622 self.__section_treeview: the section treeview | 3992 self.__section_treeview: the section treeview |
3623 self.__section_selection: the section selected in the section treeview | 3993 self.__section_selection: the section selected in the section treeview |
3624 self.__textbuffer: The textbuffer of the textview that contain | 3994 self.__textbuffer: The textbuffer of the textview that contain |
3625 the record text. | 3995 the record text. |
3626 self.__widget: main widget, a gtk.VBox() | 3996 self.__widget: main widget, a Gtk.Grid() |
3627 | 3997 |
3628 Creates an shows the scroledwindow that contain the description text | 3998 Creates an shows the scroledwindow that contain the description text |
3629 of the record to be showed in a pane. | 3999 of the record to be showed in a pane. |
3630 """ | 4000 """ |
3631 if path_record is None: | 4001 if path_record is None: |
3632 path_record = (0,) | 4002 path_record = (0,) |
3633 self.__budget = budget | 4003 self.__budget = budget |
3634 self.__page = page | 4004 self.__wr_page = wr_page |
3635 self.__pane_path = pane_path | 4005 self.__pane_path = pane_path |
3636 self.__active_path_record = path_record | 4006 self.__active_path_record = path_record |
3637 _budget = budget | 4007 _budget = budget |
3638 _main_box = gtk.VBox() | 4008 _main_box = Gtk.Grid() |
3639 self.__label = gtk.Label(utils.mapping(_("Sheet of Conditions of the "\ | 4009 _main_box.set_orientation(Gtk.Orientation(1)) # 1 Vertical |
4010 self.__label = Gtk.Label(utils.mapping(_("Sheet of Conditions of the "\ | |
3640 "record $1"), (self.__budget.getCode( | 4011 "record $1"), (self.__budget.getCode( |
3641 self.__active_path_record),))) | 4012 self.__active_path_record),))) |
3642 self.__label.set_alignment(0, 0) | 4013 self.__label.set_xalign(0) |
4014 self.__label.set_yalign(0) | |
3643 self.__label.show() | 4015 self.__label.show() |
3644 _frame = gtk.Frame() | 4016 _frame = Gtk.Frame() |
3645 _frame.set_shadow_type(gtk.SHADOW_IN) | 4017 _frame.set_shadow_type(Gtk.ShadowType(1)) # 1 In |
3646 _frame_box = gtk.VBox() | 4018 _frame_box = Gtk.Grid() |
3647 _list_box = gtk.HBox() | 4019 _frame_box.set_orientation(Gtk.Orientation(1)) # 1 Vertical |
3648 self.__field_liststore = gtk.ListStore(str, str) | 4020 _list_box = Gtk.Grid() |
3649 self.__field_treeview = gtk.TreeView(self.__field_liststore) | 4021 _list_box.set_orientation(Gtk.Orientation(0)) # 0 Horizontal |
4022 self.__field_liststore = Gtk.ListStore(str, str) | |
4023 self.__field_treeview = Gtk.TreeView(self.__field_liststore) | |
3650 _field_treeselection = self.__field_treeview.get_selection() | 4024 _field_treeselection = self.__field_treeview.get_selection() |
3651 _field_treeselection.set_mode(gtk.SELECTION_SINGLE) | 4025 _field_treeselection.set_mode(Gtk.SelectionMode(1)) # 1 SINGLE |
3652 self.__field_selection = None | 4026 self.__field_selection = None |
3653 _field_treeselection.set_select_function( | 4027 _field_treeselection.set_select_function( |
3654 self._field_controlSelection) | 4028 self._field_controlSelection) |
3655 self.__field_treeview.show() | 4029 self.__field_treeview.show() |
3656 _fieldcode_cell = gtk.CellRendererText() | 4030 _fieldcode_cell = Gtk.CellRendererText() |
3657 _field_column = gtk.TreeViewColumn(_("Field")) | 4031 _field_column = Gtk.TreeViewColumn(_("Field")) |
3658 _field_column.pack_start(_fieldcode_cell, False) | 4032 _field_column.pack_start(_fieldcode_cell, False) |
3659 _field_cell = gtk.CellRendererText() | 4033 _field_cell = Gtk.CellRendererText() |
3660 _field_column.pack_end(_field_cell, True) | 4034 _field_column.pack_end(_field_cell, True) |
3661 _field_column.add_attribute(_fieldcode_cell, "text", 0) | 4035 _field_column.add_attribute(_fieldcode_cell, "text", 0) |
3662 _field_column.add_attribute(_field_cell, "text", 1) | 4036 _field_column.add_attribute(_field_cell, "text", 1) |
3663 self.__field_treeview.append_column(_field_column) | 4037 self.__field_treeview.append_column(_field_column) |
3664 _field_scrollwindow = gtk.ScrolledWindow() | 4038 _field_scrollwindow = Gtk.ScrolledWindow() |
3665 _field_scrollwindow.set_policy(gtk.POLICY_AUTOMATIC, | 4039 _field_scrollwindow.set_policy(Gtk.PolicyType(1), |
3666 gtk.POLICY_AUTOMATIC) | 4040 Gtk.PolicyType(1)) # 1 Automatic |
4041 _field_scrollwindow.set_property("hexpand", True) # widget expand all space | |
3667 _field_scrollwindow.add(self.__field_treeview) | 4042 _field_scrollwindow.add(self.__field_treeview) |
4043 _field_scrollwindow.set_size_request(-1, 80) | |
3668 _field_scrollwindow.show() | 4044 _field_scrollwindow.show() |
3669 self.__section_liststore = gtk.ListStore(str, str) | 4045 self.__section_liststore = Gtk.ListStore(str, str) |
3670 self.__section_treeview = gtk.TreeView(self.__section_liststore) | 4046 self.__section_treeview = Gtk.TreeView(self.__section_liststore) |
3671 _section_treeselection = self.__section_treeview.get_selection() | 4047 _section_treeselection = self.__section_treeview.get_selection() |
3672 _section_treeselection.set_mode(gtk.SELECTION_SINGLE) | 4048 _section_treeselection.set_mode(Gtk.SelectionMode(1)) # 1 SINGLE |
3673 self.__section_selection = None | 4049 self.__section_selection = None |
3674 _section_treeselection.set_select_function( | 4050 _section_treeselection.set_select_function( |
3675 self._section_controlSelection) | 4051 self._section_controlSelection) |
3676 self.__section_treeview.show() | 4052 self.__section_treeview.show() |
3677 _sectioncode_cell = gtk.CellRendererText() | 4053 _sectioncode_cell = Gtk.CellRendererText() |
3678 _section_column = gtk.TreeViewColumn(_("Section")) | 4054 _section_column = Gtk.TreeViewColumn(_("Section")) |
3679 _section_column.pack_start(_sectioncode_cell, False) | 4055 _section_column.pack_start(_sectioncode_cell, False) |
3680 _section_column.add_attribute(_sectioncode_cell, "text", 0) | 4056 _section_column.add_attribute(_sectioncode_cell, "text", 0) |
3681 _section_cell = gtk.CellRendererText() | 4057 _section_cell = Gtk.CellRendererText() |
3682 _section_column.pack_end(_section_cell, True) | 4058 _section_column.pack_end(_section_cell, True) |
3683 _section_column.add_attribute(_section_cell, "text", 1) | 4059 _section_column.add_attribute(_section_cell, "text", 1) |
3684 self.__section_treeview.append_column(_section_column) | 4060 self.__section_treeview.append_column(_section_column) |
3685 _section_scrollwindow = gtk.ScrolledWindow() | 4061 _section_scrollwindow = Gtk.ScrolledWindow() |
3686 _section_scrollwindow.set_policy(gtk.POLICY_AUTOMATIC, | 4062 _section_scrollwindow.set_policy(Gtk.PolicyType(1), |
3687 gtk.POLICY_AUTOMATIC) | 4063 Gtk.PolicyType(1)) # 1 Automatic |
4064 _section_scrollwindow.set_property("hexpand", True) # widget expand all space | |
4065 _section_scrollwindow.set_size_request(-1, 90) | |
3688 _section_scrollwindow.add(self.__section_treeview) | 4066 _section_scrollwindow.add(self.__section_treeview) |
3689 _section_scrollwindow.show() | 4067 _section_scrollwindow.show() |
3690 | 4068 |
3691 _list_box.pack_start(_field_scrollwindow, True, True, 5) | 4069 _list_box.add(_field_scrollwindow) |
3692 _list_box.pack_start(_section_scrollwindow, True, True, 5) | 4070 _list_box.add(_section_scrollwindow) |
3693 _list_box.show() | 4071 _list_box.show() |
3694 | 4072 |
3695 _scrollwindow = gtk.ScrolledWindow() | 4073 _scrollwindow = Gtk.ScrolledWindow() |
3696 _scrollwindow.set_policy(gtk.POLICY_AUTOMATIC, | 4074 _scrollwindow.set_policy(Gtk.PolicyType(1), |
3697 gtk.POLICY_AUTOMATIC) | 4075 Gtk.PolicyType(1)) # 1 Automatic |
3698 _textview = gtk.TextView() | 4076 _scrollwindow.set_property("expand", True) # widget expand all space |
3699 _textview.set_wrap_mode(gtk.WRAP_WORD) | 4077 _textview = Gtk.TextView() |
4078 _textview.set_wrap_mode(2) # 2 Word | |
4079 _textview.set_property("expand", True) # widget expand all space | |
3700 self.__textbuffer = _textview.get_buffer() | 4080 self.__textbuffer = _textview.get_buffer() |
3701 _textview.show() | 4081 _textview.show() |
3702 _hbox = gtk.HBox() | 4082 _hbox = Gtk.Grid() |
3703 _hbox.pack_start(_textview, True, True, 5) | 4083 _hbox.set_orientation(Gtk.Orientation(0)) # 0 Horizontal |
4084 _hbox.add(_textview) | |
3704 _hbox.show() | 4085 _hbox.show() |
3705 _frame_box.pack_start(self.__label, False, False, 5) | 4086 _frame_box.add(self.__label) |
3706 _frame_box.pack_start(_list_box, False, False, 5) | 4087 _frame_box.add(_list_box) |
3707 _frame_box.show() | 4088 _frame_box.show() |
3708 _frame.add(_frame_box) | 4089 _frame.add(_frame_box) |
3709 _frame.show() | 4090 _frame.show() |
3710 _main_box.pack_start(_frame, False) | 4091 _main_box.add(_frame) |
3711 _vbox = gtk.VBox() | 4092 _vbox = Gtk.Grid() |
3712 _vbox.pack_start(_hbox, True, True, 5) | 4093 _vbox.set_orientation(Gtk.Orientation(1)) # 1 Vertical |
4094 _vbox.add(_hbox) | |
3713 _vbox.show() | 4095 _vbox.show() |
3714 _main_box.pack_start(_scrollwindow, True, True, 5) | 4096 _main_box.add(_scrollwindow) |
3715 _main_box.show() | 4097 _main_box.show() |
3716 _scrollwindow.add_with_viewport(_vbox) | 4098 _scrollwindow.add(_vbox) |
3717 _scrollwindow.show() | 4099 _scrollwindow.show() |
3718 self.__widget = _main_box | 4100 self.__widget = _main_box |
3719 self._setFields() | 4101 self._setFields() |
3720 | 4102 |
3721 def _setFields(self): | 4103 def _setFields(self): |
3766 _paragraph = self.__budget.getSheetParagraph(_paragraph_code) | 4148 _paragraph = self.__budget.getSheetParagraph(_paragraph_code) |
3767 self.__textbuffer.set_text(_paragraph) | 4149 self.__textbuffer.set_text(_paragraph) |
3768 else: | 4150 else: |
3769 self.__textbuffer.set_text("") | 4151 self.__textbuffer.set_text("") |
3770 | 4152 |
3771 def _field_controlSelection(self, selection): | 4153 def _field_controlSelection(self, selection, model, path, |
3772 """_controlSelection(selection) | 4154 path_currently_selected, *data): |
4155 """_controlSelection(selection, model, path, | |
4156 path_currently_selected, *data) | |
3773 | 4157 |
3774 selection: treeselection | 4158 selection: treeselection |
4159 path: selected path | |
3775 | 4160 |
3776 Method connected to set_selection_function() in field treeview | 4161 Method connected to set_selection_function() in field treeview |
3777 This method is called before any node is selected or unselected, | 4162 This method is called before any node is selected or unselected, |
3778 giving some control over which nodes are selected. | 4163 giving some control over which nodes are selected. |
3779 The selection function should return TRUE if the state | 4164 The selection function should return TRUE if the state |
3781 be left unchanged. | 4166 be left unchanged. |
3782 | 4167 |
3783 When a user select a row in the field treeview the section treeview is | 4168 When a user select a row in the field treeview the section treeview is |
3784 reloaded to show the sections of this field and already the text sheet. | 4169 reloaded to show the sections of this field and already the text sheet. |
3785 """ | 4170 """ |
3786 _treeiter = self.__field_liststore.get_iter(selection) | 4171 _treeiter = self.__field_liststore.get_iter(path) |
3787 self.__field_selection = self.__field_liststore.get_value(_treeiter, 0) | 4172 self.__field_selection = self.__field_liststore.get_value(_treeiter, 0) |
3788 self._setSection() | 4173 self._setSection() |
3789 return True | 4174 return True |
3790 | 4175 |
3791 def _section_controlSelection(self, selection): | 4176 def _section_controlSelection(self, selection, model, path, |
3792 """_section_controlSelection(selection) | 4177 path_currently_selected, *data): |
4178 """_section_controlSelection(selection, model, | |
4179 path, path_currently_selected, *data) | |
3793 | 4180 |
3794 selection: treeselection | 4181 selection: treeselection |
4182 path: selected path | |
3795 | 4183 |
3796 Method connected to set_selection_function() in sector treeview | 4184 Method connected to set_selection_function() in sector treeview |
3797 This method is called before any node is selected or unselected, | 4185 This method is called before any node is selected or unselected, |
3798 giving some control over which nodes are selected. | 4186 giving some control over which nodes are selected. |
3799 The selection function should return TRUE if the state | 4187 The selection function should return TRUE if the state |
3801 be left unchanged. | 4189 be left unchanged. |
3802 | 4190 |
3803 When a user select a row in the field treeview the text sheet for this | 4191 When a user select a row in the field treeview the text sheet for this |
3804 section in showed | 4192 section in showed |
3805 """ | 4193 """ |
3806 _treeiter = self.__section_liststore.get_iter(selection) | 4194 _treeiter = self.__section_liststore.get_iter(path) |
3807 self.__section_selection = self.__section_liststore.get_value(_treeiter, 0) | 4195 self.__section_selection = self.__section_liststore.get_value(_treeiter, 0) |
3808 self._setText() | 4196 self._setText() |
3809 return True | 4197 return True |
3810 | 4198 |
3811 def _setActivePathRecord(self, path_record): | 4199 def _setActivePathRecord(self, path_record): |
3849 def _clear(self): | 4237 def _clear(self): |
3850 """_clear() | 4238 """_clear() |
3851 | 4239 |
3852 Deletes all the instance atributes | 4240 Deletes all the instance atributes |
3853 """ | 4241 """ |
3854 del self.__page | 4242 del self.__wr_page |
3855 del self.__widget | 4243 del self.__widget |
3856 del self.__pane_path | 4244 del self.__pane_path |
3857 del self.__budget | 4245 del self.__budget |
3858 del self.__active_code | 4246 del self.__active_code |
3859 del self.__textbuffer | 4247 del self.__textbuffer |
3868 del self.__section_selection | 4256 del self.__section_selection |
3869 | 4257 |
3870 def _getWidget(self): | 4258 def _getWidget(self): |
3871 """_getWidget() | 4259 """_getWidget() |
3872 | 4260 |
3873 return the main widget (gtk.ScrolledWindow) | 4261 return the main widget (Gtk.ScrolledWindow) |
3874 """ | 4262 """ |
3875 return self.__widget | 4263 return self.__widget |
3876 | 4264 |
3877 def _getPanePath(self): | 4265 def _getPanePath(self): |
3878 """_getPanePath() | 4266 """_getPanePath() |
3886 | 4274 |
3887 sets the tuple that identifies the pane in the notebook page | 4275 sets the tuple that identifies the pane in the notebook page |
3888 """ | 4276 """ |
3889 self.__pane_path = pane_path | 4277 self.__pane_path = pane_path |
3890 | 4278 |
3891 def _getPage(self): | 4279 def _getWrPage(self): |
3892 """_getPage() | 4280 """_getWrPage() |
3893 | 4281 |
3894 return the weak reference from Page instance | 4282 return the weak reference from Page instance |
3895 """ | 4283 """ |
3896 return self.__page | 4284 return self.__wr_page |
3897 | 4285 |
3898 def _setPage(self, page): | 4286 def _setWrPage(self, wr_page): |
3899 """_setPage() | 4287 """_setWrPage() |
3900 | 4288 |
3901 set the weak reference from Page instance | 4289 set the weak reference from Page instance |
3902 """ | 4290 """ |
3903 self.__page = page | 4291 self.__wr_page = wr_page |
3904 | 4292 |
3905 def _getBudget(self): | 4293 def _getBudget(self): |
3906 """_getBudget() | 4294 """_getBudget() |
3907 | 4295 |
3908 return the budget object | 4296 return the budget object |
3918 | 4306 |
3919 pane_path = property(_getPanePath, _setPanePath, None, | 4307 pane_path = property(_getPanePath, _setPanePath, None, |
3920 "Path that identifie the item in the page notebook") | 4308 "Path that identifie the item in the page notebook") |
3921 widget = property(_getWidget, None, None, | 4309 widget = property(_getWidget, None, None, |
3922 "Lista de configuracion de vistas") | 4310 "Lista de configuracion de vistas") |
3923 page = property(_getPage, _setPage, None, | 4311 wr_page = property(_getWrPage, _setWrPage, None, |
3924 "Weak reference from Page instance which creates this class") | 4312 "Weak reference from Page instance which creates this class") |
3925 budget = property(_getBudget, None, None, | 4313 budget = property(_getBudget, None, None, |
3926 "Budget object") | 4314 "Budget object") |
3927 active_path_record = property(_getActivePathRecord, None, None, | 4315 active_path_record = property(_getActivePathRecord, None, None, |
3928 "Active Path Record") | 4316 "Active Path Record") |
3932 """gui.FileView | 4320 """gui.FileView |
3933 | 4321 |
3934 Description: | 4322 Description: |
3935 Class to show the file icons of a record in a pane | 4323 Class to show the file icons of a record in a pane |
3936 Constructor: | 4324 Constructor: |
3937 Description(budget, page, pane_path, path_record=(0,)) | 4325 Description(budget, page, pane_path, path_record=None) |
3938 budget: the budget (base.obra object) | 4326 budget: the budget (base.obra object) |
3939 page: weak reference from Page instance which creates this class | 4327 wr_page: weak reference from Page instance which creates this class |
3940 pane_path: the path position of the description in the page | 4328 pane_path: the path position of the description in the page |
3941 path_record: the path of the active record | 4329 path_record: the path of the active record |
3942 Ancestry: | 4330 Ancestry: |
3943 +-- object | 4331 +-- object |
3944 +-- FileView | 4332 +-- FileView |
3945 Atributes: | 4333 Atributes: |
3946 widget: the main widget (gtk.ScrolledWindow object) | 4334 widget: the main widget (Gtk.ScrolledWindow object) |
3947 pane_path: the tuple that identifies the pane in the notebook page | 4335 pane_path: the tuple that identifies the pane in the notebook page |
3948 budget: The budget (base.obra objetc) | 4336 budget: The budget (base.obra object) |
3949 active_code: The active code of the record | 4337 active_path_record: Read. |
4338 wr_page: Read-Write. weak reference from Page instance which creates this class | |
3950 Methods: | 4339 Methods: |
3951 runMessage | 4340 runMessage |
3952 """ | 4341 """ |
3953 | 4342 |
3954 def __init__(self, budget, page, pane_path, path_record=None): | 4343 def __init__(self, budget, wr_page, pane_path, path_record=None): |
3955 """__init__(budget, page, pane_path, path_record=None) | 4344 """__init__(budget, page, pane_path, path_record=None) |
3956 | 4345 |
3957 budget: the budget (base.obra object) | 4346 budget: the budget (base.obra object) |
3958 page: weak reference from Page instance which creates this class | 4347 wr_page: weak reference from Page instance which creates this class |
3959 pane_path: the path position of the description in the page | 4348 pane_path: the path position of the description in the page |
3960 path_record: the path of the active record | 4349 path_record: the path of the active record |
3961 | 4350 |
3962 self.__budget: the budget (base.obra object) | 4351 self.__budget: the budget (base.obra object) |
3963 self.__page: weak reference from Page instance which creates this class | 4352 self.__wr_page: weak reference from Page instance which creates this class |
3964 self.__pane_path: the path position of the description in the page | 4353 self.__pane_path: the path position of the description in the page |
3965 self.__active_path_record: the path of the active record | 4354 self.__active_path_record: the path of the active record |
3966 self.__active_code: the code of the active record | 4355 self.__active_code: the code of the active record |
3967 self.__icon_box: the box that contains the icon | 4356 self.__icon_box: the box that contains the icon |
3968 self.__widget: main widget, a gtk.ScrolledWindow | 4357 self.__widget: main widget, a Gtk.ScrolledWindow |
3969 | 4358 |
3970 Creates an shows the scroledwindow that contain icon files | 4359 Creates an shows the scroledwindow that contain icon files |
3971 of the record to be showed in a pane. | 4360 of the record to be showed in a pane. |
3972 """ | 4361 """ |
3973 if path_record is None: | 4362 if path_record is None: |
3974 path_record = (0,) | 4363 path_record = (0,) |
3975 self.__budget = budget | 4364 self.__budget = budget |
3976 self.__page = page | 4365 self.__wr_page = wr_page |
3977 self.__pane_path = pane_path | 4366 self.__pane_path = pane_path |
3978 self.__active_path_record = path_record | 4367 self.__active_path_record = path_record |
3979 self.__active_code = budget.getCode(self.__active_path_record) | 4368 self.__active_code = budget.getCode(self.__active_path_record) |
3980 _budget = budget | 4369 _budget = budget |
3981 _record = self.__budget.getRecord(self.__budget.getCode( | 4370 _record = self.__budget.getRecord(self.__budget.getCode( |
3982 self.__active_path_record)) | 4371 self.__active_path_record)) |
3983 | 4372 |
3984 self.__icon_box = self._getIconBox(_record) | 4373 self.__icon_box = self._getIconBox(_record) |
3985 _scrollwindow = gtk.ScrolledWindow() | 4374 _scrollwindow = Gtk.ScrolledWindow() |
3986 _scrollwindow.set_policy(gtk.POLICY_ALWAYS, | 4375 _scrollwindow.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) |
3987 gtk.POLICY_NEVER) | |
3988 self.__icon_box.show() | 4376 self.__icon_box.show() |
3989 _scrollwindow.add_with_viewport(self.__icon_box) | 4377 _scrollwindow.add(self.__icon_box) |
3990 _scrollwindow.show() | 4378 _scrollwindow.show() |
3991 self.__widget = _scrollwindow | 4379 self.__widget = _scrollwindow |
3992 | 4380 |
3993 def _getIconBox(self, record): | 4381 def _getIconBox(self, record): |
3994 """_getIconBox(record) | 4382 """_getIconBox(record) |
3995 | 4383 |
3996 record: the active record object | 4384 record: the active record object |
3997 | 4385 |
3998 Creates and returns the box whith te icon files of the active record. | 4386 Creates and returns the box whith te icon files of the active record. |
3999 """ | 4387 """ |
4000 ## TODO: add others filetypes: avi, pdf, ppt... | |
4001 _files = record.getFiles() | 4388 _files = record.getFiles() |
4002 _hbox = gtk.HBox() | 4389 _flowbox = Gtk.FlowBox() |
4003 _frame = gtk.Frame() | 4390 _flowbox.set_valign(Gtk.Align.START) |
4004 _frame.set_shadow_type(gtk.SHADOW_IN) | 4391 _flowbox.set_max_children_per_line(30) |
4392 _flowbox.set_selection_mode(Gtk.SelectionMode.NONE) | |
4393 _flowbox.set_property("expand", True) # widget expand all space | |
4005 for _file in _files: | 4394 for _file in _files: |
4006 _path = os.path.dirname(self.__budget.filename) | 4395 _path = os.path.dirname(self.__budget.filename) |
4007 _file_path = os.path.join(_path, _file.name) | 4396 _file_path = os.path.join(_path, _file.name) |
4008 _filetype = utils.getFiletype(_file_path) | 4397 _box = Gtk.Grid() |
4009 _box = gtk.VBox() | 4398 _box.set_orientation(Gtk.Orientation(1)) # 1 Vertical |
4010 if _filetype == "image": | 4399 if os.path.exists(_file_path): |
4011 _event_box = gtk.EventBox() | 4400 _filetype = utils.getFiletype(_file_path) |
4012 try: | 4401 _event_box = Gtk.LinkButton() |
4013 _image_pixbuf = gtk.gdk.pixbuf_new_from_file(_file_path) | 4402 _file_icon = Gtk.Image() |
4014 _image_pixbuf = _image_pixbuf.scale_simple(64, 64, | 4403 # "image", "wmf", "dxf", "pdf" , "video", |
4015 gtk.gdk.INTERP_BILINEAR) | 4404 # "office-document", "office-presentation", "office-spreadsheet", |
4016 except: | 4405 # "html", "rtf", "txt", "" |
4017 _image_pixbuf = gtk.gdk.pixbuf_new_from_file( | 4406 # icon |
4018 globalVars.getAppPath("IMAGE-ICON")) | 4407 if _filetype in ["image", "wmf"]: |
4019 _image_pixbuf = _image_pixbuf.scale_simple(64, 64, | 4408 try: |
4020 gtk.gdk.INTERP_BILINEAR) | 4409 _image_pixbuf = GdkPixbuf.Pixbuf.new_from_file(_file_path) |
4021 _image_icon = gtk.Image() | 4410 _image_pixbuf = _image_pixbuf.scale_simple(64, 64, |
4022 _image_icon.set_from_pixbuf(_image_pixbuf) | 4411 GdkPixbuf.InterpType(2)) # 2 BILINEAR |
4023 _image_icon.show() | 4412 except: |
4024 _event_box.add(_image_icon) | 4413 _image_pixbuf = GdkPixbuf.Pixbuf.new_from_file( |
4025 _box.pack_start(_event_box, False, False, 5) | 4414 globalVars.getAppPath("IMAGE-ICON")) |
4026 _event_box.connect("button-press-event", self._launchFile, | 4415 _image_pixbuf = _image_pixbuf.scale_simple(64, 64, |
4027 "image", _file_path) | 4416 GdkPixbuf.InterpType(2)) # 2 BILINEAR |
4417 _file_icon.set_from_pixbuf(_image_pixbuf) | |
4418 _event_box.connect("activate-link", self._launchFile, | |
4419 _filetype, _file_path) | |
4420 elif _filetype == "dxf": | |
4421 _dxf_pixbuf = GdkPixbuf.Pixbuf.new_from_file( | |
4422 globalVars.getAppPath("DXF-ICON")) | |
4423 _dxf_pixbuf = _dxf_pixbuf.scale_simple(64, 64, | |
4424 GdkPixbuf.InterpType(2)) # 2 BILINEAR | |
4425 _file_icon.set_from_pixbuf(_dxf_pixbuf) | |
4426 _event_box.connect("activate-link", self._launchFile, | |
4427 "dxf", _file_path) | |
4428 elif _filetype == "pdf": | |
4429 _pdf_pixbuf = GdkPixbuf.Pixbuf.new_from_file( | |
4430 globalVars.getAppPath("PDF-ICON")) | |
4431 _pdf_pixbuf = _pdf_pixbuf.scale_simple(64, 64, | |
4432 GdkPixbuf.InterpType(2)) # 2 BILINEAR | |
4433 _file_icon.set_from_pixbuf(_pdf_pixbuf) | |
4434 _event_box.connect("activate-link", self._launchFile, | |
4435 "pdf", _file_path) | |
4436 elif _filetype == "video": | |
4437 _video_pixbuf = Gtk.IconTheme.get_default().load_icon( | |
4438 "video-x-generic", 64, 0) | |
4439 _file_icon.set_from_pixbuf(_video_pixbuf) | |
4440 _event_box.connect("activate-link", self._launchFile, | |
4441 "video", _file_path) | |
4442 elif _filetype == "office-document": | |
4443 _document_pixbuf = Gtk.IconTheme.get_default().load_icon( | |
4444 "x-office-document", 64, 0) | |
4445 _file_icon.set_from_pixbuf(_document_pixbuf) | |
4446 _event_box.connect("activate-link", self._launchFile, | |
4447 "office-document", _file_path) | |
4448 elif _filetype == "office-presentation": | |
4449 _presentation_pixbuf = Gtk.IconTheme.get_default().load_icon( | |
4450 "x-office-presentation", 64, 0) | |
4451 _file_icon.set_from_pixbuf(_presentation_pixbuf) | |
4452 _event_box.connect("activate-link", self._launchFile, | |
4453 "office-presentation", _file_path) | |
4454 elif _filetype == "office-spreadsheet": | |
4455 _spreadsheet_pixbuf = Gtk.IconTheme.get_default().load_icon( | |
4456 "x-office-spreadsheet", 64, 0) | |
4457 _file_icon.set_from_pixbuf(_spreadsheet_pixbuf) | |
4458 _event_box.connect("activate-link", self._launchFile, | |
4459 "office-spreadsheet", _file_path) | |
4460 elif _filetype == "html": | |
4461 _html_pixbuf = Gtk.IconTheme.get_default().load_icon( | |
4462 "text-html", 64, 0) | |
4463 _file_icon.set_from_pixbuf(_html_pixbuf) | |
4464 _event_box.connect("activate-link", self._launchFile, | |
4465 "html", _file_path) | |
4466 elif _filetype == "rtf": | |
4467 _rtf_pixbuf = Gtk.IconTheme.get_default().load_icon( | |
4468 "text-x-generic", 64, 0) | |
4469 _file_icon.set_from_pixbuf(_rtf_pixbuf) | |
4470 _event_box.connect("activate-link", self._launchFile, | |
4471 "rtf", _file_path) | |
4472 elif _filetype == "txt": | |
4473 _txt_pixbuf = Gtk.IconTheme.get_default().load_icon( | |
4474 "text-x-generic", 64, 0) | |
4475 _file_icon.set_from_pixbuf(_txt_pixbuf) | |
4476 _event_box.connect("activate-link", self._launchFile, | |
4477 "txt", _file_path) | |
4478 else: | |
4479 _missing_pixbuf = Gtk.IconTheme.get_default().load_icon( | |
4480 "image-missing", 64, 0) | |
4481 _file_icon.set_from_pixbuf(_missing_pixbuf) | |
4482 # Is secure open no detected filetype? | |
4483 #_event_box.connect("activate-link", self._launchFile, | |
4484 # "", _file_path) | |
4485 _event_box = Gtk.EventBox() | |
4486 _event_box.add(_file_icon) | |
4487 _event_box.props.margin = 5 | |
4488 _box.add(_event_box) | |
4489 _file_icon.show() | |
4028 _event_box.show() | 4490 _event_box.show() |
4029 | 4491 # label |
4030 elif _filetype == "dxf": | 4492 _label_event_box = Gtk.EventBox() |
4031 _event_box = gtk.EventBox() | 4493 _label = Gtk.Label(_file.name) |
4032 _dxf_icon = gtk.Image() | |
4033 _dxf_pixbuf = gtk.gdk.pixbuf_new_from_file( | |
4034 globalVars.getAppPath("DXF-ICON")) | |
4035 _dxf_pixbuf = _dxf_pixbuf.scale_simple(64, 64, | |
4036 gtk.gdk.INTERP_BILINEAR) | |
4037 _dxf_icon.set_from_pixbuf(_dxf_pixbuf) | |
4038 _dxf_icon.show() | |
4039 _event_box.add(_dxf_icon) | |
4040 _box.pack_start(_event_box, False, False, 5) | |
4041 _event_box.connect("button-press-event", self._launchFile, | |
4042 "dxf", _file_path) | |
4043 _event_box.show() | |
4044 _label_event_box = gtk.EventBox() | |
4045 _label = gtk.Label(_file.name) | |
4046 _label_event_box.add(_label) | 4494 _label_event_box.add(_label) |
4047 _label_event_box.show() | 4495 _label_event_box.show() |
4048 _label.show() | 4496 _label.show() |
4049 _box.pack_start(_label_event_box, False, False, 5) | 4497 _label_event_box.props.margin = 5 |
4498 _box.add(_label_event_box) | |
4050 _box.show() | 4499 _box.show() |
4051 _hbox.pack_start(_box, False, False, 5) | 4500 _box.props.margin = 5 |
4052 _hbox.show() | 4501 _flowbox.add(_box) |
4053 _frame.add(_hbox) | 4502 _flowbox.show() |
4054 return _frame | 4503 #_scrolled.show() |
4055 | 4504 return _flowbox |
4056 def _launchFile(self, widget, event, kind, file_path): | 4505 |
4506 def _launchFile(self, widget, kind, file_path): | |
4057 """_launchFile(widget, event, kind, file_path) | 4507 """_launchFile(widget, event, kind, file_path) |
4058 | 4508 |
4059 widget: the widget that emit the signal | 4509 widget: the widget that emit the signal |
4060 event: the event that emit the signal | |
4061 king: kind of file | 4510 king: kind of file |
4062 file_path: the path file to be launch | 4511 file_path: the path file to be launch |
4063 | 4512 |
4064 Launch the file if a double click emit the signal. | 4513 Launch the file if a click emit the signal. |
4065 Method connected to "button-press-event" signal in images event box | 4514 Method connected to "activate-link" signal in images botton link |
4066 """ | 4515 Return True: stops propagate event and avoids to raise an error |
4067 if event.type is gtk.gdk._2BUTTON_PRESS: | 4516 when opening an empty uri. |
4068 openwith.launch_file(kind, file_path) | 4517 """ |
4518 openwith.launch_file(kind, file_path) | |
4519 return True | |
4069 | 4520 |
4070 def _setActivePathRecord(self, path_record): | 4521 def _setActivePathRecord(self, path_record): |
4071 """_setActivePathRecord(path_record)) | 4522 """_setActivePathRecord(path_record)) |
4072 | 4523 |
4073 path_record: active path record | 4524 path_record: active path record |
4076 _budget = self.__budget | 4527 _budget = self.__budget |
4077 self.__active_path_record = path_record | 4528 self.__active_path_record = path_record |
4078 _code = _budget.getCode(self.__active_path_record) | 4529 _code = _budget.getCode(self.__active_path_record) |
4079 _record = self.__budget.getRecord(_code) | 4530 _record = self.__budget.getRecord(_code) |
4080 self.__icon_box.destroy() | 4531 self.__icon_box.destroy() |
4081 self.__icon_box = self._getIconBox(_record) | 4532 self.__icon_box = self._getIconBox(_record) |
4082 self.__icon_box.show() | 4533 self.__icon_box.show() |
4083 self.__widget.add_with_viewport(self.__icon_box) | 4534 self.__widget.add_with_viewport(self.__icon_box) |
4084 | 4535 |
4085 def runMessage(self, message, pane_path, arg=None): | 4536 def runMessage(self, message, pane_path, arg=None): |
4086 """runMessage(message, pane_path, arg=None) | 4537 """runMessage(message, pane_path, arg=None) |
4112 del self.__active_code | 4563 del self.__active_code |
4113 | 4564 |
4114 def _getWidget(self): | 4565 def _getWidget(self): |
4115 """_getWidget() | 4566 """_getWidget() |
4116 | 4567 |
4117 return the main widget (gtk.ScrolledWindow) | 4568 return the main widget (Gtk.ScrolledWindow) |
4118 """ | 4569 """ |
4119 return self.__widget | 4570 return self.__widget |
4120 | 4571 |
4121 def _getPanePath(self): | 4572 def _getPanePath(self): |
4122 """_getPanePath() | 4573 """_getPanePath() |
4130 | 4581 |
4131 sets the tuple that identifies the pane in the notebook page | 4582 sets the tuple that identifies the pane in the notebook page |
4132 """ | 4583 """ |
4133 self.__pane_path = pane_path | 4584 self.__pane_path = pane_path |
4134 | 4585 |
4135 def _getPage(self): | 4586 def _getWrPage(self): |
4136 """_getPage() | 4587 """_getWrPage() |
4137 | 4588 |
4138 return the weak reference from Page instance | 4589 return the weak reference from Page instance |
4139 """ | 4590 """ |
4140 return self.__page | 4591 return self.__wr_page |
4141 | 4592 |
4142 def _setPage(self, page): | 4593 def _setWrPage(self, wr_page): |
4143 """setPage() | 4594 """setPage() |
4144 | 4595 |
4145 set the weak reference from Page instance | 4596 set the weak reference from Page instance |
4146 """ | 4597 """ |
4147 self.__page = page | 4598 self.__wr_page = wr_page |
4148 | 4599 |
4149 def _getBudget(self): | 4600 def _getBudget(self): |
4150 """getBudget() | 4601 """getBudget() |
4151 | 4602 |
4152 return the budget object | 4603 return the budget object |
4161 return self.__active_path_record | 4612 return self.__active_path_record |
4162 | 4613 |
4163 pane_path = property(_getPanePath, _setPanePath, None, | 4614 pane_path = property(_getPanePath, _setPanePath, None, |
4164 "Path that identifie the item in the page notebook") | 4615 "Path that identifie the item in the page notebook") |
4165 widget = property(_getWidget, None, None, | 4616 widget = property(_getWidget, None, None, |
4166 "The main widget (gtk.ScrolledWindow)") | 4617 "The main widget (Gtk.ScrolledWindow)") |
4167 page = property(_getPage, _setPage, None, | 4618 wr_page = property(_getWrPage, _setWrPage, None, |
4168 "Weak reference from Page instance which creates this class") | 4619 "Weak reference from Page instance which creates this class") |
4169 budget = property(_getBudget, None, None, | 4620 budget = property(_getBudget, None, None, |
4170 "Budget object") | 4621 "Budget object") |
4171 active_path_record = property(_getActivePathRecord, None, None, | 4622 active_path_record = property(_getActivePathRecord, None, None, |
4172 "Active Path Record") | 4623 "Active Path Record") |
4173 | 4624 |
4174 | 4625 |
4175 class CompanyView(object): | 4626 class CompanyView(object): |
4176 """gui.CompanyView: | 4627 """gui:CompanyView: |
4177 | 4628 |
4178 Description: | 4629 Description: |
4179 Class to show the company records of a budget | 4630 Class to show the company records of a budget |
4180 Constructor: | 4631 Constructor: |
4181 CompanyView(budget, page, pane_path, path_record=(0,)) | 4632 CompanyView(budget, wr_page, pane_path, path_record=(None) |
4182 budget: budget showed ("base.Budget" object) | 4633 budget: budget showed ("base.Budget" object) |
4183 page: weak reference from Page instance which creates this class | 4634 wr_page: weak reference from Page instance which creates this class |
4184 pane_path: tuple that represents the path of the List in the Page | 4635 pane_path: tuple that represents the path of the List in the Page |
4185 path_record: path of the active record in the budget | 4636 path_record: path of the active record in the budget |
4186 Ancestry: | 4637 Ancestry: |
4187 +-- object | 4638 +-- object |
4188 +-- CompanyView | 4639 +-- CompanyView |
4189 Atributes: | 4640 Atributes: |
4190 active_path_record: Read. Path of the active record in the budget | 4641 active_path_record: Read. Path of the active record in the budget |
4191 widget: Read. Window that contains the main widget, a gtk.HPaned | 4642 widget: Read. Window that contains the main widget, a Gtk.Paned |
4192 pane_path: Read-Write. Pane page identifier | 4643 pane_path: Read-Write. Pane page identifier |
4193 page: Read-Write. weak reference from Page instance which creates this class | 4644 wr_page: Read-Write. weak reference from Page instance which creates this class |
4194 budget: Read. Budget to show, base.budget instance. | 4645 budget: Read. Budget to show, base.budget instance. |
4195 Methods: | 4646 Methods: |
4196 runMessage | 4647 runMessage |
4197 """ | 4648 """ |
4198 | 4649 |
4199 def __init__(self, budget, page, pane_path, path_record=None): | 4650 def __init__(self, budget, wr_page, pane_path, path_record=None): |
4200 """__init__(budget, page, pane_path, path_record=None) | 4651 """__init__(budget, wr_page, pane_path, path_record=None) |
4201 | 4652 |
4202 budget: budget: budget showed ("base.Budget" object) | 4653 budget: budget showed ("base.Budget" object) |
4203 page: weak reference from Page instance which creates this class | 4654 wr_page: weak reference from Page instance which creates this class |
4204 pane_path: tuple that represents the path of the List in the Page | 4655 pane_path: tuple that represents the path of the pane in the Page |
4205 path_record: path of the active record in the budget | 4656 path_record: path of the active record in the budget |
4206 | 4657 |
4207 self.__selection: | 4658 self.__selection: "company" or "office" selected treeview |
4208 self.__budget: budget: budget showed ("base.Budget" object) | 4659 self.__budget: budget: budget showed ("base.Budget" object) |
4209 self.__page: weak reference from Page instance which creates this class | 4660 self.__wr_page: weak reference from Page instance which creates this class |
4210 self.__pane_path: tuple that represents the path of the List in the Page | 4661 self.__pane_path: tuple that represents the path of the List in the Page |
4211 self.__active_path_record: path of the active record in the budget | 4662 self.__active_path_record: path of the active record in the budget |
4212 self.__widget: main widget, a gtk.HPaned | 4663 self.__widget: main widget, a Gtk.Paned |
4213 self.__treestore: to store companys data | 4664 self.__treestore: to store companys data |
4214 self.__option_View: OptionView object | 4665 self.__option_View: OptionView object |
4215 | 4666 |
4216 Creates an shows the scroledwindow that contain the company data. | 4667 Creates an shows the widgets with the company data. |
4217 """ | 4668 """ |
4218 if path_record is None: | 4669 if path_record is None: |
4219 path_record = (0,) | 4670 path_record = (0,) |
4220 self.__selection = None | 4671 self.__selection = None |
4221 # Seting init args | 4672 # Seting init args |
4222 if not isinstance(budget, base.Budget): | 4673 if not isinstance(budget, base.Budget): |
4223 raise ValueError, _("Argument must be a Budget object") | 4674 raise ValueError( _("Argument must be a Budget object") ) |
4224 self.__budget = budget | 4675 self.__budget = budget |
4225 self.__page = page | 4676 self.__wr_page = wr_page |
4226 self.__pane_path = pane_path | 4677 self.__pane_path = pane_path |
4227 self.__active_path_record = path_record | 4678 self.__active_path_record = path_record |
4228 # main widget | 4679 # main widget |
4229 self.__widget = gtk.HPaned() | 4680 self.__widget = Gtk.Paned.new(Gtk.Orientation(0)) # 0 Horizontal |
4230 self.__widget.set_position(230) | 4681 self.__widget.set_position(230) |
4231 # TreeStore | 4682 # TreeStore |
4232 self.__treestore = gtk.TreeStore(str, str) | 4683 self.__treestore = Gtk.TreeStore(str, str) |
4233 self._setTreeStoreValues() | 4684 self._setTreeStoreValues() |
4234 # Select Treeview | 4685 # Select Treeview |
4235 _select_treeview = gtk.TreeView(self.__treestore) | 4686 _select_treeview = Gtk.TreeView(self.__treestore) |
4236 _select_treeview.set_enable_search(False) | 4687 _select_treeview.set_enable_search(False) |
4237 _select_treeview.set_reorderable(False) | 4688 _select_treeview.set_reorderable(False) |
4238 _select_treeview.set_headers_visible(False) | 4689 _select_treeview.set_headers_visible(False) |
4239 _select_treeview.show() | 4690 _select_treeview.show() |
4240 # Scrolled_window | 4691 # Scrolled_window |
4241 _scrolled_window = gtk.ScrolledWindow() | 4692 _scrolled_window = Gtk.ScrolledWindow() |
4242 _scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, | 4693 _scrolled_window.set_property("expand", True) # widget expand all space |
4243 gtk.POLICY_AUTOMATIC) | 4694 _scrolled_window.set_policy(Gtk.PolicyType(1), |
4695 Gtk.PolicyType(1)) # 1 Automatic | |
4244 _scrolled_window.add(_select_treeview) | 4696 _scrolled_window.add(_select_treeview) |
4245 # colors | 4697 # colors |
4246 _text_color = gtk.gdk.color_parse(globalVars.color["TEXT"]) | 4698 _text_color = globalVars.color["TEXT"] |
4247 _background_color = [ | 4699 _background_color = [ |
4248 gtk.gdk.color_parse(globalVars.color["UNEVEN"]), | 4700 globalVars.color["UNEVEN"], |
4249 gtk.gdk.color_parse(globalVars.color["EVEN"])] | 4701 globalVars.color["EVEN"]] |
4250 _code_column = gtk.TreeViewColumn() | 4702 _code_column = Gtk.TreeViewColumn() |
4251 _code_column.set_clickable(True) | 4703 _code_column.set_clickable(True) |
4252 _code_column.set_fixed_width(200) | 4704 _code_column.set_fixed_width(200) |
4253 _code_cell = gtk.CellRendererText() | 4705 _code_cell = Gtk.CellRendererText() |
4254 _code_cell.set_property('foreground-gdk', _text_color) | 4706 _code_cell.set_property('foreground', _text_color) |
4255 _code_column.pack_start(_code_cell, True) | 4707 _code_column.pack_start(_code_cell, True) |
4256 _code_column.add_attribute(_code_cell, 'text', 0) | 4708 _code_column.add_attribute(_code_cell, 'text', 0) |
4257 _summary_cell = gtk.CellRendererText() | 4709 _summary_cell = Gtk.CellRendererText() |
4258 _summary_cell.set_property('foreground-gdk', _text_color) | 4710 _summary_cell.set_property('foreground', _text_color) |
4259 _code_column.pack_start(_summary_cell, True) | 4711 _code_column.pack_start(_summary_cell, True) |
4260 _code_column.add_attribute(_summary_cell, 'text', 1) | 4712 _code_column.add_attribute(_summary_cell, 'text', 1) |
4261 # Index column | 4713 # Index column |
4262 _select_treeview.append_column(_code_column) | 4714 _select_treeview.append_column(_code_column) |
4263 # control selection | 4715 # control selection |
4264 _treeselection = _select_treeview.get_selection() | 4716 _treeselection = _select_treeview.get_selection() |
4265 _treeselection.set_mode(gtk.SELECTION_SINGLE) | 4717 _treeselection.set_mode(Gtk.SelectionMode(1)) # 1 SINGLE |
4266 _treeselection.set_select_function(self._controlSelection) | 4718 _treeselection.set_select_function(self._controlSelection) |
4267 # Show | 4719 # Show |
4268 _scrolled_window.show() | 4720 _scrolled_window.show() |
4269 # Option View | 4721 # Option View |
4270 self.__option_View = OptionView("") | 4722 self.__option_View = OptionView() |
4723 # Add to main widget | |
4724 self.__widget.add1(_scrolled_window) | |
4725 self.__widget.add2(self.__option_View.widget) | |
4271 # Selection | 4726 # Selection |
4272 _select_treeview.set_cursor((0,), None, False) | 4727 _select_treeview.set_cursor((0,), None, False) |
4273 _select_treeview.grab_focus() | 4728 _select_treeview.grab_focus() |
4274 # | 4729 # Show |
4275 self.__widget.add1(_scrolled_window) | |
4276 self.__widget.add2(self.__option_View.widget) | |
4277 self.__widget.show() | 4730 self.__widget.show() |
4278 | 4731 |
4279 def _setOptions(self, type): | 4732 def _setOptions(self, type): |
4280 """_setOptions(type) | 4733 """_setOptions(type) |
4281 | 4734 |
4296 ("email", _("Email"), "string", | 4749 ("email", _("Email"), "string", |
4297 _("""Company email""")), | 4750 _("""Company email""")), |
4298 ] | 4751 ] |
4299 self.__option_View.options = _options | 4752 self.__option_View.options = _options |
4300 elif type == "office": | 4753 elif type == "office": |
4301 _options = [("type", _("Type"), "string", | 4754 _options = [("officeType", _("Type"), "string", |
4302 _("""Type of Office: | 4755 _("""Type of Office: |
4303 C: Central office | 4756 C: Central office |
4304 D: Local office | 4757 D: Local office |
4305 R: Performer""")), | 4758 R: Performer""")), |
4306 ("subname", _("Name"), "string", | 4759 ("subname", _("Name"), "string", |
4317 ("contact person", _("Contact person"), "string", | 4770 ("contact person", _("Contact person"), "string", |
4318 _("Contact persons in the office")), | 4771 _("Contact persons in the office")), |
4319 ] | 4772 ] |
4320 self.__option_View.options = _options | 4773 self.__option_View.options = _options |
4321 else: | 4774 else: |
4322 print _("Unknow Option Type") | 4775 print(_("Unknow Option Type") ) |
4323 | 4776 |
4324 def _setTreeStoreValues(self): | 4777 def _setTreeStoreValues(self): |
4325 """_setTreeStoreValues() | 4778 """_setTreeStoreValues() |
4326 | 4779 |
4327 Sets the treestore values from the budget | 4780 Sets the treestore values from the budget |
4336 for _office in _offices: | 4789 for _office in _offices: |
4337 # TODO: Test offices | 4790 # TODO: Test offices |
4338 _values = [_office.officeType, _office.subname] | 4791 _values = [_office.officeType, _office.subname] |
4339 self.__treestore.append(_treeiter, _values) | 4792 self.__treestore.append(_treeiter, _values) |
4340 | 4793 |
4341 | 4794 def _controlSelection(self, selection, model, path, path_currently_selected, *data): |
4342 def _controlSelection(self, selection): | 4795 """_controlSelection(selection, model, path, path_currently_selected, *data) |
4343 """_controlSelection(selection) | |
4344 | 4796 |
4345 selection: selection | 4797 selection: selection |
4346 | 4798 |
4347 Method connected to set_selection_function() | 4799 Method connected to set_selection_function() |
4348 This method is called before any node is selected or unselected, | 4800 This method is called before any node is selected or unselected, |
4351 of the node may be toggled, and FALSE if the state of the node should | 4803 of the node may be toggled, and FALSE if the state of the node should |
4352 be left unchanged. | 4804 be left unchanged. |
4353 | 4805 |
4354 The selection changes the company/office in the option treeview | 4806 The selection changes the company/office in the option treeview |
4355 """ | 4807 """ |
4356 if len(selection) == 1: | 4808 if len(path) == 1: |
4357 # The selection is a company | 4809 # The selection is a company |
4358 _company_key = self.__treestore[selection][0] | 4810 _company_key = self.__treestore[path][0] |
4359 _company = self.__budget.getCompany(_company_key) | 4811 _company = self.__budget.getCompany(_company_key) |
4360 _selection = "company" | 4812 _selection = "company" |
4361 _values = _company.values | 4813 _values = _company.values |
4362 else: | 4814 else: |
4363 # The selection is a office | 4815 # The selection is a office |
4364 _company_key = self.__treestore[selection[:1]][0] | 4816 _company_key = self.__treestore[path[:1]][0] |
4365 _company = self.__budget.getCompany(_company_key) | 4817 _company = self.__budget.getCompany(_company_key) |
4366 _selection = "office" | 4818 _selection = "office" |
4367 _office = _company.offices[selection[1]] | 4819 _office = _company.offices[path[1]] |
4368 _values = _office.values | 4820 _values = _office.values |
4369 if not self.__selection == _selection: | 4821 if not self.__selection == _selection: |
4370 self.__selection = _selection | 4822 self.__selection = _selection |
4371 self.options = _selection | 4823 self._setOptions(_selection) |
4372 self.__option_View.values = _values | 4824 self.__option_View.values = _values |
4373 | |
4374 return True | 4825 return True |
4375 | 4826 |
4376 def _showMessageRecord(self, record_path): | 4827 def _showMessageRecord(self, record_path): |
4377 """_showMessageRecord(record_path) | 4828 """_showMessageRecord(record_path) |
4378 | 4829 |
4404 self._clear() | 4855 self._clear() |
4405 | 4856 |
4406 def _colorCell(self, column, cell_renderer, tree_model, iter, lcolor): | 4857 def _colorCell(self, column, cell_renderer, tree_model, iter, lcolor): |
4407 """_colorCell(column, cell_renderer, tree_model, iter, lcolor) | 4858 """_colorCell(column, cell_renderer, tree_model, iter, lcolor) |
4408 | 4859 |
4409 column: the gtk.TreeViewColumn in the treeview | 4860 column: the Gtk.TreeViewColumn in the treeview |
4410 cell_renderer: a gtk.CellRenderer | 4861 cell_renderer: a Gtk.CellRenderer |
4411 tree_model: the gtk.TreeModel | 4862 tree_model: the Gtk.TreeModel |
4412 iter: gtk.TreeIter pointing at the row | 4863 iter: Gtk.TreeIter pointing at the row |
4413 lcolor: list with 2 gtk colors for even and uneven record | 4864 lcolor: list with 2 gtk colors for even and uneven record |
4414 | 4865 |
4415 Method connected to "set_cell_data_func" of many column | 4866 Method connected to "set_cell_data_func" of many column |
4416 The set_cell_data_func() method sets the data function (or method) | 4867 The set_cell_data_func() method sets the data function (or method) |
4417 to use for the column gtk.CellRenderer specified by cell_renderer. | 4868 to use for the column Gtk.CellRenderer specified by cell_renderer. |
4418 This function (or method) is used instead of the standard attribute | 4869 This function (or method) is used instead of the standard attribute |
4419 mappings for setting the column values, and should set the attributes | 4870 mappings for setting the column values, and should set the attributes |
4420 of the cell renderer as appropriate. func may be None to remove the | 4871 of the cell renderer as appropriate. func may be None to remove the |
4421 current data function. The signature of func is: | 4872 current data function. The signature of func is: |
4422 -def celldatafunction(column, cell, model, iter, user_data) | 4873 -def celldatafunction(column, cell, model, iter, user_data) |
4423 -def celldatamethod(self, column, cell, model, iter, user_data) | 4874 -def celldatamethod(self, column, cell, model, iter, user_data) |
4424 where column is the gtk.TreeViewColumn in the treeview, cell is the | 4875 where column is the Gtk.TreeViewColumn in the treeview, cell is the |
4425 gtk.CellRenderer for column, model is the gtk.TreeModel for the | 4876 Gtk.CellRenderer for column, model is the Gtk.TreeModel for the |
4426 treeview and iter is the gtk.TreeIter pointing at the row. | 4877 treeview and iter is the Gtk.TreeIter pointing at the row. |
4427 | 4878 |
4428 The method sets cell background color for all columns | 4879 The method sets cell background color for all columns |
4429 and text for index and amount columns. | 4880 and text for index and amount columns. |
4430 """ | 4881 """ |
4431 _row_path = tree_model.get_path(iter) | 4882 _row_path = tree_model.get_path(iter) |
4432 _number = _row_path[-1] | 4883 _number = _row_path[-1] |
4433 if column is self.__index_column: | 4884 if column is self.__index_column: |
4434 cell_renderer.set_property('text', str(_number + 1)) | 4885 cell_renderer.set_property('text', str(_number + 1)) |
4435 self.__index_column.get_cell_renderers()[1].set_property( | 4886 self.__index_column.get_cells()[1].set_property( |
4436 'cell-background-gdk', lcolor[_number % 2]) | 4887 'cell-background', lcolor[_number % 2]) |
4437 if self.__treeview.get_cursor() == (_row_path,column): | 4888 if self.__treeview.get_cursor() == (_row_path,column): |
4438 cell_renderer.set_property('cell-background-gdk', | 4889 cell_renderer.set_property('cell-background', |
4439 gtk.gdk.color_parse(globalVars.color["ACTIVE"])) | 4890 globalVars.color["ACTIVE"]) |
4440 else: | 4891 else: |
4441 cell_renderer.set_property('cell-background-gdk', | 4892 cell_renderer.set_property('cell-background', |
4442 lcolor[_number % 2]) | 4893 lcolor[_number % 2]) |
4443 | 4894 |
4444 def _clear(self): | 4895 def _clear(self): |
4445 """_clear() | 4896 """_clear() |
4446 | 4897 |
4449 del self.__budget | 4900 del self.__budget |
4450 | 4901 |
4451 def _getWidget(self): | 4902 def _getWidget(self): |
4452 """_getWidget() | 4903 """_getWidget() |
4453 | 4904 |
4454 return the main widget (gtk.ScrolledWindow) | 4905 return the main widget (Gtk.ScrolledWindow) |
4455 """ | 4906 """ |
4456 return self.__widget | 4907 return self.__widget |
4457 | 4908 |
4458 def _getPanePath(self): | 4909 def _getPanePath(self): |
4459 """_getPanePath() | 4910 """_getPanePath() |
4467 | 4918 |
4468 sets the tuple that identifies the pane in the notebook page | 4919 sets the tuple that identifies the pane in the notebook page |
4469 """ | 4920 """ |
4470 self.__pane_path = pane_path | 4921 self.__pane_path = pane_path |
4471 | 4922 |
4472 def _getPage(self): | 4923 def _getWrPage(self): |
4473 """_getPage() | 4924 """_getWrPage() |
4474 | 4925 |
4475 return the Page | 4926 return the Page |
4476 """ | 4927 """ |
4477 return self.__page | 4928 return self.__wr_page |
4478 | 4929 |
4479 def _setPage(self,page): | 4930 def _setWrPage(self,wr_page): |
4480 """_setPage() | 4931 """_setWrPage() |
4481 | 4932 |
4482 set the Page | 4933 set the Page |
4483 """ | 4934 """ |
4484 self.__page = page | 4935 self.__wr_page = wr_page |
4485 | 4936 |
4486 def _getBudget(self): | 4937 def _getBudget(self): |
4487 """_getBudget() | 4938 """_getBudget() |
4488 | 4939 |
4489 return the Budget objet | 4940 return the Budget objet |
4501 "Active path record") | 4952 "Active path record") |
4502 widget = property(_getWidget, None, None, | 4953 widget = property(_getWidget, None, None, |
4503 "main widget") | 4954 "main widget") |
4504 pane_path = property(_getPanePath, _setPanePath, None, | 4955 pane_path = property(_getPanePath, _setPanePath, None, |
4505 "Path that identifies the item in the page notebook") | 4956 "Path that identifies the item in the page notebook") |
4506 page = property(_getPage, _setPage, None, | 4957 wr_page = property(_getWrPage, _setWrPage, None, |
4507 "Weak reference from Page instance which creates this class") | 4958 "Weak reference from Page instance which creates this class") |
4508 budget = property(_getBudget, None, None, | 4959 budget = property(_getBudget, None, None, |
4509 "Budget object") | 4960 "Budget object") |
4510 | 4961 |
4511 | 4962 |
4514 | 4965 |
4515 Description: | 4966 Description: |
4516 It creates a treeview whith the column "Option Name" "Value" | 4967 It creates a treeview whith the column "Option Name" "Value" |
4517 and "Type" to show and edit Options | 4968 and "Type" to show and edit Options |
4518 Constructor: | 4969 Constructor: |
4519 OptionView(option_list) | 4970 OptionView() |
4520 option_list: list of options | |
4521 (option_name, type) | |
4522 Ancestry: | 4971 Ancestry: |
4523 +-- object | 4972 +-- object |
4524 +-- OptionView | 4973 +-- OptionView |
4525 Atributes: | 4974 Atributes: |
4526 widget: Read. Main widget | 4975 widget: Read. Main widget |
4527 options: Write | 4976 options: Write |
4528 values: Write | 4977 values: Write |
4529 Methods: | 4978 Methods: |
4979 No public Methods | |
4530 """ | 4980 """ |
4531 | 4981 |
4532 def __init__(self, option_list): | 4982 def __init__(self): |
4533 """__init__(option_list) | 4983 """__init__() |
4534 | 4984 |
4535 self.__option_dict: | 4985 self.__option_dict: |
4536 {"option key" : ["option name", "value", "option type", | 4986 {"option key" : ["option name", "value", "option type", |
4537 "option_description"]} | 4987 "option_description"]} |
4538 self.__option_list: option keys list | 4988 self.__option_list: option keys list |
4539 self.__option_types: valid option types list | 4989 self.__option_types: valid option types list |
4540 self.__liststore: gtk.ListStore | 4990 self.__liststore: Gtk.ListStore |
4541 self.__treeview: gtk.TreeView | 4991 self.__treeview: Gtk.TreeView |
4542 self.__option_column: option column | 4992 self.__option_column: option column |
4543 self.__value_column: value column | 4993 self.__value_column: value column |
4544 self.__type_column: type column | 4994 self.__type_column: type column |
4545 self.__description_label: gtk.Label | 4995 self.__description_label: Gtk.Label |
4546 self.__widget: Main widget | 4996 self.__widget: Main widget |
4547 | 4997 |
4548 Creates an shows the widget that contain the option data. | 4998 Creates an shows the widget that contain the option data. |
4549 """ | 4999 """ |
4550 self.__option_dict = {} | 5000 self.__option_dict = {} |
4553 "integer": _("Integer"), | 5003 "integer": _("Integer"), |
4554 "string": _("Text"), | 5004 "string": _("Text"), |
4555 "color" : _("Color"), | 5005 "color" : _("Color"), |
4556 "list" : _("List")} | 5006 "list" : _("List")} |
4557 # ListStore | 5007 # ListStore |
4558 self.__liststore = gtk.ListStore(str, str, str, str, str) | 5008 self.__liststore = Gtk.ListStore(str, str, str, str, str) |
4559 # Treeview | 5009 # Treeview |
4560 self.__treeview = gtk.TreeView(self.__liststore) | 5010 self.__treeview = Gtk.TreeView(self.__liststore) |
4561 self.__treeview.set_enable_search(False) | 5011 self.__treeview.set_enable_search(False) |
4562 self.__treeview.set_reorderable(False) | 5012 self.__treeview.set_reorderable(False) |
4563 self.__treeview.set_headers_clickable(False) | 5013 self.__treeview.set_headers_clickable(False) |
4564 # vbox | 5014 # vbox |
4565 _vbox = gtk.VBox() | 5015 _vbox = Gtk.Grid() |
5016 _vbox.set_orientation(Gtk.Orientation(1)) # 1 Vertical | |
4566 # Scrolled_window | 5017 # Scrolled_window |
4567 _scrolled_window = gtk.ScrolledWindow() | 5018 _scrolled_window = Gtk.ScrolledWindow() |
4568 _scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, | 5019 _scrolled_window.set_property("expand", True) # widget expand all space |
4569 gtk.POLICY_AUTOMATIC) | 5020 _scrolled_window.set_policy(Gtk.PolicyType(1), |
5021 Gtk.PolicyType(1)) # 1 Automatic | |
4570 _scrolled_window.add(self.__treeview) | 5022 _scrolled_window.add(self.__treeview) |
4571 _scrolled_window.show() | 5023 _scrolled_window.show() |
4572 _vbox.pack_start(_scrolled_window) | 5024 _vbox.add(_scrolled_window) |
4573 # colors | 5025 # colors |
4574 _text_color = gtk.gdk.color_parse(globalVars.color["TEXT"]) | 5026 _text_color = globalVars.color["TEXT"] |
4575 _background_color = [ | 5027 _background_color = [ |
4576 gtk.gdk.color_parse(globalVars.color["UNEVEN"]), | 5028 globalVars.color["UNEVEN"], |
4577 gtk.gdk.color_parse(globalVars.color["EVEN"])] | 5029 globalVars.color["EVEN"]] |
4578 # Option Column | 5030 # Option Column |
4579 self.__option_column = gtk.TreeViewColumn() | 5031 self.__option_column = Gtk.TreeViewColumn() |
4580 self.__option_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) | 5032 self.__option_column.set_sizing(Gtk.TreeViewColumnSizing(2)) # 2 Fixed |
4581 self.__option_column.set_fixed_width(150) | 5033 self.__option_column.set_fixed_width(150) |
4582 self.__option_column.set_resizable(True) | 5034 self.__option_column.set_resizable(True) |
4583 _option_cell = gtk.CellRendererText() | 5035 _option_cell = Gtk.CellRendererText() |
4584 _option_cell.set_property('foreground-gdk', _text_color) | 5036 _option_cell.set_property('foreground', _text_color) |
4585 self.__option_column.pack_start(_option_cell, True) | 5037 self.__option_column.pack_start(_option_cell, True) |
4586 self.__option_column.set_cell_data_func(_option_cell, self._colorCell, | 5038 self.__option_column.set_cell_data_func(_option_cell, self._colorCell, |
4587 _background_color) | 5039 _background_color) |
4588 self.__option_column.set_title(_("Option name")) | 5040 self.__option_column.set_title(_("Option name")) |
4589 self.__option_column.add_attribute(_option_cell, 'text', 1) | 5041 self.__option_column.add_attribute(_option_cell, 'text', 1) |
4590 self.__treeview.append_column(self.__option_column) | 5042 self.__treeview.append_column(self.__option_column) |
4591 # Value Column | 5043 # Value Column |
4592 self.__value_column = gtk.TreeViewColumn() | 5044 self.__value_column = Gtk.TreeViewColumn() |
4593 self.__value_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) | 5045 self.__value_column.set_sizing(Gtk.TreeViewColumnSizing(2)) # 2 Fixed |
4594 self.__value_column.set_fixed_width(275) | 5046 self.__value_column.set_fixed_width(275) |
4595 self.__value_column.set_resizable(True) | 5047 self.__value_column.set_resizable(True) |
4596 _value_cell = gtk.CellRendererText() | 5048 _value_cell = Gtk.CellRendererText() |
4597 _value_cell.set_property('foreground-gdk', _text_color) | 5049 _value_cell.set_property('foreground', _text_color) |
4598 self.__value_column.pack_start(_value_cell, True) | 5050 self.__value_column.pack_start(_value_cell, True) |
4599 self.__value_column.set_cell_data_func(_value_cell, self._colorCell, | 5051 self.__value_column.set_cell_data_func(_value_cell, self._colorCell, |
4600 _background_color) | 5052 _background_color) |
4601 self.__value_column.set_title(_("Value")) | 5053 self.__value_column.set_title(_("Value")) |
4602 self.__value_column.add_attribute(_value_cell, 'text', 2) | 5054 self.__value_column.add_attribute(_value_cell, 'text', 2) |
4603 self.__treeview.append_column(self.__value_column) | 5055 self.__treeview.append_column(self.__value_column) |
4604 # Type Column | 5056 # Type Column |
4605 self.__type_column = gtk.TreeViewColumn() | 5057 self.__type_column = Gtk.TreeViewColumn() |
4606 self.__type_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) | 5058 self.__type_column.set_sizing(Gtk.TreeViewColumnSizing(2)) # 2 Fixed |
4607 self.__type_column.set_fixed_width(70) | 5059 self.__type_column.set_fixed_width(70) |
4608 self.__type_column.set_resizable(True) | 5060 self.__type_column.set_resizable(True) |
4609 _type_cell = gtk.CellRendererText() | 5061 _type_cell = Gtk.CellRendererText() |
4610 _type_cell.set_property('foreground-gdk', _text_color) | 5062 _type_cell.set_property('foreground', _text_color) |
4611 self.__type_column.pack_start(_type_cell, True) | 5063 self.__type_column.pack_start(_type_cell, True) |
4612 self.__type_column.set_cell_data_func(_type_cell, self._colorCell, | 5064 self.__type_column.set_cell_data_func(_type_cell, self._colorCell, |
4613 _background_color) | 5065 _background_color) |
4614 self.__type_column.set_title(_("Type")) | 5066 self.__type_column.set_title(_("Type")) |
4615 self.__treeview.append_column(self.__type_column) | 5067 self.__treeview.append_column(self.__type_column) |
4616 # End Column | 5068 # End Column |
4617 _end_column = gtk.TreeViewColumn() | 5069 _end_column = Gtk.TreeViewColumn() |
4618 _end_column.set_clickable(False) | 5070 _end_column.set_clickable(False) |
4619 _end_cell = gtk.CellRendererText() | 5071 _end_cell = Gtk.CellRendererText() |
4620 _end_cell.set_property('cell-background-gdk', | 5072 _end_cell.set_property('cell-background', |
4621 gtk.gdk.color_parse(globalVars.color["UNEVEN"])) | 5073 globalVars.color["UNEVEN"]) |
4622 _end_column.pack_start(_end_cell, True) | 5074 _end_column.pack_start(_end_cell, True) |
4623 self.__treeview.append_column(_end_column) | 5075 self.__treeview.append_column(_end_column) |
4624 # Connect | 5076 # Connect |
4625 self.__treeview.connect("key-press-event", self._treeviewKeyPressEvent) | 5077 self.__treeview.connect("key-press-event", self._treeviewKeyPressEvent) |
4626 self.__treeview.connect("button-press-event", | 5078 self.__treeview.connect("button-press-event", |
4627 self._treeviewClickedEvent) | 5079 self._treeviewClickedEvent) |
4628 # control selection | 5080 # control selection |
4629 _treeselection = self.__treeview.get_selection() | 5081 _treeselection = self.__treeview.get_selection() |
4630 _treeselection.set_mode(gtk.SELECTION_MULTIPLE) | 5082 _treeselection.set_mode(Gtk.SelectionMode(3)) # 3 MULTIPLE |
4631 _treeselection.set_select_function(self._controlSelection) | 5083 _treeselection.set_select_function(self._controlSelection) |
4632 # labels | 5084 # labels |
4633 _frame = gtk.Frame() | 5085 _frame = Gtk.Frame() |
4634 _frame.set_shadow_type(gtk.SHADOW_OUT) | 5086 _frame.set_shadow_type(2) # NONE 0, IN 1, OUT 2, ETCHED_IN 3,ETCHED_OUT 4 |
4635 _vbox2 = gtk.VBox() | 5087 _vbox2 = Gtk.Grid() |
5088 _vbox2.set_orientation(Gtk.Orientation(1)) # 1 Vertical | |
4636 _frame.add(_vbox2) | 5089 _frame.add(_vbox2) |
4637 _alignement = gtk.Alignment(xalign=0, yalign=0, xscale=0, yscale=0) | 5090 _label = Gtk.Label() |
4638 _alignement.set_padding(0, 0, 12, 0) | 5091 _label.set_xalign(0) |
4639 _label = gtk.Label() | 5092 _label.set_yalign(0) |
5093 _label.set_margin_start(12) | |
4640 _label.set_markup("<b>" + _("Description:") + "</b>") | 5094 _label.set_markup("<b>" + _("Description:") + "</b>") |
4641 _label.show() | 5095 _label.show() |
4642 _alignement.add(_label) | 5096 self.__description_label = Gtk.Label() |
4643 _alignement.show() | 5097 self.__description_label.set_xalign(0) |
4644 _alignement2 = gtk.Alignment(xalign=0, yalign=0, xscale=0, yscale=0) | 5098 self.__description_label.set_yalign(0) |
4645 _alignement2.set_padding(0, 0, 24, 0) | 5099 self.__description_label.set_margin_start(24) |
4646 self.__description_label = gtk.Label() | |
4647 self.__description_label.show() | 5100 self.__description_label.show() |
4648 _alignement2.add(self.__description_label) | 5101 _vbox2.add(_label) |
4649 _alignement2.show() | 5102 _vbox2.add(self.__description_label) |
4650 _vbox2.pack_start(_alignement, False) | |
4651 _vbox2.pack_start(_alignement2, False) | |
4652 _vbox2.show() | 5103 _vbox2.show() |
4653 _frame.show() | 5104 _frame.show() |
4654 _vbox.pack_start(_frame, False) | 5105 _vbox.add(_frame) |
4655 # Show | 5106 # Show |
4656 self.__treeview.show() | 5107 self.__treeview.show() |
4657 _vbox.show() | 5108 _vbox.show() |
4658 self.__widget = _vbox | 5109 self.__widget = _vbox |
4659 | 5110 |
4667 on the keyboard. | 5118 on the keyboard. |
4668 Returns :TRUE to stop other handlers from being invoked for the event. | 5119 Returns :TRUE to stop other handlers from being invoked for the event. |
4669 Returns :FALSE to propagate the event further. | 5120 Returns :FALSE to propagate the event further. |
4670 | 5121 |
4671 If the user press the right cursor button and the cursor is in the | 5122 If the user press the right cursor button and the cursor is in the |
4672 value column or pres the left cursor button and the cursor is | 5123 value column or press the left cursor button and the cursor is |
4673 in the value column the event is estoped, else the event is propagated. | 5124 in the value column the event is estoped, else the event is propagated. |
4674 """ | 5125 """ |
4675 (_cursor_path, _column) = self.__treeview.get_cursor() | 5126 (_cursor_path, _column) = self.__treeview.get_cursor() |
4676 if (event.keyval == gtk.keysyms.Right \ | 5127 if (event.keyval in [Gdk.keyval_from_name("Right"), |
5128 Gdk.keyval_from_name("KP_Right")] \ | |
4677 and _column == self.__value_column) \ | 5129 and _column == self.__value_column) \ |
4678 or (event.keyval == gtk.keysyms.Left \ | 5130 or (event.keyval in [Gdk.keyval_from_name("Left"), |
5131 Gdk.keyval_from_name("KP_Left")] \ | |
4679 and _column == self.__value_column): | 5132 and _column == self.__value_column): |
4680 return True | 5133 return True |
4681 else: | 5134 else: |
4682 _description = self.__liststore[_cursor_path][4] | 5135 _description = self.__liststore[_cursor_path][4] |
4683 self.__description_label.set_text(_description) | 5136 self.__description_label.set_text(_description) |
4709 True) | 5162 True) |
4710 self.__treeview.grab_focus() | 5163 self.__treeview.grab_focus() |
4711 return True | 5164 return True |
4712 return True | 5165 return True |
4713 | 5166 |
4714 def _controlSelection(self, selection): | 5167 def _controlSelection(self, selection, model, path, path_currently_selected, |
4715 """_controlSelection(selection) | 5168 *data): |
5169 """_controlSelection(selection, model, path, path_currently_selected, | |
5170 *data) | |
4716 | 5171 |
4717 selection: treeselection | 5172 selection: treeselection |
4718 | 5173 |
4719 Method connected to set_selection_function() | 5174 Method connected to set_selection_function() |
4720 This method is called before any node is selected or unselected, | 5175 This method is called before any node is selected or unselected, |
4728 return False | 5183 return False |
4729 | 5184 |
4730 def _colorCell(self, column, cell_renderer, tree_model, iter, lcolor): | 5185 def _colorCell(self, column, cell_renderer, tree_model, iter, lcolor): |
4731 """_colorCell(column, cell_renderer, tree_model, iter, lcolor) | 5186 """_colorCell(column, cell_renderer, tree_model, iter, lcolor) |
4732 | 5187 |
4733 column: the gtk.TreeViewColumn in the treeview | 5188 column: the Gtk.TreeViewColumn in the treeview |
4734 cell_renderer: a gtk.CellRenderer | 5189 cell_renderer: a Gtk.CellRenderer |
4735 tree_model: the gtk.TreeModel | 5190 tree_model: the Gtk.TreeModel |
4736 iter: gtk.TreeIter pointing at the row | 5191 iter: Gtk.TreeIter pointing at the row |
4737 lcolor: list with 2 gtk colors for even and uneven record | 5192 lcolor: list with 2 colors for even and uneven record |
4738 | 5193 |
4739 Method connected to "set_cell_data_func" of the column | 5194 Method connected to "set_cell_data_func" of the column |
4740 The set_cell_data_func() method sets the data function (or method) | 5195 The set_cell_data_func() method sets the data function (or method) |
4741 to use for the column gtk.CellRenderer specified by cell_renderer. | 5196 to use for the column Gtk.CellRenderer specified by cell_renderer. |
4742 This function (or method) is used instead of the standard attribute | 5197 This function (or method) is used instead of the standard attribute |
4743 mappings for setting the column values, and should set the attributes | 5198 mappings for setting the column values, and should set the attributes |
4744 of the cell renderer as appropriate. func may be None to remove the | 5199 of the cell renderer as appropriate. func may be None to remove the |
4745 current data function. The signature of func is: | 5200 current data function. The signature of func is: |
4746 -def celldatafunction(column, cell, model, iter, user_data) | 5201 -def celldatafunction(column, cell, model, iter, user_data) |
4747 -def celldatamethod(self, column, cell, model, iter, user_data) | 5202 -def celldatamethod(self, column, cell, model, iter, user_data) |
4748 where column is the gtk.TreeViewColumn in the treeview, cell is the | 5203 where column is the Gtk.TreeViewColumn in the treeview, cell is the |
4749 gtk.CellRenderer for column, model is the gtk.TreeModel for the | 5204 Gtk.CellRenderer for column, model is the Gtk.TreeModel for the |
4750 treeview and iter is the gtk.TreeIter pointing at the row. | 5205 treeview and iter is the Gtk.TreeIter pointing at the row. |
4751 | 5206 |
4752 The method sets cell background color for all columns | 5207 The method sets cell background color for all columns |
4753 and text for type column. | 5208 and text for type column. |
4754 """ | 5209 """ |
4755 _row_path = tree_model.get_path(iter) | 5210 _row_path = tree_model.get_path(iter) |
4756 _number = _row_path[-1] | 5211 _number = _row_path[-1] |
4757 if self.__treeview.get_cursor() == (_row_path,column): | 5212 if self.__treeview.get_cursor() == (_row_path,column): |
4758 cell_renderer.set_property('cell-background-gdk', | 5213 cell_renderer.set_property('cell-background', |
4759 gtk.gdk.color_parse(globalVars.color["ACTIVE"])) | 5214 globalVars.color["ACTIVE"]) |
4760 else: | 5215 else: |
4761 cell_renderer.set_property('cell-background-gdk', | 5216 cell_renderer.set_property('cell-background', |
4762 lcolor[_number % 2]) | 5217 lcolor[_number % 2]) |
4763 if column is self.__type_column: | 5218 if column is self.__type_column: |
4764 _type = self.__option_types[tree_model[_row_path][3]] | 5219 _type = self.__option_types[tree_model[_row_path][3]] |
4765 cell_renderer.set_property('text', _type) | 5220 cell_renderer.set_property('text', _type) |
4766 | 5221 |
4786 if isinstance(_option, tuple) and len(_option) == 4: | 5241 if isinstance(_option, tuple) and len(_option) == 4: |
4787 _option_key = _option[0] | 5242 _option_key = _option[0] |
4788 _option_name = _option[1] | 5243 _option_name = _option[1] |
4789 _option_type = _option[2] | 5244 _option_type = _option[2] |
4790 _option_description = _option[3] | 5245 _option_description = _option[3] |
4791 if isinstance(_option_key, str) and \ | 5246 #-# str and unicode |
5247 if (isinstance(_option_key, str) or \ | |
5248 isinstance(_option_key, unicode)) and \ | |
4792 (isinstance(_option_name, str) or\ | 5249 (isinstance(_option_name, str) or\ |
4793 isinstance(_option_name, unicode))and \ | 5250 isinstance(_option_name, unicode))and \ |
4794 _option_type in self.__option_types.keys(): | 5251 _option_type in self.__option_types.keys(): |
4795 self.__liststore.append([_option_key, _option_name, "", | 5252 self.__liststore.append([_option_key, _option_name, "", |
4796 _option_type, _option_description]) | 5253 _option_type, _option_description]) |
4797 self.__option_dict[_option_key] = [_option_name, "", | 5254 self.__option_dict[_option_key] = [_option_name, "", |
4798 _option_type, _option_description] | 5255 _option_type, _option_description] |
4799 self.__option_list.append(_option_key) | 5256 self.__option_list.append(_option_key) |
4800 else: | 5257 else: |
4801 print _("Option values must be strings") | 5258 print(_("Option values must be strings") ) |
4802 else: | 5259 else: |
4803 print _("Option must be a tuple with 4 items") | 5260 print(_("Option must be a tuple with 4 items") ) |
4804 else: | 5261 else: |
4805 print _("Option list must be a list") | 5262 print(_("Option list must be a list") ) |
4806 | 5263 |
4807 def _setValues(self, values): | 5264 def _setValues(self, values): |
4808 """_setValues(values) | 5265 """_setValues(values) |
4809 | 5266 |
4810 values: dictionary {option : value} | 5267 values: dictionary {option : value} |
4820 _num = self.__option_list.index(_option) | 5277 _num = self.__option_list.index(_option) |
4821 _iter = self.__liststore.get_iter((_num,)) | 5278 _iter = self.__liststore.get_iter((_num,)) |
4822 self.__liststore.set_value(_iter, 2, _value) | 5279 self.__liststore.set_value(_iter, 2, _value) |
4823 self.__option_dict[_option][1] = _value | 5280 self.__option_dict[_option][1] = _value |
4824 else: | 5281 else: |
4825 print _("Icorrect type, must be boolean") | 5282 print(_("Icorrect type, must be boolean") ) |
4826 elif _type == "integer": | 5283 elif _type == "integer": |
4827 try: | 5284 try: |
4828 _value = int(_value) | 5285 _value = int(_value) |
4829 except ValueError: | 5286 except ValueError: |
4830 print _("Icorrect type, must be integer") | 5287 print(_("Icorrect type, must be integer") ) |
4831 else: | 5288 else: |
4832 _num = self.__option_list.index(_option) | 5289 _num = self.__option_list.index(_option) |
4833 _iter = self.__liststore.get_iter((_num,)) | 5290 _iter = self.__liststore.get_iter((_num,)) |
4834 self.__liststore.set_value(_iter, 2, _value) | 5291 self.__liststore.set_value(_iter, 2, _value) |
4835 self.__option_dict[_option][1] = _value | 5292 self.__option_dict[_option][1] = _value |
4838 _num = self.__option_list.index(_option) | 5295 _num = self.__option_list.index(_option) |
4839 _iter = self.__liststore.get_iter((_num,)) | 5296 _iter = self.__liststore.get_iter((_num,)) |
4840 self.__liststore.set_value(_iter, 2, _value) | 5297 self.__liststore.set_value(_iter, 2, _value) |
4841 self.__option_dict[_option][1] = _value | 5298 self.__option_dict[_option][1] = _value |
4842 else: | 5299 else: |
4843 print _("Icorrect type, must be string") | 5300 print(_("Icorrect type, must be string") ) |
4844 elif _type == "list": | 5301 elif _type == "list": |
4845 if isinstance(_value, list): | 5302 if isinstance(_value, list): |
4846 _num = self.__option_list.index(_option) | 5303 _num = self.__option_list.index(_option) |
4847 _iter = self.__liststore.get_iter((_num,)) | 5304 _iter = self.__liststore.get_iter((_num,)) |
4848 _str_value = "" | 5305 _str_value = "" |
4851 if _str_value[-1] == ",": | 5308 if _str_value[-1] == ",": |
4852 _str_value = _str_value[:-1] | 5309 _str_value = _str_value[:-1] |
4853 self.__liststore.set_value(_iter, 2, _str_value) | 5310 self.__liststore.set_value(_iter, 2, _str_value) |
4854 self.__option_dict[_option][1] = _value | 5311 self.__option_dict[_option][1] = _value |
4855 else: | 5312 else: |
4856 print _("Icorrect type, must be list") | 5313 print(_("Icorrect type, must be list") ) |
4857 elif _type == "color": | 5314 elif _type == "color": |
4858 if isinstance(_value, str): | 5315 if isinstance(_value, str): |
4859 try: | 5316 if Gdk.RGBA().parse(_value): |
4860 _color = gtk.gdk.color_parse(_value) | 5317 print(_("Icorrect type, must be a parseable " \ |
4861 except ValueError: | 5318 "color") ) |
4862 print _("Icorrect type, must be a parseable " \ | |
4863 "color") | |
4864 else: | 5319 else: |
4865 _num = self.__option_list.index(_option) | 5320 _num = self.__option_list.index(_option) |
4866 _iter = self.__liststore.get_iter((_num,)) | 5321 _iter = self.__liststore.get_iter((_num,)) |
4867 self.__liststore.set_value(_iter, 2, _value) | 5322 self.__liststore.set_value(_iter, 2, _value) |
4868 self.__option_dict[_option][1] = _value | 5323 self.__option_dict[_option][1] = _value |
4869 else: | 5324 else: |
4870 print _("Type must be boolean, integer, string or "\ | 5325 print(_("Type must be boolean, integer, string or "\ |
4871 "color") | 5326 "color") ) |
4872 else: | 5327 else: |
4873 print _("Value must be in the option dict") | 5328 print( _("Value must be in the option dict") ) |
5329 print(_option, _value) | |
4874 else: | 5330 else: |
4875 print _("Values must be a dict") | 5331 print( _("Values must be a dict") ) |
4876 self.__treeview.set_cursor((0),self.__value_column, False) | 5332 self.__treeview.set_cursor(Gtk.TreePath.new_from_indices((0,)), |
5333 self.__value_column, False) | |
4877 self.__treeview.grab_focus() | 5334 self.__treeview.grab_focus() |
4878 (_cursor_path, _column) = self.__treeview.get_cursor() | 5335 (_cursor_path, _column) = self.__treeview.get_cursor() |
4879 _description = self.__liststore[_cursor_path][4] | 5336 _description = self.__liststore[_cursor_path][4] |
4880 self.__description_label.set_text(_description) | 5337 self.__description_label.set_text(_description) |
4881 | 5338 |
4882 def _getWidget(self): | 5339 def _getWidget(self): |
4883 """_getWidget() | 5340 """_getWidget() |
4884 | 5341 |
4885 return the main widget (gtk.ScrolledWindow) | 5342 return the main widget (Gtk.ScrolledWindow) |
4886 """ | 5343 """ |
4887 return self.__widget | 5344 return self.__widget |
4888 | 5345 |
4889 widget = property(_getWidget, None, None, | 5346 widget = property(_getWidget, None, None, |
4890 "main widget") | 5347 "main widget") |
4891 values = property(None, _setValues, None, | 5348 values = property(None, _setValues, None, |
4892 "values") | 5349 "values") |
4893 options = property(None, _setOptions, None, | 5350 options = property(None, _setOptions, None, |
4894 "options") | 5351 "options") |
5352 |