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).
This commit is contained in:
2022-08-20 00:17:14 -04:00
parent 2917767f4f
commit b4b32064c4
2 changed files with 69 additions and 46 deletions
+36 -14
View File
@@ -5,22 +5,41 @@ from urllib import parse
from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QApplication
from PyQt5.QtQml import qmlRegisterType, QQmlApplicationEngine 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 import requests
class Show(QObject): class Show(QObject):
def __init__(self, name, parent=None): def __init__(self, source, parent=None):
super().__init__(parent) super().__init__(parent)
self._name = name self._source = source
@pyqtProperty("QString") @pyqtProperty("QString")
def name(self): def title(self) -> str:
return self._name 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: def getUrl(base: str, path: str) -> dict:
@@ -38,7 +57,7 @@ class Provider(QObject):
self._name: str = describe["name"] self._name: str = describe["name"]
shows: dict = getUrl(self.url, "shows") 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") recently_added: dict = getUrl(self.url, "recently_added")
self._recently_added: list[int] = recently_added["data"] self._recently_added: list[int] = recently_added["data"]
@@ -50,8 +69,9 @@ class Provider(QObject):
def name(self) -> str: def name(self) -> str:
return self._name return self._name
@pyqtProperty("QObject") # @pyqtProperty("QObject")
def getShow(self, id) -> dict: @pyqtSlot(int, result=QObject)
def getShow(self, id) -> Show:
return self._shows[id] return self._shows[id]
@pyqtProperty(list) @pyqtProperty(list)
@@ -59,13 +79,15 @@ class Provider(QObject):
return self._recently_added return self._recently_added
@pyqtProperty(list) @pyqtProperty(list)
def inProgress(self) -> list: def inProgress(self) -> list[int]:
return self._in_progress return self._in_progress
class DataSource: class DataSource:
def __init__(self, providers=[]): 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: def DatabaseType(data_source) -> Type:
@@ -73,10 +95,10 @@ def DatabaseType(data_source) -> Type:
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
self.data_source = data_source self.data_source: DataSource = data_source
@pyqtProperty(list) @pyqtProperty(list)
def Providers(self): def Providers(self) -> list[Provider]:
return self.data_source.providers return self.data_source.providers
return Database return Database
+30 -29
View File
@@ -1,42 +1,43 @@
import QtQuick 2.12 import QtQuick 2.12
import QtQuick.Controls 1.4
import Ikinuki.Client 1.0 import Ikinuki.Client 1.0
Rectangle { TabView {
property var providers property var providers
//default property int selectedElement: 0
//property var max_elements: providers.length
width: parent.width * 0.7 width: parent.width * 0.7
height: parent.height height: parent.height
tabsVisible: false
Repeater {
model: providers
Tab {
Rectangle {
color: "#22282A" color: "#22282A"
Column { Column {
Row { Row {
height: parent.parent.height * 0. 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;
//}
} }