DYTSrouce/src/ui/PresetModelPanel.cpp

238 lines
6.3 KiB
C++
Raw Normal View History

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);
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);
}