toxygen/toxygen/ui/widgets.py

184 lines
5.8 KiB
Python
Raw Normal View History

from PyQt5 import QtCore, QtGui, QtWidgets
2018-05-10 19:47:34 +02:00
import utils.ui as util_ui
2016-04-24 12:45:11 +02:00
class DataLabel(QtWidgets.QLabel):
2016-06-05 19:17:39 +02:00
"""
Label with elided text
"""
2016-06-23 21:50:17 +02:00
def setText(self, text):
2016-11-20 12:12:27 +01:00
text = ''.join('\u25AF' if len(bytes(c, 'utf-8')) >= 4 else c for c in text)
2016-04-24 12:45:11 +02:00
metrics = QtGui.QFontMetrics(self.font())
2016-06-23 21:50:17 +02:00
text = metrics.elidedText(text, QtCore.Qt.ElideRight, self.width())
super().setText(text)
2016-04-24 12:45:11 +02:00
class ComboBox(QtWidgets.QComboBox):
2016-10-30 16:13:12 +01:00
def __init__(self, *args):
super().__init__(*args)
self.view().setSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Expanding)
2016-10-30 16:13:12 +01:00
class CenteredWidget(QtWidgets.QWidget):
2016-04-24 12:45:11 +02:00
def __init__(self):
super().__init__()
2016-04-24 12:45:11 +02:00
self.center()
def center(self):
qr = self.frameGeometry()
cp = QtWidgets.QDesktopWidget().availableGeometry().center()
2016-04-24 12:45:11 +02:00
qr.moveCenter(cp)
self.move(qr.topLeft())
2016-05-18 23:38:21 +02:00
class DialogWithResult(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self._result = None
def get_result(self):
return self._result
result = property(get_result)
def close_with_result(self, result):
self._result = result
self.close()
class LineEdit(QtWidgets.QLineEdit):
def __init__(self, parent=None):
super(LineEdit, self).__init__(parent)
def contextMenuEvent(self, event):
menu = create_menu(self.createStandardContextMenu())
menu.exec_(event.globalPos())
del menu
class QRightClickButton(QtWidgets.QPushButton):
2016-06-05 19:17:39 +02:00
"""
Button with right click support
"""
rightClicked = QtCore.pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent)
2016-05-18 23:38:21 +02:00
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.RightButton:
self.rightClicked.emit()
2016-05-18 23:38:21 +02:00
else:
super().mousePressEvent(event)
class RubberBand(QtWidgets.QRubberBand):
def __init__(self):
super().__init__(QtWidgets.QRubberBand.Rectangle, None)
self.setPalette(QtGui.QPalette(QtCore.Qt.transparent))
self.pen = QtGui.QPen(QtCore.Qt.blue, 4)
self.pen.setStyle(QtCore.Qt.SolidLine)
self.painter = QtGui.QPainter()
def paintEvent(self, event):
self.painter.begin(self)
self.painter.setPen(self.pen)
self.painter.drawRect(event.rect())
self.painter.end()
2016-05-30 20:38:21 +02:00
2017-07-13 20:02:42 +02:00
class RubberBandWindow(QtWidgets.QWidget):
def __init__(self, parent):
super().__init__()
self.parent = parent
self.setMouseTracking(True)
self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint)
self.showFullScreen()
self.setWindowOpacity(0.5)
self.rubberband = RubberBand()
self.rubberband.setWindowFlags(self.rubberband.windowFlags() | QtCore.Qt.FramelessWindowHint)
self.rubberband.setAttribute(QtCore.Qt.WA_TranslucentBackground)
def mousePressEvent(self, event):
self.origin = event.pos()
self.rubberband.setGeometry(QtCore.QRect(self.origin, QtCore.QSize()))
self.rubberband.show()
QtWidgets.QWidget.mousePressEvent(self, event)
def mouseMoveEvent(self, event):
if self.rubberband.isVisible():
self.rubberband.setGeometry(QtCore.QRect(self.origin, event.pos()).normalized())
left = QtGui.QRegion(QtCore.QRect(0, 0, self.rubberband.x(), self.height()))
right = QtGui.QRegion(QtCore.QRect(self.rubberband.x() + self.rubberband.width(), 0, self.width(), self.height()))
top = QtGui.QRegion(0, 0, self.width(), self.rubberband.y())
bottom = QtGui.QRegion(0, self.rubberband.y() + self.rubberband.height(), self.width(), self.height())
self.setMask(left + right + top + bottom)
def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Escape:
self.rubberband.setHidden(True)
self.close()
else:
super().keyPressEvent(event)
2016-05-30 20:38:21 +02:00
def create_menu(menu):
2016-06-05 19:17:39 +02:00
"""
:return translated menu
"""
2016-05-30 20:38:21 +02:00
for action in menu.actions():
text = action.text()
if 'Link Location' in text:
2016-06-05 19:17:39 +02:00
text = text.replace('Copy &Link Location',
util_ui.tr("Copy link location"))
2016-05-30 20:38:21 +02:00
elif '&Copy' in text:
text = text.replace('&Copy', util_ui.tr("Copy"))
2016-05-30 20:38:21 +02:00
elif 'All' in text:
text = text.replace('Select All', util_ui.tr("Select all"))
2016-05-30 20:38:21 +02:00
elif 'Delete' in text:
text = text.replace('Delete', util_ui.tr("Delete"))
2016-05-30 20:38:21 +02:00
elif '&Paste' in text:
text = text.replace('&Paste', util_ui.tr("Paste"))
2016-05-30 20:38:21 +02:00
elif 'Cu&t' in text:
text = text.replace('Cu&t', util_ui.tr("Cut"))
2016-05-30 20:38:21 +02:00
elif '&Undo' in text:
text = text.replace('&Undo', util_ui.tr("Undo"))
2016-05-30 20:38:21 +02:00
elif '&Redo' in text:
text = text.replace('&Redo', util_ui.tr("Redo"))
2016-05-30 20:38:21 +02:00
else:
menu.removeAction(action)
continue
action.setText(text)
return menu
2016-06-04 14:19:15 +02:00
class MultilineEdit(CenteredWidget):
def __init__(self, title, text, save):
super(MultilineEdit, self).__init__()
self.resize(350, 200)
self.setMinimumSize(QtCore.QSize(350, 200))
self.setMaximumSize(QtCore.QSize(350, 200))
self.setWindowTitle(title)
self.edit = QtWidgets.QTextEdit(self)
2016-06-04 14:19:15 +02:00
self.edit.setGeometry(QtCore.QRect(0, 0, 350, 150))
self.edit.setText(text)
self.button = QtWidgets.QPushButton(self)
2016-06-04 14:19:15 +02:00
self.button.setGeometry(QtCore.QRect(0, 150, 350, 50))
self.button.setText(util_ui.tr("Save"))
2016-06-04 14:19:15 +02:00
self.button.clicked.connect(self.button_click)
self.center()
self.save = save
def button_click(self):
self.save(self.edit.toPlainText())
self.close()