DYTSrouce/src/ui/PresetModelPanel.h

128 lines
3.0 KiB
C
Raw Normal View History

2025-10-29 00:16:25 +00:00
#pragma once
#include <QWidget>
#include <QToolBox>
#include <QListWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QMimeData>
#include <QDrag>
#include <QMouseEvent>
class DockWidget;
/**
* @brief Preset model panel class
*
* Provides preset 3D models for users to drag into the 3D scene, including:
* - Ships: Destroyer, Aircraft Carrier
* - Satellites: Geostationary Satellites
* - Missiles: Hypersonic Missiles
* - Jammers: Passive Jammers, Active Jammers
*/
class PresetModelPanel : public QWidget {
Q_OBJECT
public:
explicit PresetModelPanel(QWidget *parent = nullptr);
~PresetModelPanel() override;
/**
* @brief Attach to dock widget
* @param dockWidget Dock widget pointer
*/
void AttachDock(DockWidget* dockWidget);
Q_SIGNALS:
/**
* @brief Signal emitted when model is dragged to scene
* @param modelType Model type
* @param modelName Model name
* @param position Scene position (optional)
*/
void ModelDropped(const QString& modelType, const QString& modelName, const QPointF& position = QPointF());
private slots:
/**
* @brief Handle model item double click event
* @param item Clicked item
*/
void OnModelItemDoubleClicked(QListWidgetItem* item);
private:
/**
* @brief Initialize user interface
*/
void InitUI();
/**
* @brief Create ship category page
* @return Ship page widget
*/
QWidget* CreateShipPage();
/**
* @brief Create satellite category page
* @return Satellite page widget
*/
QWidget* CreateSatellitePage();
/**
* @brief Create missile category page
* @return Missile page widget
*/
QWidget* CreateMissilePage();
/**
* @brief Create jammer category page
* @return Jammer page widget
*/
QWidget* CreateJammerPage();
/**
* @brief Create model list items
* @param parent Parent widget
* @param modelType Model type
* @param models Model name list
* @return Configured QListWidget
*/
QListWidget* CreateModelList(QWidget* parent, const QString& modelType, const QStringList& models);
/**
* @brief Setup drag and drop functionality
* @param listWidget List widget to setup drag and drop
*/
void SetupDragAndDrop(QListWidget* listWidget);
private:
QToolBox* toolBox_;
QVBoxLayout* mainLayout_;
QListWidget* shipList_;
QListWidget* satelliteList_;
QListWidget* missileList_;
QListWidget* jammerList_;
};
/**
* @brief Custom list widget with drag and drop support
*/
class DraggableListWidget : public QListWidget {
Q_OBJECT
public:
explicit DraggableListWidget(const QString& modelType, QWidget* parent = nullptr);
Q_SIGNALS:
void ItemDragged(const QString& modelType, const QString& modelName);
protected:
void mousePressEvent(QMouseEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;
private:
QString modelType_;
QPoint dragStartPosition_;
};