[easytag/wip/application-window: 3/4] Store ID3v1 and ID3v2 iconv options in GSettings



commit 549b8415c68d6698ccbafb132f5297e61416b972
Author: David King <amigadave amigadave com>
Date:   Fri May 9 18:57:54 2014 +0100

    Store ID3v1 and ID3v2 iconv options in GSettings

 data/org.gnome.EasyTAG.gschema.xml |    4 +-
 src/id3_tag.c                      |   63 +++++++++++++++++++++++-------------
 src/id3v24_tag.c                   |   12 ++++--
 src/preferences_dialog.c           |   52 ++++++++++++++++++++++++++---
 src/setting.c                      |   20 -----------
 src/setting.h                      |   14 ++++---
 6 files changed, 104 insertions(+), 61 deletions(-)
---
diff --git a/data/org.gnome.EasyTAG.gschema.xml b/data/org.gnome.EasyTAG.gschema.xml
index e7e9a9e..1545c35 100644
--- a/data/org.gnome.EasyTAG.gschema.xml
+++ b/data/org.gnome.EasyTAG.gschema.xml
@@ -279,6 +279,7 @@
       tags</description>
       <default>'ISO-8859-1'</default>
     </key>
+    -->
 
     <key name="id3v1-encoding-option" enum="org.gnome.EasyTAG.EtTagEncoding">
       <summary>Encoding options when writing ID3v1 tags</summary>
@@ -286,7 +287,6 @@
       between encodings when writing ID3v1 tags</description>
       <default>'none'</default>
     </key>
-    -->
 
     <key name="id3v2-enabled" type="b">
       <summary>Write ID3v2 tags</summary>
@@ -355,6 +355,7 @@
       writing ID3v2 tags</description>
       <default>'ISO-8859-1'</default>
     </key>
+    -->
 
     <key name="id3v2-encoding-option" enum="org.gnome.EasyTAG.EtTagEncoding">
       <summary>Encoding options when writing ID3v2 tags</summary>
@@ -362,7 +363,6 @@
       between encodings when writing ID3v2 tags</description>
       <default>'none'</default>
     </key>
-    -->
 
     <key name="tag-date-autocomplete" type="b">
       <summary>Automatically complete the date</summary>
diff --git a/src/id3_tag.c b/src/id3_tag.c
index 5d1a122..b04df6a 100644
--- a/src/id3_tag.c
+++ b/src/id3_tag.c
@@ -1252,37 +1252,54 @@ void Id3tag_Prepare_ID3v1 (ID3Tag *id3_tag)
  * We use specials functionalities of iconv : //TRANSLIT and //IGNORE (the last
  * one doesn't work on my system) to force conversion to the target encoding.
  */
