[nautilus] batch-rename-dialog: use positions for tag handling



commit 7fb5aa77c904905e9af7e34b5f3a1dbd4dc66b4f
Author: Carlos Soriano <csoriano gnome org>
Date:   Tue Sep 13 22:45:46 2016 +0200

    batch-rename-dialog: use positions for tag handling
    
    When a tag is added, deleted or moved or a text is changed, inserted
    or deleted, we need to do update the text and tags already present
    based on what changed.
    
    We were checking whether a tag was present or not matching with the
    text rather than deterministically adding, removing or updating the
    positions based on the direct user interaction.
    
    Doing it in this way is a potential problem since two tags added
    writing manually would confuse the underlying handling, apart of being
    harder to have a consistent state of the tags like deleting multiple
    tags at once, deleting tags with text on the sides when selected,
    replacing tags with text, crashes when using overwrite mode instead of
    insertion mode, or crashes when using modifiers. Apart of making the
    handling more complex.
    
    This patch refactors the tag handling for using positions and direct
    manipulation of them instead of text.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=771069

 src/nautilus-batch-rename-dialog.c               |  492 ++++++++--------------
 src/resources/ui/nautilus-batch-rename-dialog.ui |    4 +-
 2 files changed, 180 insertions(+), 316 deletions(-)
---
diff --git a/src/nautilus-batch-rename-dialog.c b/src/nautilus-batch-rename-dialog.c
index 837bd32..184b5ac 100644
--- a/src/nautilus-batch-rename-dialog.c
+++ b/src/nautilus-batch-rename-dialog.c
@@ -101,12 +101,6 @@ struct _NautilusBatchRenameDialog
 
     gint row_height;
     gboolean rename_clicked;
-
-    /* the numbers of characters from the name entry */
-    gint name_entry_characters;
-    gboolean tags_deleted;
-    gint cursor_position;
-    gboolean use_manual_cursor_position;
 };
 
 typedef struct
@@ -114,8 +108,6 @@ typedef struct
     gboolean available;
     gboolean set;
     gint position;
-    gint original_position;
-    gint new_position;
     /* if the tag was just added, then we shouldn't update it's position */
     gboolean just_added;
     TagConstants tag_constants;
@@ -198,10 +190,15 @@ add_tag (NautilusBatchRenameDialog *self,
     tag_data->just_added = TRUE;
     tag_data->position = cursor_position;
 
+    /* FIXME: We can add a tag when the cursor is inside a tag, which breaks this.
+     * We need to check the cursor movement and update the actions acordingly or
+     * even better add the tag at the end of the previous tag if this happens.
+     */
     gtk_editable_insert_text (GTK_EDITABLE (self->name_entry),
                               tag_text_representation,
                               g_utf8_strlen (tag_text_representation, -1),
                               &cursor_position);
+    tag_data->just_added = FALSE;
     gtk_editable_set_position (GTK_EDITABLE (self->name_entry), cursor_position);
 
     gtk_entry_grab_focus_without_selecting (GTK_ENTRY (self->name_entry));
@@ -322,8 +319,8 @@ row_selected (GtkListBox    *box,
 }
 
 static gint
-compare_tag_position (gconstpointer a,
-                      gconstpointer b)
+compare_int (gconstpointer a,
+             gconstpointer b)
 {
     int *number1 = (int *) a;
     int *number2 = (int *) b;
@@ -366,7 +363,7 @@ split_entry_text (NautilusBatchRenameDialog *self,
         }
     }
 
-    g_array_sort (tag_positions, compare_tag_position);
+    g_array_sort (tag_positions, compare_int);
 
     for (i = 0; i < tags; i++)
     {
@@ -1354,54 +1351,6 @@ file_names_list_has_duplicates_async (NautilusBatchRenameDialog *dialog,
     g_task_run_in_thread (task, file_names_list_has_duplicates_async_thread);
 }
 
-static void
-update_tags (NautilusBatchRenameDialog *dialog)
-{
-    TagData *tag_data;
-    const gchar *entry_text;
-    g_autoptr (GList) tag_info_keys = NULL;
-    GList *l;
-    gint character_difference;
-    gint cursor_position;
-
-    entry_text = gtk_entry_get_text (GTK_ENTRY (dialog->name_entry));
-
-    if (dialog->use_manual_cursor_position)
-    {
-        gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry),
-                                   dialog->cursor_position);
-    }
-
-    if (dialog->tags_deleted)
-    {
-        dialog->tags_deleted = FALSE;
-        gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry),
-                                   g_utf8_strlen (entry_text, -1));
-    }
-
-    g_object_get (dialog->name_entry, "cursor-position", &cursor_position, NULL);
-
-    character_difference = g_utf8_strlen (entry_text, -1) - dialog->name_entry_characters;
-    dialog->name_entry_characters = g_utf8_strlen (entry_text, -1);
-
-    tag_info_keys = g_hash_table_get_keys (dialog->tag_info_table);
-    for (l = tag_info_keys; l != NULL; l = l->next)
-    {
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, l->data);
-        if (tag_data->just_added)
-        {
-            tag_data->just_added = FALSE;
-        }
-        else
-        {
-            if (tag_data->set && cursor_position <= tag_data->position)
-            {
-                tag_data->position += character_difference;
-            }
-        }
-    }
-}
-
 static gboolean
 have_unallowed_character (NautilusBatchRenameDialog *dialog)
 {
@@ -1542,7 +1491,7 @@ update_display_text (NautilusBatchRenameDialog *dialog)
         dialog->duplicates = NULL;
     }
 
