mirror of https://github.com/GNOME/gimp.git
Add functions to get the ISO 639-1 language code from GimpLanguageEntry
and to set the language using this code.
This commit is contained in:
parent
bf8885f637
commit
5febc2e417
|
@ -20,6 +20,8 @@
|
|||
|
||||
#include "config.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "widgets-types.h"
|
||||
|
@ -34,6 +36,14 @@ enum
|
|||
PROP_MODEL
|
||||
};
|
||||
|
||||
struct _GimpLanguageEntry
|
||||
{
|
||||
GtkEntry parent_instance;
|
||||
|
||||
GtkListStore *store;
|
||||
gchar *code; /* ISO 639-1 language code */
|
||||
};
|
||||
|
||||
|
||||
static GObject * gimp_language_entry_constructor (GType type,
|
||||
guint n_params,
|
||||
|
@ -49,6 +59,11 @@ static void gimp_language_entry_get_property (GObject *object,
|
|||
GValue *value,
|
||||
GParamSpec *pspec);
|
||||
|
||||
static gboolean gimp_language_entry_language_selected (GtkEntryCompletion *completion,
|
||||
GtkTreeModel *model,
|
||||
GtkTreeIter *iter,
|
||||
GimpLanguageEntry *entry);
|
||||
|
||||
|
||||
G_DEFINE_TYPE (GimpLanguageEntry, gimp_language_entry, GTK_TYPE_ENTRY)
|
||||
|
||||
|
@ -98,13 +113,17 @@ gimp_language_entry_constructor (GType type,
|
|||
NULL);
|
||||
|
||||
/* Note that we must use this function to set the text column,
|
||||
* otherwise we won't get a cell renderer for free
|
||||
* otherwise we won't get a cell renderer for free.
|
||||
*/
|
||||
gtk_entry_completion_set_text_column (completion,
|
||||
GIMP_LANGUAGE_STORE_LANGUAGE);
|
||||
|
||||
gtk_entry_set_completion (GTK_ENTRY (entry), completion);
|
||||
g_object_unref (completion);
|
||||
|
||||
g_signal_connect (completion, "match-selected",
|
||||
G_CALLBACK (gimp_language_entry_language_selected),
|
||||
entry);
|
||||
}
|
||||
|
||||
return object;
|
||||
|
@ -121,6 +140,12 @@ gimp_language_entry_finalize (GObject *object)
|
|||
entry->store = NULL;
|
||||
}
|
||||
|
||||
if (entry->code)
|
||||
{
|
||||
g_free (entry->code);
|
||||
entry->code = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
|
@ -166,6 +191,21 @@ gimp_language_entry_get_property (GObject *object,
|
|||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gimp_language_entry_language_selected (GtkEntryCompletion *completion,
|
||||
GtkTreeModel *model,
|
||||
GtkTreeIter *iter,
|
||||
GimpLanguageEntry *entry)
|
||||
{
|
||||
g_free (entry->code);
|
||||
|
||||
gtk_tree_model_get (model, iter,
|
||||
GIMP_LANGUAGE_STORE_ISO_639_1, &entry->code,
|
||||
-1);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
gimp_language_entry_new (void)
|
||||
{
|
||||
|
@ -182,3 +222,51 @@ gimp_language_entry_new (void)
|
|||
|
||||
return entry;
|
||||
}
|
||||
|
||||
const gchar *
|
||||
gimp_language_entry_get_iso_code (GimpLanguageEntry *entry)
|
||||
{
|
||||
g_return_val_if_fail (GIMP_IS_LANGUAGE_ENTRY (entry), NULL);
|
||||
|
||||
return entry->code;
|
||||
}
|
||||
|
||||
gboolean
|
||||
gimp_language_entry_set_iso_code (GimpLanguageEntry *entry,
|
||||
const gchar *code)
|
||||
{
|
||||
GtkTreeIter iter;
|
||||
|
||||
g_return_val_if_fail (GIMP_IS_LANGUAGE_ENTRY (entry), FALSE);
|
||||
|
||||
if (entry->code)
|
||||
{
|
||||
g_free (entry->code);
|
||||
entry->code = NULL;
|
||||
}
|
||||
|
||||
if (! code || ! strlen (code))
|
||||
{
|
||||
gtk_entry_set_text (GTK_ENTRY (entry), "");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (gimp_language_store_lookup (GIMP_LANGUAGE_STORE (entry->store),
|
||||
code, &iter))
|
||||
{
|
||||
gchar *language;
|
||||
|
||||
gtk_tree_model_get (GTK_TREE_MODEL (entry->store), &iter,
|
||||
GIMP_LANGUAGE_STORE_LANGUAGE, &language,
|
||||
GIMP_LANGUAGE_STORE_ISO_639_1, &entry->code,
|
||||
-1);
|
||||
|
||||
gtk_entry_set_text (GTK_ENTRY (entry), language);
|
||||
g_free (language);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
@ -37,17 +37,14 @@ struct _GimpLanguageEntryClass
|
|||
GtkEntryClass parent_class;
|
||||
};
|
||||
|
||||
struct _GimpLanguageEntry
|
||||
{
|
||||
GtkEntry parent_instance;
|
||||
|
||||
GtkListStore *store;
|
||||
};
|
||||
GType gimp_language_entry_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GtkWidget * gimp_language_entry_new (void);
|
||||
|
||||
GType gimp_language_entry_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GtkWidget * gimp_language_entry_new (void);
|
||||
const gchar * gimp_language_entry_get_iso_code (GimpLanguageEntry *entry);
|
||||
gboolean gimp_language_entry_set_iso_code (GimpLanguageEntry *entry,
|
||||
const gchar *code);
|
||||
|
||||
|
||||
#endif /* __GIMP_LANGUAGE_ENTRY_H__ */
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
|
||||
#include "config.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "widgets-types.h"
|
||||
|
@ -69,3 +71,51 @@ gimp_language_store_add (GimpLanguageStore *store,
|
|||
GIMP_LANGUAGE_STORE_ISO_639_1, code,
|
||||
-1);
|
||||
}
|
||||
|
||||
gboolean
|
||||
gimp_language_store_lookup (GimpLanguageStore *store,
|
||||
const gchar *code,
|
||||
GtkTreeIter *iter)
|
||||
{
|
||||
GtkTreeModel *model;
|
||||
const gchar *hyphen;
|
||||
gint len;
|
||||
gboolean iter_valid;
|
||||
|
||||
g_return_val_if_fail (GIMP_IS_LANGUAGE_STORE (store), FALSE);
|
||||
g_return_val_if_fail (code != NULL, FALSE);
|
||||
g_return_val_if_fail (iter != NULL, FALSE);
|
||||
|
||||
/* We accept the code in RFC-3066 format here and only look at what's
|
||||
* before the first hyphen.
|
||||
*/
|
||||
hyphen = strchr (code, '-');
|
||||
|
||||
if (hyphen)
|
||||
len = hyphen - code;
|
||||
else
|
||||
len = strlen (code);
|
||||
|
||||
model = GTK_TREE_MODEL (store);
|
||||
|
||||
for (iter_valid = gtk_tree_model_get_iter_first (model, iter);
|
||||
iter_valid;
|
||||
iter_valid = gtk_tree_model_iter_next (model, iter))
|
||||
{
|
||||
gchar *value;
|
||||
|
||||
gtk_tree_model_get (model, iter,
|
||||
GIMP_LANGUAGE_STORE_ISO_639_1, &value,
|
||||
-1);
|
||||
|
||||
if (strncmp (code, value, len) == 0)
|
||||
{
|
||||
g_free (value);
|
||||
break;
|
||||
}
|
||||
|
||||
g_free (value);
|
||||
}
|
||||
|
||||
return iter_valid;
|
||||
}
|
||||
|
|
|
@ -56,6 +56,9 @@ GtkListStore * gimp_language_store_new (void);
|
|||
void gimp_language_store_add (GimpLanguageStore *store,
|
||||
const gchar *lang,
|
||||
const gchar *code);
|
||||
gboolean gimp_language_store_lookup (GimpLanguageStore *store,
|
||||
const gchar *code,
|
||||
GtkTreeIter *iter);
|
||||
|
||||
|
||||
#endif /* __GIMP_LANGUAGE_STORE_H__ */
|
||||
|
|
|
@ -850,8 +850,7 @@ gimp_prop_language_entry_new (GObject *config,
|
|||
property_name, &value,
|
||||
NULL);
|
||||
|
||||
// FIXME
|
||||
gtk_entry_set_text (GTK_ENTRY (entry), value);
|
||||
gimp_language_entry_set_iso_code (GIMP_LANGUAGE_ENTRY (entry), value);
|
||||
g_free (value);
|
||||
|
||||
set_param_spec (G_OBJECT (entry), entry, param_spec);
|
||||
|
@ -872,21 +871,20 @@ gimp_prop_language_entry_callback (GtkWidget *entry,
|
|||
GObject *config)
|
||||
{
|
||||
GParamSpec *param_spec;
|
||||
const gchar *text;
|
||||
const gchar *code;
|
||||
|
||||
param_spec = get_param_spec (G_OBJECT (entry));
|
||||
if (! param_spec)
|
||||
return;
|
||||
|
||||
// FIXME
|
||||
text = gtk_entry_get_text (GTK_ENTRY (entry));
|
||||
code = gimp_language_entry_get_iso_code (GIMP_LANGUAGE_ENTRY (entry));
|
||||
|
||||
g_signal_handlers_block_by_func (config,
|
||||
gimp_prop_language_entry_notify,
|
||||
entry);
|
||||
|
||||
g_object_set (config,
|
||||
param_spec->name, text,
|
||||
param_spec->name, code,
|
||||
NULL);
|
||||
|
||||
g_signal_handlers_unblock_by_func (config,
|
||||
|
@ -909,8 +907,7 @@ gimp_prop_language_entry_notify (GObject *config,
|
|||
gimp_prop_language_entry_callback,
|
||||
config);
|
||||
|
||||
// FIXME
|
||||
gtk_entry_set_text (GTK_ENTRY (entry), value ? value : "");
|
||||
gimp_language_entry_set_iso_code (GIMP_LANGUAGE_ENTRY (entry), value);
|
||||
|
||||
g_signal_handlers_unblock_by_func (entry,
|
||||
gimp_prop_language_entry_callback,
|
||||
|
|
Loading…
Reference in New Issue