X-Git-Url: http://git.maemo.org/git/?p=gonvert;a=blobdiff_plain;f=src%2Fgonvert_glade.py;h=b62d092273bb3142fa85cc6570fa96db3a0b1517;hp=ec9469b840a9252e8a5f9294051099c895860c25;hb=92f894abff6a099de8ad89bf2065238b1eeb0623;hpb=e0ca20695672d7850ae113e7423adba2845bcc49 diff --git a/src/gonvert_glade.py b/src/gonvert_glade.py index ec9469b..b62d092 100755 --- a/src/gonvert_glade.py +++ b/src/gonvert_glade.py @@ -1,20 +1,8 @@ #!/usr/bin/env python # -*- coding: UTF8 -*- -""" -@todo Look into using two columns for displaying the value, split by the -decimal place. The left one would be right aligned and the right would be left -aligned (only if not in exponential notation -OR display everything in engineering notation - -@tood Add a unit description dialog for when hildonized - -@todo Add support for custom units - -@todo Add support for compound units -""" - import os +import math import pickle import logging @@ -51,18 +39,46 @@ def change_menu_label(widgets, labelname, newtext): item_label.set_text(newtext) +def split_number(number): + try: + fractional, integer = math.modf(number) + except TypeError: + integerDisplay = number + fractionalDisplay = "" + else: + integerDisplay = str(integer) + fractionalDisplay = str(fractional) + if "e+" in integerDisplay: + integerDisplay = number + fractionalDisplay = "" + elif "e-" in fractionalDisplay and 0.0 < integer: + integerDisplay = number + fractionalDisplay = "" + elif "e-" in fractionalDisplay: + integerDisplay = "" + fractionalDisplay = number + else: + integerDisplay = integerDisplay.split(".", 1)[0] + "." + fractionalDisplay = fractionalDisplay.rsplit(".", 1)[-1] + + return integerDisplay, fractionalDisplay + + class Gonvert(object): _glade_files = [ os.path.join(os.path.dirname(__file__), "gonvert.glade"), os.path.join(os.path.dirname(__file__), "../data/gonvert.glade"), os.path.join(os.path.dirname(__file__), "../lib/gonvert.glade"), + '/usr/share/gonvert/gonvert.glade', '/usr/lib/gonvert/gonvert.glade', ] UNITS_NAME_IDX = 0 UNITS_VALUE_IDX = 1 UNITS_SYMBOL_IDX = 2 + UNITS_INTEGER_IDX = 3 + UNITS_FRACTION_IDX = 4 def __init__(self): self._unitDataInCategory = None @@ -96,15 +112,10 @@ class Gonvert(object): change_menu_label(widgets, 'fileMenuItem', _('File')) change_menu_label(widgets, 'exitMenuItem', _('Exit')) - change_menu_label(widgets, 'toolsMenuItem', _('Tools')) - change_menu_label(widgets, 'clearSelectionMenuItem', _('Clear selections')) change_menu_label(widgets, 'helpMenuItem', _('Help')) change_menu_label(widgets, 'aboutMenuItem', _('About')) change_menu_label(widgets, 'findButton', _('Find')) - self._shortlistcheck = widgets.get_widget('shortlistcheck') - self._toggleShortList = widgets.get_widget('toggleShortList') - self._categorySelectionButton = widgets.get_widget("categorySelectionButton") self._categoryView = widgets.get_widget('categoryView') @@ -128,33 +139,44 @@ class Gonvert(object): self._findLabel = widgets.get_widget('findLabel') self._findButton = widgets.get_widget('findButton') - #insert a self._categoryColumnumn into the units list even though the heading will not be seen - renderer = gtk.CellRendererText() - renderer.set_property("ellipsize", pango.ELLIPSIZE_END) - renderer.set_property("width-chars", len("grams per cubic cm plus some")) - hildonize.set_cell_thumb_selectable(renderer) - self._unitNameColumn = gtk.TreeViewColumn(_('Name'), renderer) - self._unitNameColumn.set_property('resizable', 1) - self._unitNameColumn.add_attribute(renderer, 'text', self.UNITS_NAME_IDX) + self._unitsNameRenderer = gtk.CellRendererText() + self._unitsNameRenderer.set_property("ellipsize", pango.ELLIPSIZE_END) + self._unitsNameRenderer.set_property("scale", 0.75) + self._unitsNameRenderer.set_property("width-chars", 5) + self._unitNameColumn = gtk.TreeViewColumn(_('Name'), self._unitsNameRenderer) + self._unitNameColumn.set_property('resizable', True) + self._unitNameColumn.add_attribute(self._unitsNameRenderer, 'text', self.UNITS_NAME_IDX) self._unitNameColumn.set_clickable(True) self._unitNameColumn.connect("clicked", self._on_click_unit_column) self._unitsView.append_column(self._unitNameColumn) renderer = gtk.CellRendererText() + renderer.set_property("xalign", 1.0) + renderer.set_property("alignment", pango.ALIGN_RIGHT) hildonize.set_cell_thumb_selectable(renderer) - self._unitValueColumn = gtk.TreeViewColumn(_('Value'), renderer) - self._unitValueColumn.set_property('resizable', 1) - self._unitValueColumn.add_attribute(renderer, 'text', self.UNITS_VALUE_IDX) - self._unitValueColumn.set_clickable(True) - self._unitValueColumn.connect("clicked", self._on_click_unit_column) - self._unitsView.append_column(self._unitValueColumn) + self._unitIntegerColumn = gtk.TreeViewColumn(_('Value'), renderer) + self._unitIntegerColumn.set_property('resizable', True) + self._unitIntegerColumn.add_attribute(renderer, 'text', self.UNITS_INTEGER_IDX) + self._unitIntegerColumn.set_clickable(True) + self._unitIntegerColumn.connect("clicked", self._on_click_unit_column) + self._unitsView.append_column(self._unitIntegerColumn) + + renderer = gtk.CellRendererText() + renderer.set_property("xalign", 0.0) + renderer.set_property("alignment", pango.ALIGN_LEFT) + renderer.set_property("scale", 0.75) + self._unitFractionalColumn = gtk.TreeViewColumn(_(''), renderer) + self._unitFractionalColumn.set_property('resizable', True) + self._unitFractionalColumn.add_attribute(renderer, 'text', self.UNITS_FRACTION_IDX) + self._unitFractionalColumn.set_clickable(True) + self._unitFractionalColumn.connect("clicked", self._on_click_unit_column) + self._unitsView.append_column(self._unitFractionalColumn) renderer = gtk.CellRendererText() renderer.set_property("ellipsize", pango.ELLIPSIZE_END) - renderer.set_property("width-chars", len("G ohm plus some")) - hildonize.set_cell_thumb_selectable(renderer) + #renderer.set_property("scale", 0.5) self._unitSymbolColumn = gtk.TreeViewColumn(_('Units'), renderer) - self._unitSymbolColumn.set_property('resizable', 1) + self._unitSymbolColumn.set_property('resizable', True) self._unitSymbolColumn.add_attribute(renderer, 'text', self.UNITS_SYMBOL_IDX) self._unitSymbolColumn.set_clickable(True) self._unitSymbolColumn.connect("clicked", self._on_click_unit_column) @@ -164,6 +186,8 @@ class Gonvert(object): gobject.TYPE_STRING, # UNITS_NAME_IDX gobject.TYPE_STRING, # UNITS_VALUE_IDX gobject.TYPE_STRING, # UNITS_SYMBOL_IDX + gobject.TYPE_STRING, # UNITS_INTEGER_IDX + gobject.TYPE_STRING, # UNITS_FRACTION_IDX ) self._sortedUnitModel = gtk.TreeModelSort(self._unitModel) columns = self._get_column_sort_stuff() @@ -198,13 +222,10 @@ class Gonvert(object): self._findEntry.connect("activate", self._on_find_activate) self._findEntry.connect("changed", self._on_findEntry_changed) self._previousUnitValue.connect("changed", self._on_previous_unit_value_changed) - self._shortlistcheck.connect("toggled", self._on_shortlist_changed) self._unitValue.connect("changed", self._on_unit_value_changed) self._unitsView.connect("cursor-changed", self._on_click_unit) if hildonize.GTK_MENU_USED: widgets.get_widget("aboutMenuItem").connect("activate", self._on_about_clicked) - widgets.get_widget("clearSelectionMenuItem").connect("activate", self._on_user_clear_selections) - widgets.get_widget("editShortListMenuItem").connect("activate", self._on_edit_shortlist) widgets.get_widget("exitMenuItem").connect("activate", self._on_user_exit) for scrollingWidgetName in ( @@ -277,7 +298,7 @@ class Gonvert(object): except ValueError: _moduleLogger.warn("Unknown category: %s" % selectedCategoryName) - self._categorySelectionButton.set_label(selectedCategoryName) + self._categorySelectionButton.get_child().set_markup("%s" % selectedCategoryName) self._categoryView.set_cursor(categoryIndex, self._categoryColumn, False) self._categoryView.grab_focus() @@ -340,7 +361,7 @@ class Gonvert(object): #check if next find is in a new category (prevent category changes when unnecessary searchCategoryName = self._find_result[self._findIndex][0] if self._selectedCategoryName != searchCategoryName: - self._categorySelectionButton.set_label(searchCategoryName) + self._categorySelectionButton.get_child().set_markup("%s" % searchCategoryName) self._categoryView.set_cursor( self._find_result[self._findIndex][2], self._categoryColumn, False ) @@ -394,32 +415,33 @@ class Gonvert(object): self._findEntry.grab_focus() def _unit_model_cmp(self, sortedModel, leftItr, rightItr): - leftUnitText = self._unitModel.get_value(leftItr, 0) - rightUnitText = self._unitModel.get_value(rightItr, 0) + leftUnitText = self._unitModel.get_value(leftItr, self.UNITS_NAME_IDX) + rightUnitText = self._unitModel.get_value(rightItr, self.UNITS_NAME_IDX) return cmp(leftUnitText, rightUnitText) def _symbol_model_cmp(self, sortedModel, leftItr, rightItr): - leftSymbolText = self._unitModel.get_value(leftItr, 2) - rightSymbolText = self._unitModel.get_value(rightItr, 2) + leftSymbolText = self._unitModel.get_value(leftItr, self.UNITS_SYMBOL_IDX) + rightSymbolText = self._unitModel.get_value(rightItr, self.UNITS_SYMBOL_IDX) return cmp(leftSymbolText, rightSymbolText) def _value_model_cmp(self, sortedModel, leftItr, rightItr): #special sorting exceptions for ascii values (instead of float values) if self._selectedCategoryName == "Computer Numbers": - leftValue = self._unitModel.get_value(leftItr, 1) - rightValue = self._unitModel.get_value(rightItr, 1) + leftValue = self._unitModel.get_value(leftItr, self.UNITS_VALUE_IDX) + rightValue = self._unitModel.get_value(rightItr, self.UNITS_VALUE_IDX) else: - leftValueText = self._unitModel.get_value(leftItr, 1) + leftValueText = self._unitModel.get_value(leftItr, self.UNITS_VALUE_IDX) leftValue = float(leftValueText) if leftValueText else 0.0 - rightValueText = self._unitModel.get_value(rightItr, 1) + rightValueText = self._unitModel.get_value(rightItr, self.UNITS_VALUE_IDX) rightValue = float(rightValueText) if rightValueText else 0.0 return cmp(leftValue, rightValue) def _get_column_sort_stuff(self): columns = ( (self._unitNameColumn, "_unit_sort_direction", self._unit_model_cmp), - (self._unitValueColumn, "_value_sort_direction", self._value_model_cmp), + (self._unitIntegerColumn, "_value_sort_direction", self._value_model_cmp), + (self._unitFractionalColumn, "_value_sort_direction", self._value_model_cmp), (self._unitSymbolColumn, "_units_sort_direction", self._symbol_model_cmp), ) return columns @@ -430,10 +452,13 @@ class Gonvert(object): #Fill up the units descriptions and clear the value cells self._clear_visible_unit_data() + nameLength = 0 for key in unit_data.get_units(self._selectedCategoryName): - iter = self._unitModel.append() - self._unitModel.set(iter, 0, key, 1, '', 2, self._unitDataInCategory[key][1]) + row = key, '0.0', self._unitDataInCategory[key][1], '0.', '0' + self._unitModel.append(row) + nameLength = max(nameLength, len(key)) self._sortedUnitModel.sort_column_changed() + self._unitsNameRenderer.set_property("width-chars", int(nameLength * 0.75)) self._select_default_unit() @@ -495,26 +520,6 @@ class Gonvert(object): value = float(userEntry) return value - def _on_shortlist_changed(self, *args): - try: - raise NotImplementedError("%s" % self._shortlistcheck.get_active()) - except Exception: - _moduleLogger.exception("_on_shortlist_changed") - - def _on_edit_shortlist(self, *args): - try: - raise NotImplementedError("%s" % self._toggleShortList.get_active()) - except Exception: - _moduleLogger.exception("_on_edit_shortlist") - - def _on_user_clear_selections(self, *args): - try: - selectionsDatPath = "/".join((constants._data_path_, "selections.dat")) - os.remove(selectionsDatPath) - self._defaultUnitForCategory = {} - except Exception: - _moduleLogger.exception("_on_user_clear_selections") - def _on_key_press(self, widget, event, *args): """ @note Hildon specific @@ -625,7 +630,7 @@ class Gonvert(object): def _on_click_unit(self, *args): try: selected, iter = self._unitsView.get_selection().get_selected() - selected_unit = selected.get_value(iter, 0) + selected_unit = selected.get_value(iter, self.UNITS_NAME_IDX) unit_spec = self._unitDataInCategory[selected_unit] showSymbol = False @@ -638,7 +643,7 @@ class Gonvert(object): showSymbol = True self._unitName.set_text(selected_unit) - self._unitValue.set_text(selected.get_value(iter, 1)) + self._unitValue.set_text(selected.get_value(iter, self.UNITS_VALUE_IDX)) buffer = self._unitDescription.get_buffer() buffer.set_text(unit_spec[2]) self._unitSymbol.set_text(unit_spec[1]) # put units into label text @@ -684,13 +689,22 @@ class Gonvert(object): #point to the first row for row in self._unitModel: - func, arg = self._unitDataInCategory[row[0]][0] - row[1] = str(func.from_base(base, arg)) + func, arg = self._unitDataInCategory[row[self.UNITS_NAME_IDX]][0] + newValue = func.from_base(base, arg) + + newValueDisplay = str(newValue) + integerDisplay, fractionalDisplay = split_number(newValue) + + row[self.UNITS_VALUE_IDX] = newValueDisplay + row[self.UNITS_INTEGER_IDX] = integerDisplay + row[self.UNITS_FRACTION_IDX] = fractionalDisplay # Update the secondary unit entry if self._previousUnitName.get_text() != '': func, arg = self._unitDataInCategory[self._previousUnitName.get_text()][0] self._previousUnitValue.set_text(str(func.from_base(base, arg, ))) + + self._sortedUnitModel.sort_column_changed() except Exception: _moduleLogger.exception("_on_unit_value_changed") @@ -708,12 +722,21 @@ class Gonvert(object): #point to the first row for row in self._unitModel: - func, arg = self._unitDataInCategory[row[0]][0] - row[1] = str(func.from_base(base, arg)) + func, arg = self._unitDataInCategory[row[self.UNITS_NAME_IDX]][0] + newValue = func.from_base(base, arg) + + newValueDisplay = str(newValue) + integerDisplay, fractionalDisplay = split_number(newValue) + + row[self.UNITS_VALUE_IDX] = newValueDisplay + row[self.UNITS_INTEGER_IDX] = integerDisplay + row[self.UNITS_FRACTION_IDX] = fractionalDisplay # Update the primary unit entry func, arg = self._unitDataInCategory[self._unitName.get_text()][0] self._unitValue.set_text(str(func.from_base(base, arg, ))) + + self._sortedUnitModel.sort_column_changed() except Exception: _moduleLogger.exception("_on_previous_unit_value_changed")