# -*- coding: UTF8 -*-
"""
-@todo Get rid of autoconnects except for menus
-
@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
"""
import os
+import math
import pickle
import logging
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
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')
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.set_property('resizable', True)
self._unitNameColumn.add_attribute(renderer, '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._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)
+ 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)
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)
self._unitsView.append_column(self._unitSymbolColumn)
- renderer = gtk.CellRendererText()
- 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._unitModel = gtk.ListStore(
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()
self._categoryModel.append(row)
#--------- connections to GUI ----------------
- dic = {
- "on_exit_menu_activate": self._on_user_exit,
- "on_categoryView_select_row": self._on_click_category,
- "on_unitValue_changed": self._on_unit_value_changed,
- "on_previousUnitValue_changed": self._on_previous_unit_value_changed,
- "on_findButton_clicked": self._on_find_activate,
- "on_findEntry_activated": self._on_find_activate,
- "on_findEntry_changed": self._on_findEntry_changed,
- "on_aboutMenuItem_activate": self._on_about_clicked,
- "on_clearSelectionMenuItem_activate": self._on_user_clear_selections,
- "on_unitsView_cursor_changed": self._on_click_unit,
- "on_shortlistcheck_toggled": self._on_shortlist_changed,
- "on_toggleShortList_activate": self._on_edit_shortlist,
- }
- widgets.signal_autoconnect(dic)
self._mainWindow.connect("delete-event", self._on_user_exit)
self._mainWindow.connect("key-press-event", self._on_key_press)
self._mainWindow.connect("window-state-event", self._on_window_state_change)
self._categorySelectionButton.connect("clicked", self._on_category_selector_clicked)
+ self._categoryView.connect("cursor-changed", self._on_click_category)
+ self._findButton.connect("clicked", self._on_find_activate)
+ 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._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("exitMenuItem").connect("activate", self._on_user_exit)
for scrollingWidgetName in (
"unitsViewScrolledWindow",
widgets.get_widget("mainMenuBar"),
replacementButtons
)
+
if not hildonize.IS_HILDON_SUPPORTED:
_moduleLogger.info("No hildonization support")
except ValueError:
_moduleLogger.warn("Unknown category: %s" % selectedCategoryName)
- self._categorySelectionButton.set_label(selectedCategoryName)
+ self._categorySelectionButton.get_child().set_markup("<big>%s</big>" % selectedCategoryName)
self._categoryView.set_cursor(categoryIndex, self._categoryColumn, False)
self._categoryView.grab_focus()
#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("<big>%s</big>" % searchCategoryName)
self._categoryView.set_cursor(
self._find_result[self._findIndex][2], self._categoryColumn, False
)
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
#Fill up the units descriptions and clear the value cells
self._clear_visible_unit_data()
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)
self._sortedUnitModel.sort_column_changed()
self._select_default_unit()
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
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
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
#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")
#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")