#include "ui/ModelBrowser/PresetModelPanel.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "common/SpdLogger.h" #include "ui/DockTitleBar.h" #include "ui/DockWidget.h" #include "ui_PresetModelPanel.h" PresetModelPanel::PresetModelPanel(QWidget *parent) : QWidget(parent) , ui(new Ui::PresetModelPanel) { ui->setupUi(this); InitUI(); } PresetModelPanel::~PresetModelPanel() { delete ui; } 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() { // 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(); } } void PresetModelPanel::LoadModelsFromConfig() { // Load ship models QStringList shipModels = m_configParser.GetModelNames("Ship"); if (!shipModels.isEmpty()) { PopulateModelList(ui->shipList, "Ship", shipModels); } // Load satellite models QStringList satelliteModels = m_configParser.GetModelNames("Satellite"); if (!satelliteModels.isEmpty()) { PopulateModelList(ui->satelliteList, "Satellite", satelliteModels); } // Load missile models QStringList missileModels = m_configParser.GetModelNames("Missile"); if (!missileModels.isEmpty()) { PopulateModelList(ui->missileList, "Missile", missileModels); } // Load jammer models QStringList jammerModels = m_configParser.GetModelNames("Jammer"); if (!jammerModels.isEmpty()) { PopulateModelList(ui->jammerList, "Jammer", jammerModels); } } void PresetModelPanel::LoadDefaultModels() { // Use hardcoded default models as fallback mechanism QStringList shipModels = { "Destroyer", "Aircraft Carrier", "Frigate", "Submarine" }; PopulateModelList(ui->shipList, "Ship", shipModels); QStringList satelliteModels = { "Communication Satellite", "Weather Satellite", "GPS Satellite", "Spy Satellite" }; PopulateModelList(ui->satelliteList, "Satellite", satelliteModels); QStringList missileModels = { "Cruise Missile", "Ballistic Missile", "Anti-Ship Missile", "Surface-to-Air Missile" }; PopulateModelList(ui->missileList, "Missile", missileModels); QStringList jammerModels = { "Electronic Jammer", "Communication Jammer", "Radar Jammer", "GPS Jammer" }; PopulateModelList(ui->jammerList, "Jammer", jammerModels); } void PresetModelPanel::PopulateModelList(QListWidget* listWidget, const QString& modelType, const QStringList& models) { if (!listWidget) return; // Set the model type as a property for later use listWidget->setProperty("modelType", modelType); 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); }