qt: move some code to utils
authorNiki Roo <niki@nikiroo.be>
Wed, 26 Mar 2025 14:53:05 +0000 (15:53 +0100)
committerNiki Roo <niki@nikiroo.be>
Wed, 26 Mar 2025 14:53:05 +0000 (15:53 +0100)
gamiki-qt.py
gamiki/qt/tiles.py
gamiki/qt/utils.py [new file with mode: 0644]

index 310770410f263d73f851fd562d377b62e2ad3257..92f6c2d67ba8ca8b86c77f1fc25b56608589d9b0 100755 (executable)
@@ -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()
     
index 68f4dae92ab183fc75a51299f6a614fbdd6219bd..b2d91814c8eff531433cd59667bde34d4d6f1afc 100755 (executable)
@@ -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 (file)
index 0000000..3be9a49
--- /dev/null
@@ -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")