/* * Copyright (C) 2008-2011 Sakari Bergen * Copyright (C) 2009 David Robillard * Copyright (C) 2010-2016 Paul Davis * Copyright (C) 2014-2017 Robin Gareus * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include "ardour/export_preset.h" #include "export_preset_selector.h" #include "ardour_message.h" #include "pbd/i18n.h" ExportPresetSelector::ExportPresetSelector (bool readonly) : label (_("Preset"), Gtk::ALIGN_START) , combo (!readonly) , save_button (Gtk::Stock::SAVE) , remove_button (Gtk::Stock::REMOVE) , new_button (Gtk::Stock::NEW) { list = Gtk::ListStore::create (cols); list->set_sort_column (cols.label, Gtk::SORT_ASCENDING); combo.set_model (list); if (readonly) { combo.pack_start (cols.label); pack_start (label, false, false, 0); pack_start (combo, true, true, 6); select_connection = combo.signal_changed ().connect (sigc::mem_fun (*this, &ExportPresetSelector::selection_changed)); } else { combo.set_entry_text_column (cols.label); pack_start (label, false, false, 0); pack_start (combo, true, true, 6); pack_start (save_button, false, false, 0); pack_start (remove_button, false, false, 6); pack_start (new_button, false, false, 0); save_button.set_sensitive (false); remove_button.set_sensitive (false); new_button.set_sensitive (false); select_connection = combo.signal_changed ().connect (sigc::mem_fun (*this, &ExportPresetSelector::update_selection)); save_button.signal_clicked ().connect (sigc::mem_fun (*this, &ExportPresetSelector::save_current)); new_button.signal_clicked ().connect (sigc::mem_fun (*this, &ExportPresetSelector::create_new)); remove_button.signal_clicked ().connect (sigc::mem_fun (*this, &ExportPresetSelector::remove_current)); } show_all_children (); } void ExportPresetSelector::set_manager (std::shared_ptr manager) { profile_manager = manager; current = profile_manager->preset (); sync_with_manager (); } void ExportPresetSelector::sync_with_manager () { list->clear (); PresetList const& presets = profile_manager->get_presets (); Gtk::ListStore::iterator tree_it; for (PresetList::const_iterator it = presets.begin (); it != presets.end (); ++it) { tree_it = list->append (); tree_it->set_value (cols.preset, *it); tree_it->set_value (cols.label, std::string ((*it)->name ())); if (*it == current) { select_connection.block (true); combo.set_active (tree_it); select_connection.block (false); } } } void ExportPresetSelector::selection_changed () { Gtk::ListStore::iterator it = combo.get_active (); if (!it) { return; } assert (list->iter_is_valid (it)); current = it->get_value (cols.preset); if (!profile_manager->load_preset (current)) { ArdourMessageDialog dialog (dynamic_cast (get_toplevel ()), _("The selected preset did not load successfully!\nPerhaps it references a format that has been removed?"), false, Gtk::MESSAGE_WARNING); dialog.run (); } sync_with_manager (); CriticalSelectionChanged (); } void ExportPresetSelector::update_selection () { Gtk::ListStore::iterator it = combo.get_active (); std::string text = combo.get_entry ()->get_text (); bool preset_name_exists = false; for (PresetList::const_iterator it = profile_manager->get_presets ().begin (); it != profile_manager->get_presets ().end (); ++it) { if (!(*it)->name ().compare (text)) { preset_name_exists = true; } } if (list->iter_is_valid (it)) { previous = current = it->get_value (cols.preset); if (!profile_manager->load_preset (current)) { ArdourMessageDialog dialog (dynamic_cast (get_toplevel ()), _("The selected preset did not load successfully!\nPerhaps it references a format that has been removed?"), false, Gtk::MESSAGE_WARNING); dialog.run (); } sync_with_manager (); CriticalSelectionChanged (); /* Make an edit, so that signal changed will be emitted on re-selection */ select_connection.block (true); combo.get_entry ()->set_text (""); combo.get_entry ()->set_text (text); select_connection.block (false); } else { // Text has been edited, this should not make any changes in the profile manager if (previous && !text.compare (previous->name ())) { current = previous; } else { current.reset (); } } save_button.set_sensitive (current != 0); remove_button.set_sensitive (current != 0); new_button.set_sensitive (!current && !text.empty () && !preset_name_exists); } void ExportPresetSelector::create_new () { if (!profile_manager) { return; } previous = current = profile_manager->new_preset (combo.get_entry ()->get_text ()); sync_with_manager (); update_selection (); // Update preset widget states } void ExportPresetSelector::save_current () { if (!profile_manager) { return; } previous = current = profile_manager->save_preset (combo.get_entry ()->get_text ()); sync_with_manager (); update_selection (); // Update preset widget states } void ExportPresetSelector::remove_current () { if (!profile_manager) { return; } ArdourMessageDialog dialog (dynamic_cast (get_toplevel ()), _("Do you really want to remove this preset?"), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO); if (Gtk::RESPONSE_YES != dialog.run ()) { /* User has selected "no" or closed the dialog, better * abort */ return; } profile_manager->remove_preset (); combo.get_entry ()->set_text (""); sync_with_manager (); }