Files
qt-migration-legatus/qt5-before/dlbo/Lts/Tools/RestClientUi/main_window.cpp
T
torstenandCopilot 7173785915 Qt6 Migration: Complete migration with DDS/RTI support and build validation
Major Changes:
- Merged latest Qt5 devel content from dlbo (292 files changed, 7 new dirs)
- Consolidated forward-declarations and include folders
- Removed unneeded modules per Niklas' repo check list

Build System Fixes:
- Fixed CMake VERSION_GREATER syntax in ParticipantManagement/CMakeLists.txt
- Added VLC packages (libvlc-dev, vlc-plugin-base) to docker_build.sh
- Added PostgreSQL dev packages (libpq-dev, postgresql-server-dev-all) to Dockerfile
- Fixed locale warnings (ANSI_X3.4-1968 → C.UTF-8)
- Fixed ArcGIS SDK path warnings when BUILD_ARCGIS=OFF

Code Generation Fixes:
- Fixed IDL enum collisions (PortType→CorePortType/DdsutPortType, PdmEventType)
- Fixed Grantlee template svc_translation.cpp.grantlee:
  - Changed {{ idl_enum.name }}_def:: to {{ idl_enum.name }}::
  - Fixed .underlying() calls for C++11 scoped enums (enum class)
- Removed generated files from repo (moc_*, *_dtc.h, *_ftc.h)

Validation:
- BUILD_RTI=ON: SUCCESS
- BUILD_RTI=OFF: SUCCESS
- C++17 standard maintained for RTI 7.7 compatibility
- Ubuntu 26.04 Docker environment verified

Remaining Warnings (expected):
- BgViewer, KDChart, KDReports, Poppler-Qt6 not found (optional features)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-09-15 18:20:26 +00:00

302 lines
9.1 KiB
C++