-    update_tags (dialog);
+    //update_tags (dialog);
 
     if (dialog->new_names != NULL)
     {
@@ -1573,12 +1522,6 @@ update_display_text (NautilusBatchRenameDialog *dialog)
 }
 
 static void
-file_names_widget_entry_on_changed (NautilusBatchRenameDialog *dialog)
-{
-    update_display_text (dialog);
-}
-
-static void
 batch_rename_dialog_mode_changed (NautilusBatchRenameDialog *dialog)
 {
     if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->format_mode_button)))
@@ -1831,293 +1774,219 @@ file_names_widget_on_activate (NautilusBatchRenameDialog *dialog)
     prepare_batch_rename (dialog);
 }
 
-static gboolean
+static void
 remove_tag (NautilusBatchRenameDialog *dialog,
-            const gchar               *tag_name,
-            const gchar               *action_name,
-            gint                       keyval,
-            gboolean                   is_modifier)
+            TagData                   *tag_data)
 {
-    TagData *tag_data;
-    gint cursor_position;
-    GString *new_entry_text;
-    GString *entry_text;
-    gboolean delete_tag;
     GAction *action;
 
-    delete_tag = FALSE;
-
-    g_object_get (dialog->name_entry, "cursor-position", &cursor_position, NULL);
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, tag_name);
-    entry_text = g_string_new (gtk_entry_get_text (GTK_ENTRY (dialog->name_entry)));
-
     if (!tag_data->set)
     {
-        return FALSE;
-    }
-
-    if (keyval == GDK_KEY_BackSpace)
-    {
-        if (cursor_position > tag_data->position &&
-            cursor_position <= tag_data->position + g_utf8_strlen (tag_name, -1))
-        {
-            delete_tag = TRUE;
-        }
-    }
-
-    if (keyval == GDK_KEY_Delete)
-    {
-        if (cursor_position >= tag_data->position &&
-            cursor_position < tag_data->position + g_utf8_strlen (tag_name, -1))
-        {
-            delete_tag = TRUE;
-        }
-    }
+        g_warning ("Trying to remove an already removed tag");
 
