func buildSwitchButtonDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() p.SetCellPadding(1) row := gwu.NewHorizontalPanel() row.Add(gwu.NewLabel("Here's an ON/OFF switch which enables/disables the other one:")) sw := gwu.NewSwitchButton() sw.SetOnOff("ENB", "DISB") sw.SetState(true) row.Add(sw) p.Add(row) p.AddVSpace(10) row = gwu.NewHorizontalPanel() row.Add(gwu.NewLabel("And the other one:")) sw2 := gwu.NewSwitchButton() sw2.SetEnabled(true) sw2.Style().SetWidthPx(100) row.Add(sw2) sw.AddEHandlerFunc(func(e gwu.Event) { sw2.SetEnabled(sw.State()) e.MarkDirty(sw2) }, gwu.ETYPE_CLICK) p.Add(row) return p }
func buildRadioButtonDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() p.Add(gwu.NewLabel("Select your favorite programming language:")) group := gwu.NewRadioGroup("lang") rbs := []gwu.RadioButton{gwu.NewRadioButton("Go", group), gwu.NewRadioButton("Java", group), gwu.NewRadioButton("C / C++", group), gwu.NewRadioButton("Python", group), gwu.NewRadioButton("QBasic (nah this can't be your favorite)", group)} rbs[4].SetEnabled(false) for _, rb := range rbs { p.Add(rb) } p.AddVSpace(20) p.Add(gwu.NewLabel("Select your favorite computer game:")) group = gwu.NewRadioGroup("game") rbs = []gwu.RadioButton{gwu.NewRadioButton("StarCraft II", group), gwu.NewRadioButton("Minecraft", group), gwu.NewRadioButton("Other", group)} for _, rb := range rbs { p.Add(rb) } return p }
func buildImageDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() p.Add(gwu.NewLabel("Google's logo:")) img := gwu.NewImage("Google's logo", "https://www.google.com/images/srpr/logo3w.png") img.Style().SetSizePx(275, 95) p.Add(img) p.AddVSpace(20) p.Add(gwu.NewLabel("Go's Gopher:")) img = gwu.NewImage("Go's Gopher", "http://golang.org/doc/gopher/frontpage.png") img.Style().SetSizePx(250, 340) state := false img.AddEHandlerFunc(func(e gwu.Event) { switch e.Type() { case gwu.ETYPE_CLICK: switch state { case false: img.SetUrl("https://www.google.com/images/srpr/logo3w.png") img.Style().SetSizePx(275, 95) state = true case true: img.SetUrl("http://golang.org/doc/gopher/frontpage.png") img.Style().SetSizePx(250, 340) state = false } } e.MarkDirty(img) }, gwu.ETYPE_CLICK) p.Add(img) return p }
func buildLabelDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() p.Add(gwu.NewLabel("This is a Label.")) p.Add(gwu.NewLabel("世界 And another one. ㅈㅈ")) p.Add(gwu.NewLabel("Nothing special about them, but they may be the mostly used components.")) p.AddVSpace(20) p.Add(gwu.NewLabel("You can change their text:")) b := gwu.NewButton("Change!") b.AddEHandlerFunc(func(e gwu.Event) { for i := 0; i < p.CompsCount(); i++ { if l, ok := p.CompAt(i).(gwu.Label); ok && l != b { reversed := []rune(l.Text()) for i, j := 0, len(reversed)-1; i < j; i, j = i+1, j-1 { reversed[i], reversed[j] = reversed[j], reversed[i] } l.SetText(string(reversed)) } } e.MarkDirty(p) }, gwu.ETYPE_CLICK) p.Add(b) return p }
func main() { // Create GUI server server := gwu.NewServer("guitest", "") //server := gwu.NewServerTLS("guitest", "", "test_tls/cert.pem", "test_tls/key.pem") server.SetText("Test GUI Application") server.AddSessCreatorName("login", "Login Window") server.AddSHandler(SessHandler{}) win := gwu.NewWindow("home", "Home Window") l := gwu.NewLabel("Home, sweet home of " + server.Text()) l.Style().SetFontWeight(gwu.FONT_WEIGHT_BOLD).SetFontSize("130%") win.Add(l) win.Add(gwu.NewLabel("Click on the button to login:"******"Login") b.AddEHandlerFunc(func(e gwu.Event) { e.ReloadWin("login") }, gwu.ETYPE_CLICK) win.Add(b) server.AddWin(win) server.SetLogger(log.New(os.Stdout, "", log.LstdFlags)) // Start GUI server if err := server.Start(); err != nil { fmt.Println("Error: Cound not start GUI server:", err) return } }
func buildCheckBoxDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() suml := gwu.NewLabel("") p.Add(gwu.NewLabel("Check the days you want to work on:")) cbs := []gwu.CheckBox{gwu.NewCheckBox("Monday"), gwu.NewCheckBox("Tuesday"), gwu.NewCheckBox("Wednesday"), gwu.NewCheckBox("Thursday"), gwu.NewCheckBox("Friday"), gwu.NewCheckBox("Saturday"), gwu.NewCheckBox("Sunday")} cbs[5].SetEnabled(false) cbs[6].SetEnabled(false) for _, cb := range cbs { p.Add(cb) cb.AddEHandlerFunc(func(e gwu.Event) { sum := 0 for _, cb2 := range cbs { if cb2.State() { sum++ } } suml.SetText(fmt.Sprintf("%d day%s is a total of %d hours a week.", sum, plural(sum), sum*8)) e.MarkDirty(suml) }, gwu.ETYPE_CLICK) } p.Add(suml) return p }
func buildPanelDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() p.Add(gwu.NewLabel("Panel with horizontal layout:")) h := gwu.NewHorizontalPanel() for i := 1; i <= 5; i++ { h.Add(gwu.NewButton("Button " + strconv.Itoa(i))) } p.Add(h) p.AddVSpace(20) p.Add(gwu.NewLabel("Panel with vertical layout:")) v := gwu.NewVerticalPanel() for i := 1; i <= 5; i++ { v.Add(gwu.NewButton("Button " + strconv.Itoa(i))) } p.Add(v) p.AddVSpace(20) p.Add(gwu.NewLabel("Panel with natural layout:")) n := gwu.NewNaturalPanel() for i := 1; i <= 20; i++ { n.Add(gwu.NewButton("LONG BUTTON " + strconv.Itoa(i))) } p.Add(n) return p }
func buildHomeDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() p.Add(gwu.NewLabel("This app is written in and showcases Gowut version " + gwu.GOWUT_VERSION + ".")) p.AddVSpace(20) p.Add(gwu.NewLabel("Select components on the left side to see them in action.")) return p }
func buildWindowDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() p.Add(gwu.NewLabel("The Window represents the whole window, the page inside the browser.")) p.AddVSpace(5) p.Add(gwu.NewLabel("The Window is the top of the component hierarchy. It is an extension of the Panel.")) return p }
func updateTables(tables gwu.Panel) { var sorted SortBySellPrice for card, _ := range PriceHistory { sorted = append(sorted, StockedItem{ card, currentState.DeterminePrice(card, 1, true), currentState.DeterminePrice(card, 1, false), }) } sort.Sort(sorted) tables.Clear() tables.Add(createFAQ()) tables.AddHSpace(100) for rarity, rarityStr := range []string{"Commons", "Uncommons", "Rares"} { layout := gwu.NewPanel() tables.Add(layout) tables.AddHSpace(30) layout.SetHAlign(gwu.HA_CENTER) layout.Style().SetBackground("rgba(0,0,0,0.5)") layout.Style().SetWidthPx(320) header := gwu.NewLabel(rarityStr) header.Style().SetColor("rgb(255,255,255)") header.Style().SetFontWeight("bold") header.Style().SetFontSize("x-large") layout.Add(header) table := gwu.NewTable() layout.Add(table) table.SetCellPadding(5) row := 0 for _, sortedItem := range sorted { if CardRarities[sortedItem.card] != rarity { continue } table.Add(gwu.NewImage("", fmt.Sprintf("images/%s.png", CardResources[sortedItem.card])), row, 0) table.Add(gwu.NewLabel(string(sortedItem.card)), row, 1) table.Add(gwu.NewLabel(fmt.Sprintf("%d", sortedItem.buy)), row, 2) table.Add(gwu.NewLabel(fmt.Sprintf("%d", sortedItem.sell)), row, 3) if row%2 == 0 { table.RowFmt(row).Style().SetBackground("rgba(255,255,255,0.75)") } else { table.RowFmt(row).Style().SetBackground("rgba(150,150,150,0.75)") } row++ } } }
func buildButtonDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() l := gwu.NewLabel("") btnp := gwu.NewHorizontalPanel() b := gwu.NewButton("Normal Button") b.AddEHandlerFunc(func(e gwu.Event) { switch e.Type() { case gwu.ETYPE_MOUSE_OVER: l.SetText("Mouse is over...") case gwu.ETYPE_MOUSE_OUT: l.SetText("Mouse is out.") case gwu.ETYPE_CLICK: x, y := e.Mouse() l.SetText(fmt.Sprintf("Clicked at x=%d, y=%d", x, y)) } e.MarkDirty(l) }, gwu.ETYPE_CLICK, gwu.ETYPE_MOUSE_OVER, gwu.ETYPE_MOUSE_OUT) btnp.Add(b) b = gwu.NewButton("Disabled Button") b.SetEnabled(false) btnp.Add(b) p.Add(btnp) p.Add(l) return p }
func buildImageDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() p.Add(gwu.NewLabel("Google's logo:")) img := gwu.NewImage("Google's logo", "https://www.google.com/images/srpr/logo3w.png") img.Style().SetSizePx(275, 95) p.Add(img) p.AddVSpace(20) p.Add(gwu.NewLabel("Go's Gopher:")) img = gwu.NewImage("Go's Gopher", "http://golang.org/doc/gopher/frontpage.png") img.Style().SetSizePx(250, 340) p.Add(img) return p }
func buildPasswBoxDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() p.Add(gwu.NewLabel("Enter your password:"******"")) return p }
func createFAQ() gwu.Panel { panel := gwu.NewPanel() panel.Style().SetBackground("rgba(255,255,255,0.75)") addHeader := func(text string) { label := gwu.NewLabel(text) label.Style().SetColor("rgb(0,0,0)") label.Style().SetFontWeight("bold") label.Style().SetFontSize("large") panel.Add(label) } addText := func(text string) { label := gwu.NewLabel(text) label.Style().SetColor("rgb(0,0,0)") panel.Add(label) } addHeader("What is this?") addText("This site displays the prices for which the ClockworkAgent, a trading bot for the game Scrolls, will buy and sell cards for.") addHeader("How do I engage in trading with the bot?") addText("Just join the ingame channel 'clockwork' and say '!trade'. You will then be queued up for interaction with the bot in a trade.") addHeader("Why are these prices so different from Scrollsguide prices?") addText("Scrollsguide prices are determined from WTB and WTS messages in the Trading-channel. Thus they reflect what people expect to " + "pay/get for a card, not necessarily what the card is actually traded for. Since most people adjust their expectations to what " + "the current Scrollsguide price is, this can lead to a self-fulfilling prophecy. Also, it is pretty easy to manipulate the prices " + "for cards that are traded less often, enabling a way to scam the bot if it would use these prices.") addHeader("How then are these prices calculated?") addText("The price starts at 1500 for rares, 750 for uncommons and 187 for commons. Each time a card is sold to the bot, it will assume " + "that the card is less valuable, reducing the price by 100 / 50 / 12.5 depending on rarity. Each time a card is bought from the bot, " + "the price will go up again.") addHeader("Why does the buy price fluctuate, when the sell price remains constant?") addText("If the bot has less than 2000 gold, the buy prices will be lowered down to a minimum of 50%. This way the bot can aquire more cards, " + "balancing out the fact that it had to overpay for most cards in order to determine the price, as well as new additions and general price deflation.") addHeader("Who created the bot, and where can I find the source code?") addText("Ingame: redefiance") addText("Reddit: lando-garner") panel.Add(gwu.NewLink("Source", "https://github.com/redefiance/ScrollsTradeBot")) return panel }
func buildLinkContainerDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() link := gwu.NewLink("An obvious link, to Google Home", "https://google.com/") inside := gwu.NewPanel() inside.Style().SetBorder2(1, gwu.BRD_STYLE_SOLID, gwu.CLR_GRAY) inside.Add(gwu.NewLabel("Everything inside this box also links to Google!")) inside.Add(gwu.NewButton("Me too!")) link.SetComp(inside) p.Add(link) return p }
func buildLinkDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() p.SetCellPadding(3) p.Add(gwu.NewLink("Visit Gowut Home page", "https://sites.google.com/site/gowebuitoolkit/")) p.Add(gwu.NewLink("Visit Gowut Project page", "http://code.google.com/p/gowut/")) row := gwu.NewHorizontalPanel() row.SetCellPadding(3) row.Add(gwu.NewLabel("Discussion forum:")) row.Add(gwu.NewLink("https://groups.google.com/d/forum/gowebuitoolkit", "https://groups.google.com/d/forum/gowebuitoolkit")) p.Add(row) row = gwu.NewHorizontalPanel() row.SetCellPadding(3) row.Add(gwu.NewLabel("Send e-mail to the Gowut author:")) email := "iczaaa" + "@" + "gmail.com" row.Add(gwu.NewLink("András Belicza <"+email+">", "mailto:"+email)) p.Add(row) return p }
func buildTextBoxDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() p.Add(gwu.NewLabel("Enter your name (max 15 characters):")) row := gwu.NewHorizontalPanel() tb := gwu.NewTextBox("") tb.SetMaxLength(15) tb.AddSyncOnETypes(gwu.ETYPE_KEY_UP) length := gwu.NewLabel("") length.Style().SetFontSize("80%").SetFontStyle(gwu.FONT_STYLE_ITALIC) tb.AddEHandlerFunc(func(e gwu.Event) { rem := 15 - len(tb.Text()) length.SetText(fmt.Sprintf("(%d character%s left...)", rem, plural(rem))) e.MarkDirty(length) }, gwu.ETYPE_CHANGE, gwu.ETYPE_KEY_UP) row.Add(tb) row.Add(length) p.Add(row) p.AddVSpace(10) p.Add(gwu.NewLabel("Short biography:")) bio := gwu.NewTextBox("") bio.SetRows(5) bio.SetCols(40) p.Add(bio) p.AddVSpace(10) rtb := gwu.NewTextBox("This is just a read-only text box...") rtb.SetReadOnly(true) p.Add(rtb) p.AddVSpace(10) dtb := gwu.NewTextBox("...and a disabled one.") dtb.SetEnabled(false) p.Add(dtb) return p }
func buildListBoxDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() row := gwu.NewHorizontalPanel() l := gwu.NewLabel("Select a background color:") row.Add(l) lb := gwu.NewListBox([]string{"", "Black", "Red", "Green", "Blue", "White"}) lb.AddEHandlerFunc(func(e gwu.Event) { l.Style().SetBackground(lb.SelectedValue()) e.MarkDirty(l) }, gwu.ETYPE_CHANGE) row.Add(lb) p.Add(row) p.AddVSpace(10) p.Add(gwu.NewLabel("Select numbers that add up to 89:")) sumLabel := gwu.NewLabel("") lb2 := gwu.NewListBox([]string{"1", "2", "4", "8", "16", "32", "64", "128"}) lb2.SetMulti(true) lb2.SetRows(10) lb2.AddEHandlerFunc(func(e gwu.Event) { sum := 0 for _, idx := range lb2.SelectedIndices() { sum += 1 << uint(idx) } if sum == 89 { sumLabel.SetText("Hooray! You did it!") } else { sumLabel.SetText(fmt.Sprintf("Now quite there... (sum = %d)", sum)) } e.MarkDirty(sumLabel) }, gwu.ETYPE_CHANGE) p.Add(lb2) p.Add(sumLabel) return p }
func buildTableDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() l := gwu.NewLabel("Tip: Switch to the 'debug' theme (top right) to see cell borders.") l.Style().SetColor(gwu.CLR_RED).SetFontStyle(gwu.FONT_STYLE_ITALIC) p.Add(l) p.AddVSpace(20) p.Add(gwu.NewLabel("A simple form aligned with a table:")) p.AddVSpace(10) t := gwu.NewTable() t.SetCellPadding(2) t.EnsureSize(2, 2) var c gwu.Comp t.Add(gwu.NewLabel("User name:"), 0, 0) c = gwu.NewTextBox("") c.Style().SetWidthPx(160) t.Add(c, 0, 1) t.Add(gwu.NewLabel("Password:"******"") c.Style().SetWidthPx(160) t.Add(c, 1, 1) t.Add(gwu.NewLabel("Go to:"), 2, 0) c = gwu.NewListBox([]string{"Inbox", "User preferences", "Last visited page"}) c.Style().SetWidthPx(160) t.Add(c, 2, 1) p.Add(t) p.AddVSpace(30) p.Add(gwu.NewLabel("Advanced table structure with modified alignment, row and col spans:")) p.AddVSpace(10) t = gwu.NewTable() t.Style().SetBorder2(1, gwu.BRD_STYLE_SOLID, gwu.CLR_GREY) t.SetAlign(gwu.HA_RIGHT, gwu.VA_TOP) t.EnsureSize(5, 5) for row := 0; row < 5; row++ { for col := 0; col < 5; col++ { t.Add(gwu.NewButton("Button "+strconv.Itoa(row)+strconv.Itoa(col)), row, col) } } t.SetColSpan(2, 1, 2) t.SetRowSpan(3, 1, 2) t.CellFmt(2, 2).Style().SetSizePx(150, 80) t.CellFmt(2, 2).SetAlign(gwu.HA_RIGHT, gwu.VA_BOTTOM) t.RowFmt(2).SetAlign(gwu.HA_DEFAULT, gwu.VA_MIDDLE) t.CompAt(2, 1).Style().SetFullSize() t.CompAt(4, 2).Style().SetFullWidth() t.RowFmt(0).Style().SetBackground(gwu.CLR_RED) t.RowFmt(1).Style().SetBackground(gwu.CLR_GREEN) t.RowFmt(2).Style().SetBackground(gwu.CLR_BLUE) t.RowFmt(3).Style().SetBackground(gwu.CLR_GREY) t.RowFmt(4).Style().SetBackground(gwu.CLR_TEAL) p.Add(t) return p }
func buildExpanderDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() l := gwu.NewLabel("Click on the Expander's header.") l.Style().SetColor(gwu.CLR_GREEN) p.Add(l) p.AddVSpace(5) e := gwu.NewExpander() e.SetHeader(gwu.NewLabel("I'm an Expander.")) e.SetContent(gwu.NewLabel("I'm the content of the Expander.")) p.Add(e) e.AddEHandlerFunc(func(ev gwu.Event) { if e.Expanded() { l.SetText("You expanded it.") } else { l.SetText("You collapsed it.") } ev.MarkDirty(l) }, gwu.ETYPE_STATE_CHANGE) p.AddVSpace(20) var ee gwu.Expander for i := 4; i >= 0; i-- { e2 := gwu.NewExpander() e2.SetHeader(gwu.NewLabel("I hide embedded expanders. #" + strconv.Itoa(i))) if i == 4 { e2.SetContent(gwu.NewLabel("No more.")) } else { e2.SetContent(ee) } ee = e2 } p.Add(ee) return p }
func buildHtmlDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() html := "<span onclick=\"alert('Hi from Html!');\">Hi! I'm inserted as HTML. Click on me!</span>" p.Add(gwu.NewLabel("The following HTML code is inserted after the text box as an Html component:")) ta := gwu.NewTextBox(html) ta.SetReadOnly(true) ta.Style().SetWidthPx(500) ta.SetRows(4) p.Add(ta) p.AddVSpace(20) h := gwu.NewHtml(html) p.Add(h) return p }
func buildShowcaseWin(sess gwu.Session) { win := gwu.NewWindow("show", "Showcase of Features - Gowut") win.Style().SetFullSize() win.AddEHandlerFunc(func(e gwu.Event) { switch e.Type() { case gwu.ETYPE_WIN_LOAD: fmt.Println("LOADING window:", e.Src().Id()) case gwu.ETYPE_WIN_UNLOAD: fmt.Println("UNLOADING window:", e.Src().Id()) } }, gwu.ETYPE_WIN_LOAD, gwu.ETYPE_WIN_UNLOAD) hiddenPan := gwu.NewNaturalPanel() sess.SetAttr("hiddenPan", hiddenPan) header := gwu.NewHorizontalPanel() header.Style().SetFullWidth().SetBorderBottom2(2, gwu.BRD_STYLE_SOLID, "#777777") l := gwu.NewLabel("Gowut - Showcase of Features") l.Style().SetFontWeight(gwu.FONT_WEIGHT_BOLD).SetFontSize("120%") header.Add(l) header.AddHConsumer() header.Add(gwu.NewLabel("Theme:")) themes := gwu.NewListBox([]string{"default", "debug"}) themes.AddEHandlerFunc(func(e gwu.Event) { win.SetTheme(themes.SelectedValue()) e.ReloadWin("show") }, gwu.ETYPE_CHANGE) header.Add(themes) header.AddHSpace(10) reset := gwu.NewLink("Reset", "#") reset.SetTarget("") reset.AddEHandlerFunc(func(e gwu.Event) { e.RemoveSess() e.ReloadWin("show") }, gwu.ETYPE_CLICK) header.Add(reset) setNoWrap(header) win.Add(header) content := gwu.NewHorizontalPanel() content.SetCellPadding(1) content.SetVAlign(gwu.VA_TOP) content.Style().SetFullSize() demoWrapper := gwu.NewPanel() demoWrapper.Style().SetPaddingLeftPx(5) demoWrapper.AddVSpace(10) demoTitle := gwu.NewLabel("") demoTitle.Style().SetFontWeight(gwu.FONT_WEIGHT_BOLD).SetFontSize("110%") demoWrapper.Add(demoTitle) demoWrapper.AddVSpace(10) links := gwu.NewPanel() links.SetCellPadding(1) links.Style().SetPaddingRightPx(5) demos := make(map[string]pdemo) var selDemo pdemo selectDemo := func(d pdemo, e gwu.Event) { if selDemo != nil { selDemo.link.Style().SetBackground("") if e != nil { e.MarkDirty(selDemo.link) } demoWrapper.Remove(selDemo.comp) } selDemo = d d.link.Style().SetBackground("#88ff88") demoTitle.SetText(d.link.Text()) if d.comp == nil { d.comp = d.buildFunc(e) } demoWrapper.Add(d.comp) if e != nil { e.MarkDirty(d.link, demoWrapper) } } createDemo := func(name string, buildFunc func(gwu.Event) gwu.Comp) pdemo { link := gwu.NewLabel(name) link.Style().SetFullWidth().SetCursor(gwu.CURSOR_POINTER).SetDisplay(gwu.DISPLAY_BLOCK).SetColor(gwu.CLR_BLUE) demo := &demo{link: link, buildFunc: buildFunc} link.AddEHandlerFunc(func(e gwu.Event) { selectDemo(demo, e) }, gwu.ETYPE_CLICK) links.Add(link) demos[name] = demo return demo } links.Style().SetFullHeight().SetBorderRight2(2, gwu.BRD_STYLE_SOLID, "#777777") links.AddVSpace(5) homeDemo := createDemo("Home", buildHomeDemo) selectDemo(homeDemo, nil) links.AddVSpace(5) l = gwu.NewLabel("Component Palette") l.Style().SetFontWeight(gwu.FONT_WEIGHT_BOLD).SetFontSize("110%") links.Add(l) links.AddVSpace(5) l = gwu.NewLabel("Containers") l.Style().SetFontWeight(gwu.FONT_WEIGHT_BOLD) links.Add(l) createDemo("Expander", buildExpanderDemo) createDemo("Link (as Container)", buildLinkContainerDemo) createDemo("Panel", buildPanelDemo) createDemo("Table", buildTableDemo) createDemo("TabPanel", buildTabPanelDemo) createDemo("Window", buildWindowDemo) links.AddVSpace(5) l = gwu.NewLabel("Input components") l.Style().SetFontWeight(gwu.FONT_WEIGHT_BOLD).SetDisplay(gwu.DISPLAY_BLOCK) links.Add(l) createDemo("CheckBox", buildCheckBoxDemo) createDemo("ListBox", buildListBoxDemo) createDemo("TextBox", buildTextBoxDemo) createDemo("PasswBox", buildPasswBoxDemo) createDemo("RadioButton", buildRadioButtonDemo) createDemo("SwitchButton", buildSwitchButtonDemo) links.AddVSpace(5) l = gwu.NewLabel("Other components") l.Style().SetFontWeight(gwu.FONT_WEIGHT_BOLD) links.Add(l) createDemo("Button", buildButtonDemo) createDemo("Html", buildHtmlDemo) createDemo("Image", buildImageDemo) createDemo("Label", buildLabelDemo) createDemo("Link", buildLinkDemo) createDemo("Timer", buildTimerDemo) links.AddVConsumer() setNoWrap(links) content.Add(links) content.Add(demoWrapper) content.CellFmt(demoWrapper).Style().SetFullWidth() win.Add(content) win.CellFmt(content).Style().SetFullSize() footer := gwu.NewHorizontalPanel() footer.Style().SetFullWidth().SetBorderTop2(2, gwu.BRD_STYLE_SOLID, "#777777") footer.Add(hiddenPan) footer.AddHConsumer() l = gwu.NewLabel("Copyright © 2013 András Belicza. All rights reserved.") l.Style().SetFontStyle(gwu.FONT_STYLE_ITALIC).SetFontSize("95%") footer.Add(l) footer.AddHSpace(10) link := gwu.NewLink("Visit Gowut Home page", "https://sites.google.com/site/gowebuitoolkit/") link.Style().SetFontStyle(gwu.FONT_STYLE_ITALIC).SetFontSize("95%") footer.Add(link) setNoWrap(footer) win.Add(footer) sess.AddWin(win) }
func buildTimerDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() p.SetCellPadding(3) // Add timers to a panel which is always attached instead of our panel // because the user can switch to another component demo causing this panel to be removed // and that way timer events would address components that are not part of the window (returning error). hiddenPan := event.Session().Attr("hiddenPan").(gwu.Panel) p.Add(gwu.NewLabel("A Timer is used to detonate a bomb after 3 seconds.")) p.AddVSpace(10) defText := "You can defuse the bomb with the button below. Tick... Tack..." l := gwu.NewLabel(defText) p.Add(l) t := gwu.NewTimer(3 * time.Second) b := gwu.NewButton("Defuse!") t.AddEHandlerFunc(func(e gwu.Event) { l.SetText("BOOOOM! You were too slow!") l.Style().SetColor(gwu.CLR_RED) b.SetEnabled(false) e.MarkDirty(l, b) }, gwu.ETYPE_STATE_CHANGE) hiddenPan.Add(t) row := gwu.NewHorizontalPanel() b.AddEHandlerFunc(func(e gwu.Event) { t.SetActive(false) l.SetText("Bomb defused! Phew! Good Job!") l.Style().SetColor(gwu.CLR_GREEN) b.SetEnabled(false) e.MarkDirty(t, l, b) }, gwu.ETYPE_CLICK) row.Add(b) b2 := gwu.NewButton("Plant a new Bomb!") b2.AddEHandlerFunc(func(e gwu.Event) { t.SetActive(true) t.Reset() l.SetText(defText) l.Style().SetColor("") b.SetEnabled(true) e.MarkDirty(t, l, b) }, gwu.ETYPE_CLICK) row.Add(b2) p.Add(row) p.AddVSpace(20) p.Add(gwu.NewLabel("A Timer is used to refresh the time below repeatedly in every second for half a minute.")) tl := gwu.NewLabel("") p.Add(tl) t2 := gwu.NewTimer(time.Second) t2.SetRepeat(true) counter := 30 t2.AddEHandlerFunc(func(e gwu.Event) { counter-- tl.SetText(fmt.Sprintf("%s (%d remaining)", time.Now().Format("2006-01-02 15:04:05"), counter)) e.MarkDirty(tl) if counter <= 0 { t2.SetActive(false) e.MarkDirty(t2) } }, gwu.ETYPE_STATE_CHANGE) hiddenPan.Add(t2) b3 := gwu.NewButton("Restart") b3.AddEHandlerFunc(func(e gwu.Event) { counter = 30 t2.SetActive(true) e.MarkDirty(t2) }, gwu.ETYPE_CLICK) p.Add(b3) event.MarkDirty(hiddenPan) return p }
func buildLoginWin(s gwu.Session) { win := gwu.NewWindow("login", "Login Window") win.Style().SetFullSize() win.SetAlign(gwu.HA_CENTER, gwu.VA_MIDDLE) p := gwu.NewPanel() p.SetHAlign(gwu.HA_CENTER) p.SetCellPadding(2) l := gwu.NewLabel("Test GUI Login Window") l.Style().SetFontWeight(gwu.FONT_WEIGHT_BOLD).SetFontSize("150%") p.Add(l) l = gwu.NewLabel("Login") l.Style().SetFontWeight(gwu.FONT_WEIGHT_BOLD).SetFontSize("130%") p.Add(l) p.CellFmt(l).Style().SetBorder2(1, gwu.BRD_STYLE_DASHED, gwu.CLR_NAVY) l = gwu.NewLabel("user/pass: admin/a") l.Style().SetFontSize("80%").SetFontStyle(gwu.FONT_STYLE_ITALIC) p.Add(l) errL := gwu.NewLabel("") errL.Style().SetColor(gwu.CLR_RED) p.Add(errL) table := gwu.NewTable() table.SetCellPadding(2) table.EnsureSize(2, 2) table.Add(gwu.NewLabel("User name:"), 0, 0) tb := gwu.NewTextBox("") tb.Style().SetWidthPx(160) table.Add(tb, 0, 1) table.Add(gwu.NewLabel("Password:"******"") pb.Style().SetWidthPx(160) table.Add(pb, 1, 1) p.Add(table) b := gwu.NewButton("OK") b.AddEHandlerFunc(func(e gwu.Event) { if tb.Text() == "admin" && pb.Text() == "a" { e.Session().RemoveWin(win) // Login win is removed, password will not be retrievable from the browser buildPrivateWins(e.Session()) e.ReloadWin("main") } else { e.SetFocusedComp(tb) errL.SetText("Invalid user name or password!") e.MarkDirty(errL) } }, gwu.ETYPE_CLICK) p.Add(b) l = gwu.NewLabel("") p.Add(l) p.CellFmt(l).Style().SetHeightPx(200) win.Add(p) win.SetFocusedCompId(tb.Id()) p = gwu.NewPanel() p.SetLayout(gwu.LAYOUT_HORIZONTAL) p.SetCellPadding(2) p.Add(gwu.NewLabel("Here's an ON/OFF switch which enables/disables the other one:")) sw := gwu.NewSwitchButton() sw.SetOnOff("ENB", "DISB") sw.SetState(true) p.Add(sw) p.Add(gwu.NewLabel("And the other one:")) sw2 := gwu.NewSwitchButton() sw2.SetEnabled(true) sw2.Style().SetWidthPx(100) p.Add(sw2) sw.AddEHandlerFunc(func(e gwu.Event) { sw2.SetEnabled(sw.State()) e.MarkDirty(sw2) }, gwu.ETYPE_CLICK) win.Add(p) s.AddWin(win) }
func buildPrivateWins(s gwu.Session) { // Create and build a window win := gwu.NewWindow("main", "Main Window") win.Style().SetFullWidth() win.SetCellPadding(2) p := gwu.NewPanel() p.SetLayout(gwu.LAYOUT_HORIZONTAL) p.SetCellPadding(2) p.Add(gwu.NewLabel("I'm a label! Try clicking on the button=>")) p.Add(gwu.NewLink("Google Home", "https://google.com")) img := gwu.NewImage("", "https://www.google.com/images/srpr/logo3w.png") img.Style().SetSize("25%", "25%") p.Add(img) win.Add(p) button := gwu.NewButton("Click me") button.AddEHandler(&MyButtonHandler{text: ":-)"}, gwu.ETYPE_CLICK) win.Add(button) extraBtns := gwu.NewPanel() extraBtns.SetLayout(gwu.LAYOUT_NATURAL) button.AddEHandlerFunc(func(e gwu.Event) { extraBtn := gwu.NewButton("Extra #" + strconv.Itoa(extraBtns.CompsCount())) extraBtn.AddEHandlerFunc(func(e gwu.Event) { extraBtn.Parent().Remove(extraBtn) e.MarkDirty(extraBtns) }, gwu.ETYPE_CLICK) extraBtns.Insert(extraBtn, 0) e.MarkDirty(extraBtns) }, gwu.ETYPE_CLICK) win.Add(extraBtns) p = gwu.NewPanel() p.SetLayout(gwu.LAYOUT_HORIZONTAL) p.SetCellPadding(2) p.Style().SetBorder2(1, gwu.BRD_STYLE_SOLID, gwu.CLR_BLACK) p.Add(gwu.NewLabel("A drop-down list being")) wideListBox := gwu.NewListBox([]string{"50", "100", "150", "200", "250"}) wideListBox.Style().SetWidth("50") wideListBox.AddEHandlerFunc(func(e gwu.Event) { wideListBox.Style().SetWidth(wideListBox.SelectedValue() + "px") e.MarkDirty(wideListBox) }, gwu.ETYPE_CHANGE) p.Add(wideListBox) p.Add(gwu.NewLabel("pixel wide. And a multi-select list:")) listBox := gwu.NewListBox([]string{"First", "Second", "Third", "Forth", "Fifth", "Sixth"}) listBox.SetMulti(true) listBox.SetRows(4) p.Add(listBox) countLabel := gwu.NewLabel("Selected count: 0") listBox.AddEHandlerFunc(func(e gwu.Event) { selCount := len(listBox.SelectedIndices()) countLabel.SetText("Selected count: " + strconv.Itoa(selCount)) e.MarkDirty(countLabel) }, gwu.ETYPE_CHANGE) p.Add(countLabel) win.Add(p) greenCheckBox := gwu.NewCheckBox("I'm a check box. When checked, I'm green!") greenCheckBox.AddEHandlerFunc(func(e gwu.Event) { if greenCheckBox.State() { greenCheckBox.Style().SetBackground(gwu.CLR_GREEN) } else { greenCheckBox.Style().SetBackground("") } e.MarkDirty(greenCheckBox) }, gwu.ETYPE_CLICK) greenCheckBox.AddEHandler(greenHandler, gwu.ETYPE_CLICK) win.Add(greenCheckBox) table := gwu.NewTable() table.SetCellPadding(2) table.Style().SetBorder2(1, gwu.BRD_STYLE_SOLID, gwu.CLR_BLACK) table.EnsureSize(2, 4) table.Add(gwu.NewLabel("TAB-"), 0, 0) table.Add(gwu.NewLabel("LE"), 0, 1) table.Add(gwu.NewLabel("DE-"), 0, 2) table.Add(gwu.NewLabel("MO"), 0, 3) table.Add(gwu.NewLabel("Enter your name:"), 1, 0) tb := gwu.NewTextBox("") tb.AddSyncOnETypes(gwu.ETYPE_KEY_UP) table.Add(tb, 1, 1) table.Add(gwu.NewLabel("You entered:"), 1, 2) nameLabel := gwu.NewLabel("") nameLabel.Style().SetColor(gwu.CLR_RED) tb.AddEHandlerFunc(func(e gwu.Event) { nameLabel.SetText(tb.Text()) e.MarkDirty(nameLabel) }, gwu.ETYPE_CHANGE, gwu.ETYPE_KEY_UP) table.Add(nameLabel, 1, 3) win.Add(table) table = gwu.NewTable() table.Style().SetBorder2(1, gwu.BRD_STYLE_SOLID, gwu.CLR_BLACK) table.SetAlign(gwu.HA_RIGHT, gwu.VA_TOP) table.EnsureSize(5, 5) for row := 0; row < 5; row++ { group := gwu.NewRadioGroup(strconv.Itoa(row)) for col := 0; col < 5; col++ { radio := gwu.NewRadioButton("= "+strconv.Itoa(col)+" =", group) radio.AddEHandlerFunc(func(e gwu.Event) { radios := []gwu.RadioButton{radio, radio.Group().PrevSelected()} for _, radio := range radios { if radio != nil { if radio.State() { radio.Style().SetBackground(gwu.CLR_GREEN) } else { radio.Style().SetBackground("") } e.MarkDirty(radio) } } }, gwu.ETYPE_CLICK) table.Add(radio, row, col) } } table.SetColSpan(2, 1, 2) table.SetRowSpan(3, 1, 2) table.CellFmt(2, 2).Style().SetSizePx(150, 80) table.CellFmt(2, 2).SetAlign(gwu.HA_RIGHT, gwu.VA_BOTTOM) table.RowFmt(2).Style().SetBackground("#808080") table.RowFmt(2).SetAlign(gwu.HA_DEFAULT, gwu.VA_MIDDLE) table.RowFmt(3).Style().SetBackground("#d0d0d0") table.RowFmt(4).Style().SetBackground("#b0b0b0") win.Add(table) tabPanel := gwu.NewTabPanel() tabPanel.SetTabBarPlacement(gwu.TB_PLACEMENT_TOP) for i := 0; i < 6; i++ { if i == 3 { img := gwu.NewImage("", "https://www.google.com/images/srpr/logo3w.png") img.Style().SetWidthPx(100) tabPanel.Add(img, gwu.NewLabel("This is some long content, random="+strconv.Itoa(rand.Int()))) continue } tabPanel.AddString(strconv.Itoa(i)+". tab", gwu.NewLabel("This is some long content, random="+strconv.Itoa(rand.Int()))) } win.Add(tabPanel) tabPanel = gwu.NewTabPanel() tabPanel.SetTabBarPlacement(gwu.TB_PLACEMENT_LEFT) tabPanel.TabBarFmt().SetVAlign(gwu.VA_BOTTOM) for i := 7; i < 11; i++ { l := gwu.NewLabel("This is some long content, random=" + strconv.Itoa(rand.Int())) if i == 9 { img := gwu.NewImage("", "https://www.google.com/images/srpr/logo3w.png") img.Style().SetWidthPx(100) tabPanel.Add(img, l) tabPanel.CellFmt(l).Style().SetSizePx(400, 400) continue } tabPanel.AddString(strconv.Itoa(i)+". tab", l) tabPanel.CellFmt(l).Style().SetSizePx(400, 400) } win.Add(tabPanel) s.AddWin(win) win2 := gwu.NewWindow("main2", "Main2 Window") win2.Add(gwu.NewLabel("This is just a test 2nd window.")) back := gwu.NewButton("Back") back.AddEHandlerFunc(func(e gwu.Event) { e.ReloadWin(win.Name()) }, gwu.ETYPE_CLICK) win2.Add(back) s.AddWin(win2) }
func main() { // Create and build a window win := gwu.NewWindow("main", "Test GUI Window") win.Style().SetFullWidth() win.SetHAlign(gwu.HA_CENTER) win.SetCellPadding(2) // Button which changes window content win.Add(gwu.NewLabel("I'm a label! Try clicking on the button=>")) btn := gwu.NewButton("Click me") btn.AddEHandler(&MyButtonHandler{text: ":-)"}, gwu.ETYPE_CLICK) win.Add(btn) btnsPanel := gwu.NewNaturalPanel() btn.AddEHandlerFunc(func(e gwu.Event) { // Create and add a new button... newbtn := gwu.NewButton("Extra #" + strconv.Itoa(btnsPanel.CompsCount())) newbtn.AddEHandlerFunc(func(e gwu.Event) { btnsPanel.Remove(newbtn) // ...which removes itself when clicked e.MarkDirty(btnsPanel) }, gwu.ETYPE_CLICK) btnsPanel.Insert(newbtn, 0) e.MarkDirty(btnsPanel) }, gwu.ETYPE_CLICK) win.Add(btnsPanel) // ListBox examples p := gwu.NewHorizontalPanel() p.Style().SetBorder2(1, gwu.BRD_STYLE_SOLID, gwu.CLR_BLACK) p.SetCellPadding(2) p.Add(gwu.NewLabel("A drop-down list being")) widelb := gwu.NewListBox([]string{"50", "100", "150", "200", "250"}) widelb.Style().SetWidth("50") widelb.AddEHandlerFunc(func(e gwu.Event) { widelb.Style().SetWidth(widelb.SelectedValue() + "px") e.MarkDirty(widelb) }, gwu.ETYPE_CHANGE) p.Add(widelb) p.Add(gwu.NewLabel("pixel wide. And a multi-select list:")) listBox := gwu.NewListBox([]string{"First", "Second", "Third", "Forth", "Fifth", "Sixth"}) listBox.SetMulti(true) listBox.SetRows(4) p.Add(listBox) countLabel := gwu.NewLabel("Selected count: 0") listBox.AddEHandlerFunc(func(e gwu.Event) { countLabel.SetText("Selected count: " + strconv.Itoa(len(listBox.SelectedIndices()))) e.MarkDirty(countLabel) }, gwu.ETYPE_CHANGE) p.Add(countLabel) win.Add(p) // Self-color changer check box greencb := gwu.NewCheckBox("I'm a check box. When checked, I'm green!") greencb.AddEHandlerFunc(func(e gwu.Event) { if greencb.State() { greencb.Style().SetBackground(gwu.CLR_GREEN) } else { greencb.Style().SetBackground("") } e.MarkDirty(greencb) }, gwu.ETYPE_CLICK) win.Add(greencb) // TextBox with echo p = gwu.NewHorizontalPanel() p.Add(gwu.NewLabel("Enter your name:")) tb := gwu.NewTextBox("") tb.AddSyncOnETypes(gwu.ETYPE_KEY_UP) p.Add(tb) p.Add(gwu.NewLabel("You entered:")) nameLabel := gwu.NewLabel("") nameLabel.Style().SetColor(gwu.CLR_RED) tb.AddEHandlerFunc(func(e gwu.Event) { nameLabel.SetText(tb.Text()) e.MarkDirty(nameLabel) }, gwu.ETYPE_CHANGE, gwu.ETYPE_KEY_UP) p.Add(nameLabel) win.Add(p) // Create and start a GUI server (omitting error check) server := gwu.NewServer("guitest", "localhost:8081") server.SetText("Test GUI App") server.AddWin(win) server.Start("") // Also opens windows list in browser }
func buildTabPanelDemo(event gwu.Event) gwu.Comp { p := gwu.NewPanel() t := gwu.NewTabPanel() t.Style().SetSizePx(500, 300) table := gwu.NewTable() table.SetCellPadding(2) table.EnsureSize(3, 2) table.Add(gwu.NewLabel("Change tab bar placement:"), 0, 0) table.Add(gwu.NewLabel("Tab bar horizontal align:"), 1, 0) table.Add(gwu.NewLabel("Tab bar vertical align:"), 2, 0) placemslb := gwu.NewListBox([]string{"Top", "Right", "Bottom", "Left"}) placems := []gwu.TabBarPlacement{gwu.TB_PLACEMENT_TOP, gwu.TB_PLACEMENT_RIGHT, gwu.TB_PLACEMENT_BOTTOM, gwu.TB_PLACEMENT_LEFT} halignslb := gwu.NewListBox([]string{"Left", "Center", "Right"}) haligns := []gwu.HAlign{gwu.HA_LEFT, gwu.HA_CENTER, gwu.HA_RIGHT} valignslb := gwu.NewListBox([]string{"Top", "Middle", "Bottom"}) valigns := []gwu.VAlign{gwu.VA_TOP, gwu.VA_MIDDLE, gwu.VA_BOTTOM} placemslb.Style().SetFullWidth() halignslb.Style().SetFullWidth() valignslb.Style().SetFullWidth() table.Add(placemslb, 0, 1) table.Add(halignslb, 1, 1) table.Add(valignslb, 2, 1) placemslb.AddEHandlerFunc(func(e gwu.Event) { t.SetTabBarPlacement(placems[placemslb.SelectedIdx()]) e.MarkDirty(t) }, gwu.ETYPE_CHANGE) halignslb.AddEHandlerFunc(func(e gwu.Event) { t.TabBarFmt().SetHAlign(haligns[halignslb.SelectedIdx()]) e.MarkDirty(t) }, gwu.ETYPE_CHANGE) valignslb.AddEHandlerFunc(func(e gwu.Event) { t.TabBarFmt().SetVAlign(valigns[valignslb.SelectedIdx()]) e.MarkDirty(t) }, gwu.ETYPE_CHANGE) p.Add(table) fix := gwu.NewCheckBox("Fixed size") fix.SetState(true) fix.AddEHandlerFunc(func(e gwu.Event) { if fix.State() { t.Style().SetSizePx(500, 300) } else { t.Style().SetSize("", "") } e.MarkDirty(t) }, gwu.ETYPE_CLICK) p.Add(fix) p.AddVSpace(10) l := gwu.NewLabel("Click on tabs...") l.Style().SetColor(gwu.CLR_GREEN) p.Add(l) t.AddEHandlerFunc(func(e gwu.Event) { l.SetText("Clicked on tab: " + strconv.Itoa(t.Selected())) e.MarkDirty(l) }, gwu.ETYPE_STATE_CHANGE) p.AddVSpace(10) c := gwu.NewPanel() c.Add(gwu.NewLabel("This is a TabPanel.")) c.Add(gwu.NewLabel("Click on other tabs to see their content.")) c.AddVSpace(15) c.Add(gwu.NewLabel("Or click here to see what's in the Hollow:")) b := gwu.NewButton("Take me to the Hollow!") b.AddEHandlerFunc(func(e gwu.Event) { t.SetSelected(3) e.MarkDirty(t) }, gwu.ETYPE_CLICK) c.Add(b) t.AddString("Home", c) c = gwu.NewPanel() c.Add(gwu.NewLabel("You have no new messages.")) t.AddString("Inbox", c) c = gwu.NewPanel() c.Add(gwu.NewLabel("You have no sent messages.")) t.AddString("Sent", c) c = gwu.NewPanel() c.Add(gwu.NewLabel("There is nothing in the hollow.")) t.AddString("Hollow", c) c = gwu.NewPanel() tb := gwu.NewTextBox("Click to edit this comment.") tb.SetRows(10) tb.SetCols(40) c.Add(tb) t.AddString("Comment", c) p.Add(t) return p }