1 module rpui.widgets.list_menu_items_divider.renderer;
2
3 import rpui.primitives;
4 import rpui.basic_rpdl_exts;
5 import rpui.math;
6 import rpui.theme;
7 import rpui.events;
8 import rpui.widget;
9 import rpui.widgets.list_menu_items_divider.widget;
10 import rpui.render.components;
11 import rpui.render.components_factory;
12 import rpui.render.renderer;
13 import rpui.render.transforms;
14
15 final class ListMenuItemsDividerRenderer : Renderer {
16 private ListMenuItemsDivider widget;
17 private Theme theme;
18
19 private FrameRect dividerOffsets;
20 private Geometry dividerInner;
21 private Geometry dividerOuter;
22 private QuadTransforms dividerInnerTransforms;
23 private QuadTransforms dividerOuterTransforms;
24 private vec4 innerColor;
25 private vec4 outerColor;
26
27 override void onCreate(Widget widget, in string style) {
28 this.theme = widget.view.theme;
29 this.widget = cast(ListMenuItemsDivider) widget;
30 this.dividerInner = createGeometry();
31 this.dividerOuter = createGeometry();
32 this.dividerOffsets = this.theme.tree.data.getFrameRect(style ~ ".dividerOffsets");
33 this.innerColor = this.theme.tree.data.getNormColor(style ~ ".innerColor");
34 this.outerColor = this.theme.tree.data.getNormColor(style ~ ".outerColor");
35 this.widget.height = 2 + this.dividerOffsets.top + this.dividerOffsets.bottom;
36 }
37
38 override void onRender() {
39 renderColorQuad(theme, dividerInner, innerColor, dividerInnerTransforms);
40 renderColorQuad(theme, dividerOuter, outerColor, dividerOuterTransforms);
41 }
42
43 override void onProgress(in ProgressEvent event) {
44 const size = vec2(widget.size.x - dividerOffsets.left - dividerOffsets.right, 1);
45
46 dividerInnerTransforms = updateQuadTransforms(
47 widget.view.cameraView(),
48 widget.absolutePosition + vec2(dividerOffsets.left, dividerOffsets.top - 1),
49 size
50 );
51
52 dividerOuterTransforms = updateQuadTransforms(
53 widget.view.cameraView(),
54 widget.absolutePosition + vec2(dividerOffsets.left, dividerOffsets.top),
55 size
56 );
57 }
58 }