-    if (!is_modifier &&
-        keyval != GDK_KEY_Left &&
-        keyval != GDK_KEY_Right &&
-        keyval != GDK_KEY_Delete &&
-        keyval != GDK_KEY_Return &&
-        keyval != GDK_KEY_Escape &&
-        keyval != GDK_KEY_Tab &&
-        keyval != GDK_KEY_End &&
-        keyval != GDK_KEY_Home)
-    {
-        if (cursor_position > tag_data->position &&
-            cursor_position < tag_data->position + g_utf8_strlen (tag_name, -1))
-        {
-            delete_tag = TRUE;
-        }
+        return;
     }
 
-    if (delete_tag)
-    {
-        action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                             action_name);
-        g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
-
-        new_entry_text = g_string_new ("");
-        new_entry_text = g_string_append_len (new_entry_text,
-                                              entry_text->str,
-                                              tag_data->position);
-        new_entry_text = g_string_append (new_entry_text,
-                                          g_utf8_offset_to_pointer (entry_text->str,
-                                                                    tag_data->position + g_utf8_strlen 
(tag_name, -1)));
-
-        tag_data->set = FALSE;
-        dialog->cursor_position = tag_data->position;
-        dialog->use_manual_cursor_position = TRUE;
-        gtk_entry_set_text (GTK_ENTRY (dialog->name_entry), new_entry_text->str);
-        gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), tag_data->position);
-        dialog->use_manual_cursor_position = FALSE;
-
-        g_string_free (new_entry_text, TRUE);
-        g_string_free (entry_text, TRUE);
+    tag_data->set = FALSE;
+    tag_data->position = -1;
+    action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
+                                         tag_data->tag_constants.action_name);
+    g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
+}
 
-        return TRUE;
-    }
+static gint
+compare_tag_position (gconstpointer a,
+                      gconstpointer b)
+{
+    const TagData *tag_data1 = a;
+    const TagData *tag_data2 = b;
 
-    return FALSE;
+    return tag_data1->position - tag_data2->position;
 }
 
-static GString *
-remove_tag_selection (NautilusBatchRenameDialog *dialog,
-                      GString                   *old_entry_text,
-                      const gchar               *action_name,
-                      const gchar               *tag_name,
-                      gint                       start,
-                      gint                       end)
+typedef enum
+{
+    TEXT_WAS_DELETED,
+    TEXT_WAS_INSERTED
+} TextChangedMode;
+
+static GList*
+get_tags_intersecting_sorted (NautilusBatchRenameDialog *self,
+                              gint                       start_position,
+                              gint                       end_position,
+                              TextChangedMode            text_changed_mode)
 {
+    g_autoptr (GList) tag_info_keys = NULL;
     TagData *tag_data;
-    GAction *action;
-    GString *new_entry_text;
-
-    new_entry_text = NULL;
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, tag_name);
+    GList *l;
+    GList *intersecting_tags = NULL;
+    gint tag_end_position;
 
-    if (tag_data->set && tag_data->original_position < end &&
-        tag_data->original_position + g_utf8_strlen (tag_name, -1) > start)
+    tag_info_keys = g_hash_table_get_keys (self->tag_info_table);
+    for (l = tag_info_keys; l != NULL; l = l->next)
     {
-        new_entry_text = g_string_new ("");
-        new_entry_text = g_string_append_len (new_entry_text,
-                                              old_entry_text->str,
-                                              tag_data->new_position);
-        new_entry_text = g_string_append (new_entry_text,
-                                          g_utf8_offset_to_pointer (old_entry_text->str,
-                                                                    tag_data->new_position + g_utf8_strlen 
(tag_name, -1)));
+        g_autofree gchar *tag_text_representation = NULL;
 
-        tag_data->set = FALSE;
+        tag_data = g_hash_table_lookup (self->tag_info_table, l->data);
+        tag_text_representation = batch_rename_get_tag_text_representation (tag_data->tag_constants);
+        tag_end_position = tag_data->position + g_utf8_strlen (tag_text_representation, -1);
+        if (tag_data->set && !tag_data->just_added)
+        {
+            gboolean selection_intersects_tag_start;
+            gboolean selection_intersects_tag_end;
+            gboolean tag_is_contained_in_selection;
 
-        action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                             action_name);
-        g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
-    }
+            if (text_changed_mode == TEXT_WAS_DELETED)
+            {
+                selection_intersects_tag_start = end_position > tag_data->position &&
+                                                 end_position <= tag_end_position;
+                selection_intersects_tag_end = start_position >= tag_data->position &&
+                                               start_position < tag_end_position;
+                tag_is_contained_in_selection = start_position <= tag_data->position &&
+                                                end_position >= tag_end_position;
+            }
+            else
+            {
+                selection_intersects_tag_start = start_position > tag_data->position &&
+                                                 start_position < tag_end_position;
+                selection_intersects_tag_end = FALSE;
+                tag_is_contained_in_selection = FALSE;
 
-    if (new_entry_text == NULL)
-    {
-        return g_string_new (old_entry_text->str);
+            }
+            if (selection_intersects_tag_end || selection_intersects_tag_start || 
tag_is_contained_in_selection)
+            {
+                intersecting_tags = g_list_prepend (intersecting_tags, tag_data);
+            }
+        }
     }
