// BuildPage builds a Cairo-Dock configuration widget for the given group. // func (build *builder) BuildPage(group string) cftype.GtkWidgetBase { // gconstpointer *data; // gsize length = 0; // gchar **pKeyList; // GtkWidget *pOneWidget; // GSList * pSubWidgetList; // GtkWidget *pSmallVBox; // GtkWidget *pEntry; // GtkWidget *pTable; // GtkWidget *pButtonAdd, *pButtonRemove; // GtkWidget *pButtonDown, *pButtonUp; // GtkWidget *pButtonFileChooser, *pButtonPlay; // GtkWidget *pScrolledWindow; // GtkWidget *pToggleButton=NULL; // GtkCellRenderer *rend; // GtkTreeIter iter; // GtkTreeSelection *selection; // GtkWidget *pBackButton; // GList *pControlWidgets = NULL; // int iFirstSensitiveWidget = 0, iNbSensitiveWidgets = 0; // gchar *cKeyName, *cKeyComment, **pAuthorizedValuesList; // const gchar *cUsefulComment, *cTipString; // CairoDockGroupKeyWidget *pGroupKeyWidget; // int j; // guint k, iNbElements; // char iType; // gboolean bValue, *bValueList; // int iValue, iMinValue, iMaxValue, *iValueList; // double fValue, fMinValue, fMaxValue, *fValueList; // gchar *cValue, **cValueList, *cSmallIcon=NULL; // GtkListStore *modele; // gboolean bAddBackButton; // GtkWidget *pPreviewBox; build.pageBox = newgtk.Box(gtk.ORIENTATION_VERTICAL, cftype.MarginGUI) build.pageBox.SetBorderWidth(cftype.MarginGUI) build.pFrameVBox = nil build.NbControlled = 0 // FRAMES ONLY build.pFrame = nil for _, key := range build.buildKeys[group] { build.buildKey(key) } pageScroll := newgtk.ScrolledWindow(nil, nil) pageScroll.Add(build.pageBox) return pageScroll }
// NewList creates a dock icons management widget. // func NewList(control ListControl, log cdtype.Logger) *List { widget := &List{ ScrolledWindow: *newgtk.ScrolledWindow(nil, nil), list: newgtk.ListBox(), control: control, log: log, index: make(map[*gtk.ListBoxRow]datatype.Iconer), } widget.list.Connect("row-selected", widget.onSelectionChanged) widget.Add(widget.list) return widget }
func notebookPage(nb *gtk.Notebook, label, contentStr string, contentArgs []interface{}) { tabLabel := newgtk.Label(label) box := newgtk.Box(gtk.ORIENTATION_VERTICAL, 0) scroll := newgtk.ScrolledWindow(nil, nil) scroll.Add(box) nb.AppendPage(scroll, tabLabel) content := fmt.Sprintf(contentStr, contentArgs...) contentLabel := newgtk.Label(content) contentLabel.SetUseMarkup(true) box.PackStart(contentLabel, false, false, 15) nb.PopupEnable() }
// TreeView adds a treeview widget. // func TreeView(key *cftype.Key) { values := key.Value().ListString() // Build treeview. model := newgtk.ListStore( glib.TYPE_STRING, /* RowKey*/ glib.TYPE_STRING, /* RowName*/ glib.TYPE_STRING, /* RowIcon*/ glib.TYPE_STRING, /* RowDesc*/ glib.TYPE_BOOLEAN, // active glib.TYPE_INT) // order widget := newgtk.TreeViewWithModel(model) widget.Set("headers-visible", false) getValue := func() interface{} { // Grab data from all iters. var list []string iter, ok := model.GetIterFirst() for ; ok; ok = model.IterNext(iter) { str, e := gunvalue.New(model.GetValue(iter, RowName)).String() if !key.Log().Err(e, "WidgetTreeView GetValue "+key.Name) { list = append(list, str) } } return list } // Add control buttons. if key.IsType(cftype.KeyTreeViewMultiChoice) { renderer := newgtk.CellRendererToggle() col := newgtk.TreeViewColumnWithAttribute("", renderer, "active", 4) widget.AppendColumn(col) // g_signal_connect (G_OBJECT (rend), "toggled", (GCallback) _cairo_dock_activate_one_element, modele); renderer.Set("active", 4) } renderer := newgtk.CellRendererText() col := newgtk.TreeViewColumnWithAttribute("", renderer, "text", RowName) widget.AppendColumn(col) // cValueList = g_key_file_get_string_list (pKeyFile, cGroupName, cKeyName, &length, NULL); model.SetSortColumnId(5, gtk.SORT_ASCENDING) scroll := newgtk.ScrolledWindow(nil, nil) // // if len(key.AuthorizedValues) > 0 { // key.Log().Info("WidgetTreeView AuthorizedValues", key.AuthorizedValues) // } // if (key.AuthorizedValues != NULL && key.AuthorizedValues[0] != NULL) // for (k = 0; key.AuthorizedValues[k] != NULL; k++); // else // k = 1; scroll.Set("height-request", 100) // key.IsType(cftype.KeyTreeViewSortModify) ? 100 : MIN (100, k * 25) scroll.Set("width-request", 250) scroll.SetPolicy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) scroll.Add(widget) vboxItems := newgtk.Box(gtk.ORIENTATION_VERTICAL, cftype.MarginGUI) grid := newgtk.Grid() grid.Attach(vboxItems, 0, 0, 1, 1) grid.Attach(scroll, 1, 0, 1, 1) if key.IsType(cftype.KeyTreeViewSortSimple, cftype.KeyTreeViewSortModify) { buttonUp := newgtk.Button() buttonDn := newgtk.Button() imgUp := newgtk.ImageFromIconName("go-up", gtk.ICON_SIZE_SMALL_TOOLBAR) imgDn := newgtk.ImageFromIconName("go-down", gtk.ICON_SIZE_SMALL_TOOLBAR) buttonUp.SetImage(imgUp) buttonDn.SetImage(imgDn) data := treeViewData{key.Log(), model, widget, nil} buttonUp.Connect("clicked", onTreeviewMoveUp, data) // Move selection up and down callbacks. buttonDn.Connect("clicked", onTreeviewMoveDown, data) vboxItems.PackStart(buttonUp, false, false, 0) vboxItems.PackStart(buttonDn, false, false, 0) if key.IsType(cftype.KeyTreeViewSortModify) { buttonAdd := newgtk.Button() entry := newgtk.Entry() buttonRm := newgtk.Button() imgAdd := newgtk.ImageFromIconName("list-add", gtk.ICON_SIZE_SMALL_TOOLBAR) imgRm := newgtk.ImageFromIconName("list-remove", gtk.ICON_SIZE_SMALL_TOOLBAR) buttonAdd.SetImage(imgAdd) buttonRm.SetImage(imgRm) vboxItems.PackStart(buttonRm, false, false, 0) grid.Attach(newgtk.Separator(gtk.ORIENTATION_HORIZONTAL), 0, 1, 2, 1) grid.Attach(buttonAdd, 0, 2, 1, 1) grid.Attach(entry, 1, 2, 1, 1) data.entry = entry buttonAdd.Connect("clicked", onTreeviewAddText, data) // Add new iter to model with the value of the entry widget. Clear entry widget. buttonRm.Connect("clicked", onTreeviewRemoveText, data) // Remove selected iter from model. Set its value to the entry widget. } } setValues := func(newvalues []string) { for i, val := range newvalues { iter := model.Append() model.SetValue(iter, RowKey, val) model.SetValue(iter, RowName, val) model.SetValue(iter, 4, true) // active model.SetValue(iter, 5, i) // order } } // Fill model with values. switch key.Type { case cftype.KeyTreeViewSortModify, // add saved values. cftype.KeyTreeViewSortSimple: // TODO: TEMP to improve and maybe regroup this case as was with multichoice and not modify. setValues(values) key.PackKeyWidget(key, getValue, func(uncast interface{}) { model.Clear(); setValues(uncast.([]string)) }, grid) case cftype.KeyTreeViewMultiChoice: if len(key.AuthorizedValues) > 0 { // var NbMax, order int } // else if (pAuthorizedValuesList != NULL) // on liste les choix possibles dans l'ordre choisi. Pour CAIRO_DOCK_WidgetTreeViewMultiChoice, on complete avec ceux n'ayant pas ete selectionnes. // { // gint iNbPossibleValues = 0, iOrder = 0; // while (pAuthorizedValuesList[iNbPossibleValues] != NULL) // iNbPossibleValues ++; // guint l; // for (l = 0; l < length; l ++) // { // cValue = cValueList[l]; // if (! g_ascii_isdigit (*cValue)) // ancien format. // { // cd_debug ("old format\n"); // int k; // for (k = 0; k < iNbPossibleValues; k ++) // on cherche la correspondance. // { // if (strcmp (cValue, pAuthorizedValuesList[k]) == 0) // { // cd_debug (" correspondance %s <-> %d", cValue, k); // g_free (cValueList[l]); // cValueList[l] = g_strdup_printf ("%d", k); // cValue = cValueList[l]; // break ; // } // } // if (k < iNbPossibleValues) // iValue = k; // else // continue; // } // else // iValue = atoi (cValue); // if (iValue < iNbPossibleValues) // { // memset (&iter, 0, sizeof (GtkTreeIter)); // gtk_list_store_append (modele, &iter); // gtk_list_store_set (modele, &iter, // CAIRO_DOCK_MODEL_ACTIVE, TRUE, // CAIRO_DOCK_MODEL_NAME, dgettext (cGettextDomain, pAuthorizedValuesList[iValue]), // CAIRO_DOCK_MODEL_RESULT, cValue, // CAIRO_DOCK_MODEL_ORDER, iOrder ++, -1); // } } // if (iOrder < iNbPossibleValues) // il reste des valeurs a inserer (ce peut etre de nouvelles valeurs apparues lors d'une maj du fichier de conf, donc CAIRO_DOCK_WidgetTreeViewSortSimple est concerne aussi). // { // gchar cResult[10]; // for (k = 0; pAuthorizedValuesList[k] != NULL; k ++) // { // cValue = pAuthorizedValuesList[k]; // for (l = 0; l < length; l ++) // { // iValue = atoi (cValueList[l]); // if (iValue == (int)k) // a deja ete inseree. // break; // } // if (l == length) // elle n'a pas encore ete inseree. // { // snprintf (cResult, 9, "%d", k); // memset (&iter, 0, sizeof (GtkTreeIter)); // gtk_list_store_append (modele, &iter); // gtk_list_store_set (modele, &iter, // CAIRO_DOCK_MODEL_ACTIVE, (iElementType == CAIRO_DOCK_WidgetTreeViewSortSimple), // CAIRO_DOCK_MODEL_NAME, dgettext (cGettextDomain, cValue), // CAIRO_DOCK_MODEL_RESULT, cResult, // CAIRO_DOCK_MODEL_ORDER, iOrder ++, -1); // } // } // } // } }
func dialogWidgetText(data cdtype.DialogWidgetText) (*gtk.Widget, func() interface{}) { var widget *gtk.Widget var getValue func() interface{} if data.MultiLines { textview := newgtk.TextView() scroll := newgtk.ScrolledWindow(nil, nil) scroll.SetPolicy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) scroll.Add(textview) scroll.Set("width-request", 230) scroll.Set("height-request", 130) if data.InitialValue != "" { buffer, e := textview.GetBuffer() if e == nil { buffer.SetText(data.InitialValue) } } if data.Locked { textview.SetEditable(false) } widget = &scroll.Widget getValue = func() interface{} { buffer, e := textview.GetBuffer() if e != nil { return "" } start, end := buffer.GetBounds() answer, _ := buffer.GetText(start, end, true) return answer } } else { entry := newgtk.Entry() entry.SetHasFrame(false) if data.InitialValue != "" { entry.SetText(data.InitialValue) } if data.Locked { entry.SetEditable(false) } if data.Hidden { entry.SetVisibility(false) } widget = &entry.Widget getValue = func() interface{} { answer, _ := entry.GetText() return answer } // g_object_set (pOneWidget, "width-request", CAIRO_DIALOG_MIN_ENTRY_WIDTH, NULL); } // if (iNbCharsMax != 0) // { // gchar *cLabel = g_strdup_printf ("<b>%zd</b>", cInitialText ? strlen (cInitialText) : 0); // GtkWidget *pLabel = gtk_label_new (cLabel); // g_free (cLabel); // gtk_label_set_use_markup (GTK_LABEL (pLabel), TRUE); // GtkWidget *pBox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3); // gtk_box_pack_start (GTK_BOX (pBox), pInteractiveWidget, TRUE, TRUE, 0); // gtk_box_pack_start (GTK_BOX (pBox), pLabel, FALSE, FALSE, 0); // pInteractiveWidget = pBox; // if (bMultiLines) // { // GtkTextBuffer *pBuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (pOneWidget)); // g_signal_connect (pBuffer, "changed", G_CALLBACK (_on_text_changed), pLabel); // g_object_set_data (G_OBJECT (pBuffer), "nb-chars-max", GINT_TO_POINTER (iNbCharsMax)); // } // else // { // g_signal_connect (pOneWidget, "changed", G_CALLBACK (_on_text_changed), pLabel); // g_object_set_data (G_OBJECT (pOneWidget), "nb-chars-max", GINT_TO_POINTER (iNbCharsMax)); // gtk_entry_set_width_chars (GTK_ENTRY (pOneWidget), MIN (iNbCharsMax/2, 100)); // a rough estimate is: 140 chars ~ 1024 pixels // } // } // cstr := (*C.gchar)(C.CString("cd-widget")) // defer C.free(unsafe.Pointer((*C.char)(cstr))) // p := unsafe.Pointer(widget.GObject) // C.g_object_set_data((*C.GObject)(p), cstr, C.gpointer(p)) widget.GrabFocus() return widget, getValue }