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,
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__()
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):
layout.addWidget(sub)
layout.addStretch()
- addOverlay(self, self)
- addOverlay(self, self.cover)
-
self.setLayout(layout)
def resizeEvent(self, event):
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)
--- /dev/null
+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")