-    return new_entry_text;
+
+    return g_list_sort (intersecting_tags, compare_tag_position);
 }
 
 static void
-update_tag_position (NautilusBatchRenameDialog *dialog,
-                     const gchar               *tag_name,
-                     GString                   *new_entry_text)
+update_tags_positions (NautilusBatchRenameDialog *self,
+                       gint                       start_position,
+                       gint                       end_position,
+                       TextChangedMode            text_changed_mode)
 {
+    g_autoptr (GList) tag_info_keys = NULL;
     TagData *tag_data;
+    GList *l;
 
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, tag_name);
-
-    if (tag_data->set)
+    tag_info_keys = g_hash_table_get_keys (self->tag_info_table);
+    for (l = tag_info_keys; l != NULL; l = l->next)
     {
-        tag_data->original_position = tag_data->position;
-        tag_data->new_position = g_utf8_pointer_to_offset (new_entry_text->str,
-                                                           g_strrstr (new_entry_text->str, tag_name));
+        tag_data = g_hash_table_lookup (self->tag_info_table, l->data);
+        if (tag_data->set && !tag_data->just_added && tag_data->position >= start_position)
+        {
+            if (text_changed_mode == TEXT_WAS_DELETED)
+            {
+                tag_data->position -= end_position - start_position;
+            }
+            else
+            {
+                tag_data->position += end_position - start_position;
+            }
+        }
     }
 }
 
