[gtranslator/gtk4: 43/52] Replace gtr-assistant with gtr-greeter




commit 18c6c6b52fa576e6dcfe93943b65cbb136ed9185
Author: Daniel GarcĂ­a Moreno <dani danigm net>
Date:   Thu Aug 4 19:00:00 2022 +0200

    Replace gtr-assistant with gtr-greeter
    
    This new widget is in the main window stack so no modal at the begining.
    It's also using AdwPreferencesGroup to show the profile form to the
    user, so everything is modern there.

 po/POTFILES.in                |   3 +-
 src/gtr-application.c         |   5 +-
 src/gtr-assistant.c           | 527 ------------------------------------------
 src/gtr-assistant.h           |  67 ------
 src/gtr-dl-teams.c            |   8 +-
 src/gtr-dl-teams.h            |   4 +-
 src/gtr-greeter.c             | 232 +++++++++++++++++++
 src/gtr-greeter.h             |  35 +++
 src/gtr-greeter.ui            | 199 ++++++++++++++++
 src/gtr-lang-button.c         |   4 -
 src/gtr-languages-fetcher.c   | 338 +++++++++------------------
 src/gtr-languages-fetcher.h   |  27 +--
 src/gtr-languages-fetcher.ui  | 236 ++++++-------------
 src/gtr-window.c              |  53 ++---
 src/gtr-window.h              |   1 +
 src/gtr-window.ui             |   6 -
 src/gtranslator.gresource.xml |   1 +
 src/meson.build               |   2 +-
 18 files changed, 685 insertions(+), 1063 deletions(-)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 0d273f37..5b8d5af6 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -10,7 +10,6 @@ src/gtr-actions-app.c
 src/gtr-actions-file.c
 src/gtr-actions-search.c
 src/gtr-application.c
-src/gtr-assistant.c
 src/gtr-close-confirmation-dialog.c
 src/gtr-context.c
 src/gtr-context.ui
@@ -18,6 +17,8 @@ src/gtr-dl-teams.c
 src/gtr-dl-teams.ui
 src/gtr-file-dialogs.c
 src/gtr-filter-selection.ui
+src/gtr-greeter.ui
+src/gtr-greeter.c
 src/gtr-header-dialog.c
 src/gtr-header-dialog.ui
 src/gtr-io-error-info-bar.c
diff --git a/src/gtr-application.c b/src/gtr-application.c
index a6f5461d..4f08c265 100644
--- a/src/gtr-application.c
+++ b/src/gtr-application.c
@@ -24,7 +24,6 @@
 #include <config.h>
 #endif
 
-//#include "gtr-assistant.h"
 #include "gtr-actions.h"
 #include "gtr-actions-app.h"
 #include "gtr-application.h"
@@ -759,10 +758,10 @@ gtr_application_setup_window (GApplication *application,
     }
 
   /* If it is the first run, the default directory was created in this
-   * run, then we show the First run Assistant
+   * run, then we show the First run greeter
    */
   if (priv->first_run)
