[tepl] LanguageChooserWidget: add Plain Text as first item (NULL language)
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tepl] LanguageChooserWidget: add Plain Text as first item (NULL language)
- Date: Mon, 2 Nov 2020 19:21:28 +0000 (UTC)
commit 76e9ae0cc5289ebe741ddb72dbda4690d4015242
Author: Sébastien Wilmet <swilmet gnome org>
Date: Mon Nov 2 18:44:30 2020 +0100
LanguageChooserWidget: add Plain Text as first item (NULL language)
tepl/tepl-language-chooser-widget.c | 115 ++++++++++++++++++++++++-----------
tests/test-language-chooser-widget.c | 9 ++-
2 files changed, 89 insertions(+), 35 deletions(-)
---
diff --git a/tepl/tepl-language-chooser-widget.c b/tepl/tepl-language-chooser-widget.c
index dbc89f7..8c64de5 100644
--- a/tepl/tepl-language-chooser-widget.c
+++ b/tepl/tepl-language-chooser-widget.c
@@ -31,6 +31,17 @@ G_DEFINE_TYPE_WITH_CODE (TeplLanguageChooserWidget,
G_IMPLEMENT_INTERFACE (TEPL_TYPE_LANGUAGE_CHOOSER,
tepl_language_chooser_interface_init))
+static const gchar *
+get_language_name (GtkSourceLanguage *language)
+{
+ if (language == NULL)
+ {
+ return _("Plain Text");
+ }
+
+ return gtk_source_language_get_name (language);
+}
+
static void
list_box_row_set_language (GtkListBoxRow *list_box_row,
GtkSourceLanguage *language)
@@ -83,6 +94,43 @@ tepl_language_chooser_interface_init (gpointer g_iface,
interface->select_language = tepl_language_chooser_widget_select_language;
}
+static GtkListBoxRow *
+create_list_box_row (const gchar *label_text)
+{
+ GtkWidget *label;
+ GtkListBoxRow *list_box_row;
+
+ label = gtk_label_new (label_text);
+ gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+
+ list_box_row = GTK_LIST_BOX_ROW (gtk_list_box_row_new ());
+ gtk_container_add (GTK_CONTAINER (list_box_row), label);
+
+ return list_box_row;
+}
+
+static void
+append_plain_text_item_to_list_box (TeplLanguageChooserWidget *chooser_widget)
+{
+ /* NULL GtkSourceLanguage. */
+ gtk_container_add (GTK_CONTAINER (chooser_widget->priv->list_box),
+ GTK_WIDGET (create_list_box_row (get_language_name (NULL))));
+}
+
+static void
+append_language_to_list_box (TeplLanguageChooserWidget *chooser_widget,
+ GtkSourceLanguage *language)
+{
+ GtkListBoxRow *list_box_row;
+
+ g_return_if_fail (GTK_SOURCE_IS_LANGUAGE (language));
+
+ list_box_row = create_list_box_row (gtk_source_language_get_name (language));
+ list_box_row_set_language (list_box_row, language);
+ gtk_container_add (GTK_CONTAINER (chooser_widget->priv->list_box),
+ GTK_WIDGET (list_box_row));
+}
+
static void
populate_list_box (TeplLanguageChooserWidget *chooser_widget)
{
@@ -90,6 +138,9 @@ populate_list_box (TeplLanguageChooserWidget *chooser_widget)
const gchar * const *language_ids;
gint i;
+ // First item
+ append_plain_text_item_to_list_box (chooser_widget);
+
language_manager = gtk_source_language_manager_get_default ();
language_ids = gtk_source_language_manager_get_language_ids (language_manager);
@@ -102,22 +153,12 @@ populate_list_box (TeplLanguageChooserWidget *chooser_widget)
{
const gchar *cur_language_id = language_ids[i];
GtkSourceLanguage *language;
- GtkLabel *label;
- GtkListBoxRow *list_box_row;
language = gtk_source_language_manager_get_language (language_manager, cur_language_id);
- if (gtk_source_language_get_hidden (language))
+ if (!gtk_source_language_get_hidden (language))
{
- continue;
+ append_language_to_list_box (chooser_widget, language);
}
-
- label = GTK_LABEL (gtk_label_new (gtk_source_language_get_name (language)));
- gtk_label_set_xalign (label, 0.0);
-
- list_box_row = GTK_LIST_BOX_ROW (gtk_list_box_row_new ());
- list_box_row_set_language (list_box_row, language);
- gtk_container_add (GTK_CONTAINER (list_box_row), GTK_WIDGET (label));
- gtk_container_add (GTK_CONTAINER (chooser_widget->priv->list_box), GTK_WIDGET (list_box_row));
}
}
@@ -128,12 +169,12 @@ filter_cb (GtkListBoxRow *list_box_row,
TeplLanguageChooserWidget *chooser_widget = user_data;
const gchar *search_text;
GtkSourceLanguage *language;
- const gchar *language_name;
- gchar *language_name_normalized;
- gchar *language_name_casefolded;
+ const gchar *item_name;
+ gchar *item_name_normalized;
+ gchar *item_name_casefolded;
gchar *search_text_normalized;
gchar *search_text_casefolded;
- gboolean visible;
+ gboolean visible = FALSE;
search_text = gtk_entry_get_text (GTK_ENTRY (chooser_widget->priv->search_entry));
if (search_text == NULL || search_text[0] == '\0')
@@ -142,24 +183,20 @@ filter_cb (GtkListBoxRow *list_box_row,
}
language = list_box_row_get_language (list_box_row);
- g_return_val_if_fail (language != NULL, FALSE);
+ item_name = get_language_name (language);
+ g_return_val_if_fail (item_name != NULL, FALSE);
- language_name = gtk_source_language_get_name (language);
- g_return_val_if_fail (language_name != NULL, FALSE);
-
- /* search_text is guaranteed to be UTF-8 (it comes from a GTK widget).
- * language_name is not really, it can come from foreign input (*.lang
- * file), so it's safer to check.
- */
- g_return_val_if_fail (g_utf8_validate (language_name, -1, NULL), FALSE);
+ /* Safer to check... (item_name can come from a *.lang file). */
+ g_return_val_if_fail (g_utf8_validate (search_text, -1, NULL), FALSE);
+ g_return_val_if_fail (g_utf8_validate (item_name, -1, NULL), FALSE);
- language_name_normalized = g_utf8_normalize (language_name, -1, G_NORMALIZE_ALL);
- language_name_casefolded = g_utf8_casefold (language_name_normalized, -1);
- g_free (language_name_normalized);
+ item_name_normalized = g_utf8_normalize (item_name, -1, G_NORMALIZE_ALL);
+ item_name_casefolded = g_utf8_casefold (item_name_normalized, -1);
+ g_free (item_name_normalized);
/* Note: we do not apply g_strstrip() on the search text, because a
* trailing space (or - to a less extent - a leading space) can
- * differentiate several GtkSourceLanguages, for example:
+ * differentiate several items, for example:
* - "ERB"
* - "ERB (HTML)"
* - "ERB (JavaScript)"
@@ -168,9 +205,12 @@ filter_cb (GtkListBoxRow *list_box_row,
search_text_casefolded = g_utf8_casefold (search_text_normalized, -1);
g_free (search_text_normalized);
- visible = strstr (language_name_casefolded, search_text_casefolded) != NULL;
+ if (item_name_casefolded != NULL && search_text_casefolded != NULL)
+ {
+ visible = strstr (item_name_casefolded, search_text_casefolded) != NULL;
+ }
- g_free (language_name_casefolded);
+ g_free (item_name_casefolded);
g_free (search_text_casefolded);
return visible;
}
@@ -190,11 +230,18 @@ list_box_row_activated_cb (GtkListBox *list_box,
GtkSourceLanguage *language;
language = list_box_row_get_language (list_box_row);
- g_return_if_fail (language != NULL);
- g_object_ref (language);
+ if (language != NULL)
+ {
+ g_object_ref (language);
+ }
+
g_signal_emit_by_name (chooser_widget, "language-activated", language);
- g_object_unref (language);
+
+ if (language != NULL)
+ {
+ g_object_unref (language);
+ }
}
static void
diff --git a/tests/test-language-chooser-widget.c b/tests/test-language-chooser-widget.c
index 54301b5..2196d25 100644
--- a/tests/test-language-chooser-widget.c
+++ b/tests/test-language-chooser-widget.c
@@ -10,7 +10,14 @@ language_activated_cb (TeplLanguageChooser *chooser,
GtkSourceLanguage *language,
gpointer user_data)
{
- g_message ("Language activated: %s", gtk_source_language_get_id (language));
+ if (language != NULL)
+ {
+ g_message ("Language activated: %s", gtk_source_language_get_id (language));
+ }
+ else
+ {
+ g_message ("Plain Text activated.");
+ }
}
int
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]