summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Soriano <csoriano@gnome.org>2016-09-09 23:09:08 +0200
committerCarlos Soriano <csoriano@gnome.org>2016-09-12 13:52:34 +0200
commit66693775d91eb8278bc7f9d0c5674cdccbc3dd0b (patch)
tree8809f6581afd75686699e76a8b76a167abd8f973
parentac91c7cad629a1ef6bf7757d27ab7267bb3e242c (diff)
downloadnautilus-66693775d91eb8278bc7f9d0c5674cdccbc3dd0b.tar.gz
batch-rename-dialog: major refactoring
This is a refactoring that is difficult to split in several pieces. This patch implements the following changes: - Use loops instead of serie of if/elses. - Use enums and static arrays to define a static serie of tag types and properties. - Use enums for ordering and retrieval of properties of tags instead of searching. - Merge common code. - Extract common code in functions. - Mark for translation some strings. - Plug some leaks. - Fix some free-after-free. - Fix issue with condition for unavailable metadata, that was exacerbated with this refactoring. https://bugzilla.gnome.org/show_bug.cgi?id=770586
-rw-r--r--src/nautilus-batch-rename-dialog.c1475
-rw-r--r--src/nautilus-batch-rename-dialog.h193
-rw-r--r--src/nautilus-batch-rename-utilities.c630
-rw-r--r--src/nautilus-batch-rename-utilities.h2
-rw-r--r--src/resources/ui/nautilus-batch-rename-dialog.ui6
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>