Reworked notification flow and combined multiple transactions into one notification
authorMaran <maran.hidskes@gmail.com>
Mon, 17 Jun 2013 13:12:20 +0000 (15:12 +0200)
committerMaran <maran.hidskes@gmail.com>
Tue, 16 Jul 2013 10:15:23 +0000 (12:15 +0200)
gui/gui_classic.py
lib/interface.py
lib/wallet.py

index 7d4c495..d2bc644 100644 (file)
@@ -314,6 +314,9 @@ class ElectrumWindow(QMainWindow):
         # set initial message
         self.console.showMessage(self.wallet.interface.banner)
 
+        # Once GUI has been initialized check if we want to announce something since the callback has been called before the GUI was initialized
+        self.notify_transactions()
+
         # plugins that need to change the GUI do it here
         self.run_hook('init_gui')
 
@@ -421,12 +424,27 @@ class ElectrumWindow(QMainWindow):
         self.update_wallet()
 
     def notify_transactions(self):
-        for tx in self.wallet.interface.pending_transactions:
-            if tx:
-                self.wallet.interface.pending_transactions.remove(tx)
-                is_relevant, is_mine, v, fee = self.wallet.get_tx_value(tx)
-                if(v > 0):
-                    self.notify("New transaction received. %s BTC" % (self.format_amount(v)))
+        print_error("Notifying GUI")
+        if len(self.wallet.interface.pending_transactions_for_notifications) > 0:
+            # Combine the transactions if there are more then three
+            tx_amount = len(self.wallet.interface.pending_transactions_for_notifications)
+            if(tx_amount >= 3):
+                total_amount = 0
+                for tx in self.wallet.interface.pending_transactions_for_notifications:
+                    is_relevant, is_mine, v, fee = self.wallet.get_tx_value(tx)
+                    if(v > 0):
+                        total_amount += v
+
+                self.notify("%s new transactions received. Total amount received in the new transactions %s BTC" % (tx_amount, self.format_amount(total_amount)))
+
+                self.wallet.interface.pending_transactions_for_notifications = []
+            else:
+              for tx in self.wallet.interface.pending_transactions_for_notifications:
+                  if tx:
+                      self.wallet.interface.pending_transactions_for_notifications.remove(tx)
+                      is_relevant, is_mine, v, fee = self.wallet.get_tx_value(tx)
+                      if(v > 0):
+                          self.notify("New transaction received. %s BTC" % (self.format_amount(v)))
 
     def notify(self, message):
         self.notifier.showMessage("Electrum", message, QSystemTrayIcon.Information, 20000)
index 71f7ec8..e16c043 100644 (file)
@@ -90,7 +90,7 @@ class Interface(threading.Thread):
         self.unanswered_requests = {}
         #banner
         self.banner = ''
-        self.pending_transactions = []
+        self.pending_transactions_for_notifications= []
 
 
     def queue_json_response(self, c):
index 1fb496d..1957d88 100644 (file)
@@ -682,8 +682,7 @@ class Wallet:
         with self.transaction_lock:
             self.transactions[tx_hash] = tx
 
-            self.interface.pending_transactions.append(tx)
-            self.interface.trigger_callback("new_transaction")
+            self.interface.pending_transactions_for_notifications.append(tx)
 
             self.save_transactions()
             if self.verifier and tx_height>0: 
@@ -1192,6 +1191,7 @@ class WalletSynchronizer(threading.Thread):
 
             if self.was_updated and not requested_tx:
                 self.interface.trigger_callback('updated')
-                self.was_updated = False
-
+                self.interface.trigger_callback("new_transaction") # Updated gets called too many times from other places as well; if we use that signal we get the notification three times
+                
 
+                self.was_updated = False