/** * @RDE_HEADER@ * main * $Id$ * $HeadURL$ * $Author$ */ #include #include #include "../plan_editor.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // only for debug purpose #include class MapInitializer : public SituationMap::MapInitializer { Q_OBJECT typedef SituationMap::MapInitializer BaseClass; public: explicit MapInitializer( SituationMap::Map & map , SituationMap::MapSettings & mapSettings , const QString & debugName , QObject *parent = nullptr) : BaseClass(map, mapSettings, debugName, parent), m_useSymbologyFromInitFile(true) {} bool initializeObjectFactory() override { SituationMap::ObjectFactory::registerMe(typeid(SituationMap::MapObjectIndicator), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Polygon), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Polyline), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Text), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Participant), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::AreaFire), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::BiologicalAgent), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::ChemicalAgent), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::BuildingOutline), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::DangerArea), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::FunctionalArea), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::GeoImage), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::HitLine), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Mine), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::MineField), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::NuclearAgent), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::SingleFire), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::SidcSymbol), new SituationMap::GenericObjectFactory() ); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::SightFan), new SituationMap::GenericObjectFactory()); return true; } // initializeObjectFactory() AdvancedSymbology::SymbologyType symbologyType() const override { return (m_useSymbologyFromInitFile) ? SituationMap::MapInitializer::symbologyType() : m_symbologyType; } // symbologyType void setSymbologyType( AdvancedSymbology::SymbologyType symbologyType ) { m_symbologyType = symbologyType; m_useSymbologyFromInitFile = false; } protected : bool m_useSymbologyFromInitFile; AdvancedSymbology::SymbologyType m_symbologyType = AdvancedSymbology::SymbologyType::APP6B; void onMapReady() override { BaseClass::onMapReady(); m_map.setExtent(-100000, -100000, 100000, 100000); m_map.setMinScale(1000000000); m_map.setMaxScale(100); m_map.setRotation(0.0); // own things should be added here } // onMapReady() }; // MapInitializer #define USE_BASE_LAYOUT class TestMainWindow : public QMainWindow { Q_OBJECT public: explicit TestMainWindow( AdvancedSymbology::SymbologyType * symbolLib = nullptr) : QMainWindow(), m_planEdit(nullptr), m_logger(SituationMap::getLogger("PlanEditorTestMainWindow")) { QString title = QStringLiteral("PlanEditor Test Application"); setWindowTitle( title ); #ifdef USE_BASE_LAYOUT // Todo: Uncomment false: m_baseLay = new LtsWidgets::LtsBaseLayoutWidget(this); setCentralWidget( m_baseLay ); m_mainTab = m_baseLay->getTabFromLayoutArea(LtsWidgets::LayoutArea::eMainTab); m_dw = m_baseLay->getMenu(); m_map = SituationMap::Map::create(this); QHBoxLayout * layout = new QHBoxLayout(); layout->addWidget(m_map); delete m_mainTab->layout(); m_mainTab->setLayout(layout); m_mainTab->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); const QString & iniFileName = QStringLiteral("plan_editor_map_defaults.ini"); QString initFilePath = QStandardPaths::locate(QStandardPaths::HomeLocation, iniFileName, QStandardPaths::LocateFile); // find map defaults in Home if (initFilePath.isEmpty()) initFilePath = QStandardPaths::locate(QStandardPaths::AppLocalDataLocation, iniFileName, QStandardPaths::LocateFile); // if not look into the AppData Location if (initFilePath.isEmpty()) initFilePath = QCoreApplication::applicationDirPath() + QLatin1String("/") + iniFileName; // still not found? last try AppDir if (!QFile::exists(initFilePath)) FATAL_LOG(m_logger) << LOGFUNCTION << " MapIniFile location Failed"; else DEBUG_LOG(m_logger) << LOGFUNCTION << " MapIniFile found: " << initFilePath; SituationMap::MapSettings * mapSettings = new SituationMap::MapSettings(initFilePath, m_map); MapInitializer *mapInitializer = new MapInitializer(*m_map, *mapSettings, QLatin1String("PlanEditorTest"), m_map); if (mapInitializer->hasErrors()) { FATAL_LOG(m_logger) << LOGFUNCTION << " MapInitializer-filename='" << mapInitializer->filename() << "'' has following errors: " << " exists = " << mapInitializer->exists() << " accessError = " << mapInitializer->accessError() << " formatError = " << mapInitializer->formatError() ; m_map->deleteLater();; m_map = nullptr; return; } else { if (symbolLib) mapInitializer->setSymbologyType( *symbolLib ); else mapInitializer->setSymbologyType( AdvancedSymbology::SymbologyType::MIL2525D ); if (!mapInitializer->initMap(SituationMap::Mode::Mode_2D)) { QMessageBox::critical(this, title, tr("Init situation map failed. Abort ...")); m_map->deleteLater();; m_map = nullptr; return; } } m_planEdit = new PlanEditor::PlanEditor( m_map, m_baseLay ); connect( m_planEdit.data(), &PlanEditor::PlanEditor::quitPlanEditor, this, [this]() { m_planEdit -> deleteLater(); m_planEdit.clear(); close(); // By by TestMainWindow } ); #else m_map = SituationMap::Map::create(this); QSplitter * splitter = new QSplitter(this); QLabel * label = new QLabel("Moin World"), this; splitter->setOrientation(Qt::Orientation::Horizontal); splitter->addWidget(m_map); splitter->addWidget(label); setCentralWidget(splitter); #endif // connect( m_map, &SituationMap::Map::mapObjectsClicked, this, &SuperDax::onMapObjectClicked ); // Prepaire FunctionDialog for debugging purpose only: SituationMap::FunctionDialog::addButtonToMap(m_map); resize(1600,1000); if ((symbolLib) && ((AdvancedSymbology::SymbologyType::APP6D == *symbolLib) || (AdvancedSymbology::SymbologyType::MIL2525D == *symbolLib))) { AdvancedSymbology::SymbologyType symbologyType = *symbolLib; // connect(m_planEdit.data(), &PlanEditor::PlanEditor::symbolModelLoaded, this, [this,symbologyType]() { QSet sidcs; sidcs << AdvancedSymbology::SidcCodec::encodeComplete(symbologyType, QStringLiteral("10010100001205000000")); sidcs << AdvancedSymbology::SidcCodec::encodeComplete(symbologyType, QStringLiteral("10010100001106000000")); m_planEdit->setParticipantsSidcsInUse(sidcs); } // ); } } // TestMainWindow ~TestMainWindow() { delete m_map; // Test situation from real life and remove map first, to test "wrong" cleanup delete m_planEdit; } inline bool isValid() { return m_planEdit != nullptr; } private: LtsWidgets::LtsBaseLayoutWidget * m_baseLay; LtsWidgets::LtsTabWidget * m_mainTab; QWidget * m_dw; SituationMap::Map * m_map; QPointer m_planEdit; // because the PlanEditor could delete itself use QPointer SituationMap::LOGGER_T m_logger; }; // TestMainWindow // ------------------------------------------------------------------- int main (int argc, char* argv[]) { // ESRI : #ifdef Q_OS_WIN // Force usage of OpenGL ES through ANGLE on Windows QCoreApplication::setAttribute(Qt::AA_UseOpenGLES); #endif // : ESRI bool symbolTypeDefined = false; AdvancedSymbology::SymbologyType symbologyType = AdvancedSymbology::SymbologyType::MIL2525C; NGLApplication app ( argc, argv ); app.createLogger("planEditorApp", "log4cxx_planEditorTest.props"); STARTUP_LOG( app.baseLogger() ); app.setOrganizationName( QLatin1String( "RME" ) ); app.setApplicationName( QLatin1String( "Plan Editor Test Application" ) ); TRACE_LOG(app.baseLogger()) << LOGFUNCTION << " START"; if (argc < 2) { // usage: std::cout << argv[0] << std::endl << " usage: append 'mil' | 'app' to argumentlist" << std::endl << " e.g " << argv[0] << " [QTest options] [testfunction] none" << std::endl << " e.g " << argv[0] << " [QTest options] [testfunction] mil" << std::endl << " e.g " << argv[0] << " [QTest options] [testfunction] app" << std::endl << std::endl; symbologyType = AdvancedSymbology::SymbologyType::None; } else { const QString & strSymType = app.arguments().constLast(); // the last argument if(strSymType.compare(QLatin1String("none"), Qt::CaseInsensitive) == 0) { symbolTypeDefined = true; symbologyType = AdvancedSymbology::SymbologyType::None; } if(strSymType.compare(QLatin1String("mil2525c"), Qt::CaseInsensitive) == 0) { symbolTypeDefined = true; symbologyType = AdvancedSymbology::SymbologyType::MIL2525C; } if (strSymType.compare(QLatin1String("mil2525d"), Qt::CaseInsensitive) == 0) { symbolTypeDefined = true; symbologyType = AdvancedSymbology::SymbologyType::MIL2525D; } if(strSymType.compare(QLatin1String("app6b"), Qt::CaseInsensitive) == 0) { symbolTypeDefined = true; symbologyType = AdvancedSymbology::SymbologyType::APP6B; } if (strSymType.compare(QLatin1String("app6d"), Qt::CaseInsensitive) == 0) { symbolTypeDefined = true; symbologyType = AdvancedSymbology::SymbologyType::APP6D; } } LtsPluginManager::LtsPluginLoader *pluginLoader = LtsPluginManager::LtsPluginLoader::getInstance(); pluginLoader->loadPlugins( LtsPluginManager::PluginType::STYLE , nullptr, QStringList() << QStringLiteral("rme.light") ); pluginLoader->loadPlugins( LtsPluginManager::PluginType::PROJECT, nullptr, QStringList() << QStringLiteral("legatus") ); // .. to keep some compatibility to old resource structure TODO: rm ! QDir::setSearchPaths( QLatin1String( "icon" ), QStringList( QLatin1String( ":/style/icons/" ) ) ); QDir::setSearchPaths( QLatin1String( "icon" ), QStringList( QLatin1String( ":/style/" ) ) ); // FIXME: does qt check for recursion ?? // if (SituationMap::Map::applyLicense()) // DEBUG_LOG(app.baseLogger()) << LOGFUNCTION << " applyLicense ok"; // else // FATAL_LOG(app.baseLogger()) << LOGFUNCTION << " applyLicense failed"; #ifdef BUILD_STATIC_LIBRARIES // For static linking under windows: Q_INIT_RESOURCE(lts_resources); #endif TestMainWindow * mw = (symbolTypeDefined) ? new TestMainWindow( &symbologyType ) : new TestMainWindow(); if (!mw->isValid()) { delete mw; return -1; } int width = mw->frameGeometry().width(); int height = mw->frameGeometry().height(); QDesktopWidget wid; const QRect & screenRect = wid.availableGeometry(mw); int screenWidth = screenRect.width(); int screenHeight = screenRect.height(); mw->setGeometry((screenWidth/2)-(width/2),(screenHeight/2)-(height/2),width,height); mw->show(); app.setQuitOnLastWindowClosed(true); int retval = app.exec(); delete mw; SHUTDOWN_LOG(app.baseLogger()); return retval; } #include "main.moc"