import QtQuick 2.0
import QtLocation 5.0
import QtLocation.examples 5.0
import "PlacesUtils.js" as PlacesUtils
Item {
id: placeDelegate
property Place place
property real distance
signal searchForSimilar(variant place)
signal showReviews(variant place)
signal showEditorials(variant place)
signal showImages(variant place)
signal editPlace(variant place)
signal deletePlace(variant place)
Flickable {
anchors.fill: parent
contentHeight: c.height
contentWidth: width
Column {
id: c
width: parent.width
spacing: 2
clip: true
Row {
width: parent.width
Image {
id: iconImage
width: 40
height: 40
source: place ? place.icon.url(Qt.size(40,40)) : ""
visible: source != ""
}
Text {
id: placeName
text: place ? place.name : ""
font.pixelSize: 16
font.bold: true
}
}
RatingView { rating: (place && place.ratings) ? place.ratings.average : 0 }
Group { text: qsTr("Address") }
Text { text: PlacesUtils.prettyDistance(distance) }
Text {
function placeAddress(place) {
if (!place)
return "";
if (place.location.address.text.length > 0)
return place.location.address.text;
return place.location.address.street;
}
text: placeAddress(place)
}
Group {
text: qsTr("Categories")
visible: place && place.categories.length > 0
}
Text {
function categoryNames(categories) {
var result = "";
for (var i = 0; i < categories.length; ++i) {
if (result == "") {
result = categories[i].name;
} else {
result = result + ", " + categories[i].name;
}
}
return result;
}
text: place ? categoryNames(place.categories) : ""
width: parent.width
wrapMode: Text.WordWrap
visible: place && place.categories.length > 0
}
Group {
text: qsTr("Contact details")
visible: phone.visible || fax.visible || email.visible || website.visible
}
Text {
id: phone
text: qsTr("Phone: ") + (place ? place.primaryPhone : "")
visible: place && place.primaryPhone.length > 0
}
Text {
id: fax
text: qsTr("Fax: ") + (place ? place.primaryFax : "")
visible: place && place.primaryFax.length > 0
}
Text {
id: email
text: place ? place.primaryEmail : ""
visible: place && place.primaryEmail.length > 0
}
Text {
id: website
text: place ? '<a href=\"' + place.primaryWebsite + '\">' + place.primaryWebsite + '</a>' : ""
visible: place && String(place.primaryWebsite).length > 0
onLinkActivated: Qt.openUrlExternally(place.primaryWebsite)
}
Group {
text: qsTr("Additional information")
visible: extendedAttributes.count > 0 && extendedAttributes.height > 0
}
Repeater {
id: extendedAttributes
model: place ? place.extendedAttributes.keys() : null
delegate: Text {
text: place.extendedAttributes[modelData] ?
place.extendedAttributes[modelData].label +
place.extendedAttributes[modelData].text : ""
visible: place.extendedAttributes[modelData] ? place.extendedAttributes[modelData].label.length > 0 : false
width: c.width
wrapMode: Text.WordWrap
}
}
Column {
id: buttons
anchors.horizontalCenter: parent.horizontalCenter
spacing: 5
Button {
text: qsTr("Editorials")
enabled: place && place.editorialModel.totalCount > 0
onClicked: showEditorials(place)
}
Button {
text: qsTr("Reviews")
enabled: place && place.reviewModel.totalCount > 0
onClicked: showReviews(place)
}
Button {
text: qsTr("Images")
enabled: place && place.imageModel.totalCount > 0
onClicked: showImages(place)
}
Button {
text: qsTr("Find similar")
onClicked: searchForSimilar(place)
}
Button {
text: qsTr("Edit")
visible: placesPlugin.name != "" ? placesPlugin.supportsPlaces(Plugin.SavePlaceFeature) : false;
onClicked: editPlace(place)
}
Button {
text: qsTr("Delete");
visible: placesPlugin.name != "" ? placesPlugin.supportsPlaces(Plugin.RemovePlaceFeature) : false;
onClicked: deletePlace(place)
}
Item {
width: parent.width
height: childrenRect.height
Button {
id: saveButton;
function updateSaveStatus() {
if (updateSaveStatus.prevStatus === Place.Saving) {
switch (place.favorite.status) {
case Place.Ready:
break;
case Place.Error:
saveStatus.text = "Save Failed";
saveStatus.visible = true;
console.log(place.favorite.errorString());
break;
default:
}
} else if (updateSaveStatus.prevStatus == Place.Removing) {
place.favorite = null;
updateSaveStatus.prevStatus = Place.Ready
return;
}
updateSaveStatus.prevStatus = place.favorite.status;
}
function reset()
{
saveButton.visible = (placesPlugin.name !== "nokia_places_jsondb")
&& (placeSearchModel.favoritesPlugin !== null);
saveStatus.visible = false;
}
Component.onCompleted: {
reset();
placeDelegate.placeChanged.connect(reset);
}
text: (place && place.favorite !== null) ? qsTr("Remove Favorite") : qsTr("Save as Favorite")
onClicked: {
if (place.favorite === null) {
place.initializeFavorite(placeSearchModel.favoritesPlugin);
place.favorite.statusChanged.connect(updateSaveStatus);
place.favorite.save();
} else {
place.favorite.statusChanged.connect(updateSaveStatus);
place.favorite.remove();
}
}
}
Text {
id: saveStatus
anchors.top: saveButton.bottom
visible: false
}
}
}
}
}
}