Fixing a bug where we did not always refresh the converted value
[gonvert] / src / gonvert_qt.py
index 8a31189..b2adc92 100755 (executable)
@@ -86,6 +86,11 @@ class Gonvert(object):
                self._catWindow = None
                self._quickWindow = None
 
+               self._on_jump_close = lambda obj = None: self._on_child_close("_jumpWindow", obj)
+               self._on_recent_close = lambda obj = None: self._on_child_close("_recentWindow", obj)
+               self._on_cat_close = lambda obj = None: self._on_child_close("_catWindow", obj)
+               self._on_quick_close = lambda obj = None: self._on_child_close("_quickWindow", obj)
+
                self._condensedAction = QtGui.QAction(None)
                self._condensedAction.setText("Condensed View")
                self._condensedAction.setCheckable(True)
@@ -139,14 +144,14 @@ class Gonvert(object):
                if self._condensedAction.isChecked():
                        if self._quickWindow is None:
                                self._quickWindow = QuickConvert(None, self)
-                               self._quickWindow.window.destroyed.connect(lambda obj = None: self._on_child_close("_quickWindow", obj))
+                               self._quickWindow.window.destroyed.connect(self._on_quick_close)
                        else:
                                self._quickWindow.show()
                        self._mainWindow = self._quickWindow
                else:
                        if self._catWindow is None:
                                self._catWindow = CategoryWindow(None, self)
-                               self._catWindow.window.destroyed.connect(lambda obj = None: self._on_child_close("_catWindow", obj))
+                               self._catWindow.window.destroyed.connect(self._on_cat_close)
                        else:
                                self._catWindow.window.show()
                        self._mainWindow = self._catWindow
@@ -155,14 +160,14 @@ class Gonvert(object):
 
        def search_units(self):
                jumpWindow = QuickJump(None, self)
-               jumpWindow.window.destroyed.connect(lambda obj = None: self._on_child_close("_jumpWindow", obj))
+               jumpWindow.window.destroyed.connect(self._on_jump_close)
                self._fake_close_windows()
                self._jumpWindow = jumpWindow
                return self._jumpWindow
 
        def show_recent(self):
                recentWindow = Recent(None, self)
-               recentWindow.window.destroyed.connect(lambda obj = None: self._on_child_close("_recentWindow", obj))
+               recentWindow.window.destroyed.connect(self._on_recent_close)
                self._fake_close_windows()
                self._recentWindow = recentWindow
                return self._recentWindow
@@ -291,19 +296,31 @@ class Gonvert(object):
                if self._quickWindow is not None:
                        self._quickWindow.hide()
                if self._jumpWindow is not None:
+                       self._jumpWindow.disconnect(self._on_jump_close)
                        self._jumpWindow.close()
                        self._jumpWindow = None
                if self._recentWindow is not None:
+                       self._recentWindow.disconnect(self._on_recent_close)
                        self._recentWindow.close()
                        self._recentWindow = None
 
        def _close_windows(self):
-               for child in self._walk_children():
-                       child.close()
-               self._catWindow = None
-               self._quickWindow = None
-               self._jumpWindow = None
-               self._recentWindow = None
+               if self._catWindow is not None:
+                       self._catWindow.disconnect(self._on_cat_close)
+                       self._catWindow.close()
+                       self._catWindow = None
+               if self._quickWindow is not None:
+                       self._quickWindow.disconnect(self._on_quick_close)
+                       self._quickWindow.close()
+                       self._quickWindow = None
+               if self._jumpWindow is not None:
+                       self._jumpWindow.disconnect(self._on_jump_close)
+                       self._jumpWindow.close()
+                       self._jumpWindow = None
+               if self._recentWindow is not None:
+                       self._recentWindow.disconnect(self._on_recent_close)
+                       self._recentWindow.close()
+                       self._recentWindow = None
 
        @misc_utils.log_exception(_moduleLogger)
        def _on_app_quit(self, checked = False):
@@ -695,6 +712,8 @@ class QuickConvert(object):
                        self._window.showNormal()
 
        def select_category(self, categoryName):
+               self._inputUnitName = ""
+               self._outputUnitName = ""
                self._inputUnitValue.setText("")
                self._inputUnitSymbol.setText("")
                self._inputView.clear()
@@ -751,6 +770,9 @@ class QuickConvert(object):
                currentIndex = self._inputView.model().index(i, 0, rootIndex)
                self._inputView.scrollTo(currentIndex)
 
+               if "" not in [self._categoryName, self._inputUnitName, self._outputUnitName]:
+                       self._update_conversion()
+
        def select_output(self, name):
                # Add the output to recent but don't make things weird by making it the most recent
                self._app.add_recent(self._categoryName, name)
@@ -767,6 +789,9 @@ class QuickConvert(object):
                currentIndex = self._outputView.model().index(i, 0, rootIndex)
                self._outputView.scrollTo(currentIndex)
 
+               if "" not in [self._categoryName, self._inputUnitName, self._outputUnitName]:
+                       self._update_conversion()
+
        def _sanitize_value(self, userEntry):
                if self._categoryName == "Computer Numbers":
                        if userEntry == '':
@@ -780,6 +805,25 @@ class QuickConvert(object):
                                value = float(userEntry)
                return value
 
+       def _update_conversion(self):
+               assert self._categoryName
+               assert self._inputUnitName
+               assert self._outputUnitName
+
+               userInput = str(self._inputUnitValue.text())
+               value = self._sanitize_value(userInput)
+
+               unitData = unit_data.UNIT_DESCRIPTIONS[self._categoryName]
+               inputConversion, _, _ = unitData[self._inputUnitName]
+               outputConversion, _, _ = unitData[self._outputUnitName]
+
+               func, arg = inputConversion
+               base = func.to_base(value, arg)
+
+               func, arg = outputConversion
+               newValue = func.from_base(base, arg)
+               self._outputUnitValue.setText(str(newValue))
+
        def _update_favorites(self):
                if self._app.showFavoritesAction.isChecked():
                        assert self._categoryView.topLevelItemCount() == len(unit_data.UNIT_CATEGORIES)
@@ -859,23 +903,7 @@ class QuickConvert(object):
 
        @misc_utils.log_exception(_moduleLogger)
        def _on_value_edited(self, *args):
-               assert self._categoryName
-               assert self._inputUnitName
-               assert self._outputUnitName
-
-               userInput = str(self._inputUnitValue.text())
-               value = self._sanitize_value(userInput)
-
-               unitData = unit_data.UNIT_DESCRIPTIONS[self._categoryName]
-               inputConversion, _, _ = unitData[self._inputUnitName]
-               outputConversion, _, _ = unitData[self._outputUnitName]
-
-               func, arg = inputConversion
-               base = func.to_base(value, arg)
-
-               func, arg = outputConversion
-               newValue = func.from_base(base, arg)
-               self._outputUnitValue.setText(str(newValue))
+               self._update_conversion()
 
        @misc_utils.log_exception(_moduleLogger)
        def _on_category_selection_changed(self, selected, deselected):