-gchar *Id3tag_Rules_For_ISO_Fields (const gchar *string, const gchar *from_codeset, const gchar *to_codeset)
+gchar *
+Id3tag_Rules_For_ISO_Fields (const gchar *string,
+                             const gchar *from_codeset,
+                             const gchar *to_codeset)
 {
     gchar *string_converted = NULL;
+    EtTagEncoding iconv_option;
 
     g_return_val_if_fail (string != NULL && from_codeset != NULL
                           && to_codeset != NULL, NULL);
 
-    if (FILE_WRITING_ID3V1_ICONV_OPTIONS_NO)
-    {
-        string_converted = convert_string(string,from_codeset,to_codeset,TRUE);
+    iconv_option = g_settings_get_enum (MainSettings, "id3v1-encoding-option");
 
-    }else if (FILE_WRITING_ID3V1_ICONV_OPTIONS_TRANSLIT)
-    {
-        // iconv_open (3):
-        // When the string "//TRANSLIT" is appended to tocode, transliteration
-        // is activated. This means that when a character cannot be represented
-        // in the target character set, it can be approximated through one or
-        // several similarly looking characters.
-        gchar *to_enc = g_strconcat(to_codeset, "//TRANSLIT", NULL);
-        string_converted = convert_string(string,from_codeset,to_enc,TRUE);
-        g_free(to_enc);
-
-    }else if (FILE_WRITING_ID3V1_ICONV_OPTIONS_IGNORE)
+    switch (iconv_option)
     {
-        // iconv_open (3):
-        // When the string "//IGNORE" is appended to tocode, characters that
-        // cannot be represented in the target character set will be silently
-        // discarded.
-        gchar *to_enc = g_strconcat(to_codeset, "//IGNORE", NULL);
-        string_converted = convert_string(string,from_codeset,to_enc,TRUE);
-        g_free(to_enc);
+        default:
+        case ET_TAG_ENCODING_NONE:
+            string_converted = convert_string (string, from_codeset,
+                                               to_codeset, TRUE);
+            break;
+        case ET_TAG_ENCODING_TRANSLITERATE:
+        {
+            /* iconv_open (3):
+             * When the string "//TRANSLIT" is appended to tocode,
+             * transliteration is activated. This means that when a character
+             * cannot be represented in the target character set, it can be
+             * approximated through one or several similarly looking
+             * characters.
+             */
+            gchar *to_enc = g_strconcat (to_codeset, "//TRANSLIT", NULL);
+            string_converted = convert_string (string, from_codeset, to_enc,
+                                               TRUE);
+            g_free (to_enc);
+            break;
+        }
+        case ET_TAG_ENCODING_IGNORE:
+        {
+            /* iconv_open (3):
+             * When the string "//IGNORE" is appended to tocode, characters
+             * that cannot be represented in the target character set will be
+             * silently discarded.
+             */
+            gchar *to_enc = g_strconcat (to_codeset, "//IGNORE", NULL);
+            string_converted = convert_string (string, from_codeset, to_enc,
+                                               TRUE);
+            g_free (to_enc);
+            break;
+        }
     }
 
     return string_converted;
diff --git a/src/id3v24_tag.c b/src/id3v24_tag.c
index 11e84ad..c30d4fc 100644
--- a/src/id3v24_tag.c
+++ b/src/id3v24_tag.c
@@ -1241,10 +1241,12 @@ id3taglib_set_field(struct id3_frame *frame,
             /* id3v1 fields converted using its own character set and iconv options */
             if ( id3v1 )
             {
-                if ( !FILE_WRITING_ID3V1_ICONV_OPTIONS_NO )
+                EtTagEncoding iconv_option = g_settings_get_enum (MainSettings,
+                                                                  "id3v1-encoding-option");
+                if (iconv_option != ET_TAG_ENCODING_NONE)
                     encname = g_strconcat(
                         FILE_WRITING_ID3V1_CHARACTER_SET,
-                        FILE_WRITING_ID3V1_ICONV_OPTIONS_TRANSLIT ? "//TRANSLIT" : "//IGNORE",
+                        iconv_option == ET_TAG_ENCODING_TRANSLITERATE ? "//TRANSLIT" : "//IGNORE",
                         NULL);
                 else
                     encname = g_strdup(FILE_WRITING_ID3V1_CHARACTER_SET);
@@ -1253,10 +1255,12 @@ id3taglib_set_field(struct id3_frame *frame,
                 /* latin1 fields (such as URL) always converted with ISO-8859-1*/
                 if ((type != ID3_FIELD_TYPE_LATIN1) && (type != ID3_FIELD_TYPE_LATIN1FULL))
                 {
-                    if ( FILE_WRITING_ID3V2_ICONV_OPTIONS_NO == 0)
+                    EtTagEncoding iconv_option = g_settings_get_enum (MainSettings,
+                                                                      "id3v2-encoding-option");
+                    if (iconv_option != ET_TAG_ENCODING_NONE)
                         encname = g_strconcat(
                             FILE_WRITING_ID3V2_NO_UNICODE_CHARACTER_SET,
-                            FILE_WRITING_ID3V2_ICONV_OPTIONS_TRANSLIT ? "//TRANSLIT" : "//IGNORE",
+                            iconv_option == ET_TAG_ENCODING_TRANSLITERATE ? "//TRANSLIT" : "//IGNORE",
                             NULL);
                     else
                         encname = g_strdup(FILE_WRITING_ID3V2_NO_UNICODE_CHARACTER_SET);
diff --git a/src/preferences_dialog.c b/src/preferences_dialog.c
index 26d8ffd..2fc4d76 100644
--- a/src/preferences_dialog.c
+++ b/src/preferences_dialog.c
@@ -892,7 +892,7 @@ create_preferences_dialog (EtPreferencesDialog *self)
         _("No"));
     gtk_grid_attach (GTK_GRID (Table), FileWritingId3v2IconvOptionsNo, 2, 6, 1,
                      1);
-    
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(FileWritingId3v2IconvOptionsNo),FILE_WRITING_ID3V2_ICONV_OPTIONS_NO);
+    gtk_widget_set_name (FileWritingId3v2IconvOptionsNo, "none");
     gtk_widget_set_tooltip_text(FileWritingId3v2IconvOptionsNo,_("With this option, when "
         "a character cannot be represented in the target character set, it isn't changed. "
         "But note that an error message will be displayed for information."));
@@ -901,7 +901,8 @@ create_preferences_dialog (EtPreferencesDialog *self)
         _("//TRANSLIT"));
     gtk_grid_attach (GTK_GRID (Table), FileWritingId3v2IconvOptionsTranslit, 3,
                      6, 1, 1);
-    
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(FileWritingId3v2IconvOptionsTranslit),FILE_WRITING_ID3V2_ICONV_OPTIONS_TRANSLIT);
+    gtk_widget_set_name (FileWritingId3v2IconvOptionsTranslit,
+                         "transliterate");
     gtk_widget_set_tooltip_text(FileWritingId3v2IconvOptionsTranslit,_("With this option, when "
         "a character cannot be represented in the target character set, it can be "
         "approximated through one or several similarly looking characters."));
@@ -911,11 +912,30 @@ create_preferences_dialog (EtPreferencesDialog *self)
         _("//IGNORE"));
     gtk_grid_attach (GTK_GRID (Table), FileWritingId3v2IconvOptionsIgnore, 4,
                      6, 1, 1);
