David Robillard
e0aaed6d65
All #include statements that include a header that is a part of a library bundled with ardour MUST use quotes, not angle brackets. Do this: #include "ardour/types.h" NOT this: #include <ardour/types.h> Rationale: This is best practice in general, to ensure we include the local version and not the system version. That quotes mean "local" (in some sense) and angle brackets mean "system" (in some sense) is a ubiquitous convention and IIRC right in the C spec somewhere. More pragmatically, this is required by (my) waf (stuff) for dependencies to work correctly. That is: !!! FAILURE TO DO THIS CAN RESULT IN BROKEN BUILDS !!! Failure to comply is punishable by death by torture. :) P.S. It's not that dramatic in all cases, but this (in combination with some GCC flags specific to the include type) is the best way I have found to be absolutely 100% positive the local ones are being used (and we definitely want to be absolutely 100% positive on that one). git-svn-id: svn://localhost/ardour2/branches/3.0@4655 d708f5d6-7413-0410-9779-e7cbd77b26cf
1056 lines
32 KiB
C++
1056 lines
32 KiB
C++
/*
|
|
Copyright (C) 2005 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.
|
|
|
|
*/
|
|
|
|
#include "pbd/error.h"
|
|
|
|
#include "ardour/recent_sessions.h"
|
|
#include "ardour/session_state_utils.h"
|
|
#include "ardour/template_utils.h"
|
|
#include "ardour/session.h"
|
|
#include "ardour/profile.h"
|
|
|
|
#include <gtkmm/entry.h>
|
|
#include <gtkmm/filechooserbutton.h>
|
|
#include <gtkmm/spinbutton.h>
|
|
#include <gtkmm/checkbutton.h>
|
|
#include <gtkmm/radiobutton.h>
|
|
#include <gtkmm/filefilter.h>
|
|
#include <gtkmm/stock.h>
|
|
#include <gdkmm/cursor.h>
|
|
|
|
#include <gtkmm2ext/window_title.h>
|
|
|
|
using namespace Gtk;
|
|
using namespace Gtkmm2ext;
|
|
using namespace PBD;
|
|
using namespace ARDOUR;
|
|
|
|
#include "opts.h"
|
|
#include "utils.h"
|
|
#include "i18n.h"
|
|
#include "new_session_dialog.h"
|
|
|
|
NewSessionDialog::NewSessionDialog()
|
|
: ArdourDialog ("session control")
|
|
{
|
|
in_destructor = false;
|
|
session_name_label = new Gtk::Label(_("Name:"));
|
|
m_name = new Gtk::Entry();
|
|
m_name->set_text(ARDOUR_COMMAND_LINE::session_name);
|
|
|
|
chan_count_label_1 = new Gtk::Label(_("channels"));
|
|
chan_count_label_2 = new Gtk::Label(_("channels"));
|
|
chan_count_label_3 = new Gtk::Label(_("channels"));
|
|
chan_count_label_4 = new Gtk::Label(_("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_2->set_alignment(0,0.5);
|
|
chan_count_label_2->set_padding(0,0);
|
|
chan_count_label_2->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 = new Gtk::Label(_("<b>Busses</b>"));
|
|
input_label = new Gtk::Label(_("<b>Inputs</b>"));
|
|
output_label = new Gtk::Label(_("<b>Outputs</b>"));
|
|
|
|
session_location_label = new Gtk::Label(_("Create folder in:"));
|
|
m_folder = new Gtk::FileChooserButton(Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
|
|
session_template_label = new Gtk::Label(_("Template:"));
|
|
m_template = new Gtk::FileChooserButton();
|
|
m_create_control_bus = new Gtk::CheckButton(_("Create monitor bus"));
|
|
|
|
Gtk::Adjustment *m_control_bus_channel_count_adj = Gtk::manage(new Gtk::Adjustment(2, 0, 100, 1, 10, 0));
|
|
m_control_bus_channel_count = new Gtk::SpinButton(*m_control_bus_channel_count_adj, 1, 0);
|
|
|
|
Gtk::Adjustment *m_master_bus_channel_count_adj = Gtk::manage(new Gtk::Adjustment(2, 0, 100, 1, 10, 0));
|
|
m_master_bus_channel_count = new Gtk::SpinButton(*m_master_bus_channel_count_adj, 1, 0);
|
|
m_create_master_bus = new Gtk::CheckButton(_("Create master bus"));
|
|
advanced_table = new Gtk::Table(2, 2, true);
|
|
m_connect_inputs = new Gtk::CheckButton(_("Automatically connect to physical inputs"));
|
|
m_limit_input_ports = new Gtk::CheckButton(_("Use only"));
|
|
|
|
Gtk::Adjustment *m_input_limit_count_adj = Gtk::manage(new Gtk::Adjustment(1, 0, 100, 1, 10, 0));
|
|
m_input_limit_count = new Gtk::SpinButton(*m_input_limit_count_adj, 1, 0);
|
|
input_port_limit_hbox = new Gtk::HBox(false, 0);
|
|
input_port_vbox = new Gtk::VBox(false, 0);
|
|
input_table = new Gtk::Table(2, 2, false);
|
|
|
|
bus_frame = new Gtk::Frame();
|
|
bus_table = new Gtk::Table (2, 3, false);
|
|
|
|
input_frame = new Gtk::Frame();
|
|
m_connect_outputs = new Gtk::CheckButton(_("Automatically connect outputs"));
|
|
m_limit_output_ports = new Gtk::CheckButton(_("Use only"));
|
|
|
|
Gtk::Adjustment *m_output_limit_count_adj = Gtk::manage(new Gtk::Adjustment(1, 0, 100, 1, 10, 0));
|
|
m_output_limit_count = new Gtk::SpinButton(*m_output_limit_count_adj, 1, 0);
|
|
output_port_limit_hbox = new Gtk::HBox(false, 0);
|
|
output_port_vbox = new Gtk::VBox(false, 0);
|
|
|
|
Gtk::RadioButton::Group _RadioBGroup_m_connect_outputs_to_master;
|
|
m_connect_outputs_to_master = new Gtk::RadioButton(_RadioBGroup_m_connect_outputs_to_master, _("... to master bus"));
|
|
m_connect_outputs_to_physical = new Gtk::RadioButton(_RadioBGroup_m_connect_outputs_to_master, _("... to physical outputs"));
|
|
output_conn_vbox = new Gtk::VBox(false, 0);
|
|
output_vbox = new Gtk::VBox(false, 0);
|
|
|
|
output_frame = new Gtk::Frame();
|
|
advanced_vbox = new Gtk::VBox(false, 0);
|
|
advanced_label = new Gtk::Label(_("Advanced options"));
|
|
advanced_expander = new Gtk::Expander();
|
|
new_session_table = new Gtk::Table(2, 2, false);
|
|
m_open_filechooser = new Gtk::FileChooserButton();
|
|
open_session_hbox = new Gtk::HBox(false, 0);
|
|
m_treeview = new Gtk::TreeView();
|
|
recent_scrolledwindow = new Gtk::ScrolledWindow();
|
|
|
|
recent_sesion_label = new Gtk::Label(_("Recent:"));
|
|
recent_frame = new Gtk::Frame();
|
|
open_session_vbox = new Gtk::VBox(false, 0);
|
|
m_notebook = new Gtk::Notebook();
|
|
session_name_label->set_alignment(0, 0.5);
|
|
session_name_label->set_padding(6,0);
|
|
session_name_label->set_line_wrap(false);
|
|
session_name_label->set_selectable(false);
|
|
m_name->set_editable(true);
|
|
m_name->set_max_length(0);
|
|
m_name->set_has_frame(true);
|
|
m_name->set_activates_default(true);
|
|
m_name->set_width_chars (40);
|
|
session_location_label->set_alignment(0,0.5);
|
|
session_location_label->set_padding(6,0);
|
|
session_location_label->set_line_wrap(false);
|
|
session_location_label->set_selectable(false);
|
|
session_template_label->set_alignment(0,0.5);
|
|
session_template_label->set_padding(6,0);
|
|
session_template_label->set_line_wrap(false);
|
|
session_template_label->set_selectable(false);
|
|
m_create_control_bus->set_flags(Gtk::CAN_FOCUS);
|
|
m_create_control_bus->set_relief(Gtk::RELIEF_NORMAL);
|
|
m_create_control_bus->set_mode(true);
|
|
m_create_control_bus->set_active(false);
|
|
m_create_control_bus->set_border_width(0);
|
|
m_control_bus_channel_count->set_flags(Gtk::CAN_FOCUS);
|
|
m_control_bus_channel_count->set_update_policy(Gtk::UPDATE_ALWAYS);
|
|
m_control_bus_channel_count->set_numeric(true);
|
|
m_control_bus_channel_count->set_digits(0);
|
|
m_control_bus_channel_count->set_wrap(false);
|
|
m_control_bus_channel_count->set_sensitive(false);
|
|
m_master_bus_channel_count->set_flags(Gtk::CAN_FOCUS);
|
|
m_master_bus_channel_count->set_update_policy(Gtk::UPDATE_ALWAYS);
|
|
m_master_bus_channel_count->set_numeric(true);
|
|
m_master_bus_channel_count->set_digits(0);
|
|
m_master_bus_channel_count->set_wrap(false);
|
|
open_session_file_label = new Gtk::Label(_("Browse:"));
|
|
open_session_file_label->set_alignment(0, 0.5);
|
|
m_create_master_bus->set_flags(Gtk::CAN_FOCUS);
|
|
m_create_master_bus->set_relief(Gtk::RELIEF_NORMAL);
|
|
m_create_master_bus->set_mode(true);
|
|
m_create_master_bus->set_active(true);
|
|
m_create_master_bus->set_border_width(0);
|
|
advanced_table->set_row_spacings(0);
|
|
advanced_table->set_col_spacings(0);
|
|
|
|
m_connect_inputs->set_flags(Gtk::CAN_FOCUS);
|
|
m_connect_inputs->set_relief(Gtk::RELIEF_NORMAL);
|
|
m_connect_inputs->set_mode(true);
|
|
m_connect_inputs->set_active(true);
|
|
m_connect_inputs->set_border_width(0);
|
|
|
|
m_limit_input_ports->set_flags(Gtk::CAN_FOCUS);
|
|
m_limit_input_ports->set_relief(Gtk::RELIEF_NORMAL);
|
|
m_limit_input_ports->set_mode(true);
|
|
m_limit_input_ports->set_sensitive(true);
|
|
m_limit_input_ports->set_border_width(0);
|
|
m_input_limit_count->set_flags(Gtk::CAN_FOCUS);
|
|
m_input_limit_count->set_update_policy(Gtk::UPDATE_ALWAYS);
|
|
m_input_limit_count->set_numeric(true);
|
|
m_input_limit_count->set_digits(0);
|
|
m_input_limit_count->set_wrap(false);
|
|
m_input_limit_count->set_sensitive(false);
|
|
|
|
bus_hbox = new Gtk::HBox (false, 0);
|
|
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 (*m_create_master_bus, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
|
|
bus_table->attach (*m_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);
|
|
bus_table->attach (*m_create_control_bus, 0, 1, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
|
|
bus_table->attach (*m_control_bus_channel_count, 1, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
|
|
bus_table->attach (*chan_count_label_2, 2, 3, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 0);
|
|
|
|
input_port_limit_hbox->pack_start(*m_limit_input_ports, Gtk::PACK_SHRINK, 6);
|
|
input_port_limit_hbox->pack_start(*m_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(*m_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 = new Gtk::HBox (false, 0);
|
|
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);
|
|
|
|
m_connect_outputs->set_flags(Gtk::CAN_FOCUS);
|
|
m_connect_outputs->set_relief(Gtk::RELIEF_NORMAL);
|
|
m_connect_outputs->set_mode(true);
|
|
m_connect_outputs->set_active(true);
|
|
m_connect_outputs->set_border_width(0);
|
|
m_limit_output_ports->set_flags(Gtk::CAN_FOCUS);
|
|
m_limit_output_ports->set_relief(Gtk::RELIEF_NORMAL);
|
|
m_limit_output_ports->set_mode(true);
|
|
m_limit_output_ports->set_sensitive(true);
|
|
m_limit_output_ports->set_border_width(0);
|
|
m_output_limit_count->set_flags(Gtk::CAN_FOCUS);
|
|
m_output_limit_count->set_update_policy(Gtk::UPDATE_ALWAYS);
|
|
m_output_limit_count->set_numeric(false);
|
|
m_output_limit_count->set_digits(0);
|
|
m_output_limit_count->set_wrap(false);
|
|
m_output_limit_count->set_sensitive(false);
|
|
output_port_limit_hbox->pack_start(*m_limit_output_ports, Gtk::PACK_SHRINK, 6);
|
|
output_port_limit_hbox->pack_start(*m_output_limit_count, Gtk::PACK_SHRINK, 0);
|
|
output_port_limit_hbox->pack_start(*chan_count_label_4, Gtk::PACK_SHRINK, 6);
|
|
m_connect_outputs_to_master->set_flags(Gtk::CAN_FOCUS);
|
|
m_connect_outputs_to_master->set_relief(Gtk::RELIEF_NORMAL);
|
|
m_connect_outputs_to_master->set_mode(true);
|
|
m_connect_outputs_to_master->set_active(false);
|
|
m_connect_outputs_to_master->set_border_width(0);
|
|
m_connect_outputs_to_physical->set_flags(Gtk::CAN_FOCUS);
|
|
m_connect_outputs_to_physical->set_relief(Gtk::RELIEF_NORMAL);
|
|
m_connect_outputs_to_physical->set_mode(true);
|
|
m_connect_outputs_to_physical->set_active(false);
|
|
m_connect_outputs_to_physical->set_border_width(0);
|
|
output_conn_vbox->pack_start(*m_connect_outputs, Gtk::PACK_SHRINK, 0);
|
|
output_conn_vbox->pack_start(*m_connect_outputs_to_master, Gtk::PACK_SHRINK, 0);
|
|
output_conn_vbox->pack_start(*m_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 = new Gtk::HBox (false, 0);
|
|
output_hbox->pack_start (*output_vbox, Gtk::PACK_SHRINK, 18);
|
|
|
|
output_frame->add(*output_hbox);
|
|
output_frame->set_label_widget(*output_label);
|
|
|
|
advanced_vbox->pack_start(*advanced_table, Gtk::PACK_SHRINK, 0);
|
|
advanced_vbox->pack_start(*bus_frame, Gtk::PACK_SHRINK, 6);
|
|
advanced_vbox->pack_start(*input_frame, Gtk::PACK_SHRINK, 6);
|
|
advanced_vbox->pack_start(*output_frame, Gtk::PACK_SHRINK, 0);
|
|
advanced_label->set_padding(0,0);
|
|
advanced_label->set_line_wrap(false);
|
|
advanced_label->set_selectable(false);
|
|
advanced_label->set_alignment(0, 0.5);
|
|
advanced_expander->set_flags(Gtk::CAN_FOCUS);
|
|
advanced_expander->set_border_width(0);
|
|
advanced_expander->set_expanded(false);
|
|
advanced_expander->set_spacing(0);
|
|
advanced_expander->add(*advanced_vbox);
|
|
advanced_expander->set_label_widget(*advanced_label);
|
|
new_session_table->set_border_width(12);
|
|
new_session_table->set_row_spacings(6);
|
|
new_session_table->set_col_spacings(0);
|
|
new_session_table->attach(*session_name_label, 0, 1, 0, 1, Gtk::FILL, Gtk::FILL, 0, 0);
|
|
new_session_table->attach(*m_name, 1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::FILL, 0, 0);
|
|
new_session_table->attach(*session_location_label, 0, 1, 1, 2, Gtk::FILL, Gtk::FILL, 0, 0);
|
|
new_session_table->attach(*m_folder, 1, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::FILL, 0, 0);
|
|
new_session_table->attach(*session_template_label, 0, 1, 2, 3, Gtk::FILL, Gtk::FILL, 0, 0);
|
|
new_session_table->attach(*m_template, 1, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::FILL, 0, 0);
|
|
|
|
if (!ARDOUR::Profile->get_sae()) {
|
|
new_session_table->attach(*advanced_expander, 0, 2, 3, 4, Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 6);
|
|
}
|
|
|
|
open_session_hbox->pack_start(*open_session_file_label, false, false, 12);
|
|
open_session_hbox->pack_start(*m_open_filechooser, true, true, 12);
|
|
m_treeview->set_flags(Gtk::CAN_FOCUS);
|
|
m_treeview->set_headers_visible(true);
|
|
m_treeview->set_rules_hint(false);
|
|
m_treeview->set_reorderable(false);
|
|
m_treeview->set_enable_search(true);
|
|
m_treeview->set_fixed_height_mode(false);
|
|
m_treeview->set_hover_selection(false);
|
|
m_treeview->set_size_request(-1, 150);
|
|
recent_scrolledwindow->set_flags(Gtk::CAN_FOCUS);
|
|
recent_scrolledwindow->set_border_width(6);
|
|
recent_scrolledwindow->set_shadow_type(Gtk::SHADOW_IN);
|
|
recent_scrolledwindow->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
|
|
recent_scrolledwindow->property_window_placement().set_value(Gtk::CORNER_TOP_LEFT);
|
|
recent_scrolledwindow->add(*m_treeview);
|
|
|
|
recent_sesion_label->set_padding(0,0);
|
|
recent_sesion_label->set_line_wrap(false);
|
|
recent_sesion_label->set_selectable(false);
|
|
recent_frame->set_border_width(12);
|
|
recent_frame->set_shadow_type(Gtk::SHADOW_NONE);
|
|
recent_frame->add(*recent_scrolledwindow);
|
|
recent_frame->set_label_widget(*recent_sesion_label);
|
|
open_session_vbox->pack_start(*recent_frame, Gtk::PACK_EXPAND_WIDGET, 0);
|
|
open_session_vbox->pack_start(*open_session_hbox, Gtk::PACK_SHRINK, 12);
|
|
m_notebook->set_flags(Gtk::CAN_FOCUS);
|
|
m_notebook->set_scrollable(true);
|
|
get_vbox()->set_homogeneous(false);
|
|
get_vbox()->set_spacing(0);
|
|
get_vbox()->pack_start(*m_notebook, Gtk::PACK_SHRINK, 0);
|
|
|
|
/*
|
|
icon setting is done again in the editor (for the whole app),
|
|
but its all chickens and eggs at this point.
|
|
*/
|
|
|
|
list<Glib::RefPtr<Gdk::Pixbuf> > window_icons;
|
|
Glib::RefPtr<Gdk::Pixbuf> icon;
|
|
|
|
if ((icon = ::get_icon ("ardour_icon_16px")) != 0) {
|
|
window_icons.push_back (icon);
|
|
}
|
|
if ((icon = ::get_icon ("ardour_icon_22px")) != 0) {
|
|
window_icons.push_back (icon);
|
|
}
|
|
if ((icon = ::get_icon ("ardour_icon_32px")) != 0) {
|
|
window_icons.push_back (icon);
|
|
}
|
|
if ((icon = ::get_icon ("ardour_icon_48px")) != 0) {
|
|
window_icons.push_back (icon);
|
|
}
|
|
if (!window_icons.empty()) {
|
|
set_icon_list (window_icons);
|
|
}
|
|
|
|
WindowTitle title(Glib::get_application_name());
|
|
title += _("Session Control");
|
|
set_title(title.get_string());
|
|
|
|
set_position (Gtk::WIN_POS_MOUSE);
|
|
set_resizable(false);
|
|
set_has_separator(false);
|
|
quit_or_cancel_button = add_button(Gtk::Stock::QUIT, Gtk::RESPONSE_CANCEL);
|
|
add_button(Gtk::Stock::CLEAR, Gtk::RESPONSE_NONE);
|
|
m_okbutton = add_button(Gtk::Stock::NEW, Gtk::RESPONSE_OK);
|
|
|
|
recent_model = Gtk::TreeStore::create (recent_columns);
|
|
m_treeview->set_model (recent_model);
|
|
m_treeview->append_column (_("Recent sessions"), recent_columns.visible_name);
|
|
m_treeview->set_headers_visible (false);
|
|
m_treeview->get_selection()->set_mode (Gtk::SELECTION_SINGLE);
|
|
|
|
if (is_directory (user_template_directory ()))
|
|
{
|
|
m_template->set_current_folder (user_template_directory().to_string());
|
|
}
|
|
else if (is_directory (system_template_directory ()))
|
|
{
|
|
m_template->set_current_folder (system_template_directory().to_string());
|
|
}
|
|
|
|
if (is_directory (system_template_directory ()))
|
|
{
|
|
m_template->add_shortcut_folder (system_template_directory().to_string());
|
|
}
|
|
|
|
m_template->set_title(_("select template"));
|
|
Gtk::FileFilter* session_filter = manage (new (Gtk::FileFilter));
|
|
session_filter->add_pattern(X_("*.ardour"));
|
|
session_filter->add_pattern(X_("*.ardour.bak"));
|
|
m_open_filechooser->set_filter (*session_filter);
|
|
m_open_filechooser->set_current_folder(getenv ("HOME"));
|
|
m_open_filechooser->set_title(_("select session file"));
|
|
|
|
Gtk::FileFilter* template_filter = manage (new (Gtk::FileFilter));
|
|
template_filter->add_pattern(X_("*.template"));
|
|
m_template->set_filter (*template_filter);
|
|
|
|
m_folder->set_current_folder(getenv ("HOME"));
|
|
m_folder->set_title(_("select directory"));
|
|
|
|
m_notebook->set_current_page(0);
|
|
m_notebook->show();
|
|
m_notebook->show_all_children();
|
|
|
|
engine_page_session_folder = X_("");
|
|
engine_page_session_name = X_("");
|
|
|
|
set_default_response (Gtk::RESPONSE_OK);
|
|
if (!ARDOUR_COMMAND_LINE::session_name.length()) {
|
|
set_response_sensitive (Gtk::RESPONSE_OK, false);
|
|
set_response_sensitive (Gtk::RESPONSE_NONE, false);
|
|
} else {
|
|
set_response_sensitive (Gtk::RESPONSE_OK, true);
|
|
set_response_sensitive (Gtk::RESPONSE_NONE, true);
|
|
}
|
|
|
|
///@ connect some signals
|
|
|
|
m_connect_inputs->signal_clicked().connect (mem_fun (*this, &NewSessionDialog::connect_inputs_clicked));
|
|
m_connect_outputs->signal_clicked().connect (mem_fun (*this, &NewSessionDialog::connect_outputs_clicked));
|
|
m_limit_input_ports->signal_clicked().connect (mem_fun (*this, &NewSessionDialog::limit_inputs_clicked));
|
|
m_limit_output_ports->signal_clicked().connect (mem_fun (*this, &NewSessionDialog::limit_outputs_clicked));
|
|
m_create_master_bus->signal_clicked().connect (mem_fun (*this, &NewSessionDialog::master_bus_button_clicked));
|
|
m_create_control_bus->signal_clicked().connect (mem_fun (*this, &NewSessionDialog::monitor_bus_button_clicked));
|
|
m_name->signal_changed().connect(mem_fun (*this, &NewSessionDialog::on_new_session_name_entry_changed));
|
|
m_notebook->signal_switch_page().connect (mem_fun (*this, &NewSessionDialog::notebook_page_changed));
|
|
m_treeview->get_selection()->signal_changed().connect (mem_fun (*this, &NewSessionDialog::treeview_selection_changed));
|
|
m_treeview->signal_row_activated().connect (mem_fun (*this, &NewSessionDialog::recent_row_activated));
|
|
m_open_filechooser->signal_selection_changed ().connect (mem_fun (*this, &NewSessionDialog::file_chosen));
|
|
m_template->signal_selection_changed ().connect (mem_fun (*this, &NewSessionDialog::template_chosen));
|
|
|
|
page_set = Pages (0);
|
|
}
|
|
|
|
NewSessionDialog::~NewSessionDialog()
|
|
{
|
|
in_destructor = true;
|
|
}
|
|
|
|
int
|
|
NewSessionDialog::run ()
|
|
{
|
|
if (!page_set) {
|
|
/* nothing to display */
|
|
return Gtk::RESPONSE_OK;
|
|
}
|
|
if (!(page_set & NewPage) && !(page_set & OpenPage)) {
|
|
set_response_sensitive (Gtk::RESPONSE_OK, true);
|
|
}
|
|
return ArdourDialog::run ();
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::set_have_engine (bool yn)
|
|
{
|
|
if (yn) {
|
|
m_notebook->remove_page (engine_control);
|
|
page_set = Pages (page_set & ~EnginePage);
|
|
} else {
|
|
if (!(page_set & EnginePage)) {
|
|
m_notebook->append_page (engine_control, _("Audio Setup"));
|
|
m_notebook->show_all_children();
|
|
page_set = Pages (page_set | EnginePage);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
NewSessionDialog::set_existing_session (bool yn)
|
|
{
|
|
if (yn) {
|
|
|
|
if (page_set & NewPage) {
|
|
m_notebook->remove_page (*new_session_table);
|
|
page_set = Pages (page_set & ~NewPage);
|
|
}
|
|
|
|
if (page_set & OpenPage) {
|
|
m_notebook->remove_page (*open_session_vbox);
|
|
page_set = Pages (page_set & ~OpenPage);
|
|
}
|
|
|
|
} else {
|
|
if (!(page_set & NewPage)) {
|
|
m_notebook->append_page(*new_session_table, _("New Session"));
|
|
m_notebook->pages().back().set_tab_label_packing(false, true, Gtk::PACK_START);
|
|
page_set = Pages (page_set | NewPage);
|
|
}
|
|
if (!(page_set & OpenPage)) {
|
|
m_notebook->append_page(*open_session_vbox, _("Open Session"));
|
|
m_notebook->pages().back().set_tab_label_packing(false, true, Gtk::PACK_START);
|
|
page_set = Pages (page_set | OpenPage);
|
|
}
|
|
|
|
m_notebook->show_all_children();
|
|
}
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::set_session_name (const Glib::ustring& name)
|
|
{
|
|
m_name->set_text (name);
|
|
engine_page_session_name = name;
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::set_session_folder(const Glib::ustring& dir)
|
|
{
|
|
Glib::ustring realdir = dir;
|
|
|
|
/* this little tangled mess is a result of 4 things:
|
|
|
|
1) GtkFileChooser vomits when given a non-absolute directory
|
|
argument to set_current_folder()
|
|
2) canonicalize_file_name() doesn't exist on OS X
|
|
3) linux man page for realpath() says "do not use this function"
|
|
4) canonicalize_file_name() & realpath() have entirely
|
|
different semantics on OS X and Linux when given
|
|
a non-existent path.
|
|
|
|
as result of all this, we take two distinct pathways through the code.
|
|
*/
|
|
|
|
|
|
#ifdef __APPLE__
|
|
|
|
char buf[PATH_MAX];
|
|
|
|
if(realpath (dir.c_str(), buf) != 0) {
|
|
if (!Glib::file_test (dir, Glib::FILE_TEST_IS_DIR)) {
|
|
realdir = Glib::path_get_dirname (realdir);
|
|
}
|
|
m_folder->set_current_folder (realdir);
|
|
engine_page_session_folder = realdir;
|
|
}
|
|
|
|
|
|
#else
|
|
char* res;
|
|
if (!Glib::file_test (dir, Glib::FILE_TEST_IS_DIR)) {
|
|
realdir = Glib::path_get_dirname (realdir);
|
|
cerr << "didn't exist, use " << realdir << endl;
|
|
}
|
|
|
|
if ((res = canonicalize_file_name (realdir.c_str())) != 0) {
|
|
cerr << "canonical, use " << res << endl;
|
|
m_folder->set_current_folder (res);
|
|
engine_page_session_folder = res;
|
|
free (res);
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
std::string
|
|
NewSessionDialog::session_name() const
|
|
{
|
|
std::string str = Glib::filename_from_utf8(m_open_filechooser->get_filename());
|
|
std::string::size_type position = str.find_last_of ('/');
|
|
str = str.substr (position+1);
|
|
position = str.find_last_of ('.');
|
|
str = str.substr (0, position);
|
|
|
|
/*
|
|
XXX what to do if it's a .bak file?
|
|
load_session doesn't allow it!
|
|
|
|
if ((position = str.rfind(".bak")) != string::npos) {
|
|
str = str.substr (0, position);
|
|
}
|
|
*/
|
|
|
|
switch (which_page()) {
|
|
case NewPage:
|
|
case EnginePage:
|
|
/* new or audio setup pages */
|
|
if (!(page_set & OpenPage) && !(page_set & NewPage)) {
|
|
return Glib::filename_from_utf8(engine_page_session_name);
|
|
}
|
|
return Glib::filename_from_utf8(m_name->get_text());
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (m_treeview->get_selection()->count_selected_rows() == 0) {
|
|
return Glib::filename_from_utf8(str);
|
|
}
|
|
Gtk::TreeModel::iterator i = m_treeview->get_selection()->get_selected();
|
|
return (*i)[recent_columns.visible_name];
|
|
}
|
|
|
|
std::string
|
|
NewSessionDialog::session_folder() const
|
|
{
|
|
switch (which_page()) {
|
|
case NewPage:
|
|
return Glib::filename_from_utf8(m_folder->get_filename());
|
|
|
|
case EnginePage:
|
|
if (!(page_set & OpenPage) && !(page_set & NewPage)) {
|
|
/* just engine page, nothing else */
|
|
return Glib::filename_from_utf8(engine_page_session_folder);
|
|
}
|
|
if (page_set == EnginePage) {
|
|
/* use m_folder since it should be set */
|
|
return Glib::filename_from_utf8(m_folder->get_filename());
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (m_treeview->get_selection()->count_selected_rows() == 0) {
|
|
const string filename(Glib::filename_from_utf8(m_open_filechooser->get_filename()));
|
|
return Glib::path_get_dirname(filename);
|
|
}
|
|
|
|
Gtk::TreeModel::iterator i = m_treeview->get_selection()->get_selected();
|
|
return (*i)[recent_columns.fullpath];
|
|
}
|
|
|
|
bool
|
|
NewSessionDialog::use_session_template() const
|
|
{
|
|
if (m_template->get_filename().empty() && (which_page() == NewPage))
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
std::string
|
|
NewSessionDialog::session_template_name() const
|
|
{
|
|
return Glib::filename_from_utf8(m_template->get_filename());
|
|
}
|
|
|
|
bool
|
|
NewSessionDialog::create_master_bus() const
|
|
{
|
|
return m_create_master_bus->get_active();
|
|
}
|
|
|
|
int
|
|
NewSessionDialog::master_channel_count() const
|
|
{
|
|
return m_master_bus_channel_count->get_value_as_int();
|
|
}
|
|
|
|
bool
|
|
NewSessionDialog::create_control_bus() const
|
|
{
|
|
return m_create_control_bus->get_active();
|
|
}
|
|
|
|
int
|
|
NewSessionDialog::control_channel_count() const
|
|
{
|
|
return m_control_bus_channel_count->get_value_as_int();
|
|
}
|
|
|
|
bool
|
|
NewSessionDialog::connect_inputs() const
|
|
{
|
|
return m_connect_inputs->get_active();
|
|
}
|
|
|
|
bool
|
|
NewSessionDialog::limit_inputs_used_for_connection() const
|
|
{
|
|
return m_limit_input_ports->get_active();
|
|
}
|
|
|
|
int
|
|
NewSessionDialog::input_limit_count() const
|
|
{
|
|
return m_input_limit_count->get_value_as_int();
|
|
}
|
|
|
|
bool
|
|
NewSessionDialog::connect_outputs() const
|
|
{
|
|
return m_connect_outputs->get_active();
|
|
}
|
|
|
|
bool
|
|
NewSessionDialog::limit_outputs_used_for_connection() const
|
|
{
|
|
return m_limit_output_ports->get_active();
|
|
}
|
|
|
|
int
|
|
NewSessionDialog::output_limit_count() const
|
|
{
|
|
return m_output_limit_count->get_value_as_int();
|
|
}
|
|
|
|
bool
|
|
NewSessionDialog::connect_outs_to_master() const
|
|
{
|
|
return m_connect_outputs_to_master->get_active();
|
|
}
|
|
|
|
bool
|
|
NewSessionDialog::connect_outs_to_physical() const
|
|
{
|
|
return m_connect_outputs_to_physical->get_active();
|
|
}
|
|
|
|
int
|
|
NewSessionDialog::get_current_page()
|
|
{
|
|
return m_notebook->get_current_page();
|
|
}
|
|
|
|
NewSessionDialog::Pages
|
|
NewSessionDialog::which_page () const
|
|
{
|
|
int num = m_notebook->get_current_page();
|
|
|
|
if (page_set == NewPage) {
|
|
return NewPage;
|
|
|
|
} else if (page_set == OpenPage) {
|
|
return OpenPage;
|
|
|
|
} else if (page_set == EnginePage) {
|
|
return EnginePage;
|
|
|
|
} else if (page_set == (NewPage|OpenPage)) {
|
|
switch (num) {
|
|
case 0:
|
|
return NewPage;
|
|
default:
|
|
return OpenPage;
|
|
}
|
|
|
|
} else if (page_set == (NewPage|EnginePage)) {
|
|
switch (num) {
|
|
case 0:
|
|
return NewPage;
|
|
default:
|
|
return EnginePage;
|
|
}
|
|
|
|
} else if (page_set == (NewPage|EnginePage|OpenPage)) {
|
|
switch (num) {
|
|
case 0:
|
|
return NewPage;
|
|
case 1:
|
|
return OpenPage;
|
|
default:
|
|
return EnginePage;
|
|
}
|
|
|
|
} else if (page_set == (OpenPage|EnginePage)) {
|
|
switch (num) {
|
|
case 0:
|
|
return OpenPage;
|
|
default:
|
|
return EnginePage;
|
|
}
|
|
}
|
|
|
|
return NewPage; /* shouldn't get here */
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::set_current_page(int page)
|
|
{
|
|
return m_notebook->set_current_page (page);
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::reset_name()
|
|
{
|
|
m_name->set_text("");
|
|
set_response_sensitive (Gtk::RESPONSE_OK, false);
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::on_new_session_name_entry_changed ()
|
|
{
|
|
if (m_name->get_text() != "") {
|
|
set_response_sensitive (Gtk::RESPONSE_OK, true);
|
|
set_response_sensitive (Gtk::RESPONSE_NONE, true);
|
|
} else {
|
|
set_response_sensitive (Gtk::RESPONSE_OK, false);
|
|
}
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::notebook_page_changed (GtkNotebookPage* np, uint pagenum)
|
|
{
|
|
if (in_destructor) {
|
|
return;
|
|
}
|
|
|
|
switch (which_page()) {
|
|
case OpenPage:
|
|
on_new_session_page = false;
|
|
m_okbutton->set_label(_("Open"));
|
|
m_okbutton->set_image (*(manage (new Gtk::Image (Gtk::Stock::OPEN, Gtk::ICON_SIZE_BUTTON))));
|
|
set_response_sensitive (Gtk::RESPONSE_NONE, false);
|
|
if (m_treeview->get_selection()->count_selected_rows() == 0) {
|
|
set_response_sensitive (Gtk::RESPONSE_OK, false);
|
|
} else {
|
|
set_response_sensitive (Gtk::RESPONSE_OK, true);
|
|
}
|
|
break;
|
|
|
|
case EnginePage:
|
|
on_new_session_page = false;
|
|
m_okbutton->set_label(_("Open"));
|
|
m_okbutton->set_image (*(manage (new Gtk::Image (Gtk::Stock::OPEN, Gtk::ICON_SIZE_BUTTON))));
|
|
set_response_sensitive (Gtk::RESPONSE_NONE, false);
|
|
set_response_sensitive (Gtk::RESPONSE_OK, true);
|
|
break;
|
|
|
|
default:
|
|
on_new_session_page = true;
|
|
m_okbutton->set_label(_("New"));
|
|
m_okbutton->set_image (*(new Gtk::Image (Gtk::Stock::NEW, Gtk::ICON_SIZE_BUTTON)));
|
|
if (m_name->get_text() == "") {
|
|
set_response_sensitive (Gtk::RESPONSE_OK, false);
|
|
m_name->grab_focus();
|
|
} else {
|
|
set_response_sensitive (Gtk::RESPONSE_OK, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::treeview_selection_changed ()
|
|
{
|
|
if (m_treeview->get_selection()->count_selected_rows() == 0) {
|
|
if (!m_open_filechooser->get_filename().empty()) {
|
|
set_response_sensitive (Gtk::RESPONSE_OK, true);
|
|
} else {
|
|
set_response_sensitive (Gtk::RESPONSE_OK, false);
|
|
}
|
|
} else {
|
|
set_response_sensitive (Gtk::RESPONSE_OK, true);
|
|
}
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::file_chosen ()
|
|
{
|
|
switch (which_page()) {
|
|
case OpenPage:
|
|
break;
|
|
case NewPage:
|
|
case EnginePage:
|
|
return;
|
|
}
|
|
|
|
m_treeview->get_selection()->unselect_all();
|
|
|
|
Glib::RefPtr<Gdk::Window> win (get_window());
|
|
|
|
if (win) {
|
|
win->set_cursor(Gdk::Cursor(Gdk::WATCH));
|
|
}
|
|
|
|
if (!m_open_filechooser->get_filename().empty()) {
|
|
set_response_sensitive (Gtk::RESPONSE_OK, true);
|
|
response (Gtk::RESPONSE_OK);
|
|
} else {
|
|
set_response_sensitive (Gtk::RESPONSE_OK, false);
|
|
}
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::template_chosen ()
|
|
{
|
|
if (m_template->get_filename() != "" ) {;
|
|
set_response_sensitive (Gtk::RESPONSE_NONE, true);
|
|
} else {
|
|
set_response_sensitive (Gtk::RESPONSE_NONE, false);
|
|
}
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::recent_row_activated (const Gtk::TreePath& path, Gtk::TreeViewColumn* col)
|
|
{
|
|
response (Gtk::RESPONSE_OK);
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::connect_inputs_clicked ()
|
|
{
|
|
m_limit_input_ports->set_sensitive(m_connect_inputs->get_active());
|
|
|
|
if (m_connect_inputs->get_active() && m_limit_input_ports->get_active()) {
|
|
m_input_limit_count->set_sensitive(true);
|
|
} else {
|
|
m_input_limit_count->set_sensitive(false);
|
|
}
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::connect_outputs_clicked ()
|
|
{
|
|
m_limit_output_ports->set_sensitive(m_connect_outputs->get_active());
|
|
|
|
if (m_connect_outputs->get_active() && m_limit_output_ports->get_active()) {
|
|
m_output_limit_count->set_sensitive(true);
|
|
} else {
|
|
m_output_limit_count->set_sensitive(false);
|
|
}
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::limit_inputs_clicked ()
|
|
{
|
|
m_input_limit_count->set_sensitive(m_limit_input_ports->get_active());
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::limit_outputs_clicked ()
|
|
{
|
|
m_output_limit_count->set_sensitive(m_limit_output_ports->get_active());
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::master_bus_button_clicked ()
|
|
{
|
|
m_master_bus_channel_count->set_sensitive(m_create_master_bus->get_active());
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::monitor_bus_button_clicked ()
|
|
{
|
|
m_control_bus_channel_count->set_sensitive(m_create_control_bus->get_active());
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::reset_template()
|
|
{
|
|
m_template->unselect_all ();
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::reset_recent()
|
|
{
|
|
/* Shamelessly ripped from ardour_ui.cc */
|
|
std::vector<string *> *sessions;
|
|
std::vector<string *>::iterator i;
|
|
RecentSessionsSorter cmp;
|
|
|
|
recent_model->clear ();
|
|
|
|
ARDOUR::RecentSessions rs;
|
|
ARDOUR::read_recent_sessions (rs);
|
|
|
|
/* sort them alphabetically */
|
|
sort (rs.begin(), rs.end(), cmp);
|
|
sessions = new std::vector<std::string*>;
|
|
|
|
for (ARDOUR::RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
|
|
sessions->push_back (new string ((*i).second));
|
|
}
|
|
|
|
for (i = sessions->begin(); i != sessions->end(); ++i) {
|
|
|
|
std::vector<std::string*>* states;
|
|
std::vector<const gchar*> item;
|
|
std::string fullpath = *(*i);
|
|
|
|
/* remove any trailing / */
|
|
|
|
if (fullpath[fullpath.length()-1] == '/') {
|
|
fullpath = fullpath.substr (0, fullpath.length()-1);
|
|
}
|
|
|
|
/* check whether session still exists */
|
|
if (!Glib::file_test(fullpath, Glib::FILE_TEST_EXISTS)) {
|
|
/* session doesn't exist */
|
|
continue;
|
|
}
|
|
|
|
/* now get available states for this session */
|
|
|
|
if ((states = ARDOUR::Session::possible_states (fullpath)) == 0) {
|
|
/* no state file? */
|
|
continue;
|
|
}
|
|
|
|
Gtk::TreeModel::Row row = *(recent_model->append());
|
|
|
|
row[recent_columns.visible_name] = Glib::path_get_basename (fullpath);
|
|
row[recent_columns.fullpath] = fullpath;
|
|
|
|
if (states->size()) {
|
|
|
|
/* add the children */
|
|
|
|
for (std::vector<std::string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
|
|
|
|
Gtk::TreeModel::Row child_row = *(recent_model->append (row.children()));
|
|
|
|
child_row[recent_columns.visible_name] = **i2;
|
|
child_row[recent_columns.fullpath] = fullpath;
|
|
|
|
delete *i2;
|
|
}
|
|
}
|
|
|
|
delete states;
|
|
}
|
|
delete sessions;
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::reset()
|
|
{
|
|
reset_name();
|
|
reset_template();
|
|
set_response_sensitive (Gtk::RESPONSE_NONE, false);
|
|
}
|
|
|
|
void
|
|
NewSessionDialog::set_offer_cancel (bool yn)
|
|
{
|
|
if (yn) {
|
|
quit_or_cancel_button->set_label (X_("gtk-cancel"));
|
|
} else {
|
|
quit_or_cancel_button->set_label (X_("gtk-quit"));
|
|
}
|
|
}
|