diff options
Diffstat (limited to 'gtk2_ardour/new_session_dialog.cc')
-rw-r--r-- | gtk2_ardour/new_session_dialog.cc | 342 |
1 files changed, 342 insertions, 0 deletions
diff --git a/gtk2_ardour/new_session_dialog.cc b/gtk2_ardour/new_session_dialog.cc new file mode 100644 index 0000000000..2d3888c731 --- /dev/null +++ b/gtk2_ardour/new_session_dialog.cc @@ -0,0 +1,342 @@ +/* + Copyright (C) 1999-2002 Paul Davis + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Id$ +*/ + +#include <list> +#include <string> +#include <ardour/session.h> +#include <ardour/audioengine.h> + +#include "prompter.h" +#include "new_session_dialog.h" + +using namespace Gtkmmext; +using namespace Gtk; +using namespace ARDOUR; + +#include "i18n.h" + +extern std::vector<string> channel_combo_strings; + +NewSessionDialog::NewSessionDialog (ARDOUR::AudioEngine& engine, bool startup, string given_path) + : ArdourDialog ("new session dialog"), + file_selector (_("Session name:"), _("Create")), + use_control_button (_("use control outs")), + use_master_button (_("use master outs")), + connect_to_physical_inputs_button (_("automatically connect track inputs to physical ports")), + connect_to_master_button (_("automatically connect track outputs to master outs")), + connect_to_physical_outputs_button (_("automatically connect track outputs to physical ports")), + manual_connect_outputs_button (_("manually connect track outputs")), + in_count_adjustment (2, 1, 1000, 1, 2), + out_count_adjustment (2, 1, 1000, 1, 2), + output_label (_("Output Connections")), + input_label (_("Input Connections")), + expansion_button (_("Advanced...")), + out_table (2, 2), + show_again (_("show again")), + in_count_spinner (in_count_adjustment), + out_count_spinner (out_count_adjustment), + in_count_label (_("Hardware Inputs: use")), + out_count_label (_("Hardware Outputs: use")) + +{ + using namespace Notebook_Helpers; + + set_name ("NewSessionDialog"); + set_title (_("new session setup")); + set_wmclass (_("ardour_new_session"), "Ardour"); + set_position (GTK_WIN_POS_MOUSE); + set_keyboard_input (true); + set_policy (false, true, false); + set_modal (true); + + /* sample rate */ + + sr_label1.set_text (compose + (_("This session will playback and record at %1 Hz"), + engine.frame_rate())); + sr_label2.set_text (_("This rate is set by JACK and cannot be changed.\n" + "If you want to use a different sample rate\n" + "please exit and restart JACK")); + sr_box.set_spacing (12); + sr_box.set_border_width (12); + sr_box.pack_start (sr_label1, false, false); + sr_box.pack_start (sr_label2, false, false); + sr_frame.add (sr_box); + + /* input */ + + connect_to_physical_inputs_button.set_active (true); + connect_to_physical_inputs_button.set_name ("NewSessionDialogButton"); + + HBox* input_limit_box = manage (new HBox); + input_limit_box->set_spacing (7); + input_limit_box->pack_start (in_count_label, false, false); + input_limit_box->pack_start (in_count_spinner, false, false); + + input_label.set_alignment (0.1, 0.5); + input_vbox.pack_start (input_label, false, false, 7); + input_vbox.pack_start (connect_to_physical_inputs_button, false, false); + + if (engine.n_physical_inputs() > 2) { + input_vbox.pack_start (*input_limit_box, false, false); + } + + /* output */ + + use_master_button.set_active (true); + use_master_button.set_name ("NewSessionDialogButton"); + + connect_to_physical_outputs_button.set_group (connect_to_master_button.group()); + manual_connect_outputs_button.set_group (connect_to_master_button.group()); + connect_to_master_button.set_active (true); + + connect_to_physical_outputs_button.set_name ("NewSessionDialogButton"); + manual_connect_outputs_button.set_name ("NewSessionDialogButton"); + connect_to_master_button.set_name ("NewSessionDialogButton"); + use_control_button.set_name ("NewSessionDialogButton"); + + out_count_adjustment.set_value (engine.n_physical_outputs()); + in_count_adjustment.set_value (engine.n_physical_inputs()); + + control_out_channel_combo.set_popdown_strings (channel_combo_strings); + control_out_channel_combo.set_name (X_("NewSessionChannelCombo")); + control_out_channel_combo.get_entry()->set_name (X_("NewSessionChannelCombo")); + control_out_channel_combo.get_popwin()->set_name (X_("NewSessionChannelCombo")); + // use stereo as default + control_out_channel_combo.get_list()->select_item (1); + + master_out_channel_combo.set_popdown_strings (channel_combo_strings); + master_out_channel_combo.set_name (X_("NewSessionChannelCombo")); + master_out_channel_combo.get_entry()->set_name (X_("NewSessionChannelCombo")); + master_out_channel_combo.get_popwin()->set_name (X_("NewSessionChannelCombo")); + // use stereo as default + master_out_channel_combo.get_list()->select_item (1); + + + out_table.set_col_spacings (7); + out_table.set_row_spacings (7); + if (engine.n_physical_outputs() > 2) { + out_table.attach (out_count_label, 0, 1, 0, 1, 0, 0); + out_table.attach (out_count_spinner, 1, 2, 0, 1, 0, 0); + } + out_table.attach (use_control_button, 0, 1, 1, 2, 0, 0); + out_table.attach (control_out_channel_combo, 1, 2, 1, 2, 0, 0); + out_table.attach (use_master_button, 0, 1, 2, 3, 0, 0); + out_table.attach (master_out_channel_combo, 1, 2, 2, 3, 0, 0); + + output_label.set_alignment (0.1, 0.5); + output_vbox.pack_start (output_label, true, true, 7); + output_vbox.pack_start (out_table, false, false, 5); + output_vbox.pack_start (connect_to_master_button, false); + output_vbox.pack_start (connect_to_physical_outputs_button, false); + output_vbox.pack_start (manual_connect_outputs_button, false); + + input_hbox.pack_start (input_vbox, false, false); + output_hbox.pack_start (output_vbox, false, false); + + VBox* template_vbox = manage (new VBox); + Label* template_label = manage (new Label (_("Session template"))); + + template_label->set_alignment (0.1, 0.5); + template_vbox->pack_start (*template_label, true, true, 7); + template_vbox->pack_start (template_combo, false, false); + + io_box.set_border_width (12); + io_box.set_spacing (7); + io_box.pack_start (*template_vbox); + + io_box.pack_start (input_hbox); + io_box.pack_start (output_hbox); + + reset_templates(); + + option_hbox.set_spacing (7); + option_hbox.pack_start (io_box); + + fsbox.set_border_width (12); + fsbox.set_spacing (7); + fsbox.pack_start (file_selector.table, false, false); + + notebook.pages().push_back (TabElem (fsbox, _("Location"))); + notebook.pages().push_back (TabElem (option_hbox, _("Configuration"))); + + if (startup) { + show_again.set_active(true); + show_again.toggled.connect (slot (*this, &NewSessionDialog::show_again_toggled)); + file_selector.button_box.pack_end(show_again, false, false); + } + + main_vbox.set_border_width (12); + main_vbox.set_border_width (12); + main_vbox.set_spacing (7); + main_vbox.pack_start (sr_frame, false, false); + main_vbox.pack_start (notebook, false, false); + main_vbox.pack_start (file_selector.button_box, false, false); + + add (main_vbox); + +// template_selector.shift_made.connect ( +// slot (*this, &NewSessionDialog::mix_template_shift)); +// template_selector.control_made.connect ( +// slot (*this, &NewSessionDialog::mix_template_control)); + + file_selector.cancel_button.clicked.connect (bind (slot (*this, &ArdourDialog::stop), -1)); + file_selector.op_button.clicked.connect (bind (slot (*this, &ArdourDialog::stop), 0)); + file_selector.Expanded.connect (slot (*this, &NewSessionDialog::file_selector_expansion)); + + delete_event.connect (slot (*this, &ArdourDialog::wm_close_event)); + show.connect (slot (*this, &NewSessionDialog::fixup_at_show)); + + file_selector.entry_label.set_name ("NewSessionMainLabel"); + file_selector.where_label.set_name ("NewSessionMainLabel"); + template_label->set_name ("NewSessionIOLabel"); + input_label.set_name ("NewSessionIOLabel"); + output_label.set_name ("NewSessionIOLabel"); + sr_label1.set_name ("NewSessionSR1Label"); + sr_label2.set_name ("NewSessionSR2Label"); + + if (given_path.empty()) { + Session::FavoriteDirs favs; + Session::read_favorite_dirs (favs); + file_selector.set_favorites (favs); + } else { + file_selector.set_path (given_path, true); + notebook.set_page (-1); + notebook.show.connect (bind (slot (notebook, &Notebook::set_page), -1)); + } + + set_default_size(531, 358); +} + +void +NewSessionDialog::file_selector_expansion (bool expanded) +{ + if (expanded) { + fsbox.pack_start (file_selector.expansion_vbox); + fsbox.reorder_child (file_selector.expansion_vbox, 2); + } else { + fsbox.remove (file_selector.expansion_vbox); + } +} + +void +NewSessionDialog::fixup_at_show () +{ +// if (template_selector.clist().rows().size() == 0) { +// use_template_button.set_sensitive (false); +// } + + Session::FavoriteDirs favs; + Session::read_favorite_dirs (favs); + file_selector.set_favorites (favs); + + file_selector.entry.grab_focus (); +} + +void +NewSessionDialog::_mix_template_refiller (CList &clist, void *arg) + +{ + ((NewSessionDialog*) arg)->mix_template_refiller (clist); +} + +void +NewSessionDialog::mix_template_refiller (CList &clist) +{ + const gchar *rowdata[2]; + list<string> templates; + list<string>::iterator i; + + Session::get_template_list(templates); + + rowdata[0] = _("blank"); + clist.insert_row (0, rowdata); + + guint row; + for (row=1, i=templates.begin(); i != templates.end(); ++row, ++i) { + rowdata[0] = (*i).c_str(); + clist.insert_row (row, rowdata); + } +} + +void +NewSessionDialog::mix_template_shift (Gtkmmext::Selector* selector, Gtkmmext::SelectionResult* res) +{ + if (res && res->text){ + Session::delete_template(*res->text); + // template_selector.rescan(); + } +} + +void +NewSessionDialog::mix_template_control (Gtkmmext::Selector* selector, Gtkmmext::SelectionResult* res) +{ +#if 0 + if (res && res->text) { + ArdourPrompter prompter (true); + prompter.set_prompt(_("Name for mix template:")); + + string old_name = *(res->text); + prompter.set_initial_text (old_name); + prompter.done.connect (Gtk::Main::quit.slot()); + prompter.show_all(); + + Gtk::Main::run(); + + if (prompter.status == Gtkmmext::Prompter::entered) { + string name; + + prompter.get_result (name); + + if (name.length() && name != old_name) { + Session::rename_template(old_name, name); + template_selector.rescan(); + } + } + } +#endif +} + +void +NewSessionDialog::show_again_toggled () +{ + Config->set_no_new_session_dialog(!show_again.get_active()); + Config->save_state(); +} + +void +NewSessionDialog::reset_templates () +{ + templates.clear (); + templates.push_back (_("No template - create tracks/busses manually")); + Session::get_template_list (templates); + template_combo.set_popdown_strings (templates); +} + +string +NewSessionDialog::get_template_name() +{ + string str = template_combo.get_entry()->get_text(); + if (str.substr (0, 11) == _("No template")) { + return ""; + } else { + return str; + } +} |