Revert "Revert ongoing SessionDialog changes for 5.11 release."

This reverts commit bd40b9132c.
This commit is contained in:
Robin Gareus 2017-08-16 05:02:26 +02:00
parent bd40b9132c
commit 24cb141aa6
5 changed files with 269 additions and 529 deletions

View file

@ -3287,18 +3287,12 @@ ARDOUR_UI::build_session_from_dialog (SessionDialog& sd, const std::string& sess
if (nsm) { if (nsm) {
bus_profile.master_out_channels = 2; bus_profile.master_out_channels = 2;
} else { } else {
/* get settings from advanced section of NSD */ /* get settings from advanced section of NSD */
bus_profile.master_out_channels = (uint32_t) sd.master_channel_count();
if (sd.create_master_bus()) {
bus_profile.master_out_channels = (uint32_t) sd.master_channel_count();
} else {
bus_profile.master_out_channels = 0;
}
} }
if (build_session (session_path, session_name, &bus_profile)) { // NULL profile: no master, no monitor
if (build_session (session_path, session_name, bus_profile.master_out_channels > 0 ? &bus_profile : NULL)) {
return -1; return -1;
} }

View file

@ -375,6 +375,11 @@ style "marker_text" = "small text"
{ {
} }
style "text_on_bg" = "medium_text"
{
base[NORMAL] = @background
}
style "midi_tracer_textview" = "medium_monospace_text" style "midi_tracer_textview" = "medium_monospace_text"
{ {
@ -408,6 +413,12 @@ style "base_frame"
bg[NORMAL] = @background bg[NORMAL] = @background
} }
style "text_highlight_frame"
{
fg[NORMAL] = @texts
bg[NORMAL] = @texts
}
style "transport_frame" style "transport_frame"
{ {
} }
@ -1096,6 +1107,7 @@ widget "*zoomrange clock" style:highest "medium_text"
widget "*timecodeoffset clock" style:highest "medium_text" widget "*timecodeoffset clock" style:highest "medium_text"
widget "*BaseFrame" style:highest "base_frame" widget "*BaseFrame" style:highest "base_frame"
widget "*TextHighlightFrame" style:highest "text_highlight_frame"
widget "*TransportFrame" style:highest "transport_frame" widget "*TransportFrame" style:highest "transport_frame"
widget "*TransportFrame*" style:highest "transport_frame" widget "*TransportFrame*" style:highest "transport_frame"
widget "*EditorWindow*" style:highest "editor_window" widget "*EditorWindow*" style:highest "editor_window"
@ -1228,4 +1240,4 @@ widget "*ooltip*" style:highest "tooltip"
widget "*Pane" style:highest "pane" widget "*Pane" style:highest "pane"
widget "*Pane.Divider" style:highest "pane" widget "*Pane.Divider" style:highest "pane"
widget "*VCALabelBar*" style:highest "vca_label_bar" widget "*VCALabelBar*" style:highest "vca_label_bar"
widget "*TextOnBackground" style:highest "text_on_bg"

View file

@ -1,19 +1,19 @@
/* /*
Copyright (C) 2013 Paul Davis Copyright (C) 2013 Paul Davis
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
@ -55,6 +55,8 @@
#include "ardour/template_utils.h" #include "ardour/template_utils.h"
#include "ardour/filename_extensions.h" #include "ardour/filename_extensions.h"
#include "LuaBridge/LuaBridge.h"
#include "ardour_ui.h" #include "ardour_ui.h"
#include "session_dialog.h" #include "session_dialog.h"
#include "opts.h" #include "opts.h"
@ -78,10 +80,6 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name,
, _provided_session_name (session_name) , _provided_session_name (session_name)
, _provided_session_path (session_path) , _provided_session_path (session_path)
, new_folder_chooser (FILE_CHOOSER_ACTION_SELECT_FOLDER) , new_folder_chooser (FILE_CHOOSER_ACTION_SELECT_FOLDER)
, more_new_session_options_button (_("Advanced options ..."))
, _output_limit_count_adj (1, 0, 100, 1, 10, 0)
, _input_limit_count_adj (1, 0, 100, 1, 10, 0)
, _master_bus_channel_count_adj (2, 0, 100, 1, 10, 0)
, _existing_session_chooser_used (false) , _existing_session_chooser_used (false)
{ {
set_position (WIN_POS_CENTER); set_position (WIN_POS_CENTER);
@ -116,7 +114,6 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name,
} }
if (!template_name.empty()) { if (!template_name.empty()) {
use_template_button.set_active (false);
load_template_override = template_name; load_template_override = template_name;
} }
@ -126,14 +123,6 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name,
populate_session_templates (); populate_session_templates ();
if (!template_model->children().empty()) {
use_template_button.show();
template_chooser.show ();
} else {
use_template_button.hide();
template_chooser.hide ();
}
if (recent_session_model) { if (recent_session_model) {
int cnt = redisplay_recent_sessions (); int cnt = redisplay_recent_sessions ();
if (cnt > 0) { if (cnt > 0) {
@ -157,7 +146,7 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name,
pass then require it for a second pass (e.g. when there pass then require it for a second pass (e.g. when there
is an error with session loading and we have to ask the user is an error with session loading and we have to ask the user
what to do next). what to do next).
*/ */
if (!session_name.empty() && !require_new) { if (!session_name.empty() && !require_new) {
response (RESPONSE_OK); response (RESPONSE_OK);
@ -170,10 +159,6 @@ SessionDialog::SessionDialog ()
, new_only (false) , new_only (false)
, _provided_session_name ("") , _provided_session_name ("")
, _provided_session_path ("") , _provided_session_path ("")
// the following are unused , but have no default ctor
, _output_limit_count_adj (1, 0, 100, 1, 10, 0)
, _input_limit_count_adj (1, 0, 100, 1, 10, 0)
, _master_bus_channel_count_adj (2, 0, 100, 1, 10, 0)
, _existing_session_chooser_used (false) // caller must check should_be_new , _existing_session_chooser_used (false) // caller must check should_be_new
{ {
get_vbox()->set_spacing (6); get_vbox()->set_spacing (6);
@ -211,14 +196,77 @@ SessionDialog::clear_given ()
_provided_session_name = ""; _provided_session_name = "";
} }
uint32_t
SessionDialog::meta_master_bus_profile (std::string script_path) const
{
if (!Glib::file_test (script_path, Glib::FILE_TEST_EXISTS | Glib::FILE_TEST_IS_REGULAR)) {
return UINT32_MAX;
}
LuaState lua;
lua.sandbox (true);
lua_State* L = lua.getState();
lua.do_command (
"ardourluainfo = {}"
"function ardour (entry)"
" ardourluainfo['type'] = assert(entry['type'])"
" ardourluainfo['master_bus'] = entry['master_bus'] or 2"
" end"
);
int err = -1;
try {
err = lua.do_file (script_path);
} catch (luabridge::LuaException const& e) {
err = -1;
}
if (err) {
return UINT32_MAX;
}
luabridge::LuaRef nfo = luabridge::getGlobal (L, "ardourluainfo");
if (nfo.type() != LUA_TTABLE) {
return UINT32_MAX;
}
if (nfo["master_bus"].type() != LUA_TNUMBER || nfo["type"].type() != LUA_TSTRING) {
return UINT32_MAX;
}
LuaScriptInfo::ScriptType type = LuaScriptInfo::str2type (nfo["type"].cast<std::string>());
if (type != LuaScriptInfo::SessionSetup) {
return UINT32_MAX;
}
return nfo["master_bus"].cast<uint32_t>();
}
uint32_t
SessionDialog::master_channel_count ()
{
if (use_session_template ()) {
std::string tn = session_template_name();
if (tn.substr (0, 11) == "urn:ardour:") {
uint32_t mc = meta_master_bus_profile (tn.substr (11));
if (mc != UINT32_MAX) {
return mc;
}
}
}
return 2;
}
bool bool
SessionDialog::use_session_template () SessionDialog::use_session_template () const
{ {
if (!load_template_override.empty()) { if (!load_template_override.empty()) {
return true; return true;
} }
if (use_template_button.get_active()) { if (template_chooser.get_selection()->count_selected_rows() > 0) {
return true; return true;
} }
@ -233,11 +281,14 @@ SessionDialog::session_template_name ()
return Glib::build_filename (the_path, load_template_override + ARDOUR::template_suffix); return Glib::build_filename (the_path, load_template_override + ARDOUR::template_suffix);
} }
if (use_template_button.get_active()) { if (template_chooser.get_selection()->count_selected_rows() > 0) {
TreeModel::iterator iter = template_chooser.get_active ();
TreeModel::Row row = (*iter); TreeIter const iter = template_chooser.get_selection()->get_selected();
string s = row[session_template_columns.path];
return s; if (iter) {
string s = (*iter)[session_template_columns.path];
return s;
}
} }
return string(); return string();
@ -506,10 +557,23 @@ SessionDialog::populate_session_templates ()
{ {
vector<TemplateInfo> templates; vector<TemplateInfo> templates;
find_session_templates (templates); find_session_templates (templates, true);
template_model->clear (); template_model->clear ();
//Add any Lua scripts (factory templates) found in the scripts folder
LuaScriptList& ms (LuaScripting::instance ().scripts (LuaScriptInfo::SessionSetup));
for (LuaScriptList::const_iterator s = ms.begin(); s != ms.end(); ++s) {
TreeModel::Row row;
row = *(template_model->append ());
row[session_template_columns.name] = "Meta: " + (*s)->name;
row[session_template_columns.path] = "urn:ardour:" + (*s)->path;
row[session_template_columns.description] = (*s)->description;
row[session_template_columns.created_with] = _("{Factory Template}");
}
//Add any "template sessions" found in the user's preferences folder
for (vector<TemplateInfo>::iterator x = templates.begin(); x != templates.end(); ++x) { for (vector<TemplateInfo>::iterator x = templates.begin(); x != templates.end(); ++x) {
TreeModel::Row row; TreeModel::Row row;
@ -517,64 +581,56 @@ SessionDialog::populate_session_templates ()
row[session_template_columns.name] = (*x).name; row[session_template_columns.name] = (*x).name;
row[session_template_columns.path] = (*x).path; row[session_template_columns.path] = (*x).path;
row[session_template_columns.desc] = (*x).description; row[session_template_columns.description] = (*x).description;
row[session_template_columns.created_with] = (*x).created_with;
} }
LuaScriptList& ms (LuaScripting::instance ().scripts (LuaScriptInfo::SessionSetup)); //Add an explicit 'Empty Template' item
for (LuaScriptList::const_iterator s = ms.begin(); s != ms.end(); ++s) { TreeModel::Row row = *template_model->prepend ();
TreeModel::Row row; row[session_template_columns.name] = (_("Empty Template"));
row = *(template_model->append ()); row[session_template_columns.path] = string();
row[session_template_columns.name] = "Meta: " + (*s)->name; row[session_template_columns.description] = _("An empty session with factory default settings.");
row[session_template_columns.path] = "urn:ardour:" + (*s)->path; row[session_template_columns.created_with] = _("{Factory Template}");
row[session_template_columns.desc] = "urn:ardour:" + (*s)->description;
}
if (!templates.empty()) { //auto-select the first item in the list
/* select first row */ Gtk::TreeModel::Row first = template_model->children()[0];
template_chooser.set_active (0); if(first) {
template_chooser.get_selection()->select(first);
} }
} }
void void
SessionDialog::setup_new_session_page () SessionDialog::setup_new_session_page ()
{ {
session_new_vbox.set_border_width (12); session_new_vbox.set_border_width (8);
session_new_vbox.set_spacing (18); session_new_vbox.set_spacing (8);
VBox *vbox1 = manage (new VBox); Label* name_label = manage (new Label);
HBox* hbox1 = manage (new HBox); name_label->set_text (_("Session name:"));
Label* label1 = manage (new Label);
vbox1->set_spacing (6); HBox* name_hbox = manage (new HBox);
name_hbox->set_spacing (8);
hbox1->set_spacing (6); name_hbox->pack_start (*name_label, false, true);
hbox1->pack_start (*label1, false, false); name_hbox->pack_start (new_name_entry, true, true);
hbox1->pack_start (new_name_entry, true, true);
label1->set_text (_("Session name:"));
//check to see if a session name was provided on command line
if (!ARDOUR_COMMAND_LINE::session_name.empty()) { if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
new_name_entry.set_text (Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name)); new_name_entry.set_text (Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name));
/* name provided - they can move right along */
open_button->set_sensitive (true); open_button->set_sensitive (true);
} }
new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &SessionDialog::new_name_changed)); new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &SessionDialog::new_name_changed));
new_name_entry.signal_activate().connect (sigc::mem_fun (*this, &SessionDialog::new_name_activated)); new_name_entry.signal_activate().connect (sigc::mem_fun (*this, &SessionDialog::new_name_activated));
vbox1->pack_start (*hbox1, true, true); //Folder location for the new session
Label* new_folder_label = manage (new Label);
/* --- */ new_folder_label->set_text (_("Create session folder in:"));
HBox* folder_box = manage (new HBox);
HBox* hbox2 = manage (new HBox); folder_box->set_spacing (8);
Label* label2 = manage (new Label); folder_box->pack_start (*new_folder_label, false, false);
folder_box->pack_start (new_folder_chooser, true, true);
hbox2->set_spacing (6);
hbox2->pack_start (*label2, false, false);
hbox2->pack_start (new_folder_chooser, true, true);
label2->set_text (_("Create session folder in:"));
//determine the text in the new folder selector
if (!ARDOUR_COMMAND_LINE::session_name.empty()) { if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
new_folder_chooser.set_current_folder (poor_mans_glob (Glib::path_get_dirname (ARDOUR_COMMAND_LINE::session_name))); new_folder_chooser.set_current_folder (poor_mans_glob (Glib::path_get_dirname (ARDOUR_COMMAND_LINE::session_name)));
} else if (ARDOUR_UI::instance()->session_loaded) { } else if (ARDOUR_UI::instance()->session_loaded) {
@ -595,80 +651,45 @@ SessionDialog::setup_new_session_page ()
} }
new_folder_chooser.show (); new_folder_chooser.show ();
new_folder_chooser.set_title (_("Select folder for session")); new_folder_chooser.set_title (_("Select folder for session"));
Gtkmm2ext::add_volume_shortcuts (new_folder_chooser); Gtkmm2ext::add_volume_shortcuts (new_folder_chooser);
vbox1->pack_start (*hbox2, false, false); //Template & Template Description area
HBox* template_hbox = manage (new HBox);
session_new_vbox.pack_start (*vbox1, false, false); //if the "template override" is provided, don't give the user any template selections (?)
if ( load_template_override.empty() ) {
template_hbox->set_spacing (8);
template_hbox->pack_start (template_chooser, true, true);
template_hbox->pack_start (template_desc_frame, true, true);
}
/* --- */ //template_desc is the textview that displays the currently selected template's description
template_desc.set_editable (false);
template_desc.set_wrap_mode (Gtk::WRAP_WORD);
template_desc.set_size_request(300,400);
template_desc.set_name (X_("TextOnBackground"));
template_desc.set_border_width (6);
VBox *vbox2 = manage (new VBox); template_desc_frame.set_name (X_("TextHighlightFrame"));
HBox* hbox3 = manage (new HBox); template_desc_frame.add (template_desc);
template_model = ListStore::create (session_template_columns);
vbox2->set_spacing (6);
VBox *vbox3 = manage (new VBox);
vbox3->set_spacing (6);
/* we may want to hide this and show it at various
times depending on the existence of templates.
*/
template_chooser.set_no_show_all (true);
use_template_button.set_no_show_all (true);
HBox* hbox4a = manage (new HBox);
use_template_button.set_label (_("Use this template"));
use_template_button.signal_toggled().connect(sigc::mem_fun (*this, &SessionDialog::template_checkbox_toggled));
TreeModel::Row row = *template_model->prepend ();
row[session_template_columns.name] = (_("no template"));
row[session_template_columns.path] = string();
hbox4a->set_spacing (6);
hbox4a->pack_start (use_template_button, false, false);
hbox4a->pack_start (template_chooser, true, true);
//template_chooser is the treeview showing available templates
template_model = TreeStore::create (session_template_columns);
template_chooser.set_model (template_model); template_chooser.set_model (template_model);
template_chooser.set_size_request(300,400);
Gtk::CellRendererText* text_renderer = Gtk::manage (new Gtk::CellRendererText); template_chooser.append_column (_("Template"), session_template_columns.name);
text_renderer->property_editable() = false; template_chooser.append_column (_("Created With"), session_template_columns.created_with);
template_chooser.set_headers_visible (true);
template_chooser.pack_start (*text_renderer); template_chooser.get_selection()->set_mode (SELECTION_SINGLE);
template_chooser.add_attribute (text_renderer->property_text(), session_template_columns.name); template_chooser.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &SessionDialog::template_row_selected));
template_chooser.set_active (0); template_chooser.set_sensitive (true);
vbox3->pack_start (*hbox4a, false, false);
/* --- */ /* --- */
HBox* hbox5 = manage (new HBox); session_new_vbox.pack_start (*template_hbox, false, true);
session_new_vbox.pack_start (*folder_box, false, true);
hbox5->set_spacing (6); session_new_vbox.pack_start (*name_hbox, false, true);
hbox5->pack_start (more_new_session_options_button, false, false);
setup_more_options_box ();
more_new_session_options_button.add (more_options_vbox);
vbox3->pack_start (*hbox5, false, false);
hbox3->pack_start (*vbox3, true, true, 8);
vbox2->pack_start (*hbox3, false, false);
/* --- */
session_new_vbox.pack_start (*vbox2, false, false);
session_new_vbox.show_all (); session_new_vbox.show_all ();
template_checkbox_toggled ();
}
void
SessionDialog::template_checkbox_toggled ()
{
template_chooser.set_sensitive (use_template_button.get_active());
} }
void void
@ -841,15 +862,15 @@ SessionDialog::redisplay_recent_sessions ()
#if 0 #if 0
child_row[recent_session_columns.sample_rate] = rate_as_string (sr); child_row[recent_session_columns.sample_rate] = rate_as_string (sr);
switch (sf) { switch (sf) {
case FormatFloat: case FormatFloat:
child_row[recent_session_columns.disk_format] = _("32-bit float"); child_row[recent_session_columns.disk_format] = _("32-bit float");
break; break;
case FormatInt24: case FormatInt24:
child_row[recent_session_columns.disk_format] = _("24-bit"); child_row[recent_session_columns.disk_format] = _("24-bit");
break; break;
case FormatInt16: case FormatInt16:
child_row[recent_session_columns.disk_format] = _("16-bit"); child_row[recent_session_columns.disk_format] = _("16-bit");
break; break;
} }
#else #else
child_row[recent_session_columns.sample_rate] = ""; child_row[recent_session_columns.sample_rate] = "";
@ -929,300 +950,18 @@ SessionDialog::recent_session_row_selected ()
} }
void void
SessionDialog::setup_more_options_box () SessionDialog::template_row_selected ()
{ {
more_options_vbox.set_border_width (24); if (template_chooser.get_selection()->count_selected_rows() > 0) {
TreeIter iter = template_chooser.get_selection()->get_selected();
_output_limit_count.set_adjustment (_output_limit_count_adj); if (iter) {
_input_limit_count.set_adjustment (_input_limit_count_adj); string s = (*iter)[session_template_columns.description];
_master_bus_channel_count.set_adjustment (_master_bus_channel_count_adj); template_desc.get_buffer()->set_text (s);
}
chan_count_label_1.set_text (_("channels"));
chan_count_label_3.set_text (_("channels"));
chan_count_label_4.set_text (_("channels"));
chan_count_label_1.set_alignment(0,0.5);
chan_count_label_1.set_padding(0,0);
chan_count_label_1.set_line_wrap(false);
chan_count_label_3.set_alignment(0,0.5);
chan_count_label_3.set_padding(0,0);
chan_count_label_3.set_line_wrap(false);
chan_count_label_4.set_alignment(0,0.5);
chan_count_label_4.set_padding(0,0);
chan_count_label_4.set_line_wrap(false);
bus_label.set_markup (_("<b>Busses</b>"));
input_label.set_markup (_("<b>Inputs</b>"));
output_label.set_markup (_("<b>Outputs</b>"));
_master_bus_channel_count.set_flags(Gtk::CAN_FOCUS);
_master_bus_channel_count.set_update_policy(Gtk::UPDATE_ALWAYS);
_master_bus_channel_count.set_numeric(true);
_master_bus_channel_count.set_digits(0);
_master_bus_channel_count.set_wrap(false);
_create_master_bus.set_label (_("Create master bus"));
_create_master_bus.set_flags(Gtk::CAN_FOCUS);
_create_master_bus.set_relief(Gtk::RELIEF_NORMAL);
_create_master_bus.set_mode(true);
_create_master_bus.set_active(true);
_create_master_bus.set_border_width(0);
advanced_table.set_row_spacings(0);
advanced_table.set_col_spacings(0);
_connect_inputs.set_label (_("Automatically connect to physical inputs"));
_connect_inputs.set_flags(Gtk::CAN_FOCUS);
_connect_inputs.set_relief(Gtk::RELIEF_NORMAL);
_connect_inputs.set_mode(true);
_connect_inputs.set_active(Config->get_input_auto_connect() != ManualConnect);
_connect_inputs.set_border_width(0);
_limit_input_ports.set_label (_("Use only"));
_limit_input_ports.set_flags(Gtk::CAN_FOCUS);
_limit_input_ports.set_relief(Gtk::RELIEF_NORMAL);
_limit_input_ports.set_mode(true);
_limit_input_ports.set_sensitive(true);
_limit_input_ports.set_border_width(0);
_input_limit_count.set_flags(Gtk::CAN_FOCUS);
_input_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS);
_input_limit_count.set_numeric(true);
_input_limit_count.set_digits(0);
_input_limit_count.set_wrap(false);
_input_limit_count.set_sensitive(false);
bus_hbox.pack_start (bus_table, Gtk::PACK_SHRINK, 18);
bus_label.set_alignment(0, 0.5);
bus_label.set_padding(0,0);
bus_label.set_line_wrap(false);
bus_label.set_selectable(false);
bus_label.set_use_markup(true);
bus_frame.set_shadow_type(Gtk::SHADOW_NONE);
bus_frame.set_label_align(0,0.5);
bus_frame.add(bus_hbox);
bus_frame.set_label_widget(bus_label);
bus_table.set_row_spacings (0);
bus_table.set_col_spacings (0);
bus_table.attach (_create_master_bus, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
bus_table.attach (_master_bus_channel_count, 1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
bus_table.attach (chan_count_label_1, 2, 3, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 0);
input_port_limit_hbox.pack_start(_limit_input_ports, Gtk::PACK_SHRINK, 6);
input_port_limit_hbox.pack_start(_input_limit_count, Gtk::PACK_SHRINK, 0);
input_port_limit_hbox.pack_start(chan_count_label_3, Gtk::PACK_SHRINK, 6);
input_port_vbox.pack_start(_connect_inputs, Gtk::PACK_SHRINK, 0);
input_port_vbox.pack_start(input_port_limit_hbox, Gtk::PACK_EXPAND_PADDING, 0);
input_table.set_row_spacings(0);
input_table.set_col_spacings(0);
input_table.attach(input_port_vbox, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 6);
input_hbox.pack_start (input_table, Gtk::PACK_SHRINK, 18);
input_label.set_alignment(0, 0.5);
input_label.set_padding(0,0);
input_label.set_line_wrap(false);
input_label.set_selectable(false);
input_label.set_use_markup(true);
input_frame.set_shadow_type(Gtk::SHADOW_NONE);
input_frame.set_label_align(0,0.5);
input_frame.add(input_hbox);
input_frame.set_label_widget(input_label);
_connect_outputs.set_label (_("Automatically connect outputs"));
_connect_outputs.set_flags(Gtk::CAN_FOCUS);
_connect_outputs.set_relief(Gtk::RELIEF_NORMAL);
_connect_outputs.set_mode(true);
_connect_outputs.set_active(Config->get_output_auto_connect() != ManualConnect);
_connect_outputs.set_border_width(0);
_limit_output_ports.set_label (_("Use only"));
_limit_output_ports.set_flags(Gtk::CAN_FOCUS);
_limit_output_ports.set_relief(Gtk::RELIEF_NORMAL);
_limit_output_ports.set_mode(true);
_limit_output_ports.set_sensitive(true);
_limit_output_ports.set_border_width(0);
_output_limit_count.set_flags(Gtk::CAN_FOCUS);
_output_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS);
_output_limit_count.set_numeric(false);
_output_limit_count.set_digits(0);
_output_limit_count.set_wrap(false);
_output_limit_count.set_sensitive(false);
output_port_limit_hbox.pack_start(_limit_output_ports, Gtk::PACK_SHRINK, 6);
output_port_limit_hbox.pack_start(_output_limit_count, Gtk::PACK_SHRINK, 0);
output_port_limit_hbox.pack_start(chan_count_label_4, Gtk::PACK_SHRINK, 6);
_connect_outputs_to_master.set_label (_("... to master bus"));
_connect_outputs_to_master.set_flags(Gtk::CAN_FOCUS);
_connect_outputs_to_master.set_relief(Gtk::RELIEF_NORMAL);
_connect_outputs_to_master.set_mode(true);
_connect_outputs_to_master.set_active(Config->get_output_auto_connect() == AutoConnectMaster);
_connect_outputs_to_master.set_border_width(0);
_connect_outputs_to_master.set_group (connect_outputs_group);
_connect_outputs_to_physical.set_group (connect_outputs_group);
_connect_outputs_to_physical.set_label (_("... to physical outputs"));
_connect_outputs_to_physical.set_flags(Gtk::CAN_FOCUS);
_connect_outputs_to_physical.set_relief(Gtk::RELIEF_NORMAL);
_connect_outputs_to_physical.set_mode(true);
_connect_outputs_to_physical.set_active(Config->get_output_auto_connect() == AutoConnectPhysical);
_connect_outputs_to_physical.set_border_width(0);
output_conn_vbox.pack_start(_connect_outputs, Gtk::PACK_SHRINK, 0);
output_conn_vbox.pack_start(_connect_outputs_to_master, Gtk::PACK_SHRINK, 0);
output_conn_vbox.pack_start(_connect_outputs_to_physical, Gtk::PACK_SHRINK, 0);
output_vbox.set_border_width(6);
output_port_vbox.pack_start(output_port_limit_hbox, Gtk::PACK_SHRINK, 0);
output_vbox.pack_start(output_conn_vbox);
output_vbox.pack_start(output_port_vbox);
output_label.set_alignment(0, 0.5);
output_label.set_padding(0,0);
output_label.set_line_wrap(false);
output_label.set_selectable(false);
output_label.set_use_markup(true);
output_frame.set_shadow_type(Gtk::SHADOW_NONE);
output_frame.set_label_align(0,0.5);
output_hbox.pack_start (output_vbox, Gtk::PACK_SHRINK, 18);
output_frame.add(output_hbox);
output_frame.set_label_widget(output_label);
more_options_vbox.pack_start(advanced_table, Gtk::PACK_SHRINK, 0);
more_options_vbox.pack_start(bus_frame, Gtk::PACK_SHRINK, 6);
more_options_vbox.pack_start(input_frame, Gtk::PACK_SHRINK, 6);
more_options_vbox.pack_start(output_frame, Gtk::PACK_SHRINK, 0);
/* signals */
_connect_inputs.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::connect_inputs_clicked));
_connect_outputs.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::connect_outputs_clicked));
_limit_input_ports.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::limit_inputs_clicked));
_limit_output_ports.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::limit_outputs_clicked));
_create_master_bus.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::master_bus_button_clicked));
/* note that more_options_vbox is "visible" by default even
* though it may not be displayed to the user, this is so the dialog
* doesn't resize.
*/
more_options_vbox.show_all ();
}
bool
SessionDialog::create_master_bus() const
{
return _create_master_bus.get_active();
}
int
SessionDialog::master_channel_count() const
{
return _master_bus_channel_count.get_value_as_int();
}
bool
SessionDialog::connect_inputs() const
{
return _connect_inputs.get_active();
}
bool
SessionDialog::limit_inputs_used_for_connection() const
{
return _limit_input_ports.get_active();
}
int
SessionDialog::input_limit_count() const
{
return _input_limit_count.get_value_as_int();
}
bool
SessionDialog::connect_outputs() const
{
return _connect_outputs.get_active();
}
bool
SessionDialog::limit_outputs_used_for_connection() const
{
return _limit_output_ports.get_active();
}
int
SessionDialog::output_limit_count() const
{
return _output_limit_count.get_value_as_int();
}
bool
SessionDialog::connect_outs_to_master() const
{
return _connect_outputs_to_master.get_active();
}
bool
SessionDialog::connect_outs_to_physical() const
{
return _connect_outputs_to_physical.get_active();
}
void
SessionDialog::connect_inputs_clicked ()
{
_limit_input_ports.set_sensitive(_connect_inputs.get_active());
if (_connect_inputs.get_active() && _limit_input_ports.get_active()) {
_input_limit_count.set_sensitive(true);
} else {
_input_limit_count.set_sensitive(false);
} }
} }
void
SessionDialog::connect_outputs_clicked ()
{
bool const co = _connect_outputs.get_active ();
_limit_output_ports.set_sensitive(co);
_connect_outputs_to_master.set_sensitive(co);
_connect_outputs_to_physical.set_sensitive(co);
if (co && _limit_output_ports.get_active()) {
_output_limit_count.set_sensitive(true);
} else {
_output_limit_count.set_sensitive(false);
}
}
void
SessionDialog::limit_inputs_clicked ()
{
_input_limit_count.set_sensitive(_limit_input_ports.get_active());
}
void
SessionDialog::limit_outputs_clicked ()
{
_output_limit_count.set_sensitive(_limit_output_ports.get_active());
}
void
SessionDialog::master_bus_button_clicked ()
{
bool const yn = _create_master_bus.get_active();
_master_bus_channel_count.set_sensitive(yn);
_connect_outputs_to_master.set_sensitive(yn);
}
void void
SessionDialog::recent_row_activated (const Gtk::TreePath&, Gtk::TreeViewColumn*) SessionDialog::recent_row_activated (const Gtk::TreePath&, Gtk::TreeViewColumn*)
{ {
@ -1342,4 +1081,3 @@ SessionDialog::on_delete_event (GdkEventAny* ev)
response (RESPONSE_CANCEL); response (RESPONSE_CANCEL);
return ArdourDialog::on_delete_event (ev); return ArdourDialog::on_delete_event (ev);
} }

