summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorakashihi <akashihi@ffa7fe5e-494d-0410-b361-a75ebd5db220>2010-04-14 14:22:44 +0000
committerakashihi <akashihi@ffa7fe5e-494d-0410-b361-a75ebd5db220>2010-04-14 14:22:44 +0000
commitb64139742425543a881455882a2bc25525c5ddd0 (patch)
treed07bee3e8926e8ecc7044e751eab41bcd703e35f
parent0e7ebd330c6936b1350c6513c87ab42d37e81ad3 (diff)
downloadnavit-b64139742425543a881455882a2bc25525c5ddd0.tar.gz
Add:gui/qml:Implemented Country-Town-Street search
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@3175 ffa7fe5e-494d-0410-b361-a75ebd5db220
-rw-r--r--navit/gui/qml/guiProxy.h10
-rw-r--r--navit/gui/qml/ngqpoint.h15
-rw-r--r--navit/gui/qml/proxy.h8
-rw-r--r--navit/gui/qml/searchProxy.h109
-rw-r--r--navit/gui/qml/skins/navit/PageSearch.qml68
-rw-r--r--navit/gui/qml/skins/navit/PageSearchSelector.qml115
6 files changed, 245 insertions, 80 deletions
diff --git a/navit/gui/qml/guiProxy.h b/navit/gui/qml/guiProxy.h
index 7b5b942e5..bc5f51639 100644
--- a/navit/gui/qml/guiProxy.h
+++ b/navit/gui/qml/guiProxy.h
@@ -35,6 +35,13 @@ public:
this->object->currentPoint = new NGQPoint(this->object,c,type,NULL);
this->object->guiWidget->rootContext()->setContextProperty("point",this->object->currentPoint);
}
+ void setNewPoint(struct pcoord* pc,NGQPointTypes type) {
+ if (this->object->currentPoint!=NULL) {
+ delete this->object->currentPoint;
+ }
+ this->object->currentPoint = new NGQPoint(this->object,pc,type,NULL);
+ this->object->guiWidget->rootContext()->setContextProperty("point",this->object->currentPoint);
+ }
void processCommand(QString function) {
this->function=function;
this->setPage("command.qml",true);
@@ -177,6 +184,9 @@ private:
void __setNewPoint(struct gui_priv* this_,struct coord* c, NGQPointTypes type) {
this_->guiProxy->setNewPoint(c,type);
}
+void __setNewPoint(struct gui_priv* this_,struct pcoord* pc, NGQPointTypes type) {
+ this_->guiProxy->setNewPoint(pc,type);
+}
#include "guiProxy.moc"
diff --git a/navit/gui/qml/ngqpoint.h b/navit/gui/qml/ngqpoint.h
index 36ff2a0b7..e7202000d 100644
--- a/navit/gui/qml/ngqpoint.h
+++ b/navit/gui/qml/ngqpoint.h
@@ -69,6 +69,21 @@ public:
this->coord=this->_coordString();
}
+ NGQPoint(struct gui_priv* this_,struct pcoord* pc,NGQPointTypes type=Bookmark,QObject *parent=NULL) : QObject(parent) {
+ this->object=this_;
+ this->item.map=0;
+ this->c.pro = pc->pro;
+ this->c.x = pc->x;
+ this->c.y = pc->y;
+ this->co.x=pc->x;
+ this->co.y=pc->y;
+ transform_to_geo(this->c.pro, &co, &g);
+ this->type=type;
+
+ this->name=this->_coordName();
+ this->coord=this->_coordString();
+ }
+
NGQPoint(struct gui_priv* this_,struct coord* c,QString name,NGQPointTypes type=Bookmark,QObject *parent=NULL) : QObject(parent) {
this->object=this_;
this->item.map=0;
diff --git a/navit/gui/qml/proxy.h b/navit/gui/qml/proxy.h
index 51e415da2..60d73d3ea 100644
--- a/navit/gui/qml/proxy.h
+++ b/navit/gui/qml/proxy.h
@@ -85,6 +85,14 @@ protected:
virtual int getAttrFunc(enum attr_type type, struct attr *attr, struct attr_iter *iter)=0;
virtual struct attr_iter* getIterFunc() { return NULL; };
virtual void dropIterFunc(struct attr_iter*) { return; };
+
+ QDomElement _fieldValueHelper(QDomDocument doc, QString field,QString value) {
+ QDomElement fieldTag=doc.createElement(field);
+ QDomText valueText=doc.createTextNode(value);
+ fieldTag.appendChild(valueText);
+ return fieldTag;
+ }
+
};
#include "proxy.moc"
diff --git a/navit/gui/qml/searchProxy.h b/navit/gui/qml/searchProxy.h
index b82004def..77d71fa15 100644
--- a/navit/gui/qml/searchProxy.h
+++ b/navit/gui/qml/searchProxy.h
@@ -1,14 +1,18 @@
#ifndef NAVIT_GUI_QML_SEARCHPROXY_H
#define NAVIT_GUI_QML_SEARCHPROXY_H
+void __setNewPoint(struct gui_priv* this_,struct pcoord* pc, NGQPointTypes type);
+
class NGQProxySearch : public NGQProxy {
Q_OBJECT;
Q_PROPERTY(QString countryName READ countryName WRITE setCountryName NOTIFY countryNameSignal);
Q_PROPERTY(QString countryISO2 READ countryISO2 WRITE setCountryISO2 NOTIFY countryISO2Signal);
Q_PROPERTY(QString townName READ townName WRITE setTownName NOTIFY townNameSignal);
+ Q_PROPERTY(QString streetName READ streetName WRITE setStreetName NOTIFY streetNameSignal);
Q_PROPERTY(QString searchContext READ searchContext WRITE setSearchContext);
+ Q_PROPERTY(QString searchXml READ searchXml NOTIFY searchXmlSignal);
public:
NGQProxySearch(struct gui_priv* this_,QObject* parent) : NGQProxy(this_,parent) {
@@ -20,7 +24,6 @@ public:
this->sl=search_list_new(navit_get_mapset(this->object->nav));
this->search_context="country";
- this->town_name="Select a town";
country_attr=country_default();
tracking=navit_get_tracking(this->object->nav);
@@ -60,70 +63,87 @@ signals:
void countryNameSignal(QString);
void countryISO2Signal(QString);
void townNameSignal(QString);
+ void streetNameSignal(QString);
+ void searchXmlSignal(QString);
public slots:
- QString getAttrList(const QString &attr_name) {
+ void setPointToResult() {
+ struct attr attr;
+ struct search_list_result *res;
+
+ if (this->street_name.length()>0) {
+ attr.type=attr_street_name;
+ attr.u.str=this->street_name.toLocal8Bit().data();
+ } else if (this->town_name.length()>0) {
+ attr.type=attr_town_or_district_name;
+ attr.u.str=this->town_name.toLocal8Bit().data();
+ } else if (this->country_name.length()>0) {
+ attr.type=attr_country_name;
+ attr.u.str=this->country_name.toLocal8Bit().data();
+ }
+ search_list_search(this->sl,&attr,0);
+ if (res=search_list_get_result(this->sl)) {
+ __setNewPoint(this->object,res->c,PointOfInterest);
+ }
+ return;
+ }
+ QString searchXml() {
NGQStandardItemModel* ret=new NGQStandardItemModel(this);
struct attr attr;
struct search_list_result *res;
int counter=0;
- QString currentValue, retId;
+ QDomDocument retDoc;
+ QDomElement entries;
+
+ entries=retDoc.createElement("search");
+ retDoc.appendChild(entries);
if (this->search_context=="country") {
- currentValue=this->country_name;
attr.type=attr_country_name;
- attr.u.str="";
+ attr.u.str=this->country_name.toLocal8Bit().data();
}
if (this->search_context=="town") {
- currentValue=this->town_name;
+ if (this->town_name.length()<3) {
+ return retDoc.toString();
+ }
attr.type=attr_town_or_district_name;
- attr.u.str="";
+ attr.u.str=this->town_name.toLocal8Bit().data();
}
if (this->search_context=="street") {
- currentValue=this->street_name;
attr.type=attr_street_name;
- attr.u.str="";
+ attr.u.str=this->street_name.toLocal8Bit().data();
}
search_list_search(this->sl,&attr,1);
while ((res=search_list_get_result(this->sl))) {
QStandardItem* curItem=new QStandardItem();
+ QDomElement entry=retDoc.createElement("item");
+ entries.appendChild(entry);
//Result processing depends on search type
if (this->search_context=="country") {
- curItem->setData(QVariant(counter),NGQStandardItemModel::ItemId);
- curItem->setData(QString::fromLocal8Bit(res->country->name),NGQStandardItemModel::ItemName);
- curItem->setData(QString("country_%1%2").arg(res->country->iso2).arg(".svgz"),NGQStandardItemModel::ItemIcon);
- if (this->country_name==QString::fromLocal8Bit(res->country->name)) {
- retId.setNum(counter);
- }
+ entry.appendChild(this->_fieldValueHelper(retDoc,QString("id"), QString::number(counter)));
+ entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"), QString::fromLocal8Bit(res->country->name)));
+ entry.appendChild(this->_fieldValueHelper(retDoc,QString("icon"), QString("country_%1%2").arg(res->country->iso2).arg(".svgz")));
}
if (this->search_context=="town") {
- curItem->setData(QVariant(counter),NGQStandardItemModel::ItemId);
+ entry.appendChild(this->_fieldValueHelper(retDoc,QString("id"), QString::number(counter)));
if (res->town->common.town_name) {
- curItem->setData(QString::fromLocal8Bit(res->town->common.town_name),NGQStandardItemModel::ItemName);
+ entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"),QString::fromLocal8Bit(res->town->common.town_name)));
}
if (res->town->common.district_name) {
- curItem->setData(QString::fromLocal8Bit(res->town->common.district_name),NGQStandardItemModel::ItemName);
+ entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"), QString::fromLocal8Bit(res->town->common.district_name)));
}
- if (this->town_name==QString::fromLocal8Bit(res->town->common.town_name) || this->town_name==QString::fromLocal8Bit(res->town->common.district_name)) {
- retId.setNum(counter);
- }
}
if (this->search_context=="street") {
- curItem->setData(QVariant(counter),NGQStandardItemModel::ItemId);
- curItem->setData(QString::fromLocal8Bit(res->street->name),NGQStandardItemModel::ItemName);
- if (this->street_name==QString::fromLocal8Bit(res->street->name)) {
- retId.setNum(counter);
- }
+ entry.appendChild(this->_fieldValueHelper(retDoc,QString("id"), QString::number(counter)));
+ entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"),QString::fromLocal8Bit(res->street->name)));
}
counter++;
ret->appendRow(curItem);
}
- this->object->guiWidget->rootContext()->setContextProperty("listModel",static_cast<QObject*>(ret));
-
- return retId;
+ return retDoc.toString();
}
QString countryName() {
return this->country_name;
@@ -141,7 +161,11 @@ public slots:
this->setCountryISO2(QString::fromLocal8Bit(res->country->iso2));
}
//...and current town
- this->town_name="Select a town";
+ this->town_name="";
+ this->street_name="";
+
+ //...and a list
+ searchXmlSignal(this->searchXml());
countryNameSignal(countryName);
}
@@ -165,9 +189,34 @@ public slots:
attr.type=attr_town_or_district_name;
attr.u.str=townName.toLocal8Bit().data();
search_list_search(this->sl,&attr,0);
+
+ //...and street
+ this->street_name="";
+
+ //...and a list
+ searchXmlSignal(this->searchXml());
townNameSignal(townName);
}
+ QString streetName() {
+ return this->street_name;
+ }
+ void setStreetName(QString streetName) {
+ struct attr attr;
+ struct search_list_result *res;
+
+ this->street_name=streetName;
+
+ //Specialize search
+ attr.type=attr_street_name;
+ attr.u.str=streetName.toLocal8Bit().data();
+ search_list_search(this->sl,&attr,0);
+
+ //...and a list
+ searchXmlSignal(this->searchXml());
+
+ streetNameSignal(streetName);
+ }
QString searchContext() {
return this->search_context;
}
diff --git a/navit/gui/qml/skins/navit/PageSearch.qml b/navit/gui/qml/skins/navit/PageSearch.qml
index 1050936f1..90c9cefb4 100644
--- a/navit/gui/qml/skins/navit/PageSearch.qml
+++ b/navit/gui/qml/skins/navit/PageSearch.qml
@@ -8,6 +8,15 @@ Rectangle {
opacity: 0
function pageOpen() {
+ if ( search.countryName.length>0 ) {
+ gridCity.opacity = 1;
+ }
+ if ( search.townName.length>0 ) {
+ gridStreet.opacity = 1;
+ }
+ if ( search.streetName.length>0 ) {
+ gridAddress.opacity = 0; //Disabled ,because housenamuber search is broken
+ }
page.opacity = 1;
}
@@ -22,12 +31,29 @@ Rectangle {
anchors.horizontalCenter: parent.horizontalCenter;
anchors.bottom: parent.verticalCenter; anchors.bottomMargin: gui.height/16;
spacing: gui.width/12
- ButtonIcon {
- id: btnCountry; text: search.countryName; icon: "country_"+search.countryISO2+".svgz"; onClicked: { search.searchContext="country"; gui.setPage("PageSearchSelector.qml"); }
- }
- ButtonIcon {
- id: btnCity; text: search.townName; icon: "gui_bookmark.svg"; onClicked: { search.searchContext="town"; gui.setPage("PageSearchSelector.qml"); }
- }
+ Grid {
+ columns: 1;rows: 2;
+ id: gridCountry;
+ Text {
+ id: txtItemCountry; text: "Country";
+ color: "White"; font.pointSize: gui.height/32; horizontalAlignment: Qt.AlignHCenter
+ }
+ ButtonIcon {
+ id: btnCountry; text: search.countryName; icon: "country_"+search.countryISO2+".svgz"; onClicked: { search.searchContext="country"; gui.setPage("PageSearchSelector.qml"); }
+ }
+ }
+ Grid {
+ columns: 1; rows: 2;
+ id: gridCity
+ opacity: 0;
+ Text {
+ id: txtItemCity; text: "Town";
+ color: "White"; font.pointSize: gui.height/32; horizontalAlignment: Qt.AlignHCenter
+ }
+ ButtonIcon {
+ id: btnCity; text: search.townName; icon: "gui_bookmark.svg"; onClicked: { search.searchContext="town"; gui.setPage("PageSearchSelector.qml"); }
+ }
+ }
}
Grid {
@@ -35,12 +61,30 @@ Rectangle {
anchors.horizontalCenter: parent.horizontalCenter;
anchors.top: parent.verticalCenter; anchors.topMargin: gui.height/16;
spacing: gui.width/12
- ButtonIcon {
- id: btnStreet; text: "Street"; icon: "gui_town.svg"; onClicked: { search.searchContext="street"; gui.setPage("PageSearchSelector.qml"); }
- }
- ButtonIcon {
- id: btnAddress; text: "Address"; icon: "attraction.svg"; onClicked: console.log("Implement me!");
- }
+ Grid {
+ columns: 1; rows: 2;
+ id: gridStreet
+ opacity: 0;
+ Text {
+ id: txtItemStreet; text: "Street";
+ color: "White"; font.pointSize: gui.height/32; horizontalAlignment: Qt.AlignHCenter
+ }
+ ButtonIcon {
+ id: btnStreet; text: search.streetName; icon: "gui_town.svg"; onClicked: { search.searchContext="street"; gui.setPage("PageSearchSelector.qml"); }
+ }
+ }
+ Grid {
+ columns: 1; rows: 2;
+ id: gridAddress;
+ opacity: 0;
+ Text {
+ id: txtItemAddress; text: "Address";
+ color: "White"; font.pointSize: gui.height/32; horizontalAlignment: Qt.AlignHCenter
+ }
+ ButtonIcon {
+ id: btnAddress; text: "Address"; icon: "attraction.svg"; onClicked: console.log("Implement me!");
+ }
+ }
}
Cellar {anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width }
diff --git a/navit/gui/qml/skins/navit/PageSearchSelector.qml b/navit/gui/qml/skins/navit/PageSearchSelector.qml
index 949ecaea1..115934e03 100644
--- a/navit/gui/qml/skins/navit/PageSearchSelector.qml
+++ b/navit/gui/qml/skins/navit/PageSearchSelector.qml
@@ -2,60 +2,99 @@
import Qt 4.6
Rectangle {
- id: page
+ id: page
- width: gui.width; height: gui.height
- color: "Black"
- opacity: 0
+ width: gui.width; height: gui.height
+ color: "Black"
+ opacity: 0
- function setSearchResult() {
- if (search.searchContext=="country") {
- search.countryName=layoutList.value;
- gui.backToPrevPage();
- }
- if (search.searchContext=="town") {
- search.townName=layoutList.value;
- gui.backToPrevPage();
- }
- }
+ function setSearchResult(listValue) {
+ if (search.searchContext=="country") {
+ search.countryName=listValue;
+ gui.backToPrevPage();
+ }
+ if (search.searchContext=="town") {
+ search.townName=listValue;
+ gui.backToPrevPage();
+ }
+ if (search.searchContext=="street") {
+ search.streetName=listValue;
+ search.setPointToResult();
+ gui.setPage("PageNavigate.qml");
+ }
+ }
- function pageOpen() {
- page.opacity = 1;
- }
+ function pageOpen() {
+ if (search.searchContext=="country") {
+ searchTxt.text=search.countryName;
+ countryBinding.when=true;
+ }
+ if (search.searchContext=="town") {
+ searchTxt.text=search.townName;
+ townBinding.when=true;
+ }
+ if (search.searchContext=="street") {
+ searchTxt.text=search.streetName;
+ streetBinding.when=true;
+ }
+ page.opacity = 1;
+ }
- Component.onCompleted: pageOpen();
+ Component.onCompleted: pageOpen();
- opacity: Behavior {
- NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true }
- }
+ opacity: Behavior {
+ NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true }
+ }
- TextInput{
- id: searchTxt; text: search.countryName;
- anchors.top: parent.top; anchors.left: parent.left; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32
- width: page.width; font.pointSize: 14; color: "White";focus: true; readOnly: false
- }
+ TextInput{
+ id: searchTxt;
+ anchors.top: parent.top; anchors.left: parent.left; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32
+ width: page.width; font.pointSize: 14; color: "White";focus: true; readOnly: false; cursorVisible: true;
+ }
+ Binding {id: countryBinding; target: search; property: "countryName"; value: searchTxt.text; when: false}
+ Binding {id: townBinding; target: search; property: "townName"; value: searchTxt.text; when: false}
+ Binding {id: streetBinding; target: search; property: "streetName"; value: searchTxt.text; when: false}
+
+ XmlListModel {
+ id: listModel
+ xml: search.searchXml;
+ query: "/search/item"
+ XmlRole { name: "itemId"; query: "id/string()" }
+ XmlRole { name: "itemName"; query: "name/string()" }
+ XmlRole { name: "itemIcon"; query: "icon/string()" }
+ }
Component {
id: listDelegate
Item {
id: wrapper
width: list.width; height: 20
- Column {
- x: 5; y: 5
- Text { id: txtItemName; text: itemName; color: "White" }
- Text { id: txtItemDist; text: itemDistance; color: "White"; anchors.leftMargin: 5; anchors.left: txtItemName.right;anchors.top: txtItemName.top }
- Text { id: txtItemDirect; text: itemDirection; color: "White"; anchors.leftMargin: 5; anchors.left: txtItemDist.right;anchors.top: txtItemDist.top }
- }
- MouseRegion {
- id:delegateMouse
- anchors.fill: parent
- onClicked: { list.currentIndex=itemId; listselector.value=itemValue; listselector.changed() }
+ Image {
+ id: imgIcon; source: gui.iconPath+itemIcon
+ width: 20; height: 20;
+ }
+ Text {
+ id: txtItemName; text: itemName; color: "White";
+ anchors.left: imgIcon.right;anchors.leftMargin: 5
+ width: list.width-imgIcon.width
+ }
+ MouseRegion {
+ id:delegateMouse
+ anchors.fill: parent
+ onClicked: { setSearchResult(itemName); }
}
}
}
-CommonHighlight { id: listHighlight}
+
+ Component {
+ id: listHighlight
+ Rectangle {
+ opacity: 0
+ }
+ }
+
ListSelector {
- id:layoutList; text: search.searchContext; itemId: search.getAttrList(search.searchContext); onChanged: setSearchResult()
+ id:layoutList; text: search.searchContext; onChanged: setSearchResult()
anchors.top: searchTxt.bottom; anchors.left: parent.left; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32
width: page.width; height: page.height/2-cellar.height
}