-    //gtr_show_assistant (window);
+    gtr_window_show_greeter (window);
 
   if (file_list != NULL)
     {
diff --git a/src/gtr-dl-teams.c b/src/gtr-dl-teams.c
index 5f2979df..c7b415ee 100644
--- a/src/gtr-dl-teams.c
+++ b/src/gtr-dl-teams.c
@@ -157,7 +157,8 @@ gtr_dl_teams_parse_teams_json (GObject *object,
 
   pmanager = gtr_profile_manager_get_default ();
   profile = gtr_profile_manager_get_active_profile (pmanager);
-  def_lang = gtr_profile_get_language_code (profile);
+  if (profile)
+    def_lang = gtr_profile_get_language_code (profile);
 
   json_array_foreach_element (
     array,
@@ -344,7 +345,7 @@ gtr_dl_teams_parse_modules_json (GObject *object,
   gtk_widget_set_sensitive (priv->modules_combobox, TRUE);
 }
 
-static void
+void
 gtr_dl_teams_load_json (GtrDlTeams *self)
 {
   /* Get team list JSON from DL */
@@ -911,9 +912,6 @@ gtr_dl_teams_init (GtrDlTeams *self)
                     G_CALLBACK (team_add_cb),
                     self);
 
-  /* Load teams and modules automatically */
-  gtr_dl_teams_load_json (self);
-
   /* Connect "changed" to all combo boxes */
   g_signal_connect (priv->teams_combobox,
                     "notify::selected",
diff --git a/src/gtr-dl-teams.h b/src/gtr-dl-teams.h
index b9072599..c16ad9ea 100644
--- a/src/gtr-dl-teams.h
+++ b/src/gtr-dl-teams.h
@@ -30,9 +30,7 @@ G_DECLARE_FINAL_TYPE (GtrDlTeams, gtr_dl_teams, GTR, DL_TEAMS, AdwBin)
 
 GtrDlTeams* gtr_dl_teams_new         ();
 GtkWidget*  gtr_dl_teams_get_header  (GtrDlTeams *self);
-void        gtr_dl_teams_recent_add  (GtrDlTeams *self,
-                                      GFile *location,
-                                      gchar *jkkproject_id);
+void        gtr_dl_teams_load_json   (GtrDlTeams *self);
 
 G_END_DECLS
 
diff --git a/src/gtr-greeter.c b/src/gtr-greeter.c
new file mode 100644
index 00000000..a4a7a3ce
--- /dev/null
+++ b/src/gtr-greeter.c
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2022  Daniel Garcia <danigm gnome org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib/gi18n.h>
+
+#include "gtr-greeter.h"
+#include "gtr-window.h"
+#include "gtr-profile.h"
+#include "gtr-profile-manager.h"
+#include "gtr-languages-fetcher.h"
+
+typedef struct
+{
+  GtkWidget *titlebar;
+  GtkWidget *greeter_stack;
+
+  GtkWidget *profile_name;
+  GtkWidget *name;
+  GtkWidget *email;
+  GtkWidget *team_email;
+  GtkWidget *languages_fetcher;
+
+  GtkWidget *next_button;
+  GtkWidget *back_button;
+
+  GtkWidget *conf_profile;
+  GtkWidget *conf_name;
+  GtkWidget *conf_email;
+  GtkWidget *conf_team;
+  GtkWidget *conf_lang;
+  GtkWidget *conf_lang_code;
+  GtkWidget *conf_charset;
+  GtkWidget *conf_encoding;
+  GtkWidget *conf_plural_forms;
+
+  GtrWindow *main_window;
+} GtrGreeterPrivate;
+
+struct _GtrGreeter
+{
+  AdwBin parent_instance;
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (GtrGreeter, gtr_greeter, ADW_TYPE_BIN)
+
+static void
+add_profile (GtrGreeter *self)
+{
+  GtrProfile *profile;
+  GtrProfileManager *prof_manager;
+  GtrGreeterPrivate *priv = gtr_greeter_get_instance_private (GTR_GREETER (self));
+  GtrLanguagesFetcher *lf = GTR_LANGUAGES_FETCHER (priv->languages_fetcher);
+
+  profile = gtr_profile_new ();
+  prof_manager = gtr_profile_manager_get_default ();
+
+  gtr_profile_set_name (profile, gtk_editable_get_text (GTK_EDITABLE (priv->profile_name)));
+  gtr_profile_set_author_name (profile, gtk_editable_get_text (GTK_EDITABLE (priv->name)));
+  gtr_profile_set_author_email (profile, gtk_editable_get_text (GTK_EDITABLE (priv->email)));
+  gtr_profile_set_group_email (profile, gtk_editable_get_text (GTK_EDITABLE (priv->team_email)));
+
+  gtr_profile_set_language_name (profile, gtr_languages_fetcher_get_language_name (lf));
+  gtr_profile_set_language_code (profile, gtr_languages_fetcher_get_language_code (lf));
+  gtr_profile_set_charset (profile, gtr_languages_fetcher_get_charset (lf));
+  gtr_profile_set_encoding (profile, gtr_languages_fetcher_get_encoding (lf));
+  gtr_profile_set_plural_forms (profile, gtr_languages_fetcher_get_plural_form (lf));
+
+  /* Add profile to profile manager and save it */
+  gtr_profile_manager_add_profile (prof_manager, profile);
+  g_object_unref (prof_manager);
+}
+
+static void
+update_confirmation_label (GtrGreeter *self)
+{
+  g_autofree char *string = NULL;
+  GtrGreeterPrivate *priv = gtr_greeter_get_instance_private (GTR_GREETER (self));
+  GtrLanguagesFetcher *lf = GTR_LANGUAGES_FETCHER (priv->languages_fetcher);
+
+  adw_action_row_set_subtitle (ADW_ACTION_ROW (priv->conf_profile),
+                               gtk_editable_get_text (GTK_EDITABLE (priv->profile_name)));
+  adw_action_row_set_subtitle (ADW_ACTION_ROW (priv->conf_name),
+                               gtk_editable_get_text (GTK_EDITABLE (priv->name)));
+  adw_action_row_set_subtitle (ADW_ACTION_ROW (priv->conf_email),
+                               gtk_editable_get_text (GTK_EDITABLE (priv->email)));
+  adw_action_row_set_subtitle (ADW_ACTION_ROW (priv->conf_team),
+                               gtk_editable_get_text (GTK_EDITABLE (priv->team_email)));
+
+  adw_action_row_set_subtitle (ADW_ACTION_ROW (priv->conf_lang),
+                               gtr_languages_fetcher_get_language_name (lf));
+  adw_action_row_set_subtitle (ADW_ACTION_ROW (priv->conf_lang_code),
+                               gtr_languages_fetcher_get_language_code (lf));
+  adw_action_row_set_subtitle (ADW_ACTION_ROW (priv->conf_charset),
+                               gtr_languages_fetcher_get_charset (lf));
+  adw_action_row_set_subtitle (ADW_ACTION_ROW (priv->conf_encoding),
+                               gtr_languages_fetcher_get_encoding (lf));
+  adw_action_row_set_subtitle (ADW_ACTION_ROW (priv->conf_plural_forms),
+                               gtr_languages_fetcher_get_plural_form (lf));
+}
+
+static void
+go_next_cb (GtkButton *btn, GtrGreeter *self)
+{
+  const char *child_name = NULL;
+  GtrGreeterPrivate *priv = gtr_greeter_get_instance_private (GTR_GREETER (self));
+
+  gtk_widget_show (priv->back_button);
+  child_name = adw_view_stack_get_visible_child_name (ADW_VIEW_STACK (priv->greeter_stack));
+
+  if (g_strcmp0 (child_name, "welcome") == 0)
+    adw_view_stack_set_visible_child_name (ADW_VIEW_STACK (priv->greeter_stack), "profile");
+  else if (g_strcmp0 (child_name, "profile") == 0)
+    {
+      adw_view_stack_set_visible_child_name (ADW_VIEW_STACK (priv->greeter_stack), "confirmation");
+      update_confirmation_label (self);
+    }
+  else
+    {
+      add_profile (self);
+      gtr_window_show_projects (priv->main_window);
+    }
+}
+
+static void
+go_back_cb (GtkButton   *btn, GtrGreeter *self)
+{
+  const char *child_name = NULL;
+  GtrGreeterPrivate *priv = gtr_greeter_get_instance_private (GTR_GREETER (self));
+
+  child_name = adw_view_stack_get_visible_child_name (ADW_VIEW_STACK (priv->greeter_stack));
+  if (g_strcmp0 (child_name, "confirmation") == 0)
+    adw_view_stack_set_visible_child_name (ADW_VIEW_STACK (priv->greeter_stack), "profile");
+  else if (g_strcmp0 (child_name, "profile") == 0)
+    {
+      adw_view_stack_set_visible_child_name (ADW_VIEW_STACK (priv->greeter_stack), "welcome");
+      gtk_widget_hide (priv->back_button);
+    }
+}
+
+static void
+gtr_greeter_dispose (GObject *object)
+{
+  GtrGreeterPrivate *priv = gtr_greeter_get_instance_private (GTR_GREETER (object));
+  G_OBJECT_CLASS (gtr_greeter_parent_class)->dispose (object);
+}
+
+static void
+gtr_greeter_class_init (GtrGreeterClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  object_class->dispose = gtr_greeter_dispose;
+
+  gtk_widget_class_set_template_from_resource (widget_class,
+                                               "/org/gnome/translator/gtr-greeter.ui");
+
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, titlebar);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, greeter_stack);
+
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, back_button);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, next_button);
+
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, profile_name);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, name);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, email);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, team_email);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, languages_fetcher);
+
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, conf_profile);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, conf_name);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, conf_email);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, conf_team);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, conf_lang);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, conf_lang_code);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, conf_charset);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, conf_encoding);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrGreeter, conf_plural_forms);
+}
+
+static void
+gtr_greeter_init (GtrGreeter *self)
+{
+  GtrGreeterPrivate *priv = gtr_greeter_get_instance_private (self);
+  gtk_widget_init_template (GTK_WIDGET (self));
+
+  g_signal_connect (priv->next_button,
+                    "clicked",
+                    G_CALLBACK (go_next_cb),
+                    self);
+
+  g_signal_connect (priv->back_button,
+                    "clicked",
+                    G_CALLBACK (go_back_cb),
+                    self);
+}
+
+GtrGreeter*
+gtr_greeter_new (GtrWindow *window)
+{
+  GtrGreeter *self = g_object_new (GTR_TYPE_GREETER, NULL);
+  GtrGreeterPrivate *priv = gtr_greeter_get_instance_private (self);
+
+  priv->main_window = window;
+  return self;
+}
+
+GtkWidget *
+gtr_greeter_get_header (GtrGreeter *self)
+{
+  GtrGreeterPrivate *priv = gtr_greeter_get_instance_private (self);
+  return priv->titlebar;
+}
diff --git a/src/gtr-greeter.h b/src/gtr-greeter.h
new file mode 100644
index 00000000..369b76a5
--- /dev/null
+++ b/src/gtr-greeter.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2022  Daniel Garcia <danigm gnome org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+#include <adwaita.h>
+
+#include "gtr-window.h"
+
+G_BEGIN_DECLS
+
+#define GTR_TYPE_GREETER (gtr_greeter_get_type ())
+
+G_DECLARE_FINAL_TYPE (GtrGreeter, gtr_greeter, GTR, GREETER, AdwBin)
+
+GtrGreeter* gtr_greeter_new         (GtrWindow *main_window);
+GtkWidget*  gtr_greeter_get_header  (GtrGreeter *self);
+
+G_END_DECLS
diff --git a/src/gtr-greeter.ui b/src/gtr-greeter.ui
new file mode 100644
index 00000000..6a0473ae
--- /dev/null
+++ b/src/gtr-greeter.ui
@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <requires lib="gtk" version="4.0"/>
+  <template class="GtrGreeter" parent="AdwBin">
+    <child>
+      <object class="AdwViewStack" id="greeter_stack">
+        <!-- Welcome page -->
+        <child>
+          <object class="AdwViewStackPage">
+            <property name="name">welcome</property>
+            <property name="title" translatable="true">Welcome</property>
+            <property name="child">
+
+              <object class="AdwClamp">
+                <property name="maximum-size">900</property>
+                <property name="tightening-threshold">400</property>
+                <property name="valign">fill</property>
+                <child>
+                  <object class="GtkBox">
+                    <property name="orientation">vertical</property>
+                    <child>
+                      <object class="AdwStatusPage">
+                        <property name="title" translatable="true">Welcome to Translation Editor</property>
+                        <property name="icon-name">contact-new-symbolic</property>
+                        <property name="description">Before start to use the application, a profile should 
be created, but dont' worry, the app will guide you to do it in a minute.</property>
+                        <property name="vexpand">true</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+
+            </property>
+          </object>
+        </child>
+
+        <!-- Create profile page -->
+        <child>
+          <object class="AdwViewStackPage">
+            <property name="name">profile</property>
+            <property name="title" translatable="true">Create Profile</property>
+            <property name="child">
+
+              <object class="AdwClamp">
+                <property name="maximum-size">900</property>
+                <property name="tightening-threshold">400</property>
+                <child>
+                  <object class="GtkBox">
+                    <property name="orientation">vertical</property>
+                    <property name="valign">center</property>
+                    <child>
+                      <object class="AdwPreferencesGroup">
+                        <property name="title" translatable="true">Profile</property>
+                        <child>
+                          <object class="AdwEntryRow" id="profile_name">
+                            <property name="title" translatable="yes">Profile name</property>
+                            <property name="text" translatable="yes">default</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="AdwEntryRow" id="name">
+                            <property name="title" translatable="yes">Translator name</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="AdwEntryRow" id="email">
+                            <property name="title" translatable="yes">Translator email</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="AdwEntryRow" id="team_email">
+                            <property name="title" translatable="yes">Translation team email</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtrLanguagesFetcher" id="languages_fetcher">
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+
+            </property>
+          </object>
+
+        </child>
+
+        <!-- Confirmation -->
+        <child>
+          <object class="AdwViewStackPage">
+            <property name="name">confirmation</property>
+            <property name="title" translatable="true">Confirmation</property>
+            <property name="child">
+
+              <object class="AdwClamp">
+                <property name="maximum-size">900</property>
+                <property name="tightening-threshold">400</property>
+                <child>
+                  <object class="GtkBox">
+                    <property name="orientation">vertical</property>
+                    <child>
+                      <object class="AdwPreferencesGroup">
+                        <property name="title" translatable="true">Confirmation</property>
+                        <property name="vexpand">true</property>
+                        <property name="valign">center</property>
+                        <style>
+                          <class name="boxed-list"/>
+                        </style>
+                        <child>
+                          <object class="AdwActionRow" id="conf_profile">
+                            <property name="title" translatable="true">Profile name</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="AdwActionRow" id="conf_name">
+                            <property name="title" translatable="true">Translator name</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="AdwActionRow" id="conf_email">
+                            <property name="title" translatable="true">Translator email</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="AdwActionRow" id="conf_team">
+                            <property name="title" translatable="true">Team email</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="AdwActionRow" id="conf_lang">
+                            <property name="title" translatable="true">Language name</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="AdwActionRow" id="conf_lang_code">
+                            <property name="title" translatable="true">Language code</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="AdwActionRow" id="conf_charset">
+                            <property name="title" translatable="true">Character set</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="AdwActionRow" id="conf_encoding">
+                            <property name="title" translatable="true">Transfer encoding</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="AdwActionRow" id="conf_plural_forms">
+                            <property name="title" translatable="true">Plural form</property>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+
+            </property>
+          </object>
+
+        </child>
+
+      </object>
+    </child>
+  </template>
+
+  <object class="GtkHeaderBar" id="titlebar">
+    <style>
+      <class name="titlebar"/>
+    </style>
+    <property name="title-widget">
+      <object class="AdwWindowTitle">
+        <property name="title" translatable="true">Translation Editor</property>
+      </object>
+    </property>
+    <child type="start">
+      <object class="GtkButton" id="back_button">
+        <property name="icon-name">go-previous-symbolic</property>
+        <property name="visible">false</property>
+      </object>
+    </child>
+    <child type="end">
+      <object class="GtkButton" id="next_button">
+        <property name="label" translatable="true">Next</property>
+        <style>
+          <class name="suggested-action"/>
+        </style>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/src/gtr-lang-button.c b/src/gtr-lang-button.c
index b088fad3..dcb9560f 100644
--- a/src/gtr-lang-button.c
+++ b/src/gtr-lang-button.c
@@ -68,10 +68,6 @@ static void
 gtr_lang_button_dispose (GObject *object)
 {
   GtrLangButtonPrivate *priv = gtr_lang_button_get_instance_private (GTR_LANG_BUTTON (object));
-
-  g_clear_pointer (&priv->model, g_object_unref);
-  g_clear_pointer (&priv->widget, gtk_widget_unparent);
-
   G_OBJECT_CLASS (gtr_lang_button_parent_class)->dispose (object);
 }
 
