| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- package giu
- import (
- "image/color"
- "github.com/AllenDang/imgui-go"
- )
- type TableRowWidget struct {
- flags TableRowFlags
- minRowHeight float64
- layout Layout
- bgColor color.Color
- }
- func TableRow(widgets ...Widget) *TableRowWidget {
- return &TableRowWidget{
- flags: 0,
- minRowHeight: 0,
- layout: widgets,
- bgColor: nil,
- }
- }
- func (r *TableRowWidget) BgColor(c color.Color) *TableRowWidget {
- r.bgColor = c
- return r
- }
- func (r *TableRowWidget) Flags(flags TableRowFlags) *TableRowWidget {
- r.flags = flags
- return r
- }
- func (r *TableRowWidget) MinHeight(height float64) *TableRowWidget {
- r.minRowHeight = height
- return r
- }
- // BuildTableRow executes table row build steps.
- func (r *TableRowWidget) BuildTableRow() {
- imgui.TableNextRow(imgui.TableRowFlags(r.flags), r.minRowHeight)
- for _, w := range r.layout {
- switch w.(type) {
- case *TooltipWidget,
- *ContextMenuWidget, *PopupModalWidget:
- // noop
- default:
- imgui.TableNextColumn()
- }
- w.Build()
- }
- if r.bgColor != nil {
- imgui.TableSetBgColor(imgui.TableBgTarget_RowBg0, uint32(imgui.GetColorU32(ToVec4Color(r.bgColor))), -1)
- }
- }
- type TableColumnWidget struct {
- label string
- flags TableColumnFlags
- innerWidthOrWeight float32
- userID uint32
- }
- func TableColumn(label string) *TableColumnWidget {
- return &TableColumnWidget{
- label: tStr(label),
- flags: 0,
- innerWidthOrWeight: 0,
- userID: 0,
- }
- }
- func (c *TableColumnWidget) Flags(flags TableColumnFlags) *TableColumnWidget {
- c.flags = flags
- return c
- }
- func (c *TableColumnWidget) InnerWidthOrWeight(w float32) *TableColumnWidget {
- c.innerWidthOrWeight = w
- return c
- }
- func (c *TableColumnWidget) UserID(id uint32) *TableColumnWidget {
- c.userID = id
- return c
- }
- // BuildTableColumn executes table column build steps.
- func (c *TableColumnWidget) BuildTableColumn() {
- imgui.TableSetupColumn(c.label, imgui.TableColumnFlags(c.flags), c.innerWidthOrWeight, c.userID)
- }
- var _ Widget = &TableWidget{}
- type TableWidget struct {
- id string
- flags TableFlags
- size imgui.Vec2
- innerWidth float64
- rows []*TableRowWidget
- columns []*TableColumnWidget
- fastMode bool
- freezeRow int
- freezeColumn int
- }
- func Table() *TableWidget {
- return &TableWidget{
- id: GenAutoID("Table"),
- flags: TableFlagsResizable | TableFlagsBorders | TableFlagsScrollY,
- rows: nil,
- columns: nil,
- fastMode: false,
- freezeRow: -1,
- freezeColumn: -1,
- }
- }
- // ID sets the internal id of table widget.
- func (t *TableWidget) ID(id string) *TableWidget {
- t.id = id
- return t
- }
- // FastMode Displays visible rows only to boost performance.
- func (t *TableWidget) FastMode(b bool) *TableWidget {
- t.fastMode = b
- return t
- }
- // Freeze columns/rows so they stay visible when scrolled.
- func (t *TableWidget) Freeze(col, row int) *TableWidget {
- t.freezeColumn = col
- t.freezeRow = row
- return t
- }
- func (t *TableWidget) Columns(cols ...*TableColumnWidget) *TableWidget {
- t.columns = cols
- return t
- }
- func (t *TableWidget) Rows(rows ...*TableRowWidget) *TableWidget {
- t.rows = rows
- return t
- }
- func (t *TableWidget) Size(width, height float32) *TableWidget {
- t.size = imgui.Vec2{X: width, Y: height}
- return t
- }
- func (t *TableWidget) InnerWidth(width float64) *TableWidget {
- t.innerWidth = width
- return t
- }
- func (t *TableWidget) Flags(flags TableFlags) *TableWidget {
- t.flags = flags
- return t
- }
- // Build implements Widget interface.
- func (t *TableWidget) Build() {
- if len(t.rows) == 0 {
- return
- }
- colCount := len(t.columns)
- if colCount == 0 {
- colCount = len(t.rows[0].layout)
- }
- if imgui.BeginTable(t.id, colCount, imgui.TableFlags(t.flags), t.size, t.innerWidth) {
- if t.freezeColumn >= 0 && t.freezeRow >= 0 {
- imgui.TableSetupScrollFreeze(t.freezeColumn, t.freezeRow)
- }
- if len(t.columns) > 0 {
- for _, col := range t.columns {
- col.BuildTableColumn()
- }
- imgui.TableHeadersRow()
- }
- if t.fastMode {
- clipper := imgui.NewListClipper()
- defer clipper.Delete()
- clipper.Begin(len(t.rows))
- for clipper.Step() {
- for i := clipper.DisplayStart(); i < clipper.DisplayEnd(); i++ {
- row := t.rows[i]
- row.BuildTableRow()
- }
- }
- clipper.End()
- } else {
- for _, row := range t.rows {
- row.BuildTableRow()
- }
- }
- imgui.EndTable()
- }
- }
|