diff options
author | Lauro Neto <lauro.neto@openbossa.org> | 2011-09-20 10:47:04 -0300 |
---|---|---|
committer | Lauro Neto <lauro.neto@openbossa.org> | 2011-09-21 18:06:45 -0300 |
commit | cd49020a9356bd3aeab19265a031b566daac8d0b (patch) | |
tree | 5fca120a9ced61078b520967b23105e39065ac67 /mobility | |
parent | db9fd3df55b85dd01e8b19a6ee5bcdf98b8f8090 (diff) |
Adding qml Service browser example.
Diffstat (limited to 'mobility')
-rw-r--r-- | mobility/servicebrowser/qml/HoldButton.qml (renamed from mobility/servicebrowser/HoldButton.qml) | 0 | ||||
-rw-r--r-- | mobility/servicebrowser/qml/ImplementationDetails.qml | 60 | ||||
-rw-r--r-- | mobility/servicebrowser/qml/ServiceImplementations.qml | 93 | ||||
-rw-r--r-- | mobility/servicebrowser/qml/ServicesPage.qml | 61 | ||||
-rw-r--r-- | mobility/servicebrowser/qml/main.qml | 10 | ||||
-rw-r--r-- | mobility/servicebrowser/qml/qmlbrowser.py | 134 |
6 files changed, 358 insertions, 0 deletions
diff --git a/mobility/servicebrowser/HoldButton.qml b/mobility/servicebrowser/qml/HoldButton.qml index 32ce02e..32ce02e 100644 --- a/mobility/servicebrowser/HoldButton.qml +++ b/mobility/servicebrowser/qml/HoldButton.qml diff --git a/mobility/servicebrowser/qml/ImplementationDetails.qml b/mobility/servicebrowser/qml/ImplementationDetails.qml new file mode 100644 index 0000000..bfbf139 --- /dev/null +++ b/mobility/servicebrowser/qml/ImplementationDetails.qml @@ -0,0 +1,60 @@ + +import QtQuick 1.1 +import com.nokia.meego 1.0 +import com.nokia.extras 1.1 + +Page { + + property string implementationSpec: "" + property int implementationIndex: -1 + property string serviceName: "" + property int serviceIndex: -1 + + id: implementationDetails + anchors.margins: UiConstants.DefaultMargin + //orientationLock: PageOrientation.LockPortrait + + Label { + id: titleLabel + anchors.top: parent.top + width: parent.width + anchors.horizontalCenter: parent.horizontalCenter + text: "Implementation: " + implementationSpec + } + + Flickable { + anchors.top: titleLabel.bottom + anchors.horizontalCenter: parent.horizontalCenter + width: parent.width + contentHeight: servicesButtons.height + + ButtonColumn { + id: servicesButtons + width: parent.width + anchors.horizontalCenter: parent.horizontalCenter + Repeater { + model: manager.implementationDetails(implementationSpec, implementationIndex, + serviceName, serviceIndex); + Button { + width: parent.width + text: modelData + onClicked: { + console.log("Selecting service") + //manager.selectService(index) + } + } + } + } + } + + tools: ToolBarLayout { + id: implementationPageTools + ToolButton { + text: "Back" + onClicked: { + pageStack.pop(); + } + } + } + +} diff --git a/mobility/servicebrowser/qml/ServiceImplementations.qml b/mobility/servicebrowser/qml/ServiceImplementations.qml new file mode 100644 index 0000000..28791cc --- /dev/null +++ b/mobility/servicebrowser/qml/ServiceImplementations.qml @@ -0,0 +1,93 @@ + +import QtQuick 1.1 +import com.nokia.meego 1.0 +import com.nokia.extras 1.1 + +Page { + + property string serviceName: "" + property int serviceIndex: -1 + + id: serviceImplementations + anchors.margins: UiConstants.DefaultMargin + //orientationLock: PageOrientation.LockPortrait + + Label { + id: titleLabel + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + text: "Service: " + serviceName + } + + Flickable { + anchors.top: titleLabel.bottom + anchors.horizontalCenter: parent.horizontalCenter + width: parent.width + contentHeight: servicesButtons.height + + ButtonColumn { + id: servicesButtons + width: parent.width + anchors.horizontalCenter: parent.horizontalCenter + Repeater { + id: buttonRepeater + model: manager.serviceImplementations(serviceName, serviceIndex) + + HoldButton { + text: modelData + // TODO Getting some "Unable to assing undefined value" at this line when + // setting model to a different list (line 73), but the example is working + // so far. + width: parent.width + + onHeld: { + setDefaultDialog.titleText = "Change default implementation"; + setDefaultDialog.message = "Set " + modelData + " as default?"; + setDefaultDialog.index = index; + setDefaultDialog.open(); + } + + onClickedWithoutHold: { + pageStack.push(Qt.createComponent("ImplementationDetails.qml"), + { implementationSpec: modelData, + implementationIndex: index, + serviceName: serviceName, + serviceIndex: serviceIndex + }); + + } + } + } + } + } + + QueryDialog { + property int index: -1 + + id: setDefaultDialog + acceptButtonText: "Yes" + rejectButtonText: "No" + + onAccepted: { + console.log("Accepted"); + manager.setDefault(index); + buttonRepeater.model = manager.serviceImplementations(serviceName, serviceIndex) + } + + onRejected: { + console.log("Rejected"); + } + + } + + tools: ToolBarLayout { + id: implementationPageTools + ToolButton { + text: "Back" + onClicked: { + pageStack.pop(); + } + } + } + +} diff --git a/mobility/servicebrowser/qml/ServicesPage.qml b/mobility/servicebrowser/qml/ServicesPage.qml new file mode 100644 index 0000000..4bcf85c --- /dev/null +++ b/mobility/servicebrowser/qml/ServicesPage.qml @@ -0,0 +1,61 @@ + + +import QtQuick 1.1 +import com.nokia.meego 1.0 +import com.nokia.extras 1.1 + +Page { + id: servicePage + anchors.margins: UiConstants.DefaultMargin + //orientationLock: PageOrientation.LockPortrait + + Label { + id: titleLabel + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + text: "Services available" + } + + Flickable { + anchors.top: titleLabel.bottom + anchors.horizontalCenter: parent.horizontalCenter + width: parent.width + contentHeight: servicesButtons.height + + ButtonColumn { + id: servicesButtons + width: parent.width + anchors.horizontalCenter: parent.horizontalCenter + Repeater { + model: manager.servicesNames + Button { + text: modelData + onClicked: { + console.log("Selecting service") + pageStack.push(Qt.createComponent("ServiceImplementations.qml"), + { serviceName: modelData, + serviceIndex: index }) + } + } + } + } + } + + /*tools: ToolBarLayout { + id: mainTools + ToolButton { + text: "Add..." + onClicked: { + console.log("Add new contact") + pageStack.push(Qt.createComponent("ContactEdit.qml")) + } + } + ToolButton { + text: "Select backend..." + onClicked: { + pageStack.push(Qt.createComponent("SelectBackend.qml")) + } + } + }*/ + +} diff --git a/mobility/servicebrowser/qml/main.qml b/mobility/servicebrowser/qml/main.qml new file mode 100644 index 0000000..ee8dfe8 --- /dev/null +++ b/mobility/servicebrowser/qml/main.qml @@ -0,0 +1,10 @@ + +import QtQuick 1.1 +import com.nokia.meego 1.0 + +PageStackWindow { + + id: rootWindow + showStatusBar: false + initialPage: ServicesPage { } +} diff --git a/mobility/servicebrowser/qml/qmlbrowser.py b/mobility/servicebrowser/qml/qmlbrowser.py new file mode 100644 index 0000000..4ac9b51 --- /dev/null +++ b/mobility/servicebrowser/qml/qmlbrowser.py @@ -0,0 +1,134 @@ +''' + Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). + All rights reserved. + Contact: Nokia Corporation (qt-info@nokia.com) + + This file is part of the Qt Mobility Components. + + $QT_BEGIN_LICENSE:LGPL$ + No Commercial Usage + This file contains pre-release code and may not be distributed. + You may use this file in accordance with the terms and conditions + contained in the Technology Preview License Agreement accompanying + this package. + + GNU Lesser General Public License Usage + Alternatively, this file may be used under the terms of the GNU Lesser + General Public License version 2.1 as published by the Free Software + Foundation and appearing in the file LICENSE.LGPL included in the + packaging of this file. Please review the following information to + ensure the GNU Lesser General Public License version 2.1 requirements + will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + + In addition, as a special exception, Nokia gives you certain additional + rights. These rights are described in the Nokia Qt LGPL Exception + version 1.1, included in the file LGPL_EXCEPTION.txt in this package. + + If you have questions regarding the use of this file, please contact + Nokia at qt-info@nokia.com. +''' + +import os +import sys + +from PySide.QtCore import QObject, Signal, Slot, Property, QUrl, qWarning +from PySide.QtGui import QApplication +from PySide.QtDeclarative import QDeclarativeView +from QtMobility.ServiceFramework import QServiceManager + + +class ServiceManager(QObject): + + def __init__(self): + QObject.__init__(self) + + self._services = [] + self._errorMessage = "" + self._emailEnabled = False + self._addressEnabled = True + + self.manager = QServiceManager(self) + + self.reloadServicesList() + + def reloadServicesList(self): + self._services = [] + for service in self.manager.findServices(): + self._services.append(service) + self.onServicesChanged.emit() + + onServicesChanged = Signal() + + @Property("QStringList", notify=onServicesChanged) + def servicesNames(self): + return self._services + + @Slot(str, int, result="QStringList") + def serviceImplementations(self, serviceName, serviceIndex): + print "Interfaces implemented by ", serviceName + + self._implementations = [] + for descriptor in self.manager.findInterfaces(serviceName): + impSpec = "%s %d.%d" % (descriptor.interfaceName(), + descriptor.majorVersion(), + descriptor.minorVersion()) + + if not serviceName: + impSpec += " (" + descriptor.serviceName() + ")" + + default = self.manager.interfaceDefault(descriptor.interfaceName()) + if descriptor == default: + impSpec += " (default)" + + self._implementations.append((impSpec, descriptor)) + return [x[0] for x in self._implementations] + + @Slot(str, int, str, int, result="QStringList") + def implementationDetails(self, implementationSpec, implementationIndex, + serviceName, serviceIndex): + + selectedImplementation = self._implementations[implementationIndex][1] + implementationRef = self.manager.loadInterface(selectedImplementation) + attributes = [] + + if not implementationRef: + return ["(Error loading service plugin)"] + + metaObject = implementationRef.metaObject() + + for i in range(metaObject.methodCount()): + method = metaObject.method(i) + attributes.append("[METHOD] " + method.signature()) + + for i in range(metaObject.propertyCount()): + p = metaObject.property(i) + attributes.append("[PROPERTY] " + p.name()) + + return attributes if attributes else ["(no attributes found)"] + + @Slot(int) + def setDefault(self, index): + descriptor = self._implementations[index][1] + + if descriptor.isValid(): + if self.manager.setInterfaceDefault(descriptor): + pass + +def main(): + app = QApplication([]) + view = QDeclarativeView() + manager = ServiceManager() + context = view.rootContext() + context.setContextProperty("manager", manager) + + url = QUrl('main.qml') + view.setSource(url) + view.showFullScreen() + + app.exec_() + + +if __name__ == '__main__': + main() + + |