diff --git a/src/gtr-languages-fetcher.c b/src/gtr-languages-fetcher.c
index 6ed9cd56..5b4e0f7a 100644
--- a/src/gtr-languages-fetcher.c
+++ b/src/gtr-languages-fetcher.c
@@ -28,19 +28,27 @@
 typedef struct
 {
   GtkWidget *language;
+
   GtkWidget *language_code;
   GtkWidget *charset;
   GtkWidget *encoding;
-  GtkWidget *team_email;
   GtkWidget *plural_forms;
-  GtkWidget *advanced;
 
-  GtkListStore *code_store;
+  GtkWidget *language_code_dropdown;
+  GtkWidget *charset_dropdown;
+  GtkWidget *encoding_dropdown;
+  GtkWidget *plural_forms_dropdown;
+
+  GtkStringList *code_store;
+  GtkStringList *charset_store;
+  GtkStringList *encoding_store;
+  GtkStringList *plural_forms_store;
+
 } GtrLanguagesFetcherPrivate;
 
 struct _GtrLanguagesFetcher
 {
-  GtkBox parent;
+  AdwPreferencesGroup parent;
 };
 
 /* Signals */
@@ -50,7 +58,7 @@ enum
   LAST_SIGNAL
 };
 
-G_DEFINE_TYPE_WITH_PRIVATE (GtrLanguagesFetcher, gtr_languages_fetcher, GTK_TYPE_BOX)
+G_DEFINE_TYPE_WITH_PRIVATE (GtrLanguagesFetcher, gtr_languages_fetcher, ADW_TYPE_PREFERENCES_GROUP)
 
 static guint signals[LAST_SIGNAL] = { 0 };
 
@@ -64,18 +72,34 @@ static void
 gtr_languages_fetcher_class_init (GtrLanguagesFetcherClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
   object_class->finalize = gtr_languages_fetcher_finalize;
 
   signals[CHANGED] =
-    g_signal_new ("changed",
-                  G_OBJECT_CLASS_TYPE (object_class),
-                  G_SIGNAL_RUN_LAST,
-                  G_STRUCT_OFFSET (GtrLanguagesFetcherClass, changed),
-                  NULL, NULL,
-                  g_cclosure_marshal_VOID__VOID,
-                  G_TYPE_NONE,
-                  0);
+    g_signal_newv ("changed",
+                   G_OBJECT_CLASS_TYPE (object_class),
+                   G_SIGNAL_RUN_LAST,
+                   NULL, NULL, NULL, NULL,
+                   G_TYPE_NONE, 0, NULL);
+
+  gtk_widget_class_set_template_from_resource (widget_class,
+                                               "/org/gnome/translator/gtr-languages-fetcher.ui");
+
+  gtk_widget_class_bind_template_child_private (widget_class, GtrLanguagesFetcher, language);
+
+  gtk_widget_class_bind_template_child_private (widget_class, GtrLanguagesFetcher, language_code);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrLanguagesFetcher, language_code_dropdown);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrLanguagesFetcher, code_store);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrLanguagesFetcher, charset);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrLanguagesFetcher, charset_dropdown);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrLanguagesFetcher, charset_store);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrLanguagesFetcher, encoding);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrLanguagesFetcher, encoding_dropdown);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrLanguagesFetcher, encoding_store);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrLanguagesFetcher, plural_forms);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrLanguagesFetcher, plural_forms_dropdown);
+  gtk_widget_class_bind_template_child_private (widget_class, GtrLanguagesFetcher, plural_forms_store);
 }
 
 static gint
