2025-10-29 00:16:25 +00:00
|
|
|
#include "PresetModelPanel.h"
|
|
|
|
|
#include "DockTitleBar.h"
|
|
|
|
|
#include "DockWidget.h"
|
|
|
|
|
|
|
|
|
|
#include <QApplication>
|
|
|
|
|
#include <QDebug>
|
|
|
|
|
#include <QListWidgetItem>
|
|
|
|
|
#include <QMimeData>
|
|
|
|
|
#include <QDrag>
|
|
|
|
|
#include <QPixmap>
|
|
|
|
|
#include <QPainter>
|
|
|
|
|
#include <QVBoxLayout>
|
|
|
|
|
#include <QHBoxLayout>
|
|
|
|
|
#include <QLabel>
|
|
|
|
|
#include <QIcon>
|
|
|
|
|
#include <QMouseEvent>
|
|
|
|
|
|
|
|
|
|
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);
|
2025-10-29 09:11:36 +00:00
|
|
|
mainLayout_->setContentsMargins(0, 0, 0, 0);
|
2025-10-29 00:16:25 +00:00
|
|
|
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 = {
|
2025-10-29 09:11:36 +00:00
|
|
|
tr("Destroyer"),
|
|
|
|
|
tr("Aircraft Carrier"),
|
|
|
|
|
tr("Frigate"),
|
|
|
|
|
tr("Submarine")
|
2025-10-29 00:16:25 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
shipList_ = CreateModelList(page, "Ship", shipModels);
|
|
|
|
|
layout->addWidget(shipList_);
|
|
|
|
|
|
|
|
|
|
return page;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QWidget* PresetModelPanel::CreateSatellitePage()
|
|
|
|
|
{
|
|
|
|
|
QWidget* page = new QWidget;
|
|
|
|
|
QVBoxLayout* layout = new QVBoxLayout(page);
|
|
|
|
|
|
|
|
|
|
QStringList satelliteModels = {
|
2025-10-29 09:11:36 +00:00
|
|
|
tr("Geostationary Satellite"),
|
|
|
|
|
tr("Communication Satellite"),
|
|
|
|
|
tr("Weather Satellite"),
|
|
|
|
|
tr("Navigation Satellite")
|
2025-10-29 00:16:25 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
satelliteList_ = CreateModelList(page, "Satellite", satelliteModels);
|
|
|
|
|
layout->addWidget(satelliteList_);
|
|
|
|
|
|
|
|
|
|
return page;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QWidget* PresetModelPanel::CreateMissilePage()
|
|
|
|
|
{
|
|
|
|
|
QWidget* page = new QWidget;
|
|
|
|
|
QVBoxLayout* layout = new QVBoxLayout(page);
|
|
|
|
|
|
|
|
|
|
QStringList missileModels = {
|
2025-10-29 09:11:36 +00:00
|
|
|
tr("Hypersonic Missile"),
|
|
|
|
|
tr("Cruise Missile"),
|
|
|
|
|
tr("Ballistic Missile"),
|
|
|
|
|
tr("Anti-Ship Missile")
|
2025-10-29 00:16:25 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
missileList_ = CreateModelList(page, "Missile", missileModels);
|
|
|
|
|
layout->addWidget(missileList_);
|
|
|
|
|
|
|
|
|
|
return page;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QWidget* PresetModelPanel::CreateJammerPage()
|
|
|
|
|
{
|
|
|
|
|
QWidget* page = new QWidget;
|
|
|
|
|
QVBoxLayout* layout = new QVBoxLayout(page);
|
|
|
|
|
|
|
|
|
|
QStringList jammerModels = {
|
2025-10-29 09:11:36 +00:00
|
|
|
tr("Passive Jammer"),
|
|
|
|
|
tr("Active Jammer"),
|
|
|
|
|
tr("Electronic Warfare Pod"),
|
|
|
|
|
tr("Decoy System")
|
2025-10-29 00:16:25 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
}
|