#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); }