TableWidgets.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. package giu
  2. import (
  3. "image/color"
  4. "github.com/AllenDang/imgui-go"
  5. )
  6. type TableRowWidget struct {
  7. flags TableRowFlags
  8. minRowHeight float64
  9. layout Layout
  10. bgColor color.Color
  11. }
  12. func TableRow(widgets ...Widget) *TableRowWidget {
  13. return &TableRowWidget{
  14. flags: 0,
  15. minRowHeight: 0,
  16. layout: widgets,
  17. bgColor: nil,
  18. }
  19. }
  20. func (r *TableRowWidget) BgColor(c color.Color) *TableRowWidget {
  21. r.bgColor = c
  22. return r
  23. }
  24. func (r *TableRowWidget) Flags(flags TableRowFlags) *TableRowWidget {
  25. r.flags = flags
  26. return r
  27. }
  28. func (r *TableRowWidget) MinHeight(height float64) *TableRowWidget {
  29. r.minRowHeight = height
  30. return r
  31. }
  32. // BuildTableRow executes table row build steps.
  33. func (r *TableRowWidget) BuildTableRow() {
  34. imgui.TableNextRow(imgui.TableRowFlags(r.flags), r.minRowHeight)
  35. for _, w := range r.layout {
  36. switch w.(type) {
  37. case *TooltipWidget,
  38. *ContextMenuWidget, *PopupModalWidget:
  39. // noop
  40. default:
  41. imgui.TableNextColumn()
  42. }
  43. w.Build()
  44. }
  45. if r.bgColor != nil {
  46. imgui.TableSetBgColor(imgui.TableBgTarget_RowBg0, uint32(imgui.GetColorU32(ToVec4Color(r.bgColor))), -1)
  47. }
  48. }
  49. type TableColumnWidget struct {
  50. label string
  51. flags TableColumnFlags
  52. innerWidthOrWeight float32
  53. userID uint32
  54. }
  55. func TableColumn(label string) *TableColumnWidget {
  56. return &TableColumnWidget{
  57. label: tStr(label),
  58. flags: 0,
  59. innerWidthOrWeight: 0,
  60. userID: 0,
  61. }
  62. }
  63. func (c *TableColumnWidget) Flags(flags TableColumnFlags) *TableColumnWidget {
  64. c.flags = flags
  65. return c
  66. }
  67. func (c *TableColumnWidget) InnerWidthOrWeight(w float32) *TableColumnWidget {
  68. c.innerWidthOrWeight = w
  69. return c
  70. }
  71. func (c *TableColumnWidget) UserID(id uint32) *TableColumnWidget {
  72. c.userID = id
  73. return c
  74. }
  75. // BuildTableColumn executes table column build steps.
  76. func (c *TableColumnWidget) BuildTableColumn() {
  77. imgui.TableSetupColumn(c.label, imgui.TableColumnFlags(c.flags), c.innerWidthOrWeight, c.userID)
  78. }
  79. var _ Widget = &TableWidget{}
  80. type TableWidget struct {
  81. id string
  82. flags TableFlags
  83. size imgui.Vec2
  84. innerWidth float64
  85. rows []*TableRowWidget
  86. columns []*TableColumnWidget
  87. fastMode bool
  88. freezeRow int
  89. freezeColumn int
  90. }
  91. func Table() *TableWidget {
  92. return &TableWidget{
  93. id: GenAutoID("Table"),
  94. flags: TableFlagsResizable | TableFlagsBorders | TableFlagsScrollY,
  95. rows: nil,
  96. columns: nil,
  97. fastMode: false,
  98. freezeRow: -1,
  99. freezeColumn: -1,
  100. }
  101. }
  102. // ID sets the internal id of table widget.
  103. func (t *TableWidget) ID(id string) *TableWidget {
  104. t.id = id
  105. return t
  106. }
  107. // FastMode Displays visible rows only to boost performance.
  108. func (t *TableWidget) FastMode(b bool) *TableWidget {
  109. t.fastMode = b
  110. return t
  111. }
  112. // Freeze columns/rows so they stay visible when scrolled.
  113. func (t *TableWidget) Freeze(col, row int) *TableWidget {
  114. t.freezeColumn = col
  115. t.freezeRow = row
  116. return t
  117. }
  118. func (t *TableWidget) Columns(cols ...*TableColumnWidget) *TableWidget {
  119. t.columns = cols
  120. return t
  121. }
  122. func (t *TableWidget) Rows(rows ...*TableRowWidget) *TableWidget {
  123. t.rows = rows
  124. return t
  125. }
  126. func (t *TableWidget) Size(width, height float32) *TableWidget {
  127. t.size = imgui.Vec2{X: width, Y: height}
  128. return t
  129. }
  130. func (t *TableWidget) InnerWidth(width float64) *TableWidget {
  131. t.innerWidth = width
  132. return t
  133. }
  134. func (t *TableWidget) Flags(flags TableFlags) *TableWidget {
  135. t.flags = flags
  136. return t
  137. }
  138. // Build implements Widget interface.
  139. func (t *TableWidget) Build() {
  140. if len(t.rows) == 0 {
  141. return
  142. }
  143. colCount := len(t.columns)
  144. if colCount == 0 {
  145. colCount = len(t.rows[0].layout)
  146. }
  147. if imgui.BeginTable(t.id, colCount, imgui.TableFlags(t.flags), t.size, t.innerWidth) {
  148. if t.freezeColumn >= 0 && t.freezeRow >= 0 {
  149. imgui.TableSetupScrollFreeze(t.freezeColumn, t.freezeRow)
  150. }
  151. if len(t.columns) > 0 {
  152. for _, col := range t.columns {
  153. col.BuildTableColumn()
  154. }
  155. imgui.TableHeadersRow()
  156. }
  157. if t.fastMode {
  158. clipper := imgui.NewListClipper()
  159. defer clipper.Delete()
  160. clipper.Begin(len(t.rows))
  161. for clipper.Step() {
  162. for i := clipper.DisplayStart(); i < clipper.DisplayEnd(); i++ {
  163. row := t.rows[i]
  164. row.BuildTableRow()
  165. }
  166. }
  167. clipper.End()
  168. } else {
  169. for _, row := range t.rows {
  170. row.BuildTableRow()
  171. }
  172. }
  173. imgui.EndTable()
  174. }
  175. }