-static gboolean
-on_key_press_event (GtkWidget   *widget,
-                    GdkEventKey *event,
-                    gpointer     user_data)
+static void
+on_delete_text (GtkEditable *editable,
+                gint         start_position,
+                gint         end_position,
+                gpointer     user_data)
 {
-    NautilusBatchRenameDialog *dialog;
-    gint keyval;
-    GdkEvent *gdk_event;
-    GString *old_entry_text;
-    GString *new_entry_text;
-    gboolean entry_has_selection;
-    gint start;
-    gint end;
-    g_autoptr (GList) tag_info_keys = NULL;
+    NautilusBatchRenameDialog *self;
+    g_autoptr (GList) intersecting_tags = NULL;
+    gint final_start_position;
+    gint final_end_position;
     GList *l;
-    gboolean tag_removed = FALSE;
-    TagData *tag_data;
-    const gchar *action_name;
-    gint minimum_tag_position;
 
-    gdk_event = (GdkEvent *) event;
-    dialog = NAUTILUS_BATCH_RENAME_DIALOG (user_data);
-    keyval = event->keyval;
-    tag_info_keys = g_hash_table_get_keys (dialog->tag_info_table);
-    entry_has_selection = (gtk_editable_get_selection_bounds (GTK_EDITABLE (dialog->name_entry),
-                                                              &start,
-                                                              &end));
+    self = NAUTILUS_BATCH_RENAME_DIALOG (user_data);
+    intersecting_tags = get_tags_intersecting_sorted (self, start_position,
+                                                      end_position, TEXT_WAS_DELETED);
+    if (intersecting_tags)
+    {
+        gint last_tag_end_position;
+        g_autofree gchar *tag_text_representation = NULL;
+        TagData *first_tag = g_list_first (intersecting_tags)->data;
+        TagData *last_tag = g_list_last (intersecting_tags)->data;
 
-    if (event->state & GDK_CONTROL_MASK)
+        tag_text_representation = batch_rename_get_tag_text_representation (last_tag->tag_constants);
+        last_tag_end_position = last_tag->position +
+                                g_utf8_strlen (tag_text_representation, -1);
+        final_start_position = MIN (start_position, first_tag->position);
+        final_end_position = MAX (end_position, last_tag_end_position);
+    }
+    else
     {
-        return GDK_EVENT_PROPAGATE;
+        final_start_position = start_position;
+        final_end_position = end_position;
     }
 
+    g_signal_handlers_block_by_func (editable, (gpointer) on_delete_text, user_data);
+    gtk_editable_delete_text (editable, final_start_position, final_end_position);
+    g_signal_handlers_unblock_by_func (editable, (gpointer) on_delete_text, user_data);
 
-    if (entry_has_selection &&
-        ((keyval == GDK_KEY_Delete || keyval == GDK_KEY_BackSpace) ||
-         (!gdk_event->key.is_modifier &&
-          keyval != GDK_KEY_Left &&
-          keyval != GDK_KEY_Right &&
-          keyval != GDK_KEY_Return &&
-          keyval != GDK_KEY_Escape &&
-          keyval != GDK_KEY_Tab &&
-          keyval != GDK_KEY_End &&
-          keyval != GDK_KEY_Home)))
+    /* Mark the tags as removed */
+    for (l = intersecting_tags; l != NULL; l = l->next)
     {
-        old_entry_text = g_string_new (gtk_entry_get_text (GTK_ENTRY (dialog->name_entry)));
-
-        minimum_tag_position = G_MAXINT;
-
-        for (l = tag_info_keys; l != NULL; l = l->next)
-        {
-            g_autofree gchar *tag_text_representation = NULL;
+        remove_tag (self, l->data);
+    }
 
-            tag_data = g_hash_table_lookup (dialog->tag_info_table, l->data);
-            tag_text_representation = batch_rename_get_tag_text_representation (tag_data->tag_constants);
-            if (tag_data->set)
-            {
-                update_tag_position (dialog, tag_text_representation, old_entry_text);
-                new_entry_text = remove_tag_selection (dialog,
-                                                       old_entry_text,
-                                                       tag_data->tag_constants.action_name,
-                                                       tag_text_representation,
-                                                       start,
-                                                       end);
-
-                if (!g_string_equal (new_entry_text, old_entry_text))
-                {
-                    if (tag_data->position < minimum_tag_position)
-                    {
-                        minimum_tag_position = tag_data->position;
-                    }
-
-                    tag_removed = TRUE;
-                }
-                g_string_free (old_entry_text, TRUE);
-                old_entry_text = new_entry_text;
-            }
-        }
+    /* If we removed the numbering tag, we want to enable all numbering actions */
+    if (!numbering_tag_is_some_added (self))
+    {
+        guint i;
 
-        /* If we removed the numbering tag, we want to enable all numbering actions */
-        if (!numbering_tag_is_some_added (dialog))
+        for (i = 0; i < G_N_ELEMENTS (numbering_tags_constants); i++)
         {
-            guint i;
-
-            for (i = 0; i < G_N_ELEMENTS (numbering_tags_constants); i++)
-            {
-                enable_action (dialog, numbering_tags_constants[i].action_name);
-            }
+            enable_action (self, numbering_tags_constants[i].action_name);
         }
+    }
 
-        if (minimum_tag_position != G_MAXINT)
-        {
-            dialog->use_manual_cursor_position = TRUE;
-            dialog->cursor_position = minimum_tag_position;
+    update_tags_positions (self, final_start_position,
+                           final_end_position, TEXT_WAS_DELETED);
+    update_display_text (self);
 
-            gtk_entry_set_text (GTK_ENTRY (dialog->name_entry), new_entry_text->str);
-            gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), minimum_tag_position);
+    g_signal_stop_emission_by_name (editable, "delete-text");
+}
 
