[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Minor(ish) changes to PsppireValueEntry
From: |
John Darrington |
Subject: |
Re: Minor(ish) changes to PsppireValueEntry |
Date: |
Tue, 24 Apr 2012 19:48:18 +0000 |
User-agent: |
Mutt/1.5.18 (2008-05-17) |
I pushed this set of changes, with the mods we discussed. If you think
anything else is needed,
please feel free to change it.
On Sun, Apr 22, 2012 at 07:55:18PM +0000, John Darrington wrote:
The attached patch makes some changes to PsppireValueEntry - a few bugs,
a few cleanups where I thought the code was hard to follow, and a few
improvements. Hopefully all self explanitary.
It also uses this widget in the state variable entry of the ROC dialog.
Comments before I push it?
--
PGP Public key ID: 1024D/2DE827B3
fingerprint = 8797 A26D 0854 2EAB 0285 A290 8A67 719C 2DE8 27B3
See http://keys.gnupg.net or any PGP keyserver for public key.
From 54bf8ec16d5a83679233eaf2f7f9e188db6fc41b Mon Sep 17 00:00:00 2001
From: John Darrington <address@hidden>
Date: Sun, 22 Apr 2012 21:45:22 +0200
Subject: [PATCH] Fixed some issues with the PsppireValueEntry and use it
in the ROC dialog.
---
src/ui/gui/psppire-dialog-action-roc.c | 81
+++++++++++++++++++++++---------
src/ui/gui/psppire-value-entry.c | 52 ++++++++++++++------
src/ui/gui/psppire-value-entry.h | 8 ++-
src/ui/gui/roc.ui | 4 +-
src/ui/gui/widgets.c | 2 +
5 files changed, 104 insertions(+), 43 deletions(-)
diff --git a/src/ui/gui/psppire-dialog-action-roc.c
b/src/ui/gui/psppire-dialog-action-roc.c
index fc0bb7b..babd4b3 100644
--- a/src/ui/gui/psppire-dialog-action-roc.c
+++ b/src/ui/gui/psppire-dialog-action-roc.c
@@ -18,6 +18,7 @@
#include <config.h>
#include "psppire-dialog-action-roc.h"
+#include "psppire-value-entry.h"
#include "dialog-common.h"
#include <ui/syntax-gen.h>
@@ -37,8 +38,12 @@ G_DEFINE_TYPE (PsppireDialogActionRoc,
psppire_dialog_action_roc, PSPPIRE_TYPE_D
static gboolean
dialog_state_valid (gpointer data)
{
+ int width;
+ gboolean result ;
+ union value val;
PsppireDialogActionRoc *rd = data;
- const gchar *text;
+ const gchar *var_name;
+ const struct variable *var;
GtkTreeModel *liststore =
gtk_tree_view_get_model (GTK_TREE_VIEW (rd->test_variables));
@@ -46,18 +51,24 @@ dialog_state_valid (gpointer data)
if (gtk_tree_model_iter_n_children (liststore, NULL) < 1)
return FALSE;
-
- text = gtk_entry_get_text (GTK_ENTRY (rd->state_variable));
- if ( 0 == strcmp ("", text))
- return FALSE;
+ var_name = gtk_entry_get_text (GTK_ENTRY (rd->state_variable));
+ var = psppire_dict_lookup_var (PSPPIRE_DIALOG_ACTION (rd)->dict,
var_name);
- text = gtk_entry_get_text (GTK_ENTRY (rd->state_value));
- if ( 0 == strcmp ("", text))
+ if ( var == NULL)
return FALSE;
+ width = var_get_width (var);
+ value_init (&val, width);
+
+ result = psppire_value_entry_get_value (PSPPIRE_VALUE_ENTRY
(rd->state_value), &val, width);
+
+ if (var_is_value_missing (var, &val, MV_SYSTEM))
+ result = FALSE;
+
+ value_destroy (&val, width);
- return TRUE;
+ return result;
}
static void
@@ -85,7 +96,7 @@ refresh (PsppireDialogAction *rd_)
gtk_list_store_clear (GTK_LIST_STORE (liststore));
gtk_entry_set_text (GTK_ENTRY (rd->state_variable), "");
- gtk_entry_set_text (GTK_ENTRY (rd->state_value), "");
+ psppire_value_entry_set_variable (PSPPIRE_VALUE_ENTRY
(rd->state_value), NULL);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rd->curve),
TRUE);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rd->reference),
FALSE);
@@ -94,6 +105,23 @@ refresh (PsppireDialogAction *rd_)
}
static void
+on_state_var_changed (GtkAction *a)
+{
+ PsppireDialogActionRoc *act = PSPPIRE_DIALOG_ACTION_ROC (a);
+ PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a);
+
+ const gchar *var_name = gtk_entry_get_text
(GTK_ENTRY(act->state_variable));
+
+ const struct variable *var =
+ psppire_dict_lookup_var (PSPPIRE_DIALOG_ACTION(act)->dict, var_name);
+
+ if ( var == NULL)
+ return;
+
+ psppire_value_entry_set_variable (PSPPIRE_VALUE_ENTRY
(act->state_value), var);
+}
+
+static void
psppire_dialog_action_roc_activate (GtkAction *a)
{
PsppireDialogActionRoc *act = PSPPIRE_DIALOG_ACTION_ROC (a);
@@ -102,7 +130,6 @@ psppire_dialog_action_roc_activate (GtkAction *a)
GtkBuilder *xml = builder_new ("roc.ui");
pda->dialog = get_widget_assert (xml, "roc-dialog");
pda->source = get_widget_assert (xml, "dict-view");
- pda->source = get_widget_assert (xml, "dict-view");
act->test_variables = get_widget_assert (xml, "psppire-var-view1");
act->state_variable = get_widget_assert (xml, "entry1");
@@ -113,6 +140,9 @@ psppire_dialog_action_roc_activate (GtkAction *a)
act->standard_error = get_widget_assert (xml, "standard-error");
act->coordinates = get_widget_assert (xml, "co-ordinates");
+ g_signal_connect_swapped (act->state_variable, "changed",
+ G_CALLBACK (on_state_var_changed), act);
+
g_object_unref (xml);
g_signal_connect (act->curve, "toggled",
@@ -145,23 +175,30 @@ generate_syntax (PsppireDialogAction *a)
g_string_append (string, " (");
{
- const gchar *value = gtk_entry_get_text (GTK_ENTRY (rd->state_value));
+ const struct variable *var =
+ psppire_dict_lookup_var (PSPPIRE_DIALOG_ACTION(rd)->dict, var_name);
+
+ union value val;
+ value_init (&val, var_get_width (var));
- const struct variable *var = psppire_dict_lookup_var
(PSPPIRE_DIALOG_ACTION(rd)->dict, var_name);
+ psppire_value_entry_get_value (PSPPIRE_VALUE_ENTRY (rd->state_value),
+ &val, var_get_width (var));
g_return_val_if_fail (var, NULL);
- if ( var_is_alpha (var))
- {
- struct string str;
- ds_init_empty (&str);
- syntax_gen_string (&str, ss_cstr (value));
- g_string_append (string, ds_cstr (&str));
- ds_destroy (&str);
- }
- else
- g_string_append (string, value);
+ {
+ struct string str;
+ ds_init_empty (&str);
+
+ syntax_gen_value (&str, &val, var_get_width (var),
+ var_get_print_format (var));
+
+ g_string_append (string, ds_cstr (&str));
+ ds_destroy (&str);
+ }
+ value_destroy (&val, var_get_width (var));
}
+
g_string_append (string, ")");
diff --git a/src/ui/gui/psppire-value-entry.c
b/src/ui/gui/psppire-value-entry.c
index 675df83..41a1dfa 100644
--- a/src/ui/gui/psppire-value-entry.c
+++ b/src/ui/gui/psppire-value-entry.c
@@ -241,10 +241,10 @@ psppire_value_entry_new (void)
static void
psppire_value_entry_refresh_model (PsppireValueEntry *obj)
{
- GtkWidget *entry = gtk_bin_get_child (GTK_BIN (obj));
+ GtkTreeModel *old_model;
GtkTreeModel *model;
- if (val_labs_count (obj->val_labs) > 0)
+ if (obj->val_labs && val_labs_count (obj->val_labs) > 0)
{
const struct val_lab **vls = val_labs_sorted (obj->val_labs);
size_t n_vls = val_labs_count (obj->val_labs);
@@ -269,10 +269,22 @@ psppire_value_entry_refresh_model (PsppireValueEntry
*obj)
}
else
model = NULL;
+
+ old_model = gtk_combo_box_get_model (GTK_COMBO_BOX (obj));
+
+ if (old_model != model)
+ {
+ GtkEntry *entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (obj)));
+ gtk_entry_set_text (entry, "");
+ }
+
+ if (old_model)
+ g_object_unref (old_model);
gtk_combo_box_set_model (GTK_COMBO_BOX (obj), model);
gtk_combo_box_entry_set_text_column (GTK_COMBO_BOX_ENTRY (obj),
COL_LABEL);
- gtk_widget_set_sensitive (entry, model != NULL);
+ gtk_combo_box_set_button_sensitivity (GTK_COMBO_BOX (obj), model !=
NULL
+ ? GTK_SENSITIVITY_ON :
GTK_SENSITIVITY_OFF);
}
void
@@ -310,24 +322,32 @@ void
psppire_value_entry_set_value_labels (PsppireValueEntry *obj,
const struct val_labs *val_labs)
{
- if (val_labs != NULL
- ? obj->val_labs == NULL || !val_labs_equal (obj->val_labs, val_labs)
- : obj->val_labs != NULL)
+ bool changed = (obj->val_labs != val_labs);
+
+ if (val_labs == NULL ||
+ (obj->val_labs != NULL && !val_labs_equal (obj->val_labs,
val_labs)))
{
- obj->cur_value = NULL;
+ obj->cur_value = NULL;
+ if (obj->val_labs)
+ {
+ val_labs_destroy (obj->val_labs);
+ obj->val_labs = NULL;
+ }
+ changed = true;
+ }
- val_labs_destroy (obj->val_labs);
+ if (val_labs != NULL)
+ {
+ int width = val_labs_get_width (val_labs);
obj->val_labs = val_labs_clone (val_labs);
- if (val_labs != NULL)
- {
- int width = val_labs_get_width (val_labs);
- if (width != fmt_var_width (&obj->format))
- obj->format = fmt_default_for_width (width);
- }
-
+ if (width != fmt_var_width (&obj->format))
+ obj->format = fmt_default_for_width (width);
+ }
+
+ if ( changed )
+ {
psppire_value_entry_refresh_model (obj);
-
g_object_notify (G_OBJECT (obj), "value-labels");
}
}
diff --git a/src/ui/gui/psppire-value-entry.h
b/src/ui/gui/psppire-value-entry.h
index 42821f3..d17d5ad 100644
--- a/src/ui/gui/psppire-value-entry.h
+++ b/src/ui/gui/psppire-value-entry.h
@@ -50,7 +50,8 @@ struct variable;
typedef struct _PsppireValueEntry PsppireValueEntry;
typedef struct _PsppireValueEntryClass PsppireValueEntryClass;
-struct _PsppireValueEntry {
+struct _PsppireValueEntry
+{
GtkComboBoxEntry parent;
gboolean show_value_label;
@@ -62,11 +63,12 @@ struct _PsppireValueEntry {
const union value *cur_value;
};
-struct _PsppireValueEntryClass {
+struct _PsppireValueEntryClass
+{
GtkComboBoxEntryClass parent_class;
};
-GType psppire_value_entry_get_type (void) G_GNUC_CONST;
+GType psppire_value_entry_get_type (void);
GtkWidget *psppire_value_entry_new (void);
void psppire_value_entry_set_show_value_label (PsppireValueEntry *,
diff --git a/src/ui/gui/roc.ui b/src/ui/gui/roc.ui
index 87f0c98..6b195b2 100644
--- a/src/ui/gui/roc.ui
+++ b/src/ui/gui/roc.ui
@@ -1,3 +1,4 @@
+
<?xml version="1.0"?>
<interface>
<requires lib="psppire" version="2054.17080"/>
@@ -180,10 +181,9 @@
</packing>
</child>
<child>
- <object class="GtkEntry" id="entry2">
+ <object class="PsppireValueEntry" id="entry2">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property
name="invisible_char">•</property>
</object>
<packing>
<property name="position">1</property>
diff --git a/src/ui/gui/widgets.c b/src/ui/gui/widgets.c
index ed8328a..8c64f52 100644
--- a/src/ui/gui/widgets.c
+++ b/src/ui/gui/widgets.c
@@ -23,6 +23,7 @@
#include "psppire-dialog-action-roc.h"
#include "psppire-dialog-action-sort.h"
#include "psppire-dialog-action-var-info.h"
+#include "psppire-value-entry.h"
/* Any custom widgets which are to be used in GtkBuilder ui files
@@ -40,6 +41,7 @@ preregister_widgets (void)
psppire_acr_get_type ();
psppire_dict_view_get_type ();
psppire_var_view_get_type ();
+ psppire_value_entry_get_type ();
psppire_dialog_action_correlation_get_type ();
psppire_dialog_action_descriptives_get_type ();
--
1.7.2.5
--
PGP Public key ID: 1024D/2DE827B3
fingerprint = 8797 A26D 0854 2EAB 0285 A290 8A67 719C 2DE8 27B3
See http://keys.gnupg.net or any PGP keyserver for public key.
signature.asc
Description: Digital signature
- Re: Minor(ish) changes to PsppireValueEntry, (continued)
- Re: Minor(ish) changes to PsppireValueEntry, Ben Pfaff, 2012/04/24
- Re: Minor(ish) changes to PsppireValueEntry, Ben Pfaff, 2012/04/24
- Re: Minor(ish) changes to PsppireValueEntry, John Darrington, 2012/04/24
- Re: Minor(ish) changes to PsppireValueEntry, Ben Pfaff, 2012/04/24
- Re: Minor(ish) changes to PsppireValueEntry, Ben Pfaff, 2012/04/24
- Re: Minor(ish) changes to PsppireValueEntry, Ben Pfaff, 2012/04/24
- Re: Minor(ish) changes to PsppireValueEntry, Ben Pfaff, 2012/04/24
Re: Minor(ish) changes to PsppireValueEntry,
John Darrington <=