summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorViktor Verebelyi <vviktor2@gmail.com>2020-09-22 02:07:38 +0100
committerViktor Verebelyi <vviktor2@gmail.com>2020-09-22 02:16:58 +0100
commit8c951dffb4ca091498bc336119c1a0ede167f2c7 (patch)
treeef8cd2f9427a2073aff61e4ac18e9fd308f45f81
parent7ebdb31ab9cc76e02b5e6104a17aa0be4d6d1bb3 (diff)
downloadnavit-8c951dffb4ca091498bc336119c1a0ede167f2c7.tar.gz
Add:qt5_gui:Levy add Layers, Layout, Maps and Vehicle models and menu options
-rw-r--r--navit/gui/qt5_qml/CMakeLists.txt4
-rw-r--r--navit/gui/qt5_qml/gui_qt5_qml.cpp8
-rw-r--r--navit/gui/qt5_qml/navitlayersmodel.cpp110
-rw-r--r--navit/gui/qt5_qml/navitlayersmodel.h44
-rw-r--r--navit/gui/qt5_qml/navitlayoutsmodel.cpp97
-rw-r--r--navit/gui/qt5_qml/navitlayoutsmodel.h65
-rw-r--r--navit/gui/qt5_qml/navitmapsmodel.cpp133
-rw-r--r--navit/gui/qt5_qml/navitmapsmodel.h63
-rw-r--r--navit/gui/qt5_qml/navitsearchmodel.h2
-rw-r--r--navit/gui/qt5_qml/navitvehiclesmodel.cpp99
-rw-r--r--navit/gui/qt5_qml/navitvehiclesmodel.h61
-rw-r--r--navit/gui/qt5_qml/themes/Levy/MainLayout.qml4
-rw-r--r--navit/gui/qt5_qml/themes/Levy/MenuDrawer.qml103
13 files changed, 782 insertions, 11 deletions
diff --git a/navit/gui/qt5_qml/CMakeLists.txt b/navit/gui/qt5_qml/CMakeLists.txt
index 07e996ad5..bb5fbb9bc 100644
--- a/navit/gui/qt5_qml/CMakeLists.txt
+++ b/navit/gui/qt5_qml/CMakeLists.txt
@@ -6,5 +6,7 @@ set(CMAKE_AUTOMOC ON)
qt5_add_resources(GUI_QT5_QML_QRC "gui_qt5_qml.qrc")
module_add_library(gui_qt5_qml gui_qt5_qml.cpp ${GUI_QT5_QML_QRC}
- navitpoimodel.cpp navitrecentsmodel.cpp navitfavouritesmodel.cpp navitsearchmodel.cpp navithelper.cpp navitroute.cpp proxy.c)
+ navitpoimodel.cpp navitrecentsmodel.cpp navitfavouritesmodel.cpp navitsearchmodel.cpp
+ navithelper.cpp navitroute.cpp navitlayoutsmodel.cpp navitlayersmodel.cpp
+ navitvehiclesmodel.cpp navitmapsmodel.cpp proxy.c)
diff --git a/navit/gui/qt5_qml/gui_qt5_qml.cpp b/navit/gui/qt5_qml/gui_qt5_qml.cpp
index 1a786361f..46f8b7b7c 100644
--- a/navit/gui/qt5_qml/gui_qt5_qml.cpp
+++ b/navit/gui/qt5_qml/gui_qt5_qml.cpp
@@ -64,6 +64,10 @@ extern "C" {
#include "navitfavouritesmodel.h"
#include "navitsearchmodel.h"
#include "navitroute.h"
+#include "navitlayoutsmodel.h"
+#include "navitlayersmodel.h"
+#include "navitvehiclesmodel.h"
+#include "navitmapsmodel.h"
struct gui_priv {
/* navit internal handle */
@@ -232,6 +236,10 @@ static int gui_qt5_qml_set_graphics(struct gui_priv* gui_priv, struct graphics*
qmlRegisterType<NavitFavouritesModel>("Navit.Favourites", 1, 0, "NavitFavouritesModel");
qmlRegisterType<NavitSearchModel>("Navit.Search", 1, 0, "NavitSearchModel");
qmlRegisterType<NavitRoute>("Navit.Route", 1, 0, "NavitRoute");
+ qmlRegisterType<NavitLayoutsModel>("Navit.Layouts", 1, 0, "NavitLayouts");
+ qmlRegisterType<NavitLayersModel>("Navit.Layers", 1, 0, "NavitLayers");
+ qmlRegisterType<NavitVehiclesModel>("Navit.Vehicles", 1, 0, "NavitVehicles");
+ qmlRegisterType<NavitMapsModel>("Navit.Maps", 1, 0, "NavitMaps");
/* find the loader component */
gui_priv->loader = gui_priv->engine->rootObjects().value(0)->findChild<QObject*>("navit_loader");
diff --git a/navit/gui/qt5_qml/navitlayersmodel.cpp b/navit/gui/qt5_qml/navitlayersmodel.cpp
new file mode 100644
index 000000000..9b0c30f6c
--- /dev/null
+++ b/navit/gui/qt5_qml/navitlayersmodel.cpp
@@ -0,0 +1,110 @@
+#include "navitlayersmodel.h"
+
+NavitLayersModel::NavitLayersModel(QObject *parent)
+{
+
+}
+
+QHash<int, QByteArray> NavitLayersModel::roleNames() const{
+ QHash<int, QByteArray> roles;
+ roles[NameRole] = "name";
+ roles[ActionRole] = "action";
+ roles[ImageUrlRole] = "imageUrl";
+ return roles;
+}
+
+QVariant NavitLayersModel::data(const QModelIndex & index, int role) const {
+ if (index.row() < 0 || index.row() >= m_layers.count())
+ return QVariant();
+
+ const QVariantMap *poi = &m_layers.at(index.row());
+
+ if (role == NameRole)
+ return poi->value("name");
+ else if (role == ActionRole)
+ return poi->value("action");
+ else if (role == ImageUrlRole)
+ return poi->value("imageUrl");
+ return QVariant();
+}
+
+
+int NavitLayersModel::rowCount(const QModelIndex & parent) const {
+ return m_layers.count();
+}
+
+Qt::ItemFlags NavitLayersModel::flags(const QModelIndex &index) const {
+ return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
+}
+
+bool NavitLayersModel::setData(const QModelIndex &index, const QVariant &value, int role) {
+ return false;
+}
+
+QModelIndex NavitLayersModel::index(int row, int column, const QModelIndex &parent) const {
+ return createIndex(row, column);
+}
+
+QModelIndex NavitLayersModel::parent(const QModelIndex &child) const {
+ return QModelIndex();
+}
+
+int NavitLayersModel::columnCount(const QModelIndex &parent) const {
+ return 0;
+}
+
+void NavitLayersModel::setNavitLayers(NavitLayoutsModel * navitLayouts){
+ m_navitLayoutsInstance = navitLayouts;
+ update();
+ connect(m_navitLayoutsInstance, &NavitLayoutsModel::layoutChanged, this, &NavitLayersModel::update);
+}
+void NavitLayersModel::update() {
+ if(m_navitLayoutsInstance && m_navitLayoutsInstance->m_navitInstance){
+ struct attr attr;
+
+ beginResetModel();
+ m_layers.clear();
+ endResetModel();
+
+ navit_get_attr(m_navitLayoutsInstance->m_navitInstance->getNavit(), attr_layout, &attr, nullptr);
+ GList * layers = attr.u.layout->layers;
+
+ while(layers){
+ QVariantMap layerMap;
+ GList *next = layers->next;
+ struct layer* layer = (struct layer*)layers->data;
+ layerMap.insert("name", layer->name);
+ layerMap.insert("action", "toggleLayer");
+ if(layer->active){
+ layerMap.insert("imageUrl", "qrc:/themes/Levy/assets/ionicons/md-checkmark-circle-outline.svg");
+ } else {
+ layerMap.insert("imageUrl", "");
+ }
+ beginInsertRows(QModelIndex(), rowCount(), rowCount());
+ m_layers.append(layerMap);
+ endInsertRows();
+ layers = next;
+ }
+ }
+}
+
+
+void NavitLayersModel::toggleLayer(QString name){
+ if(m_navitLayoutsInstance && m_navitLayoutsInstance->m_navitInstance){
+ struct attr attr;
+ char* layerName = name.toUtf8().data();
+
+ navit_get_attr(m_navitLayoutsInstance->m_navitInstance->getNavit(), attr_layout, &attr, nullptr);
+ GList * layers = attr.u.layout->layers;
+ while (layers) {
+ struct layer*l = (struct layer*)layers->data;
+ if(l && !strcmp(l->name,layerName) ) {
+ l->active ^= 1;
+ navit_draw(m_navitLayoutsInstance->m_navitInstance->getNavit());
+ }
+ layers=g_list_next(layers);
+ }
+
+ update();
+ }
+}
diff --git a/navit/gui/qt5_qml/navitlayersmodel.h b/navit/gui/qt5_qml/navitlayersmodel.h
new file mode 100644
index 000000000..ca7e07df8
--- /dev/null
+++ b/navit/gui/qt5_qml/navitlayersmodel.h
@@ -0,0 +1,44 @@
+#ifndef NAVITLAYERS_H
+#define NAVITLAYERS_H
+
+#include <QAbstractItemModel>
+#include <QDebug>
+#include <QVariantMap>
+#include "navitinstance.h"
+#include "navithelper.h"
+#include "navitlayoutsmodel.h"
+
+
+class NavitLayersModel : public QAbstractItemModel
+{
+ Q_OBJECT
+ Q_PROPERTY(NavitLayoutsModel * layout MEMBER m_navitLayoutsInstance WRITE setNavitLayers)
+public:
+ NavitLayersModel(QObject *parent = 0);
+
+ enum LayersModelRoles {
+ NameRole = Qt::UserRole + 1,
+ ActionRole,
+ ImageUrlRole
+ };
+
+ int rowCount(const QModelIndex & parent = QModelIndex()) const override;
+ QHash<int, QByteArray> roleNames() const override;
+ QVariant data(const QModelIndex & index, int role) const override;
+ Qt::ItemFlags flags(const QModelIndex &index) const override;
+ bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
+
+ QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
+ QModelIndex parent(const QModelIndex &child) const override;
+ int columnCount(const QModelIndex &parent = QModelIndex()) const override;
+
+ void setNavitLayers(NavitLayoutsModel * navitLayouts);
+ Q_INVOKABLE void toggleLayer(QString name);
+
+private:
+ QList<QVariantMap> m_layers;
+ NavitLayoutsModel *m_navitLayoutsInstance = nullptr;
+ void update();
+};
+
+#endif // NAVITLAYERS_H
diff --git a/navit/gui/qt5_qml/navitlayoutsmodel.cpp b/navit/gui/qt5_qml/navitlayoutsmodel.cpp
new file mode 100644
index 000000000..eb2114f4d
--- /dev/null
+++ b/navit/gui/qt5_qml/navitlayoutsmodel.cpp
@@ -0,0 +1,97 @@
+#include "navitlayoutsmodel.h"
+
+NavitLayoutsModel::NavitLayoutsModel(QObject *parent)
+{
+
+}
+
+QHash<int, QByteArray> NavitLayoutsModel::roleNames() const{
+ QHash<int, QByteArray> roles;
+ roles[NameRole] = "name";
+ roles[ActionRole] = "action";
+ roles[ImageUrlRole] = "imageUrl";
+ return roles;
+}
+
+QVariant NavitLayoutsModel::data(const QModelIndex & index, int role) const {
+ if (index.row() < 0 || index.row() >= m_layouts.count())
+ return QVariant();
+
+ const QVariantMap *poi = &m_layouts.at(index.row());
+
+ if (role == NameRole)
+ return poi->value("name");
+ else if (role == ActionRole)
+ return poi->value("action");
+ else if (role == ImageUrlRole)
+ return poi->value("imageUrl");
+ return QVariant();
+}
+
+
+int NavitLayoutsModel::rowCount(const QModelIndex & parent) const {
+ return m_layouts.count();
+}
+
+Qt::ItemFlags NavitLayoutsModel::flags(const QModelIndex &index) const {
+ return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
+}
+
+bool NavitLayoutsModel::setData(const QModelIndex &index, const QVariant &value, int role) {
+ return false;
+}
+
+QModelIndex NavitLayoutsModel::index(int row, int column, const QModelIndex &parent) const {
+ return createIndex(row, column);
+}
+
+QModelIndex NavitLayoutsModel::parent(const QModelIndex &child) const {
+ return QModelIndex();
+}
+
+int NavitLayoutsModel::columnCount(const QModelIndex &parent) const {
+ return 0;
+}
+
+void NavitLayoutsModel::setNavit(NavitInstance * navit){
+ m_navitInstance = navit;
+ update();
+}
+void NavitLayoutsModel::update() {
+ if(m_navitInstance){
+ struct attr attr;
+ struct attr_iter *iter;
+
+ beginResetModel();
+ m_layouts.clear();
+ endResetModel();
+
+ iter=navit_attr_iter_new(nullptr);
+ navit_get_attr(m_navitInstance->getNavit(), attr_layout, &attr, nullptr);
+ QString activeLayout = QString::fromLocal8Bit(attr.u.layout->name);
+ while(navit_get_attr(m_navitInstance->getNavit(), attr_layout, &attr, iter)) {
+ QVariantMap layouts;
+ QString layout = QString::fromLocal8Bit(attr.u.layout->name);
+ layouts.insert("name",layout);
+ layouts.insert("action", "setLayout");
+ if(layout == activeLayout){
+ layouts.insert("imageUrl", "qrc:/themes/Levy/assets/ionicons/md-checkmark-circle-outline.svg");
+ } else {
+ layouts.insert("imageUrl", "");
+ }
+
+ beginInsertRows(QModelIndex(), rowCount(), rowCount());
+ m_layouts.append(layouts);
+ endInsertRows();
+ }
+ navit_attr_iter_destroy(iter);
+ emit layoutChanged();
+ }
+}
+
+void NavitLayoutsModel::setLayout(QString name){
+ if(m_navitInstance){
+ navit_set_layout_by_name(m_navitInstance->getNavit(), name.toUtf8().data());
+ update();
+ }
+}
diff --git a/navit/gui/qt5_qml/navitlayoutsmodel.h b/navit/gui/qt5_qml/navitlayoutsmodel.h
new file mode 100644
index 000000000..f529896e5
--- /dev/null
+++ b/navit/gui/qt5_qml/navitlayoutsmodel.h
@@ -0,0 +1,65 @@
+#ifndef NAVITLAYOUTSMODEL_H
+#define NAVITLAYOUTSMODEL_H
+
+#include <QAbstractItemModel>
+#include <QDebug>
+#include <QVariantMap>
+#include "navitinstance.h"
+#include "navithelper.h"
+
+#include <glib.h>
+extern "C" {
+#include "config.h"
+#include "item.h" /* needs to be first, as attr.h depends on it */
+#include "navit.h"
+
+#include "coord.h"
+#include "attr.h"
+#include "xmlconfig.h" // for NAVIT_OBJECT
+#include "layout.h"
+#include "map.h"
+#include "transform.h"
+
+#include "mapset.h"
+#include "search.h"
+
+#include "proxy.h"
+}
+
+class NavitLayoutsModel : public QAbstractItemModel
+{
+ Q_OBJECT
+ Q_PROPERTY(NavitInstance * navit MEMBER m_navitInstance WRITE setNavit)
+public:
+ NavitLayoutsModel(QObject *parent = 0);
+
+ enum LayoutsModelRoles {
+ NameRole = Qt::UserRole + 1,
+ ActionRole,
+ ImageUrlRole
+ };
+
+ int rowCount(const QModelIndex & parent = QModelIndex()) const override;
+ QHash<int, QByteArray> roleNames() const override;
+ QVariant data(const QModelIndex & index, int role) const override;
+ Qt::ItemFlags flags(const QModelIndex &index) const override;
+ bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
+
+ QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
+ QModelIndex parent(const QModelIndex &child) const override;
+ int columnCount(const QModelIndex &parent = QModelIndex()) const override;
+
+ void setNavit(NavitInstance * navit);
+ Q_INVOKABLE void setLayout(QString name);
+signals:
+ void layoutChanged();
+private:
+ QList<QVariantMap> m_layouts;
+ NavitInstance *m_navitInstance = nullptr;
+ void update();
+ friend class NavitLayersModel;
+};
+
+#endif // NAVITLAYOUTSMODEL_H
+
+
diff --git a/navit/gui/qt5_qml/navitmapsmodel.cpp b/navit/gui/qt5_qml/navitmapsmodel.cpp
new file mode 100644
index 000000000..49570190d
--- /dev/null
+++ b/navit/gui/qt5_qml/navitmapsmodel.cpp
@@ -0,0 +1,133 @@
+#include "navitmapsmodel.h"
+
+NavitMapsModel::NavitMapsModel(QObject *parent)
+{
+
+}
+
+QHash<int, QByteArray> NavitMapsModel::roleNames() const{
+ QHash<int, QByteArray> roles;
+ roles[NameRole] = "name";
+ roles[ActionRole] = "action";
+ roles[ImageUrlRole] = "imageUrl";
+ return roles;
+}
+
+QVariant NavitMapsModel::data(const QModelIndex & index, int role) const {
+ if (index.row() < 0 || index.row() >= m_maps.count())
+ return QVariant();
+
+ const QVariantMap *poi = &m_maps.at(index.row());
+
+ if (role == NameRole)
+ return poi->value("name");
+ else if (role == ActionRole)
+ return poi->value("action");
+ else if (role == ImageUrlRole)
+ return poi->value("imageUrl");
+ return QVariant();
+}
+
+
+int NavitMapsModel::rowCount(const QModelIndex & parent) const {
+ return m_maps.count();
+}
+
+Qt::ItemFlags NavitMapsModel::flags(const QModelIndex &index) const {
+ return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
+}
+
+bool NavitMapsModel::setData(const QModelIndex &index, const QVariant &value, int role) {
+ return false;
+}
+
+QModelIndex NavitMapsModel::index(int row, int column, const QModelIndex &parent) const {
+ return createIndex(row, column);
+}
+
+QModelIndex NavitMapsModel::parent(const QModelIndex &child) const {
+ return QModelIndex();
+}
+
+int NavitMapsModel::columnCount(const QModelIndex &parent) const {
+ return 0;
+}
+
+void NavitMapsModel::setNavit(NavitInstance * navit){
+ m_navitInstance = navit;
+ update();
+}
+
+QString NavitMapsModel::getMapLabel(struct map * map){
+ struct attr description, type, data;
+ QStringList nameList;
+ QString name;
+ if (map_get_attr(map, attr_description, &description, nullptr)) {
+ name = description.u.str;
+ } else {
+ if(map_get_attr(map, attr_type, &type, nullptr)){
+ nameList << type.u.str;
+ }
+ if(map_get_attr(map, attr_data, &data, nullptr)){
+ nameList << data.u.str;
+ }
+ name = nameList.join(":");
+ }
+ return name;
+}
+void NavitMapsModel::update() {
+ if(m_navitInstance){
+ struct attr attr, active;
+ struct attr_iter *iter;
+
+ beginResetModel();
+ m_maps.clear();
+ endResetModel();
+
+ iter=navit_attr_iter_new(nullptr);
+
+ while(navit_get_attr(m_navitInstance->getNavit(), attr_map, &attr, iter)) {
+
+ QVariantMap maps;
+ //TODO : Internal GUI has option for download? gui_internal_cmd_map_download
+
+ maps.insert("name",getMapLabel(attr.u.map));
+ maps.insert("action", "toggleMap");
+
+ map_get_attr(attr.u.map, attr_active, &active, nullptr);
+ if (active.u.num){
+ maps.insert("imageUrl", "qrc:/themes/Levy/assets/ionicons/md-checkmark-circle-outline.svg");
+ } else {
+ maps.insert("imageUrl", "");
+ }
+
+ beginInsertRows(QModelIndex(), rowCount(), rowCount());
+ m_maps.append(maps);
+ endInsertRows();
+
+ }
+ navit_attr_iter_destroy(iter);
+ }
+}
+
+void NavitMapsModel::toggleMap(QString name){
+ if(m_navitInstance){
+ struct attr attr, active, activeSet;
+ struct attr_iter *iter;
+
+ iter=navit_attr_iter_new(nullptr);
+
+ while(navit_get_attr(m_navitInstance->getNavit(), attr_map, &attr, iter)) {
+ if(getMapLabel(attr.u.map) == name){
+ map_get_attr(attr.u.map, attr_active, &active, nullptr);
+ activeSet.type = attr_active;
+ activeSet.u.num = 1 - active.u.num;
+ map_set_attr(attr.u.map, &activeSet);
+ navit_draw(m_navitInstance->getNavit());
+ break;
+ }
+ }
+ navit_attr_iter_destroy(iter);
+ update();
+ }
+}
diff --git a/navit/gui/qt5_qml/navitmapsmodel.h b/navit/gui/qt5_qml/navitmapsmodel.h
new file mode 100644
index 000000000..311b3ef39
--- /dev/null
+++ b/navit/gui/qt5_qml/navitmapsmodel.h
@@ -0,0 +1,63 @@
+#ifndef NAVITMAPSMODEL_H
+#define NAVITMAPSMODEL_H
+
+#include <QAbstractItemModel>
+#include <QDebug>
+#include <QVariantMap>
+#include "navitinstance.h"
+#include "navithelper.h"
+
+#include <glib.h>
+extern "C" {
+#include "config.h"
+#include "item.h" /* needs to be first, as attr.h depends on it */
+#include "navit.h"
+
+#include "coord.h"
+#include "attr.h"
+#include "xmlconfig.h" // for NAVIT_OBJECT
+#include "layout.h"
+#include "map.h"
+#include "transform.h"
+
+#include "mapset.h"
+#include "search.h"
+#include "map.h"
+#include "mapset.h"
+
+#include "proxy.h"
+}
+
+class NavitMapsModel : public QAbstractItemModel
+{
+ Q_OBJECT
+ Q_PROPERTY(NavitInstance * navit MEMBER m_navitInstance WRITE setNavit)
+public:
+ NavitMapsModel(QObject *parent = 0);
+
+ enum MapsModelRoles {
+ NameRole = Qt::UserRole + 1,
+ ActionRole,
+ ImageUrlRole
+ };
+
+ int rowCount(const QModelIndex & parent = QModelIndex()) const override;
+ QHash<int, QByteArray> roleNames() const override;
+ QVariant data(const QModelIndex & index, int role) const override;
+ Qt::ItemFlags flags(const QModelIndex &index) const override;
+ bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
+
+ QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
+ QModelIndex parent(const QModelIndex &child) const override;
+ int columnCount(const QModelIndex &parent = QModelIndex()) const override;
+
+ void setNavit(NavitInstance * navit);
+ Q_INVOKABLE void toggleMap(QString name);
+ Q_INVOKABLE void update();
+private:
+ QList<QVariantMap> m_maps;
+ NavitInstance *m_navitInstance = nullptr;
+ QString getMapLabel(struct map * map);
+};
+
+#endif // NAVITMAPSMODEL_H
diff --git a/navit/gui/qt5_qml/navitsearchmodel.h b/navit/gui/qt5_qml/navitsearchmodel.h
index 2245f169d..814dc62a9 100644
--- a/navit/gui/qt5_qml/navitsearchmodel.h
+++ b/navit/gui/qt5_qml/navitsearchmodel.h
@@ -32,7 +32,7 @@ class NavitSearchModel : public QAbstractItemModel
Q_OBJECT
Q_PROPERTY(NavitInstance * navit MEMBER m_navitInstance WRITE setNavit)
public:
- enum RecentsModelRoles {
+ enum SearchModelRoles {
LabelRole = Qt::UserRole + 1,
NameRole,
IconRole,
diff --git a/navit/gui/qt5_qml/navitvehiclesmodel.cpp b/navit/gui/qt5_qml/navitvehiclesmodel.cpp
new file mode 100644
index 000000000..6226974d9
--- /dev/null
+++ b/navit/gui/qt5_qml/navitvehiclesmodel.cpp
@@ -0,0 +1,99 @@
+#include "navitvehiclesmodel.h"
+
+NavitVehiclesModel::NavitVehiclesModel(QObject *parent)
+{
+
+}
+
+QHash<int, QByteArray> NavitVehiclesModel::roleNames() const{
+ QHash<int, QByteArray> roles;
+ roles[NameRole] = "name";
+ roles[ActionRole] = "action";
+ roles[ImageUrlRole] = "imageUrl";
+ return roles;
+}
+
+QVariant NavitVehiclesModel::data(const QModelIndex & index, int role) const {
+ if (index.row() < 0 || index.row() >= m_vehicles.count())
+ return QVariant();
+
+ const QVariantMap *poi = &m_vehicles.at(index.row());
+
+ if (role == NameRole)
+ return poi->value("name");
+ else if (role == ActionRole)
+ return poi->value("action");
+ else if (role == ImageUrlRole)
+ return poi->value("imageUrl");
+ return QVariant();
+}
+
+
+int NavitVehiclesModel::rowCount(const QModelIndex & parent) const {
+ return m_vehicles.count();
+}
+
+Qt::ItemFlags NavitVehiclesModel::flags(const QModelIndex &index) const {
+ return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
+}
+
+bool NavitVehiclesModel::setData(const QModelIndex &index, const QVariant &value, int role) {
+ return false;
+}
+
+QModelIndex NavitVehiclesModel::index(int row, int column, const QModelIndex &parent) const {
+ return createIndex(row, column);
+}
+
+QModelIndex NavitVehiclesModel::parent(const QModelIndex &child) const {
+ return QModelIndex();
+}
+
+int NavitVehiclesModel::columnCount(const QModelIndex &parent) const {
+ return 0;
+}
+
+void NavitVehiclesModel::setNavit(NavitInstance * navit){
+ m_navitInstance = navit;
+ update();
+}
+void NavitVehiclesModel::update() {
+ if(m_navitInstance){
+ struct attr attr;
+ struct attr_iter *iter;
+
+ beginResetModel();
+ m_vehicles.clear();
+ endResetModel();
+
+ iter=navit_attr_iter_new(nullptr);
+ struct vehicleprofile *vehicleprofile = navit_get_vehicleprofile(m_navitInstance->getNavit());
+ QString activeVehicle = "";
+ if(vehicleprofile){
+ activeVehicle = QString::fromLocal8Bit(vehicleprofile->name);
+ }
+ while(navit_get_attr(m_navitInstance->getNavit(), attr_vehicleprofile, &attr, iter)) {
+ QVariantMap vehicles;
+ QString vehicle = QString::fromLocal8Bit(attr.u.vehicleprofile->name);
+ vehicles.insert("name",vehicle);
+ vehicles.insert("action", "setVehicle");
+ if(activeVehicle == vehicle){
+ vehicles.insert("imageUrl", "qrc:/themes/Levy/assets/ionicons/md-checkmark-circle-outline.svg");
+ } else {
+ vehicles.insert("imageUrl", "");
+ }
+
+ beginInsertRows(QModelIndex(), rowCount(), rowCount());
+ m_vehicles.append(vehicles);
+ endInsertRows();
+ }
+ navit_attr_iter_destroy(iter);
+ }
+}
+
+void NavitVehiclesModel::setVehicle(QString name){
+ if(m_navitInstance){
+ navit_set_vehicleprofile_name(m_navitInstance->getNavit(), name.toUtf8().data());
+ update();
+ }
+}
diff --git a/navit/gui/qt5_qml/navitvehiclesmodel.h b/navit/gui/qt5_qml/navitvehiclesmodel.h
new file mode 100644
index 000000000..625be7486
--- /dev/null
+++ b/navit/gui/qt5_qml/navitvehiclesmodel.h
@@ -0,0 +1,61 @@
+#ifndef NAVITVEHICLESMODEL_H
+#define NAVITVEHICLESMODEL_H
+
+#include <QAbstractItemModel>
+#include <QDebug>
+#include <QVariantMap>
+#include "navitinstance.h"
+#include "navithelper.h"
+
+#include <glib.h>
+extern "C" {
+#include "config.h"
+#include "item.h" /* needs to be first, as attr.h depends on it */
+#include "navit.h"
+
+#include "coord.h"
+#include "attr.h"
+#include "xmlconfig.h" // for NAVIT_OBJECT
+#include "layout.h"
+#include "map.h"
+#include "transform.h"
+
+#include "mapset.h"
+#include "search.h"
+#include "vehicleprofile.h"
+
+#include "proxy.h"
+}
+
+class NavitVehiclesModel : public QAbstractItemModel
+{
+ Q_OBJECT
+ Q_PROPERTY(NavitInstance * navit MEMBER m_navitInstance WRITE setNavit)
+public:
+ NavitVehiclesModel(QObject *parent = 0);
+
+ enum VehiclesModelRoles {
+ NameRole = Qt::UserRole + 1,
+ ActionRole,
+ ImageUrlRole
+ };
+
+ int rowCount(const QModelIndex & parent = QModelIndex()) const override;
+ QHash<int, QByteArray> roleNames() const override;
+ QVariant data(const QModelIndex & index, int role) const override;
+ Qt::ItemFlags flags(const QModelIndex &index) const override;
+ bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
+
+ QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
+ QModelIndex parent(const QModelIndex &child) const override;
+ int columnCount(const QModelIndex &parent = QModelIndex()) const override;
+
+ void setNavit(NavitInstance * navit);
+ Q_INVOKABLE void setVehicle(QString name);
+ Q_INVOKABLE void update();
+private:
+ QList<QVariantMap> m_vehicles;
+ NavitInstance *m_navitInstance = nullptr;
+};
+
+#endif // NAVITVEHICLESMODEL_H
diff --git a/navit/gui/qt5_qml/themes/Levy/MainLayout.qml b/navit/gui/qt5_qml/themes/Levy/MainLayout.qml
index 4eff9f812..05a7268cb 100644
--- a/navit/gui/qt5_qml/themes/Levy/MainLayout.qml
+++ b/navit/gui/qt5_qml/themes/Levy/MainLayout.qml
@@ -305,6 +305,10 @@ Item {
id: mouseArea
anchors.fill: parent
onClicked: {
+ if(__root.state == "menuDrawerOpen"){
+ menuDrawer.close()
+ }
+
__root.state = ""
}
}
diff --git a/navit/gui/qt5_qml/themes/Levy/MenuDrawer.qml b/navit/gui/qt5_qml/themes/Levy/MenuDrawer.qml
index ef75c7fa4..6e1bd4d1f 100644
--- a/navit/gui/qt5_qml/themes/Levy/MenuDrawer.qml
+++ b/navit/gui/qt5_qml/themes/Levy/MenuDrawer.qml
@@ -1,6 +1,11 @@
import QtQuick 2.9
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3
+import Navit 1.0
+import Navit.Layouts 1.0
+import Navit.Layers 1.0
+import Navit.Vehicles 1.0
+import Navit.Maps 1.0
Item {
id: __root
@@ -16,6 +21,15 @@ Item {
stackView.pop()
}
}
+ onCloseMenu: {
+ close()
+ }
+
+ function close(){
+ while(menuStack.depth > 1){
+ menuStack.pop();
+ }
+ }
function menuItemClicked(name, action){
switch(action){
@@ -32,6 +46,7 @@ Item {
case "heightProfile":
break;
case "mapRules":
+ menuStack.push(menuListView, {"menuName": name, "model":mapRules})
break;
case "display":
menuStack.push(menuListView, {"menuName": name, "model":menuDisplaySettingsModel})
@@ -39,6 +54,34 @@ Item {
case "settings":
menuStack.push(menuListView, {"menuName": name, "model":menuSettingsModel})
break;
+ case "layouts":
+ menuStack.push(menuListView, {"menuName": name, "model":layoutsModel})
+ break;
+ case "setLayout":
+ layoutsModel.setLayout(name);
+ menuStack.pop();
+ break;
+ case "layers":
+ menuStack.push(menuListView, {"menuName": name, "model":layersModel})
+ break;
+ case "toggleLayer":
+ layersModel.toggleLayer(name);
+ break;
+ case "vehicles":
+ vehiclesModel.update();
+ menuStack.push(menuListView, {"menuName": name, "model":vehiclesModel});
+ break;
+ case "setVehicle":
+ vehiclesModel.setVehicle(name);
+ menuStack.pop();
+ break;
+ case "maps":
+ mapsModel.update();
+ menuStack.push(menuListView, {"menuName": name, "model":mapsModel});
+ break;
+ case "toggleMap":
+ mapsModel.toggleMap(name);
+ break;
}
}
@@ -189,11 +232,11 @@ Item {
imageUrl: ""
}
- ListElement {
- name: "Height Profile"
- action: "heightProfile"
- imageUrl: ""
- }
+// ListElement {
+// name: "Height Profile"
+// action: "heightProfile"
+// imageUrl: ""
+// }
ListElement {
name: "Map Rules"
@@ -212,19 +255,61 @@ Item {
imageUrl: "qrc:/themes/Levy/assets/ionicons/md-settings.svg"
}
}
+ ListModel {
+ id:mapRules
+ ListElement {
+ name: "Lock on Road"
+ action: ""
+ imageUrl: ""
+ }
+ ListElement {
+ name: "Northing"
+ action: ""
+ imageUrl: ""
+ }
+ ListElement {
+ name: "Map follows Vehicle"
+ action: ""
+ imageUrl: ""
+ }
+ ListElement {
+ name: "Plan with Waypoints"
+ action: ""
+ imageUrl: ""
+ }
+ }
+ NavitLayouts {
+ id:layoutsModel
+ navit:Navit
+ }
+
+ NavitLayers {
+ id:layersModel
+ layout:layoutsModel
+ }
+
+ NavitVehicles {
+ id:vehiclesModel
+ navit:Navit
+ }
+
+ NavitMaps {
+ id:mapsModel
+ navit:Navit
+ }
ListModel {
id:menuSettingsModel
ListElement {
name: "Maps"
- action: ""
+ action: "maps"
imageUrl: ""
}
ListElement {
name: "Vehicle"
- action: ""
+ action: "vehicles"
imageUrl: ""
}
}
@@ -233,7 +318,7 @@ Item {
id:menuDisplaySettingsModel
ListElement {
name: "Layout"
- action: ""
+ action: "layouts"
imageUrl: ""
}
@@ -245,7 +330,7 @@ Item {
ListElement {
name: "Layers"
- action: ""
+ action: "layers"
imageUrl: ""
}
}