summaryrefslogtreecommitdiff
path: root/gtk2_ardour/startup.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour/startup.cc')
-rw-r--r--gtk2_ardour/startup.cc203
1 files changed, 152 insertions, 51 deletions
diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc
index d2caf0646b..c23f69164f 100644
--- a/gtk2_ardour/startup.cc
+++ b/gtk2_ardour/startup.cc
@@ -7,6 +7,7 @@
#include "pbd/failed_constructor.h"
#include "pbd/file_utils.h"
#include "pbd/filesystem.h"
+#include "pbd/replace_all.h"
#include "ardour/filesystem_paths.h"
#include "ardour/recent_sessions.h"
@@ -15,6 +16,7 @@
#include "ardour/template_utils.h"
#include "startup.h"
+#include "opts.h"
#include "engine_dialog.h"
#include "i18n.h"
@@ -27,6 +29,14 @@ using namespace ARDOUR;
ArdourStartup* ArdourStartup::the_startup = 0;
+static string poor_mans_glob (string path)
+{
+ string copy = path;
+ replace_all (copy, "~", Glib::get_home_dir());
+ return copy;
+}
+
+
ArdourStartup::ArdourStartup ()
: applying (false)
, ic_new_session_button (_("Open a new session"))
@@ -50,11 +60,15 @@ Ardour will play NO role in monitoring"))
session_page_index = -1;
final_page_index = -1;
session_options_page_index = -1;
+ new_only = false;
engine_dialog = 0;
config_modified = false;
default_dir_chooser = 0;
+ use_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);
@@ -74,7 +88,8 @@ Ardour will play NO role in monitoring"))
sys::path been_here_before = user_config_directory();
been_here_before /= ".a3"; // XXXX use more specific version so we can catch upgrades
- bool new_user = !exists (been_here_before);
+ new_user = !exists (been_here_before);
+
bool need_audio_setup = !EngineControl::engine_running();
if (new_user) {
@@ -111,6 +126,44 @@ ArdourStartup::~ArdourStartup ()
{
}
+void
+ArdourStartup::set_new_only (bool yn)
+{
+ new_only = yn;
+
+ if (new_only) {
+ ic_vbox.hide ();
+ } else {
+ ic_vbox.show ();
+ }
+}
+
+bool
+ArdourStartup::use_session_template ()
+{
+ if (use_template_button.get_active()) {
+ return template_chooser.get_active_row_number() != 0;
+ } else {
+ return !session_template_chooser.get_filename().empty();
+ }
+}
+
+Glib::ustring
+ArdourStartup::session_template_name ()
+{
+ string ret;
+
+ if (use_template_button.get_active()) {
+ TreeModel::iterator iter = template_chooser.get_active ();
+ TreeModel::Row row = (*iter);
+ string s = row[session_template_columns.path];
+ return s;
+ } else {
+ return session_template_chooser.get_filename();
+
+ }
+}
+
Glib::ustring
ArdourStartup::session_name (bool& should_be_new)
{
@@ -226,14 +279,7 @@ Where would you like new Ardour sessions to be stored by default?\n\
vbox->pack_start (*txt, false, true);
vbox->pack_start (*hbox1, false, true);
- string def = Config->get_default_session_parent_dir();
-
- /* XXX really need glob here */
-
- if (def == "~") {
- def = Glib::get_home_dir();
- }
- default_dir_chooser->set_current_folder (def);
+ default_dir_chooser->set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
default_dir_chooser->signal_current_folder_changed().connect (mem_fun (*this, &ArdourStartup::default_dir_changed));
default_dir_chooser->show ();
@@ -409,6 +455,25 @@ ArdourStartup::on_prepare (Gtk::Widget* page)
}
void
+ArdourStartup::populate_session_templates ()
+{
+ vector<TemplateInfo> templates;
+
+ find_session_templates (templates);
+
+ template_model->clear ();
+
+ for (vector<TemplateInfo>::iterator x = templates.begin(); x != templates.end(); ++x) {
+ TreeModel::Row row;
+
+ row = *(template_model->append ());
+
+ row[session_template_columns.name] = (*x).name;
+ row[session_template_columns.path] = (*x).path;
+ }
+}
+
+void
ArdourStartup::setup_new_session_page ()
{
if (!session_hbox.get_children().empty()) {
@@ -417,6 +482,8 @@ ArdourStartup::setup_new_session_page ()
if (session_new_vbox.get_children().empty()) {
+ session_new_vbox.set_spacing (12);
+
HBox* hbox1 = manage (new HBox);
Label* label1 = manage (new Label);
@@ -429,10 +496,20 @@ ArdourStartup::setup_new_session_page ()
hbox1->show();
label1->show();
new_name_entry.show ();
+
+ if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
+ new_name_entry.set_text (Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name));
+ /* name provided - they can move right along */
+ set_page_complete (session_vbox, true);
+ }
new_name_entry.signal_changed().connect (mem_fun (*this, &ArdourStartup::new_name_changed));
new_name_entry.signal_activate().connect (mem_fun (*this, &ArdourStartup::move_along_now));
+ session_new_vbox.pack_start (*hbox1, false, false);
+
+ /* --- */
+
HBox* hbox2 = manage (new HBox);
Label* label2 = manage (new Label);
@@ -442,51 +519,79 @@ ArdourStartup::setup_new_session_page ()
label2->set_text (_("Create session folder in:"));
- string def = Config->get_default_session_parent_dir();
-
- /* XXX really need glob here */
-
- if (def == "~") {
- def = Glib::get_home_dir();
+ 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)));
+ } else {
+ new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
}
-
- new_folder_chooser.set_current_folder (def);
new_folder_chooser.set_title (_("Select folder for session"));
hbox2->show();
label2->show();
new_folder_chooser.show ();
-
- if (is_directory (user_template_directory ())) {
- session_template_chooser.set_current_folder (user_template_directory().to_string());
- } else if (is_directory (system_template_directory ())) {
- session_template_chooser.set_current_folder (system_template_directory().to_string());
- } else {
- /* hmm, no templates ... what to do? */
+
+ session_new_vbox.pack_start (*hbox2, false, false);
+
+ /* --- */
+
+ template_model = ListStore::create (session_template_columns);
+ populate_session_templates ();
+
+ if (!template_model->children().empty()) {
+
+ HBox* hbox3 = manage (new HBox);
+ use_template_button.set_label (_("Use this template"));
+
+ TreeModel::Row row = *template_model->prepend ();
+ row[session_template_columns.name] = (_("no template"));
+ row[session_template_columns.path] = string();
+
+ hbox3->set_spacing (6);
+ hbox3->pack_start (use_template_button, false, false);
+ hbox3->pack_start (template_chooser, true, true);
+
+ template_chooser.set_model (template_model);
+
+ Gtk::CellRendererText* text_renderer = Gtk::manage (new Gtk::CellRendererText);
+ text_renderer->property_editable() = false;
+
+ template_chooser.pack_start (*text_renderer);
+ template_chooser.add_attribute (text_renderer->property_text(), session_template_columns.name);
+ template_chooser.set_active (0);
+
+ hbox3->show ();
+ use_template_button.show();
+ template_chooser.show ();
+
+ session_new_vbox.pack_start (*hbox3, false, false);
}
-
- if (is_directory (system_template_directory ())) {
- session_template_chooser.add_shortcut_folder (system_template_directory().to_string());
+
+ /* --- */
+
+ if (!new_user) {
+ session_template_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
+
+ HBox* hbox3a = manage (new HBox);
+ use_session_as_template_button.set_label (_("Use an existing session as a template:"));
+
+ hbox3a->set_spacing (6);
+ hbox3a->pack_start (use_session_as_template_button, false, false);
+ hbox3a->pack_start (session_template_chooser, true, true);
+
+ hbox3a->show ();
+ use_session_as_template_button.show ();
+ session_template_chooser.show ();
+
+ Gtk::FileFilter* template_filter = manage (new (Gtk::FileFilter));
+ template_filter->add_pattern(X_("*.template"));
+ session_template_chooser.set_filter (*template_filter);
+ session_template_chooser.set_title (_("Select template"));
+
+ session_new_vbox.pack_start (*hbox3a, false, false);
}
-
- HBox* hbox3 = manage (new HBox);
- Label* label3 = manage (new Label);
-
- hbox3->set_spacing (6);
- hbox3->pack_start (*label3, false, false);
- hbox3->pack_start (session_template_chooser, true, true);
-
- label3->set_text (_("Use this template:"));
-
- hbox3->show ();
- label3->show ();
- session_template_chooser.show ();
-
- Gtk::FileFilter* template_filter = manage (new (Gtk::FileFilter));
- template_filter->add_pattern(X_("*.template"));
- session_template_chooser.set_filter (*template_filter);
- session_template_chooser.set_title (_("Select template"));
-
+
+
+ /* --- */
HBox* hbox4 = manage (new HBox);
@@ -496,11 +601,7 @@ ArdourStartup::setup_new_session_page ()
hbox4->show ();
more_new_session_options_button.show ();
more_new_session_options_button.signal_clicked().connect (mem_fun (*this, &ArdourStartup::more_new_session_options_button_clicked));
- session_new_vbox.set_spacing (12);
-
- session_new_vbox.pack_start (*hbox1, false, false);
- session_new_vbox.pack_start (*hbox2, false, false);
- session_new_vbox.pack_start (*hbox3, false, false);
+
session_new_vbox.pack_start (*hbox4, false, false);
}