Files
torstenandCopilot f15f342a47 QRegExp → QRegularExpression migration complete
Migrated all remaining QRegExp usage to QRegularExpression for Qt6 compatibility:

- Lts/Viewer/SituationMap/SymbologyImpl/symbol_dictionary_impl.cpp
  - Changed helper functions to use QRegularExpression::match().hasMatch()
  - Updated inline regex validation

- Lts/Plugins/PlanEditor/mil2525d_to_mil2525c.cpp
  - Fixed m_sidcQuery.exactMatch() → match().hasMatch()

- Lts/Plugins/PresentationManagement/Gui/Script/ScriptTimelineEditor/pre_script_dialog.cpp
  - Video file pattern matching migrated

- Lts/Proxies/TrainingAreaBase/Plugins/Nmea/nmea_handler_rx.cpp
  - NMEA message parsing with QRegularExpression

- Lts/Proxies/TrainingAreaBaseOC/handler_aes_data.cpp
  - AES data handler regex patterns migrated

- Lts/Services/AudioVideoManagement/stream_name_mapping.*
  - Stream name validation patterns

- Lts/Services/NmeaManagement/nmea_handler.cpp
  - NMEA handler regex patterns

- Lts/Viewer/SituationMap/Symbology/sidc_builder_base.cpp, sidc_codec.cpp
  - SIDC code validation patterns

- Test files updated for compilation

All QRegExp::exactMatch() calls replaced with QRegularExpression::match().hasMatch()
All QRegExp::cap(n) calls replaced with QRegularExpressionMatch::captured(n)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-08-24 19:10:44 +02:00

393 lines
14 KiB
C++
Executable File