View file

@ -30,6 +30,7 @@
#include <gtkmm/radiobutton.h> #include <gtkmm/radiobutton.h>
#include <gtkmm/filechooserbutton.h> #include <gtkmm/filechooserbutton.h>
#include <gtkmm/scrolledwindow.h> #include <gtkmm/scrolledwindow.h>
#include <gtkmm/textview.h>
#include <gtkmm/treeview.h> #include <gtkmm/treeview.h>
#include <gtkmm/treestore.h> #include <gtkmm/treestore.h>
#include <gtkmm/checkbutton.h> #include <gtkmm/checkbutton.h>
@ -58,24 +59,10 @@ public:
std::string session_name (bool& should_be_new); std::string session_name (bool& should_be_new);
std::string session_folder (); std::string session_folder ();
bool use_session_template(); bool use_session_template() const;
std::string session_template_name(); std::string session_template_name();
// advanced session options uint32_t master_channel_count();
bool create_master_bus() const;
int master_channel_count() const;
bool connect_inputs() const;
bool limit_inputs_used_for_connection() const;
int input_limit_count() const;
bool connect_outputs() const;
bool limit_outputs_used_for_connection() const;
int output_limit_count() const;
bool connect_outs_to_master() const;
bool connect_outs_to_physical() const;
void set_provided_session(const std::string& session_name, const std::string& session_path) { void set_provided_session(const std::string& session_name, const std::string& session_path) {
_provided_session_name = session_name; _provided_session_name = session_name;
@ -165,92 +152,42 @@ private:
SessionTemplateColumns () { SessionTemplateColumns () {
add (name); add (name);
add (path); add (path);
add (desc); add (description);
add (created_with);
} }
Gtk::TreeModelColumn<std::string> name; Gtk::TreeModelColumn<std::string> name;
Gtk::TreeModelColumn<std::string> path; Gtk::TreeModelColumn<std::string> path;
Gtk::TreeModelColumn<std::string> desc; Gtk::TreeModelColumn<std::string> description;
Gtk::TreeModelColumn<std::string> created_with;
}; };
SessionTemplateColumns session_template_columns; SessionTemplateColumns session_template_columns;
Glib::RefPtr<Gtk::ListStore> template_model;
Gtk::ComboBox template_chooser; Glib::RefPtr<Gtk::TreeStore> template_model;
Gtk::TreeView template_chooser;
Gtk::ScrolledWindow template_scroller;
void template_row_selected ();
Gtk::TextView template_desc;
Gtk::Frame template_desc_frame;
Gtk::VBox session_new_vbox; Gtk::VBox session_new_vbox;
Gtk::VBox session_existing_vbox; Gtk::VBox session_existing_vbox;
Gtk::Expander more_new_session_options_button;
Gtk::CheckButton use_template_button;
std::string load_template_override; std::string load_template_override;
void template_checkbox_toggled ();
void more_new_session_options_button_clicked();
void new_name_changed (); void new_name_changed ();
void new_name_activated (); void new_name_activated ();
void populate_session_templates (); void populate_session_templates ();
/* more options for new sessions */
Gtk::VBox more_options_vbox;
Gtk::Label chan_count_label_1;
Gtk::Label chan_count_label_3;
Gtk::Label chan_count_label_4;
Gtk::Table advanced_table;
Gtk::HBox input_port_limit_hbox;
Gtk::VBox input_port_vbox;
Gtk::Table input_table;
Gtk::HBox input_hbox;
Gtk::Label bus_label;
Gtk::Frame bus_frame;
Gtk::Table bus_table;
Gtk::HBox bus_hbox;
Gtk::Label input_label;
Gtk::Frame input_frame;
Gtk::HBox output_port_limit_hbox;
Gtk::VBox output_port_vbox;
Gtk::VBox output_conn_vbox;
Gtk::VBox output_vbox;
Gtk::HBox output_hbox;
Gtk::Label output_label;
Gtk::Frame output_frame;
Gtk::VBox advanced_vbox;
Gtk::Label advanced_label;
Gtk::CheckButton _create_master_bus;
Gtk::SpinButton _master_bus_channel_count;
Gtk::CheckButton _connect_inputs;
Gtk::CheckButton _limit_input_ports;
Gtk::SpinButton _input_limit_count;
Gtk::CheckButton _connect_outputs;
Gtk::CheckButton _limit_output_ports;
Gtk::SpinButton _output_limit_count;
Gtk::RadioButtonGroup connect_outputs_group;
Gtk::RadioButton _connect_outputs_to_master;
Gtk::RadioButton _connect_outputs_to_physical;
Gtk::Adjustment _output_limit_count_adj;
Gtk::Adjustment _input_limit_count_adj;
Gtk::Adjustment _master_bus_channel_count_adj;
void connect_inputs_clicked ();
void connect_outputs_clicked ();
void limit_inputs_clicked ();
void limit_outputs_clicked ();
void master_bus_button_clicked ();
void setup_more_options_box ();
/* --disable plugins UI */ /* --disable plugins UI */
Gtk::CheckButton _disable_plugins; Gtk::CheckButton _disable_plugins;
void disable_plugins_clicked (); void disable_plugins_clicked ();
/* meta-template */
uint32_t meta_master_bus_profile (std::string script) const;
/* always there */ /* always there */
Glib::RefPtr<Pango::Layout> layout; Glib::RefPtr<Pango::Layout> layout;

