Re: Combobox disable item



I am trying to make entries "greyed-out" ie: disabled, rather than hidden


eg the Combobox model contains ('Scandvb','DVB module','DVDb5-Scan')
There is another comboox with a configuration file chosen

I want to be able to make one or more of the entries unselectable if
prerequites are not available or the wrong type of config file is selected,
but still show the option as a prompt

thanks

On 22 June 2017 at 21:09, <cecashon aol com> wrote:



Hi Mike,

What part of the combo box are you trying to disable? If you want to
filter rows or columns you can set up a tree model filter to do so. Maybe
something like the following?

Eric


/*
    gcc -Wall combo_filter1.c -o combo_filter1 `pkg-config --cflags --libs
gtk+-3.0`
    Tested on GTK3.18 and Ubuntu16.04
*/
#include<gtk/gtk.h>
#include<stdlib.h>

static gint combo_row=0;

static void change_combo(GtkComboBox *combo2, gpointer *data)
  {
    combo_row=gtk_combo_box_get_active(combo2);
    gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(data[1]));
    gtk_combo_box_set_active(GTK_COMBO_BOX(data[0]), 0);
  }
static gboolean show_rgb(GtkTreeModel *model, GtkTreeIter *iter, gpointer
data)
  {
    gchar *string=gtk_tree_model_get_string_from_iter(model, iter);
    gint row=atoi(string);
    g_free(string);

    if(combo_row==1&&row<3)
      {
        g_print("Combo1 Don't Show %i\n", row);
        return FALSE;
      }
    else
      {
        g_print("Combo1 Show %i\n", row);
        return TRUE;
      }
  }
int main(int argc, char *argv[])
  {
    gtk_init(&argc, &argv);

    GtkWidget *window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Combo Filter");
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window), 300, 100);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    GtkTreeIter iter;
    GtkListStore *store=gtk_list_store_new(1, G_TYPE_STRING);
    gtk_list_store_append(store, &iter);
    gtk_list_store_set(store, &iter, 0, "Yellow", -1);
    gtk_list_store_append(store, &iter);
    gtk_list_store_set(store, &iter, 0, "Purple", -1);
    gtk_list_store_append(store, &iter);
    gtk_list_store_set(store, &iter, 0, "Cyan", -1);
    gtk_list_store_append(store, &iter);
    gtk_list_store_set(store, &iter, 0, "Red", -1);
    gtk_list_store_append(store, &iter);
    gtk_list_store_set(store, &iter, 0, "Green", -1);
    gtk_list_store_append(store, &iter);
    gtk_list_store_set(store, &iter, 0, "Blue", -1);

    GtkTreeModel *model=gtk_tree_model_filter_new(GTK_TREE_MODEL(store),
NULL);
    gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(model), (
GtkTreeModelFilterVisibleFunc)show_rgb, NULL, NULL);

    GtkCellRenderer *renderer=gtk_cell_renderer_text_new();

    GtkWidget *combo1=gtk_combo_box_new_with_model(model);
    gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo1), renderer, TRUE);
    gtk_widget_set_hexpand(combo1, TRUE);
    gtk_widget_set_vexpand(combo1, TRUE);
    gtk_combo_box_set_active(GTK_COMBO_BOX(combo1), 0);
    gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo1),
GTK_CELL_RENDERER(renderer), "text", 0, NULL);

    GtkWidget *combo2=gtk_combo_box_text_new();
    gtk_combo_box_text_insert(GTK_COMBO_BOX_TEXT(combo2), 0, "1", "Show
All");
    gtk_combo_box_text_insert(GTK_COMBO_BOX_TEXT(combo2), 1, "2", "Show
RGB");
    gtk_combo_box_set_active(GTK_COMBO_BOX(combo2), 0);
    gtk_widget_set_hexpand(combo2, TRUE);
    gtk_widget_set_vexpand(combo2, TRUE);
    gpointer data[]={combo1, model};
    g_signal_connect(combo2, "changed", G_CALLBACK(change_combo), data);

    g_object_unref(G_OBJECT(store));

    GtkWidget *grid=gtk_grid_new();
    gtk_grid_attach(GTK_GRID(grid), combo1, 0, 0, 1, 1);
    gtk_grid_attach(GTK_GRID(grid), combo2, 0, 1, 1, 1);
    gtk_container_add(GTK_CONTAINER(window), grid);

    gtk_widget_show_all(window);
    gtk_main();
    return 0;
  }





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]