Initial novacoin support
[electrum-nvc.git] / gui / qt / __init__.py
index e7d0a63..296c366 100644 (file)
@@ -17,9 +17,9 @@
 # along with this program. If not, see <http://www.gnu.org/licenses/>.
 
 import sys, time, datetime, re, threading
-from electrum.i18n import _, set_language
-from electrum.util import print_error, print_msg, parse_url
-from electrum.plugins import run_hook
+from electrum_nvc.i18n import _, set_language
+from electrum_nvc.util import print_error, print_msg
+from electrum_nvc.plugins import run_hook
 import os.path, json, ast, traceback
 import shutil
 
@@ -33,9 +33,9 @@ from PyQt4.QtGui import *
 from PyQt4.QtCore import *
 import PyQt4.QtCore as QtCore
 
-from electrum import WalletStorage, Wallet
-from electrum.i18n import _
-from electrum.bitcoin import MIN_RELAY_TX_FEE
+from electrum_nvc import WalletStorage, Wallet
+from electrum_nvc.i18n import _
+from electrum_nvc.bitcoin import MIN_RELAY_TX_FEE
 
 try:
     import icons_rc
@@ -44,13 +44,8 @@ except Exception:
 
 from util import *
 from main_window import ElectrumWindow
-from electrum.plugins import init_plugins
+from electrum_nvc.plugins import init_plugins
 
-class Timer(QtCore.QThread):
-    def run(self):
-        while True:
-            self.emit(QtCore.SIGNAL('timersignal'))
-            time.sleep(0.5)
 
 class OpenFileEventFilter(QObject):
     def __init__(self, windows):
@@ -75,24 +70,124 @@ class ElectrumGui:
         if app is None:
             self.app = QApplication(sys.argv)
         self.app.installEventFilter(self.efilter)
-
         init_plugins(self)
 
 
+    def build_tray_menu(self):
+        m = QMenu()
+        m.addAction(_("Show/Hide"), self.show_or_hide)
+        m.addAction(_("Dark/Light"), self.toggle_tray_icon)
+        m.addSeparator()
+        m.addAction(_("Exit Electrum"), self.close)
+        self.tray.setContextMenu(m)
+
+    def toggle_tray_icon(self):
+        self.dark_icon = not self.dark_icon
+        self.config.set_key("dark_icon", self.dark_icon, True)
+        icon = QIcon(":icons/electrum_dark_icon.png") if self.dark_icon else QIcon(':icons/electrum_light_icon.png')
+        self.tray.setIcon(icon)
+
+    def show_or_hide(self):
+        self.tray_activated(QSystemTrayIcon.DoubleClick)
+
+    def tray_activated(self, reason):
+        if reason == QSystemTrayIcon.DoubleClick:
+            if self.current_window.isMinimized() or self.current_window.isHidden():
+                self.current_window.show()
+                self.current_window.raise_()
+            else:
+                self.current_window.hide()
+
+    def close(self):
+        self.current_window.close()
+
+
+
+    def go_full(self):
+        self.config.set_key('lite_mode', False, True)
+        self.lite_window.hide()
+        self.main_window.show()
+        self.main_window.raise_()
+        self.current_window = self.main_window
+
+    def go_lite(self):
+        self.config.set_key('lite_mode', True, True)
+        self.main_window.hide()
+        self.lite_window.show()
+        self.lite_window.raise_()
+        self.current_window = self.lite_window
+
+
+    def init_lite(self):
+        import lite_window
+        if not self.check_qt_version():
+            if self.config.get('lite_mode') is True:
+                msg = "Electrum was unable to load the 'Lite GUI' because it needs Qt version >= 4.7.\nChanging your config to use the 'Classic' GUI"
+                QMessageBox.warning(None, "Could not start Lite GUI.", msg)
+                self.config.set_key('lite_mode', False, True)
+                sys.exit(0)
+            self.lite_window = None
+            return
+
+        actuator = lite_window.MiniActuator(self.main_window)
+        actuator.load_theme()
+        self.lite_window = lite_window.MiniWindow(actuator, self.go_full, self.config)
+        driver = lite_window.MiniDriver(self.main_window, self.lite_window)
+
+
+
+    def check_qt_version(self):
+        qtVersion = qVersion()
+        return int(qtVersion[0]) >= 4 and int(qtVersion[2]) >= 7
+
+
+    def set_url(self, uri):
+        self.current_window.pay_from_URI(uri)
+
+
     def main(self, url):
 
         storage = WalletStorage(self.config)
-        if not storage.file_exists:
+        if storage.file_exists:
+            wallet = Wallet(storage)
+            action = wallet.get_action()
+        else:
+            action = 'new'
+
+        if action is not None:
             import installwizard
             wizard = installwizard.InstallWizard(self.config, self.network, storage)
-            wallet = wizard.run()
+            wallet = wizard.run(action)
             if not wallet: 
                 exit()
         else:
-            wallet = Wallet(storage)
             wallet.start_threads(self.network)
-            
-        self.main_window = w = ElectrumWindow(self.config, self.network)
+
+        # init tray
+        self.dark_icon = self.config.get("dark_icon", False)
+        icon = QIcon(":icons/electrum_dark_icon.png") if self.dark_icon else QIcon(':icons/electrum_light_icon.png')
+        self.tray = QSystemTrayIcon(icon, None)
+        self.tray.setToolTip('Electrum')
+        self.tray.activated.connect(self.tray_activated)
+        self.build_tray_menu()
+        self.tray.show()
+
+        # main window
+        self.main_window = w = ElectrumWindow(self.config, self.network, self)
+        self.current_window = self.main_window
+
+        #lite window
+        self.init_lite()
+
+        # initial configuration
+        if self.config.get('hide_gui') is True and self.tray.isVisible():
+            self.main_window.hide()
+            self.lite_window.hide()
+        else:
+            if self.config.get('lite_mode') is True:
+                self.go_lite()
+            else:
+                self.go_full()
 
         # plugins that need to change the GUI do it here
         run_hook('init')
@@ -103,13 +198,20 @@ class ElectrumGui:
         s.start()
 
         self.windows.append(w)
-        if url: w.set_url(url)
+        if url: 
+            self.set_url(url)
+
         w.app = self.app
         w.connect_slots(s)
         w.update_wallet()
 
         self.app.exec_()
 
+        # clipboard persistence
+        # see http://www.mail-archive.com/pyqt@riverbankcomputing.com/msg17328.html
+        event = QtCore.QEvent(QtCore.QEvent.Clipboard)
+        self.app.sendEvent(self.app.clipboard(), event)
+
         wallet.stop_threads()