[easytag] Move filename updating code to application window



commit b0c6e89c56e5877fd8398d3a4511bec9767ca4d5
Author: David King <amigadave amigadave com>
Date:   Thu Feb 19 23:27:23 2015 +0000

    Move filename updating code to application window
    
    Remove GTK+ calls from the ET_File code.

 src/application_window.c |  144 ++++++++++++++++++++++++++++++++++-
 src/file.c               |  188 +---------------------------------------------
 src/file.h               |    1 +
 src/file_name.c          |   36 +++++++++
 src/file_name.h          |    1 +
 5 files changed, 184 insertions(+), 186 deletions(-)
---
diff --git a/src/application_window.c b/src/application_window.c
index df763c8..c35d495 100644
--- a/src/application_window.c
+++ b/src/application_window.c
@@ -24,6 +24,7 @@
 
 #include "browser.h"
 #include "cddb_dialog.h"
+#include "charset.h"
 #include "easytag.h"
 #include "file_area.h"
 #include "file_list.h"
@@ -2019,15 +2020,154 @@ et_application_window_select_file_by_et_file (EtApplicationWindow *self,
     et_application_window_scan_dialog_update_previews (self);
 }
 
+/*
+ * Save displayed filename into list if it had been changed. Generates also an history list for undo/redo.
+ *  - ETFile : the current etfile that we want to save,
+ *  - FileName : where is 'temporary' saved the new filename.
+ *
+ * Note : it builds new filename (with path) from strings encoded into file system
+ *        encoding, not UTF-8 (it preserves file system encoding of parent directories).
+ */
+static void
+et_application_window_update_file_name_from_ui (EtApplicationWindow *self,
+                                                const ET_File *ETFile,
+                                                File_Name *FileName)
+{
+    gchar *filename_new = NULL;
+    gchar *dirname = NULL;
+    gchar *filename;
+    const gchar *filename_utf8;
+    gchar *extension;
+
+    g_return_val_if_fail (ETFile != NULL && FileName != NULL, FALSE);
+
+    filename_utf8 = et_application_window_file_area_get_filename (self);
+    filename = filename_from_display (filename_utf8);
+
+    if (!filename)
+    {
+        /* If conversion fails... */
+        GtkWidget *msgdialog;
+        gchar *filename_escaped_utf8 = g_strescape(filename_utf8, NULL);
+        msgdialog = gtk_message_dialog_new (GTK_WINDOW (self),
+                                            GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+                                            GTK_MESSAGE_ERROR,
+                                            GTK_BUTTONS_CLOSE,
+                                            _("Could not convert filename ā€˜%sā€™ to system filename encoding"),
+                                            filename_escaped_utf8);
+        gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (msgdialog),
+                                                  _("Try setting the environment variable 
G_FILENAME_ENCODING."));
+        gtk_window_set_title (GTK_WINDOW (msgdialog),
+                              _("Filename translation"));
+
+        gtk_dialog_run (GTK_DIALOG (msgdialog));
+        gtk_widget_destroy (msgdialog);
+        g_free (filename_escaped_utf8);
+        return;
+    }
+
+    /* Get the current path to the file. */
+    dirname = g_path_get_dirname (((File_Name *)ETFile->FileNameNew->data)->value);
+
+    /* Convert filename extension (lower or upper). */
+    extension = ET_File_Format_File_Extension (ETFile);
+
+    // Check length of filename (limit ~255 characters)
+    //ET_File_Name_Check_Length(ETFile,filename);
+
+    /* Filename (in file system encoding!). */
+    if (filename && *filename)
+    {
+        /* Regenerate the new filename (without path). */
+        filename_new = g_strconcat (filename, extension, NULL);
+    }
+    else
+    {
+        /* Keep the 'last' filename (if a 'blank' filename was entered in the
+         * fileentry for example). */
+        filename_new = g_path_get_basename (((File_Name *)ETFile->FileNameNew->data)->value);
+    }
+
+    g_free (filename);
+    g_free (extension);
+
+    et_file_name_set_from_components (FileName, filename_new, dirname,
+                                      g_settings_get_boolean (MainSettings,
+                                                              "rename-replace-illegal-chars"));
+
+    g_free (filename_new);
+    g_free (dirname);
+    return;
+}
+
 void
 et_application_window_update_et_file_from_ui (EtApplicationWindow *self)
 {
+    const ET_File_Description *description;
+    ET_File *et_file;
+    File_Name *FileName;
+    File_Tag  *FileTag;
+    const gchar *cur_filename_utf8;
+
+    if (!ETCore->ETFileDisplayed)
+    {
+        return;
+    }
+
+    et_file = ETCore->ETFileDisplayed;
+
+    g_return_if_fail (et_file != NULL && et_file->FileNameCur != NULL
+                      && et_file->FileNameCur->data != NULL);
+
     /* Save the current displayed data */
-    if (ETCore->ETFileDisplayed)
+    cur_filename_utf8 = ((File_Name *)((GList *)et_file->FileNameCur)->data)->value_utf8;
+    description = et_file->ETFileDescription;
+
+    /* Save filename and generate undo for filename. */
+    FileName = et_file_name_new ();
+    et_application_window_update_file_name_from_ui (self, et_file, FileName);
+
+    switch (description->TagType)
     {
-        ET_Save_File_Data_From_UI (ETCore->ETFileDisplayed);
+#ifdef ENABLE_MP3
+        case ID3_TAG:
+#endif
+#ifdef ENABLE_OGG
+        case OGG_TAG:
+#endif
+#ifdef ENABLE_FLAC
+        case FLAC_TAG:
+#endif
+#ifdef ENABLE_MP4
+        case MP4_TAG:
+#endif
+#ifdef ENABLE_WAVPACK
+        case WAVPACK_TAG:
+#endif
+#ifdef ENABLE_OPUS
+        case OPUS_TAG:
+#endif
+        case APE_TAG:
+            FileTag = et_application_window_tag_area_create_file_tag (self);
+            et_file_tag_copy_other_into (et_file->FileTag->data, FileTag);
+            break;
+        case UNKNOWN_TAG:
+        default:
+            FileTag = et_file_tag_new ();
+            Log_Print (LOG_ERROR,
+                       "FileTag: Undefined tag type %d for file %s.",
+                       (gint)description->TagType, cur_filename_utf8);
+            break;
     }
 
+    /*
+     * Generate undo for the file and the main undo list.
+     * If no changes detected, FileName and FileTag item are deleted.
+     */
+    ET_Manage_Changes_Of_File_Data (et_file, FileName, FileTag);
+
+    /* Refresh file into browser list */
+    et_application_window_browser_refresh_file_in_list (self, et_file);
 }
 
 static void
diff --git a/src/file.c b/src/file.c
index 9e592b0..7c57599 100644
--- a/src/file.c
+++ b/src/file.c
@@ -20,7 +20,6 @@
 
 #include "file.h"
 
-#include <gtk/gtk.h>
 #include <glib/gi18n.h>
 #include <string.h>
 #include <stdlib.h>
@@ -63,17 +62,12 @@
 static gboolean ET_Free_File_Name_List            (GList *FileNameList);
 static gboolean ET_Free_File_Tag_List (GList *FileTagList);
 
-static gboolean ET_Save_File_Name_From_UI (const ET_File *ETFile,
-                                           File_Name *FileName);
-
 static void ET_Mark_File_Tag_As_Saved (ET_File *ETFile);
 
 static gboolean ET_Add_File_Name_To_List (ET_File *ETFile,
                                           File_Name *FileName);
 static gboolean ET_Add_File_Tag_To_List (ET_File *ETFile, File_Tag  *FileTag);
 
-static gchar *ET_File_Format_File_Extension (const ET_File *ETFile);
-
 /*
  * Create a new ET_File structure
  */
@@ -1057,182 +1051,6 @@ ET_Free_File_Tag_List (GList *FileTagList)
  ********************/
 
 /*
- * Save information of the file, contained into the entries of the user interface, in the list.
- * An undo key is generated to be used for filename and tag if there are changed is the same time.
- * Filename and Tag.
- */
-void ET_Save_File_Data_From_UI (ET_File *ETFile)
-{
-    const ET_File_Description *description;
-    File_Name *FileName;
-    File_Tag  *FileTag;
-    const gchar *cur_filename_utf8;
-
-    g_return_if_fail (ETFile != NULL && ETFile->FileNameCur != NULL
-                      && ETFile->FileNameCur->data != NULL);
-
-    cur_filename_utf8 = ((File_Name *)((GList *)ETFile->FileNameCur)->data)->value_utf8;
-    description = ETFile->ETFileDescription;
-
-
-    /* Save filename and generate undo for filename. */
-    FileName = et_file_name_new ();
-    ET_Save_File_Name_From_UI(ETFile,FileName); // Used for all files!
-
-    switch (description->TagType)
-    {
-#ifdef ENABLE_MP3
-        case ID3_TAG:
-#endif
-#ifdef ENABLE_OGG
-        case OGG_TAG:
-#endif
-#ifdef ENABLE_FLAC
-        case FLAC_TAG:
-#endif
-#ifdef ENABLE_MP4
-        case MP4_TAG:
-#endif
-#ifdef ENABLE_WAVPACK
-        case WAVPACK_TAG:
-#endif
-#ifdef ENABLE_OPUS
-        case OPUS_TAG:
-#endif
-        case APE_TAG:
-            FileTag = et_application_window_tag_area_create_file_tag (ET_APPLICATION_WINDOW (MainWindow));
-            et_file_tag_copy_other_into (ETFile->FileTag->data, FileTag);
-            break;
-        case UNKNOWN_TAG:
-        default:
-            FileTag = et_file_tag_new ();
-            Log_Print (LOG_ERROR,
-                       "FileTag: Undefined tag type %d for file %s.",
-                       (gint)description->TagType, cur_filename_utf8);
-            break;
-    }
-
-    /*
-     * Generate undo for the file and the main undo list.
-     * If no changes detected, FileName and FileTag item are deleted.
-     */
-    ET_Manage_Changes_Of_File_Data(ETFile,FileName,FileTag);
-
-    /* Refresh file into browser list */
-    et_application_window_browser_refresh_file_in_list (ET_APPLICATION_WINDOW (MainWindow),
-                                                        ETFile);
-}
-
-static gboolean
-et_file_name_set_from_components (File_Name *file_name,
-                                  const gchar *new_name,
-                                  const gchar *dir_name)
-{
-    /* Check if new filename seems to be correct. */
-    if (new_name)
-    {
-        gchar *filename_new;
-        gchar *path_new;
-
-        filename_new = g_strdup (new_name);
-
-        /* Convert the illegal characters. */
-        et_filename_prepare (filename_new,
-                             g_settings_get_boolean (MainSettings,
-                                                     "rename-replace-illegal-chars"));
-
-        /* Set the new filename (in file system encoding). */
-        path_new = g_build_filename (dir_name, filename_new, NULL);
-        ET_Set_Filename_File_Name_Item (file_name, NULL, path_new);
-
-        g_free (path_new);
-        g_free (filename_new);
-        return TRUE;
-    }
-    else
-    {
-        file_name->value = NULL;
-        file_name->value_utf8 = NULL;
-        file_name->value_ck = NULL;
-
-        return FALSE;
-    }
-}
-
-/*
- * Save displayed filename into list if it had been changed. Generates also an history list for undo/redo.
- *  - ETFile : the current etfile that we want to save,
- *  - FileName : where is 'temporary' saved the new filename.
- *
- * Note : it builds new filename (with path) from strings encoded into file system
- *        encoding, not UTF-8 (it preserves file system encoding of parent directories).
- */
-static gboolean
-ET_Save_File_Name_From_UI (const ET_File *ETFile, File_Name *FileName)
-{
-    gchar *filename_new = NULL;
-    gchar *dirname = NULL;
-    gchar *filename;
-    const gchar *filename_utf8;
-    gchar *extension;
-    gboolean success;
-
-    g_return_val_if_fail (ETFile != NULL && FileName != NULL, FALSE);
-
-    filename_utf8 = et_application_window_file_area_get_filename (ET_APPLICATION_WINDOW (MainWindow));
-    filename = filename_from_display (filename_utf8);
-
-    if (!filename)
-    {
-        // If translation fails...
-        GtkWidget *msgdialog;
-        gchar *filename_escaped_utf8 = g_strescape(filename_utf8, NULL);
-        msgdialog = gtk_message_dialog_new(GTK_WINDOW(MainWindow),
-                                           GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
-                                           GTK_MESSAGE_ERROR,
-                                           GTK_BUTTONS_CLOSE,
-                                           _("Could not convert filename ā€˜%sā€™ to system filename encoding"),
-                                           filename_escaped_utf8);
-        gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(msgdialog),_("Try setting the 
environment variable G_FILENAME_ENCODING."));
-        gtk_window_set_title(GTK_WINDOW(msgdialog), _("Filename translation"));
-
-        gtk_dialog_run(GTK_DIALOG(msgdialog));
-        gtk_widget_destroy(msgdialog);
-        g_free(filename_escaped_utf8);
-        return FALSE;
-    }
-
-    // Get the current path to the file
-    dirname = g_path_get_dirname( ((File_Name *)ETFile->FileNameNew->data)->value );
-
-    /* Convert filename extension (lower or upper). */
-    extension = ET_File_Format_File_Extension (ETFile);
-
-    // Check length of filename (limit ~255 characters)
-    //ET_File_Name_Check_Length(ETFile,filename);
-
-    // Filename (in file system encoding!)
-    if (filename && strlen(filename)>0)
-    {
-        // Regenerate the new filename (without path)
-        filename_new = g_strconcat(filename,extension,NULL);
-    }else
-    {
-        // Keep the 'last' filename (if a 'blank' filename was entered in the fileentry for ex)...
-        filename_new = g_path_get_basename( ((File_Name *)ETFile->FileNameNew->data)->value );
-    }
-    g_free (filename);
-    g_free (extension);
-
-    success = et_file_name_set_from_components (FileName, filename_new,
-                                                dirname);
-
-    g_free (filename_new);
-    g_free (dirname);
-    return success;
-}
-
-/*
  * Do the same thing of ET_Save_File_Name_From_UI, but without getting the
  * data from the UI.
  */
@@ -1271,7 +1089,9 @@ ET_Save_File_Name_Internal (const ET_File *ETFile,
     g_free(filename);
 
     success = et_file_name_set_from_components (FileName, filename_new,
-                                                dirname);
+                                                dirname,
+                                                g_settings_get_boolean (MainSettings,
+                                                                        "rename-replace-illegal-chars"));
 
     g_free (filename_new);
     g_free (dirname);
@@ -2019,7 +1839,7 @@ gchar *ET_File_Name_Generate (ET_File *ETFile, gchar *new_file_name_utf8)
 
 
 /* Convert filename extension (lower/upper/no change). */
-static gchar *
+gchar *
 ET_File_Format_File_Extension (const ET_File *ETFile)
 {
     EtFilenameExtensionMode mode;
diff --git a/src/file.h b/src/file.h
index e2b3b93..7fddf60 100644
--- a/src/file.h
+++ b/src/file.h
@@ -82,6 +82,7 @@ gboolean ET_File_Data_Has_Redo_Data (const ET_File *ETFile);
 gboolean ET_Manage_Changes_Of_File_Data (ET_File *ETFile, File_Name *FileName, File_Tag *FileTag);
 void ET_Mark_File_Name_As_Saved (ET_File *ETFile);
 gchar *ET_File_Name_Generate (const ET_File *ETFile, const gchar *new_file_name);
+gchar * ET_File_Format_File_Extension (const ET_File *ETFile);
 
 gint ET_Comp_Func_Sort_File_By_Ascending_Filename (const ET_File *ETFile1, const ET_File *ETFile2);
 gint ET_Comp_Func_Sort_File_By_Descending_Filename (const ET_File *ETFile1, const ET_File *ETFile2);
diff --git a/src/file_name.c b/src/file_name.c
index f63f1e7..35dcf33 100644
--- a/src/file_name.c
+++ b/src/file_name.c
@@ -20,6 +20,7 @@
 
 #include "charset.h"
 #include "file.h"
+#include "misc.h"
 
 #include <string.h>
 
@@ -87,6 +88,41 @@ ET_Set_Filename_File_Name_Item (File_Name *FileName,
     }
 }
 
+gboolean
+et_file_name_set_from_components (File_Name *file_name,
+                                  const gchar *new_name,
+                                  const gchar *dir_name,
+                                  gboolean replace_illegal)
+{
+    /* Check if new filename seems to be correct. */
+    if (new_name)
+    {
+        gchar *filename_new;
+        gchar *path_new;
+
+        filename_new = g_strdup (new_name);
+
+        /* Convert the illegal characters. */
+        et_filename_prepare (filename_new, replace_illegal);
+
+        /* Set the new filename (in file system encoding). */
+        path_new = g_build_filename (dir_name, filename_new, NULL);
+        ET_Set_Filename_File_Name_Item (file_name, NULL, path_new);
+
+        g_free (path_new);
+        g_free (filename_new);
+        return TRUE;
+    }
+    else
+    {
+        file_name->value = NULL;
+        file_name->value_utf8 = NULL;
+        file_name->value_ck = NULL;
+
+        return FALSE;
+    }
+}
+
 /*
  * Compares two File_Name items :
  *  - returns TRUE if there aren't the same
diff --git a/src/file_name.h b/src/file_name.h
index a916c53..b65311a 100644
--- a/src/file_name.h
+++ b/src/file_name.h
@@ -38,6 +38,7 @@ typedef struct
 File_Name * et_file_name_new (void);
 void et_file_name_free (File_Name *file_name);
 void ET_Set_Filename_File_Name_Item (File_Name *FileName, const gchar *filename_utf8, const gchar *filename);
+gboolean et_file_name_set_from_components (File_Name *file_name, const gchar *new_name, const gchar 
*dir_name, gboolean replace_illegal);
 gboolean et_file_name_detect_difference (const File_Name *a, const File_Name *b);
 
 G_END_DECLS


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