[banshee] [Equalizer] support read-only presets



commit ec4f5099d55c9428bc1d020293862c024c0e1ea1
Author: Aaron Bockover <abockover novell com>
Date:   Wed Feb 10 19:16:20 2010 -0500

    [Equalizer] support read-only presets
    
    The default preset equalizers will now always be available, whether or not a user
    has defined a preset of the same name. Default presets cannot be edited or as they
    are read-only, but they will show up at the bottom of the preset list, and below
    a separator, so user-defined presets are always sorted at the top of the list.
    
    Additionally, a bug is fixed in the JSON format allowing users to have any number
    of presets with the same name.

 .../Banshee.Equalizer/EqualizerManager.cs          |  150 ++++++++++---------
 .../Banshee.Equalizer/EqualizerSetting.cs          |    7 +-
 .../EqualizerPresetComboBox.cs                     |   52 ++++++-
 .../Banshee.Equalizer.Gui/EqualizerView.cs         |    9 +-
 .../Banshee.Equalizer.Gui/EqualizerWindow.cs       |    5 +-
 5 files changed, 138 insertions(+), 85 deletions(-)
---
diff --git a/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerManager.cs b/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerManager.cs
index bede9f7..97d8119 100644
--- a/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerManager.cs
+++ b/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerManager.cs
@@ -98,7 +98,7 @@ namespace Banshee.Equalizer
 
         private void Remove (EqualizerSetting eq, bool shouldQueueSave)
         {
-            if (eq == null) {
+            if (eq == null || eq.IsReadOnly) {
                 return;
             }
 
@@ -194,17 +194,22 @@ namespace Banshee.Equalizer
         {
             var timer = Log.DebugTimerStart ();
 
-            Clear ();
+            if (equalizers.Count > 0) {
+                Clear ();
+            }
 
             try {
                 if (File.Exists (Path)) {
                     using (var reader = new StreamReader (path)) {
                         var deserializer = new Deserializer (reader);
-                        foreach (var node in (JsonObject)deserializer.Deserialize ()) {
-                            var eq_data = (JsonObject)node.Value;
-                            var eq = new EqualizerSetting (this, node.Key);
-                            eq.SetAmplifierLevel (Convert.ToDouble (eq_data["preamp"]), false);
+                        foreach (var node in (JsonArray)deserializer.Deserialize ()) {
+                            var eq_data = (JsonObject)node;
+                            var name = (string)eq_data["name"];
+                            var preamp = Convert.ToDouble (eq_data["preamp"]);
                             var bands = (JsonArray)eq_data["bands"];
+
+                            var eq = new EqualizerSetting (this, name);
+                            eq.SetAmplifierLevel (preamp, false);
                             for (uint band = 0; band < bands.Count; band++) {
                                 eq.SetGain (band, Convert.ToDouble (bands[(int)band]), false);
                             }
@@ -242,70 +247,68 @@ namespace Banshee.Equalizer
                 Log.Exception ("Could not load equalizers.json", e);
             }
 
-            if (equalizers.Count == 0) {
-                LoadDefaults ();
-            }
-
             Log.DebugTimerPrint (timer, "Loaded equalizer presets: {0}");
+
+            bool any_user_defined = equalizers.Count > 0;
+            equalizers.AddRange (GetDefaultEqualizers ());
+            if (!any_user_defined) {
+                Select ("Pop");
+            }
         }
 
-        private void LoadDefaults ()
+        private IEnumerable<EqualizerSetting> GetDefaultEqualizers ()
         {
-            equalizers = new List<EqualizerSetting> () {
-                new EqualizerSetting (this, Catalog.GetString ("Classical"), 0, new [] {
-                    0, 0, 0, 0, 0, 0, -7.2, -7.2, -7.2, -9.6
-                }),
-                new EqualizerSetting (this, Catalog.GetString ("Club"), 0, new [] {
-                    0, 0, 8, 5.6, 5.6, 5.6, 3.2, 0, 0, 0
-                }),
-                new EqualizerSetting (this, Catalog.GetString ("Dance"), -1.1, new [] {
-                    9.6, 7.2, 2.4, -1.1, -1.1, -5.6, -7.2, -7.2, -1.1, -1.1
-                }),
-                new EqualizerSetting (this, Catalog.GetString ("Full Bass"), -1.1, new [] {
-                    -8, 9.6, 9.6, 5.6, 1.6, -4, -8, -10.4, -11.2, -11.2
-                }),
-                new EqualizerSetting (this, Catalog.GetString ("Full Bass and Treble"), -1.1, new [] {
-                    7.2, 5.6, -1.1, -7.2, -4.8, 1.6, 8, 11.2, 12, 12
-                }),
-                new EqualizerSetting (this, Catalog.GetString ("Full Treble"), -1.1, new [] {
-                    -9.6, -9.6, -9.6, -4, 2.4, 11.2, 11.5, 11.8, 11.8, 12
-                }),
-                new EqualizerSetting (this, Catalog.GetString ("Laptop Speakers and Headphones"), -1.1, new [] {
-                    4.8, 11.2, 5.6, -3.2, -2.4, 1.6, 4.8, 9.6, 11.9, 11.9
-                }),
-                new EqualizerSetting (this, Catalog.GetString ("Large Hall"), -1.1, new [] {
-                    10.4, 10.4, 5.6, 5.6, -1.1, -4.8, -4.8, -4.8, -1.1, -1.1
-                }),
-                new EqualizerSetting (this, Catalog.GetString ("Live"), -1.1, new [] {
-                    -4.8, -1.1, 4, 5.6, 5.6, 5.6, 4, 2.4, 2.4, 2.4
-                }),
-                new EqualizerSetting (this, Catalog.GetString ("Party"), -1.1, new [] {
-                    7.2, 7.2, -1.1, -1.1, -1.1, -1.1, -1.1, -1.1, 7.2, 7.2
-                }),
-                new EqualizerSetting (this, Catalog.GetString ("Pop"), -1.1, new [] {
-                    -1.6, 4.8, 7.2, 8, 5.6, -1.1, -2.4, -2.4, -1.6, -1.6
-                }),
-                new EqualizerSetting (this, Catalog.GetString ("Reggae"), -1.1, new [] {
-                    -1.1, -1.1, -1.1, -5.6, -1.1, 6.4, 6.4, -1.1, -1.1, -1.1
-                }),
-                new EqualizerSetting (this, Catalog.GetString ("Rock"), -1.1, new [] {
-                    8, 4.8, -5.6, -8, -3.2, 4, 8.8, 11.2, 11.2, 11.2
-                }),
-                new EqualizerSetting (this, Catalog.GetString ("Ska"), -1.1, new [] {
-                    -2.4, -4.8, -4, -1.1, 4, 5.6, 8.8, 9.6, 11.2, 9.6
-                }),
-                new EqualizerSetting (this, Catalog.GetString ("Soft"), -1.1, new [] {
-                    4.8, 1.6, -1.1, -2.4, -1.1, 4, 8, 9.6, 11.2, 12,
-                }),
-                new EqualizerSetting (this, Catalog.GetString ("Soft Rock"), -1.1, new [] {
-                    4, 4, 2.4, -1.1, -4, -5.6, -3.2, -1.1, 2.4, 8.8,
-                }),
-                new EqualizerSetting (this, Catalog.GetString ("Techno"), -1.1, new [] {
-                    8, 5.6, -1.1, -5.6, -4.8, -1.1, 8, 9.6, 9.6, 8.8
-                })
-            };
-
-            Select ("Pop");
+            yield return new EqualizerSetting (this, Catalog.GetString ("Classical"), 0, new [] {
+                0, 0, 0, 0, 0, 0, -7.2, -7.2, -7.2, -9.6
+            });
+            yield return new EqualizerSetting (this, Catalog.GetString ("Club"), 0, new [] {
+                0, 0, 8, 5.6, 5.6, 5.6, 3.2, 0, 0, 0
+            });
+            yield return new EqualizerSetting (this, Catalog.GetString ("Dance"), -1.1, new [] {
+                9.6, 7.2, 2.4, -1.1, -1.1, -5.6, -7.2, -7.2, -1.1, -1.1
+            });
+            yield return new EqualizerSetting (this, Catalog.GetString ("Full Bass"), -1.1, new [] {
+                -8, 9.6, 9.6, 5.6, 1.6, -4, -8, -10.4, -11.2, -11.2
+            });
+            yield return new EqualizerSetting (this, Catalog.GetString ("Full Bass and Treble"), -1.1, new [] {
+                7.2, 5.6, -1.1, -7.2, -4.8, 1.6, 8, 11.2, 12, 12
+            });
+            yield return new EqualizerSetting (this, Catalog.GetString ("Full Treble"), -1.1, new [] {
+                -9.6, -9.6, -9.6, -4, 2.4, 11.2, 11.5, 11.8, 11.8, 12
+            });
+            yield return new EqualizerSetting (this, Catalog.GetString ("Laptop Speakers and Headphones"), -1.1, new [] {
+                4.8, 11.2, 5.6, -3.2, -2.4, 1.6, 4.8, 9.6, 11.9, 11.9
+            });
+            yield return new EqualizerSetting (this, Catalog.GetString ("Large Hall"), -1.1, new [] {
+                10.4, 10.4, 5.6, 5.6, -1.1, -4.8, -4.8, -4.8, -1.1, -1.1
+            });
+            yield return new EqualizerSetting (this, Catalog.GetString ("Live"), -1.1, new [] {
+                -4.8, -1.1, 4, 5.6, 5.6, 5.6, 4, 2.4, 2.4, 2.4
+            });
+            yield return new EqualizerSetting (this, Catalog.GetString ("Party"), -1.1, new [] {
+                7.2, 7.2, -1.1, -1.1, -1.1, -1.1, -1.1, -1.1, 7.2, 7.2
+            });
+            yield return new EqualizerSetting (this, Catalog.GetString ("Pop"), -1.1, new [] {
+                -1.6, 4.8, 7.2, 8, 5.6, -1.1, -2.4, -2.4, -1.6, -1.6
+            });
+            yield return new EqualizerSetting (this, Catalog.GetString ("Reggae"), -1.1, new [] {
+                -1.1, -1.1, -1.1, -5.6, -1.1, 6.4, 6.4, -1.1, -1.1, -1.1
+            });
+            yield return new EqualizerSetting (this, Catalog.GetString ("Rock"), -1.1, new [] {
+                8, 4.8, -5.6, -8, -3.2, 4, 8.8, 11.2, 11.2, 11.2
+            });
+            yield return new EqualizerSetting (this, Catalog.GetString ("Ska"), -1.1, new [] {
+                -2.4, -4.8, -4, -1.1, 4, 5.6, 8.8, 9.6, 11.2, 9.6
+            });
+            yield return new EqualizerSetting (this, Catalog.GetString ("Soft"), -1.1, new [] {
+                4.8, 1.6, -1.1, -2.4, -1.1, 4, 8, 9.6, 11.2, 12,
+            });
+            yield return new EqualizerSetting (this, Catalog.GetString ("Soft Rock"), -1.1, new [] {
+                4, 4, 2.4, -1.1, -4, -5.6, -3.2, -1.1, 2.4, 8.8,
+            });
+            yield return new EqualizerSetting (this, Catalog.GetString ("Techno"), -1.1, new [] {
+                8, 5.6, -1.1, -5.6, -4.8, -1.1, 8, 9.6, 9.6, 8.8
+            });
         }
 
         public void Save ()
@@ -317,14 +320,19 @@ namespace Banshee.Equalizer
         {
             try {
                 using (var writer = new StreamWriter (Path)) {
-                    writer.Write ("{");
+                    writer.Write ("[");
                     writer.WriteLine ();
-                    foreach (var eq in this) {
-                        writer.Write (eq);
-                        writer.Write (",");
+                    for (int i = 0; i < equalizers.Count; i++) {
+                        if (equalizers[i].IsReadOnly) {
+                            continue;
+                        }
+                        writer.Write (equalizers[i]);
+                        if (i < equalizers.Count - 1) {
+                            writer.Write (",");
+                        }
                         writer.WriteLine ();
                     }
-                    writer.Write ("}");
+                    writer.Write ("]");
                 }
                 Log.Debug ("EqualizerManager", "Saved equalizers to disk");
             } catch (Exception e) {
diff --git a/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerSetting.cs b/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerSetting.cs
index 0a381ae..7f2cd7d 100644
--- a/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerSetting.cs
+++ b/src/Core/Banshee.Services/Banshee.Equalizer/EqualizerSetting.cs
@@ -50,6 +50,7 @@ namespace Banshee.Equalizer
         internal EqualizerSetting (EqualizerManager manager,
             string name, double amp, double [] gains) : this (manager, name)
         {
+            IsReadOnly = true;
             for (uint i = 0; i < gains.Length; i++) {
                 SetGain (i, gains[i], false);
             }
@@ -61,6 +62,8 @@ namespace Banshee.Equalizer
             this.name = name;
         }
 
+        public bool IsReadOnly { get; private set; }
+
         public string Name {
             get { return name; }
             set {
@@ -144,7 +147,9 @@ namespace Banshee.Equalizer
         public override string ToString ()
         {
             var builder = new System.Text.StringBuilder ();
-            builder.AppendFormat ("    \"{0}\": {{", Name.Replace ("\"", "\\\""));
+            builder.Append ("    {");
+            builder.AppendLine ();
+            builder.AppendFormat ("        \"name\": \"{0}\",", Name.Replace ("\"", "\\\""));
             builder.AppendLine ();
             builder.AppendFormat ("        \"preamp\": {0},", AmplifierLevel);
             builder.AppendLine ();
diff --git a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerPresetComboBox.cs b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerPresetComboBox.cs
index 2588f08..b4d25ed 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerPresetComboBox.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerPresetComboBox.cs
@@ -37,6 +37,8 @@ namespace Banshee.Equalizer.Gui
         private EqualizerManager manager;
         private ListStore store;
         private EqualizerSetting active_eq;
+        private int user_count;
+        private TreeIter separator_iter = TreeIter.Zero;
 
         public EqualizerPresetComboBox () : this (EqualizerManager.Instance)
         {
@@ -58,17 +60,36 @@ namespace Banshee.Equalizer.Gui
             Model = store;
             TextColumn = 0;
 
+            store.SetSortColumnId (1, SortType.Ascending);
+            store.SetSortFunc (1, (model, ia, ib) => {
+                var a = GetEqualizerSettingForIter (ia);
+                var b = GetEqualizerSettingForIter (ib);
+                if (a != null && b != null) {
+                    if ((!a.IsReadOnly && !b.IsReadOnly) ||
+                        (a.IsReadOnly && b.IsReadOnly)) {
+                        return a.Name.CompareTo (b.Name);
+                    }
+                    return a.IsReadOnly.CompareTo (b.IsReadOnly);
+                } else if (a == null && b == null) {
+                    return 0;
+                } else if ((a == null && b.IsReadOnly) || (b == null && !a.IsReadOnly)) {
+                    return -1;
+                } else if ((a == null && !b.IsReadOnly) || (b == null && a.IsReadOnly)) {
+                    return 1;
+                }
+                return 0;
+            });
+
+            RowSeparatorFunc = (model, iter) =>
+                store.GetValue (iter, 0) == null &&
+                store.GetValue (iter, 1) == null;
+
             foreach (EqualizerSetting eq in manager) {
                 AddEqualizerSetting(eq);
             }
 
-            manager.EqualizerAdded += delegate (object o, EventArgs<EqualizerSetting> args) {
-                AddEqualizerSetting (args.Value);
-            };
-
-            manager.EqualizerRemoved += delegate (object o, EventArgs<EqualizerSetting> args) {
-                RemoveEqualizerSetting (args.Value);
-            };
+            manager.EqualizerAdded += (o, e) => AddEqualizerSetting (e.Value);
+            manager.EqualizerRemoved += (o, e) => RemoveEqualizerSetting (e.Value);
         }
 
         protected override void OnChanged ()
@@ -83,7 +104,7 @@ namespace Banshee.Equalizer.Gui
                 eq = active_eq;
             }
 
-            if (Entry == null) {
+            if (Entry == null || eq.IsReadOnly) {
                 return;
             }
 
@@ -114,6 +135,13 @@ namespace Banshee.Equalizer.Gui
 
         private void AddEqualizerSetting (EqualizerSetting eq)
         {
+            if (!eq.IsReadOnly) {
+                user_count++;
+                if (separator_iter.Equals (TreeIter.Zero)) {
+                    separator_iter = store.AppendValues (null, null);
+                }
+            }
+
             store.AppendValues (eq.Name, eq);
         }
 
@@ -121,6 +149,11 @@ namespace Banshee.Equalizer.Gui
         {
             TreeIter iter;
             if (GetIterForEqualizerSetting (eq, out iter)) {
+                if (!eq.IsReadOnly && --user_count <= 0) {
+                    user_count = 0;
+                    store.Remove (ref separator_iter);
+                    separator_iter = TreeIter.Zero;
+                }
                 store.Remove (ref iter);
             }
 
@@ -157,6 +190,9 @@ namespace Banshee.Equalizer.Gui
 
             set {
                 active_eq = value;
+                if (value != null) {
+                    Entry.IsEditable = !active_eq.IsReadOnly;
+                }
 
                 TreeIter iter;
                 if (GetIterForEqualizerSetting (value, out iter)) {
diff --git a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerView.cs b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerView.cs
index 2379df2..d2cb3be 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerView.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerView.cs
@@ -185,7 +185,7 @@ namespace Banshee.Equalizer.Gui
             }
         }
 
-        public void SetBand(uint band, double value)
+        public void SetBand (uint band, double value)
         {
             band_scales[band].Value = (int) (value * 10);
         }
@@ -211,11 +211,12 @@ namespace Banshee.Equalizer.Gui
                     return;
                 }
 
+                amplifier_scale.Sensitive = !value.IsReadOnly;
                 AmplifierLevel = active_eq.AmplifierLevel;
 
-                for (int i = 0; i < active_eq.BandCount; i++) {
-                    uint x = (uint) i;
-                    SetBand (x, active_eq[x]);
+                for (uint i = 0; i < active_eq.BandCount; i++) {
+                    band_scales[i].Sensitive = !value.IsReadOnly;
+                    SetBand (i, active_eq[i]);
                 }
 
                 loading = false;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerWindow.cs b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerWindow.cs
index e43d04e..748bba6 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerWindow.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Equalizer.Gui/EqualizerWindow.cs
@@ -43,6 +43,7 @@ namespace Banshee.Equalizer.Gui
         private EqualizerPresetComboBox eq_preset_combo;
         private CheckButton eq_enabled_checkbox;
         private HBox header_box;
+        private Button delete_preset_button;
 
         private static EqualizerWindow instance;
         public static EqualizerWindow Instance {
@@ -88,7 +89,7 @@ namespace Banshee.Equalizer.Gui
             new_preset_button.Relief = ReliefStyle.None;
             new_preset_button.Clicked += OnNewPreset;
 
-            Button delete_preset_button = new Button (new Image (Stock.Remove, IconSize.Button));
+            delete_preset_button = new Button (new Image (Stock.Remove, IconSize.Button));
             delete_preset_button.Relief = ReliefStyle.None;
             delete_preset_button.Clicked += OnDeletePreset;
 
@@ -157,6 +158,8 @@ namespace Banshee.Equalizer.Gui
             if (eq_preset_combo.ActiveEqualizer != eq_view.EqualizerSetting) {
                 eq_view.EqualizerSetting = eq_preset_combo.ActiveEqualizer;
                 EqualizerManager.Instance.Select (eq_preset_combo.ActiveEqualizer);
+                delete_preset_button.Sensitive = eq_preset_combo.ActiveEqualizer != null &&
+                    !eq_preset_combo.ActiveEqualizer.IsReadOnly;
             }
         }
 



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