// based off andlabs/ui/examples/table.go package main import "fmt" import "log" import "github.com/andlabs/ui" import _ "github.com/andlabs/ui/winmanifest" import "github.com/davecgh/go-spew/spew" type vmRowData struct { hostname string size int IPv6 string IPv4 string memory int disk int } type modelHandler struct { name string rows int bgcolorColumn int yellowRow int checkStates []int vms []vmRowData columnTypes string funcColumnTypes func() []ui.TableValue scanCellValue func(*modelHandler, int, int) ui.TableValue setCellValue func(*modelHandler, int, int) ui.TableValue } func newDemoModelHandler() *modelHandler { mh := new(modelHandler) mh.rows = 20 mh.funcColumnTypes = demoColumnTypes mh.scanCellValue = demoCellValue mh.checkStates = make([]int, mh.rows) mh.vms = make([]vmRowData, mh.rows) mh.vms[8].hostname = "fire" mh.vms[9].hostname = "librem15.this.is.a.really.long.string.test" mh.yellowRow = -1 log.Println("Called newDemoModelhandler() with mh=", mh) spew.Dump(mh) return mh } func standardColumnTypes() []ui.TableValue { return []ui.TableValue{ ui.TableColor{}, // row background color ui.TableString(""), // column 0 text ui.TableColor{}, // column 0 text color ui.TableString("test"), // column 1 button text } } func defaultCellValue(mh *modelHandler, row, column int) ui.TableValue { switch column { case 0: if (row % 2) == 1 { return ui.TableColor{0.5, 0.5, 0.5, .1} } return nil case 1: return ui.TableString(fmt.Sprintf("jcarrgood %d", row)) } return ui.TableString(fmt.Sprintf("jcarrbad %d", row)) } func (mh *modelHandler) SetCellValue(m *ui.TableModel, row, column int, value ui.TableValue) { log.Println("SetCallValue() START") spew.Dump(m) spew.Dump(mh) if (mh.columnTypes == "standard") { if column == 3 { // button row (?) log.Println("Button was pressed START", row, column) } return } if column == 2 { mh.vms[row].hostname = string(value.(ui.TableString)) } if column == 6 { // row background color prevYellowRow := mh.yellowRow mh.yellowRow = row if prevYellowRow != -1 { m.RowChanged(prevYellowRow) } m.RowChanged(mh.yellowRow) } if column == 7 { // checkboxes mh.checkStates[row] = int(value.(ui.TableInt)) } log.Println("SetCallValue() END") spew.Dump(m) } func newModelHandler(rows int) *modelHandler { mh := new(modelHandler) mh.rows = rows mh.columnTypes = "standard" mh.funcColumnTypes = standardColumnTypes mh.scanCellValue = defaultCellValue mh.bgcolorColumn = 0 mh.checkStates = make([]int, mh.rows) mh.vms = make([]vmRowData, mh.rows) mh.vms[1].hostname = "jcarr" mh.yellowRow = -1 log.Println("Called newModelhandler() with mh=", mh) spew.Dump(mh) return mh } func makeTable(name string, rows int, row1Name string) (*ui.Table, *modelHandler, *ui.TableModel) { mh := newModelHandler(rows) mh.name = name model := ui.NewTableModel(mh) table := ui.NewTable( &ui.TableParams{ Model: model, RowBackgroundColorModelColumn: mh.bgcolorColumn, }) table.AppendTextColumn(row1Name, 1, ui.TableModelColumnAlwaysEditable, nil) table.AppendButtonColumn("Details", 3, ui.TableModelColumnAlwaysEditable) return table, mh, model }