From e07cd1462e1e242d1ad8c99840b46bfdee409707 Mon Sep 17 00:00:00 2001
From: Dmitri Bogomolov <4glitch@gmail.com>
Date: Wed, 29 May 2019 18:31:54 +0300
Subject: [PATCH] Added address menu plugins to each popup menu except for
 Blacklist,

closes #819
---
 src/bitmessageqt/__init__.py | 109 ++++++++++++++++++++++-------------
 src/plugins/menu_qrcode.py   |  10 +++-
 2 files changed, 78 insertions(+), 41 deletions(-)

diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py
index 8286e6e8..507e6ca0 100644
--- a/src/bitmessageqt/__init__.py
+++ b/src/bitmessageqt/__init__.py
@@ -817,6 +817,17 @@ class MyForm(settingsmixin.SMainWindow):
         self.initSettings()
         self.resetNamecoinConnection()
 
+        self._contact_selected = None
+
+    def getContactSelected(self):
+        """Returns last selected contact once"""
+        try:
+            return self._contact_selected
+        except AttributeError:
+            pass
+        finally:
+            self._contact_selected = None
+
     def updateTTL(self, sliderPosition):
         TTL = int(sliderPosition ** 3.199 + 3600)
         self.updateHumanFriendlyTTLDescription(TTL)
@@ -3446,15 +3457,19 @@ class MyForm(settingsmixin.SMainWindow):
         self.popMenuAddressBook.addSeparator()
         self.popMenuAddressBook.addAction(self.actionAddressBookNew)
         normal = True
-        for row in self.ui.tableWidgetAddressBook.selectedIndexes():
-            currentRow = row.row()
-            type = self.ui.tableWidgetAddressBook.item(
-                currentRow, 0).type
-            if type != AccountMixin.NORMAL:
+        selected_items = self.getAddressbookSelectedItems()
+        for item in selected_items:
+            if item.type != AccountMixin.NORMAL:
                 normal = False
+                break
         if normal:
             # only if all selected addressbook items are normal, allow delete
             self.popMenuAddressBook.addAction(self.actionAddressBookDelete)
+        if len(selected_items) == 1:
+            self._contact_selected = selected_items.pop()
+            self.popMenuAddressBook.addSeparator()
+            for plugin in self.menu_plugins['address']:
+                self.popMenuAddressBook.addAction(plugin)
         self.popMenuAddressBook.exec_(
             self.ui.tableWidgetAddressBook.mapToGlobal(point))
 
@@ -3526,6 +3541,8 @@ class MyForm(settingsmixin.SMainWindow):
             self.popMenuSubscriptions.addAction(self.actionsubscriptionsClipboard)
             self.popMenuSubscriptions.addAction(self.actionsubscriptionsSend)
             self.popMenuSubscriptions.addSeparator()
+
+            self._contact_selected = currentItem
             # preloaded gui.menu plugins with prefix 'address'
             for plugin in self.menu_plugins['address']:
                 self.popMenuSubscriptions.addAction(plugin)
@@ -3939,6 +3956,7 @@ class MyForm(settingsmixin.SMainWindow):
             self.popMenuYourIdentities.addAction(self.actionEmailGateway)
             self.popMenuYourIdentities.addSeparator()
             if currentItem.type != AccountMixin.ALL:
+                self._contact_selected = currentItem
                 # preloaded gui.menu plugins with prefix 'address'
                 for plugin in self.menu_plugins['address']:
                     self.popMenuYourIdentities.addAction(plugin)
@@ -3967,6 +3985,7 @@ class MyForm(settingsmixin.SMainWindow):
             self.popMenu.addAction(self.actionClipboard)
             self.popMenu.addAction(self.actionSend)
             self.popMenu.addSeparator()
+            self._contact_selected = currentItem
             # preloaded gui.menu plugins with prefix 'address'
             for plugin in self.menu_plugins['address']:
                 self.popMenu.addAction(plugin)
@@ -3980,49 +3999,61 @@ class MyForm(settingsmixin.SMainWindow):
 
     def on_context_menuInbox(self, point):
         tableWidget = self.getCurrentMessagelist()
