PlaceDialog.qml Example File
places/content/places/PlaceDialog.qml/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the 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 Digia Plc and its Subsidiary(-ies) 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 ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtLocation 5.0 import QtLocation.examples 5.0 Dialog { id: root property list<Category> __categories property Place locationPlace property bool __createdPlace: false signal completed; function prepareDialog(inputPlace) { if (!inputPlace) { locationPlace = Qt.createQmlObject('import QtLocation 5.0; Place { }', root); __createdPlace = true; } else { locationPlace = inputPlace; __createdPlace = false; } setDataFields([ ["Name", locationPlace ? locationPlace.name : ""], ["Street", locationPlace ? locationPlace.location.address.street : ""], ["District", locationPlace ? locationPlace.location.address.district : ""], ["City", locationPlace ? locationPlace.location.address.city : ""], ["County", locationPlace ? locationPlace.location.address.county : ""], ["State", locationPlace ? locationPlace.location.address.state : ""], ["Country code", locationPlace ? locationPlace.location.address.countryCode : ""], ["Country", locationPlace ? locationPlace.location.address.country : ""], ["Postal code", locationPlace ? locationPlace.location.address.postalCode : ""], ["Latitude", locationPlace ? locationPlace.location.coordinate.latitude.toString() : ""], ["Longitude", locationPlace ? locationPlace.location.coordinate.longitude.toString() : ""], ["Phone", locationPlace ? locationPlace.primaryPhone : ""], ["Fax", locationPlace ? locationPlace.primaryFax : ""], ["Email", locationPlace ? locationPlace.primaryEmail : ""], ["Website", locationPlace ? locationPlace.primaryWebsite.toString() : ""] ]); __categories = locationPlace ? locationPlace.categories : new Array() } function setDataFields(objects) { dataFieldsModel.clear(); for (var i = 0; i < objects.length; i++) dataFieldsModel.append({"labelText": objects[i][0], "inputText": objects[i][1]}) } function processStatus() { if (processStatus.prevStatus == Place.Saving) { switch (locationPlace.status) { case Place.Ready: if (__createdPlace) { locationPlace.destroy(); __createdPlace = false; processStatus.prevStatus = null; } completed(); break; case Place.Error: console.log("Save failed:" + locationPlace.errorString()); errorDialog.text = locationPlace.errorString(); errorDialog.opacity = 1; break; } } processStatus.prevStatus = locationPlace.status; } Behavior on opacity { NumberAnimation { duration: 500 } } ErrorDialog { id: errorDialog title: "Save Place Failed" } onGoButtonClicked: { if (locationPlace.status == Place.Saving) return; locationPlace.plugin = placesPlugin; locationPlace.name = dataFieldsModel.get(0).inputText; locationPlace.location.address.street = dataFieldsModel.get(1).inputText; locationPlace.location.address.district = dataFieldsModel.get(2).inputText; locationPlace.location.address.city = dataFieldsModel.get(3).inputText; locationPlace.location.address.county = dataFieldsModel.get(4).inputText; locationPlace.location.address.state = dataFieldsModel.get(5).inputText; locationPlace.location.address.countryCode = dataFieldsModel.get(6).inputText; locationPlace.location.address.country = dataFieldsModel.get(7).inputText; locationPlace.location.address.postalCode = dataFieldsModel.get(8).inputText; var c = QtPositioning.coordinate(parseFloat(dataFieldsModel.get(9).inputText), parseFloat(dataFieldsModel.get(10).inputText)); locationPlace.location.coordinate = c; var phone = Qt.createQmlObject('import QtLocation 5.0; ContactDetail { }', locationPlace); phone.label = "Phone"; phone.value = dataFieldsModel.get(11).inputText; locationPlace.contactDetails.phone = phone; var fax = Qt.createQmlObject('import QtLocation 5.0; ContactDetail { }', locationPlace); fax.label = "Fax"; fax.value = dataFieldsModel.get(12).inputText; locationPlace.contactDetails.fax = fax; var email = Qt.createQmlObject('import QtLocation 5.0; ContactDetail { }', locationPlace); email.label = "Email"; email.value = dataFieldsModel.get(13).inputText; locationPlace.contactDetails.email = email; var website = Qt.createQmlObject('import QtLocation 5.0; ContactDetail { }', locationPlace); website.label = "Website"; website.value = dataFieldsModel.get(14).inputText; locationPlace.contactDetails.website = website; locationPlace.categories = __categories; locationPlace.statusChanged.connect(processStatus); locationPlace.save(); } onClearButtonClicked: { for (var i = 0; i < dataFieldsModel.count; i++) dataFieldsModel.set(i, {"inputText": ""}); __categories = new Array(); } onCancelButtonClicked: { if (locationPlace && __createdPlace) locationPlace.destroy(); } onOpacityChanged: { if (opacity == 0) view.currentIndex = 0 } ListModel { id: dataFieldsModel } item: ListView { id: view anchors.left: parent.left anchors.right: parent.right anchors.margins: 10 implicitHeight: flickable.contentHeight spacing: gap/2 orientation: ListView.Horizontal interactive: false model: VisualItemModel { Item { id: firstPage width: view.width height: view.height Flickable { id: flickable anchors.top: parent.top anchors.topMargin: gap/2 anchors.bottomMargin: gap/2 height: parent.height width: parent.width interactive: height < contentHeight contentWidth: parent.width contentHeight:col.height clip: true Column { id: col anchors.top: parent.top anchors.left: parent.left width: parent.width - gap spacing: gap/2 Repeater { id: dataFields model: dataFieldsModel TextWithLabel { anchors.leftMargin: gap/2 anchors.rightMargin: gap/2 width: parent ? parent.width : 0 labelWidth: 95 label: labelText text: inputText onTextChanged: dataFieldsModel.set(index, {"inputText": text}) } } Group { id: categoriesHeading width: parent.width anchors.topMargin: gap text: qsTr("Categories"); } Repeater { model: __categories width: parent.width delegate: Item { height: cross.height width: parent.width Text { id: categoryName anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter verticalAlignment: Text.AlignVCenter text: model.modelData.name } IconButton { id: cross anchors.top: parent.top anchors.right: parent.right source: "../../resources/cross.png" hoveredSource: "../../resources/cross_hovered.png" pressedSource: "../../resources/cross_pressed.png" onClicked: { var cats = new Array(); for (var i =0; i < __categories.length; ++i) { if (__categories[i].name != model.modelData.name) cats.push(__categories[i]); } __categories = cats } } } } Button { text: qsTr("Add Category") onClicked: view.currentIndex = 1 } } } Rectangle { id: scrollbar anchors.right: flickable.right y: { var yPosition = flickable.visibleArea.yPosition if (yPosition < 0) yPosition = 0 if (yPosition > (1.0 - flickable.visibleArea.heightRatio)) yPosition = (1.0 - flickable.visibleArea.heightRatio) yPosition *flickable.height } width: 10 height: flickable.visibleArea.heightRatio * flickable.height color: "gray" radius: 5 } } Item { height:view.height width: view.width Group { id: chooseCategoryHeading anchors.top: parent.top width: parent.width text: qsTr("Choose Category"); } CategoryView { id: categoryView anchors.top: chooseCategoryHeading.bottom anchors.bottom: categoryCancel.top width: parent.width showSave: false showRemove: false showChildren: false onCategoryClicked: { var categoriesList = new Array(); var alreadyExists = false; for (var i = 0; i < __categories.length; ++i) { categoriesList.push(__categories[i]); if (__categories[i].categoryId == category.categoryId) alreadyExists = true; } if (!alreadyExists) categoriesList.push(category); __categories = categoriesList view.currentIndex = 0; } } Button { id: categoryCancel anchors.bottom: parent.bottom text: qsTr("Cancel ") onClicked: view.currentIndex = 0 } } } } }