#include "PresetModelPanel.h" #include "DockTitleBar.h" #include "DockWidget.h" #include #include #include #include #include #include #include #include #include #include #include #include PresetModelPanel::PresetModelPanel(QWidget *parent) : QWidget(parent) , toolBox_(nullptr) , mainLayout_(nullptr) , shipList_(nullptr) , satelliteList_(nullptr) , missileList_(nullptr) , jammerList_(nullptr) { InitUI(); } PresetModelPanel::~PresetModelPanel() { } 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() { mainLayout_ = new QVBoxLayout(this); mainLayout_->setContentsMargins(5, 5, 5, 5); mainLayout_->setSpacing(5); toolBox_ = new QToolBox(this); toolBox_->setObjectName("PresetModelToolBox"); toolBox_->addItem(CreateShipPage(), QIcon(), tr("Ships")); toolBox_->addItem(CreateSatellitePage(), QIcon(), tr("Satellites")); toolBox_->addItem(CreateMissilePage(), QIcon(), tr("Missiles")); toolBox_->addItem(CreateJammerPage(), QIcon(), tr("Jammers")); mainLayout_->addWidget(toolBox_); setLayout(mainLayout_); } QWidget* PresetModelPanel::CreateShipPage() { QWidget* page = new QWidget; QVBoxLayout* layout = new QVBoxLayout(page); QStringList shipModels = { "Destroyer", "Aircraft Carrier", "Frigate", "Submarine" }; shipList_ = CreateModelList(page, "Ship", shipModels); layout->addWidget(shipList_); return page; } QWidget* PresetModelPanel::CreateSatellitePage() { QWidget* page = new QWidget; QVBoxLayout* layout = new QVBoxLayout(page); QStringList satelliteModels = { "Geostationary Satellite", "Communication Satellite", "Weather Satellite", "Navigation Satellite" }; satelliteList_ = CreateModelList(page, "Satellite", satelliteModels); layout->addWidget(satelliteList_); return page; } QWidget* PresetModelPanel::CreateMissilePage() { QWidget* page = new QWidget; QVBoxLayout* layout = new QVBoxLayout(page); QStringList missileModels = { "Hypersonic Missile", "Cruise Missile", "Ballistic Missile", "Anti-Ship Missile" }; missileList_ = CreateModelList(page, "Missile", missileModels); layout->addWidget(missileList_); return page; } QWidget* PresetModelPanel::CreateJammerPage() { QWidget* page = new QWidget; QVBoxLayout* layout = new QVBoxLayout(page); QStringList jammerModels = { "Passive Jammer", "Active Jammer", "Electronic Warfare Pod", "Decoy System" }; jammerList_ = CreateModelList(page, "Jammer", jammerModels); layout->addWidget(jammerList_); return page; } QListWidget* PresetModelPanel::CreateModelList(QWidget* parent, const QString& modelType, const QStringList& models) { DraggableListWidget* listWidget = new DraggableListWidget(modelType, parent); listWidget->setDragDropMode(QAbstractItemView::DragOnly); listWidget->setDefaultDropAction(Qt::CopyAction); 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); return listWidget; } 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); }