X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-means-layer.c;h=8046b00765e2a42d6371fa1a96f71bf462c80820;hb=9021515cfa1489f9cd37e7440807bdd1d40de37a;hp=24178b8a35c4b52fac0b78e2b8b29e1d7e62e34c;hpb=2b4fb7e846d62f1a70656bb42a0f769363ed0832;p=pspp diff --git a/src/ui/gui/psppire-means-layer.c b/src/ui/gui/psppire-means-layer.c index 24178b8a35..8046b00765 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 @@ -32,52 +31,130 @@ static void psppire_means_layer_init (PsppireMeansLayer *window); G_DEFINE_TYPE (PsppireMeansLayer, psppire_means_layer, GTK_TYPE_VBOX); +static GObjectClass *parent_class = NULL; + +static void +psppire_means_layer_dispose (GObject *obj) +{ + PsppireMeansLayer *w = (PsppireMeansLayer *)obj; + + if (w->dispose_has_run) + return; + + /* Make sure dispose does not run twice. */ + w->dispose_has_run = TRUE; + + g_ptr_array_unref (w->layer); + + /* Chain up to the parent class */ + G_OBJECT_CLASS (parent_class)->dispose (obj); +} + static void psppire_means_layer_class_init (PsppireMeansLayerClass *class) { - // GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); + GObjectClass *object_class = G_OBJECT_CLASS (class); + parent_class = g_type_class_peek_parent (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 = g_strdup_printf (_("Layer %d of %d"), + gchar *l; + + if (!gtk_widget_get_realized (GTK_WIDGET (ml))) + return; + + l = g_strdup_printf (_("Layer %d of %d"), ml->current_layer + 1, ml->n_layers); gtk_label_set_text (GTK_LABEL (ml->label), l); g_free (l); - psppire_var_view_set_current_model (PSPPIRE_VAR_VIEW (ml->var_view), - ml->current_layer); - 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) { - ml->n_layers = ml->current_layer + 1; - psppire_var_view_push_model (PSPPIRE_VAR_VIEW (ml->var_view)); + psppire_var_view_clear (PSPPIRE_VAR_VIEW (ml->var_view)); + add_new_layer (ml); + ml->n_layers = ml->current_layer + 2; } - - update (ml); + else + { + 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 on_back (PsppireMeansLayer *ml) { + GtkTreeModel *tm; g_return_if_fail (ml->current_layer > 0); ml->current_layer--; - update (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) @@ -87,10 +164,10 @@ psppire_means_layer_init (PsppireMeansLayer *ml) GtkWidget *alignment = gtk_alignment_new (0, 0.5, 0, 0); GtkWidget *sw = gtk_scrolled_window_new (NULL, NULL); + 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->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), @@ -98,9 +175,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, @@ -108,23 +182,20 @@ 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 (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; - update (ml); + psppire_means_layer_clear (ml); gtk_widget_show_all (hbox_upper); gtk_widget_show_all (hbox_lower); @@ -137,18 +208,18 @@ psppire_means_layer_new (void) } -void -psppire_means_layer_set_source (PsppireMeansLayer *ml, GtkWidget *w) + + +GtkTreeModel * +psppire_means_layer_get_model_n (PsppireMeansLayer *ml, gint n) { - g_object_set (ml->selector, "source-widget", w, NULL); + return g_ptr_array_index (ml->layer, n); } -void -psppire_means_layer_clear (PsppireMeansLayer *ml) +GtkTreeModel * +psppire_means_layer_get_model (PsppireMeansLayer *ml) { - psppire_var_view_clear (PSPPIRE_VAR_VIEW (ml->var_view)); - ml->n_layers = 1; - ml->current_layer = 0; - update (ml); + return g_ptr_array_index (ml->layer, ml->current_layer); } +