@@ -109,14 +133,10 @@ append_from_languages (GtrLanguagesFetcher *fetcher)
   for (l = languages; l != NULL; l = g_slist_next (l))
     {
       GtrLanguage *lang = (GtrLanguage *)l->data;
-      GtkTreeIter iter2;
       const gchar *plural_form;
 
-      gtk_list_store_append (priv->code_store, &iter2);
-      gtk_list_store_set (priv->code_store, &iter2,
-                          0, gtr_language_get_code (lang),
-                          1, lang,
-                          -1);
+      gtk_string_list_append (GTK_STRING_LIST (priv->code_store),
+                              gtr_language_get_code (lang));
 
       plural_form = gtr_language_get_plural_form (lang);
       if (plural_form != NULL && *plural_form != '\0')
@@ -127,8 +147,8 @@ append_from_languages (GtrLanguagesFetcher *fetcher)
           if (value == NULL)
             {
               g_hash_table_insert (plurals, (gchar *)plural_form, GINT_TO_POINTER (1));
-              gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (priv->plural_forms),
-                                              plural_form);
+              gtk_string_list_append (GTK_STRING_LIST (priv->plural_forms_store),
+                                      plural_form);
             }
         }
     }
@@ -142,19 +162,13 @@ fill_encoding_and_charset (GtrLanguagesFetcher *fetcher)
   const gchar *text;
   GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
 
-  //text = gtk_entry_get_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->charset))));
-  GtkEntryBuffer *buffer = gtk_entry_get_buffer (GTK_ENTRY (gtk_combo_box_get_child(GTK_COMBO_BOX 
(priv->charset))));
-  text = gtk_entry_buffer_get_text (buffer);
-
-  if (text == NULL || *text == '\0' || !gtk_widget_is_sensitive (priv->charset))
-    gtk_combo_box_set_active (GTK_COMBO_BOX (priv->charset), 0);
-
-  //text = gtk_entry_get_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->encoding))));
-  buffer = gtk_entry_get_buffer (GTK_ENTRY (gtk_combo_box_get_child(GTK_COMBO_BOX (priv->encoding))));
-  text = gtk_entry_buffer_get_text (buffer);
+  text = gtk_editable_get_text (GTK_EDITABLE (priv->charset));
+  if (text == NULL || *text == '\0')
+    gtk_drop_down_set_selected (GTK_DROP_DOWN (priv->charset_dropdown), 0);
 
-  if (text == NULL || *text == '\0' || !gtk_widget_is_sensitive (priv->encoding))
-    gtk_combo_box_set_active (GTK_COMBO_BOX (priv->encoding), 0);
+  text = gtk_editable_get_text (GTK_EDITABLE (priv->encoding));
+  if (text == NULL || *text == '\0')
+    gtk_drop_down_set_selected (GTK_DROP_DOWN (priv->encoding_dropdown), 0);
 }
 
 static void
@@ -162,26 +176,18 @@ fill_from_language_entry (GtrLanguagesFetcher *fetcher,
                           GtrLanguage         *lang)
 {
   GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
+  const gchar *code;
+  const gchar *plural_form;
 
   fill_encoding_and_charset (fetcher);
 
-  const gchar *code;
   code = gtr_language_get_code (lang);
   if (code != NULL && *code != '\0')
-    //gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->language_code))), code);
-  {
-    GtkEntryBuffer * buffer = gtk_entry_get_buffer (GTK_ENTRY (gtk_combo_box_get_child(GTK_COMBO_BOX 
(priv->language_code))));
-    gtk_entry_buffer_set_text (buffer, code, -1);
-  }
+    gtk_editable_set_text (GTK_EDITABLE (priv->language_code), code);
 
-  const gchar *plural_form;
   plural_form = gtr_language_get_plural_form (lang);
   if (plural_form != NULL && *plural_form != '\0')
-    //gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->plural_forms))), plural_form);
-  {
-    GtkEntryBuffer * buffer = gtk_entry_get_buffer (GTK_ENTRY (gtk_combo_box_get_child(GTK_COMBO_BOX 
(priv->plural_forms))));
-    gtk_entry_buffer_set_text (buffer, plural_form, -1);
-  }
+    gtk_editable_set_text (GTK_EDITABLE (priv->plural_forms), plural_form);
 }
 
 static void
@@ -191,80 +197,24 @@ fill_from_language_code_entry (GtrLanguagesFetcher *fetcher,
   const gchar *entry_text;
   GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
 
-  fill_encoding_and_charset (fetcher);
-
   entry_text = gtr_lang_button_get_lang (GTR_LANG_BUTTON (priv->language));
-
   if (*entry_text == '\0')
     {
       const gchar *name;
-
       name = gtr_language_get_name (lang);
 
       if (name != NULL && *name != '\0')
         gtr_lang_button_set_lang (GTR_LANG_BUTTON (priv->language), name);
     }
 
-  //entry_text = gtk_entry_get_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->plural_forms))));
-  GtkEntryBuffer *buffer = gtk_entry_get_buffer (GTK_ENTRY (gtk_combo_box_get_child(GTK_COMBO_BOX 
(priv->plural_forms))));
-  entry_text = gtk_entry_buffer_get_text (buffer);
-
+  fill_encoding_and_charset (fetcher);
+  entry_text = gtk_editable_get_text (GTK_EDITABLE (priv->plural_forms));
   if (*entry_text == '\0')
     {
       const gchar *plural_form;
-
       plural_form = gtr_language_get_plural_form (lang);
-
       if (plural_form != NULL && *plural_form != '\0')
-        //gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->plural_forms))), plural_form);
-      {
-        GtkEntryBuffer * buffer = gtk_entry_get_buffer (GTK_ENTRY (gtk_combo_box_get_child(GTK_COMBO_BOX 
(priv->plural_forms))));
-        gtk_entry_buffer_set_text (buffer, plural_form, -1);
-      }
-    }
-}
-
-typedef void (* fill_method) (GtrLanguagesFetcher *fetcher, GtrLanguage *lang);
-
-static void
-fill_boxes (GtrLanguagesFetcher *fetcher,
-            const gchar         *text,
-            GtkTreeModel        *store,
-            fill_method          fill)
-{
-  gchar *entry_row;
-  GtkTreeIter iter;
-  GtrLanguage *lang;
-  gboolean found = FALSE;
-
-  if (text == NULL || *text == '\0' ||
-      !gtk_tree_model_get_iter_first (store, &iter))
-    return;
-
-  do
-    {
-      gtk_tree_model_get (store, &iter,
-                          0, &entry_row,
-                          -1);
-
-      if (entry_row != NULL && strcmp (entry_row, text) == 0)
-        {
-          found = TRUE;
-          g_free (entry_row);
-          break;
-        }
-
-      g_free (entry_row);
-    }
-  while (gtk_tree_model_iter_next (store, &iter));
-
-  if (found)
-    {
-      gtk_tree_model_get (store, &iter,
-                          1, &lang,
-                          -1);
-
-      fill (fetcher, lang);
+        gtk_editable_set_text (GTK_EDITABLE (priv->plural_forms), plural_form);
     }
 }
 
@@ -291,46 +241,46 @@ on_language_activate (GtrLangButton       *btn,
 }
 
 static void
