X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-selector.c;h=cd122d7bfb5dcb345cc5efb3525613608cc7dbb8;hb=c7db015cdd7470334adafd940eda792c07a46126;hp=372ef3c531f18adef3fde1c4dd470e860bffc098;hpb=ea17c5b225557fc0760810861451a84dc241d462;p=pspp diff --git a/src/ui/gui/psppire-selector.c b/src/ui/gui/psppire-selector.c index 372ef3c531..cd122d7bfb 100644 --- a/src/ui/gui/psppire-selector.c +++ b/src/ui/gui/psppire-selector.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2007, 2009, 2010, 2012 Free Software Foundation + Copyright (C) 2007, 2009, 2010, 2012, 2015 Free Software Foundation This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ This module provides a widget, PsppireSelector derived from GtkButton. - It contains a GtkArrow, and is used for selecting objects from a + It contains a GtkImage (to indicate the arrow), and is used for selecting objects from a GtkTreeView and putting them into a destination widget (often another GtkTreeView). Typically this is used in psppire for selecting variables, thus: @@ -59,9 +59,9 @@ #include #include "psppire-dictview.h" -#include "psppire-var-view.h" #include "psppire-dict.h" #include "psppire-select-dest.h" +#include "psppire-means-layer.h" #include @@ -439,8 +439,7 @@ psppire_selector_init (PsppireSelector *selector) selector->allow_selection = NULL; selector->filter = NULL; - selector->arrow = gtk_arrow_new (GTK_ARROW_LEFT, GTK_SHADOW_NONE); - + selector->arrow = gtk_image_new_from_icon_name ("pan-start-symbolic", GTK_ICON_SIZE_BUTTON); gtk_container_add (GTK_CONTAINER (selector), selector->arrow); @@ -479,16 +478,16 @@ set_direction (PsppireSelector *selector, enum psppire_selector_dir d) switch (selector->orientation) { case PSPPIRE_SELECT_SOURCE_BEFORE_DEST: - g_object_set (selector->arrow, "arrow-type", GTK_ARROW_RIGHT, NULL); + g_object_set (selector->arrow, "icon-name", "pan-end-symbolic", NULL); break; case PSPPIRE_SELECT_SOURCE_AFTER_DEST: - g_object_set (selector->arrow, "arrow-type", GTK_ARROW_LEFT, NULL); + g_object_set (selector->arrow, "icon-name", "pan-start-symbolic", NULL); break; case PSPPIRE_SELECT_SOURCE_ABOVE_DEST: - g_object_set (selector->arrow, "arrow-type", GTK_ARROW_DOWN, NULL); + g_object_set (selector->arrow, "icon-name", "pan-down-symbolic", NULL); break; case PSPPIRE_SELECT_SOURCE_BELOW_DEST: - g_object_set (selector->arrow, "arrow-type", GTK_ARROW_UP, NULL); + g_object_set (selector->arrow, "icon-name", "pan-up-symbolic", NULL); break; default: g_assert_not_reached (); @@ -500,22 +499,21 @@ set_direction (PsppireSelector *selector, enum psppire_selector_dir d) switch (selector->orientation) { case PSPPIRE_SELECT_SOURCE_BEFORE_DEST: - g_object_set (selector->arrow, "arrow-type", GTK_ARROW_LEFT, NULL); + g_object_set (selector->arrow, "icon-name", "pan-start-symbolic", NULL); break; case PSPPIRE_SELECT_SOURCE_AFTER_DEST: - g_object_set (selector->arrow, "arrow-type", GTK_ARROW_RIGHT, NULL); + g_object_set (selector->arrow, "icon-name", "pan-end-symbolic", NULL); break; case PSPPIRE_SELECT_SOURCE_ABOVE_DEST: - g_object_set (selector->arrow, "arrow-type", GTK_ARROW_UP, NULL); + g_object_set (selector->arrow, "icon-name", "pan-up-symbolic", NULL); break; case PSPPIRE_SELECT_SOURCE_BELOW_DEST: - g_object_set (selector->arrow, "arrow-type", GTK_ARROW_DOWN, NULL); + g_object_set (selector->arrow, "icon-name", "pan-down-symbolic", NULL); break; default: g_assert_not_reached (); break; }; - } } @@ -530,6 +528,7 @@ on_dest_treeview_select (GtkTreeSelection *treeselection, gpointer data) set_direction (selector, PSPPIRE_SELECTOR_DEST_TO_SOURCE); } + /* Callback for source deselection, when the dest is GtkEntry */ static void de_select_selection_entry (PsppireSelector *selector) @@ -537,23 +536,47 @@ de_select_selection_entry (PsppireSelector *selector) gtk_entry_set_text (GTK_ENTRY (selector->dest), ""); } + +static void de_select_tree_model (GtkTreeSelection *selection, GtkTreeModel *model); + +/* Callback for source deselection, when the dest is PsppireMeansLayer */ +static void +de_select_selection_means_layer (PsppireSelector *selector) +{ + PsppireMeansLayer *ml = PSPPIRE_MEANS_LAYER (selector->dest); + GtkTreeView *tv = GTK_TREE_VIEW (ml->var_view); + GtkTreeSelection *selection = gtk_tree_view_get_selection (tv); + + GtkTreeModel *model = psppire_means_layer_get_model (ml); + + g_return_if_fail (selector->select_items); + + de_select_tree_model (selection, model); +} + /* Callback for source deselection, when the dest is GtkTreeView */ static void de_select_selection_tree_view (PsppireSelector *selector) { - GList *item; - GtkTreeSelection* selection = gtk_tree_view_get_selection ( GTK_TREE_VIEW (selector->dest)); GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (selector->dest)); + g_return_if_fail (selector->select_items); + + de_select_tree_model (selection, model); +} + +static void +de_select_tree_model (GtkTreeSelection *selection, GtkTreeModel *model) +{ + GList *item; + GList *selected_rows = gtk_tree_selection_get_selected_rows (selection, NULL); - g_return_if_fail (selector->select_items); - /* Convert paths to RowRefs */ for (item = g_list_first (selected_rows); item != NULL; @@ -599,7 +622,8 @@ static gboolean refilter (PsppireSelector *selector) { GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (selector->source)); - gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (model)); + if (GTK_IS_TREE_MODEL_FILTER (model)) + gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (model)); return FALSE; } @@ -615,6 +639,9 @@ de_select_selection (PsppireSelector *selector) else if ( GTK_IS_ENTRY (selector->dest)) de_select_selection_entry (selector); + else if ( PSPPIRE_IS_MEANS_LAYER (selector->dest)) + de_select_selection_means_layer (selector); + else g_assert_not_reached (); @@ -882,19 +909,31 @@ on_dest_data_delete (GtkTreeModel *tree_model, } +static void +remove_selector_handlers (PsppireSelector *selector, GObject *sel) +{ + g_signal_handlers_disconnect_by_data (sel, selector); +} + static void on_dest_model_changed (PsppireSelector *selector) { GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (selector->dest)); - if ( model ) - { - g_signal_connect (model, "row-changed", G_CALLBACK (on_dest_data_change), - selector); - - g_signal_connect (model, "row-deleted", G_CALLBACK (on_dest_data_delete), - selector); - } + if (model == NULL) + return; + + g_signal_connect (model, "row-changed", G_CALLBACK (on_dest_data_change), + selector); + + g_signal_connect (model, "row-deleted", G_CALLBACK (on_dest_data_delete), + selector); + + g_signal_connect (selector, "destroy", G_CALLBACK (remove_selector_handlers), model); + + if ( selector->selecting ) return; + + refilter (selector); } /* Set the destination widget to DEST */ @@ -915,7 +954,18 @@ set_tree_view_dest (PsppireSelector *selector, G_CALLBACK (on_dest_model_changed), selector); } +static void +set_layer_dest (PsppireSelector *selector, + PsppireMeansLayer *dest) +{ + GtkTreeSelection* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dest->var_view)); + + gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE); + + g_signal_connect (selection, "changed", G_CALLBACK (on_dest_treeview_select), + selector); +} /* Callback for when the DEST GtkEntry is selected (clicked) */ @@ -992,10 +1042,14 @@ update_subjects (PsppireSelector *selector) { set_tree_view_dest (selector, GTK_TREE_VIEW (selector->dest)); } - else if ( GTK_IS_ENTRY (selector->dest)) - set_entry_dest (selector, GTK_ENTRY (selector->dest)); - + { + set_entry_dest (selector, GTK_ENTRY (selector->dest)); + } + else if (PSPPIRE_IS_MEANS_LAYER (selector->dest)) + { + set_layer_dest (selector, PSPPIRE_MEANS_LAYER (selector->dest)); + } else if (GTK_IS_TEXT_VIEW (selector->dest)) { /* Nothing to be done */ @@ -1065,15 +1119,17 @@ GType psppire_selector_orientation_get_type (void) { static GType etype = 0; - if (etype == 0) { - static const GEnumValue values[] = { - { PSPPIRE_SELECT_SOURCE_BEFORE_DEST, "PSPPIRE_SELECT_SOURCE_BEFORE_DEST", "source before destination" }, - { PSPPIRE_SELECT_SOURCE_AFTER_DEST, "PSPPIRE_SELECT_SOURCE_AFTER_DEST", "source after destination" }, - { PSPPIRE_SELECT_SOURCE_ABOVE_DEST, "PSPPIRE_SELECT_SOURCE_ABOVE_DEST", "source above destination" }, - { PSPPIRE_SELECT_SOURCE_BELOW_DEST, "PSPPIRE_SELECT_SOURCE_BELOW_DEST", "source below destination" }, - { 0, NULL, NULL } - }; - etype = g_enum_register_static (g_intern_static_string ("PsppireSelectorOrientation"), values); - } + if (etype == 0) + { + static const GEnumValue values[] = + { + { PSPPIRE_SELECT_SOURCE_BEFORE_DEST, "PSPPIRE_SELECT_SOURCE_BEFORE_DEST", "source before destination" }, + { PSPPIRE_SELECT_SOURCE_AFTER_DEST, "PSPPIRE_SELECT_SOURCE_AFTER_DEST", "source after destination" }, + { PSPPIRE_SELECT_SOURCE_ABOVE_DEST, "PSPPIRE_SELECT_SOURCE_ABOVE_DEST", "source above destination" }, + { PSPPIRE_SELECT_SOURCE_BELOW_DEST, "PSPPIRE_SELECT_SOURCE_BELOW_DEST", "source below destination" }, + { 0, NULL, NULL } + }; + etype = g_enum_register_static (g_intern_static_string ("PsppireSelectorOrientation"), values); + } return etype; }