ardour
export_preset_selector.cc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2008 Paul Davis
3  Author: Sakari Bergen
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or
8  (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program; if not, write to the Free Software
17  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 
19 */
20 
21 #include "export_preset_selector.h"
22 
23 #include "ardour/export_preset.h"
24 
25 #include "i18n.h"
26 
28  label (_("Preset"), Gtk::ALIGN_LEFT),
29  save_button (Gtk::Stock::SAVE),
30  remove_button (Gtk::Stock::REMOVE),
31  new_button (Gtk::Stock::NEW)
32 {
33  list = Gtk::ListStore::create (cols);
34  list->set_sort_column (cols.label, Gtk::SORT_ASCENDING);
35  entry.set_model (list);
36  entry.set_text_column (cols.label);
37 
38  pack_start (label, false, false, 0);
39  pack_start (entry, true, true, 6);
40  pack_start (save_button, false, false, 0);
41  pack_start (remove_button, false, false, 6);
42  pack_start (new_button, false, false, 0);
43 
44  entry.set_name ("PaddedButton");
45  save_button.set_name ("PaddedButton");
46  remove_button.set_name ("PaddedButton");
47  new_button.set_name ("PaddedButton");
48 
49  save_button.set_sensitive (false);
50  remove_button.set_sensitive (false);
51  new_button.set_sensitive (false);
52 
53  select_connection = entry.signal_changed().connect (sigc::mem_fun (*this, &ExportPresetSelector::update_selection));
54  save_button.signal_clicked().connect (sigc::mem_fun (*this, &ExportPresetSelector::save_current));
55  new_button.signal_clicked().connect (sigc::mem_fun (*this, &ExportPresetSelector::create_new));
56  remove_button.signal_clicked().connect (sigc::mem_fun (*this, &ExportPresetSelector::remove_current));
57 
58  show_all_children ();
59 }
60 
61 void
63 {
64  profile_manager = manager;
66 }
67 
68 void
70 {
71  list->clear();
72 
73  PresetList const & presets = profile_manager->get_presets();
74  Gtk::ListStore::iterator tree_it;
75 
76  for (PresetList::const_iterator it = presets.begin(); it != presets.end(); ++it) {
77  tree_it = list->append();
78  tree_it->set_value (cols.preset, *it);
79  tree_it->set_value (cols.label, std::string ((*it)->name()));
80 
81  if (*it == current) {
82  select_connection.block (true);
83  entry.set_active (tree_it);
84  select_connection.block (false);
85  }
86  }
87 }
88 
89 void
91 {
92  Gtk::ListStore::iterator it = entry.get_active ();
93  std::string text = entry.get_entry()->get_text();
94  bool preset_name_exists = false;
95 
96  for (PresetList::const_iterator it = profile_manager->get_presets().begin(); it != profile_manager->get_presets().end(); ++it) {
97  if (!(*it)->name().compare (text)) { preset_name_exists = true; }
98  }
99 
100  if (list->iter_is_valid (it)) {
101 
102  previous = current = it->get_value (cols.preset);
104  Gtk::MessageDialog dialog (_("The selected preset did not load successfully!\nPerhaps it references a format that has been removed?"),
105  false, Gtk::MESSAGE_WARNING);
106  dialog.run ();
107  }
110 
111  /* Make an edit, so that signal changed will be emitted on re-selection */
112 
113  select_connection.block (true);
114  entry.get_entry()->set_text ("");
115  entry.get_entry()->set_text (text);
116  select_connection.block (false);
117 
118  } else { // Text has been edited, this should not make any changes in the profile manager
119  if (previous && !text.compare (previous->name())) {
120  current = previous;
121  } else {
122  current.reset ();
123  }
124  }
125 
126  save_button.set_sensitive (current != 0);
127  remove_button.set_sensitive (current != 0);
128  new_button.set_sensitive (!current && !text.empty() && !preset_name_exists);
129 }
130 
131 void
133 {
134  if (!profile_manager) { return; }
135 
136  previous = current = profile_manager->new_preset (entry.get_entry()->get_text());
138  update_selection (); // Update preset widget states
139 }
140 
141 void
143 {
144  if (!profile_manager) { return; }
145 
146  previous = current = profile_manager->save_preset (entry.get_entry()->get_text());
148  update_selection (); // Update preset widget states
149 }
150 
151 void
153 {
154  if (!profile_manager) { return; }
155 
156  Gtk::MessageDialog dialog (_("Do you really want to remove this preset?"),
157  false,
158  Gtk::MESSAGE_QUESTION,
159  Gtk::BUTTONS_YES_NO);
160 
161  if (Gtk::RESPONSE_YES != dialog.run ()) {
162  /* User has selected "no" or closed the dialog, better
163  * abort
164  */
165  return;
166  }
167 
169  entry.get_entry()->set_text ("");
171 }
void set_manager(boost::shared_ptr< ARDOUR::ExportProfileManager > manager)
Gtk::ComboBoxEntry entry
Definition: ardour_ui.h:130
ExportPresetPtr save_preset(std::string const &name)
sigc::signal< void > CriticalSelectionChanged
#define _(Text)
Definition: i18n.h:11
ARDOUR::ExportProfileManager::PresetList PresetList
ExportPresetPtr new_preset(std::string const &name)
sigc::connection select_connection
Glib::RefPtr< Gtk::ListStore > list
Gtk::TreeModelColumn< PresetPtr > preset
Gtk::TreeModelColumn< std::string > label
bool load_preset(ExportPresetPtr preset)