harbour-labyrinth/qml/pages/Favorites.qml
2025-05-30 16:03:59 +02:00

555 lines
22 KiB
QML

import QtQuick 2.0
import Sailfish.Silica 1.0
import "../JSONListModel"
import Nemo.Notifications 1.0
Page {
id: page
//property int ny: 0
SilicaListView {
id: listView
anchors.fill: parent
clip: true
model: favorites
header: PageHeader {
id: pHeader
title: "Favorites"
}
delegate: ListItem {
id: showDelegate
width: ListView.view.width
property string f_name: name ? name : ""
property string f_summary: summary ? summary : ""
property string f_stat: status ? status : ""
property string f_premiered: premiered ? premiered : ""
property string f_rating: rating ? rating : ""
property int f_updated: updated ? updated : ""
property string f_imdb: imdb ? imdb : ""
property string f_official: official ? official : ""
property string f_network: network ? network : ""
property string f_image: image ? image : "../No-Image-.png"
property string f_next: next ? next : ""
property string f_nextse: nextse ? nextse : ""
property string f_prev: prev ? prev : ""
property bool f_upd: false
property bool running: false
property bool ended: false
property bool max: false
contentHeight: showImg.height + showName.height + (Theme.paddingLarge * 4)
Notification {
id: notification
category: "Update"
//summary: "Updated tv show"
//itemCount: favorites.count
//itemCount: favorites.count
//expireTimeout: 0
//itemCount: favorites.count
}
JSONSimple {
id: updateFavorite
source: "http://api.tvmaze.com/shows/"+showid
onReadyChanged: {
if (ready) {
if (updated !== simple.updated ) {
var ne
var nese
var pr
f_upd = true
f_name = simple.name
f_summary = simple.summary
f_stat = simple.status
simple.premiered ? f_premiered = simple.premiered : f_premiered = ""
f_rating = simple.rating.average
f_updated = simple.updated
//officialSite ? sofficial = officialSite : ""
simple.externals.imdb ? f_imdb = simple.externals.imdb : f_imdb = ""
simple.officialSite ? f_official = simple.officialSite : f_official = ""
simple.webChannel ? f_network = simple.webChannel.name : f_network = simple.network.name
f_image = simple.image.medium
simple._links.previousepisode ? pr = simple._links.previousepisode.href : pr = ""
simple._links.nextepisode ? ne = simple._links.nextepisode.href : ne = ""
// console.log(simple.officialSite)
if (pr !== "") {
prevshow.showNlink = ne
prevshow.showPlink = pr
prevshow.source = pr
} else {
if (next !== ""){
nextshow.source = ne
} else {
doneUdating = true
}
}
updateFav(showid, f_name, f_image, f_summary, f_stat, f_premiered, f_rating, f_network, f_updated, f_imdb, f_official)
}
//console.log("IMDB: "+f_imdb)
}
}
}
JSONSimple {
id: nextshow
//property string showid: ""
property string showNlink: ""
property string ne: ""
property string nese: ""
onReadyChanged: {
if (ready) {
console.log(" ---- UPDATING NEXTSHOW")
simple.airdate ? ne = simple.airdate : ne = "?"
ne !== "?" ? nese = "S"+simple.season+"E"+simple.number : nese = ""
f_next = ne
f_nextse = nese
console.log(f_name+" has been updated. ")
updateNext(showid, ne, nese)
notification.summary = f_name
notification.subText = "Labyrinth"
notification.body = "Next episode: "+f_next
//notification.text = "Next episode: "+f_next
notification.publish()
//doneUdating = true
}
}
}
JSONSimple {
id: prevshow
//property string showid: ""
property string showPlink: ""
property string showNlink: ""
property string pr: ""
onReadyChanged: {
if (ready) {
console.log(" ---- UPDATING PREVSHOW")
simple.airdate ? pr = simple.airdate : pr = "?"
f_prev = pr
updatePrev(showid, pr)
if (showNlink !== "") {
//nextshow.showid = showid
//nextShow.showNlink = showNlink
nextshow.source = showNlink
} else {
f_next = "?"
f_nextse = ""
updateNext(showid, "?", "")
//doneUdating = true
}
}
}
}
function showRemorseItem() {
var idx = index
remorseAction("Removing "+name+" from favorites!", function() {delFav(showid);listView.model.remove(idx)})
}
OpacityRampEffect {
sourceItem: showRect
direction: OpacityRamp.TopToBottom
offset: 0.0
slope: 1.0
}
Rectangle {
id: showRect
anchors.left: parent.left
anchors.right: parent.right
width: parent.width
height: showName.height + Theme.paddingLarge
color: Theme.rgba(Theme.highlightBackgroundColor, Theme.highlightBackgroundOpacity)
}
Image {
id: nextIcon
anchors.verticalCenter: showRect.verticalCenter
anchors.right: showRect.right
anchors.rightMargin: Theme.paddingMedium
source: "image://theme/icon-m-right"
}
Image {
id: seenIcon
visible: false
anchors.right: parent.right
anchors.bottom: showImg.bottom
anchors.rightMargin: Theme.paddingMedium
source: "image://theme/icon-m-acknowledge"
}
Text {
id: showName
//text: ""
text: f_name
color: highlighted ? Theme.highlightColor : Theme.primaryColor
anchors.leftMargin: Theme.paddingMedium
anchors.rightMargin: Theme.paddingMedium
anchors.left: parent.left
anchors.right: nextIcon.left
anchors.verticalCenter: showRect.verticalCenter
wrapMode: Text.ElideRight
font.pixelSize: Theme.fontSizeLarge
maximumLineCount: 1
}
Image {
id: showImg
fillMode: Image.PreserveAspectFit
source: f_image
anchors.top: showRect.bottom
anchors.margins: Theme.paddingLarge
anchors.left: parent.left
width: height * 0.8
height: (showName.height + showS.height + showP.height + showR.height + showN.height + showPr.height + Theme.paddingLarge) * showImg.scale
scale: 1.1
BusyIndicator {
id: imgBysy
running: showImg.progress !== 1.0
size: BusyIndicatorSize.Large
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
}
}
Image {
id: favIcon
anchors.right: parent.right
anchors.top: showImg.top
anchors.topMargin: Theme.paddingSmall
height: showStatus.height + (showStatus.height/2)
width: height
//anchors.top: showImg.top
anchors.rightMargin: Theme.paddingMedium
source: getFav(showid) ? "image://theme/icon-m-favorite-selected" : "image://theme/icon-m-favorite"
MouseArea {
anchors.fill: favIcon
onClicked: showRemorseItem()//remorse.executeqsTr("Removing "+name+" from favorites!"), function() {delFav(model.showid)}, 5000)
}
}
//icon-m-refresh
Image {
id: updIcon
anchors.right: favIcon.left
anchors.top: showImg.top
anchors.topMargin: Theme.paddingSmall
height: showStatus.height + (showStatus.height/2)
width: height
//anchors.top: showImg.top
anchors.rightMargin: Theme.paddingMedium
mirror: true
source: f_upd ? "image://theme/icon-m-notifications" : ""
}
Text {
id: showS
text: "Status:"
color: highlighted ? Theme.highlightColor : Theme.primaryColor
wrapMode: Text.WordWrap
anchors.topMargin: Theme.paddingMedium
anchors.bottom: showP.top
anchors.left: showImg.right
anchors.leftMargin: Theme.paddingMedium
font.pixelSize: Theme.fontSizeSmall
}
Text {
id: showStatus
text: f_stat
color: {//highlighted ? Theme.highlightColor : running && f_next !== "?" ? Theme.primaryColor : ended ? Theme.errorColor : Theme.secondaryColor
if (highlighted) Theme.highlightColor;
else if (f_stat === "Ended") Theme.errorColor;
else if (f_stat === "Running" && f_next !== "?") Theme.highlightColor
else if (f_stat === "Running" && f_next === "?") Theme.primaryColor
else Theme.secondaryColor
}
wrapMode: Text.WordWrap
anchors.topMargin: Theme.paddingMedium
anchors.bottom: showP.top
anchors.left: showS.right
anchors.right: parent.right
anchors.leftMargin: Theme.paddingMedium
font.pixelSize: Theme.fontSizeSmall
font.bold: true
}
Text {
id: showP
text: "Premiered:"
color: highlighted ? Theme.highlightColor : Theme.primaryColor
wrapMode: Text.WordWrap
anchors.bottom: showR.top
anchors.left: showImg.right
anchors.leftMargin: Theme.paddingMedium
font.pixelSize: Theme.fontSizeSmall
}
Text {
id: showPrem
text: f_premiered
color: highlighted ? Theme.highlightColor : Theme.primaryColor
wrapMode: Text.WordWrap
anchors.bottom: showR.top
anchors.left: showP.right
anchors.right: parent.right
anchors.leftMargin: Theme.paddingMedium
font.pixelSize: Theme.fontSizeSmall
font.bold: true
}
Text {
id: showR
text: "Average rating:"
color: highlighted ? Theme.highlightColor : Theme.primaryColor
wrapMode: Text.WordWrap
anchors.bottom: showN.top
anchors.left: showImg.right
anchors.leftMargin: Theme.paddingMedium
font.pixelSize: Theme.fontSizeSmall
}
Text {
id: showRating
text: f_rating
color: highlighted ? Theme.highlightColor : Theme.primaryColor
wrapMode: Text.WordWrap
anchors.bottom: showN.top
anchors.left: showR.right
anchors.right: parent.right
anchors.leftMargin: Theme.paddingMedium
font.pixelSize: Theme.fontSizeSmall
font.bold: true
}
Text {
id: showN
text: "Network:"
color: highlighted ? Theme.highlightColor : Theme.primaryColor
wrapMode: Text.ElideRight
maximumLineCount: 1
anchors.bottom: showPr.top
anchors.left: showImg.right
anchors.leftMargin: Theme.paddingMedium
font.pixelSize: Theme.fontSizeSmall
}
Text {
id: showNetwork
text: f_network
color: highlighted ? Theme.highlightColor : Theme.primaryColor
wrapMode: Text.ElideRight
maximumLineCount: 1
anchors.bottom: showPr.top
anchors.left: showN.right
anchors.right: parent.right
anchors.leftMargin: Theme.paddingMedium
font.pixelSize: Theme.fontSizeSmall
font.bold: true
}
Text {
id: showPr
text: "Previous:"
color: highlighted ? Theme.highlightColor : Theme.primaryColor
wrapMode: Text.ElideRight
maximumLineCount: 1
anchors.bottom: showNe.top
anchors.left: showImg.right
anchors.leftMargin: Theme.paddingMedium
font.pixelSize: Theme.fontSizeSmall
}
Text {
id: showPrev
text: f_prev
color: highlighted ? Theme.highlightColor : Theme.primaryColor
wrapMode: Text.ElideRight
maximumLineCount: 1
anchors.bottom: showNe.top
anchors.left: showPr.right
anchors.right: parent.right
anchors.leftMargin: Theme.paddingMedium
font.pixelSize: Theme.fontSizeSmall
font.bold: f_prev !== "Unknown" ? true : false
}
Text {
id: showNe
text: f_nextse ? "Next: ("+f_nextse+")" : "Next: "
color: highlighted ? Theme.highlightColor : Theme.primaryColor
wrapMode: Text.ElideRight
maximumLineCount: 1
anchors.bottom: showImg.bottom
anchors.bottomMargin: Theme.paddingSmall
anchors.left: showImg.right
anchors.leftMargin: Theme.paddingMedium
font.pixelSize: Theme.fontSizeSmall
}
Text {
id: showNext
text: f_next
color: highlighted ? Theme.highlightColor : f_stat === "Running" && f_next !== "?" ? Theme.highlightColor : Theme.primaryColor
wrapMode: Text.ElideRight
maximumLineCount: 1
anchors.bottom: showImg.bottom
anchors.bottomMargin: Theme.paddingSmall
anchors.left: showNe.right
anchors.right: parent.right
anchors.leftMargin: Theme.paddingSmall
font.pixelSize: Theme.fontSizeSmall
font.bold: text !== "Unknown" ? true : false
}
onPressAndHold: pageStack.push(Qt.resolvedUrl("ShowImg.qml"),{"img": f_image})
onClicked: {
//frompage === undefined ?
if (f_upd) f_upd = false
pageStack.push(Qt.resolvedUrl("../pages/InfoPage.qml"),
{"showid": showid,"showname": name, "showimage": showImg.source, "summary": summary, "showstatus": status, "showprem": showPrem.text, "showrating": showRating.text,
"shownetwork": showNetwork.text, "showupdated": model.updated, "showprev": showPrev.text, "shownext": showNext.text, "shownextse": nextse, "simdb": f_imdb, "sofficial": f_official})
}
}
PullDownMenu {
MenuItem {
text: qsTr("About Labyrinth")
onClicked: pageStack.push(Qt.resolvedUrl("About.qml"))
}
MenuItem {
text: qsTr("Popular shows by rating")
onClicked: pageStack.replace(Qt.resolvedUrl("PopularPage.qml"),{"showweight": false},PageStackAction.Immediate)
}
MenuItem {
text: qsTr("Popular shows by clicks")
onClicked: pageStack.replace(Qt.resolvedUrl("PopularPage.qml"),{"showweight": true},PageStackAction.Immediate)
}
/* MenuItem {
text: qsTr("Refresh Favorites")
onClicked: {//pageStack.replace(Qt.resolvedUrl("SearchPage.qml"),{},PageStackAction.Immediate)
favorites.clear()
pageStack.replace(Qt.resolvedUrl("Favorites.qml"),{},PageStackAction.Immediate)
}
} */
MenuItem {
text: qsTr("Search TV show")
onClicked: pageStack.replace(Qt.resolvedUrl("SearchPage.qml"),{},PageStackAction.Immediate)
}
MenuItem {
text: qsTr("Notify")
onClicked: notification.publish()
}
}
}
Notification {
id: notifi
category: "x-nemo.example"
appName: "Example App"
appIcon: "/usr/share/example-app/icon-l-application"
summary: "Notification summary"
body: "Notification body"
previewSummary: "Notification preview summary"
previewBody: "Notification preview body"
itemCount: 5
timestamp: "2013-02-20 18:21:00"
remoteActions: [ {
"name": "default",
"displayName": "Do something",
"icon": "icon-s-do-it",
"service": "org.nemomobile.example",
"path": "/example",
"iface": "org.nemomobile.example",
"method": "doSomething",
"arguments": [ "argument", 1 ]
},{
"name": "ignore",
"displayName": "Ignore the problem",
"icon": "icon-s-ignore",
"input" : {
"label": "Please select",
"editable": true,
"choices": [ "Yes", "No", "Maybe" ]
},
"service": "org.nemomobile.example",
"path": "/example",
"iface": "org.nemomobile.example",
"method": "ignore",
"arguments": [ "argument", 1 ]
} ]
onClicked: console.log("Clicked")
onClosed: console.log("Closed, reason: " + reason)
}
/* ViewPlaceholder {
enabled: !updateModel.ready || favorites.count === 0//listView.count === 0 //|| jsonModel1.jsonready
text: dbcount > 0 ? "Checking TVMAZE for updated TV-shows" : listView.count === 0 ? "Favorites empty" : ""
hintText: updateModel.ready === 0 ? "add shows from TVMAZE" : ""
Image {
id: logo
anchors.horizontalCenter: parent.horizontalCenter
//anchors.verticalCenter: parent.verticalCenter
width: parent.width * 0.4
height: width
anchors.bottom: parent.top
anchors.bottomMargin: Theme.paddingLarge
opacity: 0.2
source: "../harbour-labyrinth.png"
}
BusyIndicator {
id: checking
running: !updateModel.ready
size: BusyIndicatorSize.Large
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.bottom
anchors.topMargin: Theme.paddingLarge
//anchors.centerIn: logo
//anchors.horizontalCenter: parent.horizontalCenter
//anchors.top: logo.bottom
//anchors.topMargin: Theme.paddingLarge
//anchors.verticalCenter: parent.verticalCenter
} */
/* Button {
text: "Search TVMaze"
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
anchors.bottomMargin: Theme.paddingLarge
onClicked: pageStack.replace(Qt.resolvedUrl("SearchPage.qml"),{},PageStackAction.Immediate)
} */
// }
//}
}