-        if tableWidget:
-            currentFolder = self.getCurrentFolder()
-            if currentFolder is None:
-                pass
-            if currentFolder == 'sent':
-                self.on_context_menuSent(point)
-            else:
-                self.popMenuInbox = QtGui.QMenu(self)
-                self.popMenuInbox.addAction(self.actionForceHtml)
-                self.popMenuInbox.addAction(self.actionMarkUnread)
-                self.popMenuInbox.addSeparator()
-                address = tableWidget.item(
-                    tableWidget.currentRow(), 0).data(QtCore.Qt.UserRole)
-                account = accountClass(address)
-                if account.type == AccountMixin.CHAN:
-                    self.popMenuInbox.addAction(self.actionReplyChan)
-                self.popMenuInbox.addAction(self.actionReply)
-                self.popMenuInbox.addAction(self.actionAddSenderToAddressBook)
-                self.actionClipboardMessagelist = self.ui.inboxContextMenuToolbar.addAction(
-                    _translate("MainWindow", "Copy subject to clipboard")
-                    if tableWidget.currentColumn() == 2 else
-                    _translate("MainWindow", "Copy address to clipboard"),
-                    self.on_action_ClipboardMessagelist)
-                self.popMenuInbox.addAction(self.actionClipboardMessagelist)
-                self.popMenuInbox.addSeparator()
-                self.popMenuInbox.addAction(self.actionAddSenderToBlackList)
-                self.popMenuInbox.addSeparator()
-                self.popMenuInbox.addAction(self.actionSaveMessageAs)
-                if currentFolder == "trash":
-                    self.popMenuInbox.addAction(self.actionUndeleteTrashedMessage)
-                else:
-                    self.popMenuInbox.addAction(self.actionTrashInboxMessage)
-                self.popMenuInbox.exec_(tableWidget.mapToGlobal(point))
+        if not tableWidget:
+            return
+
+        currentFolder = self.getCurrentFolder()
+        if currentFolder == 'sent':
+            self.on_context_menuSent(point)
+            return
+
+        self.popMenuInbox = QtGui.QMenu(self)
+        self.popMenuInbox.addAction(self.actionForceHtml)
+        self.popMenuInbox.addAction(self.actionMarkUnread)
+        self.popMenuInbox.addSeparator()
+        currentRow = tableWidget.currentRow()
+        account = accountClass(
+            tableWidget.item(currentRow, 0).data(QtCore.Qt.UserRole))
+
+        if account.type == AccountMixin.CHAN:
+            self.popMenuInbox.addAction(self.actionReplyChan)
+        self.popMenuInbox.addAction(self.actionReply)
+        self.popMenuInbox.addAction(self.actionAddSenderToAddressBook)
+        self.actionClipboardMessagelist = self.ui.inboxContextMenuToolbar.addAction(
+            _translate("MainWindow", "Copy subject to clipboard")
+            if tableWidget.currentColumn() == 2 else
+            _translate("MainWindow", "Copy address to clipboard"),
+            self.on_action_ClipboardMessagelist)
+        self.popMenuInbox.addAction(self.actionClipboardMessagelist)
+        # pylint: disable=no-member
+        self._contact_selected = tableWidget.item(currentRow, 1)
+        # preloaded gui.menu plugins with prefix 'address'
+        for plugin in self.menu_plugins['address']:
+            self.popMenuInbox.addAction(plugin)
+        self.popMenuInbox.addSeparator()
+        self.popMenuInbox.addAction(self.actionAddSenderToBlackList)
+        self.popMenuInbox.addSeparator()
+        self.popMenuInbox.addAction(self.actionSaveMessageAs)
+        if currentFolder == "trash":
+            self.popMenuInbox.addAction(self.actionUndeleteTrashedMessage)
+        else:
+            self.popMenuInbox.addAction(self.actionTrashInboxMessage)
+        self.popMenuInbox.exec_(tableWidget.mapToGlobal(point))
 
     def on_context_menuSent(self, point):
+        currentRow = self.ui.tableWidgetInbox.currentRow()
         self.popMenuSent = QtGui.QMenu(self)
         self.popMenuSent.addAction(self.actionSentClipboard)
+        self._contact_selected = self.ui.tableWidgetInbox.item(currentRow, 0)
+        # preloaded gui.menu plugins with prefix 'address'
+        for plugin in self.menu_plugins['address']:
+            self.popMenuSent.addAction(plugin)
+        self.popMenuSent.addSeparator()
         self.popMenuSent.addAction(self.actionTrashSentMessage)
         self.popMenuSent.addAction(self.actionSentReply)
 
         # Check to see if this item is toodifficult and display an additional
         # menu option (Force Send) if it is.
-        currentRow = self.ui.tableWidgetInbox.currentRow()
         if currentRow >= 0:
             ackData = str(self.ui.tableWidgetInbox.item(
                 currentRow, 3).data(QtCore.Qt.UserRole).toPyObject())
diff --git a/src/plugins/menu_qrcode.py b/src/plugins/menu_qrcode.py
index f4a21460..7f21c6b8 100644
--- a/src/plugins/menu_qrcode.py
+++ b/src/plugins/menu_qrcode.py
@@ -81,8 +81,14 @@ def connect_plugin(form):
             dialog = form.qrcode_dialog
         except AttributeError:
             form.qrcode_dialog = dialog = QRCodeDialog(form)
-        account = form.getCurrentItem()
-        label = account._getLabel()
+        account = form.getContactSelected()
+        try:
+            label = account._getLabel()  # pylint: disable=protected-access
+        except AttributeError:
+            try:
+                label = account.getLabel()
+            except AttributeError:
+                return
         dialog.render(
             'bitmessage:%s' % account.address + (
                 '?' + urllib.urlencode({'label': label.encode('utf-8')})