[glade] GladeProject / GladeCommand: Make project translation domain settings undoable



commit 527b2cf298217797268be1ee3020f5e97d39e89c
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date:   Thu Apr 11 14:34:53 2013 +0900

    GladeProject / GladeCommand: Make project translation domain settings undoable

 gladeui/glade-command.c |  141 +++++++++++++++++++++++++++++++++++++++++++++++
 gladeui/glade-command.h |    3 +
 gladeui/glade-project.c |   11 ++-
 3 files changed, 151 insertions(+), 4 deletions(-)
---
diff --git a/gladeui/glade-command.c b/gladeui/glade-command.c
index 6afdf99..bf1c1ba 100644
--- a/gladeui/glade-command.c
+++ b/gladeui/glade-command.c
@@ -2485,6 +2485,147 @@ glade_command_set_project_target  (GladeProject *project,
 
 /******************************************************************************
  * 
+ * This command sets the translation domain of a GladeProject
+ * 
+ *****************************************************************************/
+typedef struct
+{
+  GladeCommand parent;
+  gchar       *new_domain;
+  gchar       *old_domain;
+} GladeCommandDomain;
+
+GLADE_MAKE_COMMAND (GladeCommandDomain, glade_command_domain);
+#define GLADE_COMMAND_DOMAIN_TYPE       (glade_command_domain_get_type ())
+#define GLADE_COMMAND_DOMAIN(o)                 (G_TYPE_CHECK_INSTANCE_CAST ((o), GLADE_COMMAND_DOMAIN_TYPE, 
GladeCommandDomain))
+#define GLADE_COMMAND_DOMAIN_CLASS(k)   (G_TYPE_CHECK_CLASS_CAST ((k), GLADE_COMMAND_DOMAIN_TYPE, 
GladeCommandDomainClass))
+#define GLADE_IS_COMMAND_DOMAIN(o)      (G_TYPE_CHECK_INSTANCE_TYPE ((o), GLADE_COMMAND_DOMAIN_TYPE))
+#define GLADE_IS_COMMAND_DOMAIN_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GLADE_COMMAND_DOMAIN_TYPE))
+
+static gboolean
+glade_command_domain_execute (GladeCommand *cmd)
+{
+  GladeCommandDomain *me = (GladeCommandDomain *) cmd;
+
+  glade_project_set_translation_domain (cmd->priv->project, me->new_domain);
+
+  return TRUE;
+}
+
+static gboolean
+glade_command_domain_undo (GladeCommand *cmd)
+{
+  GladeCommandDomain *me = (GladeCommandDomain *) cmd;
+
+  glade_project_set_translation_domain (cmd->priv->project, me->old_domain);
+
+  return TRUE;
+}
+
+static void
+glade_command_domain_finalize (GObject *obj)
+{
+  GladeCommandDomain *me = (GladeCommandDomain *) obj;
+
+  g_free (me->new_domain);
+  g_free (me->old_domain);
+
+  glade_command_finalize (obj);
+}
+
+static gboolean
+glade_command_domain_unifies (GladeCommand *this_cmd, GladeCommand *other_cmd)
+{
+  GladeCommandDomain *me;
+
+  /* Do we unify with self ? */
+  if (!other_cmd)
+    {
+      if (GLADE_IS_COMMAND_DOMAIN (this_cmd))
+        {
+          me = (GladeCommandDomain *) this_cmd;
+
+         return g_strcmp0 (me->new_domain, me->old_domain) == 0;
+        }
+      return FALSE;
+    }
+
+  if (GLADE_IS_COMMAND_DOMAIN (this_cmd) &&
+      GLADE_IS_COMMAND_DOMAIN (other_cmd))
+    {
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+static void
+glade_command_domain_collapse (GladeCommand *this_cmd, GladeCommand *other_cmd)
+{
+  GladeCommandDomain *this;
+  GladeCommandDomain *other;
+
+  g_return_if_fail (GLADE_IS_COMMAND_DOMAIN (this_cmd) &&
+                    GLADE_IS_COMMAND_DOMAIN (other_cmd));
+
+  this = GLADE_COMMAND_DOMAIN (this_cmd);
+  other = GLADE_COMMAND_DOMAIN (other_cmd);
+
+  g_free (this->new_domain);
+  this->new_domain = g_strdup (other->new_domain);
+
+  g_free (this_cmd->priv->description);
+  this_cmd->priv->description =
+    g_strdup_printf (_("Setting translation domain to '%s'"), 
+                    this->new_domain);
+}
+
+/**
+ * glade_command_set_project_domain:
+ * @project: A #GladeProject
+ * @domain: The translation domain for @project
+ *
+ * Sets @domain as the translation domain for @project.
+ */
+void
+glade_command_set_project_domain  (GladeProject *project,
+                                  const gchar  *domain)
+{
+  GladeCommandDomain *me;
+  const gchar *old_domain;
+
+  g_return_if_fail (GLADE_IS_PROJECT (project));
+
+  old_domain = glade_project_get_translation_domain (project);
+
+  /* Do nothing if nothing has changed */
+  if (g_strcmp0 (domain, old_domain) == 0)
+    return;
+
+  /* load up the command */
+  me = g_object_new (GLADE_COMMAND_DOMAIN_TYPE, NULL);
+  GLADE_COMMAND (me)->priv->project = project;
+
+  me->new_domain = g_strdup (domain);
+  me->old_domain = g_strdup (old_domain);
+
+  GLADE_COMMAND (me)->priv->description =
+    g_strdup_printf (_("Setting translation domain to '%s'"), 
+                    me->new_domain);
+
+  glade_command_check_group (GLADE_COMMAND (me));
+
+  /* execute the command and push it on the stack if successful 
+   * this sets the actual policy
+   */
+  if (glade_command_domain_execute (GLADE_COMMAND (me)))
+    glade_project_push_undo (GLADE_COMMAND (me)->priv->project, GLADE_COMMAND (me));
+  else
+    g_object_unref (G_OBJECT (me));
+}
+
+/******************************************************************************
+ * 
  * This command sets the template object in a GtkBuilder file
  * 
  *****************************************************************************/
diff --git a/gladeui/glade-command.h b/gladeui/glade-command.h
index ccd3866..606d5a5 100644
--- a/gladeui/glade-command.h
+++ b/gladeui/glade-command.h
@@ -85,6 +85,9 @@ void           glade_command_set_project_target  (GladeProject *project,
                                                  gint          major,
                                                  gint          minor);
 
+void           glade_command_set_project_domain  (GladeProject *project,     
+                                                 const gchar  *domain);
+
 void           glade_command_set_template        (GladeProject *project,     
                                                  GladeWidget  *widget);
 
diff --git a/gladeui/glade-project.c b/gladeui/glade-project.c
index 022525e..dc1d53e 100644
--- a/gladeui/glade-project.c
+++ b/gladeui/glade-project.c
@@ -4227,9 +4227,9 @@ glade_project_target_version_box_fill (GladeProject *project, GtkWidget *vbox)
 }
 
 static void
-on_domain_entry_activate (GtkWidget *entry, GladeProject *project)
+on_domain_entry_changed (GtkWidget *entry, GladeProject *project)
 {
-  glade_project_set_translation_domain (project, gtk_entry_get_text (GTK_ENTRY (entry)));
+  glade_command_set_project_domain (project, gtk_entry_get_text (GTK_ENTRY (entry)));
 }
 
 static void
@@ -4436,8 +4436,8 @@ glade_project_build_prefs_dialog (GladeProject *project)
   g_signal_connect (verify_button, "clicked",
                     G_CALLBACK (verify_clicked), project);
 
-  g_signal_connect (priv->domain_entry, "activate",
-                    G_CALLBACK (on_domain_entry_activate), project);
+  g_signal_connect (priv->domain_entry, "changed",
+                    G_CALLBACK (on_domain_entry_changed), project);
 
   gtk_builder_connect_signals (builder, NULL);
   g_object_unref (builder);
@@ -4531,7 +4531,10 @@ glade_project_set_translation_domain (GladeProject *project, const gchar *domain
       g_free (priv->translation_domain);
       priv->translation_domain = g_strdup (domain);
 
+      g_signal_handlers_block_by_func (priv->domain_entry, on_domain_entry_changed, project);
       gtk_entry_set_text (GTK_ENTRY (priv->domain_entry), domain);
+      g_signal_handlers_unblock_by_func (priv->domain_entry, on_domain_entry_changed, project);
+
       g_object_notify_by_pspec (G_OBJECT (project),
                                 properties[PROP_TRANSLATION_DOMAIN]);
     }


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