[tepl] LanguageChooserDialog: implement class



commit 7dbf26d977e166c260508b114ec26bbb057360a1
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Thu Nov 5 13:51:07 2020 +0100

    LanguageChooserDialog: implement class

 docs/reference/tepl-docs.xml         |   1 +
 docs/reference/tepl-sections.txt     |  16 ++++
 po/POTFILES.in                       |   1 +
 tepl/meson.build                     |   2 +
 tepl/tepl-language-chooser-dialog.c  | 156 +++++++++++++++++++++++++++++++++++
 tepl/tepl-language-chooser-dialog.h  |  50 +++++++++++
 tepl/tepl.h                          |   1 +
 tests/meson.build                    |   1 +
 tests/test-language-chooser-dialog.c |  68 +++++++++++++++
 9 files changed, 296 insertions(+)
---
diff --git a/docs/reference/tepl-docs.xml b/docs/reference/tepl-docs.xml
index bef4d0d..d4894ce 100644
--- a/docs/reference/tepl-docs.xml
+++ b/docs/reference/tepl-docs.xml
@@ -64,6 +64,7 @@
     <chapter id="language-choosers">
       <title>Language Choosers</title>
       <xi:include href="xml/language-chooser.xml"/>
+      <xi:include href="xml/language-chooser-dialog.xml"/>
       <xi:include href="xml/language-chooser-widget.xml"/>
     </chapter>
 
diff --git a/docs/reference/tepl-sections.txt b/docs/reference/tepl-sections.txt
index 839a1ba..8e1ab80 100644
--- a/docs/reference/tepl-sections.txt
+++ b/docs/reference/tepl-sections.txt
@@ -275,6 +275,22 @@ TEPL_TYPE_LANGUAGE_CHOOSER
 tepl_language_chooser_get_type
 </SECTION>
 
+<SECTION>
+<FILE>language-chooser-dialog</FILE>
+TeplLanguageChooserDialog
+tepl_language_chooser_dialog_new
+<SUBSECTION Standard>
+TEPL_IS_LANGUAGE_CHOOSER_DIALOG
+TEPL_IS_LANGUAGE_CHOOSER_DIALOG_CLASS
+TEPL_LANGUAGE_CHOOSER_DIALOG
+TEPL_LANGUAGE_CHOOSER_DIALOG_CLASS
+TEPL_LANGUAGE_CHOOSER_DIALOG_GET_CLASS
+TEPL_TYPE_LANGUAGE_CHOOSER_DIALOG
+TeplLanguageChooserDialogClass
+TeplLanguageChooserDialogPrivate
+tepl_language_chooser_dialog_get_type
+</SECTION>
+
 <SECTION>
 <FILE>language-chooser-widget</FILE>
 TeplLanguageChooserWidget
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 1c4eb21..39b0270 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -15,6 +15,7 @@ tepl/tepl-init.c
 tepl/tepl-io-error-info-bars.c
 tepl/tepl-iter.c
 tepl/tepl-language-chooser.c
+tepl/tepl-language-chooser-dialog.c
 tepl/tepl-language-chooser-widget.c
 tepl/tepl-menu-shell.c
 tepl/tepl-metadata-attic.c
