From 89dc812ac2c7276a178bac9e4e99414b0aa85b4c Mon Sep 17 00:00:00 2001 From: sendiulo Date: Thu, 5 Sep 2013 15:23:18 +0200 Subject: [PATCH] GUI context menu improvements: Everywhere: - copy address => copy addresses In Identities: - allow multiple selections - "Send to this Address" (filters out non-chans not to send to yourself, filters out addresses already in recipient field) --- src/bitmessageqt/__init__.py | 156 +++++++++++++++++++------------ src/bitmessageqt/bitmessageui.py | 26 +++--- src/bitmessageqt/bitmessageui.ui | 51 +++++----- src/bitmessageqt/settings.py | 2 +- 4 files changed, 144 insertions(+), 91 deletions(-) diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index 8ad29063..bd229fe8 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -128,6 +128,8 @@ class MyForm(QtGui.QMainWindow): "triggered()"), self.click_actionRegenerateDeterministicAddresses) QtCore.QObject.connect(self.ui.actionJoinChan, QtCore.SIGNAL( "triggered()"), self.click_actionJoinChan) # also used for creating chans. + QtCore.QObject.connect(self.ui.pushButtonJoinCreateChan, QtCore.SIGNAL( + "clicked()"), self.click_actionJoinChan) QtCore.QObject.connect(self.ui.pushButtonNewAddress, QtCore.SIGNAL( "clicked()"), self.click_NewAddressDialog) QtCore.QObject.connect(self.ui.comboBoxSendFrom, QtCore.SIGNAL( @@ -189,31 +191,34 @@ class MyForm(QtGui.QMainWindow): # Popup menu for the Your Identities tab self.ui.addressContextMenuToolbar = QtGui.QToolBar() # Actions - self.actionNew = self.ui.addressContextMenuToolbar.addAction(_translate( - "MainWindow", "New"), self.on_action_YourIdentitiesNew) + self.actionNewAddress = self.ui.addressContextMenuToolbar.addAction(_translate( + "MainWindow", "Create new Address"), self.on_action_YourIdentitiesNewAddress) + self.actionNewChan = self.ui.addressContextMenuToolbar.addAction(_translate( + "MainWindow", "Join / Create Chan"), self.on_action_YourIdentitiesNewChan) self.actionEnable = self.ui.addressContextMenuToolbar.addAction(_translate( "MainWindow", "Enable"), self.on_action_YourIdentitiesEnable) self.actionDisable = self.ui.addressContextMenuToolbar.addAction(_translate( "MainWindow", "Disable"), self.on_action_YourIdentitiesDisable) self.actionClipboard = self.ui.addressContextMenuToolbar.addAction(_translate( "MainWindow", "Copy address to clipboard"), self.on_action_YourIdentitiesClipboard) - self.actionSendToChan = self.ui.addressContextMenuToolbar.addAction(_translate( - "MainWindow", "Send message to this chan"), self.on_action_YourIdentitiesSendToChan) + self.actionYourIdentitiesSendToAddress = self.ui.addressContextMenuToolbar.addAction(_translate( + "MainWindow", "Send message to this address"), self.on_action_YourIdentitiesSendToAddress) self.actionSpecialAddressBehavior = self.ui.addressContextMenuToolbar.addAction(_translate( "MainWindow", "Special address behavior..."), self.on_action_SpecialAddressBehaviorDialog) self.ui.tableWidgetYourIdentities.setContextMenuPolicy( QtCore.Qt.CustomContextMenu) self.connect(self.ui.tableWidgetYourIdentities, QtCore.SIGNAL( 'customContextMenuRequested(const QPoint&)'), self.on_context_menuYourIdentities) - self.popMenu = QtGui.QMenu(self) - self.popMenu.addAction(self.actionNew) - self.popMenu.addSeparator() - self.popMenu.addAction(self.actionClipboard) - self.popMenu.addAction(self.actionSendToChan) - self.popMenu.addSeparator() - self.popMenu.addAction(self.actionEnable) - self.popMenu.addAction(self.actionDisable) - self.popMenu.addAction(self.actionSpecialAddressBehavior) + self.popMenuIdentities = QtGui.QMenu(self) + self.popMenuIdentities.addAction(self.actionNewAddress) + self.popMenuIdentities.addAction(self.actionNewChan) + self.popMenuIdentities.addSeparator() + self.popMenuIdentities.addAction(self.actionClipboard) + self.popMenuIdentities.addAction(self.actionYourIdentitiesSendToAddress) + self.popMenuIdentities.addSeparator() + self.popMenuIdentities.addAction(self.actionEnable)### + self.popMenuIdentities.addAction(self.actionDisable) + self.popMenuIdentities.addAction(self.actionSpecialAddressBehavior) # Popup menu for the Address Book page self.ui.addressBookContextMenuToolbar = QtGui.QToolBar() @@ -326,6 +331,7 @@ class MyForm(QtGui.QMainWindow): QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) if shared.safeConfigGetBoolean(addressInKeysFile, 'chan'): newItem.setTextColor(QtGui.QColor(216, 119, 0)) # orange + if not isEnabled: newItem.setTextColor(QtGui.QColor(128, 128, 128)) if shared.safeConfigGetBoolean(addressInKeysFile, 'mailinglist'): @@ -2537,11 +2543,16 @@ class MyForm(QtGui.QMainWindow): shared.workerQueue.put(('sendmessage', '')) def on_action_SentClipboard(self): - currentRow = self.ui.tableWidgetSent.currentRow() - addressAtCurrentRow = str(self.ui.tableWidgetSent.item( - currentRow, 0).data(Qt.UserRole).toPyObject()) + listOfSelectedRows = {} + for i in range(len(self.ui.tableWidgetSent.selectedIndexes())): + listOfSelectedRows[ + self.ui.tableWidgetSent.selectedIndexes()[i].row()] = 0 + addressesArray = [] + for currentRow in listOfSelectedRows: + addressesArray += [str(self.ui.tableWidgetSent.item( + currentRow, 0).text())] clipboard = QtGui.QApplication.clipboard() - clipboard.setText(str(addressAtCurrentRow)) + clipboard.setText('; '.join(addressesArray)) # Group of functions for the Address Book dialog box def on_action_AddressBookNew(self): @@ -2568,20 +2579,16 @@ class MyForm(QtGui.QMainWindow): self.rerenderSentToLabels() def on_action_AddressBookClipboard(self): - fullStringOfAddresses = '' listOfSelectedRows = {} for i in range(len(self.ui.tableWidgetAddressBook.selectedIndexes())): listOfSelectedRows[ self.ui.tableWidgetAddressBook.selectedIndexes()[i].row()] = 0 + addressesArray = [] for currentRow in listOfSelectedRows: - addressAtCurrentRow = self.ui.tableWidgetAddressBook.item( - currentRow, 1).text() - if fullStringOfAddresses == '': - fullStringOfAddresses = addressAtCurrentRow - else: - fullStringOfAddresses += ', ' + str(addressAtCurrentRow) + addressesArray += [str(self.ui.tableWidgetAddressBook.item( + currentRow, 1).text())] clipboard = QtGui.QApplication.clipboard() - clipboard.setText(fullStringOfAddresses) + clipboard.setText('; '.join(addressesArray)) def on_action_AddressBookSend(self): listOfSelectedRows = {} @@ -2645,11 +2652,16 @@ class MyForm(QtGui.QMainWindow): shared.reloadBroadcastSendersForWhichImWatching() def on_action_SubscriptionsClipboard(self): - currentRow = self.ui.tableWidgetSubscriptions.currentRow() - addressAtCurrentRow = self.ui.tableWidgetSubscriptions.item( - currentRow, 1).text() + listOfSelectedRows = {} + for i in range(len(self.ui.tableWidgetSubscriptions.selectedIndexes())): + listOfSelectedRows[ + self.ui.tableWidgetSubscriptions.selectedIndexes()[i].row()] = 0 + addressesArray = [] + for currentRow in listOfSelectedRows: + addressesArray += [str(self.ui.tableWidgetSubscriptions.item( + currentRow, 1).text())] clipboard = QtGui.QApplication.clipboard() - clipboard.setText(str(addressAtCurrentRow)) + clipboard.setText('; '.join(addressesArray)) def on_action_SubscriptionsEnable(self): currentRow = self.ui.tableWidgetSubscriptions.currentRow() @@ -2722,11 +2734,16 @@ class MyForm(QtGui.QMainWindow): self.ui.tableWidgetBlacklist.removeRow(currentRow) def on_action_BlacklistClipboard(self): - currentRow = self.ui.tableWidgetBlacklist.currentRow() - addressAtCurrentRow = self.ui.tableWidgetBlacklist.item( - currentRow, 1).text() + listOfSelectedRows = {} + for i in range(len(self.ui.tableWidgetBlacklist.selectedIndexes())): + listOfSelectedRows[ + self.ui.tableWidgetBlacklist.selectedIndexes()[i].row()] = 0 + addressesArray = [] + for currentRow in listOfSelectedRows: + addressesArray += [str(self.ui.tableWidgetBlacklist.item( + currentRow, 1).text())] clipboard = QtGui.QApplication.clipboard() - clipboard.setText(str(addressAtCurrentRow)) + clipboard.setText('; '.join(addressesArray)) def on_context_menuBlacklist(self, point): self.popMenuBlacklist.exec_( @@ -2779,8 +2796,11 @@ class MyForm(QtGui.QMainWindow): shared.sqlLock.release() # Group of functions for the Your Identities dialog box - def on_action_YourIdentitiesNew(self): + def on_action_YourIdentitiesNewAddress(self): self.click_NewAddressDialog() + + def on_action_YourIdentitiesNewChan(self): + self.click_actionJoinChan() def on_action_YourIdentitiesEnable(self): listOfSelectedRows = {} @@ -2829,46 +2849,66 @@ class MyForm(QtGui.QMainWindow): shared.reloadMyAddressHashes() def on_action_YourIdentitiesClipboard(self): - currentRow = self.ui.tableWidgetYourIdentities.currentRow() - addressAtCurrentRow = self.ui.tableWidgetYourIdentities.item( - currentRow, 1).text() - clipboard = QtGui.QApplication.clipboard() - clipboard.setText(str(addressAtCurrentRow)) - - def on_action_YourIdentitiesSendToChan(self): - ### listOfSelectedRows = {} for i in range(len(self.ui.tableWidgetYourIdentities.selectedIndexes())): listOfSelectedRows[ self.ui.tableWidgetYourIdentities.selectedIndexes()[i].row()] = 0 - count = 0 + addressesArray = [] + for currentRow in listOfSelectedRows: + addressesArray += [str(self.ui.tableWidgetYourIdentities.item( + currentRow, 1).text())] + clipboard = QtGui.QApplication.clipboard() + clipboard.setText('; '.join(addressesArray)) + + def on_action_YourIdentitiesSendToAddress(self): + ### + # already preparing this for use with multiple selected items + listOfSelectedRows = {} + for i in range(len(self.ui.tableWidgetYourIdentities.selectedIndexes())): + listOfSelectedRows[ + self.ui.tableWidgetYourIdentities.selectedIndexes()[i].row()] = 0 + chans = [] + nonchans = [] for currentRow in listOfSelectedRows: addressAtCurrentRow = self.ui.tableWidgetYourIdentities.item( currentRow, 1).text() if shared.safeConfigGetBoolean(str(addressAtCurrentRow), 'chan'): - if self.ui.lineEditTo.text() == '': - self.ui.lineEditTo.setText(str(addressAtCurrentRow)) - else: - self.ui.lineEditTo.setText(str( - self.ui.lineEditTo.text()) + '; ' + str(addressAtCurrentRow)) + chans += [str(addressAtCurrentRow)] else: - count += 1 + nonchans += [str(addressAtCurrentRow)] + + old_recipients = str(self.ui.lineEditTo.text()).split(';') + old_recipients = [x.strip(' ') for x in old_recipients] + # filter out empty elements, like possibly the current lineEditTo.text() + old_recipients = filter(None, old_recipients) + recipients = old_recipients + chans + # filter out duplicate recipients + from collections import OrderedDict + recipients = list(OrderedDict.fromkeys(recipients)) + # alternatively, if we don't need them sorted + # recipients = set(old_recipients + chans) + added = set(recipients) ^ set(old_recipients) # xor + already_recipient = set(recipients) & set(old_recipients) # and + + message = _translate( + "MainWindow", "%1 address(es) added to recipients. %2 address(es) already in recipients. %3 own address(es) ignored.").arg(len(added)).arg(len(already_recipient)).arg(len(nonchans)) + self.ui.lineEditTo.setText( + '; '.join(recipients)) if listOfSelectedRows == {}: self.statusBar().showMessage(_translate( "MainWindow", "No addresses selected.")) - elif count == len(listOfSelectedRows): - self.statusBar().showMessage(_translate( - "MainWindow", "%1 addresses were no chans and therefore not added as recipient, because the client cannot handle messages to yourself.").arg(str(count))) else: - if count > 0: - self.statusBar().showMessage(_translate( - "MainWindow", "%1 addresses were no chans and therefore not added as recipient, because the client cannot handle messages to yourself.").arg(str(count))) - else: - self.statusBar().showMessage('') + self.statusBar().showMessage(message) + if len(added) > 0: self.ui.tabWidget.setCurrentIndex(1) def on_context_menuYourIdentities(self, point): - self.popMenu.exec_( + # disable certain context menu items for multiselection + is_singleselection = len(self.ui.tableWidgetYourIdentities.selectedIndexes())/3 <= 1 + self.actionNewAddress.setEnabled(is_singleselection) + self.actionNewChan.setEnabled(is_singleselection) + self.actionSpecialAddressBehavior.setEnabled(is_singleselection) + self.popMenuIdentities.exec_( self.ui.tableWidgetYourIdentities.mapToGlobal(point)) def on_context_menuInbox(self, point): diff --git a/src/bitmessageqt/bitmessageui.py b/src/bitmessageqt/bitmessageui.py index 825ded1f..a13a1b64 100644 --- a/src/bitmessageqt/bitmessageui.py +++ b/src/bitmessageqt/bitmessageui.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'bitmessageui.ui' # -# Created: Wed Sep 04 14:20:25 2013 +# Created: Thu Sep 05 15:50:05 2013 # by: PyQt4 UI code generator 4.10.2 # # WARNING! All changes made in this file will be lost! @@ -26,7 +26,7 @@ except AttributeError: class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName(_fromUtf8("MainWindow")) - MainWindow.resize(795, 580) + MainWindow.resize(795, 579) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/newPrefix/images/can-icon-24px.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) MainWindow.setWindowIcon(icon) @@ -230,10 +230,11 @@ class Ui_MainWindow(object): self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3")) self.pushButtonNewAddress = QtGui.QPushButton(self.youridentities) self.pushButtonNewAddress.setObjectName(_fromUtf8("pushButtonNewAddress")) - self.gridLayout_3.addWidget(self.pushButtonNewAddress, 0, 0, 1, 1) + self.gridLayout_3.addWidget(self.pushButtonNewAddress, 0, 1, 1, 1) spacerItem2 = QtGui.QSpacerItem(689, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout_3.addItem(spacerItem2, 0, 1, 1, 1) + self.gridLayout_3.addItem(spacerItem2, 0, 3, 1, 1) self.tableWidgetYourIdentities = QtGui.QTableWidget(self.youridentities) + self.tableWidgetYourIdentities.setStyleSheet(_fromUtf8("")) self.tableWidgetYourIdentities.setFrameShadow(QtGui.QFrame.Sunken) self.tableWidgetYourIdentities.setLineWidth(1) self.tableWidgetYourIdentities.setAlternatingRowColors(True) @@ -260,7 +261,10 @@ class Ui_MainWindow(object): self.tableWidgetYourIdentities.verticalHeader().setDefaultSectionSize(26) self.tableWidgetYourIdentities.verticalHeader().setSortIndicatorShown(False) self.tableWidgetYourIdentities.verticalHeader().setStretchLastSection(False) - self.gridLayout_3.addWidget(self.tableWidgetYourIdentities, 1, 0, 1, 2) + self.gridLayout_3.addWidget(self.tableWidgetYourIdentities, 1, 0, 1, 4) + self.pushButtonJoinCreateChan = QtGui.QPushButton(self.youridentities) + self.pushButtonJoinCreateChan.setObjectName(_fromUtf8("pushButtonJoinCreateChan")) + self.gridLayout_3.addWidget(self.pushButtonJoinCreateChan, 0, 2, 1, 1) icon4 = QtGui.QIcon() icon4.addPixmap(QtGui.QPixmap(_fromUtf8(":/newPrefix/images/identities.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.tabWidget.addTab(self.youridentities, icon4, _fromUtf8("")) @@ -279,7 +283,7 @@ class Ui_MainWindow(object): self.gridLayout_4.addItem(spacerItem3, 1, 1, 1, 1) self.tableWidgetSubscriptions = QtGui.QTableWidget(self.subscriptions) self.tableWidgetSubscriptions.setAlternatingRowColors(True) - self.tableWidgetSubscriptions.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) + self.tableWidgetSubscriptions.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.tableWidgetSubscriptions.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) self.tableWidgetSubscriptions.setObjectName(_fromUtf8("tableWidgetSubscriptions")) self.tableWidgetSubscriptions.setColumnCount(2) @@ -349,7 +353,7 @@ class Ui_MainWindow(object): self.gridLayout_6.addItem(spacerItem5, 2, 1, 1, 1) self.tableWidgetBlacklist = QtGui.QTableWidget(self.blackwhitelist) self.tableWidgetBlacklist.setAlternatingRowColors(True) - self.tableWidgetBlacklist.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) + self.tableWidgetBlacklist.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.tableWidgetBlacklist.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) self.tableWidgetBlacklist.setObjectName(_fromUtf8("tableWidgetBlacklist")) self.tableWidgetBlacklist.setColumnCount(2) @@ -490,7 +494,7 @@ class Ui_MainWindow(object): self.menubar.addAction(self.menuHelp.menuAction()) self.retranslateUi(MainWindow) - self.tabWidget.setCurrentIndex(3) + self.tabWidget.setCurrentIndex(6) QtCore.QObject.connect(self.radioButtonSpecific, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.lineEditTo.setEnabled) QtCore.QObject.connect(self.radioButtonSpecific, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.labelSendBroadcastWarning.hide) QtCore.QObject.connect(self.radioButtonBroadcast, QtCore.SIGNAL(_fromUtf8("clicked()")), self.labelSendBroadcastWarning.show) @@ -507,8 +511,7 @@ class Ui_MainWindow(object): MainWindow.setTabOrder(self.textEditMessage, self.pushButtonSend) MainWindow.setTabOrder(self.pushButtonSend, self.tableWidgetSent) MainWindow.setTabOrder(self.tableWidgetSent, self.textEditSentMessage) - MainWindow.setTabOrder(self.textEditSentMessage, self.pushButtonNewAddress) - MainWindow.setTabOrder(self.pushButtonNewAddress, self.tableWidgetYourIdentities) + MainWindow.setTabOrder(self.textEditSentMessage, self.tableWidgetYourIdentities) MainWindow.setTabOrder(self.tableWidgetYourIdentities, self.pushButtonAddSubscription) MainWindow.setTabOrder(self.pushButtonAddSubscription, self.tableWidgetSubscriptions) MainWindow.setTabOrder(self.tableWidgetSubscriptions, self.pushButtonAddAddressBook) @@ -570,7 +573,7 @@ class Ui_MainWindow(object): item = self.tableWidgetSent.horizontalHeaderItem(3) item.setText(_translate("MainWindow", "Status", None)) self.tabWidget.setTabText(self.tabWidget.indexOf(self.sent), _translate("MainWindow", "Sent", None)) - self.pushButtonNewAddress.setText(_translate("MainWindow", "New", None)) + self.pushButtonNewAddress.setText(_translate("MainWindow", "Create new Address", None)) self.tableWidgetYourIdentities.setSortingEnabled(True) item = self.tableWidgetYourIdentities.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "Label (not shown to anyone)", None)) @@ -578,6 +581,7 @@ class Ui_MainWindow(object): item.setText(_translate("MainWindow", "Address", None)) item = self.tableWidgetYourIdentities.horizontalHeaderItem(2) item.setText(_translate("MainWindow", "Stream", None)) + self.pushButtonJoinCreateChan.setText(_translate("MainWindow", "Join / Create Chan", None)) self.tabWidget.setTabText(self.tabWidget.indexOf(self.youridentities), _translate("MainWindow", "Your Identities", None)) self.label_5.setText(_translate("MainWindow", "Here you can subscribe to \'broadcast messages\' that are sent by other users. Messages will appear in your Inbox. Addresses here override those on the Blacklist tab.", None)) self.pushButtonAddSubscription.setText(_translate("MainWindow", "Add new Subscription", None)) diff --git a/src/bitmessageqt/bitmessageui.ui b/src/bitmessageqt/bitmessageui.ui index e9af3c17..51790bc6 100644 --- a/src/bitmessageqt/bitmessageui.ui +++ b/src/bitmessageqt/bitmessageui.ui @@ -7,7 +7,7 @@ 0 0 795 - 580 + 579 @@ -57,7 +57,7 @@ QTabWidget::Rounded - 3 + 6 @@ -485,14 +485,14 @@ p, li { white-space: pre-wrap; } Your Identities - + - New + Create new Address - + Qt::Horizontal @@ -505,8 +505,11 @@ p, li { white-space: pre-wrap; } - + + + + QFrame::Sunken @@ -574,6 +577,13 @@ p, li { white-space: pre-wrap; } + + + + Join / Create Chan + + + @@ -621,7 +631,7 @@ p, li { white-space: pre-wrap; } true - QAbstractItemView::SingleSelection + QAbstractItemView::ExtendedSelection QAbstractItemView::SelectRows @@ -795,7 +805,7 @@ p, li { white-space: pre-wrap; } true - QAbstractItemView::SingleSelection + QAbstractItemView::ExtendedSelection QAbstractItemView::SelectRows @@ -1173,7 +1183,6 @@ p, li { white-space: pre-wrap; } pushButtonSend tableWidgetSent textEditSentMessage - pushButtonNewAddress tableWidgetYourIdentities pushButtonAddSubscription tableWidgetSubscriptions @@ -1197,12 +1206,12 @@ p, li { white-space: pre-wrap; } setEnabled(bool) - 121 - 60 + 37 + 50 - 175 - 147 + 37 + 58 @@ -1213,12 +1222,12 @@ p, li { white-space: pre-wrap; } hide() - 95 - 59 + 37 + 50 - 129 - 528 + 76 + 69 @@ -1229,12 +1238,12 @@ p, li { white-space: pre-wrap; } show() - 108 - 84 + 70 + 53 - 177 - 519 + 76 + 69 diff --git a/src/bitmessageqt/settings.py b/src/bitmessageqt/settings.py index 44ef36e2..4a2fd0f0 100644 --- a/src/bitmessageqt/settings.py +++ b/src/bitmessageqt/settings.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'settings.ui' # -# Created: Wed Sep 04 14:20:27 2013 +# Created: Thu Sep 05 15:50:06 2013 # by: PyQt4 UI code generator 4.10.2 # # WARNING! All changes made in this file will be lost!