Style.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. package giu
  2. import (
  3. "image/color"
  4. "github.com/AllenDang/imgui-go"
  5. )
  6. // PushFont sets font to "font"
  7. // NOTE: PopFont has to be called
  8. // NOTE: Don't use PushFont. use StyleSetter instead.
  9. func PushFont(font *FontInfo) bool {
  10. if font == nil {
  11. return false
  12. }
  13. if f, ok := extraFontMap[font.String()]; ok {
  14. imgui.PushFont(*f)
  15. return true
  16. }
  17. return false
  18. }
  19. // PopFont pops the font (should be called after PushFont).
  20. func PopFont() {
  21. imgui.PopFont()
  22. }
  23. // PushStyleColor wrapps imgui.PushStyleColor
  24. // NOTE: don't forget to call PopStyleColor()!
  25. func PushStyleColor(id StyleColorID, col color.Color) {
  26. imgui.PushStyleColor(imgui.StyleColorID(id), ToVec4Color(col))
  27. }
  28. // PushColorText calls PushStyleColor(StyleColorText,...)
  29. // NOTE: don't forget to call PopStyleColor()!
  30. func PushColorText(col color.Color) {
  31. imgui.PushStyleColor(imgui.StyleColorText, ToVec4Color(col))
  32. }
  33. // PushColorTextDisabled calls PushStyleColor(StyleColorTextDisabled,...)
  34. // NOTE: don't forget to call PopStyleColor()!
  35. func PushColorTextDisabled(col color.Color) {
  36. imgui.PushStyleColor(imgui.StyleColorTextDisabled, ToVec4Color(col))
  37. }
  38. // PushColorWindowBg calls PushStyleColor(StyleColorWindowBg,...)
  39. // NOTE: don't forget to call PopStyleColor()!
  40. func PushColorWindowBg(col color.Color) {
  41. imgui.PushStyleColor(imgui.StyleColorWindowBg, ToVec4Color(col))
  42. }
  43. // PushColorFrameBg calls PushStyleColor(StyleColorFrameBg,...)
  44. // NOTE: don't forget to call PopStyleColor()!
  45. func PushColorFrameBg(col color.Color) {
  46. imgui.PushStyleColor(imgui.StyleColorFrameBg, ToVec4Color(col))
  47. }
  48. // PushColorButton calls PushStyleColor(StyleColorButton,...)
  49. // NOTE: don't forget to call PopStyleColor()!
  50. func PushColorButton(col color.Color) {
  51. imgui.PushStyleColor(imgui.StyleColorButton, ToVec4Color(col))
  52. }
  53. // PushColorButtonHovered calls PushStyleColor(StyleColorButtonHovered,...)
  54. // NOTE: don't forget to call PopStyleColor()!
  55. func PushColorButtonHovered(col color.Color) {
  56. imgui.PushStyleColor(imgui.StyleColorButtonHovered, ToVec4Color(col))
  57. }
  58. // PushColorButtonActive calls PushStyleColor(StyleColorButtonActive,...)
  59. // NOTE: don't forget to call PopStyleColor()!
  60. func PushColorButtonActive(col color.Color) {
  61. imgui.PushStyleColor(imgui.StyleColorButtonActive, ToVec4Color(col))
  62. }
  63. // PushWindowPadding calls PushStyleVar(StyleWindowPadding,...)
  64. func PushWindowPadding(width, height float32) {
  65. imgui.PushStyleVarVec2(imgui.StyleVarWindowPadding, imgui.Vec2{X: width, Y: height})
  66. }
  67. // PushFramePadding calls PushStyleVar(StyleFramePadding,...)
  68. func PushFramePadding(width, height float32) {
  69. imgui.PushStyleVarVec2(imgui.StyleVarFramePadding, imgui.Vec2{X: width, Y: height})
  70. }
  71. // PushItemSpacing calls PushStyleVar(StyleVarItemSpacing,...)
  72. func PushItemSpacing(width, height float32) {
  73. imgui.PushStyleVarVec2(imgui.StyleVarItemSpacing, imgui.Vec2{X: width, Y: height})
  74. }
  75. // PushButtonTextAlign sets alignment for button text. Defaults to (0.0f,0.5f) for left-aligned,vertically centered.
  76. func PushButtonTextAlign(width, height float32) {
  77. imgui.PushStyleVarVec2(imgui.StyleVarButtonTextAlign, imgui.Vec2{X: width, Y: height})
  78. }
  79. // PushSelectableTextAlign sets alignment for selectable text. Defaults to (0.0f,0.5f) for left-aligned,vertically centered.
  80. func PushSelectableTextAlign(width, height float32) {
  81. imgui.PushStyleVarVec2(imgui.StyleVarSelectableTextAlign, imgui.Vec2{X: width, Y: height})
  82. }
  83. // PopStyle should be called to stop applying style.
  84. // It should be called as much times, as you Called PushStyle...
  85. // NOTE: If you don't call PopStyle imgui will panic.
  86. func PopStyle() {
  87. imgui.PopStyleVar()
  88. }
  89. // PopStyleV does similarly to PopStyle, but allows to specify number
  90. // of styles you're going to pop.
  91. func PopStyleV(count int) {
  92. imgui.PopStyleVarV(count)
  93. }
  94. // PopStyleColor is used to stop applying colors styles.
  95. // It should be called after each PushStyleColor... (for each push)
  96. // If PopStyleColor wasn't called after PushColor... or was called
  97. // inproperly, imgui will panic.
  98. func PopStyleColor() {
  99. imgui.PopStyleColor()
  100. }
  101. // PopStyleColorV does similar to PopStyleColor, but allows to specify
  102. // how much style colors would you like to pop.
  103. func PopStyleColorV(count int) {
  104. imgui.PopStyleColorV(count)
  105. }
  106. // AlignTextToFramePadding vertically aligns upcoming text baseline to
  107. // FramePadding.y so that it will align properly to regularly framed
  108. // items. Call if you have text on a line before a framed item.
  109. func AlignTextToFramePadding() {
  110. imgui.AlignTextToFramePadding()
  111. }
  112. // PushItemWidth sets following item's widths
  113. // NOTE: don't forget to call PopItemWidth! If you don't do so, imgui
  114. // will panic.
  115. func PushItemWidth(width float32) {
  116. imgui.PushItemWidth(width)
  117. }
  118. // PopItemWidth should be called to stop applying PushItemWidth effect
  119. // If it isn't called imgui will panic.
  120. func PopItemWidth() {
  121. imgui.PopItemWidth()
  122. }
  123. // PushTextWrapPos adds the position, where the text should be frapped.
  124. // use PushTextWrapPos, render text. If text reaches frame end,
  125. // rendering will be continued at the start pos in line below.
  126. // NOTE: Don't forget to call PopWrapTextPos
  127. // NOTE: it is done automatically in LabelWidget (see (*LabelWIdget).Wrapped()).
  128. func PushTextWrapPos() {
  129. imgui.PushTextWrapPos()
  130. }
  131. // PopTextWrapPos should be caled as many times as PushTextWrapPos
  132. // on each frame.
  133. func PopTextWrapPos() {
  134. imgui.PopTextWrapPos()
  135. }
  136. // MouseCursorType represents a type (layout) of mouse cursor.
  137. type MouseCursorType int
  138. // cursor types.
  139. const (
  140. // MouseCursorNone no mouse cursor.
  141. MouseCursorNone MouseCursorType = -1
  142. // MouseCursorArrow standard arrow mouse cursor.
  143. MouseCursorArrow MouseCursorType = 0
  144. // MouseCursorTextInput when hovering over InputText, etc.
  145. MouseCursorTextInput MouseCursorType = 1
  146. // MouseCursorResizeAll (Unused by imgui functions).
  147. MouseCursorResizeAll MouseCursorType = 2
  148. // MouseCursorResizeNS when hovering over an horizontal border.
  149. MouseCursorResizeNS MouseCursorType = 3
  150. // MouseCursorResizeEW when hovering over a vertical border or a column.
  151. MouseCursorResizeEW MouseCursorType = 4
  152. // MouseCursorResizeNESW when hovering over the bottom-left corner of a window.
  153. MouseCursorResizeNESW MouseCursorType = 5
  154. // MouseCursorResizeNWSE when hovering over the bottom-right corner of a window.
  155. MouseCursorResizeNWSE MouseCursorType = 6
  156. // MouseCursorHand (Unused by imgui functions. Use for e.g. hyperlinks).
  157. MouseCursorHand MouseCursorType = 7
  158. MouseCursorCount MouseCursorType = 8
  159. )
  160. // SetMouseCursor sets mouse cursor layout.
  161. func SetMouseCursor(cursor MouseCursorType) {
  162. imgui.SetMouseCursor(int(cursor))
  163. }
  164. // GetWindowPadding returns window padding.
  165. func GetWindowPadding() (x, y float32) {
  166. vec2 := imgui.CurrentStyle().WindowPadding()
  167. return vec2.X, vec2.Y
  168. }
  169. // GetItemSpacing returns current item spacing.
  170. func GetItemSpacing() (w, h float32) {
  171. vec2 := imgui.CurrentStyle().ItemSpacing()
  172. return vec2.X, vec2.Y
  173. }
  174. // GetItemInnerSpacing returns current item inner spacing.
  175. func GetItemInnerSpacing() (w, h float32) {
  176. vec2 := imgui.CurrentStyle().ItemInnerSpacing()
  177. return vec2.X, vec2.Y
  178. }
  179. // GetFramePadding returns current frame padding.
  180. func GetFramePadding() (x, y float32) {
  181. vec2 := imgui.CurrentStyle().FramePadding()
  182. return vec2.X, vec2.Y
  183. }
  184. // StyleColorID identifies a color in the UI style.
  185. type StyleColorID imgui.StyleColorID
  186. // StyleColor identifier.
  187. const (
  188. StyleColorText StyleColorID = StyleColorID(imgui.StyleColorText)
  189. StyleColorTextDisabled StyleColorID = StyleColorID(imgui.StyleColorTextDisabled)
  190. StyleColorWindowBg StyleColorID = StyleColorID(imgui.StyleColorWindowBg)
  191. StyleColorChildBg StyleColorID = StyleColorID(imgui.StyleColorChildBg)
  192. StyleColorPopupBg StyleColorID = StyleColorID(imgui.StyleColorPopupBg)
  193. StyleColorBorder StyleColorID = StyleColorID(imgui.StyleColorBorder)
  194. StyleColorBorderShadow StyleColorID = StyleColorID(imgui.StyleColorBorderShadow)
  195. StyleColorFrameBg StyleColorID = StyleColorID(imgui.StyleColorFrameBg)
  196. StyleColorFrameBgHovered StyleColorID = StyleColorID(imgui.StyleColorFrameBgHovered)
  197. StyleColorFrameBgActive StyleColorID = StyleColorID(imgui.StyleColorFrameBgActive)
  198. StyleColorTitleBg StyleColorID = StyleColorID(imgui.StyleColorTitleBg)
  199. StyleColorTitleBgActive StyleColorID = StyleColorID(imgui.StyleColorTitleBgActive)
  200. StyleColorTitleBgCollapsed StyleColorID = StyleColorID(imgui.StyleColorTitleBgCollapsed)
  201. StyleColorMenuBarBg StyleColorID = StyleColorID(imgui.StyleColorMenuBarBg)
  202. StyleColorScrollbarBg StyleColorID = StyleColorID(imgui.StyleColorScrollbarBg)
  203. StyleColorScrollbarGrab StyleColorID = StyleColorID(imgui.StyleColorScrollbarGrab)
  204. StyleColorScrollbarGrabHovered StyleColorID = StyleColorID(imgui.StyleColorScrollbarGrabHovered)
  205. StyleColorScrollbarGrabActive StyleColorID = StyleColorID(imgui.StyleColorScrollbarGrabActive)
  206. StyleColorCheckMark StyleColorID = StyleColorID(imgui.StyleColorCheckMark)
  207. StyleColorSliderGrab StyleColorID = StyleColorID(imgui.StyleColorSliderGrab)
  208. StyleColorSliderGrabActive StyleColorID = StyleColorID(imgui.StyleColorSliderGrabActive)
  209. StyleColorButton StyleColorID = StyleColorID(imgui.StyleColorButton)
  210. StyleColorButtonHovered StyleColorID = StyleColorID(imgui.StyleColorButtonHovered)
  211. StyleColorButtonActive StyleColorID = StyleColorID(imgui.StyleColorButtonActive)
  212. StyleColorHeader StyleColorID = StyleColorID(imgui.StyleColorHeader)
  213. StyleColorHeaderHovered StyleColorID = StyleColorID(imgui.StyleColorHeaderHovered)
  214. StyleColorHeaderActive StyleColorID = StyleColorID(imgui.StyleColorHeaderActive)
  215. StyleColorSeparator StyleColorID = StyleColorID(imgui.StyleColorSeparator)
  216. StyleColorSeparatorHovered StyleColorID = StyleColorID(imgui.StyleColorSeparatorHovered)
  217. StyleColorSeparatorActive StyleColorID = StyleColorID(imgui.StyleColorSeparatorActive)
  218. StyleColorResizeGrip StyleColorID = StyleColorID(imgui.StyleColorResizeGrip)
  219. StyleColorResizeGripHovered StyleColorID = StyleColorID(imgui.StyleColorResizeGripHovered)
  220. StyleColorResizeGripActive StyleColorID = StyleColorID(imgui.StyleColorResizeGripActive)
  221. StyleColorTab StyleColorID = StyleColorID(imgui.StyleColorTab)
  222. StyleColorTabHovered StyleColorID = StyleColorID(imgui.StyleColorTabHovered)
  223. StyleColorTabActive StyleColorID = StyleColorID(imgui.StyleColorTabActive)
  224. StyleColorTabUnfocused StyleColorID = StyleColorID(imgui.StyleColorTabUnfocused)
  225. StyleColorTabUnfocusedActive StyleColorID = StyleColorID(imgui.StyleColorTabUnfocusedActive)
  226. StyleColorPlotLines StyleColorID = StyleColorID(imgui.StyleColorPlotLines)
  227. StyleColorPlotLinesHovered StyleColorID = StyleColorID(imgui.StyleColorPlotLinesHovered)
  228. StyleColorProgressBarActive StyleColorID = StyleColorPlotLinesHovered
  229. StyleColorPlotHistogram StyleColorID = StyleColorID(imgui.StyleColorPlotHistogram)
  230. StyleColorPlotHistogramHovered StyleColorID = StyleColorID(imgui.StyleColorPlotHistogramHovered)
  231. StyleColorTableHeaderBg StyleColorID = StyleColorID(imgui.StyleColorTableHeaderBg)
  232. StyleColorTableBorderStrong StyleColorID = StyleColorID(imgui.StyleColorTableBorderStrong)
  233. StyleColorTableBorderLight StyleColorID = StyleColorID(imgui.StyleColorTableBorderLight)
  234. StyleColorTableRowBg StyleColorID = StyleColorID(imgui.StyleColorTableRowBg)
  235. StyleColorTableRowBgAlt StyleColorID = StyleColorID(imgui.StyleColorTableRowBgAlt)
  236. StyleColorTextSelectedBg StyleColorID = StyleColorID(imgui.StyleColorTextSelectedBg)
  237. StyleColorDragDropTarget StyleColorID = StyleColorID(imgui.StyleColorDragDropTarget)
  238. StyleColorNavHighlight StyleColorID = StyleColorID(imgui.StyleColorNavHighlight)
  239. StyleColorNavWindowingHighlight StyleColorID = StyleColorID(imgui.StyleColorNavWindowingHighlight)
  240. StyleColorNavWindowingDimBg StyleColorID = StyleColorID(imgui.StyleColorNavWindowingDimBg)
  241. StyleColorModalWindowDimBg StyleColorID = StyleColorID(imgui.StyleColorModalWindowDimBg)
  242. )
  243. // StyleVarID identifies a style variable in the UI style.
  244. type StyleVarID imgui.StyleVarID
  245. // Style IDs.
  246. const (
  247. // StyleVarAlpha is a float.
  248. StyleVarAlpha StyleVarID = StyleVarID(imgui.StyleVarAlpha)
  249. // float DisabledAlpha.
  250. StyleVarDisabledAlpha StyleVarID = StyleVarID(imgui.StyleVarDisabledAlpha)
  251. // StyleVarWindowPadding is a Vec2.
  252. StyleVarWindowPadding StyleVarID = StyleVarID(imgui.StyleVarWindowPadding)
  253. // StyleVarWindowRounding is a float.
  254. StyleVarWindowRounding StyleVarID = StyleVarID(imgui.StyleVarWindowRounding)
  255. // StyleVarWindowBorderSize is a float.
  256. StyleVarWindowBorderSize StyleVarID = StyleVarID(imgui.StyleVarWindowBorderSize)
  257. // StyleVarWindowMinSize is a Vec2.
  258. StyleVarWindowMinSize StyleVarID = StyleVarID(imgui.StyleVarWindowMinSize)
  259. // StyleVarWindowTitleAlign is a Vec2.
  260. StyleVarWindowTitleAlign StyleVarID = StyleVarID(imgui.StyleVarWindowTitleAlign)
  261. // StyleVarChildRounding is a float.
  262. StyleVarChildRounding StyleVarID = StyleVarID(imgui.StyleVarChildRounding)
  263. // StyleVarChildBorderSize is a float.
  264. StyleVarChildBorderSize StyleVarID = StyleVarID(imgui.StyleVarChildBorderSize)
  265. // StyleVarPopupRounding is a float.
  266. StyleVarPopupRounding StyleVarID = StyleVarID(imgui.StyleVarPopupRounding)
  267. // StyleVarPopupBorderSize is a float.
  268. StyleVarPopupBorderSize StyleVarID = StyleVarID(imgui.StyleVarPopupBorderSize)
  269. // StyleVarFramePadding is a Vec2.
  270. StyleVarFramePadding StyleVarID = StyleVarID(imgui.StyleVarFramePadding)
  271. // StyleVarFrameRounding is a float.
  272. StyleVarFrameRounding StyleVarID = StyleVarID(imgui.StyleVarFrameRounding)
  273. // StyleVarFrameBorderSize is a float.
  274. StyleVarFrameBorderSize StyleVarID = StyleVarID(imgui.StyleVarFrameBorderSize)
  275. // StyleVarItemSpacing is a Vec2.
  276. StyleVarItemSpacing StyleVarID = StyleVarID(imgui.StyleVarItemSpacing)
  277. // StyleVarItemInnerSpacing is a Vec2.
  278. StyleVarItemInnerSpacing StyleVarID = StyleVarID(imgui.StyleVarItemInnerSpacing)
  279. // StyleVarIndentSpacing is a float.
  280. StyleVarIndentSpacing StyleVarID = StyleVarID(imgui.StyleVarIndentSpacing)
  281. // StyleVarScrollbarSize is a float.
  282. StyleVarScrollbarSize StyleVarID = StyleVarID(imgui.StyleVarScrollbarSize)
  283. // StyleVarScrollbarRounding is a float.
  284. StyleVarScrollbarRounding StyleVarID = StyleVarID(imgui.StyleVarScrollbarRounding)
  285. // StyleVarGrabMinSize is a float.
  286. StyleVarGrabMinSize StyleVarID = StyleVarID(imgui.StyleVarGrabMinSize)
  287. // StyleVarGrabRounding is a float.
  288. StyleVarGrabRounding StyleVarID = StyleVarID(imgui.StyleVarGrabRounding)
  289. // StyleVarTabRounding is a float.
  290. StyleVarTabRounding StyleVarID = StyleVarID(imgui.StyleVarTabRounding)
  291. // StyleVarButtonTextAlign is a Vec2.
  292. StyleVarButtonTextAlign StyleVarID = StyleVarID(imgui.StyleVarButtonTextAlign)
  293. // StyleVarSelectableTextAlign is a Vec2.
  294. StyleVarSelectableTextAlign StyleVarID = StyleVarID(imgui.StyleVarSelectableTextAlign)
  295. )
  296. // IsVec2 returns true if the style var id should be processed as imgui.Vec2
  297. // if not, it is interpreted as float32.
  298. func (s StyleVarID) IsVec2() bool {
  299. lookup := map[StyleVarID]bool{
  300. // StyleVarWindowPadding is a Vec2.
  301. StyleVarWindowPadding: true,
  302. StyleVarWindowMinSize: true,
  303. StyleVarWindowTitleAlign: true,
  304. StyleVarFramePadding: true,
  305. StyleVarItemSpacing: true,
  306. // StyleVarItemInnerSpacing is a Vec2.
  307. StyleVarItemInnerSpacing: true,
  308. StyleVarButtonTextAlign: true,
  309. StyleVarSelectableTextAlign: true,
  310. }
  311. result, ok := lookup[s]
  312. return result && ok
  313. }
  314. var _ Widget = &StyleSetter{}
  315. // StyleSetter is a user-friendly way to manage imgui styles.
  316. type StyleSetter struct {
  317. colors map[StyleColorID]color.Color
  318. styles map[StyleVarID]any
  319. font *FontInfo
  320. disabled bool
  321. layout Layout
  322. }
  323. // Style initializes a style setter (see examples/setstyle).
  324. func Style() *StyleSetter {
  325. var ss StyleSetter
  326. ss.colors = make(map[StyleColorID]color.Color)
  327. ss.styles = make(map[StyleVarID]any)
  328. return &ss
  329. }
  330. // SetColor sets colorID's color.
  331. func (ss *StyleSetter) SetColor(colorID StyleColorID, col color.Color) *StyleSetter {
  332. ss.colors[colorID] = col
  333. return ss
  334. }
  335. // SetStyle sets styleVarID to width and height.
  336. func (ss *StyleSetter) SetStyle(varID StyleVarID, width, height float32) *StyleSetter {
  337. ss.styles[varID] = imgui.Vec2{X: width, Y: height}
  338. return ss
  339. }
  340. // SetStyleFloat sets styleVarID to float value.
  341. // NOTE: for float typed values see above in comments over
  342. // StyleVarID's comments.
  343. func (ss *StyleSetter) SetStyleFloat(varID StyleVarID, value float32) *StyleSetter {
  344. ss.styles[varID] = value
  345. return ss
  346. }
  347. // SetFont sets font.
  348. func (ss *StyleSetter) SetFont(font *FontInfo) *StyleSetter {
  349. ss.font = font
  350. return ss
  351. }
  352. // SetFontSize sets size of the font.
  353. // NOTE: Be aware, that StyleSetter needs to add a new font to font atlas for
  354. // each font's size.
  355. func (ss *StyleSetter) SetFontSize(size float32) *StyleSetter {
  356. var font FontInfo
  357. if ss.font != nil {
  358. font = *ss.font
  359. } else {
  360. font = defaultFonts[0]
  361. }
  362. ss.font = font.SetSize(size)
  363. return ss
  364. }
  365. // SetDisabled sets if items are disabled.
  366. func (ss *StyleSetter) SetDisabled(d bool) *StyleSetter {
  367. ss.disabled = d
  368. return ss
  369. }
  370. // To allows to specify a layout, StyleSetter should apply style for.
  371. func (ss *StyleSetter) To(widgets ...Widget) *StyleSetter {
  372. ss.layout = widgets
  373. return ss
  374. }
  375. // Build implements Widget.
  376. func (ss *StyleSetter) Build() {
  377. if ss.layout == nil || len(ss.layout) == 0 {
  378. return
  379. }
  380. for k, v := range ss.colors {
  381. imgui.PushStyleColor(imgui.StyleColorID(k), ToVec4Color(v))
  382. }
  383. for k, v := range ss.styles {
  384. if k.IsVec2() {
  385. var value imgui.Vec2
  386. switch typed := v.(type) {
  387. case imgui.Vec2:
  388. value = typed
  389. case float32:
  390. value = imgui.Vec2{X: typed, Y: typed}
  391. }
  392. imgui.PushStyleVarVec2(imgui.StyleVarID(k), value)
  393. } else {
  394. var value float32
  395. switch typed := v.(type) {
  396. case float32:
  397. value = typed
  398. case imgui.Vec2:
  399. value = typed.X
  400. }
  401. imgui.PushStyleVarFloat(imgui.StyleVarID(k), value)
  402. }
  403. }
  404. if ss.font != nil {
  405. if PushFont(ss.font) {
  406. defer PopFont()
  407. }
  408. }
  409. imgui.BeginDisabled(ss.disabled)
  410. ss.layout.Build()
  411. imgui.EndDisabled()
  412. imgui.PopStyleColorV(len(ss.colors))
  413. imgui.PopStyleVarV(len(ss.styles))
  414. }