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:
+36
-14
@@ -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
|
||||
|
||||
@@ -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;
|
||||
//}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user