X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fstartup.cc;h=7f7dbe8f32df6f5b94788eee779a14cf9e9598d9;hb=611dcdd24932222d676da4d9a4dca643f79db4a4;hp=c3d699ec2f7f2c4ddefca4c5a0894a9df524af73;hpb=39ebb427b3125c9c48c37d0cf05a27267efeb6a3;p=ardour.git diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index c3d699ec2f..7f7dbe8f32 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -29,7 +29,6 @@ #include "pbd/failed_constructor.h" #include "pbd/file_utils.h" -#include "pbd/filesystem.h" #include "pbd/replace_all.h" #include "pbd/whitespace.h" @@ -38,7 +37,9 @@ #include "ardour/session.h" #include "ardour/session_state_utils.h" #include "ardour/template_utils.h" +#include "ardour/filename_extensions.h" +#include "ardour_ui.h" #include "startup.h" #include "opts.h" #include "engine_dialog.h" @@ -64,11 +65,11 @@ static string poor_mans_glob (string path) ArdourStartup::ArdourStartup () : _response (RESPONSE_OK) - , ic_new_session_button (_("Open a new session")) + , ic_new_session_button (_("Create a new 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\ Ardour will play NO role in monitoring")) - , monitor_via_ardour_button (string_compose (_("Ask %1 to playback 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)) , new_folder_chooser (FILE_CHOOSER_ACTION_SELECT_FOLDER) , more_new_session_options_button (_("I'd like more options for this session")) , _output_limit_count_adj (1, 0, 100, 1, 10, 0) @@ -94,7 +95,6 @@ Ardour will play NO role in monitoring")) use_session_as_template_button.set_group (session_template_group); set_keep_above (true); - set_resizable (false); set_position (WIN_POS_CENTER); set_border_width (12); @@ -102,15 +102,33 @@ Ardour will play NO role in monitoring")) throw failed_constructor(); } - sys::path been_here_before = user_config_directory(); - been_here_before /= ".a3"; // XXXX use more specific version so we can catch upgrades - new_user = !exists (been_here_before); + list > window_icons; + Glib::RefPtr 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) { - /* "touch" the file */ - ofstream fout (been_here_before.to_string().c_str()); + setup_new_user_page (); setup_first_time_config_page (); setup_monitoring_choice_page (); @@ -120,6 +138,8 @@ Ardour will play NO role in monitoring")) setup_audio_page (); } + ic_new_session_button.set_active (true); // always create new session on first run + } else { if (need_audio_setup) { @@ -143,6 +163,41 @@ ArdourStartup::~ArdourStartup () { } +void +ArdourStartup::setup_prerelease_page () +{ + VBox* vbox = manage (new VBox); + Label* label = manage (new Label); + label->set_markup (_("Welcome to this BETA release of Ardour 3.0\n\n\ +There are still several issues and bugs to be worked on,\n\ +as well as general workflow improvements, before this can be considered\n\ +release software. So, a few guidelines:\n\ +\n\ +1) Please do NOT use this software with the expectation that it is stable or reliable\n\ + though it may be so, depending on your workflow.\n\ +2) Please see http://ardour.org/a3_features for a guide to new features.\n\ +3) Please do NOT use the forums at ardour.org to report issues.\n\ +4) Please DO use the bugtracker at http://tracker.ardour.org/ to report issues\n\ + making sure to note the product version number as 3.0-beta.\n\ +5) Please DO use the ardour-users mailing list to discuss ideas and pass on comments.\n\ +6) Please DO join us on IRC for real time discussions about ardour3. You\n\ + can get there directly from Ardour via the Help->Chat menu option.\n\ +\n\ +Full information on all the above can be found on the support page at\n\ +\n\ + http://ardour.org/support\n\ +")); + + vbox->set_border_width (12); + vbox->pack_start (*label, false, false, 12); + vbox->show_all (); + + append_page (*vbox); + set_page_type (*vbox, ASSISTANT_PAGE_CONTENT); + set_page_title (*vbox, _("This is a BETA RELEASE")); + set_page_complete (*vbox, true); +} + void ArdourStartup::set_new_only (bool yn) { @@ -156,17 +211,18 @@ ArdourStartup::set_new_only (bool yn) } void -ArdourStartup::set_load_template( string load_template ) +ArdourStartup::set_load_template (string load_template) { - use_template_button.set_active( false ); - load_template_override = load_template; + use_template_button.set_active (false); + load_template_override = load_template; } bool ArdourStartup::use_session_template () { - if (!load_template_override.empty()) + if (!load_template_override.empty()) { return true; + } if (use_template_button.get_active()) { return template_chooser.get_active_row_number() > 0; @@ -179,8 +235,8 @@ std::string ArdourStartup::session_template_name () { if (!load_template_override.empty()) { - string the_path = (ARDOUR::user_template_directory()/ (load_template_override + ".template")).to_string(); - return the_path; + string the_path(ARDOUR::user_template_directory()); + return Glib::build_filename (the_path, load_template_override + ARDOUR::template_suffix); } if (ic_existing_session_button.get_active()) { @@ -268,14 +324,16 @@ ArdourStartup::setup_new_user_page () Label* foomatic = manage (new Label); foomatic->set_markup (string_compose (_("\ -%1 is a digital audio workstation. You can use it to\n\ -record, edit and mix multi-track audio. You can produce your\n\ -own CDs, mix video soundtracks, or just experiment with new\n\ -ideas about music and sound.\n\ -\n\ -There are a few things that need to configured before you start\n\ -using the program.\ +%1 is a digital audio workstation. You can use it to \ +record, edit and mix multi-track audio. You can produce your \ +own CDs, mix video soundtracks, or experiment with new \ +ideas about music and sound. \ +\n\n\ +There are a few things that need to be configured before you start \ +using the program. \ "), PROGRAM_NAME)); + foomatic->set_justify (JUSTIFY_FILL); + foomatic->set_line_wrap (); HBox* hbox = manage (new HBox); HBox* vbox = manage (new HBox); @@ -299,7 +357,9 @@ using the program.\ void ArdourStartup::default_dir_changed () { - Config->set_default_session_parent_dir (default_dir_chooser->get_current_folder()); + Config->set_default_session_parent_dir (default_dir_chooser->get_filename()); + // make new session folder chooser point to the new default + new_folder_chooser.set_current_folder (Config->get_default_session_parent_dir()); config_changed (); } @@ -366,7 +426,8 @@ signal as well as record it. This is called \"monitoring\". There are\n\ different ways to do this depending on the equipment you have and the\n\ configuration of that equipment. The two most common are presented here.\n\ Please choose whichever one is right for your setup.\n\n\ -(You can change this preference at any time, via the Preferences dialog)")); +(You can change this preference at any time, via the Preferences dialog)\n\n\ +If you do not understand what this is about, just accept the default.")); monitor_label.set_alignment (0.0, 0.0); vbox->set_spacing (6); @@ -405,8 +466,7 @@ ArdourStartup::setup_monitor_section_choice_page () no_monitor_section_button.set_label (_("Use a Master bus directly")); l->set_alignment (0.0, 1.0); - l->set_markup(_("Connect the Master bus directly to your hardware outputs.\n\ -Preferable for simple use.")); + l->set_markup(_("Connect the Master bus directly to your hardware outputs. This is preferable for simple usage.")); vbox = manage (new VBox); vbox->set_spacing (6); @@ -440,7 +500,8 @@ greater control in monitoring without affecting the mix.")); use_monitor_section_button.signal_toggled().connect (sigc::mem_fun (*this, &ArdourStartup::config_changed)); no_monitor_section_button.signal_toggled().connect (sigc::mem_fun (*this, &ArdourStartup::config_changed)); - monitor_section_label.set_markup(_("(You can change this preference at any time, via the Preferences dialog)")); + monitor_section_label.set_markup(_("You can change this preference at any time via the Preferences dialog.\nYou can also add or remove the monitor section to/from any session.\n\n\ +If you do not understand what this is about, just accept the default.")); monitor_section_label.set_alignment (0.0, 0.0); hbox->pack_start (*main_vbox, true, true, 8); @@ -477,10 +538,10 @@ ArdourStartup::setup_initial_choice_page () centering_vbox->pack_start (ic_new_session_button, false, true); centering_vbox->pack_start (ic_existing_session_button, false, true); - ic_new_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_press), false); + ic_new_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_clicked), false); ic_new_session_button.signal_activate().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_activated), false); - ic_existing_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_press), false); + ic_existing_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_clicked), false); ic_existing_session_button.signal_activate().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_activated), false); centering_hbox->pack_start (*centering_vbox, true, true); @@ -501,20 +562,21 @@ ArdourStartup::setup_initial_choice_page () } bool -ArdourStartup::initial_button_press (GdkEventButton *event) +ArdourStartup::initial_button_clicked (GdkEventButton* ev) { - if (event && event->type == GDK_2BUTTON_PRESS && session_page_index != -1) { + if (ev->type == GDK_2BUTTON_PRESS && session_page_index != -1) { set_current_page(session_page_index); - return true; - } else { - return false; } + + return false; } void ArdourStartup::initial_button_activated () { - set_current_page(session_page_index); + if (session_page_index != -1) { + set_current_page(session_page_index); + } } void @@ -560,13 +622,16 @@ void ArdourStartup::on_apply () { if (engine_dialog) { - engine_dialog->setup_engine (); + if (engine_dialog->setup_engine ()) { + set_current_page (audio_page_index); + return; + } } if (config_modified) { if (default_dir_chooser) { - Config->set_default_session_parent_dir (default_dir_chooser->get_current_folder()); + Config->set_default_session_parent_dir (default_dir_chooser->get_filename()); } if (monitor_via_hardware_button.get_active()) { @@ -577,6 +642,9 @@ ArdourStartup::on_apply () Config->set_use_monitor_bus (use_monitor_section_button.get_active()); + /* "touch" the been-here-before path now that we're about to save Config */ + ofstream fout (been_here_before_path().c_str()); + Config->save_state (); } @@ -595,6 +663,26 @@ ArdourStartup::on_prepare (Gtk::Widget* page) } else { /* existing session requested */ setup_existing_session_page (); + + } + + /* HACK HACK HACK ... change the "Apply" button label + to say "Open" + */ + + Gtk::Widget* tl = session_vbox.get_toplevel(); + Gtk::Window* win; + if ((win = dynamic_cast(tl)) != 0) { + /* ::get_default_widget() is not wrapped in gtkmm */ + Gtk::Widget* def = wrap (gtk_window_get_default_widget (win->gobj())); + Gtk::Button* button; + if ((button = dynamic_cast(def)) != 0) { + if (more_new_session_options_button.get_active()) { + button->set_label (_("Forward")); + }else{ + button->set_label (_("Open")); + } + } } } } @@ -621,7 +709,7 @@ ArdourStartup::populate_session_templates () static bool lost_name_entry_focus (GdkEventFocus*) { - cerr << "lost focus\n"; + // cerr << "lost focus\n"; return false; } @@ -672,6 +760,13 @@ ArdourStartup::setup_new_session_page () 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 if (ARDOUR_UI::instance()->session_loaded) { + // point the new session file chooser at the parent directory of the current session + string session_parent_dir = Glib::path_get_dirname(ARDOUR_UI::instance()->the_session()->path()); + string::size_type last_dir_sep = session_parent_dir.rfind(G_DIR_SEPARATOR); + session_parent_dir = session_parent_dir.substr(0, last_dir_sep); + new_folder_chooser.set_current_folder (session_parent_dir); + new_folder_chooser.add_shortcut_folder (poor_mans_glob (Config->get_default_session_parent_dir())); } else { new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir())); } @@ -747,9 +842,9 @@ ArdourStartup::setup_new_session_page () 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); + Gtk::FileFilter* session_filter = manage (new (Gtk::FileFilter)); + session_filter->add_pattern (X_("*.ardour")); + session_template_chooser.set_filter (*session_filter); session_template_chooser.set_title (_("Select template")); vbox3->pack_start (*hbox4b, false, false); @@ -779,6 +874,10 @@ ArdourStartup::setup_new_session_page () set_page_title (session_vbox, _("New Session")); set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM); + if (more_new_session_options_button.get_active()) { + set_page_type (session_vbox, ASSISTANT_PAGE_CONTENT); + } + new_name_entry.signal_map().connect (sigc::mem_fun (*this, &ArdourStartup::new_name_mapped)); new_name_entry.signal_focus_out_event().connect (sigc::ptr_fun (lost_name_entry_focus)); } @@ -786,7 +885,7 @@ ArdourStartup::setup_new_session_page () void ArdourStartup::new_name_mapped () { - cerr << "Grab new name focus\n"; + // cerr << "Grab new name focus\n"; new_name_entry.grab_focus (); } @@ -803,7 +902,7 @@ ArdourStartup::new_name_changed () int ArdourStartup::redisplay_recent_sessions () { - std::vector session_directories; + std::vector session_directories; RecentSessionsSorter cmp; recent_session_display.set_model (Glib::RefPtr(0)); @@ -824,9 +923,9 @@ ArdourStartup::redisplay_recent_sessions () session_directories.push_back ((*i).second); } - for (vector::const_iterator i = session_directories.begin(); i != session_directories.end(); ++i) + for (vector::const_iterator i = session_directories.begin(); i != session_directories.end(); ++i) { - std::vector state_file_paths; + std::vector state_file_paths; // now get available states for this session @@ -834,7 +933,7 @@ ArdourStartup::redisplay_recent_sessions () vector* states; vector item; - string fullpath = (*i).to_string(); + string fullpath = *i; /* remove any trailing / */ @@ -878,6 +977,7 @@ ArdourStartup::redisplay_recent_sessions () } } + recent_session_display.set_tooltip_column(1); // recent_session_columns.fullpath recent_session_display.set_model (recent_session_model); return rs.size(); } @@ -908,19 +1008,19 @@ ArdourStartup::setup_existing_session_page () recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name); recent_session_display.set_headers_visible (false); recent_session_display.get_selection()->set_mode (SELECTION_BROWSE); - + recent_session_display.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::recent_session_row_selected)); - + recent_scroller.add (recent_session_display); recent_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); recent_scroller.set_shadow_type (Gtk::SHADOW_IN); - + recent_session_display.show(); - + recent_scroller.show(); int cnt = redisplay_recent_sessions (); recent_session_display.signal_row_activated().connect (sigc::mem_fun (*this, &ArdourStartup::recent_row_activated)); - + if (cnt > 4) { recent_scroller.set_size_request (-1, 300); } @@ -930,19 +1030,26 @@ ArdourStartup::setup_existing_session_page () existing_session_chooser.set_title (_("Select session file")); existing_session_chooser.signal_file_set().connect (sigc::mem_fun (*this, &ArdourStartup::existing_session_selected)); + existing_session_chooser.set_current_folder(poor_mans_glob (Config->get_default_session_parent_dir())); + + FileFilter session_filter; + session_filter.add_pattern ("*.ardour"); + session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME)); + existing_session_chooser.add_filter (session_filter); + existing_session_chooser.set_filter (session_filter); #ifdef GTKOSX existing_session_chooser.add_shortcut_folder ("/Volumes"); #endif - + HBox* hbox = manage (new HBox); hbox->set_spacing (4); hbox->pack_start (*manage (new Label (_("Browse:"))), PACK_SHRINK); hbox->pack_start (existing_session_chooser); - session_existing_vbox.pack_start (*hbox); + session_existing_vbox.pack_start (*hbox, false, false); hbox->show_all (); } - + session_existing_vbox.show_all (); session_hbox.pack_start (session_existing_vbox, true, true); @@ -1012,7 +1119,7 @@ ArdourStartup::setup_more_options_page () _connect_inputs.set_flags(Gtk::CAN_FOCUS); _connect_inputs.set_relief(Gtk::RELIEF_NORMAL); _connect_inputs.set_mode(true); - _connect_inputs.set_active(true); + _connect_inputs.set_active(Config->get_input_auto_connect() != ManualConnect); _connect_inputs.set_border_width(0); _limit_input_ports.set_label (_("Use only")); @@ -1072,7 +1179,7 @@ ArdourStartup::setup_more_options_page () _connect_outputs.set_flags(Gtk::CAN_FOCUS); _connect_outputs.set_relief(Gtk::RELIEF_NORMAL); _connect_outputs.set_mode(true); - _connect_outputs.set_active(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); @@ -1094,7 +1201,7 @@ ArdourStartup::setup_more_options_page () _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(false); + _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); @@ -1104,7 +1211,7 @@ ArdourStartup::setup_more_options_page () _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(false); + _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); @@ -1286,3 +1393,10 @@ ArdourStartup::existing_session_selected () set_page_complete (session_vbox, true); move_along_now (); } + +std::string +ArdourStartup::been_here_before_path () const +{ + // XXXX use more specific version so we can catch upgrades + return Glib::build_filename (user_config_directory (), ".a3"); +}