Attempting some optimizations
authorEd Page <eopage@byu.net>
Fri, 11 Jun 2010 13:39:25 +0000 (08:39 -0500)
committerEd Page <eopage@byu.net>
Fri, 11 Jun 2010 13:39:25 +0000 (08:39 -0500)
src/converters.py
src/gonvert_qt.py
support/builddeb.py

index d53c768..219df1d 100644 (file)
@@ -268,13 +268,15 @@ class function(object):
        #value is assumed to be a string
        #convert from a defined function to base
        def to_base(self, value, (to_base, from_base)):
+               leftOfX, rightOfX = to_base.split("x", 1)
                y = 0 # "undefined" y was driving me nuts
-               exec "y="+to_base[:to_base.find('x')]+str(value)+to_base[to_base.find('x')+1:]
+               exec "y=" + leftOfX + str(value) + rightOfX
                return y
 
        def from_base(self, value, (to_base, from_base)):
+               leftOfX, rightOfX = from_base.split("x", 1)
                y = 0 # "undefined" y was driving me nuts
-               exec "y="+from_base[:from_base.find('x')]+str(value)+from_base[from_base.find('x')+1:]
+               exec "y=" + leftOfX + str(value) + rightOfX
                return y
 
 
index b1f393a..38e064c 100755 (executable)
@@ -28,6 +28,10 @@ IS_MAEMO = True
 
 
 def split_number(number):
+       if number == 0.0:
+               # Optimize the startup case
+               return "0.", "0"
+
        try:
                fractional, integer = math.modf(number)
        except TypeError:
@@ -39,15 +43,16 @@ def split_number(number):
                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
+                       if 0.0 < integer:
+                               integerDisplay = number
+                               fractionalDisplay = ""
+                       else:
+                               integerDisplay = ""
+                               fractionalDisplay = number
                else:
-                       integerDisplay = integerDisplay.split(".", 1)[0] + "."
-                       fractionalDisplay = fractionalDisplay.rsplit(".", 1)[-1]
+                       integerDisplay = integerDisplay[0:-2] + "."
+                       fractionalDisplay = fractionalDisplay[2:]
 
        return integerDisplay, fractionalDisplay
 
@@ -1350,6 +1355,11 @@ class UnitData(object):
        VALUE_COLUMN_1 = 2
        UNIT_COLUMN = 3
 
+       __slots__ = [
+               "_name", "_unit", "_description", "_conversion",
+               "_value", "_integerDisplay", "_fractionalDisplay",
+       ]
+
        def __init__(self, name, unit, description, conversion):
                self._name = name
                self._unit = unit
@@ -1392,6 +1402,10 @@ class UnitModel(QtCore.QAbstractItemModel):
                super(UnitModel, self).__init__(parent)
                self._categoryName = categoryName
                self._unitData = unit_data.UNIT_DESCRIPTIONS[self._categoryName]
+               if self._categoryName == "Computer Numbers":
+                       self._sanitize_value = self._sanitize_alpha_value
+               else:
+                       self._sanitize_value = self._sanitize_numeric_value
 
                self._children = []
                for key in unit_data.get_units(self._categoryName):
@@ -1408,19 +1422,20 @@ class UnitModel(QtCore.QAbstractItemModel):
 
        @misc_utils.log_exception(_moduleLogger)
        def data(self, index, role):
-               if not index.isValid():
-                       return None
+               #if not index.isValid():
+               #       return None
+
+               if role == QtCore.Qt.DisplayRole:
+                       item = index.internalPointer()
+                       if isinstance(item, UnitData):
+                               return item.data(index.column())
+                       elif item is UnitData.HEADERS:
+                               return item[index.column()]
                elif role == QtCore.Qt.TextAlignmentRole:
                        return UnitData.ALIGNMENT[index.column()]
-               elif role != QtCore.Qt.DisplayRole:
+               else:
                        return None
 
-               item = index.internalPointer()
-               if isinstance(item, UnitData):
-                       return item.data(index.column())
-               elif item is UnitData.HEADERS:
-                       return item[index.column()]
-
        @misc_utils.log_exception(_moduleLogger)
        def sort(self, column, order = QtCore.Qt.AscendingOrder):
                self._sortSettings = column, order
