mirror of
https://github.com/HenkKalkwater/harbour-sailfin.git
synced 2025-09-05 10:12:46 +00:00
Added videoplayer and many unrelated things
This commit is contained in:
parent
53b3eac213
commit
92a18c4fa5
28 changed files with 889 additions and 51 deletions
40
qml/pages/setup/AddServerConnectingPage.qml
Normal file
40
qml/pages/setup/AddServerConnectingPage.qml
Normal file
|
@ -0,0 +1,40 @@
|
|||
import QtQuick 2.6
|
||||
import Sailfish.Silica 1.0
|
||||
import nl.netsoj.chris.Jellyfin 1.0
|
||||
|
||||
Page {
|
||||
property string serverName
|
||||
property string serverAddress
|
||||
property Page firstPage
|
||||
|
||||
allowedOrientations: Orientation.All
|
||||
|
||||
|
||||
BusyLabel {
|
||||
text: qsTr("Connecting to %1").arg(serverName)
|
||||
running: true
|
||||
}
|
||||
|
||||
onStatusChanged: {
|
||||
if (status == PageStatus.Active) {
|
||||
console.log("Connecting page active");
|
||||
ApiClient.setupConnection();
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: ApiClient
|
||||
onConnectionSuccess: {
|
||||
console.log("Login success: " + loginMessage);
|
||||
pageStack.replace(Qt.resolvedUrl("LoginDialog.qml"), {"loginMessage": loginMessage, "firstPage": firstPage});
|
||||
}
|
||||
onConnectionFailed: function(error) {
|
||||
console.log("Connection failed : " + error)
|
||||
pageStack.pop();
|
||||
}
|
||||
onNetworkError: {
|
||||
console.log("ConnectingPage: popping page!")
|
||||
pageStack.pop();
|
||||
}
|
||||
}
|
||||
}
|
89
qml/pages/setup/AddServerPage.qml
Normal file
89
qml/pages/setup/AddServerPage.qml
Normal file
|
@ -0,0 +1,89 @@
|
|||
import QtQuick 2.6
|
||||
import Sailfish.Silica 1.0
|
||||
import nl.netsoj.chris.Jellyfin 1.0
|
||||
|
||||
Dialog {
|
||||
id: dialogRoot
|
||||
allowedOrientations: Orientation.All
|
||||
// Picks the address of the ComboBox if selected, otherwise the manual address entry
|
||||
readonly property string address: serverSelect.currentItem._address
|
||||
readonly property bool addressCorrect: serverSelect.currentIndex > 0 || manualAddress.acceptableInput
|
||||
readonly property string serverName: serverSelect.currentItem._name
|
||||
|
||||
|
||||
acceptDestination: AddServerConnectingPage {
|
||||
id: connectingPage
|
||||
serverName: dialogRoot.serverName
|
||||
serverAddress: address
|
||||
firstPage: dialogRoot
|
||||
}
|
||||
|
||||
Column {
|
||||
width: parent.width
|
||||
DialogHeader {
|
||||
acceptText: qsTr("Connect")
|
||||
title: qsTr("Connect to Jellyfin")
|
||||
}
|
||||
|
||||
ServerDiscoveryModel {
|
||||
id: serverModel
|
||||
}
|
||||
|
||||
|
||||
ComboBox {
|
||||
id: serverSelect
|
||||
label: qsTr("Server")
|
||||
description: qsTr("Sailfin will try to search for Jellyfin servers on your local network automatically")
|
||||
|
||||
menu: ContextMenu {
|
||||
MenuItem {
|
||||
// Special values are cool, aren't they?
|
||||
readonly property string _address: manualAddress.text
|
||||
readonly property string _name: manualAddress.text
|
||||
text: qsTr("enter address manually")
|
||||
}
|
||||
Repeater {
|
||||
model: serverModel
|
||||
delegate: MenuItem {
|
||||
readonly property string _address: address
|
||||
readonly property string _name: name
|
||||
text: qsTr("%1 - %2").arg(name).arg(address)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: manualAddress
|
||||
width: parent.width
|
||||
clip: true
|
||||
|
||||
label: qsTr("Server address")
|
||||
placeholderText: qsTr("e.g. https://demo.jellyfin.org")
|
||||
|
||||
enabled: serverSelect.currentIndex == 0
|
||||
visible: enabled
|
||||
|
||||
inputMethodHints: Qt.ImhUrlCharactersOnly
|
||||
validator: RegExpValidator {
|
||||
regExp: /^https?:\/\/[a-zA-Z0-9-._~:/?#\[\]\@\!\$\&\'\(\)\*\+\,\;\=]+$/m
|
||||
}
|
||||
|
||||
EnterKey.enabled: addressCorrect
|
||||
EnterKey.iconSource: "image://theme/icon-m-enter-accept"
|
||||
EnterKey.onClicked: dialogRoot.tryConnect()
|
||||
}
|
||||
}
|
||||
|
||||
onOpened: serverModel.refresh()
|
||||
canAccept: addressCorrect
|
||||
|
||||
function tryConnect() {
|
||||
console.log("Hi there!")
|
||||
ApiClient.baseUrl = address;
|
||||
//ApiClient.setupConnection()
|
||||
//fakeTimer.start()
|
||||
}
|
||||
|
||||
onDone: tryConnect()
|
||||
}
|
127
qml/pages/setup/LoginDialog.qml
Normal file
127
qml/pages/setup/LoginDialog.qml
Normal file
|
@ -0,0 +1,127 @@
|
|||
import QtQuick 2.6
|
||||
import Sailfish.Silica 1.0
|
||||
import nl.netsoj.chris.Jellyfin 1.0
|
||||
|
||||
import "../../components"
|
||||
|
||||
Dialog {
|
||||
property string loginMessage
|
||||
property Page firstPage
|
||||
|
||||
allowedOrientations: Orientation.All
|
||||
|
||||
|
||||
acceptDestination: Page {
|
||||
BusyLabel {
|
||||
text: qsTr("Logging in as %1").arg(username.text)
|
||||
running: true
|
||||
}
|
||||
onStatusChanged: {
|
||||
if(status == PageStatus.Active) {
|
||||
ApiClient.authenticate(username.text, password.text, true)
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: ApiClient
|
||||
onAuthenticatedChanged: {
|
||||
if (ApiClient.authenticated) {
|
||||
console.log("authenticated!")
|
||||
pageStack.replaceAbove(pageStack.previousPage(firstPage), Qt.resolvedUrl("../MainPage.qml"))
|
||||
}
|
||||
}
|
||||
onAuthenticationError: {
|
||||
pageStack.completeAnimation()
|
||||
pageStack.pop()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PublicUserModel {
|
||||
id: userModel
|
||||
apiClient: ApiClient
|
||||
Component.onCompleted: reload();
|
||||
}
|
||||
|
||||
DialogHeader {
|
||||
id: dialogHeader
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
acceptText: qsTr("Login");
|
||||
}
|
||||
SilicaFlickable {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: dialogHeader.bottom
|
||||
anchors.bottom: parent.bottom
|
||||
contentHeight: column.height
|
||||
clip: true
|
||||
|
||||
VerticalScrollDecorator {}
|
||||
|
||||
Column {
|
||||
id: column
|
||||
width: parent.width
|
||||
|
||||
Flow {
|
||||
width: parent.width
|
||||
Repeater {
|
||||
model: userModel
|
||||
delegate: UserGridDelegate {
|
||||
name: model.name
|
||||
image: model.primaryImageTag ? "%1/Users/%2/Images/Primary?tag=%3".arg(ApiClient.baseUrl).arg(model.id).arg(model.primaryImageTag) : null
|
||||
highlighted: model.name == username.text
|
||||
onClicked: {
|
||||
username.text = model.name
|
||||
password.focus = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SectionHeader {
|
||||
text: qsTr("Credentials")
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: username
|
||||
width: parent.width
|
||||
placeholderText: qsTr("Username")
|
||||
label: qsTr("Username")
|
||||
EnterKey.iconSource: "image://theme/icon-m-enter-next"
|
||||
EnterKey.onClicked: password.focus = true
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: password
|
||||
width: parent.width
|
||||
|
||||
placeholderText: qsTr("Password")
|
||||
label: qsTr("password")
|
||||
echoMode: TextInput.Password
|
||||
EnterKey.iconSource: "image://theme/icon-m-enter-accept"
|
||||
EnterKey.onClicked: login()
|
||||
}
|
||||
|
||||
SectionHeader {
|
||||
text: qsTr("Login message")
|
||||
}
|
||||
Label {
|
||||
anchors {
|
||||
left: parent.left
|
||||
right: parent.right
|
||||
leftMargin: Theme.horizontalPageMargin
|
||||
rightMargin: Theme.horizontalPageMargin
|
||||
}
|
||||
text: loginMessage
|
||||
wrapMode: Text.WordWrap
|
||||
color: Theme.highlightColor
|
||||
}
|
||||
}
|
||||
}
|
||||
canAccept: username.text.length > 0
|
||||
|
||||
/*onAccepted: {
|
||||
pageStack.replace(Qt.resolvedUrl("MainPage.qml"))
|
||||
}*/
|
||||
}
|
0
qml/pages/setup/a
Normal file
0
qml/pages/setup/a
Normal file
Loading…
Add table
Add a link
Reference in a new issue