From: Niki Roo Date: Thu, 27 Mar 2025 12:59:15 +0000 (+0100) Subject: qt: simplify X-Git-Url: http://git.nikiroo.be/?a=commitdiff_plain;h=fb46e6856912f3b4cd522f2aea6bb088189bb1e0;p=gamiki.git qt: simplify --- diff --git a/gamiki/qt/tiles.py b/gamiki/qt/tiles.py index a409152..bcb3ee0 100755 --- a/gamiki/qt/tiles.py +++ b/gamiki/qt/tiles.py @@ -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() diff --git a/gamiki/qt/utils.py b/gamiki/qt/utils.py index 3be9a49..872168e 100644 --- a/gamiki/qt/utils.py +++ b/gamiki/qt/utils.py @@ -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")):