diff --git a/res/ui/transfer.ui b/res/ui/transfer.ui index d258290a8cd86addfc12749be43ec20cf359f106..64837315bef1d008698f420be49e8bcd95fc2b09 100644 --- a/res/ui/transfer.ui +++ b/res/ui/transfer.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>496</width> - <height>440</height> + <height>485</height> </rect> </property> <property name="windowTitle"> @@ -36,6 +36,12 @@ <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QRadioButton" name="radio_contact"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> <property name="text"> <string>Con&tact</string> </property> @@ -44,11 +50,33 @@ </property> </widget> </item> + <item> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Maximum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> <item> <widget class="QComboBox" name="combo_contact"> <property name="enabled"> <bool>true</bool> </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> </widget> </item> </layout> @@ -57,6 +85,12 @@ <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QRadioButton" name="radio_pubkey"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> <property name="text"> <string>&Recipient public key</string> </property> @@ -65,11 +99,33 @@ </property> </widget> </item> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Maximum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> <item> <widget class="QLineEdit" name="edit_pubkey"> <property name="enabled"> <bool>false</bool> </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> <property name="inputMask"> <string/> </property> @@ -83,6 +139,52 @@ </item> </layout> </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_5"> + <property name="topMargin"> + <number>6</number> + </property> + <item> + <widget class="QRadioButton" name="radio_search"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>S&earch user</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Maximum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="SearchUserWidget" name="search_user" native="true"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </item> </layout> </widget> </item> @@ -188,121 +290,16 @@ </item> </layout> </widget> + <customwidgets> + <customwidget> + <class>SearchUserWidget</class> + <extends>QWidget</extends> + <header>sakia.gui.widgets.search_user</header> + <container>1</container> + </customwidget> + </customwidgets> <resources/> - <connections> - <connection> - <sender>button_box</sender> - <signal>accepted()</signal> - <receiver>TransferMoneyDialog</receiver> - <slot>accept()</slot> - <hints> - <hint type="sourcelabel"> - <x>248</x> - <y>254</y> - </hint> - <hint type="destinationlabel"> - <x>157</x> - <y>274</y> - </hint> - </hints> - </connection> - <connection> - <sender>button_box</sender> - <signal>rejected()</signal> - <receiver>TransferMoneyDialog</receiver> - <slot>reject()</slot> - <hints> - <hint type="sourcelabel"> - <x>316</x> - <y>260</y> - </hint> - <hint type="destinationlabel"> - <x>286</x> - <y>274</y> - </hint> - </hints> - </connection> - <connection> - <sender>combo_wallets</sender> - <signal>currentIndexChanged(int)</signal> - <receiver>TransferMoneyDialog</receiver> - <slot>change_displayed_wallet(int)</slot> - <hints> - <hint type="sourcelabel"> - <x>82</x> - <y>264</y> - </hint> - <hint type="destinationlabel"> - <x>199</x> - <y>244</y> - </hint> - </hints> - </connection> - <connection> - <sender>radio_pubkey</sender> - <signal>toggled(bool)</signal> - <receiver>TransferMoneyDialog</receiver> - <slot>recipient_mode_changed(bool)</slot> - <hints> - <hint type="sourcelabel"> - <x>87</x> - <y>51</y> - </hint> - <hint type="destinationlabel"> - <x>199</x> - <y>244</y> - </hint> - </hints> - </connection> - <connection> - <sender>combo_community</sender> - <signal>currentIndexChanged(int)</signal> - <receiver>TransferMoneyDialog</receiver> - <slot>change_current_community(int)</slot> - <hints> - <hint type="sourcelabel"> - <x>199</x> - <y>50</y> - </hint> - <hint type="destinationlabel"> - <x>199</x> - <y>165</y> - </hint> - </hints> - </connection> - <connection> - <sender>spinbox_relative</sender> - <signal>valueChanged(double)</signal> - <receiver>TransferMoneyDialog</receiver> - <slot>relative_amount_changed()</slot> - <hints> - <hint type="sourcelabel"> - <x>320</x> - <y>269</y> - </hint> - <hint type="destinationlabel"> - <x>199</x> - <y>165</y> - </hint> - </hints> - </connection> - <connection> - <sender>spinbox_amount</sender> - <signal>valueChanged(double)</signal> - <receiver>TransferMoneyDialog</receiver> - <slot>amount_changed()</slot> - <hints> - <hint type="sourcelabel"> - <x>209</x> - <y>292</y> - </hint> - <hint type="destinationlabel"> - <x>247</x> - <y>219</y> - </hint> - </hints> - </connection> - </connections> + <connections/> <slots> <slot>open_manage_wallet_coins()</slot> <slot>change_displayed_wallet(int)</slot> diff --git a/src/sakia/gui/mainwindow.py b/src/sakia/gui/mainwindow.py index 1538cd59984883b99c14e996eaa74124e758374a..3c0b01812dc1a4de69231c7bb232fa7024fdf519 100644 --- a/src/sakia/gui/mainwindow.py +++ b/src/sakia/gui/mainwindow.py @@ -173,7 +173,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.password_asker, self.community_view.community, None) - if dialog.exec_() == QDialog.Accepted: + if dialog.exec() == QDialog.Accepted: self.community_view.tab_history.table_history.model().sourceModel().refresh_transfers() def open_certification_dialog(self): diff --git a/src/sakia/gui/transfer.py b/src/sakia/gui/transfer.py index e0dae0faab07a4df7efeb45827bc59c7ad39f6f1..72afc7b4d8354c36d61910dd7da11c9a0c326f53 100644 --- a/src/sakia/gui/transfer.py +++ b/src/sakia/gui/transfer.py @@ -6,7 +6,7 @@ Created on 2 févr. 2014 import asyncio from PyQt5.QtWidgets import QDialog, QApplication -from PyQt5.QtCore import QRegExp, Qt +from PyQt5.QtCore import QRegExp, Qt, QObject from PyQt5.QtGui import QRegExpValidator @@ -16,24 +16,31 @@ from sakia.gui.widgets.dialogs import QAsyncMessageBox, QMessageBox from ..tools.decorators import asyncify -class TransferMoneyDialog(QDialog, Ui_TransferMoneyDialog): +class TransferMoneyDialog(QObject): """ classdocs """ - def __init__(self, app, sender, password_asker, community, transfer): + def __init__(self, app, account, password_asker, community, transfer, widget=QDialog, view=Ui_TransferMoneyDialog): """ Constructor :param sakia.core.Application app: The application - :param sakia.core.Account sender: The sender + :param sakia.core.Account account: The account :param sakia.gui.password_asker.Password_Asker password_asker: The password asker + :param sakia.core.Community community: + :param sakia.core.Transfer transfer: + :param class widget: + :param class view: :return: """ super().__init__() - self.setupUi(self) + self.widget = widget() + self.ui = view() + self.ui.setupUi(self.widget) + self.app = app - self.account = sender + self.account = account self.password_asker = password_asker self.recipient_trusts = [] self.transfer = transfer @@ -41,41 +48,54 @@ class TransferMoneyDialog(QDialog, Ui_TransferMoneyDialog): self.community = community if community else self.account.communities[0] self.wallet = self.account.wallets[0] + self.ui.radio_contact.toggled.connect(lambda c, radio="contact": self.recipient_mode_changed(radio)) + self.ui.radio_pubkey.toggled.connect(lambda c, radio="pubkey": self.recipient_mode_changed(radio)) + self.ui.radio_search.toggled.connect(lambda c, radio="search": self.recipient_mode_changed(radio)) + self.ui.button_box.accepted.connect(self.accept) + self.ui.button_box.rejected.connect(self.widget.reject) + self.ui.combo_wallets.currentIndexChanged.connect(self.change_displayed_wallet) + self.ui.combo_community.currentIndexChanged.connect(self.change_current_community) + self.ui.spinbox_relative.valueChanged.connect(self.relative_amount_changed) + self.ui.spinbox_amount.valueChanged.connect(self.amount_changed) + self.ui.search_user.button_reset.hide() + self.ui.search_user.init(self.app) + self.ui.search_user.change_account(self.account) + self.ui.search_user.change_community(self.community) + regexp = QRegExp('^([ a-zA-Z0-9-_:/;*?\[\]\(\)\\\?!^+=@&~#{}|<>%.]{0,255})$') validator = QRegExpValidator(regexp) - self.edit_message.setValidator(validator) + self.ui.edit_message.setValidator(validator) for community in self.account.communities: - self.combo_community.addItem(community.currency) + self.ui.combo_community.addItem(community.currency) for wallet in self.account.wallets: - self.combo_wallets.addItem(wallet.name) + self.ui.combo_wallets.addItem(wallet.name) - for contact_name in sorted([c['name'] for c in sender.contacts], key=str.lower): - self.combo_contact.addItem(contact_name) + for contact_name in sorted([c['name'] for c in account.contacts], key=str.lower): + self.ui.combo_contact.addItem(contact_name) if len(self.account.contacts) == 0: - self.combo_contact.setEnabled(False) - self.radio_contact.setEnabled(False) - self.radio_pubkey.setChecked(True) + self.ui.combo_contact.setEnabled(False) + self.ui.radio_contact.setEnabled(False) + self.ui.radio_pubkey.setChecked(True) - self.combo_community.setCurrentText(self.community.name) + self.ui.combo_community.setCurrentText(self.community.name) if self.transfer: - sender = self.transfer.metadata['issuer'] - wallet_index = [w.pubkey for w in app.current_account.wallets].index(sender) - self.combo_wallets.setCurrentIndex(wallet_index) - self.edit_pubkey.setText(transfer.metadata['receiver']) - self.radio_pubkey.setChecked(True) - self.edit_message.setText(transfer.metadata['comment']) - + account = self.transfer.metadata['issuer'] + wallet_index = [w.pubkey for w in app.current_account.wallets].index(account) + self.ui.combo_wallets.setCurrentIndex(wallet_index) + self.ui.edit_pubkey.setText(transfer.metadata['receiver']) + self.ui.radio_pubkey.setChecked(True) + self.ui.edit_message.setText(transfer.metadata['comment']) @classmethod async def send_money_to_identity(cls, app, account, password_asker, community, identity): dialog = cls(app, account, password_asker, community, None) dialog.edit_pubkey.setText(identity.pubkey) dialog.radio_pubkey.setChecked(True) - return (await dialog.async_exec()) + return await dialog.async_exec() @classmethod async def send_transfer_again(cls, app, account, password_asker, community, transfer): @@ -86,27 +106,32 @@ class TransferMoneyDialog(QDialog, Ui_TransferMoneyDialog): dialog.spinbox_relative.setMaximum(relative) dialog.spinbox_amount.setValue(transfer.metadata['amount']) - return (await dialog.async_exec()) + return await dialog.async_exec() @asyncify async def accept(self): - self.button_box.setEnabled(False) - comment = self.edit_message.text() + self.ui.button_box.setEnabled(False) + comment = self.ui.edit_message.text() - if self.radio_contact.isChecked(): + if self.ui.radio_contact.isChecked(): for contact in self.account.contacts: - if contact['name'] == self.combo_contact.currentText(): + if contact['name'] == self.ui.combo_contact.currentText(): recipient = contact['pubkey'] break + elif self.ui.radio_search.isChecked(): + if self.ui.search_user.current_identity(): + recipient = self.ui.search_user.current_identity().pubkey + else: + return else: - recipient = self.edit_pubkey.text() - amount = self.spinbox_amount.value() + recipient = self.ui.edit_pubkey.text() + amount = self.ui.spinbox_amount.value() if not amount: await QAsyncMessageBox.critical(self, self.tr("Money transfer"), self.tr("No amount. Please give the transfert amount"), QMessageBox.Ok) - self.button_box.setEnabled(True) + self.ui.button_box.setEnabled(True) return password = await self.password_asker.async_exec() @@ -130,7 +155,7 @@ class TransferMoneyDialog(QDialog, Ui_TransferMoneyDialog): if self.transfer: self.transfer.cancel() - super().accept() + self.widget.accept() else: if self.app.preferences['notifications']: toast.display(self.tr("Transfer"), "Error : {0}".format(result[1])) @@ -138,23 +163,23 @@ class TransferMoneyDialog(QDialog, Ui_TransferMoneyDialog): await QAsyncMessageBox.critical(self, self.tr("Transfer"), result[1]) QApplication.restoreOverrideCursor() - self.button_box.setEnabled(True) + self.ui.button_box.setEnabled(True) @asyncify async def amount_changed(self, value): dividend = await self.community.dividend() relative = value / dividend - self.spinbox_relative.blockSignals(True) - self.spinbox_relative.setValue(relative) - self.spinbox_relative.blockSignals(False) + self.ui.spinbox_relative.blockSignals(True) + self.ui.spinbox_relative.setValue(relative) + self.ui.spinbox_relative.blockSignals(False) @asyncify async def relative_amount_changed(self, value): dividend = await self.community.dividend() amount = value * dividend - self.spinbox_amount.blockSignals(True) - self.spinbox_amount.setValue(amount) - self.spinbox_amount.blockSignals(False) + self.ui.spinbox_amount.blockSignals(True) + self.ui.spinbox_amount.setValue(amount) + self.ui.spinbox_amount.blockSignals(False) @asyncify async def change_current_community(self, index): @@ -164,13 +189,13 @@ class TransferMoneyDialog(QDialog, Ui_TransferMoneyDialog): ref_text = await self.account.current_ref(amount, self.community, self.app)\ .diff_localized(units=True, international_system=self.app.preferences['international_system_of_units']) - self.label_total.setText("{0}".format(ref_text)) - self.spinbox_amount.setSuffix(" " + self.community.currency) + self.ui.label_total.setText("{0}".format(ref_text)) + self.ui.spinbox_amount.setSuffix(" " + self.community.currency) amount = await self.wallet.value(self.community) dividend = await self.community.dividend() relative = amount / dividend - self.spinbox_amount.setMaximum(amount) - self.spinbox_relative.setMaximum(relative) + self.ui.spinbox_amount.setMaximum(amount) + self.ui.spinbox_relative.setMaximum(relative) @asyncify async def change_displayed_wallet(self, index): @@ -179,19 +204,23 @@ class TransferMoneyDialog(QDialog, Ui_TransferMoneyDialog): ref_text = await self.account.current_ref(amount, self.community, self.app)\ .diff_localized(units=True, international_system=self.app.preferences['international_system_of_units']) - self.label_total.setText("{0}".format(ref_text)) + self.ui.label_total.setText("{0}".format(ref_text)) amount = await self.wallet.value(self.community) dividend = await self.community.dividend() relative = amount / dividend - self.spinbox_amount.setMaximum(amount) - self.spinbox_relative.setMaximum(relative) + self.ui.spinbox_amount.setMaximum(amount) + self.ui.spinbox_relative.setMaximum(relative) - def recipient_mode_changed(self, pubkey_toggled): - self.edit_pubkey.setEnabled(pubkey_toggled) - self.combo_contact.setEnabled(not pubkey_toggled) + def recipient_mode_changed(self, radio): + self.ui.edit_pubkey.setEnabled(radio == "pubkey") + self.ui.combo_contact.setEnabled(radio == "contact") + self.ui.search_user.setEnabled(radio == "search") def async_exec(self): future = asyncio.Future() self.finished.connect(lambda r: future.set_result(r)) self.open() return future + + def exec(self): + self.widget.exec() \ No newline at end of file