/** * @RDE_HEADER@ * FunctionDialog * $Id$ * $HeadURL$ * $Author$ */ #include "simple_esri_layer.h" #include #include #include #include #include #include // for overview #include #include #include #include #include #include #include #include namespace SituationMap { Esri::ArcGISRuntime::Layer *getEsriBasemap_Layer(Esri::ArcGISRuntime::Map *map, const QString &layername) { if (!(map && map->basemap() && map->basemap()->baseLayers()) ) return nullptr; Esri::ArcGISRuntime::Layer *layerFound = nullptr; const Esri::ArcGISRuntime::LayerListModel *model = map->basemap()->baseLayers(); for (int i = 0; i < model->size(); ++i) { const Esri::ArcGISRuntime::Layer *curLayer = model->at(i); const QString &curName = curLayer->name(); if (QString::compare(layername, curName) == 0) { layerFound = model->at(i); break; } } // for return layerFound; } Esri::ArcGISRuntime::ArcGISTiledLayer *getEsriBasemap_ArcGISTiledLayer(Esri::ArcGISRuntime::Map *map, const QString &layername) { Esri::ArcGISRuntime::Layer *layerFound = getEsriBasemap_Layer(map, layername); if (! layerFound) return nullptr; if (layerFound->layerType() == Esri::ArcGISRuntime::LayerType::ArcGISTiledLayer) { Esri::ArcGISRuntime::ArcGISTiledLayer *layer2 = static_cast(layerFound); return layer2; } return nullptr; } class SimpleEsriLayer::Private { public: Private() { } ~Private() { } // ESRI data: Esri::ArcGISRuntime::Map *m_map = nullptr; Esri::ArcGISRuntime::MapGraphicsView *m_mapView = nullptr; // OWN data: QGridLayout *m_layout = nullptr; }; // class SimpleEsriLayer::Private //----------------------------------------------------------------------------- SimpleEsriLayer::SimpleEsriLayer(QWidget *parent, Esri::ArcGISRuntime::MapGraphicsView *mapView) : QWidget(parent) , d(new Private) { d->m_mapView = mapView; if (d->m_mapView) d->m_map = d->m_mapView->map(); d->m_layout = new QGridLayout(this); updatePanel(); } SimpleEsriLayer::~SimpleEsriLayer() { delete d; } bool SimpleEsriLayer::updatePanel() { for (int row = 0; row < d->m_layout->rowCount(); ++row) { for (int col = 0; col < d->m_layout->columnCount(); ++col) { QLayoutItem *item = d->m_layout->itemAtPosition(row, col); if (item) { QWidget *w = item->widget(); delete w; } } } delete d->m_layout; d->m_layout = new QGridLayout(this); if (d->m_map) { // Header int row = 0; int col = 0; for (const char *name : { "OnOff", "Opac", "Brightness", "Contrast", "Gamma" }) d->m_layout->addWidget(new QLabel(QString::fromLatin1(name)), row, col++); row = d->m_layout->rowCount(); // GraphicalOverlay Esri::ArcGISRuntime::GraphicsOverlayListModel *graphicsOverlayListModel = d->m_mapView->graphicsOverlays(); if (graphicsOverlayListModel) { int graphicsOverlaySize = graphicsOverlayListModel->size(); // qDebug() << LOGFUNCTION << " graphicsOverlayListModel -> size=" << graphicsOverlaySize; row += graphicsOverlaySize; for (int i = 0; i < graphicsOverlaySize; ++i) { --row; col = 0; // qDebug() << LOGFUNCTION << " graphicsOverlayListModel handle layer i='" << i; Esri::ArcGISRuntime::GraphicsOverlay *gOverlay = graphicsOverlayListModel->at(i); if (! gOverlay) { qWarning() << LOGFUNCTION << " gOverlay is nil"; return false; } const QString &layername = gOverlay->objectName(); QCheckBox *cbOnOff = new QCheckBox(layername); cbOnOff->setChecked(gOverlay->isVisible()); connect(cbOnOff, &QCheckBox::stateChanged, this, &SimpleEsriLayer::layerOnOff); d->m_layout->addWidget(cbOnOff, row, col++); SimpleEsriLayerSlider *sl_opac = new SimpleEsriLayerSlider(layername, 0, 100); sl_opac->setValue(gOverlay->opacity() * 100); connect(sl_opac, &SimpleEsriLayerSlider::valueChanged, this, &SimpleEsriLayer::opacity); d->m_layout->addWidget(sl_opac, row, col++); } // for } // if (graphicsOverlayListModel) // BasemapLayer row = d->m_layout->rowCount(); Esri::ArcGISRuntime::LayerListModel *baseLayerModel = d->m_map->basemap()->baseLayers(); if (baseLayerModel) { int baseLayerModelSize = baseLayerModel->size(); qWarning() << LOGFUNCTION << " baseLayerModel -> size=" << baseLayerModelSize; row += baseLayerModelSize; for (int i = 0; i < baseLayerModelSize; ++i) { col = 0; --row; qWarning() << LOGFUNCTION << " baseLayerModel handle layer i=" << i; Esri::ArcGISRuntime::Layer *layer = baseLayerModel->at(i); if (! layer) { qWarning() << LOGFUNCTION << " layer is nil"; return false; } const QString &layername = layer->name(); QCheckBox *cbOnOff = new QCheckBox(layername); cbOnOff->setChecked(layer->isVisible()); // QString tooltip = layer->url(); // if (!l->serviceDescription().isEmpty()) // tooltip += QLatin1String(" ; ") % l->serviceDescription(); // if (!tooltip.isEmpty()) // cbOnOff->setToolTip(tooltip); connect(cbOnOff, &QCheckBox::stateChanged, this, &SimpleEsriLayer::layerOnOff); d->m_layout->addWidget(cbOnOff, row, col++); SimpleEsriLayerSlider *sl_opac = new SimpleEsriLayerSlider(layername, 0, 100); sl_opac->setValue(layer->opacity() * 100); connect(sl_opac, &SimpleEsriLayerSlider::valueChanged, this, &SimpleEsriLayer::opacity); d->m_layout->addWidget(sl_opac, row, col++); if (layer->layerType() == Esri::ArcGISRuntime::LayerType::ArcGISTiledLayer // || layer->type() == EsriRuntimeQt::LayerType::ArcGISTiledMapService ) { Esri::ArcGISRuntime::ArcGISTiledLayer *realLayer = dynamic_cast(layer); if (realLayer) { float brightness = realLayer->brightness(); float contrast = realLayer->contrast(); float gamma = realLayer->gamma(); qWarning() << " brightness=" << brightness; // QuartzBeta1 -> not supported qWarning() << " contrast=" << contrast; // QuartzBeta1 -> not supported qWarning() << " gamma=" << gamma; // QuartzBeta1 -> not supported SimpleEsriLayerSlider *sl_brightness = new SimpleEsriLayerSlider(layername, -100, 100); sl_brightness->setValue(brightness * 100); connect(sl_brightness, &SimpleEsriLayerSlider::valueChanged, this, &SimpleEsriLayer::brightness); d->m_layout->addWidget(sl_brightness, row, col++); SimpleEsriLayerSlider *sl_contrast = new SimpleEsriLayerSlider(layername, -100, 100); sl_contrast->setValue(contrast * 100); connect(sl_contrast, &SimpleEsriLayerSlider::valueChanged, this, &SimpleEsriLayer::contrast); d->m_layout->addWidget(sl_contrast, row, col++); SimpleEsriLayerSlider *sl_gamma = new SimpleEsriLayerSlider(layername, -100, 100); sl_gamma->setValue(gamma * 100); connect(sl_gamma, &SimpleEsriLayerSlider::valueChanged, this, &SimpleEsriLayer::gamma); d->m_layout->addWidget(sl_gamma, row, col++); } // ir (realLayer) } // if (layer->type() == Es } // for } // if (baseLayerModel) QPushButton *pbMaximizeExtent = new QPushButton(QLatin1String("maximize scale of 1st basemap")); d->m_layout->addWidget(pbMaximizeExtent, 9999, 0); connect(pbMaximizeExtent, &QPushButton::clicked, this, [this]() { if (d->m_map) { d->m_map->setMinScale(500000000); // 5e+08 d->m_map->setMaxScale(100); } }); } else qWarning() << LOGFUNCTION << " no map !!! "; return true; } void SimpleEsriLayer::layerOnOff() { QCheckBox *cb = qobject_cast(sender()); if (!cb) return; QString layername = cb->text(); qDebug() << LOGFUNCTION << " layername=" << layername; Esri::ArcGISRuntime::Layer *l = getEsriBasemap_Layer(d->m_map, layername); if (l) l->setVisible(cb->isChecked()); else qDebug() << LOGFUNCTION << " no layer!!!, layername=" << layername; } void SimpleEsriLayer::opacity(int) { SimpleEsriLayerSlider *sl = qobject_cast(sender()); if (!sl) return; QString layername = sl->m_layername; double value = sl->value() / 100.0; Esri::ArcGISRuntime::Layer *l = getEsriBasemap_Layer(d->m_map, layername); if (l) { qDebug() << LOGFUNCTION << " layername=" << layername << " set to val=" << value; l->setOpacity(value); } else qWarning() << LOGFUNCTION << " no layer!!!, layername=" << layername; } void SimpleEsriLayer::brightness(int) { SimpleEsriLayerSlider *sl = qobject_cast(sender()); if (!sl) return; QString layername = sl->m_layername; Esri::ArcGISRuntime::ArcGISTiledLayer *l = getEsriBasemap_ArcGISTiledLayer(d->m_map, layername); double value = sl->value() / 100.0; // double value = sl->value(); qDebug() << LOGFUNCTION << " layername=" << layername << " set to val=" << value; l->setBrightness(value); } void SimpleEsriLayer::contrast(int) { SimpleEsriLayerSlider *sl = qobject_cast(sender()); if (!sl) return; QString layername = sl->m_layername; Esri::ArcGISRuntime::ArcGISTiledLayer *l = getEsriBasemap_ArcGISTiledLayer(d->m_map, layername); double value = sl->value() / 100.0; // double value = sl->value(); qDebug() << LOGFUNCTION << " layername=" << layername << " set to val=" << value; l->setContrast(value); } void SimpleEsriLayer::gamma(int) { SimpleEsriLayerSlider *sl = qobject_cast(sender()); if (!sl) return; QString layername = sl->m_layername; Esri::ArcGISRuntime::ArcGISTiledLayer *l = getEsriBasemap_ArcGISTiledLayer(d->m_map, layername); double value = sl->value() / 100.0; // double value = sl->value(); qDebug() << LOGFUNCTION << " layername=" << layername << " set to val=" << value; l->setGamma(value); } } // namespace SituationMap