X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-means-layer.c;h=e4fb17ac97688438815e5c53655cb29db8475d42;hb=6b55442545f78ac54922e1a5b080b87b2b65f28c;hp=a9b1139f18c6be631c82e73996c0baa0ffbdb747;hpb=d5f42de822479581dded51ade0d997c16404890f;p=pspp diff --git a/src/ui/gui/psppire-means-layer.c b/src/ui/gui/psppire-means-layer.c index a9b1139f18..e4fb17ac97 100644 --- a/src/ui/gui/psppire-means-layer.c +++ b/src/ui/gui/psppire-means-layer.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2012 Free Software Foundation + Copyright (C) 2012, 2014 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 @@ -17,7 +17,6 @@ #include #include "psppire-means-layer.h" -#include "psppire-selector.h" #include "psppire-var-view.h" #include @@ -30,7 +29,7 @@ static void psppire_means_layer_class_init (PsppireMeansLayerClass *class); static void psppire_means_layer_init (PsppireMeansLayer *window); -G_DEFINE_TYPE (PsppireMeansLayer, psppire_means_layer, GTK_TYPE_VBOX); +G_DEFINE_TYPE (PsppireMeansLayer, psppire_means_layer, GTK_TYPE_BOX); static GObjectClass *parent_class = NULL; @@ -62,8 +61,31 @@ psppire_means_layer_class_init (PsppireMeansLayerClass *class) object_class->dispose = psppire_means_layer_dispose; } + +static void +refresh_view (PsppireMeansLayer *ml) +{ + GtkTreeModel *tm; + g_return_if_fail (ml->current_layer >= 0); + tm = g_ptr_array_index (ml->layer, ml->current_layer); + gtk_tree_view_set_model (GTK_TREE_VIEW (ml->var_view), tm); +} + + static void -update (PsppireMeansLayer *ml) +add_new_layer (PsppireMeansLayer *ml) +{ + /* Add a model and take a reference to it */ + GtkTreeModel *tm = gtk_tree_view_get_model (GTK_TREE_VIEW (ml->var_view)); + g_ptr_array_add (ml->layer, tm); + g_signal_connect_swapped (tm, "row-inserted", G_CALLBACK (refresh_view), ml); + + g_object_ref (tm); +} + + +void +psppire_means_layer_update (PsppireMeansLayer *ml) { gchar *l; @@ -77,29 +99,34 @@ update (PsppireMeansLayer *ml) g_free (l); gtk_widget_set_sensitive (ml->back, ml->current_layer > 0); - gtk_widget_set_sensitive (ml->forward, - psppire_var_view_get_iter_first (PSPPIRE_VAR_VIEW (ml->var_view), - NULL)); + + { + GtkTreeIter dummy; + GtkTreeModel *tm = g_ptr_array_index (ml->layer, ml->current_layer); + + g_return_if_fail (GTK_IS_TREE_MODEL (tm)); + + gtk_widget_set_sensitive (ml->forward, + gtk_tree_model_get_iter_first (tm, &dummy)); + } } static void on_forward (PsppireMeansLayer *ml) { - ml->current_layer++; - if (ml->current_layer >= ml->n_layers) + if (ml->current_layer + 1 >= ml->n_layers) { - GtkTreeModel *tm; psppire_var_view_clear (PSPPIRE_VAR_VIEW (ml->var_view)); - tm = gtk_tree_view_get_model (GTK_TREE_VIEW (ml->var_view)); - g_ptr_array_add (ml->layer, tm); - g_object_ref (tm); - ml->n_layers = ml->current_layer + 1; + add_new_layer (ml); + ml->n_layers = ml->current_layer + 2; } else { - GtkTreeModel *tm = g_ptr_array_index (ml->layer, ml->current_layer); + GtkTreeModel *tm = g_ptr_array_index (ml->layer, ml->current_layer + 1); gtk_tree_view_set_model (GTK_TREE_VIEW (ml->var_view), tm); } + ml->current_layer++; + psppire_means_layer_update (ml); } static void @@ -111,22 +138,37 @@ on_back (PsppireMeansLayer *ml) tm = g_ptr_array_index (ml->layer, ml->current_layer); gtk_tree_view_set_model (GTK_TREE_VIEW (ml->var_view), tm); + + psppire_means_layer_update (ml); } +void +psppire_means_layer_clear (PsppireMeansLayer *ml) +{ + psppire_var_view_clear (PSPPIRE_VAR_VIEW (ml->var_view)); + + ml->n_layers = 1; + ml->current_layer = 0; + ml->layer = g_ptr_array_new_full (3, g_object_unref); + + add_new_layer (ml); + + psppire_means_layer_update (ml); +} static void psppire_means_layer_init (PsppireMeansLayer *ml) { - GtkWidget *hbox_upper = gtk_hbox_new (FALSE, 5); - GtkWidget *hbox_lower = gtk_hbox_new (FALSE, 5); - GtkWidget *alignment = gtk_alignment_new (0, 0.5, 0, 0); + GtkWidget *hbox_upper = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5); + GtkWidget *hbox_lower = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5); GtkWidget *sw = gtk_scrolled_window_new (NULL, NULL); + gtk_orientable_set_orientation (GTK_ORIENTABLE (ml), GTK_ORIENTATION_VERTICAL); + ml->dispose_has_run = FALSE; - ml->forward = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD); - ml->back = gtk_button_new_from_stock (GTK_STOCK_GO_BACK); + ml->forward = gtk_button_new_with_label (_("Forward")); + ml->back = gtk_button_new_with_label (_("Back")); ml->var_view = psppire_var_view_new (); - ml->selector = psppire_selector_new (); ml->label = gtk_label_new (""); g_signal_connect_swapped (ml->forward, "clicked", G_CALLBACK (on_forward), @@ -134,9 +176,6 @@ psppire_means_layer_init (PsppireMeansLayer *ml) g_signal_connect_swapped (ml->back, "clicked", G_CALLBACK (on_back), ml); - g_signal_connect_swapped (ml->selector, "selected", G_CALLBACK (update), ml); - g_signal_connect_swapped (ml->selector, "de-selected", G_CALLBACK (update), - ml); g_object_set (ml->var_view, "headers-visible", FALSE, NULL); g_object_set (sw, @@ -144,32 +183,19 @@ psppire_means_layer_init (PsppireMeansLayer *ml) "hscrollbar-policy", GTK_POLICY_AUTOMATIC, NULL); - g_object_set (ml->selector, "dest-widget", ml->var_view, NULL); - g_signal_connect_swapped (ml->var_view, "notify::model", G_CALLBACK (update), ml); + g_signal_connect_swapped (ml->var_view, "notify::model", G_CALLBACK (psppire_means_layer_update), ml); gtk_box_pack_start (GTK_BOX (hbox_upper), ml->back, FALSE, FALSE, 5); gtk_box_pack_start (GTK_BOX (hbox_upper), ml->label, TRUE, FALSE, 5); gtk_box_pack_start (GTK_BOX (hbox_upper), ml->forward, FALSE, FALSE, 5); - gtk_box_pack_start (GTK_BOX (hbox_lower), alignment, FALSE, FALSE, 5); - gtk_container_add (GTK_CONTAINER (alignment), ml->selector); gtk_box_pack_start (GTK_BOX (hbox_lower), sw, TRUE, TRUE, 5); gtk_container_add (GTK_CONTAINER (sw), ml->var_view); gtk_box_pack_start (GTK_BOX (ml), hbox_upper, FALSE, FALSE, 5); gtk_box_pack_start (GTK_BOX (ml), hbox_lower, TRUE, TRUE, 5); - - - ml->n_layers = 1; - ml->current_layer = 0; - ml->layer = g_ptr_array_new_full (3, g_object_unref); - - /* Add a model and take a reference to it */ - g_ptr_array_add (ml->layer, gtk_tree_view_get_model (GTK_TREE_VIEW (ml->var_view))); - g_object_ref (g_ptr_array_index (ml->layer, ml->current_layer)); - - update (ml); + psppire_means_layer_clear (ml); gtk_widget_show_all (hbox_upper); gtk_widget_show_all (hbox_lower); @@ -182,24 +208,18 @@ psppire_means_layer_new (void) } -void -psppire_means_layer_set_source (PsppireMeansLayer *ml, GtkWidget *w) -{ - g_object_set (ml->selector, "source-widget", w, NULL); -} -void -psppire_means_layer_clear (PsppireMeansLayer *ml) +GtkTreeModel * +psppire_means_layer_get_model_n (PsppireMeansLayer *ml, gint n) { - ml->n_layers = 1; - ml->current_layer = 0; - psppire_var_view_clear (PSPPIRE_VAR_VIEW (ml->var_view)); + return g_ptr_array_index (ml->layer, n); } GtkTreeModel * -psppire_means_layer_get_model_n (PsppireMeansLayer *ml, gint n) +psppire_means_layer_get_model (PsppireMeansLayer *ml) { - return g_ptr_array_index (ml->layer, n); + return g_ptr_array_index (ml->layer, ml->current_layer); } +