// Lists adds a string list widget. // func Lists(key *cftype.Key) { if key.IsType(cftype.KeyListNbCtrlSimple, cftype.KeyListNbCtrlSelect) && len(key.AuthorizedValues) == 0 { key.Log().NewWarn("not enough values", "widget numbered control list:", key.Name) return } // Get full value with ';'. value := key.Value().String() // log.DEV("LIST "+string(key.Type), key.Name, value, key.AuthorizedValues) listIsNumbered := key.IsType(cftype.KeyListNumbered, cftype.KeyListNbCtrlSimple, cftype.KeyListNbCtrlSelect) iSelectedItem := -1 current := "" // Control selective use 3 AuthorizedValues fields for each "value". step := ternary.Int(key.IsType(cftype.KeyListNbCtrlSelect), 3, 1) if key.IsType(cftype.KeyListEntry) { current = value } if listIsNumbered && value != "" { var e error iSelectedItem, e = strconv.Atoi(value) switch { case key.Log().Err(e, "selection problem", "[", value, "]", "[", iSelectedItem, "]", key.Name): case iSelectedItem < 0: case iSelectedItem < len(key.AuthorizedValues): current = key.AuthorizedValues[iSelectedItem*step] default: key.Log().NewWarn("selection out of range", "widget numbered list:", key.Name) } } var list []datatype.Field if len(key.AuthorizedValues) > 0 { // int iOrder1, iOrder2, iExcept; if key.IsType(cftype.KeyListNbCtrlSimple, cftype.KeyListNbCtrlSelect) { key.SetNbControlled(0) } // gchar *cResult = (listIsNumbered ? g_new0 (gchar , 10) : NULL); for k := 0; k < len(key.AuthorizedValues); k += step { // on ajoute toutes les chaines possibles a la combo. if !listIsNumbered && iSelectedItem == -1 && value == key.AuthorizedValues[k] { current = value iSelectedItem = k / step } // if (cResult != NULL) // snprintf (cResult, 9, "%d", k/dk); // dk becomes step // iExcept = 0; // if key.IsType(cftype.KeyListNbCtrlSelect) { // iOrder1 = atoi (key.AuthorizedValues[k+1]); // gchar *str = strchr (key.AuthorizedValues[k+2], ','); // if (str) // Note: this mechanism is an addition to the original {first widget, number of widgets}; it's not very generic nor beautiful, but until we need more, it's well enough (currently, only the Dock background needs it). // { // *str = '\0'; // iExcept = atoi (str+1); // } // iOrder2 = atoi (key.AuthorizedValues[k+2]); // NbControlled = MAX (NbControlled, iOrder1 + iOrder2 - 1); // //g_print ("iSelectedItem:%d ; k/dk:%d\n", iSelectedItem , k/dk); // if (iSelectedItem == (int)k/dk) // { // iFirstSensitiveWidget = iOrder1; // iNbSensitiveWidgets = iOrder2; // iNonSensitiveWidget = iExcept; // if (iNonSensitiveWidget != 0) // NbControlled ++; // } // } else { // iOrder1 = iOrder2 = k; // } // name := "" if key.IsType(cftype.KeyListEntry) { name = key.AuthorizedValues[k] } else { name = key.Translate(key.AuthorizedValues[k]) } list = append(list, datatype.Field{ Key: key.AuthorizedValues[k], Name: name, }) // CAIRO_DOCK_MODEL_ORDER, iOrder1, // CAIRO_DOCK_MODEL_ORDER2, iOrder2, // CAIRO_DOCK_MODEL_STATE, iExcept, -1); } } // Current choice wasn't in the list. Select first. if current == "" && len(list) > 0 { current = list[0].Key iSelectedItem = 0 } // Build the combo widget. widget, _, getValue, setValue := NewComboBox(key, key.IsType(cftype.KeyListEntry), listIsNumbered, current, list) // gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (modele), GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, GTK_SORT_ASCENDING); // int iNonSensitiveWidget = 0; if len(key.AuthorizedValues) > 0 { if key.IsType(cftype.KeyListNbCtrlSimple, cftype.KeyListNbCtrlSelect) { // _allocate_new_buffer; // data[0] = pKeyBox; // data[1] = (pFrameVBox != NULL ? pFrameVBox : pGroupBox); if key.IsType(cftype.KeyListNbCtrlSimple) { // NbControlled = k; // data[2] = GINT_TO_POINTER (NbControlled); // g_signal_connect (G_OBJECT (pOneWidget), "changed", G_CALLBACK (_cairo_dock_select_one_item_in_control_combo), data); // iFirstSensitiveWidget = iSelectedItem+1; // on decroit jusqu'a 0. // iNbSensitiveWidgets = 1; // //g_print ("CONTROL : %d,%d,%d\n", NbControlled, iFirstSensitiveWidget, iNbSensitiveWidgets); } else { // data[2] = GINT_TO_POINTER (NbControlled); // g_signal_connect (G_OBJECT (pOneWidget), "changed", G_CALLBACK (_cairo_dock_select_one_item_in_control_combo_selective), data); // //g_print ("CONTROL : %d,%d,%d\n", NbControlled, iFirstSensitiveWidget, iNbSensitiveWidgets); } // g_object_set_data (G_OBJECT (pKeyBox), "nb-ctrl-widgets", GINT_TO_POINTER (NbControlled)); // g_object_set_data (G_OBJECT (pKeyBox), "one-widget", pOneWidget); // CDControlWidget *cw = g_new0 (CDControlWidget, 1); // pControlWidgets = g_list_prepend (pControlWidgets, cw); // cw->pControlContainer = (pFrameVBox != NULL ? pFrameVBox : pGroupBox); // cw->NbControlled = NbControlled; // cw->iFirstSensitiveWidget = iFirstSensitiveWidget; // cw->iNbSensitiveWidgets = iNbSensitiveWidgets; // cw->iNonSensitiveWidget = iNonSensitiveWidget; // //g_print (" pControlContainer:%x\n", pControlContainer); } } key.PackKeyWidget(key, getValue, setValue, widget) }