-on_language_code_activate (GtkEntry            *entry,
-                           GtrLanguagesFetcher *fetcher)
+on_combo_box_changed (GtkWidget           *widget,
+                      GtrLanguagesFetcher *fetcher)
 {
-  GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
-  //const gchar *text = gtk_entry_get_text (entry);
-  GtkEntryBuffer *buffer = gtk_entry_get_buffer (entry);
-  const gchar *text = gtk_entry_buffer_get_text (buffer);
-
-  fill_boxes (fetcher, text, GTK_TREE_MODEL (priv->code_store),
-              fill_from_language_code_entry);
+  g_signal_emit (fetcher, signals[CHANGED], 0, NULL);
 }
 
-static gboolean
-on_language_code_focus_out_event (GtkEntry         *entry,
-                                  GdkEvent         *event,
-                                  GtrLanguagesFetcher *fetcher)
+static void
+on_charset_changed (GtkWidget *widget, GParamSpec *spec, GtrLanguagesFetcher *fetcher)
 {
-  on_language_code_activate (entry, fetcher);
-
-  return FALSE;
+  GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
+  int selected = gtk_drop_down_get_selected (GTK_DROP_DOWN (priv->charset_dropdown));
+  const char *charset = gtk_string_list_get_string (priv->charset_store, selected);
+  gtr_languages_fetcher_set_charset (fetcher, charset);
 }
 
 static void
-on_combo_box_changed (GtkWidget           *widget,
-                      GtrLanguagesFetcher *fetcher)
+on_encoding_changed (GtkWidget *widget, GParamSpec *spec, GtrLanguagesFetcher *fetcher)
 {
-  g_signal_emit (fetcher, signals[CHANGED], 0, NULL);
+  GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
+  int selected = gtk_drop_down_get_selected (GTK_DROP_DOWN (priv->encoding_dropdown));
+  const char *encoding = gtk_string_list_get_string (priv->encoding_store, selected);
+  gtr_languages_fetcher_set_encoding (fetcher, encoding);
 }
 
 static void
-on_advanced_changed (GtkToggleButton     *widget,
-                     GtrLanguagesFetcher *fetcher)
+on_plural_forms_changed (GtkWidget *widget, GParamSpec *spec, GtrLanguagesFetcher *fetcher)
 {
   GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
-  gboolean active = gtk_toggle_button_get_active (widget);
+  int selected = gtk_drop_down_get_selected (GTK_DROP_DOWN (priv->plural_forms_dropdown));
+  const char *plural_forms = gtk_string_list_get_string (priv->plural_forms_store, selected);
+  gtr_languages_fetcher_set_plural_form (fetcher, plural_forms);
+}
 
-  gtk_widget_set_sensitive (priv->language_code, active);
-  gtk_widget_set_sensitive (priv->charset, active);
-  gtk_widget_set_sensitive (priv->encoding, active);
-  gtk_widget_set_sensitive (priv->plural_forms, active);
+static void
+on_language_code_changed (GtkWidget *widget, GParamSpec *spec, GtrLanguagesFetcher *fetcher)
+{
+  GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
+  int selected = gtk_drop_down_get_selected (GTK_DROP_DOWN (priv->language_code_dropdown));
+  const char *lang = gtk_string_list_get_string (priv->code_store, selected);
+  gtr_languages_fetcher_set_language_code (fetcher, lang);
 }
 
 static void
