comparison Gtk/gui.py @ 26:16f91684686b default tip

Upgrade to python 3. Keep python 2/3 compatibility
author Miguel Ángel Bárcena Rodríguez <miguelangel@obraencurso.es>
date Tue, 18 Jun 2019 17:50:23 +0200
parents 189f8274aecd
children
comparison
equal deleted inserted replaced
25:189f8274aecd 26:16f91684686b
44 44
45 # Modules 45 # Modules
46 46
47 # python 2/3 compatibility 47 # python 2/3 compatibility
48 from __future__ import absolute_import, division, print_function, unicode_literals 48 from __future__ import absolute_import, division, print_function, unicode_literals
49 49 from builtins import str as text
50 from six import text_type
51
52 def textinp2(textstring):
53 """textinp2(textstring)
54
55 python2 decode textstring with utf-8
56 python3 raise except and do nothing with textstring
57
58 return textstring
59
60 All output gtk string must be passed by textinp2
61 """
62 try:
63 # python2 works, python3 raise except and do nothing with textstring
64 textstring = text(textstring, "utf-8")
65 except TypeError:
66 pass
67 return textstring
68
50 # Standar Modules 69 # Standar Modules
51 import sys 70 import sys
52 import os 71 import os
53 import time 72 import time
54 73
79 if os.path.exists(globalVars.getAppPath(_icon)): 98 if os.path.exists(globalVars.getAppPath(_icon)):
80 _icon_file = globalVars.getAppPath(_icon) 99 _icon_file = globalVars.getAppPath(_icon)
81 _pixbufIcon = GdkPixbuf.Pixbuf.new_from_file(_icon_file) 100 _pixbufIcon = GdkPixbuf.Pixbuf.new_from_file(_icon_file)
82 _pixbufIcons.append(_pixbufIcon) 101 _pixbufIcons.append(_pixbufIcon)
83 else: 102 else:
84 print(utils.mapping(_("The icon file does not exist. '$1'"), 103 _tuni = _("The icon file does not exist. '$1'")
85 (str(globalVars.getAppPath(_icon)),)) ) 104 _uni = utils.mapping(_tuni, (globalVars.getAppPath(_icon),))
105 print(_uni )
86 if len(_pixbufIcons) > 0: 106 if len(_pixbufIcons) > 0:
87 Gtk.Window.set_default_icon_list(_pixbufIcons) 107 Gtk.Window.set_default_icon_list(_pixbufIcons)
88 108
89 else: 109 else:
90 print(utils.mapping(_("The icon file does not exist. '$1'"), 110 _tuni = _("The icon file does not exist. '$1'")
91 (str(globalVars.getAppPath("ICON")),)) ) 111 _uni = utils.mapping(_tuni, (globalVars.getAppPath("ICON"),))
112 print(_uni )
92 113
93 # Autodetect desktop 114 # Autodetect desktop
94 if globalVars.desktop["autodetect"]: 115 if globalVars.desktop["autodetect"]:
95 openwith.autodetect_desktop() 116 openwith.autodetect_desktop()
96 print(utils.mapping(_("pyArq-Presupuestos running on $1"), 117 _tuni = _("pyArq-Presupuestos running on $1")
97 (globalVars.desktop["desktop"],))) 118 _uni = utils.mapping(_tuni, (globalVars.desktop["desktop"],))
119 print(_uni)
98 120
99 121
100 class App(Gtk.Application): 122 class App(Gtk.Application):
101 """gui.App: 123 """gui.App:
102 124
657 page.clear() 679 page.clear()
658 self.__notebook.remove_page(_page_num) 680 self.__notebook.remove_page(_page_num)
659 if len(self.__page_list) == 0: 681 if len(self.__page_list) == 0:
660 self._disable_navigation() 682 self._disable_navigation()
661 else: 683 else:
662 raise IndexError( _("The page is not in the page list") ) 684 _tuni = _("The page is not in the page list")
685 _str = _tuni.encode("utf-8")
686 raise IndexError(_str)
663 687
664 def _menuitemGoToRoot(self, action, parameter): 688 def _menuitemGoToRoot(self, action, parameter):
665 """_menuitemGoToRoot(action, parameter) 689 """_menuitemGoToRoot(action, parameter)
666 690
667 action: the action where the event is emitted from 691 action: the action where the event is emitted from
827 851
828 filename: the filename to open 852 filename: the filename to open
829 If the selected file has a bc3 extension 853 If the selected file has a bc3 extension
830 _launchProgressWindow is called 854 _launchProgressWindow is called
831 """ 855 """
832 _file = filename 856 _file = filename # string in python 2, unicode in python 3
833 if sys.getfilesystemencoding(): 857 if sys.getfilesystemencoding():
834 _file = _file.decode(sys.getfilesystemencoding()) 858 try:
859 # python2 works, python3 raise except and do nothing with _file
860 _file = text(filename, sys.getfilesystemencoding())
861 except TypeError:
862 pass
835 self.__file = _file 863 self.__file = _file
836 _filename = os.path.basename(self.__file) 864 _filename = os.path.basename(self.__file)
837 _filename_ext = _filename.split(".")[-1] 865 _filename_ext = _filename.split(".")[-1]
838 if (self.__filetype == "budget" or self.__filetype == "database") and \ 866 if (self.__filetype == "budget" or self.__filetype == "database") and \
839 _filename_ext != "bc3" and _filename_ext != "BC3": 867 _filename_ext != "bc3" and _filename_ext != "BC3":
1006 1034
1007 percent: Percentage executed. 1035 percent: Percentage executed.
1008 1036
1009 Sets progress 1037 Sets progress
1010 """ 1038 """
1011 _progress = str(int(round(100 * percent,0))) 1039 _progress = text(int(round(100 * percent,0)))
1012 self.__progress = percent 1040 self.__progress = percent
1013 1041
1014 def readFile_send_message(self, message): 1042 def readFile_send_message(self, message):
1015 """readFile_send_message(message) 1043 """readFile_send_message(message)
1016 1044
1092 if self.__children is None or self.__children.isCanceled() == True: 1120 if self.__children is None or self.__children.isCanceled() == True:
1093 self.__cancel[0] = True 1121 self.__cancel[0] = True
1094 return False 1122 return False
1095 else: 1123 else:
1096 self.__progress_bar.set_fraction(self.__progress) 1124 self.__progress_bar.set_fraction(self.__progress)
1097 _text = "%s%%" %str(int(round(100 * self.__progress,0))) 1125 _text = "%s%%" %text(int(round(100 * self.__progress,0)))
1098 self.__progress_bar.set_text(_text) 1126 self.__progress_bar.set_text(_text)
1099 return True 1127 return True
1100 1128
1101 def _updateLabel(self, _time): 1129 def _updateLabel(self, _time):
1102 """_updateLabel(_time) 1130 """_updateLabel(_time)
1458 1486
1459 Creates the items and widgets and returns the main item 1487 Creates the items and widgets and returns the main item
1460 """ 1488 """
1461 if pane_path is None: 1489 if pane_path is None:
1462 pane_path = (0,) 1490 pane_path = (0,)
1463 if not isinstance(list_paned , list): 1491 if not isinstance(list_paned, list):
1464 raise ValueError( _("The value must be a list") ) 1492 _tuni = _("The value must be a list")
1493 _str = _tuni.encode("utf-8")
1494 raise ValueError(_str)
1465 if list_paned[0] == "v" or list_paned[0] == "h": 1495 if list_paned[0] == "v" or list_paned[0] == "h":
1466 if len(list_paned) != 3: 1496 if len(list_paned) != 3:
1467 raise ValueError( _("Incorrect len") ) 1497 _tuni = _("Incorrect len")
1468 if not isinstance(list_paned[1],list): 1498 _str = _tuni.encode("utf-8")
1499 raise ValueError(_str)
1500 if not isinstance(list_paned[1], list):
1469 list_paned[1] = [list_paned[1]] 1501 list_paned[1] = [list_paned[1]]
1470 if not isinstance(list_paned[2],list): 1502 if not isinstance(list_paned[2], list):
1471 list_paned[2] = [list_paned[2]] 1503 list_paned[2] = [list_paned[2]]
1472 _item1 = self._itemsFactory(list_paned[1],pane_path + (0,)) 1504 _item1 = self._itemsFactory(list_paned[1], pane_path + (0,))
1473 _item2 = self._itemsFactory(list_paned[2],pane_path + (1,)) 1505 _item2 = self._itemsFactory(list_paned[2], pane_path + (1,))
1474 _item = Paned(list_paned[0], pane_path, _item1, _item2) 1506 _item = Paned(list_paned[0], pane_path, _item1, _item2)
1475 elif list_paned[0] == "DecompositionList": 1507 elif list_paned[0] == "DecompositionList":
1476 _item = View( "DecompositionList", self.__budget, 1508 _item = View("DecompositionList", self.__budget,
1477 weakref.ref(self), pane_path, self.__active_path_record, True) 1509 weakref.ref(self), pane_path, self.__active_path_record, True)
1478 elif list_paned[0] == "RecordDescription": 1510 elif list_paned[0] == "RecordDescription":
1479 _item = View( "RecordDescription", self.__budget,weakref.ref(self), 1511 _item = View("RecordDescription", self.__budget,weakref.ref(self),
1480 pane_path, self.__active_path_record, True) 1512 pane_path, self.__active_path_record, True)
1481 elif list_paned[0] == "Measure": 1513 elif list_paned[0] == "Measure":
1482 _item = View("Measure", self.__budget, weakref.ref(self), 1514 _item = View("Measure", self.__budget, weakref.ref(self),
1483 pane_path, self.__active_path_record, True) 1515 pane_path, self.__active_path_record, True)
1484 elif list_paned[0] == "Sheet of Conditions": 1516 elif list_paned[0] == "Sheet of Conditions":
1485 _item = View("Sheet of Conditions", 1517 _item = View("Sheet of Conditions",
1486 self.__budget, weakref.ref(self), pane_path, 1518 self.__budget, weakref.ref(self), pane_path,
1487 self.__active_path_record) 1519 self.__active_path_record)
1488 elif list_paned[0] == "FileView": 1520 elif list_paned[0] == "FileView":
1489 _item = View("FileView", self.__budget, weakref.ref(self), 1521 _item = View("FileView", self.__budget, weakref.ref(self),
1490 pane_path, self.__active_path_record) 1522 pane_path, self.__active_path_record)
1491 elif list_paned[0] == "CompanyView": 1523 elif list_paned[0] == "CompanyView":
1492 _item = View("CompanyView", self.__budget, weakref.ref(self), 1524 _item = View("CompanyView", self.__budget, weakref.ref(self),
1493 pane_path, self.__active_path_record) 1525 pane_path, self.__active_path_record)
1494 else: 1526 else:
1495 _item = None 1527 _item = None
1496 raise ValueError( utils.mapping(_("Incorrect item $1"), 1528 _tuni = _("Incorrect item $1")
1497 (str(list_paned[0]),)) ) 1529 _uni = utils.mapping(_tuni, (text(list_paned[0]),))
1530 _str = _uni.encode("utf-8")
1531 raise ValueError(_str)
1498 return _item 1532 return _item
1499 1533
1500 def _setActivePathRecord(self, path_record): 1534 def _setActivePathRecord(self, path_record):
1501 """_setActivePathRecord(path_record) 1535 """_setActivePathRecord(path_record)
1502 1536
1507 if path_record != self.__active_path_record: 1541 if path_record != self.__active_path_record:
1508 if self.__budget.hasPath(path_record): 1542 if self.__budget.hasPath(path_record):
1509 self.__active_path_record = path_record 1543 self.__active_path_record = path_record
1510 self._appendHistory(path_record) 1544 self._appendHistory(path_record)
1511 else: 1545 else:
1512 raise ValueError( utils.mapping(_("The budget does not have "\ 1546 _tuni = _("The budget does not have the path record: $1")
1513 "the path record: $1"), (str(path_record),)) ) 1547 _uni = utils.mapping(_tuni, (text(path_record),))
1548 _str = _uni.encode("utf-8")
1549 raise ValueError(_str)
1514 1550
1515 def _appendHistory(self, path): 1551 def _appendHistory(self, path):
1516 """_appendHistory(path)) 1552 """_appendHistory(path))
1517 1553
1518 path: the new active path record 1554 path: the new active path record
1642 Creates and return a menuItem to go to the record 1678 Creates and return a menuItem to go to the record
1643 """ 1679 """
1644 _code = self.budget.getCode(record_path) 1680 _code = self.budget.getCode(record_path)
1645 _record = self.budget.getRecord(_code) 1681 _record = self.budget.getRecord(_code)
1646 _summary = _record.summary 1682 _summary = _record.summary
1647 _text = _code.decode("utf8") + " " + _summary.decode("utf8") 1683 _text = _code + " " + _summary
1648 if len(_text) > 30: 1684 if len(_text) > 30:
1649 _text = _text[:27] + "..." 1685 _text = _text[:27] + "..."
1650 _icon = self._getImage(_record) 1686 _icon = self._getImage(_record)
1651 _grid = Gtk.Grid() 1687 _grid = Gtk.Grid()
1652 _grid.set_orientation(Gtk.Orientation(0)) # 0 Horizontal 1688 _grid.set_orientation(Gtk.Orientation(0)) # 0 Horizontal
1923 active_path_record) 1959 active_path_record)
1924 _combobox.set_active(5) 1960 _combobox.set_active(5)
1925 _view_icon = Gtk.Image() 1961 _view_icon = Gtk.Image()
1926 _view_icon.set_from_file(globalVars.getAppPath("COMPANY-ICON")) 1962 _view_icon.set_from_file(globalVars.getAppPath("COMPANY-ICON"))
1927 else: 1963 else:
1928 raise ValueError( _(utils.mapping("Invalid type of View: $1", 1964 _tuni = _("Invalid type of View: $1")
1929 view_type)) ) 1965 _uni = utils.mapping(_tuni, view_type)
1966 _str = _uni.encode("utf-8")
1967 raise ValueError(_str)
1930 _view_icon.show() 1968 _view_icon.show()
1931 _combobox.connect("changed", self._change_combo) 1969 _combobox.connect("changed", self._change_combo)
1932 _combobox.show() 1970 _combobox.show()
1933 self.__widget.add(_hbox) 1971 self.__widget.add(_hbox)
1934 self.__widget.add(self.__view.widget) 1972 self.__widget.add(self.__view.widget)
2256 Creates and shows a new Gtk.Paned 2294 Creates and shows a new Gtk.Paned
2257 """ 2295 """
2258 self.__orientation = orientation 2296 self.__orientation = orientation
2259 if not isinstance(item1.widget, Gtk.Widget) or \ 2297 if not isinstance(item1.widget, Gtk.Widget) or \
2260 not isinstance(item2.widget, Gtk.Widget): 2298 not isinstance(item2.widget, Gtk.Widget):
2261 raise ValueError( _("The item must be a widget object.") ) 2299 _tuni = _("The item must be a widget object.")
2300 _str = _tuni.encode("utf-8")
2301 raise ValueError(_str)
2262 if orientation == "v": 2302 if orientation == "v":
2263 self.__widget = Gtk.Paned.new(Gtk.Orientation(1)) 2303 self.__widget = Gtk.Paned.new(Gtk.Orientation(1))
2264 self.__widget.set_wide_handle(True) 2304 self.__widget.set_wide_handle(True)
2265 elif orientation == "h": 2305 elif orientation == "h":
2266 self.__widget = Gtk.Paned.new(Gtk.Orientation(0)) 2306 self.__widget = Gtk.Paned.new(Gtk.Orientation(0))
2267 self.__widget.set_wide_handle(True) 2307 self.__widget.set_wide_handle(True)
2268 else: 2308 else:
2269 raise ValueError( _("Invalid orientation.") ) 2309 _tuni = _("Invalid orientation.")
2310 _str = _tuni.encode("utf-8")
2311 raise ValueError(_str)
2270 self.__widget.pack1(item1.widget,True,False) 2312 self.__widget.pack1(item1.widget,True,False)
2271 self.__widget.pack2(item2.widget,True,False) 2313 self.__widget.pack2(item2.widget,True,False)
2272 self.__widget.show() 2314 self.__widget.show()
2273 self.__items = [item1, item2] 2315 self.__items = [item1, item2]
2274 self.__pane_path = pane_path 2316 self.__pane_path = pane_path
2636 * Connects the events 2678 * Connects the events
2637 """ 2679 """
2638 # TODO: to group all columns in a dicctionary 2680 # TODO: to group all columns in a dicctionary
2639 # Budget 2681 # Budget
2640 if not isinstance(budget, base.Budget): 2682 if not isinstance(budget, base.Budget):
2641 raise ValueError( _("Argument must be a Budget object") ) 2683 _tuni = _("Argument must be a Budget object")
2684 _str = _tuni.encode("utf-8")
2685 raise ValueError(_str)
2642 self.__budget = budget 2686 self.__budget = budget
2643 self.__wr_page = wr_page 2687 self.__wr_page = wr_page
2644 self.__pane_path = pane_path 2688 self.__pane_path = pane_path
2645 # ListStore 2689 # ListStore
2646 self.__liststore = Gtk.ListStore(object 2690 self.__liststore = Gtk.ListStore(object
2903 _amount = _price 2947 _amount = _price
2904 else: 2948 else:
2905 _parent_code = self.budget.getCode(self.__active_path_record[:-1]) 2949 _parent_code = self.budget.getCode(self.__active_path_record[:-1])
2906 _parent_record = self.__budget.getRecord(_parent_code) 2950 _parent_record = self.__budget.getRecord(_parent_code)
2907 _amount = _budget.getStrAmount(self.__active_path_record) 2951 _amount = _budget.getStrAmount(self.__active_path_record)
2908 _str = _("Code") + chr(10) + "[" + _code.decode("utf8") + "]" 2952 _str = _("Code") + chr(10) + "[" + _code + "]"
2909 self.__code_column.set_title(_str) 2953 self.__code_column.set_title(_str)
2910 _str = _("Unit") + chr(10) + "[" + _unit.decode("utf8") + "]" 2954 _str = _("Unit") + chr(10) + "[" + _unit + "]"
2911 self.__unit_column.set_title(_str) 2955 self.__unit_column.set_title(_str)
2912 _str = _("Description") + chr(10) + "[" + \ 2956 _str = _("Description") + chr(10) + "[" + \
2913 _description.decode("utf8") + "]" 2957 _description + "]"
2914 self.__description_column.set_title(_str) 2958 self.__description_column.set_title(_str)
2915 self.__measure_column.set_title( 2959 self.__measure_column.set_title(
2916 _("Measure") + chr(10) + "[" + _stryield + "]") 2960 _("Measure") + chr(10) + "[" + _stryield + "]")
2917 self.__price_column.set_title( 2961 self.__price_column.set_title(
2918 _("Price") + chr(10) + "[" + _price + "]") 2962 _("Price") + chr(10) + "[" + _price + "]")
2919 self.__amount_column.set_title( 2963 self.__amount_column.set_title(
2920 _("Amount") + chr(10) + "[" + str(_amount) + "]") 2964 _("Amount") + chr(10) + "[" + text(_amount) + "]")
2921 2965
2922 def _setListstoreValues(self, path_record): 2966 def _setListstoreValues(self, path_record):
2923 """_setListstoreValues(path_record) 2967 """_setListstoreValues(path_record)
2924 2968
2925 path_record: Record path in the budget 2969 path_record: Record path in the budget
2926 Sets the liststore record values from a path record 2970 Sets the liststore record values from a path record
2927 """ 2971 """
2928 self.__liststore.clear() 2972 self.__liststore.clear()
2929 _budget = self.__budget 2973 _budget = self.__budget
2930 if not _budget.hasPath(path_record): 2974 if not _budget.hasPath(path_record):
2931 raise ValueError( _("Invalid path") ) 2975 _tuni = _("Invalid path")
2976 _str = _tuni.encode("utf-8")
2977 raise ValueError(_str)
2932 else: 2978 else:
2933 _parent_code = _budget.getCode(path_record) 2979 _parent_code = _budget.getCode(path_record)
2934 for N,_code in enumerate(_budget.getchildren(_parent_code)): 2980 for N,_code in enumerate(_budget.getchildren(_parent_code)):
2935 _decomposition = _budget.getNDecomposition(_parent_code, N) 2981 _decomposition = _budget.getNDecomposition(_parent_code, N)
2936 _record = _budget.getRecord(_code) 2982 _record = _budget.getRecord(_code)
2975 _row_path = tree_model.get_path(iter) 3021 _row_path = tree_model.get_path(iter)
2976 _global_row_path = self.__active_path_record + (_row_path[0],) 3022 _global_row_path = self.__active_path_record + (_row_path[0],)
2977 _number = _row_path[-1] 3023 _number = _row_path[-1]
2978 _record = tree_model[_row_path][0] 3024 _record = tree_model[_row_path][0]
2979 if column is self.__index_column: 3025 if column is self.__index_column:
2980 cell_renderer.set_property('text', str(_number + 1)) 3026 cell_renderer.set_property('text', text(_number + 1))
2981 self.__index_column.get_cells()[1].set_property( 3027 self.__index_column.get_cells()[1].set_property(
2982 'cell-background', lcolor[_number % 2]) 3028 'cell-background', lcolor[_number % 2])
2983 elif column is self.__code_column: 3029 elif column is self.__code_column:
2984 # if the record is a chapter 3030 # if the record is a chapter
2985 if tree_model.get_value(iter, 0).recordType.hierarchy == 1: 3031 if tree_model.get_value(iter, 0).recordType.hierarchy == 1:
3006 elif column is self.__amount_column: 3052 elif column is self.__amount_column:
3007 _parent_code = self.budget.getCode(self.__active_path_record) 3053 _parent_code = self.budget.getCode(self.__active_path_record)
3008 _parent_record = self.__budget.getRecord(_parent_code) 3054 _parent_record = self.__budget.getRecord(_parent_code)
3009 _amount = self.budget.getStrAmount( 3055 _amount = self.budget.getStrAmount(
3010 self.__active_path_record + (_number,)) 3056 self.__active_path_record + (_number,))
3011 cell_renderer.set_property('text', str(_amount)) 3057 cell_renderer.set_property('text', text(_amount))
3012 elif column is self.__type_column: 3058 elif column is self.__type_column:
3013 _hierarchy = tree_model[_row_path][0].recordType.hierarchy 3059 _hierarchy = tree_model[_row_path][0].recordType.hierarchy
3014 _type = tree_model[_row_path][0].recordType.type 3060 _type = tree_model[_row_path][0].recordType.type
3015 _subtype = tree_model[_row_path][0].recordType.subtype 3061 _subtype = tree_model[_row_path][0].recordType.subtype
3016 if _hierarchy == 1: 3062 if _hierarchy == 1:
3270 """ 3316 """
3271 # Seting init args 3317 # Seting init args
3272 if path_record is None: 3318 if path_record is None:
3273 path_record = (0,) 3319 path_record = (0,)
3274 if not isinstance(budget, base.Budget): 3320 if not isinstance(budget, base.Budget):
3275 raise ValueError( _("Argument must be a Budget object") ) 3321 _tuni = _("Argument must be a Budget object")
3322 _str = _tuni.encode("utf-8")
3323 raise ValueError(_str)
3276 self.__budget = budget 3324 self.__budget = budget
3277 self.__wr_page = page 3325 self.__wr_page = page
3278 self.__pane_path = pane_path 3326 self.__pane_path = pane_path
3279 if not isinstance(path_record, tuple): 3327 if not isinstance(path_record, tuple):
3280 print(_("Record path must be a tuple") ) 3328 print(_("Record path must be a tuple") )
3525 Sets the headers column values 3573 Sets the headers column values
3526 """ 3574 """
3527 _measure = self.__budget.getMeasure(self.__active_path_record) 3575 _measure = self.__budget.getMeasure(self.__active_path_record)
3528 _DS = self.__budget.getDecimals("DS") 3576 _DS = self.__budget.getDecimals("DS")
3529 _total = _measure.measure 3577 _total = _measure.measure
3530 _total_str = ("%." + str(abs(_DS)) + "f" ) % _total 3578 _total_str = ("%." + text(abs(_DS)) + "f" ) % _total
3531 self.columns[1].set_title(_("Type")) # Σ parcial Σ total 3579 self.columns[1].set_title(_("Type")) # Σ parcial Σ total
3532 self.columns[2].set_title(_("Comment")) 3580 self.columns[2].set_title(_("Comment"))
3533 self.columns[3].set_title(_("N\n(a)")) 3581 self.columns[3].set_title(_("N\n(a)"))
3534 self.columns[4].set_title(_("Length\n(b)")) 3582 self.columns[4].set_title(_("Length\n(b)"))
3535 self.columns[5].set_title(_("Width\n(c)")) 3583 self.columns[5].set_title(_("Width\n(c)"))
3545 Sets the liststore record values from a path record 3593 Sets the liststore record values from a path record
3546 """ 3594 """
3547 self.__liststore.clear() 3595 self.__liststore.clear()
3548 _budget = self.__budget 3596 _budget = self.__budget
3549 if not _budget.hasPath(path_record): 3597 if not _budget.hasPath(path_record):
3550 raise ValueError( _("Invalid path") ) 3598 _tuni = _("Invalid path")
3599 _str = _tuni.encode("utf-8")
3600 raise ValueError(_str)
3551 else: 3601 else:
3552 _measure = _budget.getMeasure(path_record) 3602 _measure = _budget.getMeasure(path_record)
3553 if isinstance(_measure, base.Measure): 3603 if isinstance(_measure, base.Measure):
3554 _lines = _measure.lines 3604 _lines = _measure.lines
3555 for _line in _lines: 3605 for _line in _lines:
3556 _values = [ _line ] 3606 _values = [ _line ]
3557 _treeiter = self.__liststore.append(_values) 3607 _treeiter = self.__liststore.append(_values)
3558 else: 3608 else:
3559 raise ValueError( utils.mapping(_("measure must be a Measure "\ 3609 _tuni = _("measure must be a Measure object. Type: $1")
3560 "object. Type: $1"), (str(type(_measure)),)) ) 3610 _uni = utils.mapping(_tuni, (text(type(_measure)),))
3611 _str = _tuni.encode("utf-8")
3612 raise ValueError(_str)
3561 3613
3562 def _colorCell(self, column, cell_renderer, tree_model, iter, lcolor): 3614 def _colorCell(self, column, cell_renderer, tree_model, iter, lcolor):
3563 """_colorCell(column, cell_renderer, tree_model, iter, lcolor) 3615 """_colorCell(column, cell_renderer, tree_model, iter, lcolor)
3564 3616
3565 column: the Gtk.TreeViewColumn in the treeview 3617 column: the Gtk.TreeViewColumn in the treeview
3585 and text for index and amount columns. 3637 and text for index and amount columns.
3586 """ 3638 """
3587 _row_path = tree_model.get_path(iter) 3639 _row_path = tree_model.get_path(iter)
3588 _number = _row_path[-1] 3640 _number = _row_path[-1]
3589 if column is self.__index_column: 3641 if column is self.__index_column:
3590 cell_renderer.set_property('text', str(_number + 1)) 3642 cell_renderer.set_property('text', text(_number + 1))
3591 self.__index_column.get_cells()[1].set_property( 3643 self.__index_column.get_cells()[1].set_property(
3592 'cell-background', lcolor[_number % 2]) 3644 'cell-background', lcolor[_number % 2])
3593 elif column is self.__linetype_column: 3645 elif column is self.__linetype_column:
3594 _measure = tree_model[_row_path][0] 3646 _measure = tree_model[_row_path][0]
3595 _type = _measure.lineType 3647 _type = _measure.lineType
3603 else: #elif _type == 3: 3655 else: #elif _type == 3:
3604 cell_renderer.set_property("pixbuf", 3656 cell_renderer.set_property("pixbuf",
3605 self.__calculatedline_icon) 3657 self.__calculatedline_icon)
3606 elif column is self.__comment_column: 3658 elif column is self.__comment_column:
3607 _measure = tree_model[_row_path][0] 3659 _measure = tree_model[_row_path][0]
3608 _comment = str(_measure.comment) 3660 _comment = text(_measure.comment)
3609 cell_renderer.set_property('text', _comment) 3661 cell_renderer.set_property('text', _comment)
3610 elif column is self.__units_column: 3662 elif column is self.__units_column:
3611 _measure = tree_model[_row_path][0] 3663 _measure = tree_model[_row_path][0]
3612 _units = _measure.units 3664 _units = _measure.units
3613 if isinstance(_units, float): 3665 if isinstance(_units, float):
3614 _DN = self.__budget.getDecimals("DN") 3666 _DN = self.__budget.getDecimals("DN")
3615 _units = ("%." + str(abs(_DN)) + "f" ) % _units 3667 _units = ("%." + text(abs(_DN)) + "f" ) % _units
3616 cell_renderer.set_property('text', _units) 3668 cell_renderer.set_property('text', _units)
3617 elif column is self.__length_column: 3669 elif column is self.__length_column:
3618 _measure = tree_model[_row_path][0] 3670 _measure = tree_model[_row_path][0]
3619 _length = _measure.length 3671 _length = _measure.length
3620 if isinstance(_length, float): 3672 if isinstance(_length, float):
3621 _DD = self.__budget.getDecimals("DD") 3673 _DD = self.__budget.getDecimals("DD")
3622 _length = ("%." + str(abs(_DD)) + "f" ) % _length 3674 _length = ("%." + text(abs(_DD)) + "f" ) % _length
3623 cell_renderer.set_property('text', _length) 3675 cell_renderer.set_property('text', _length)
3624 elif column is self.__width_column: 3676 elif column is self.__width_column:
3625 _measure = tree_model[_row_path][0] 3677 _measure = tree_model[_row_path][0]
3626 _width = _measure.width 3678 _width = _measure.width
3627 if isinstance(_width, float): 3679 if isinstance(_width, float):
3628 _DD = self.__budget.getDecimals("DD") 3680 _DD = self.__budget.getDecimals("DD")
3629 _width = ("%." + str(abs(_DD)) + "f" ) % _width 3681 _width = ("%." + text(abs(_DD)) + "f" ) % _width
3630 cell_renderer.set_property('text', _width) 3682 cell_renderer.set_property('text', _width)
3631 elif column is self.__height_column: 3683 elif column is self.__height_column:
3632 _measure = tree_model[_row_path][0] 3684 _measure = tree_model[_row_path][0]
3633 _height = _measure.height 3685 _height = _measure.height
3634 if isinstance(_height, float): 3686 if isinstance(_height, float):
3635 _DD = self.__budget.getDecimals("DD") 3687 _DD = self.__budget.getDecimals("DD")
3636 _height = ("%." + str(abs(_DD)) + "f" ) % _height 3688 _height = ("%." + text(abs(_DD)) + "f" ) % _height
3637 cell_renderer.set_property('text', _height) 3689 cell_renderer.set_property('text', _height)
3638 elif column is self.__formula_column: 3690 elif column is self.__formula_column:
3639 _measure = tree_model[_row_path][0] 3691 _measure = tree_model[_row_path][0]
3640 _formula = _measure.formula 3692 _formula = _measure.formula
3641 cell_renderer.set_property('text', _formula) 3693 cell_renderer.set_property('text', _formula)
3646 if _type == 1 or _type == 2: 3698 if _type == 1 or _type == 2:
3647 _parcial = "" 3699 _parcial = ""
3648 else: 3700 else:
3649 if isinstance(_parcial, float): 3701 if isinstance(_parcial, float):
3650 _DS = self.__budget.getDecimals("DS") 3702 _DS = self.__budget.getDecimals("DS")
3651 _parcial = ("%." + str(abs(_DS)) + "f" ) % _parcial 3703 _parcial = ("%." + text(abs(_DS)) + "f" ) % _parcial
3652 cell_renderer.set_property('text', _parcial) 3704 cell_renderer.set_property('text', _parcial)
3653 elif column is self.__subtotal_column: 3705 elif column is self.__subtotal_column:
3654 _measure_line = tree_model[_row_path][0] 3706 _measure_line = tree_model[_row_path][0]
3655 _type = _measure_line.lineType 3707 _type = _measure_line.lineType
3656 if _type == 1 or _type == 2: 3708 if _type == 1 or _type == 2:
3661 _color = globalVars.color["SUBTOTAL"] 3713 _color = globalVars.color["SUBTOTAL"]
3662 _subtotal = _measure_line.acumulated_subtotal 3714 _subtotal = _measure_line.acumulated_subtotal
3663 lcolor = [_color, _color] 3715 lcolor = [_color, _color]
3664 if isinstance(_subtotal, float): 3716 if isinstance(_subtotal, float):
3665 _DS = self.__budget.getDecimals("DS") 3717 _DS = self.__budget.getDecimals("DS")
3666 _subtotal= ("%." + str(abs(_DS)) + "f" ) % _subtotal 3718 _subtotal= ("%." + text(abs(_DS)) + "f" ) % _subtotal
3667 cell_renderer.set_property('text', _subtotal) 3719 cell_renderer.set_property('text', _subtotal)
3668 else: 3720 else:
3669 cell_renderer.set_property('text', "") 3721 cell_renderer.set_property('text', "")
3670 3722
3671 if self.__treeview.get_cursor() == (_row_path,column): 3723 if self.__treeview.get_cursor() == (_row_path,column):
3852 self.__textbuffer = _textview.get_buffer() 3904 self.__textbuffer = _textview.get_buffer()
3853 self.__textbuffer.set_text(_text) 3905 self.__textbuffer.set_text(_text)
3854 _textview.show() 3906 _textview.show()
3855 _vbox = Gtk.Grid() 3907 _vbox = Gtk.Grid()
3856 _vbox.set_orientation(Gtk.Orientation(1)) # 1 Vertical 3908 _vbox.set_orientation(Gtk.Orientation(1)) # 1 Vertical
3857 self.__label = Gtk.Label(utils.mapping(_("Description text of the "\ 3909 _tuni = _("Description text of the record $1")
3858 "record $1"), (str(self.__budget.getCode( 3910 _ucode = self.__budget.getCode(self.__active_path_record)
3859 self.__active_path_record)),))) 3911 _uni = utils.mapping(_tuni, (_ucode,))
3912 self.__label = Gtk.Label(_uni)
3860 self.__label.set_alignment(0, 0) 3913 self.__label.set_alignment(0, 0)
3861 self.__label.show() 3914 self.__label.show()
3862 _vbox.add(self.__label) 3915 _vbox.add(self.__label)
3863 _vbox.add(_textview) 3916 _vbox.add(_textview)
3864 _vbox.show() 3917 _vbox.show()
3873 Set the new path code to show its description text. 3926 Set the new path code to show its description text.
3874 """ 3927 """
3875 _budget = self.__budget 3928 _budget = self.__budget
3876 self.__active_path_record = path_record 3929 self.__active_path_record = path_record
3877 _code = _budget.getCode(self.__active_path_record) 3930 _code = _budget.getCode(self.__active_path_record)
3878 self.__label.set_text(utils.mapping(_("Description text of the record "\ 3931 _tuni = _("Description text of the record $1")
3879 "$1"), (_code.decode("utf8"),))) 3932 _uni = utils.mapping(_tuni, (_code,))
3933 self.__label.set_text(_uni)
3880 _text = _budget.getRecord(_code).text 3934 _text = _budget.getRecord(_code).text
3881 self.__textbuffer.set_text(_text) 3935 self.__textbuffer.set_text(_text)
3882 3936
3883 def runMessage(self, message, pane_path, arg=None): 3937 def runMessage(self, message, pane_path, arg=None):
3884 """runMessage(message, pane_path, arg=None) 3938 """runMessage(message, pane_path, arg=None)
4027 self.__pane_path = pane_path 4081 self.__pane_path = pane_path
4028 self.__active_path_record = path_record 4082 self.__active_path_record = path_record
4029 _budget = budget 4083 _budget = budget
4030 _main_box = Gtk.Grid() 4084 _main_box = Gtk.Grid()
4031 _main_box.set_orientation(Gtk.Orientation(1)) # 1 Vertical 4085 _main_box.set_orientation(Gtk.Orientation(1)) # 1 Vertical
4032 self.__label = Gtk.Label(utils.mapping(_("Sheet of Conditions of the "\ 4086 _tuni = _("Sheet of Conditions of the record $1")
4033 "record $1"), (self.__budget.getCode( 4087 _ucode = self.__budget.getCode(self.__active_path_record)
4034 self.__active_path_record),))) 4088 _uni = utils.mapping(_tuni, (_ucode,))
4089 self.__label = Gtk.Label(_uni)
4035 self.__label.set_xalign(0) 4090 self.__label.set_xalign(0)
4036 self.__label.set_yalign(0) 4091 self.__label.set_yalign(0)
4037 self.__label.show() 4092 self.__label.show()
4038 _frame = Gtk.Frame() 4093 _frame = Gtk.Frame()
4039 _frame.set_shadow_type(Gtk.ShadowType(1)) # 1 In 4094 _frame.set_shadow_type(Gtk.ShadowType(1)) # 1 In
4235 self.__section_liststore.clear() 4290 self.__section_liststore.clear()
4236 self.__textbuffer.set_text("") 4291 self.__textbuffer.set_text("")
4237 _budget = self.__budget 4292 _budget = self.__budget
4238 self.__active_path_record = path_record 4293 self.__active_path_record = path_record
4239 _code = _budget.getCode(self.__active_path_record) 4294 _code = _budget.getCode(self.__active_path_record)
4240 self.__label.set_text(utils.mapping(_("Sheet2 of Conditions of the "\ 4295 _tuni = _("Sheet2 of Conditions of the record $1")
4241 "record $1"), (_code,))) 4296 _uni = utils.mapping(_tuni, (_code,))
4297 self.__label.set_text(_uni)
4242 self._setFields() 4298 self._setFields()
4243 4299
4244 def runMessage(self, message, pane_path, arg=None): 4300 def runMessage(self, message, pane_path, arg=None):
4245 """runMessage(message, pane_path, arg=None) 4301 """runMessage(message, pane_path, arg=None)
4246 4302
4695 if path_record is None: 4751 if path_record is None:
4696 path_record = (0,) 4752 path_record = (0,)
4697 self.__selection = None 4753 self.__selection = None
4698 # Seting init args 4754 # Seting init args
4699 if not isinstance(budget, base.Budget): 4755 if not isinstance(budget, base.Budget):
4700 raise ValueError( _("Argument must be a Budget object") ) 4756 _tuni = _("Argument must be a Budget object")
4757 _str = _tuni.encode("utf-8")
4758 raise ValueError(_str)
4701 self.__budget = budget 4759 self.__budget = budget
4702 self.__wr_page = wr_page 4760 self.__wr_page = wr_page
4703 self.__pane_path = pane_path 4761 self.__pane_path = pane_path
4704 self.__active_path_record = path_record 4762 self.__active_path_record = path_record
4705 # main widget 4763 # main widget
4834 The selection changes the company/office in the option treeview 4892 The selection changes the company/office in the option treeview
4835 """ 4893 """
4836 if len(path) == 1: 4894 if len(path) == 1:
4837 # The selection is a company 4895 # The selection is a company
4838 _company_key = self.__treestore[path][0] 4896 _company_key = self.__treestore[path][0]
4897 _company_key = textinp2(_company_key)
4839 _company = self.__budget.getCompany(_company_key) 4898 _company = self.__budget.getCompany(_company_key)
4840 _selection = "company" 4899 _selection = "company"
4841 _values = _company.values 4900 _values = _company.values
4842 else: 4901 else:
4843 # The selection is a office 4902 # The selection is a office
4844 _company_key = self.__treestore[path[:1]][0] 4903 _company_key = self.__treestore[path[:1]][0]
4904 _company_key = textinp2(_company_key)
4845 _company = self.__budget.getCompany(_company_key) 4905 _company = self.__budget.getCompany(_company_key)
4846 _selection = "office" 4906 _selection = "office"
4847 _office = _company.offices[path[1]] 4907 _office = _company.offices[path[1]]
4848 _values = _office.values 4908 _values = _office.values
4849 if not self.__selection == _selection: 4909 if not self.__selection == _selection:
4875 """ 4935 """
4876 _budget = self.__budget 4936 _budget = self.__budget
4877 if message == "change_active": 4937 if message == "change_active":
4878 if _budget.hasPath(arg): 4938 if _budget.hasPath(arg):
4879 _path_record = arg 4939 _path_record = arg
4880 self._showMessageRecord( _path_record) 4940 self._showMessageRecord(_path_record)
4881 pass 4941 pass
4882 elif message == "clear": 4942 elif message == "clear":
4883 self._clear() 4943 self._clear()
4884 4944
4885 def _colorCell(self, column, cell_renderer, tree_model, iter, lcolor): 4945 def _colorCell(self, column, cell_renderer, tree_model, iter, lcolor):
4908 and text for index and amount columns. 4968 and text for index and amount columns.
4909 """ 4969 """
4910 _row_path = tree_model.get_path(iter) 4970 _row_path = tree_model.get_path(iter)
4911 _number = _row_path[-1] 4971 _number = _row_path[-1]
4912 if column is self.__index_column: 4972 if column is self.__index_column:
4913 cell_renderer.set_property('text', str(_number + 1)) 4973 cell_renderer.set_property('text', text(_number + 1))
4914 self.__index_column.get_cells()[1].set_property( 4974 self.__index_column.get_cells()[1].set_property(
4915 'cell-background', lcolor[_number % 2]) 4975 'cell-background', lcolor[_number % 2])
4916 if self.__treeview.get_cursor() == (_row_path,column): 4976 if self.__treeview.get_cursor() == (_row_path,column):
4917 cell_renderer.set_property('cell-background', 4977 cell_renderer.set_property('cell-background',
4918 globalVars.color["ACTIVE"]) 4978 globalVars.color["ACTIVE"])
5269 if isinstance(_option, tuple) and len(_option) == 4: 5329 if isinstance(_option, tuple) and len(_option) == 4:
5270 _option_key = _option[0] 5330 _option_key = _option[0]
5271 _option_name = _option[1] 5331 _option_name = _option[1]
5272 _option_type = _option[2] 5332 _option_type = _option[2]
5273 _option_description = _option[3] 5333 _option_description = _option[3]
5274 #-# str and unicode 5334 if isinstance(_option_key, text_type) and \
5275 if (isinstance(_option_key, str) or \ 5335 isinstance(_option_name, text_type) and \
5276 isinstance(_option_key, unicode)) and \
5277 (isinstance(_option_name, str) or\
5278 isinstance(_option_name, unicode))and \
5279 _option_type in self.__option_types.keys(): 5336 _option_type in self.__option_types.keys():
5280 self.__liststore.append([_option_key, _option_name, "", 5337 self.__liststore.append([_option_key, _option_name, "",
5281 _option_type, _option_description]) 5338 _option_type, _option_description])
5282 self.__option_dict[_option_key] = [_option_name, "", 5339 self.__option_dict[_option_key] = [_option_name, "",
5283 _option_type, _option_description] 5340 _option_type, _option_description]
5295 values: dictionary {option : value} 5352 values: dictionary {option : value}
5296 5353
5297 Sets the Options values 5354 Sets the Options values
5298 """ 5355 """
5299 if isinstance(values, dict): 5356 if isinstance(values, dict):
5300 for _option, _value in values.iteritems(): 5357 for (_option, _value) in values.items():
5301 if _option in self.__option_dict: 5358 if _option in self.__option_dict:
5302 _type = self.__option_dict[_option][2] 5359 _type = self.__option_dict[_option][2]
5303 if _type == "boolean": 5360 if _type == "boolean":
5304 if isinstance(_value, bool): 5361 if isinstance(_value, bool):
5305 _num = self.__option_list.index(_option) 5362 _num = self.__option_list.index(_option)
5317 _num = self.__option_list.index(_option) 5374 _num = self.__option_list.index(_option)
5318 _iter = self.__liststore.get_iter((_num,)) 5375 _iter = self.__liststore.get_iter((_num,))
5319 self.__liststore.set_value(_iter, 2, _value) 5376 self.__liststore.set_value(_iter, 2, _value)
5320 self.__option_dict[_option][1] = _value 5377 self.__option_dict[_option][1] = _value
5321 elif _type == "string": 5378 elif _type == "string":
5322 if isinstance(_value, str): 5379 if isinstance(_value, text_type):
5323 _num = self.__option_list.index(_option) 5380 _num = self.__option_list.index(_option)
5324 _iter = self.__liststore.get_iter((_num,)) 5381 _iter = self.__liststore.get_iter((_num,))
5325 self.__liststore.set_value(_iter, 2, _value) 5382 self.__liststore.set_value(_iter, 2, _value)
5326 self.__option_dict[_option][1] = _value 5383 self.__option_dict[_option][1] = _value
5327 else: 5384 else:
5338 self.__liststore.set_value(_iter, 2, _str_value) 5395 self.__liststore.set_value(_iter, 2, _str_value)
5339 self.__option_dict[_option][1] = _value 5396 self.__option_dict[_option][1] = _value
5340 else: 5397 else:
5341 print(_("Icorrect type, must be list") ) 5398 print(_("Icorrect type, must be list") )
5342 elif _type == "color": 5399 elif _type == "color":
5343 if isinstance(_value, str): 5400 if isinstance(_value, text_type):
5344 if Gdk.RGBA().parse(_value): 5401 if Gdk.RGBA().parse(_value):
5345 print(_("Icorrect type, must be a parseable " \ 5402 print(_("Icorrect type, must be a parseable " \
5346 "color") ) 5403 "color") )
5347 else: 5404 else:
5348 _num = self.__option_list.index(_option) 5405 _num = self.__option_list.index(_option)