Merge lp:~victored/noise/equalizer-popover into lp:~elementary-apps/noise/trunk

Proposed by Victor Martinez
Status: Merged
Approved by: Danielle Foré
Approved revision: 1565
Merged at revision: 1565
Proposed branch: lp:~victored/noise/equalizer-popover
Merge into: lp:~elementary-apps/noise/trunk
Diff against target: 797 lines (+270/-329)
4 files modified
src/CMakeLists.txt (+1/-1)
src/LibraryWindow.vala (+5/-0)
src/Widgets/EqualizerPopover.vala (+261/-296)
src/Widgets/StatusBar.vala (+3/-32)
To merge this branch: bzr merge lp:~victored/noise/equalizer-popover
Reviewer Review Type Date Requested Status
Corentin Noël Approve
Victor Martinez (community) Abstain
Review via email: mp+211217@code.launchpad.net

Commit message

Move equalizer controls into Gtk.Popover. lp:1284825

Description of the change

Move equalizer controls into Gtk.Popover. lp:1284825

- Refactor code to follow current code style, with the exception of tabs-vs-spaces to avoid creating a larger code diff.
- Use only Gee data structures (has refcount advantages).
- Use Gtk.MenuButton in statusbar for automated popover handling (needs a modal popover to work properly).
- Stop using Gtk.Adjustment and Gtk.Box, replacing them by Gtk.Grid.
- Reduce code redundancy.
- Remove unnecessary widgets.

Needs GTK+ 3.12 and Vala 0.24

To post a comment you must log in.
Revision history for this message
Victor Martinez (victored) wrote :

Allow typing a name into the preset-name entry. Currently there are issues with focus and only one character is recognized.

review: Needs Fixing
Revision history for this message
Victor Martinez (victored) wrote :

Please note that this branch doesn't bump gtk and vala requirements, as Corentin's branch already does that and will be merged before this one. lp:~tintou/noise/fix-interface

Revision history for this message
Victor Martinez (victored) wrote :

The UI is not supposed to change significantly, so feel free to point out any interface issues.

Revision history for this message
Danielle Foré (danrabbit) wrote :

Victor, apart from the 1 char issue you pointed out this seems to work great!

I'm not sure if you think this should occur in another branch, but I think it would be a nice touch to change the green "check" icon to "document-save-symbolic"

Revision history for this message
Victor Martinez (victored) wrote :

I've changed the icon. It looks way better!

Revision history for this message
Victor Martinez (victored) wrote :

Please note that the style class "bottom-toolbar" was dropped

Revision history for this message
Victor Martinez (victored) wrote :

All fixed. Please review now.

Revision history for this message
Victor Martinez (victored) :
review: Abstain
Revision history for this message
Danielle Foré (danrabbit) wrote :

Looks great Victor! Seems to work perfectly for me. No focus issues.

lp:~victored/noise/equalizer-popover updated
1564. By Victor Martinez

merge equalizer popover

1565. By Victor Martinez

Fix crash with GTK+ 3.11.9

A upstream change in how Gtk.Popover handles focus made the equalizer close too early after saving a preset. This happened because we were removing the current focus entry from the popover, which in the end resulted in a segmentation fault.

Revision history for this message
Cody Garver (codygarver) wrote :

When the equalizer is turned off and you click on the preset dropdown, it closes the popover

Revision history for this message
Victor Martinez (victored) wrote :

You're right Cody. That seems to happen when clicking insensitive widgets within the popover.

We could report that as a bug against Gtk.Popover.

Revision history for this message
Corentin Noël (tintou) wrote :