@@ -345,60 +295,16 @@ on_lang_changed (GtkWidget           *widget,
 static void
 gtr_languages_fetcher_init (GtrLanguagesFetcher *fetcher)
 {
-  GtkWidget *content;
-  GtkBuilder *builder;
-  GError *error = NULL;
-  gchar *root_objects[] = {
-    "main_box",
-    "code_store",
-    NULL
-  };
   GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
+  gtk_widget_init_template (GTK_WIDGET (fetcher));
 
-  gtk_orientable_set_orientation (GTK_ORIENTABLE (fetcher),
-                                  GTK_ORIENTATION_VERTICAL);
-
-  g_type_ensure (gtr_lang_button_get_type ());
-
-  builder = gtk_builder_new ();
-  gtk_builder_add_objects_from_resource (builder, "/org/gnome/translator/gtr-languages-fetcher.ui",
-                                         root_objects, &error);
-  if (error)
-  {
-    g_warning("%s \n", error->message);
-    g_error_free (error);
-  }
-
-  content = GTK_WIDGET (gtk_builder_get_object (builder, "main_box"));
-  g_object_ref (content);
-  priv->language = GTK_WIDGET (gtk_builder_get_object (builder, "language"));
-  priv->language_code = GTK_WIDGET (gtk_builder_get_object (builder, "language_code"));
-  priv->charset = GTK_WIDGET (gtk_builder_get_object (builder, "charset"));
-  priv->encoding = GTK_WIDGET (gtk_builder_get_object (builder, "encoding"));
-  priv->plural_forms = GTK_WIDGET (gtk_builder_get_object (builder, "plural_forms"));
-  priv->advanced = GTK_WIDGET (gtk_builder_get_object (builder, "advanced_check"));
-  priv->code_store = GTK_LIST_STORE (gtk_builder_get_object (builder, "code_store"));
-
-  g_object_unref (builder);
-
-  gtk_box_append (GTK_BOX (fetcher), content);
-
-  /* add items to comboboxes */
+  // add items to comboboxes
   append_from_languages (fetcher);
 
-  g_signal_connect (GTK_ENTRY (gtk_combo_box_get_child(GTK_COMBO_BOX (priv->language_code))),
-                    "activate",
-                    G_CALLBACK (on_language_code_activate),
-                    fetcher);
-  /*g_signal_connect (GTK_ENTRY (gtk_combo_box_get_child(GTK_COMBO_BOX (priv->language_code))),
-                    "focus-out-event",
-                    G_CALLBACK (on_language_code_focus_out_event),
-                    fetcher);*/
-
-  /* To emit the changed signal */
   g_signal_connect (priv->language, "changed",
                     G_CALLBACK (on_lang_changed),
                     fetcher);
+
   g_signal_connect (priv->language_code, "changed",
                     G_CALLBACK (on_combo_box_changed),
                     fetcher);
@@ -412,9 +318,26 @@ gtr_languages_fetcher_init (GtrLanguagesFetcher *fetcher)
                     G_CALLBACK (on_combo_box_changed),
                     fetcher);
 
-  g_signal_connect (priv->advanced, "toggled",
-                    G_CALLBACK (on_advanced_changed),
+  g_signal_connect (priv->charset_dropdown,
+                    "notify::selected",
+                    G_CALLBACK (on_charset_changed),
+                    fetcher);
+  g_signal_connect (priv->encoding_dropdown,
+                    "notify::selected",
+                    G_CALLBACK (on_encoding_changed),
                     fetcher);
+  g_signal_connect (priv->plural_forms_dropdown,
+                    "notify::selected",
+                    G_CALLBACK (on_plural_forms_changed),
+                    fetcher);
+  g_signal_connect (priv->language_code_dropdown,
+                    "notify::selected",
+                    G_CALLBACK (on_language_code_changed),
+                    fetcher);
+
+  // Intial values
+  on_charset_changed (NULL, NULL, fetcher);
+  on_encoding_changed (NULL, NULL, fetcher);
 }
 
 GtkWidget *
@@ -427,8 +350,6 @@ const gchar *
 gtr_languages_fetcher_get_language_name (GtrLanguagesFetcher *fetcher)
 {
   GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
-  g_return_val_if_fail (GTR_IS_LANGUAGES_FETCHER (fetcher), NULL);
-
   return gtr_lang_button_get_lang (GTR_LANG_BUTTON (priv->language));
 }
 
@@ -437,9 +358,6 @@ gtr_languages_fetcher_set_language_name (GtrLanguagesFetcher *fetcher,
                                          const gchar         *name)
 {
   GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
-  g_return_if_fail (GTR_IS_LANGUAGES_FETCHER (fetcher));
-  g_return_if_fail (name != NULL);
-
   gtr_lang_button_set_lang (GTR_LANG_BUTTON (priv->language), name);
 }
 
@@ -447,11 +365,7 @@ const gchar *
 gtr_languages_fetcher_get_language_code (GtrLanguagesFetcher *fetcher)
 {
   GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
-  g_return_val_if_fail (GTR_IS_LANGUAGES_FETCHER (fetcher), NULL);
-
-  //return gtk_entry_get_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->language_code))));
-  GtkEntryBuffer *buffer = gtk_entry_get_buffer (GTK_ENTRY (gtk_combo_box_get_child(GTK_COMBO_BOX 
(priv->language_code))));
-  return gtk_entry_buffer_get_text (buffer);
+  return gtk_editable_get_text (GTK_EDITABLE (priv->language_code));
 }
 
 void
@@ -459,23 +373,14 @@ gtr_languages_fetcher_set_language_code (GtrLanguagesFetcher *fetcher,
                                          const gchar         *code)
 {
   GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
-  g_return_if_fail (GTR_IS_LANGUAGES_FETCHER (fetcher));
-  g_return_if_fail (code != NULL);
-
-  //gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->language_code))), code);
-  GtkEntryBuffer * buffer = gtk_entry_get_buffer (GTK_ENTRY (gtk_combo_box_get_child(GTK_COMBO_BOX 
(priv->language_code))));
-  gtk_entry_buffer_set_text (buffer, code, -1);
+  gtk_editable_set_text (GTK_EDITABLE (priv->language_code), code);
 }
 
 const gchar *
 gtr_languages_fetcher_get_charset (GtrLanguagesFetcher *fetcher)
 {
   GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
-  g_return_val_if_fail (GTR_IS_LANGUAGES_FETCHER (fetcher), NULL);
-
-  //return gtk_entry_get_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->charset))));
-  GtkEntryBuffer *buffer = gtk_entry_get_buffer (GTK_ENTRY (gtk_combo_box_get_child(GTK_COMBO_BOX 
(priv->charset))));
-  return gtk_entry_buffer_get_text(buffer);
+  return gtk_editable_get_text (GTK_EDITABLE (priv->charset));
 }
 
 void
@@ -483,23 +388,14 @@ gtr_languages_fetcher_set_charset (GtrLanguagesFetcher *fetcher,
                                    const gchar         *charset)
 {
   GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
-  g_return_if_fail (GTR_IS_LANGUAGES_FETCHER (fetcher));
-  g_return_if_fail (charset != NULL);
-
-  //gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->charset))), charset);
-  GtkEntryBuffer * buffer = gtk_entry_get_buffer (GTK_ENTRY (gtk_combo_box_get_child(GTK_COMBO_BOX 
(priv->charset))));
-  gtk_entry_buffer_set_text (buffer, charset, -1);
+  gtk_editable_set_text (GTK_EDITABLE (priv->charset), charset);
 }
 
 const gchar *
 gtr_languages_fetcher_get_encoding (GtrLanguagesFetcher *fetcher)
 {
   GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
-  g_return_val_if_fail (GTR_IS_LANGUAGES_FETCHER (fetcher), NULL);
-
-  //return gtk_entry_get_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->encoding))));
-  GtkEntryBuffer *buffer = gtk_entry_get_buffer (GTK_ENTRY (gtk_combo_box_get_child(GTK_COMBO_BOX 
(priv->charset))));
-  return gtk_entry_buffer_get_text(buffer);
+  return gtk_editable_get_text (GTK_EDITABLE (priv->encoding));
 }
 
 void
@@ -507,23 +403,14 @@ gtr_languages_fetcher_set_encoding (GtrLanguagesFetcher *fetcher,
                                     const gchar         *enc)
 {
   GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
-  g_return_if_fail (GTR_IS_LANGUAGES_FETCHER (fetcher));
-  g_return_if_fail (enc != NULL);
-
-  //gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->encoding))), enc);
-  GtkEntryBuffer * buffer = gtk_entry_get_buffer (GTK_ENTRY (gtk_combo_box_get_child(GTK_COMBO_BOX 
(priv->encoding))));
-  gtk_entry_buffer_set_text (buffer, enc, -1);
+  gtk_editable_set_text (GTK_EDITABLE (priv->encoding), enc);
 }
 
 const gchar *
 gtr_languages_fetcher_get_plural_form (GtrLanguagesFetcher *fetcher)
 {
   GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
-  g_return_val_if_fail (GTR_IS_LANGUAGES_FETCHER (fetcher), NULL);
-
-  //return gtk_entry_get_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->plural_forms))));
-  GtkEntryBuffer *buffer = gtk_entry_get_buffer (GTK_ENTRY (gtk_combo_box_get_child(GTK_COMBO_BOX 
(priv->charset))));
-  return gtk_entry_buffer_get_text(buffer);
+  return gtk_editable_get_text (GTK_EDITABLE (priv->plural_forms));
 }
 
 void
@@ -531,10 +418,5 @@ gtr_languages_fetcher_set_plural_form (GtrLanguagesFetcher *fetcher,
                                        const gchar         *plural_form)
 {
   GtrLanguagesFetcherPrivate *priv = gtr_languages_fetcher_get_instance_private (fetcher);
-  g_return_if_fail (GTR_IS_LANGUAGES_FETCHER (fetcher));
-  g_return_if_fail (plural_form != NULL);
-
-  //gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->plural_forms))), plural_form);
-  GtkEntryBuffer * buffer = gtk_entry_get_buffer (GTK_ENTRY (gtk_combo_box_get_child(GTK_COMBO_BOX 
(priv->plural_forms))));
-  gtk_entry_buffer_set_text (buffer, plural_form, -1);
+  gtk_editable_set_text (GTK_EDITABLE (priv->plural_forms), plural_form);
 }
diff --git a/src/gtr-languages-fetcher.h b/src/gtr-languages-fetcher.h
index 83fc323c..a83eb089 100644
--- a/src/gtr-languages-fetcher.h
+++ b/src/gtr-languages-fetcher.h
@@ -18,33 +18,18 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef __GTR_LANGUAGES_FETCHER_H__
-#define __GTR_LANGUAGES_FETCHER_H__
+#pragma once
 
 #include <gtk/gtk.h>
+#include <adwaita.h>
 
 G_BEGIN_DECLS
 
-#define GTR_TYPE_LANGUAGES_FETCHER             (gtr_languages_fetcher_get_type ())
-#define GTR_LANGUAGES_FETCHER(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GTR_TYPE_LANGUAGES_FETCHER, GtrLanguagesFetcher))
-#define GTR_LANGUAGES_FETCHER_CONST(obj)       (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GTR_TYPE_LANGUAGES_FETCHER, GtrLanguagesFetcher const))
-#define GTR_LANGUAGES_FETCHER_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), 
GTR_TYPE_LANGUAGES_FETCHER, GtrLanguagesFetcherClass))
-#define GTR_IS_LANGUAGES_FETCHER(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
GTR_TYPE_LANGUAGES_FETCHER))
-#define GTR_IS_LANGUAGES_FETCHER_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), 
GTR_TYPE_LANGUAGES_FETCHER))
-#define GTR_LANGUAGES_FETCHER_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), 
GTR_TYPE_LANGUAGES_FETCHER, GtrLanguagesFetcherClass))
+#define GTR_TYPE_LANGUAGES_FETCHER (gtr_languages_fetcher_get_type ())
 
-typedef struct _GtrLanguagesFetcher            GtrLanguagesFetcher;
-typedef struct _GtrLanguagesFetcherClass       GtrLanguagesFetcherClass;
+G_DECLARE_FINAL_TYPE (GtrLanguagesFetcher, gtr_languages_fetcher,
+                      GTR, LANGUAGES_FETCHER, AdwPreferencesGroup)
 
