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>
|
|
|
|
|
#include <QHBoxLayout>
|
|
|
|
|
#include <QLabel>
|
|
|
|
|
#include <QIcon>
|
|
|
|
|
#include <QMouseEvent>
|
|
|
|
|
|
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-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
|
|
|
|
|
if (m_configParser.LoadAllConfigs("workspace/presets")) {
|
|
|
|
|
// 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: {}",
|
|
|
|
|
m_configParser.GetLastError().toStdString());
|
|
|
|
|
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
|
|
|
|
|
QStringList shipModels = m_configParser.GetModelNames("Ship");
|
|
|
|
|
if (!shipModels.isEmpty()) {
|
|
|
|
|
PopulateModelList(ui->shipList, "Ship", shipModels);
|
|
|
|
|
}
|
2025-10-29 00:16:25 +00:00
|
|
|
|
2025-10-30 00:15:44 +00:00
|
|
|
// Load satellite models
|
|
|
|
|
QStringList satelliteModels = m_configParser.GetModelNames("Satellite");
|
|
|
|
|
if (!satelliteModels.isEmpty()) {
|
|
|
|
|
PopulateModelList(ui->satelliteList, "Satellite", satelliteModels);
|
|
|
|
|
}
|
2025-10-29 00:16:25 +00:00
|
|
|
|
2025-10-30 00:15:44 +00:00
|
|
|
// Load missile models
|
|
|
|
|
QStringList missileModels = m_configParser.GetModelNames("Missile");
|
|
|
|
|
if (!missileModels.isEmpty()) {
|
|
|
|
|
PopulateModelList(ui->missileList, "Missile", missileModels);
|
|
|
|
|
}
|
2025-10-29 00:16:25 +00:00
|
|
|
|
2025-10-30 00:15:44 +00:00
|
|
|
// Load jammer models
|
|
|
|
|
QStringList jammerModels = m_configParser.GetModelNames("Jammer");
|
|
|
|
|
if (!jammerModels.isEmpty()) {
|
|
|
|
|
PopulateModelList(ui->jammerList, "Jammer", jammerModels);
|
|
|
|
|
}
|
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
|
|
|
|
|
QStringList shipModels = {
|
|
|
|
|
"Destroyer",
|
|
|
|
|
"Aircraft Carrier",
|
|
|
|
|
"Frigate",
|
|
|
|
|
"Submarine"
|
|
|
|
|
};
|
|
|
|
|
PopulateModelList(ui->shipList, "Ship", shipModels);
|
2025-10-29 00:16:25 +00:00
|
|
|
|
|
|
|
|
QStringList satelliteModels = {
|
2025-10-30 00:15:44 +00:00
|
|
|
"Communication Satellite",
|
|
|
|
|
"Weather Satellite",
|
|
|
|
|
"GPS Satellite",
|
|
|
|
|
"Spy Satellite"
|
2025-10-29 00:16:25 +00:00
|
|
|
};
|
2025-10-30 00:15:44 +00:00
|
|
|
PopulateModelList(ui->satelliteList, "Satellite", satelliteModels);
|
2025-10-29 00:16:25 +00:00
|
|
|
|
|
|
|
|
QStringList missileModels = {
|
2025-10-30 00:15:44 +00:00
|
|
|
"Cruise Missile",
|
|
|
|
|
"Ballistic Missile",
|
|
|
|
|
"Anti-Ship Missile",
|
|
|
|
|
"Surface-to-Air Missile"
|
2025-10-29 00:16:25 +00:00
|
|
|
};
|
2025-10-30 00:15:44 +00:00
|
|
|
PopulateModelList(ui->missileList, "Missile", missileModels);
|
2025-10-29 00:16:25 +00:00
|
|
|
|
|
|
|
|
QStringList jammerModels = {
|
2025-10-30 00:15:44 +00:00
|
|
|
"Electronic Jammer",
|
|
|
|
|
"Communication Jammer",
|
|
|
|
|
"Radar Jammer",
|
|
|
|
|
"GPS Jammer"
|
2025-10-29 00:16:25 +00:00
|
|
|
};
|
2025-10-30 00:15:44 +00:00
|
|
|
PopulateModelList(ui->jammerList, "Jammer", jammerModels);
|
2025-10-29 00:16:25 +00:00
|
|
|
}
|
|
|
|
|
|
2025-10-30 00:15:44 +00:00
|
|
|
void PresetModelPanel::PopulateModelList(QListWidget* listWidget, const QString& modelType, const QStringList& models)
|
2025-10-29 00:16:25 +00:00
|
|
|
{
|
2025-10-30 00:15:44 +00:00
|
|
|
if (!listWidget) return;
|
2025-10-29 00:16:25 +00:00
|
|
|
|
2025-10-30 00:15:44 +00:00
|
|
|
// Set the model type as a property for later use
|
|
|
|
|
listWidget->setProperty("modelType", modelType);
|
2025-10-29 00:16:25 +00:00
|
|
|
|
|
|
|
|
for (const QString& model : models) {
|
|
|
|
|
QListWidgetItem* item = new QListWidgetItem(model);
|
|
|
|
|
item->setFlags(item->flags() | Qt::ItemIsDragEnabled);
|
|
|
|
|
|
|
|
|
|
if (modelType == "Ship") {
|
|
|
|
|
item->setIcon(QIcon(":/icons/ship.png"));
|
|
|
|
|
} else if (modelType == "Satellite") {
|
|
|
|
|
item->setIcon(QIcon(":/icons/satellite.png"));
|
|
|
|
|
} else if (modelType == "Missile") {
|
|
|
|
|
item->setIcon(QIcon(":/icons/missile.png"));
|
|
|
|
|
} else if (modelType == "Jammer") {
|
|
|
|
|
item->setIcon(QIcon(":/icons/jammer.png"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
listWidget->addItem(item);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
connect(listWidget, &QListWidget::itemDoubleClicked, this, &PresetModelPanel::OnModelItemDoubleClicked);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PresetModelPanel::SetupDragAndDrop(QListWidget* listWidget)
|
|
|
|
|
{
|
|
|
|
|
listWidget->setDragDropMode(QAbstractItemView::DragOnly);
|
|
|
|
|
listWidget->setDefaultDropAction(Qt::CopyAction);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PresetModelPanel::OnModelItemDoubleClicked(QListWidgetItem* item)
|
|
|
|
|
{
|
|
|
|
|
if (!item) return;
|
|
|
|
|
|
|
|
|
|
QListWidget* listWidget = item->listWidget();
|
|
|
|
|
if (!listWidget) return;
|
|
|
|
|
|
|
|
|
|
QString modelType = listWidget->property("modelType").toString();
|
|
|
|
|
QString modelName = item->text();
|
|
|
|
|
|
|
|
|
|
emit ModelDropped(modelType, modelName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// DraggableListWidget implementation
|
|
|
|
|
DraggableListWidget::DraggableListWidget(const QString& modelType, QWidget* parent)
|
|
|
|
|
: QListWidget(parent), modelType_(modelType)
|
|
|
|
|
{
|
|
|
|
|
setProperty("modelType", modelType);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DraggableListWidget::mousePressEvent(QMouseEvent* event)
|
|
|
|
|
{
|
|
|
|
|
if (event->button() == Qt::LeftButton) {
|
|
|
|
|
dragStartPosition_ = event->pos();
|
|
|
|
|
}
|
|
|
|
|
QListWidget::mousePressEvent(event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DraggableListWidget::mouseMoveEvent(QMouseEvent* event) {
|
|
|
|
|
if (!(event->buttons() & Qt::LeftButton)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((event->pos() - dragStartPosition_).manhattanLength() < QApplication::startDragDistance()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QListWidgetItem* item = itemAt(dragStartPosition_);
|
|
|
|
|
if (!item) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QDrag* drag = new QDrag(this);
|
|
|
|
|
QMimeData* mimeData = new QMimeData;
|
|
|
|
|
|
|
|
|
|
QString modelType = this->property("modelType").toString();
|
|
|
|
|
QString modelName = item->text();
|
|
|
|
|
QString dragData = QString("%1|%2").arg(modelType, modelName);
|
|
|
|
|
|
|
|
|
|
mimeData->setData("application/x-preset-model", dragData.toUtf8());
|
|
|
|
|
drag->setMimeData(mimeData);
|
|
|
|
|
|
|
|
|
|
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, modelName);
|
|
|
|
|
}
|
|
|
|
|
drag->setPixmap(pixmap);
|
|
|
|
|
|
|
|
|
|
Qt::DropAction dropAction = drag->exec(Qt::CopyAction);
|
|
|
|
|
Q_UNUSED(dropAction);
|
|
|
|
|
}
|