1 module rpui.widgets.button.render_system;
2
3 import std.container.array;
4
5 import rpui.widgets.button.widget;
6 import rpui.widgets.button.transforms_system;
7 import rpui.render.components_factory;
8 import rpui.render.components;
9 import rpui.render.renderer;
10 import rpui.theme;
11 import rpui.math;
12
13 import gapi.texture;
14
15 struct RenderData {
16 StatefulChain background;
17 Chain focusGlow;
18 StatefulUiText captionText;
19 Array!TexAtlasTextureQuad icons;
20 bool textVisible = true;
21 }
22
23 final class ButtonRenderSystem : RenderSystem {
24 private Button widget;
25 private Theme theme;
26 private RenderTransforms* transforms;
27 private RenderData* renderData;
28
29 this(Button widget, RenderData* renderData, RenderTransforms* transforms) {
30 this.widget = widget;
31 this.theme = widget.view.theme;
32 this.transforms = transforms;
33 this.renderData = renderData;
34 }
35
36 override void onRender() {
37 renderData.background.state = widget.state;
38 renderData.captionText.state = widget.state;
39
40 // TODO: draw disabled
41 const alpha = widget.isEnabled ? 1.0 : 0.5;
42
43 renderHorizontalChain(
44 theme,
45 renderData.background,
46 transforms.background,
47 widget.partDraws,
48 alpha
49 );
50
51 if (renderData.textVisible && widget.caption != "") {
52 renderUiText(theme, renderData.captionText, transforms.captionText);
53 }
54
55 if (widget.focusable && widget.isFocused && widget.isEnabled) {
56 renderHorizontalChain(
57 theme,
58 renderData.focusGlow,
59 transforms.focusGlow,
60 widget.partDraws
61 );
62 }
63
64 renderIcons();
65 }
66
67 private void renderIcons() {
68 for (int i = 0; i < widget.icons.length; ++i) {
69 const iconTransforms = transforms.icons[i];
70 const iconQuad = renderData.icons[i];
71
72 renderTexAtlasQuad(theme, iconQuad, iconTransforms);
73 }
74 }
75 }