Browse Source

more QEAmount refactoring

master
Sander van Grieken 4 years ago
parent
commit
a163268d79
  1. 6
      electrum/gui/qml/components/Receive.qml
  2. 2
      electrum/gui/qml/components/Send.qml
  3. 10
      electrum/gui/qml/qeconfig.py
  4. 12
      electrum/gui/qml/qetxfinalizer.py
  5. 13
      electrum/gui/qml/qewallet.py

6
electrum/gui/qml/components/Receive.qml

@ -43,12 +43,12 @@ Pane {
placeholderText: qsTr('Amount')
inputMethodHints: Qt.ImhPreferNumbers
property string textAsSats
property Amount textAsSats
onTextChanged: {
textAsSats = Config.unitsToSats(amount.text)
if (amountFiat.activeFocus)
return
amountFiat.text = Daemon.fx.fiatValue(amount.textAsSats)
amountFiat.text = text == '' ? '' : Daemon.fx.fiatValue(amount.textAsSats)
}
Connections {
@ -109,7 +109,7 @@ Pane {
expiresmodel.append({'text': qsTr('1 hour'), 'value': 60*60})
expiresmodel.append({'text': qsTr('1 day'), 'value': 24*60*60})
expiresmodel.append({'text': qsTr('1 week'), 'value': 7*24*60*60})
expiresmodel.append({'text': qsTr('1 month'), 'value': 31*7*24*60*60})
expiresmodel.append({'text': qsTr('1 month'), 'value': 31*24*60*60})
expiresmodel.append({'text': qsTr('Never'), 'value': 0})
expires.currentIndex = 0
}

2
electrum/gui/qml/components/Send.qml

@ -77,7 +77,7 @@ Pane {
placeholderText: qsTr('Amount')
Layout.preferredWidth: parent.width /2
inputMethodHints: Qt.ImhPreferNumbers
property string textAsSats
property Amount textAsSats
onTextChanged: {
textAsSats = Config.unitsToSats(amount.text)
if (amountFiat.activeFocus)

10
electrum/gui/qml/qeconfig.py

@ -89,23 +89,25 @@ class QEConfig(QObject):
def max_precision(self):
return self.decimal_point() + 0 #self.extra_precision
@pyqtSlot(str, result='qint64')
@pyqtSlot(str, result=QEAmount)
def unitsToSats(self, unitAmount):
self._amount = QEAmount()
try:
x = Decimal(unitAmount)
except:
return 0
return self._amount
# scale it to max allowed precision, make it an int
max_prec_amount = int(pow(10, self.max_precision()) * x)
# if the max precision is simply what unit conversion allows, just return
if self.max_precision() == self.decimal_point():
return max_prec_amount
self._amount = QEAmount(amount_sat=max_prec_amount)
return self._amount
self._logger.debug('fallthrough')
# otherwise, scale it back to the expected unit
#amount = Decimal(max_prec_amount) / Decimal(pow(10, self.max_precision()-self.decimal_point()))
#return int(amount) #Decimal(amount) if not self.is_int else int(amount)
return 0
return self._amount
@pyqtSlot('quint64', result=float)
def satsToUnits(self, satoshis):

12
electrum/gui/qml/qetxfinalizer.py

@ -8,6 +8,7 @@ from electrum.transaction import PartialTxOutput
from electrum.util import NotEnoughFunds, profiler
from .qewallet import QEWallet
from .qetypes import QEAmount
class QETxFinalizer(QObject):
def __init__(self, parent=None):
@ -16,7 +17,7 @@ class QETxFinalizer(QObject):
_logger = get_logger(__name__)
_address = ''
_amount = ''
_amount = QEAmount()
_fee = ''
_feeRate = ''
_wallet = None
@ -58,14 +59,14 @@ class QETxFinalizer(QObject):
self.addressChanged.emit()
amountChanged = pyqtSignal()
@pyqtProperty(str, notify=amountChanged)
@pyqtProperty(QEAmount, notify=amountChanged)
def amount(self):
return self._amount
@amount.setter
def amount(self, amount):
if self._amount != amount:
self._logger.info('amount = "%s"' % amount)
self._logger.info('amount = "%s"' % repr(amount))
self._amount = amount
self.amountChanged.emit()
@ -181,7 +182,7 @@ class QETxFinalizer(QObject):
@profiler
def make_tx(self, rbf: bool):
coins = self._wallet.wallet.get_spendable_coins(None)
outputs = [PartialTxOutput.from_address_and_value(self.address, int(self.amount))]
outputs = [PartialTxOutput.from_address_and_value(self.address, self._amount.satsInt)]
tx = self._wallet.wallet.make_unsigned_transaction(coins=coins,outputs=outputs, fee=None)
self._logger.debug('fee: %d, inputs: %d, outputs: %d' % (tx.get_fee(), len(tx.inputs()), len(tx.outputs())))
return tx
@ -204,7 +205,8 @@ class QETxFinalizer(QObject):
self.validChanged.emit()
return
amount = int(self.amount) if self.amount != '!' else tx.output_value()
amount = self._amount.satsInt if not self._amount.isMax else tx.output_value()
tx_size = tx.estimated_size()
fee = tx.get_fee()
feerate = Decimal(fee) / tx_size # sat/byte

13
electrum/gui/qml/qewallet.py

@ -16,6 +16,7 @@ from electrum.invoices import (Invoice, InvoiceError, PR_TYPE_ONCHAIN, PR_TYPE
from .qeinvoicelistmodel import QEInvoiceListModel, QERequestListModel
from .qetransactionlistmodel import QETransactionListModel
from .qeaddresslistmodel import QEAddressListModel
from .qetypes import QEAmount
class QEWallet(QObject):
__instances = []
@ -318,10 +319,10 @@ class QEWallet(QObject):
self._requestModel.add_invoice(req)
return addr
@pyqtSlot('quint64', 'QString', int)
@pyqtSlot('quint64', 'QString', int, bool)
@pyqtSlot('quint64', 'QString', int, bool, bool)
def create_request(self, amount: int, message: str, expiration: int, is_lightning: bool = False, ignore_gap: bool = False):
@pyqtSlot(QEAmount, 'QString', int)
@pyqtSlot(QEAmount, 'QString', int, bool)
@pyqtSlot(QEAmount, 'QString', int, bool, bool)
def create_request(self, amount: QEAmount, message: str, expiration: int, is_lightning: bool = False, ignore_gap: bool = False):
expiry = expiration #TODO: self.config.get('request_expiry', PR_DEFAULT_EXPIRATION_WHEN_CREATING)
try:
if is_lightning:
@ -329,9 +330,9 @@ class QEWallet(QObject):
self.requestCreateError.emit('fatal',_("You need to open a Lightning channel first."))
return
# TODO maybe show a warning if amount exceeds lnworker.num_sats_can_receive (as in kivy)
key = self.wallet.lnworker.add_request(amount, message, expiry)
key = self.wallet.lnworker.add_request(amount.satsInt, message, expiry)
else:
key = self.create_bitcoin_request(amount, message, expiry, ignore_gap)
key = self.create_bitcoin_request(amount.satsInt, message, expiry, ignore_gap)
if not key:
return
self._addressModel.init_model()

Loading…
Cancel
Save