-    
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(FileWritingId3v2IconvOptionsIgnore),FILE_WRITING_ID3V2_ICONV_OPTIONS_IGNORE);
+    gtk_widget_set_name (FileWritingId3v2IconvOptionsIgnore, "ignore");
     gtk_widget_set_tooltip_text(FileWritingId3v2IconvOptionsIgnore,_("With this option, when "
         "a character cannot be represented in the target character set, it will "
         "be silently discarded."));
 
+    g_settings_bind_with_mapping (MainSettings, "id3v2-encoding-option",
+                                  FileWritingId3v2IconvOptionsNo, "active",
+                                  G_SETTINGS_BIND_DEFAULT,
+                                  et_settings_enum_radio_get,
+                                  et_settings_enum_radio_set,
+                                  FileWritingId3v2IconvOptionsNo, NULL);
+    g_settings_bind_with_mapping (MainSettings, "id3v2-encoding-option",
+                                  FileWritingId3v2IconvOptionsTranslit,
+                                  "active", G_SETTINGS_BIND_DEFAULT,
+                                  et_settings_enum_radio_get,
+                                  et_settings_enum_radio_set,
+                                  FileWritingId3v2IconvOptionsTranslit, NULL);
+    g_settings_bind_with_mapping (MainSettings, "id3v2-encoding-option",
+                                  FileWritingId3v2IconvOptionsIgnore, "active",
+                                  G_SETTINGS_BIND_DEFAULT,
+                                  et_settings_enum_radio_get,
+                                  et_settings_enum_radio_set,
+                                  FileWritingId3v2IconvOptionsIgnore, NULL);
+
     // ID3v1 tags
     Frame = gtk_frame_new (_("ID3v1 tags"));
     gtk_box_pack_start(GTK_BOX(id3v1v2hbox),Frame,FALSE,FALSE,2);
@@ -962,7 +982,7 @@ create_preferences_dialog (EtPreferencesDialog *self)
         _("No"));
     gtk_grid_attach (GTK_GRID (Table), FileWritingId3v1IconvOptionsNo, 1, 4, 1,
                      1);
-    
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(FileWritingId3v1IconvOptionsNo),FILE_WRITING_ID3V1_ICONV_OPTIONS_NO);
+    gtk_widget_set_name (FileWritingId3v1IconvOptionsNo, "none");
     gtk_widget_set_tooltip_text(FileWritingId3v1IconvOptionsNo,_("With this option, when "
         "a character cannot be represented in the target character set, it isn't changed. "
         "But note that an error message will be displayed for information."));
@@ -971,7 +991,8 @@ create_preferences_dialog (EtPreferencesDialog *self)
         _("//TRANSLIT"));
     gtk_grid_attach (GTK_GRID (Table), FileWritingId3v1IconvOptionsTranslit, 2,
                      4, 1, 1);
-    
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(FileWritingId3v1IconvOptionsTranslit),FILE_WRITING_ID3V1_ICONV_OPTIONS_TRANSLIT);
+    gtk_widget_set_name (FileWritingId3v1IconvOptionsTranslit,
+                         "transliterate");
     gtk_widget_set_tooltip_text(FileWritingId3v1IconvOptionsTranslit,_("With this option, when "
         "a character cannot be represented in the target character set, it can be "
         "approximated through one or several similarly looking characters."));
