#include "ui/ModelBrowser/PresetModelPanel.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "common/RecourceHelper.h" #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) , dragSourceWidget_(nullptr) { 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 QString presetsPath = QString("%1/presets").arg(RecourceHelper::Get().GetResourcesPath()); if (configParser_.LoadAllConfigs(presetsPath)) { // 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: {}", configParser_.GetLastError().toStdString()); LoadDefaultModels(); } } void PresetModelPanel::LoadModelsFromConfig() { // Load ship models ModelCategory shipCategory = configParser_.GetCategory("Ship"); if (!shipCategory.models.isEmpty()) { ui->shipList->setModelType("Ship"); ui->shipList->setModelList(shipCategory.models); } // Load satellite models ModelCategory satelliteCategory = configParser_.GetCategory("Satellite"); if (!satelliteCategory.models.isEmpty()) { ui->satelliteList->setModelType("Satellite"); ui->satelliteList->setModelList(satelliteCategory.models); } // Load missile models ModelCategory missileCategory = configParser_.GetCategory("Missile"); if (!missileCategory.models.isEmpty()) { ui->missileList->setModelType("Missile"); ui->missileList->setModelList(missileCategory.models); } // Load jammer models ModelCategory jammerCategory = configParser_.GetCategory("Jammer"); if (!jammerCategory.models.isEmpty()) { ui->jammerList->setModelType("Jammer"); ui->jammerList->setModelList(jammerCategory.models); } } void PresetModelPanel::LoadDefaultModels() { // Use hardcoded default models as fallback mechanism QVector 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} }; ui->shipList->setModelType("Ship"); ui->shipList->setModelList(shipModels); QVector 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} }; ui->satelliteList->setModelType("Satellite"); ui->satelliteList->setModelList(satelliteModels); QVector 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} }; ui->missileList->setModelType("Missile"); ui->missileList->setModelList(missileModels); QVector 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} }; ui->jammerList->setModelType("Jammer"); ui->jammerList->setModelList(jammerModels); } // 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(obj); // if (!listWidget) { // return QWidget::eventFilter(obj, event); // } // if (event->type() == QEvent::MouseButtonPress) { // QMouseEvent* mouseEvent = static_cast(event); // if (mouseEvent->button() == Qt::LeftButton) { // dragStartPosition_ = mouseEvent->pos(); // dragSourceWidget_ = listWidget; // } // } else if (event->type() == QEvent::MouseMove) { // QMouseEvent* mouseEvent = static_cast(event); // if (!(mouseEvent->buttons() & Qt::LeftButton)) { // return QWidget::eventFilter(obj, event); // } // if ((mouseEvent->pos() - dragStartPosition_).manhattanLength() < QApplication::startDragDistance()) { // return QWidget::eventFilter(obj, event); // } // 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); // }