// based off andlabs/ui/examples/table.go package main import "fmt" import "log" import "github.com/andlabs/ui" import "github.com/davecgh/go-spew/spew" type vmRowData struct { hostname string size int IPv6 string IPv4 string memory int disk int } type uiColumn struct { offset int name string what ui.TableValue color ui.TableColor // ui.TableString(""), // column 4 button text // ui.TableColor{}, // column 1 text color // ui.TableImage{}, // column 1 image // ui.TableInt(0), // column 3 checkbox state } type modelHandler struct { name string rows int yellowRow int checkStates []int vms []vmRowData } func newDefaultModelHandler() *modelHandler { mh := new(modelHandler) mh.rows = 20 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 newModelhandler() with mh=", mh) spew.Dump(mh) return mh } func newJcarrModelHandler() *modelHandler { mh := new(modelHandler) mh.rows = 10 mh.checkStates = make([]int, mh.rows) mh.vms = make([]vmRowData, mh.rows) mh.vms[8].hostname = "jcarr" mh.vms[9].hostname = "jcarr2" mh.yellowRow = -1 log.Println("Called newModelhandler() with mh=", mh) spew.Dump(mh) return mh } func (mh *modelHandler) ColumnTypes(m *ui.TableModel) []ui.TableValue { // log.Println("ColumnTypes() with m=", m, "mh=", mh) if (mh.name == "jcarrTable") { // log.Println("ColumnTypes() with m=", m, "mh=", mh) 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 } } return []ui.TableValue{ ui.TableString(""), // column 0 text ui.TableString(""), // column 1 text ui.TableString(""), // column 2 text ui.TableColor{}, // row background color ui.TableColor{}, // column 1 text color ui.TableImage{}, // column 1 image ui.TableString(""), // column 4 button text ui.TableInt(0), // column 3 checkbox state ui.TableInt(0), // column 5 progress } } func (mh *modelHandler) NumRows(m *ui.TableModel) int { // log.Println("NumRows() with m=", m) return mh.rows } var img [2]*ui.Image func (mh *modelHandler) CellValue(m *ui.TableModel, row, column int) ui.TableValue { // TODO: Figure out why this is being called 1000 times a second (10 times for each row & column) // log.Println("CallValue() row=", row, "column=", column) if (mh.name == "jcarrTable") { 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)) // panic("unreachable") } switch column { case 0: return ui.TableString(fmt.Sprintf("Row %d", row)) case 1: return ui.TableString("Colors!") case 7: return ui.TableInt(mh.checkStates[row]) case 8: if row == 0 { return ui.TableInt(0) } if row == 13 { return ui.TableInt(100) } if row == 14 { return ui.TableInt(-1) } return ui.TableInt(50) case 5: if row < 8 { return ui.TableImage{img[0]} } return ui.TableImage{img[1]} case 4: if (row % 2) == 1 { return ui.TableColor{0.5, 0, 0.75, 1} } return nil case 3: if row == mh.yellowRow { return ui.TableColor{1, 1, 0, .1} } if row == 3 { // Red with .1 transparency // R G B Trans return ui.TableColor{1, 0, 0, .1} } if row == 11 { return ui.TableColor{0, 0.5, 1, 0.5} } return nil case 2: return ui.TableString(mh.vms[row].hostname) case 6: return ui.TableString("Make Yellow") } panic("unreachable") } 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.name == "jcarrTable") { 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 makeDemotable(name string) *ui.Table { img[0] = ui.NewImage(16, 16) img[1] = ui.NewImage(16, 16) mh := newDefaultModelHandler() mh.name = name model := ui.NewTableModel(mh) table := ui.NewTable( &ui.TableParams{ Model: model, RowBackgroundColorModelColumn: 3, }) table.AppendTextColumn("Column 1", 0, ui.TableModelColumnNeverEditable, nil) table.AppendImageTextColumn("Column 2", 5, 1, ui.TableModelColumnNeverEditable, &ui.TableTextColumnOptionalParams{ ColorModelColumn: 4, }); table.AppendTextColumn("hostname", 2, ui.TableModelColumnAlwaysEditable, nil) table.AppendCheckboxColumn("Checkboxes", 7, ui.TableModelColumnAlwaysEditable) table.AppendButtonColumn("Buttons", 6, ui.TableModelColumnAlwaysEditable) table.AppendProgressBarColumn("Progress Bar", 8) return table } func makeJcarrtable(name string) (*ui.Table, *modelHandler, *ui.TableModel) { mh := newJcarrModelHandler() mh.name = name model := ui.NewTableModel(mh) table := ui.NewTable( &ui.TableParams{ Model: model, RowBackgroundColorModelColumn: 0, }) table.AppendTextColumn("hostname", 1, ui.TableModelColumnNeverEditable, nil) table.AppendButtonColumn("Details", 3, ui.TableModelColumnAlwaysEditable) return table, mh, model }