@@ -981,11 +1002,30 @@ create_preferences_dialog (EtPreferencesDialog *self)
         _("//IGNORE"));
     gtk_grid_attach (GTK_GRID (Table), FileWritingId3v1IconvOptionsIgnore, 3,
                      4, 1, 1);
-    
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(FileWritingId3v1IconvOptionsIgnore),FILE_WRITING_ID3V1_ICONV_OPTIONS_IGNORE);
+    gtk_widget_set_name (FileWritingId3v1IconvOptionsIgnore, "ignore");
     gtk_widget_set_tooltip_text(FileWritingId3v1IconvOptionsIgnore,_("With this option, when "
         "a character cannot be represented in the target character set, it will "
         "be silently discarded."));
 
+    g_settings_bind_with_mapping (MainSettings, "id3v1-encoding-option",
+                                  FileWritingId3v1IconvOptionsNo, "active",
+                                  G_SETTINGS_BIND_DEFAULT,
+                                  et_settings_enum_radio_get,
+                                  et_settings_enum_radio_set,
+                                  FileWritingId3v1IconvOptionsNo, NULL);
+    g_settings_bind_with_mapping (MainSettings, "id3v1-encoding-option",
+                                  FileWritingId3v1IconvOptionsTranslit,
+                                  "active", G_SETTINGS_BIND_DEFAULT,
+                                  et_settings_enum_radio_get,
+                                  et_settings_enum_radio_set,
+                                  FileWritingId3v1IconvOptionsTranslit, NULL);
+    g_settings_bind_with_mapping (MainSettings, "id3v1-encoding-option",
+                                  FileWritingId3v1IconvOptionsIgnore, "active",
+                                  G_SETTINGS_BIND_DEFAULT,
+                                  et_settings_enum_radio_get,
+                                  et_settings_enum_radio_set,
+                                  FileWritingId3v1IconvOptionsIgnore, NULL);
+
     /* Character Set for reading tag */
     Frame = gtk_frame_new (_("Character Set for reading ID3 tags"));
     gtk_box_pack_start(GTK_BOX(VBox),Frame,FALSE,FALSE,0);
diff --git a/src/setting.c b/src/setting.c
index 3c74240..d204e9f 100644
--- a/src/setting.c
+++ b/src/setting.c
@@ -129,13 +129,7 @@ static const tConfigVariable Config_Variables[] =
     {"file_writing_id3v2_version_4",                   CV_TYPE_BOOL,  &FILE_WRITING_ID3V2_VERSION_4   },
     {"file_writing_id3v2_unicode_character_set",       
CV_TYPE_STRING,&FILE_WRITING_ID3V2_UNICODE_CHARACTER_SET},
     {"file_writing_id3v2_no_unicode_character_set",    
CV_TYPE_STRING,&FILE_WRITING_ID3V2_NO_UNICODE_CHARACTER_SET},
-    {"file_writing_id3v2_iconv_options_no",            CV_TYPE_BOOL,  &FILE_WRITING_ID3V2_ICONV_OPTIONS_NO},
-    {"file_writing_id3v2_iconv_options_translit",      CV_TYPE_BOOL,  
&FILE_WRITING_ID3V2_ICONV_OPTIONS_TRANSLIT},
-    {"file_writing_id3v2_iconv_options_ignore",        CV_TYPE_BOOL,  
&FILE_WRITING_ID3V2_ICONV_OPTIONS_IGNORE},
     {"file_writing_id3v1_character_set",               CV_TYPE_STRING,&FILE_WRITING_ID3V1_CHARACTER_SET},
-    {"file_writing_id3v1_iconv_options_no",            CV_TYPE_BOOL,  &FILE_WRITING_ID3V1_ICONV_OPTIONS_NO},
-    {"file_writing_id3v1_iconv_options_translit",      CV_TYPE_BOOL,  
&FILE_WRITING_ID3V1_ICONV_OPTIONS_TRANSLIT},
-    {"file_writing_id3v1_iconv_options_ignore",        CV_TYPE_BOOL,  
&FILE_WRITING_ID3V1_ICONV_OPTIONS_IGNORE},
 
     {"audio_file_player",                       CV_TYPE_STRING,&AUDIO_FILE_PLAYER                        },
 
