X-Git-Url: http://git.maemo.org/git/?p=gonvert;a=blobdiff_plain;f=src%2Fgonvert_glade.py;h=e42b1e49264199a71d6ff88f555e75f944051ae8;hp=142bbfdd2bb091b54a81d11cca9ea7f27eba70c9;hb=1e2010632954ab734663bbc674b621b33c1d4374;hpb=8a54d3dc83f2e0ebb40428769121107fbe904f8b diff --git a/src/gonvert_glade.py b/src/gonvert_glade.py index 142bbfd..e42b1e4 100755 --- a/src/gonvert_glade.py +++ b/src/gonvert_glade.py @@ -1,18 +1,7 @@ #!/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 -""" +from __future__ import with_statement import os import math @@ -27,6 +16,7 @@ import gtk.gdk import constants import hildonize +import gtk_toolbox import unit_data try: @@ -39,8 +29,6 @@ else: _moduleLogger = logging.getLogger("gonvert_glade") -PROFILE_STARTUP = False -FORCE_HILDON_LIKE = False if gettext is not None: gettext.bindtextdomain('gonvert', '/usr/share/locale') @@ -98,7 +86,9 @@ class Gonvert(object): self._unit_sort_direction = False self._value_sort_direction = False self._units_sort_direction = False + self.__isPortrait = False self._isFullScreen = False + self._clipboard = gtk.clipboard_get() self._find_result = [] # empty find result list self._findIndex = 0 # default to find result number zero @@ -127,7 +117,6 @@ class Gonvert(object): change_menu_label(widgets, 'exitMenuItem', _('Exit')) change_menu_label(widgets, 'helpMenuItem', _('Help')) change_menu_label(widgets, 'aboutMenuItem', _('About')) - change_menu_label(widgets, 'findButton', _('Find')) self._categorySelectionButton = widgets.get_widget("categorySelectionButton") self._categoryView = widgets.get_widget('categoryView') @@ -151,14 +140,16 @@ class Gonvert(object): self._findEntry = widgets.get_widget('findEntry') 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")) - self._unitNameColumn = gtk.TreeViewColumn(_('Name'), renderer) + self._closeSearchButton = widgets.get_widget('closeSearchButton') + + self._unitsNameRenderer = gtk.CellRendererText() + self._unitsNameRenderer.set_property("scale", 0.75) + if constants.FORCE_HILDON_LIKE: + self._unitsNameRenderer.set_property("ellipsize", pango.ELLIPSIZE_END) + self._unitsNameRenderer.set_property("width-chars", 5) + self._unitNameColumn = gtk.TreeViewColumn(_('Name'), self._unitsNameRenderer) self._unitNameColumn.set_property('resizable', True) - self._unitNameColumn.add_attribute(renderer, 'text', self.UNITS_NAME_IDX) + 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) @@ -177,6 +168,7 @@ class Gonvert(object): 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) @@ -186,7 +178,7 @@ class Gonvert(object): renderer = gtk.CellRendererText() renderer.set_property("ellipsize", pango.ELLIPSIZE_END) - renderer.set_property("width-chars", len("G ohm plus some")) + #renderer.set_property("scale", 0.5) self._unitSymbolColumn = gtk.TreeViewColumn(_('Units'), renderer) self._unitSymbolColumn.set_property('resizable', True) self._unitSymbolColumn.add_attribute(renderer, 'text', self.UNITS_SYMBOL_IDX) @@ -225,7 +217,7 @@ class Gonvert(object): self._categoryModel.append(row) #--------- connections to GUI ---------------- - self._mainWindow.connect("delete-event", self._on_user_exit) + self._mainWindow.connect("destroy", 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) @@ -233,11 +225,15 @@ class Gonvert(object): 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._closeSearchButton.connect("clicked", self._on_toggle_search) self._previousUnitValue.connect("changed", self._on_previous_unit_value_changed) self._unitValue.connect("changed", self._on_unit_value_changed) + self._unitValue.connect("key-press-event", self._on_browse_key_press) self._unitsView.connect("cursor-changed", self._on_click_unit) + self._unitsView.connect("key-press-event", self._on_browse_key_press) if hildonize.GTK_MENU_USED: widgets.get_widget("aboutMenuItem").connect("activate", self._on_about_clicked) + widgets.get_widget("searchMenuItem").connect("activate", self._on_toggle_search) widgets.get_widget("exitMenuItem").connect("activate", self._on_user_exit) for scrollingWidgetName in ( @@ -245,9 +241,11 @@ class Gonvert(object): ): scrollingWidget = widgets.get_widget(scrollingWidgetName) assert scrollingWidget is not None, scrollingWidgetName - hildonize.hildonize_scrollwindow_with_viewport(scrollingWidget) + scroller = hildonize.hildonize_scrollwindow(scrollingWidget) + scroller.show_all() - if hildonize.IS_HILDON_SUPPORTED or FORCE_HILDON_LIKE: + # Simplify the UI + if hildonize.IS_HILDON_SUPPORTED or constants.FORCE_HILDON_LIKE: self._categoryView.get_parent().hide() self._unitsView.set_headers_visible(False) self._previousUnitName.get_parent().hide() @@ -255,18 +253,41 @@ class Gonvert(object): else: self._categorySelectionButton.hide() - replacementButtons = [] menu = hildonize.hildonize_menu( self._mainWindow, widgets.get_widget("mainMenuBar"), - replacementButtons ) + if not hildonize.GTK_MENU_USED: + button = gtk.Button("Search") + button.connect("clicked", self._on_toggle_search) + menu.append(button) + + button = hildonize.hildon.GtkRadioButton(gtk.HILDON_SIZE_AUTO, None) + button.set_label("Name") + menu.add_filter(button) + button.connect("clicked", self._on_click_menu_filter, self._unitNameColumn) + button.set_mode(False) + filterGroup = button + + button = hildonize.hildon.GtkRadioButton(gtk.HILDON_SIZE_AUTO, filterGroup) + button.set_label("Value") + menu.add_filter(button) + button.connect("clicked", self._on_click_menu_filter, self._unitIntegerColumn) + button.set_mode(False) + + button = hildonize.hildon.GtkRadioButton(gtk.HILDON_SIZE_AUTO, filterGroup) + button.set_label("Unit") + menu.add_filter(button) + button.connect("clicked", self._on_click_menu_filter, self._unitSymbolColumn) + button.set_mode(False) + + menu.show_all() if not hildonize.IS_HILDON_SUPPORTED: _moduleLogger.info("No hildonization support") - hildonize.set_application_title( - self._mainWindow, "%s - Unit Conversion Utility" % constants.__pretty_app_name__ + hildonize.set_application_name( + "%s - Unit Conversion Utility" % constants.__pretty_app_name__ ) iconPath = pixmapspath + '/gonvert.png' if os.path.exists(iconPath): @@ -288,6 +309,24 @@ class Gonvert(object): pass else: self._mainWindow.resize(a, b) + try: + isFullscreen = saved_window["isFullscreen"] + except KeyError: + pass + else: + if isFullscreen: + self._mainWindow.fullscreen() + try: + isPortrait = saved_window["isPortrait"] + except KeyError: + pass + else: + if isPortrait ^ self.__isPortrait: + if isPortrait: + orientation = gtk.ORIENTATION_VERTICAL + else: + orientation = gtk.ORIENTATION_HORIZONTAL + self.set_orientation(orientation) #Restore selections from previously saved settings if it exists and is valid. categoryIndex = 0 @@ -339,11 +378,24 @@ class Gonvert(object): #Get last size of app and save it window_settings = { - 'size': self._mainWindow.get_size() + 'size': self._mainWindow.get_size(), + "isFullscreen": self._isFullScreen, + "isPortrait": self.__isPortrait, } windowDatPath = "/".join((constants._data_path_, "window.dat")) pickle.dump(window_settings, open(windowDatPath, 'w')) + def _refresh_columns(self): + self._unitsView.remove_column(self._unitNameColumn) + self._unitsView.remove_column(self._unitIntegerColumn) + self._unitsView.remove_column(self._unitFractionalColumn) + self._unitsView.remove_column(self._unitSymbolColumn) + + self._unitsView.append_column(self._unitNameColumn) + self._unitsView.append_column(self._unitIntegerColumn) + self._unitsView.append_column(self._unitFractionalColumn) + self._unitsView.append_column(self._unitSymbolColumn) + def _clear_find(self): # switch to "new find" state self._find_result = [] @@ -464,11 +516,19 @@ 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): row = key, '0.0', self._unitDataInCategory[key][1], '0.', '0' self._unitModel.append(row) + nameLength = max(nameLength, len(key)) self._sortedUnitModel.sort_column_changed() + if constants.FORCE_HILDON_LIKE: + maxCatCharWidth = int(nameLength * 0.75) + maxCharWidth = int(len("nibble | hexit | quadbit") * 0.75) + charWidth = min(maxCatCharWidth, maxCharWidth) + self._unitsNameRenderer.set_property("width-chars", charWidth) + self._select_default_unit() def _clear_visible_unit_data(self): @@ -529,226 +589,268 @@ class Gonvert(object): value = float(userEntry) return value + def _select_sort_column(self, col): + #Determine which column requires sorting + columns = self._get_column_sort_stuff() + for columnIndex, (maybeCol, directionName, col_cmp) in enumerate(columns): + if col is maybeCol: + direction = getattr(self, directionName) + gtkDirection = gtk.SORT_ASCENDING if direction else gtk.SORT_DESCENDING + + # cause a sort + self._sortedUnitModel.set_sort_column_id(columnIndex, gtkDirection) + + # set the visual for sorting + col.set_sort_indicator(True) + col.set_sort_order(not direction) + + setattr(self, directionName, not direction) + break + else: + maybeCol.set_sort_indicator(False) + else: + assert False, "Unknown column: %s" % (col.get_title(), ) + + def set_orientation(self, orientation): + if orientation == gtk.ORIENTATION_VERTICAL: + hildonize.window_to_portrait(self._mainWindow) + self.__isPortrait = True + elif orientation == gtk.ORIENTATION_HORIZONTAL: + hildonize.window_to_landscape(self._mainWindow) + self.__isPortrait = False + else: + raise NotImplementedError(orientation) + + def get_orientation(self): + return gtk.ORIENTATION_VERTICAL if self.__isPortrait else gtk.ORIENTATION_HORIZONTAL + + def _toggle_rotate(self): + if self.__isPortrait: + self.set_orientation(gtk.ORIENTATION_HORIZONTAL) + else: + self.set_orientation(gtk.ORIENTATION_VERTICAL) + + @gtk_toolbox.log_exception(_moduleLogger) def _on_key_press(self, widget, event, *args): """ @note Hildon specific """ RETURN_TYPES = (gtk.keysyms.Return, gtk.keysyms.ISO_Enter, gtk.keysyms.KP_Enter) - try: - if ( - event.keyval == gtk.keysyms.F6 or - event.keyval in RETURN_TYPES and event.get_state() & gtk.gdk.CONTROL_MASK - ): - if self._isFullScreen: - self._mainWindow.unfullscreen() - else: - self._mainWindow.fullscreen() - elif event.keyval == gtk.keysyms.f and event.get_state() & gtk.gdk.CONTROL_MASK: + if ( + event.keyval == gtk.keysyms.F6 or + event.keyval in RETURN_TYPES and event.get_state() & gtk.gdk.CONTROL_MASK + ): + if self._isFullScreen: + self._mainWindow.unfullscreen() + else: + self._mainWindow.fullscreen() + elif event.keyval == gtk.keysyms.f and event.get_state() & gtk.gdk.CONTROL_MASK: + if not hildonize.GTK_MENU_USED: self._toggle_find() - elif event.keyval == gtk.keysyms.p and event.get_state() & gtk.gdk.CONTROL_MASK: - self._find_previous() - elif event.keyval == gtk.keysyms.n and event.get_state() & gtk.gdk.CONTROL_MASK: - self._find_next() - except Exception, e: - _moduleLogger.exception("_on_key_press") - + elif event.keyval == gtk.keysyms.p and event.get_state() & gtk.gdk.CONTROL_MASK: + self._find_previous() + elif event.keyval == gtk.keysyms.n and event.get_state() & gtk.gdk.CONTROL_MASK: + self._find_next() + elif event.keyval == gtk.keysyms.o and event.get_state() & gtk.gdk.CONTROL_MASK: + self._toggle_rotate() + elif ( + event.keyval in (gtk.keysyms.w, gtk.keysyms.q) and + event.get_state() & gtk.gdk.CONTROL_MASK + ): + self._mainWindow.destroy() + elif event.keyval == gtk.keysyms.l and event.get_state() & gtk.gdk.CONTROL_MASK: + with open(constants._user_logpath_, "r") as f: + logLines = f.xreadlines() + log = "".join(logLines) + self._clipboard.set_text(str(log)) + + @gtk_toolbox.log_exception(_moduleLogger) + def _on_toggle_search(self, *args): + self._toggle_find() + + @gtk_toolbox.log_exception(_moduleLogger) + def _on_browse_key_press(self, widget, event, *args): + if event.keyval == gtk.keysyms.uparrow or event.keyval == gtk.keysyms.Up: + index, column = self._unitsView.get_cursor() + newIndex = max(index[0]-1, 0) + path = (newIndex, ) + self._unitsView.set_cursor(path, column, True) + self._unitsView.scroll_to_cell(path, column, False, 0, 0) + return True # override default behavior + elif event.keyval == gtk.keysyms.downarrow or event.keyval == gtk.keysyms.Down: + index, column = self._unitsView.get_cursor() + newIndex = min(index[0]+1, len(self._unitModel)-1) + path = (newIndex, ) + self._unitsView.set_cursor(path, column, True) + self._unitsView.scroll_to_cell(path, column, False, 0, 0) + return True # override default behavior + + @gtk_toolbox.log_exception(_moduleLogger) def _on_window_state_change(self, widget, event, *args): """ @note Hildon specific """ - try: - if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN: - self._isFullScreen = True - else: - self._isFullScreen = False - except Exception, e: - _moduleLogger.exception("_on_window_state_change") + if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN: + self._isFullScreen = True + else: + self._isFullScreen = False + @gtk_toolbox.log_exception(_moduleLogger) def _on_findEntry_changed(self, *args): """ Clear out find results since the user wants to look for something new """ - try: - self._clear_find() - except Exception: - _moduleLogger.exception("_on_findEntry_changed") + self._clear_find() + @gtk_toolbox.log_exception(_moduleLogger) def _on_find_activate(self, *args): - try: - self._find_next() - self._findButton.grab_focus() - except Exception: - _moduleLogger.exception("_on_find_activate") + self._find_next() + self._findButton.grab_focus() + + @gtk_toolbox.log_exception(_moduleLogger) + def _on_click_menu_filter(self, button, col): + self._select_sort_column(col) + @gtk_toolbox.log_exception(_moduleLogger) def _on_click_unit_column(self, col): """ Sort the contents of the col when the user clicks on the title. """ - try: - #Determine which column requires sorting - columns = self._get_column_sort_stuff() - for columnIndex, (maybeCol, directionName, col_cmp) in enumerate(columns): - if col is maybeCol: - direction = getattr(self, directionName) - gtkDirection = gtk.SORT_ASCENDING if direction else gtk.SORT_DESCENDING - - # cause a sort - self._sortedUnitModel.set_sort_column_id(columnIndex, gtkDirection) - - # set the visual for sorting - col.set_sort_indicator(True) - col.set_sort_order(not direction) - - setattr(self, directionName, not direction) - break - else: - maybeCol.set_sort_indicator(False) - else: - assert False, "Unknown column: %s" % (col.get_title(), ) - except Exception: - _moduleLogger.exception("_on_click_unit_column") + self._select_sort_column(col) + @gtk_toolbox.log_exception(_moduleLogger) def _on_category_selector_clicked(self, *args): - try: - currenntIndex = unit_data.UNIT_CATEGORIES.index(self._selectedCategoryName) - newIndex = hildonize.touch_selector( - self._mainWindow, - "Categories", - unit_data.UNIT_CATEGORIES, - currenntIndex, - ) + currenntIndex = unit_data.UNIT_CATEGORIES.index(self._selectedCategoryName) + newIndex = hildonize.touch_selector( + self._mainWindow, + "Categories", + unit_data.UNIT_CATEGORIES, + currenntIndex, + ) - selectedCategoryName = unit_data.UNIT_CATEGORIES[newIndex] - self._categorySelectionButton.set_label(selectedCategoryName) - self._categoryView.set_cursor(newIndex, self._categoryColumn, False) - self._categoryView.grab_focus() - except Exception: - _moduleLogger.exception("_on_category_selector_clicked") + selectedCategoryName = unit_data.UNIT_CATEGORIES[newIndex] + self._categorySelectionButton.get_child().set_markup("%s" % selectedCategoryName) + self._switch_category(selectedCategoryName) + @gtk_toolbox.log_exception(_moduleLogger) def _on_click_category(self, *args): - try: - selected, iter = self._categoryView.get_selection().get_selected() - if iter is None: - # User is typing in an invalid string, not selecting any category - return - selectedCategory = self._categoryModel.get_value(iter, 0) - self._switch_category(selectedCategory) - except Exception: - _moduleLogger.exception("_on_click_category") + selected, iter = self._categoryView.get_selection().get_selected() + if iter is None: + # User is typing in an invalid string, not selecting any category + return + selectedCategory = self._categoryModel.get_value(iter, 0) + self._switch_category(selectedCategory) + @gtk_toolbox.log_exception(_moduleLogger) def _on_click_unit(self, *args): - try: - selected, iter = self._unitsView.get_selection().get_selected() - selected_unit = selected.get_value(iter, self.UNITS_NAME_IDX) - unit_spec = self._unitDataInCategory[selected_unit] + selected, iter = self._unitsView.get_selection().get_selected() + selected_unit = selected.get_value(iter, self.UNITS_NAME_IDX) + unit_spec = self._unitDataInCategory[selected_unit] - showSymbol = False + showSymbol = False - if self._unitName.get_text() != selected_unit: - self._previousUnitName.set_text(self._unitName.get_text()) - self._previousUnitValue.set_text(self._unitValue.get_text()) - self._previousUnitSymbol.set_text(self._unitSymbol.get_text()) - if self._unitSymbol.get_text(): - showSymbol = True - - self._unitName.set_text(selected_unit) - 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 - if unit_spec[1]: + if self._unitName.get_text() != selected_unit: + self._previousUnitName.set_text(self._unitName.get_text()) + self._previousUnitValue.set_text(self._unitValue.get_text()) + self._previousUnitSymbol.set_text(self._unitSymbol.get_text()) + if self._unitSymbol.get_text(): showSymbol = True - else: - showSymbol = False - if showSymbol: - self._unitSymbol.show() - self._previousUnitSymbol.show() + self._unitName.set_text(selected_unit) + 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 + if unit_spec[1]: + showSymbol = True + else: + showSymbol = False + + if showSymbol: + self._unitSymbol.show() + self._previousUnitSymbol.show() + else: + self._unitSymbol.hide() + self._previousUnitSymbol.hide() + + if self._unitValue.get_text() == '': + if self._selectedCategoryName == "Computer Numbers": + self._unitValue.set_text("0") else: - self._unitSymbol.hide() - self._previousUnitSymbol.hide() - - if self._unitValue.get_text() == '': - if self._selectedCategoryName == "Computer Numbers": - self._unitValue.set_text("0") - else: - self._unitValue.set_text("0.0") - - self._defaultUnitForCategory[self._selectedCategoryName] = [ - self._unitName.get_text(), self._previousUnitName.get_text() - ] - - # select the text so user can start typing right away - self._unitValue.grab_focus() - self._unitValue.select_region(0, -1) - except Exception: - _moduleLogger.exception("_on_click_unit") + self._unitValue.set_text("0.0") + self._defaultUnitForCategory[self._selectedCategoryName] = [ + self._unitName.get_text(), self._previousUnitName.get_text() + ] + + # select the text so user can start typing right away + self._unitValue.grab_focus() + self._unitValue.select_region(0, -1) + + @gtk_toolbox.log_exception(_moduleLogger) def _on_unit_value_changed(self, *args): - try: - if self._unitName.get_text() == '': - return - if not self._unitValue.is_focus(): - return - - #retrieve the conversion function and value from the selected unit - value = self._sanitize_value(self._unitValue.get_text()) - func, arg = self._unitDataInCategory[self._unitName.get_text()][0] - base = func.to_base(value, arg) - - #point to the first row - for row in self._unitModel: - 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") + if self._unitName.get_text() == '': + return + if not self._unitValue.is_focus(): + return - def _on_previous_unit_value_changed(self, *args): - try: - if self._previousUnitName.get_text() == '': - return - if not self._previousUnitValue.is_focus(): - return + #retrieve the conversion function and value from the selected unit + value = self._sanitize_value(self._unitValue.get_text()) + func, arg = self._unitDataInCategory[self._unitName.get_text()][0] + base = func.to_base(value, arg) + + #point to the first row + for row in self._unitModel: + func, arg = self._unitDataInCategory[row[self.UNITS_NAME_IDX]][0] + newValue = func.from_base(base, arg) - #retrieve the conversion function and value from the selected unit - value = self._sanitize_value(self._previousUnitValue.get_text()) + 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] - base = func.to_base(value, arg) + self._previousUnitValue.set_text(str(func.from_base(base, arg, ))) - #point to the first row - for row in self._unitModel: - func, arg = self._unitDataInCategory[row[self.UNITS_NAME_IDX]][0] - newValue = func.from_base(base, arg) + self._sortedUnitModel.sort_column_changed() + self._refresh_columns() - newValueDisplay = str(newValue) - integerDisplay, fractionalDisplay = split_number(newValue) + @gtk_toolbox.log_exception(_moduleLogger) + def _on_previous_unit_value_changed(self, *args): + if self._previousUnitName.get_text() == '': + return + if not self._previousUnitValue.is_focus(): + return - row[self.UNITS_VALUE_IDX] = newValueDisplay - row[self.UNITS_INTEGER_IDX] = integerDisplay - row[self.UNITS_FRACTION_IDX] = fractionalDisplay + #retrieve the conversion function and value from the selected unit + value = self._sanitize_value(self._previousUnitValue.get_text()) + func, arg = self._unitDataInCategory[self._previousUnitName.get_text()][0] + base = func.to_base(value, arg) - # Update the primary unit entry - func, arg = self._unitDataInCategory[self._unitName.get_text()][0] - self._unitValue.set_text(str(func.from_base(base, arg, ))) + #point to the first row + for row in self._unitModel: + func, arg = self._unitDataInCategory[row[self.UNITS_NAME_IDX]][0] + newValue = func.from_base(base, arg) - self._sortedUnitModel.sort_column_changed() - except Exception: - _moduleLogger.exception("_on_previous_unit_value_changed") + 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() + self._refresh_columns() + @gtk_toolbox.log_exception(_moduleLogger) def _on_about_clicked(self, a): dlg = gtk.AboutDialog() dlg.set_name(constants.__pretty_app_name__) @@ -756,15 +858,16 @@ class Gonvert(object): dlg.set_copyright("Copyright 2009 - GPL") dlg.set_comments("") dlg.set_website("http://unihedron.com/projects/gonvert/gonvert.php") - dlg.set_authors(["Anthony Tekatch ", "Ed Page "]) + dlg.set_authors(["Anthony Tekatch ", "Ed Page (Blame him for the most recent bugs)"]) dlg.run() dlg.destroy() + @gtk_toolbox.log_exception(_moduleLogger) def _on_user_exit(self, *args): try: self._save_settings() except Exception: - _moduleLogger.exception("_on_user_exit") + pass finally: gtk.main_quit() @@ -774,7 +877,7 @@ def run_gonvert(): if hildonize.IS_HILDON_SUPPORTED: gtk.set_application_name(constants.__pretty_app_name__) handle = Gonvert() - if not PROFILE_STARTUP: + if not constants.PROFILE_STARTUP: gtk.main()