diff options
-rw-r--r-- | src/nautilus-batch-rename-dialog.c | 1475 | ||||
-rw-r--r-- | src/nautilus-batch-rename-dialog.h | 193 | ||||
-rw-r--r-- | src/nautilus-batch-rename-utilities.c | 630 | ||||
-rw-r--r-- | src/nautilus-batch-rename-utilities.h | 2 | ||||
-rw-r--r-- | src/resources/ui/nautilus-batch-rename-dialog.ui | 6 |
5 files changed, 641 insertions, 1665 deletions
diff --git a/src/nautilus-batch-rename-dialog.c b/src/nautilus-batch-rename-dialog.c index 21d09ccfb..837bd3233 100644 --- a/src/nautilus-batch-rename-dialog.c +++ b/src/nautilus-batch-rename-dialog.c @@ -118,64 +118,18 @@ typedef struct gint new_position; /* if the tag was just added, then we shouldn't update it's position */ gboolean just_added; + TagConstants tag_constants; } TagData; -typedef struct -{ - const gchar *action_target_name; - const gchar *tag_text_represencation; - const gchar *label; -} TagConstants; - -typedef struct -{ - const gchar *action_target_name; - const gchar *label; - const SortMode sort_mode; -} SortConstants; - -static const SortConstants sorts_constants[] = -{ - { - "name-ascending", - N_("Original Name (Ascending)"), - ORIGINAL_ASCENDING, - }, - { - "name-descending", - N_("Original Name (Descending)"), - ORIGINAL_DESCENDING, - }, - { - "first-modified", - N_("First Modified"), - FIRST_MODIFIED, - }, - { - "last-modified", - N_("Last Modified"), - LAST_MODIFIED, - }, - { - "first-created", - N_("First Created"), - FIRST_CREATED, - }, - { - "last-created", - N_("Last Created"), - LAST_CREATED, - }, -}; static void update_display_text (NautilusBatchRenameDialog *dialog); G_DEFINE_TYPE (NautilusBatchRenameDialog, nautilus_batch_rename_dialog, GTK_TYPE_DIALOG); static void -add_numbering_order (GSimpleAction *action, - GVariant *value, - gpointer user_data) +change_numbering_order (GSimpleAction *action, + GVariant *value, + gpointer user_data) { NautilusBatchRenameDialog *dialog; const gchar *target_name; @@ -194,6 +148,7 @@ add_numbering_order (GSimpleAction *action, dialog->selection = nautilus_batch_rename_dialog_sort (dialog->selection, sorts_constants[i].sort_mode, NULL); + break; } } @@ -205,190 +160,75 @@ add_numbering_order (GSimpleAction *action, } static void -add_original_file_name_tag (GSimpleAction *action, - GVariant *value, - gpointer user_data) +enable_action (NautilusBatchRenameDialog *self, + const gchar *action_name) { - NautilusBatchRenameDialog *dialog; - gint cursor_position; - TagData *tag_data; - - dialog = NAUTILUS_BATCH_RENAME_DIALOG (user_data); - - g_object_get (dialog->name_entry, "cursor-position", &cursor_position, NULL); - - tag_data = g_hash_table_lookup (dialog->tag_info_table, ORIGINAL_FILE_NAME); - tag_data->set = TRUE; - tag_data->just_added = TRUE; - tag_data->position = cursor_position; - - gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry), - ORIGINAL_FILE_NAME, - g_utf8_strlen (ORIGINAL_FILE_NAME, -1), - &cursor_position); - - gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position); - - gtk_entry_grab_focus_without_selecting (GTK_ENTRY (dialog->name_entry)); + GAction *action; - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (self->action_group), + action_name); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE); } static void -disable_action (NautilusBatchRenameDialog *dialog, - gchar *action_name) +disable_action (NautilusBatchRenameDialog *self, + const gchar *action_name) { GAction *action; - action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group), + action = g_action_map_lookup_action (G_ACTION_MAP (self->action_group), action_name); g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); } static void -add_metadata_tag (GSimpleAction *action, - GVariant *value, - gpointer user_data) +add_tag (NautilusBatchRenameDialog *self, + TagConstants tag_constants) { - NautilusBatchRenameDialog *dialog; - const gchar *action_name; + g_autofree gchar *tag_text_representation = NULL; gint cursor_position; TagData *tag_data; - dialog = NAUTILUS_BATCH_RENAME_DIALOG (user_data); - - action_name = g_action_get_name (G_ACTION (action)); - g_object_get (dialog->name_entry, "cursor-position", &cursor_position, NULL); - - if (g_strrstr (action_name, "creation-date")) - { - tag_data = g_hash_table_lookup (dialog->tag_info_table, CREATION_DATE); - tag_data->available = TRUE; - tag_data->set = TRUE; - tag_data->just_added = TRUE; - tag_data->position = cursor_position; - - gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry), - CREATION_DATE, - g_utf8_strlen (CREATION_DATE, -1), - &cursor_position); - gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position); - disable_action (dialog, "add-creation-date-tag"); - } - - if (g_strrstr (action_name, "equipment")) - { - tag_data = g_hash_table_lookup (dialog->tag_info_table, CAMERA_MODEL); - tag_data->available = TRUE; - tag_data->set = TRUE; - tag_data->just_added = TRUE; - tag_data->position = cursor_position; - - gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry), - CAMERA_MODEL, - g_utf8_strlen (CAMERA_MODEL, -1), - &cursor_position); - gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position); - disable_action (dialog, "add-equipment-tag"); - } - - if (g_strrstr (action_name, "season")) - { - tag_data = g_hash_table_lookup (dialog->tag_info_table, SEASON_NUMBER); - tag_data->available = TRUE; - tag_data->set = TRUE; - tag_data->just_added = TRUE; - tag_data->position = cursor_position; - - gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry), - SEASON_NUMBER, - g_utf8_strlen (SEASON_NUMBER, -1), - &cursor_position); - gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position); - disable_action (dialog, "add-season-tag"); - } - - if (g_strrstr (action_name, "episode")) - { - tag_data = g_hash_table_lookup (dialog->tag_info_table, EPISODE_NUMBER); - tag_data->available = TRUE; - tag_data->set = TRUE; - tag_data->just_added = TRUE; - tag_data->position = cursor_position; - - gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry), - EPISODE_NUMBER, - g_utf8_strlen (EPISODE_NUMBER, -1), - &cursor_position); - gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position); - disable_action (dialog, "add-episode-tag"); - } - - if (g_strrstr (action_name, "track")) - { - tag_data = g_hash_table_lookup (dialog->tag_info_table, TRACK_NUMBER); - tag_data->available = TRUE; - tag_data->set = TRUE; - tag_data->just_added = TRUE; - tag_data->position = cursor_position; + g_object_get (self->name_entry, "cursor-position", &cursor_position, NULL); - gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry), - TRACK_NUMBER, - g_utf8_strlen (TRACK_NUMBER, -1), - &cursor_position); - gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position); - disable_action (dialog, "add-track-number-tag"); - } + tag_text_representation = batch_rename_get_tag_text_representation (tag_constants); + tag_data = g_hash_table_lookup (self->tag_info_table, tag_text_representation); + tag_data->available = TRUE; + tag_data->set = TRUE; + tag_data->just_added = TRUE; + tag_data->position = cursor_position; - if (g_strrstr (action_name, "artist")) - { - tag_data = g_hash_table_lookup (dialog->tag_info_table, ARTIST_NAME); - tag_data->available = TRUE; - tag_data->set = TRUE; - tag_data->just_added = TRUE; - tag_data->position = cursor_position; + gtk_editable_insert_text (GTK_EDITABLE (self->name_entry), + tag_text_representation, + g_utf8_strlen (tag_text_representation, -1), + &cursor_position); + gtk_editable_set_position (GTK_EDITABLE (self->name_entry), cursor_position); - gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry), - ARTIST_NAME, - g_utf8_strlen (ARTIST_NAME, -1), - &cursor_position); - gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position); - disable_action (dialog, "add-artist-name-tag"); - } + gtk_entry_grab_focus_without_selecting (GTK_ENTRY (self->name_entry)); +} - if (g_strrstr (action_name, "title")) - { - tag_data = g_hash_table_lookup (dialog->tag_info_table, TITLE); - tag_data->available = TRUE; - tag_data->set = TRUE; - tag_data->just_added = TRUE; - tag_data->position = cursor_position; +static void +add_metadata_tag (GSimpleAction *action, + GVariant *value, + gpointer user_data) +{ + NautilusBatchRenameDialog *self; + const gchar *action_name; + guint i; - gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry), - TITLE, - g_utf8_strlen (TITLE, -1), - &cursor_position); - gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position); - disable_action (dialog, "add-title-tag"); - } + self = NAUTILUS_BATCH_RENAME_DIALOG (user_data); + action_name = g_action_get_name (G_ACTION (action)); - if (g_strrstr (action_name, "album")) + for (i = 0; i < G_N_ELEMENTS (metadata_tags_constants); i++) { - tag_data = g_hash_table_lookup (dialog->tag_info_table, ALBUM_NAME); - tag_data->available = TRUE; - tag_data->set = TRUE; - tag_data->just_added = TRUE; - tag_data->position = cursor_position; + if (g_strcmp0 (metadata_tags_constants[i].action_name, action_name) == 0) + { + add_tag (self, metadata_tags_constants[i]); + disable_action (self, metadata_tags_constants[i].action_name); - gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry), - ALBUM_NAME, - g_utf8_strlen (ALBUM_NAME, -1), - &cursor_position); - gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position); - disable_action (dialog, "add-album-name-tag"); + break; + } } - - gtk_entry_grab_focus_without_selecting (GTK_ENTRY (dialog->name_entry)); } static void @@ -396,84 +236,36 @@ add_numbering_tag (GSimpleAction *action, GVariant *value, gpointer user_data) { - NautilusBatchRenameDialog *dialog; + NautilusBatchRenameDialog *self; const gchar *action_name; - gint cursor_position; - GAction *add_numbering_action; - TagData *tag_data; - - dialog = NAUTILUS_BATCH_RENAME_DIALOG (user_data); + guint i; + self = NAUTILUS_BATCH_RENAME_DIALOG (user_data); action_name = g_action_get_name (G_ACTION (action)); - g_object_get (dialog->name_entry, "cursor-position", &cursor_position, NULL); - - if (g_strrstr (action_name, "zero")) - { - tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING); - tag_data->set = TRUE; - tag_data->just_added = TRUE; - tag_data->position = cursor_position; - - gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry), - NUMBERING, - g_utf8_strlen (NUMBERING, -1), - &cursor_position); - gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position); - } - - if (g_strrstr (action_name, "one")) - { - tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING0); - tag_data->set = TRUE; - tag_data->just_added = TRUE; - tag_data->position = cursor_position; - - gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry), - NUMBERING0, - g_utf8_strlen (NUMBERING0, -1), - &cursor_position); - gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position); - } - if (g_strrstr (action_name, "two")) + for (i = 0; i < G_N_ELEMENTS (numbering_tags_constants); i++) { - tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING00); - tag_data->set = TRUE; - tag_data->just_added = TRUE; - tag_data->position = cursor_position; - - gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry), - NUMBERING00, - g_utf8_strlen (NUMBERING00, -1), - &cursor_position); - gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position); + if (g_strcmp0 (numbering_tags_constants[i].action_name, action_name) == 0) + { + add_tag (self, numbering_tags_constants[i]); + } + /* We want to allow only one tag of numbering type, so we disable all + * of them */ + disable_action (self, numbering_tags_constants[i].action_name); } - - add_numbering_action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group), - "add-numbering-tag-zero"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (add_numbering_action), FALSE); - add_numbering_action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group), - "add-numbering-tag-one"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (add_numbering_action), FALSE); - - add_numbering_action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group), - "add-numbering-tag-two"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (add_numbering_action), FALSE); - - gtk_entry_grab_focus_without_selecting (GTK_ENTRY (dialog->name_entry)); } const GActionEntry dialog_entries[] = { - { "numbering-order-changed", NULL, "s", "'name-ascending'", add_numbering_order }, - { "add-original-file-name-tag", add_original_file_name_tag }, - { "add-numbering-tag-zero", add_numbering_tag }, - { "add-numbering-tag-one", add_numbering_tag }, - { "add-numbering-tag-two", add_numbering_tag }, + { "numbering-order-changed", NULL, "s", "'name-ascending'", change_numbering_order }, + { "add-numbering-no-zero-pad-tag", add_numbering_tag }, + { "add-numbering-one-zero-pad-tag", add_numbering_tag }, + { "add-numbering-two-zero-pad-tag", add_numbering_tag }, + { "add-original-file-name-tag", add_metadata_tag }, { "add-creation-date-tag", add_metadata_tag }, { "add-equipment-tag", add_metadata_tag }, - { "add-season-tag", add_metadata_tag }, - { "add-episode-tag", add_metadata_tag }, + { "add-season-number-tag", add_metadata_tag }, + { "add-episode-number-tag", add_metadata_tag }, { "add-video-album-tag", add_metadata_tag }, { "add-track-number-tag", add_metadata_tag }, { "add-artist-name-tag", add_metadata_tag }, @@ -543,12 +335,14 @@ compare_tag_position (gconstpointer a, * For instance, "[1, 2, 3]Paris[Creation date]" would result in: * "[1, 2, 3]", "Paris", "[Creation date]" */ static GList * -split_entry_text (NautilusBatchRenameDialog *dialog, +split_entry_text (NautilusBatchRenameDialog *self, gchar *entry_text) { GString *normal_text; GString *tag; GArray *tag_positions; + g_autoptr (GList) tag_info_keys = NULL; + GList *l; gint tags; gint i; gchar *substring; @@ -560,88 +354,16 @@ split_entry_text (NautilusBatchRenameDialog *dialog, tag_end_position = 0; tag_positions = g_array_new (FALSE, FALSE, sizeof (gint)); - tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING); - if (tag_data->set) - { - g_array_append_val (tag_positions, tag_data->position); - tags++; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING0); - if (tag_data->set) - { - g_array_append_val (tag_positions, tag_data->position); - tags++; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING00); - if (tag_data->set) - { - g_array_append_val (tag_positions, tag_data->position); - tags++; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, ORIGINAL_FILE_NAME); - if (tag_data->set) - { - g_array_append_val (tag_positions, tag_data->position); - tags++; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, CREATION_DATE); - if (tag_data->set) - { - g_array_append_val (tag_positions, tag_data->position); - tags++; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, CAMERA_MODEL); - if (tag_data->set) - { - g_array_append_val (tag_positions, tag_data->position); - tags++; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, SEASON_NUMBER); - if (tag_data->set) - { - g_array_append_val (tag_positions, tag_data->position); - tags++; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, EPISODE_NUMBER); - if (tag_data->set) - { - g_array_append_val (tag_positions, tag_data->position); - tags++; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, TRACK_NUMBER); - if (tag_data->set) - { - g_array_append_val (tag_positions, tag_data->position); - tags++; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, ARTIST_NAME); - if (tag_data->set) - { - g_array_append_val (tag_positions, tag_data->position); - tags++; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, TITLE); - if (tag_data->set) - { - g_array_append_val (tag_positions, tag_data->position); - tags++; - } + tag_info_keys = g_hash_table_get_keys (self->tag_info_table); - tag_data = g_hash_table_lookup (dialog->tag_info_table, ALBUM_NAME); - if (tag_data->set) + for (l = tag_info_keys; l != NULL; l = l->next) { - g_array_append_val (tag_positions, tag_data->position); - tags++; + tag_data = g_hash_table_lookup (self->tag_info_table, l->data); + if (tag_data->set) + { + g_array_append_val (tag_positions, tag_data->position); + tags++; + } } g_array_sort (tag_positions, compare_tag_position); @@ -660,96 +382,25 @@ split_entry_text (NautilusBatchRenameDialog *dialog, result = g_list_prepend (result, normal_text); } - tag_data = g_hash_table_lookup (dialog->tag_info_table, ORIGINAL_FILE_NAME); - if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position) + for (l = tag_info_keys; l != NULL; l = l->next) { - tag_end_position = g_array_index (tag_positions, gint, i) + - g_utf8_strlen (ORIGINAL_FILE_NAME, -1); - tag = g_string_append (tag, ORIGINAL_FILE_NAME); - } + g_autofree gchar *tag_text_representation = NULL; - tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING); - if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position) - { - tag_end_position = g_array_index (tag_positions, gint, i) + - g_utf8_strlen (NUMBERING, -1); - tag = g_string_append (tag, NUMBERING); - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING0); - if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position) - { - tag_end_position = g_array_index (tag_positions, gint, i) + - g_utf8_strlen (NUMBERING0, -1); - tag = g_string_append (tag, NUMBERING0); - } + tag_data = g_hash_table_lookup (self->tag_info_table, l->data); + if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position) + { + tag_text_representation = batch_rename_get_tag_text_representation (tag_data->tag_constants); + tag_end_position = g_array_index (tag_positions, gint, i) + + g_utf8_strlen (tag_text_representation, -1); + tag = g_string_append (tag, tag_text_representation); - tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING00); - if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position) - { - tag_end_position = g_array_index (tag_positions, gint, i) + - g_utf8_strlen (NUMBERING00, -1); - tag = g_string_append (tag, NUMBERING00); - } - tag_data = g_hash_table_lookup (dialog->tag_info_table, CREATION_DATE); - if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position) - { - tag_end_position = g_array_index (tag_positions, gint, i) + - g_utf8_strlen (CREATION_DATE, -1); - tag = g_string_append (tag, CREATION_DATE); - } - tag_data = g_hash_table_lookup (dialog->tag_info_table, CAMERA_MODEL); - if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position) - { - tag_end_position = g_array_index (tag_positions, gint, i) + - g_utf8_strlen (CAMERA_MODEL, -1); - tag = g_string_append (tag, CAMERA_MODEL); - } - tag_data = g_hash_table_lookup (dialog->tag_info_table, SEASON_NUMBER); - if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position) - { - tag_end_position = g_array_index (tag_positions, gint, i) + - g_utf8_strlen (SEASON_NUMBER, -1); - tag = g_string_append (tag, SEASON_NUMBER); - } - tag_data = g_hash_table_lookup (dialog->tag_info_table, EPISODE_NUMBER); - if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position) - { - tag_end_position = g_array_index (tag_positions, gint, i) + - g_utf8_strlen (EPISODE_NUMBER, -1); - tag = g_string_append (tag, EPISODE_NUMBER); - } - tag_data = g_hash_table_lookup (dialog->tag_info_table, TRACK_NUMBER); - if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position) - { - tag_end_position = g_array_index (tag_positions, gint, i) + - g_utf8_strlen (TRACK_NUMBER, -1); - tag = g_string_append (tag, TRACK_NUMBER); - } - tag_data = g_hash_table_lookup (dialog->tag_info_table, ARTIST_NAME); - if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position) - { - tag_end_position = g_array_index (tag_positions, gint, i) + - g_utf8_strlen (ARTIST_NAME, -1); - tag = g_string_append (tag, ARTIST_NAME); - } - tag_data = g_hash_table_lookup (dialog->tag_info_table, TITLE); - if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position) - { - tag_end_position = g_array_index (tag_positions, gint, i) + - g_utf8_strlen (TITLE, -1); - tag = g_string_append (tag, TITLE); - } - tag_data = g_hash_table_lookup (dialog->tag_info_table, ALBUM_NAME); - if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position) - { - tag_end_position = g_array_index (tag_positions, gint, i) + - g_utf8_strlen (ALBUM_NAME, -1); - tag = g_string_append (tag, ALBUM_NAME); + break; + } } result = g_list_prepend (result, tag); } + normal_text = g_string_new (g_utf8_offset_to_pointer (entry_text, tag_end_position)); if (g_strcmp0 (normal_text->str, "") != 0) @@ -1708,6 +1359,8 @@ 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; @@ -1731,159 +1384,20 @@ update_tags (NautilusBatchRenameDialog *dialog) character_difference = g_utf8_strlen (entry_text, -1) - dialog->name_entry_characters; dialog->name_entry_characters = g_utf8_strlen (entry_text, -1); - tag_data = g_hash_table_lookup (dialog->tag_info_table, ORIGINAL_FILE_NAME); - 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; - } - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, CREATION_DATE); - 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; - } - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, CAMERA_MODEL); - 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; - } - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, SEASON_NUMBER); - 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; - } - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, EPISODE_NUMBER); - 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; - } - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, TRACK_NUMBER); - 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; - } - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, ARTIST_NAME); - 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; - } - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, TITLE); - 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; - } - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, ALBUM_NAME); - 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; - } - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING); - if (tag_data->just_added) - { - tag_data->just_added = FALSE; - } - else + tag_info_keys = g_hash_table_get_keys (dialog->tag_info_table); + for (l = tag_info_keys; l != NULL; l = l->next) { - if (tag_data->set && cursor_position <= tag_data->position) + tag_data = g_hash_table_lookup (dialog->tag_info_table, l->data); + if (tag_data->just_added) { - tag_data->position += character_difference; + tag_data->just_added = FALSE; } - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING0); - 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; - } - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING00); - if (tag_data->just_added) - { - tag_data->just_added = FALSE; - } - else - { - if (tag_data->set && cursor_position <= tag_data->position) + else { - tag_data->position += character_difference; + if (tag_data->set && cursor_position <= tag_data->position) + { + tag_data->position += character_difference; + } } } } @@ -1902,8 +1416,6 @@ have_unallowed_character (NautilusBatchRenameDialog *dialog) have_unallowed_character_dot = FALSE; have_unallowed_character_dotdot = FALSE; - - if (dialog->mode == NAUTILUS_BATCH_RENAME_DIALOG_FORMAT) { entry_text = gtk_entry_get_text (GTK_ENTRY (dialog->name_entry)); @@ -1990,17 +1502,30 @@ have_unallowed_character (NautilusBatchRenameDialog *dialog) } } -static void -update_display_text (NautilusBatchRenameDialog *dialog) +static gboolean +numbering_tag_is_some_added (NautilusBatchRenameDialog *self) { + guint i; TagData *tag_data; - TagData *tag_data0; - TagData *tag_data00; - tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING); - tag_data0 = g_hash_table_lookup (dialog->tag_info_table, NUMBERING0); - tag_data00 = g_hash_table_lookup (dialog->tag_info_table, NUMBERING00); + for (i = 0; i < G_N_ELEMENTS (numbering_tags_constants); i++) + { + g_autofree gchar *tag_text_representation = NULL; + + tag_text_representation = batch_rename_get_tag_text_representation (numbering_tags_constants[i]); + tag_data = g_hash_table_lookup (self->tag_info_table, tag_text_representation); + if (tag_data->set) + { + return TRUE; + } + } + + return FALSE; +} +static void +update_display_text (NautilusBatchRenameDialog *dialog) +{ if (dialog->conflict_cancellable != NULL) { g_cancellable_cancel (dialog->conflict_cancellable); @@ -2024,7 +1549,7 @@ update_display_text (NautilusBatchRenameDialog *dialog) g_list_free_full (dialog->new_names, string_free); } - if (!tag_data->set && !tag_data0->set && !tag_data00->set) + if (!numbering_tag_is_some_added (dialog)) { gtk_label_set_label (GTK_LABEL (dialog->numbering_label), ""); gtk_widget_hide (dialog->numbering_order_button); @@ -2121,8 +1646,12 @@ nautilus_batch_rename_dialog_query_finished (NautilusBatchRenameDialog *dialog, { GMenuItem *first_created; GMenuItem *last_created; - FileMetadata *metadata; + FileMetadata *file_metadata; + MetadataType metadata_type; + gboolean is_metadata; TagData *tag_data; + g_autoptr (GList) tag_info_keys = NULL; + GList *l; /* for files with no metadata */ if (hash_table != NULL && g_hash_table_size (hash_table) == 0) @@ -2155,94 +1684,25 @@ nautilus_batch_rename_dialog_query_finished (NautilusBatchRenameDialog *dialog, } dialog->selection_metadata = selection_metadata; - metadata = selection_metadata->data; - - tag_data = g_hash_table_lookup (dialog->tag_info_table, CREATION_DATE); - if (metadata->creation_date == NULL || g_strcmp0 (metadata->creation_date->str, "") == 0) - { - disable_action (dialog, "add-creation-date-tag"); - tag_data->available = FALSE; - } - else - { - tag_data->set = FALSE; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, CAMERA_MODEL); - if (metadata->equipment == NULL || g_strcmp0 (metadata->equipment->str, "") == 0) - { - disable_action (dialog, "add-equipment-tag"); - tag_data->available = FALSE; - } - else - { - tag_data->set = FALSE; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, SEASON_NUMBER); - if (metadata->season == NULL || g_strcmp0 (metadata->season->str, "") == 0) - { - disable_action (dialog, "add-season-tag"); - tag_data->available = FALSE; - } - else - { - tag_data->set = FALSE; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, EPISODE_NUMBER); - if (metadata->episode_number == NULL || g_strcmp0 (metadata->episode_number->str, "") == 0) - { - disable_action (dialog, "add-episode-tag"); - tag_data->available = FALSE; - } - else - { - tag_data->set = FALSE; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, TRACK_NUMBER); - if (metadata->track_number == NULL || g_strcmp0 (metadata->track_number->str, "") == 0) - { - disable_action (dialog, "add-track-number-tag"); - tag_data->available = FALSE; - } - else - { - tag_data->set = FALSE; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, ARTIST_NAME); - if (metadata->artist_name == NULL || g_strcmp0 (metadata->artist_name->str, "") == 0) - { - disable_action (dialog, "add-artist-name-tag"); - tag_data->available = FALSE; - } - else - { - tag_data->set = FALSE; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, TITLE); - if (metadata->title == NULL || g_strcmp0 (metadata->title->str, "") == 0) - { - disable_action (dialog, "add-title-tag"); - tag_data->available = FALSE; - } - else + file_metadata = selection_metadata->data; + tag_info_keys = g_hash_table_get_keys (dialog->tag_info_table); + for (l = tag_info_keys; l != NULL; l = l->next) { - tag_data->set = FALSE; - } + /* Only metadata has to be handled here. */ + tag_data = g_hash_table_lookup (dialog->tag_info_table, l->data); + is_metadata = tag_data->tag_constants.is_metadata; + if (!is_metadata) + { + continue; + } - tag_data = g_hash_table_lookup (dialog->tag_info_table, ALBUM_NAME); - if (metadata->album_name == NULL || g_strcmp0 (metadata->album_name->str, "") == 0) - { - disable_action (dialog, "add-album-name-tag"); - tag_data->available = FALSE; - } - else - { - tag_data->set = FALSE; + metadata_type = tag_data->tag_constants.metadata_type; + if (file_metadata->metadata[metadata_type] == NULL || + file_metadata->metadata[metadata_type]->len <= 0) + { + disable_action (dialog, tag_data->tag_constants.action_name); + tag_data->available = FALSE; + } } } @@ -2359,7 +1819,7 @@ nautilus_batch_rename_dialog_initialize_actions (NautilusBatchRenameDialog *dial G_ACTION_GROUP (dialog->action_group)); action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group), - "add-original-file-name-tag"); + metadata_tags_constants[ORIGINAL_FILE_NAME].action_name); g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); check_metadata_for_selection (dialog, dialog->selection); @@ -2373,8 +1833,8 @@ file_names_widget_on_activate (NautilusBatchRenameDialog *dialog) static gboolean remove_tag (NautilusBatchRenameDialog *dialog, - gchar *tag_name, - gchar *action_name, + const gchar *tag_name, + const gchar *action_name, gint keyval, gboolean is_modifier) { @@ -2388,9 +1848,7 @@ remove_tag (NautilusBatchRenameDialog *dialog, 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) @@ -2466,8 +1924,8 @@ remove_tag (NautilusBatchRenameDialog *dialog, static GString * remove_tag_selection (NautilusBatchRenameDialog *dialog, GString *old_entry_text, - gchar *action_name, - gchar *tag_name, + const gchar *action_name, + const gchar *tag_name, gint start, gint end) { @@ -2506,7 +1964,7 @@ remove_tag_selection (NautilusBatchRenameDialog *dialog, static void update_tag_position (NautilusBatchRenameDialog *dialog, - gchar *tag_name, + const gchar *tag_name, GString *new_entry_text) { TagData *tag_data; @@ -2534,17 +1992,17 @@ on_key_press_event (GtkWidget *widget, gboolean entry_has_selection; gint start; gint end; + g_autoptr (GList) tag_info_keys = NULL; + GList *l; gboolean tag_removed = FALSE; TagData *tag_data; + const gchar *action_name; gint minimum_tag_position; - GAction *action; 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)); @@ -2554,6 +2012,7 @@ on_key_press_event (GtkWidget *widget, return GDK_EVENT_PROPAGATE; } + if (entry_has_selection && ((keyval == GDK_KEY_Delete || keyval == GDK_KEY_BackSpace) || (!gdk_event->key.is_modifier && @@ -2569,317 +2028,45 @@ on_key_press_event (GtkWidget *widget, minimum_tag_position = G_MAXINT; - tag_data = g_hash_table_lookup (dialog->tag_info_table, ORIGINAL_FILE_NAME); - if (tag_data->set) - { - update_tag_position (dialog, ORIGINAL_FILE_NAME, old_entry_text); - new_entry_text = remove_tag_selection (dialog, - old_entry_text, - "add-original-file-name-tag", - ORIGINAL_FILE_NAME, - 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; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, CREATION_DATE); - if (tag_data->set) - { - update_tag_position (dialog, CREATION_DATE, old_entry_text); - new_entry_text = remove_tag_selection (dialog, - old_entry_text, - "add-creation-date-tag", - CREATION_DATE, - 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; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING); - if (tag_data->set) - { - update_tag_position (dialog, NUMBERING, old_entry_text); - new_entry_text = remove_tag_selection (dialog, - old_entry_text, - "add-numbering-tag-zero", - NUMBERING, - start, - end); - - action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group), - "add-numbering-tag-one"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE); - - action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group), - "add-numbering-tag-two"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE); - - 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; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING0); - if (tag_data->set) - { - update_tag_position (dialog, NUMBERING0, old_entry_text); - new_entry_text = remove_tag_selection (dialog, - old_entry_text, - "add-numbering-tag-one", - NUMBERING0, - start, - end); - - action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group), - "add-numbering-tag-zero"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE); - - action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group), - "add-numbering-tag-two"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE); - - 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; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING00); - if (tag_data->set) - { - update_tag_position (dialog, NUMBERING00, old_entry_text); - new_entry_text = remove_tag_selection (dialog, - old_entry_text, - "add-numbering-tag-two", - NUMBERING0, - start, - end); - - action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group), - "add-numbering-tag-one"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE); - - action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group), - "add-numbering-tag-zero"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE); - - 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; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, CAMERA_MODEL); - if (tag_data->set) - { - update_tag_position (dialog, CAMERA_MODEL, old_entry_text); - new_entry_text = remove_tag_selection (dialog, - old_entry_text, - "add-equipment-tag", - CAMERA_MODEL, - 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; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, TRACK_NUMBER); - if (tag_data->set) - { - update_tag_position (dialog, TRACK_NUMBER, old_entry_text); - new_entry_text = remove_tag_selection (dialog, - old_entry_text, - "add-track-number-tag", - TRACK_NUMBER, - 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; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, SEASON_NUMBER); - if (tag_data->set) + for (l = tag_info_keys; l != NULL; l = l->next) { - update_tag_position (dialog, SEASON_NUMBER, old_entry_text); - new_entry_text = remove_tag_selection (dialog, - old_entry_text, - "add-season-tag", - SEASON_NUMBER, - 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; - } + g_autofree gchar *tag_text_representation = NULL; - tag_data = g_hash_table_lookup (dialog->tag_info_table, EPISODE_NUMBER); - if (tag_data->set) - { - update_tag_position (dialog, EPISODE_NUMBER, old_entry_text); - new_entry_text = remove_tag_selection (dialog, - old_entry_text, - "add-episode-tag", - EPISODE_NUMBER, - start, - end); - - if (!g_string_equal (new_entry_text, old_entry_text)) + 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) { - if (tag_data->position < minimum_tag_position) + 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)) { - minimum_tag_position = tag_data->position; - } + 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; - } - - tag_data = g_hash_table_lookup (dialog->tag_info_table, ARTIST_NAME); - if (tag_data->set) - { - update_tag_position (dialog, ARTIST_NAME, old_entry_text); - new_entry_text = remove_tag_selection (dialog, - old_entry_text, - "add-artist-name-tag", - ARTIST_NAME, - 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; } - - tag_removed = TRUE; + g_string_free (old_entry_text, TRUE); + old_entry_text = new_entry_text; } - g_string_free (old_entry_text, TRUE); - old_entry_text = new_entry_text; } - tag_data = g_hash_table_lookup (dialog->tag_info_table, TITLE); - if (tag_data->set) + /* If we removed the numbering tag, we want to enable all numbering actions */ + if (!numbering_tag_is_some_added (dialog)) { - update_tag_position (dialog, TITLE, old_entry_text); - new_entry_text = remove_tag_selection (dialog, - old_entry_text, - "add-title-tag", - TITLE, - 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; - } + guint i; - tag_data = g_hash_table_lookup (dialog->tag_info_table, ALBUM_NAME); - if (tag_data->set) - { - update_tag_position (dialog, ALBUM_NAME, old_entry_text); - new_entry_text = remove_tag_selection (dialog, - old_entry_text, - "add-album-name-tag", - ALBUM_NAME, - start, - end); - - if (!g_string_equal (new_entry_text, old_entry_text)) + for (i = 0; i < G_N_ELEMENTS (numbering_tags_constants); i++) { - if (tag_data->position < minimum_tag_position) - { - minimum_tag_position = tag_data->position; - } - - tag_removed = TRUE; + enable_action (dialog, numbering_tags_constants[i].action_name); } - g_string_free (old_entry_text, TRUE); - old_entry_text = new_entry_text; } if (minimum_tag_position != G_MAXINT) @@ -2894,148 +2081,40 @@ on_key_press_event (GtkWidget *widget, g_string_free (new_entry_text, TRUE); } - - if ((keyval == GDK_KEY_Delete || keyval == GDK_KEY_BackSpace) && - tag_removed) - { - return GDK_EVENT_STOP; - } } else { - if (remove_tag (dialog, - ORIGINAL_FILE_NAME, - "add-original-file-name-tag", - keyval, - gdk_event->key.is_modifier)) - { - tag_removed = TRUE; - } - - if (!tag_removed && remove_tag (dialog, - CREATION_DATE, - "add-creation-date-tag", - keyval, - gdk_event->key.is_modifier)) - { - tag_removed = TRUE; - } - - if (!tag_removed && remove_tag (dialog, - NUMBERING, - "add-numbering-tag-zero", - keyval, - gdk_event->key.is_modifier)) + for (l = tag_info_keys; l != NULL; l = l->next) { - tag_removed = TRUE; - action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group), - "add-numbering-tag-one"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE); - - action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group), - "add-numbering-tag-two"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE); - } - - if (!tag_removed && remove_tag (dialog, - NUMBERING0, - "add-numbering-tag-one", - keyval, - gdk_event->key.is_modifier)) - { - tag_removed = TRUE; - action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group), - "add-numbering-tag-zero"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE); - - action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group), - "add-numbering-tag-two"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE); - } - - if (!tag_removed && remove_tag (dialog, - NUMBERING00, - "add-numbering-tag-two", - keyval, - gdk_event->key.is_modifier)) - { - tag_removed = TRUE; - action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group), - "add-numbering-tag-one"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE); - - action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group), - "add-numbering-tag-zero"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE); - } - - if (!tag_removed && remove_tag (dialog, - CAMERA_MODEL, - "add-equipment-tag", - keyval, - gdk_event->key.is_modifier)) - { - tag_removed = TRUE; - } - - if (!tag_removed && remove_tag (dialog, - SEASON_NUMBER, - "add-season-tag", - keyval, - gdk_event->key.is_modifier)) - { - tag_removed = TRUE; - } - - if (!tag_removed && remove_tag (dialog, - EPISODE_NUMBER, - "add-episode-tag", - keyval, - gdk_event->key.is_modifier)) - { - tag_removed = TRUE; - } + g_autofree gchar *tag_text_representation = NULL; - if (!tag_removed && remove_tag (dialog, - TRACK_NUMBER, - "add-track-number-tag", - keyval, - gdk_event->key.is_modifier)) - { - tag_removed = TRUE; - } + 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; - if (!tag_removed && remove_tag (dialog, - ARTIST_NAME, - "add-artist-name-tag", - keyval, - gdk_event->key.is_modifier)) - { - tag_removed = TRUE; + break; + } } - if (!tag_removed && remove_tag (dialog, - TITLE, - "add-title-tag", - keyval, - gdk_event->key.is_modifier)) + /* If we removed the numbering tag, we want to enable all numbering actions */ + if (!numbering_tag_is_some_added (dialog)) { - tag_removed = TRUE; - } + guint i; - if (!tag_removed && remove_tag (dialog, - ALBUM_NAME, - "add-album-name-tag", - keyval, - gdk_event->key.is_modifier)) - { - tag_removed = TRUE; + for (i = 0; i < G_N_ELEMENTS (numbering_tags_constants); i++) + { + enable_action (dialog, numbering_tags_constants[i].action_name); + } } + } - if (tag_removed && (keyval == GDK_KEY_Delete || keyval == GDK_KEY_BackSpace)) - { - return GDK_EVENT_STOP; - } + if ((keyval == GDK_KEY_Delete || keyval == GDK_KEY_BackSpace) && tag_removed) + { + return GDK_EVENT_STOP; } return GDK_EVENT_PROPAGATE; @@ -3046,6 +2125,7 @@ nautilus_batch_rename_dialog_finalize (GObject *object) { NautilusBatchRenameDialog *dialog; GList *l; + guint i; dialog = NAUTILUS_BATCH_RENAME_DIALOG (object); @@ -3064,42 +2144,18 @@ nautilus_batch_rename_dialog_finalize (GObject *object) for (l = dialog->selection_metadata; l != NULL; l = l->next) { - FileMetadata *metadata; - - metadata = l->data; + FileMetadata *file_metadata; - if (metadata->file_name != NULL) + file_metadata = l->data; + for (i = 0; i < G_N_ELEMENTS (file_metadata->metadata); i++) { - g_string_free (metadata->file_name, TRUE); - } - if (metadata->creation_date != NULL) - { - g_string_free (metadata->creation_date, TRUE); - } - if (metadata->equipment != NULL) - { - g_string_free (metadata->equipment, TRUE); - } - if (metadata->season != NULL) - { - g_string_free (metadata->season, TRUE); - } - if (metadata->episode_number != NULL) - { - g_string_free (metadata->episode_number, TRUE); - } - if (metadata->track_number != NULL) - { - g_string_free (metadata->track_number, TRUE); - } - if (metadata->artist_name != NULL) - { - g_string_free (metadata->artist_name, TRUE); - } - if (metadata->album_name != NULL) - { - g_string_free (metadata->album_name, TRUE); + if (file_metadata->metadata[i]) + { + g_string_free (file_metadata->metadata[i], TRUE); + } } + + g_free (file_metadata); } if (dialog->create_date != NULL) @@ -3226,6 +2282,7 @@ static void nautilus_batch_rename_dialog_init (NautilusBatchRenameDialog *self) { TagData *tag_data; + guint i; gtk_widget_init_template (GTK_WIDGET (self)); @@ -3267,80 +2324,42 @@ nautilus_batch_rename_dialog_init (NautilusBatchRenameDialog *self) g_str_equal, (GDestroyNotify) g_free, (GDestroyNotify) g_free); - tag_data = g_new (TagData, 1); - tag_data->available = TRUE; - tag_data->set = TRUE; - tag_data->position = 0; - g_hash_table_insert (self->tag_info_table, g_strdup (ORIGINAL_FILE_NAME), tag_data); - tag_data = g_new (TagData, 1); - tag_data->available = TRUE; - tag_data->set = FALSE; - tag_data->position = 0; - g_hash_table_insert (self->tag_info_table, g_strdup (NUMBERING), tag_data); + for (i = 0; i < G_N_ELEMENTS (numbering_tags_constants); i++) + { + g_autofree gchar *tag_text_representation = NULL; - tag_data = g_new (TagData, 1); - tag_data->available = TRUE; - tag_data->set = FALSE; - tag_data->position = 0; - g_hash_table_insert (self->tag_info_table, g_strdup (NUMBERING0), tag_data); + tag_text_representation = batch_rename_get_tag_text_representation (numbering_tags_constants[i]); + tag_data = g_new (TagData, 1); + tag_data->available = TRUE; + tag_data->set = FALSE; + tag_data->position = 0; + tag_data->tag_constants = numbering_tags_constants[i]; + g_hash_table_insert (self->tag_info_table, g_strdup (tag_text_representation), tag_data); + } - tag_data = g_new (TagData, 1); - tag_data->available = TRUE; - tag_data->set = FALSE; - tag_data->position = 0; - g_hash_table_insert (self->tag_info_table, g_strdup (NUMBERING00), tag_data); - - tag_data = g_new (TagData, 1); - tag_data->available = FALSE; - tag_data->set = FALSE; - tag_data->position = 0; - g_hash_table_insert (self->tag_info_table, g_strdup (CREATION_DATE), tag_data); - - tag_data = g_new (TagData, 1); - tag_data->available = FALSE; - tag_data->set = FALSE; - tag_data->position = 0; - g_hash_table_insert (self->tag_info_table, g_strdup (CAMERA_MODEL), tag_data); - - tag_data = g_new (TagData, 1); - tag_data->available = FALSE; - tag_data->set = FALSE; - tag_data->position = 0; - g_hash_table_insert (self->tag_info_table, g_strdup (SEASON_NUMBER), tag_data); - - tag_data = g_new (TagData, 1); - tag_data->available = FALSE; - tag_data->set = FALSE; - tag_data->position = 0; - g_hash_table_insert (self->tag_info_table, g_strdup (EPISODE_NUMBER), tag_data); - - tag_data = g_new (TagData, 1); - tag_data->available = FALSE; - tag_data->set = FALSE; - tag_data->position = 0; - g_hash_table_insert (self->tag_info_table, g_strdup (TRACK_NUMBER), tag_data); - - tag_data = g_new (TagData, 1); - tag_data->available = FALSE; - tag_data->set = FALSE; - tag_data->position = 0; - g_hash_table_insert (self->tag_info_table, g_strdup (ARTIST_NAME), tag_data); - - tag_data = g_new (TagData, 1); - tag_data->available = FALSE; - tag_data->set = FALSE; - tag_data->position = 0; - g_hash_table_insert (self->tag_info_table, g_strdup (TITLE), tag_data); - - tag_data = g_new (TagData, 1); - tag_data->available = FALSE; - tag_data->set = FALSE; - tag_data->position = 0; - g_hash_table_insert (self->tag_info_table, g_strdup (ALBUM_NAME), tag_data); - - gtk_entry_set_text (GTK_ENTRY (self->name_entry), ORIGINAL_FILE_NAME); - self->name_entry_characters = g_utf8_strlen (ORIGINAL_FILE_NAME, -1); + 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->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/nautilus-batch-rename-dialog.h b/src/nautilus-batch-rename-dialog.h index e5084c356..41863d4dc 100644 --- a/src/nautilus-batch-rename-dialog.h +++ b/src/nautilus-batch-rename-dialog.h @@ -21,23 +21,33 @@ #include <glib.h> #include <glib/gprintf.h> +#include <glib/gi18n.h> #include <gtk/gtk.h> #include "nautilus-files-view.h" G_BEGIN_DECLS -#define ORIGINAL_FILE_NAME "[Original file name]" -#define NUMBERING "[1, 2, 3]" -#define NUMBERING0 "[01, 02, 03]" -#define NUMBERING00 "[001, 002, 003]" -#define CAMERA_MODEL "[Camera model]" -#define CREATION_DATE "[Creation date]" -#define SEASON_NUMBER "[Season number]" -#define EPISODE_NUMBER "[Episode number]" -#define TRACK_NUMBER "[Track number]" -#define ARTIST_NAME "[Artist name]" -#define TITLE "[Title]" -#define ALBUM_NAME "[Album name]" +typedef enum +{ + EQUIPMENT, + CREATION_DATE, + SEASON_NUMBER, + EPISODE_NUMBER, + TRACK_NUMBER, + ARTIST_NAME, + TITLE, + ALBUM_NAME, + ORIGINAL_FILE_NAME, + METADATA_INVALID, +} MetadataType; + +typedef enum +{ + NUMBERING_NO_ZERO_PAD, + NUMBERING_ONE_ZERO_PAD, + NUMBERING_TWO_ZERO_PAD, + NUMBERING_INVALID, +} NumberingType; typedef enum { NAUTILUS_BATCH_RENAME_DIALOG_APPEND = 0, @@ -57,26 +67,155 @@ typedef enum { typedef struct { + const gchar *action_name; + const gchar *label; + MetadataType metadata_type; + NumberingType numbering_type; + gboolean is_metadata; +} TagConstants; + +typedef struct +{ + const gchar *action_target_name; + const gchar *label; + const SortMode sort_mode; +} SortConstants; + +static const SortConstants sorts_constants[] = +{ + { + "name-ascending", + N_("Original Name (Ascending)"), + ORIGINAL_ASCENDING, + }, + { + "name-descending", + N_("Original Name (Descending)"), + ORIGINAL_DESCENDING, + }, + { + "first-modified", + N_("First Modified"), + FIRST_MODIFIED, + }, + { + "last-modified", + N_("Last Modified"), + LAST_MODIFIED, + }, + { + "first-created", + N_("First Created"), + FIRST_CREATED, + }, + { + "last-created", + N_("Last Created"), + LAST_CREATED, + }, +}; + +static const TagConstants metadata_tags_constants[] = +{ + { + "add-equipment-tag", + N_("Camera model"), + EQUIPMENT, + NUMBERING_INVALID, + TRUE, + }, + { + "add-creation-date-tag", + N_("Creation date"), + CREATION_DATE, + NUMBERING_INVALID, + TRUE, + }, + { + "add-season-number-tag", + N_("Season number"), + SEASON_NUMBER, + NUMBERING_INVALID, + TRUE, + }, + { + "add-episode-number-tag", + N_("Episode number"), + EPISODE_NUMBER, + NUMBERING_INVALID, + TRUE, + }, + { + "add-track-number-tag", + N_("Track number"), + TRACK_NUMBER, + NUMBERING_INVALID, + TRUE, + }, + { + "add-artist-name-tag", + N_("Artist name"), + ARTIST_NAME, + NUMBERING_INVALID, + TRUE, + }, + { + "add-title-tag", + N_("Title"), + TITLE, + NUMBERING_INVALID, + TRUE, + }, + { + "add-album-name-tag", + N_("Album name"), + ALBUM_NAME, + NUMBERING_INVALID, + TRUE, + }, + { + "add-original-file-name-tag", + N_("Original file name"), + ORIGINAL_FILE_NAME, + NUMBERING_INVALID, + TRUE, + }, +}; + +static const TagConstants numbering_tags_constants[] = +{ + { + "add-numbering-no-zero-pad-tag", + N_("1, 2, 3"), + METADATA_INVALID, + NUMBERING_NO_ZERO_PAD, + FALSE, + }, + { + "add-numbering-one-zero-pad-tag", + N_("01, 02, 03"), + METADATA_INVALID, + NUMBERING_ONE_ZERO_PAD, + FALSE, + }, + { + "add-numbering-two-zero-pad-tag", + N_("001, 002, 003"), + METADATA_INVALID, + NUMBERING_TWO_ZERO_PAD, + FALSE, + }, +}; + +typedef struct +{ gchar *name; gint index; } ConflictData; typedef struct { - GString *file_name; - - /* Photo */ - GString *creation_date; - GString *equipment; - - /* Video */ - GString *season; - GString *episode_number; - - /* Music */ - GString *track_number; - GString *artist_name; - GString *title; - GString *album_name; + GString *file_name; + GString *metadata [G_N_ELEMENTS (metadata_tags_constants)]; } FileMetadata; #define NAUTILUS_TYPE_BATCH_RENAME_DIALOG (nautilus_batch_rename_dialog_get_type()) diff --git a/src/nautilus-batch-rename-utilities.c b/src/nautilus-batch-rename-utilities.c index c8826b33a..3a855ac03 100644 --- a/src/nautilus-batch-rename-utilities.c +++ b/src/nautilus-batch-rename-utilities.c @@ -35,18 +35,11 @@ typedef struct typedef struct { NautilusBatchRenameDialog *dialog; - GHashTable *hash_table; + GHashTable *date_order_hash_table; GList *selection_metadata; - gboolean have_creation_date; - gboolean have_equipment; - gboolean have_season; - gboolean have_episode_number; - gboolean have_track_number; - gboolean have_artist_name; - gboolean have_title; - gboolean have_album_name; + gboolean has_metadata[G_N_ELEMENTS (metadata_tags_constants)]; } QueryData; enum @@ -90,6 +83,12 @@ conflict_data_free (gpointer mem) g_free (conflict_data); } +gchar* +batch_rename_get_tag_text_representation (TagConstants tag_constants) +{ + return g_strdup_printf ("[%s]", gettext (tag_constants.label)); +} + static GString * batch_rename_replace (gchar *string, gchar *substring, @@ -197,77 +196,30 @@ batch_rename_replace_label_text (gchar *label, } static gchar * -get_metadata (GList *selection_metadata, - gchar *file_name, - gchar *metadata) +get_metadata (GList *selection_metadata, + gchar *file_name, + MetadataType metadata_type) { GList *l; FileMetadata *file_metadata; + gchar *metadata = NULL; for (l = selection_metadata; l != NULL; l = l->next) { file_metadata = l->data; if (g_strcmp0 (file_name, file_metadata->file_name->str) == 0) { - if (g_strcmp0 (metadata, "creation_date") == 0 && - file_metadata->creation_date != NULL && - file_metadata->creation_date->len != 0) - { - return file_metadata->creation_date->str; - } - - if (g_strcmp0 (metadata, "equipment") == 0 && - file_metadata->equipment != NULL && - file_metadata->equipment->len != 0) - { - return file_metadata->equipment->str; - } - - if (g_strcmp0 (metadata, "season") == 0 && - file_metadata->season != NULL && - file_metadata->season->len != 0) - { - return file_metadata->season->str; - } - - if (g_strcmp0 (metadata, "episode_number") == 0 && - file_metadata->episode_number != NULL && - file_metadata->episode_number->len != 0) - { - return file_metadata->episode_number->str; - } - - if (g_strcmp0 (metadata, "track_number") == 0 && - file_metadata->track_number != NULL && - file_metadata->track_number->len != 0) + if (file_metadata->metadata[metadata_type] && + file_metadata->metadata[metadata_type]->len > 0) { - return file_metadata->track_number->str; + metadata = file_metadata->metadata[metadata_type]->str; } - if (g_strcmp0 (metadata, "artist_name") == 0 && - file_metadata->artist_name != NULL && - file_metadata->artist_name->len != 0) - { - return file_metadata->artist_name->str; - } - - if (g_strcmp0 (metadata, "title") == 0 && - file_metadata->title != NULL && - file_metadata->title->len != 0) - { - return file_metadata->title->str; - } - - if (g_strcmp0 (metadata, "album_name") == 0 && - file_metadata->album_name != NULL && - file_metadata->album_name->len != 0) - { - return file_metadata->album_name->str; - } + break; } } - return NULL; + return metadata; } static GString * @@ -277,11 +229,13 @@ batch_rename_format (NautilusFile *file, gint count) { GList *l; - GString *tag; + GString *tag_string; GString *new_name; gboolean added_tag; + MetadataType metadata_type; g_autofree gchar *file_name = NULL; g_autofree gchar *extension = NULL; + gint i; gchar *metadata; gchar *base_name; @@ -292,130 +246,99 @@ batch_rename_format (NautilusFile *file, for (l = text_chunks; l != NULL; l = l->next) { - tag = l->data; added_tag = FALSE; + tag_string = l->data; - if (!added_tag && g_strcmp0 (tag->str, ORIGINAL_FILE_NAME) == 0) + for (i = 0; i < G_N_ELEMENTS (numbering_tags_constants); i++) { - base_name = eel_filename_strip_extension (file_name); - - new_name = g_string_append (new_name, base_name); - - added_tag = TRUE; - g_free (base_name); - } - - if (!added_tag && g_strcmp0 (tag->str, NUMBERING) == 0) - { - g_string_append_printf (new_name, "%d", count); - added_tag = TRUE; - } + g_autofree gchar *tag_text_representation = NULL; - if (!added_tag && g_strcmp0 (tag->str, NUMBERING0) == 0) - { - g_string_append_printf (new_name, "%02d", count); - - added_tag = TRUE; - } - - if (!added_tag && g_strcmp0 (tag->str, NUMBERING00) == 0) - { - g_string_append_printf (new_name, "%03d", count); - - added_tag = TRUE; - } - - if (!added_tag && g_strcmp0 (tag->str, CAMERA_MODEL) == 0) - { - metadata = get_metadata (selection_metadata, file_name, "equipment"); - - if (metadata != NULL) + tag_text_representation = batch_rename_get_tag_text_representation (numbering_tags_constants[i]); + if (g_strcmp0 (tag_string->str, tag_text_representation) == 0) { - new_name = g_string_append (new_name, metadata); - added_tag = TRUE; - } - } - - if (!added_tag && g_strcmp0 (tag->str, CREATION_DATE) == 0) - { - metadata = get_metadata (selection_metadata, file_name, "creation_date"); - - if (metadata != NULL) - { - new_name = g_string_append (new_name, metadata); - added_tag = TRUE; - } - } - - if (!added_tag && g_strcmp0 (tag->str, SEASON_NUMBER) == 0) - { - metadata = get_metadata (selection_metadata, file_name, "season"); - - if (metadata != NULL) - { - new_name = g_string_append (new_name, metadata); - added_tag = TRUE; - } - } - - if (!added_tag && g_strcmp0 (tag->str, EPISODE_NUMBER) == 0) - { - metadata = get_metadata (selection_metadata, file_name, "episode_number"); + switch (numbering_tags_constants[i].numbering_type) + { + case NUMBERING_NO_ZERO_PAD: + { + g_string_append_printf (new_name, "%d", count); + } + break; + case NUMBERING_ONE_ZERO_PAD: + { + g_string_append_printf (new_name, "%02d", count); + } + break; + case NUMBERING_TWO_ZERO_PAD: + { + g_string_append_printf (new_name, "%03d", count); + } + break; + default: + { + g_warn_if_reached (); + } + break; + } - if (metadata != NULL) - { - new_name = g_string_append (new_name, metadata); added_tag = TRUE; + break; } } - if (!added_tag && g_strcmp0 (tag->str, TRACK_NUMBER) == 0) + if (added_tag) { - metadata = get_metadata (selection_metadata, file_name, "track_number"); - - if (metadata != NULL) - { - g_string_append_printf (new_name, "%02d", atoi (metadata)); - added_tag = TRUE; - } + continue; } - if (!added_tag && g_strcmp0 (tag->str, ARTIST_NAME) == 0) + for (i = 0; i < G_N_ELEMENTS (metadata_tags_constants); i++) { - metadata = get_metadata (selection_metadata, file_name, "artist_name"); + g_autofree gchar *tag_text_representation = NULL; - if (metadata != NULL) + tag_text_representation = batch_rename_get_tag_text_representation (metadata_tags_constants[i]); + if (g_strcmp0 (tag_string->str, tag_text_representation) == 0) { - new_name = g_string_append (new_name, metadata); - added_tag = TRUE; - } - } + metadata_type = metadata_tags_constants[i].metadata_type; + metadata = get_metadata (selection_metadata, file_name, metadata_type); - if (!added_tag && g_strcmp0 (tag->str, TITLE) == 0) - { - metadata = get_metadata (selection_metadata, file_name, "title"); - - if (metadata != NULL) - { - new_name = g_string_append (new_name, metadata); - added_tag = TRUE; - } - } + /* TODO: This is a hack, we should provide a cancellable for checking + * the metadata, and if that is happening don't enter here. We can + * special case original file name upper in the call stack */ + if (!metadata && metadata_type != ORIGINAL_FILE_NAME) + { + g_warning ("Metadata not present in one file, it shouldn't have been added. File name: %s, Metadata: %s", + file_name, metadata_tags_constants[i].label); + continue; + } - if (!added_tag && g_strcmp0 (tag->str, ALBUM_NAME) == 0) - { - metadata = get_metadata (selection_metadata, file_name, "album_name"); + switch (metadata_type) + { + case ORIGINAL_FILE_NAME: + { + base_name = eel_filename_strip_extension (file_name); + + new_name = g_string_append (new_name, base_name); + } + break; + case TRACK_NUMBER: + { + g_string_append_printf (new_name, "%02d", atoi (metadata)); + } + break; + default: + { + new_name = g_string_append (new_name, metadata); + } + break; + } - if (metadata != NULL) - { - new_name = g_string_append (new_name, metadata); added_tag = TRUE; + break; } } if (!added_tag) { - new_name = g_string_append (new_name, tag->str); + new_name = g_string_append (new_name, tag_string->str); } } @@ -458,9 +381,8 @@ batch_rename_dialog_get_new_names_list (NautilusBatchRenameDialogMode mode, { file = NAUTILUS_FILE (l->data); - file_name = g_string_new (""); name = nautilus_file_get_name (file); - g_string_append (file_name, name); + file_name = g_string_new (name); /* get the new name here and add it to the list*/ if (mode == NAUTILUS_BATCH_RENAME_DIALOG_FORMAT) @@ -705,20 +627,59 @@ cursor_next (QueryData *query_data, } static void +remove_metadata (QueryData *query_data, + MetadataType metadata_type) +{ + GList *l; + FileMetadata *metadata_to_delete; + + for (l = query_data->selection_metadata; l != NULL; l = l->next) + { + metadata_to_delete = l->data; + if (metadata_to_delete->metadata[metadata_type]) + { + g_string_free (metadata_to_delete->metadata[metadata_type], TRUE); + metadata_to_delete->metadata[metadata_type] = NULL; + } + } + + query_data->has_metadata[metadata_type] = FALSE; +} + +static GString* +format_date_time (GDateTime *date_time) +{ + g_autofree gchar *date = NULL; + GString *formated_date; + + date = g_date_time_format (date_time, "%x"); + if (strstr (date, "/") != NULL) + { + formated_date = batch_rename_replace (date, "/", "-"); + } + else + { + formated_date = g_string_new (date); + } + + return formated_date; +} + +static void on_cursor_callback (GObject *object, GAsyncResult *result, gpointer user_data) { - GHashTable *hash_table; TrackerSparqlCursor *cursor; gboolean success; QueryData *query_data; + MetadataType metadata_type; GError *error; GList *l; - FileMetadata *metadata; - FileMetadata *metadata_clear; - GDateTime *datetime; - gchar *date; + FileMetadata *file_metadata; + GDateTime *date_time; + guint i; + const gchar *current_metadata; const gchar *file_name; const gchar *creation_date; const gchar *year; @@ -736,11 +697,10 @@ on_cursor_callback (GObject *object, const gchar *album_name; error = NULL; - metadata = NULL; + file_metadata = NULL; cursor = TRACKER_SPARQL_CURSOR (object); query_data = user_data; - hash_table = query_data->hash_table; success = tracker_sparql_cursor_next_finish (cursor, result, &error); if (!success) @@ -754,7 +714,7 @@ on_cursor_callback (GObject *object, g_clear_object (&cursor); nautilus_batch_rename_dialog_query_finished (query_data->dialog, - query_data->hash_table, + query_data->date_order_hash_table, query_data->selection_metadata); return; @@ -776,245 +736,115 @@ on_cursor_callback (GObject *object, title = tracker_sparql_cursor_get_string (cursor, TITLE_INDEX, NULL); album_name = tracker_sparql_cursor_get_string (cursor, ALBUM_NAME_INDEX, NULL); - /* creation date used for sorting criteria */ - if (creation_date == NULL) - { - if (hash_table != NULL) - { - g_hash_table_destroy (hash_table); - } - - query_data->hash_table = NULL; - query_data->have_creation_date = FALSE; - } - else - { - if (query_data->have_creation_date) - { - g_hash_table_insert (hash_table, - g_strdup (tracker_sparql_cursor_get_string (cursor, 0, NULL)), - GINT_TO_POINTER (g_hash_table_size (hash_table))); - } - } + /* Search for the metadata object corresponding to the file name */ file_name = tracker_sparql_cursor_get_string (cursor, FILE_NAME_INDEX, NULL); for (l = query_data->selection_metadata; l != NULL; l = l->next) { - metadata = l->data; + file_metadata = l->data; - if (g_strcmp0 (file_name, metadata->file_name->str) == 0) + if (g_strcmp0 (file_name, file_metadata->file_name->str) == 0) { break; } } - /* Metadata to be used in file name - * creation date */ - if (query_data->have_creation_date) + /* Set metadata when available, and delete for the whole selection when not */ + for (i = 0; i < G_N_ELEMENTS (metadata_tags_constants); i++) { - if (!creation_date) + if (query_data->has_metadata[i]) { - query_data->have_creation_date = FALSE; - - for (l = query_data->selection_metadata; l != NULL; l = l->next) + metadata_type = metadata_tags_constants[i].metadata_type; + current_metadata = NULL; + switch (metadata_type) { - metadata_clear = l->data; - - if (metadata_clear->creation_date != NULL) + case ORIGINAL_FILE_NAME: { - g_string_free (metadata_clear->creation_date, TRUE); - metadata_clear->creation_date = NULL; + current_metadata = file_name; } - } - } - else - { - datetime = g_date_time_new_local (atoi (year), - atoi (month), - atoi (day), - atoi (hours), - atoi (minutes), - atoi (seconds)); - - date = g_date_time_format (datetime, "%x"); - - if (strstr (date, "/") != NULL) - { - metadata->creation_date = batch_rename_replace (date, "/", "-"); - } - else - { - metadata->creation_date = g_string_new (date); - } - - g_free (date); - } - } - - /* equipment */ - if (query_data->have_equipment) - { - if (equipment == NULL) - { - query_data->have_equipment = FALSE; - - for (l = query_data->selection_metadata; l != NULL; l = l->next) - { - metadata_clear = l->data; - - if (metadata_clear->equipment != NULL) + break; + case CREATION_DATE: { - g_string_free (metadata_clear->equipment, TRUE); - metadata_clear->equipment = NULL; + current_metadata = creation_date; } - } - } - else - { - metadata->equipment = g_string_new (equipment); - } - } - - /* season number */ - if (query_data->have_season) - { - if (season_number == NULL) - { - query_data->have_season = FALSE; - - for (l = query_data->selection_metadata; l != NULL; l = l->next) - { - metadata_clear = l->data; - - if (metadata_clear->season != NULL) + break; + case EQUIPMENT: { - g_string_free (metadata_clear->season, TRUE); - metadata_clear->season = NULL; + current_metadata = equipment; } - } - } - else - { - metadata->season = g_string_new (season_number); - } - } - - /* episode number */ - if (query_data->have_episode_number) - { - if (episode_number == NULL) - { - query_data->have_episode_number = FALSE; - - for (l = query_data->selection_metadata; l != NULL; l = l->next) - { - metadata_clear = l->data; - - if (metadata_clear->episode_number != NULL) + break; + case SEASON_NUMBER: { - g_string_free (metadata_clear->episode_number, TRUE); - metadata_clear->episode_number = NULL; + current_metadata = season_number; } - } - } - else - { - metadata->episode_number = g_string_new (episode_number); - } - } - - /* track number */ - if (query_data->have_track_number) - { - if (track_number == NULL) - { - query_data->have_track_number = FALSE; - for (l = query_data->selection_metadata; l != NULL; l = l->next) - { - metadata_clear = l->data; - - if (metadata_clear->track_number != NULL) + break; + case EPISODE_NUMBER: { - g_string_free (metadata_clear->track_number, TRUE); - metadata_clear->track_number = NULL; + current_metadata = episode_number; } - } - } - else - { - metadata->track_number = g_string_new (track_number); - } - } - - /* artist name */ - if (query_data->have_artist_name) - { - if (artist_name == NULL) - { - query_data->have_artist_name = FALSE; - - for (l = query_data->selection_metadata; l != NULL; l = l->next) - { - metadata_clear = l->data; - - if (metadata_clear->artist_name != NULL) + break; + case ARTIST_NAME: + { + current_metadata = artist_name; + } + break; + case ALBUM_NAME: + { + current_metadata = album_name; + } + break; + case TITLE: { - g_string_free (metadata_clear->artist_name, TRUE); - metadata_clear->artist_name = NULL; + current_metadata = title; } + break; + case TRACK_NUMBER: + { + current_metadata = track_number; + } + break; + default: + { + g_warn_if_reached(); + } + break; } - } - else - { - metadata->artist_name = g_string_new (artist_name); - } - } - - /* title */ - if (query_data->have_title) - { - if (title == NULL) - { - query_data->have_title = FALSE; - for (l = query_data->selection_metadata; l != NULL; l = l->next) + if (!current_metadata) { - metadata_clear = l->data; + remove_metadata (query_data, + metadata_type); - if (metadata_clear->title != NULL) + if (metadata_type == CREATION_DATE && + query_data->date_order_hash_table) { - g_string_free (metadata_clear->title, TRUE); - metadata_clear->title = NULL; + g_hash_table_destroy (query_data->date_order_hash_table); + query_data->date_order_hash_table = NULL; } } - } - else - { - metadata->title = g_string_new (title); - } - } - - /* album name */ - if (query_data->have_album_name) - { - if (album_name == NULL) - { - query_data->have_album_name = FALSE; - - for (l = query_data->selection_metadata; l != NULL; l = l->next) + else { - metadata_clear = l->data; - - if (metadata_clear->album_name != NULL) + if (metadata_type == CREATION_DATE) { - g_string_free (metadata_clear->album_name, TRUE); - metadata_clear->album_name = NULL; + /* Add the sort order to the order hash table */ + g_hash_table_insert (query_data->date_order_hash_table, + g_strdup (tracker_sparql_cursor_get_string (cursor, 0, NULL)), + GINT_TO_POINTER (g_hash_table_size (query_data->date_order_hash_table))); + + date_time = g_date_time_new_local (atoi (year), + atoi (month), + atoi (day), + atoi (hours), + atoi (minutes), + atoi (seconds)); + + file_metadata->metadata[metadata_type] = format_date_time (date_time); + } + else + { + file_metadata->metadata[metadata_type] = g_string_new (current_metadata); } } } - else - { - metadata->album_name = g_string_new (album_name); - } } /* Get next */ @@ -1046,7 +876,7 @@ batch_rename_dialog_query_callback (GObject *object, g_error_free (error); nautilus_batch_rename_dialog_query_finished (query_data->dialog, - query_data->hash_table, + query_data->date_order_hash_table, query_data->selection_metadata); } else @@ -1061,14 +891,14 @@ check_metadata_for_selection (NautilusBatchRenameDialog *dialog, { TrackerSparqlConnection *connection; GString *query; - GHashTable *hash_table; GList *l; NautilusFile *file; GError *error; QueryData *query_data; gchar *file_name; - FileMetadata *metadata; + FileMetadata *file_metadata; GList *selection_metadata; + guint i; error = NULL; selection_metadata = NULL; @@ -1119,18 +949,11 @@ check_metadata_for_selection (NautilusBatchRenameDialog *dialog, file_name); } - metadata = g_new (FileMetadata, 1); - metadata->file_name = g_string_new (file_name); - metadata->creation_date = NULL; - metadata->equipment = NULL; - metadata->season = NULL; - metadata->episode_number = NULL; - metadata->track_number = NULL; - metadata->artist_name = NULL; - metadata->title = NULL; - metadata->album_name = NULL; + file_metadata = g_new0 (FileMetadata, 1); + file_metadata->file_name = g_string_new (file_name); + file_metadata->metadata[ORIGINAL_FILE_NAME] = g_string_new (file_name); - selection_metadata = g_list_append (selection_metadata, metadata); + selection_metadata = g_list_append (selection_metadata, file_metadata); g_free (file_name); } @@ -1149,24 +972,17 @@ check_metadata_for_selection (NautilusBatchRenameDialog *dialog, return; } - hash_table = g_hash_table_new_full (g_str_hash, - g_str_equal, - (GDestroyNotify) g_free, - NULL); - query_data = g_new (QueryData, 1); - query_data->hash_table = hash_table; + query_data->date_order_hash_table = g_hash_table_new_full (g_str_hash, + g_str_equal, + (GDestroyNotify) g_free, + NULL); query_data->dialog = dialog; query_data->selection_metadata = selection_metadata; - - query_data->have_season = TRUE; - query_data->have_creation_date = TRUE; - query_data->have_artist_name = TRUE; - query_data->have_track_number = TRUE; - query_data->have_equipment = TRUE; - query_data->have_episode_number = TRUE; - query_data->have_title = TRUE; - query_data->have_album_name = TRUE; + for (i = 0; i < G_N_ELEMENTS (metadata_tags_constants); i++) + { + query_data->has_metadata[i] = TRUE; + } /* Make an asynchronous query to the store */ tracker_sparql_connection_query_async (connection, diff --git a/src/nautilus-batch-rename-utilities.h b/src/nautilus-batch-rename-utilities.h index 9025cc8ab..49631b7ae 100644 --- a/src/nautilus-batch-rename-utilities.h +++ b/src/nautilus-batch-rename-utilities.h @@ -60,4 +60,6 @@ gboolean file_name_conflicts_with_results (GList *selection, GString* batch_rename_replace_label_text (gchar *label, const gchar *substr); +gchar* batch_rename_get_tag_text_representation (TagConstants tag_constants); + #endif /* NAUTILUS_BATCH_RENAME_UTILITIES_H */ diff --git a/src/resources/ui/nautilus-batch-rename-dialog.ui b/src/resources/ui/nautilus-batch-rename-dialog.ui index 51ef0b752..4d4a6ec14 100644 --- a/src/resources/ui/nautilus-batch-rename-dialog.ui +++ b/src/resources/ui/nautilus-batch-rename-dialog.ui @@ -406,15 +406,15 @@ <attribute name="label" translatable="yes">Automatic Numbers</attribute> <item> <attribute name="label" translatable="yes">1, 2, 3, 4</attribute> - <attribute name="action">dialog.add-numbering-tag-zero</attribute> + <attribute name="action">dialog.add-numbering-no-zero-pad-tag</attribute> </item> <item> <attribute name="label" translatable="yes">01, 02, 03, 04</attribute> - <attribute name="action">dialog.add-numbering-tag-one</attribute> + <attribute name="action">dialog.add-numbering-one-zero-pad-tag</attribute> </item> <item> <attribute name="label" translatable="yes">001, 002, 003, 004</attribute> - <attribute name="action">dialog.add-numbering-tag-two</attribute> + <attribute name="action">dialog.add-numbering-two-zero-pad-tag</attribute> </item> </section> <section> |