-struct _GtrLanguagesFetcherClass
-{
-  GtkBoxClass parent_class;
-
-  void (* changed) (GtrLanguagesFetcher *fetcher);
-  void (* lang_changed) (GtrLanguagesFetcher *fetcher);
-};
-
-GType                  gtr_languages_fetcher_get_type             (void) G_GNUC_CONST;
 
 GtkWidget             *gtr_languages_fetcher_new                  (void);
 
@@ -74,5 +59,3 @@ void                   gtr_languages_fetcher_set_plural_form      (GtrLanguagesF
                                                                    const gchar         *plural_form);
 
 G_END_DECLS
-
-#endif /* __GTR_LANGUAGES_FETCHER_H__ */
diff --git a/src/gtr-languages-fetcher.ui b/src/gtr-languages-fetcher.ui
index 2d322974..e45ed56a 100644
--- a/src/gtr-languages-fetcher.ui
+++ b/src/gtr-languages-fetcher.ui
@@ -1,194 +1,102 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk" version="4.0"/>
-  <object class="GtkListStore" id="code_store">
-    <columns>
-      <column type="gchararray"/>
-      <column type="gpointer"/>
-    </columns>
-  </object>
-  <object class="GtkListStore" id="language_store">
-    <columns>
-      <column type="gchararray"/>
-      <column type="gpointer"/>
-    </columns>
-  </object>
-  <object class="GtkWindow" id="languages-fetcher">
+  <template class="GtrLanguagesFetcher" parent="AdwPreferencesGroup">
+    <property name="title" translatable="true">Language</property>
     <child>
-      <placeholder/>
+      <object class="AdwActionRow">
+        <property name="title" translatable="true">Language</property>
+        <child>
+          <object class="GtrLangButton" id="language">
+            <property name="valign">center</property>
+          </object>
+        </child>
+      </object>
     </child>
-    <property name="child">
-      <object class="GtkBox" id="main_box">
-        <!--<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>-->
-        <property name="margin_start">6</property>
-        <property name="margin_end">6</property>
-        <property name="margin_top">6</property>
-        <property name="margin_bottom">6</property>
-        <property name="orientation">vertical</property>
-        <property name="spacing">6</property>
+    <child>
+      <object class="AdwExpanderRow" id="manual_edit">
+        <property name="title" translatable="yes">Edit options manually</property>
         <child>
-          <object class="GtkGrid">
-            <property name="row_spacing">4</property>
-            <property name="column_spacing">6</property>
-            <child>
-              <object class="GtkLabel" id="label11">
-                <property name="width_request">80</property>
-                <!--<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>-->
-                <property name="label" translatable="1">_Language</property>
-                <property name="use_underline">1</property>
-                <property name="xalign">1</property>
-                <layout>
-                  <property name="column">0</property>
-                  <property name="row">0</property>
-                </layout>
-              </object>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label12">
-                <!--<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>-->
-                <property name="label" translatable="1">Language _code</property>
-                <property name="use_underline">1</property>
-                <property name="xalign">1</property>
-                <layout>
-                  <property name="column">0</property>
-                  <property name="row">2</property>
-                </layout>
-              </object>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label13">
-                <!--<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>-->
-                <property name="label" translatable="1">Character _set</property>
-                <property name="use_underline">1</property>
-                <property name="xalign">1</property>
-                <layout>
-                  <property name="column">0</property>
-                  <property name="row">3</property>
-                </layout>
-              </object>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label14">
-                <!--<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>-->
-                <property name="label" translatable="1">Transfer en_coding</property>
-                <property name="use_underline">1</property>
-                <property name="xalign">1</property>
-                <layout>
-                  <property name="column">0</property>
-                  <property name="row">4</property>
-                </layout>
-              </object>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label10">
-                <!--<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>-->
-                <property name="label" translatable="1">_Plural forms</property>
-                <property name="use_underline">1</property>
-                <property name="xalign">1</property>
-                <layout>
-                  <property name="column">0</property>
-                  <property name="row">5</property>
-                </layout>
-              </object>
-            </child>
+          <object class="AdwEntryRow" id="language_code">
+            <property name="title" translatable="yes">Language code</property>
             <child>
-              <object class="GtkComboBox" id="language_code">
-                <property name="sensitive">0</property>
-                <property name="model">code_store</property>
-                <property name="has_entry">1</property>
-                <property name="entry_text_column">0</property>
-                <property name="child">
-                  <object class="GtkEntry">
-                    <property name="visible">0</property>
-                    <property name="focusable">1</property>
+              <object class="GtkDropDown" id="language_code_dropdown">
+                <property name="valign">center</property>
+                <property name="model">
+                  <object class="GtkStringList" id="code_store">
+                    <items>
+                      <item translatable="yes">Choose language code</item>
+                    </items>
                   </object>
                 </property>
-                <layout>
-                  <property name="column">1</property>
-                  <property name="row">2</property>
-                </layout>
+                <style>
+                  <class name="flat"/>
+                </style>
               </object>
             </child>
+          </object>
+        </child>
+        <child>
+          <object class="AdwEntryRow" id="charset">
+            <property name="title" translatable="yes">Character set</property>
             <child>
-              <object class="GtkComboBoxText" id="charset">
-                <property name="sensitive">0</property>
-                <property name="has_entry">1</property>
-                <items>
-                  <item>UTF-8</item>
-                </items>
-                <property name="child">
-                  <object class="GtkEntry">
-                    <property name="visible">0</property>
-                    <property name="focusable">1</property>
+              <object class="GtkDropDown" id="charset_dropdown">
+                <property name="valign">center</property>
+                <property name="model">
+                  <object class="GtkStringList" id="charset_store">
+                    <items>
+                      <item>UTF-8</item>
+                    </items>
                   </object>
                 </property>
-                <layout>
-                  <property name="column">1</property>
-                  <property name="row">3</property>
-                </layout>
+                <style>
+                  <class name="flat"/>
+                </style>
               </object>
             </child>
+          </object>
+        </child>
+        <child>
+          <object class="AdwEntryRow" id="encoding">
+            <property name="title" translatable="yes">Transfer encoding</property>
             <child>
-              <object class="GtkComboBoxText" id="encoding">
-                <property name="sensitive">0</property>
-                <property name="has_entry">1</property>
-                <items>
-                  <item>8bit</item>
-                </items>
-                <property name="child">
-                  <object class="GtkEntry">
-                    <property name="visible">0</property>
-                    <property name="focusable">1</property>
+              <object class="GtkDropDown" id="encoding_dropdown">
+                <property name="valign">center</property>
+                <property name="model">
+                  <object class="GtkStringList" id="encoding_store">
+                    <items>
+                      <item>8bit</item>
+                    </items>
                   </object>
                 </property>
-                <layout>
-                  <property name="column">1</property>
-                  <property name="row">4</property>
-                </layout>
+                <style>
+                  <class name="flat"/>
+                </style>
               </object>
             </child>
+          </object>
+        </child>
+        <child>
+          <object class="AdwEntryRow" id="plural_forms">
+            <property name="title" translatable="yes">Plural forms</property>
             <child>
-              <object class="GtkComboBoxText" id="plural_forms">
-                <property name="sensitive">0</property>
-                <property name="has_entry">1</property>
-                <property name="child">
-                  <object class="GtkEntry">
-                    <property name="visible">0</property>
-                    <property name="focusable">1</property>
+              <object class="GtkDropDown" id="plural_forms_dropdown">
+                <property name="valign">center</property>
+                <property name="model">
+                  <object class="GtkStringList" id="plural_forms_store">
+                    <items>
+                      <item translatable="yes">Choose plural forms</item>
+                    </items>
                   </object>
                 </property>
-                <layout>
-                  <property name="column">1</property>
-                  <property name="row">5</property>
-                </layout>
+                <style>
+                  <class name="flat"/>
+                </style>
               </object>
             </child>
