From 4e3feede0f6b3d2e67d6e41a9ddea3738e574dc3 Mon Sep 17 00:00:00 2001 From: John Darrington Date: Wed, 2 Oct 2013 15:14:15 +0200 Subject: [PATCH] Replace checkbox-treeview functions with a object PsppireCheckboxTreeview Prior to this change there existed a function which operated on a GtkTreeView which populated it with a model and renderers such that it would display a list of annotated checkboxes. This change subclasses GtkTreeView and moves the function to a method of that class. I anticipate this will ease implementation of upcoming functionality. --- src/ui/gui/automake.mk | 4 +- src/ui/gui/checkbox-treeview.h | 43 ------ src/ui/gui/crosstabs.ui | 4 +- src/ui/gui/descriptives.ui | 2 +- src/ui/gui/frequencies.ui | 2 +- ...treeview.c => psppire-checkbox-treeview.c} | 127 +++++++++++------- src/ui/gui/psppire-checkbox-treeview.h | 88 ++++++++++++ src/ui/gui/psppire-dialog-action-crosstabs.c | 20 ++- src/ui/gui/psppire-dialog-action-crosstabs.h | 8 ++ .../gui/psppire-dialog-action-descriptives.c | 8 +- .../gui/psppire-dialog-action-frequencies.c | 4 +- src/ui/gui/psppire-dialog-action-regression.c | 10 +- src/ui/gui/regression.ui | 2 +- src/ui/gui/widgets.c | 2 + 14 files changed, 207 insertions(+), 117 deletions(-) delete mode 100644 src/ui/gui/checkbox-treeview.h rename src/ui/gui/{checkbox-treeview.c => psppire-checkbox-treeview.c} (54%) create mode 100644 src/ui/gui/psppire-checkbox-treeview.h diff --git a/src/ui/gui/automake.mk b/src/ui/gui/automake.mk index 47a3215835..f5bd07bee3 100644 --- a/src/ui/gui/automake.mk +++ b/src/ui/gui/automake.mk @@ -137,8 +137,6 @@ src_ui_gui_psppire_SOURCES = \ src/ui/gui/aggregate-dialog.h \ src/ui/gui/builder-wrapper.c \ src/ui/gui/builder-wrapper.h \ - src/ui/gui/checkbox-treeview.c \ - src/ui/gui/checkbox-treeview.h \ src/ui/gui/comments-dialog.c \ src/ui/gui/comments-dialog.h \ src/ui/gui/compute-dialog.c \ @@ -178,6 +176,8 @@ src_ui_gui_psppire_SOURCES = \ src/ui/gui/psppire.h \ src/ui/gui/psppire-acr.h \ src/ui/gui/psppire-buttonbox.h \ + src/ui/gui/psppire-checkbox-treeview.c \ + src/ui/gui/psppire-checkbox-treeview.h \ src/ui/gui/psppire-conf.c \ src/ui/gui/psppire-conf.h \ src/ui/gui/psppire-data-editor.c \ diff --git a/src/ui/gui/checkbox-treeview.h b/src/ui/gui/checkbox-treeview.h deleted file mode 100644 index 1616b7349e..0000000000 --- a/src/ui/gui/checkbox-treeview.h +++ /dev/null @@ -1,43 +0,0 @@ -/* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2007 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 - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - - -#ifndef __CHECKBOX_TREEVIEW_H__ -#define __CHECKBOX_TREEVIEW_H__ 1 - - -#include - -struct checkbox_entry_item - { - const char *name; - const char *label; - }; - -enum - { - CHECKBOX_COLUMN_LABEL, - CHECKBOX_COLUMN_SELECTED, - N_CHECKBOX_COLUMNS - }; - - -void put_checkbox_items_in_treeview (GtkTreeView *treeview, - guint default_items, - gint n_items, - const struct checkbox_entry_item *items - ); -#endif diff --git a/src/ui/gui/crosstabs.ui b/src/ui/gui/crosstabs.ui index 3e6ceb5634..ac864041db 100644 --- a/src/ui/gui/crosstabs.ui +++ b/src/ui/gui/crosstabs.ui @@ -355,7 +355,7 @@ automatic in - + True False @@ -415,7 +415,7 @@ automatic in - + 128 150 True diff --git a/src/ui/gui/descriptives.ui b/src/ui/gui/descriptives.ui index 70fef5df1a..a573cc1be3 100644 --- a/src/ui/gui/descriptives.ui +++ b/src/ui/gui/descriptives.ui @@ -141,7 +141,7 @@ automatic etched-in - + 200 True True diff --git a/src/ui/gui/frequencies.ui b/src/ui/gui/frequencies.ui index e0bb6c6e7f..a65e45f0b9 100644 --- a/src/ui/gui/frequencies.ui +++ b/src/ui/gui/frequencies.ui @@ -130,7 +130,7 @@ automatic etched-in - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK diff --git a/src/ui/gui/checkbox-treeview.c b/src/ui/gui/psppire-checkbox-treeview.c similarity index 54% rename from src/ui/gui/checkbox-treeview.c rename to src/ui/gui/psppire-checkbox-treeview.c index 324943ab84..9cf5030219 100644 --- a/src/ui/gui/checkbox-treeview.c +++ b/src/ui/gui/psppire-checkbox-treeview.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2007, 2012 Free Software Foundation + Copyright (C) 2007, 2012, 2013 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 @@ -14,20 +14,60 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include -#include "checkbox-treeview.h" +/* + This module provides a subclass of GtkTreeView, designed for dialogs + which need lists of annotated checkbox items. + The object contains the necessary model and renderers, which means that + the user does not have to create these herself. + */ + +#include #include +#include "psppire-checkbox-treeview.h" + + #include "gettext.h" #define _(msgid) gettext (msgid) #define N_(msgid) msgid +static void psppire_checkbox_treeview_init (PsppireCheckboxTreeview *cbtv); + +GType +psppire_checkbox_treeview_get_type (void) +{ + static GType psppire_checkbox_treeview_type = 0; + + if (!psppire_checkbox_treeview_type) + { + static const GTypeInfo psppire_checkbox_treeview_info = + { + sizeof (PsppireCheckboxTreeviewClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) NULL, + (GClassFinalizeFunc) NULL, + NULL, + sizeof (PsppireCheckboxTreeview), + 0, + (GInstanceInitFunc) psppire_checkbox_treeview_init, + }; + + psppire_checkbox_treeview_type = + g_type_register_static (GTK_TYPE_TREE_VIEW, "PsppireCheckboxTreeview", + &psppire_checkbox_treeview_info, 0); + } + + return psppire_checkbox_treeview_type; +} + + /* Callback for checkbox cells in the statistics tree view. Toggles the checkbox. */ static void -toggle (GtkCellRendererToggle *cell_renderer, gchar *path_str, gpointer data) +toggle (GtkCellRendererToggle *cell_renderer, const gchar *path_str, gpointer data) { GtkTreeView *tv = GTK_TREE_VIEW (data); GtkTreeModel *model = gtk_tree_view_get_model (tv); @@ -42,44 +82,13 @@ toggle (GtkCellRendererToggle *cell_renderer, gchar *path_str, gpointer data) gtk_tree_path_free (path); } - -static void -treeview_create_checkbox_model (GtkTreeView *treeview, - guint default_items, - gint n_items, - const struct checkbox_entry_item *items - ) -{ - GtkListStore *list; - size_t i; - - list = gtk_list_store_new (N_CHECKBOX_COLUMNS, - G_TYPE_STRING, G_TYPE_BOOLEAN); - - for (i = 0; i < n_items; i++) - { - GtkTreeIter iter; - gtk_list_store_append (list, &iter); - gtk_list_store_set (list, &iter, - CHECKBOX_COLUMN_LABEL, gettext (items[i].label), - CHECKBOX_COLUMN_SELECTED, - (default_items & (1u << i)) != 0, - -1); - } - - gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (list)); - g_object_unref (list); -} - +/* Create the necessary columns and renderers and add them to the widget */ static void treeview_checkbox_populate (GtkTreeView *treeview) { - GtkTreeViewColumn *col; - GtkCellRenderer *renderer; - /* Checkbox column. */ - col = gtk_tree_view_column_new (); - renderer = gtk_cell_renderer_toggle_new (); + GtkTreeViewColumn *col = gtk_tree_view_column_new (); + GtkCellRenderer *renderer = gtk_cell_renderer_toggle_new (); gtk_tree_view_column_pack_start (col, renderer, TRUE); @@ -105,14 +114,42 @@ treeview_checkbox_populate (GtkTreeView *treeview) gtk_tree_view_append_column (treeview, col); } +static void +psppire_checkbox_treeview_init (PsppireCheckboxTreeview *cbtv) +{ + cbtv->list = GTK_TREE_MODEL (gtk_list_store_new (N_CHECKBOX_COLUMNS, + G_TYPE_STRING, + G_TYPE_BOOLEAN)); + + gtk_tree_view_set_model (GTK_TREE_VIEW (cbtv), cbtv->list); + g_object_unref (cbtv->list); + treeview_checkbox_populate (GTK_TREE_VIEW (cbtv)); +} + + +/* + Load the object's model from the array ITEMS. + N_ITEMS is the size of the array. + DEFAULT_ITEMS is a bitwise field indicating the initial state + of the items. +*/ void -put_checkbox_items_in_treeview (GtkTreeView *treeview, - guint default_items, - gint n_items, - const struct checkbox_entry_item *items - ) +psppire_checkbox_treeview_populate (PsppireCheckboxTreeview *cbtv, + guint default_items, + gint n_items, + const struct checkbox_entry_item *items) { - treeview_create_checkbox_model (treeview, default_items, n_items, items); - treeview_checkbox_populate (treeview); + size_t i; + for (i = 0; i < n_items; ++i) + { + GtkTreeIter iter; + gtk_list_store_append (GTK_LIST_STORE (cbtv->list), &iter); + gtk_list_store_set (GTK_LIST_STORE (cbtv->list), &iter, + CHECKBOX_COLUMN_LABEL, gettext (items[i].label), + CHECKBOX_COLUMN_SELECTED, + (default_items & (1u << i)) != 0, + -1); + } + } diff --git a/src/ui/gui/psppire-checkbox-treeview.h b/src/ui/gui/psppire-checkbox-treeview.h new file mode 100644 index 0000000000..b61cfdcc3c --- /dev/null +++ b/src/ui/gui/psppire-checkbox-treeview.h @@ -0,0 +1,88 @@ +/* PSPPIRE - a graphical user interface for PSPP. + Copyright (C) 2007, 2013 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + +#ifndef __PSPPIRE_CHECKBOX_TREEVIEW_H__ +#define __PSPPIRE_CHECKBOX_TREEVIEW_H__ + + +#include +#include +#include + +G_BEGIN_DECLS + + +#define PSPPIRE_TYPE_CHECKBOX_TREEVIEW (psppire_checkbox_treeview_get_type ()) + +#define PSPPIRE_CHECKBOX_TREEVIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + PSPPIRE_TYPE_CHECKBOX_TREEVIEW, PsppireCheckboxTreeview)) + +#define PSPPIRE_CHECKBOX_TREEVIEW_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + PSPPIRE_TYPE_CHECKBOX_TREEVIEW, PsppireCheckboxTreeviewClass)) + +#define PSPPIRE_IS_CHECKBOX_TREEVIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ + PSPPIRE_TYPE_CHECKBOX_TREEVIEW)) + +#define PSPPIRE_IS_CHECKBOX_TREEVIEW_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + PSPPIRE_TYPE_CHECKBOX_TREEVIEW)) + + +typedef struct _PsppireCheckboxTreeview PsppireCheckboxTreeview; +typedef struct _PsppireCheckboxTreeviewClass PsppireCheckboxTreeviewClass; + + +struct _PsppireCheckboxTreeview +{ + GtkTreeView parent; + + /* */ + GtkTreeModel *list; +}; + + +struct _PsppireCheckboxTreeviewClass +{ + GtkTreeViewClass parent_class; +}; + + + +GType psppire_checkbox_treeview_get_type (void); +GType psppire_checkbox_treeview_model_get_type (void); + + +struct checkbox_entry_item + { + const char *name; + const char *label; + }; + +enum + { + CHECKBOX_COLUMN_LABEL, + CHECKBOX_COLUMN_SELECTED, + N_CHECKBOX_COLUMNS + }; + +void psppire_checkbox_treeview_populate (PsppireCheckboxTreeview *pctv, + guint default_items, + gint n_items, + const struct checkbox_entry_item *items); + +G_END_DECLS + +#endif /* __PSPPIRE_CHECKBOX_TREEVIEW_H__ */ diff --git a/src/ui/gui/psppire-dialog-action-crosstabs.c b/src/ui/gui/psppire-dialog-action-crosstabs.c index 2bc07c6e4c..b0b08b5ce6 100644 --- a/src/ui/gui/psppire-dialog-action-crosstabs.c +++ b/src/ui/gui/psppire-dialog-action-crosstabs.c @@ -27,7 +27,7 @@ #include "psppire-dialog.h" #include "builder-wrapper.h" -#include "checkbox-treeview.h" +#include "psppire-checkbox-treeview.h" #include "psppire-dict.h" #include "libpspp/str.h" @@ -235,19 +235,17 @@ psppire_dialog_action_crosstabs_activate (GtkAction *a) act->format_options_table = TRUE; act->format_options_pivot = TRUE; - put_checkbox_items_in_treeview (GTK_TREE_VIEW (act->cell_view), - B_CS_CELL_DEFAULT, - N_CROSSTABS_CELLS, - cells - ); + psppire_checkbox_treeview_populate (PSPPIRE_CHECKBOX_TREEVIEW (act->cell_view), + B_CS_CELL_DEFAULT, + N_CROSSTABS_CELLS, + cells); act->cell = gtk_tree_view_get_model (GTK_TREE_VIEW (act->cell_view)); - put_checkbox_items_in_treeview (GTK_TREE_VIEW (act->stat_view), - B_CS_STATS_DEFAULT, - N_CROSSTABS_STATS, - stats - ); + psppire_checkbox_treeview_populate (PSPPIRE_CHECKBOX_TREEVIEW (act->stat_view), + B_CS_STATS_DEFAULT, + N_CROSSTABS_STATS, + stats); act->stat = gtk_tree_view_get_model (GTK_TREE_VIEW (act->stat_view)); diff --git a/src/ui/gui/psppire-dialog-action-crosstabs.h b/src/ui/gui/psppire-dialog-action-crosstabs.h index ee8169aece..a286e0f828 100644 --- a/src/ui/gui/psppire-dialog-action-crosstabs.h +++ b/src/ui/gui/psppire-dialog-action-crosstabs.h @@ -20,6 +20,14 @@ #include "psppire-dialog-action.h" +/* + This module provides a subclass of GtkTreeView, designed for dialogs + which need lists of annotated checkbox items. + The object contains the necessary model and renderers, which means that + the user does not have to create these herself. + */ + + #ifndef __PSPPIRE_DIALOG_ACTION_CROSSTABS_H__ #define __PSPPIRE_DIALOG_ACTION_CROSSTABS_H__ diff --git a/src/ui/gui/psppire-dialog-action-descriptives.c b/src/ui/gui/psppire-dialog-action-descriptives.c index b83cea8067..4510917266 100644 --- a/src/ui/gui/psppire-dialog-action-descriptives.c +++ b/src/ui/gui/psppire-dialog-action-descriptives.c @@ -19,7 +19,7 @@ #include "psppire-dialog-action-descriptives.h" -#include "checkbox-treeview.h" +#include "psppire-checkbox-treeview.h" #include "psppire-var-view.h" #include "psppire-dict.h" @@ -209,9 +209,9 @@ psppire_dialog_action_descriptives_activate (GtkAction *a) g_object_set (pda->source, "model", pda->dict, "predicate", var_is_numeric, NULL); - put_checkbox_items_in_treeview (GTK_TREE_VIEW (stats_treeview), - B_DS_DEFAULT, - N_DESCRIPTIVE_STATS, stats); + psppire_checkbox_treeview_populate (PSPPIRE_CHECKBOX_TREEVIEW (stats_treeview), + B_DS_DEFAULT, + N_DESCRIPTIVE_STATS, stats); act->stat_vars = GTK_TREE_VIEW (act->variables); act->stats = gtk_tree_view_get_model (GTK_TREE_VIEW (stats_treeview)); diff --git a/src/ui/gui/psppire-dialog-action-frequencies.c b/src/ui/gui/psppire-dialog-action-frequencies.c index 6f8049009e..a5c5010a09 100644 --- a/src/ui/gui/psppire-dialog-action-frequencies.c +++ b/src/ui/gui/psppire-dialog-action-frequencies.c @@ -27,7 +27,7 @@ This program is free software: you can redistribute it and/or modify #include "psppire-dialog.h" #include "builder-wrapper.h" -#include "checkbox-treeview.h" +#include "psppire-checkbox-treeview.h" #include "psppire-dict.h" #include "libpspp/str.h" @@ -263,7 +263,7 @@ psppire_dialog_action_frequencies_activate (GtkAction * a) act->stat_vars = get_widget_assert (xml, "var-treeview"); - put_checkbox_items_in_treeview (GTK_TREE_VIEW (stats_treeview), + psppire_checkbox_treeview_populate (PSPPIRE_CHECKBOX_TREEVIEW (stats_treeview), B_FS_DEFAULT, N_FREQUENCY_STATS, stats); act->stats = gtk_tree_view_get_model (GTK_TREE_VIEW (stats_treeview)); diff --git a/src/ui/gui/psppire-dialog-action-regression.c b/src/ui/gui/psppire-dialog-action-regression.c index 29df2a4392..fe3d4418cf 100644 --- a/src/ui/gui/psppire-dialog-action-regression.c +++ b/src/ui/gui/psppire-dialog-action-regression.c @@ -27,7 +27,7 @@ #include "psppire-dialog.h" #include "builder-wrapper.h" -#include "checkbox-treeview.h" +#include "psppire-checkbox-treeview.h" #include "psppire-dict.h" #include "libpspp/str.h" @@ -162,10 +162,10 @@ psppire_dialog_action_regression_activate (GtkAction *a) g_object_unref (xml); - put_checkbox_items_in_treeview (GTK_TREE_VIEW (act->stat_view), - B_RG_STATS_DEFAULT, - N_REGRESSION_STATS, - stats); + psppire_checkbox_treeview_populate (PSPPIRE_CHECKBOX_TREEVIEW (act->stat_view), + B_RG_STATS_DEFAULT, + N_REGRESSION_STATS, + stats); psppire_dialog_action_set_refresh (pda, refresh); diff --git a/src/ui/gui/regression.ui b/src/ui/gui/regression.ui index e56c095c1d..d7a0675f4d 100644 --- a/src/ui/gui/regression.ui +++ b/src/ui/gui/regression.ui @@ -340,7 +340,7 @@ automatic etched-in - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK diff --git a/src/ui/gui/widgets.c b/src/ui/gui/widgets.c index 488656e9e6..7046df8c93 100644 --- a/src/ui/gui/widgets.c +++ b/src/ui/gui/widgets.c @@ -14,6 +14,7 @@ #include "psppire-dictview.h" #include "psppire-var-view.h" #include "psppire-val-chooser.h" +#include "psppire-checkbox-treeview.h" #include "psppire-dialog-action-binomial.h" #include "psppire-dialog-action-correlation.h" @@ -53,6 +54,7 @@ preregister_widgets (void) psppire_dict_view_get_type (); psppire_var_view_get_type (); psppire_value_entry_get_type (); + psppire_checkbox_treeview_get_type (); psppire_dialog_action_binomial_get_type (); psppire_dialog_action_correlation_get_type (); -- 2.30.2