Initial commit
This commit is contained in:
commit
73a6841c08
20
harbour-labyrinth.desktop
Normal file
20
harbour-labyrinth.desktop
Normal file
@ -0,0 +1,20 @@
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
X-Nemo-Application-Type=silica-qt5
|
||||
Icon=harbour-labyrinth
|
||||
Exec=harbour-labyrinth
|
||||
Name=Labyrinth
|
||||
# translation example:
|
||||
# your app name in German locale (de)
|
||||
#
|
||||
# Remember to comment out the following line, if you do not want to use
|
||||
# a different app name in German locale (de).
|
||||
Name[de]=Labyrinth
|
||||
|
||||
[X-Sailjail]
|
||||
# Replace with your organization as a reverse domain name
|
||||
OrganizationName=org.nesnomis
|
||||
# ApplicationName does not have to be identical to Name
|
||||
ApplicationName=harbour-labyrinth
|
||||
# Add the required permissions here
|
||||
Permissions=WebView;Internet
|
59
harbour-labyrinth.pro
Normal file
59
harbour-labyrinth.pro
Normal file
@ -0,0 +1,59 @@
|
||||
# NOTICE:
|
||||
#
|
||||
# Application name defined in TARGET has a corresponding QML filename.
|
||||
# If name defined in TARGET is changed, the following needs to be done
|
||||
# to match new name:
|
||||
# - corresponding QML filename must be changed
|
||||
# - desktop icon filename must be changed
|
||||
# - desktop filename must be changed
|
||||
# - icon definition filename in desktop file must be changed
|
||||
# - translation filenames have to be changed
|
||||
|
||||
# The name of your application
|
||||
TARGET = harbour-labyrinth
|
||||
|
||||
CONFIG += sailfishapp
|
||||
|
||||
# App version
|
||||
DEFINES += APP_VERSION=\"\\\"$${VERSION}\\\"\"
|
||||
|
||||
SOURCES += src/harbour-labyrinth.cpp
|
||||
|
||||
OTHER_FILES += qml/harbour-labyrinth.qml \
|
||||
qml/cover/CoverPage.qml \
|
||||
rpm/harbour-labyrinth.changes.in \
|
||||
rpm/harbour-labyrinth.spec \
|
||||
rpm/harbour-labyrinth.yaml \
|
||||
translations/*.ts \
|
||||
harbour-labyrinth.desktop
|
||||
|
||||
SAILFISHAPP_ICONS = 86x86 108x108 128x128 256x256
|
||||
|
||||
# to disable building translations every time, comment out the
|
||||
# following CONFIG line
|
||||
CONFIG += sailfishapp_i18n
|
||||
|
||||
# German translation is enabled as an example. If you aren't
|
||||
# planning to localize your app, remember to comment out the
|
||||
# following TRANSLATIONS line. And also do not forget to
|
||||
# modify the localized app name in the the .desktop file.
|
||||
TRANSLATIONS += translations/harbour-labyrinth-de.ts
|
||||
|
||||
DISTFILES += \
|
||||
../harbour-notes/qml/pages/OpenPage.qml \
|
||||
qml/pages/CastInfoPage.qml \
|
||||
qml/pages/CastPage.qml \
|
||||
qml/pages/Favorites.qml \
|
||||
qml/pages/InfoPage.qml \
|
||||
qml/pages/PopularPage.qml \
|
||||
qml/pages/SearchPage.qml \
|
||||
qml/pages/SeasonNrPage.qml \
|
||||
qml/pages/SeasonsPage.qml \
|
||||
qml/js/jsonpath.js \
|
||||
qml/js/favorites.js \
|
||||
qml/JSONListModel/JSONSimple.qml \
|
||||
qml/JSONListModel/JSONListModel.qml \
|
||||
qml/delegates/ShowDelegate.qml \
|
||||
qml/JSONListModel/JSONGetUpdated.qml \
|
||||
qml/pages/ShowImg.qml \
|
||||
qml/pages/WebViewer.qml
|
BIN
icons/108x108/harbour-labyrinth.png
Normal file
BIN
icons/108x108/harbour-labyrinth.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
BIN
icons/128x128/harbour-labyrinth.png
Normal file
BIN
icons/128x128/harbour-labyrinth.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
BIN
icons/256x256/harbour-labyrinth.png
Normal file
BIN
icons/256x256/harbour-labyrinth.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
BIN
icons/86x86/harbour-labyrinth.png
Normal file
BIN
icons/86x86/harbour-labyrinth.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.0 KiB |
122
qml/JSONListModel/JSONGetUpdated.qml
Normal file
122
qml/JSONListModel/JSONGetUpdated.qml
Normal file
@ -0,0 +1,122 @@
|
||||
import QtQuick 2.0
|
||||
|
||||
Item {
|
||||
property string src: ""
|
||||
// property int donevalue: 3
|
||||
property bool done: true//donevalue !== 3 ? false : true
|
||||
JSONSimple {
|
||||
id: showupdated
|
||||
source: src
|
||||
|
||||
onReadyChanged: {
|
||||
if (ready) {
|
||||
var id
|
||||
var name
|
||||
var image
|
||||
var summary
|
||||
var status
|
||||
var premiered
|
||||
var rating
|
||||
var network
|
||||
var updated
|
||||
var next
|
||||
var prev
|
||||
var imdb
|
||||
|
||||
simple.id ? id = simple.id : id = "???"
|
||||
simple.name ? name = simple.name : name = "???"
|
||||
simple.image.medium ? image = simple.image.medium : image = "???"
|
||||
simple.summary ? summary = simple.summary : summary = "???"
|
||||
simple.status ? status = simple.status : status = "???"
|
||||
simple.premiered ? premiered = simple.premiered : premiered = "???"
|
||||
simple.rating.average ? rating = simple.rating.average : rating = "???"
|
||||
simple.webChannel ? network = simple.webChannel.name : network = simple.network.name
|
||||
simple.updated ? updated = simple.updated : updated = "???"
|
||||
|
||||
simple._links.previousepisode ? prev = simple._links.previousepisode.href : prev = ""
|
||||
simple._links.nextepisode ? next = simple._links.nextepisode.href : next = ""
|
||||
simple.externals.imdb ? imdb = simple.externals.imdb : imdb = ""
|
||||
|
||||
|
||||
updateFav(id, name, image, summary, status, premiered, rating, network, updated, prev, next, imdb)
|
||||
//donevalue = donevalue + 1
|
||||
|
||||
console.log("---SHOWUPDATED: "+simple.name)
|
||||
done = true
|
||||
// prevshow.shid = simple.id
|
||||
// simple._links.previousepisode ? prevshow.source = simple._links.previousepisode.href : donevalue = donevalue + 1
|
||||
// nextshow.shid = simple.id
|
||||
// simple._links.nextepisode ? nextshow.source = simple._links.nextepisode.href : donevalue = donevalue + 1
|
||||
|
||||
|
||||
|
||||
|
||||
/* if (typeof(simple._links.nextepisode.href) == 'undefined') {
|
||||
donevalue = donevalue + 1
|
||||
} else nextshow.source = simple._links.nextepisode.href */
|
||||
|
||||
|
||||
/* if (simple.status !== "Ended") {
|
||||
prevshow.next =
|
||||
prevshow.source = simple._links.previousepisode.href
|
||||
nextshow.source = simple._links.nextepisode.href
|
||||
} */
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
JSONSimple {
|
||||
id: nextshow
|
||||
property int shid
|
||||
onReadyChanged: {
|
||||
if (ready) {
|
||||
var senext = "S"+simple.season+"E"+simple.number
|
||||
updateNext(shid, simple.airdate, senext);
|
||||
donevalue = donevalue + 1
|
||||
console.log("---NEXT: "+shid+" : "+simple.airdate)
|
||||
|
||||
// snext = simple.airdate // update database here
|
||||
// senext = "S"+simple.season+"E"+simple.number
|
||||
|
||||
// list.append({"cost": 5.95, "name":"Pizza"})
|
||||
// updateFav(sshowid, showName, showimg, ssummary, showStatus, showPrem, showRating, showNetwork, shupdated, sprev, snext, senext);
|
||||
//showPrev.text = sprev
|
||||
//showNext.text = snext
|
||||
//reloadFav()
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
JSONSimple {
|
||||
id: prevshow
|
||||
property int shid
|
||||
onReadyChanged: {
|
||||
if (ready) {
|
||||
updatePrev(shid, simple.airdate);
|
||||
donevalue = donevalue + 1
|
||||
console.log("---PREVIOUS: "+shid+" : "+simple.airdate)
|
||||
// console.log("PREV: "+simple.airdate)
|
||||
// sprev = simple.airdate
|
||||
// senext = ""
|
||||
// if (showupdated.simple._links.nextepisode) {
|
||||
// console.log("GOING NEXT")
|
||||
// nextshow.source = lnext
|
||||
// } else {
|
||||
// console.log("NOT GOING NEXT")
|
||||
// snext = "" //update database here
|
||||
// updateFav(sshowid, showName, showimg, ssummary, showStatus, showPrem, showRating, showNetwork, shupdated, sprev, snext, senext);
|
||||
//showPrev.text = sprev
|
||||
//showNext.text = snext
|
||||
//reloadFav()
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
106
qml/JSONListModel/JSONListModel.qml
Normal file
106
qml/JSONListModel/JSONListModel.qml
Normal file
@ -0,0 +1,106 @@
|
||||
/* JSONListModel - a QML ListModel with JSON and JSONPath support
|
||||
*
|
||||
* Copyright (c) 2012 Romain Pokrzywka (KDAB) (romain@kdab.com)
|
||||
* Licensed under the MIT licence (http://opensource.org/licenses/mit-license.php)
|
||||
*/
|
||||
|
||||
import QtQuick 2.0
|
||||
import "../js/jsonpath.js" as JSONPath
|
||||
|
||||
Item {
|
||||
property string source: ""
|
||||
property string json: ""
|
||||
property string query: ""
|
||||
property bool jsonready: true
|
||||
property bool modelready: true
|
||||
property bool prev: false
|
||||
property bool next: false
|
||||
property string sortby: ""
|
||||
//property string filterby: ""
|
||||
//property string filterkey: ""
|
||||
|
||||
property ListModel model : ListModel { id: jsonModel }
|
||||
property alias count: jsonModel.count
|
||||
//property alias get: jsonModel.get
|
||||
|
||||
onSourceChanged: {
|
||||
if (source !== "") {
|
||||
jsonready = false
|
||||
modelready = false
|
||||
var xhr = new XMLHttpRequest;
|
||||
xhr.open("GET", source);
|
||||
xhr.onreadystatechange = function() {
|
||||
if (xhr.readyState === XMLHttpRequest.DONE)
|
||||
json = xhr.responseText;
|
||||
}
|
||||
xhr.send();
|
||||
} else jsonModel.clear();
|
||||
}
|
||||
|
||||
onJsonChanged: updateJSONModel()
|
||||
onQueryChanged: updateJSONModel()
|
||||
//onFilterbyChanged: updateJSONModel()
|
||||
//onFilterkeyChanged: updateJSONModel()
|
||||
|
||||
function updateJSONModel() {
|
||||
jsonModel.clear();
|
||||
|
||||
if ( json === "" )
|
||||
return;
|
||||
|
||||
var objectArray = parseJSONString(json, query);
|
||||
|
||||
if (sortby !== "") objectArray = sortByKey(objectArray, sortby);
|
||||
//if (filterby !== "" && filterkey !=="") objectArray = filterValuePart(objectArray, filterby, filterkey);
|
||||
|
||||
for ( var key in objectArray ) {
|
||||
var jo = objectArray[key];
|
||||
if( jo.toString() === "[object Object]"){
|
||||
jsonModel.append( jo );
|
||||
} else {
|
||||
//this is comma separated strings
|
||||
var str = jo.toString().split(",");
|
||||
for(var i = 0; i < str.length; i++){
|
||||
jsonModel.append({ "item": str[i] } );
|
||||
}
|
||||
break;
|
||||
}
|
||||
// var jo = objectArray[key];
|
||||
// jsonModel.append( jo );
|
||||
// console.log("JSON: "+objectArray[key])
|
||||
}
|
||||
jsonready = true
|
||||
}
|
||||
|
||||
function parseJSONString(jsonString, jsonPathQuery) {
|
||||
var objectArray = JSON.parse(jsonString);
|
||||
if ( jsonPathQuery !== "" )
|
||||
objectArray = JSONPath.jsonPath(objectArray, jsonPathQuery);
|
||||
|
||||
return objectArray;
|
||||
}
|
||||
|
||||
function filterValuePart(array, part, key) {
|
||||
part = part.toLowerCase();
|
||||
return array.filter(function(a) {
|
||||
var x = a[key];
|
||||
return x.toLowerCase().indexOf(part) !== -1;
|
||||
});
|
||||
}
|
||||
|
||||
function sortByKey(array, key) {
|
||||
var res = key.split(".")
|
||||
//console.log("RES: "+res.length)
|
||||
if (res.length === 1) {
|
||||
return array.sort(function(a, b) {
|
||||
var x = a[res[0]]; var y = b[res[0]];
|
||||
return ((x > y) ? -1 : ((x < y) ? 1 : 0));
|
||||
});
|
||||
} else {
|
||||
return array.sort(function(a, b) {
|
||||
var x = a[res[0]][res[1]]; var y = b[res[0]][res[1]];
|
||||
return ((x > y) ? -1 : ((x < y) ? 1 : 0));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
27
qml/JSONListModel/JSONSimple.qml
Normal file
27
qml/JSONListModel/JSONSimple.qml
Normal file
@ -0,0 +1,27 @@
|
||||
import QtQuick 2.0
|
||||
|
||||
Item {
|
||||
property string source: ""
|
||||
property variant simple
|
||||
property bool ready: true
|
||||
|
||||
onSourceChanged: {
|
||||
ready = false
|
||||
request(source, function (o) {
|
||||
//console.log(o.responseText);
|
||||
simple = eval('new Object(' + o.responseText + ')');ready = true;
|
||||
});
|
||||
|
||||
}
|
||||
function request(url, callback) {
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = (function(myxhr) {
|
||||
return function() {
|
||||
if (myxhr.readyState === XMLHttpRequest.DONE && xhr.status == 200) {callback(myxhr);}
|
||||
}
|
||||
})(xhr);
|
||||
xhr.open('get', url, true);
|
||||
xhr.send('');
|
||||
}
|
||||
}
|
||||
|
BIN
qml/No-Image-.png
Normal file
BIN
qml/No-Image-.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.4 KiB |
73
qml/cover/CoverPage.qml
Normal file
73
qml/cover/CoverPage.qml
Normal file
@ -0,0 +1,73 @@
|
||||
/*
|
||||
Copyright (C) 2013 Jolla Ltd.
|
||||
Contact: Thomas Perl <thomas.perl@jollamobile.com>
|
||||
All rights reserved.
|
||||
|
||||
You may use this file under the terms of BSD license as follows:
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the Jolla Ltd nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
import QtQuick 2.0
|
||||
import Sailfish.Silica 1.0
|
||||
|
||||
CoverBackground {
|
||||
Image{
|
||||
source: "../harbour-labyrinth.png"
|
||||
//height: parent.height
|
||||
//width: parent.width
|
||||
anchors.fill: parent
|
||||
anchors.margins: Theme.paddingSmall
|
||||
fillMode: Image.PreserveAspectCrop
|
||||
opacity: 0.1
|
||||
//anchors.horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
Column {
|
||||
id: column1
|
||||
width: parent.width
|
||||
anchors.centerIn: parent
|
||||
spacing: Theme.paddingSmall
|
||||
|
||||
|
||||
Label {
|
||||
font.pixelSize: Theme.fontSizeExtraLarge
|
||||
font.bold: true
|
||||
text: "Labyrinth"
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
opacity: 0.7
|
||||
|
||||
}
|
||||
Label {
|
||||
font.pixelSize: Theme.fontSizeExtraSmall
|
||||
font.bold: false
|
||||
text: "(version "+ Qt.application.version+")"
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
opacity: 0.7
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
425
qml/delegates/ShowDelegate.qml
Normal file
425
qml/delegates/ShowDelegate.qml
Normal file
@ -0,0 +1,425 @@
|
||||
import QtQuick 2.0
|
||||
import Sailfish.Silica 1.0
|
||||
import "../JSONListModel"
|
||||
|
||||
ListItem {
|
||||
id: showDelegate
|
||||
width: ListView.view.width
|
||||
contentHeight: showImg.height + showName.height + (Theme.paddingLarge * 4)
|
||||
|
||||
property bool favorite: getFav(model.id)
|
||||
property string prev: ""
|
||||
property string next: ""
|
||||
property string nextse: ""
|
||||
property string genretext: ""
|
||||
|
||||
ListModel{id: sgenres}
|
||||
|
||||
function getArrary(ent, model) {
|
||||
if (ent) {
|
||||
console.log("LEN: "+ent.count)
|
||||
for (var i = 0; i < ent.count; i ++) {
|
||||
console.log(ent.get(i))
|
||||
model.append(ent.get(i))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
JSONSimple {
|
||||
id: nextshow
|
||||
onReadyChanged: {
|
||||
if (ready) {
|
||||
simple.airdate ? next = simple.airdate : next = "?"
|
||||
next !== "" ? nextse = "S"+simple.season+"E"+simple.number : nextse = ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
JSONSimple {
|
||||
id: prevshow
|
||||
onReadyChanged: {
|
||||
if (ready) {
|
||||
simple.airdate ? prev = simple.airdate : prev = "?"
|
||||
if (model._links.nextepisode) {
|
||||
nextshow.source = model._links.nextepisode.href
|
||||
} else {
|
||||
next = "?"
|
||||
nextse = ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RemorseItem {
|
||||
id: remorse
|
||||
wrapMode: Text.WordWrap
|
||||
}
|
||||
|
||||
function showRemorseItem() {
|
||||
var idx = index
|
||||
remorseAction( "Removing "+name+" from favorites!", function() {delFav(model.id);favorite = false})
|
||||
}
|
||||
|
||||
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: model.name !== null ? model.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
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
// console.log("COMPLETED")
|
||||
//sgenres.clear()
|
||||
// getArrary(model.genres,sgenres)
|
||||
//blahh = model.get(0).genres
|
||||
//console.log("GENRES: "+blahh.get(1))
|
||||
if (model._links.previousepisode) {
|
||||
prevshow.source = model._links.previousepisode.href
|
||||
} else {
|
||||
prev = "";
|
||||
next = "";
|
||||
nextse = ""
|
||||
}
|
||||
//sgenres = model.genres
|
||||
//console.log("GENRE: "+sgenres.get(0)[0])
|
||||
//var temp = [] //model.genres.count
|
||||
//temp = model.genres
|
||||
//var genretext = ""
|
||||
//console.log("LOG: "+ genres.get(1).modelData)
|
||||
//var genre = temp.split(",")
|
||||
// for(var i = 0; i < model.genres.count; i++) {
|
||||
//fruitModel.get(0).attributes.get(1).value
|
||||
//genretext = genretext + "|" + model.genres.get(i) //model.genres.sublist(i)
|
||||
|
||||
|
||||
// }
|
||||
//return genretext
|
||||
|
||||
}
|
||||
|
||||
Image {
|
||||
id: showImg
|
||||
anchors.top: showRect.bottom
|
||||
anchors.margins: Theme.paddingLarge
|
||||
anchors.left: parent.left
|
||||
fillMode: Image.PreserveAspectFit
|
||||
source: model.image ? model.image.medium : "../No-Image-.png"
|
||||
width: height * 0.8
|
||||
// height: (showName.height + showStatus.height + showPrem.height + showRating.height + showNext.height + showPrev.height + Theme.paddingMedium) * showImg.scale
|
||||
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
|
||||
//visible: false
|
||||
anchors.right: parent.right
|
||||
anchors.top: showImg.top
|
||||
//anchors.verticalCenter: showStatus.verticalCenter
|
||||
height: showStatus.height + (showStatus.height/2)
|
||||
width: height
|
||||
anchors.rightMargin: Theme.paddingMedium
|
||||
source: favorite ? "image://theme/icon-m-favorite-selected" : "image://theme/icon-m-favorite"
|
||||
MouseArea {
|
||||
anchors.fill: favIcon
|
||||
onClicked: if (getFav(model.id)) {showRemorseItem()} else {
|
||||
console.log("ID: "+model.id)
|
||||
var network
|
||||
model.webChannel ? network = model.webChannel.name : network = model.network.name
|
||||
addFav(model.id, model.name, showImg.source, model.summary, model.status, model.premiered, model.rating.average, network, model.updated, prev, next, nextse, model.externals.imdb);
|
||||
reloadFav()
|
||||
favorite=true
|
||||
}
|
||||
}
|
||||
BusyIndicator {
|
||||
id: addBusy
|
||||
running: false
|
||||
size: BusyIndicatorSize.Medium
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
}
|
||||
|
||||
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.right: parent.right
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
}
|
||||
|
||||
Text {
|
||||
id: showStatus
|
||||
text: model.status !== null ? model.status : ""
|
||||
//color: highlighted ? Theme.highlightColor : Theme.primaryColor
|
||||
color: {//highlighted ? Theme.highlightColor : running && f_next !== "?" ? Theme.primaryColor : ended ? Theme.errorColor : Theme.secondaryColor
|
||||
if (highlighted) Theme.highlightColor;
|
||||
else if (model.status === "Ended") Theme.errorColor;
|
||||
else if (model.status === "Running" && next !== "?") Theme.highlightColor
|
||||
else if (model.status === "Running" && next === "?") Theme.primaryColor
|
||||
else Theme.secondaryColor
|
||||
}
|
||||
wrapMode: Text.WordWrap
|
||||
anchors.topMargin: Theme.paddingMedium
|
||||
anchors.bottom: showP.top
|
||||
//anchors.left: showImg.right
|
||||
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: model.premiered !== null ? model.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: showPrem
|
||||
text: model.premiered !== null ? "Premiered: <b>" + model.premiered + "</b>" : ""
|
||||
color: highlighted ? Theme.highlightColor : Theme.primaryColor
|
||||
wrapMode: Text.WordWrap
|
||||
anchors.top: showStatus.bottom
|
||||
anchors.left: showImg.right
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
}
|
||||
*/
|
||||
|
||||
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: model.rating.average ? model.rating.average : "?"
|
||||
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: showRating
|
||||
text: model.rating.average ? "Average rating: <b>" + model.rating.average + "</b>" : "Average rating: <b>?</b>"
|
||||
color: highlighted ? Theme.highlightColor : Theme.primaryColor
|
||||
wrapMode: Text.WordWrap
|
||||
anchors.top: showPrem.bottom
|
||||
anchors.left: showImg.right
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
}
|
||||
*/
|
||||
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: model.webChannel ? model.webChannel.name : model.network.name
|
||||
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: showNetwork
|
||||
text: model.webChannel ? "Network: <b>" + model.webChannel.name + "</b>" : "Network: <b>" + model.network.name + "</b>"
|
||||
//enabled: model.network.name ? true : false
|
||||
color: highlighted ? Theme.highlightColor : Theme.primaryColor
|
||||
wrapMode: Text.ElideRight
|
||||
maximumLineCount: 1
|
||||
anchors.top: showRating.bottom
|
||||
anchors.left: showImg.right
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
}
|
||||
*/
|
||||
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: 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: prev !== "Unknown" ? true : false
|
||||
}
|
||||
|
||||
Text {
|
||||
id: showNe
|
||||
text: nextse !== "" ? "Next: ("+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: next
|
||||
color: highlighted ? 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.paddingMedium
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
font.bold: next !== "Unknown" ? true : false
|
||||
}
|
||||
|
||||
/* Text {
|
||||
id: showGenre
|
||||
text: ""//sgenres.get(1)[0]//genre() //model.network ? "Network: <b>" + model.network.name + "</b>" : "Network:"
|
||||
color: highlighted ? Theme.highlightColor : Theme.primaryColor
|
||||
wrapMode: Text.ElideRight
|
||||
maximumLineCount: 1
|
||||
anchors.top: showImg.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
} */
|
||||
|
||||
onPressAndHold: {
|
||||
pageStack.push(Qt.resolvedUrl("../pages/ShowImg.qml"),{"img": model.image ? model.image.medium : "../No-Image-.png"})
|
||||
//pageStack.push(Qt.resolvedUrl("SeasonsPage.qml"),{"showid": model.id,"showname": model.name,"showimage": showImg.source} )
|
||||
}
|
||||
|
||||
onClicked: {
|
||||
//frompage === undefined ?
|
||||
var network
|
||||
model.webChannel ? network = model.webChannel.name : network = model.network.name
|
||||
pageStack.push(Qt.resolvedUrl("../pages/InfoPage.qml"),
|
||||
{"showid": model.id,"showname": model.name, "showimage": showImg.source, "summary": model.summary, "showstatus": model.status, "showprem": model.premiered, "showrating": model.rating.average, "shownetwork": network, "showupdated": model.updated, "showprev": model.previousepisode, "shownext": model.nextepisode, "simdb": model.externals.imdb, "sofficial": model.officialSite})
|
||||
|
||||
|
||||
//:
|
||||
//pageStack.pop(frompage,PageStackAction.Immediate)
|
||||
//frompage = undefined
|
||||
//pageStack.push(Qt.resolvedUrl("../pages/InfoPage.qml"),{"showid": model.id,"showname": model.name, "showimage": showImg.source, "summary": model.summary, "showstatus": model.status, "showprem": model.premiered, "showrating": model.rating.average, "shownetwork": model.network.name, "showupdated": model.updated, "showprev": model.previousepisode, "shownext": model.nextepisode})//pageStack.clear();pageStack.push(Qt.resolvedUrl("SearchPage.qml")),{};
|
||||
}
|
||||
}
|
||||
|
BIN
qml/harbour-labyrinth.png
Normal file
BIN
qml/harbour-labyrinth.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
62
qml/harbour-labyrinth.qml
Normal file
62
qml/harbour-labyrinth.qml
Normal file
@ -0,0 +1,62 @@
|
||||
import QtQuick 2.0
|
||||
import Sailfish.Silica 1.0
|
||||
import QtQuick.LocalStorage 2.0
|
||||
|
||||
import "JSONListModel"
|
||||
import "pages"
|
||||
import "js/favorites.js" as FavDb
|
||||
|
||||
ApplicationWindow {
|
||||
id: window
|
||||
|
||||
|
||||
ListModel{id: favorites}
|
||||
|
||||
function updateFav(showid, name, image, summary, status, prem, rating, network, updated, imdb, official) {
|
||||
FavDb.update(showid, name, image, summary, status, prem, rating, network, updated, imdb, official)
|
||||
}
|
||||
|
||||
// DETTA SKA GÖRAS BÅDE VID UPPDATERING OCH LÄGGA TILL!!!
|
||||
function updateNext(showid, next, nextse) {
|
||||
FavDb.updateNext(showid, next, nextse)
|
||||
}
|
||||
|
||||
function updatePrev(showid, previous) {
|
||||
FavDb.updatePrev(showid, previous)
|
||||
}
|
||||
// ------------------------------------------------------
|
||||
|
||||
function dropFav() {
|
||||
FavDb.drop()
|
||||
FavDb.initialize()
|
||||
FavDb.load(favorites)
|
||||
}
|
||||
|
||||
function getFav(showid) {
|
||||
return FavDb.getFav(showid)
|
||||
}
|
||||
|
||||
function reloadFav() {
|
||||
FavDb.load(favorites)
|
||||
}
|
||||
|
||||
function addFav(showid, name, image, summary, status, prem, rating, network, updated, previous, next, nextse, imdb, official) {
|
||||
FavDb.add(showid, name, image, summary, status, prem, rating, network, updated, previous, next, nextse,imdb,official)
|
||||
}
|
||||
|
||||
function delFav(showid) {
|
||||
FavDb.del(showid)
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
FavDb.initialize()
|
||||
FavDb.load(favorites)
|
||||
}
|
||||
|
||||
initialPage: Component { Favorites { } }
|
||||
cover: Qt.resolvedUrl("cover/CoverPage.qml")
|
||||
allowedOrientations: defaultAllowedOrientations//| Orientation.Landscape
|
||||
|
||||
}
|
||||
|
||||
|
218
qml/js/favorites.js
Normal file
218
qml/js/favorites.js
Normal file
@ -0,0 +1,218 @@
|
||||
// Database should be updated to contain location and section.
|
||||
|
||||
var db = undefined;
|
||||
function settings_db_open() {
|
||||
if (db == undefined)
|
||||
db = LocalStorage.openDatabaseSync("harbour-labyrinth-test1", "1.0", "StorageDatabase", 100000);
|
||||
|
||||
/* db.transaction(function(tx)
|
||||
{
|
||||
tx.executeSql("DROP TABLE IF EXISTS favorites");
|
||||
}); */
|
||||
|
||||
|
||||
// drop()
|
||||
/* property string showname
|
||||
|
||||
property string showimage: ""
|
||||
property string summary: ""
|
||||
property string showid: ""
|
||||
|
||||
property string showstatus: ""
|
||||
property string showprem: ""
|
||||
property string showrating: ""
|
||||
property string shownetwork: "" */
|
||||
|
||||
return db;
|
||||
}
|
||||
|
||||
/*
|
||||
showName.text = simple.name
|
||||
showStatus.text = simple.status
|
||||
showPrem.text = simple.premiered
|
||||
showRating.text = simple.rating.average
|
||||
showNetwork.text = simple.network.name
|
||||
ssummary = simple.summary
|
||||
imdb = simple.externals.imdb
|
||||
*/
|
||||
|
||||
function initialize() { // klar
|
||||
db = settings_db_open();
|
||||
db.transaction(
|
||||
function(tx) {
|
||||
|
||||
// tx.executeSql('ALTER TABLE favorites ADD seen INTEGER');
|
||||
tx.executeSql('CREATE TABLE IF NOT EXISTS favorites(showid INTEGER UNIQUE, name TEXT, image TEXT, summary TEXT, status TEXT, premiered TEXT, rating TEXT, network TEXT, updated INTEGER, previous TEXT, next TEXT,nextse TEXT, imdb TEXT, official TEXT, seen INTEGER)');
|
||||
tx.executeSql('CREATE TABLE IF NOT EXISTS seen(showid INTEGER UNIQUE, season INTEGER, episode INTEGER)');
|
||||
// tx.executeSql('CREATE TABLE IF NOT EXISTS next(showid INTEGER UNIQUE, next TEXT)');
|
||||
// tx.executeSql('CREATE TABLE IF NOT EXISTS previous(showid INTEGER UNIQUE, prev TEXT)');
|
||||
});
|
||||
|
||||
}
|
||||
/*
|
||||
function getCount(){
|
||||
db.transaction(function(tx)
|
||||
{
|
||||
var rs = tx.executeSql('SELECT * FROM favorites');
|
||||
dbcount = rs.rows.length
|
||||
})
|
||||
}
|
||||
*/
|
||||
|
||||
function getFavByNr(shids,nr) // klar
|
||||
{
|
||||
db.transaction(function(tx)
|
||||
{
|
||||
var rs = tx.executeSql('SELECT * FROM favorites');
|
||||
// var shids = new Array();
|
||||
// var shids = []
|
||||
// var shid = ""
|
||||
// var shupdated = ""
|
||||
shids.push(rs.rows.item(nr).showid)
|
||||
shids.push(rs.rows.item(nr).updated)
|
||||
// shids = [rs.rows.item(nr).showid,rs.rows.item(nr).updated]
|
||||
// console.log(" --- DB SHIDS; "+shids)
|
||||
// return shids
|
||||
});
|
||||
}
|
||||
|
||||
function getFav(showid) {
|
||||
var res = undefined
|
||||
settings_db_open();
|
||||
db.transaction(function(tx) {
|
||||
|
||||
res = tx.executeSql("SELECT * FROM favorites WHERE showid like ('"+ showid + "')");})
|
||||
try {
|
||||
if (typeof res.rows.item(0).showid === 'number')
|
||||
return true
|
||||
} catch(a) {
|
||||
return false
|
||||
}}
|
||||
|
||||
function getFav_(showid) {
|
||||
settings_db_open();
|
||||
db.transaction(function(tx)
|
||||
{
|
||||
try {
|
||||
tx.executeSql("SELECT * FROM favorites WHERE showid='"+showid+"'");
|
||||
console.log("SUCCESS")
|
||||
} catch(a) {
|
||||
console.log("ERROR")
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// console.log("FAVDB: "+ result.item(0))
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
function loadWakeup(model,showid) // klar
|
||||
{
|
||||
model.clear()
|
||||
db.transaction(function(tx)
|
||||
{
|
||||
var rs = tx.executeSql('SELECT '+showid+' FROM favorites');
|
||||
//for(var i = 0; i < rs.rows.length; i++)
|
||||
//{ model.id, model.name, showImg.source, model.summary, model.status, model.premiered, model.rating, model.network
|
||||
model.append({"showid" : rs.rows.item(i).showid, "name" : rs.rows.item(i).name,"image" : rs.rows.item(i).image,"summary" : rs.rows.item(i).summary,"status" : rs.rows.item(i).status,"premiered" : rs.rows.item(i).premiered,"rating" : rs.rows.item(i).rating,"network" : rs.rows.item(i).network,"updated" : rs.rows.item(i).updated,"previous" : rs.rows.item(i).previous,"next" : rs.rows.item(i).next, "nextse" : rs.rows.item(i).nextse})
|
||||
//}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function load(model) // klar
|
||||
{
|
||||
model.clear()
|
||||
db.transaction(function(tx)
|
||||
{
|
||||
var rs = tx.executeSql('SELECT * FROM favorites ORDER BY name ASC, next');
|
||||
for(var i = 0; i < rs.rows.length; i++)
|
||||
{
|
||||
model.append({"showid" : rs.rows.item(i).showid, "name" : rs.rows.item(i).name,"image" : rs.rows.item(i).image,"summary" : rs.rows.item(i).summary,"status" : rs.rows.item(i).status,"premiered" : rs.rows.item(i).premiered,"rating" : rs.rows.item(i).rating,"network" : rs.rows.item(i).network,"updated" : rs.rows.item(i).updated,"prev" : rs.rows.item(i).previous,"next" : rs.rows.item(i).next, "nextse" : rs.rows.item(i).nextse, "imdb" : rs.rows.item(i).imdb, "official" : rs.rows.item(i).official, "seen" : rs.rows.item(i).seen})
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// ADD FAVORITE
|
||||
function add(showid, name, image, summary, status, prem, rating, network, updated, previous, next, nextse, imdb, official) // klar
|
||||
{
|
||||
settings_db_open();
|
||||
try {
|
||||
db.transaction(function(tx)
|
||||
{
|
||||
tx.executeSql('INSERT INTO favorites VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?);', [showid, name, image, summary, status, prem, rating, network, updated, previous, next, nextse, imdb, official])
|
||||
return true
|
||||
});
|
||||
}
|
||||
catch(a)
|
||||
{
|
||||
console.log("insert failed, probably already exists");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------
|
||||
|
||||
function update(showid, name, image, summary, status, prem, rating, network, updated, imdb, official) // klar
|
||||
{
|
||||
settings_db_open();
|
||||
try {
|
||||
db.transaction(function(tx)
|
||||
{
|
||||
tx.executeSql('UPDATE favorites SET name=?,image=?,summary=?,status=?,premiered=?,rating=?,network=?,updated=?,imdb=?,official=? WHERE showid='+showid+';',
|
||||
[name, image, summary, status, prem, rating, network, updated, imdb, official])
|
||||
return true;
|
||||
});
|
||||
}
|
||||
catch(a)
|
||||
{
|
||||
console.log("insert failed, probably already exists");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// SKA GÖRAS BÅDE VID ADD OCH UPPDATE
|
||||
function updateNext(showid, next, nextse) // klar
|
||||
{
|
||||
settings_db_open();
|
||||
db.transaction(function(tx)
|
||||
{
|
||||
tx.executeSql('UPDATE favorites SET next=?,nextse=? WHERE showid='+showid+';', [next, nextse])
|
||||
console.log("*** DB UPDATE NEXT: "+showid+" / "+next)
|
||||
});
|
||||
}
|
||||
|
||||
function updatePrev(showid, prev) // klar
|
||||
{
|
||||
settings_db_open();
|
||||
db.transaction(function(tx)
|
||||
{
|
||||
tx.executeSql('UPDATE favorites SET previous=? WHERE showid='+showid+';', [prev])
|
||||
console.log("*** DB UPDATE PREV: "+showid+" / "+prev)
|
||||
|
||||
});
|
||||
}
|
||||
// -------------------
|
||||
|
||||
function del(showid) // klar
|
||||
{
|
||||
settings_db_open();
|
||||
db.transaction(function(tx)
|
||||
{
|
||||
tx.executeSql('DELETE FROM favorites WHERE showid = ?', [showid])
|
||||
});
|
||||
}
|
||||
|
||||
function drop() // klar
|
||||
{
|
||||
settings_db_open();
|
||||
db.transaction(function(tx)
|
||||
{
|
||||
tx.executeSql("DROP TABLE IF EXISTS favorites");
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
88
qml/js/jsonpath.js
Normal file
88
qml/js/jsonpath.js
Normal file
@ -0,0 +1,88 @@
|
||||
/* JSONPath 0.8.5 - XPath for JSON
|
||||
*
|
||||
* Copyright (c) 2007 Stefan Goessner (goessner.net)
|
||||
* Licensed under the MIT (MIT-LICENSE.txt) licence.
|
||||
*
|
||||
*/
|
||||
function jsonPath(obj, expr, arg) {
|
||||
var P = {
|
||||
resultType: arg && arg.resultType || "VALUE",
|
||||
result: [],
|
||||
normalize: function(expr) {
|
||||
var subx = [];
|
||||
return expr.replace(/[\['](\??\(.*?\))[\]']|\['(.*?)'\]/g, function($0,$1,$2){return "[#"+(subx.push($1||$2)-1)+"]";}) /* http://code.google.com/p/jsonpath/issues/detail?id=4 */
|
||||
.replace(/'?\.'?|\['?/g, ";")
|
||||
.replace(/;;;|;;/g, ";..;")
|
||||
.replace(/;$|'?\]|'$/g, "")
|
||||
.replace(/#([0-9]+)/g, function($0,$1){return subx[$1];});
|
||||
},
|
||||
asPath: function(path) {
|
||||
var x = path.split(";"), p = "$";
|
||||
for (var i=1,n=x.length; i<n; i++)
|
||||
p += /^[0-9*]+$/.test(x[i]) ? ("["+x[i]+"]") : ("['"+x[i]+"']");
|
||||
return p;
|
||||
},
|
||||
store: function(p, v) {
|
||||
if (p) P.result[P.result.length] = P.resultType == "PATH" ? P.asPath(p) : v;
|
||||
return !!p;
|
||||
},
|
||||
trace: function(expr, val, path) {
|
||||
if (expr !== "") {
|
||||
var x = expr.split(";"), loc = x.shift();
|
||||
x = x.join(";");
|
||||
if (val && val.hasOwnProperty(loc))
|
||||
P.trace(x, val[loc], path + ";" + loc);
|
||||
else if (loc === "*")
|
||||
P.walk(loc, x, val, path, function(m,l,x,v,p) { P.trace(m+";"+x,v,p); });
|
||||
else if (loc === "..") {
|
||||
P.trace(x, val, path);
|
||||
P.walk(loc, x, val, path, function(m,l,x,v,p) { typeof v[m] === "object" && P.trace("..;"+x,v[m],p+";"+m); });
|
||||
}
|
||||
else if (/^\(.*?\)$/.test(loc)) // [(expr)]
|
||||
P.trace(P.eval(loc, val, path.substr(path.lastIndexOf(";")+1))+";"+x, val, path);
|
||||
else if (/^\?\(.*?\)$/.test(loc)) // [?(expr)]
|
||||
P.walk(loc, x, val, path, function(m,l,x,v,p) { if (P.eval(l.replace(/^\?\((.*?)\)$/,"$1"), v instanceof Array ? v[m] : v, m)) P.trace(m+";"+x,v,p); }); // issue 5 resolved
|
||||
else if (/^(-?[0-9]*):(-?[0-9]*):?([0-9]*)$/.test(loc)) // [start:end:step] phyton slice syntax
|
||||
P.slice(loc, x, val, path);
|
||||
else if (/,/.test(loc)) { // [name1,name2,...]
|
||||
for (var s=loc.split(/'?,'?/),i=0,n=s.length; i<n; i++)
|
||||
P.trace(s[i]+";"+x, val, path);
|
||||
}
|
||||
}
|
||||
else
|
||||
P.store(path, val);
|
||||
},
|
||||
walk: function(loc, expr, val, path, f) {
|
||||
if (val instanceof Array) {
|
||||
for (var i=0,n=val.length; i<n; i++)
|
||||
if (i in val)
|
||||
f(i,loc,expr,val,path);
|
||||
}
|
||||
else if (typeof val === "object") {
|
||||
for (var m in val)
|
||||
if (val.hasOwnProperty(m))
|
||||
f(m,loc,expr,val,path);
|
||||
}
|
||||
},
|
||||
slice: function(loc, expr, val, path) {
|
||||
if (val instanceof Array) {
|
||||
var len=val.length, start=0, end=len, step=1;
|
||||
loc.replace(/^(-?[0-9]*):(-?[0-9]*):?(-?[0-9]*)$/g, function($0,$1,$2,$3){start=parseInt($1||start);end=parseInt($2||end);step=parseInt($3||step);});
|
||||
start = (start < 0) ? Math.max(0,start+len) : Math.min(len,start);
|
||||
end = (end < 0) ? Math.max(0,end+len) : Math.min(len,end);
|
||||
for (var i=start; i<end; i+=step)
|
||||
P.trace(i+";"+expr, val, path);
|
||||
}
|
||||
},
|
||||
eval: function(x, _v, _vname) {
|
||||
try { return $ && _v && eval(x.replace(/(^|[^\\])@/g, "$1_v").replace(/\\@/g, "@")); } // issue 7 : resolved ..
|
||||
catch(e) { throw new SyntaxError("jsonPath: " + e.message + ": " + x.replace(/(^|[^\\])@/g, "$1_v").replace(/\\@/g, "@")); } // issue 7 : resolved ..
|
||||
}
|
||||
};
|
||||
|
||||
var $ = obj;
|
||||
if (expr && obj && (P.resultType == "VALUE" || P.resultType == "PATH")) {
|
||||
P.trace(P.normalize(expr).replace(/^\$;?/,""), obj, "$"); // issue 6 resolved
|
||||
return P.result.length ? P.result : false;
|
||||
}
|
||||
}
|
1694
qml/js/themoviedb.js
Normal file
1694
qml/js/themoviedb.js
Normal file
File diff suppressed because it is too large
Load Diff
84
qml/pages/About.qml
Normal file
84
qml/pages/About.qml
Normal file
@ -0,0 +1,84 @@
|
||||
import QtQuick 2.0
|
||||
import Sailfish.Silica 1.0
|
||||
Page {
|
||||
Flickable {
|
||||
id: flick
|
||||
width:parent.width
|
||||
height: parent.height - Theme.paddingLarge * 3
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: Theme.paddingLarge * 3
|
||||
contentHeight: column1.height
|
||||
|
||||
|
||||
|
||||
Column {
|
||||
id: column1
|
||||
width: parent.width
|
||||
spacing: Theme.paddingLarge
|
||||
Row {
|
||||
//width: parent.width
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
spacing: Theme.paddingLarge * 2
|
||||
Image{
|
||||
source: "../harbour-labyrinth.png"
|
||||
height: Theme.itemSizeExtraLarge
|
||||
width: height
|
||||
fillMode: Image.PreserveAspectFit
|
||||
//anchors.horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
Column{
|
||||
id: column2
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
//width: parent.width
|
||||
//spacing: Theme.paddingLarge
|
||||
|
||||
Label {
|
||||
font.pixelSize: Theme.fontSizeExtraLarge
|
||||
font.bold: true
|
||||
text: "Labyrinth v"+ Qt.application.version
|
||||
//anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
}
|
||||
|
||||
Label {
|
||||
text: "(License: WTFPL)"
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Separator {
|
||||
width: parent.width
|
||||
anchors.margins: Theme.paddingSmall
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
//height: Theme.itemSizeSmall
|
||||
}
|
||||
|
||||
Text {
|
||||
width: parent.width-(Theme.paddingLarge * 2)
|
||||
font.pixelSize: Theme.fontSizeExtraSmall
|
||||
text:"<p>DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE</p>
|
||||
<p>Version 2, December 2004</p>
|
||||
<p>Copyright (C) 2004 Sam Hocevar <sam@hocevar.net></p>
|
||||
<p>Everyone is permitted to copy and distribute verbatim or modified
|
||||
copies of this license document, and changing it is allowed as long
|
||||
as the name is changed.</p>
|
||||
<p>DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</p>
|
||||
<p>0. You just DO WHAT THE FUCK YOU WANT TO.</p>"
|
||||
color: Theme.primaryColor
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignHCenter
|
||||
wrapMode: Text.WordWrap
|
||||
}
|
||||
|
||||
Separator {
|
||||
width: parent.width
|
||||
anchors.margins: Theme.paddingSmall
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
//height: Theme.itemSizeSmall
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
55
qml/pages/CastInfoPage.qml
Normal file
55
qml/pages/CastInfoPage.qml
Normal file
@ -0,0 +1,55 @@
|
||||
import QtQuick 2.0
|
||||
import Sailfish.Silica 1.0
|
||||
import "../JSONListModel"
|
||||
import "../delegates"
|
||||
|
||||
Page {
|
||||
id: page
|
||||
property string showname: ""
|
||||
property string showimage: ""
|
||||
property string summary: ""
|
||||
property string showid: ""
|
||||
property string actorname: ""
|
||||
property string filter: ""
|
||||
//property string country: "DK"
|
||||
//property string _country: country ? "?country="+country : ""
|
||||
//property string jsonSource: "http://api.tvmaze.com/schedule"+_country
|
||||
|
||||
SilicaListView {
|
||||
id: listView
|
||||
anchors.fill: parent
|
||||
clip: true
|
||||
|
||||
JSONListModel {
|
||||
id: jsonModel1
|
||||
source: "http://api.tvmaze.com/people/"+showid+"/castcredits?embed=show" //"http://api.tvmaze.com/schedule?country=US&date="+Qt.formatDateTime(new Date(), "yyyy-MM-dd") //2016-07-16" //+filter
|
||||
query: "$[*]._embedded.show."
|
||||
}
|
||||
|
||||
model: jsonModel1.model
|
||||
|
||||
BusyIndicator {
|
||||
id: busyIndicator
|
||||
running: !jsonModel1.jsonready
|
||||
size: BusyIndicatorSize.Large
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
header: PageHeader {
|
||||
id: pHeader
|
||||
title: actorname
|
||||
description: "Known for"
|
||||
}
|
||||
|
||||
delegate: ShowDelegate {}
|
||||
|
||||
ViewPlaceholder {
|
||||
enabled: listView.count == 0 && jsonModel1.jsonready
|
||||
text: "No TVmaze data"
|
||||
hintText: "no information about cast"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
153
qml/pages/CastPage.qml
Normal file
153
qml/pages/CastPage.qml
Normal file
@ -0,0 +1,153 @@
|
||||
import QtQuick 2.0
|
||||
import Sailfish.Silica 1.0
|
||||
import "../JSONListModel"
|
||||
|
||||
Page {
|
||||
id: page
|
||||
property string showname: ""
|
||||
property string showimage: ""
|
||||
property string summary: ""
|
||||
property string showid: ""
|
||||
property string jsonSource: "http://api.tvmaze.com/schedule"+_country //"date="+Qt.formatDateTime(new Date(), "yyyy-MM-dd")
|
||||
|
||||
//property string filter: ""
|
||||
property string country: ""
|
||||
//property string date: ""
|
||||
property string _country: country ? "?country="+country : ""
|
||||
//property string _date: date ? ""
|
||||
|
||||
SilicaListView {
|
||||
id: listView
|
||||
anchors.fill: parent
|
||||
clip: true
|
||||
|
||||
JSONListModel {
|
||||
id: jsonModel1
|
||||
source: "http://api.tvmaze.com/shows/"+showid+"/cast" //"http://api.tvmaze.com/schedule?country=US&date="+Qt.formatDateTime(new Date(), "yyyy-MM-dd") //2016-07-16" //+filter
|
||||
query: "$[*]"
|
||||
}
|
||||
|
||||
model: jsonModel1.model
|
||||
|
||||
BusyIndicator {
|
||||
id: busyIndicator
|
||||
running: !jsonModel1.jsonready
|
||||
size: BusyIndicatorSize.Large
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
header: PageHeader {
|
||||
id: pHeader
|
||||
title: showname
|
||||
description: "Main cast"
|
||||
}
|
||||
|
||||
delegate: BackgroundItem {
|
||||
id: myListItem
|
||||
width: ListView.view.width
|
||||
height: (showImg.height + showRect.height ) * showImg.scale
|
||||
|
||||
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: firstName.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"
|
||||
}
|
||||
|
||||
Image {
|
||||
id: showImg
|
||||
property int errorCount: 0
|
||||
anchors.top: showRect.bottom
|
||||
anchors.margins: Theme.paddingLarge
|
||||
// anchors.topMargin: Theme.paddingLarge
|
||||
// anchors.leftMargin: Theme.paddingLarge
|
||||
anchors.left: parent.left
|
||||
// width: parent.width * 0.4
|
||||
// height: parent.height
|
||||
scale: 1.2
|
||||
fillMode: Image.PreserveAspectFit
|
||||
source: model.person.image ? model.person.image.medium ? model.person.image.medium : "../No-Image-.png" : "../No-Image-.png"
|
||||
}
|
||||
|
||||
Text {
|
||||
id: firstName
|
||||
text: model.person.name !== null ? model.person.name : ""
|
||||
color: highlighted ? Theme.highlightColor : Theme.primaryColor
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.verticalCenter: showRect.verticalCenter
|
||||
wrapMode: Text.ElideRight
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
font.pixelSize: Theme.fontSizeLarge
|
||||
}
|
||||
|
||||
Text {
|
||||
id: showType
|
||||
text: model.character.name !== null ? "<u>Character</u><br><b>" + model.character.name + "</b>" : ""
|
||||
color: highlighted ? Theme.highlightColor : Theme.primaryColor
|
||||
wrapMode: Text.WordWrap
|
||||
anchors.bottomMargin: Theme.paddingLarge
|
||||
anchors.bottom: showImg.bottom
|
||||
anchors.left: showImg.right
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: Theme.paddingLarge * showImg.scale
|
||||
anchors.rightMargin: Theme.paddingMedium
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
}
|
||||
|
||||
onPressAndHold: {
|
||||
pageStack.push(Qt.resolvedUrl("ShowImg.qml"),{"img": model.person.image ? model.person.image.medium ? model.person.image.medium : "../No-Image-.png" : "../No-Image-.png"})
|
||||
|
||||
//window.pageStack.push(Qt.resolvedUrl("SeasonsPage.qml"),{"showid": model.id,"showname": showname,"showimage": showImg.source} )
|
||||
}
|
||||
|
||||
onClicked: {
|
||||
// frompage = pageStack.currentPage
|
||||
pageStack.push(Qt.resolvedUrl("CastInfoPage.qml"),
|
||||
{"showid": model.person.id,"actorname": model.person.name,"showname": showname, "showimage": showImg.source, "summary": model.summary})
|
||||
}
|
||||
}
|
||||
|
||||
PullDownMenu {
|
||||
MenuItem {
|
||||
text: qsTr("Show seasons")
|
||||
onClicked: pageStack.replace(Qt.resolvedUrl("SeasonsPage.qml"),{"showid": showid,"showname": showname,"showimage": showimage},PageStackAction.Immediate )
|
||||
}
|
||||
}
|
||||
|
||||
ViewPlaceholder {
|
||||
enabled: listView.count == 0 && jsonModel1.jsonready
|
||||
text: "No TVmaze data"
|
||||
hintText: "no information about cast"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
554
qml/pages/Favorites.qml
Normal file
554
qml/pages/Favorites.qml
Normal file
@ -0,0 +1,554 @@
|
||||
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)
|
||||
} */
|
||||
|
||||
// }
|
||||
|
||||
//}
|
||||
}
|
||||
|
||||
|
380
qml/pages/InfoPage.qml
Normal file
380
qml/pages/InfoPage.qml
Normal file
@ -0,0 +1,380 @@
|
||||
import QtQuick 2.0
|
||||
import Sailfish.Silica 1.0
|
||||
|
||||
Page {
|
||||
id:infoPage
|
||||
property string showname
|
||||
property string showimage: ""
|
||||
property string summary: ""
|
||||
property string showid: ""
|
||||
property string showstatus: ""
|
||||
property string showprem: ""
|
||||
property string showrating: ""
|
||||
property string shownetwork: ""
|
||||
property string showupdated: ""
|
||||
property string showprev: ""
|
||||
property string shownext: ""
|
||||
property string shownextse: ""
|
||||
property string simdb: ""
|
||||
property string sofficial: ""
|
||||
property bool favorite: getFav(showid)
|
||||
|
||||
SilicaFlickable {
|
||||
id: flick
|
||||
anchors.top: parent.top
|
||||
clip: true
|
||||
anchors.bottom: parent.bottom
|
||||
width: parent.width// - (Theme.paddingLarge * 2)
|
||||
height: (showImg.height * showImg.scale) + sumheader.height + Theme.paddingLarge
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
contentHeight: showSummary.height + showImg.height + sumheader.height + seasonA.height + seasonB.height + (Theme.paddingLarge * 5)
|
||||
PageHeader {id: sumheader; title: showname; }
|
||||
|
||||
|
||||
RemorsePopup {id: remorse}
|
||||
|
||||
Image {
|
||||
id: favIcon
|
||||
anchors.right: parent.right
|
||||
anchors.top: showImg.top
|
||||
anchors.topMargin: Theme.paddingSmall
|
||||
//anchors.verticalCenter: showStatus.verticalCenter
|
||||
height: showStatus.height + (showStatus.height/2)
|
||||
width: height
|
||||
anchors.rightMargin: Theme.paddingMedium
|
||||
source: favorite ? "image://theme/icon-m-favorite-selected" : "image://theme/icon-m-favorite"
|
||||
MouseArea {
|
||||
anchors.fill: favIcon
|
||||
onClicked: if (getFav(showid)) {favorite = false; delFav(showid)} else {favorite = true; addFav(showid, showname, showimage, summary, showstatus, showprem, showrating, shownetwork)}
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
id: showStatus
|
||||
text: "Status: <b>" + showstatus + "</b>"
|
||||
color: Theme.primaryColor
|
||||
wrapMode: Text.WordWrap
|
||||
anchors.topMargin: Theme.paddingMedium
|
||||
anchors.bottom: showPrem.top
|
||||
anchors.left: showImg.right
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
}
|
||||
|
||||
/* Image {
|
||||
id: showImg
|
||||
|
||||
anchors.top: sumheader.bottom
|
||||
anchors.topMargin: Theme.paddingMedium
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: Theme.paddingLarge
|
||||
fillMode: Image.PreserveAspectFit
|
||||
source: showimage
|
||||
//width: height * 0.8
|
||||
//height: parent.height
|
||||
|
||||
} */
|
||||
Image {
|
||||
id: showImg
|
||||
property bool zoomed: false
|
||||
/* anchors.top: sumheader.bottom
|
||||
anchors.topMargin: Theme.paddingMedium
|
||||
anchors.bottomMargin: Theme.paddingLarge
|
||||
anchors.rightMargin: Theme.paddingMedium
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
anchors.left: parent.left */
|
||||
|
||||
anchors.top: sumheader.bottom
|
||||
anchors.margins: Theme.paddingLarge
|
||||
anchors.left: parent.left
|
||||
scale: 1.1
|
||||
|
||||
// x: 0
|
||||
// y: 0
|
||||
fillMode: Image.PreserveAspectFit
|
||||
source: showimage ? showimage : "../No-Image-.png"
|
||||
|
||||
// width: 210
|
||||
width: height * 0.8
|
||||
// height: showName.height + showS.height + showP.height + showR.height + showN.height + showPr.height + Theme.paddingMedium
|
||||
// height: (showName.height + showS.height + showP.height + showR.height + showN.height + showPr.height + Theme.paddingLarge) * showImg.scale
|
||||
height: (showPrem.height + showRating.height + showNetwork.height + showPrev.height + showNext.height + showStatus.height + Theme.itemSizeSmall) * showImg.scale
|
||||
// scale: 1.1
|
||||
// height: showName.height + showStatus.height + showPrem.height + showRating.height + showNext.height + showPrev.height
|
||||
BusyIndicator {
|
||||
id: imgBysy
|
||||
running: showImg.progress !== 1.0
|
||||
size: BusyIndicatorSize.Large
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
MouseArea {
|
||||
anchors.fill: showImg
|
||||
onClicked: {
|
||||
//if (showImg.width !== Screen.width) {showImg.width = Screen.width; showImg.height = Screen.height;} else {showImg.height = showPrem.height + showRating.height + showNetwork.height + showPrev.height + showNext.height + showStatus.height}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
id: showPrem
|
||||
text: showprem ? "Premiered: <b>" + showprem + "</b>" : "Premiered: ?"
|
||||
color: Theme.primaryColor
|
||||
wrapMode: Text.WordWrap
|
||||
anchors.bottom: showRating.top
|
||||
anchors.left: showImg.right
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
}
|
||||
|
||||
Text {
|
||||
id: showRating
|
||||
text: "Average rating: <b>" + showrating + "</b>"
|
||||
color: Theme.primaryColor
|
||||
wrapMode: Text.WordWrap
|
||||
anchors.bottom: showNetwork.top
|
||||
anchors.left: showImg.right
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
}
|
||||
|
||||
Text {
|
||||
id: showNetwork
|
||||
text: "Network: <b>" + shownetwork + "</b>"
|
||||
color: Theme.primaryColor
|
||||
wrapMode: Text.ElideRight
|
||||
maximumLineCount: 1
|
||||
anchors.bottom: showPrev.top
|
||||
anchors.left: showImg.right
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
}
|
||||
|
||||
Text {
|
||||
id: showPrev
|
||||
text: showprev !== "" ? "Previous: <b>" + showprev+"</b>" : ""
|
||||
color: Theme.primaryColor
|
||||
wrapMode: Text.ElideRight
|
||||
maximumLineCount: 1
|
||||
anchors.bottom: showNext.top
|
||||
anchors.left: showImg.right
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
}
|
||||
|
||||
Text {
|
||||
id: showNext
|
||||
text: shownext !== "" || shownext !== "Unknown" ? "Next: ("+shownextse + ") <b>" + shownext + "</b>" : "" //nextse !=="" ? "Next: ("+nextse+")" : "Next: " + next
|
||||
color: Theme.primaryColor
|
||||
wrapMode: Text.ElideRight
|
||||
maximumLineCount: 1
|
||||
anchors.bottom: showImg.bottom
|
||||
anchors.bottomMargin: Theme.paddingMedium
|
||||
anchors.left: showImg.right
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
}
|
||||
|
||||
BackgroundItem {
|
||||
id: seasonA
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: showImg.bottom
|
||||
anchors.topMargin: Theme.paddingLarge
|
||||
|
||||
OpacityRampEffect {
|
||||
sourceItem: actorRect
|
||||
direction: OpacityRamp.TopToBottom
|
||||
offset: 0.0
|
||||
slope: 1.0
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: actorRect
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
width: parent.width
|
||||
height: actorName.height + Theme.paddingLarge
|
||||
color: Theme.rgba(Theme.highlightBackgroundColor, Theme.highlightBackgroundOpacity)
|
||||
}
|
||||
|
||||
Image {
|
||||
id: nextIconActor
|
||||
anchors.verticalCenter: actorRect.verticalCenter
|
||||
anchors.right: actorRect.right
|
||||
anchors.rightMargin: Theme.paddingMedium
|
||||
source: "image://theme/icon-m-right" + "?" + (seasonA.highlighted ? Theme.highlightColor : Theme.primaryColor)
|
||||
|
||||
}
|
||||
|
||||
Text {
|
||||
id: actorName
|
||||
text: "Show main cast"
|
||||
color: seasonA.highlighted ? Theme.highlightColor : Theme.primaryColor
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
anchors.rightMargin: Theme.paddingMedium
|
||||
anchors.left: parent.left
|
||||
anchors.right: nextIconActor.left
|
||||
anchors.verticalCenter: actorRect.verticalCenter
|
||||
wrapMode: Text.ElideRight
|
||||
font.pixelSize: Theme.fontSizeLarge
|
||||
maximumLineCount: 1
|
||||
}
|
||||
|
||||
onClicked: pageStack.push(Qt.resolvedUrl("CastPage.qml"),{"showid": showid,"showname": showname,"showimage": showimage} )
|
||||
}
|
||||
|
||||
/* IconButton {
|
||||
anchors.bottom: showImg.bottom
|
||||
anchors.bottomMargin: Theme.paddingLarge
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: Theme.paddingLarge
|
||||
//width: 200
|
||||
//height: 50
|
||||
icon.source: "../imdb.png"
|
||||
onClicked: console.log("Delete!")
|
||||
} */
|
||||
|
||||
BackgroundItem {
|
||||
id: seasonB
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: seasonA.bottom
|
||||
anchors.topMargin: Theme.paddingLarge
|
||||
|
||||
OpacityRampEffect {
|
||||
sourceItem: seasonRect
|
||||
direction: OpacityRamp.TopToBottom
|
||||
offset: 0.0
|
||||
slope: 1.0
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: seasonRect
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
width: parent.width
|
||||
height: seasonName.height + Theme.paddingLarge
|
||||
color: Theme.rgba(Theme.highlightBackgroundColor, Theme.highlightBackgroundOpacity)
|
||||
}
|
||||
|
||||
Image {
|
||||
id: nextIconSeason
|
||||
anchors.verticalCenter: seasonRect.verticalCenter
|
||||
anchors.right: seasonRect.right
|
||||
anchors.rightMargin: Theme.paddingMediumIMDB
|
||||
source: "image://theme/icon-m-right" + "?" + (seasonB.highlighted ? Theme.highlightColor : Theme.primaryColor)
|
||||
}
|
||||
|
||||
Text {
|
||||
id: seasonName
|
||||
text: "Show seasons"
|
||||
color: seasonB.highlighted ? Theme.highlightColor : Theme.primaryColor
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
anchors.rightMargin: Theme.paddingMedium
|
||||
anchors.left: parent.left
|
||||
anchors.right: nextIconSeason.left
|
||||
anchors.verticalCenter: seasonRect.verticalCenter
|
||||
wrapMode: Text.ElideRight
|
||||
font.pixelSize: Theme.fontSizeLarge
|
||||
maximumLineCount: 1
|
||||
// font.bold: true
|
||||
}
|
||||
|
||||
onClicked: pageStack.push(Qt.resolvedUrl("SeasonsPage.qml"),{"showid": showid,"showname": showname,"showimage": showimage} )
|
||||
}
|
||||
|
||||
/* Text {
|
||||
id: showSummaryH
|
||||
anchors.top: seasonB.bottom
|
||||
anchors.topMargin: Theme.paddingLarge
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: Theme.paddingLarge
|
||||
text: "Summary"
|
||||
color: Theme.secondaryColor
|
||||
font.pixelSize: Theme.fontSizeLarge
|
||||
//font.underline: true
|
||||
//font.bold: true
|
||||
} */
|
||||
|
||||
Text {
|
||||
id: showSummary
|
||||
anchors.top: seasonB.bottom
|
||||
//anchors.topMargin: Theme.paddingSmall
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: Theme.paddingLarge
|
||||
anchors.rightMargin: Theme.paddingLarge
|
||||
text: summary
|
||||
textFormat: Text.StyledText
|
||||
color: Theme.primaryColor
|
||||
wrapMode: Text.WordWrap
|
||||
font.pixelSize: Theme.fontSizeMedium
|
||||
}
|
||||
|
||||
|
||||
function fitToScreen() {
|
||||
showImg.scale = Math.min(flick.width / showImg.width, flick.height / showImg.height, 1)
|
||||
//pinchArea.minScale = scale
|
||||
prevScale = scale
|
||||
}
|
||||
|
||||
/* Image {
|
||||
id: showImg
|
||||
|
||||
anchors.top: sumheader.bottom
|
||||
anchors.topMargin: Theme.paddingMedium
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: Theme.paddingLarge
|
||||
fillMode: Image.PreserveAspectFit
|
||||
source: showimage
|
||||
//width: height * 0.8
|
||||
//height: parent.height
|
||||
|
||||
property real prevScale
|
||||
|
||||
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
scale = Math.min(flick.width / width, flick.height / height, 1)
|
||||
//pinchArea.minScale = scale
|
||||
//prevScale = scale
|
||||
|
||||
}
|
||||
|
||||
//transform: Scale { origin.x: 25; origin.y: 25; xScale: 3}
|
||||
}
|
||||
} */
|
||||
|
||||
|
||||
PullDownMenu {
|
||||
|
||||
MenuItem {
|
||||
visible: simdb !== "" ? true : false
|
||||
text: qsTr("Open IMDB page")
|
||||
onClicked: { //remorse.execute(qsTr("Opening webpage"), function() {Qt.openUrlExternally("http://m.imdb.com/title/"+simdb)}, 2000)//Qt.openUrlExternally("http://m.imdb.com/title/"+imdb)//pageStack.push(Qt.resolvedUrl("SeasonsPage.qml"),{"showid": showid,"showname": showname,"showimage": showimage} )
|
||||
//WebViewer {webPageAddress: defaultDevice }
|
||||
console.log("IMDB: "+simdb)
|
||||
pageStack.push(Qt.resolvedUrl("WebViewer.qml"),{"webPageAddress": "http://m.imdb.com/title/"+simdb} )
|
||||
}
|
||||
}
|
||||
MenuItem {
|
||||
visible: sofficial !== "" ? true : false
|
||||
text: qsTr("Official site")
|
||||
onClicked: { //remorse.execute(qsTr("Opening webpage"), function() {Qt.openUrlExternally("http://m.imdb.com/title/"+simdb)}, 2000)//Qt.openUrlExternally("http://m.imdb.com/title/"+imdb)//pageStack.push(Qt.resolvedUrl("SeasonsPage.qml"),{"showid": showid,"showname": showname,"showimage": showimage} )
|
||||
//WebViewer {webPageAddress: defaultDevice }
|
||||
console.log("Official: "+sofficial)
|
||||
pageStack.push(Qt.resolvedUrl("WebViewer.qml"),{"webPageAddress": sofficial} )
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
73
qml/pages/PopularPage.qml
Normal file
73
qml/pages/PopularPage.qml
Normal file
@ -0,0 +1,73 @@
|
||||
import QtQuick 2.0
|
||||
import Sailfish.Silica 1.0
|
||||
import "../JSONListModel"
|
||||
import "../delegates"
|
||||
|
||||
Page {
|
||||
id: page
|
||||
//property string filter: ""
|
||||
//property string country: ""
|
||||
//property string _country: country ? "?country="+country : ""
|
||||
//property string jsonSource: "http://api.tvmaze.com/schedule"+_country //"date="+Qt.formatDateTime(new Date(), "yyyy-MM-dd")
|
||||
property string jsonSource: "http://api.tvmaze.com/shows"
|
||||
property bool showweight: false
|
||||
|
||||
SilicaListView {
|
||||
id: listView
|
||||
anchors.fill: parent
|
||||
clip: true
|
||||
|
||||
JSONListModel {
|
||||
id: jsonModel1
|
||||
sortby: showweight ? "weight" : "rating.average"
|
||||
source: jsonSource //"http://api.tvmaze.com/schedule?country=SE&date="+Qt.formatDateTime(new Date(), "yyyy-MM-dd") //2016-07-16" //+filter
|
||||
query: showweight ? "$[?(@.weight>7)]" : "$[?(@.rating.average>7.9)]"
|
||||
}
|
||||
|
||||
model: jsonModel1.model
|
||||
|
||||
BusyIndicator {
|
||||
id: busyIndicator
|
||||
running: !jsonModel1.jsonready
|
||||
size: BusyIndicatorSize.Large
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
header: PageHeader {
|
||||
id: pHeader
|
||||
title: showweight ? "Popular shows by clicks" : "Popular shows by rating"
|
||||
}
|
||||
|
||||
delegate: ShowDelegate {}
|
||||
|
||||
PullDownMenu {
|
||||
MenuItem {
|
||||
visible: showweight
|
||||
text: qsTr("Popular shows by rating")
|
||||
onClicked: pageStack.replace(Qt.resolvedUrl("PopularPage.qml"),{"showweight": false},PageStackAction.Immediate)
|
||||
}
|
||||
MenuItem {
|
||||
visible: !showweight
|
||||
text: qsTr("Popular shows by clicks")
|
||||
onClicked: pageStack.replace(Qt.resolvedUrl("PopularPage.qml"),{"showweight": true},PageStackAction.Immediate)
|
||||
}
|
||||
MenuItem {
|
||||
text: qsTr("Favourites")
|
||||
onClicked: pageStack.replace(Qt.resolvedUrl("Favorites.qml"),{},PageStackAction.Immediate)
|
||||
}
|
||||
MenuItem {
|
||||
text: qsTr("Search shows")
|
||||
onClicked: pageStack.replace(Qt.resolvedUrl("SearchPage.qml"),{},PageStackAction.Immediate)
|
||||
}
|
||||
}
|
||||
|
||||
ViewPlaceholder {
|
||||
visible: listView.count === 0 && jsonModel1.jsonready
|
||||
text: "Unable to load TVmaze data!"
|
||||
hintText: "Check your connection"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
82
qml/pages/SearchPage.qml
Normal file
82
qml/pages/SearchPage.qml
Normal file
@ -0,0 +1,82 @@
|
||||
import QtQuick 2.0
|
||||
import Sailfish.Silica 1.0
|
||||
import "../JSONListModel"
|
||||
import "../delegates"
|
||||
|
||||
Page {
|
||||
id: page
|
||||
property string filter: ""
|
||||
|
||||
SilicaListView {
|
||||
id: listView
|
||||
anchors.fill: parent
|
||||
clip: true
|
||||
|
||||
JSONListModel {
|
||||
id: jsonModel1
|
||||
source: filter !=="" ? "http://api.tvmaze.com/search/shows?q="+filter : ""
|
||||
query: "$[*].show"
|
||||
}
|
||||
|
||||
model: jsonModel1.model
|
||||
|
||||
BusyIndicator {
|
||||
id: busyIndicator
|
||||
running: !jsonModel1.jsonready
|
||||
size: BusyIndicatorSize.Large
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
header: PageHeader {
|
||||
id: pHeader
|
||||
|
||||
SearchField {
|
||||
id: searchField
|
||||
width: parent.width
|
||||
placeholderText: "Search"
|
||||
inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText
|
||||
EnterKey.iconSource: "image://theme/icon-m-enter-close"
|
||||
EnterKey.onClicked: {filter = text;focus = false}
|
||||
focus: true
|
||||
onTextChanged: if (text.length > 1) filter = text; else {filter = "";focus=true;}
|
||||
// onTextChanged: if (text.length > 1) jsonModel1.source = "http://www.radio-browser.info/webservice/json/stations/"+searchby+"/"+text; else {jsonModel1.source = "";focus=true;jsonModel1.model.clear()}
|
||||
onClicked: {listView.currentIndex = -1}
|
||||
}
|
||||
}
|
||||
|
||||
delegate: ShowDelegate {}
|
||||
|
||||
PullDownMenu {
|
||||
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("Favorites")
|
||||
onClicked: pageStack.replace(Qt.resolvedUrl("Favorites.qml"),{},PageStackAction.Immediate)
|
||||
}
|
||||
}
|
||||
|
||||
ViewPlaceholder {
|
||||
enabled: listView.count === 0 //|| jsonModel1.jsonready
|
||||
text: "Search a TV Show"
|
||||
hintText: "on TVMaze"
|
||||
|
||||
Image {
|
||||
id: logo
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.bottom: parent.top
|
||||
anchors.bottomMargin: Theme.paddingLarge
|
||||
opacity: 0.2
|
||||
source: "../harbour-labyrinth.png"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
195
qml/pages/SeasonNrPage.qml
Normal file
195
qml/pages/SeasonNrPage.qml
Normal file
@ -0,0 +1,195 @@
|
||||
import QtQuick 2.0
|
||||
import Sailfish.Silica 1.0
|
||||
import "../JSONListModel"
|
||||
|
||||
Page {
|
||||
id: page
|
||||
property string filter: ""
|
||||
property string showid: ""
|
||||
property string showname: ""
|
||||
property string showimage: ""
|
||||
property string number: ""
|
||||
|
||||
SilicaListView {
|
||||
id: listView
|
||||
anchors.fill: parent
|
||||
|
||||
clip: true
|
||||
|
||||
JSONListModel {
|
||||
id: jsonModel1
|
||||
source: "http://api.tvmaze.com/shows/"+showid+"/episodes"
|
||||
query: "$[?(@.season==="+number+")]"
|
||||
}
|
||||
|
||||
model: jsonModel1.model
|
||||
|
||||
BusyIndicator {
|
||||
id: busyIndicator
|
||||
running: !jsonModel1.jsonready
|
||||
size: BusyIndicatorSize.Large
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
header: PageHeader {
|
||||
id: pHeader
|
||||
title: showname
|
||||
description: "Season: "+number
|
||||
}
|
||||
|
||||
delegate: BackgroundItem {
|
||||
id: myListItem
|
||||
|
||||
enabled: model.summary !== ""
|
||||
width: ListView.view.width
|
||||
height: showImg.height + showRect.height + showAirdate.height + showSummary.height + showSummaryIcon.height + Theme.paddingLarge//showImg.height > 20 ? showImg.height + showSummary.height + showAirdate.heigth + showRect.height + showSummaryIcon.height + (Theme.paddingLarge * 3) : firstName.height + showAirdate.height + showAirdate.heigth + showRuntime.height + showSummary.height + showRect.height + (Theme.paddingLarge * 3)
|
||||
|
||||
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: firstName.height + Theme.paddingLarge
|
||||
color: Theme.rgba(Theme.highlightBackgroundColor, Theme.highlightBackgroundOpacity)
|
||||
}
|
||||
|
||||
Image {
|
||||
id: seenIcon
|
||||
visible: false
|
||||
anchors.right: parent.right
|
||||
anchors.top: showImg.top
|
||||
anchors.topMargin: Theme.paddingLarge
|
||||
anchors.rightMargin: Theme.paddingMedium
|
||||
source: "image://theme/icon-m-acknowledge"
|
||||
}
|
||||
|
||||
Image {
|
||||
id: showImg
|
||||
property int errorCount: 0
|
||||
anchors.top: showAirdate.bottom
|
||||
//anchors.margins: Theme.paddingLarge
|
||||
anchors.topMargin: Theme.paddingSmall
|
||||
/* anchors.topMargin: Theme.paddingLarge
|
||||
anchors.bottomMargin: Theme.paddingMedium
|
||||
anchors.rightMargin: Theme.paddingMedium
|
||||
anchors.leftMargin: Theme.paddingMedium */
|
||||
anchors.left: parent.left
|
||||
// width: parent.width * 0.4
|
||||
// x: 0
|
||||
// y: 0
|
||||
// width: parent.width * 0.4
|
||||
// height: parent.width * 0.3
|
||||
height: width * 0.6
|
||||
width: page.width
|
||||
//scale: 1.1
|
||||
// height: parent.height
|
||||
fillMode: Image.PreserveAspectFit
|
||||
source: model.image ? model.image.medium ? model.image.medium : "" : ""
|
||||
}
|
||||
|
||||
Text {
|
||||
id: firstName
|
||||
text: model.number + ": " + model.name
|
||||
color: highlighted ? Theme.highlightColor : Theme.primaryColor
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.verticalCenter: showRect.verticalCenter
|
||||
wrapMode: Text.ElideRight
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
font.pixelSize: Theme.fontSizeLarge
|
||||
}
|
||||
|
||||
Text {
|
||||
id: showSummary
|
||||
//anchors.bottom: showSummaryIcon.top
|
||||
anchors.top: showImg.bottom
|
||||
anchors.topMargin: Theme.paddingLarge
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
anchors.rightMargin: Theme.paddingMedium
|
||||
anchors.bottomMargin: Theme.paddingLarge
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
text: ""
|
||||
color: Theme.primaryColor
|
||||
wrapMode: Text.WordWrap
|
||||
width: parent.width
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
}
|
||||
|
||||
Image {
|
||||
id: showSummaryIcon
|
||||
anchors.top: showImg.bottom
|
||||
anchors.bottomMargin: Theme.paddingLarge
|
||||
//anchors.topMargin: Theme.paddingMedium
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: Theme.paddingMedium
|
||||
source: model.summary !== "" ? "image://theme/icon-lock-more" : ""
|
||||
}
|
||||
|
||||
Text {
|
||||
id: showAirdate
|
||||
text: "Air date: <b>"+model.airdate+"</b>"
|
||||
color: highlighted ? Theme.highlightColor : Theme.primaryColor
|
||||
wrapMode: Text.WordWrap
|
||||
//anchors.topMargin: Theme.paddingMedium
|
||||
anchors.top: showRect.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
//anchors.right: parent.right
|
||||
|
||||
anchors.rightMargin: Theme.paddingMedium
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
}
|
||||
Text {
|
||||
id: showRuntime
|
||||
text: model.runtime !== null ? "(Runtime: <b>" + model.runtime + " minutes)</b>" : ""
|
||||
color: highlighted ? Theme.highlightColor : Theme.primaryColor
|
||||
wrapMode: Text.WordWrap
|
||||
anchors.top: showRect.bottom
|
||||
//anchors.topMargin: Theme.paddingMedium
|
||||
//anchors.left: showImg.right
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: Theme.paddingMedium
|
||||
anchors.rightMargin: Theme.paddingMedium
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
}
|
||||
|
||||
|
||||
|
||||
onClicked: {
|
||||
showSummary.text !== "" ? showSummary.text = "" : showSummary.text = model.summary
|
||||
}
|
||||
}
|
||||
|
||||
ViewPlaceholder {
|
||||
enabled: listView.count == 0 && jsonModel1.jsonready
|
||||
text: "No TVmaze data"
|
||||
hintText: "no information about season"
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: sectionDelegate
|
||||
|
||||
Text {
|
||||
id: sectionLabel
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
font.pixelSize: Theme.fontSizeExtraLarge
|
||||
color: Theme.highlightColor
|
||||
text: "SEASON: "+section
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
156
qml/pages/SeasonsPage.qml
Normal file
156
qml/pages/SeasonsPage.qml
Normal file
@ -0,0 +1,156 @@
|
||||
import QtQuick 2.0
|
||||
import Sailfish.Silica 1.0
|
||||
import "../JSONListModel"
|
||||
|
||||
Page {
|
||||
id: page
|
||||
property string filter: ""
|
||||
property string showid: ""
|
||||
property string showname: ""
|
||||
property string showimage: ""
|
||||
|
||||
SilicaListView {
|
||||
id: listView
|
||||
anchors.fill: parent
|
||||
clip: true
|
||||
|
||||
JSONListModel {
|
||||
id: jsonModel1
|
||||
source: "http://api.tvmaze.com/shows/"+showid+"/seasons"
|
||||
query: "$[*]"
|
||||
}
|
||||
|
||||
model: jsonModel1.model
|
||||
|
||||
BusyIndicator {
|
||||
id: busyIndicator
|
||||
running: !jsonModel1.jsonready
|
||||
size: BusyIndicatorSize.Large
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
header: PageHeader {
|
||||
id: pHeader
|
||||
title: showname
|
||||
}
|
||||
|
||||
delegate: BackgroundItem {
|
||||
id: myListItem
|
||||
width: ListView.view.width
|
||||
height: (showImg.height * showImg.scale) + showRect.height + Theme.paddingLarge
|
||||
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: firstName.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"
|
||||
}
|
||||
|
||||
|
||||
Image {
|
||||
id: showImg
|
||||
property int errorCount: 0
|
||||
anchors.top: showRect.bottom
|
||||
anchors.margins: Theme.paddingLarge
|
||||
/* anchors.topMargin: Theme.paddingLarge
|
||||
anchors.bottomMargin: Theme.paddingLarge
|
||||
anchors.rightMargin: Theme.paddingMedium
|
||||
anchors.leftMargin: Theme.paddingMedium */
|
||||
anchors.left: parent.left
|
||||
scale: 1.2
|
||||
//height: parent.height
|
||||
// width: parent.width * 0.4
|
||||
fillMode: Image.PreserveAspectFit
|
||||
source: model.image ? model.image.medium ? model.image.medium : showimage : showimage
|
||||
}
|
||||
|
||||
Text {
|
||||
id: firstName
|
||||
text: "Season: "+model.number //!== null ? "<b>"+model.name+"</b>" : ""
|
||||
color: highlighted ? Theme.highlightColor : Theme.primaryColor
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.verticalCenter: showRect.verticalCenter
|
||||
wrapMode: Text.ElideRight
|
||||
anchors.leftMargin: Theme.paddingLarge
|
||||
font.pixelSize: Theme.fontSizeLarge
|
||||
}
|
||||
Text {
|
||||
id: showType
|
||||
text: "<u>Premiere</u><br><b>" + model.premiereDate + "</b>"
|
||||
color: highlighted ? Theme.highlightColor : Theme.primaryColor
|
||||
wrapMode: Text.WordWrap
|
||||
anchors.bottomMargin: Theme.paddingMedium
|
||||
anchors.bottom: showImg.bottom
|
||||
anchors.left: showImg.right
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: Theme.paddingLarge
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
}
|
||||
|
||||
onPressAndHold: {
|
||||
pageStack.push(Qt.resolvedUrl("ShowImg.qml"),{"img": model.image ? model.image.medium ? model.image.medium : showimage : showimage})
|
||||
|
||||
//window.pageStack.push(Qt.resolvedUrl("SeasonsPage.qml"),{"showid": model.id,"showname": showname,"showimage": showImg.source} )
|
||||
}
|
||||
|
||||
onClicked: {
|
||||
onClicked: pageStack.push(Qt.resolvedUrl("SeasonNrPage.qml"),{"showid": showid,"showname": showname,"showimage": showImg,"number": model.number} )
|
||||
}
|
||||
}
|
||||
|
||||
PullDownMenu {
|
||||
MenuItem {
|
||||
text: qsTr("Show cast")
|
||||
onClicked: pageStack.replace(Qt.resolvedUrl("CastPage.qml"),{"showid": showid,"showname": showname,"showimage": showimage},PageStackAction.Immediate )
|
||||
}
|
||||
}
|
||||
|
||||
ViewPlaceholder {
|
||||
enabled: listView.count == 0 && jsonModel1.jsonready
|
||||
text: "No TVmaze data"
|
||||
hintText: "no information about seasons"
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: sectionDelegate
|
||||
Text {
|
||||
id: sectionLabel
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
font.pixelSize: Theme.fontSizeExtraLarge
|
||||
color: Theme.highlightColor
|
||||
text: "SEASON: "+section
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
23
qml/pages/ShowImg.qml
Normal file
23
qml/pages/ShowImg.qml
Normal file
@ -0,0 +1,23 @@
|
||||
import QtQuick 2.0
|
||||
import Sailfish.Silica 1.0
|
||||
|
||||
Page {
|
||||
property string img: ""
|
||||
Image {
|
||||
id: showImg
|
||||
fillMode: Image.PreserveAspectFit
|
||||
source: img
|
||||
anchors.fill: parent
|
||||
|
||||
width: parent.width
|
||||
height: parent.height
|
||||
BusyIndicator {
|
||||
id: imgBysy
|
||||
running: showImg.progress !== 1.0
|
||||
size: BusyIndicatorSize.Large
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
}
|
||||
}
|
58
qml/pages/WebViewer.qml
Normal file
58
qml/pages/WebViewer.qml
Normal file
@ -0,0 +1,58 @@
|
||||
import QtQuick 2.0
|
||||
import Sailfish.Silica 1.0
|
||||
import Sailfish.WebView 1.0
|
||||
|
||||
WebViewPage {
|
||||
id: webViewPage
|
||||
allowedOrientations: Orientation.Portrait | Orientation.Landscape
|
||||
|
||||
property string webPageAddress: ""
|
||||
property bool webViewLoading: false
|
||||
property int webViewLoadProgress: 0
|
||||
|
||||
WebView {
|
||||
id: webView
|
||||
|
||||
anchors.fill: parent
|
||||
|
||||
active: true
|
||||
url: webPageAddress
|
||||
|
||||
onLoadingChanged: {
|
||||
webViewPage.webViewLoading = loading
|
||||
webViewPage.webViewLoadProgress = 0
|
||||
}
|
||||
|
||||
onLoadProgressChanged: {
|
||||
webViewPage.webViewLoadProgress = loadProgress
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: panel
|
||||
color: Theme.highlightDimmerColor
|
||||
anchors {
|
||||
bottom: parent.bottom
|
||||
left: parent.left
|
||||
right: parent.right
|
||||
//margins: Theme.padding
|
||||
}
|
||||
width: parent.width
|
||||
height: opacity === 0.0 ? 0 : Theme.paddingLarge
|
||||
radius: 5
|
||||
|
||||
opacity: (webViewPage.webViewLoading || loadStatusShowTimer.running) ? 0.75 : 0.0
|
||||
Behavior on opacity { FadeAnimator {} }
|
||||
|
||||
Timer {
|
||||
id: loadStatusShowTimer
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
anchors.left: parent.left
|
||||
color: Theme.secondaryHighlightColor
|
||||
width: webViewPage.webViewLoading ? parent.width * (webViewPage.webViewLoadProgress / 100) : 0
|
||||
height: parent.height
|
||||
}
|
||||
}
|
||||
}
|
14
rpm/harbour-labyrinth.changes.in
Normal file
14
rpm/harbour-labyrinth.changes.in
Normal file
@ -0,0 +1,14 @@
|
||||
# Rename this file as harbour-labyrinth.changes to include changelog
|
||||
# entries in your RPM file.
|
||||
#
|
||||
# Add new changelog entries following the format below.
|
||||
# Add newest entries to the top of the list.
|
||||
# Separate entries from eachother with a blank line.
|
||||
|
||||
# * date Author's Name <author's email> version-release
|
||||
# - Summary of changes
|
||||
|
||||
* Sun Apr 13 2014 Jack Tar <jack.tar@example.com> 0.0.1-1
|
||||
- Scrubbed the deck
|
||||
- Hoisted the sails
|
||||
|
71
rpm/harbour-labyrinth.spec
Normal file
71
rpm/harbour-labyrinth.spec
Normal file
@ -0,0 +1,71 @@
|
||||
#
|
||||
# Do NOT Edit the Auto-generated Part!
|
||||
# Generated by: spectacle version 0.32
|
||||
#
|
||||
|
||||
Name: harbour-labyrinth
|
||||
|
||||
# >> macros
|
||||
# << macros
|
||||
|
||||
%{!?qtc_qmake:%define qtc_qmake %qmake}
|
||||
%{!?qtc_qmake5:%define qtc_qmake5 %qmake5}
|
||||
%{!?qtc_make:%define qtc_make make}
|
||||
%{?qtc_builddir:%define _builddir %qtc_builddir}
|
||||
Summary: Labyrinth
|
||||
Version: 0.9.0
|
||||
Release: 1
|
||||
Group: Qt/Qt
|
||||
License: LICENSE
|
||||
URL: http://example.org/
|
||||
Source0: %{name}-%{version}.tar.bz2
|
||||
Source100: harbour-labyrinth.yaml
|
||||
Requires: sailfishsilica-qt5 >= 0.10.9
|
||||
BuildRequires: pkgconfig(sailfishapp) >= 1.0.2
|
||||
BuildRequires: pkgconfig(Qt5Core)
|
||||
BuildRequires: pkgconfig(Qt5Qml)
|
||||
BuildRequires: pkgconfig(Qt5Quick)
|
||||
BuildRequires: desktop-file-utils
|
||||
|
||||
%description
|
||||
Labyrinth is a simple app to keep track of your favorite TV-shows using TVMaze.
|
||||
|
||||
%prep
|
||||
%setup -q -n %{name}-%{version}
|
||||
|
||||
# >> setup
|
||||
# << setup
|
||||
|
||||
%build
|
||||
# >> build pre
|
||||
# << build pre
|
||||
|
||||
%qtc_qmake5 \
|
||||
VERSION='%{version}'
|
||||
|
||||
%qtc_make %{?_smp_mflags}
|
||||
|
||||
# >> build post
|
||||
# << build post
|
||||
|
||||
%install
|
||||
rm -rf %{buildroot}
|
||||
# >> install pre
|
||||
# << install pre
|
||||
%qmake5_install
|
||||
|
||||
# >> install post
|
||||
# << install post
|
||||
|
||||
desktop-file-install --delete-original \
|
||||
--dir %{buildroot}%{_datadir}/applications \
|
||||
%{buildroot}%{_datadir}/applications/*.desktop
|
||||
|
||||
%files
|
||||
%defattr(-,root,root,-)
|
||||
%{_bindir}
|
||||
%{_datadir}/%{name}
|
||||
%{_datadir}/applications/%{name}.desktop
|
||||
%{_datadir}/icons/hicolor/*/apps/%{name}.png
|
||||
# >> files
|
||||
# << files
|
47
rpm/harbour-labyrinth.yaml
Normal file
47
rpm/harbour-labyrinth.yaml
Normal file
@ -0,0 +1,47 @@
|
||||
Name: harbour-labyrinth
|
||||
Summary: Labyrinth
|
||||
Version: 0.9.0
|
||||
Release: 1
|
||||
# The contents of the Group field should be one of the groups listed here:
|
||||
# http://gitorious.org/meego-developer-tools/spectacle/blobs/master/data/GROUPS
|
||||
Group: Qt/Qt
|
||||
URL: http://example.org/
|
||||
License: LICENSE
|
||||
# This must be generated before uploading a package to a remote build service.
|
||||
# Usually this line does not need to be modified.
|
||||
Sources:
|
||||
- '%{name}-%{version}.tar.bz2'
|
||||
Description: Labyrinth is a simple app to keep track of your favorite TV-shows using TVMaze.
|
||||
Configure: none
|
||||
# The qtc5 builder inserts macros to allow QtCreator to have fine
|
||||
# control over qmake/make execution
|
||||
Builder: qtc5
|
||||
|
||||
QMakeOptions:
|
||||
- VERSION='%{version}'
|
||||
|
||||
# This section specifies build dependencies that are resolved using pkgconfig.
|
||||
# This is the preferred way of specifying build dependencies for your package.
|
||||
PkgConfigBR:
|
||||
- sailfishapp >= 1.0.2
|
||||
- Qt5Core
|
||||
- Qt5Qml
|
||||
- Qt5Quick
|
||||
|
||||
# Build dependencies without a pkgconfig setup can be listed here
|
||||
# PkgBR:
|
||||
# - package-needed-to-build
|
||||
|
||||
# Runtime dependencies which are not automatically detected
|
||||
Requires:
|
||||
- sailfishsilica-qt5 >= 0.10.9
|
||||
|
||||
# All installed files
|
||||
Files:
|
||||
- '%{_bindir}'
|
||||
- '%{_datadir}/%{name}'
|
||||
- '%{_datadir}/applications/%{name}.desktop'
|
||||
- '%{_datadir}/icons/hicolor/*/apps/%{name}.png'
|
||||
|
||||
# For more information about yaml and what's supported in Sailfish OS
|
||||
# build system, please see https://wiki.merproject.org/wiki/Spectacle
|
53
src/harbour-labyrinth.cpp
Normal file
53
src/harbour-labyrinth.cpp
Normal file
@ -0,0 +1,53 @@
|
||||
/*
|
||||
Copyright (C) 2013 Jolla Ltd.
|
||||
Contact: Thomas Perl <thomas.perl@jollamobile.com>
|
||||
All rights reserved.
|
||||
|
||||
You may use this file under the terms of BSD license as follows:
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the Jolla Ltd nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifdef QT_QML_DEBUG
|
||||
#include <QtQuick>
|
||||
#endif
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <sailfishapp.h>
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// SailfishApp::main() will display "qml/template.qml", if you need more
|
||||
// control over initialization, you can use:
|
||||
//
|
||||
// - SailfishApp::application(int, char *[]) to get the QGuiApplication *
|
||||
// - SailfishApp::createView() to get a new QQuickView * instance
|
||||
// - SailfishApp::pathTo(QString) to get a QUrl to a resource file
|
||||
//
|
||||
// To display the view, call "show()" (will show fullscreen on device).
|
||||
QScopedPointer<QGuiApplication> app(SailfishApp::application(argc,argv));
|
||||
app->setApplicationVersion(QString(APP_VERSION));
|
||||
|
||||
return SailfishApp::main(argc, argv);
|
||||
}
|
86
translations/harbour-labyrinth-de.ts
Normal file
86
translations/harbour-labyrinth-de.ts
Normal file
@ -0,0 +1,86 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1">
|
||||
<context>
|
||||
<name>CastPage</name>
|
||||
<message>
|
||||
<source>Show seasons</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Favorites</name>
|
||||
<message>
|
||||
<source>About Labyrinth</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Popular shows by rating</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Popular shows by clicks</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Search TV show</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Notify</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InfoPage</name>
|
||||
<message>
|
||||
<source>Open IMDB page</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Official site</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PopularPage</name>
|
||||
<message>
|
||||
<source>Popular shows by rating</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Popular shows by clicks</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Favourites</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Search shows</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SearchPage</name>
|
||||
<message>
|
||||
<source>Popular shows by rating</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Popular shows by clicks</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Favorites</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SeasonsPage</name>
|
||||
<message>
|
||||
<source>Show cast</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
86
translations/harbour-labyrinth.ts
Normal file
86
translations/harbour-labyrinth.ts
Normal file
@ -0,0 +1,86 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1">
|
||||
<context>
|
||||
<name>CastPage</name>
|
||||
<message>
|
||||
<source>Show seasons</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Favorites</name>
|
||||
<message>
|
||||
<source>About Labyrinth</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Popular shows by rating</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Popular shows by clicks</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Search TV show</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Notify</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>InfoPage</name>
|
||||
<message>
|
||||
<source>Open IMDB page</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Official site</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PopularPage</name>
|
||||
<message>
|
||||
<source>Popular shows by rating</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Popular shows by clicks</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Favourites</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Search shows</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SearchPage</name>
|
||||
<message>
|
||||
<source>Popular shows by rating</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Popular shows by clicks</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Favorites</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SeasonsPage</name>
|
||||
<message>
|
||||
<source>Show cast</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
Loading…
x
Reference in New Issue
Block a user