[gspell/wip/lang-choosers] language-choosers: add language-code property
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gspell/wip/lang-choosers] language-choosers: add language-code property
- Date: Sat, 16 Jan 2016 10:22:15 +0000 (UTC)
commit d836896b2d87d123b3a53608dd7b63b47afbfc60
Author: Sébastien Wilmet <swilmet gnome org>
Date: Thu Jan 14 15:32:04 2016 +0100
language-choosers: add language-code property
https://bugzilla.gnome.org/show_bug.cgi?id=758421
gspell/gspell-language-chooser-dialog.c | 68 ++++++++++++++++++++++--
gspell/gspell-language-chooser.c | 88 ++++++++++++++++++++++++++++++-
gspell/gspell-language-chooser.h | 19 +++++--
3 files changed, 163 insertions(+), 12 deletions(-)
---
diff --git a/gspell/gspell-language-chooser-dialog.c b/gspell/gspell-language-chooser-dialog.c
index 7189038..fe0308f 100644
--- a/gspell/gspell-language-chooser-dialog.c
+++ b/gspell/gspell-language-chooser-dialog.c
@@ -45,12 +45,14 @@ struct _GspellLanguageChooserDialogPrivate
{
GtkTreeView *treeview;
const GspellLanguage *language;
+ guint default_language : 1;
};
enum
{
PROP_0,
PROP_LANGUAGE,
+ PROP_LANGUAGE_CODE,
};
enum
@@ -94,7 +96,8 @@ scroll_to_selected (GtkTreeView *tree_view)
}
static const GspellLanguage *
-gspell_language_chooser_dialog_get_language (GspellLanguageChooser *chooser)
+gspell_language_chooser_dialog_get_language_full (GspellLanguageChooser *chooser,
+ gboolean *default_language)
{
GspellLanguageChooserDialog *dialog;
GspellLanguageChooserDialogPrivate *priv;
@@ -102,15 +105,21 @@ gspell_language_chooser_dialog_get_language (GspellLanguageChooser *chooser)
dialog = GSPELL_LANGUAGE_CHOOSER_DIALOG (chooser);
priv = gspell_language_chooser_dialog_get_instance_private (dialog);
+ if (default_language != NULL)
+ {
+ *default_language = priv->default_language;
+ }
+
return priv->language;
}
static void
gspell_language_chooser_dialog_set_language (GspellLanguageChooser *chooser,
- const GspellLanguage *language)
+ const GspellLanguage *language_param)
{
GspellLanguageChooserDialog *dialog;
GspellLanguageChooserDialogPrivate *priv;
+ const GspellLanguage *language;
GtkTreeSelection *selection;
GtkTreeModel *model;
GtkTreeIter iter;
@@ -118,6 +127,8 @@ gspell_language_chooser_dialog_set_language (GspellLanguageChooser *chooser,
dialog = GSPELL_LANGUAGE_CHOOSER_DIALOG (chooser);
priv = gspell_language_chooser_dialog_get_instance_private (dialog);
+ language = language_param;
+
if (language == NULL)
{
language = gspell_language_get_default ();
@@ -135,6 +146,12 @@ gspell_language_chooser_dialog_set_language (GspellLanguageChooser *chooser,
g_object_notify (G_OBJECT (dialog), "language");
}
+ if (!priv->default_language)
+ {
+ priv->default_language = TRUE;
+ g_object_notify (G_OBJECT (dialog), "language-code");
+ }
+
return;
}
@@ -155,6 +172,9 @@ gspell_language_chooser_dialog_set_language (GspellLanguageChooser *chooser,
if (language == cur_lang)
{
+ gboolean default_language;
+ gboolean notify_language_code = FALSE;
+
gtk_tree_selection_select_iter (selection, &iter);
scroll_to_selected (priv->treeview);
@@ -162,6 +182,20 @@ gspell_language_chooser_dialog_set_language (GspellLanguageChooser *chooser,
{
priv->language = language;
g_object_notify (G_OBJECT (dialog), "language");
+ notify_language_code = TRUE;
+ }
+
+ default_language = language_param == NULL;
+
+ if (priv->default_language != default_language)
+ {
+ priv->default_language = default_language;
+ notify_language_code = TRUE;
+ }
+
+ if (notify_language_code)
+ {
+ g_object_notify (G_OBJECT (dialog), "language-code");
}
return;
@@ -176,7 +210,7 @@ warning:
static void
gspell_language_chooser_dialog_iface_init (GspellLanguageChooserInterface *iface)
{
- iface->get_language = gspell_language_chooser_dialog_get_language;
+ iface->get_language_full = gspell_language_chooser_dialog_get_language_full;
iface->set_language = gspell_language_chooser_dialog_set_language;
}
@@ -191,7 +225,11 @@ gspell_language_chooser_dialog_get_property (GObject *object,
switch (prop_id)
{
case PROP_LANGUAGE:
- g_value_set_boxed (value, gspell_language_chooser_dialog_get_language (chooser));
+ g_value_set_boxed (value, gspell_language_chooser_get_language (chooser));
+ break;
+
+ case PROP_LANGUAGE_CODE:
+ g_value_set_string (value, gspell_language_chooser_get_language_code (chooser));
break;
default:
@@ -211,7 +249,11 @@ gspell_language_chooser_dialog_set_property (GObject *object,
switch (prop_id)
{
case PROP_LANGUAGE:
- gspell_language_chooser_dialog_set_language (chooser, g_value_get_boxed (value));
+ gspell_language_chooser_set_language (chooser, g_value_get_boxed (value));
+ break;
+
+ case PROP_LANGUAGE_CODE:
+ gspell_language_chooser_set_language_code (chooser, g_value_get_string (value));
break;
default:
@@ -251,6 +293,7 @@ dialog_response_cb (GtkDialog *gtk_dialog,
GtkTreeModel *model;
GtkTreeIter iter;
const GspellLanguage *lang;
+ gboolean notify_language_code = FALSE;
if (response != GTK_RESPONSE_OK)
{
@@ -275,6 +318,18 @@ dialog_response_cb (GtkDialog *gtk_dialog,
{
priv->language = lang;
g_object_notify (G_OBJECT (dialog), "language");
+ notify_language_code = TRUE;
+ }
+
+ if (priv->default_language)
+ {
+ priv->default_language = FALSE;
+ notify_language_code = TRUE;
+ }
+
+ if (notify_language_code)
+ {
+ g_object_notify (G_OBJECT (dialog), "language-code");
}
}
@@ -289,6 +344,7 @@ gspell_language_chooser_dialog_class_init (GspellLanguageChooserDialogClass *kla
object_class->constructed = gspell_language_chooser_dialog_constructed;
g_object_class_override_property (object_class, PROP_LANGUAGE, "language");
+ g_object_class_override_property (object_class, PROP_LANGUAGE_CODE, "language-code");
/* Bind class to template */
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/gspell/language-dialog.ui");
@@ -345,6 +401,8 @@ gspell_language_chooser_dialog_init (GspellLanguageChooserDialog *dialog)
priv = gspell_language_chooser_dialog_get_instance_private (dialog);
+ priv->default_language = TRUE;
+
gtk_widget_init_template (GTK_WIDGET (dialog));
store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, GSPELL_TYPE_LANGUAGE);
diff --git a/gspell/gspell-language-chooser.c b/gspell/gspell-language-chooser.c
index eeaf3ee..8676810 100644
--- a/gspell/gspell-language-chooser.c
+++ b/gspell/gspell-language-chooser.c
@@ -27,6 +27,28 @@
*
* #GspellLanguageChooser is an interface that is implemented by widgets for
* choosing a #GspellLanguage.
+ *
+ * There are two properties: #GspellLanguageChooser:language and
+ * #GspellLanguageChooser:language-code. They are kept in sync. The former is
+ * useful to, for example, bind it to the #GspellChecker's language property
+ * with g_object_bind_property(). The latter is useful to bind it to a
+ * #GSettings key with g_settings_bind().
+ *
+ * When setting the language, %NULL or the empty string can be passed to pick
+ * the default language. In that case, the #GspellLanguageChooser:language-code
+ * property will contain the empty string, whereas the
+ * #GspellLanguageChooser:language property will contain the actual
+ * #GspellLanguage as returned by gspell_language_get_default(). If the user
+ * launches the #GspellLanguageChooser and chooses explicitly a language, then
+ * the #GspellLanguageChooser:language-code property will no longer be empty,
+ * even if it is the same language as the default language.
+ *
+ * Note that if an explicit language (non-%NULL or not the empty string) is set
+ * to the #GspellLanguageChooser, then the #GspellLanguageChooser:language-code
+ * property will not be empty, it will contain the language code of the passed
+ * language, even if the language is the same as the default language.
+ *
+ * Thus, a good default value for a #GSettings key is the empty string.
*/
G_DEFINE_INTERFACE (GspellLanguageChooser, gspell_language_chooser, G_TYPE_OBJECT)
@@ -46,20 +68,36 @@ gspell_language_chooser_default_init (GspellLanguageChooserInterface *interface)
GSPELL_TYPE_LANGUAGE,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GspellLanguageChooser:language-code:
+ *
+ * The empty string if the default language was set and the selection
+ * hasn't changed. Or the language code if an explicit language was set
+ * or if the selection has changed.
+ */
+ g_object_interface_install_property (interface,
+ g_param_spec_string ("language-code",
+ "Language Code",
+ "",
+ "",
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
}
/**
* gspell_language_chooser_get_language:
* @chooser: a #GspellLanguageChooser.
*
- * Returns: (nullable): the selected #GspellLanguage.
+ * Returns: (nullable): the selected #GspellLanguage, or %NULL if no
+ * dictionaries are available.
*/
const GspellLanguage *
gspell_language_chooser_get_language (GspellLanguageChooser *chooser)
{
g_return_val_if_fail (GSPELL_IS_LANGUAGE_CHOOSER (chooser), NULL);
- return GSPELL_LANGUAGE_CHOOSER_GET_IFACE (chooser)->get_language (chooser);
+ return GSPELL_LANGUAGE_CHOOSER_GET_IFACE (chooser)->get_language_full (chooser, NULL);
}
/**
@@ -79,4 +117,50 @@ gspell_language_chooser_set_language (GspellLanguageChooser *chooser,
GSPELL_LANGUAGE_CHOOSER_GET_IFACE (chooser)->set_language (chooser, language);
}
+/**
+ * gspell_language_chooser_get_language_code:
+ * @chooser: a #GspellLanguageChooser.
+ *
+ * Returns: the #GspellLanguageChooser:language-code. It cannot be %NULL.
+ */
+const gchar *
+gspell_language_chooser_get_language_code (GspellLanguageChooser *chooser)
+{
+ const GspellLanguage *lang;
+ gboolean default_lang = TRUE;
+
+ g_return_val_if_fail (GSPELL_IS_LANGUAGE_CHOOSER (chooser), "");
+
+ lang = GSPELL_LANGUAGE_CHOOSER_GET_IFACE (chooser)->get_language_full (chooser, &default_lang);
+
+ if (default_lang || lang == NULL)
+ {
+ return "";
+ }
+
+ return gspell_language_get_code (lang);
+}
+
+/**
+ * gspell_language_chooser_set_language_code:
+ * @chooser: a #GspellLanguageChooser.
+ * @language_code: (nullable): a language code, or the empty string or %NULL to
+ * pick the default language.
+ */
+void
+gspell_language_chooser_set_language_code (GspellLanguageChooser *chooser,
+ const gchar *language_code)
+{
+ const GspellLanguage *lang = NULL;
+
+ g_return_if_fail (GSPELL_IS_LANGUAGE_CHOOSER (chooser));
+
+ if (language_code != NULL && language_code[0] != '\0')
+ {
+ lang = gspell_language_lookup (language_code);
+ }
+
+ GSPELL_LANGUAGE_CHOOSER_GET_IFACE (chooser)->set_language (chooser, lang);
+}
+
/* ex:set ts=8 noet: */
diff --git a/gspell/gspell-language-chooser.h b/gspell/gspell-language-chooser.h
index 8ce0565..2ddedf2 100644
--- a/gspell/gspell-language-chooser.h
+++ b/gspell/gspell-language-chooser.h
@@ -38,18 +38,27 @@ struct _GspellLanguageChooserInterface
{
GTypeInterface parent_interface;
- const GspellLanguage * (* get_language) (GspellLanguageChooser *chooser);
+ /* The return value is the same as get_language(), but there is the
+ * (optional) out parameter @default_language in addition.
+ */
+ const GspellLanguage * (* get_language_full) (GspellLanguageChooser *chooser,
+ gboolean *default_language);
void (* set_language) (GspellLanguageChooser *chooser,
const GspellLanguage *language);
- gpointer padding[8];
+ gpointer padding[12];
};
-const GspellLanguage * gspell_language_chooser_get_language (GspellLanguageChooser *chooser);
+const GspellLanguage * gspell_language_chooser_get_language (GspellLanguageChooser *chooser);
-void gspell_language_chooser_set_language (GspellLanguageChooser *chooser,
- const GspellLanguage *language);
+void gspell_language_chooser_set_language (GspellLanguageChooser *chooser,
+ const GspellLanguage *language);
+
+const gchar * gspell_language_chooser_get_language_code (GspellLanguageChooser *chooser);
+
+void gspell_language_chooser_set_language_code (GspellLanguageChooser *chooser,
+ const gchar
*language_code);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]