ActWorld/MapPresent/MapPresent.h

116 lines
2.3 KiB
C
Raw Normal View History

2025-10-10 16:56:47 +00:00
#pragma once
#include "mappresent_global.h"
#include <QWidget>
/// <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;
};
/// <summary>
/// <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
/// </summary>
struct PresentOption {
/// <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-10 16:56:47 +00:00
bool isMouseOver = false;
bool isSelected = false;
};
/// <summary>
/// <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>ί<EFBFBD><CEAF>
/// </summary>
class UnitPresentDelegate {
public:
virtual ~UnitPresentDelegate() = default;
/// <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;
};
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
/// </summary>
class MAPPRESENT_EXPORT MapPresent : public QWidget
{
Q_OBJECT
private:
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α
/// </summary>
const float _primitive_region_square_len = 100;
/// <summary>
/// <20><><EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
/// </summary>
short _scale_times = 1;
/// <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
// ===================================
QList<PresentOption> _visible_units;
void visibleUnitsTidy();
QList<PresentIndex> siblingsGet(const PresentIndex& center, uint16_t dist = 1) const;
QList<PresentIndex> itemFills(const PresentIndex& a, const PresentIndex& b) const;
2025-10-10 16:56:47 +00:00
public:
MapPresent(QWidget* parent = nullptr);
/// <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-11 15:03:22 +00:00
signals:
void mouseEnter();
void mouseOut();
void mouseHover();
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
};