[gnome-subtitles] Allow to set the encoding to use when saving files



commit d96291eeb367b7ff7b04513380b522cba342890a
Author: Pedro Castro <mail>
Date:   Tue Jan 19 23:29:41 2010 +0000

    Allow to set the encoding to use when saving files

 data/gnome-subtitles.schemas                       |   11 ----
 src/Glade/PreferencesDialog.glade                  |    4 +-
 src/GnomeSubtitles/Core/Config.cs                  |   22 ++++++++
 src/GnomeSubtitles/Dialog/PreferencesDialog.cs     |   53 ++++++++++++++++++--
 .../Dialog/SubtitleFileSaveAsDialog.cs             |   42 ++++++++++++++--
 .../Ui/Component/EncodingComboBox.cs               |    6 +-
 6 files changed, 113 insertions(+), 25 deletions(-)
---
diff --git a/data/gnome-subtitles.schemas b/data/gnome-subtitles.schemas
index 2d4005c..2caf6b6 100644
--- a/data/gnome-subtitles.schemas
+++ b/data/gnome-subtitles.schemas
@@ -112,16 +112,5 @@
 				<long>Encoding to use when opening files. Besides the actual encoding, used when "RememberLastUsed" or "Specific" are set in the file_open_encoding_option key, other possible values are "AutoDetect" and "CurrentLocale".</long>
 			</locale>
 		</schema>
-		<schema>
-			<key>/schemas/apps/gnome-subtitles/preferences/file_save/file_save_subtitle_format</key>
-			<applyto>/apps/gnome-subtitles/preferences/file_save/file_save_subtitle_format</applyto>
-			<owner>gnome-subtitles</owner>
-			<type>string</type>
-			<default>SubRip</default>
-			<locale name="C">
-				<short>File save subtitle format</short>
-				<long>Subtitle format to choose by default in the File Save As dialog.</long>
-			</locale>
-		</schema>
 	</schemalist>
 </gconfschemafile>
diff --git a/src/Glade/PreferencesDialog.glade b/src/Glade/PreferencesDialog.glade
index 26681f2..7d7ce21 100644
--- a/src/Glade/PreferencesDialog.glade
+++ b/src/Glade/PreferencesDialog.glade
@@ -211,7 +211,7 @@
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkComboBox" id="combobox1">
+                          <widget class="GtkComboBox" id="subtitleFormatComboBox">
                             <property name="visible">True</property>
                           </widget>
                           <packing>
@@ -220,7 +220,7 @@
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkComboBox" id="combobox2">
+                          <widget class="GtkComboBox" id="fileSaveEncodingComboBox">
                             <property name="visible">True</property>
                           </widget>
                           <packing>