-            dialog->use_manual_cursor_position = FALSE;
+static void
+on_insert_text (GtkEditable *editable,
+                const gchar *new_text,
+                gint         new_text_length,
+                gpointer     position,
+                gpointer     user_data)
+{
+    NautilusBatchRenameDialog *self;
+    gint start_position;
+    gint end_position;
+    g_autoptr (GList) intersecting_tags = NULL;
 
-            g_string_free (new_entry_text, TRUE);
-        }
-    }
-    else
+    self = NAUTILUS_BATCH_RENAME_DIALOG (user_data);
+    start_position = *(int *)position;
+    end_position = start_position + g_utf8_strlen (new_text, -1);
+    intersecting_tags = get_tags_intersecting_sorted (self, start_position,
+                                                      end_position, TEXT_WAS_INSERTED);
+    if (!intersecting_tags)
     {
-        for (l = tag_info_keys; l != NULL; l = l->next)
-        {
-            g_autofree gchar *tag_text_representation = NULL;
-
-            tag_data = g_hash_table_lookup (dialog->tag_info_table, l->data);
-            action_name = tag_data->tag_constants.action_name;
-            tag_text_representation = batch_rename_get_tag_text_representation (tag_data->tag_constants);
-            if (remove_tag (dialog, tag_text_representation, action_name,
-                            keyval, gdk_event->key.is_modifier))
-            {
-                tag_removed = TRUE;
-
-                break;
-            }
-        }
+        g_signal_handlers_block_by_func (editable, (gpointer) on_insert_text, user_data);
+        gtk_editable_insert_text (editable, new_text, new_text_length, position);
+        g_signal_handlers_unblock_by_func (editable, (gpointer) on_insert_text, user_data);
 
-        /* If we removed the numbering tag, we want to enable all numbering actions */
-        if (!numbering_tag_is_some_added (dialog))
-        {
-            guint i;
-
-            for (i = 0; i < G_N_ELEMENTS (numbering_tags_constants); i++)
-            {
-                enable_action (dialog, numbering_tags_constants[i].action_name);
-            }
-        }
+        update_tags_positions (self, start_position, end_position, TEXT_WAS_INSERTED);
+        update_display_text (self);
     }
 
-    if ((keyval == GDK_KEY_Delete || keyval == GDK_KEY_BackSpace) && tag_removed)
-    {
-        return GDK_EVENT_STOP;
-    }
+    g_signal_stop_emission_by_name (editable, "insert-text");
+}
 
-    return GDK_EVENT_PROPAGATE;
+static void
+file_names_widget_entry_on_changed (NautilusBatchRenameDialog *self)
+{
+   update_display_text (self);
 }
 
 static void
@@ -2208,8 +2077,8 @@ nautilus_batch_rename_dialog_class_init (NautilusBatchRenameDialogClass *klass)
     gtk_widget_class_bind_template_child (widget_class, NautilusBatchRenameDialog, add_tag_menu);
     gtk_widget_class_bind_template_child (widget_class, NautilusBatchRenameDialog, numbering_label);
 
-    gtk_widget_class_bind_template_callback (widget_class, file_names_widget_entry_on_changed);
     gtk_widget_class_bind_template_callback (widget_class, file_names_widget_on_activate);
