diff --git a/icons/location.png b/icons/location.png new file mode 100644 index 0000000..daa5f4f Binary files /dev/null and b/icons/location.png differ diff --git a/libs/map/CMakeLists.txt b/libs/map/CMakeLists.txt index 3e8f66f..6bf162a 100644 --- a/libs/map/CMakeLists.txt +++ b/libs/map/CMakeLists.txt @@ -1 +1 @@ -qad_library(map "Gui;Widgets;Network" "qad_utils") +qad_library(map "Gui;Widgets;Network;Positioning" "qad_utils;qad_piqt_utils") diff --git a/libs/map/mapitembase.h b/libs/map/mapitembase.h index a6c80c9..086c20f 100644 --- a/libs/map/mapitembase.h +++ b/libs/map/mapitembase.h @@ -23,6 +23,7 @@ #include "qad_map_export.h" #include +#include #include #include #include @@ -58,7 +59,8 @@ public: QPointF position() const { return m_position; } void setPosition(QPointF geo); - void setPosition(double lat, double lng) { setPosition({lat, lng}); } + void setPosition(double lat, double lng) { setPosition(QPointF(lat, lng)); } + void setPosition(QGeoCoordinate c) { setPosition(QPointF(c.latitude(), c.longitude())); } QPointF offset() const { return m_offset; } void setOffset(QPointF pixels); diff --git a/libs/map/mapview.cpp b/libs/map/mapview.cpp index 2e0bcb2..a1247ed 100644 --- a/libs/map/mapview.cpp +++ b/libs/map/mapview.cpp @@ -86,7 +86,10 @@ void MapView::mousePressEvent(QMouseEvent * e) { void MapView::mouseReleaseEvent(QMouseEvent * e) { if (!is_pan) { - if (hover) emit itemClicked(hover); + if (hover) + emit itemClicked(hover); + else + emit mapClicked(last_click_coord); } is_pan = false; } diff --git a/libs/map/mapview.h b/libs/map/mapview.h index bd2eaf5..4c9558c 100644 --- a/libs/map/mapview.h +++ b/libs/map/mapview.h @@ -23,6 +23,7 @@ #include "mapitembase.h" #include "qad_map_export.h" +#include #include #include @@ -48,6 +49,7 @@ public: QPointF center() const; void setCenter(QPointF c); + void setCenter(QGeoCoordinate c) { setCenter(QPointF(c.latitude(), c.longitude())); } double getZoom() const { return zoom_; } void setZoom(double z); @@ -101,6 +103,7 @@ public slots: private slots: signals: + void mapClicked(QPointF); void itemClicked(MapItemBase * item); void itemEntered(MapItemBase * item); void itemLeaved(MapItemBase * item); diff --git a/libs/map/pivariant_geoposition.cpp b/libs/map/pivariant_geoposition.cpp new file mode 100644 index 0000000..90e9597 --- /dev/null +++ b/libs/map/pivariant_geoposition.cpp @@ -0,0 +1,63 @@ +#include "pivariant_geoposition.h" + +#include "mapitemimage.h" +#include "piqt.h" +#include "pivaluetree.h" +#include "ui_pivariant_geoposition.h" +#include "ui_pivariant_geoposition_map.h" + +#include + + +REGISTER_PIVARIANTEDITOR(PIGeoPosition, PIVariantEditors::GeoPosition); + +#define GeoUI reinterpret_cast(ui) + +using Attribute = PIValueTree::Attribute; + + +PIVariantEditors::GeoPosition::GeoPosition() { + QWidget * w = new QWidget(); + ui = new Ui::GeoPosition(); + GeoUI->setupUi(w); + layout()->addWidget(w); + connect(GeoUI->buttonMap, &QToolButton::clicked, this, [this]() { + QDialog dlg; + Ui::GeoPositionMap ui; + ui.setupUi(&dlg); + ui.map->setCenter(PI2QGeoPosition(value().value())); + auto * item = new MapItemImage(QPixmap(":/icons/location.png")); + item->setAlignment(Qt::AlignHCenter | Qt::AlignBottom); + item->setScale(0.333 * appScale(this)); + item->setPosition(ui.map->center()); + ui.map->addItem(item); + connect(ui.map, &MapView::mapClicked, this, [item](QPointF c) { item->setPosition(c); }); + if (dlg.exec() != QDialog::Accepted) return; + PIGeoPosition gp({item->position().x(), item->position().y(), 0.}, PIGeoPosition::Geodetic); + setValue(PIVariant::fromValue(gp)); + }); +} + + +PIVariantEditors::GeoPosition::~GeoPosition() { + delete GeoUI; +} + + +void PIVariantEditors::GeoPosition::setValue(const PIVariant & v) { + val = v.value(); + GeoUI->line->setText(PI2QString(v.toString())); +} + + +PIVariant PIVariantEditors::GeoPosition::value() const { + PIGeoPosition g = __PIVariantFunctions__::castVariant(Q2PIString(GeoUI->line->text())); + return PIVariant::fromValue(g); +} + + +void PIVariantEditors::GeoPosition::applyAttributes(const PIVariantMap & a) { + bool ro = a.value(Attribute::readOnly, GeoUI->line->isReadOnly()).toBool(); + GeoUI->line->setReadOnly(ro); + GeoUI->buttonMap->setHidden(ro); +} diff --git a/libs/map/pivariant_geoposition.h b/libs/map/pivariant_geoposition.h new file mode 100644 index 0000000..b7eb087 --- /dev/null +++ b/libs/map/pivariant_geoposition.h @@ -0,0 +1,48 @@ +/* + QAD - Qt ADvanced + + Ivan Pelipenko peri4ko@yandex.ru + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#ifndef pivariant_geoposition_H +#define pivariant_geoposition_H + +#include "mapview.h" +#include "pigeoposition.h" +#include "pivariant_edit.h" + +namespace PIVariantEditors { + +class QAD_MAP_EXPORT GeoPosition: public PIVariantEditorBase { + Q_OBJECT + +public: + GeoPosition(); + ~GeoPosition(); + void setValue(const PIVariant & v) override; + PIVariant value() const override; + +protected: + void applyAttributes(const PIVariantMap & a) override; + void * ui = nullptr; + PIGeoPosition val; +}; + + +}; // namespace PIVariantEditors + + +#endif diff --git a/libs/map/pivariant_geoposition.ui b/libs/map/pivariant_geoposition.ui new file mode 100644 index 0000000..2f450a8 --- /dev/null +++ b/libs/map/pivariant_geoposition.ui @@ -0,0 +1,113 @@ + + + GeoPosition + + + + 0 + 0 + 435 + 57 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + Select on map ... + + + + :/icons/maps.png:/icons/maps.png + + + + + + + + :/icons/edit-delete.png:/icons/edit-delete.png + + + Remove + + + + + + :/icons/configure.png:/icons/configure.png + + + Change ... + + + + + + :/icons/border-line.png:/icons/border-line.png + + + Rename ... + + + + + + :/icons/code-variable.png:/icons/code-variable.png + + + Value + + + + + + :/icons/code-struct.png:/icons/code-struct.png + + + Group + + + + + + :/icons/code-union.png:/icons/code-union.png + + + Array + + + + + + :/icons/legend.png:/icons/legend.png + + + Reorder ... + + + + + + + + + + + + diff --git a/libs/map/pivariant_geoposition_map.ui b/libs/map/pivariant_geoposition_map.ui new file mode 100644 index 0000000..72d4218 --- /dev/null +++ b/libs/map/pivariant_geoposition_map.ui @@ -0,0 +1,143 @@ + + + GeoPositionMap + + + + 0 + 0 + 683 + 634 + + + + Select on map + + + + + + 15.000000000000000 + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + :/icons/edit-delete.png:/icons/edit-delete.png + + + Remove + + + + + + :/icons/configure.png:/icons/configure.png + + + Change ... + + + + + + :/icons/border-line.png:/icons/border-line.png + + + Rename ... + + + + + + :/icons/code-variable.png:/icons/code-variable.png + + + Value + + + + + + :/icons/code-struct.png:/icons/code-struct.png + + + Group + + + + + + :/icons/code-union.png:/icons/code-union.png + + + Array + + + + + + :/icons/legend.png:/icons/legend.png + + + Reorder ... + + + + + + MapView + QWidget +
mapview.h
+
+
+ + + + + + + + + buttonBox + accepted() + GeoPositionMap + accept() + + + 342 + 607 + + + 289 + 646 + + + + + buttonBox + rejected() + GeoPositionMap + reject() + + + 561 + 611 + + + 525 + 649 + + + + +
diff --git a/libs/map/qad_map.qrc b/libs/map/qad_map.qrc index 6546225..3a986a6 100644 --- a/libs/map/qad_map.qrc +++ b/libs/map/qad_map.qrc @@ -1,5 +1,6 @@ ../../icons/maps.png + ../../icons/location.png diff --git a/libs/piqt_widgets/CMakeLists.txt b/libs/piqt_utils/CMakeLists.txt similarity index 100% rename from libs/piqt_widgets/CMakeLists.txt rename to libs/piqt_utils/CMakeLists.txt diff --git a/libs/piqt_widgets/piqt_connection_edit.cpp b/libs/piqt_utils/piqt_connection_edit.cpp similarity index 100% rename from libs/piqt_widgets/piqt_connection_edit.cpp rename to libs/piqt_utils/piqt_connection_edit.cpp diff --git a/libs/piqt_widgets/piqt_connection_edit.h b/libs/piqt_utils/piqt_connection_edit.h similarity index 100% rename from libs/piqt_widgets/piqt_connection_edit.h rename to libs/piqt_utils/piqt_connection_edit.h diff --git a/libs/piqt_widgets/piqt_connection_edit.ui b/libs/piqt_utils/piqt_connection_edit.ui similarity index 100% rename from libs/piqt_widgets/piqt_connection_edit.ui rename to libs/piqt_utils/piqt_connection_edit.ui diff --git a/libs/piqt_widgets/piqt_connection_view.cpp b/libs/piqt_utils/piqt_connection_view.cpp similarity index 100% rename from libs/piqt_widgets/piqt_connection_view.cpp rename to libs/piqt_utils/piqt_connection_view.cpp diff --git a/libs/piqt_widgets/piqt_connection_view.h b/libs/piqt_utils/piqt_connection_view.h similarity index 100% rename from libs/piqt_widgets/piqt_connection_view.h rename to libs/piqt_utils/piqt_connection_view.h diff --git a/libs/piqt_widgets/piqt_highlighter.cpp b/libs/piqt_utils/piqt_highlighter.cpp similarity index 100% rename from libs/piqt_widgets/piqt_highlighter.cpp rename to libs/piqt_utils/piqt_highlighter.cpp diff --git a/libs/piqt_widgets/piqt_highlighter.h b/libs/piqt_utils/piqt_highlighter.h similarity index 100% rename from libs/piqt_widgets/piqt_highlighter.h rename to libs/piqt_utils/piqt_highlighter.h diff --git a/libs/piqt_widgets/piqt_iodevice_edit.cpp b/libs/piqt_utils/piqt_iodevice_edit.cpp similarity index 100% rename from libs/piqt_widgets/piqt_iodevice_edit.cpp rename to libs/piqt_utils/piqt_iodevice_edit.cpp diff --git a/libs/piqt_widgets/piqt_iodevice_edit.h b/libs/piqt_utils/piqt_iodevice_edit.h similarity index 100% rename from libs/piqt_widgets/piqt_iodevice_edit.h rename to libs/piqt_utils/piqt_iodevice_edit.h diff --git a/libs/piqt_widgets/piqt_iodevice_edit_dialog.cpp b/libs/piqt_utils/piqt_iodevice_edit_dialog.cpp similarity index 100% rename from libs/piqt_widgets/piqt_iodevice_edit_dialog.cpp rename to libs/piqt_utils/piqt_iodevice_edit_dialog.cpp diff --git a/libs/piqt_widgets/piqt_iodevice_edit_dialog.h b/libs/piqt_utils/piqt_iodevice_edit_dialog.h similarity index 100% rename from libs/piqt_widgets/piqt_iodevice_edit_dialog.h rename to libs/piqt_utils/piqt_iodevice_edit_dialog.h diff --git a/libs/piqt_widgets/piqt_iodevice_edit_dialog.ui b/libs/piqt_utils/piqt_iodevice_edit_dialog.ui similarity index 100% rename from libs/piqt_widgets/piqt_iodevice_edit_dialog.ui rename to libs/piqt_utils/piqt_iodevice_edit_dialog.ui diff --git a/libs/piqt_widgets/pivaluetree_edit.cpp b/libs/piqt_utils/pivaluetree_edit.cpp similarity index 100% rename from libs/piqt_widgets/pivaluetree_edit.cpp rename to libs/piqt_utils/pivaluetree_edit.cpp diff --git a/libs/piqt_widgets/pivaluetree_edit.h b/libs/piqt_utils/pivaluetree_edit.h similarity index 100% rename from libs/piqt_widgets/pivaluetree_edit.h rename to libs/piqt_utils/pivaluetree_edit.h diff --git a/libs/piqt_widgets/pivaluetree_edit_array.ui b/libs/piqt_utils/pivaluetree_edit_array.ui similarity index 100% rename from libs/piqt_widgets/pivaluetree_edit_array.ui rename to libs/piqt_utils/pivaluetree_edit_array.ui diff --git a/libs/piqt_widgets/pivaluetree_edit_parameters.cpp b/libs/piqt_utils/pivaluetree_edit_parameters.cpp similarity index 100% rename from libs/piqt_widgets/pivaluetree_edit_parameters.cpp rename to libs/piqt_utils/pivaluetree_edit_parameters.cpp diff --git a/libs/piqt_widgets/pivaluetree_edit_parameters.h b/libs/piqt_utils/pivaluetree_edit_parameters.h similarity index 100% rename from libs/piqt_widgets/pivaluetree_edit_parameters.h rename to libs/piqt_utils/pivaluetree_edit_parameters.h diff --git a/libs/piqt_widgets/pivaluetree_edit_parameters.ui b/libs/piqt_utils/pivaluetree_edit_parameters.ui similarity index 100% rename from libs/piqt_widgets/pivaluetree_edit_parameters.ui rename to libs/piqt_utils/pivaluetree_edit_parameters.ui diff --git a/libs/piqt_widgets/pivaluetree_edit_reorder.cpp b/libs/piqt_utils/pivaluetree_edit_reorder.cpp similarity index 100% rename from libs/piqt_widgets/pivaluetree_edit_reorder.cpp rename to libs/piqt_utils/pivaluetree_edit_reorder.cpp diff --git a/libs/piqt_widgets/pivaluetree_edit_reorder.h b/libs/piqt_utils/pivaluetree_edit_reorder.h similarity index 100% rename from libs/piqt_widgets/pivaluetree_edit_reorder.h rename to libs/piqt_utils/pivaluetree_edit_reorder.h diff --git a/libs/piqt_widgets/pivaluetree_edit_reorder.ui b/libs/piqt_utils/pivaluetree_edit_reorder.ui similarity index 100% rename from libs/piqt_widgets/pivaluetree_edit_reorder.ui rename to libs/piqt_utils/pivaluetree_edit_reorder.ui diff --git a/libs/piqt_widgets/pivariant_edit.cpp b/libs/piqt_utils/pivariant_edit.cpp similarity index 100% rename from libs/piqt_widgets/pivariant_edit.cpp rename to libs/piqt_utils/pivariant_edit.cpp diff --git a/libs/piqt_widgets/pivariant_edit.h b/libs/piqt_utils/pivariant_edit.h similarity index 100% rename from libs/piqt_widgets/pivariant_edit.h rename to libs/piqt_utils/pivariant_edit.h diff --git a/libs/piqt_widgets/pivariant_edit_enum.cpp b/libs/piqt_utils/pivariant_edit_enum.cpp similarity index 100% rename from libs/piqt_widgets/pivariant_edit_enum.cpp rename to libs/piqt_utils/pivariant_edit_enum.cpp diff --git a/libs/piqt_widgets/pivariant_edit_enum.h b/libs/piqt_utils/pivariant_edit_enum.h similarity index 100% rename from libs/piqt_widgets/pivariant_edit_enum.h rename to libs/piqt_utils/pivariant_edit_enum.h diff --git a/libs/piqt_widgets/pivariant_edit_enum.ui b/libs/piqt_utils/pivariant_edit_enum.ui similarity index 100% rename from libs/piqt_widgets/pivariant_edit_enum.ui rename to libs/piqt_utils/pivariant_edit_enum.ui diff --git a/libs/piqt_widgets/pivariant_edit_widgets.cpp b/libs/piqt_utils/pivariant_edit_widgets.cpp similarity index 100% rename from libs/piqt_widgets/pivariant_edit_widgets.cpp rename to libs/piqt_utils/pivariant_edit_widgets.cpp diff --git a/libs/piqt_widgets/pivariant_edit_widgets.h b/libs/piqt_utils/pivariant_edit_widgets.h similarity index 100% rename from libs/piqt_widgets/pivariant_edit_widgets.h rename to libs/piqt_utils/pivariant_edit_widgets.h diff --git a/libs/piqt_widgets/qad_piqt_widgets.qrc b/libs/piqt_utils/qad_piqt_widgets.qrc similarity index 100% rename from libs/piqt_widgets/qad_piqt_widgets.qrc rename to libs/piqt_utils/qad_piqt_widgets.qrc diff --git a/utils/valuetreeeditor/CMakeLists.txt b/utils/valuetreeeditor/CMakeLists.txt index d51de14..9b24b01 100644 --- a/utils/valuetreeeditor/CMakeLists.txt +++ b/utils/valuetreeeditor/CMakeLists.txt @@ -7,7 +7,7 @@ else() set(APP_ICON "icons/valuetreeeditor.png") endif() set(APP_INFO "Editor for PIValueTree") -qad_application(${PROJECT_NAME} "Gui;Widgets" "qad_utils;qad_widgets;qad_application;qad_piqt_utils") +qad_application(${PROJECT_NAME} "Gui;Widgets" "qad_utils;qad_widgets;qad_application;qad_piqt_utils;qad_map") if (NOT DEFINED ANDROID_PLATFORM) foreach (_qv_ IN ITEMS 5 6) if (${LOCAL_FOUND${_qv_}}) diff --git a/utils/valuetreeeditor/valuetreeeditor_main.cpp b/utils/valuetreeeditor/valuetreeeditor_main.cpp index aa682b1..53a51f9 100644 --- a/utils/valuetreeeditor/valuetreeeditor_main.cpp +++ b/utils/valuetreeeditor/valuetreeeditor_main.cpp @@ -1,4 +1,6 @@ #include "mainwindow.h" +#include "pivariant.h" +#include "pivariant_geoposition.h" #include "qad_locations.h" #include "qad_types.h" @@ -10,6 +12,10 @@ int main(int argc, char * argv[]) { a.setWindowIcon(QIcon(":/icons/valuetreeeditor.png")); enableHighDPI(); QAD::loadTranslations(); + + auto * www = new PIVariantEditors::GeoPosition(); + delete www; + MainWindow w; if (a.arguments().size() > 1) w.load(a.arguments().back()); w.show();