map_canvas.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #pragma once
  2. #include "map_data.h"
  3. #include "tool_panel.h"
  4. #include <QPoint>
  5. #include <QWidget>
  6. namespace MapEditor {
  7. class MapCanvas : public QWidget {
  8. Q_OBJECT
  9. public:
  10. explicit MapCanvas(QWidget *parent = nullptr);
  11. void setMapData(MapData *data);
  12. void setCurrentTool(ToolType tool);
  13. void clearTool();
  14. signals:
  15. void elementDoubleClicked(int elementType, int index);
  16. void gridDoubleClicked();
  17. void toolCleared();
  18. protected:
  19. void paintEvent(QPaintEvent *event) override;
  20. void mousePressEvent(QMouseEvent *event) override;
  21. void mouseReleaseEvent(QMouseEvent *event) override;
  22. void mouseMoveEvent(QMouseEvent *event) override;
  23. void mouseDoubleClickEvent(QMouseEvent *event) override;
  24. void wheelEvent(QWheelEvent *event) override;
  25. void resizeEvent(QResizeEvent *event) override;
  26. private:
  27. [[nodiscard]] QPointF mapToGrid(const QPoint &widgetPos) const;
  28. [[nodiscard]] QPoint gridToWidget(float gridX, float gridZ) const;
  29. void drawGrid(QPainter &painter);
  30. void drawTerrainElements(QPainter &painter);
  31. void drawFirecamps(QPainter &painter);
  32. void drawStructures(QPainter &painter);
  33. void drawLinearElements(QPainter &painter);
  34. void drawCurrentPlacement(QPainter &painter);
  35. void drawElement(QPainter &painter, const QString &type, const QPoint &pos,
  36. int playerId = 0);
  37. struct HitResult {
  38. int elementType = -1;
  39. int index = -1;
  40. int endpoint = -1;
  41. };
  42. [[nodiscard]] HitResult hitTest(const QPoint &pos) const;
  43. void placeElement(const QPointF &gridPos);
  44. void startLinearElement(const QPointF &gridPos);
  45. void finishLinearElement(const QPointF &gridPos);
  46. void eraseAtPosition(const QPointF &gridPos);
  47. MapData *m_mapData = nullptr;
  48. ToolType m_currentTool = ToolType::Select;
  49. float m_zoom = 1.0F;
  50. QPointF m_panOffset{0, 0};
  51. bool m_isPanning = false;
  52. QPoint m_lastMousePos;
  53. bool m_isPlacingLinear = false;
  54. QPointF m_linearStart;
  55. int m_selectedType = -1;
  56. int m_selectedIndex = -1;
  57. bool m_isDragging = false;
  58. int m_draggedEndpoint = -1;
  59. int m_currentPlayerId = 0;
  60. static constexpr int GRID_CELL_SIZE = 8;
  61. static constexpr int ICON_SIZE = 16;
  62. static constexpr float HIT_RADIUS = 5.0F;
  63. static constexpr float ENDPOINT_HIT_RADIUS = 3.0F;
  64. static constexpr int MIN_PLAYER_ID = 0;
  65. static constexpr int MAX_PLAYER_ID = 4;
  66. static constexpr int DEFAULT_MAX_POPULATION = 150;
  67. static inline const QString DEFAULT_NATION = "roman_republic";
  68. };
  69. } // namespace MapEditor