diff --git a/src/apps/marble-maps/IndoorLevelSelector.qml b/src/apps/marble-maps/IndoorLevelSelector.qml new file mode 100644 --- /dev/null +++ b/src/apps/marble-maps/IndoorLevelSelector.qml @@ -0,0 +1,62 @@ +// +// This file is part of the Marble Virtual Globe. +// +// This program is free software licensed under the GNU LGPL. You can +// find a copy of this license in LICENSE.txt in the top directory of +// the source code. +// +// Copyright 2017 Mohammed Nafees +// + +import QtQuick 2.7 +import QtQuick.Controls 2.0 +import QtQuick.Layouts 1.0 +import QtQuick.Controls.Material 2.1 + +import org.kde.marble 0.20 + +Item { + id: root + + property var marbleItem: null + + IndoorLevelsBackend { + id: indoorBackend + marbleQuickItem: root.marbleItem + } + + Pane { + id: container + width: 50 + height: containerLayout.implicitHeight + anchors.fill: parent + padding: 0.0 + + Material.elevation: 1 + + ColumnLayout { + id: containerLayout + spacing: 0.0 + + Repeater { + model: indoorBackend.levels() + Rectangle { + height: 50 + width: 50 + + MouseArea { + anchors.fill: parent + + Label { + text: indoorBackend.levels()[index].level + font.pixelSize: 20 + anchors.centerIn: parent + } + + onClicked: indoorBackend.setCurrentLevel(indoorBackend.levels()[index].value) + } + } + } + } + } +} diff --git a/src/apps/marble-maps/MainScreen.qml b/src/apps/marble-maps/MainScreen.qml --- a/src/apps/marble-maps/MainScreen.qml +++ b/src/apps/marble-maps/MainScreen.qml @@ -421,6 +421,16 @@ } } + IndoorLevelSelector { + id: indoorLevelSelector + visible: true + marbleItem: marbleMaps + anchors.bottom: parent.bottom + anchors.bottomMargin: Screen.pixelDensity * 80 + anchors.left: parent.left + anchors.leftMargin: Screen.pixelDensity * 10 + } + BoxedText { id: quitHelper visible: false diff --git a/src/apps/marble-maps/MarbleMaps.qrc b/src/apps/marble-maps/MarbleMaps.qrc --- a/src/apps/marble-maps/MarbleMaps.qrc +++ b/src/apps/marble-maps/MarbleMaps.qrc @@ -30,6 +30,7 @@ SidePanel.qml PublicTransport.qml OutdoorActivities.qml + IndoorLevelSelector.qml drawer.svg ../../../data/android/drawable-xxxhdpi/search.png ../../../data/android/drawable-xxxhdpi/ic_menu_black_48dp.png diff --git a/src/lib/marble/declarative/CMakeLists.txt b/src/lib/marble/declarative/CMakeLists.txt --- a/src/lib/marble/declarative/CMakeLists.txt +++ b/src/lib/marble/declarative/CMakeLists.txt @@ -28,7 +28,8 @@ RouteRequestModel.cpp Settings.cpp RouteRelationModel.cpp -) + IndoorLevelsBackend.cpp + ) generate_export_header(marbledeclarative BASE_NAME marble_declarative) target_include_directories(marbledeclarative PUBLIC $) diff --git a/src/lib/marble/declarative/IndoorLevelsBackend.h b/src/lib/marble/declarative/IndoorLevelsBackend.h new file mode 100644 --- /dev/null +++ b/src/lib/marble/declarative/IndoorLevelsBackend.h @@ -0,0 +1,77 @@ +// +// This file is part of the Marble Virtual Globe. +// +// This program is free software licensed under the GNU LGPL. You can +// find a copy of this license in LICENSE.txt in the top directory of +// the source code. +// +// Copyright 2017 Mohammed Nafees +// + +#ifndef MARBLE_INDOORLEVELSBACKEND_H +#define MARBLE_INDOORLEVELSBACKEND_H + +#include +#include + +namespace Marble { +class MarbleQuickItem; + +class IndoorLevelsBackend : public QObject +{ + Q_OBJECT + + Q_PROPERTY(Marble::MarbleQuickItem* marbleQuickItem READ marbleQuickItem WRITE setMarbleQuickItem NOTIFY marbleQuickItemChanged) + +public: + explicit IndoorLevelsBackend(QObject* parent = nullptr); + + Q_INVOKABLE int currentLevel() const; + Q_INVOKABLE void setCurrentLevel(int level); + + MarbleQuickItem* marbleQuickItem() const; + void setMarbleQuickItem(MarbleQuickItem* marbleQuickItem); + + Q_INVOKABLE QList levels(); + void setLevels(const QList& levels); + +Q_SIGNALS: + void marbleQuickItemChanged(MarbleQuickItem* marbleQuickItem); + void currentLevelChanged(int level); + void levelsChanged(); + +private Q_SLOTS: + void refreshIndoorLevels(); + +private: + int m_currentLevel; + QList m_levels; + MarbleQuickItem* m_marbleQuickItem; +}; + +class Level : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QString level READ level WRITE setLevel) + Q_PROPERTY(int value READ value WRITE setValue) + +public: + Level(QObject* parent = nullptr); + Level(const QString& level, int value, QObject* parent = nullptr); + + QString level() const; + void setLevel(const QString& level); + + int value() const; + void setValue(int value); + +private: + QString m_level; + int m_value; +}; + +} + + +#endif diff --git a/src/lib/marble/declarative/IndoorLevelsBackend.cpp b/src/lib/marble/declarative/IndoorLevelsBackend.cpp new file mode 100644 --- /dev/null +++ b/src/lib/marble/declarative/IndoorLevelsBackend.cpp @@ -0,0 +1,126 @@ +// +// This file is part of the Marble Virtual Globe. +// +// This program is free software licensed under the GNU LGPL. You can +// find a copy of this license in LICENSE.txt in the top directory of +// the source code. +// +// Copyright 2017 Mohammed Nafees +// + +#include "IndoorLevelsBackend.h" + +#include "MarbleQuickItem.h" + +namespace Marble { + +IndoorLevelsBackend::IndoorLevelsBackend(QObject *parent) : + QObject(parent) +{ +} + +int IndoorLevelsBackend::currentLevel() const +{ + return m_currentLevel; +} + +void IndoorLevelsBackend::setCurrentLevel(int level) +{ + if (level != m_currentLevel) { + m_currentLevel = level; + { + // @TODO This is temporary + if (!m_marbleQuickItem->map()->levelTagDebugModeEnabled()) { + m_marbleQuickItem->map()->setLevelTagDebugModeEnabled(true); + } + m_marbleQuickItem->map()->setDebugLevelTag(m_currentLevel); + } + emit currentLevelChanged(m_currentLevel); + } +} + +MarbleQuickItem *IndoorLevelsBackend::marbleQuickItem() const +{ + return m_marbleQuickItem; +} + +void IndoorLevelsBackend::setMarbleQuickItem(MarbleQuickItem *marbleQuickItem) +{ + if (m_marbleQuickItem == marbleQuickItem) { + return; + } + + if (m_marbleQuickItem) { + disconnect(m_marbleQuickItem, &MarbleQuickItem::visibleLatLonAltBoxChanged, + this, &IndoorLevelsBackend::refreshIndoorLevels); + } + + m_marbleQuickItem = marbleQuickItem; + if (m_marbleQuickItem) { + connect(m_marbleQuickItem, &MarbleQuickItem::visibleLatLonAltBoxChanged, + this, &IndoorLevelsBackend::refreshIndoorLevels); + } + + emit marbleQuickItemChanged(marbleQuickItem); +} + +void IndoorLevelsBackend::refreshIndoorLevels() +{ + // @TODO Find appropriate way to check if the building has indoor levels +} + +QList IndoorLevelsBackend::levels() +{ + // @TODO This is temporary + if (m_levels.isEmpty()) { + m_levels.append(new Level(QStringLiteral("0"), 0)); + m_levels.append(new Level(QStringLiteral("1"), 1)); + m_levels.append(new Level(QStringLiteral("2"), 2)); + m_levels.append(new Level(QStringLiteral("3"), 3)); + m_levels.append(new Level(QStringLiteral("4"), 4)); + m_levels.append(new Level(QStringLiteral("5"), 5)); + } + return m_levels; +} + +void IndoorLevelsBackend::setLevels(const QList& levels) +{ + if (m_levels != levels) { + m_levels = levels; + emit levelsChanged(); + } +} + +Level::Level(QObject* parent) : + QObject(parent) +{ +} + +Level::Level(const QString& level, int value, QObject* parent) : + QObject(parent), + m_level(level), + m_value(value) +{ +} + +QString Level::level() const +{ + return m_level; +} + +void Level::setLevel(const QString &level) +{ + m_level = level; +} + +int Level::value() const +{ + return m_value; +} + +void Level::setValue(int value) +{ + m_value = value; +} + +} \ No newline at end of file diff --git a/src/lib/marble/declarative/MarbleDeclarativePlugin.cpp b/src/lib/marble/declarative/MarbleDeclarativePlugin.cpp --- a/src/lib/marble/declarative/MarbleDeclarativePlugin.cpp +++ b/src/lib/marble/declarative/MarbleDeclarativePlugin.cpp @@ -32,6 +32,7 @@ #include "MarblePlacemarkModel.h" #include "SearchBackend.h" #include "MarbleQuickItem.h" +#include "IndoorLevelsBackend.h" #include #include @@ -61,6 +62,7 @@ qmlRegisterType(uri, 0, 20, "SearchBackend"); qRegisterMetaType("MarblePlacemarkModel*"); qmlRegisterType(uri, 0, 20, "MarbleItem"); + qmlRegisterType(uri, 0, 20, "IndoorLevelsBackend"); qmlRegisterUncreatableType(uri, 1, 0, "MarblePlacemarkModel", QStringLiteral("MarblePlacemarkModel is not instantiable"));