1 module rpui.widgets.list_menu_item.renderer;
2 
3 import rpui.theme;
4 import rpui.events;
5 import rpui.widget;
6 import rpui.math;
7 import rpui.widgets.button.renderer;
8 import rpui.widgets.list_menu_item.widget;
9 import rpui.render.components;
10 import rpui.render.components_factory;
11 import rpui.render.renderer;
12 import rpui.render.transforms;
13 
14 final class ListMenuItemRenderer : ButtonRenderer {
15     private ListMenuItem widget;
16     private Theme theme;
17 
18     private vec2 submenuArrowOffset;
19     private StatefulTexAtlasTextureQuad arrow;
20     private QuadTransforms arrowTransforms;
21 
22     override void onCreate(Widget widget, in string style) {
23         super.onCreate(widget, style);
24 
25         this.theme = widget.view.theme;
26         this.widget = cast(ListMenuItem) widget;
27 
28         arrow = createStatefulTexAtlasTextureQuadFromRdpl(theme, style, "submenuArrow");
29         submenuArrowOffset = theme.tree.data.getVec2f(style ~ ".submenuArrowOffset");
30     }
31 
32     override void onRender() {
33         super.onRender();
34 
35         if (widget.menu is null)
36             return;
37 
38         renderTexAtlasQuad(theme, arrow, arrowTransforms);
39     }
40 
41     override void onProgress(in ProgressEvent event) {
42         super.onProgress(event);
43 
44         if (widget.menu is null)
45             return;
46 
47         const arrowSize = arrow.currentTexCoords.originalTexCoords.size;
48         const arrowPosition = widget.absolutePosition + vec2(widget.size.x - arrowSize.x, 0);
49 
50         arrow.state = widget.state;
51         arrowTransforms = updateQuadTransforms(
52             widget.view.cameraView,
53             arrowPosition,
54             arrowSize
55         );
56     }
57 }