Files
qad/libs/map/pivariant_geoposition.cpp
peri4 993a9219d5 rename libs/piqt_widgtes to libs/piqt_utils
add PIVariantEdit for PIGeoPosition
2023-01-29 20:29:15 +03:00

64 lines
1.9 KiB
C++

#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 <QFileDialog>
REGISTER_PIVARIANTEDITOR(PIGeoPosition, PIVariantEditors::GeoPosition);
#define GeoUI reinterpret_cast<Ui::GeoPosition *>(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<PIGeoPosition>()));
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<PIGeoPosition>();
GeoUI->line->setText(PI2QString(v.toString()));
}
PIVariant PIVariantEditors::GeoPosition::value() const {
PIGeoPosition g = __PIVariantFunctions__<PIString>::castVariant<PIGeoPosition>(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);
}