#include <nglapplication/nglapplication.h>
#include <NGLLogger/INGLLogger.h>
#include "../plan_editor.h"
#include <LtsWidgets/lts_base_layout_widget.h>
#include <LtsWidgets/lts_tab_widget.h>
#include <LtsPluginManager/lts_plugin_loader.h>
#include <PluginInterfaces/style_plugin_interface.h>
#include <PluginInterfaces/project_plugin_interface.h>
#include <Map/map.h>
#include <Map/grid.h>
#include <Rubberbands/rubberband_drawable.h>
#include <QtCore/QDir>
#include <QtCore/QPointer>
#include <QtCore/QStandardPaths>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QHBoxLayout>
#include <QtGui/QScreen>
#include <QtWidgets/QMessageBox>
#include <QtWidgets/QLabel>
#include <Map/object_factory.h>
#include <Map/map_initializer.h>
#include <MapObjectsImpl/polygon_impl.h>
#include <MapObjectsImpl/polyline_impl.h>
#include <MapObjectsImpl/text_impl.h>
#include <MapObjectsImpl/area_fire_impl.h>
#include <MapObjectsImpl/biological_agent_impl.h>
#include <MapObjectsImpl/chemical_agent_impl.h>
#include <MapObjectsImpl/building_outline_impl.h>
#include <MapObjectsImpl/danger_area_impl.h>
#include <MapObjectsImpl/functional_area_impl.h>
#include <MapObjectsImpl/geo_image_impl.h>
#include <MapObjectsImpl/hit_line_impl.h>
#include <MapObjectsImpl/map_object_indicator_impl.h>
#include <MapObjectsImpl/mine_impl.h>
#include <MapObjectsImpl/mine_field_impl.h>
#include <MapObjectsImpl/nuclear_agent_impl.h>
#include <MapObjectsImpl/participant_impl.h>
#include <MapObjectsImpl/single_fire_impl.h>
#include <MapImpl/sidc_symbol_impl.h>
#include <MapImpl/sight_fan_impl.h>
#include<Symbology/sidc_codec.h>
#include<Symbology/sidc_builder.h>
#include <FunctionDialog/function_dialog.h>
#include <iostream>
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::MapObjectIndicatorImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Polygon), new SituationMap::GenericObjectFactory<SituationMap::PolygonImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Polyline), new SituationMap::GenericObjectFactory<SituationMap::PolylineImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Text), new SituationMap::GenericObjectFactory<SituationMap::TextImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Participant), new SituationMap::GenericObjectFactory<SituationMap::ParticipantImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::AreaFire), new SituationMap::GenericObjectFactory<SituationMap::AreaFireImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::BiologicalAgent), new SituationMap::GenericObjectFactory<SituationMap::BiologicalAgentImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::ChemicalAgent), new SituationMap::GenericObjectFactory<SituationMap::ChemicalAgentImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::BuildingOutline), new SituationMap::GenericObjectFactory<SituationMap::BuildingOutlineImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::DangerArea), new SituationMap::GenericObjectFactory<SituationMap::DangerAreaImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::FunctionalArea), new SituationMap::GenericObjectFactory<SituationMap::FunctionalAreaImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::GeoImage), new SituationMap::GenericObjectFactory<SituationMap::GeoImageImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::HitLine), new SituationMap::GenericObjectFactory<SituationMap::HitLineImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Mine), new SituationMap::GenericObjectFactory<SituationMap::MineImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::MineField), new SituationMap::GenericObjectFactory<SituationMap::MineFieldImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::NuclearAgent), new SituationMap::GenericObjectFactory<SituationMap::NuclearAgentImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::SingleFire), new SituationMap::GenericObjectFactory<SituationMap::SingleFireImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::SidcSymbol), new SituationMap::GenericObjectFactory<SituationMap::SidcSymbolImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::SightFan), new SituationMap::GenericObjectFactory<SituationMap::SightFanImpl>());
return true;
}
AdvancedSymbology::SymbologyType symbologyType() const override
{
return (m_useSymbologyFromInitFile) ? SituationMap::MapInitializer::symbologyType() : m_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);
}
};
#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
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);
if (initFilePath.isEmpty()) initFilePath = QStandardPaths::locate(QStandardPaths::AppLocalDataLocation, iniFileName, QStandardPaths::LocateFile);
if (initFilePath.isEmpty()) initFilePath = QCoreApplication::applicationDirPath() + QLatin1String("/") + iniFileName;
if (!QFile::exists(initFilePath))
FATAL_LOG(m_logger) << Q_FUNC_INFO << " MapIniFile location Failed";
else
DEBUG_LOG(m_logger) << Q_FUNC_INFO << " 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) << Q_FUNC_INFO << " 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();
} );
#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
SituationMap::FunctionDialog::addButtonToMap(m_map);
resize(1600,1000);
if ((symbolLib) && ((AdvancedSymbology::SymbologyType::APP6D == *symbolLib) || (AdvancedSymbology::SymbologyType::MIL2525D == *symbolLib)))
{
AdvancedSymbology::SymbologyType symbologyType = *symbolLib;
{
QSet<QString> sidcs;
sidcs << AdvancedSymbology::SidcCodec::encodeComplete(symbologyType, QStringLiteral("10010100001205000000"));
sidcs << AdvancedSymbology::SidcCodec::encodeComplete(symbologyType, QStringLiteral("10010100001106000000"));
m_planEdit->setParticipantsSidcsInUse(sidcs);
}
}
}
~TestMainWindow()
{
delete m_map;
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<PlanEditor::PlanEditor> m_planEdit;
SituationMap::
};
int main (int argc, char* argv[])
{
#ifdef Q_OS_WIN
QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
#endif
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()) << Q_FUNC_INFO << " START";
if (argc < 2)
{
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();
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") );
QDir::setSearchPaths( QLatin1String( "icon" ), QStringList( QLatin1String( ":/style/icons/" ) ) );
QDir::setSearchPaths( QLatin1String( "icon" ), QStringList( QLatin1String( ":/style/" ) ) );
#ifdef BUILD_STATIC_LIBRARIES
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();
const QRect & screenRect = QGuiApplication::primaryScreen()->availableGeometry();
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"