2025-10-30 00:15:44 +00:00
|
|
|
#include "ui/ModelBrowser/PresetModelPanel.h"
|
2025-10-29 00:16:25 +00:00
|
|
|
|
|
|
|
|
#include <QApplication>
|
|
|
|
|
#include <QDebug>
|
|
|
|
|
#include <QListWidgetItem>
|
|
|
|
|
#include <QMimeData>
|
|
|
|
|
#include <QDrag>
|
|
|
|
|
#include <QPixmap>
|
|
|
|
|
#include <QPainter>
|
|
|
|
|
#include <QVBoxLayout>
|
2025-11-01 10:08:02 +00:00
|
|
|
#include <QMetaType>
|
2025-10-29 00:16:25 +00:00
|
|
|
#include <QHBoxLayout>
|
|
|
|
|
#include <QLabel>
|
|
|
|
|
#include <QIcon>
|
|
|
|
|
#include <QMouseEvent>
|
2025-11-01 10:08:02 +00:00
|
|
|
#include <QFontMetrics>
|
2025-10-29 00:16:25 +00:00
|
|
|
|
2025-11-01 10:08:02 +00:00
|
|
|
#include "common/RecourceHelper.h"
|
2025-10-30 00:15:44 +00:00
|
|
|
#include "common/SpdLogger.h"
|
|
|
|
|
#include "ui/DockTitleBar.h"
|
|
|
|
|
#include "ui/DockWidget.h"
|
|
|
|
|
|
|
|
|
|
#include "ui_PresetModelPanel.h"
|
|
|
|
|
|
|
|
|
|
|
2025-10-29 00:16:25 +00:00
|
|
|
PresetModelPanel::PresetModelPanel(QWidget *parent)
|
|
|
|
|
: QWidget(parent)
|
2025-10-30 00:15:44 +00:00
|
|
|
, ui(new Ui::PresetModelPanel)
|
2025-11-01 10:08:02 +00:00
|
|
|
, dragSourceWidget_(nullptr)
|
2025-10-29 00:16:25 +00:00
|
|
|
{
|
2025-10-30 00:15:44 +00:00
|
|
|
ui->setupUi(this);
|
2025-10-29 00:16:25 +00:00
|
|
|
InitUI();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PresetModelPanel::~PresetModelPanel()
|
|
|
|
|
{
|
2025-10-30 00:15:44 +00:00
|
|
|
delete ui;
|
2025-10-29 00:16:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PresetModelPanel::AttachDock(DockWidget* dockWidget)
|
|
|
|
|
{
|
|
|
|
|
if (nullptr == dockWidget) {
|
|
|
|
|
qDebug() << __FUNCTION__ << "dockwidget is nullptr";
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dockWidget->SetDockWidgetTitleBar(nullptr);
|
|
|
|
|
dockWidget->setWidget(this);
|
|
|
|
|
|
|
|
|
|
DockTitleBar* dockTitleBar = new DockTitleBar;
|
|
|
|
|
dockWidget->SetDockWidgetTitleBar(dockTitleBar);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PresetModelPanel::InitUI()
|
|
|
|
|
{
|
2025-10-30 00:15:44 +00:00
|
|
|
// Try to load model data from configuration files
|
2025-11-01 10:08:02 +00:00
|
|
|
QString presetsPath = QString("%1/presets").arg(RecourceHelper::Get().GetResourcesPath());
|
|
|
|
|
if (configParser_.LoadAllConfigs(presetsPath)) {
|
2025-10-30 00:15:44 +00:00
|
|
|
// Successfully loaded from configuration files
|
|
|
|
|
LoadModelsFromConfig();
|
|
|
|
|
} else {
|
|
|
|
|
// Failed to load configuration files, use hardcoded defaults as fallback
|
|
|
|
|
LOG_WARN("Failed to load preset models from config files, using hardcoded defaults. Error: {}",
|
2025-11-01 10:08:02 +00:00
|
|
|
configParser_.GetLastError().toStdString());
|
2025-10-30 00:15:44 +00:00
|
|
|
LoadDefaultModels();
|
|
|
|
|
}
|
2025-10-29 00:16:25 +00:00
|
|
|
}
|
|
|
|
|
|
2025-10-30 00:15:44 +00:00
|
|
|
void PresetModelPanel::LoadModelsFromConfig()
|
2025-10-29 00:16:25 +00:00
|
|
|
{
|
2025-10-30 00:15:44 +00:00
|
|
|
// Load ship models
|
2025-11-01 10:08:02 +00:00
|
|
|
ModelCategory shipCategory = configParser_.GetCategory("Ship");
|
|
|
|
|
if (!shipCategory.models.isEmpty()) {
|
|
|
|
|
ui->shipList->setModelType("Ship");
|
|
|
|
|
ui->shipList->setModelList(shipCategory.models);
|
2025-10-30 00:15:44 +00:00
|
|
|
}
|
2025-10-29 00:16:25 +00:00
|
|
|
|
2025-10-30 00:15:44 +00:00
|
|
|
// Load satellite models
|
2025-11-01 10:08:02 +00:00
|
|
|
ModelCategory satelliteCategory = configParser_.GetCategory("Satellite");
|
|
|
|
|
if (!satelliteCategory.models.isEmpty()) {
|
|
|
|
|
ui->satelliteList->setModelType("Satellite");
|
|
|
|
|
ui->satelliteList->setModelList(satelliteCategory.models);
|
2025-10-30 00:15:44 +00:00
|
|
|
}
|
2025-10-29 00:16:25 +00:00
|
|
|
|
2025-10-30 00:15:44 +00:00
|
|
|
// Load missile models
|
2025-11-01 10:08:02 +00:00
|
|
|
ModelCategory missileCategory = configParser_.GetCategory("Missile");
|
|
|
|
|
if (!missileCategory.models.isEmpty()) {
|
|
|
|
|
ui->missileList->setModelType("Missile");
|
|
|
|
|
ui->missileList->setModelList(missileCategory.models);
|
2025-10-30 00:15:44 +00:00
|
|
|
}
|
2025-10-29 00:16:25 +00:00
|
|
|
|
2025-10-30 00:15:44 +00:00
|
|
|
// Load jammer models
|
2025-11-01 10:08:02 +00:00
|
|
|
ModelCategory jammerCategory = configParser_.GetCategory("Jammer");
|
|
|
|
|
if (!jammerCategory.models.isEmpty()) {
|
|
|
|
|
ui->jammerList->setModelType("Jammer");
|
|
|
|
|
ui->jammerList->setModelList(jammerCategory.models);
|
2025-10-30 00:15:44 +00:00
|
|
|
}
|
2025-10-29 00:16:25 +00:00
|
|
|
}
|
|
|
|
|
|
2025-10-30 00:15:44 +00:00
|
|
|
void PresetModelPanel::LoadDefaultModels()
|
2025-10-29 00:16:25 +00:00
|
|
|
{
|
2025-10-30 00:15:44 +00:00
|
|
|
// Use hardcoded default models as fallback mechanism
|
2025-11-01 10:08:02 +00:00
|
|
|
QVector<ModelInfo> shipModels = {
|
|
|
|
|
{"destroyer", "Destroyer", "Naval destroyer vessel", "", ":/icons/ship.png", true},
|
|
|
|
|
{"aircraft_carrier", "Aircraft Carrier", "Large naval vessel", "", ":/icons/ship.png", true},
|
|
|
|
|
{"frigate", "Frigate", "Fast naval vessel", "", ":/icons/ship.png", true},
|
|
|
|
|
{"submarine", "Submarine", "Underwater vessel", "", ":/icons/ship.png", true}
|
2025-10-30 00:15:44 +00:00
|
|
|
};
|
2025-11-01 10:08:02 +00:00
|
|
|
ui->shipList->setModelType("Ship");
|
|
|
|
|
ui->shipList->setModelList(shipModels);
|
|
|
|
|
|
|
|
|
|
QVector<ModelInfo> satelliteModels = {
|
|
|
|
|
{"comm_satellite", "Communication Satellite", "Communication satellite", "", ":/icons/satellite.png", true},
|
|
|
|
|
{"weather_satellite", "Weather Satellite", "Weather monitoring satellite", "", ":/icons/satellite.png", true},
|
|
|
|
|
{"gps_satellite", "GPS Satellite", "GPS navigation satellite", "", ":/icons/satellite.png", true},
|
|
|
|
|
{"spy_satellite", "Spy Satellite", "Reconnaissance satellite", "", ":/icons/satellite.png", true}
|
2025-10-29 00:16:25 +00:00
|
|
|
};
|
2025-11-01 10:08:02 +00:00
|
|
|
ui->satelliteList->setModelType("Satellite");
|
|
|
|
|
ui->satelliteList->setModelList(satelliteModels);
|
|
|
|
|
|
|
|
|
|
QVector<ModelInfo> missileModels = {
|
|
|
|
|
{"cruise_missile", "Cruise Missile", "Long-range cruise missile", "", ":/icons/missile.png", true},
|
|
|
|
|
{"ballistic_missile", "Ballistic Missile", "Ballistic missile", "", ":/icons/missile.png", true},
|
|
|
|
|
{"anti_ship_missile", "Anti-Ship Missile", "Anti-ship missile", "", ":/icons/missile.png", true},
|
|
|
|
|
{"sam_missile", "Surface-to-Air Missile", "Surface-to-air missile", "", ":/icons/missile.png", true}
|
2025-10-29 00:16:25 +00:00
|
|
|
};
|
2025-11-01 10:08:02 +00:00
|
|
|
ui->missileList->setModelType("Missile");
|
|
|
|
|
ui->missileList->setModelList(missileModels);
|
|
|
|
|
|
|
|
|
|
QVector<ModelInfo> jammerModels = {
|
|
|
|
|
{"electronic_jammer", "Electronic Jammer", "Electronic warfare jammer", "", ":/icons/jammer.png", true},
|
|
|
|
|
{"comm_jammer", "Communication Jammer", "Communication jammer", "", ":/icons/jammer.png", true},
|
|
|
|
|
{"radar_jammer", "Radar Jammer", "Radar jamming device", "", ":/icons/jammer.png", true},
|
|
|
|
|
{"gps_jammer", "GPS Jammer", "GPS jamming device", "", ":/icons/jammer.png", true}
|
2025-10-29 00:16:25 +00:00
|
|
|
};
|
2025-11-01 10:08:02 +00:00
|
|
|
ui->jammerList->setModelType("Jammer");
|
|
|
|
|
ui->jammerList->setModelList(jammerModels);
|
2025-10-29 00:16:25 +00:00
|
|
|
}
|
|
|
|
|
|
2025-11-01 10:08:02 +00:00
|
|
|
// void PresetModelPanel::OnModelItemDoubleClicked(QListWidgetItem* item)
|
|
|
|
|
// {
|
|
|
|
|
// if (!item) return;
|
|
|
|
|
|
|
|
|
|
// // Get the list widget that contains this item
|
|
|
|
|
// QListWidget* listWidget = item->listWidget();
|
|
|
|
|
// if (!listWidget) return;
|
|
|
|
|
|
|
|
|
|
// QString modelType = listWidget->property("modelType").toString();
|
|
|
|
|
|
|
|
|
|
// // Get model name from stored data
|
|
|
|
|
// QString modelName = item->data(Qt::UserRole).toString();
|
|
|
|
|
// if (modelName.isEmpty()) {
|
|
|
|
|
// modelName = item->text(); // Fallback to display text
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// LOG_INFO("Model double-clicked: {} of type {}", qPrintable(modelName), qPrintable(modelType));
|
|
|
|
|
|
|
|
|
|
// // Emit signal for model selection
|
|
|
|
|
// emit ModelDropped(modelType, modelName);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// bool PresetModelPanel::eventFilter(QObject* obj, QEvent* event)
|
|
|
|
|
// {
|
|
|
|
|
// QListWidget* listWidget = qobject_cast<QListWidget*>(obj);
|
|
|
|
|
// if (!listWidget) {
|
|
|
|
|
// return QWidget::eventFilter(obj, event);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// if (event->type() == QEvent::MouseButtonPress) {
|
|
|
|
|
// QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
|
|
|
|
|
// if (mouseEvent->button() == Qt::LeftButton) {
|
|
|
|
|
// dragStartPosition_ = mouseEvent->pos();
|
|
|
|
|
// dragSourceWidget_ = listWidget;
|
|
|
|
|
// }
|
|
|
|
|
// } else if (event->type() == QEvent::MouseMove) {
|
|
|
|
|
// QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
|
|
|
|
|
// if (!(mouseEvent->buttons() & Qt::LeftButton)) {
|
|
|
|
|
// return QWidget::eventFilter(obj, event);
|
|
|
|
|
// }
|
2025-10-29 00:16:25 +00:00
|
|
|
|
2025-11-01 10:08:02 +00:00
|
|
|
// if ((mouseEvent->pos() - dragStartPosition_).manhattanLength() < QApplication::startDragDistance()) {
|
|
|
|
|
// return QWidget::eventFilter(obj, event);
|
|
|
|
|
// }
|
2025-10-29 00:16:25 +00:00
|
|
|
|
2025-11-01 10:08:02 +00:00
|
|
|
// QListWidgetItem* item = listWidget->itemAt(dragStartPosition_);
|
|
|
|
|
// if (!item) {
|
|
|
|
|
// return QWidget::eventFilter(obj, event);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// QString modelType = listWidget->property("modelType").toString();
|
|
|
|
|
|
|
|
|
|
// // Get model name from stored data
|
|
|
|
|
// QString modelName = item->data(Qt::UserRole).toString();
|
|
|
|
|
// if (modelName.isEmpty()) {
|
|
|
|
|
// modelName = item->text(); // Fallback to item text
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// // Create mime data
|
|
|
|
|
// QMimeData* mimeData = new QMimeData;
|
|
|
|
|
// QString dragData = QString("%1|%2").arg(modelType, modelName);
|
|
|
|
|
// mimeData->setData("application/x-preset-model", dragData.toUtf8());
|
|
|
|
|
|
|
|
|
|
// // Create drag object
|
|
|
|
|
// QDrag* drag = new QDrag(this);
|
|
|
|
|
// drag->setMimeData(mimeData);
|
|
|
|
|
|
|
|
|
|
// // Set drag pixmap (icon or text)
|
|
|
|
|
// QPixmap pixmap(item->icon().pixmap(32, 32));
|
|
|
|
|
// if (pixmap.isNull()) {
|
|
|
|
|
// pixmap = QPixmap(100, 30);
|
|
|
|
|
// pixmap.fill(Qt::transparent);
|
|
|
|
|
// QPainter painter(&pixmap);
|
|
|
|
|
// painter.setPen(Qt::black);
|
|
|
|
|
// painter.drawText(pixmap.rect(), Qt::AlignCenter, item->text());
|
|
|
|
|
// }
|
|
|
|
|
// drag->setPixmap(pixmap);
|
|
|
|
|
|
|
|
|
|
// // Execute drag
|
|
|
|
|
// Qt::DropAction dropAction = drag->exec(Qt::CopyAction);
|
|
|
|
|
// Q_UNUSED(dropAction);
|
|
|
|
|
|
|
|
|
|
// return true;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// return QWidget::eventFilter(obj, event);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// // DraggableListWidget implementation
|
|
|
|
|
// DraggableListWidget::DraggableListWidget(const QString& modelType, QWidget* parent)
|
|
|
|
|
// : QListWidget(parent), modelType_(modelType)
|
|
|
|
|
// {
|
|
|
|
|
// setProperty("modelType", modelType);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// void DraggableListWidget::mousePressEvent(QMouseEvent* event)
|
|
|
|
|
// {
|
|
|
|
|
// QListWidget::mousePressEvent(event);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// void DraggableListWidget::mouseMoveEvent(QMouseEvent* event)
|
|
|
|
|
// {
|
|
|
|
|
// QListWidget::mouseMoveEvent(event);
|
|
|
|
|
// }
|