@@ -258,13 +252,7 @@ void Init_Config_Variables (void)
     FILE_WRITING_ID3V2_UNICODE_CHARACTER_SET        = g_strdup("UTF-8");
 #endif /* !G_OS_WIN32 */
     FILE_WRITING_ID3V2_NO_UNICODE_CHARACTER_SET     = g_strdup("ISO-8859-1");
-    FILE_WRITING_ID3V2_ICONV_OPTIONS_NO             = 1;
-    FILE_WRITING_ID3V2_ICONV_OPTIONS_TRANSLIT       = 0;
-    FILE_WRITING_ID3V2_ICONV_OPTIONS_IGNORE         = 0;
     FILE_WRITING_ID3V1_CHARACTER_SET                = g_strdup("ISO-8859-1");
-    FILE_WRITING_ID3V1_ICONV_OPTIONS_NO             = 0;
-    FILE_WRITING_ID3V1_ICONV_OPTIONS_TRANSLIT       = 1;
-    FILE_WRITING_ID3V1_ICONV_OPTIONS_IGNORE         = 0;
 
     /*
      * Scanner
@@ -421,18 +409,10 @@ Apply_Changes_Of_Preferences_Window (void)
         FILE_WRITING_ID3V2_NO_UNICODE_CHARACTER_SET  = Charset_Get_Name_From_Title(temp);
         g_free(temp);
 
-        FILE_WRITING_ID3V2_ICONV_OPTIONS_NO          = 
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(FileWritingId3v2IconvOptionsNo));
-        FILE_WRITING_ID3V2_ICONV_OPTIONS_TRANSLIT    = 
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(FileWritingId3v2IconvOptionsTranslit));
-        FILE_WRITING_ID3V2_ICONV_OPTIONS_IGNORE      = 
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(FileWritingId3v2IconvOptionsIgnore));
-
         temp = Get_Active_Combo_Box_Item(GTK_COMBO_BOX(FileWritingId3v1CharacterSetCombo));
         FILE_WRITING_ID3V1_CHARACTER_SET             = Charset_Get_Name_From_Title(temp);
         g_free(temp);
 
-        FILE_WRITING_ID3V1_ICONV_OPTIONS_NO          = 
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(FileWritingId3v1IconvOptionsNo));
-        FILE_WRITING_ID3V1_ICONV_OPTIONS_TRANSLIT    = 
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(FileWritingId3v1IconvOptionsTranslit));
-        FILE_WRITING_ID3V1_ICONV_OPTIONS_IGNORE      = 
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(FileWritingId3v1IconvOptionsIgnore));
-
         /* Scanner */
         // Fill Tag Scanner
         FTS_CONVERT_UNDERSCORE_AND_P20_INTO_SPACE = 
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(FTSConvertUnderscoreAndP20IntoSpace));
diff --git a/src/setting.h b/src/setting.h
index 20f7d55..dd6a1c9 100644
--- a/src/setting.h
+++ b/src/setting.h
@@ -115,6 +115,14 @@ typedef enum
     ET_SORT_MODE_DESCENDING_FILE_SAMPLERATE
 } EtSortMode;
 
+/* Additional options to be passed to iconv(). */
+typedef enum
+{
+    ET_TAG_ENCODING_NONE,
+    ET_TAG_ENCODING_TRANSLITERATE,
+    ET_TAG_ENCODING_IGNORE
+} EtTagEncoding;
+
 /*
  * Config variables
  */
@@ -141,14 +149,8 @@ gchar  *FILE_READING_ID3V1V2_CHARACTER_SET;
 
 gchar  *FILE_WRITING_ID3V2_UNICODE_CHARACTER_SET;
 gchar  *FILE_WRITING_ID3V2_NO_UNICODE_CHARACTER_SET;
-gint    FILE_WRITING_ID3V2_ICONV_OPTIONS_NO;
-gint    FILE_WRITING_ID3V2_ICONV_OPTIONS_TRANSLIT;
-gint    FILE_WRITING_ID3V2_ICONV_OPTIONS_IGNORE;
 
 gchar  *FILE_WRITING_ID3V1_CHARACTER_SET;
-gint    FILE_WRITING_ID3V1_ICONV_OPTIONS_NO;
-gint    FILE_WRITING_ID3V1_ICONV_OPTIONS_TRANSLIT;
-gint    FILE_WRITING_ID3V1_ICONV_OPTIONS_IGNORE;
 
 gint PAD_DISC_NUMBER;
 gint PAD_DISC_NUMBER_DIGITS;


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