mirror of
https://github.com/HenkKalkwater/harbour-sailfin.git
synced 2024-11-16 06:25:18 +00:00
Chris Josten
5d395ad7b6
* There is a basic collection page, allowing the user to browse through collections. It has a sort function, that sort of works * Item cards now show a bar indicating play time * Item cards now have a black/white (depending on theme) shim, improving readability. * The resume watching section now actually loads items
152 lines
4.1 KiB
QML
152 lines
4.1 KiB
QML
import QtQuick 2.0
|
|
import Sailfish.Silica 1.0
|
|
|
|
import nl.netsoj.chris.Jellyfin 1.0
|
|
|
|
import "../components"
|
|
import "../Utils.js" as Utils
|
|
|
|
CoverBackground {
|
|
id: cover
|
|
Label {
|
|
id: label
|
|
anchors.centerIn: parent
|
|
text: qsTr("Sailfin")
|
|
}
|
|
property int rowCount: 8
|
|
|
|
UserItemModel {
|
|
id: randomItems1
|
|
apiClient: ApiClient
|
|
limit: cover.rowCount
|
|
imageTypes: ["Primary"]
|
|
sortBy: ["IsFavoriteOrLiked", "Random"]
|
|
recursive: true
|
|
parentId: appWindow.collectionId
|
|
Component.onCompleted: reload()
|
|
}
|
|
|
|
UserItemModel {
|
|
id: randomItems2
|
|
apiClient: ApiClient
|
|
limit: cover.rowCount
|
|
imageTypes: ["Primary"]
|
|
sortBy: ["IsFavoriteOrLiked", "Random"]
|
|
recursive: true
|
|
parentId: appWindow.collectionId
|
|
Component.onCompleted: reload()
|
|
}
|
|
|
|
Row {
|
|
id: row1
|
|
property bool movingRight: true
|
|
property int moveCount: 0
|
|
anchors.top: parent.top
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
transform: [
|
|
Translate {
|
|
x: -row1.height// + (row1.width - row1.height) / 2;
|
|
},
|
|
Translate {
|
|
id: row1Translate;
|
|
Behavior on x { NumberAnimation { duration: 500; easing.type: Easing.InOutQuad }}
|
|
}
|
|
]
|
|
height: parent.height / 2
|
|
width: parent.width
|
|
Repeater {
|
|
model: randomItems1
|
|
RemoteImage {
|
|
clip: true
|
|
height: row1.height
|
|
width: height
|
|
source: model.id ? Utils.itemModelImageUrl(ApiClient.baseUrl, model.id, model.imageTags["Primary"], "Primary", {"maxHeight": row1.height})
|
|
: ""
|
|
fillMode: Image.PreserveAspectCrop
|
|
}
|
|
}
|
|
|
|
function move() {
|
|
if (movingRight) {
|
|
row1Translate.x -= row1.height
|
|
moveCount++;
|
|
} else {
|
|
row1Translate.x += row1.height
|
|
moveCount--;
|
|
}
|
|
if (moveCount == 0) movingRight = true;
|
|
if (moveCount == rowCount - 3) movingRight = false;
|
|
}
|
|
}
|
|
|
|
Row {
|
|
id: row2
|
|
property bool movingRight: false
|
|
property int moveCount: rowCount - 3
|
|
anchors.bottom: parent.bottom
|
|
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
transform: [
|
|
Translate {
|
|
x: -row2.height * (rowCount - 2) + (row2.width - row2.height);
|
|
},
|
|
Translate {
|
|
id: row2Translate;
|
|
Behavior on x { NumberAnimation { duration: 500; easing.type: Easing.InOutQuad }}
|
|
}
|
|
]
|
|
height: parent.height / 2
|
|
width: parent.width
|
|
Repeater {
|
|
model: randomItems2
|
|
RemoteImage {
|
|
clip: true
|
|
height: row2.height
|
|
width: height
|
|
source: Utils.itemModelImageUrl(ApiClient.baseUrl, model.id, model.imageTags["Primary"], "Primary", {"maxHeight": row1.height})
|
|
fillMode: Image.PreserveAspectCrop
|
|
}
|
|
}
|
|
|
|
function move() {
|
|
if (movingRight) {
|
|
row2Translate.x -= row1.height
|
|
moveCount++;
|
|
} else {
|
|
row2Translate.x += row1.height
|
|
moveCount--;
|
|
}
|
|
if (moveCount == 0) movingRight = true;
|
|
if (moveCount == rowCount - 3) movingRight = false;
|
|
}
|
|
}
|
|
|
|
Connections {
|
|
target: appWindow
|
|
onCollectionIdChanged: {
|
|
randomItems1.parentId = collectionId
|
|
randomItems2.parentId = collectionId
|
|
randomItems1.reload()
|
|
randomItems2.reload()
|
|
}
|
|
}
|
|
|
|
Timer {
|
|
property bool odd: false
|
|
running: true
|
|
interval: 5000
|
|
repeat: true
|
|
onTriggered: {
|
|
if (odd) {
|
|
row1.move()
|
|
} else {
|
|
row2.move()
|
|
}
|
|
odd = !odd
|
|
}
|
|
}
|
|
|
|
}
|