본문 바로가기
Programming/Golang

andlabs/ui Table예제 코드

by Wilkyway 2020. 3. 30.
반응형

Golang으로 테이블을 구현할만한 GUI 라이브러리를 찾고 있는 중, andlabs/ui에서 예제를 발견하여 소스 코드를 올려봅니다. 분석도 좀 필요한데..아직은 그냥 몇몇 부분만 단순화 해놓은 상태입니다.

// tabletest.go
package main

import (
	"fmt"

	"github.com/andlabs/ui"
	_ "github.com/andlabs/ui/winmanifest"
)

type modelHandler struct {
	row9Text    string
	yellowRow   int
	checkStates [3]int
}

func (mh *modelHandler) ColumnTypes(m *ui.TableModel) []ui.TableValue {
	return []ui.TableValue{
		ui.TableString(""), // column 0 text
		ui.TableString(""), // column 1 text
		ui.TableString(""), // column 2 text
	}
}

func (mh *modelHandler) NumRows(m *ui.TableModel) int {
	return 3
}

func (mh *modelHandler) CellValue(m *ui.TableModel, row, column int) ui.TableValue {

	fmt.Printf("%d %d\n", row, column)
	return ui.TableString(row_data[row][column]) //테이블 내부에서 모든 행/열에 대해 자동 수행됨.
												 //String으로 선언된 배열 값을 행/렬 값을 인덱스로 받아들
}

func (mh *modelHandler) SetCellValue(m *ui.TableModel, row, column int, value ui.TableValue) {
	mh.row9Text = string(value.(ui.TableString))
}

func newModelHandler() *modelHandler {
	m := new(modelHandler)
	m.row9Text = "You can edit this one"
	m.yellowRow = -1
	return m
}

//불러올 데이터를 전역변수로 정의
var row_data = [3][3]string{
	{"a", "b", "c"},
	{"f", "e", "d"},
	{"g", "h", "i"},
}

func setupUI() {
	mainwin := ui.NewWindow("libui Control Gallery", 640, 480, true)
	mainwin.OnClosing(func(*ui.Window) bool {
		ui.Quit()
		return true
	})
	ui.OnShouldQuit(func() bool {
		mainwin.Destroy()
		return true
	})

	mh := newModelHandler()
	model := ui.NewTableModel(mh)
	table := ui.NewTable(&ui.TableParams{
		Model:                         model,
		RowBackgroundColorModelColumn: -1, // "RowBackgroundColorModelColumn"는 테이블의 전체 행에
		//사용되는 배경색을 사용하는 열 번호를 정의.
		//모든 행에 기본 배경색을 사용하려면 -1.
		//CellValue가 NULL이면 기본 배경색.
	})

	table.AppendTextColumn("Column 1", 0, ui.TableModelColumnNeverEditable, nil)
	table.AppendTextColumn("Column 2", 1, ui.TableModelColumnNeverEditable, nil)
	table.AppendTextColumn("Editable", 2, ui.TableModelColumnAlwaysEditable, nil)

	input := ui.NewEntry()
	button := ui.NewButton("Greet")
	box := ui.NewVerticalBox()
	box.Append(ui.NewLabel("Enter your name:"), false)
	box.Append(input, false)
	box.Append(button, false)
	box.Append(table, true)

	mainwin.SetChild(box)
	mainwin.SetMargined(true)

	mainwin.Show()
}

func main() {
	ui.Main(setupUI)
}

 

결과물은 아래처럼 나오는데.....적당히 수정해서 Oracle하고 연동해서 사용할 계획입니다.

(결과물 나오는대로 포스팅 업데이트 예정)

2020.04.01수정:

  외부 데이터를 받아들여 표시하기 위해 이것 저것 만져보았습니다. 우선 "RowBackgroundColorModelColumn" 녀석이 있는데, 이게 -1로 되어있어야 했습니다. 배경색을 정의하는 인자 같은데, 이걸 다른 값을 설정하면....예를 들어 3을 설정하면 칼럼 값이 3+3=6이 됩니다. 화면에 나타나지 않아서 찾느라 고생했습니다ㅠㅠ. 덕분에 CellValue 함수 정의하는데 고생을 좀 했습니다.

  

반응형

댓글