For the code, it's all good, but I would like to have the button appearance fixed in the theme...

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/CMakeLists.txt'
--- src/CMakeLists.txt 2014-03-07 15:52:49 +0000
+++ src/CMakeLists.txt 2014-03-23 22:17:56 +0000
@@ -27,6 +27,7 @@
27 Widgets/SpaceWidget.vala27 Widgets/SpaceWidget.vala
28 Widgets/FixedBin.vala28 Widgets/FixedBin.vala
29 Widgets/ViewSelector.vala29 Widgets/ViewSelector.vala
30 Widgets/EqualizerPopover.vala
30 Widgets/FastView/TileView/ImageUtils.vala31 Widgets/FastView/TileView/ImageUtils.vala
31 Widgets/FastView/TileView/TileRenderer.vala32 Widgets/FastView/TileView/TileRenderer.vala
32 Widgets/FastView/TileView/TileView.vala33 Widgets/FastView/TileView/TileView.vala
@@ -63,7 +64,6 @@
63 Views/ListView/Lists/CellDataFunctionHelper.vala64 Views/ListView/Lists/CellDataFunctionHelper.vala
64 Views/ListView/Lists/GenericList.vala65 Views/ListView/Lists/GenericList.vala
65 Views/ListView/Lists/MusicListView.vala66 Views/ListView/Lists/MusicListView.vala
66 Dialogs/EqualizerWindow.vala
67 Dialogs/SmartPlaylistEditor.vala67 Dialogs/SmartPlaylistEditor.vala
68 Dialogs/PreferencesWindow.vala68 Dialogs/PreferencesWindow.vala
69 Dialogs/InstallGstreamerPluginsDialog.vala69 Dialogs/InstallGstreamerPluginsDialog.vala
7070
=== modified file 'src/LibraryWindow.vala'
--- src/LibraryWindow.vala 2014-03-16 21:06:57 +0000
+++ src/LibraryWindow.vala 2014-03-23 22:17:56 +0000
@@ -153,6 +153,11 @@
153 }153 }
154154
155 public override bool key_press_event (Gdk.EventKey event) {155 public override bool key_press_event (Gdk.EventKey event) {
156 // when typing in an editable widget, such as Gtk.Entry, don't block the event
157 var focus_widget = get_focus ();
158 if (focus_widget != null && focus_widget is Gtk.Editable)
159 return base.key_press_event (event);
160
156 var modifiers = Gtk.accelerator_get_default_mod_mask ();161 var modifiers = Gtk.accelerator_get_default_mod_mask ();
157 bool modifiers_active = (event.state & modifiers) != 0;162 bool modifiers_active = (event.state & modifiers) != 0;
158163
159164
=== renamed file 'src/Dialogs/EqualizerWindow.vala' => 'src/Widgets/EqualizerPopover.vala'
--- src/Dialogs/EqualizerWindow.vala 2014-02-02 11:47:19 +0000
+++ src/Widgets/EqualizerPopover.vala 2014-03-23 22:17:56 +0000
@@ -1,5 +1,6 @@
1/*-1/*-
2 * Copyright (c) 2011-2012 Scott Ringwelski <sgringwe@mtu.edu>2 * Copyright (c) 2011-2012 Scott Ringwelski <sgringwe@mtu.edu>
3 * Copyright (c) 2014 Noise Developers (http://launchpad.net/noise)
3 *4 *
4 * Originally Written by Scott Ringwelski and Victor Eduardo for5 * Originally Written by Scott Ringwelski and Victor Eduardo for
5 * BeatBox Music Player: http://www.launchpad.net/beat-box6 * BeatBox Music Player: http://www.launchpad.net/beat-box
@@ -20,307 +21,309 @@
20 * Boston, MA 02111-1307, USA.21 * Boston, MA 02111-1307, USA.
21 */22 */
2223
23using Gtk;24public class Noise.EqualizerPopover : Gtk.Popover {
2425 private Gtk.Switch eq_switch;
25public class Noise.EqualizerWindow : Gtk.Window {26 private Gtk.Entry new_preset_entry;
2627 private Gtk.Grid side_list;
27 private Switch eq_switch;28 private Gtk.Grid scale_container;
28 private PresetList preset_combo;29 private PresetList preset_combo;
29 private Entry new_preset_entry;30 private Gee.List<Gtk.Scale> scales;
30 private Toolbar bottom_toolbar;31 private Gee.List<int> target_levels;
31 private ToolItem side_list;32 private Settings.Equalizer equalizer_settings;
32 private ToolItem new_preset_field;33 private string new_preset_name;
33 private Button close_button;34 private bool apply_changes = false;
3435 private bool initialized = false;
35 private bool apply_changes;36 private bool adding_preset = false;
36 private bool initialized;37 private bool in_transition = false;
37 private bool adding_preset;38 private bool closing = false;
3839
39 private const int ANIMATION_TIMEOUT = 20;40 private const int ANIMATION_TIMEOUT = 20;
4041
41 private List<Scale> scale_list;42 private const string[] DECIBELS = {
42 private List<Label> label_list;43 "60", "170", "310", "600", "1k", "3k", "6k", "12k", "14k", "16k"
4344 };
44 private bool in_transition;45
45 private Gee.ArrayList<int> target_levels;46 public EqualizerPopover () {
4647 scales = new Gee.ArrayList<Gtk.Scale> ();
47 private string new_preset_name;48 target_levels = new Gee.ArrayList<int> ();
48 private Settings.Equalizer equalizer_settings;49
4950 equalizer_settings = Settings.Equalizer.get_default ();
50 public EqualizerWindow () {51
51 scale_list = new List<Gtk.Scale>();52 build_ui ();
52 label_list = new List<Label>();53 load_presets ();
53 target_levels = new Gee.ArrayList<int>();
54
55 adding_preset = false;
56 initialized = false;
57 apply_changes = false;
58
59 build_ui();
60 load_presets();
6154
62 initialized = true;55 initialized = true;
6356
64 equalizer_settings = Settings.Equalizer.get_default ();
65 if (equalizer_settings.auto_switch_preset) {57 if (equalizer_settings.auto_switch_preset) {
66 preset_combo.selectAutomaticPreset();58 preset_combo.selectAutomaticPreset ();
67 } else {59 } else {
68 var preset = equalizer_settings.selected_preset;60 var preset = equalizer_settings.selected_preset;
69 if (preset != null)61 if (preset != null)
70 preset_combo.selectPreset(preset);62 preset_combo.selectPreset (preset);
71 }63 }
7264
73 on_eq_switch_toggled ();65 on_eq_switch_toggled ();
74 apply_changes = true;66 apply_changes = true;
75 }67 }
7668
77 void build_ui () {69 public override void closed () {
78 set_title(_("Equalizer"));70 closing = true;
7971
80 window_position = WindowPosition.CENTER;72 if (in_transition)
81 type_hint = Gdk.WindowTypeHint.DIALOG;73 set_target_levels ();
82 set_transient_for (App.main_window);74 else if (adding_preset)
83 set_size_request(440, 224);75 add_new_preset ();
84 resizable = false;76
85 set_deletable(false);77 save_presets ();
8678
87 set_icon(render_icon ("preferences-system", IconSize.DIALOG, null));79 var selected_preset = preset_combo.getSelectedPreset ();
8880 equalizer_settings.selected_preset = selected_preset != null ? selected_preset.name : "";
89 var outer_box = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 10);81 equalizer_settings.auto_switch_preset = preset_combo.automatic_chosen;
90 var inner_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);82
91 var scales = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0);83 closing = false;
9284 }
93 bottom_toolbar = new Toolbar();85
94 eq_switch = new Switch();86 public bool verify_preset_name (string preset_name) {
95 preset_combo = new PresetList();87 if (preset_name == null || String.is_white_space (preset_name))
9688 return false;
97 eq_switch.set_active(equalizer_settings.equalizer_enabled);89
9890 foreach (var preset in preset_combo.getPresets ()) {
99 string[] decibels = {"60", "170", "310", "600", "1k", "3k", "6k", "12k", "14k", "16k"};91 if (preset_name == preset.name)
100 //string[] decibels = {"32", "64", "125", "250", "500", "1k", "2k", "4k", "8k", "16k"};92 return false;
10193 }
102 for (int index = 0; index < 10; ++index) {94
103 var holder = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);95 return true;
104 var v = new Gtk.Scale.with_range(Gtk.Orientation.VERTICAL, -80, 80, 1);96 }
105 v.add_mark(0, PositionType.LEFT, null);97
106 v.draw_value = false;98 private void build_ui () {
107 v.inverted = true;99 set_size_request (-1, 240);
108100
109 var label = new Label(decibels[index]);101 scale_container = new Gtk.Grid ();
110102 scale_container.column_spacing = 12;
111 holder.pack_start(v, true, true, 0);103 scale_container.margin = 18;
112 holder.pack_end(UI.wrap_alignment (label, 4, 0, 0, 0), false, false, 0);104 scale_container.margin_bottom = 0;
113105
114 scales.pack_start(holder, true, true, 6);106 foreach (string decibel in DECIBELS) {
115 scale_list.append(v);107 var scale = new Gtk.Scale.with_range (Gtk.Orientation.VERTICAL, -80, 80, 1);
116 label_list.append(label);108 scale.add_mark (0, Gtk.PositionType.LEFT, null);
117109 scale.draw_value = false;
118 v.value_changed.connect( () => {110 scale.inverted = true;
119 if(apply_changes && initialized && !preset_combo.automatic_chosen) {111
120 App.player.player.set_equalizer_gain(scale_list.index(v), (int)scale_list.nth_data(scale_list.index(v)).get_value());112 var tag = new Gtk.Label (decibel);
121113
122 if(!in_transition) {114 scale.halign = tag.halign = Gtk.Align.CENTER;
123 if (!preset_combo.getSelectedPreset().is_default)115 scale.expand = true;
124 preset_combo.getSelectedPreset().setGain(scale_list.index(v), (int)scale_list.nth_data(scale_list.index(v)).get_value());116 tag.hexpand = true;
117
118 var holder = new Gtk.Grid ();
119 holder.orientation = Gtk.Orientation.VERTICAL;
120 holder.expand = true;
121 holder.row_spacing = 4;
122 holder.add (scale);
123 holder.add (tag);
124
125 scale_container.add (holder);
126 scales.add (scale);
127
128 scale.value_changed.connect (() => {
129 if (initialized && apply_changes && !preset_combo.automatic_chosen) {
130 int index = scales.index_of (scale);
131 int val = (int) scale.get_value ();
132 apply_equalizer_gain (index, val);
133
134 if (!in_transition) {
135 var selected_preset = preset_combo.getSelectedPreset ();
136
137 if (selected_preset.is_default)
138 on_default_preset_modified ();
125 else139 else
126 on_default_preset_modified();140 selected_preset.setGain (index, val);
127 }141 }
128 }142 }
129 });143 });
130
131 }144 }
132145
133 preset_combo.set_size_request(165, -1);146 eq_switch = new Gtk.Switch ();
134147 eq_switch.set_active (equalizer_settings.equalizer_enabled);
135 var eq_switch_item = new ToolItem();148
136 eq_switch_item.add(eq_switch);149 preset_combo = new PresetList ();
137150 preset_combo.set_size_request (165, -1);
138 side_list = new ToolItem();151
139 side_list.add(preset_combo);152 side_list = new Gtk.Grid ();
140153 side_list.add (preset_combo);
141 new_preset_entry = new Entry();154
142155 new_preset_entry = new Gtk.Entry ();
143 var entry_icon = Icons.render_icon ("dialog-apply", IconSize.MENU);156 new_preset_entry.secondary_icon_name = "document-save-symbolic";
144 new_preset_entry.set_icon_from_pixbuf(Gtk.EntryIconPosition.SECONDARY, entry_icon);157 new_preset_entry.secondary_icon_tooltip_text = _("Save preset");
145 new_preset_entry.set_icon_tooltip_text(Gtk.EntryIconPosition.SECONDARY, _("Save preset"));158
146159 eq_switch.valign = preset_combo.valign = new_preset_entry.valign = Gtk.Align.CENTER;
147 new_preset_field = new ToolItem();
148 new_preset_field.add(new_preset_entry);
149
150 var space_item = new ToolItem();
151 space_item.set_expand(true);
152
153 close_button = new Button.with_label (_("Close"));
154 var close_button_item = new ToolItem();
155 close_button.set_size_request(120, -1);
156 close_button_item.set_expand(false);
157 close_button_item.add(close_button);
158
159 // Set spacing stuff
160 eq_switch.valign = preset_combo.valign = close_button.valign = new_preset_entry.valign = Gtk.Align.CENTER;
161160
162 // Sync size between entry and combobox161 // Sync size between entry and combobox
163 preset_combo.size_allocate.connect ( (alloc) => {162 preset_combo.size_allocate.connect ((alloc) => {
164 new_preset_entry.set_size_request (alloc.width, alloc.height);163 new_preset_entry.set_size_request (alloc.width, alloc.height);
164 new_preset_entry.queue_resize ();
165 });165 });
166166
167 bottom_toolbar.insert(eq_switch_item, 0);167 var bottom_controls = new Gtk.Grid ();
168 bottom_toolbar.insert(side_list, 1);168 bottom_controls.margin = 12;
169 bottom_toolbar.insert(space_item, 2);169 bottom_controls.margin_top = 0;
170 bottom_toolbar.insert(close_button_item, 3);170 bottom_controls.add (eq_switch);
171171 bottom_controls.add (side_list);
172 // Set the egtk bottom toolbar style.172
173 bottom_toolbar.get_style_context().add_class("bottom-toolbar");173 var layout = new Gtk.Grid ();
174174 layout.orientation = Gtk.Orientation.VERTICAL;
175 inner_box.pack_end(UI.wrap_alignment (bottom_toolbar, 0, 0, 0, 0), false, false, 0);175 layout.row_spacing = 12;
176 inner_box.pack_start(UI.wrap_alignment (scales, 0, 12, 0, 12), true, true, 10);176
177177 layout.add (scale_container);
178 outer_box.pack_start(inner_box);178 layout.add (new Gtk.Separator (Gtk.Orientation.HORIZONTAL));
179 add(outer_box);179 layout.add (bottom_controls);
180180 layout.show_all ();
181 eq_switch.notify["active"].connect(on_eq_switch_toggled);181
182 preset_combo.automatic_preset_chosen.connect(on_automatic_chosen);182 add (layout);
183 preset_combo.delete_preset_chosen.connect(remove_preset_clicked);183
184 eq_switch.notify["active"].connect (on_eq_switch_toggled);
185 preset_combo.automatic_preset_chosen.connect (on_automatic_chosen);
186 preset_combo.delete_preset_chosen.connect (remove_preset_clicked);
184 preset_combo.preset_selected.connect (preset_selected);187 preset_combo.preset_selected.connect (preset_selected);
185 new_preset_entry.activate.connect (add_new_preset);188 new_preset_entry.activate.connect (add_new_preset);
186 new_preset_entry.icon_press.connect (new_preset_entry_icon_pressed);189 new_preset_entry.icon_press.connect (new_preset_entry_icon_pressed);
187 new_preset_entry.focus_out_event.connect (on_entry_focus_out);190 new_preset_entry.focus_out_event.connect (on_entry_focus_out);
188191 }
189 close_button.clicked.connect ( () => destroy () );192
190 destroy.connect(on_quit);193 private void apply_equalizer_gain (int index, int val) {
191194 App.player.player.set_equalizer_gain (index, val);
192 show_all();195 }
193 }196
194197 private void apply_automatic_gains () {
195 bool on_entry_focus_out () {198 App.player.change_gains_thread ();
196 if (!in_destruction ())199 }
197 new_preset_entry.grab_focus();200
201 private bool on_entry_focus_out () {
202 if (!closing)
203 new_preset_entry.grab_focus ();
204
198 return false;205 return false;
199 }206 }
200207
201 void set_sliders_sensitivity (bool sensitivity) {208 private void set_sliders_sensitivity (bool sensitivity) {
202 foreach (var scale in scale_list) {209 scale_container.sensitive = sensitivity;
203 label_list.nth_data(scale_list.index(scale)).sensitive = sensitivity;
204 scale.sensitive = sensitivity;
205 }
206 }210 }
207211
208 void on_eq_switch_toggled () {212 private void on_eq_switch_toggled () {
209 in_transition = false;213 in_transition = false;
210214
211 bool eq_active = eq_switch.get_active();215 bool eq_active = eq_switch.active;
212 preset_combo.sensitive = eq_active;216 preset_combo.sensitive = eq_active;
213 set_sliders_sensitivity (eq_active);217 set_sliders_sensitivity (eq_active);
214 equalizer_settings.equalizer_enabled = eq_active;218 equalizer_settings.equalizer_enabled = eq_active;
215219
216 if (eq_active) {220 if (eq_active) {
217 if(!preset_combo.automatic_chosen) {221 if (preset_combo.automatic_chosen) {
218 EqualizerPreset? selected_preset = preset_combo.getSelectedPreset();222 preset_combo.selectAutomaticPreset ();
223 } else {
224 var selected_preset = preset_combo.getSelectedPreset ();
219225
220 if (selected_preset != null) {226 if (selected_preset != null) {
221 for(int i = 0; i < 10; ++i)227 for (int i = 0; i < scales.size; ++i)
222 App.player.player.set_equalizer_gain(i, selected_preset.getGain(i));228 apply_equalizer_gain (i, selected_preset.getGain (i));
223 }229 }
224 }230 }
225 else {231 } else {
226 preset_combo.selectAutomaticPreset();232 for (int i = 0; i < scales.size; ++i)
227 }233 apply_equalizer_gain (i, 0);
228 }
229 else {
230 for (int i = 0; i < 10; ++i)
231 App.player.player.set_equalizer_gain(i, 0);
232 }234 }
233 }235 }
234236
235 void load_presets () {237 private void load_presets () {
236 foreach (var preset in Equalizer.get_default_presets ()) {238 foreach (var preset in Equalizer.get_default_presets ()) {
237 preset.is_default = true;239 preset.is_default = true;
238 preset_combo.addPreset(preset);240 preset_combo.addPreset (preset);
239 }241 }
240242
241 foreach (var preset in equalizer_settings.getPresets ()) {243 foreach (var preset in equalizer_settings.getPresets ())
242 preset_combo.addPreset(preset);244 preset_combo.addPreset (preset);
243 }
244 }245 }
245246
246 void save_presets () {247 private void save_presets () {
247 string[] val = new string[0];248 var val = new string[0];
248249
249 foreach (var preset in preset_combo.getPresets ()) {250 foreach (var preset in preset_combo.getPresets ()) {
250 if (preset.is_default)251 if (!preset.is_default)
251 continue;252 val += preset.to_string ();
252 val += preset.to_string ();
253 }253 }
254254
255 equalizer_settings.custom_presets = val;255 equalizer_settings.custom_presets = val;
256 }256 }
257257
258 void preset_selected (EqualizerPreset p) {258 private void preset_selected (EqualizerPreset p) {
259
260 if (!initialized)259 if (!initialized)
261 return;260 return;
262261
263 set_sliders_sensitivity (true);262 set_sliders_sensitivity (true);
264 target_levels.clear();263 target_levels.clear ();
265264
266 foreach (int i in p.gains) {265 foreach (int i in p.gains)
267 target_levels.add(i);266 target_levels.add (i);
268 }267
269268 if (closing || (initialized && !apply_changes) || adding_preset) {
270 if (in_destruction () || (initialized && !apply_changes) || adding_preset) {
271 set_target_levels ();269 set_target_levels ();
272 }270 } else if (!in_transition) {
273 else if (!in_transition) {
274 in_transition = true;271 in_transition = true;
275 Timeout.add(ANIMATION_TIMEOUT, transition_scales);272 Timeout.add (ANIMATION_TIMEOUT, transition_scales);
276 }273 }
277 }274 }
278275
279 void set_target_levels () {276 private void set_target_levels () {
280 in_transition = false;277 in_transition = false;
281278
282 for (int index = 0; index < 10; ++index)279 for (int index = 0; index < scales.size; ++index) {
283 scale_list.nth_data(index).set_value(target_levels.get(index));280 var scale = scales.get (index);
281 scale.set_value (target_levels.get (index));
282 }
284 }283 }
285284
286 bool transition_scales () {285 private bool transition_scales () {
287 if (!in_transition)286 if (!in_transition)
288 return false;287 return false;
289288
290 bool is_finished = true;289 bool is_finished = true;
291290
292 for (int index = 0; index < 10; ++index) {291 for (int index = 0; index < scales.size; ++index) {
293 double currLvl = scale_list.nth_data(index).get_value();292 var scale = scales.get (index);
294 double targetLvl = target_levels.get(index);293 double current_level = scale.get_value ();
295 double difference = targetLvl - currLvl;294 double target_level = target_levels.get (index);
296295 double difference = target_level - current_level;
297 if (in_destruction () || Math.fabs(difference) <= 1) {296
298 scale_list.nth_data(index).set_value(targetLvl);297 if (closing || Math.fabs (difference) <= 1) {
298 scale.set_value (target_level);
299
299 // if switching from the automatic mode, apply the changes correctly300 // if switching from the automatic mode, apply the changes correctly
300 if (!preset_combo.automatic_chosen && targetLvl == 0)301 if (!preset_combo.automatic_chosen && target_level == 0)
301 App.player.player.set_equalizer_gain (index, 0);302 apply_equalizer_gain (index, 0);
302 }303 } else {
303 else {304 scale.set_value (scale.get_value () + (difference / 8.0));
304 scale_list.nth_data(index).set_value(scale_list.nth_data(index).get_value() + (difference / 8.0));
305 is_finished = false;305 is_finished = false;
306 }306 }
307 }307 }
308308
309 if (is_finished) {309 if (is_finished) {
310 in_transition = false;310 in_transition = false;
311 return false; // stop311
312 // all done. stop
313 return false;
312 }314 }
313315
314 return true; // keep going316 // keep going
317 return true;
315 }318 }
316319
317 void on_automatic_chosen () {320 private void on_automatic_chosen () {
318 equalizer_settings.auto_switch_preset = preset_combo.automatic_chosen;321 equalizer_settings.auto_switch_preset = preset_combo.automatic_chosen;
319322
320 target_levels.clear();323 target_levels.clear ();
321324
322 for (int i = 0; i < 10; ++i)325 for (int i = 0; i < scales.size; ++i)
323 target_levels.add(0);326 target_levels.add (0);
324327
325 set_sliders_sensitivity (false);328 set_sliders_sensitivity (false);
326329
@@ -328,89 +331,79 @@
328 in_transition = true;331 in_transition = true;
329 Timeout.add (ANIMATION_TIMEOUT, transition_scales);332 Timeout.add (ANIMATION_TIMEOUT, transition_scales);
330 save_presets ();333 save_presets ();
331 App.player.change_gains_thread ();334 apply_automatic_gains ();
332 }335 } else {
333 else {
334 set_target_levels ();336 set_target_levels ();
335 }337 }
336 }338 }
337339
338 void on_default_preset_modified () {340 private void on_default_preset_modified () {
339341 if (adding_preset || closing)
340 if(adding_preset || in_destruction ())
341 return;342 return;
342343
343 adding_preset = true;344 adding_preset = true;
344345
345 close_button.sensitive = !adding_preset;346 side_list.remove (preset_combo);
346347 side_list.add (new_preset_entry);
347 bottom_toolbar.remove(side_list);348 side_list.show_all ();
348 bottom_toolbar.insert(new_preset_field, 1);349
349350 new_preset_name = create_new_preset_name (true);
350 new_preset_name = create_new_preset_name(true);351
351352 new_preset_entry.set_text (new_preset_name);
352 new_preset_entry.set_text(new_preset_name);
353 eq_switch.sensitive = false;353 eq_switch.sensitive = false;
354 bottom_toolbar.show_all();354 new_preset_entry.grab_focus ();
355 new_preset_entry.grab_focus();355 }
356 }356
357357 private void new_preset_entry_icon_pressed (Gtk.EntryIconPosition pos, Gdk.Event event) {
358 void new_preset_entry_icon_pressed (EntryIconPosition pos, Gdk.Event event) {358 if (pos != Gtk.EntryIconPosition.SECONDARY && !adding_preset)
359359 return;
360 if(pos != Gtk.EntryIconPosition.SECONDARY && !adding_preset)360
361 return;361 add_new_preset ();
362362 }
363 add_new_preset();363
364 }364 private void add_new_preset () {
365365 if (!adding_preset)
366 void add_new_preset() {366 return;
367367
368 if(!adding_preset)368 var new_name = new_preset_entry.get_text ();
369 return;369
370370 if (verify_preset_name (new_name))
371 var new_name = new_preset_entry.get_text();
372
373 if(verify_preset_name(new_name))
374 new_preset_name = new_name;371 new_preset_name = new_name;
375372
376 int i = 0;373 int[] gains = new int[scales.size];
377 int[] gains = new int[10];374
378375 for (int i = 0; i < scales.size; i++)
379 foreach(Scale scale in scale_list) {376 gains[i] = (int) scales.get (i).get_value ();
380 gains[i] = (int)scale_list.nth_data(scale_list.index(scale)).get_value();377
381 i++;378 var new_preset = new EqualizerPreset.with_gains (new_preset_name, gains);
382 }379 preset_combo.addPreset (new_preset);
383380
384 var new_preset = new EqualizerPreset.with_gains(new_preset_name, gains);381 side_list.add (preset_combo);
385 preset_combo.addPreset(new_preset);382 side_list.set_focus_child (preset_combo);
386383 side_list.remove (new_preset_entry);
387 bottom_toolbar.remove(new_preset_field);384 side_list.show_all ();
388 bottom_toolbar.insert(side_list, 1);385
389 bottom_toolbar.show_all();
390 eq_switch.sensitive = true;386 eq_switch.sensitive = true;
391 adding_preset = false;387 adding_preset = false;
392 close_button.sensitive = !adding_preset;
393 }388 }
394389
395 string create_new_preset_name (bool from_current) {390 private string create_new_preset_name (bool from_current) {
391 string current_preset_name = from_current ? preset_combo.getSelectedPreset ().name : "";
392 string preset_name = "";
396393
397 int i = 0;
398 bool is_valid = false;394 bool is_valid = false;
399395 int i = 0;
400 string current_preset_name = (from_current)? preset_combo.getSelectedPreset().name : "";396
401 string preset_name = "...";397 do {
402
403 do
404 {
405 debug ("preset name %s is invalid. Looping", preset_name);398 debug ("preset name %s is invalid. Looping", preset_name);
399
406 // We have to be explicit in order to make this translatable400 // We have to be explicit in order to make this translatable
407 if (from_current) {401 if (from_current) {
408 if (i < 1)402 if (i < 1)
409 preset_name = _("%s (Custom)").printf (current_preset_name);403 preset_name = _("%s (Custom)").printf (current_preset_name);
410 else404 else
411 preset_name = _("%s (Custom %i)").printf (current_preset_name, i);405 preset_name = _("%s (Custom %i)").printf (current_preset_name, i);
412 }406 } else {
413 else {
414 if (i < 1)407 if (i < 1)
415 preset_name = _("Custom Preset");408 preset_name = _("Custom Preset");
416 else409 else
@@ -418,41 +411,13 @@
418 }411 }
419412
420 i++;413 i++;
421 is_valid = verify_preset_name(preset_name);414 is_valid = verify_preset_name (preset_name);
422
423 } while (!is_valid);415 } while (!is_valid);
424416
425 return preset_name;417 return preset_name;
426 }418 }
427419
428 public bool verify_preset_name (string preset_name) {420 private void remove_preset_clicked () {
429 if (preset_name == null)421 preset_combo.removeCurrentPreset ();
430 return false;
431
432 if (String.is_white_space (preset_name))
433 return false;
434
435 foreach (var preset in preset_combo.getPresets ()) {
436 if (preset_name == preset.name)
437 return false;
438 }
439
440 return true;
441 }
442
443
444 void remove_preset_clicked () {
445 preset_combo.removeCurrentPreset();
446 }
447
448 void on_quit () {
449 if (in_transition)
450 set_target_levels ();
451 else if (adding_preset)
452 add_new_preset ();
453
454 save_presets ();
455 equalizer_settings.selected_preset = (preset_combo.getSelectedPreset() != null)? preset_combo.getSelectedPreset().name : "";
456 equalizer_settings.auto_switch_preset = preset_combo.automatic_chosen;
457 }422 }
458}423}
459\ No newline at end of file424\ No newline at end of file
460425
=== modified file 'src/Widgets/StatusBar.vala'
--- src/Widgets/StatusBar.vala 2014-03-14 16:05:56 +0000
+++ src/Widgets/StatusBar.vala 2014-03-23 22:17:56 +0000
@@ -179,42 +179,13 @@
179#endif179#endif
180 }180 }
181181
182182 private class EqualizerChooser : Gtk.MenuButton {
183 private class EqualizerChooser : SimpleOptionChooser {
184
185 private Gtk.Window? equalizer_window = null;
186
187 public EqualizerChooser () {183 public EqualizerChooser () {
188 var eq_show_image = Icons.EQ_SYMBOLIC.render_image (Gtk.IconSize.MENU);184 popover = new EqualizerPopover ();
189 var eq_hide_image = Icons.EQ_SYMBOLIC.render_image (Gtk.IconSize.MENU);185 add (Icons.EQ_SYMBOLIC.render_image (Gtk.IconSize.MENU));
190
191 appendItem (_("Hide"), eq_show_image, _("Show Equalizer"));
192 appendItem (_("Show"), eq_hide_image, _("Hide Equalizer"));
193
194 setOption (0);
195
196 option_changed.connect (eq_option_chooser_clicked);
197 }
198
199 private void eq_option_chooser_clicked () {
200 int val = current_option;
201
202 if (equalizer_window == null && val == 1) {
203 equalizer_window = new EqualizerWindow ();
204 equalizer_window.show_all ();
205 equalizer_window.destroy.connect ( () => {
206 // revert the option to "Hide equalizer" after the window is destroyed
207 setOption (0);
208 });
209 }
210 else if (val == 0 && equalizer_window != null) {
211 equalizer_window.destroy ();
212 equalizer_window = null;
213 }
214 }186 }
215 }187 }
216188
217
218 private class InfoPanelChooser : SimpleOptionChooser {189 private class InfoPanelChooser : SimpleOptionChooser {
219190
220 public InfoPanelChooser () {191 public InfoPanelChooser () {

Subscribers

People subscribed via source and target branches