// NewComboBox creates a combo box. // func NewComboBox(key *cftype.Key, withEntry, numbered bool, current string, list []datatype.Field) ( widget *gtk.ComboBox, model *gtk.ListStore, getValue func() interface{}, setValue func(interface{})) { model = newModelSimple() // gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(modele), CAIRO_DOCK_MODEL_NAME, GTK_SORT_ASCENDING) widget = newgtk.ComboBoxWithModel(model) renderer := newgtk.CellRendererText() widget.PackStart(renderer, true) widget.AddAttribute(renderer, "text", RowName) // Fill and set current. iter := fillModelWithFields(key, model, list, current, nil) widget.SetActiveIter(iter) switch { case withEntry: // get and set the entry content string. entry := newgtk.Entry() // Add entry manually so we don't have to recast a GetChild entry.SetText(current) widget.Add(entry) widget.Set("id-column", RowName) widget.Connect("changed", func() { entry.SetText(widget.GetActiveID()) }) getValue = func() interface{} { v, _ := entry.GetText(); return v } setValue = func(uncast interface{}) { entry.SetText(uncast.(string)) } case numbered: // get and set selected as position int getValue = func() interface{} { return widget.GetActive() } setValue = func(uncast interface{}) { widget.SetActive(uncast.(int)) } default: // get and set selected as content string widget.Set("id-column", RowKey) getValue = func() interface{} { return widget.GetActiveID() } setValue = func(uncast interface{}) { newID := datatype.ListFieldsIDByName(list, uncast.(string), key.Log()) widget.SetActive(newID) } } return }
func cycleNextField(fields []datatype.Field, current string, key *cftype.Key) string { newID := datatype.ListFieldsIDByName(fields, current, key.Log()) return fields[cycleNextID(len(fields), newID, 1)].Key }