90 lines
3.1 KiB
Python
90 lines
3.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from typing import Union
|
|
from decimal import Decimal
|
|
|
|
from . import qt_resources
|
|
if qt_resources.QT_VERSION == 5:
|
|
from PyQt5.QtWidgets import (QLineEdit, QStyle, QStyleOptionFrame, QSizePolicy)
|
|
from PyQt5.QtGui import QPalette, QPainter
|
|
from PyQt5.QtCore import pyqtSignal, Qt, QSize
|
|
else:
|
|
from PyQt6.QtWidgets import (QLineEdit, QStyle, QStyleOptionFrame, QSizePolicy)
|
|
from PyQt6.QtGui import QPalette, QPainter
|
|
from PyQt6.QtCore import pyqtSignal, Qt, QSize
|
|
|
|
|
|
from electrum.util import (format_satoshis_plain, decimal_point_to_base_unit_name,
|
|
FEERATE_PRECISION, quantize_feerate, DECIMAL_POINT, UI_UNIT_NAME_FEERATE_SAT_PER_VBYTE)
|
|
|
|
from electrum.gui.qt.amountedit import BTCAmountEdit, char_width_in_lineedit, ColorScheme
|
|
|
|
_NOT_GIVEN = object() # sentinel value
|
|
|
|
|
|
class PercAmountEdit(BTCAmountEdit):
|
|
def __init__(self, decimal_point, is_int=False, parent=None, *, max_amount=_NOT_GIVEN):
|
|
super().__init__(decimal_point, is_int, parent, max_amount=max_amount)
|
|
|
|
def numbify(self):
|
|
text = self.text().strip()
|
|
if text == '!':
|
|
self.shortcut.emit()
|
|
return
|
|
pos = self.cursorPosition()
|
|
chars = '0123456789%'
|
|
chars += DECIMAL_POINT
|
|
|
|
s = ''.join([i for i in text if i in chars])
|
|
|
|
if '%' in s:
|
|
self.is_perc=True
|
|
s=s.replace('%','')
|
|
else:
|
|
self.is_perc=False
|
|
|
|
if DECIMAL_POINT in s:
|
|
p = s.find(DECIMAL_POINT)
|
|
s = s.replace(DECIMAL_POINT, '')
|
|
s = s[:p] + DECIMAL_POINT + s[p:p+8]
|
|
if self.is_perc:
|
|
s+='%'
|
|
|
|
|
|
#if self.max_amount:
|
|
# if (amt := self._get_amount_from_text(s)) and amt >= self.max_amount:
|
|
# s = self._get_text_from_amount(self.max_amount)
|
|
self.setText(s)
|
|
# setText sets Modified to False. Instead we want to remember
|
|
# if updates were because of user modification.
|
|
self.setModified(self.hasFocus())
|
|
self.setCursorPosition(pos)
|
|
#if len(s>0)
|
|
# self.drawText("")
|
|
|
|
def _get_amount_from_text(self, text: str) -> Union[None, Decimal, int]:
|
|
try:
|
|
text = text.replace(DECIMAL_POINT, '.')
|
|
text = text.replace('%', '')
|
|
return (Decimal)(text)
|
|
except Exception:
|
|
return None
|
|
|
|
def _get_text_from_amount(self, amount):
|
|
out = super()._get_text_from_amount(amount)
|
|
if self.is_perc: out+='%'
|
|
return out
|
|
|
|
def paintEvent(self, event):
|
|
QLineEdit.paintEvent(self, event)
|
|
if self.base_unit:
|
|
panel = QStyleOptionFrame()
|
|
self.initStyleOption(panel)
|
|
textRect = self.style().subElementRect(QStyle.SubElement.SE_LineEditContents, panel, self)
|
|
textRect.adjust(2, 0, -10, 0)
|
|
painter = QPainter(self)
|
|
painter.setPen(ColorScheme.GRAY.as_color())
|
|
if len(self.text())==0:
|
|
painter.drawText(textRect, int(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter), self.base_unit() + " or perc value")
|
|
|