X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-selector.c;h=32e6ce126ca6ce621906cb042001b55c03b2bda8;hb=e4a4f41ed1c534c4f742ce95feeee515563b97dc;hp=82e21399768a05548cef4fc7b59e25fa4acf8ae3;hpb=e2da62d735c597afeef2e0e9b36e5a4a83d7da94;p=pspp diff --git a/src/ui/gui/psppire-selector.c b/src/ui/gui/psppire-selector.c index 82e2139976..32e6ce126c 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 @@ -213,9 +213,6 @@ static void on_click (GtkButton *b); static void on_realize (GtkWidget *selector); -static void update_subjects (PsppireSelector *selector); - - static void psppire_selector_set_property (GObject *object, guint prop_id, @@ -232,15 +229,15 @@ psppire_selector_set_property (GObject *object, break; case PROP_PRIMARY: selector->primary_requested = TRUE; - update_subjects (selector); + psppire_selector_update_subjects (selector); break; case PROP_SOURCE_WIDGET: selector->source = g_value_dup_object (value); - update_subjects (selector); + psppire_selector_update_subjects (selector); break; case PROP_DEST_WIDGET: selector->dest = g_value_dup_object (value); - update_subjects (selector); + psppire_selector_update_subjects (selector); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -439,8 +436,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 +475,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 +496,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 +525,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 +533,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; @@ -616,6 +636,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 (); @@ -928,7 +951,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) */ @@ -976,8 +1010,8 @@ set_default_filter (PsppireSelector *selector) } -static void -update_subjects (PsppireSelector *selector) +void +psppire_selector_update_subjects (PsppireSelector *selector) { if ( NULL == selector->dest ) return; @@ -1005,10 +1039,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 */ @@ -1078,15 +1116,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; }