qt: simplify
authorNiki Roo <niki@nikiroo.be>
Thu, 27 Mar 2025 12:59:15 +0000 (13:59 +0100)
committerNiki Roo <niki@nikiroo.be>
Thu, 27 Mar 2025 12:59:15 +0000 (13:59 +0100)
gamiki/qt/tiles.py
gamiki/qt/utils.py

index a409152843c2949f8222fd088f3116ddff573099..bcb3ee02c1aed60735660b751467d47ddafb30e5 100755 (executable)
@@ -24,53 +24,32 @@ from gamiki                import Game
 from gamiki.qt.utils       import makeMouseAware
 from gamiki.qt.flow_layout import FlowLayout
 
-class CoverMode(IntFlag):
-    LIST  = 1,
-    COVER = 2,
-    FIXED = 4
-
-class Cover(QWidget):
+class ListItem(QWidget):
     onClick = pyqtSignal(Game)
 
-    def __init__(self, game: Game, mode: CoverMode = None, size: int = 0):
+    def __init__(self, game: Game, coverSize: int = 0):
         super().__init__()
         
         self.game = game
-        self.cover_mode = mode if (mode) else (CoverMode.LIST|CoverMode.FIXED)
-        
-        if (size > 0):
-            self.cover_size = size
-        else:
-            self.cover_size = 48 if (CoverMode.LIST in self.cover_mode) else 200
-        
+        self.coverSize = coverSize if (coverSize > 0) else 48  
         self.pixmap=QPixmap(self.game["Icon"] if ("Icon" in self.game) else "")
        
         self.initUI()
         makeMouseAware(self, [self, self.cover])
-     
-    def _resetMinMax(self):
-        if (CoverMode.LIST in self.cover_mode):
-            self.line1.setMinimumWidth(self.cover_size)
-        else:
-            self.line1.setMaximumWidth(self.cover_size)
-
-        if (CoverMode.LIST in self.cover_mode):
-            self.line2.setMinimumWidth(self.cover_size)
-        else:
-            self.line2.setMaximumWidth(self.cover_size)
     
-    def _initUI_text(self):
+    def initUI(self):
         self.line1 = QLabel(self.game.name)
         self.line1.setStyleSheet("font-size: 20px; font-weight: bold;")
-        
+        self.line1.setMinimumWidth(self.coverSize)
         self.line2 = QLabel(self.game.tags[0] if (self.game.tags) else "")
         self.line2.setStyleSheet("")
         self.line2.setAlignment(Qt.AlignRight)
+        self.line2.setMinimumWidth(self.coverSize)
         
-        self._resetMinMax()
-    
-    def _resetPixmap(self):
-        crop = self.pixmap
+        self.cover = QLabel()
+        self.cover.setScaledContents(True)
+        self.cover.setMinimumSize(self.coverSize, self.coverSize)
+        self.cover.setMaximumSize(self.coverSize, self.coverSize)
         
         w = self.pixmap.width()
         h = self.pixmap.height()
@@ -79,17 +58,69 @@ class Cover(QWidget):
             int((h - w) / 2) if h > w else 0, 
             min(w, h), min(w, h)
         )
-        
         self.cover.setPixmap(crop)
         
+        line1sub = QWidget()
+        hlay = QHBoxLayout()
+        hlay.setContentsMargins(0, 0, 0, 0)
+        hlay.addWidget(self.line1)
+        hlay.addStretch()
+        line1sub.setLayout(hlay)
+        
+        sub = QWidget()
+        hlay = QVBoxLayout()
+        hlay.setContentsMargins(0, 0, 0, 0)
+        hlay.addWidget(line1sub)
+        hlay.addWidget(self.line2)
+        sub.setLayout(hlay)
+        
+        layout = QHBoxLayout() 
+        layout.setContentsMargins(0, 0, 0, 0)
+        layout.addWidget(self.cover)
+        layout.addWidget(sub)
+    
+        self.setLayout(layout)
+    def mouseReleaseEvent(self, event):
+        if event.button() == Qt.LeftButton:
+            self.onClick.emit(self.game)
+
+class GridItem(QWidget):
+    onClick = pyqtSignal(Game)
+
+    def __init__(self, game: Game, coverSize: int = 0, fixed: bool = False):
+        super().__init__()
+        
+        self.game = game
+        self.coverSize = coverSize if (coverSize > 0) else 200 
+        self.fixed = fixed
+        self.pixmap=QPixmap(self.game["Icon"] if ("Icon" in self.game) else "")
+       
+        self.initUI()
+        makeMouseAware(self, [self, self.cover])
+    
     def initUI(self):
-        self._initUI_text()
+        self.line1 = QLabel(self.game.name)
+        self.line1.setStyleSheet("font-size: 20px; font-weight: bold;")
+        self.line1.setMaximumWidth(self.coverSize)
+        self.line2 = QLabel(self.game.tags[0] if (self.game.tags) else "")
+        self.line2.setStyleSheet("")
+        self.line2.setAlignment(Qt.AlignRight)
+        self.line2.setMaximumWidth(self.coverSize)
         
         self.cover = QLabel()
         self.cover.setScaledContents(True)
