13
0

notably modify the design and logic of the startup dialog, so that we can handle the requirements in the 3.0-SG branch reasonably. the two major changes concern the idea that we may need to run the audio setup tab at all times, and that the startup dialog could potentially be "ready" without actually needing to be displayed on-screen. this allows us to ALWAYS use a startup dialog, even if we don't actually need any information from the user. as usual with this kind of change, expect a few logic/workflow glitches

git-svn-id: svn://localhost/ardour2/branches/3.0@13397 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2012-11-08 15:54:16 +00:00
parent a532845e7f
commit 44e88a2d54
5 changed files with 197 additions and 187 deletions

View File

@ -329,37 +329,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[])
DPIReset.connect (sigc::mem_fun (*this, &ARDOUR_UI::resize_text_widgets)); DPIReset.connect (sigc::mem_fun (*this, &ARDOUR_UI::resize_text_widgets));
} }
/** @return true if a session was chosen and `apply' clicked, otherwise false if `cancel' was clicked */
bool
ARDOUR_UI::run_startup (bool should_be_new, std::string load_template)
{
delete _startup;
_startup = new ArdourStartup ();
XMLNode* audio_setup = Config->extra_xml ("AudioSetup");
if (audio_setup && _startup->engine_control()) {
_startup->engine_control()->set_state (*audio_setup);
}
_startup->set_new_only (should_be_new);
if (!load_template.empty()) {
_startup->set_load_template (load_template);
}
_startup->present ();
main().run();
_startup->hide ();
switch (_startup->response()) {
case RESPONSE_OK:
return true;
default:
return false;
}
}
int int
ARDOUR_UI::create_engine () ARDOUR_UI::create_engine ()
{ {
@ -2458,7 +2427,7 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
while (ret != 0) { while (ret != 0) {
if (!should_be_new && !ARDOUR_COMMAND_LINE::session_name.empty()) { if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
/* if they named a specific statefile, use it, otherwise they are /* if they named a specific statefile, use it, otherwise they are
just giving a session folder, and we want to use it as is just giving a session folder, and we want to use it as is
@ -2475,71 +2444,79 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
session_path = ARDOUR_COMMAND_LINE::session_name; session_path = ARDOUR_COMMAND_LINE::session_name;
session_name = Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name); session_name = Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name);
} }
}
} else { delete _startup;
_startup = new ArdourStartup (should_be_new, session_name, session_path, load_template);
bool const apply = run_startup (should_be_new, load_template);
if (!_startup->ready_without_display()) {
if (!apply) { _startup->present ();
if (quit_on_cancel) { main().run();
exit (1); _startup->hide ();
} else { }
return ret;
} switch (_startup->response()) {
} case RESPONSE_OK:
break;
/* if we run the startup dialog again, offer more than just "new session" */ default:
if (quit_on_cancel) {
should_be_new = false; exit (1);
session_name = _startup->session_name (likely_new);
string::size_type suffix = session_name.find (statefile_suffix);
if (suffix != string::npos) {
session_name = session_name.substr (0, suffix);
}
/* this shouldn't happen, but we catch it just in case it does */
if (session_name.empty()) {
continue;
}
if (_startup->use_session_template()) {
template_name = _startup->session_template_name();
_session_is_new = true;
}
if (session_name[0] == G_DIR_SEPARATOR ||
(session_name.length() > 2 && session_name[0] == '.' && session_name[1] == G_DIR_SEPARATOR) ||
(session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == G_DIR_SEPARATOR)) {
/* absolute path or cwd-relative path specified for session name: infer session folder
from what was given.
*/
session_path = Glib::path_get_dirname (session_name);
session_name = Glib::path_get_basename (session_name);
} else { } else {
return ret;
session_path = _startup->session_folder();
char illegal = Session::session_name_is_legal (session_name);
if (illegal) {
MessageDialog msg (*_startup,
string_compose (_("To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"),
illegal));
msg.run ();
ARDOUR_COMMAND_LINE::session_name = ""; // cancel that
continue;
}
} }
} }
/* if we run the startup dialog again, offer more than just "new session" */
should_be_new = false;
session_name = _startup->session_name (likely_new);
string::size_type suffix = session_name.find (statefile_suffix);
if (suffix != string::npos) {
session_name = session_name.substr (0, suffix);
}
/* this shouldn't happen, but we catch it just in case it does */
if (session_name.empty()) {
continue;
}
if (_startup->use_session_template()) {
template_name = _startup->session_template_name();
_session_is_new = true;
}
if (session_name[0] == G_DIR_SEPARATOR ||
(session_name.length() > 2 && session_name[0] == '.' && session_name[1] == G_DIR_SEPARATOR) ||
(session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == G_DIR_SEPARATOR)) {
/* absolute path or cwd-relative path specified for session name: infer session folder
from what was given.
*/
session_path = Glib::path_get_dirname (session_name);
session_name = Glib::path_get_basename (session_name);
} else {
session_path = _startup->session_folder();
char illegal = Session::session_name_is_legal (session_name);
if (illegal) {
MessageDialog msg (*_startup,
string_compose (_("To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"),
illegal));
msg.run ();
ARDOUR_COMMAND_LINE::session_name = ""; // cancel that
continue;
}
}
if (create_engine ()) { if (create_engine ()) {
break; break;
} }

View File

@ -44,6 +44,8 @@
#include <gtkmm/stock.h> #include <gtkmm/stock.h>
#include <gtkmm2ext/utils.h> #include <gtkmm2ext/utils.h>
#include "ardour/rc_configuration.h"
#include "pbd/convert.h" #include "pbd/convert.h"
#include "pbd/error.h" #include "pbd/error.h"
#include "pbd/pathscanner.h" #include "pbd/pathscanner.h"
@ -364,6 +366,14 @@ EngineControl::EngineControl ()
set_border_width (12); set_border_width (12);
pack_start (notebook); pack_start (notebook);
/* Pick up any existing audio setup configuration, if appropriate */
XMLNode* audio_setup = ARDOUR::Config->extra_xml ("AudioSetup");
if (audio_setup) {
set_state (*audio_setup);
}
} }
EngineControl::~EngineControl () EngineControl::~EngineControl ()
@ -579,13 +589,21 @@ EngineControl::build_command_line (vector<string>& cmd)
} }
} }
bool
EngineControl::need_setup ()
{
return !engine_running();
}
bool bool
EngineControl::engine_running () EngineControl::engine_running ()
{ {
EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa (); EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa; boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
/* revert all environment settings back to whatever they were when ardour started /* revert all environment settings back to whatever they were when
* ardour started, because ardour's startup script may have reset
* something in ways that interfere with finding/starting JACK.
*/ */
if (global_epa) { if (global_epa) {

View File

@ -39,7 +39,7 @@ class EngineControl : public Gtk::VBox {
EngineControl (); EngineControl ();
~EngineControl (); ~EngineControl ();
static bool engine_running (); static bool need_setup ();
int setup_engine (); int setup_engine ();
bool was_used() const { return _used; } bool was_used() const { return _used; }
@ -95,6 +95,8 @@ class EngineControl : public Gtk::VBox {
bool _used; bool _used;
static bool engine_running ();
void driver_changed (); void driver_changed ();
void build_command_line (std::vector<std::string>&); void build_command_line (std::vector<std::string>&);

View File

@ -63,97 +63,112 @@ static string poor_mans_glob (string path)
} }
ArdourStartup::ArdourStartup () ArdourStartup::ArdourStartup (bool require_new, const std::string& session_name, const std::string& session_path, const std::string& template_name)
: _response (RESPONSE_OK) : _response (RESPONSE_OK)
, config_modified (false)
, new_only (require_new)
, default_dir_chooser (0)
, ic_new_session_button (_("Create a new session")) , ic_new_session_button (_("Create a new session"))
, ic_existing_session_button (_("Open an existing session")) , ic_existing_session_button (_("Open an existing session"))
, monitor_via_hardware_button (_("Use an external mixer or the hardware mixer of your audio interface.\n\ , monitor_via_hardware_button (_("Use an external mixer or the hardware mixer of your audio interface.\n\
Ardour will play NO role in monitoring")) Ardour will play NO role in monitoring"))
, monitor_via_ardour_button (string_compose (_("Ask %1 to play back material as it is being recorded"), PROGRAM_NAME)) , monitor_via_ardour_button (string_compose (_("Ask %1 to play back material as it is being recorded"), PROGRAM_NAME))
, engine_dialog (0)
, new_folder_chooser (FILE_CHOOSER_ACTION_SELECT_FOLDER) , new_folder_chooser (FILE_CHOOSER_ACTION_SELECT_FOLDER)
, more_new_session_options_button (_("I'd like more options for this session")) , more_new_session_options_button (_("I'd like more options for this session"))
, _output_limit_count_adj (1, 0, 100, 1, 10, 0) , _output_limit_count_adj (1, 0, 100, 1, 10, 0)
, _input_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) , _master_bus_channel_count_adj (2, 0, 100, 1, 10, 0)
, audio_page_index (-1)
, new_user_page_index (-1)
, default_folder_page_index (-1)
, monitoring_page_index (-1)
, session_page_index (-1)
, initial_choice_index (-1)
, final_page_index (-1)
, session_options_page_index (-1)
, _existing_session_chooser_used (false) , _existing_session_chooser_used (false)
{ {
audio_page_index = -1; new_user = !Glib::file_test (been_here_before_path(), Glib::FILE_TEST_EXISTS);
initial_choice_index = -1; need_audio_setup = EngineControl::need_setup ();
new_user_page_index = -1; need_session_info = (session_name.empty() || require_new);
default_folder_page_index = -1;
monitoring_page_index = -1;
session_page_index = -1;
final_page_index = -1;
session_options_page_index = -1;
new_only = false;
engine_dialog = 0; _provided_session_name = session_name;
config_modified = false; _provided_session_path = session_path;
default_dir_chooser = 0;
if (need_audio_setup || need_session_info || new_user) {
use_template_button.set_group (session_template_group); use_template_button.set_group (session_template_group);
use_session_as_template_button.set_group (session_template_group); use_session_as_template_button.set_group (session_template_group);
set_keep_above (true);
set_position (WIN_POS_CENTER);
set_border_width (12);
if ((icon_pixbuf = ::get_icon ("ardour_icon_48px")) == 0) {
throw failed_constructor();
}
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_default_icon_list (window_icons);
}
new_user = !Glib::file_test(been_here_before_path(), Glib::FILE_TEST_EXISTS);
bool need_audio_setup = !EngineControl::engine_running();
// setup_prerelease_page ();
if (new_user) {
setup_new_user_page (); set_keep_above (true);
setup_first_time_config_page (); set_position (WIN_POS_CENTER);
setup_monitoring_choice_page (); set_border_width (12);
setup_monitor_section_choice_page ();
if ((icon_pixbuf = ::get_icon ("ardour_icon_48px")) == 0) {
if (need_audio_setup) { throw failed_constructor();
setup_audio_page (); }
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_default_icon_list (window_icons);
}
// setup_prerelease_page ();
if (new_user) {
setup_new_user_page ();
setup_first_time_config_page ();
setup_monitoring_choice_page ();
setup_monitor_section_choice_page ();
if (need_audio_setup) {
setup_audio_page ();
}
ic_new_session_button.set_active (true); // always create new session on first run
} else {
if (need_audio_setup) {
setup_audio_page ();
}
setup_initial_choice_page ();
} }
ic_new_session_button.set_active (true); // always create new session on first run setup_session_page ();
setup_more_options_page ();
} else {
if (new_user) {
if (need_audio_setup) { setup_final_page ();
setup_audio_page ();
} }
setup_initial_choice_page (); if (new_only) {
} ic_vbox.hide ();
} else {
ic_vbox.show ();
}
setup_session_page (); if (!template_name.empty()) {
setup_more_options_page (); use_template_button.set_active (false);
load_template_override = template_name;
if (new_user) { }
setup_final_page ();
} }
the_startup = this; the_startup = this;
@ -163,6 +178,12 @@ ArdourStartup::~ArdourStartup ()
{ {
} }
bool
ArdourStartup::ready_without_display () const
{
return !new_user && !need_audio_setup && !need_session_info;
}
void void
ArdourStartup::setup_prerelease_page () ArdourStartup::setup_prerelease_page ()
{ {
@ -198,25 +219,6 @@ Full information on all the above can be found on the support page at\n\
set_page_complete (*vbox, true); set_page_complete (*vbox, true);
} }
void
ArdourStartup::set_new_only (bool yn)
{
new_only = yn;
if (new_only) {
ic_vbox.hide ();
} else {
ic_vbox.show ();
}
}
void
ArdourStartup::set_load_template (string load_template)
{
use_template_button.set_active (false);
load_template_override = load_template;
}
bool bool
ArdourStartup::use_session_template () ArdourStartup::use_session_template ()
{ {
@ -235,7 +237,7 @@ std::string
ArdourStartup::session_template_name () ArdourStartup::session_template_name ()
{ {
if (!load_template_override.empty()) { if (!load_template_override.empty()) {
string the_path(ARDOUR::user_template_directory()); string the_path (ARDOUR::user_template_directory());
return Glib::build_filename (the_path, load_template_override + ARDOUR::template_suffix); return Glib::build_filename (the_path, load_template_override + ARDOUR::template_suffix);
} }
@ -257,6 +259,10 @@ ArdourStartup::session_template_name ()
std::string std::string
ArdourStartup::session_name (bool& should_be_new) ArdourStartup::session_name (bool& should_be_new)
{ {
if (ready_without_display()) {
return _provided_session_name;
}
if (ic_new_session_button.get_active()) { if (ic_new_session_button.get_active()) {
should_be_new = true; should_be_new = true;
string val = new_name_entry.get_text (); string val = new_name_entry.get_text ();
@ -283,6 +289,10 @@ ArdourStartup::session_name (bool& should_be_new)
std::string std::string
ArdourStartup::session_folder () ArdourStartup::session_folder ()
{ {
if (ready_without_display()) {
return _provided_session_path;
}
if (ic_new_session_button.get_active()) { if (ic_new_session_button.get_active()) {
std::string legal_session_folder_name = legalize_for_path (new_name_entry.get_text()); std::string legal_session_folder_name = legalize_for_path (new_name_entry.get_text());
return Glib::build_filename (new_folder_chooser.get_current_folder(), legal_session_folder_name); return Glib::build_filename (new_folder_chooser.get_current_folder(), legal_session_folder_name);

View File

@ -45,11 +45,10 @@ class EngineControl;
class ArdourStartup : public Gtk::Assistant { class ArdourStartup : public Gtk::Assistant {
public: public:
ArdourStartup (); ArdourStartup (bool require_new, const std::string& session_name, const std::string& session_path, const std::string& template_name);
~ArdourStartup (); ~ArdourStartup ();
void set_new_only (bool); bool ready_without_display () const;
void set_load_template( std::string load_template );
std::string session_name (bool& should_be_new); std::string session_name (bool& should_be_new);
std::string session_folder (); std::string session_folder ();
@ -83,7 +82,11 @@ class ArdourStartup : public Gtk::Assistant {
gint _response; gint _response;
bool config_modified; bool config_modified;
bool new_user; bool new_user;
bool need_audio_setup;
bool need_session_info;
bool new_only; bool new_only;
std::string _provided_session_name;
std::string _provided_session_path;
std::string been_here_before_path () const; std::string been_here_before_path () const;