summaryrefslogtreecommitdiff
path: root/app/qml
diff options
context:
space:
mode:
Diffstat (limited to 'app/qml')
-rw-r--r--app/qml/pages/AboutPage.qml2
-rw-r--r--app/qml/pages/AppConfigDialog.qml87
-rw-r--r--app/qml/pages/InstallAppDialog.qml75
-rw-r--r--app/qml/pages/WatchPage.qml157
-rw-r--r--app/qml/pages/WebItemSelDialog.qml45
-rw-r--r--app/qml/pebble.qml4
6 files changed, 360 insertions, 10 deletions
diff --git a/app/qml/pages/AboutPage.qml b/app/qml/pages/AboutPage.qml
index 3ab92a0..12f4d53 100644
--- a/app/qml/pages/AboutPage.qml
+++ b/app/qml/pages/AboutPage.qml
@@ -40,7 +40,7 @@ Page {
anchors {
left: parent.left
right: parent.right
- margins: Theme.paddingSmall
+ margins: Theme.paddingMedium
}
font.pixelSize: Theme.fontSizeTiny
horizontalAlignment: Text.AlignJustify
diff --git a/app/qml/pages/AppConfigDialog.qml b/app/qml/pages/AppConfigDialog.qml
new file mode 100644
index 0000000..1562985
--- /dev/null
+++ b/app/qml/pages/AppConfigDialog.qml
@@ -0,0 +1,87 @@
+import QtQuick 2.0
+import QtQml 2.1
+import QtWebKit 3.0
+import Sailfish.Silica 1.0
+
+Dialog {
+ id: appConfigPage
+
+ property alias url: webview.url
+ property string uuid
+ property string name
+
+ SilicaWebView {
+ id: webview
+ visible: url != ""
+ anchors.fill: parent
+
+ header: DialogHeader {
+ title: "Configuring " + name
+ }
+
+ VerticalScrollDecorator { flickable: webview }
+
+ overridePageStackNavigation: true
+
+ onNavigationRequested: {
+ console.log("appconfig navigation requested to " + request.url);
+ var url = request.url.toString();
+ if (/^pebblejs:\/\/close/.exec(url)) {
+ var data = decodeURIComponent(url.substring(17));
+ console.log("appconfig requesting close; data: " + data);
+ pebbled.setAppConfiguration(uuid, data);
+ appConfigPage.canAccept = true;
+ appConfigPage.accept();
+ request.action = WebView.IgnoreRequest;
+ } else {
+ request.action = WebView.AcceptRequest;
+ }
+ }
+
+ experimental.itemSelector: Component {
+ Item {
+ Component.onCompleted: {
+ var dialog = pageStack.push(Qt.resolvedUrl("WebItemSelDialog.qml"), {
+ model: model.items
+ });
+ dialog.onRejected.connect(function() {
+ model.reject();
+ });
+ dialog.onAccepted.connect(function() {
+ model.accept(dialog.selectedIndex);
+ });
+ }
+ }
+ }
+ }
+
+ ProgressBar {
+ anchors {
+ left: parent.left
+ right: parent.right
+ bottom: parent.bottom
+ }
+
+ visible: webview.visible && webview.loading
+ minimumValue: 0
+ maximumValue: 100
+ indeterminate: webview.loadProgress === 0
+ value: webview.loadProgress
+ }
+
+ Text {
+ anchors.centerIn: parent
+ visible: url == ""
+ text: qsTr("No configuration settings available")
+ width: parent.width - 2*Theme.paddingLarge
+ horizontalAlignment: Text.AlignHCenter
+ wrapMode: Text.Wrap
+ font {
+ pixelSize: Theme.fontSizeLarge
+ family: Theme.fontFamilyHeading
+ }
+ color: Theme.highlightColor
+ }
+
+ canAccept: false
+}
diff --git a/app/qml/pages/InstallAppDialog.qml b/app/qml/pages/InstallAppDialog.qml
new file mode 100644
index 0000000..fa96c28
--- /dev/null
+++ b/app/qml/pages/InstallAppDialog.qml
@@ -0,0 +1,75 @@
+import QtQuick 2.0
+import QtQml 2.1
+import Sailfish.Silica 1.0
+
+Dialog {
+ id: installAppPage
+
+ property string selectedUuid;
+
+ SilicaListView {
+ id: appList
+ anchors.fill: parent
+
+ header: DialogHeader {
+ title: qsTr("Install app")
+ defaultAcceptText: qsTr("Install")
+ }
+
+ VerticalScrollDecorator { flickable: flickable }
+
+ currentIndex: -1
+
+ delegate: ListItem {
+ id: appDelegate
+ contentHeight: Theme.itemSizeSmall
+
+ property string uuid: modelData.uuid
+ property bool alreadyInstalled: pebbled.isAppInstalled(uuid)
+
+ Item {
+ id: appIcon
+ width: Theme.itemSizeSmall
+ height: Theme.itemSizeSmall
+
+ anchors {
+ top: parent.top
+ left: parent.left
+ leftMargin: Theme.paddingLarge
+ }
+
+ Image {
+ id: appImage
+ anchors.centerIn: parent
+ source: "image://pebble-app-icon/" + uuid;
+ scale: 2
+ }
+ }
+
+ Label {
+ id: appName
+ anchors {
+ left: appIcon.right
+ leftMargin: Theme.paddingMedium
+ right: parent.right
+ rightMargin: Theme.paddingLarge
+ verticalCenter: parent.verticalCenter
+ }
+ text: modelData.longName
+ color: appDelegate.highlighted ? Theme.highlightColor : Theme.primaryColor
+ }
+
+ onClicked: {
+ appList.currentIndex = index
+ if (!alreadyInstalled) {
+ selectedUuid = uuid
+ accept();
+ }
+ }
+ }
+
+ model: pebbled.allApps
+ }
+
+ canAccept: appList.currentIndex >= 0 && !appList.currentItem.alreadyInstalled
+}
diff --git a/app/qml/pages/WatchPage.qml b/app/qml/pages/WatchPage.qml
index 90e5ec9..43c2b99 100644
--- a/app/qml/pages/WatchPage.qml
+++ b/app/qml/pages/WatchPage.qml
@@ -34,7 +34,7 @@ import QtQml 2.1
import Sailfish.Silica 1.0
Page {
- id: page
+ id: watchPage
SilicaFlickable {
id: flickable
@@ -45,9 +45,8 @@ Page {
Column {
id: column
+ width: watchPage.width
- width: page.width
- spacing: Theme.paddingLarge
PageHeader {
title: pebbled.name
}
@@ -61,7 +60,7 @@ Page {
Button {
- text: "Ping"
+ text: qsTr("Ping")
width: parent.width / 2
onClicked: {
pebbled.ping(66)
@@ -69,7 +68,7 @@ Page {
}
Button {
- text: "Sync Time"
+ text: qsTr("Sync Time")
width: parent.width / 2
onClicked: {
pebbled.time()
@@ -77,6 +76,154 @@ Page {
}
}
+ Item {
+ width: parent.width
+ height: Theme.paddingLarge
+ }
+
+ Label {
+ text: qsTr("Installed applications")
+ font.family: Theme.fontFamilyHeading
+ color: Theme.highlightColor
+ anchors.right: parent.right
+ anchors.rightMargin: Theme.paddingMedium
+ }
+
+ Repeater {
+ id: slotsRepeater
+ model: pebbled.appSlots
+
+ ListItem {
+ id: slotDelegate
+ menu: slotMenu
+ contentHeight: Theme.itemSizeSmall
+
+ property bool isEmptySlot: modelData === ""
+ property var appInfo: pebbled.appInfoByUuid(modelData)
+ property bool isKnownApp: appInfo.hasOwnProperty("uuid")
+ property bool busy: false
+
+ function configure() {
+ var uuid = modelData;
+ pebbled.launchApp(uuid);
+ console.log("going to call configure on app with uuid " + uuid);
+ var url = pebbled.configureApp(uuid);
+ console.log("received url: " + url);
+ pageStack.push(Qt.resolvedUrl("AppConfigDialog.qml"), {
+ url: url,
+ uuid: uuid,
+ name: appInfo.longName
+ });
+ }
+
+ function remove() {
+ remorseAction(qsTr("Uninstalling"), function() {
+ busy = true;
+ pebbled.unloadApp(index);
+ });
+ }
+
+ function install() {
+ var dialog = pageStack.push(Qt.resolvedUrl("InstallAppDialog.qml"));
+ dialog.accepted.connect(function() {
+ var uuid = dialog.selectedUuid;
+
+ if (pebbled.isAppInstalled(uuid)) {
+ console.warn("uuid already installed");
+ return;
+ }
+
+ var slot = index;
+ console.log("installing " + uuid + " into " + slot);
+ busy = true;
+ pebbled.uploadApp(uuid, slot);
+ });
+
+ }
+
+ Item {
+ id: slotIcon
+ width: Theme.itemSizeSmall
+ height: Theme.itemSizeSmall
+
+ anchors {
+ top: parent.top
+ left: parent.left
+ leftMargin: Theme.paddingLarge
+ }
+
+ Image {
+ id: slotImage
+ anchors.centerIn: parent
+ source: isKnownApp ? "image://pebble-app-icon/" + modelData : ""
+ scale: 2
+ visible: !isEmptySlot && isKnownApp && !slotBusy.running
+ }
+
+ Rectangle {
+ width: 30
+ height: 30
+ anchors.centerIn: parent
+ scale: 2
+ border {
+ width: 2
+ color: slotDelegate.highlighted ? Theme.highlightColor : Theme.primaryColor
+ }
+ color: "transparent"
+ visible: isEmptySlot && !slotBusy.running
+ }
+
+ BusyIndicator {
+ id: slotBusy
+ anchors.centerIn: parent
+ running: slotDelegate.busy
+ }
+ }
+
+ Label {
+ id: slotName
+ anchors {
+ left: slotIcon.right
+ leftMargin: Theme.paddingMedium
+ right: parent.right
+ rightMargin: Theme.paddingLarge
+ verticalCenter: parent.verticalCenter
+ }
+ text: isEmptySlot ? qsTr("(empty slot)") : (isKnownApp ? appInfo.longName : qsTr("(slot in use by unknown app)"))
+ color: slotDelegate.highlighted ? Theme.highlightColor : Theme.primaryColor
+ onTextChanged: slotDelegate.busy = false;
+ }
+
+ Component {
+ id: slotMenu
+ ContextMenu {
+ MenuItem {
+ text: qsTr("Install app...")
+ visible: isEmptySlot
+ onClicked: install();
+ }
+ MenuItem {
+ text: qsTr("Configure...")
+ visible: !isEmptySlot && isKnownApp
+ onClicked: configure();
+ }
+ MenuItem {
+ text: qsTr("Uninstall")
+ visible: !isEmptySlot
+ onClicked: remove();
+ }
+ }
+ }
+
+ onClicked: {
+ if (isEmptySlot) {
+ install();
+ } else {
+ showMenu();
+ }
+ }
+ }
+ }
}
}
}
diff --git a/app/qml/pages/WebItemSelDialog.qml b/app/qml/pages/WebItemSelDialog.qml
new file mode 100644
index 0000000..f8c49f2
--- /dev/null
+++ b/app/qml/pages/WebItemSelDialog.qml
@@ -0,0 +1,45 @@
+import QtQuick 2.0
+import QtQml 2.1
+import Sailfish.Silica 1.0
+
+Dialog {
+ id: itemSelDialog
+ property alias model: listView.model
+ property int selectedIndex: -1
+
+ SilicaListView {
+ id: listView
+ anchors.fill: parent
+
+ VerticalScrollDecorator { flickable: webview }
+
+ header: PageHeader {
+ }
+
+ delegate: ListItem {
+ id: itemDelegate
+ contentHeight: Theme.itemSizeSmall
+
+ Label {
+ anchors {
+ left: parent.left
+ leftMargin: Theme.paddingMedium
+ right: parent.right
+ rightMargin: Theme.paddingMedium
+ verticalCenter: parent.verticalCenter
+ }
+ text: model.text
+ color: model.enabled ?
+ (itemDelegate.highlighted ? Theme.highlightColor : Theme.primaryColor)
+ : Theme.secondaryColor
+ truncationMode: TruncationMode.Fade
+ }
+
+ enabled: model.enabled
+ onClicked: {
+ selectedIndex = model.index;
+ accept();
+ }
+ }
+ }
+}
diff --git a/app/qml/pebble.qml b/app/qml/pebble.qml
index da3bfb5..2e26ebe 100644
--- a/app/qml/pebble.qml
+++ b/app/qml/pebble.qml
@@ -38,8 +38,4 @@ ApplicationWindow
{
initialPage: Component { ManagerPage { } }
cover: Qt.resolvedUrl("cover/CoverPage.qml")
-
- PebbledInterface {
- id: pebbled
- }
}