Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/windowing/StarCanvasWidget.hpp
blob: a13cc2c851560c404100e4ca839835cffc32e341 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#pragma once

#include "StarWidget.hpp"

namespace Star {

STAR_CLASS(CanvasWidget);

// Very simple Widget that allows easy drawing to its surface, to easily tie a
// simplified rendering / input context into the regular widget / GuiReader
// system.
class CanvasWidget : public Widget {
public:
  struct ClickEvent {
    Vec2I position;
    MouseButton button;
    // True when button down, false when key up
    bool buttonDown;
  };

  struct KeyEvent {
    Key key;
    // True when key down, false when key up
    bool keyDown;
  };

  unsigned MaximumEventBuffer = 16;

  CanvasWidget();

  void setCaptureMouseEvents(bool captureMouse);
  void setCaptureKeyboardEvents(bool captureKeyboard);
  void setIgnoreInterfaceScale(bool ignoreInterfaceScale);
  bool ignoreInterfaceScale() const;

  // Returns mouse position relative to the lower left of the drawing region.
  Vec2I mousePosition() const;

  // Pulls recent click events relative to the lower left of the drawing
  // region, if configured to capture mouse events
  List<ClickEvent> pullClickEvents();

  // Pulls recent key events captured by this Canvas, if configured to capture
  // key events.
  List<KeyEvent> pullKeyEvents();

  bool sendEvent(InputEvent const& event) override;
  KeyboardCaptureMode keyboardCaptured() const override;

  // Call before drawing to clear old draw data.
  void clear();

  void drawImage(String texName, Vec2F const& position, float scale = 1.0f, Vec4B const& color = Vec4B(255, 255, 255, 255));
  void drawImageRect(String texName, RectF const& texCoords, RectF const& screenCoords, Vec4B const& color);
  void drawImageCentered(String texName, Vec2F const& position, float scale = 1.0f, Vec4B const& color = Vec4B(255, 255, 255, 255));

  void drawDrawable(Drawable drawable, Vec2F const& screenPos);
  void drawDrawables(List<Drawable> drawables, Vec2F const& screenPos);

  // Draw an image whose texture is applied over the entire screen rect in a
  // tiled manner, so that it wraps in X and Y.
  void drawTiledImage(String texName, float textureScale, Vec2D const& offset, RectF const& screenCoords, Vec4B const& color = Vec4B::filled(255));

  void drawLine(Vec2F const& begin, Vec2F const end, Vec4B const& color = Vec4B(255, 255, 255, 255), float lineWidth = 1.0f);
  void drawRect(RectF const& coords, Vec4B const& color = Vec4B(255, 255, 255, 255));
  void drawPoly(PolyF const& poly, Vec4B const& color = Vec4B(255, 255, 255, 255), float lineWidth = 1.0f);
  void drawTriangles(List<tuple<Vec2F, Vec2F, Vec2F>> const& poly, Vec4B const& color = Vec4B(255, 255, 255, 255));

  void drawText(String s, TextPositioning position, unsigned fontSize, Vec4B const& color = Vec4B(255, 255, 255, 255), FontMode mode = FontMode::Normal, float lineSpacing = Star::DefaultLineSpacing, String font = "", String processingDirectives = "");
  void drawText(String s, TextPositioning position, TextStyle style);

protected:
  void renderImpl() override;

  void renderImage(Vec2F const& renderingOffset, String const& texName, Vec2F const& position, float scale, Vec4B const& color, bool centered);
  void renderImageRect(Vec2F const& renderingOffset, String const& texName, RectF const& texCoords, RectF const& screenCoords, Vec4B const& color);
  void renderDrawable(Vec2F const& renderingOffset, Drawable drawable, Vec2F const& screenPos);
  void renderTiledImage(Vec2F const& renderingOffset, String const& texName, float textureScale, Vec2D const& offset, RectF const& screenCoords, Vec4B const& color);
  void renderLine(Vec2F const& renderingOffset, Vec2F const& begin, Vec2F const end, Vec4B const& color, float lineWidth);
  void renderRect(Vec2F const& renderingOffset, RectF const& coords, Vec4B const& color);
  void renderPoly(Vec2F const& renderingOffset, PolyF poly, Vec4B const& color, float lineWidth);
  void renderTriangles(Vec2F const& renderingOffset, List<tuple<Vec2F, Vec2F, Vec2F>> const& triangles, Vec4B const& color);
  void renderText(Vec2F const& renderingOffset, String const& s, TextPositioning const& position, TextStyle const& style);

private:
  bool m_ignoreInterfaceScale;
  bool m_captureKeyboard;
  bool m_captureMouse;
  Vec2I m_mousePosition;
  List<ClickEvent> m_clickEvents;
  List<KeyEvent> m_keyEvents;

  typedef tuple<RectF, Vec4B> RectOp;
  typedef tuple<String, Vec2F, float, Vec4B, bool> ImageOp;
  typedef tuple<String, RectF, RectF, Vec4B> ImageRectOp;
  typedef tuple<Drawable, Vec2F> DrawableOp;
  typedef tuple<String, float, Vec2D, RectF, Vec4B> TiledImageOp;
  typedef tuple<Vec2F, Vec2F, Vec4B, float> LineOp;
  typedef tuple<PolyF, Vec4B, float> PolyOp;
  typedef tuple<List<tuple<Vec2F, Vec2F, Vec2F>>, Vec4B> TrianglesOp;
  typedef tuple<String, TextPositioning, TextStyle> TextOp;

  typedef MVariant<RectOp, ImageOp, ImageRectOp, DrawableOp, TiledImageOp, LineOp, PolyOp, TrianglesOp, TextOp> RenderOp;
  List<RenderOp> m_renderOps;
};

}