module main import ( ui gx os //darwin ) const ( NR_COLS = 3 CELL_HEIGHT = 25 CELL_WIDTH = 100 TABLE_WIDTH = CELL_WIDTH * NR_COLS ) struct User { first_name string last_name string age int } struct Context { mut: first_name ui.TextBox last_name ui.TextBox age ui.TextBox users []User window &ui.Window txt_pos int } /* // Current V struct Window { width: 500 height: 300 title: 'Users' body: Layout { body: [ TextBox { placeholder: 'First name' }, TextBox { placeholder: 'Last name' }, TextBox { placeholder: 'Age' }, Button { title: 'Add user' onclick: btn_click }, ] } } // Improved V struct Window { width: 500 height: 300 title: 'Users' Layout { [ TextBox { placeholder: 'First name' } TextBox { placeholder: 'Last name' } TextBox { placeholder: 'Age' } Button { title: 'Add user' onclick: btn_click } ] } } /* Window { width: 500 height: 300 title: 'Users' VLayout { TextBox { placeholder: 'First name' } TextBox { placeholder: 'Last name' } TextBox { placeholder: 'Age' } Button { title: 'Add user' onclick: btn_click } } draw: draw_fn } */ */ fn main() { mut ctx := &Context { txt_pos: 10 } ctx.users << User { first_name: 'Sam' last_name: 'Johnson' age: 29 } ctx.window = ui.new_window(ui.WinCfg { width: 500 height: 300 title: 'Users' draw_fn: draw ptr: ctx }) ctx.first_name = ctx.add_textbox('First name') ctx.last_name = ctx.add_textbox('Last name') ctx.age = ctx.add_textbox('Age') mut btn := ui.new_button('Add user', ctx.window, btn_click) btn.onclick(btn_click) btn.widget.set_pos(TABLE_WIDTH + 50, ctx.txt_pos) for { ui.wait_events() } } // TODO replace with `fn (ctx mut Context) btn_click() {` fn btn_click(_ctx &Context) { println('users.v: button click') mut ctx := _ctx// TODO hack ctx.users << User { first_name: ctx.first_name.text() last_name: ctx.last_name.text() age: ctx.age.text().int() } ctx.window.refresh() } // TODO replace with `fn (ctx mut Context) draw() {` fn draw(ctx &Context) { for i, user in ctx.users { x := 10 y := 10 + i * CELL_HEIGHT // Outer border ui.draw_empty_rect(x, y, TABLE_WIDTH, CELL_HEIGHT, gx.Gray) // Vertical separators ui.draw_line(x + CELL_WIDTH, y, x + CELL_WIDTH, y + CELL_HEIGHT, gx.Gray) ui.draw_line(x + CELL_WIDTH * 2, y, x + CELL_WIDTH * 2, y + CELL_HEIGHT, gx.Gray) // Text values ui.draw_text_def(x + 5, y + 5, user.first_name) ui.draw_text_def(x + 5 + CELL_WIDTH, y + 5, user.last_name) ui.draw_text_def(x + 5 + CELL_WIDTH * 2, y + 5, user.age.str()) } } fn (ctx mut Context) add_textbox(placeholder string) ui.TextBox { mut txt_box := ui.new_textbox(ctx.window, false) txt_box.set_placeholder(placeholder) txt_box.widget.set_pos(TABLE_WIDTH + 50, ctx.txt_pos) ctx.txt_pos += 30 return txt_box }