summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandru Pandelea <alexandru.pandelea@gmail.com>2016-06-29 01:44:58 +0300
committerAlexandru Pandelea <alexandru.pandelea@gmail.com>2016-07-02 14:57:17 +0300
commitd22df81341a88d9690db7610ed7c933e4749f793 (patch)
treee9ee550ddcc62f69ecc04144ad6e6f5582d1c0fc
parentceefb843aca5a42b3d90c0d34049b85e907b78b7 (diff)
downloadnautilus-d22df81341a88d9690db7610ed7c933e4749f793.tar.gz
Add sorting options for files names
Now the files names can be sorted by using criteria like: original name or last modified date. This is useful when there is used a numbering option and the user is not pleased with the default order of the files and wants to change it. In this commit some warnigns were also fixed. https://bugzilla.gnome.org/show_bug.cgi?id=768311
-rw-r--r--src/nautilus-batch-rename-utilities.c67
-rw-r--r--src/nautilus-batch-rename-utilities.h3
-rw-r--r--src/nautilus-batch-rename.c166
-rw-r--r--src/nautilus-batch-rename.h9
-rw-r--r--src/resources/ui/nautilus-batch-rename-dialog.ui82
5 files changed, 265 insertions, 62 deletions
diff --git a/src/nautilus-batch-rename-utilities.c b/src/nautilus-batch-rename-utilities.c
index 8668d6f42..624f8be40 100644
--- a/src/nautilus-batch-rename-utilities.c
+++ b/src/nautilus-batch-rename-utilities.c
@@ -1,6 +1,7 @@
#include "nautilus-batch-rename.h"
#include "nautilus-batch-rename-utilities.h"
#include "nautilus-files-view.h"
+#include "nautilus-file.h"
#include <glib.h>
#include <gtk/gtk.h>
@@ -200,4 +201,70 @@ concat(gchar *s1, gchar *s2)
memcpy(result + strlen(s1), s2, strlen(s2) + 1);
return result;
+}
+
+gint
+compare_files_by_name_ascending (NautilusFile *f1,
+ NautilusFile *f2)
+{
+ if (f1 == f2)
+ return 0;
+
+ if (strcmp (nautilus_file_get_name (f1), nautilus_file_get_name (f2)) >= 0) {
+ return 1;
+ }
+ return -1;
+}
+
+gint
+compare_files_by_name_descending (NautilusFile *f1,
+ NautilusFile *f2)
+{
+ if (f1 == f2)
+ return 0;
+
+ if (strcmp (nautilus_file_get_name (f1), nautilus_file_get_name (f2)) >= 0) {
+ return -1;
+ }
+ return 1;
+}
+
+gint
+compare_files_by_first_modified (NautilusFile *f1,
+ NautilusFile *f2)
+{
+ return nautilus_file_compare_for_sort (f1,f2,
+ NAUTILUS_FILE_SORT_BY_MTIME,
+ FALSE, FALSE);
+}
+
+gint
+compare_files_by_last_modified (NautilusFile *f1,
+ NautilusFile *f2)
+{
+ return nautilus_file_compare_for_sort (f1,f2,
+ NAUTILUS_FILE_SORT_BY_MTIME,
+ FALSE, TRUE);
+}
+
+GList*
+nautilus_batch_rename_sort (GList *selection,
+ SortingMode mode)
+{
+ if (mode == ORIGINAL_ASCENDING)
+ return g_list_sort (selection, compare_files_by_name_ascending);
+
+ if (mode == ORIGINAL_DESCENDING) {
+ return g_list_sort (selection, compare_files_by_name_descending);
+ }
+
+ if (mode == FIRST_MODIFIED) {
+ return g_list_sort (selection, compare_files_by_first_modified);
+ }
+
+ if (mode == LAST_MODIFIED) {
+ return g_list_sort (selection, compare_files_by_last_modified);
+ }
+
+ return NULL;
} \ No newline at end of file
diff --git a/src/nautilus-batch-rename-utilities.h b/src/nautilus-batch-rename-utilities.h
index 33e916fbb..28df907ed 100644
--- a/src/nautilus-batch-rename-utilities.h
+++ b/src/nautilus-batch-rename-utilities.h
@@ -26,4 +26,7 @@ GList* list_has_duplicates (NautilusFilesView *view,
gchar* concat (gchar *s1,
gchar *s2);
+GList* nautilus_batch_rename_sort (GList *selection,
+ SortingMode mode);
+
#endif /* NAUTILUS_BATCH_RENAME_UTILITIES_H */ \ No newline at end of file
diff --git a/src/nautilus-batch-rename.c b/src/nautilus-batch-rename.c
index 264f7cff5..9479b7db8 100644
--- a/src/nautilus-batch-rename.c
+++ b/src/nautilus-batch-rename.c
@@ -49,8 +49,8 @@ struct _NautilusBatchRename
GtkWidget *replace_mode_button;
GtkWidget *add_button;
GtkWidget *add_popover;
- GtkWidget *numbering_order_popover;
- GtkWidget *numbering_order_button;
+ GtkWidget *add_button_label;
+ GtkWidget *numbering_order_label;
GList *listbox_rows;
@@ -59,13 +59,95 @@ struct _NautilusBatchRename
NautilusFilesView *view;
GtkWidget *expander_label;
+
+ GActionGroup *action_group;
};
static void batch_rename_dialog_on_closed (GtkDialog *dialog);
static void file_names_widget_entry_on_changed (NautilusBatchRename *dialog);
+
G_DEFINE_TYPE (NautilusBatchRename, nautilus_batch_rename, GTK_TYPE_DIALOG);
+static void
+numbering_order_changed_descending (GSimpleAction *action,
+ GVariant *state,
+ gpointer user_data)
+{
+ NautilusBatchRename *dialog;
+
+ dialog = NAUTILUS_BATCH_RENAME (user_data);
+
+ dialog->selection = nautilus_batch_rename_sort (dialog->selection, ORIGINAL_DESCENDING);
+
+ gtk_label_set_label (GTK_LABEL (dialog->numbering_order_label),
+ "Original name (Descending)");
+
+ /* update display text */
+ file_names_widget_entry_on_changed (dialog);
+}
+
+static void
+numbering_order_changed_ascending (GSimpleAction *action,
+ GVariant *state,
+ gpointer user_data)
+{
+ NautilusBatchRename *dialog;
+
+ dialog = NAUTILUS_BATCH_RENAME (user_data);
+
+ dialog->selection = nautilus_batch_rename_sort (dialog->selection, ORIGINAL_ASCENDING);
+
+ gtk_label_set_label (GTK_LABEL (dialog->numbering_order_label),
+ "Original name (Ascending) ");
+
+ /* update display text */
+ file_names_widget_entry_on_changed (dialog);
+}
+
+static void
+numbering_order_changed_first_modified (GSimpleAction *action,
+ GVariant *state,
+ gpointer user_data)
+{
+ NautilusBatchRename *dialog;
+
+ dialog = NAUTILUS_BATCH_RENAME (user_data);
+
+ dialog->selection = nautilus_batch_rename_sort (dialog->selection, FIRST_MODIFIED);
+
+ gtk_label_set_label (GTK_LABEL (dialog->numbering_order_label),
+ "First Modified ");
+
+ /* update display text */
+ file_names_widget_entry_on_changed (dialog);
+}
+
+static void
+numbering_order_changed_last_modified (GSimpleAction *action,
+ GVariant *state,
+ gpointer user_data)
+{
+ NautilusBatchRename *dialog;
+
+ dialog = NAUTILUS_BATCH_RENAME (user_data);
+
+ dialog->selection = nautilus_batch_rename_sort (dialog->selection, LAST_MODIFIED);
+
+ gtk_label_set_label (GTK_LABEL (dialog->numbering_order_label),
+ "Last Modified ");
+
+ /* update display text */
+ file_names_widget_entry_on_changed (dialog);
+}
+
+const GActionEntry dialog_entries[] = {
+ { "numbering-order-changed-descending", numbering_order_changed_descending },
+ { "numbering-order-changed-ascending", numbering_order_changed_ascending },
+ { "numbering-order-changed-first-modified", numbering_order_changed_first_modified },
+ { "numbering-order-changed-last-modified", numbering_order_changed_last_modified },
+};
+
static GList*
batch_rename_get_new_names (NautilusBatchRename *dialog)
{
@@ -177,10 +259,16 @@ create_row_for_label (const gchar *new_text,
"xalign", 0.0,
"margin-start", 6,
NULL);
- gtk_box_pack_end (GTK_BOX (box), label_new, FALSE, FALSE, 0);
- gtk_box_pack_end (GTK_BOX (box), arrow, FALSE, FALSE, 0);
- gtk_box_pack_end (GTK_BOX (box), label_old, FALSE, FALSE, 0);
- gtk_list_box_row_set_selectable (GTK_LIST_BOX_ROW (row), FALSE);
+
+ gtk_label_set_ellipsize (GTK_LABEL (label_new), PANGO_ELLIPSIZE_END);
+ gtk_label_set_max_width_chars (GTK_LABEL (label_new), MAX_DISPLAY_LEN);
+
+ gtk_label_set_max_width_chars (GTK_LABEL (label_old), MAX_DISPLAY_LEN);
+
+ gtk_box_pack_end (GTK_BOX (box), label_new, TRUE, FALSE, 0);
+ gtk_box_pack_end (GTK_BOX (box), arrow, TRUE, FALSE, 0);
+ gtk_box_pack_end (GTK_BOX (box), label_old, TRUE, FALSE, 0);
+ gtk_list_box_row_set_selectable (GTK_LIST_BOX_ROW (row), TRUE);
gtk_container_add (GTK_CONTAINER (row), box);
gtk_widget_show_all (row);
@@ -196,13 +284,11 @@ fill_display_listbox (NautilusBatchRename *dialog,
GList *l1;
GList *l2;
GList *l;
- gchar *tmp_name;
NautilusFile *file;
/* clear rows from listbox (if there are any) */
if (dialog->listbox_rows != NULL)
for (l = dialog->listbox_rows; l != NULL; l = l->next) {
- /*Fix me: figure why this shows warning on run */
gtk_container_remove (GTK_CONTAINER (dialog->conflict_listbox),
GTK_WIDGET (l->data));
}
@@ -210,12 +296,9 @@ fill_display_listbox (NautilusBatchRename *dialog,
g_list_free (dialog->listbox_rows);
dialog->listbox_rows = NULL;
- /* add rows to a list so that they can be removed when there appears
- * a new conflict */
- dialog->listbox_rows = g_list_prepend (dialog->listbox_rows,
- (gpointer) row);
-
- for (l1 = new_names, l2 = dialog->selection; l1 != NULL, l2 != NULL; l1 = l1->next, l2 = l2->next) {
+ /* add rows to a list so that they can be removed when the renaming
+ * result changes */
+ for (l1 = new_names, l2 = dialog->selection; l1 != NULL || l2 != NULL; l1 = l1->next, l2 = l2->next) {
file = NAUTILUS_FILE (l2->data);
row = create_row_for_label (l1->data, nautilus_file_get_name (file), TRUE);
@@ -231,12 +314,11 @@ static void
file_names_widget_entry_on_changed (NautilusBatchRename *dialog)
{
gchar *entry_text;
- gchar *replace_text;
+ //gchar *replace_text;
gchar *file_name;
GList *new_names;
GList *duplicates;
gchar *display_text = NULL;
- NautilusFile *file;
gboolean singe_conflict;
if(dialog->selection == NULL)
@@ -305,7 +387,7 @@ file_names_widget_entry_on_changed (NautilusBatchRename *dialog)
g_free (entry_text);
g_free (file_name);
- g_free (replace_text);
+ //g_free (replace_text);
g_free (display_text);
}
@@ -334,20 +416,20 @@ static void
batch_rename_mode_changed (NautilusBatchRename *dialog)
{
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->format_mode_button))) {
- gtk_stack_set_visible_child_name (dialog->mode_stack, "format");
+ gtk_stack_set_visible_child_name (GTK_STACK (dialog->mode_stack), "format");
dialog->mode = NAUTILUS_BATCH_RENAME_PREPEND;
gtk_entry_set_text (GTK_ENTRY (dialog->name_entry),
- gtk_entry_get_text (dialog->find_entry));
+ gtk_entry_get_text (GTK_ENTRY (dialog->find_entry)));
} else {
- gtk_stack_set_visible_child_name (dialog->mode_stack, "replace");
+ gtk_stack_set_visible_child_name (GTK_STACK (dialog->mode_stack), "replace");
dialog->mode = NAUTILUS_BATCH_RENAME_REPLACE;
gtk_entry_set_text (GTK_ENTRY (dialog->find_entry),
- gtk_entry_get_text (dialog->name_entry));
+ gtk_entry_get_text ( GTK_ENTRY (dialog->name_entry)));
}
/* update display text */
@@ -365,24 +447,33 @@ add_button_clicked (NautilusBatchRename *dialog)
}
static void
-numbering_order_button_clicked (NautilusBatchRename *dialog)
-{
- if (gtk_widget_is_visible (dialog->numbering_order_popover))
- gtk_widget_set_visible (dialog->numbering_order_popover, FALSE);
- else
- gtk_widget_set_visible (dialog->numbering_order_popover, TRUE);
-}
-
-static void
add_popover_closed (NautilusBatchRename *dialog)
{
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->add_button), FALSE);
}
static void
-numbering_order_popover_closed (NautilusBatchRename *dialog)
+nautilus_batch_rename_initialize_actions (NautilusBatchRename *dialog)
{
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->numbering_order_button), FALSE);
+ GAction *action;
+
+ dialog->action_group = G_ACTION_GROUP (g_simple_action_group_new ());
+
+ g_action_map_add_action_entries (G_ACTION_MAP (dialog->action_group),
+ dialog_entries,
+ G_N_ELEMENTS (dialog_entries),
+ dialog);
+ gtk_widget_insert_action_group (GTK_WIDGET (dialog),
+ "dialog",
+ G_ACTION_GROUP (dialog->action_group));
+
+ action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
+ "numbering-order-changed-ascending");
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action),TRUE);
+
+ action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
+ "numbering-order-changed-descending");
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (action),TRUE);
}
static void
@@ -409,8 +500,8 @@ nautilus_batch_rename_class_init (NautilusBatchRenameClass *klass)
gtk_widget_class_bind_template_child (widget_class, NautilusBatchRename, format_mode_button);
gtk_widget_class_bind_template_child (widget_class, NautilusBatchRename, add_button);
gtk_widget_class_bind_template_child (widget_class, NautilusBatchRename, add_popover);
- gtk_widget_class_bind_template_child (widget_class, NautilusBatchRename, numbering_order_popover);
- gtk_widget_class_bind_template_child (widget_class, NautilusBatchRename, numbering_order_button);
+ gtk_widget_class_bind_template_child (widget_class, NautilusBatchRename, add_button_label);
+ gtk_widget_class_bind_template_child (widget_class, NautilusBatchRename, numbering_order_label);
gtk_widget_class_bind_template_callback (widget_class, file_names_widget_entry_on_changed);
gtk_widget_class_bind_template_callback (widget_class, batch_rename_dialog_on_closed);
@@ -418,8 +509,6 @@ nautilus_batch_rename_class_init (NautilusBatchRenameClass *klass)
gtk_widget_class_bind_template_callback (widget_class, batch_rename_mode_changed);
gtk_widget_class_bind_template_callback (widget_class, add_button_clicked);
gtk_widget_class_bind_template_callback (widget_class, add_popover_closed);
- gtk_widget_class_bind_template_callback (widget_class, numbering_order_popover_closed);
- gtk_widget_class_bind_template_callback (widget_class, numbering_order_button_clicked);
}
GtkWidget*
@@ -446,6 +535,9 @@ nautilus_batch_rename_new (NautilusFilesView *view)
//gtk_label_set_ellipsize (GTK_LABEL (dialog->expander_label), PANGO_ELLIPSIZE_END);
//gtk_label_set_max_width_chars (GTK_LABEL (dialog->expander_label), MAX_DISPLAY_LEN - 1);
+ gtk_label_set_markup_with_mnemonic (GTK_LABEL (dialog->add_button_label),
+ "<b>+</b> _Add");
+
gtk_widget_set_vexpand (dialog->rename_button, FALSE);
files_nr = 0;
@@ -457,6 +549,8 @@ nautilus_batch_rename_new (NautilusFilesView *view)
sprintf (dialog_title, "Renaming %d files", files_nr);
gtk_window_set_title (GTK_WINDOW (dialog), dialog_title);
+ nautilus_batch_rename_initialize_actions (dialog);
+
/* update display text */
file_names_widget_entry_on_changed (dialog);
diff --git a/src/nautilus-batch-rename.h b/src/nautilus-batch-rename.h
index 63fab696b..b48423f8c 100644
--- a/src/nautilus-batch-rename.h
+++ b/src/nautilus-batch-rename.h
@@ -15,6 +15,15 @@ typedef enum {
NAUTILUS_BATCH_RENAME_FORMAT = 3,
} NautilusBatchRenameModes;
+typedef enum {
+ ORIGINAL_ASCENDING = 0,
+ ORIGINAL_DESCENDING = 1,
+ FIRST_CREATED = 2,
+ LAST_CREATED = 3,
+ FIRST_MODIFIED = 4,
+ LAST_MODIFIED = 5,
+} SortingMode;
+
#define NAUTILUS_TYPE_BATCH_RENAME (nautilus_batch_rename_get_type())
G_DECLARE_FINAL_TYPE (NautilusBatchRename, nautilus_batch_rename, NAUTILUS, BATCH_RENAME, GtkDialog);
diff --git a/src/resources/ui/nautilus-batch-rename-dialog.ui b/src/resources/ui/nautilus-batch-rename-dialog.ui
index 8fd3c9282..1a381097e 100644
--- a/src/resources/ui/nautilus-batch-rename-dialog.ui
+++ b/src/resources/ui/nautilus-batch-rename-dialog.ui
@@ -118,8 +118,13 @@
<child>
<object class="GtkToggleButton" id="add_button">
<property name="visible">True</property>
- <property name="label" translatable="yes">+ Add</property>
<signal name="toggled" handler="add_button_clicked" swapped="yes" />
+ <child>
+ <object class="GtkLabel" id="add_button_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
</object>
</child>
</object>
@@ -130,7 +135,7 @@
</packing>
</child>
<child>
- <object class="GtkLabel" id="numbering_order_label">
+ <object class="GtkLabel" id="numbering_order">
<property name="visible">True</property>
<property name="label" translatable="yes">Automatic Numbering Order</property>
<property name="can_focus">False</property>
@@ -143,14 +148,30 @@
</packing>
</child>
<child>
- <object class="GtkToggleButton" id="numbering_order_button">
+ <object class="GtkMenuButton" id="numbering_order_button">
<property name="visible">True</property>
- <signal name="toggled" handler="numbering_order_button_clicked" swapped="yes" />
+ <property name="sensitive">True</property>
+ <property name="use-popover">True</property>
+ <property name="menu_model">numbering_order_menu</property>
<child>
- <object class="GtkLabel" id="numering_order">
+ <object class="GtkBox">
<property name="visible">True</property>
- <property name="label" translatable="yes">Original name (Ascending)</property>
- <property name="can_focus">False</property>
+ <property name="orientation">horizontal</property>
+ <property name="spacing">15</property>
+ <child>
+ <object class="GtkLabel" id="numbering_order_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Original name (Ascending) </property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage" id="action_icon">
+ <property name="visible">True</property>
+ <property name="icon-name">pan-down-symbolic</property>
+ <property name="icon-size">1</property>
+ </object>
+ </child>
</object>
</child>
</object>
@@ -282,13 +303,7 @@
</object>
</child>
</template>
- <object class="GtkAdjustment" id="adjustment">
- <property name="upper">100000000</property>
- <property name="lower">0</property>
- <property name="value">1</property>
- <property name="step_increment">1</property>
- <property name="page_increment">10</property>
- </object>
+
<object class="GtkPopover" id="add_popover">
<property name="relative-to">add_button</property>
<property name="position">bottom</property>
@@ -302,17 +317,32 @@
</object>
</child>
</object>
- <object class="GtkPopover" id="numbering_order_popover">
- <property name="relative-to">numbering_order_button</property>
- <property name="position">bottom</property>
- <signal name="closed" handler="numbering_order_popover_closed" swapped="yes" />
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">some other ordering option</property>
- <property name="can_focus">False</property>
- <property name="sensitive">True</property>
- </object>
- </child>
+
+ <object class="GtkImage" id="done_image">
+ <property name="visible">True</property>
+ <property name="icon_name">object-select-symbolic</property>
</object>
+
+ <menu id="numbering_order_menu">
+ <section>
+ <item>
+ <attribute name="id">ascending</attribute>
+ <attribute name="label" translatable="yes">Original name (Ascending) </attribute>
+ <attribute name="action">dialog.numbering-order-changed-ascending</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Original name (Descending)</attribute>
+ <attribute name="action">dialog.numbering-order-changed-descending</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">First Modified</attribute>
+ <attribute name="action">dialog.numbering-order-changed-first-modified</attribute>
+ <attribute name="icon">object-select-symbolic</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Last Modified</attribute>
+ <attribute name="action">dialog.numbering-order-changed-last-modified</attribute>
+ </item>
+ </section>
+ </menu>
</interface> \ No newline at end of file