From 2d34a55f27f42f33617107a573908500ed2c0caa Mon Sep 17 00:00:00 2001 From: Niki Roo Date: Wed, 26 Mar 2025 15:53:05 +0100 Subject: [PATCH] qt: move some code to utils --- gamiki-qt.py | 5 +- gamiki/qt/tiles.py | 83 +----------------------------- gamiki/qt/utils.py | 122 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 127 insertions(+), 83 deletions(-) create mode 100644 gamiki/qt/utils.py diff --git a/gamiki-qt.py b/gamiki-qt.py index 3107704..92f6c2d 100755 --- a/gamiki-qt.py +++ b/gamiki-qt.py @@ -18,7 +18,8 @@ except: from PyQt4.QtWidgets import * from gamiki import Builder, Library -from gamiki.qt.tiles import Grid, List, startGame +from gamiki.qt.utils import start +from gamiki.qt.tiles import Grid, List class MainWindow(QMainWindow): def __init__(self, centre: QWidget): @@ -51,7 +52,7 @@ if __name__ == '__main__': #centre = List(Builder().games) centre = Grid(Builder().games) - centre.onClick.connect(startGame) + centre.onClick.connect(start) window = MainWindow(centre) window.show() diff --git a/gamiki/qt/tiles.py b/gamiki/qt/tiles.py index 68f4dae..b2d9181 100755 --- a/gamiki/qt/tiles.py +++ b/gamiki/qt/tiles.py @@ -21,66 +21,9 @@ except: from PyQt4.QtGui import QPixmap from gamiki import Game +from gamiki.qt.utils import makeMouseAware from gamiki.qt.flow_layout import FlowLayout -pool = QThreadPool() -def startGame(game): - class Worker(QRunnable): - def run(self): game.start() - worker = Worker() - pool.start(worker) - -def setBg(widget: QWidget, color: str): - if (";" in color): - raise RuntimeException("No colour can contain a `;'") - - if (color): - bg = ("background-color: " + color + ";") - elif hasattr(widget, "bgColor"): - bg = ("background-color: " + widget.bgColor + ";") - else: - bg = "" - - changed = False - attribs = widget.styleSheet().split(";") - for i, attr in enumerate(attribs): - if (attr.strip().startswith("background-color:")): - attribs[i] = bg if color else "" - changed = True - if (not changed) and (color): - attribs.append(bg) - - widget.setStyleSheet(";".join(attribs) + ";") - -def addOverlay(self: QWidget, target: QWidget): - if (not hasattr(self, "overlay" )): self.overlay = [] - if (not hasattr(self, "clicked" )): self.clicked = False - if (not hasattr(self, "hovered" )): self.hovered = False - if (not hasattr(self, "selected")): self.selected = False - - overlay = QWidget() - overlay.setAttribute(Qt.WA_TransparentForMouseEvents) - overlay.setParent(target) - overlay.move(0, 0) - overlay.bgColor = "rgba(0, 0, 0, 0)" - - self.overlay.append(overlay) - -def fixColor(widget: QWidget): - if (widget.clicked): - bg = "rgba(200, 200, 250, 60)" - elif (widget.hovered and widget.selected): - bg = "rgba(0, 0, 100, 60)" - elif (widget.hovered): - bg = "rgba(150, 150, 200, 60)" - elif (widget.selected): - bg = "rgba(0, 0, 100, 60)" - else: - bg = "" - - for overlay in widget.overlay: - setBg(overlay, bg) - class CoverMode(IntFlag): LIST = 1, COVER = 2, @@ -88,9 +31,6 @@ class CoverMode(IntFlag): class Cover(QWidget): onClick = pyqtSignal(Game) - clicked = False - selected = False - hovered = False def __init__(self, game: Game, mode: CoverMode = None, size: int = 0): super().__init__() @@ -104,6 +44,7 @@ class Cover(QWidget): self.cover_size = 48 if (CoverMode.LIST in self.cover_mode) else 200 self.initUI() + makeMouseAware(self, [self, self.cover]) def _resetMinMax(self): if (CoverMode.LIST in self.cover_mode): @@ -162,9 +103,6 @@ class Cover(QWidget): layout.addWidget(sub) layout.addStretch() - addOverlay(self, self) - addOverlay(self, self.cover) - self.setLayout(layout) def resizeEvent(self, event): @@ -186,26 +124,9 @@ class Cover(QWidget): super().resizeEvent(event) - def enterEvent(self, event): - self.hovered = True - fixColor(self) - super().enterEvent(event) - - def leaveEvent(self, event): - self.hovered = False - fixColor(self) - super().leaveEvent(event) - - def mousePressEvent(self, event): - if event.button() == Qt.LeftButton: - self.clicked = True - fixColor(self) - def mouseReleaseEvent(self, event): if event.button() == Qt.LeftButton: - self.clicked = False self.onClick.emit(self.game) - fixColor(self) class List(QWidget): onClick = pyqtSignal(Game) diff --git a/gamiki/qt/utils.py b/gamiki/qt/utils.py new file mode 100644 index 0000000..3be9a49 --- /dev/null +++ b/gamiki/qt/utils.py @@ -0,0 +1,122 @@ +try: + from PyQt6.QtCore import * + from PyQt6.QtWidgets import * +except: + try: + from PyQt5.QtCore import * + from PyQt5.QtWidgets import * + except: + from PyQt4.QtCore import * + from PyQt4.QtWidgets import * + +pool = QThreadPool() +def start(startable): + class Worker(QRunnable): + def run(self): startable.start() + worker = Worker() + pool.start(worker) + +def setBg(widget: QWidget, color: str): + if (";" in color): + raise RuntimeException("No colour can contain a `;'") + + if (color): + bg = ("background-color: " + color + ";") + elif hasattr(widget, "bgColor"): + bg = ("background-color: " + widget.bgColor + ";") + else: + bg = "" + + changed = False + attribs = widget.styleSheet().split(";") + for i, attr in enumerate(attribs): + if (attr.strip().startswith("background-color:")): + attribs[i] = bg if color else "" + changed = True + if (not changed) and (color): + attribs.append(bg) + + widget.setStyleSheet(";".join(attribs) + ";") + +def addOverlay(self: QWidget, target: QWidget): + if (not hasattr(self, "overlay" )): self.overlay = [] + if (not hasattr(self, "clicked" )): self.clicked = False + if (not hasattr(self, "hovered" )): self.hovered = False + if (not hasattr(self, "selected")): self.selected = False + + overlay = QWidget() + overlay.setAttribute(Qt.WA_TransparentForMouseEvents) + overlay.setParent(target) + overlay.move(0, 0) + overlay.bgColor = "rgba(0, 0, 0, 0)" + + self.overlay.append(overlay) + +def fixColor(widget: QWidget): + if (widget.clicked): + bg = "rgba(200, 200, 250, 60)" + elif (widget.hovered and widget.selected): + bg = "rgba(0, 0, 100, 60)" + elif (widget.hovered): + bg = "rgba(150, 150, 200, 60)" + elif (widget.selected): + bg = "rgba(0, 0, 100, 60)" + else: + bg = "" + + for overlay in widget.overlay: + setBg(overlay, bg) + +def makeMouseAware(self: QWidget, targets: list[QWidget]): + for target in targets: + addOverlay(self, target) + + if (hasattr(self, "enterEvent")): + self._enterEvent = self.enterEvent + if (hasattr(self, "leaveEvent")): + self._leaveEvent = self.leaveEvent + if (hasattr(self, "mousePressEvent")): + self._mousePressEvent = self.mousePressEvent + if (hasattr(self, "mouseReleaseEvent")): + self._mouseReleaseEvent = self.mouseReleaseEvent + + def enter(event): + self.hovered = True + fixColor(self) + if (hasattr(self, "_enterEvent")): + self._enterEvent(event) + else: + self.super().enterEvent(event) + self.enterEvent = enter + + def leave(event): + self.hovered = False + fixColor(self) + if (hasattr(self, "_leaveEvent")): + self._leaveEvent(event) + else: + self.super().leaveEvent(event) + self.leaveEvent = leave + + def mousePress(event): + if event.button() == Qt.LeftButton: + self.clicked = True + fixColor(self) + if (hasattr(self, "_mousePressEvent")): + self._mousePressEvent(event) + else: + self.super().mousePressEvent(event) + self.mousePressEvent = mousePress + + def mouseRelease(event): + if event.button() == Qt.LeftButton: + self.clicked = False + fixColor(self) + if (hasattr(self, "_mouseReleaseEvent")): + self._mouseReleaseEvent(event) + else: + self.super().mouseReleaseEvent(event) + self.mouseReleaseEvent = mouseRelease + +if __name__ == "__main__": + print("ok") -- 2.27.0