From: John Darrington Date: Sat, 30 Jul 2011 12:01:29 +0000 (+0200) Subject: Added use-underline and mnemonic-widget properties to PsppireScanf X-Git-Tag: v0.7.9~176 X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d98577661abddfdb5576b2aea7826bc050f1bb6d;p=pspp-builds.git Added use-underline and mnemonic-widget properties to PsppireScanf --- diff --git a/src/ui/gui/psppire-scanf.c b/src/ui/gui/psppire-scanf.c index 2573c2e3..2396245a 100644 --- a/src/ui/gui/psppire-scanf.c +++ b/src/ui/gui/psppire-scanf.c @@ -12,7 +12,8 @@ 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 . */ + along with this program. If not, see . +*/ #include #include @@ -25,8 +26,6 @@ #include "xalloc.h" - - static void psppire_scanf_class_init (PsppireScanfClass *class); static void psppire_scanf_init (PsppireScanf *w); @@ -37,7 +36,9 @@ enum { PROP_0, PROP_FORMAT, - PROP_NCONV + PROP_NCONV, + PROP_USE_UNDERLINE, + PROP_MNEMONIC_WIDGET }; /* Create a GtkLabel and pack it into BOX. @@ -47,7 +48,7 @@ enum After this function returns, *S points to the first unused character. */ static void -ship_label (GtkBox *box, const char **s, +ship_label (PsppireScanf *box, const char **s, const char_directives *dirs, size_t dir_idx) { GtkWidget *label ; @@ -77,7 +78,7 @@ ship_label (GtkBox *box, const char **s, g_string_free (str, TRUE); - gtk_box_pack_start (box, label, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0); gtk_widget_show (label); } @@ -113,7 +114,7 @@ guts (PsppireScanf *scanf) width = strtol (dir.width_start, (char **) &dir.width_end, 10); if ( dir.dir_start > s ) - ship_label (GTK_BOX (scanf), &s, &scanf->d, i); + ship_label (scanf, &s, &scanf->d, i); if ( dir.conversion == '%') { @@ -142,11 +143,38 @@ guts (PsppireScanf *scanf) } if ( s && *s ) - ship_label (GTK_BOX (scanf), &s, NULL, 0); + ship_label (scanf, &s, NULL, 0); } +static void +set_mnemonic (PsppireScanf *scanf) +{ + if (scanf->use_underline || scanf->mnemonic_widget) + { + GList *l = gtk_container_get_children (GTK_CONTAINER (scanf)); + while (l) + { + if ( GTK_IS_LABEL (l->data)) + { + const gchar *t = gtk_label_get_label (l->data); + if ( g_strstr_len (t, -1, "_")) + { + g_object_set (l->data, + "use-underline", TRUE, + "mnemonic-widget", scanf->mnemonic_widget, + NULL); + + break; + } + } + l = l->next; + } + g_list_free (l); + } +} + static void psppire_scanf_set_property (GObject *object, guint prop_id, @@ -161,6 +189,14 @@ psppire_scanf_set_property (GObject *object, scanf->format = g_value_get_string (value); guts (scanf); break; + case PROP_MNEMONIC_WIDGET: + scanf->mnemonic_widget = g_value_get_object (value); + set_mnemonic (scanf); + break; + case PROP_USE_UNDERLINE: + scanf->use_underline = g_value_get_boolean (value); + set_mnemonic (scanf); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -184,6 +220,12 @@ psppire_scanf_get_property (GObject *object, case PROP_NCONV: g_value_set_int (value, scanf->d.count); break; + case PROP_USE_UNDERLINE: + g_value_set_boolean (value, scanf->use_underline); + break; + case PROP_MNEMONIC_WIDGET: + g_value_set_object (value, scanf->mnemonic_widget); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -243,6 +285,22 @@ psppire_scanf_class_init (PsppireScanfClass *class) G_PARAM_READABLE); + GParamSpec *use_underline_spec = + g_param_spec_boolean ("use-underline", + "Use Underline", + "If set, an underline in the text indicates the next character should be used for the mnemonic accelerator key", + FALSE, + G_PARAM_READWRITE); + + + GParamSpec *mnemonic_widget_spec = + g_param_spec_object ("mnemonic-widget", + "Mnemonic widget", + "The widget which is to be activated when the Scanf's mnemonic key is pressed. Has no effect if use-underline is false.", + GTK_TYPE_WIDGET, + G_PARAM_READWRITE); + + parent_class = g_type_class_peek_parent (class); object_class->dispose = psppire_scanf_dispose; @@ -259,6 +317,13 @@ psppire_scanf_class_init (PsppireScanfClass *class) PROP_FORMAT, format_spec); + g_object_class_install_property (object_class, + PROP_USE_UNDERLINE, + use_underline_spec); + + g_object_class_install_property (object_class, + PROP_MNEMONIC_WIDGET, + mnemonic_widget_spec); } diff --git a/src/ui/gui/psppire-scanf.h b/src/ui/gui/psppire-scanf.h index 4d22aafc..a2ef4791 100644 --- a/src/ui/gui/psppire-scanf.h +++ b/src/ui/gui/psppire-scanf.h @@ -47,6 +47,9 @@ struct _PsppireScanf GtkWidget **widgets; char_directives d; + gboolean use_underline; + GtkWidget *mnemonic_widget; + gboolean dispose_has_run; }; @@ -59,6 +62,8 @@ struct _PsppireScanfClass GType psppire_scanf_get_type (void); GtkWidget* psppire_scanf_new (const gchar *fmt, ...); +GtkWidget * psppire_scanf_get_child (PsppireScanf *w, gint n); + G_END_DECLS