2025-10-10 16:56:47 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
#include "mappresent_global.h"
|
|
|
|
|
|
#include <QWidget>
|
2025-10-12 12:21:45 +00:00
|
|
|
|
#include <memory>
|
2025-10-12 15:04:18 +00:00
|
|
|
|
#include <QMap>
|
2025-10-12 15:56:25 +00:00
|
|
|
|
#include <QVariant>
|
2025-10-12 12:21:45 +00:00
|
|
|
|
|
2025-10-10 16:56:47 +00:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
/// </summary>
|
2025-10-11 15:03:22 +00:00
|
|
|
|
struct MAPPRESENT_EXPORT PresentIndex {
|
2025-10-10 16:56:47 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20>к<EFBFBD>
|
|
|
|
|
|
/// </summary>
|
2025-10-11 15:03:22 +00:00
|
|
|
|
int row = INT_MAX;
|
2025-10-10 16:56:47 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20>к<EFBFBD>
|
|
|
|
|
|
/// </summary>
|
2025-10-11 15:03:22 +00:00
|
|
|
|
int col = INT_MAX;
|
|
|
|
|
|
|
|
|
|
|
|
bool isValid() const;
|
2025-10-10 16:56:47 +00:00
|
|
|
|
|
|
|
|
|
|
PresentIndex& operator+=(const PresentIndex& other);
|
|
|
|
|
|
bool operator!=(const PresentIndex& other) const;
|
2025-10-12 05:20:15 +00:00
|
|
|
|
bool operator==(const PresentIndex& other) const;
|
2025-10-12 15:04:18 +00:00
|
|
|
|
bool operator<(const PresentIndex& other) const;
|
2025-10-10 16:56:47 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
2025-10-12 15:56:25 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
class MapDataModel : public QObject {
|
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
public:
|
|
|
|
|
|
enum class DataType {
|
|
|
|
|
|
UnitType,
|
|
|
|
|
|
AltMeters
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
virtual QVariant mapData(DataType type, const PresentIndex& idx) const = 0;
|
|
|
|
|
|
virtual void mapDataSet(DataType type, const PresentIndex& idx, const QVariant& val) = 0;
|
|
|
|
|
|
|
|
|
|
|
|
signals:
|
|
|
|
|
|
void dataChanged(const PresentIndex& idx);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2025-10-10 16:56:47 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
|
|
|
|
|
|
/// </summary>
|
2025-10-12 13:39:07 +00:00
|
|
|
|
struct MAPPRESENT_EXPORT PresentOption {
|
2025-10-10 16:56:47 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
/// </summary>
|
2025-10-11 15:03:22 +00:00
|
|
|
|
PresentIndex index;
|
2025-10-10 16:56:47 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե
|
|
|
|
|
|
/// </summary>
|
2025-10-11 15:03:22 +00:00
|
|
|
|
QRectF outline;
|
2025-10-12 15:56:25 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
MapDataModel* dataModel = nullptr;
|
2025-10-10 16:56:47 +00:00
|
|
|
|
|
2025-10-12 12:21:45 +00:00
|
|
|
|
PresentOption& operator=(const PresentOption& other);
|
2025-10-10 16:56:47 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>ί<EFBFBD><CEAF>
|
|
|
|
|
|
/// </summary>
|
2025-10-12 13:39:07 +00:00
|
|
|
|
class MAPPRESENT_EXPORT UnitPresentDelegate : public QObject {
|
2025-10-12 03:42:08 +00:00
|
|
|
|
Q_OBJECT
|
2025-10-10 16:56:47 +00:00
|
|
|
|
public:
|
2025-10-12 03:42:08 +00:00
|
|
|
|
UnitPresentDelegate(QObject* parent = nullptr);
|
2025-10-10 16:56:47 +00:00
|
|
|
|
virtual ~UnitPresentDelegate() = default;
|
2025-10-12 03:42:08 +00:00
|
|
|
|
|
2025-10-10 16:56:47 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// ƥ<>䵥Ԫ<E4B5A5><D4AA><EFBFBD><EFBFBD>
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
virtual int unitType() const = 0;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>Ԫ<EFBFBD><D4AA>Ƭ
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="p"></param>
|
|
|
|
|
|
/// <param name="option"></param>
|
|
|
|
|
|
virtual void paint(QPainter* p, const PresentOption& option) = 0;
|
2025-10-12 03:42:08 +00:00
|
|
|
|
|
|
|
|
|
|
signals:
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><><EFBFBD><EFBFBD>֪ͨ/<2F>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
/// </summary>
|
2025-10-12 16:25:29 +00:00
|
|
|
|
void updateRequest(const QList<PresentIndex>& idx_list);
|
2025-10-10 16:56:47 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2025-10-12 13:37:29 +00:00
|
|
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
|
2025-10-10 16:56:47 +00:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
class MAPPRESENT_EXPORT MapPresent : public QWidget
|
|
|
|
|
|
{
|
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
private:
|
2025-10-12 15:56:25 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
MapDataModel* _map_data_model = nullptr;
|
|
|
|
|
|
|
|
|
|
|
|
// ===================================
|
2025-10-10 16:56:47 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α䳤
|
|
|
|
|
|
/// </summary>
|
2025-10-12 15:04:18 +00:00
|
|
|
|
const float _primitive_region_len = 64;
|
2025-10-10 16:56:47 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><><EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
|
|
|
|
|
|
/// </summary>
|
2025-10-12 15:04:18 +00:00
|
|
|
|
double _scale_times = 1;
|
2025-10-10 16:56:47 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><>ǰ<EFBFBD><C7B0>Ƭ<EFBFBD><C6AC>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
PresentIndex _center_index;
|
|
|
|
|
|
|
2025-10-11 15:03:22 +00:00
|
|
|
|
// ===================================
|
2025-10-12 13:37:29 +00:00
|
|
|
|
/// <summary>
|
2025-10-12 15:04:18 +00:00
|
|
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
QPixmap _paint_buffer;
|
|
|
|
|
|
/// <summary>
|
2025-10-12 13:37:29 +00:00
|
|
|
|
/// <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
/// </summary>
|
2025-10-12 15:04:18 +00:00
|
|
|
|
QMap<PresentIndex, PresentOption> _visible_units;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD>µĵ<C2B5>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
|
|
|
|
|
|
/// </summary>
|
2025-10-12 15:56:25 +00:00
|
|
|
|
QList<PresentIndex> _updated_index_list;
|
2025-10-12 15:04:18 +00:00
|
|
|
|
|
2025-10-12 13:37:29 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
|
|
|
|
|
|
/// </summary>
|
2025-10-12 13:11:54 +00:00
|
|
|
|
void visible_units_tidy();
|
2025-10-12 13:37:29 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="a"></param>
|
|
|
|
|
|
/// <param name="b"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2025-10-12 13:11:54 +00:00
|
|
|
|
QList<PresentIndex> item_supply(const PresentIndex& a, const PresentIndex& b) const;
|
2025-10-11 15:03:22 +00:00
|
|
|
|
|
2025-10-12 05:20:15 +00:00
|
|
|
|
// ===================================
|
2025-10-12 13:37:29 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>ί<EFBFBD><CEAF>
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
QHash<int, UnitPresentDelegate*> _type_present_delegate;
|
2025-10-11 15:03:22 +00:00
|
|
|
|
|
|
|
|
|
|
|
2025-10-10 16:56:47 +00:00
|
|
|
|
public:
|
|
|
|
|
|
MapPresent(QWidget* parent = nullptr);
|
|
|
|
|
|
|
2025-10-12 15:04:18 +00:00
|
|
|
|
void zoomTo(double percent);
|
|
|
|
|
|
double zoomTimes() const;
|
|
|
|
|
|
|
2025-10-12 15:56:25 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ί<EFBFBD><CEAF>
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="ins"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
bool setDelegate(UnitPresentDelegate* ins);
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><><EFBFBD>õ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="model"></param>
|
|
|
|
|
|
void setDataModel(MapDataModel* model);
|
2025-10-12 16:25:29 +00:00
|
|
|
|
MapDataModel* dataModel() const;
|
2025-10-12 15:56:25 +00:00
|
|
|
|
|
2025-10-10 16:56:47 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// ͨ<><CDA8>widget<65>϶<EFBFBD>λ<EFBFBD><CEBB>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="pos"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
PresentIndex indexGet(const QPointF& pos) const;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>Ӿ<EFBFBD><D3BE><EFBFBD>
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="idx"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
QRectF outlineGet(const PresentIndex& idx) const;
|
2025-10-12 13:11:54 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// <20><>ȡ<EFBFBD><C8A1>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="center"><3E><><EFBFBD>ĵ<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD></param>
|
|
|
|
|
|
/// <param name="dist"><3E><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
QList<PresentIndex> siblingsGet(const PresentIndex& center, uint16_t dist = 1) const;
|
2025-10-10 16:56:47 +00:00
|
|
|
|
|
2025-10-11 15:03:22 +00:00
|
|
|
|
signals:
|
2025-10-12 15:21:15 +00:00
|
|
|
|
void mouseInNotify();
|
|
|
|
|
|
void mouseOutNotify();
|
|
|
|
|
|
void mouseHoverNotify(const PresentIndex& unit_index);
|
|
|
|
|
|
void mousePressNotify(QMouseEvent* ev);
|
|
|
|
|
|
void mouseReleaseNotify(QMouseEvent* ev);
|
2025-10-10 16:56:47 +00:00
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
void paintEvent(QPaintEvent* ev) override;
|
2025-10-11 14:40:51 +00:00
|
|
|
|
void resizeEvent(QResizeEvent* event) override;
|
2025-10-10 16:56:47 +00:00
|
|
|
|
|
2025-10-11 15:18:44 +00:00
|
|
|
|
void mouseMoveEvent(QMouseEvent* event) override;
|
|
|
|
|
|
void enterEvent(QEvent* event) override;
|
|
|
|
|
|
void leaveEvent(QEvent* event) override;
|
2025-10-12 15:21:15 +00:00
|
|
|
|
void mousePressEvent(QMouseEvent* ev) override;
|
|
|
|
|
|
void mouseReleaseEvent(QMouseEvent* ev) override;
|
2025-10-10 16:56:47 +00:00
|
|
|
|
};
|