# HG changeset patch # User Miguel Ángel Bárcena Rodríguez # Date 1290635762 -3600 # Node ID fe9c55f86698041e75c08f878c98f2abc83ebeae # Parent d2cbc0278b30f1f2615b970ea4aad60ff12adea7 Improvements in navigation buttons diff -r d2cbc0278b30 -r fe9c55f86698 Generic/globalVars.py --- a/Generic/globalVars.py Fri Nov 19 19:17:11 2010 +0100 +++ b/Generic/globalVars.py Wed Nov 24 22:56:02 2010 +0100 @@ -24,7 +24,7 @@ # path: Paths where find the program files needed version = "pyArq Presupuestos v0.0.0" -changeset = 7 +changeset = 10 baseversion = 0 path = { "HOME" : "", diff -r d2cbc0278b30 -r fe9c55f86698 Gtk/gui.py --- a/Gtk/gui.py Fri Nov 19 19:17:11 2010 +0100 +++ b/Gtk/gui.py Wed Nov 24 22:56:02 2010 +0100 @@ -74,6 +74,13 @@ print utils.mapping(_("pyArq-Presupuestos running on $1"), (globalVars.desktop["desktop"],)) +# Add MenutoolButton to Uimanager +class MenuToolAction(gtk.Action): + __gtype_name__ = "MenuToolAction" + +gobject.type_register(MenuToolAction) +MenuToolAction.set_tool_item_type(gtk.MenuToolButton) + class MainWindow(object): """gui.MainWindow: @@ -87,14 +94,14 @@ +-- object +-- MainWindow Atributes: - notebook: Read. notebook widget - pageList: Read. page list - budgetList: Read. budget list Methods: - removePage + changeHistorySignal + changeActiveSignal + appendEmptyPage + updatePage + closePage """ # TODO:* Can choose open budget in new window - # TODO:* gtk.Action for menu and toolbar # TODO:* Can choose show more than one notebook in the same window or # TODO: can show basedata notebook in a side pane __ui = ''' @@ -106,10 +113,9 @@ - - + @@ -121,10 +127,9 @@ + + - - - ''' @@ -132,19 +137,16 @@ def __init__(self): """__init__() - Initialize the atributes "__budget_list" and "__page_list" without data. + Initialize the atributes self.__page_list without data. Creates the widgets "window" and "__notebook". self.__window: gtk.Window object - self.__budget_temp_list: Temporal list of budgets - self.__budget_list: List of budgets ("base.Budget" objects) + self.__uimanager: gtk.UIManager object self.__page_list: List of pages ("Page" object) self.__notebook: Notebook widget ("gtk.Notebook" object) self.__general_action_group: "General" action group + self.__navigation_action_group: "Navigation" action group """ - #TODO: action group for Navigation buttons - self.__budget_temp_list = [] - self.__budget_list = [] self.__page_list = [] # Main window self.__window = gtk.Window(gtk.WINDOW_TOPLEVEL) @@ -158,12 +160,11 @@ self.__window.add(_vbox1) _vbox1.show() #Uimanager - _uimanager = gtk.UIManager() - _accelgroup = _uimanager.get_accel_group() + self.__uimanager = gtk.UIManager() + _accelgroup = self.__uimanager.get_accel_group() self.__window.add_accel_group(_accelgroup) - _general_action_group = gtk.ActionGroup("General") - self.__general_action_group = _general_action_group - _general_action_group.add_actions( + self.__general_action_group = gtk.ActionGroup("General") + self.__general_action_group.add_actions( [("File", None, _("_File"), None), ("ImportFiebdc", gtk.STOCK_OPEN, _('_Import Fiebdc'), "", _('Import FIEBDC'), self._menuitemImportFiebdc), @@ -171,16 +172,6 @@ self._menuitemClose), ("View", None, _("_View")), ("Go", None, _("_Go")), - ("GoUp", gtk.STOCK_GO_UP, _("_Up Record"),"", - _("Go up record"), self._menuitemGoUp), - ("GoDown", gtk.STOCK_GO_DOWN, _("_Down Record"),"", - _("Go down record"), self._menuitemGoDown), - ("GoPrevious", gtk.STOCK_GO_BACK, _("_Previous Record"),"", - _("Go Previous record"), self._menuitemGoPrevious), - ("GoPosterior", gtk.STOCK_GO_FORWARD, _("_Posterior Record"),"", - _("Go posterior record"), self._menuitemGoPosterior), - ("GoToRoot", gtk.STOCK_GOTO_TOP, _("_Root"),"", - _("Go to root"), self._menuitemGoToRoot), ("Test", None, _("_Test")), ('ImportFiebdcPriceDatabase', gtk.STOCK_OPEN, _("Import Fiebdc _price database"), "", _("Import database"), @@ -188,14 +179,51 @@ ("OpenPriceDatabase", gtk.STOCK_OPEN, _('_Open price database'), "", _('Open Database'), self._menuitemOpenPriceDatabase), ]) - _uimanager.insert_action_group(_general_action_group, 0) - _uimanager.add_ui_from_string(self.__ui) - _menu_bar = _uimanager.get_widget("/MenuBar") + self.__navigation_action_group = gtk.ActionGroup("Navigation") + self.__navigation_action_group.add_actions( + [("Go", None, _("_Go")), + ("GoPrevious", gtk.STOCK_GO_BACK, _("_Back"),"", + _("Go to the previous visited item"), + self._menuitemGoPrevious), + ("GoPosterior", gtk.STOCK_GO_FORWARD, _("_Forward"),"", + _("Go to the next visited item"), self._menuitemGoPosterior), + ("GoUp", gtk.STOCK_GO_UP, _("_Up Item"),"", + _("Go up item"), self._menuitemGoUp), + ("GoToRoot", gtk.STOCK_GOTO_TOP, _("_Root"),"", + _("Go to root"), self._menuitemGoToRoot), + ]) + self.__navigation_action_group.add_action( + MenuToolAction("GoPrevMenu", None , + _("Go to the previous visited item"), + gtk.STOCK_GO_BACK)) + self.__navigation_action_group.add_action( + MenuToolAction("GoPostMenu", None , + _("Go to the next visited item"), + gtk.STOCK_GO_FORWARD)) + self.__navigation_action_group.set_sensitive(False) + self.__navigation_action_group.get_action("GoPostMenu").set_sensitive( + False) + self.__navigation_action_group.get_action("GoPrevMenu").set_sensitive( + False) + self.__uimanager.insert_action_group(self.__general_action_group, 0) + self.__uimanager.insert_action_group(self.__navigation_action_group, 1) + self.__uimanager.add_ui_from_string(self.__ui) + _menu_bar = self.__uimanager.get_widget("/MenuBar") _vbox1.pack_start(_menu_bar, False, False, 0) - _toolbar = _uimanager.get_widget("/ToolBar") + _toolbar = self.__uimanager.get_widget("/ToolBar") _toolbar.get_settings().set_long_property("gtk-toolbar-icon-size", gtk.ICON_SIZE_SMALL_TOOLBAR, "pyArq-Presupuestos:toolbar") _vbox1.pack_start(_toolbar, False, False, 0) + # menuToolButton go prev + _go_prev_button = self.__uimanager.get_widget( + "/ToolBar/GoPrevMenu") + _go_prev_button.set_arrow_tooltip_text(_("Back history")) + _go_prev_button.connect('clicked', self._menuitemGoPrevious) + # menuToolButton go pos + _go_post_button = self.__uimanager.get_widget( + "/ToolBar/GoPostMenu") + _go_post_button.set_arrow_tooltip_text(_("Forward history")) + _go_post_button.connect('clicked', self._menuitemGoPosterior) # Notebook self.__notebook = gtk.Notebook() _vbox1.pack_start(self.__notebook, True, True, 0) @@ -203,8 +231,95 @@ self.__notebook.set_show_tabs(True) self.__notebook.set_show_border(True) self.__notebook.set_scrollable(True) + self.__notebook.connect("switch-page", self._switch_page) self.__notebook.show() self._main() + #TODO: create budget object in mainwindow? + + def changeHistorySignal(self): + """changeHistorySignal() + + A pane emit the updateHistory signal. + + Nothing to do now + """ + pass + + def changeActiveSignal(self): + """changeActiveSignal() + + A pane emit the change-active signal. + + Chech buttons sensitive + """ + self._checkButtonsSensitive(self.__notebook.get_current_page()) + + def _checkButtonsSensitive(self, page_num): + """_checkButtonsSensitive(page_num) + + page_num: page number in notebook + + Check and if necessary update the sensitive state of the navigation + buttons. + """ + _page = self.__page_list[page_num] + if isinstance(_page, Page) and \ + self.__navigation_action_group.get_sensitive(): + # GoToRoot and GoUp actions + _goto_root = self.__navigation_action_group.get_action("GoToRoot") + _go_up = self.__navigation_action_group.get_action("GoUp") + if len(_page.activePathRecord) == 1 and \ + _goto_root.get_sensitive(): + _goto_root.set_sensitive(False) + _go_up.set_sensitive(False) + elif len(_page.activePathRecord) != 1 and \ + not _goto_root.get_sensitive(): + _goto_root.set_sensitive(True) + _go_up.set_sensitive(True) + # GoPrevMenu action + _go_Previous = self.__navigation_action_group.get_action( + "GoPrevious") + _go_prev = self.__navigation_action_group.get_action("GoPrevMenu") + if _page.previousPathRecord is None: + if _go_prev.get_sensitive(): + _go_prev.set_sensitive(False) + _go_Previous .set_sensitive(False) + else: + if not _go_prev.get_sensitive(): + _go_prev.set_sensitive(True) + _go_Previous.set_sensitive(True) + # GoPostMenu action + _go_Posterior = self.__navigation_action_group.get_action( + "GoPosterior") + _go_post = self.__navigation_action_group.get_action("GoPostMenu") + if _page.posteriorPathRecord is None: + if _go_post.get_sensitive(): + _go_post.set_sensitive(False) + _go_Posterior.set_sensitive(False) + else: + if not _go_post.get_sensitive(): + _go_post.set_sensitive(True) + _go_Posterior.set_sensitive(True) + + def _switch_page(self, notebook, page, page_num,): + """_switch_page(notebook, page, page_num) + + Method connected to the "switch-page" signal of the notebook widget + + It changes the sensitive state of the navigation action group + """ + _page = self.__page_list[page_num] + if isinstance(_page, EmptyPage) and \ + self.__navigation_action_group.get_sensitive(): + self.__navigation_action_group.set_sensitive(False) + elif isinstance(_page, Page): + if not self.__navigation_action_group.get_sensitive(): + self.__navigation_action_group.set_sensitive(True) + self._checkButtonsSensitive(page_num) + _go_prev = self.__uimanager.get_widget("/ToolBar/GoPrevMenu") + _go_prev.set_menu(_page.back_menu) + _go_post = self.__uimanager.get_widget("/ToolBar/GoPostMenu") + _go_post.set_menu(_page.forward_menu) def _main(self): """main() @@ -214,31 +329,32 @@ self.__window.show() gtk.main() - def _addBudget(self, budget): - """_addBudget(budget) - - budget: "base.Budget" object - - Appends a budget in the "__budget_list" + def appendEmptyPage(self, emptyPage): + """appendEmptyPage(widget, label) + + Append a empty page to the notebook. """ - if not budget is None: - _budget = budget - if _budget in self.__budget_temp_list: - self.__budget_temp_list.remove(_budget) - self.__budget_list.append(_budget) - - def _appendPage(self): - """_appendPage() - - Creates a new page (instance of "Page class") from the last budget in - __budget_list, appends this page in the "__page_list" and shows the - page widget in the notebook widget. + self.__page_list.append(emptyPage) + self.__notebook.append_page(emptyPage.widget, emptyPage.title) + # TODO: reordenable and detachable Pages + #self.__notebook.set_tab_reorderable(emptyPage.widget, True) + #self.__notebook.set_tab_detachable(emptyPage.widget, True) + + def updatePage(self, empty_page, page): + """updatePage(page) + + Update emptyPage to Page. """ - _last_budget = self.__budget_list[-1] - _page = Page(self, _last_budget) - self.__notebook.append_page(_page.widget, _page.title) - self.__page_list.append(_page) - + _page_num = self.__notebook.page_num(empty_page.widget) + self.__page_list[_page_num] = page + if self.__notebook.get_current_page() == _page_num: + _go_prev = self.__uimanager.get_widget("/ToolBar/GoPrevMenu") + _go_prev.set_menu(page.back_menu) + _go_post = self.__uimanager.get_widget("/ToolBar/GoPostMenu") + _go_post.set_menu(page.forward_menu) + if not self.__navigation_action_group.get_sensitive(): + self.__navigation_action_group.set_sensitive(True) + self._checkButtonsSensitive(_page_num) def _menuitemImportFiebdc(self, widget): """_menuitemImportFiebdc(widget) @@ -249,7 +365,6 @@ Creates and shows a file selection window to open a budget file. """ _budget = base.Budget() - self.__budget_temp_list.append(_budget) _budget_file = fiebdc.Read() _read_method = _budget_file.readFile _filename = "file" @@ -264,10 +379,10 @@ widget: the widget where the event is emitted from Callback to open a price database file. - Creates and shows a file selection window to open a price database file. + Creates and shows a file selection window to open a price database + file. """ _budget = base.Budget() - self.__budget_temp_list.append(_budget) _budget_file = fiebdc.Read() _read_method = _budget_file.readFile _filename = "file" @@ -285,7 +400,6 @@ Creates and shows a file selection window to open a durus database """ _budget = None - self.__budget_temp_list.append(_budget) _budget_file = durusdatabase.Read() _read_method = _budget_file.readFile _filename = "file" @@ -305,25 +419,29 @@ if _page_num != -1: _page = self.__page_list[_page_num] if isinstance(_page, EmptyPage) and _page.filetype == "durus": - print _("Cancel reading Durus database has not been implemented.") + print _("Cancel reading Durus database has not been " + "implemented.") else: _page.close() - def removePage(self, page_num): - """removePage(page_num) - - page_num: The number Page to be removed + def closePage(self, page): + """closePage(page) + + page: EmptyPage or Page object Removes a page from notebook and page_list. - Removes the budget from the budget_list if necessary. + Hide navigation action group if necessary """ - _page = self.__page_list[page_num] - if isinstance(_page, Page): - #not loading budget - self.__budget_list.pop(page_num) - self.__page_list.pop(page_num) - _page.clear() - self.__notebook.remove_page(page_num) + if page in self.__page_list: + _page_num = self.__page_list.index(page) + self.__page_list.pop(_page_num) + page.clear() + self.__notebook.remove_page(_page_num) + if len(self.__page_list) == 0: + self.__navigation_action_group.set_sensitive(False) + else: + raise IndexError, _("The page is not in the page list") + def _menuitemGoToRoot(self, widget): """_menuitemGoToRoot(widget) @@ -353,29 +471,9 @@ if isinstance(_page, Page): #not loading budget _active_path = _page.activePathRecord - if len(_active_path) > 1 and _active_path[-1] > 0: - _budget = self.__budget_list[_page_num] - _up_path = _active_path[:-1] + (_active_path[-1] - 1,) - if _budget.hasPath(_up_path): - _page.propagateMessageFrom("change_active", (-1,), - _up_path) - - def _menuitemGoDown(self, widget): - """_menuitemGoToDown(widget) - - widget: the widget where the event is emitted from - - Callback to go to down record. - """ - _page_num = self.__notebook.get_current_page() - if _page_num != -1: - _page = self.__page_list[_page_num] - if isinstance(_page, Page): - #not loading budget - _active_path = _page.activePathRecord if len(_active_path) > 1: - _budget = self.__budget_list[_page_num] - _up_path = _active_path[:-1] + (_active_path[-1] + 1,) + _budget = _page.budget + _up_path = _active_path[:-1] if _budget.hasPath(_up_path): _page.propagateMessageFrom("change_active", (-1,), _up_path) @@ -394,7 +492,7 @@ #not loading budget _previous_path = _page.previousPathRecord if _previous_path is not None: - _budget = self.__budget_list[_page_num] + _budget = _page.budget if _budget.hasPath(_previous_path): _page.propagateMessageFrom("change_active", (-1,), _previous_path) @@ -413,7 +511,7 @@ #not loading budget _posterior_path = _page.posteriorPathRecord if _posterior_path is not None: - _budget = self.__budget_list[_page_num] + _budget = _page.budget if _budget.hasPath(_posterior_path): _page.propagateMessageFrom("change_active", (-1,), _posterior_path) @@ -445,34 +543,6 @@ """ gtk.main_quit() - def _getNotebook(self): - """_getNotebook() - - Return the notebook widget - """ - return self.__notebook - - def _getPageList(self): - """_getPageList() - - Return the page list - """ - return self.__page_list - - def _getBudgetList(self): - """_getBudgetList() - - Return the budget list - """ - return self.__budget_list - - notebook = property(_getNotebook, None, None, - "notebook object") - pageList = property(_getPageList, None, None, - "Page list") - budgetList = property(_getBudgetList, None, None, - "Budget list") - class EmptyPage(object): """gui.EmptyPage: @@ -555,8 +625,8 @@ self.__animationThobber = gtk.gdk.PixbufAnimation( globalVars.getAppPath("THROBBER-GIF")) self.__quietThobber = self.__throbber.get_pixbuf() - self.__budget_icon = gtk.gdk.pixbuf_new_from_file_at_size( - globalVars.getAppPath("BUDGET-ICON"), 16, 16) + self.__budget_icon = gtk.gdk.pixbuf_new_from_file( + globalVars.getAppPath("BUDGET-ICON")) _filename = os.path.basename(filename) _rootfilename = os.path.splitext(_filename)[0] if not _rootfilename == "": @@ -707,9 +777,7 @@ for _child in _children: self.__widget.remove(_child) self.__widget.pack_start(_page.widget, True, True, 0) - _noteBook = self.__mainWindow.notebook - _pageIndex = _noteBook.page_num(self.__widget) - self.__mainWindow.pageList[_pageIndex] = _page + self.__mainWindow.updatePage(self, _page) def threadCanceled(self): """threadCanceled() @@ -717,12 +785,10 @@ Sets the __children atribute to None This causes that the timeouts is ended. This method is called from thread when is canceled - TODO: it must called threadFinished or somethig """ self.__children = None self.stopLoading() - _page_num = self.__mainWindow.notebook.page_num(self.widget) - self.__mainWindow.removePage(_page_num) + self.__mainWindow.closePage(self) def close(self): """close() @@ -798,6 +864,8 @@ activePathRecord: Read. The active path record previousPathRecord: Read. The previous path record posteriorPathRecord Read. The posterior path record + back_menu: back menu to show in menutoolbutton + forward_menu: forward menu to show in menutoolbutton Methods: propagateMessageFrom sendMessageTo @@ -816,6 +884,16 @@ mainWindow: MainWindow object budget: "base.Budget" object path_record: the active path record + + self.__mainWindow: MainWindow object + self.__widget: a gtk.VBox + self.__panes_list: + self.__main_item: + self.__active_path_record: + self.__history_back: + self.__history_forward: + self.__back_menu: a gtk.Menu + self.__forward_menu: a gtk.Menu """ #TODO: __panes_list should come from config file... self.__mainWindow = mainWindow @@ -826,9 +904,25 @@ self.__active_path_record = () self.__history_back = [] self.__history_forward = [] + self.__back_menu = gtk.Menu() + self.__back_menu.show() + self.__forward_menu = gtk.Menu() + self.__forward_menu.show() self.budget = budget self._setActivePathRecord(path_record) self.__widget.show() + self.__budget_icon = gtk.gdk.pixbuf_new_from_file( + globalVars.getAppPath("BUDGET-ICON")) + self.__chapter_icon = gtk.gdk.pixbuf_new_from_file( + globalVars.getAppPath("CHAPTER-ICON")) + self.__unit_icon = gtk.gdk.pixbuf_new_from_file( + globalVars.getAppPath("UNIT-ICON") ) + self.__material_icon = gtk.gdk.pixbuf_new_from_file( + globalVars.getAppPath("MATERIAL-ICON") ) + self.__machinery_icon = gtk.gdk.pixbuf_new_from_file( + globalVars.getAppPath("MACHINERY-ICON")) + self.__labourforce_icon = gtk.gdk.pixbuf_new_from_file( + globalVars.getAppPath("LABOURFORCE-ICON")) def propagateMessageFrom(self, message, pane_path, arg=None): """propagateMessageFrom(message, pane_path, arg=None) @@ -848,6 +942,7 @@ if message == "change_active" and _budget.hasPath(arg): self.sendMessageTo(self.__main_item, message, pane_path, arg) self._setActivePathRecord(arg) + self.__mainWindow.changeActiveSignal() elif message == "autoclose": self._closeItem(pane_path) elif message == "split h": @@ -872,12 +967,7 @@ Close Page """ - _page_list = self.__mainWindow.pageList - if self in _page_list: - _page_num = _page_list.index(self) - self.__mainWindow.removePage(_page_num) - else: - raise IndexError, _("The page is not in the page list") + self.__mainWindow.closePage(self) def clear(self): """clear() @@ -885,7 +975,6 @@ Clear atributes """ self.propagateMessageFrom("clear", (0,)) - del self.__budget del self.__panes_list del self.__widget @@ -1036,26 +1125,160 @@ def _appendHistory(self, path): """_appendHistory(path)) - path: the old active path record - - Sets the old active path record + path: the new active path record + + Append the new active path record to history lists and update menus + """ + if len(self.__history_back) > 1 and path in self.__history_back[:-1]: + # the new active record is in back history list + # then append forward history and pop back history + _items_num = len(self.__history_back) - \ + self.__history_back.index(path) -1 + for _item in range(_items_num): + _record_path = self.__history_back.pop() + _first_menuitem = self.__back_menu.get_children()[0] + self.__back_menu.remove(_first_menuitem) + self.__history_forward.append(_record_path) + _menuitem = self._menuItemFactory(_record_path) + _menuitem.connect_object("activate", self._menuHistoryForward, + _record_path, _menuitem) + self.__forward_menu.prepend(_menuitem) + while len(self.__history_forward) > 100: + # list too long + self.__history_forward.pop(0) + _last_menuitem = self.__forward_menu.get_children()[-1] + self.__forward_menu.remove(_last_menuitem) + else: + # the new active record not is in back history list + if len(self.__history_forward) > 1 and \ + path in self.__history_forward: + # the new active record is in history forward list + # then append back history and pop forward history + _items_num = len(self.__history_forward) - \ + self.__history_forward.index(path) + for _item in range(_items_num): + _record_path = self.__history_forward.pop() + _first_menuitem = self.__forward_menu.get_children()[0] + self.__forward_menu.remove(_first_menuitem) + self.__history_back.append(_record_path) + if len(self.__history_back) > 1: + _menuitem = self._menuItemFactory( + self.__history_back[-2]) + _menuitem.connect_object("activate", + self._menuHistoryBack, self.__history_back[-2], + _menuitem) + self.__back_menu.prepend(_menuitem) + else: + # the new active record not is in history forward list + # then append back history and clear forward history + self.__history_forward[:] = [] + for _child in self.__forward_menu.get_children(): + self.__forward_menu.remove(_child) + self.__history_back.append(path) + if len(self.__history_back) > 1: + _menuitem = self._menuItemFactory(self.__history_back[-2]) + _menuitem.connect_object("activate", self._menuHistoryBack, + self.__history_back[-2], _menuitem) + self.__back_menu.prepend(_menuitem) + while len(self.__history_back) > 100: + # list too long + self.__history_back.pop(0) + _last_menuitem = self.__back_menu.get_children()[-1] + self.__back_menu.remove(_last_menuitem) + self.__mainWindow.changeHistorySignal() + + def _getImage(self, record): + """_getImage(record) + + record: record object + + Returns an image depending on the type of record """ - if len(self.__history_back) > 1 and self.__history_back[-2] == path: - # append forward history and pop back history - _path = self.__history_back.pop() - self.__history_forward.append(_path) - if len(self.__history_forward) > 1000: - self.__history_forward.pop(0) + _hierarchy = record.recordType.hierarchy + _type = record.recordType.type + _subtype = record.recordType.subtype + if _hierarchy == 0: + _icon = self.__budget_icon + elif _hierarchy == 1: + _icon = self.__chapter_icon else: - # append back history and pop or delete forward history - if len(self.__history_forward) > 1 and \ - self.__history_forward[-1] == path: - self.__history_forward.pop() + if _type == 0: + _icon = self.__unit_icon + elif _type == 1: + _icon = self.__labourforce_icon + elif _type == 2: + _icon = self.__machinery_icon else: - self.__history_forward[:] = [] - self.__history_back.append(path) - if len(self.__history_back) > 1000: - self.__history_back.pop(0) + _icon = self.__material_icon + _image = gtk.Image() + _image.set_from_pixbuf(_icon) + return _image + + def _menuFactory(self): + """_menuFactory() + + record: record object + + Creates menus for history back an history forward tool buttons + """ + + # Back Menu + # clear menu + for _child in self.__back_menu.get_children(): + self.__back_menu.remove(_child) + # pupulate menu + if len(self.__history_back) > 1: + for _record_path in self.__history_back[:-1]: + _menuitem = self._menuItemFactory(_record_path) + _menuitem.connect_object("activate", self._menuHistoryBack, + _record_path, _menuitem) + self.__back_menu.prepend(_menuitem) + # Forward Menu + # clear menu + for _child in self.__forward_menu.get_children(): + self.__forward_menu.remove(_child) + # pupulate menu + if len(self.__history_forward) > 0: + for _record_path in self.__history_forward[:]: + _menuitem = self._menuItemFactory(_record_path) + _menuitem.connect_object("activate", self._menuHistoryForward, + _record_path, _menuitem) + self.__forward_menu.prepend(_menuitem) + + def _menuItemFactory(self, record_path): + """_menuItemFactory(record_path): + + record_path: record path + + Creates and return a menuItem to go to the record + """ + _code = self.budget.getCode(record_path) + _record = self.budget.getRecord(_code) + _summary = _record.summary + _text = _code + " " + _summary + if len(_text) > 30: + _text = _text[:27] + "..." + _image = self._getImage(_record) + _menuitem = gtk.ImageMenuItem(_text) + _menuitem.set_image(_image) + _menuitem.show() + return _menuitem + + def _menuHistoryBack(self, record_path, menu_item): + """_menuHistoryBack(record_path, menu_item) + + Go to the record selected in History Back menu + """ + if self.budget.hasPath(record_path): + self.propagateMessageFrom("change_active", (-1,), record_path) + + def _menuHistoryForward(self, record_path, menu_item): + """_menuHistoryForward(record_path, menu_item) + + Go to the record selected in History Forward menu + """ + if self.budget.hasPath(record_path): + self.propagateMessageFrom("change_active", (-1,), record_path) def _getActivePathRecord(self): """_getActivePathRecord() @@ -1084,6 +1307,20 @@ else: return None + def _getBackMenu(self): + """_getBackMenu() + + Return the Back Menu + """ + return self.__back_menu + + def _getForwardMenu(self): + """_getForwardMenu() + + Return the Forward Menu + """ + return self.__forward_menu + def _getTitle(self): """_getTitle() @@ -1149,7 +1386,10 @@ "Previous Active Path Record") posteriorPathRecord = property(_getPosteriorPathRecord, None, None, "Posterior Active Path Record") - + back_menu = property(_getBackMenu, None, None, + "Back Menu") + forward_menu = property(_getForwardMenu, None, None, + "Forward Menu") class View(object): """gui.View: @@ -4599,4 +4839,4 @@ values = property(None, _setValues, None, "values") options = property(None, _setOptions, None, - "options") \ No newline at end of file + "options") diff -r d2cbc0278b30 -r fe9c55f86698 Gtk/importFiebdc.py --- a/Gtk/importFiebdc.py Fri Nov 19 19:17:11 2010 +0100 +++ b/Gtk/importFiebdc.py Wed Nov 24 22:56:02 2010 +0100 @@ -111,9 +111,7 @@ _emptyPage = gui.EmptyPage(self.__mainWindow, self.__readFileMethod, self.__budget, self.__filename, self.__cancelMethod, self.__filetype) - self.__mainWindow.notebook.append_page(_emptyPage.widget, - _emptyPage.title) - self.__mainWindow.pageList.append(_emptyPage) + self.__mainWindow.appendEmptyPage(_emptyPage) _emptyPage.run() def _openFile(self, filename): @@ -424,7 +422,6 @@ self.__page.threadCanceled() else: _mainWindow = self.__mainWindow - _mainWindow._addBudget(_budget) self.__page.threadFinishedSignal(_budget) if self.__filetype == "database": self.saveDurusDatabase() diff -r d2cbc0278b30 -r fe9c55f86698 images/budget.svg --- a/images/budget.svg Fri Nov 19 19:17:11 2010 +0100 +++ b/images/budget.svg Wed Nov 24 22:56:02 2010 +0100 @@ -10,12 +10,12 @@ xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - sodipodi:docname="x-office-spreadsheet.svg" + sodipodi:docname="budget.svg" inkscape:version="0.47 r22583" sodipodi:version="0.32" id="svg13684" - height="48.000000px" - width="48.000000px" + height="16" + width="16" inkscape:output_extension="org.inkscape.output.svg.inkscape" version="1.1"> + x1="-20.75" + y1="29" + x2="-19.5" + y2="18.75" /> @@ -112,10 +112,10 @@ xlink:href="#linearGradient6687" id="linearGradient6744" gradientUnits="userSpaceOnUse" - x1="-20.750000" - y1="29.000000" - x2="-19.500000" - y2="18.750000" /> + x1="-20.75" + y1="29" + x2="-19.5" + y2="18.75" /> + r="86.70845" /> @@ -310,9 +310,9 @@ offset="1" /> @@ -326,9 +326,9 @@ offset="1" /> @@ -342,9 +342,9 @@ offset="1" /> @@ -358,7 +358,7 @@ offset="1" /> + y2="98.883202" /> + y2="95.899902" /> + y2="94.800003" /> + y2="92.612297" /> + y2="99.298401" /> + style="display:inline" + transform="translate(0,-32)"> + d="m -1559.2523,-150.68038 c 0,0 0,478.33079 0,478.33079 -142.8742,0.90045 -345.4002,-107.16966 -345.4002,-239.196175 0,-132.026537 159.4368,-239.134595 345.4002,-239.134615 z" + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /> + width="12.383041" + height="14.506358" + x="1.7065634" + y="32.25349" + ry="0.4065752" + rx="0.40657523" /> + width="11.675209" + height="13.798324" + x="2.0609689" + y="32.60751" + ry="0.052738819" + rx="0.052738789" /> + d="m 12.675026,34.730661 -9.5538797,0" + style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383651px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" /> + d="m 12.675146,36.852898 -9.5541249,0" + style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" /> + d="m 12.675146,38.975918 -9.5541249,0" + style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" /> + d="m 12.675146,41.098938 -9.5541249,0" + style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" /> + d="m 12.675351,43.221956 -9.5541198,0" + style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" /> + d="m 12.675146,45.344975 -9.5541249,0" + style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" /> + d="m 12.678999,35.791388 -9.5577051,0" + style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383651px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" /> + d="m 12.675146,37.914408 -9.5541249,0" + style="fill:none;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" /> + d="m 12.675146,40.037428 -9.5541249,0" + style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" /> + d="m 12.675146,42.160447 -9.5541249,0" + style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" /> + d="m 12.675146,44.283465 -9.5541249,0" + style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383636px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" /> + d="m 12.674959,33.315315 -9.5538562,0" + style="fill:#000000;fill-opacity:0.15789472;fill-rule:evenodd;stroke:#000000;stroke-width:0.35383645px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.19298245" /> + x="8.5695915" + y="47.560902">€ + style="display:inline" + transform="translate(0,-32)" /> diff -r d2cbc0278b30 -r fe9c55f86698 mo/es/LC_MESSAGES/pyArq-Presupuestos.mo Binary file mo/es/LC_MESSAGES/pyArq-Presupuestos.mo has changed diff -r d2cbc0278b30 -r fe9c55f86698 mo/pyArq-Presupuestos.es.po --- a/mo/pyArq-Presupuestos.es.po Fri Nov 19 19:17:11 2010 +0100 +++ b/mo/pyArq-Presupuestos.es.po Wed Nov 24 22:56:02 2010 +0100 @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: pyArq-Presupuestos 0.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-11 23:10+0100\n" +"POT-Creation-Date: 2010-11-24 22:27+0100\n" "PO-Revision-Date: 2010-01-11 12:24+0100\n" "Last-Translator: Miguel Ángel Bárcena Rodríguez \n" @@ -691,228 +691,228 @@ msgid "End Test" msgstr "Comprobación finalizada" -#: ../Gtk/gui.py:69 +#: ../Gtk/gui.py:68 msgid "The icon file does not exist. '$1'" msgstr "El archivo de icono no existe. «$1»" -#: ../Gtk/gui.py:75 +#: ../Gtk/gui.py:74 msgid "pyArq-Presupuestos running on $1" msgstr "pyArq-Presupuestos ejecutandose en $1" -#: ../Gtk/gui.py:167 +#: ../Gtk/gui.py:168 msgid "_File" msgstr "_Archivo" -#: ../Gtk/gui.py:168 +#: ../Gtk/gui.py:169 msgid "_Import Fiebdc" msgstr "_Importar Fiebdc" -#: ../Gtk/gui.py:169 +#: ../Gtk/gui.py:170 msgid "Import FIEBDC" msgstr "Importar FIEBDC" -#: ../Gtk/gui.py:170 +#: ../Gtk/gui.py:171 msgid "_Close" msgstr "_Cerrar" -#: ../Gtk/gui.py:170 +#: ../Gtk/gui.py:171 msgid "Close" msgstr "Cerrar" -#: ../Gtk/gui.py:172 +#: ../Gtk/gui.py:173 msgid "_View" msgstr "_Ver" -#: ../Gtk/gui.py:173 +#: ../Gtk/gui.py:174 ../Gtk/gui.py:184 msgid "_Go" msgstr "_Ir" -#: ../Gtk/gui.py:174 -msgid "_Up Record" -msgstr "Registro _Superior" +#: ../Gtk/gui.py:175 +msgid "_Test" +msgstr "_Pruebas" -#: ../Gtk/gui.py:175 -msgid "Go up record" -msgstr "Ir al registro superior" - -#: ../Gtk/gui.py:176 -msgid "_Down Record" -msgstr "Registro _Inferior" +#: ../Gtk/gui.py:177 +msgid "Import Fiebdc _price database" +msgstr "Importar base de _precios Fiebdc" #: ../Gtk/gui.py:177 -msgid "Go down record" -msgstr "Ir al registro inferior" - -#: ../Gtk/gui.py:178 -msgid "_Previous Record" -msgstr "Registro _Previo" +msgid "Import database" +msgstr "Importar base de datos" #: ../Gtk/gui.py:179 -msgid "Go Previous record" -msgstr "Ir al registro previo" +msgid "_Open price database" +msgstr "_Abrir base de precios" #: ../Gtk/gui.py:180 -msgid "_Posterior Record" -msgstr "Registro P_osterior" +msgid "Open Database" +msgstr "Abrir base de datos" + +#: ../Gtk/gui.py:185 +msgid "_Back" +msgstr "A_tras" + +#: ../Gtk/gui.py:186 ../Gtk/gui.py:197 +msgid "Go to the previous visited item" +msgstr "Ir al concepto anterior" -#: ../Gtk/gui.py:181 -msgid "Go posterior record" -msgstr "Ir al registro posterior" +#: ../Gtk/gui.py:188 +msgid "_Forward" +msgstr "A_delante" + +#: ../Gtk/gui.py:189 ../Gtk/gui.py:201 +msgid "Go to the next visited item" +msgstr "Ir al concepto siguiente" -#: ../Gtk/gui.py:182 +#: ../Gtk/gui.py:190 +msgid "_Up Item" +msgstr "Concepto _Superior" + +#: ../Gtk/gui.py:191 +msgid "Go up item" +msgstr "Ir al concepto superior" + +#: ../Gtk/gui.py:192 msgid "_Root" msgstr "_Raiz" -#: ../Gtk/gui.py:183 +#: ../Gtk/gui.py:193 msgid "Go to root" msgstr "Ir a la raiz" -#: ../Gtk/gui.py:184 -msgid "_Test" -msgstr "_Pruebas" - -#: ../Gtk/gui.py:186 -msgid "Import Fiebdc _price database" -msgstr "Importar base de _precios Fiebdc" +#: ../Gtk/gui.py:220 +msgid "Back history" +msgstr "Retroceder histórico" -#: ../Gtk/gui.py:186 -msgid "Import database" -msgstr "Importar base de datos" +#: ../Gtk/gui.py:225 +msgid "Forward history" +msgstr "Adelantar histórico" -#: ../Gtk/gui.py:188 -msgid "_Open price database" -msgstr "_Abrir base de precios" - -#: ../Gtk/gui.py:189 -msgid "Open Database" -msgstr "Abrir base de datos" - -#: ../Gtk/gui.py:308 +#: ../Gtk/gui.py:422 msgid "Cancel reading Durus database has not been implemented." msgstr "" "La interrupción de la lectura de bases de datos Durus no ha sido implementada" -#: ../Gtk/gui.py:589 ../Gtk/importFiebdc.py:222 -msgid "Time: 0s" -msgstr "Tiempo: 0s" - -#: ../Gtk/gui.py:656 ../Gtk/importFiebdc.py:301 -msgid "Time: $1" -msgstr "Tiempo: $1" - -#: ../Gtk/gui.py:852 +#: ../Gtk/gui.py:443 msgid "The page is not in the page list" msgstr "La pestaña no está en la lista de pestañas" -#: ../Gtk/gui.py:958 +#: ../Gtk/gui.py:672 ../Gtk/importFiebdc.py:220 +msgid "Time: 0s" +msgstr "Tiempo: 0s" + +#: ../Gtk/gui.py:749 ../Gtk/importFiebdc.py:299 +msgid "Time: $1" +msgstr "Tiempo: $1" + +#: ../Gtk/gui.py:1075 msgid "The value must be a list" msgstr "El valor debe ser una lista" -#: ../Gtk/gui.py:961 +#: ../Gtk/gui.py:1078 msgid "Incorrect len" msgstr "Longuitud incorrecta" -#: ../Gtk/gui.py:989 +#: ../Gtk/gui.py:1106 msgid "Incorrect item $1" msgstr "Elemento incorrecto $1" -#: ../Gtk/gui.py:1005 +#: ../Gtk/gui.py:1122 msgid "The budget does not have the path record: $1" msgstr "El presupuesto no tiene el registro con camino: $1" -#: ../Gtk/gui.py:1196 +#: ../Gtk/gui.py:1478 msgid "Decomposition" msgstr "Descomposición" -#: ../Gtk/gui.py:1197 ../Gtk/gui.py:2213 +#: ../Gtk/gui.py:1479 ../Gtk/gui.py:2485 msgid "Description" msgstr "Descripción" -#: ../Gtk/gui.py:1198 ../Gtk/gui.py:2215 +#: ../Gtk/gui.py:1480 ../Gtk/gui.py:2487 msgid "Measure" msgstr "Medición" -#: ../Gtk/gui.py:1199 +#: ../Gtk/gui.py:1481 msgid "Sheet of Conditions" msgstr "Pliego de condicones" -#: ../Gtk/gui.py:1200 +#: ../Gtk/gui.py:1482 msgid "Files" msgstr "Archivos" -#: ../Gtk/gui.py:1201 +#: ../Gtk/gui.py:1483 msgid "Companies" msgstr "Entidades" -#: ../Gtk/gui.py:1385 +#: ../Gtk/gui.py:1660 msgid "Split View Left/Right" msgstr "Partir vista Izquierda/Derecha" -#: ../Gtk/gui.py:1389 +#: ../Gtk/gui.py:1664 msgid "Split View Top/Bottom" msgstr "Partir vista Arriba/Abajo" -#: ../Gtk/gui.py:1393 +#: ../Gtk/gui.py:1668 msgid "Close view" msgstr "Cerrar vista" -#: ../Gtk/gui.py:1562 +#: ../Gtk/gui.py:1836 msgid "The item must be a widget object." msgstr "El elemento debe ser un objeto «widget»." -#: ../Gtk/gui.py:1568 +#: ../Gtk/gui.py:1842 msgid "Invalid orientation." msgstr "Orientación no válida" -#: ../Gtk/gui.py:1943 ../Gtk/gui.py:2577 ../Gtk/gui.py:3987 +#: ../Gtk/gui.py:2214 ../Gtk/gui.py:2841 ../Gtk/gui.py:4171 msgid "Argument must be a Budget object" msgstr "El argumento debe ser un objeto «Budget»" -#: ../Gtk/gui.py:1952 -msgid "DecompositionList.__init__: Record path can not be None" -msgstr "«DecompositionList.__init__:» La ruta del registro no puede ser «None»" +#: ../Gtk/gui.py:2223 +msgid "Record path can not be None" +msgstr "La ruta del registrio no puede ser None" -#: ../Gtk/gui.py:1983 +#: ../Gtk/gui.py:2254 msgid "a" msgstr "a" -#: ../Gtk/gui.py:2210 ../Gtk/gui.py:4047 +#: ../Gtk/gui.py:2482 ../Gtk/gui.py:4234 msgid "Code" msgstr "Código" -#: ../Gtk/gui.py:2211 +#: ../Gtk/gui.py:2483 msgid "Unit" msgstr "Unidad" -#: ../Gtk/gui.py:2217 +#: ../Gtk/gui.py:2489 msgid "Price" msgstr "Precio" -#: ../Gtk/gui.py:2219 +#: ../Gtk/gui.py:2491 msgid "Amount" msgstr "Importe" -#: ../Gtk/gui.py:2231 ../Gtk/gui.py:2709 +#: ../Gtk/gui.py:2502 ../Gtk/gui.py:2981 msgid "Invalid path" msgstr "Ruta no válida" -#: ../Gtk/gui.py:2582 +#: ../Gtk/gui.py:2846 msgid "Record path must be a tuple" msgstr "La posición del registro debe ser una tupla" -#: ../Gtk/gui.py:2726 +#: ../Gtk/gui.py:2990 msgid "measure must be a Measure object. Type: $1" msgstr "«measure» debe ser un objeto «Measure». Tipo: $1" -#: ../Gtk/gui.py:2737 ../Gtk/gui.py:4062 ../Gtk/gui.py:4389 +#: ../Gtk/gui.py:3002 ../Gtk/gui.py:4249 ../Gtk/gui.py:4562 msgid "Type" msgstr "Tipo" -#: ../Gtk/gui.py:2738 +#: ../Gtk/gui.py:3003 msgid "Comment" msgstr "Comentario" -#: ../Gtk/gui.py:2739 +#: ../Gtk/gui.py:3004 msgid "" "N\n" "(a)" @@ -920,7 +920,7 @@ "N\n" "(a)" -#: ../Gtk/gui.py:2740 +#: ../Gtk/gui.py:3005 msgid "" "Length\n" "(b)" @@ -928,7 +928,7 @@ "Longitud\n" "(b)" -#: ../Gtk/gui.py:2741 +#: ../Gtk/gui.py:3006 msgid "" "Width\n" "(c)" @@ -936,7 +936,7 @@ "Anchura\n" "(c)" -#: ../Gtk/gui.py:2742 +#: ../Gtk/gui.py:3007 msgid "" "Height\n" "(d)" @@ -944,11 +944,11 @@ "Altura\n" "(d)" -#: ../Gtk/gui.py:2743 +#: ../Gtk/gui.py:3008 msgid "Formula" msgstr "Fórmula" -#: ../Gtk/gui.py:2744 +#: ../Gtk/gui.py:3009 #, python-format msgid "" "Parcial\n" @@ -957,79 +957,75 @@ "Parcial\n" "[%s]" -#: ../Gtk/gui.py:2745 +#: ../Gtk/gui.py:3010 msgid "Subtotal" msgstr "Subtotal" -#: ../Gtk/gui.py:3153 ../Gtk/gui.py:3175 +#: ../Gtk/gui.py:3418 ../Gtk/gui.py:3440 msgid "Description text of the record $1" msgstr "Texto descriptivo del registro $1" -#: ../Gtk/gui.py:3332 +#: ../Gtk/gui.py:3591 msgid "Sheet of Conditions of the record $1" msgstr "Pliego de condiciones del registro $1" -#: ../Gtk/gui.py:3352 +#: ../Gtk/gui.py:3609 msgid "Field" msgstr "Ámbito" -#: ../Gtk/gui.py:3374 +#: ../Gtk/gui.py:3630 msgid "Section" msgstr "Sección" -#: ../Gtk/gui.py:3527 +#: ../Gtk/gui.py:3778 msgid "Sheet2 of Conditions of the record $1" msgstr "Pliego2 de condiciones del registro $1" -#: ../Gtk/gui.py:3903 -msgid "$1 text" -msgstr "Texto de $1" - -#: ../Gtk/gui.py:4048 +#: ../Gtk/gui.py:4235 msgid "Code that define the company" msgstr "Código que define la entidad" -#: ../Gtk/gui.py:4049 +#: ../Gtk/gui.py:4236 msgid "Summary" msgstr "Resumen" -#: ../Gtk/gui.py:4050 +#: ../Gtk/gui.py:4237 msgid "Summary of the company name" msgstr "Resumen del nombre de la entidad" -#: ../Gtk/gui.py:4051 ../Gtk/gui.py:4067 +#: ../Gtk/gui.py:4238 ../Gtk/gui.py:4254 msgid "Name" msgstr "Nombre" -#: ../Gtk/gui.py:4052 +#: ../Gtk/gui.py:4239 msgid "Complete name" msgstr "Nombre completo" -#: ../Gtk/gui.py:4053 +#: ../Gtk/gui.py:4240 msgid "CIF" msgstr "CIF" -#: ../Gtk/gui.py:4054 +#: ../Gtk/gui.py:4241 msgid "Fiscal identifier number" msgstr "Número de identificación fiscal" -#: ../Gtk/gui.py:4055 +#: ../Gtk/gui.py:4242 msgid "Web" msgstr "Web" -#: ../Gtk/gui.py:4056 +#: ../Gtk/gui.py:4243 msgid "Company web page" msgstr "Página web de la entidad" -#: ../Gtk/gui.py:4057 +#: ../Gtk/gui.py:4244 msgid "Email" msgstr "Email" -#: ../Gtk/gui.py:4058 +#: ../Gtk/gui.py:4245 msgid "Company email" msgstr "Correo electrónico de la entidad" -#: ../Gtk/gui.py:4063 +#: ../Gtk/gui.py:4250 msgid "" "Type of Office:\n" " C: Central office\n" @@ -1041,131 +1037,131 @@ " D: Delegación\n" " R: Representante" -#: ../Gtk/gui.py:4068 +#: ../Gtk/gui.py:4255 msgid "Office name" msgstr "Nombre de la oficina" -#: ../Gtk/gui.py:4069 +#: ../Gtk/gui.py:4256 msgid "Address" msgstr "Dirección" -#: ../Gtk/gui.py:4070 +#: ../Gtk/gui.py:4257 msgid "Postal code" msgstr "Código postal" -#: ../Gtk/gui.py:4071 +#: ../Gtk/gui.py:4258 msgid "Town" msgstr "Ciudad" -#: ../Gtk/gui.py:4072 +#: ../Gtk/gui.py:4259 msgid "Province" msgstr "Provincia" -#: ../Gtk/gui.py:4073 +#: ../Gtk/gui.py:4260 msgid "Country" msgstr "Ciudad" -#: ../Gtk/gui.py:4074 +#: ../Gtk/gui.py:4261 msgid "Phone" msgstr "Teléfono" -#: ../Gtk/gui.py:4075 +#: ../Gtk/gui.py:4262 msgid "Phone numbers of the office" msgstr "Teléfono de la officina" -#: ../Gtk/gui.py:4076 +#: ../Gtk/gui.py:4263 msgid "Fax" msgstr "Fax" -#: ../Gtk/gui.py:4077 +#: ../Gtk/gui.py:4264 msgid "Fax numbers of the office" msgstr "Fax de la oficina" -#: ../Gtk/gui.py:4078 +#: ../Gtk/gui.py:4265 msgid "Contact person" msgstr "Persona de contacto" -#: ../Gtk/gui.py:4079 +#: ../Gtk/gui.py:4266 msgid "Contact persons in the office" msgstr "Persona de contacto en la oficina" -#: ../Gtk/gui.py:4083 +#: ../Gtk/gui.py:4270 msgid "Unknow Option Type" msgstr "Tipo de opcion desconocida" -#: ../Gtk/gui.py:4327 +#: ../Gtk/gui.py:4500 msgid "Boolean" msgstr "Booleano" -#: ../Gtk/gui.py:4328 +#: ../Gtk/gui.py:4501 msgid "Integer" msgstr "Entero" -#: ../Gtk/gui.py:4329 +#: ../Gtk/gui.py:4502 msgid "Text" msgstr "Texto" -#: ../Gtk/gui.py:4330 +#: ../Gtk/gui.py:4503 msgid "Color" msgstr "Color" -#: ../Gtk/gui.py:4331 +#: ../Gtk/gui.py:4504 msgid "List" msgstr "Lista" -#: ../Gtk/gui.py:4363 +#: ../Gtk/gui.py:4536 msgid "Option name" msgstr "Nombre de Opción" -#: ../Gtk/gui.py:4376 +#: ../Gtk/gui.py:4549 msgid "Value" msgstr "Valor" -#: ../Gtk/gui.py:4414 +#: ../Gtk/gui.py:4588 msgid "Description:" msgstr "Descripción:" -#: ../Gtk/gui.py:4576 +#: ../Gtk/gui.py:4749 msgid "Option values must be strings" msgstr "Los valores de la opción deben ser cadenas" -#: ../Gtk/gui.py:4578 +#: ../Gtk/gui.py:4751 msgid "Option must be a tuple with 4 items" msgstr "La opcion debe ser una tupla de 4 elementos" -#: ../Gtk/gui.py:4580 +#: ../Gtk/gui.py:4753 msgid "Option list must be a list" msgstr "La lista de opciones debe ser una lista lista" -#: ../Gtk/gui.py:4600 +#: ../Gtk/gui.py:4773 msgid "Icorrect type, must be boolean" msgstr "Tipo erroneo, debe ser booleano" -#: ../Gtk/gui.py:4605 +#: ../Gtk/gui.py:4778 msgid "Icorrect type, must be integer" msgstr "Tipo erroneo, debe ser un número entero" -#: ../Gtk/gui.py:4618 +#: ../Gtk/gui.py:4791 msgid "Icorrect type, must be string" msgstr "Tipo erroneo, debe ser una cadena de texto" -#: ../Gtk/gui.py:4631 +#: ../Gtk/gui.py:4804 msgid "Icorrect type, must be list" msgstr "Tipo erroneo, debe ser una lista" -#: ../Gtk/gui.py:4637 +#: ../Gtk/gui.py:4810 msgid "Icorrect type, must be a parseable color" msgstr "Tipo erroneo, debe ser un color parseable" -#: ../Gtk/gui.py:4645 +#: ../Gtk/gui.py:4818 msgid "Type must be boolean, integer, string or color" msgstr "El tipo debe ser booleano, entero, cadena de texto o color" -#: ../Gtk/gui.py:4648 +#: ../Gtk/gui.py:4821 msgid "Value must be in the option dict" msgstr "El valor debe estar en el diccionario de opciones" -#: ../Gtk/gui.py:4650 +#: ../Gtk/gui.py:4823 msgid "Values must be a dict" msgstr "El valor debe ser un dicionario" @@ -1173,26 +1169,26 @@ msgid "Open File" msgstr "Abrir archivo" -#: ../Gtk/importFiebdc.py:137 +#: ../Gtk/importFiebdc.py:135 msgid "The file must have 'bc3' extension" msgstr "El archivo debe tener extensión «bc3»" -#: ../Gtk/importFiebdc.py:139 +#: ../Gtk/importFiebdc.py:137 msgid "The file must have 'durus' extension" msgstr "El nombre del archivo debe tener extensión «durus»" -#: ../Gtk/importFiebdc.py:210 +#: ../Gtk/importFiebdc.py:208 msgid "Loading file ..." msgstr "Cargando archivo ..." -#: ../Gtk/importFiebdc.py:234 +#: ../Gtk/importFiebdc.py:232 msgid "Cancel" msgstr "Cancelar" -#: ../Gtk/importFiebdc.py:439 +#: ../Gtk/importFiebdc.py:436 msgid "Saving file: $1" msgstr "Guardando archivo: $1" -#: ../Gtk/importFiebdc.py:444 +#: ../Gtk/importFiebdc.py:441 msgid "Saving time: $1 seconds" msgstr "Tiempo de guardado: $1 segundos" diff -r d2cbc0278b30 -r fe9c55f86698 mo/pyArq-Presupuestos.pot --- a/mo/pyArq-Presupuestos.pot Fri Nov 19 19:17:11 2010 +0100 +++ b/mo/pyArq-Presupuestos.pot Wed Nov 24 22:56:02 2010 +0100 @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-11 23:10+0100\n" +"POT-Creation-Date: 2010-11-24 22:27+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -655,334 +655,330 @@ msgid "End Test" msgstr "" -#: ../Gtk/gui.py:69 +#: ../Gtk/gui.py:68 msgid "The icon file does not exist. '$1'" msgstr "" -#: ../Gtk/gui.py:75 +#: ../Gtk/gui.py:74 msgid "pyArq-Presupuestos running on $1" msgstr "" -#: ../Gtk/gui.py:167 +#: ../Gtk/gui.py:168 msgid "_File" msgstr "" -#: ../Gtk/gui.py:168 +#: ../Gtk/gui.py:169 msgid "_Import Fiebdc" msgstr "" -#: ../Gtk/gui.py:169 -msgid "Import FIEBDC" -msgstr "" - #: ../Gtk/gui.py:170 +msgid "Import FIEBDC" +msgstr "" + +#: ../Gtk/gui.py:171 msgid "_Close" msgstr "" -#: ../Gtk/gui.py:170 +#: ../Gtk/gui.py:171 msgid "Close" msgstr "" -#: ../Gtk/gui.py:172 -msgid "_View" -msgstr "" - #: ../Gtk/gui.py:173 +msgid "_View" +msgstr "" + +#: ../Gtk/gui.py:174 ../Gtk/gui.py:184 msgid "_Go" msgstr "" -#: ../Gtk/gui.py:174 -msgid "_Up Record" +#: ../Gtk/gui.py:175 +msgid "_Test" msgstr "" -#: ../Gtk/gui.py:175 -msgid "Go up record" -msgstr "" - -#: ../Gtk/gui.py:176 -msgid "_Down Record" +#: ../Gtk/gui.py:177 +msgid "Import Fiebdc _price database" msgstr "" #: ../Gtk/gui.py:177 -msgid "Go down record" -msgstr "" - -#: ../Gtk/gui.py:178 -msgid "_Previous Record" +msgid "Import database" msgstr "" #: ../Gtk/gui.py:179 -msgid "Go Previous record" +msgid "_Open price database" msgstr "" #: ../Gtk/gui.py:180 -msgid "_Posterior Record" +msgid "Open Database" +msgstr "" + +#: ../Gtk/gui.py:185 +msgid "_Back" +msgstr "" + +#: ../Gtk/gui.py:186 ../Gtk/gui.py:197 +msgid "Go to the previous visited item" msgstr "" -#: ../Gtk/gui.py:181 -msgid "Go posterior record" +#: ../Gtk/gui.py:188 +msgid "_Forward" +msgstr "" + +#: ../Gtk/gui.py:189 ../Gtk/gui.py:201 +msgid "Go to the next visited item" msgstr "" -#: ../Gtk/gui.py:182 +#: ../Gtk/gui.py:190 +msgid "_Up Item" +msgstr "" + +#: ../Gtk/gui.py:191 +msgid "Go up item" +msgstr "" + +#: ../Gtk/gui.py:192 msgid "_Root" msgstr "" -#: ../Gtk/gui.py:183 +#: ../Gtk/gui.py:193 msgid "Go to root" msgstr "" -#: ../Gtk/gui.py:184 -msgid "_Test" -msgstr "" - -#: ../Gtk/gui.py:186 -msgid "Import Fiebdc _price database" +#: ../Gtk/gui.py:220 +msgid "Back history" msgstr "" -#: ../Gtk/gui.py:186 -msgid "Import database" +#: ../Gtk/gui.py:225 +msgid "Forward history" msgstr "" -#: ../Gtk/gui.py:188 -msgid "_Open price database" -msgstr "" - -#: ../Gtk/gui.py:189 -msgid "Open Database" -msgstr "" - -#: ../Gtk/gui.py:308 +#: ../Gtk/gui.py:422 msgid "Cancel reading Durus database has not been implemented." msgstr "" -#: ../Gtk/gui.py:589 ../Gtk/importFiebdc.py:222 +#: ../Gtk/gui.py:443 +msgid "The page is not in the page list" +msgstr "" + +#: ../Gtk/gui.py:672 ../Gtk/importFiebdc.py:220 msgid "Time: 0s" msgstr "" -#: ../Gtk/gui.py:656 ../Gtk/importFiebdc.py:301 +#: ../Gtk/gui.py:749 ../Gtk/importFiebdc.py:299 msgid "Time: $1" msgstr "" -#: ../Gtk/gui.py:852 -msgid "The page is not in the page list" -msgstr "" - -#: ../Gtk/gui.py:958 +#: ../Gtk/gui.py:1075 msgid "The value must be a list" msgstr "" -#: ../Gtk/gui.py:961 +#: ../Gtk/gui.py:1078 msgid "Incorrect len" msgstr "" -#: ../Gtk/gui.py:989 +#: ../Gtk/gui.py:1106 msgid "Incorrect item $1" msgstr "" -#: ../Gtk/gui.py:1005 +#: ../Gtk/gui.py:1122 msgid "The budget does not have the path record: $1" msgstr "" -#: ../Gtk/gui.py:1196 +#: ../Gtk/gui.py:1478 msgid "Decomposition" msgstr "" -#: ../Gtk/gui.py:1197 ../Gtk/gui.py:2213 +#: ../Gtk/gui.py:1479 ../Gtk/gui.py:2485 msgid "Description" msgstr "" -#: ../Gtk/gui.py:1198 ../Gtk/gui.py:2215 +#: ../Gtk/gui.py:1480 ../Gtk/gui.py:2487 msgid "Measure" msgstr "" -#: ../Gtk/gui.py:1199 +#: ../Gtk/gui.py:1481 msgid "Sheet of Conditions" msgstr "" -#: ../Gtk/gui.py:1200 +#: ../Gtk/gui.py:1482 msgid "Files" msgstr "" -#: ../Gtk/gui.py:1201 +#: ../Gtk/gui.py:1483 msgid "Companies" msgstr "" -#: ../Gtk/gui.py:1385 +#: ../Gtk/gui.py:1660 msgid "Split View Left/Right" msgstr "" -#: ../Gtk/gui.py:1389 +#: ../Gtk/gui.py:1664 msgid "Split View Top/Bottom" msgstr "" -#: ../Gtk/gui.py:1393 +#: ../Gtk/gui.py:1668 msgid "Close view" msgstr "" -#: ../Gtk/gui.py:1562 +#: ../Gtk/gui.py:1836 msgid "The item must be a widget object." msgstr "" -#: ../Gtk/gui.py:1568 +#: ../Gtk/gui.py:1842 msgid "Invalid orientation." msgstr "" -#: ../Gtk/gui.py:1943 ../Gtk/gui.py:2577 ../Gtk/gui.py:3987 +#: ../Gtk/gui.py:2214 ../Gtk/gui.py:2841 ../Gtk/gui.py:4171 msgid "Argument must be a Budget object" msgstr "" -#: ../Gtk/gui.py:1952 -msgid "DecompositionList.__init__: Record path can not be None" +#: ../Gtk/gui.py:2223 +msgid "Record path can not be None" msgstr "" -#: ../Gtk/gui.py:1983 +#: ../Gtk/gui.py:2254 msgid "a" msgstr "" -#: ../Gtk/gui.py:2210 ../Gtk/gui.py:4047 +#: ../Gtk/gui.py:2482 ../Gtk/gui.py:4234 msgid "Code" msgstr "" -#: ../Gtk/gui.py:2211 +#: ../Gtk/gui.py:2483 msgid "Unit" msgstr "" -#: ../Gtk/gui.py:2217 +#: ../Gtk/gui.py:2489 msgid "Price" msgstr "" -#: ../Gtk/gui.py:2219 +#: ../Gtk/gui.py:2491 msgid "Amount" msgstr "" -#: ../Gtk/gui.py:2231 ../Gtk/gui.py:2709 +#: ../Gtk/gui.py:2502 ../Gtk/gui.py:2981 msgid "Invalid path" msgstr "" -#: ../Gtk/gui.py:2582 +#: ../Gtk/gui.py:2846 msgid "Record path must be a tuple" msgstr "" -#: ../Gtk/gui.py:2726 +#: ../Gtk/gui.py:2990 msgid "measure must be a Measure object. Type: $1" msgstr "" -#: ../Gtk/gui.py:2737 ../Gtk/gui.py:4062 ../Gtk/gui.py:4389 +#: ../Gtk/gui.py:3002 ../Gtk/gui.py:4249 ../Gtk/gui.py:4562 msgid "Type" msgstr "" -#: ../Gtk/gui.py:2738 +#: ../Gtk/gui.py:3003 msgid "Comment" msgstr "" -#: ../Gtk/gui.py:2739 +#: ../Gtk/gui.py:3004 msgid "" "N\n" "(a)" msgstr "" -#: ../Gtk/gui.py:2740 +#: ../Gtk/gui.py:3005 msgid "" "Length\n" "(b)" msgstr "" -#: ../Gtk/gui.py:2741 +#: ../Gtk/gui.py:3006 msgid "" "Width\n" "(c)" msgstr "" -#: ../Gtk/gui.py:2742 +#: ../Gtk/gui.py:3007 msgid "" "Height\n" "(d)" msgstr "" -#: ../Gtk/gui.py:2743 +#: ../Gtk/gui.py:3008 msgid "Formula" msgstr "" -#: ../Gtk/gui.py:2744 +#: ../Gtk/gui.py:3009 #, python-format msgid "" "Parcial\n" "[%s]" msgstr "" -#: ../Gtk/gui.py:2745 +#: ../Gtk/gui.py:3010 msgid "Subtotal" msgstr "" -#: ../Gtk/gui.py:3153 ../Gtk/gui.py:3175 +#: ../Gtk/gui.py:3418 ../Gtk/gui.py:3440 msgid "Description text of the record $1" msgstr "" -#: ../Gtk/gui.py:3332 +#: ../Gtk/gui.py:3591 msgid "Sheet of Conditions of the record $1" msgstr "" -#: ../Gtk/gui.py:3352 +#: ../Gtk/gui.py:3609 msgid "Field" msgstr "" -#: ../Gtk/gui.py:3374 +#: ../Gtk/gui.py:3630 msgid "Section" msgstr "" -#: ../Gtk/gui.py:3527 +#: ../Gtk/gui.py:3778 msgid "Sheet2 of Conditions of the record $1" msgstr "" -#: ../Gtk/gui.py:3903 -msgid "$1 text" -msgstr "" - -#: ../Gtk/gui.py:4048 +#: ../Gtk/gui.py:4235 msgid "Code that define the company" msgstr "" -#: ../Gtk/gui.py:4049 +#: ../Gtk/gui.py:4236 msgid "Summary" msgstr "" -#: ../Gtk/gui.py:4050 +#: ../Gtk/gui.py:4237 msgid "Summary of the company name" msgstr "" -#: ../Gtk/gui.py:4051 ../Gtk/gui.py:4067 +#: ../Gtk/gui.py:4238 ../Gtk/gui.py:4254 msgid "Name" msgstr "" -#: ../Gtk/gui.py:4052 +#: ../Gtk/gui.py:4239 msgid "Complete name" msgstr "" -#: ../Gtk/gui.py:4053 +#: ../Gtk/gui.py:4240 msgid "CIF" msgstr "" -#: ../Gtk/gui.py:4054 +#: ../Gtk/gui.py:4241 msgid "Fiscal identifier number" msgstr "" -#: ../Gtk/gui.py:4055 +#: ../Gtk/gui.py:4242 msgid "Web" msgstr "" -#: ../Gtk/gui.py:4056 +#: ../Gtk/gui.py:4243 msgid "Company web page" msgstr "" -#: ../Gtk/gui.py:4057 +#: ../Gtk/gui.py:4244 msgid "Email" msgstr "" -#: ../Gtk/gui.py:4058 +#: ../Gtk/gui.py:4245 msgid "Company email" msgstr "" -#: ../Gtk/gui.py:4063 +#: ../Gtk/gui.py:4250 msgid "" "Type of Office:\n" " C: Central office\n" @@ -990,131 +986,131 @@ " R: Performer" msgstr "" -#: ../Gtk/gui.py:4068 +#: ../Gtk/gui.py:4255 msgid "Office name" msgstr "" -#: ../Gtk/gui.py:4069 +#: ../Gtk/gui.py:4256 msgid "Address" msgstr "" -#: ../Gtk/gui.py:4070 +#: ../Gtk/gui.py:4257 msgid "Postal code" msgstr "" -#: ../Gtk/gui.py:4071 +#: ../Gtk/gui.py:4258 msgid "Town" msgstr "" -#: ../Gtk/gui.py:4072 +#: ../Gtk/gui.py:4259 msgid "Province" msgstr "" -#: ../Gtk/gui.py:4073 +#: ../Gtk/gui.py:4260 msgid "Country" msgstr "" -#: ../Gtk/gui.py:4074 +#: ../Gtk/gui.py:4261 msgid "Phone" msgstr "" -#: ../Gtk/gui.py:4075 +#: ../Gtk/gui.py:4262 msgid "Phone numbers of the office" msgstr "" -#: ../Gtk/gui.py:4076 +#: ../Gtk/gui.py:4263 msgid "Fax" msgstr "" -#: ../Gtk/gui.py:4077 +#: ../Gtk/gui.py:4264 msgid "Fax numbers of the office" msgstr "" -#: ../Gtk/gui.py:4078 +#: ../Gtk/gui.py:4265 msgid "Contact person" msgstr "" -#: ../Gtk/gui.py:4079 +#: ../Gtk/gui.py:4266 msgid "Contact persons in the office" msgstr "" -#: ../Gtk/gui.py:4083 +#: ../Gtk/gui.py:4270 msgid "Unknow Option Type" msgstr "" -#: ../Gtk/gui.py:4327 +#: ../Gtk/gui.py:4500 msgid "Boolean" msgstr "" -#: ../Gtk/gui.py:4328 +#: ../Gtk/gui.py:4501 msgid "Integer" msgstr "" -#: ../Gtk/gui.py:4329 +#: ../Gtk/gui.py:4502 msgid "Text" msgstr "" -#: ../Gtk/gui.py:4330 +#: ../Gtk/gui.py:4503 msgid "Color" msgstr "" -#: ../Gtk/gui.py:4331 +#: ../Gtk/gui.py:4504 msgid "List" msgstr "" -#: ../Gtk/gui.py:4363 +#: ../Gtk/gui.py:4536 msgid "Option name" msgstr "" -#: ../Gtk/gui.py:4376 +#: ../Gtk/gui.py:4549 msgid "Value" msgstr "" -#: ../Gtk/gui.py:4414 +#: ../Gtk/gui.py:4588 msgid "Description:" msgstr "" -#: ../Gtk/gui.py:4576 +#: ../Gtk/gui.py:4749 msgid "Option values must be strings" msgstr "" -#: ../Gtk/gui.py:4578 +#: ../Gtk/gui.py:4751 msgid "Option must be a tuple with 4 items" msgstr "" -#: ../Gtk/gui.py:4580 +#: ../Gtk/gui.py:4753 msgid "Option list must be a list" msgstr "" -#: ../Gtk/gui.py:4600 +#: ../Gtk/gui.py:4773 msgid "Icorrect type, must be boolean" msgstr "" -#: ../Gtk/gui.py:4605 +#: ../Gtk/gui.py:4778 msgid "Icorrect type, must be integer" msgstr "" -#: ../Gtk/gui.py:4618 +#: ../Gtk/gui.py:4791 msgid "Icorrect type, must be string" msgstr "" -#: ../Gtk/gui.py:4631 +#: ../Gtk/gui.py:4804 msgid "Icorrect type, must be list" msgstr "" -#: ../Gtk/gui.py:4637 +#: ../Gtk/gui.py:4810 msgid "Icorrect type, must be a parseable color" msgstr "" -#: ../Gtk/gui.py:4645 +#: ../Gtk/gui.py:4818 msgid "Type must be boolean, integer, string or color" msgstr "" -#: ../Gtk/gui.py:4648 +#: ../Gtk/gui.py:4821 msgid "Value must be in the option dict" msgstr "" -#: ../Gtk/gui.py:4650 +#: ../Gtk/gui.py:4823 msgid "Values must be a dict" msgstr "" @@ -1122,26 +1118,26 @@ msgid "Open File" msgstr "" -#: ../Gtk/importFiebdc.py:137 +#: ../Gtk/importFiebdc.py:135 msgid "The file must have 'bc3' extension" msgstr "" -#: ../Gtk/importFiebdc.py:139 +#: ../Gtk/importFiebdc.py:137 msgid "The file must have 'durus' extension" msgstr "" -#: ../Gtk/importFiebdc.py:210 +#: ../Gtk/importFiebdc.py:208 msgid "Loading file ..." msgstr "" -#: ../Gtk/importFiebdc.py:234 +#: ../Gtk/importFiebdc.py:232 msgid "Cancel" msgstr "" -#: ../Gtk/importFiebdc.py:439 +#: ../Gtk/importFiebdc.py:436 msgid "Saving file: $1" msgstr "" -#: ../Gtk/importFiebdc.py:444 +#: ../Gtk/importFiebdc.py:441 msgid "Saving time: $1 seconds" msgstr ""