X-Git-Url: http://git.maemo.org/git/?p=gonvert;a=blobdiff_plain;f=src%2Fgonvert_glade.py;h=8034d58d96b1ace03d5b4112fd891f47587e752f;hp=3eaa758d738e4f85519c942dae61b6e051603f4b;hb=3ce2cd5d0d645b0e7baae4113f1c70f11af18c02;hpb=e62498c9c596588836ea7e08c83b6b5c21a43fbb diff --git a/src/gonvert_glade.py b/src/gonvert_glade.py index 3eaa758..8034d58 100755 --- a/src/gonvert_glade.py +++ b/src/gonvert_glade.py @@ -1,26 +1,49 @@ #!/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 pickle -import string -import gettext import logging +import pango import gobject import gtk import gtk.glade import gtk.gdk import constants +import hildonize import unit_data +try: + import gettext +except ImportError: + _ = lambda x: x + gettext = None +else: + _ = gettext.gettext + _moduleLogger = logging.getLogger("gonvert_glade") +PROFILE_STARTUP = False +FORCE_HILDON_LIKE = False -gettext.bindtextdomain('gonvert', '/usr/share/locale') -gettext.textdomain('gonvert') -_ = gettext.gettext +if gettext is not None: + gettext.bindtextdomain('gonvert', '/usr/share/locale') + gettext.textdomain('gonvert') def change_menu_label(widgets, labelname, newtext): @@ -34,9 +57,14 @@ class Gonvert(object): 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 + def __init__(self): self._unitDataInCategory = None self._unit_sort_direction = False @@ -64,6 +92,8 @@ class Gonvert(object): return self._mainWindow = widgets.get_widget('mainWindow') + self._app = hildonize.get_app_class()() + self._mainWindow = hildonize.hildonize_window(self._app, self._mainWindow) change_menu_label(widgets, 'fileMenuItem', _('File')) change_menu_label(widgets, 'exitMenuItem', _('Exit')) @@ -76,6 +106,7 @@ class Gonvert(object): self._shortlistcheck = widgets.get_widget('shortlistcheck') self._toggleShortList = widgets.get_widget('toggleShortList') + self._categorySelectionButton = widgets.get_widget("categorySelectionButton") self._categoryView = widgets.get_widget('categoryView') self._unitsView = widgets.get_widget('unitsView') @@ -97,33 +128,44 @@ class Gonvert(object): self._findEntry = widgets.get_widget('findEntry') self._findLabel = widgets.get_widget('findLabel') self._findButton = widgets.get_widget('findButton') - ToolTips = gtk.Tooltips() - ToolTips.set_tip(self._findButton, _(u'Find unit (F6)')) #insert a self._categoryColumnumn into the units list even though the heading will not be seen renderer = gtk.CellRendererText() - self._unitNameColumn = gtk.TreeViewColumn(_('Unit Name'), renderer) + 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', 0) + 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() + hildonize.set_cell_thumb_selectable(renderer) self._unitValueColumn = gtk.TreeViewColumn(_('Value'), renderer) self._unitValueColumn.set_property('resizable', 1) - self._unitValueColumn.add_attribute(renderer, 'text', 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) + 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.add_attribute(renderer, 'text', 2) + 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) - self._unitModel = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING) + self._unitModel = gtk.ListStore( + gobject.TYPE_STRING, # UNITS_NAME_IDX + gobject.TYPE_STRING, # UNITS_VALUE_IDX + gobject.TYPE_STRING, # UNITS_SYMBOL_IDX + ) self._sortedUnitModel = gtk.TreeModelSort(self._unitModel) columns = self._get_column_sort_stuff() for columnIndex, (column, sortDirection, col_cmp) in enumerate(columns): @@ -144,30 +186,56 @@ class Gonvert(object): #Populate the catagories list for key in unit_data.UNIT_CATEGORIES: - iter = self._categoryModel.append() - self._categoryModel.set(iter, 0, key) + row = (key, ) + self._categoryModel.append(row) #--------- connections to GUI ---------------- - dic = { - "on_exit_menu_activate": self._on_user_exit, - "on_main_window_destroy": 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._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 ( + "unitsViewScrolledWindow", + ): + scrollingWidget = widgets.get_widget(scrollingWidgetName) + assert scrollingWidget is not None, scrollingWidgetName + hildonize.hildonize_scrollwindow_with_viewport(scrollingWidget) + + if hildonize.IS_HILDON_SUPPORTED or FORCE_HILDON_LIKE: + self._categoryView.get_parent().hide() + self._unitsView.set_headers_visible(False) + self._previousUnitName.get_parent().hide() + self._unitDescription.get_parent().get_parent().hide() + else: + self._categorySelectionButton.hide() + + replacementButtons = [] + menu = hildonize.hildonize_menu( + self._mainWindow, + widgets.get_widget("mainMenuBar"), + replacementButtons + ) - self._mainWindow.set_title('gonvert- %s - Unit Conversion Utility' % constants.__version__) + 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__ + ) iconPath = pixmapspath + '/gonvert.png' if os.path.exists(iconPath): self._mainWindow.set_icon(gtk.gdk.pixbuf_new_from_file(iconPath)) @@ -175,52 +243,44 @@ class Gonvert(object): _moduleLogger.warn("Error: Could not find gonvert icon: %s" % iconPath) self._load_settings() + self._mainWindow.show() def _load_settings(self): #Restore window size from previously saved settings if it exists and is valid. windowDatPath = "/".join((constants._data_path_, "window.dat")) if os.path.exists(windowDatPath): - #Retrieving previous window settings from ~/.gonvert/window.dat saved_window = pickle.load(open(windowDatPath, "r")) - #If the 'size' has been stored, then extract size from saved_window. - if 'size' in saved_window: + try: a, b = saved_window['size'] - self._mainWindow.resize(a, b) - else: - #Maximize if no previous size was found - #self._mainWindow.maximize() + except KeyError: pass - else: - #Maximize if no previous window.dat file was found - #self._mainWindow.maximize() - pass + else: + self._mainWindow.resize(a, b) #Restore selections from previously saved settings if it exists and is valid. - historical_catergory_found = False + categoryIndex = 0 + selectedCategoryName = unit_data.UNIT_CATEGORIES[0] selectionsDatPath = "/".join((constants._data_path_, "selections.dat")) if os.path.exists(selectionsDatPath): - #Retrieving previous selections from ~/.gonvert/selections.dat selections = pickle.load(open(selectionsDatPath, 'r')) - #Restoring previous selections. - #If the 'selected_unts' has been stored, then extract self._defaultUnitForCategory from selections. - if 'selected_units' in selections: + try: self._defaultUnitForCategory = selections['selected_units'] - #Make sure that the 'self._selectedCategoryName' has been stored. - if 'selected_category' in selections: - #Match an available category to the previously selected category. - for counter in range(len(unit_data.UNIT_CATEGORIES)): - if selections['selected_category'] == unit_data.UNIT_CATEGORIES[counter]: - # Restore the previously selected category. - self._categoryView.set_cursor(counter, self._categoryColumn, False) - self._categoryView.grab_focus() - historical_catergory_found = True - - if not historical_catergory_found: - print "Couldn't find saved category, using default." - #If historical records were not kept then default to - # put the focus on the first category - self._categoryView.set_cursor(0, self._categoryColumn, False) - self._categoryView.grab_focus() + except KeyError: + pass + + try: + selectedCategoryName = selections['selected_category'] + except KeyError: + pass + else: + try: + categoryIndex = unit_data.UNIT_CATEGORIES.index(selectedCategoryName) + except ValueError: + _moduleLogger.warn("Unknown category: %s" % selectedCategoryName) + + self._categorySelectionButton.set_label(selectedCategoryName) + self._categoryView.set_cursor(categoryIndex, self._categoryColumn, False) + self._categoryView.grab_focus() self._select_default_unit() @@ -263,7 +323,7 @@ class Gonvert(object): def _find_first(self): assert len(self._find_result) == 0 assert self._findIndex == 0 - findString = string.lower(string.strip(self._findEntry.get_text())) + findString = self._findEntry.get_text().strip().lower() if not findString: return @@ -279,7 +339,9 @@ class Gonvert(object): assert 0 < len(self._find_result) #check if next find is in a new category (prevent category changes when unnecessary - if self._selectedCategoryName != self._find_result[self._findIndex][0]: + searchCategoryName = self._find_result[self._findIndex][0] + if self._selectedCategoryName != searchCategoryName: + self._categorySelectionButton.set_label(searchCategoryName) self._categoryView.set_cursor( self._find_result[self._findIndex][2], self._categoryColumn, False ) @@ -289,18 +351,6 @@ class Gonvert(object): ) def _find_next(self): - """ - check if 'new find' or 'last find' or 'next-find' - - new-find = run the find algorithm which also selects the first found unit - = self._findIndex = 0 and self._find_result = [] - - last-find = restart from top again - = self._findIndex = len(self._find_result) - - next-find = continue to next found location - = self._findIndex = 0 and len(self._find_result)>0 - """ if len(self._find_result) == 0: self._find_first() else: @@ -319,18 +369,6 @@ class Gonvert(object): ) def _find_previous(self): - """ - check if 'new find' or 'last find' or 'next-find' - - new-find = run the find algorithm which also selects the first found unit - = self._findIndex = 0 and self._find_result = [] - - last-find = restart from top again - = self._findIndex = len(self._find_result) - - next-find = continue to next found location - = self._findIndex = 0 and len(self._find_result)>0 - """ if len(self._find_result) == 0: self._find_first() else: @@ -351,8 +389,10 @@ class Gonvert(object): def _toggle_find(self): if self._searchLayout.get_property("visible"): self._searchLayout.hide() + self._unitsView.grab_focus() else: self._searchLayout.show() + self._findEntry.grab_focus() def _unit_model_cmp(self, sortedModel, leftItr, rightItr): leftUnitText = self._unitModel.get_value(leftItr, 0) @@ -425,12 +465,18 @@ class Gonvert(object): #Restore oldest selection first. if defaultPrimary: - unitIndex = units.index(defaultPrimary) + try: + unitIndex = units.index(defaultPrimary) + except ValueError: + unitIndex = 0 self._unitsView.set_cursor(unitIndex, self._unitNameColumn, True) #Restore newest selection second. if defaultSecondary: - unitIndex = units.index(defaultSecondary) + try: + unitIndex = units.index(defaultSecondary) + except ValueError: + unitIndex = 0 self._unitsView.set_cursor(unitIndex, self._unitNameColumn, True) # select the text so user can start typing right away @@ -454,13 +500,13 @@ class Gonvert(object): try: raise NotImplementedError("%s" % self._shortlistcheck.get_active()) except Exception: - _moduleLogger.exception("") + _moduleLogger.exception("_on_shortlist_changed") def _on_edit_shortlist(self, *args): try: raise NotImplementedError("%s" % self._toggleShortList.get_active()) except Exception: - _moduleLogger.exception("") + _moduleLogger.exception("_on_edit_shortlist") def _on_user_clear_selections(self, *args): try: @@ -468,7 +514,7 @@ class Gonvert(object): os.remove(selectionsDatPath) self._defaultUnitForCategory = {} except Exception: - _moduleLogger.exception("") + _moduleLogger.exception("_on_user_clear_selections") def _on_key_press(self, widget, event, *args): """ @@ -491,7 +537,7 @@ class Gonvert(object): elif event.keyval == gtk.keysyms.n and event.get_state() & gtk.gdk.CONTROL_MASK: self._find_next() except Exception, e: - _moduleLogger.exception("") + _moduleLogger.exception("_on_key_press") def _on_window_state_change(self, widget, event, *args): """ @@ -503,7 +549,7 @@ class Gonvert(object): else: self._isFullScreen = False except Exception, e: - _moduleLogger.exception("") + _moduleLogger.exception("_on_window_state_change") def _on_findEntry_changed(self, *args): """ @@ -512,14 +558,14 @@ class Gonvert(object): try: self._clear_find() except Exception: - _moduleLogger.exception("") + _moduleLogger.exception("_on_findEntry_changed") def _on_find_activate(self, *args): try: self._find_next() self._findButton.grab_focus() except Exception: - _moduleLogger.exception("") + _moduleLogger.exception("_on_find_activate") def _on_click_unit_column(self, col): """ @@ -547,7 +593,24 @@ class Gonvert(object): else: assert False, "Unknown column: %s" % (col.get_title(), ) except Exception: - _moduleLogger.exception("") + _moduleLogger.exception("_on_click_unit_column") + + 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, + ) + + 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") def _on_click_category(self, *args): try: @@ -558,7 +621,7 @@ class Gonvert(object): selectedCategory = self._categoryModel.get_value(iter, 0) self._switch_category(selectedCategory) except Exception: - _moduleLogger.exception("") + _moduleLogger.exception("_on_click_category") def _on_click_unit(self, *args): try: @@ -566,16 +629,31 @@ class Gonvert(object): selected_unit = selected.get_value(iter, 0) unit_spec = self._unitDataInCategory[selected_unit] + 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()) + 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, 1)) 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": @@ -591,7 +669,7 @@ class Gonvert(object): self._unitValue.grab_focus() self._unitValue.select_region(0, -1) except Exception: - _moduleLogger.exception("") + _moduleLogger.exception("_on_click_unit") def _on_unit_value_changed(self, *args): try: @@ -615,7 +693,7 @@ class Gonvert(object): func, arg = self._unitDataInCategory[self._previousUnitName.get_text()][0] self._previousUnitValue.set_text(str(func.from_base(base, arg, ))) except Exception: - _moduleLogger.exception("") + _moduleLogger.exception("_on_unit_value_changed") def _on_previous_unit_value_changed(self, *args): try: @@ -638,7 +716,7 @@ class Gonvert(object): func, arg = self._unitDataInCategory[self._unitName.get_text()][0] self._unitValue.set_text(str(func.from_base(base, arg, ))) except Exception: - _moduleLogger.exception("") + _moduleLogger.exception("_on_previous_unit_value_changed") def _on_about_clicked(self, a): dlg = gtk.AboutDialog() @@ -655,12 +733,21 @@ class Gonvert(object): try: self._save_settings() except Exception: - _moduleLogger.exception("") + _moduleLogger.exception("_on_user_exit") finally: gtk.main_quit() -def main(): +def run_gonvert(): + gtk.gdk.threads_init() + if hildonize.IS_HILDON_SUPPORTED: + gtk.set_application_name(constants.__pretty_app_name__) + handle = Gonvert() + if not PROFILE_STARTUP: + gtk.main() + + +if __name__ == "__main__": logging.basicConfig(level = logging.DEBUG) try: os.makedirs(constants._data_path_) @@ -668,9 +755,4 @@ def main(): if e.errno != 17: raise - gonvert = Gonvert() - gtk.main() - - -if __name__ == "__main__": - main() + run_gonvert()