128 lines
3.0 KiB
C
128 lines
3.0 KiB
C
|
|
#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_;
|
||
|
|
};
|