StackWidget.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package giu
  2. import "github.com/AllenDang/imgui-go"
  3. var _ Widget = &StackWidget{}
  4. // StackWidget is used to ensure, that the build methods of all
  5. // the widgets (layouts field) was called, but only the selected
  6. // (visible field) layout is rendered (visible) in app.
  7. type StackWidget struct {
  8. visible int32
  9. layouts []Widget
  10. }
  11. // Stack creates a new StackWidget.
  12. func Stack(visible int32, layouts ...Widget) *StackWidget {
  13. return &StackWidget{
  14. visible: visible,
  15. layouts: layouts,
  16. }
  17. }
  18. // Build implements widget interface.
  19. func (s *StackWidget) Build() {
  20. // save visible cursor position
  21. visiblePos := GetCursorScreenPos()
  22. // build visible layout
  23. // NOTE: it is important to build the visiblely showed layout before
  24. // building another ones, because the interactive layout widgets
  25. // (e.g. buttons) should be rendered on top of `stack`
  26. layouts := s.layouts
  27. if s.visible >= 0 && s.visible < int32(len(s.layouts)) {
  28. s.layouts[s.visible].Build()
  29. // remove visible layout from layouts list
  30. // nolint:gocritic // remove visible widget
  31. layouts = append(s.layouts[:s.visible], s.layouts[:s.visible+1]...)
  32. }
  33. // build invisible layouts with 0 alpha
  34. imgui.PushStyleVarFloat(imgui.StyleVarAlpha, 0)
  35. for _, l := range layouts {
  36. SetCursorScreenPos(visiblePos)
  37. l.Build()
  38. }
  39. imgui.PopStyleVar()
  40. }