-        self.cover.setMinimumSize(self.cover_size, self.cover_size)
-        self.cover.setMaximumSize(self.cover_size, self.cover_size)
-        self._resetPixmap()
+        self.cover.setMinimumSize(self.coverSize, self.coverSize)
+        self.cover.setMaximumSize(self.coverSize, self.coverSize)
+        
+        w = self.pixmap.width()
+        h = self.pixmap.height()
+        crop = self.pixmap.copy(
+            int((w - h) / 2) if w > h else 0, 
+            int((h - w) / 2) if h > w else 0, 
+            min(w, h), min(w, h)
+        )
+        self.cover.setPixmap(crop)
         
         line1sub = QWidget()
         hlay = QHBoxLayout()
@@ -105,23 +136,15 @@ class Cover(QWidget):
         hlay.addWidget(self.line2)
         sub.setLayout(hlay)
         
-        if CoverMode.LIST in self.cover_mode:
-            layout = QHBoxLayout() 
-            layout.setContentsMargins(0, 0, 0, 0)
-            layout.addWidget(self.cover)
-            layout.addWidget(sub)
-        else:
-            layout = QVBoxLayout() 
-            layout.addWidget(self.cover)
-            layout.addWidget(sub)
-            layout.addStretch()
+        layout = QVBoxLayout() 
+        layout.addWidget(self.cover)
+        layout.addWidget(sub)
+        layout.addStretch()
         
         self.setLayout(layout)
-
+    
     def resizeEvent(self, event):
-        self.overlay[0].setFixedSize(event.size())
-        
-        if (CoverMode.FIXED in self.cover_mode):
+        if (self.fixed):
             return super().resizeEvent(event)
         
         m = self.contentsMargins()
@@ -131,12 +154,13 @@ class Cover(QWidget):
         s = event.size()
         petit = min(s.width() - diff_w, s.height() - diff_h)
         self.cover.setMaximumSize(petit, petit)
-        self.overlay[1].setFixedSize(self.cover.size())
         
-        self._resetMinMax()
-
+        self.line1.setMaximumWidth(self.coverSize)
+        self.line2.setMaximumWidth(self.coverSize)
+        self.line1.setMinimumWidth(self.coverSize)
+        self.line2.setMinimumWidth(self.coverSize)
         super().resizeEvent(event)
-    
+
     def mouseReleaseEvent(self, event):
         if event.button() == Qt.LeftButton:
             self.onClick.emit(self.game)
@@ -156,28 +180,32 @@ class List(QWidget):
         layout = QVBoxLayout()
         #layout.setSpacing(0)
         
-        for cover in self._gen_covers(CoverMode.LIST|CoverMode.FIXED):
+        for game in self.games:
+            cover = ListItem(game, self.icon_size)
+            cover.onClick.connect(lambda game: self.onClick.emit(game))
             layout.addWidget(cover)
+        
         layout.addStretch()
         
         self.setLayout(layout)
     
-    def _gen_covers(self, mode: CoverMode) -> list[Cover]:
-        covers = [] 
-        for game in self.games:
-            cover = Cover(game, mode, self.icon_size)
-            cover.onClick.connect(lambda game: self.onClick.emit(game))
-            covers.append(cover)
-        return covers
-    
-class Grid(List):
+class Grid(QWidget):
+    onClick = pyqtSignal(Game)
+
     def __init__(self, games: list[Game], icon_size: int = 0):
-        super().__init__(games, icon_size)
+        super().__init__()
+        
+        self.games = games
+        self.icon_size = icon_size
+        
+        self.initUI()
         
     def initUI(self):
         layout = FlowLayout()
         
-        for cover in self._gen_covers(CoverMode.COVER|CoverMode.FIXED):
+        for game in self.games:
+            cover = GridItem(game, self.icon_size, True)
+            cover.onClick.connect(lambda game: self.onClick.emit(game))
             layout.addWidget(cover)
         
         self.setLayout(layout)
@@ -198,8 +226,8 @@ if __name__ == '__main__':
     game3["Icon"] = "./fluffy.jpg"
     game3._init()
      
-    #game_widget1 = Cover(game1)                  ; game_widget1.show()
-    #game_widget2 = Cover(game3, CoverMode.COVER) ; game_widget2.show()
+    #game_widget1 = ListItem(game1) ; game_widget1.show()
+    #game_widget2 = GridItem(game3) ; game_widget2.show()
     list1 = List([ game1, game2, game3 ]) ; list1.show()
     grid = Grid([ game1, game2, game3 ]) ; grid.show()  
     
index 3be9a4944f9e981e044aa339ac4682a99777c4c2..872168e21c0833171593ea53e45d907aadad7996 100644 (file)
@@ -71,6 +71,18 @@ def makeMouseAware(self: QWidget, targets: list[QWidget]):
     for target in targets:
         addOverlay(self, target)
     
+    if (hasattr(self, "resizeEvent")):
+        self._resizeEvent = self.resizeEvent
+    
+    def resize(event):
+        if (hasattr(self, "_resizeEvent")): 
+            self._resizeEvent(event)
+        else: 
+            self.super().resizeEvent(event)
+        for widget in self.overlay:
+            widget.setFixedSize(widget.parent().size())
+    self.resizeEvent = resize
+    
     if (hasattr(self, "enterEvent")): 
         self._enterEvent = self.enterEvent
     if (hasattr(self, "leaveEvent")):