func main() { var menuitem *gtk.GtkMenuItem gtk.Init(nil) window := gtk.Window(gtk.GTK_WINDOW_TOPLEVEL) window.SetPosition(gtk.GTK_WIN_POS_CENTER) window.SetTitle("GTK Go!") window.Connect("destroy", func(ctx *glib.CallbackContext) { println("got destroy!", ctx.Data().(string)) gtk.MainQuit() }, "foo") //-------------------------------------------------------- // GtkVBox //-------------------------------------------------------- vbox := gtk.VBox(false, 1) //-------------------------------------------------------- // GtkMenuBar //-------------------------------------------------------- menubar := gtk.MenuBar() vbox.PackStart(menubar, false, false, 0) //-------------------------------------------------------- // GtkVPaned //-------------------------------------------------------- vpaned := gtk.VPaned() vbox.Add(vpaned) //-------------------------------------------------------- // GtkFrame //-------------------------------------------------------- frame1 := gtk.Frame("Demo") framebox1 := gtk.VBox(false, 1) frame1.Add(framebox1) frame2 := gtk.Frame("Demo") framebox2 := gtk.VBox(false, 1) frame2.Add(framebox2) vpaned.Pack1(frame1, false, false) vpaned.Pack2(frame2, false, false) //-------------------------------------------------------- // GtkImage //-------------------------------------------------------- dir, _ := path.Split(os.Args[0]) imagefile := path.Join(dir, "../../data/go-gtk-logo.png") label := gtk.Label("Go Binding for GTK") label.ModifyFontEasy("DejaVu Serif 15") framebox1.PackStart(label, false, true, 0) //-------------------------------------------------------- // GtkEntry //-------------------------------------------------------- entry := gtk.Entry() entry.SetText("Hello world") framebox1.Add(entry) image := gtk.ImageFromFile(imagefile) framebox1.Add(image) //-------------------------------------------------------- // GtkScale //-------------------------------------------------------- scale := gtk.HScaleWithRange(0, 100, 1) scale.Connect("value-changed", func() { println("scale:", int(scale.GetValue())) }) framebox2.Add(scale) //-------------------------------------------------------- // GtkHBox //-------------------------------------------------------- buttons := gtk.HBox(false, 1) //-------------------------------------------------------- // GtkButton //-------------------------------------------------------- button := gtk.ButtonWithLabel("Button with label") button.Clicked(func() { println("button clicked:", button.GetLabel()) messagedialog := gtk.MessageDialog( button.GetTopLevelAsWindow(), gtk.GTK_DIALOG_MODAL, gtk.GTK_MESSAGE_INFO, gtk.GTK_BUTTONS_OK, entry.GetText()) messagedialog.Response(func() { println("Dialog OK!") //-------------------------------------------------------- // GtkFileChooserDialog //-------------------------------------------------------- filechooserdialog := gtk.FileChooserDialog( "Choose File...", button.GetTopLevelAsWindow(), gtk.GTK_FILE_CHOOSER_ACTION_OPEN, gtk.GTK_STOCK_OK, int(gtk.GTK_RESPONSE_ACCEPT)) filter := gtk.FileFilter() filter.AddPattern("*.go") filechooserdialog.AddFilter(filter) filechooserdialog.Response(func() { println(filechooserdialog.GetFilename()) filechooserdialog.Destroy() }) filechooserdialog.Run() messagedialog.Destroy() }) messagedialog.Run() }) buttons.Add(button) //-------------------------------------------------------- // GtkFontButton //-------------------------------------------------------- fontbutton := gtk.FontButton() fontbutton.Connect("font-set", func() { println("title:", fontbutton.GetTitle()) println("fontname:", fontbutton.GetFontName()) println("use_size:", fontbutton.GetUseSize()) println("show_size:", fontbutton.GetShowSize()) }) buttons.Add(fontbutton) framebox2.PackStart(buttons, false, false, 0) buttons = gtk.HBox(false, 1) //-------------------------------------------------------- // GtkToggleButton //-------------------------------------------------------- togglebutton := gtk.ToggleButtonWithLabel("ToggleButton with label") togglebutton.Connect("toggled", func() { if togglebutton.GetActive() { togglebutton.SetLabel("ToggleButton ON!") } else { togglebutton.SetLabel("ToggleButton OFF!") } }) buttons.Add(togglebutton) //-------------------------------------------------------- // GtkCheckButton //-------------------------------------------------------- checkbutton := gtk.CheckButtonWithLabel("CheckButton with label") checkbutton.Connect("toggled", func() { if checkbutton.GetActive() { checkbutton.SetLabel("CheckButton CHECKED!") } else { checkbutton.SetLabel("CheckButton UNCHECKED!") } }) buttons.Add(checkbutton) //-------------------------------------------------------- // GtkRadioButton //-------------------------------------------------------- buttonbox := gtk.VBox(false, 1) radiofirst := gtk.RadioButtonWithLabel(nil, "Radio1") buttonbox.Add(radiofirst) buttonbox.Add(gtk.RadioButtonWithLabel(radiofirst.GetGroup(), "Radio2")) buttonbox.Add(gtk.RadioButtonWithLabel(radiofirst.GetGroup(), "Radio3")) buttons.Add(buttonbox) //radiobutton.SetMode(false); radiofirst.SetActive(true) framebox2.PackStart(buttons, false, false, 0) //-------------------------------------------------------- // GtkVSeparator //-------------------------------------------------------- vsep := gtk.VSeparator() framebox2.PackStart(vsep, false, false, 0) //-------------------------------------------------------- // GtkComboBoxEntry //-------------------------------------------------------- combos := gtk.HBox(false, 1) comboboxentry := gtk.ComboBoxEntryNewText() comboboxentry.AppendText("Monkey") comboboxentry.AppendText("Tiger") comboboxentry.AppendText("Elephant") comboboxentry.Connect("changed", func() { println("value:", comboboxentry.GetActiveText()) }) combos.Add(comboboxentry) //-------------------------------------------------------- // GtkComboBox //-------------------------------------------------------- combobox := gtk.ComboBoxNewText() combobox.AppendText("Peach") combobox.AppendText("Banana") combobox.AppendText("Apple") combobox.SetActive(1) combobox.Connect("changed", func() { println("value:", combobox.GetActiveText()) }) combos.Add(combobox) framebox2.PackStart(combos, false, false, 0) //-------------------------------------------------------- // GtkTextView //-------------------------------------------------------- swin := gtk.ScrolledWindow(nil, nil) swin.SetPolicy(gtk.GTK_POLICY_AUTOMATIC, gtk.GTK_POLICY_AUTOMATIC) swin.SetShadowType(gtk.GTK_SHADOW_IN) textview := gtk.TextView() var start, end gtk.GtkTextIter buffer := textview.GetBuffer() buffer.GetStartIter(&start) buffer.Insert(&start, "Hello ") buffer.GetEndIter(&end) buffer.Insert(&end, "World!") tag := buffer.CreateTag("bold", map[string]string{ "background": "#FF0000", "weight": "700"}) buffer.GetStartIter(&start) buffer.GetEndIter(&end) buffer.ApplyTag(tag, &start, &end) swin.Add(textview) framebox2.Add(swin) buffer.Connect("changed", func() { println("changed") }) //-------------------------------------------------------- // GtkMenuItem //-------------------------------------------------------- cascademenu := gtk.MenuItemWithMnemonic("_File") menubar.Append(cascademenu) submenu := gtk.Menu() cascademenu.SetSubmenu(submenu) menuitem = gtk.MenuItemWithMnemonic("E_xit") menuitem.Connect("activate", func() { gtk.MainQuit() }) submenu.Append(menuitem) cascademenu = gtk.MenuItemWithMnemonic("_View") menubar.Append(cascademenu) submenu = gtk.Menu() cascademenu.SetSubmenu(submenu) checkmenuitem := gtk.CheckMenuItemWithMnemonic("_Disable") checkmenuitem.Connect("activate", func() { vpaned.SetSensitive(!checkmenuitem.GetActive()) }) submenu.Append(checkmenuitem) menuitem = gtk.MenuItemWithMnemonic("_Font") menuitem.Connect("activate", func() { fsd := gtk.FontSelectionDialog("Font") fsd.SetFontName(fontbutton.GetFontName()) fsd.Response(func() { println(fsd.GetFontName()) fontbutton.SetFontName(fsd.GetFontName()) fsd.Destroy() }) fsd.SetTransientFor(window) fsd.Run() }) submenu.Append(menuitem) cascademenu = gtk.MenuItemWithMnemonic("_Help") menubar.Append(cascademenu) submenu = gtk.Menu() cascademenu.SetSubmenu(submenu) menuitem = gtk.MenuItemWithMnemonic("_About") menuitem.Connect("activate", func() { dialog := gtk.AboutDialog() dialog.SetName("Go-Gtk Demo!") dialog.SetProgramName("demo") dialog.SetAuthors([]string{ "Yasuhiro Matsumoto <*****@*****.**>", "David Roundy <*****@*****.**>", "Mark Andrew Gerads", "Tobias Kortkamp", "Mikhail Trushnikov", "Federico Sogaro <*****@*****.**>"}) dir, _ := path.Split(os.Args[0]) imagefile := path.Join(dir, "../../data/mattn-logo.png") pixbuf, _ := gdkpixbuf.PixbufFromFile(imagefile) dialog.SetLogo(pixbuf) dialog.SetLicense("The library is available under the same terms and conditions as the Go, the BSD style license, and the LGPL (Lesser GNU Public License). The idea is that if you can use Go (and Gtk) in a project, you should also be able to use go-gtk.") dialog.SetWrapLicense(true) dialog.Run() dialog.Destroy() }) submenu.Append(menuitem) //-------------------------------------------------------- // GtkStatusbar //-------------------------------------------------------- statusbar := gtk.Statusbar() context_id := statusbar.GetContextId("go-gtk") statusbar.Push(context_id, "GTK binding for Go!") framebox2.PackStart(statusbar, false, false, 0) //-------------------------------------------------------- // Event //-------------------------------------------------------- window.Add(vbox) window.SetSizeRequest(600, 600) window.ShowAll() gtk.Main() }
func Gui() { //-------------------------------------------------------- // Setting up the GTK-Foo //-------------------------------------------------------- gdk.ThreadsInit() gtk.Init(&os.Args) window := gtk.Window(gtk.GTK_WINDOW_TOPLEVEL) window.SetTitle("Zwitscher!") window.Connect("destroy", func() { gtk.MainQuit() }) vbox := gtk.VBox(false, 1) notebook := gtk.Notebook() //-------------------------------------------------------- // Home View //-------------------------------------------------------- vboxHome := gtk.VBox(false, 1) scrolledWinHome := gtk.ScrolledWindow(nil, nil) //Disable hscrollbar, enable vscrollbar scrolledWinHome.SetPolicy(gtk.GTK_POLICY_NEVER, gtk.GTK_POLICY_ALWAYS) vboxHome.Add(scrolledWinHome) vboxScrolledWinHome := gtk.VBox(false, 1) scrolledWinHome.AddWithViewPort(vboxScrolledWinHome) tweetwidgets := []*gtk.GtkFrame{} buttonUpdateTimeline := gtk.ButtonWithLabel("Update Timeline") buttonUpdateTimeline.Clicked(func() { var tweet gotter.Tweet tweets, err := gotter.GetTweets(accounts.Credentials, "https://api.twitter.com/1/statuses/home_timeline.json", map[string]string{}) if err != nil { println("failed to get tweets:", err.String()) return } for i := len(tweets) - 1; i >= 0; i-- { tweet = tweets[i] id, _ := strconv.Atoi64(tweet.Identifier) if accounts.Maxreadid < id { if len(tweetwidgets) > 20 { tweetwidgets[0].Destroy() tweetwidgets = tweetwidgets[1:] } tweetwidget := TweetWidget(tweet) vboxScrolledWinHome.PackEnd(tweetwidget, false, false, 0) tweetwidget.ShowAll() tweetwidgets = append(tweetwidgets, tweetwidget) accounts.Maxreadid = id } } }) vboxHome.PackEnd(buttonUpdateTimeline, false, false, 0) notebook.AppendPage(vboxHome, gtk.Label("Home")) //-------------------------------------------------------- // Mentions View //-------------------------------------------------------- scrolledwin := gtk.ScrolledWindow(nil, nil) notebook.AppendPage(scrolledwin, gtk.Label("Mentions")) //-------------------------------------------------------- // Messages View //-------------------------------------------------------- scrolledwin = gtk.ScrolledWindow(nil, nil) notebook.AppendPage(scrolledwin, gtk.Label("Messages")) vbox.Add(notebook) //-------------------------------------------------------- // Fild for Tweets //-------------------------------------------------------- hbox := gtk.HBox(false, 1) dir, _ := filepath.Split(os.Args[0]) imagefile := filepath.Join(dir, "Awesome Smiley Original.jpg") image := gtk.ImageFromFile(imagefile) hbox.PackStart(image, false, false, 0) buttonZwitscher := gtk.ButtonWithLabel("Zwitscher!") newTweetTextField := gtk.Entry() charCounterLabel := gtk.Label("140") buttonZwitscher.SetTooltipMarkup("Tweet") buttonZwitscher.Clicked(func() { charCounterLabel.SetLabel("140") SendTweet(newTweetTextField.GetText()) newTweetTextField.SetText("") }) newTweetTextField.Connect("key-release-event", func() { length := utf8.RuneCountInString(newTweetTextField.GetText()) charCounterLabel.SetLabel((string)(strconv.Itoa(140 - length))) }) newTweetTextField.Connect("activate", func() { if newTweetTextField.GetText() != "" { //pressed enter, and text is not empty charCounterLabel.SetLabel("140") SendTweet(newTweetTextField.GetText()) newTweetTextField.SetText("") } }) hbox.PackStartDefaults(newTweetTextField) hbox.PackStart(charCounterLabel, false, false, 0) hbox.PackEnd(buttonZwitscher, false, false, 0) vbox.PackEnd(hbox, false, false, 0) //-------------------------------------------------------- // Event //-------------------------------------------------------- window.Add(vbox) window.SetSizeRequest(400, 550) window.ShowAll() gdk.ThreadsEnter() gtk.Main() gdk.ThreadsLeave() }