#include "main_window.h"
#include "LtsRestClient/lts_rest_client.h"
#include "ui_main_window.h"
#include <QCoreApplication>
#include <QDir>
#include <QFile>
#include <QFileDialog>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonParseError>
#include <QMessageBox>
#include <QPushButton>
// Documentation on how to use it can be found at https://confluence-classified.rh-int.de/spaces/LEG/pages/207919552/HOWTO+RestClientUi+Tool
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// Connect core HTTP actions
connect(ui->m_getBtn, &QPushButton::clicked, this, &MainWindow::onGetClicked);
connect(ui->m_postBtn, &QPushButton::clicked, this, &MainWindow::onPostClicked);
connect(ui->m_putBtn, &QPushButton::clicked, this, &MainWindow::onPutClicked);
connect(ui->m_deleteBtn, &QPushButton::clicked, this, &MainWindow::onDeleteClicked);
// Connect logging output actions
connect(ui->m_clearResponseBtn, &QPushButton::clicked, this, &MainWindow::onClearResponseClicked);
connect(ui->m_exportResponseBtn, &QPushButton::clicked, this, &MainWindow::onExportResponseClicked);
loadRequestTemplates();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onClearResponseClicked()
{
ui->m_responseOutput->clear();
}
void MainWindow::onExportResponseClicked()
{
const QString content = ui->m_responseOutput->toPlainText().trimmed();
if (content.isEmpty())
{
QMessageBox::warning(this, QStringLiteral("Export Failed"), QStringLiteral("There is no response data available to export."));
return;
}
const QString fileName = QFileDialog::getSaveFileName(this,
QStringLiteral("Save Response as JSON"),
QDir::homePath() + QStringLiteral("/response.json"),
QStringLiteral("JSON Files (*.json);;All Files (*)"));
if (fileName.isEmpty())
return;
QJsonParseError parseError;
const QJsonDocument jsonDoc = QJsonDocument::fromJson(content.toUtf8(), &parseError);
QByteArray dataToWrite;
if (parseError.error == QJsonParseError::NoError)
dataToWrite = jsonDoc.toJson(QJsonDocument::Indented);
else
dataToWrite = content.toUtf8();
QFile file(fileName);
if (file.open(QIODevice::WriteOnly | QIODevice::Text))
{
file.write(dataToWrite);
file.close();
QMessageBox::information(this, QStringLiteral("Success"), QStringLiteral("File saved successfully."));
}
else
QMessageBox::critical(this, QStringLiteral("Error"), QStringLiteral("Could not write to file:\n") + file.errorString());
}
void MainWindow::highlightMethodButton(const QString &method)
{
// Reset stylesheets for all HTTP method buttons back to default
ui->m_getBtn->setStyleSheet(QString());
ui->m_postBtn->setStyleSheet(QString());
ui->m_putBtn->setStyleSheet(QString());
ui->m_deleteBtn->setStyleSheet(QString());
// Modern green border highlight style string
const QString highlightStyle = QStringLiteral("border: 2px solid #2ecc71; font-weight: bold; background-color: #e8f8f5;");
// Apply style based on the uppercase method string
const QString upperMethod = method.toUpper().trimmed();
if (upperMethod == QStringLiteral("GET"))
ui->m_getBtn->setStyleSheet(highlightStyle);
else if (upperMethod == QStringLiteral("POST"))
ui->m_postBtn->setStyleSheet(highlightStyle);
else if (upperMethod == QStringLiteral("PUT"))
ui->m_putBtn->setStyleSheet(highlightStyle);
else if (upperMethod == QStringLiteral("DELETE")
|| upperMethod == QStringLiteral("DEL"))
ui->m_deleteBtn->setStyleSheet(highlightStyle);
}
void MainWindow::loadRequestTemplates()
{
const QString templatePath = QCoreApplication::applicationDirPath() + QStringLiteral("/templates");
QDir directory(templatePath);
if (!directory.exists())
directory.mkpath(QStringLiteral("."));
QStringList filters;
filters << QStringLiteral("*.json");
directory.setNameFilters(filters);
const QFileInfoList fileList = directory.entryInfoList(QDir::Files);
int insertIndex = 0;
for (const QFileInfo &fileInfo : fileList)
{
const QString absolutePath = fileInfo.absoluteFilePath();
QFile file(absolutePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
continue;
}
const QByteArray fileContent = file.readAll();
file.close();
QJsonParseError parseError;
const QJsonDocument metaDoc = QJsonDocument::fromJson(fileContent, &parseError);
if (parseError.error != QJsonParseError::NoError
|| !metaDoc.isObject())
continue;
const QJsonObject metaObj = metaDoc.object();
QString displayName = metaObj.value(QStringLiteral("name")).toString();
if (displayName.isEmpty())
displayName = fileInfo.fileName();
const QString targetEndpoint = metaObj.value(QStringLiteral("endpoint")).toString();
const QString targetMethod = metaObj.value(QStringLiteral("method")).toString().toUpper().trimmed();
QPushButton *templateBtn = new QPushButton(displayName, this);
connect(templateBtn, &QPushButton::clicked, this, [this, metaObj, targetEndpoint, targetMethod]()
{
// 1. Fill values into fields
ui->m_endpointInput->setText(targetEndpoint);
ui->m_jsonInput->clear();
if (metaObj.contains(QStringLiteral("payload")))
{
const QJsonValue payloadValue = metaObj.value(QStringLiteral("payload"));
if (payloadValue.isObject())
{
const QJsonDocument doc(payloadValue.toObject());
ui->m_jsonInput->setPlainText(QString::fromUtf8(doc.toJson(QJsonDocument::Indented)));
}
else if (payloadValue.isArray())
{
const QJsonDocument doc(payloadValue.toArray());
ui->m_jsonInput->setPlainText(QString::fromUtf8(doc.toJson(QJsonDocument::Indented)));
}
else
{
ui->m_jsonInput->setPlainText(payloadValue.toVariant().toString());
}
}
// 2. Visually focus the matching HTTP button
highlightMethodButton(targetMethod);
// 3. NEW: Optional Auto-Submit trigger chain execution
if (ui->m_autoSubmitCheck->isChecked())
{
if (targetMethod == QStringLiteral("GET"))
ui->m_getBtn->animateClick(); // animateClick provides nice visual feedback
else if (targetMethod == QStringLiteral("POST"))
ui->m_postBtn->animateClick();
else if (targetMethod == QStringLiteral("PUT"))
ui->m_putBtn->animateClick();
else if (targetMethod == QStringLiteral("DELETE")
|| targetMethod == QStringLiteral("DEL"))
ui->m_deleteBtn->animateClick();
}
});
ui->templateButtonContainer->insertWidget(insertIndex++, templateBtn);
}
}
LtsCommon::LtsRestClient *MainWindow::createClient()
{
return new LtsCommon::LtsRestClient(ui->m_urlInput->text(), this);
}
void MainWindow::showSuccess(const QJsonDocument &json)
{
ui->m_responseOutput->setTextColor(QColor(Qt::darkGreen));
ui->m_responseOutput->setText(QString::fromLatin1(json.toJson(QJsonDocument::Indented)));
}
void MainWindow::showError(const QString &error)
{
ui->m_responseOutput->setTextColor(QColor(Qt::red));
ui->m_responseOutput->setText(QStringLiteral("Error: ") + error);
}
void MainWindow::onGetClicked()
{
ui->m_responseOutput->clear();
LtsCommon::LtsRestClient *client = createClient();
client->get(
ui->m_endpointInput->text(),
[this](const QJsonDocument &json)
{
showSuccess(json);
},
[this](const QString &err)
{
showError(err);
});
}
void MainWindow::onPostClicked()
{
ui->m_responseOutput->clear();
QJsonParseError parseError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(ui->m_jsonInput->toPlainText().toUtf8(), &parseError);
if (parseError.error != QJsonParseError::NoError)
{
showError(QStringLiteral("Invalid JSON input syntax: ") + parseError.errorString());
return;
}
LtsCommon::LtsRestClient *client = createClient();
client->post(
ui->m_endpointInput->text(), jsonDoc,
[this](const QJsonDocument &json)
{
showSuccess(json);
},
[this](const QString &err)
{
showError(err);
});
}
void MainWindow::onPutClicked()
{
ui->m_responseOutput->clear();
QJsonParseError parseError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(ui->m_jsonInput->toPlainText().toUtf8(), &parseError);
if (parseError.error != QJsonParseError::NoError)
{
showError(QStringLiteral("Invalid JSON input syntax: ") + parseError.errorString());
return;
}
LtsCommon::LtsRestClient *client = createClient();
client->put(
ui->m_endpointInput->text(), jsonDoc,
[this](const QJsonDocument &json)
{
showSuccess(json);
},
[this](const QString &err)
{
showError(err);
});
}
void MainWindow::onDeleteClicked()
{
ui->m_responseOutput->clear();
LtsCommon::LtsRestClient *client = createClient();
client->del(
ui->m_endpointInput->text(),
[this](const QJsonDocument &json)
{
showSuccess(json);
},
[this](const QString &err)
{
showError(err);
});
}