-            <child>
-              <object class="GtrLangButton" id="language">
-                <property name="hexpand">True</property>
-                <layout>
-                  <property name="column">1</property>
-                  <property name="row">0</property>
-                </layout>
-              </object>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="advanced_check">
-                <property name="label" translatable="1">_Edit options manually</property>
-                <property name="focusable">1</property>
-                <property name="use_underline">1</property>
-                <layout>
-                  <property name="column">1</property>
-                  <property name="row">1</property>
-                </layout>
-              </object>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
           </object>
         </child>
       </object>
-    </property>
-  </object>
+    </child>
+  </template>
 </interface>
diff --git a/src/gtr-window.c b/src/gtr-window.c
index 507cb7fb..be2f701d 100644
--- a/src/gtr-window.c
+++ b/src/gtr-window.c
@@ -30,7 +30,6 @@
 #include "gtr-dirs.h"
 #include "gtr-header.h"
 #include "gtr-msg.h"
-// #include "gtr-notebook.h"
 #include "gtr-tab.h"
 #include "gtr-po.h"
 #include "gtr-projects.h"
@@ -40,6 +39,7 @@
 #include "gtr-window.h"
 #include "gtr-window-activatable.h"
 #include "gtr-profile-manager.h"
+#include "gtr-greeter.h"
 
 #include "translation-memory/gtr-translation-memory.h"
 #include "translation-memory/gtr-translation-memory-dialog.h"
@@ -78,6 +78,7 @@ typedef struct
 
   GtkWidget *projects;
   GtkWidget *dlteams;
+  GtkWidget *greeter;
 
   GtrTab *active_tab;
 
@@ -375,38 +376,13 @@ gtr_window_init (GtrWindow *window)
                     "drag_data_received",
                     G_CALLBACK (drag_data_received_cb), NULL);*/
 
-  /**
-   * Here we define different widgets that provides to append to the main
-   * stack and this widgets can also provide a custom headerbar
-   *
-   * With this widgets we have different views in the same window
-   */
-
-  // CLEANUP :  as GtkNotebook has been removed
-  /*priv->notebook = GTK_WIDGET (gtr_notebook_new ());
-  gtk_widget_show (priv->notebook);
-  g_signal_connect (priv->notebook, "switch-page",
-                    G_CALLBACK (notebook_switch_page), window);
-  g_signal_connect (priv->notebook, "page-added",
-                    G_CALLBACK (notebook_tab_added), window);
-  g_signal_connect (priv->notebook, "page-removed",
-                    G_CALLBACK (notebook_page_removed), window);
-  g_signal_connect (priv->notebook,
-                    "tab_close_request",
-                    G_CALLBACK (notebook_tab_close_request), window);
-
-  gtk_stack_add_named (GTK_STACK (priv->stack), priv->notebook, "poeditor");
-  gtk_stack_add_named (GTK_STACK (priv->header_stack),
-                       gtr_notebook_get_header (GTR_NOTEBOOK (priv->notebook)),
-                       "poeditor");*/
-
   // project selection
   priv->projects = GTK_WIDGET (gtr_projects_new (window));
   gtk_stack_add_named (GTK_STACK (priv->stack), priv->projects, "projects");
   gtk_stack_add_named (GTK_STACK (priv->header_stack),
                        gtr_projects_get_header (GTR_PROJECTS (priv->projects)),
                        "projects");
-  
+
   // DL team selection
   priv->dlteams = GTK_WIDGET (gtr_dl_teams_new (window));
   gtk_stack_add_named (GTK_STACK (priv->stack), priv->dlteams, "dlteams");
@@ -414,6 +390,13 @@ gtr_window_init (GtrWindow *window)
                        gtr_dl_teams_get_header (GTR_DL_TEAMS (priv->dlteams)),
                        "dlteams");
 
+  // Greeter, First launch view
+  priv->greeter = GTK_WIDGET (gtr_greeter_new (window));
+  gtk_stack_add_named (GTK_STACK (priv->stack), priv->greeter, "greeter");
+  gtk_stack_add_named (GTK_STACK (priv->header_stack),
+                       gtr_greeter_get_header (GTR_GREETER (priv->greeter)),
+                       "greeter");
+
   gtk_widget_show (priv->stack);
 
   // translation memory
@@ -882,14 +865,20 @@ gtr_window_show_dlteams (GtrWindow *window)
   gtk_stack_set_visible_child_name (GTK_STACK (priv->header_stack), "dlteams");
   gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), "dlteams");
   gtk_window_set_title (window,_("Load from Damned Lies"));
+
+  /* Load teams and modules automatically */
+  gtr_dl_teams_load_json (GTR_DL_TEAMS (priv->dlteams));
 }
 
-/*void
-gtr_window_remove_all_pages (GtrWindow *window)
+void
+gtr_window_show_greeter (GtrWindow *window)
 {
-  //GtrWindowPrivate *priv = gtr_window_get_instance_private(window);
-  //gtr_notebook_remove_all_pages (GTR_NOTEBOOK (priv->notebook));
-}*/
+  GtrWindowPrivate *priv = gtr_window_get_instance_private (window);
+
+  gtk_stack_set_visible_child_name (GTK_STACK (priv->header_stack), "greeter");
+  gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), "greeter");
+  gtk_window_set_title (window, _("Welcome to Translation Editor"));
+}
 
 void
 gtr_window_show_tm_dialog (GtrWindow *window)
diff --git a/src/gtr-window.h b/src/gtr-window.h
index 79ca2ffe..810d1569 100644
--- a/src/gtr-window.h
+++ b/src/gtr-window.h
@@ -88,6 +88,7 @@ void gtr_window_toggle_search_bar (GtrWindow *window);
 void gtr_window_show_projects (GtrWindow *window);
 void gtr_window_show_poeditor (GtrWindow *window);
 void gtr_window_show_dlteams (GtrWindow *window);
+void gtr_window_show_greeter (GtrWindow *window);
 
 G_END_DECLS
 #endif /* __GTR_WINDOW_H__ */
diff --git a/src/gtr-window.ui b/src/gtr-window.ui
index 8fe44cc3..cf0a0fcb 100644
--- a/src/gtr-window.ui
+++ b/src/gtr-window.ui
@@ -9,14 +9,8 @@
         <property name="orientation">vertical</property>
         <child>
           <object class="GtkStack" id="header_stack">
-            <!--<property name="vexpand">1</property>-->
             <child>
               <object class="GtkHeaderBar" id="header_bar">
-                <!--<child type="end">
-              <object class="GtkMenuButton" id="menu_button">
-                <property name="icon_name">open-menu-symbolic</property>
-              </object>
-            </child>-->
               </object>
             </child>
           </object>
diff --git a/src/gtranslator.gresource.xml b/src/gtranslator.gresource.xml
index 1df479f7..45c14170 100644
--- a/src/gtranslator.gresource.xml
+++ b/src/gtranslator.gresource.xml
@@ -17,5 +17,6 @@
     <file preprocess="xml-stripblanks">help-overlay.ui</file>
     <file preprocess="xml-stripblanks">gtr-search-bar.ui</file>
     <file preprocess="xml-stripblanks">gtr-upload-dialog.ui</file>
+    <file preprocess="xml-stripblanks">gtr-greeter.ui</file>
   </gresource>
 </gresources>
diff --git a/src/meson.build b/src/meson.build
index 9b73441c..06fddb3f 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -37,7 +37,6 @@ sources = files(
   'gtr-actions-search.c',
   'gtr-actions-view.c',
   'gtr-application.c',
-  # 'gtr-assistant.c',
   'gtr-close-button.c',
   'gtr-close-confirmation-dialog.c',
   'gtr-context.c',
@@ -73,6 +72,7 @@ sources = files(
   'gtr-window.c',
   'gtr-search-bar.c',
   'gtr-upload-dialog.c',
+  'gtr-greeter.c',
 )
 
 marshal = 'gtr-marshal'


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