Как сделать элемент GtkComboBox отключенным / не кликаемым - PullRequest
0 голосов
/ 04 февраля 2020

Я пытался отключить некоторые элементы списка. Лучшее, что я могу получить, - это сделать текст серым и добавить зачеркивание, добавив атрибуты в комбо, но я все еще могу выбирать «отключенные» элементы, а подсветка при наведении на них остается синим, как и в других активных элементах.

Идеальное поведение будет похоже на разделитель, но вместо большой строки будет отображаться текст элемента.

Есть идеи?

1 Ответ

2 голосов
/ 08 февраля 2020

Решением может быть использование GtkCellRenderer и установка «чувствительного» свойства с помощью gtk_cell_layout_set_cell_data_fun c соответственно, что

Устанавливает GtkCellLayoutDataFun c для использования для cell_layout. Эта функция используется вместо стандартного сопоставления атрибутов для установки значения столбца и должна соответствующим образом устанавливать значение средства визуализации ячеек cell_layout.

см.

https://developer.gnome.org/gtk3/stable/GtkCellLayout.html#gtk -cell-layout-set-cell-data-fun c

Пример

#include <glib/gi18n.h>
#include <gtk/gtk.h>

static GtkTreeModel *combo_model(void) {
    const gchar *labels[] = {
            N_("Show Bookmarks"),
            N_("Edit Bookmarks"),
            N_("Previous Item"),
            N_("Next Item"),
    };

    GtkListStore *store = gtk_list_store_new(1, G_TYPE_STRING);
    GtkTreeIter iter;
    for (gint i = 0; i < G_N_ELEMENTS(labels); i++) {
        gtk_list_store_append(store, &iter);
        gtk_list_store_set(store, &iter, 0, labels[i], -1);
    }

    return GTK_TREE_MODEL(store);
}

static void set_sensitive(GtkCellLayout *cell_layout,
              GtkCellRenderer *cell,
              GtkTreeModel *tree_model,
              GtkTreeIter *iter,
              gpointer data) {
    gchar *text;
    gtk_tree_model_get (tree_model, iter, 0, &text, -1);
    gboolean sensitive = g_strcmp0(N_("Previous Item"), text) != 0;
    g_free (text);
    g_object_set(cell, "sensitive", sensitive, NULL);
}


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), "Disabled Item Demo");
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_widget_destroyed), &window);
    gtk_container_set_border_width(GTK_CONTAINER(window), 32);

    GtkTreeModel *model = combo_model();
    GtkWidget *combo = gtk_combo_box_new_with_model(model);
    g_object_unref(model);
    gtk_container_add(GTK_CONTAINER(window), combo);

    GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
    gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, TRUE);
    gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), renderer, "text", 0, NULL);
    gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(combo), renderer, set_sensitive, NULL, NULL);
    gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);

    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}

Демо

Когда вы запускаете приведенный выше пример кода, он выглядит примерно так:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...