X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-selector.c;h=2f9dbe06a890cbe5903ed74891b2574c1b702cea;hb=1b2a87ad88df1fcbf19efaff1476b48711278917;hp=7f34baebafcbcbad1ff98535aa30f1fdcb293a4e;hpb=43b1296aafe7582e7dbe6c2b6a8b478d7d9b0fcf;p=pspp-builds.git diff --git a/src/ui/gui/psppire-selector.c b/src/ui/gui/psppire-selector.c index 7f34baeb..2f9dbe06 100644 --- a/src/ui/gui/psppire-selector.c +++ b/src/ui/gui/psppire-selector.c @@ -126,6 +126,9 @@ enum }; +static void on_activate (PsppireSelector *selector, gpointer data); + + static void psppire_selector_set_property (GObject *object, guint prop_id, @@ -230,16 +233,23 @@ psppire_selector_base_finalize(PsppireSelectorClass *class, } + static void psppire_selector_init (PsppireSelector *selector) { selector->arrow = gtk_arrow_new (GTK_ARROW_LEFT, GTK_SHADOW_NONE); selector->filtered_source = NULL; + selector->action = gtk_action_new ("select", NULL, NULL, "pspp-stock-select"); + + gtk_action_connect_proxy (selector->action, GTK_WIDGET (selector)); + gtk_container_add (GTK_CONTAINER (selector), selector->arrow); gtk_widget_show (selector->arrow); + g_signal_connect_swapped (selector->action, "activate", G_CALLBACK (on_activate), selector); + selector->selecting = FALSE; } @@ -311,9 +321,14 @@ on_source_select (GtkTreeSelection *treeselection, gpointer data) set_direction (selector, PSPPIRE_SELECTOR_SOURCE_TO_DEST); - if ( GTK_IS_ENTRY (selector->dest) ) + if ( selector->allow_selection ) { - gtk_widget_set_sensitive (GTK_WIDGET (selector), + gtk_action_set_sensitive (selector->action, + selector->allow_selection (selector->source, selector->dest)); + } + else if ( GTK_IS_ENTRY (selector->dest) ) + { + gtk_action_set_sensitive (selector->action, gtk_tree_selection_count_selected_rows (treeselection) <= 1 ); } @@ -325,6 +340,8 @@ on_dest_treeview_select (GtkTreeSelection *treeselection, gpointer data) { PsppireSelector *selector = data; + gtk_tree_selection_unselect_all (gtk_tree_view_get_selection (GTK_TREE_VIEW (selector->source))); + set_direction (selector, PSPPIRE_SELECTOR_DEST_TO_SOURCE); } @@ -448,7 +465,9 @@ select_selection (PsppireSelector *selector) selector->select_items (child_iter, selector->dest, - childmodel); + childmodel, + selector->select_user_data + ); } g_list_foreach (selected_rows, (GFunc) gtk_tree_path_free, NULL); @@ -470,12 +489,14 @@ on_row_activate (GtkTreeView *tree_view, { PsppireSelector *selector = data; - select_selection (selector); + gtk_action_activate (selector->action); } -/* Callback for when the selector button is clicked */ +/* Callback for when the selector button is clicked, + or other event which causes the selector's action to occur. + */ static void -on_click (PsppireSelector *selector, gpointer data) +on_activate (PsppireSelector *selector, gpointer data) { switch (selector->direction) { @@ -530,10 +551,21 @@ is_item_in_dest (GtkTreeModel *model, GtkTreeIter *iter, do { + int x; GValue value = {0}; + GValue int_value = {0}; gtk_tree_model_get_value (dest_model, &dest_iter, 0, &value); - if ( g_value_get_int (&value) == index) + g_value_init (&int_value, G_TYPE_INT); + + g_value_transform (&value, &int_value); + + x = g_value_get_int (&int_value); + + g_value_unset (&int_value); + g_value_unset (&value); + + if ( x == index ) return TRUE; } while (gtk_tree_model_iter_next (dest_model, &dest_iter)); @@ -673,13 +705,15 @@ set_tree_view_dest (PsppireSelector *selector, } -/* Callback for when the DEST GtkEntry is activated (Enter is pressed) */ -static void -on_entry_activate (GtkEntry *w, gpointer data) +/* Callback which causes the filter to be refiltered. + Called when the DEST GtkEntry is activated (Enter is pressed), or when it + looses focus. +*/ +static gboolean +refilter (PsppireSelector *selector) { - PsppireSelector * selector = data; - gtk_tree_model_filter_refilter (selector->filtered_source); + return FALSE; } /* Callback for when the DEST GtkEntry is selected (clicked) */ @@ -688,21 +722,59 @@ on_entry_dest_select (GtkWidget *widget, GdkEventFocus *event, gpointer data) { PsppireSelector * selector = data; + gtk_tree_selection_unselect_all (gtk_tree_view_get_selection (GTK_TREE_VIEW (selector->source))); set_direction (selector, PSPPIRE_SELECTOR_DEST_TO_SOURCE); return FALSE; } + + +/* Callback for when an item disappears from the source list. + By implication, this means that the item has been inserted into the + destination. + */ +static void +on_row_deleted (PsppireSelector *selector) +{ + g_signal_emit (selector, signals [SELECTED], 0); +} + +/* Callback for when a new item appears in the source list. + By implication, this means that an item has been deleted from the + destination. + */ +static void +on_row_inserted (PsppireSelector *selector) +{ + g_signal_emit (selector, signals [DE_SELECTED], 0); +} + + + /* Set DEST to be the destination GtkEntry widget */ static void set_entry_dest (PsppireSelector *selector, GtkEntry *dest) { - g_signal_connect (dest, "activate", G_CALLBACK (on_entry_activate), + g_signal_connect_swapped (dest, "activate", G_CALLBACK (refilter), + selector); + + g_signal_connect_swapped (dest, "changed", G_CALLBACK (refilter), selector); g_signal_connect (dest, "focus-in-event", G_CALLBACK (on_entry_dest_select), selector); + + g_signal_connect_swapped (dest, "focus-out-event", G_CALLBACK (refilter), + selector); + + + g_signal_connect_swapped (selector->filtered_source, "row-deleted", + G_CALLBACK (on_row_deleted), selector); + + g_signal_connect_swapped (selector->filtered_source, "row-inserted", + G_CALLBACK (on_row_inserted), selector); } @@ -713,7 +785,8 @@ psppire_selector_set_subjects (PsppireSelector *selector, GtkWidget *source, GtkWidget *dest, SelectItemsFunc *select_func, - FilterItemsFunc *filter_func ) + FilterItemsFunc *filter_func, + gpointer user_data) { g_assert(selector); @@ -721,6 +794,7 @@ psppire_selector_set_subjects (PsppireSelector *selector, selector->source = source; selector->dest = dest; + selector->select_user_data = user_data; if ( filter_func == NULL) { @@ -728,8 +802,6 @@ psppire_selector_set_subjects (PsppireSelector *selector, selector->filter = is_item_in_dest; } - g_signal_connect (selector, "clicked", G_CALLBACK (on_click), NULL); - if ( GTK_IS_TREE_VIEW (source)) set_tree_view_source (selector, GTK_TREE_VIEW (source) ); else @@ -737,7 +809,9 @@ psppire_selector_set_subjects (PsppireSelector *selector, g_assert ( GTK_IS_TREE_MODEL_FILTER (selector->filtered_source)); - if ( GTK_IS_TREE_VIEW (dest)) + if ( NULL == dest) + ; + else if ( GTK_IS_TREE_VIEW (dest)) set_tree_view_dest (selector, GTK_TREE_VIEW (dest)); else if ( GTK_IS_ENTRY (dest)) @@ -756,6 +830,14 @@ psppire_selector_set_subjects (PsppireSelector *selector, +void +psppire_selector_set_allow (PsppireSelector *selector , AllowSelectionFunc *allow) +{ + selector->allow_selection = allow; +} + + + GType psppire_selector_orientation_get_type (void) {