Move generic reusable widgets into picard.ui.widgets module

This commit is contained in:
Philipp Wolfer
2019-12-10 20:35:14 +01:00
parent 993e67cba8
commit 19f76b26f0
2 changed files with 77 additions and 63 deletions

View File

@@ -37,7 +37,11 @@ from picard.util import (
icontheme,
)
from picard.ui.widgets import ElidedLabel
from picard.ui.widgets import (
ClickableSlider,
ElidedLabel,
SliderPopover,
)
try:
@@ -257,19 +261,6 @@ class PlayerToolbar(QtWidgets.QToolBar):
return 'top'
class ClickableSlider(QtWidgets.QSlider):
def mousePressEvent(self, event):
self._set_position_from_mouse_event(event)
def mouseMoveEvent(self, event):
self._set_position_from_mouse_event(event)
def _set_position_from_mouse_event(self, event):
value = QtWidgets.QStyle.sliderValueFromPosition(
self.minimum(), self.maximum(), event.x(), self.width())
self.setValue(value)
class PlaybackProgressSlider(QtWidgets.QWidget):
def __init__(self, parent, player):
super().__init__(parent)
@@ -335,55 +326,6 @@ class PlaybackProgressSlider(QtWidgets.QWidget):
self.player.set_position(value)
class Popover(QtWidgets.QFrame):
def __init__(self, parent, position='bottom'):
super().__init__(parent)
self.setWindowFlags(QtCore.Qt.Popup | QtCore.Qt.FramelessWindowHint)
self.position = position
def show(self):
super().show()
self.update_position()
def update_position(self):
parent = self.parent()
x = -(self.width() - parent.width()) / 2
if self.position == 'top':
y = -self.height()
else: # bottom
y = parent.height()
pos = parent.mapToGlobal(QtCore.QPoint(x, y))
screen_number = QtWidgets.QApplication.desktop().screenNumber()
screen = QtGui.QGuiApplication.screens()[screen_number]
screen_size = screen.availableVirtualSize()
if pos.x() < 0:
pos.setX(0)
if pos.x() + self.width() > screen_size.width():
pos.setX(screen_size.width() - self.width())
if pos.y() < 0:
pos.setY(0)
if pos.y() + self.height() > screen_size.height():
pos.setY(screen_size.height() - self.height())
self.move(pos)
class SliderPopover(Popover):
value_changed = QtCore.pyqtSignal(int)
def __init__(self, parent, position, label, value):
super().__init__(parent, position)
vbox = QtWidgets.QVBoxLayout(self)
self.label = QtWidgets.QLabel(label, self)
self.label.setAlignment(QtCore.Qt.AlignCenter)
vbox.addWidget(self.label)
self.slider = QtWidgets.QSlider(self)
self.slider.setOrientation(QtCore.Qt.Horizontal)
self.slider.setValue(value)
self.slider.valueChanged.connect(self.value_changed)
vbox.addWidget(self.slider)
class PlaybackRateButton(QtWidgets.QToolButton):
playback_rate_changed = QtCore.pyqtSignal(float)

View File

@@ -47,3 +47,75 @@ class ElidedLabel(QtWidgets.QLabel):
QtCore.Qt.ElideRight,
self.width() - 2)
super().setText(elided_label)
class ClickableSlider(QtWidgets.QSlider):
"""A slider implementation where the user can select any slider position by clicking."""
def mousePressEvent(self, event):
self._set_position_from_mouse_event(event)
def mouseMoveEvent(self, event):
self._set_position_from_mouse_event(event)
def _set_position_from_mouse_event(self, event):
value = QtWidgets.QStyle.sliderValueFromPosition(
self.minimum(), self.maximum(), event.x(), self.width())
self.setValue(value)
class Popover(QtWidgets.QFrame):
"""A generic popover implementation.
The popover opens relative to its parent, either above or below the parent.
Subclass this widget and add child widgets for a custom popover.
"""
def __init__(self, parent, position='bottom'):
super().__init__(parent)
self.setWindowFlags(QtCore.Qt.Popup | QtCore.Qt.FramelessWindowHint)
self.position = position
def show(self):
super().show()
self.update_position()
def update_position(self):
parent = self.parent()
x = -(self.width() - parent.width()) / 2
if self.position == 'top':
y = -self.height()
else: # bottom
y = parent.height()
pos = parent.mapToGlobal(QtCore.QPoint(x, y))
screen_number = QtWidgets.QApplication.desktop().screenNumber()
screen = QtGui.QGuiApplication.screens()[screen_number]
screen_size = screen.availableVirtualSize()
if pos.x() < 0:
pos.setX(0)
if pos.x() + self.width() > screen_size.width():
pos.setX(screen_size.width() - self.width())
if pos.y() < 0:
pos.setY(0)
if pos.y() + self.height() > screen_size.height():
pos.setY(screen_size.height() - self.height())
self.move(pos)
class SliderPopover(Popover):
"""A popover containing a single slider."""
value_changed = QtCore.pyqtSignal(int)
def __init__(self, parent, position, label, value):
super().__init__(parent, position)
vbox = QtWidgets.QVBoxLayout(self)
self.label = QtWidgets.QLabel(label, self)
self.label.setAlignment(QtCore.Qt.AlignCenter)
vbox.addWidget(self.label)
self.slider = QtWidgets.QSlider(self)
self.slider.setOrientation(QtCore.Qt.Horizontal)
self.slider.setValue(value)
self.slider.valueChanged.connect(self.value_changed)
vbox.addWidget(self.slider)