diff options
author | akashihi <akashihi@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2010-04-14 14:22:44 +0000 |
---|---|---|
committer | akashihi <akashihi@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2010-04-14 14:22:44 +0000 |
commit | b64139742425543a881455882a2bc25525c5ddd0 (patch) | |
tree | d07bee3e8926e8ecc7044e751eab41bcd703e35f | |
parent | 0e7ebd330c6936b1350c6513c87ab42d37e81ad3 (diff) | |
download | navit-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.h | 10 | ||||
-rw-r--r-- | navit/gui/qml/ngqpoint.h | 15 | ||||
-rw-r--r-- | navit/gui/qml/proxy.h | 8 | ||||
-rw-r--r-- | navit/gui/qml/searchProxy.h | 109 | ||||
-rw-r--r-- | navit/gui/qml/skins/navit/PageSearch.qml | 68 | ||||
-rw-r--r-- | navit/gui/qml/skins/navit/PageSearchSelector.qml | 115 |
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 } |