diff --git a/tepl/meson.build b/tepl/meson.build
index 39d5beb..3528a88 100644
--- a/tepl/meson.build
+++ b/tepl/meson.build
@@ -16,6 +16,7 @@ tepl_public_headers = [
   'tepl-io-error-info-bars.h',
   'tepl-iter.h',
   'tepl-language-chooser.h',
+  'tepl-language-chooser-dialog.h',
   'tepl-language-chooser-widget.h',
   'tepl-macros.h',
   'tepl-menu-shell.h',
@@ -53,6 +54,7 @@ tepl_public_c_files = [
   'tepl-io-error-info-bars.c',
   'tepl-iter.c',
   'tepl-language-chooser.c',
+  'tepl-language-chooser-dialog.c',
   'tepl-language-chooser-widget.c',
   'tepl-menu-shell.c',
   'tepl-metadata.c',
diff --git a/tepl/tepl-language-chooser-dialog.c b/tepl/tepl-language-chooser-dialog.c
new file mode 100644
index 0000000..61d71c8
--- /dev/null
+++ b/tepl/tepl-language-chooser-dialog.c
@@ -0,0 +1,156 @@
+/* SPDX-FileCopyrightText: 2020 - Sébastien Wilmet <swilmet gnome org>
+ * SPDX-License-Identifier: LGPL-3.0-or-later
+ */
+
+#include "config.h"
+#include "tepl-language-chooser-dialog.h"
+#include <glib/gi18n-lib.h>
+#include "tepl-language-chooser.h"
+#include "tepl-language-chooser-widget.h"
+
+/**
+ * SECTION:language-chooser-dialog
+ * @Title: TeplLanguageChooserDialog
+ * @Short_description: A dialog for choosing a #GtkSourceLanguage
+ */
+
+struct _TeplLanguageChooserDialogPrivate
+{
+       TeplLanguageChooserWidget *chooser_widget;
+};
+
+static void tepl_language_chooser_interface_init (gpointer g_iface,
+                                                 gpointer iface_data);
+
+G_DEFINE_TYPE_WITH_CODE (TeplLanguageChooserDialog,
+                        tepl_language_chooser_dialog,
+                        GTK_TYPE_DIALOG,
+                        G_ADD_PRIVATE (TeplLanguageChooserDialog)
+                        G_IMPLEMENT_INTERFACE (TEPL_TYPE_LANGUAGE_CHOOSER,
+                                               tepl_language_chooser_interface_init))
+
+static void
+tepl_language_chooser_dialog_dispose (GObject *object)
+{
+       TeplLanguageChooserDialog *chooser_dialog = TEPL_LANGUAGE_CHOOSER_DIALOG (object);
+
+       chooser_dialog->priv->chooser_widget = NULL;
+
+       G_OBJECT_CLASS (tepl_language_chooser_dialog_parent_class)->dispose (object);
+}
+
+static void
+tepl_language_chooser_dialog_response (GtkDialog *dialog,
+                                      gint       response_id)
+{
+       TeplLanguageChooserDialog *chooser_dialog = TEPL_LANGUAGE_CHOOSER_DIALOG (dialog);
+
+       if (response_id == GTK_RESPONSE_OK)
+       {
+               _tepl_language_chooser_widget_activate_selected_language 
(chooser_dialog->priv->chooser_widget);
+       }
+
+       if (GTK_DIALOG_CLASS (tepl_language_chooser_dialog_parent_class)->response != NULL)
+       {
+               GTK_DIALOG_CLASS (tepl_language_chooser_dialog_parent_class)->response (dialog, response_id);
+       }
+}
+
+static void
+tepl_language_chooser_dialog_class_init (TeplLanguageChooserDialogClass *klass)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+       GtkDialogClass *dialog_class = GTK_DIALOG_CLASS (klass);
+
+       object_class->dispose = tepl_language_chooser_dialog_dispose;
+
+       dialog_class->response = tepl_language_chooser_dialog_response;
+}
+
+static void
+tepl_language_chooser_dialog_select_language (TeplLanguageChooser *chooser,
+                                             GtkSourceLanguage   *language)
+{
+       TeplLanguageChooserDialog *chooser_dialog = TEPL_LANGUAGE_CHOOSER_DIALOG (chooser);
+
+       tepl_language_chooser_select_language (TEPL_LANGUAGE_CHOOSER (chooser_dialog->priv->chooser_widget),
+                                              language);
+}
+
+static void
+tepl_language_chooser_interface_init (gpointer g_iface,
+                                     gpointer iface_data)
+{
+       TeplLanguageChooserInterface *interface = g_iface;
+
+       interface->select_language = tepl_language_chooser_dialog_select_language;
+}
+
+static void
+chooser_widget_language_activated_cb (TeplLanguageChooserWidget *chooser_widget,
+                                     GtkSourceLanguage         *language,
+                                     TeplLanguageChooserDialog *chooser_dialog)
+{
+       if (language != NULL)
+       {
+               g_object_ref (language);
+       }
+
+       g_signal_emit_by_name (chooser_dialog, "language-activated", language);
+
+       if (language != NULL)
+       {
+               g_object_unref (language);
+       }
+}
+
+static void
+tepl_language_chooser_dialog_init (TeplLanguageChooserDialog *chooser_dialog)
+{
+       GtkBox *content_area;
+
+       chooser_dialog->priv = tepl_language_chooser_dialog_get_instance_private (chooser_dialog);
+
+       /* chooser_dialog config */
+       gtk_window_set_title (GTK_WINDOW (chooser_dialog), _("Highlight Mode"));
+       gtk_window_set_modal (GTK_WINDOW (chooser_dialog), TRUE);
+
+       /* Action area */
+       gtk_dialog_add_buttons (GTK_DIALOG (chooser_dialog),
+                               _("_Cancel"), GTK_RESPONSE_CANCEL,
+                               _("_Select"), GTK_RESPONSE_OK,
+                               NULL);
+       gtk_dialog_set_default_response (GTK_DIALOG (chooser_dialog), GTK_RESPONSE_OK);
+
+       /* Content area: the TeplLanguageChooserWidget */
+       chooser_dialog->priv->chooser_widget = tepl_language_chooser_widget_new ();
+       gtk_container_set_border_width (GTK_CONTAINER (chooser_dialog->priv->chooser_widget), 11);
+
+       g_signal_connect (chooser_dialog->priv->chooser_widget,
+                         "language-activated",
+                         G_CALLBACK (chooser_widget_language_activated_cb),
+                         chooser_dialog);
+
+       content_area = GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (chooser_dialog)));
+       gtk_container_add (GTK_CONTAINER (content_area),
+                          GTK_WIDGET (chooser_dialog->priv->chooser_widget));
+       gtk_widget_show_all (GTK_WIDGET (content_area));
+}
+
+/**
+ * tepl_language_chooser_dialog_new:
+ * @parent: (nullable): transient parent of the dialog, or %NULL.
+ *
+ * Returns: a new #TeplLanguageChooserDialog widget.
+ * Since: 5.2
+ */
+TeplLanguageChooserDialog *
+tepl_language_chooser_dialog_new (GtkWindow *parent)
+{
+       g_return_val_if_fail (parent == NULL || GTK_IS_WINDOW (parent), NULL);
+
+       return g_object_new (TEPL_TYPE_LANGUAGE_CHOOSER_DIALOG,
+                            "transient-for", parent,
+                            "use-header-bar", TRUE,
+                            NULL);
+}
diff --git a/tepl/tepl-language-chooser-dialog.h b/tepl/tepl-language-chooser-dialog.h
new file mode 100644
index 0000000..7dd0435
--- /dev/null
+++ b/tepl/tepl-language-chooser-dialog.h
@@ -0,0 +1,50 @@
+/* SPDX-FileCopyrightText: 2020 - Sébastien Wilmet <swilmet gnome org>
+ * SPDX-License-Identifier: LGPL-3.0-or-later
+ */
+
+#ifndef TEPL_LANGUAGE_CHOOSER_DIALOG_H
+#define TEPL_LANGUAGE_CHOOSER_DIALOG_H
+
+#if !defined (TEPL_H_INSIDE) && !defined (TEPL_COMPILATION)
+#error "Only <tepl/tepl.h> can be included directly."
+#endif
+
+#include <gtk/gtk.h>
+#include <tepl/tepl-macros.h>
+
+G_BEGIN_DECLS
+
+#define TEPL_TYPE_LANGUAGE_CHOOSER_DIALOG             (tepl_language_chooser_dialog_get_type ())
+#define TEPL_LANGUAGE_CHOOSER_DIALOG(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
TEPL_TYPE_LANGUAGE_CHOOSER_DIALOG, TeplLanguageChooserDialog))
+#define TEPL_LANGUAGE_CHOOSER_DIALOG_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), 
TEPL_TYPE_LANGUAGE_CHOOSER_DIALOG, TeplLanguageChooserDialogClass))
+#define TEPL_IS_LANGUAGE_CHOOSER_DIALOG(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
TEPL_TYPE_LANGUAGE_CHOOSER_DIALOG))
+#define TEPL_IS_LANGUAGE_CHOOSER_DIALOG_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), 
TEPL_TYPE_LANGUAGE_CHOOSER_DIALOG))
+#define TEPL_LANGUAGE_CHOOSER_DIALOG_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), 
TEPL_TYPE_LANGUAGE_CHOOSER_DIALOG, TeplLanguageChooserDialogClass))
+
+typedef struct _TeplLanguageChooserDialog         TeplLanguageChooserDialog;
+typedef struct _TeplLanguageChooserDialogClass    TeplLanguageChooserDialogClass;
+typedef struct _TeplLanguageChooserDialogPrivate  TeplLanguageChooserDialogPrivate;
+
+struct _TeplLanguageChooserDialog
+{
+       GtkDialog parent;
+
+       TeplLanguageChooserDialogPrivate *priv;
+};
+
+struct _TeplLanguageChooserDialogClass
+{
+       GtkDialogClass parent_class;
+
+       gpointer padding[12];
+};
+
+_TEPL_EXTERN
+GType                          tepl_language_chooser_dialog_get_type   (void);
+
+_TEPL_EXTERN
+TeplLanguageChooserDialog *    tepl_language_chooser_dialog_new        (GtkWindow *parent);
+
+G_END_DECLS
+
+#endif /* TEPL_LANGUAGE_CHOOSER_DIALOG_H */
diff --git a/tepl/tepl.h b/tepl/tepl.h
index bb61d2b..d5cf1d3 100644
--- a/tepl/tepl.h
+++ b/tepl/tepl.h
@@ -28,6 +28,7 @@
 #include <tepl/tepl-io-error-info-bars.h>
 #include <tepl/tepl-iter.h>
 #include <tepl/tepl-language-chooser.h>
