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.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
+33 -32
View File
@@ -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;
//}
}