class NGQProxyBookmarks : public NGQProxy {
Q_OBJECT;
+
+ Q_PROPERTY(QString currentPath READ currentPath WRITE setCurrentPath);
public:
NGQProxyBookmarks(struct gui_priv* object, QObject* parent) : NGQProxy(object,parent) { };
public slots:
+ QString currentPath() {
+ return this->current_path;
+ }
+ void setCurrentPath(QString currentPath) {
+ this->current_path=currentPath;
+ }
+ QString getAttrList(const QString &attr_name) {
+ NGQStandardItemModel* ret=new NGQStandardItemModel(this);
+ struct attr attr;
+ struct item* item;
+ struct map_rect *mr=NULL;
+
+ navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL);
+ mr=map_rect_new(bookmarks_get_map(attr.u.bookmarks), NULL);
+ if (!mr) {
+ return QString();
+ }
+
+ if (!this->current_path.isEmpty()) {
+ QStandardItem* curItem=new QStandardItem();
+ QStringList returnPath=this->current_path.split("/",QString::SkipEmptyParts);
+
+ curItem->setData("..",NGQStandardItemModel::ItemName);
+ curItem->setData("yes",NGQStandardItemModel::ItemIcon);
+
+ if (returnPath.size()>1) {
+ returnPath.removeLast();
+ curItem->setData(returnPath.join("/"),NGQStandardItemModel::ItemPath);
+ } else {
+ //Fast way
+ curItem->setData(QString(),NGQStandardItemModel::ItemPath);
+ }
+
+ ret->appendRow(curItem);
+ }
+ while ((item=map_rect_get_item(mr))) {
+ QStandardItem* curItem=new QStandardItem();
+ QString label;
+ QStringList labelList;
+
+ if (item->type != type_bookmark) continue;
+ if (!item_attr_get(item, attr_label, &attr)) continue;
+ //We need to treeize output
+ label=QString::fromLocal8Bit(attr.u.str);
+ curItem->setData(label,NGQStandardItemModel::ItemId);
+ if (!label.startsWith(this->current_path)) continue;
+ label=label.right(label.length()-this->current_path.length());
+ labelList=label.split("/",QString::SkipEmptyParts);
+ curItem->setData(labelList[0],NGQStandardItemModel::ItemName);
+ curItem->setData(QString(this->current_path).append(labelList[0]).append("/"),NGQStandardItemModel::ItemPath);
+ if (labelList.size()>1) {
+ curItem->setData("yes",NGQStandardItemModel::ItemIcon);
+ } else {
+ curItem->setData("no",NGQStandardItemModel::ItemIcon);
+ }
+
+ ret->appendRow(curItem);
+ }
+
+ this->object->guiWidget->rootContext()->setContextProperty("listModel",static_cast<QObject*>(ret));
+
+ return QString();
+ }
QString AddBookmark(QString description) {
struct attr attr;
navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL);
return "Success";
}
}
+ void setPoint(QString bookmark) {
+ struct attr attr;
+ struct item* item;
+ struct coord c;
+ struct map_rect *mr=NULL;
+
+ navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL);
+ mr=map_rect_new(bookmarks_get_map(attr.u.bookmarks), NULL);
+ if (!mr) {
+ return;
+ }
+
+ while ((item=map_rect_get_item(mr))) {
+ QString label;
+
+ if (item->type != type_bookmark) continue;
+ if (!item_attr_get(item, attr_label, &attr)) continue;
+
+ label=QString::fromLocal8Bit(attr.u.str);
+ dbg(0,"Bookmark is %s\n",bookmark.toStdString().c_str());
+ if (label.compare(bookmark)) continue;
+ item_coord_get(item, &c, 1);
+ if (this->object->currentPoint!=NULL) {
+ delete this->object->currentPoint;
+ }
+ this->object->currentPoint=new NGQPoint(this->object,&c,bookmark,Bookmark,NULL);
+ this->object->guiWidget->rootContext()->setContextProperty("point",this->object->currentPoint);
+ }
+
+ return;
+ }
protected:
int getAttrFunc(enum attr_type type, struct attr* attr, struct attr_iter* iter) { return 0; }
void dropIterFunc(struct attr_iter* iter) { return; };
private:
-
+ QString current_path;
};
class NGQProxyNavit : public NGQProxy {
#ifndef NAVIT_GUI_QML_POINT_H
#define NAVIT_GUI_QML_POINT_H
-enum NGQPointTypes {MapPoint};
+enum NGQPointTypes {MapPoint,Bookmark};
class NGQPoint : public QObject {
Q_OBJECT;
- /*Q_PROPERTY(QString type READ type CONSTANT);*/
-
Q_PROPERTY(QString coordString READ coordString CONSTANT);
Q_PROPERTY(QString pointName READ pointName CONSTANT);
Q_PROPERTY(QString py READ py CONSTANT);
- /*Q_PROPERTY(QString cx READ cx CONSTANT);
- Q_PROPERTY(QString cy READ cy CONSTANT);*/
public:
NGQPoint(struct gui_priv* this_,struct point* p,NGQPointTypes type=MapPoint,QObject *parent=NULL) : QObject(parent) {
this->object=this_;
this->p.x=p->x;
this->p.y=p->y;
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->co.x=c->x;
+ this->co.y=c->y;
+ transform_to_geo(transform_get_projection(navit_get_trans(this->object->nav)), &co, &g);
+ this->c.pro = transform_get_projection(navit_get_trans(this->object->nav));
+ this->c.x = c->x;
+ this->c.y = c->y;
+ this->type=type;
+
+ this->name=name;
+ this->coord=this->_coordString();
}
struct pcoord* pc() { return &c; }
public slots:
- QString coordString() {
- char latc='N',lngc='E';
- int lat_deg,lat_min,lat_sec;
- int lng_deg,lng_min,lng_sec;
- struct coord_geo g=this->g;
-
- if (g.lat < 0) {
- g.lat=-g.lat;
- latc='S';
- }
- if (g.lng < 0) {
- g.lng=-g.lng;
- lngc='W';
- }
- lat_deg=g.lat;
- lat_min=fmod(g.lat*60,60);
- lat_sec=fmod(g.lat*3600,60);
- lng_deg=g.lng;
- lng_min=fmod(g.lng*60,60);
- lng_sec=fmod(g.lng*3600,60);
- return QString(QString::fromLocal8Bit("%1°%2'%3\" %4%5%6°%7'%8\" %9")).arg(lat_deg).arg(lat_min).arg(lat_sec).arg(latc).arg(' ').arg(lng_deg).arg(lng_min).arg(lng_sec).arg(lngc);
- }
- QString pointName() {
- int dist=10;
- struct mapset *ms;
- struct mapset_handle *h;
- struct map_rect *mr;
- struct map *m;
- struct item *item;
- struct street_data *data;
- struct map_selection sel;
- struct transformation *trans;
- enum projection pro;
- struct attr attr;
- char *label;
- QString ret;
-
- trans=navit_get_trans(this->object->nav);
- pro=transform_get_projection(trans);
- transform_from_geo(pro, &g, &co);
- ms=navit_get_mapset(this->object->nav);
- sel.next=NULL;
- sel.u.c_rect.lu.x=c.x-dist;
- sel.u.c_rect.lu.y=c.y+dist;
- sel.u.c_rect.rl.x=c.x+dist;
- sel.u.c_rect.rl.y=c.y-dist;
- sel.order=18;
- sel.range=item_range_all;
- h=mapset_open(ms);
- while ((m=mapset_next(h,1))) {
- mr=map_rect_new(m, &sel);
- if (! mr)
- continue;
- while ((item=map_rect_get_item(mr))) {
- data=street_get_data(item);
- if (transform_within_dist_item(&co, item->type, data->c, data->count, dist)) {
- if (item_attr_get(item, attr_label, &attr)) {
- label=map_convert_string(m, attr.u.str);
- if (QString(item_to_name(item->type)).startsWith(QString("poi_"))) {
- ret=QString::fromLocal8Bit(item_to_name(item->type));
- ret=ret.remove(QString("poi_"));
- ret+=QString(" ")+QString::fromLocal8Bit(label);
- map_convert_free(label);
- street_data_free(data);
- map_rect_destroy(mr);
- mapset_close(h);
- return ret;
- }
- if (QString(item_to_name(item->type)).startsWith(QString("poly_"))) {
- ret=QString::fromLocal8Bit(item_to_name(item->type));
- ret=ret.remove(QString("poly_"));
- ret+=QString(" ")+QString::fromLocal8Bit(label);
- map_convert_free(label);
- street_data_free(data);
- map_rect_destroy(mr);
- mapset_close(h);
- return ret;
- }
- if (QString(item_to_name(item->type)).startsWith(QString("street_"))) {
- ret="Street ";
- ret+=QString::fromLocal8Bit(label);
- map_convert_free(label);
- street_data_free(data);
- map_rect_destroy(mr);
- mapset_close(h);
- return ret;
- }
- map_convert_free(label);
- } else
- ret=item_to_name(item->type);
- }
- street_data_free(data);
- }
- map_rect_destroy(mr);
- }
- mapset_close(h);
- return ret;
- }
+ QString pointName() {
+ return this->name;
+ }
+ QString coordString() {
+ return this->coord;
+ }
QString px() {
char buffer[1024];
coord_format(this->g.lat,this->g.lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer));
}
QString py() { return QString().setNum(p.y); }
protected:
+ QString _coordString() {
+ char latc='N',lngc='E';
+ int lat_deg,lat_min,lat_sec;
+ int lng_deg,lng_min,lng_sec;
+ struct coord_geo g=this->g;
+
+ if (g.lat < 0) {
+ g.lat=-g.lat;
+ latc='S';
+ }
+ if (g.lng < 0) {
+ g.lng=-g.lng;
+ lngc='W';
+ }
+ lat_deg=g.lat;
+ lat_min=fmod(g.lat*60,60);
+ lat_sec=fmod(g.lat*3600,60);
+ lng_deg=g.lng;
+ lng_min=fmod(g.lng*60,60);
+ lng_sec=fmod(g.lng*3600,60);
+ return QString(QString::fromLocal8Bit("%1°%2'%3\" %4%5%6°%7'%8\" %9")).arg(lat_deg).arg(lat_min).arg(lat_sec).arg(latc).arg(' ').arg(lng_deg).arg(lng_min).arg(lng_sec).arg(lngc);
+ }
+ QString _coordName() {
+ int dist=10;
+ struct mapset *ms;
+ struct mapset_handle *h;
+ struct map_rect *mr;
+ struct map *m;
+ struct item *item;
+ struct street_data *data;
+ struct map_selection sel;
+ struct transformation *trans;
+ enum projection pro;
+ struct attr attr;
+ char *label;
+ QString ret;
+
+ trans=navit_get_trans(this->object->nav);
+ pro=transform_get_projection(trans);
+ transform_from_geo(pro, &g, &co);
+ ms=navit_get_mapset(this->object->nav);
+ sel.next=NULL;
+ sel.u.c_rect.lu.x=c.x-dist;
+ sel.u.c_rect.lu.y=c.y+dist;
+ sel.u.c_rect.rl.x=c.x+dist;
+ sel.u.c_rect.rl.y=c.y-dist;
+ sel.order=18;
+ sel.range=item_range_all;
+ h=mapset_open(ms);
+ while ((m=mapset_next(h,1))) {
+ mr=map_rect_new(m, &sel);
+ if (! mr)
+ continue;
+ while ((item=map_rect_get_item(mr))) {
+ data=street_get_data(item);
+ if (transform_within_dist_item(&co, item->type, data->c, data->count, dist)) {
+ if (item_attr_get(item, attr_label, &attr)) {
+ label=map_convert_string(m, attr.u.str);
+ if (QString(item_to_name(item->type)).startsWith(QString("poi_"))) {
+ ret=QString::fromLocal8Bit(item_to_name(item->type));
+ ret=ret.remove(QString("poi_"));
+ ret+=QString(" ")+QString::fromLocal8Bit(label);
+ map_convert_free(label);
+ street_data_free(data);
+ map_rect_destroy(mr);
+ mapset_close(h);
+ return ret;
+ }
+ if (QString(item_to_name(item->type)).startsWith(QString("poly_"))) {
+ ret=QString::fromLocal8Bit(item_to_name(item->type));
+ ret=ret.remove(QString("poly_"));
+ ret+=QString(" ")+QString::fromLocal8Bit(label);
+ map_convert_free(label);
+ street_data_free(data);
+ map_rect_destroy(mr);
+ mapset_close(h);
+ return ret;
+ }
+ if (QString(item_to_name(item->type)).startsWith(QString("street_"))) {
+ ret="Street ";
+ ret+=QString::fromLocal8Bit(label);
+ map_convert_free(label);
+ street_data_free(data);
+ map_rect_destroy(mr);
+ mapset_close(h);
+ return ret;
+ }
+ map_convert_free(label);
+ } else
+ ret=item_to_name(item->type);
+ }
+ street_data_free(data);
+ }
+ map_rect_destroy(mr);
+ }
+ mapset_close(h);
+ return ret;
+ }
private:
struct gui_priv* object;
NGQPointTypes type;
- struct coord_geo g;
- struct coord co;
+ struct coord_geo g;
+ struct coord co;
struct pcoord c;
struct point p;
+
+ QString name;
+ QString coord;
};
#include "ngqpoint.moc"
--- /dev/null
+import Qt 4.6
+
+Rectangle {
+ id: page
+
+ width: gui.width; height: gui.height
+ color: "Black"
+ opacity: 0
+
+ function bookmarkClick(itemId,itemIcon,itemName,itemPath) {
+ if ( itemIcon=="yes" ) {
+ bookmarks.currentPath=itemPath;
+ bookmarks.getAttrList("");
+ } else {
+ bookmarks.setPoint(itemId);
+ gui.setPage("point.qml");
+ }
+ }
+
+ function pageOpen() {
+ page.opacity = 1;
+ }
+
+ Component.onCompleted: pageOpen();
+
+ opacity: Behavior {
+ NumberAnimation { id: opacityAnimation; duration: 300; alwaysRunToEnd: true }
+ }
+
+ Rectangle {
+ color: "Black"
+
+ id:layoutList
+ anchors.top: parent.top; anchors.left: parent.left; anchors.topMargin: gui.height/16; anchors.leftMargin: gui.width/32
+ width: page.width; height: page.height/2-cellar.height
+
+ Component {
+ id: delegate
+ Item {
+ id: wrapper
+ width: list.width; height: 20
+ Column {
+ x: 5; y: 5
+ Text { text: itemName; color: "White" }
+ }
+ MouseRegion {
+ id:delegateMouse
+ anchors.fill: parent
+ onClicked: bookmarkClick(itemId,itemIcon,itemName,itemPath);
+ }
+ }
+ }
+
+ Component {
+ id: highlight
+ Rectangle {
+ color: "lightsteelblue"
+ radius: 5
+ }
+ }
+
+ Text {
+ id: labelTxt; text: "Bookmarks"; color: "White"; font.pointSize: 14;
+ anchors.horizontalCenter: list.horizontalCenter
+ anchors.verticalCenter: layoutList.top
+ }
+
+ ListView {
+ id: list;
+ width: layoutList.width*0.8; height: layoutList.height
+ anchors.top: labelTxt.bottom;
+ anchors.left: layoutList.left
+ model: listModel
+ delegate: delegate
+ highlight: highlight
+ focus: true
+ clip: true
+ highlightFollowsCurrentItem: true
+ keyNavigationWraps: true
+ overShoot: false
+ currentIndex: bookmarks.getAttrList("");
+ }
+ Rectangle {
+ id: listScroller
+ opacity: 0.5; anchors.left: list.right; anchors.leftMargin: 4; width: 6
+ y: (list.visibleArea.yPosition * list.height)+(list.visibleArea.heightRatio * list.height/4)
+ height: list.visibleArea.heightRatio * list.height
+ }
+ }
+
+ Cellar {id: cellar; anchors.bottom: page.bottom; anchors.horizontalCenter: page.horizontalCenter; width: page.width }
+}