+#include <tepl/tepl-language-chooser-dialog.h>
 #include <tepl/tepl-language-chooser-widget.h>
 #include <tepl/tepl-menu-shell.h>
 #include <tepl/tepl-metadata.h>
diff --git a/tests/meson.build b/tests/meson.build
index 0220564..84fc4c1 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -1,6 +1,7 @@
 interactive_tests = [
   # executable name, sources
   ['test-fold-region', 'test-fold-region.c'],
+  ['test-language-chooser-dialog', 'test-language-chooser-dialog.c'],
   ['test-language-chooser-widget', 'test-language-chooser-widget.c'],
   ['test-space-drawer-prefs', 'test-space-drawer-prefs.c'],
   ['test-tab', 'test-tab.c'],
diff --git a/tests/test-language-chooser-dialog.c b/tests/test-language-chooser-dialog.c
new file mode 100644
index 0000000..dfe3aaa
--- /dev/null
+++ b/tests/test-language-chooser-dialog.c
@@ -0,0 +1,68 @@
+/* SPDX-FileCopyrightText: 2020 - Sébastien Wilmet <swilmet gnome org>
+ * SPDX-License-Identifier: LGPL-3.0-or-later
+ */
+
+#include <tepl/tepl.h>
+#include <stdlib.h>
+
+static void
+language_activated_cb (TeplLanguageChooser *chooser,
+                      GtkSourceLanguage   *language,
+                      gpointer             user_data)
+{
+       if (language != NULL)
+       {
+               g_message ("Language activated: %s", gtk_source_language_get_id (language));
+       }
+       else
+       {
+               g_message ("Plain Text activated.");
+       }
+}
+
+static void
+select_random_language (TeplLanguageChooserDialog *dialog)
+{
+       GtkSourceLanguageManager *manager;
+       GtkSourceLanguage *language;
+
+       manager = gtk_source_language_manager_get_default ();
+       // xml has been picked at random.
+       language = gtk_source_language_manager_get_language (manager, "xml");
+
+       tepl_language_chooser_select_language (TEPL_LANGUAGE_CHOOSER (dialog), language);
+}
+
+static void
+dialog_response_cb (GtkDialog *dialog,
+                   gint       response_id,
+                   gpointer   user_data)
+{
+       gtk_main_quit ();
+}
+
+int
+main (int    argc,
+      char **argv)
+{
+       TeplLanguageChooserDialog *dialog;
+
+       gtk_init (&argc, &argv);
+
+       dialog = tepl_language_chooser_dialog_new (NULL);
+       select_random_language (dialog);
+
+       g_signal_connect (dialog,
+                         "response",
+                         G_CALLBACK (dialog_response_cb),
+                         NULL);
+
+       g_signal_connect (dialog,
+                         "language-activated",
+                         G_CALLBACK (language_activated_cb),
+                         NULL);
+
+       gtk_widget_show (GTK_WIDGET (dialog));
+       gtk_main ();
+       return EXIT_SUCCESS;
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]