diff --git a/src/GnomeSubtitles/Core/Config.cs b/src/GnomeSubtitles/Core/Config.cs
index a04d0cf..b8e34b2 100644
--- a/src/GnomeSubtitles/Core/Config.cs
+++ b/src/GnomeSubtitles/Core/Config.cs
@@ -25,6 +25,8 @@ namespace GnomeSubtitles.Core {
 /* Enumerations */
 public enum ConfigFileOpenEncodingOption { AutoDetect = 0, RememberLastUsed = 1, CurrentLocale = 3, Specific = 4 }; //Values match ordering where the options are used
 public enum ConfigFileOpenEncoding { AutoDetect = 0, CurrentLocale = 2, Fixed = 3 };
+public enum ConfigFileSaveEncodingOption { KeepExisting = 0, RememberLastUsed = 1, CurrentLocale = 3, Specific = 4 }; //Values match ordering where the options are used
+public enum ConfigFileSaveEncoding { KeepExisting = -1, CurrentLocale = 0, Fixed = 1 }; //KeepExisting=-1 because it doesn't appear
 
 public class Config {
 	private Client client = null;
@@ -48,6 +50,8 @@ public class Config {
 	private const string keyPrefsWindowWidth = keyPrefsWindow + "width";
 	private const string keyPrefsDefaultsFileOpenEncodingOption = keyPrefsDefaults + "file_open_encoding_option";
 	private const string keyPrefsDefaultsFileOpenEncoding = keyPrefsDefaults + "file_open_encoding";
+	private const string keyPrefsDefaultsFileSaveEncodingOption = keyPrefsDefaults + "file_save_encoding_option";
+	private const string keyPrefsDefaultsFileSaveEncoding = keyPrefsDefaults + "file_save_encoding";
 
 	public Config () {
 		client = new Client();
@@ -108,6 +112,24 @@ public class Config {
 		get { return GetString(keyPrefsDefaultsFileOpenEncoding, "ISO-8859-15"); }
 		set { Set(keyPrefsDefaultsFileOpenEncoding, value); }
 	}
+
+	public ConfigFileSaveEncodingOption PrefsDefaultsFileSaveEncodingOption {
+		get { return (ConfigFileSaveEncodingOption)GetEnumValue(keyPrefsDefaultsFileSaveEncodingOption, ConfigFileSaveEncodingOption.KeepExisting); }
+		set { Set(keyPrefsDefaultsFileSaveEncodingOption, value.ToString()); }
+	}
+
+	public ConfigFileSaveEncoding PrefsDefaultsFileSaveEncoding {
+		get { return (ConfigFileSaveEncoding)GetEnumValueFromSuperset(keyPrefsDefaultsFileSaveEncoding, ConfigFileSaveEncoding.Fixed); }
+		set { Set(keyPrefsDefaultsFileSaveEncoding, value.ToString()); }
+	}
+
+	/* Uses the same key as PrefsDefaultsFileSaveEncoding but is used when there's a specific encoding set */
+	public string PrefsDefaultsFileSaveEncodingFixed {
+		get { return GetString(keyPrefsDefaultsFileSaveEncoding, "ISO-8859-15"); }
+		set { Set(keyPrefsDefaultsFileSaveEncoding, value); }
+	}
+
+
 	
 	/* Private members */
 	
diff --git a/src/GnomeSubtitles/Dialog/PreferencesDialog.cs b/src/GnomeSubtitles/Dialog/PreferencesDialog.cs
index b49beca..d43d48f 100644
--- a/src/GnomeSubtitles/Dialog/PreferencesDialog.cs
+++ b/src/GnomeSubtitles/Dialog/PreferencesDialog.cs
@@ -33,10 +33,12 @@ public class PreferencesDialog : GladeDialog {
 
 	/* Components */
 	private EncodingComboBox fileOpenEncoding = null;
+	private EncodingComboBox fileSaveEncoding = null;
 
 	/* Widgets */
 	[WidgetAttribute] private CheckButton videoAutoChooseFileCheckButton = null;
 	[WidgetAttribute] private ComboBox fileOpenEncodingComboBox = null;
+	[WidgetAttribute] private ComboBox fileSaveEncodingComboBox = null;
 
 	public PreferencesDialog () : base(gladeFilename, false) {
 		LoadValues();
@@ -47,6 +49,7 @@ public class PreferencesDialog : GladeDialog {
 	
 	private void LoadValues () {
 		SetDefaultsFileOpenEncoding();
+		SetDefaultsFileSaveEncoding();
 
 
 		/* Video Auto choose file */
@@ -57,7 +60,7 @@ public class PreferencesDialog : GladeDialog {
 	}
 
 	private void SetDefaultsFileOpenEncoding () {
-		string[] fileOpenAdditionalActions = { Catalog.GetString("Remember Last Used") };
+		string[] additionalActions = { Catalog.GetString("Remember Last Used") };
 		int fixedEncoding = -1;
 		ConfigFileOpenEncodingOption fileOpenEncodingOption = Base.Config.PrefsDefaultsFileOpenEncodingOption;
 		if (fileOpenEncodingOption == ConfigFileOpenEncodingOption.Specific) {
@@ -67,13 +70,31 @@ public class PreferencesDialog : GladeDialog {
 			fixedEncoding = encodingDescription.CodePage;
 		}
 
-		fileOpenEncoding = new EncodingComboBox(fileOpenEncodingComboBox, true, fileOpenAdditionalActions, fixedEncoding);
+		fileOpenEncoding = new EncodingComboBox(fileOpenEncodingComboBox, true, additionalActions, fixedEncoding);
 		if (fileOpenEncodingOption != ConfigFileOpenEncodingOption.Specific) {
 			fileOpenEncoding.ActiveSelection = (int)fileOpenEncodingOption;
 		}
 		fileOpenEncoding.SelectionChanged += OnDefaultsFileOpenEncodingChanged;
 	}
 
+	private void SetDefaultsFileSaveEncoding () {
+		string[] additionalActions = { Catalog.GetString("Keep Existing"), Catalog.GetString("Remember Last Used") }; //TODO change label
+		int fixedEncoding = -1;
+		ConfigFileSaveEncodingOption fileSaveEncodingOption = Base.Config.PrefsDefaultsFileSaveEncodingOption;
+		if (fileSaveEncodingOption == ConfigFileSaveEncodingOption.Specific) {
+			string encodingName = Base.Config.PrefsDefaultsFileSaveEncodingFixed;
+			EncodingDescription encodingDescription = EncodingDescription.Empty;
+			Encodings.Find(encodingName, ref encodingDescription);
+			fixedEncoding = encodingDescription.CodePage;
+		}
+
+		fileSaveEncoding = new EncodingComboBox(fileSaveEncodingComboBox, false, additionalActions, fixedEncoding);
+		if (fileSaveEncodingOption != ConfigFileSaveEncodingOption.Specific) {
+			fileSaveEncoding.ActiveSelection = (int)fileSaveEncodingOption;
+		}
+		fileSaveEncoding.SelectionChanged += OnDefaultsFileSaveEncodingChanged;
+	}
+
 	
 	/* Event members */
 
@@ -82,7 +103,7 @@ public class PreferencesDialog : GladeDialog {
 	private void OnDefaultsFileOpenEncodingChanged (object o, EventArgs args) {
 		int active = fileOpenEncoding.ActiveSelection;
 		ConfigFileOpenEncodingOption activeOption = (ConfigFileOpenEncodingOption)Enum.ToObject(typeof(ConfigFileOpenEncodingOption), active);
-		if (((int)activeOption) > ((int)ConfigFileOpenEncodingOption.Specific))
+		if (((int)activeOption) > ((int)ConfigFileOpenEncodingOption.Specific)) //Positions higher than specific are always specific too
 			activeOption = ConfigFileOpenEncodingOption.Specific;
 
 		Base.Config.PrefsDefaultsFileOpenEncodingOption = activeOption;
@@ -94,7 +115,7 @@ public class PreferencesDialog : GladeDialog {
 			}
 		}
 		else {
-			/* If encoding option is current locale, encoding holds current locale too, otherwise it just holds auto detect */
+			/* If encoding is current locale, encoding holds current locale too, otherwise it just holds auto detect */
 			ConfigFileOpenEncoding encodingToStore = ConfigFileOpenEncoding.AutoDetect;
 			if (activeOption == ConfigFileOpenEncodingOption.CurrentLocale) {
 				encodingToStore = ConfigFileOpenEncoding.CurrentLocale;
@@ -103,6 +124,30 @@ public class PreferencesDialog : GladeDialog {
 		}
 	}
 
+	private void OnDefaultsFileSaveEncodingChanged (object o, EventArgs args) {
+		int active = fileSaveEncoding.ActiveSelection;
+		ConfigFileSaveEncodingOption activeOption = (ConfigFileSaveEncodingOption)Enum.ToObject(typeof(ConfigFileSaveEncodingOption), active);
+		if (((int)activeOption) > ((int)ConfigFileOpenEncodingOption.Specific)) //Positions higher than specific are always specific too
+			activeOption = ConfigFileSaveEncodingOption.Specific;
+
+		Base.Config.PrefsDefaultsFileSaveEncodingOption = activeOption;
+		/* If encoding is specific, encodingOption=Specific and encoding holds the encoding name */
+		if (activeOption == ConfigFileSaveEncodingOption.Specific) {
+			EncodingDescription chosenEncoding = fileSaveEncoding.ChosenEncoding;
+			if (!chosenEncoding.Equals(EncodingDescription.Empty)) {
+				Base.Config.PrefsDefaultsFileSaveEncodingFixed = chosenEncoding.Name;
+			}
+		}
+		else {
+			/* If encoding option is current locale, encoding holds current locale too, otherwise it just holds keep existing */
+			ConfigFileSaveEncoding encodingToStore = ConfigFileSaveEncoding.KeepExisting;
+			if (activeOption == ConfigFileSaveEncodingOption.CurrentLocale) {
+				encodingToStore = ConfigFileSaveEncoding.CurrentLocale;
+			}
+			Base.Config.PrefsDefaultsFileSaveEncoding = encodingToStore;
+		}
+	}
+
 	private void OnVideoAutoChooseFileToggled (object o, EventArgs args) {
 		Base.Config.PrefsVideoAutoChooseFile = videoAutoChooseFileCheckButton.Active;
 	}
diff --git a/src/GnomeSubtitles/Dialog/SubtitleFileSaveAsDialog.cs b/src/GnomeSubtitles/Dialog/SubtitleFileSaveAsDialog.cs
index 5b76663..d6490f0 100644
--- a/src/GnomeSubtitles/Dialog/SubtitleFileSaveAsDialog.cs
+++ b/src/GnomeSubtitles/Dialog/SubtitleFileSaveAsDialog.cs
@@ -56,17 +56,35 @@ public abstract class SubtitleFileSaveAsDialog : GladeDialog {
 
 		this.textType = textType;
 		SetTitle();
-		this.encodingComboBox = new EncodingComboBox(fileEncodingComboBox, false, null, GetFixedEncoding());
+
+		InitEncodingComboBox();
 
 		FillFormatComboBox();
 		FillNewlineTypeComboBox();
 	}
 
+	private void InitEncodingComboBox () {
+		int fixedEncoding = GetFixedEncoding();
+		ConfigFileSaveEncoding encodingConfig = Base.Config.PrefsDefaultsFileSaveEncoding;
+		if (encodingConfig == ConfigFileSaveEncoding.Fixed) {
+			string encodingName = Base.Config.PrefsDefaultsFileSaveEncodingFixed;
+			EncodingDescription encodingDescription = EncodingDescription.Empty;
+			Encodings.Find(encodingName, ref encodingDescription);
+			fixedEncoding = encodingDescription.CodePage;
+		}
+
+		this.encodingComboBox = new EncodingComboBox(fileEncodingComboBox, false, null, fixedEncoding);
+
+		/* Only need to handle the case of currentLocale, as Fixed and Keep Existent is handled before */
+		if (encodingConfig == ConfigFileSaveEncoding.CurrentLocale)
+			encodingComboBox.ActiveSelection = (int)encodingConfig;
+	}
+
 	/* Overriden members */
 
-	public override DialogScope Scope {
+	/*public override DialogScope Scope {
 		get { return DialogScope.Document; }
-	}
+	}*/
 
 	/* Public properties */
 
@@ -316,9 +334,23 @@ public abstract class SubtitleFileSaveAsDialog : GladeDialog {
 			chosenFilename = AddExtensionIfNeeded(chosenSubtitleType);
 
 			chosenEncoding = encodingComboBox.ChosenEncoding;
-			SetReturnValue(true);
-			
+			if (Base.Config.PrefsDefaultsFileSaveEncodingOption == ConfigFileSaveEncodingOption.RememberLastUsed) {
+				int activeAction = encodingComboBox.ActiveSelection;
+				System.Console.WriteLine("Active action: " + activeAction);
+				ConfigFileSaveEncoding activeOption = (ConfigFileSaveEncoding)Enum.ToObject(typeof(ConfigFileSaveEncoding), activeAction);
+				if (((int)activeOption) >= ((int)ConfigFileSaveEncoding.Fixed)) {
+					System.Console.WriteLine("Chosen encoding: " + chosenEncoding.Name);
+					Base.Config.PrefsDefaultsFileSaveEncodingFixed = chosenEncoding.Name;
+				}
+				else {
+					System.Console.WriteLine("Active option: " + activeOption);
+					Base.Config.PrefsDefaultsFileSaveEncoding = activeOption;
+				}
+			}
+
 			chosenNewlineType = GetChosenNewlineType();
+
+			SetReturnValue(true);
 		}
 		return false;
 	}
diff --git a/src/GnomeSubtitles/Ui/Component/EncodingComboBox.cs b/src/GnomeSubtitles/Ui/Component/EncodingComboBox.cs
index 23842e1..3dbcd51 100644
--- a/src/GnomeSubtitles/Ui/Component/EncodingComboBox.cs
+++ b/src/GnomeSubtitles/Ui/Component/EncodingComboBox.cs
@@ -67,10 +67,10 @@ public class EncodingComboBox {
 	public EncodingDescription ChosenEncoding {
 		get {
 			int active = comboBox.Active;
-			if (hasAutoDetect)
-				return (active == 0 ? EncodingDescription.Empty : (EncodingDescription)encodings[active - (actionCount + 1)]); //1 for break line
+			if (active < actionCount) //An action is active
+				return EncodingDescription.Empty;
 			else
-				return (EncodingDescription)encodings[active];
+				return (EncodingDescription)encodings[active - (actionCount > 0 ? actionCount + 1 : 0)]; //1 for break line
 		}
 	}
 



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