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 }