View file

@ -0,0 +1,59 @@
ardour {
["type"] = "SessionSetup",
name = "Advanced Session",
description = [[Allows to configure master-bus and autoconnect]],
master_bus = 0
}
function session_setup ()
local auto_connect_in = {
[0] = "Manually",
[1] = "automatically to physical inputs",
}
local auto_connect_out = {
[0] = "Manually",
[1] = "automatically to physical outputs",
[2] = "automatically to master bus",
}
local dialog_options = {
{ type = "heading", title = "Customize Session: " .. Session:name () },
{ type = "number", key = "master", title = "Master bus channels", min = 0, max = 24, step = 1, digits = 0, default = 2 },
{ type = "checkbox", key = "monitor", title = "Add monitor section", default = ARDOUR.config():get_use_monitor_bus () },
{ type = "dropdown", key = "ac_input", title = "Autoconnect Inputs",
values = {
[auto_connect_in[0]] = 0,
[auto_connect_in[1]] = 1,
},
default = auto_connect_in[ARDOUR.config():get_input_auto_connect ()]
},
{ type = "dropdown", key = "ac_output", title = "Autoconnect Outputs",
values = {
[auto_connect_out[0]] = 0,
[auto_connect_out[1]] = 1,
[auto_connect_out[2]] = 2,
},
default = auto_connect_out[ARDOUR.config():get_output_auto_connect ()]
},
}
local dlg = LuaDialog.Dialog ("Template Setup", dialog_options)
local rv = dlg:run()
if (not rv) then return end
if rv['master'] > 0 then
local count = ARDOUR.ChanCount ( ARDOUR.DataType("audio"), rv['master'])
Session:add_master_bus (count)
end
if rv['monitor'] then
Session:add_monitor_section ()
end
ARDOUR.config():set_input_auto_connect (rv['ac_input'])
ARDOUR.config():set_output_auto_connect (rv['ac_output'])
Session:save_state("");
end