Browse Source

add fiat<->sat conversion methods and hook up UI

patch-4
Sander van Grieken 3 years ago
parent
commit
d5cfb67ebe
  1. 31
      electrum/gui/qml/components/Receive.qml
  2. 54
      electrum/gui/qml/components/Send.qml
  3. 2
      electrum/gui/qml/qeapp.py
  4. 28
      electrum/gui/qml/qedaemon.py

31
electrum/gui/qml/components/Receive.qml

@ -81,16 +81,20 @@ Pane {
TextField { TextField {
id: amountFiat id: amountFiat
visible: Config.fiatCurrency != ''
font.family: FixedFont font.family: FixedFont
Layout.fillWidth: true Layout.fillWidth: true
inputMethodHints: Qt.ImhDigitsOnly inputMethodHints: Qt.ImhDigitsOnly
} }
Label { Label {
text: qsTr('EUR') visible: Config.fiatCurrency != ''
text: Config.fiatCurrency
color: Material.accentColor color: Material.accentColor
} }
Item { visible: Config.fiatCurrency == ''; width: 1; height: 1; Layout.columnSpan: 2 }
RowLayout { RowLayout {
Layout.columnSpan: 4 Layout.columnSpan: 4
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
@ -346,4 +350,29 @@ Pane {
} }
} }
Connections {
target: amount
function onTextChanged() {
if (amountFiat.activeFocus)
return
var a = Config.unitsToSats(amount.text)
amountFiat.text = Daemon.fiatValue(a)
}
}
Connections {
target: amountFiat
function onTextChanged() {
if (amountFiat.activeFocus) {
amount.text = Daemon.satoshiValue(amountFiat.text)
}
}
}
Connections {
target: Network
function onFiatUpdated() {
var a = Config.unitsToSats(amount.text)
amountFiat.text = Daemon.fiatValue(a)
}
}
} }

54
electrum/gui/qml/components/Send.qml

@ -8,10 +8,10 @@ Pane {
GridLayout { GridLayout {
width: parent.width width: parent.width
columns: 4 columns: 6
BalanceSummary { BalanceSummary {
Layout.columnSpan: 4 Layout.columnSpan: 6
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
} }
@ -21,7 +21,7 @@ Pane {
TextField { TextField {
id: address id: address
Layout.columnSpan: 2 Layout.columnSpan: 4
Layout.fillWidth: true Layout.fillWidth: true
font.family: FixedFont font.family: FixedFont
placeholderText: qsTr('Paste address or invoice') placeholderText: qsTr('Paste address or invoice')
@ -46,11 +46,26 @@ Pane {
} }
Label { Label {
text: Config.baseUnit text: Config.baseUnit + ' ' // add spaces for easy right margin
color: Material.accentColor
}
TextField {
id: amountFiat
visible: Config.fiatCurrency != ''
font.family: FixedFont
placeholderText: qsTr('Amount')
inputMethodHints: Qt.ImhPreferNumbers
}
Label {
visible: Config.fiatCurrency != ''
text: Config.fiatCurrency
color: Material.accentColor color: Material.accentColor
Layout.fillWidth: true
} }
Item { visible: Config.fiatCurrency == ''; height: 1; Layout.columnSpan: 2; Layout.fillWidth: true }
Item { width: 1; height: 1 } // workaround colspan on baseunit messing up row above Item { width: 1; height: 1 } // workaround colspan on baseunit messing up row above
Label { Label {
@ -61,11 +76,11 @@ Pane {
id: fee id: fee
font.family: FixedFont font.family: FixedFont
placeholderText: qsTr('sat/vB') placeholderText: qsTr('sat/vB')
Layout.columnSpan: 3 Layout.columnSpan: 5
} }
RowLayout { RowLayout {
Layout.columnSpan: 4 Layout.columnSpan: 6
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
spacing: 10 spacing: 10
@ -94,6 +109,31 @@ Pane {
} }
} }
Connections {
target: amount
function onTextChanged() {
if (amountFiat.activeFocus)
return
var a = Config.unitsToSats(amount.text)
amountFiat.text = Daemon.fiatValue(a)
}
}
Connections {
target: amountFiat
function onTextChanged() {
if (amountFiat.activeFocus) {
amount.text = Daemon.satoshiValue(amountFiat.text)
}
}
}
Connections {
target: Network
function onFiatUpdated() {
var a = Config.unitsToSats(amount.text)
amountFiat.text = Daemon.fiatValue(a)
}
}
// make clicking the dialog background move the scope away from textedit fields // make clicking the dialog background move the scope away from textedit fields
// so the keyboard goes away // so the keyboard goes away
MouseArea { MouseArea {

2
electrum/gui/qml/qeapp.py

@ -121,6 +121,8 @@ class ElectrumQmlApplication(QGuiApplication):
'protocol_version': version.PROTOCOL_VERSION 'protocol_version': version.PROTOCOL_VERSION
}) })
self._qeconfig.fiatCurrencyChanged.connect(self._qedaemon.setFiatCurrency)
qInstallMessageHandler(self.message_handler) qInstallMessageHandler(self.message_handler)
# get notified whether root QML document loads or not # get notified whether root QML document loads or not

28
electrum/gui/qml/qedaemon.py

@ -1,4 +1,5 @@
import os import os
from decimal import Decimal
from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QUrl from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QUrl
from PyQt5.QtCore import Qt, QAbstractListModel, QModelIndex from PyQt5.QtCore import Qt, QAbstractListModel, QModelIndex
@ -7,6 +8,7 @@ from electrum.util import register_callback, get_new_wallet_name, WalletFileExce
from electrum.logging import get_logger from electrum.logging import get_logger
from electrum.wallet import Wallet, Abstract_Wallet from electrum.wallet import Wallet, Abstract_Wallet
from electrum.storage import WalletStorage, StorageReadWriteError from electrum.storage import WalletStorage, StorageReadWriteError
from electrum.bitcoin import COIN
from .qewallet import QEWallet from .qewallet import QEWallet
@ -133,6 +135,32 @@ class QEDaemon(QObject):
self._logger.error(str(e)) self._logger.error(str(e))
self.walletOpenError.emit(str(e)) self.walletOpenError.emit(str(e))
@pyqtSlot(str, result=str)
def fiatValue(self, satoshis):
rate = self.daemon.fx.exchange_rate()
try:
sd = Decimal(satoshis)
if sd == 0:
return ''
except:
return ''
return self.daemon.fx.value_str(satoshis,rate)
# TODO: move conversion to FxThread
@pyqtSlot(str, result=str)
def satoshiValue(self, fiat):
rate = self.daemon.fx.exchange_rate()
try:
fd = Decimal(fiat)
except:
return ''
v = fd / Decimal(rate) * COIN
return '' if v.is_nan() else self.daemon.config.format_amount(v)
@pyqtSlot()
def setFiatCurrency(self):
self.daemon.fx.set_currency(self.daemon.config.get('currency'))
@pyqtProperty('QString') @pyqtProperty('QString')
def path(self): def path(self):
return self._path return self._path

Loading…
Cancel
Save