X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-dictview.c;h=243d907826f909a933f1fe8a73478b888da83c5c;hb=729b96a6bd9342c45e6f65a113fd87c70da85b0a;hp=d955fae10961c1cc3222c40149392088ba3eb08b;hpb=c3e2ab6b50eb3b3c7e0852f2a4e2122f695714ff;p=pspp-builds.git diff --git a/src/ui/gui/psppire-dictview.c b/src/ui/gui/psppire-dictview.c index d955fae1..243d9078 100644 --- a/src/ui/gui/psppire-dictview.c +++ b/src/ui/gui/psppire-dictview.c @@ -21,6 +21,7 @@ #include "psppire-dict.h" #include "psppire-conf.h" #include +#include #include "helper.h" #include @@ -65,6 +66,9 @@ psppire_dict_view_get_type (void) static void psppire_dict_view_finalize (GObject *object) { + PsppireDictView *dict_view = PSPPIRE_DICT_VIEW (object); + + g_object_unref (dict_view->menu); } /* Properties */ @@ -72,6 +76,7 @@ enum { PROP_0, PROP_MODEL, + PROP_DICTIONARY, PROP_PREDICATE, PROP_SELECTION_MODE }; @@ -129,9 +134,14 @@ psppire_dict_view_set_property (GObject *object, switch (prop_id) { - case PROP_MODEL: + case PROP_DICTIONARY: dict_view->dict = g_value_get_object (value); break; + case PROP_MODEL: + g_critical ("Don't set the \"model\" property on %s. " + "Use the \"dictionary\" property instead.", + G_OBJECT_TYPE_NAME (dict_view)); + break; case PROP_PREDICATE: dict_view->predicate = g_value_get_pointer (value); break; @@ -165,7 +175,7 @@ psppire_dict_view_get_property (GObject *object, switch (prop_id) { - case PROP_MODEL: + case PROP_DICTIONARY: g_value_set_object (value, dict_view->dict); break; case PROP_PREDICATE: @@ -191,11 +201,11 @@ psppire_dict_view_class_init (PsppireDictViewClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); - GParamSpec *model_spec = - g_param_spec_object ("model", - "Model", + GParamSpec *dictionary_spec = + g_param_spec_object ("dictionary", + "Dictionary", _("The dictionary to be displayed by this widget"), - G_TYPE_PSPPIRE_DICT, + PSPPIRE_TYPE_DICT, G_PARAM_READABLE | G_PARAM_WRITABLE); GParamSpec *predicate_spec = @@ -214,12 +224,22 @@ psppire_dict_view_class_init (PsppireDictViewClass *class) G_PARAM_CONSTRUCT | G_PARAM_READABLE | G_PARAM_WRITABLE); + GParamSpec *dummy_spec = + g_param_spec_pointer ("model", + "Model", + "Don't set the property", + G_PARAM_WRITABLE); + object_class->set_property = psppire_dict_view_set_property; object_class->get_property = psppire_dict_view_get_property; g_object_class_install_property (object_class, PROP_MODEL, - model_spec); + dummy_spec); + + g_object_class_install_property (object_class, + PROP_DICTIONARY, + dictionary_spec); g_object_class_install_property (object_class, PROP_PREDICATE, @@ -242,8 +262,8 @@ psppire_dict_view_base_init (PsppireDictViewClass *class) static void -psppire_dict_view_base_finalize(PsppireDictViewClass *class, - gpointer class_data) +psppire_dict_view_base_finalize (PsppireDictViewClass *class, + gpointer class_data) { } @@ -255,20 +275,39 @@ dv_get_base_model (GtkTreeModel *top_model, GtkTreeIter *top_iter, ) { *model = top_model; - *iter = *top_iter; - while (GTK_IS_TREE_MODEL_FILTER (*model)) + + if ( iter) + *iter = *top_iter; + + while ( ! PSPPIRE_IS_DICT (*model)) { - GtkTreeIter parent_iter = *iter; - GtkTreeModelFilter *parent_model = GTK_TREE_MODEL_FILTER (*model); + GtkTreeIter parent_iter; + if (iter) + parent_iter = *iter; - *model = gtk_tree_model_filter_get_model (parent_model); + if ( GTK_IS_TREE_MODEL_FILTER (*model)) + { + GtkTreeModelFilter *parent_model = GTK_TREE_MODEL_FILTER (*model); - gtk_tree_model_filter_convert_iter_to_child_iter (parent_model, - iter, - &parent_iter); - } + *model = gtk_tree_model_filter_get_model (parent_model); + + if (iter) + gtk_tree_model_filter_convert_iter_to_child_iter (parent_model, + iter, + &parent_iter); + } + else if (GTK_IS_TREE_MODEL_SORT (*model)) + { + GtkTreeModelSort *parent_model = GTK_TREE_MODEL_SORT (*model); - g_assert (PSPPIRE_IS_DICT (*model)); + *model = gtk_tree_model_sort_get_model (parent_model); + + if (iter) + gtk_tree_model_sort_convert_iter_to_child_iter (parent_model, + iter, + &parent_iter); + } + } } @@ -282,41 +321,31 @@ var_description_cell_data_func (GtkTreeViewColumn *col, GtkTreeIter *top_iter, gpointer data) { + PsppireDictView *dv = PSPPIRE_DICT_VIEW (data); struct variable *var; GtkTreeIter iter; GtkTreeModel *model; - gboolean prefer_labels = FALSE; - - PsppireConf *conf = psppire_conf_new (); - - psppire_conf_get_boolean (conf, "dialog-boxes", "prefer-labels", - &prefer_labels); + PsppireDict *dict; dv_get_base_model (top_model, top_iter, &model, &iter); - g_assert (PSPPIRE_IS_DICT (model)); - + dict = PSPPIRE_DICT (model); gtk_tree_model_get (model, &iter, DICT_TVM_COL_VAR, &var, -1); - if ( var_has_label (var) && prefer_labels) + if ( var_has_label (var) && dv->prefer_labels) { gchar *text = g_strdup_printf ( "%s", var_get_label (var)); - char *utf8 = pspp_locale_to_utf8 (text, -1, NULL); - + g_object_set (cell, "markup", text, NULL); g_free (text); - g_object_set (cell, "markup", utf8, NULL); - g_free (utf8); } else { - char *name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL); - g_object_set (cell, "text", name, NULL); - g_free (name); + g_object_set (cell, "text", var_get_name (var), NULL); } } @@ -371,7 +400,6 @@ set_tooltip_for_variable (GtkTreeView *treeview, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer user_data) - { gint bx, by; GtkTreeIter iter; @@ -380,7 +408,6 @@ set_tooltip_for_variable (GtkTreeView *treeview, struct variable *var = NULL; gboolean ok; - gtk_tree_view_convert_widget_to_bin_window_coords (treeview, x, y, &bx, &by); @@ -390,7 +417,6 @@ set_tooltip_for_variable (GtkTreeView *treeview, tree_model = gtk_tree_view_get_model (treeview); - gtk_tree_view_set_tooltip_row (treeview, tooltip, path); ok = gtk_tree_model_get_iter (tree_model, &iter, path); @@ -406,51 +432,75 @@ set_tooltip_for_variable (GtkTreeView *treeview, return FALSE; { - gchar *tip ; - gboolean prefer_labels = FALSE; + const gchar *tip ; + GtkTreeModel *m; + PsppireDict *dict; - PsppireConf *conf = psppire_conf_new (); + dv_get_base_model (tree_model, NULL, &m, NULL); + dict = PSPPIRE_DICT (m); - psppire_conf_get_boolean (conf, "dialog-boxes", "prefer-labels", - &prefer_labels); - - if ( prefer_labels ) - tip = pspp_locale_to_utf8 (var_get_name (var), -1, NULL); + if ( PSPPIRE_DICT_VIEW (treeview)->prefer_labels ) + tip = var_get_name (var); else - tip = pspp_locale_to_utf8 (var_get_label (var), -1, NULL); + tip = var_get_label (var); gtk_tooltip_set_text (tooltip, tip); - - g_free (tip); } return TRUE; } +static gboolean +show_menu (PsppireDictView *dv, GdkEventButton *event, gpointer data) +{ + if (event->button != 3) + return FALSE; + + gtk_menu_popup (GTK_MENU (dv->menu), NULL, NULL, NULL, NULL, + event->button, event->time); + + return TRUE; +} + +static void +toggle_label_preference (GtkCheckMenuItem *checkbox, gpointer data) +{ + PsppireDictView *dv = PSPPIRE_DICT_VIEW (data); + + dv->prefer_labels = gtk_check_menu_item_get_active (checkbox); + + gtk_widget_queue_draw (GTK_WIDGET (dv)); +} + + static void psppire_dict_view_init (PsppireDictView *dict_view) { - GtkTreeViewColumn *col; + GtkTreeViewColumn *col = gtk_tree_view_column_new (); - GtkCellRenderer *renderer; + GtkCellRenderer *renderer = gtk_cell_renderer_pixbuf_new (); + + dict_view->prefer_labels = TRUE; + + psppire_conf_get_boolean (psppire_conf_new (), + G_OBJECT_TYPE_NAME (dict_view), + "prefer-labels", + &dict_view->prefer_labels); - col = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (col, _("Variable")); - renderer = gtk_cell_renderer_pixbuf_new (); gtk_tree_view_column_pack_start (col, renderer, FALSE); gtk_tree_view_column_set_cell_data_func (col, renderer, var_icon_cell_data_func, NULL, NULL); - renderer = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_start (col, renderer, TRUE); gtk_tree_view_column_set_cell_data_func (col, renderer, var_description_cell_data_func, - NULL, NULL); + dict_view, NULL); g_object_set (renderer, "ellipsize-set", TRUE, NULL); g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_MIDDLE, NULL); @@ -462,10 +512,36 @@ psppire_dict_view_init (PsppireDictView *dict_view) gtk_tree_view_append_column (GTK_TREE_VIEW (dict_view), col); - g_object_set (dict_view, "has-tooltip", TRUE, NULL); + g_object_set (dict_view, + "has-tooltip", TRUE, + "headers-visible", FALSE, + NULL); g_signal_connect (dict_view, "query-tooltip", G_CALLBACK (set_tooltip_for_variable), NULL); + + dict_view->menu = gtk_menu_new (); + + + { + GtkWidget *checkbox = + gtk_check_menu_item_new_with_label (_("Prefer variable labels")); + + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (checkbox), + dict_view->prefer_labels); + + g_signal_connect (checkbox, "toggled", + G_CALLBACK (toggle_label_preference), dict_view); + + + gtk_menu_shell_append (GTK_MENU_SHELL (dict_view->menu), checkbox); + + } + + gtk_widget_show_all (dict_view->menu); + + g_signal_connect (dict_view, "button-press-event", + G_CALLBACK (show_menu), NULL); } @@ -492,9 +568,7 @@ psppire_dict_view_get_selected_variable (PsppireDictView *treeview) if (! gtk_tree_selection_get_selected (selection, &top_model, &top_iter)) - { - return NULL; - } + return NULL; dv_get_base_model (top_model, &top_iter, &model, &iter);