+    gtk_widget_class_bind_template_callback (widget_class, file_names_widget_entry_on_changed);
     gtk_widget_class_bind_template_callback (widget_class, batch_rename_dialog_mode_changed);
     gtk_widget_class_bind_template_callback (widget_class, add_button_clicked);
     gtk_widget_class_bind_template_callback (widget_class, add_popover_closed);
@@ -2218,7 +2087,8 @@ nautilus_batch_rename_dialog_class_init (NautilusBatchRenameDialogClass *klass)
     gtk_widget_class_bind_template_callback (widget_class, select_next_conflict_up);
     gtk_widget_class_bind_template_callback (widget_class, select_next_conflict_down);
     gtk_widget_class_bind_template_callback (widget_class, batch_rename_dialog_on_response);
-    gtk_widget_class_bind_template_callback (widget_class, on_key_press_event);
+    gtk_widget_class_bind_template_callback (widget_class, on_insert_text);
+    gtk_widget_class_bind_template_callback (widget_class, on_delete_text);
 }
 
 GtkWidget *
@@ -2265,6 +2135,8 @@ nautilus_batch_rename_dialog_new (GList             *selection,
     }
     gtk_window_set_title (GTK_WINDOW (dialog), dialog_title->str);
 
+    add_tag (dialog, metadata_tags_constants[ORIGINAL_FILE_NAME]);
+
     nautilus_batch_rename_dialog_initialize_actions (dialog);
 
     update_display_text (dialog);
@@ -2333,32 +2205,24 @@ nautilus_batch_rename_dialog_init (NautilusBatchRenameDialog *self)
         tag_data = g_new (TagData, 1);
         tag_data->available = TRUE;
         tag_data->set = FALSE;
-        tag_data->position = 0;
+        tag_data->position = -1;
         tag_data->tag_constants = numbering_tags_constants[i];
         g_hash_table_insert (self->tag_info_table, g_strdup (tag_text_representation), tag_data);
     }
 
     for (i = 0; i < G_N_ELEMENTS (metadata_tags_constants); i++)
     {
-        gboolean is_original_name;
         g_autofree gchar *tag_text_representation = NULL;
 
         /* Only the original name is available and set at the start */
-        is_original_name = metadata_tags_constants[i].metadata_type == ORIGINAL_FILE_NAME;
         tag_text_representation = batch_rename_get_tag_text_representation (metadata_tags_constants[i]);
 
         tag_data = g_new (TagData, 1);
-        tag_data->available = is_original_name;
-        tag_data->set = is_original_name;
-        tag_data->position = 0;
+        tag_data->available = FALSE;
+        tag_data->set = FALSE;
+        tag_data->position = -1;
         tag_data->tag_constants = metadata_tags_constants[i];
         g_hash_table_insert (self->tag_info_table, g_strdup (tag_text_representation), tag_data);
-
-        if (is_original_name)
-        {
-            gtk_entry_set_text (GTK_ENTRY (self->name_entry), tag_text_representation);
-            self->name_entry_characters = g_utf8_strlen (tag_text_representation, -1);
-        }
     }
 
     self->row_height = -1;
diff --git a/src/resources/ui/nautilus-batch-rename-dialog.ui 
b/src/resources/ui/nautilus-batch-rename-dialog.ui
index 4d4a6ec..d4bef6d 100644
--- a/src/resources/ui/nautilus-batch-rename-dialog.ui
+++ b/src/resources/ui/nautilus-batch-rename-dialog.ui
@@ -110,9 +110,9 @@
                             <property name="width_request">400</property>
                             <property name="hexpand">True</property>
                             <property name="activates-default">True</property>
-                            <signal name="changed" handler="file_names_widget_entry_on_changed" 
swapped="yes" />
                             <signal name="activate" handler="file_names_widget_on_activate" swapped="yes" />
-                            <signal name="key-press-event" handler="on_key_press_event" swapped="no"/>
+                            <signal name="insert-text" handler="on_insert_text" swapped="no" />
+                            <signal name="delete-text" handler="on_delete_text" swapped="no" />
                           </object>
                         </child>
                         <child>


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