qt ButtonsWidget: refactor into OverlayControlMixin; fix alignmt/hover
This ports the following:782f213bbd2e5af27a7c889fcbd26ac07b0ad616
This commit is contained in:
@@ -85,8 +85,7 @@ class PayToEdit(CompletionTextEdit, ScanQRTextEdit, Logger):
|
|||||||
def setFrozen(self, b):
|
def setFrozen(self, b):
|
||||||
self.setReadOnly(b)
|
self.setReadOnly(b)
|
||||||
self.setStyleSheet(frozen_style if b else normal_style)
|
self.setStyleSheet(frozen_style if b else normal_style)
|
||||||
for button in self.buttons:
|
self.overlay_widget.setHidden(b)
|
||||||
button.setHidden(b)
|
|
||||||
|
|
||||||
def setGreen(self):
|
def setGreen(self):
|
||||||
self.setStyleSheet(util.ColorScheme.GREEN.as_stylesheet(True))
|
self.setStyleSheet(util.ColorScheme.GREEN.as_stylesheet(True))
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ from PyQt5.QtWidgets import (QPushButton, QLabel, QMessageBox, QHBoxLayout,
|
|||||||
QStyle, QDialog, QGroupBox, QButtonGroup, QRadioButton,
|
QStyle, QDialog, QGroupBox, QButtonGroup, QRadioButton,
|
||||||
QFileDialog, QWidget, QToolButton, QTreeView, QPlainTextEdit,
|
QFileDialog, QWidget, QToolButton, QTreeView, QPlainTextEdit,
|
||||||
QHeaderView, QApplication, QToolTip, QTreeWidget, QStyledItemDelegate,
|
QHeaderView, QApplication, QToolTip, QTreeWidget, QStyledItemDelegate,
|
||||||
QMenu, QStyleOptionViewItem, QLayout, QLayoutItem,
|
QMenu, QStyleOptionViewItem, QLayout, QLayoutItem, QAbstractButton,
|
||||||
QGraphicsEffect, QGraphicsScene, QGraphicsPixmapItem)
|
QGraphicsEffect, QGraphicsScene, QGraphicsPixmapItem)
|
||||||
|
|
||||||
from electrum.i18n import _, languages
|
from electrum.i18n import _, languages
|
||||||
@@ -830,31 +830,49 @@ class MySortModel(QSortFilterProxyModel):
|
|||||||
return v1 < v2
|
return v1 < v2
|
||||||
|
|
||||||
|
|
||||||
class ButtonsWidget(QWidget):
|
class OverlayControlMixin:
|
||||||
|
STYLE_SHEET_COMMON = '''
|
||||||
|
QWidget { background-color: transparent; }
|
||||||
|
QToolButton { border-width: 1px; padding: 0px; margin: 0px; }
|
||||||
|
'''
|
||||||
|
|
||||||
def __init__(self):
|
STYLE_SHEET_LIGHT = '''
|
||||||
super(QWidget, self).__init__()
|
QToolButton:hover { border: 1px solid #3daee9; }
|
||||||
self.buttons = [] # type: List[QToolButton]
|
'''
|
||||||
|
|
||||||
def resizeButtons(self):
|
def __init__(self, middle: bool = False):
|
||||||
frameWidth = self.style().pixelMetric(QStyle.PM_DefaultFrameWidth)
|
assert isinstance(self, QWidget)
|
||||||
x = self.rect().right() - frameWidth - 10
|
assert isinstance(self, OverlayControlMixin) # only here for type-hints in IDE
|
||||||
y = self.rect().bottom() - frameWidth
|
self.middle = middle
|
||||||
for button in self.buttons:
|
self.overlay_widget = QWidget(self)
|
||||||
sz = button.sizeHint()
|
style_sheet = self.STYLE_SHEET_COMMON
|
||||||
x -= sz.width()
|
if not ColorScheme.dark_scheme:
|
||||||
button.move(x, y - sz.height())
|
style_sheet = style_sheet + self.STYLE_SHEET_LIGHT
|
||||||
|
self.overlay_widget.setStyleSheet(style_sheet)
|
||||||
|
self.overlay_layout = QHBoxLayout(self.overlay_widget)
|
||||||
|
self.overlay_layout.setContentsMargins(0, 0, 0, 0)
|
||||||
|
self.overlay_layout.setSpacing(1)
|
||||||
|
|
||||||
def addButton(self, icon_name, on_click, tooltip):
|
def resizeEvent(self, e):
|
||||||
button = QToolButton(self)
|
super().resizeEvent(e)
|
||||||
button.setIcon(read_QIcon(icon_name))
|
frame_width = self.style().pixelMetric(QStyle.PM_DefaultFrameWidth)
|
||||||
button.setIconSize(QSize(25,25))
|
overlay_size = self.overlay_widget.sizeHint()
|
||||||
button.setCursor(QCursor(Qt.PointingHandCursor))
|
x = self.rect().right() - frame_width - overlay_size.width()
|
||||||
button.setStyleSheet("QToolButton { border: none; hover {border: 1px} pressed {border: 1px} padding: 0px; }")
|
y = self.rect().bottom() - overlay_size.height()
|
||||||
button.setVisible(True)
|
y = y / 2 if self.middle else y - frame_width
|
||||||
|
self.overlay_widget.move(int(x), int(y))
|
||||||
|
|
||||||
|
def addWidget(self, widget: QWidget):
|
||||||
|
# The old code positioned the items the other way around, so we just insert at position 0 instead
|
||||||
|
self.overlay_layout.insertWidget(0, widget)
|
||||||
|
|
||||||
|
def addButton(self, icon_name: str, on_click, tooltip: str) -> QAbstractButton:
|
||||||
|
button = QToolButton(self.overlay_widget)
|
||||||
button.setToolTip(tooltip)
|
button.setToolTip(tooltip)
|
||||||
|
button.setIcon(read_QIcon(icon_name))
|
||||||
|
button.setCursor(QCursor(Qt.PointingHandCursor))
|
||||||
button.clicked.connect(on_click)
|
button.clicked.connect(on_click)
|
||||||
self.buttons.append(button)
|
self.addWidget(button)
|
||||||
return button
|
return button
|
||||||
|
|
||||||
def addCopyButton(self):
|
def addCopyButton(self):
|
||||||
@@ -967,27 +985,18 @@ class ButtonsWidget(QWidget):
|
|||||||
self.addButton("file.png", file_input, _("Read file"))
|
self.addButton("file.png", file_input, _("Read file"))
|
||||||
|
|
||||||
|
|
||||||
class ButtonsLineEdit(QLineEdit, ButtonsWidget):
|
class ButtonsLineEdit(OverlayControlMixin, QLineEdit):
|
||||||
def __init__(self, text=None):
|
def __init__(self, text=None):
|
||||||
QLineEdit.__init__(self, text)
|
QLineEdit.__init__(self, text)
|
||||||
self.buttons = []
|
OverlayControlMixin.__init__(self, middle=True)
|
||||||
|
|
||||||
def resizeEvent(self, e):
|
|
||||||
o = QLineEdit.resizeEvent(self, e)
|
|
||||||
self.resizeButtons()
|
|
||||||
return o
|
|
||||||
|
|
||||||
class ButtonsTextEdit(QPlainTextEdit, ButtonsWidget):
|
class ButtonsTextEdit(OverlayControlMixin, QPlainTextEdit):
|
||||||
def __init__(self, text=None):
|
def __init__(self, text=None):
|
||||||
QPlainTextEdit.__init__(self, text)
|
QPlainTextEdit.__init__(self, text)
|
||||||
|
OverlayControlMixin.__init__(self)
|
||||||
self.setText = self.setPlainText
|
self.setText = self.setPlainText
|
||||||
self.text = self.toPlainText
|
self.text = self.toPlainText
|
||||||
self.buttons = []
|
|
||||||
|
|
||||||
def resizeEvent(self, e):
|
|
||||||
o = QPlainTextEdit.resizeEvent(self, e)
|
|
||||||
self.resizeButtons()
|
|
||||||
return o
|
|
||||||
|
|
||||||
|
|
||||||
class PasswordLineEdit(QLineEdit):
|
class PasswordLineEdit(QLineEdit):
|
||||||
|
|||||||
Reference in New Issue
Block a user