func packWindow(win *gtk.Window, source vdata.Sourcer, build cftype.Grouper) func() { return func() { win.SetDefaultSize(winWidth, winHeight) win.SetTitle(winTitle) win.SetIconFromFile(source.AppIcon()) win.Connect("destroy", gtk.MainQuit) // widgets. box := newgtk.Box(gtk.ORIENTATION_VERTICAL, 0) source.SetBox(box) menu := confmenu.New(source) switcher := pageswitch.New() w := build.BuildAll(switcher) btnAdd := btnaction.New(menu.Save) btnAdd.SetTest() btnHack := newgtk.ButtonWithLabel("Hack") btnHack.Connect("clicked", func() { build.KeyWalk(vdata.TestValues) }) menu.PackStart(switcher, false, false, 0) menu.PackEnd(btnHack, false, false, 0) win.Add(box) box.PackStart(menu, false, false, 0) box.PackStart(w, true, true, 0) win.ShowAll() } }
// CustomButtonLabel creates a custom key with a label button. // func CustomButtonLabel(group, name, label, btnText string, call func(), args ...interface{}) *cftype.Key { return Custom(group, name, label, func(key *cftype.Key) { btn := newgtk.ButtonWithLabel(btnText) btn.Connect("clicked", call, args) key.PackSubWidget(btn) }) }
// Strings adds a string widget. Many options included. // TODO: need password cypher, G_USER_DIRECTORY_PICTURES, play sound. // func Strings(key *cftype.Key) { value := key.Value().String() widget := newgtk.Entry() widget.SetText(value) if key.IsType(cftype.KeyPasswordEntry) { // Hide text and decrypt value. widget.SetVisibility(false) value = key.Source().DecryptString(value) } // Pack the widget before any other (in full size if needed). // So we do it now and fill the callbacks later key.PackKeyWidget(key, nil, nil, widget) var setValue func(interface{}) // Add special buttons to fill the entry box. switch key.Type { case cftype.KeyFileSelector, cftype.KeyFolderSelector, cftype.KeySoundSelector, cftype.KeyImageSelector: // Add a file selector. fileChooser := newgtk.Button() img := newgtk.ImageFromIconName("document-open", gtk.ICON_SIZE_SMALL_TOOLBAR) fileChooser.SetImage(img) fileChooser.Connect("clicked", onFileChooserOpen, fileChooserData{widget, key}) key.PackSubWidget(fileChooser) if key.IsType(cftype.KeySoundSelector) { //Sound Play Button play := newgtk.Button() imgPlay := newgtk.ImageFromIconName("media-playback-start", gtk.ICON_SIZE_SMALL_TOOLBAR) play.SetImage(imgPlay) // play.Connect("clicked", C._cairo_dock_play_a_sound, data) key.PackSubWidget(play) } case cftype.KeyShortkeySelector, cftype.KeyClassSelector: // Add a key/class grabber. grab := newgtk.ButtonWithLabel("Grab") key.PackSubWidget(grab) // gtk_widget_add_events(pMainWindow, GDK_KEY_PRESS_MASK); switch key.Type { case cftype.KeyClassSelector: grab.Connect("clicked", func() { widget.SetSensitive(false) // Block widgets. grab.SetSensitive(false) go func() { class, e := key.Source().GrabWindowClass() // Wait user selection in a routine. glib.IdleAdd(func() { // And resync with the GTK loop to display results. widget.SetSensitive(true) // Reactivate widgets. grab.SetSensitive(true) if !key.Log().Err(e, "ClassSelector", key.Group, key.Name) { setValue(class) // On success. key.Log().Debug("KeyClassSelector window selected", class) } }) }() }) case cftype.KeyShortkeySelector: grab.Connect("clicked", onKeyGrabClicked, &textGrabData{entry: widget, win: key.Source().GetWindow()}) } // for _, sk := range key.Source().ListShortkeys() { // if sk.GetConfFilePath() == key.Storage().FilePath() { // println("found file shortkey") // } // } } // Display a default value when empty. if len(key.AuthorizedValues) > 0 && key.AuthorizedValues[0] != "" { defaultText := key.Translate(key.AuthorizedValues[0]) cbChanged, _ := widget.Connect("changed", onTextDefaultChanged, key) data := textDefaultData{key: key, text: defaultText, cbID: cbChanged} widget.Connect("focus-in-event", onTextDefaultFocusIn, data) widget.Connect("focus-out-event", onTextDefaultFocusOut, data) // TODO: check other use of those fields. // g_object_set_data (G_OBJECT (pEntry), "ignore-value", GINT_TO_POINTER (TRUE)); // g_object_set_data (G_OBJECT (pOneWidget), "default-text", cDefaultText); context, _ := widget.GetStyleContext() context.AddProvider(MainCSS(), gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) setValue = func(uncast interface{}) { // if !key.IsDefault { // not sure why this was here. widget.SetText(uncast.(string)) onTextDefaultFocusOut(widget, nil, data) } setValue(value) // will set IsDefault and button state. } else { setValue = func(uncast interface{}) { widget.SetText(uncast.(string)) } } getValue := func() (text interface{}) { if key.IsDefault { return "" } text, _ = widget.GetText() return text } key.PackKeyWidget(key, getValue, setValue) }
func boxButton(label string, call func()) *gtk.Box { btnCommand := newgtk.ButtonWithLabel(label) btnCommand.Connect("clicked", call) btnCommand.SetRelief(gtk.RELIEF_HALF) return boxWidget(btnCommand) }