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")
 | |
| 
 | 
