diff options
author | Alexandru Pandelea <alexandru.pandelea@gmail.com> | 2016-06-29 01:44:58 +0300 |
---|---|---|
committer | Alexandru Pandelea <alexandru.pandelea@gmail.com> | 2016-07-02 14:57:17 +0300 |
commit | d22df81341a88d9690db7610ed7c933e4749f793 (patch) | |
tree | e9ee550ddcc62f69ecc04144ad6e6f5582d1c0fc | |
parent | ceefb843aca5a42b3d90c0d34049b85e907b78b7 (diff) | |
download | nautilus-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.c | 67 | ||||
-rw-r--r-- | src/nautilus-batch-rename-utilities.h | 3 | ||||
-rw-r--r-- | src/nautilus-batch-rename.c | 166 | ||||
-rw-r--r-- | src/nautilus-batch-rename.h | 9 | ||||
-rw-r--r-- | src/resources/ui/nautilus-batch-rename-dialog.ui | 82 |
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 |