diff options
author | Viktor Verebelyi <vviktor2@gmail.com> | 2020-09-22 02:07:38 +0100 |
---|---|---|
committer | Viktor Verebelyi <vviktor2@gmail.com> | 2020-09-22 02:16:58 +0100 |
commit | 8c951dffb4ca091498bc336119c1a0ede167f2c7 (patch) | |
tree | ef8cd2f9427a2073aff61e4ac18e9fd308f45f81 | |
parent | 7ebdb31ab9cc76e02b5e6104a17aa0be4d6d1bb3 (diff) | |
download | navit-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.txt | 4 | ||||
-rw-r--r-- | navit/gui/qt5_qml/gui_qt5_qml.cpp | 8 | ||||
-rw-r--r-- | navit/gui/qt5_qml/navitlayersmodel.cpp | 110 | ||||
-rw-r--r-- | navit/gui/qt5_qml/navitlayersmodel.h | 44 | ||||
-rw-r--r-- | navit/gui/qt5_qml/navitlayoutsmodel.cpp | 97 | ||||
-rw-r--r-- | navit/gui/qt5_qml/navitlayoutsmodel.h | 65 | ||||
-rw-r--r-- | navit/gui/qt5_qml/navitmapsmodel.cpp | 133 | ||||
-rw-r--r-- | navit/gui/qt5_qml/navitmapsmodel.h | 63 | ||||
-rw-r--r-- | navit/gui/qt5_qml/navitsearchmodel.h | 2 | ||||
-rw-r--r-- | navit/gui/qt5_qml/navitvehiclesmodel.cpp | 99 | ||||
-rw-r--r-- | navit/gui/qt5_qml/navitvehiclesmodel.h | 61 | ||||
-rw-r--r-- | navit/gui/qt5_qml/themes/Levy/MainLayout.qml | 4 | ||||
-rw-r--r-- | navit/gui/qt5_qml/themes/Levy/MenuDrawer.qml | 103 |
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: "" } } |