From b4b32064c4b0bcbd679afc52f1745c61049501ca Mon Sep 17 00:00:00 2001 From: restitux Date: Sat, 20 Aug 2022 00:17:14 -0400 Subject: [PATCH] Expose Show properly to QML and expand ContentView This adds a WIP ContentView for displaying a cover art oriented browser. The Show class was updated to expose the needed properties to QML correctly. This introducted the use of @pyqtSlot to expose functions to QML (as opposed to properties). --- ikinuki_client/__main__.py | 50 ++++++++++++++++------- layouts/components/ContentView.qml | 65 +++++++++++++++--------------- 2 files changed, 69 insertions(+), 46 deletions(-) diff --git a/ikinuki_client/__main__.py b/ikinuki_client/__main__.py index d763fe1..1e9018a 100644 --- a/ikinuki_client/__main__.py +++ b/ikinuki_client/__main__.py @@ -5,22 +5,41 @@ from urllib import parse from PyQt5.QtWidgets import QApplication from PyQt5.QtQml import qmlRegisterType, QQmlApplicationEngine -from PyQt5.QtQuick import QQuickView -from PyQt5.QtCore import QObject, QUrl, pyqtProperty -from .qtmpv import MpvObject +# from PyQt5.QtQuick import QQuickView +from PyQt5.QtCore import QObject, pyqtProperty, pyqtSlot + +# from PyQt5.QtCore import QObject, QUrl, pyqtProperty + +# from .qtmpv import MpvObject import requests class Show(QObject): - def __init__(self, name, parent=None): + def __init__(self, source, parent=None): super().__init__(parent) - self._name = name + self._source = source @pyqtProperty("QString") - def name(self): - return self._name + def title(self) -> str: + return self._source["title"] + + @pyqtProperty(int) + def year(self) -> int: + return self._source["year"] + + @pyqtProperty(int) + def episodes(self) -> int: + return self._source["episodes"] + + @pyqtProperty(int) + def watched(self) -> int: + return self._source["watched"] + + @pyqtProperty("QString") + def poster(self) -> str: + return self._source["poster"] def getUrl(base: str, path: str) -> dict: @@ -38,7 +57,7 @@ class Provider(QObject): self._name: str = describe["name"] shows: dict = getUrl(self.url, "shows") - self._shows: dict[int, dict] = {e["id"]: e for e in shows["data"]} + self._shows: dict[int, Show] = {e["id"]: Show(e) for e in shows["data"]} recently_added: dict = getUrl(self.url, "recently_added") self._recently_added: list[int] = recently_added["data"] @@ -50,8 +69,9 @@ class Provider(QObject): def name(self) -> str: return self._name - @pyqtProperty("QObject") - def getShow(self, id) -> dict: + # @pyqtProperty("QObject") + @pyqtSlot(int, result=QObject) + def getShow(self, id) -> Show: return self._shows[id] @pyqtProperty(list) @@ -59,13 +79,15 @@ class Provider(QObject): return self._recently_added @pyqtProperty(list) - def inProgress(self) -> list: + def inProgress(self) -> list[int]: return self._in_progress class DataSource: def __init__(self, providers=[]): - self.providers = [Provider(ip, port) for (ip, port) in providers] + self.providers: list[Provider] = [ + Provider(ip, port) for (ip, port) in providers + ] def DatabaseType(data_source) -> Type: @@ -73,10 +95,10 @@ def DatabaseType(data_source) -> Type: def __init__(self, parent=None): super().__init__(parent) - self.data_source = data_source + self.data_source: DataSource = data_source @pyqtProperty(list) - def Providers(self): + def Providers(self) -> list[Provider]: return self.data_source.providers return Database diff --git a/layouts/components/ContentView.qml b/layouts/components/ContentView.qml index b52d4f6..6bcf6f1 100644 --- a/layouts/components/ContentView.qml +++ b/layouts/components/ContentView.qml @@ -1,42 +1,43 @@ import QtQuick 2.12 +import QtQuick.Controls 1.4 import Ikinuki.Client 1.0 -Rectangle { +TabView { property var providers - //default property int selectedElement: 0 - //property var max_elements: providers.length width: parent.width * 0.7 height: parent.height - color: "#22282A" - Column { - Row { - height: parent.parent.height * 0. + tabsVisible: false + Repeater { + model: providers + Tab { + Rectangle { + color: "#22282A" + Column { + Row { + Repeater { + property var provider: modelData + id: inProgressRepeater + model: modelData.inProgress + Column { + id: showColumn + property var show: inProgressRepeater.provider.getShow(modelData) + Image { + height: 200 + width: 100 + source: showColumn.show.poster + } + Text { + text: showColumn.show.title + } + Text { + text: showColumn.show.year + } + } + } + } + } + } } } - // anchors.fill: parent - // // header - // SidebarHeader {} - // Repeater { - // model: providers - // SidebarElement { - // name: modelData.name - // selected: (index == selectedElement) ? true : false - // } - // } - - //} - //function mod(n, m) { - // return ((n % m) + m) % m; - //} - //Keys.onPressed: (event)=> { - // // Handle scrolling - // if (event.key == Qt.Key_Down) { - // selectedElement = mod(selectedElement + 1, max_elements); - // } - // else if (event.key == Qt.Key_Up) { - // selectedElement = mod(selectedElement - 1, max_elements); - // } - // event.accepted = true; - //} }