@@ -1451,11 +1466,10 @@ class UnitModel(QtCore.QAbstractItemModel):
 
        @misc_utils.log_exception(_moduleLogger)
        def index(self, row, column, parent):
-               if not self.hasIndex(row, column, parent):
-                       return QtCore.QModelIndex()
-
-               if parent.isValid():
-                       return QtCore.QModelIndex()
+               #if not self.hasIndex(row, column, parent):
+               #       return QtCore.QModelIndex()
+               #elif parent.isValid():
+               #       return QtCore.QModelIndex()
 
                parentItem = UnitData.HEADERS
                childItem = self._children[row]
@@ -1515,8 +1529,10 @@ class UnitModel(QtCore.QAbstractItemModel):
                ):
                        # Sort takes care of marking everything as changed
                        self.sort(*self._sortSettings)
+                       return True
                else:
                        self._values_changed()
+                       return False
 
        def __len__(self):
                return len(self._children)
@@ -1531,17 +1547,18 @@ class UnitModel(QtCore.QAbstractItemModel):
                bottomRight = self.createIndex(len(self._children)-1, len(UnitData.HEADERS)-1, self._children[-1])
                self.dataChanged.emit(topLeft, bottomRight)
 
-       def _sanitize_value(self, userEntry):
-               if self._categoryName == "Computer Numbers":
-                       if userEntry == '':
-                               value = '0'
-                       else:
-                               value = userEntry
+       def _sanitize_alpha_value(self, userEntry):
+               if userEntry:
+                       value = userEntry
                else:
-                       if userEntry == '':
-                               value = 0.0
-                       else:
-                               value = float(userEntry)
+                       value = '0'
+               return value
+
+       def _sanitize_numeric_value(self, userEntry):
+               if userEntry:
+                       value = float(userEntry)
+               else:
+                       value = 0.0
                return value
 
 
@@ -1567,15 +1584,15 @@ class UnitWindow(object):
                self._unitsModel = UnitModel(self._categoryName)
                self._unitsView = QtGui.QTreeView()
                self._unitsView.setModel(self._unitsModel)
-               self._unitsView.clicked.connect(self._on_unit_clicked)
                self._unitsView.setUniformRowHeights(True)
                self._unitsView.setSortingEnabled(True)
                self._unitsView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
                self._unitsView.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
                self._unitsView.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
+               self._unitsView.setHeaderHidden(True)
+               self._unitsView.clicked.connect(self._on_unit_clicked)
                if not IS_MAEMO:
                        self._unitsView.setAlternatingRowColors(True)
-               self._unitsView.setHeaderHidden(True)
 
                viewHeader = self._unitsView.header()
                viewHeader.setSortIndicatorShown(True)
@@ -1808,9 +1825,10 @@ class UnitWindow(object):
 
        @misc_utils.log_exception(_moduleLogger)
        def _on_value_edited(self, *args):
-               userInput = self._selectedUnitValue.text()
-               self._unitsModel.update_values(self._selectedIndex, str(userInput))
-               self._update_favorites()
+               userInput = str(self._selectedUnitValue.text())
+               orderChanged = self._unitsModel.update_values(self._selectedIndex, userInput)
+               if orderChanged:
+                       self._update_favorites()
 
        def _select_unit(self, index):
                unit = self._unitsModel.get_unit(index)
@@ -1825,7 +1843,10 @@ class UnitWindow(object):
 def run_gonvert():
        app = QtGui.QApplication([])
        handle = Gonvert(app)
-       return app.exec_()
+       if constants.PROFILE_STARTUP:
+               return 0
+       else:
+               return app.exec_()
 
 
 if __name__ == "__main__":
index eb4a60a..3ee0a64 100755 (executable)
@@ -24,6 +24,7 @@ __changelog__ = """
 * On the traditional view, fixed an issue setting a value on the unit being converted
 * Increased the name column size in the traditional view
 * Switching Favorites to checkboxes from selection
+* Attempting some optimizations
 """.strip()