1 module rpui.widgets.toolbar_item.renderer; 2 3 import rpui.math; 4 import rpui.primitives; 5 import rpui.theme; 6 import rpui.events; 7 import rpui.widget; 8 import rpui.widgets.toolbar_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 ToolbarItemRenderer : Renderer { 15 private StatefulUiText text; 16 private UiTextTransforms textTransforms; 17 private ToolbarItem widget; 18 private Theme theme; 19 private Geometry iconQuad; 20 private QuadTransforms iconTransforms; 21 private vec2 iconBoxSize; 22 private float[State] iconAlpha; 23 24 override void onCreate(Widget widget, in string style) { 25 this.theme = widget.view.theme; 26 this.widget = cast(ToolbarItem) widget; 27 this.text = createStatefulUiTextFromRdpl(theme, style, "Text"); 28 this.iconQuad = createGeometry(); 29 this.iconBoxSize = theme.tree.data.getVec2f(style ~ ".iconBoxSize"); 30 this.iconAlpha[State.leave] = theme.tree.data.getNumber(style ~ ".Leave.alpha.0") / 100f; 31 this.iconAlpha[State.enter] = theme.tree.data.getNumber(style ~ ".Enter.alpha.0") / 100f; 32 this.iconAlpha[State.click] = theme.tree.data.getNumber(style ~ ".Click.alpha.0") / 100f; 33 } 34 35 override void onRender() { 36 auto iconsResources = widget.view.resources.icons; 37 const iconsTexture = iconsResources.getTextureForIcons(widget.iconsGroup); 38 const icon = iconsResources.getIcon(widget.iconsGroup, widget.icon); 39 40 renderTexAtlasQuad( 41 theme, 42 iconQuad, 43 iconsTexture, 44 icon.texCoord, 45 iconTransforms, 46 iconAlpha[widget.state] 47 ); 48 49 renderUiText(theme, text.render, text.attrs[text.state], textTransforms); 50 } 51 52 override void onProgress(in ProgressEvent event) { 53 updateText(); 54 updateIcon(); 55 } 56 57 private void updateText() { 58 text.state = widget.state; 59 60 with (text.attrs[text.state]) { 61 caption = widget.caption; 62 textVerticalAlign = VerticalAlign.bottom; 63 } 64 65 textTransforms = updateUiTextTransforms( 66 &text.render, 67 &theme.regularFont, 68 textTransforms, 69 text.attrs[text.state], 70 widget.view.cameraView, 71 widget.absolutePosition + widget.innerOffsetStart, 72 widget.size 73 ); 74 } 75 76 private void updateIcon() { 77 auto iconsResources = widget.view.resources.icons; 78 const iconSize = iconsResources.getIconsConfig(widget.iconsGroup).size; 79 80 const iconRelativePosition = vec2( 81 alignBox(Align.center, iconSize.x, iconBoxSize.x), 82 verticalAlignBox(VerticalAlign.middle, iconSize.y, iconBoxSize.y) 83 ); 84 85 iconTransforms = updateQuadTransforms( 86 widget.view.cameraView, 87 widget.absolutePosition + iconRelativePosition, 88 iconSize 89 ); 90 } 91 }