2010-07-25 21:55:08 -04:00
/*
Copyright ( C ) 2010 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 0213 9 , USA .
*/
2010-11-13 00:14:48 -05:00
# ifdef WAF_BUILD
# include "gtk2ardour-config.h"
# endif
2009-04-20 14:41:46 -04:00
# include <fstream>
2009-03-04 18:06:18 -05:00
# include <algorithm>
# include <gtkmm/main.h>
2009-03-15 18:17:03 -04:00
# include <gtkmm/filechooser.h>
2009-03-04 18:06:18 -05:00
# include "pbd/failed_constructor.h"
# include "pbd/file_utils.h"
# include "pbd/filesystem.h"
2009-04-21 21:35:31 -04:00
# include "pbd/replace_all.h"
2010-09-14 11:45:21 -04:00
# include "pbd/whitespace.h"
2009-03-04 18:06:18 -05:00
# include "ardour/filesystem_paths.h"
# include "ardour/recent_sessions.h"
# include "ardour/session.h"
# include "ardour/session_state_utils.h"
# include "ardour/template_utils.h"
# include "startup.h"
2009-04-21 21:35:31 -04:00
# include "opts.h"
2009-04-20 14:41:46 -04:00
# include "engine_dialog.h"
2009-03-04 18:06:18 -05:00
# include "i18n.h"
2010-09-19 13:10:43 -04:00
# include "utils.h"
2009-03-04 18:06:18 -05:00
using namespace std ;
using namespace Gtk ;
using namespace Gdk ;
using namespace Glib ;
using namespace PBD ;
using namespace ARDOUR ;
ArdourStartup * ArdourStartup : : the_startup = 0 ;
2009-04-21 21:35:31 -04:00
static string poor_mans_glob ( string path )
{
string copy = path ;
replace_all ( copy , " ~ " , Glib : : get_home_dir ( ) ) ;
return copy ;
}
2009-10-14 12:10:01 -04:00
2009-04-21 21:35:31 -04:00
2009-03-04 18:06:18 -05:00
ArdourStartup : : ArdourStartup ( )
2009-12-01 08:23:27 -05:00
: _response ( RESPONSE_OK )
2012-01-17 21:22:37 -05:00
, ic_new_session_button ( _ ( " Create a new session " ) )
2009-03-04 18:06:18 -05:00
, ic_existing_session_button ( _ ( " Open an existing session " ) )
2009-04-15 14:04:23 -04:00
, monitor_via_hardware_button ( _ ( " Use an external mixer or the hardware mixer of your audio interface. \n \
Ardour will play NO role in monitoring " ))
2012-01-17 21:22:37 -05:00
, monitor_via_ardour_button ( string_compose ( _ ( " Ask %1 to play back material as it is being recorded " ) , PROGRAM_NAME ) )
2009-03-15 18:17:03 -04:00
, new_folder_chooser ( FILE_CHOOSER_ACTION_SELECT_FOLDER )
2009-04-29 12:01:11 -04:00
, more_new_session_options_button ( _ ( " I'd like more options for this session " ) )
2009-04-20 14:41:46 -04:00
, _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 )
2010-07-25 21:55:08 -04:00
, _existing_session_chooser_used ( false )
2009-03-04 18:06:18 -05:00
{
2009-04-20 14:41:46 -04:00
audio_page_index = - 1 ;
initial_choice_index = - 1 ;
new_user_page_index = - 1 ;
default_folder_page_index = - 1 ;
monitoring_page_index = - 1 ;
session_page_index = - 1 ;
final_page_index = - 1 ;
session_options_page_index = - 1 ;
2009-04-21 21:35:31 -04:00
new_only = false ;
2009-04-20 14:41:46 -04:00
engine_dialog = 0 ;
config_modified = false ;
default_dir_chooser = 0 ;
2009-04-21 21:35:31 -04:00
use_template_button . set_group ( session_template_group ) ;
use_session_as_template_button . set_group ( session_template_group ) ;
2009-03-04 18:06:18 -05:00
set_keep_above ( true ) ;
2009-06-25 16:46:39 -04:00
set_resizable ( false ) ;
2009-03-04 18:06:18 -05:00
set_position ( WIN_POS_CENTER ) ;
2009-05-17 20:26:45 -04:00
set_border_width ( 12 ) ;
2009-10-14 12:10:01 -04:00
2010-09-19 13:10:43 -04:00
if ( ( icon_pixbuf = : : get_icon ( " ardour_icon_48px " ) ) = = 0 ) {
2009-03-04 18:06:18 -05:00
throw failed_constructor ( ) ;
}
2011-11-07 19:31:04 -05:00
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 ) ;
}
2011-11-07 20:43:44 -05:00
new_user = ! exists ( been_here_before_path ( ) ) ;
2009-04-21 21:35:31 -04:00
2009-04-20 14:41:46 -04:00
bool need_audio_setup = ! EngineControl : : engine_running ( ) ;
2011-11-11 15:09:14 -05:00
setup_prerelease_page ( ) ;
2011-03-13 14:17:42 -04:00
2009-04-20 14:41:46 -04:00
if ( new_user ) {
2011-07-31 09:58:32 -04:00
/* Create the config directory so that we have somewhere to put the
been_here_before file .
*/
try {
sys : : create_directories ( user_config_directory ( ) ) ;
}
catch ( const sys : : filesystem_error & ex ) {
error < < " Could not create user configuration directory " < < endmsg ;
}
2009-03-04 18:06:18 -05:00
setup_new_user_page ( ) ;
setup_first_time_config_page ( ) ;
2009-04-15 14:04:23 -04:00
setup_monitoring_choice_page ( ) ;
2010-03-21 23:22:28 -04:00
setup_monitor_section_choice_page ( ) ;
2009-04-20 14:41:46 -04:00
if ( need_audio_setup ) {
setup_audio_page ( ) ;
}
2009-03-04 18:06:18 -05:00
} else {
2009-04-20 14:41:46 -04:00
if ( need_audio_setup ) {
setup_audio_page ( ) ;
}
2009-03-04 18:06:18 -05:00
setup_initial_choice_page ( ) ;
}
setup_session_page ( ) ;
setup_more_options_page ( ) ;
2009-04-20 14:41:46 -04:00
if ( new_user ) {
setup_final_page ( ) ;
}
2009-03-04 18:06:18 -05:00
the_startup = this ;
}
ArdourStartup : : ~ ArdourStartup ( )
{
}
2011-03-13 14:17:42 -04:00
void
2011-11-11 15:09:14 -05:00
ArdourStartup : : setup_prerelease_page ( )
2011-03-13 14:17:42 -04:00
{
VBox * vbox = manage ( new VBox ) ;
Label * label = manage ( new Label ) ;
2011-11-11 15:09:14 -05:00
label - > set_markup ( _ ( " <b>Welcome to this BETA release of Ardour 3.0</b> \n \n \
There are still several issues and bugs to be worked on , \ n \
2011-03-13 14:17:42 -04:00
as well as general workflow improvements , before this can be considered \ n \
release software . So , a few guidelines : \ n \
\ n \
1 ) Please do < b > NOT < / b > 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 ) < b > Please do NOT use the forums at ardour . org to report issues < / b > . \ n \
4 ) Please < b > DO < / b > use the bugtracker at http : / / tracker . ardour . org / to report issues \ n \
2011-11-18 17:42:36 -05:00
making sure to note the product version number as 3.0 - beta . \ n \
2011-03-13 14:17:42 -04:00
5 ) Please < b > DO < / b > use the ardour - users mailing list to discuss ideas and pass on comments . \ n \
6 ) Please < b > DO < / b > 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 ) ;
2011-11-16 11:31:19 -05:00
set_page_title ( * vbox , _ ( " This is a BETA RELEASE " ) ) ;
2011-03-13 14:17:42 -04:00
set_page_complete ( * vbox , true ) ;
}
2009-04-21 21:35:31 -04:00
void
ArdourStartup : : set_new_only ( bool yn )
{
new_only = yn ;
if ( new_only ) {
ic_vbox . hide ( ) ;
} else {
ic_vbox . show ( ) ;
}
}
2010-06-02 10:36:10 -04:00
void
2011-01-30 07:46:57 -05:00
ArdourStartup : : set_load_template ( string load_template )
2010-06-02 10:36:10 -04:00
{
2011-01-30 07:46:57 -05:00
use_template_button . set_active ( false ) ;
load_template_override = load_template ;
2010-06-02 10:36:10 -04:00
}
2009-04-21 21:35:31 -04:00
bool
ArdourStartup : : use_session_template ( )
{
2011-01-30 07:46:57 -05:00
if ( ! load_template_override . empty ( ) ) {
2010-11-25 15:37:39 -05:00
return true ;
2011-01-30 07:46:57 -05:00
}
2010-06-02 10:36:10 -04:00
2009-04-21 21:35:31 -04:00
if ( use_template_button . get_active ( ) ) {
2009-04-30 14:17:02 -04:00
return template_chooser . get_active_row_number ( ) > 0 ;
2009-04-21 21:35:31 -04:00
} else {
return ! session_template_chooser . get_filename ( ) . empty ( ) ;
}
}
2010-09-14 12:51:02 -04:00
std : : string
2009-04-21 21:35:31 -04:00
ArdourStartup : : session_template_name ( )
{
2010-11-25 15:37:39 -05:00
if ( ! load_template_override . empty ( ) ) {
string the_path = ( ARDOUR : : user_template_directory ( ) / ( load_template_override + " .template " ) ) . to_string ( ) ;
return the_path ;
}
2010-06-02 10:36:10 -04:00
2009-04-23 15:28:17 -04:00
if ( ic_existing_session_button . get_active ( ) ) {
2010-09-14 12:51:02 -04:00
return string ( ) ;
2009-04-23 15:28:17 -04:00
}
2009-04-21 21:35:31 -04:00
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 ( ) ;
}
}
2010-09-14 12:51:02 -04:00
std : : string
2009-04-20 14:41:46 -04:00
ArdourStartup : : session_name ( bool & should_be_new )
{
if ( ic_new_session_button . get_active ( ) ) {
should_be_new = true ;
2010-09-14 11:45:21 -04:00
string val = new_name_entry . get_text ( ) ;
2010-11-25 15:37:39 -05:00
strip_whitespace_edges ( val ) ;
return val ;
2010-07-25 21:55:08 -04:00
} else if ( _existing_session_chooser_used ) {
/* existing session chosen from file chooser */
should_be_new = false ;
return existing_session_chooser . get_filename ( ) ;
2009-04-20 14:41:46 -04:00
} else {
2010-07-25 21:55:08 -04:00
/* existing session chosen from recent list */
2009-04-20 14:41:46 -04:00
should_be_new = false ;
TreeIter iter = recent_session_display . get_selection ( ) - > get_selected ( ) ;
2009-10-14 12:10:01 -04:00
2009-04-20 14:41:46 -04:00
if ( iter ) {
return ( * iter ) [ recent_session_columns . visible_name ] ;
}
return " " ;
}
}
2010-09-14 12:51:02 -04:00
std : : string
2009-04-20 14:41:46 -04:00
ArdourStartup : : session_folder ( )
{
if ( ic_new_session_button . get_active ( ) ) {
2010-09-14 12:51:02 -04:00
std : : string legal_session_folder_name = legalize_for_path ( new_name_entry . get_text ( ) ) ;
2009-07-12 20:26:28 -04:00
return Glib : : build_filename ( new_folder_chooser . get_current_folder ( ) , legal_session_folder_name ) ;
2010-07-25 21:55:08 -04:00
} else if ( _existing_session_chooser_used ) {
/* existing session chosen from file chooser */
return existing_session_chooser . get_current_folder ( ) ;
2009-04-20 14:41:46 -04:00
} else {
2010-07-25 21:55:08 -04:00
/* existing session chosen from recent list */
2009-04-20 14:41:46 -04:00
TreeIter iter = recent_session_display . get_selection ( ) - > get_selected ( ) ;
if ( iter ) {
return ( * iter ) [ recent_session_columns . fullpath ] ;
2009-10-14 12:10:01 -04:00
}
2009-04-20 14:41:46 -04:00
return " " ;
}
}
void
ArdourStartup : : setup_audio_page ( )
{
engine_dialog = manage ( new EngineControl ) ;
2009-06-25 16:46:39 -04:00
engine_dialog - > set_border_width ( 12 ) ;
2009-04-20 14:41:46 -04:00
engine_dialog - > show_all ( ) ;
audio_page_index = append_page ( * engine_dialog ) ;
set_page_type ( * engine_dialog , ASSISTANT_PAGE_CONTENT ) ;
2010-07-23 19:29:19 -04:00
set_page_title ( * engine_dialog , _ ( " Audio / MIDI Setup " ) ) ;
2009-10-14 12:10:01 -04:00
2009-04-20 14:41:46 -04:00
/* the default parameters should work, so the page is potentially complete */
set_page_complete ( * engine_dialog , true ) ;
}
2009-03-04 18:06:18 -05:00
void
ArdourStartup : : setup_new_user_page ( )
{
2009-04-20 14:41:46 -04:00
Label * foomatic = manage ( new Label ) ;
2010-03-14 22:31:27 -04:00
foomatic - > set_markup ( string_compose ( _ ( " \
2011-12-08 07:05:32 -05:00
< span size = \ " larger \" >%1 is a digital audio workstation. You can use it to \
record , edit and mix multi - track audio . You can produce your \
2012-01-18 11:56:05 -05:00
own CDs , mix video soundtracks , or experiment with new \
2011-12-08 07:05:32 -05:00
ideas about music and sound . \
\ n \ n \
There are a few things that need to be configured before you start \
using the program . < / span > \
2010-03-14 22:31:27 -04:00
" ), PROGRAM_NAME));
2011-12-08 07:05:32 -05:00
foomatic - > set_justify ( JUSTIFY_FILL ) ;
foomatic - > set_line_wrap ( ) ;
2009-10-14 12:10:01 -04:00
2009-03-04 18:06:18 -05:00
HBox * hbox = manage ( new HBox ) ;
HBox * vbox = manage ( new HBox ) ;
2009-06-25 16:46:39 -04:00
vbox - > set_border_width ( 24 ) ;
2009-03-04 18:06:18 -05:00
2009-06-25 16:46:39 -04:00
hbox - > pack_start ( * foomatic , true , true ) ;
vbox - > pack_start ( * hbox , true , true ) ;
2009-03-04 18:06:18 -05:00
foomatic - > show ( ) ;
hbox - > show ( ) ;
vbox - > show ( ) ;
2009-04-20 14:41:46 -04:00
new_user_page_index = append_page ( * vbox ) ;
2009-03-04 18:06:18 -05:00
set_page_type ( * vbox , ASSISTANT_PAGE_INTRO ) ;
2010-08-16 20:28:20 -04:00
set_page_title ( * vbox , string_compose ( _ ( " Welcome to %1 " ) , PROGRAM_NAME ) ) ;
2009-03-04 18:06:18 -05:00
set_page_header_image ( * vbox , icon_pixbuf ) ;
set_page_complete ( * vbox , true ) ;
}
2009-04-20 14:41:46 -04:00
void
ArdourStartup : : default_dir_changed ( )
{
2011-08-03 07:14:31 -04:00
Config - > set_default_session_parent_dir ( default_dir_chooser - > get_filename ( ) ) ;
2010-11-25 15:37:39 -05:00
config_changed ( ) ;
2010-03-21 23:46:09 -04:00
}
void
ArdourStartup : : config_changed ( )
{
2009-04-20 14:41:46 -04:00
config_modified = true ;
}
2009-03-04 18:06:18 -05:00
void
ArdourStartup : : setup_first_time_config_page ( )
{
2010-03-14 22:31:27 -04:00
default_dir_chooser = manage ( new FileChooserButton ( string_compose ( _ ( " Default folder for %1 sessions " ) , PROGRAM_NAME ) ,
2009-04-20 14:41:46 -04:00
FILE_CHOOSER_ACTION_SELECT_FOLDER ) ) ;
2009-03-04 18:06:18 -05:00
Gtk : : Label * txt = manage ( new Label ) ;
2009-06-25 16:46:39 -04:00
HBox * hbox = manage ( new HBox ) ;
2009-03-04 18:06:18 -05:00
VBox * vbox = manage ( new VBox ) ;
2009-10-14 12:10:01 -04:00
2010-08-16 20:28:20 -04:00
txt - > set_markup ( string_compose ( _ ( " \
Each project that you work on with % 1 has its own folder . \ n \
2009-03-04 18:06:18 -05:00
These can require a lot of disk space if you are recording audio . \ n \
\ n \
2010-08-16 20:28:20 -04:00
Where would you like new % 1 sessions to be stored by default ? \ n \ n \
< i > ( You can put new sessions anywhere , this is just a default ) < / i > " ), PROGRAM_NAME));
2009-06-25 16:46:39 -04:00
txt - > set_alignment ( 0.0 , 0.0 ) ;
2009-03-04 18:06:18 -05:00
2009-06-25 16:46:39 -04:00
vbox - > set_spacing ( 18 ) ;
vbox - > set_border_width ( 24 ) ;
2009-03-04 18:06:18 -05:00
2009-06-25 16:46:39 -04:00
hbox - > pack_start ( * default_dir_chooser , false , true , 8 ) ;
vbox - > pack_start ( * txt , false , false ) ;
vbox - > pack_start ( * hbox , false , true ) ;
2009-03-04 18:06:18 -05:00
2009-04-21 21:35:31 -04:00
default_dir_chooser - > set_current_folder ( poor_mans_glob ( Config - > get_default_session_parent_dir ( ) ) ) ;
2009-12-11 18:29:48 -05:00
default_dir_chooser - > signal_current_folder_changed ( ) . connect ( sigc : : mem_fun ( * this , & ArdourStartup : : default_dir_changed ) ) ;
2009-04-20 14:41:46 -04:00
default_dir_chooser - > show ( ) ;
2009-06-25 16:46:39 -04:00
vbox - > show_all ( ) ;
2009-03-04 18:06:18 -05:00
2009-04-20 14:41:46 -04:00
default_folder_page_index = append_page ( * vbox ) ;
2009-03-04 18:06:18 -05:00
set_page_title ( * vbox , _ ( " Default folder for new sessions " ) ) ;
set_page_header_image ( * vbox , icon_pixbuf ) ;
set_page_type ( * vbox , ASSISTANT_PAGE_CONTENT ) ;
/* user can just skip all these settings if they want to */
set_page_complete ( * vbox , true ) ;
}
2009-04-15 14:04:23 -04:00
void
ArdourStartup : : setup_monitoring_choice_page ( )
{
2009-06-25 16:46:39 -04:00
mon_vbox . set_spacing ( 18 ) ;
mon_vbox . set_border_width ( 24 ) ;
2009-10-14 12:10:01 -04:00
2009-06-25 16:46:39 -04:00
HBox * hbox = manage ( new HBox ) ;
VBox * vbox = manage ( new VBox ) ;
2009-04-15 14:04:23 -04:00
RadioButton : : Group g ( monitor_via_hardware_button . get_group ( ) ) ;
monitor_via_ardour_button . set_group ( g ) ;
2010-12-16 16:25:17 -05:00
monitor_label . set_markup ( _ ( " \
2009-04-15 14:04:23 -04:00
While recording instruments or vocals , you probably want to listen to the \ n \
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 \
2012-01-18 19:14:05 -05:00
< i > ( You can change this preference at any time , via the Preferences dialog ) < / i > \ n \ n \
< i > If you do not understand what this is about , just accept the default . < / i > " ));
2009-06-25 16:46:39 -04:00
monitor_label . set_alignment ( 0.0 , 0.0 ) ;
vbox - > set_spacing ( 6 ) ;
2009-04-15 14:04:23 -04:00
2009-06-25 16:46:39 -04:00
vbox - > pack_start ( monitor_via_hardware_button , false , true ) ;
vbox - > pack_start ( monitor_via_ardour_button , false , true ) ;
hbox - > pack_start ( * vbox , true , true , 8 ) ;
2009-04-20 14:41:46 -04:00
mon_vbox . pack_start ( monitor_label , false , false ) ;
2009-06-25 16:46:39 -04:00
mon_vbox . pack_start ( * hbox , false , false ) ;
2009-04-15 14:04:23 -04:00
2009-06-25 16:46:39 -04:00
mon_vbox . show_all ( ) ;
2009-04-15 14:04:23 -04:00
2009-04-20 14:41:46 -04:00
monitoring_page_index = append_page ( mon_vbox ) ;
2009-04-15 14:04:23 -04:00
set_page_title ( mon_vbox , _ ( " Monitoring Choices " ) ) ;
set_page_header_image ( mon_vbox , icon_pixbuf ) ;
/* user could just click on "Forward" if default
* choice is correct .
*/
set_page_complete ( mon_vbox , true ) ;
}
2010-03-21 23:22:28 -04:00
void
ArdourStartup : : setup_monitor_section_choice_page ( )
{
mon_sec_vbox . set_spacing ( 18 ) ;
mon_sec_vbox . set_border_width ( 24 ) ;
HBox * hbox = manage ( new HBox ) ;
2010-06-29 16:39:44 -04:00
VBox * main_vbox = manage ( new VBox ) ;
VBox * vbox ;
2010-11-25 15:37:39 -05:00
Label * l = manage ( new Label ) ;
2010-06-29 16:39:44 -04:00
main_vbox - > set_spacing ( 32 ) ;
2010-11-25 15:37:39 -05:00
no_monitor_section_button . set_label ( _ ( " Use a Master bus directly " ) ) ;
l - > set_alignment ( 0.0 , 1.0 ) ;
2012-01-18 19:14:05 -05:00
l - > set_markup ( _ ( " Connect the Master bus directly to your hardware outputs. This is preferable for simple usage. " ) ) ;
2010-06-29 16:39:44 -04:00
2010-11-25 15:37:39 -05:00
vbox = manage ( new VBox ) ;
2010-06-29 16:39:44 -04:00
vbox - > set_spacing ( 6 ) ;
vbox - > pack_start ( no_monitor_section_button , false , true ) ;
vbox - > pack_start ( * l , false , true ) ;
2010-11-25 15:37:39 -05:00
main_vbox - > pack_start ( * vbox , false , false ) ;
2010-06-29 16:39:44 -04:00
2010-11-25 15:37:39 -05:00
use_monitor_section_button . set_label ( _ ( " Use an additional Monitor bus " ) ) ;
l = manage ( new Label ) ;
l - > set_alignment ( 0.0 , 1.0 ) ;
l - > set_text ( _ ( " Use a Monitor bus between Master bus and hardware outputs for \n \
2010-06-29 16:39:44 -04:00
greater control in monitoring without affecting the mix . " ));
2010-11-25 15:37:39 -05:00
vbox = manage ( new VBox ) ;
2010-06-29 16:39:44 -04:00
vbox - > set_spacing ( 6 ) ;
vbox - > pack_start ( use_monitor_section_button , false , true ) ;
vbox - > pack_start ( * l , false , true ) ;
2010-11-25 15:37:39 -05:00
main_vbox - > pack_start ( * vbox , false , false ) ;
2010-06-29 16:39:44 -04:00
2010-03-21 23:22:28 -04:00
RadioButton : : Group g ( use_monitor_section_button . get_group ( ) ) ;
no_monitor_section_button . set_group ( g ) ;
2010-03-21 23:46:09 -04:00
2010-11-25 15:37:39 -05:00
if ( Config - > get_use_monitor_bus ( ) ) {
use_monitor_section_button . set_active ( true ) ;
} else {
no_monitor_section_button . set_active ( true ) ;
}
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 ) ) ;
2010-03-21 23:46:09 -04:00
2012-01-18 19:14:05 -05:00
monitor_section_label . set_markup ( _ ( " <i>You can change this preference at any time, via the Preferences dialog). You can also add or remove the monitor section to/from any session.</i> \n \n \
< i > If you do not understand what this is about , just accept the default . < / i > " ));
2010-03-21 23:22:28 -04:00
monitor_section_label . set_alignment ( 0.0 , 0.0 ) ;
2010-06-29 16:39:44 -04:00
hbox - > pack_start ( * main_vbox , true , true , 8 ) ;
2010-03-21 23:22:28 -04:00
mon_sec_vbox . pack_start ( * hbox , false , false ) ;
2010-06-29 16:39:44 -04:00
mon_sec_vbox . pack_start ( monitor_section_label , false , false ) ;
2010-03-21 23:22:28 -04:00
mon_sec_vbox . show_all ( ) ;
monitor_section_page_index = append_page ( mon_sec_vbox ) ;
set_page_title ( mon_sec_vbox , _ ( " Monitor Section " ) ) ;
set_page_header_image ( mon_sec_vbox , icon_pixbuf ) ;
/* user could just click on "Forward" if default
* choice is correct .
*/
set_page_complete ( mon_sec_vbox , true ) ;
}
2009-03-04 18:06:18 -05:00
void
ArdourStartup : : setup_initial_choice_page ( )
{
ic_vbox . set_spacing ( 6 ) ;
2009-06-25 16:46:39 -04:00
ic_vbox . set_border_width ( 24 ) ;
2009-03-04 18:06:18 -05:00
RadioButton : : Group g ( ic_new_session_button . get_group ( ) ) ;
ic_existing_session_button . set_group ( g ) ;
2009-04-20 14:41:46 -04:00
HBox * centering_hbox = manage ( new HBox ) ;
VBox * centering_vbox = manage ( new VBox ) ;
2009-10-14 12:10:01 -04:00
2009-06-25 16:46:39 -04:00
centering_vbox - > set_spacing ( 6 ) ;
2009-04-20 14:41:46 -04:00
centering_vbox - > pack_start ( ic_new_session_button , false , true ) ;
centering_vbox - > pack_start ( ic_existing_session_button , false , true ) ;
2009-12-01 08:23:27 -05:00
2009-12-11 18:29:48 -05:00
ic_new_session_button . signal_button_press_event ( ) . connect ( sigc : : mem_fun ( * this , & ArdourStartup : : initial_button_press ) , false ) ;
ic_new_session_button . signal_activate ( ) . connect ( sigc : : mem_fun ( * this , & ArdourStartup : : initial_button_activated ) , false ) ;
2009-12-01 08:23:27 -05:00
2009-12-11 18:29:48 -05:00
ic_existing_session_button . signal_button_press_event ( ) . connect ( sigc : : mem_fun ( * this , & ArdourStartup : : initial_button_press ) , false ) ;
ic_existing_session_button . signal_activate ( ) . connect ( sigc : : mem_fun ( * this , & ArdourStartup : : initial_button_activated ) , false ) ;
2009-04-20 14:41:46 -04:00
centering_hbox - > pack_start ( * centering_vbox , true , true ) ;
ic_vbox . pack_start ( * centering_hbox , true , true ) ;
2009-03-04 18:06:18 -05:00
2009-06-25 16:46:39 -04:00
ic_vbox . show_all ( ) ;
2009-03-04 18:06:18 -05:00
2009-04-20 14:41:46 -04:00
initial_choice_index = append_page ( ic_vbox ) ;
2009-06-25 16:46:39 -04:00
set_page_title ( ic_vbox , _ ( " What would you like to do ? " ) ) ;
2009-03-04 18:06:18 -05:00
set_page_header_image ( ic_vbox , icon_pixbuf ) ;
/* user could just click on "Forward" if default
* choice is correct .
*/
set_page_complete ( ic_vbox , true ) ;
}
2009-10-06 18:07:10 -04:00
bool
2009-12-01 08:23:27 -05:00
ArdourStartup : : initial_button_press ( GdkEventButton * event )
{
2010-08-27 20:52:27 -04:00
if ( event & & event - > type = = GDK_2BUTTON_PRESS & & session_page_index ! = - 1 ) {
2009-12-01 08:23:27 -05:00
set_current_page ( session_page_index ) ;
return true ;
} else {
return false ;
}
}
void
ArdourStartup : : initial_button_activated ( )
2009-10-06 18:07:10 -04:00
{
2009-12-01 08:23:27 -05:00
set_current_page ( session_page_index ) ;
2009-10-06 18:07:10 -04:00
}
2009-03-04 18:06:18 -05:00
void
ArdourStartup : : setup_session_page ( )
{
2009-06-25 16:46:39 -04:00
session_vbox . set_border_width ( 24 ) ;
2009-03-04 18:06:18 -05:00
session_vbox . pack_start ( session_hbox , true , true ) ;
2009-06-25 16:46:39 -04:00
session_vbox . show_all ( ) ;
2009-03-04 18:06:18 -05:00
2009-04-20 14:41:46 -04:00
session_page_index = append_page ( session_vbox ) ;
/* initial setting */
set_page_type ( session_vbox , ASSISTANT_PAGE_CONFIRM ) ;
2009-03-04 18:06:18 -05:00
}
void
ArdourStartup : : setup_final_page ( )
{
2010-03-14 22:31:27 -04:00
final_page . set_text ( string_compose ( _ ( " %1 is ready for use " ) , PROGRAM_NAME ) ) ;
2009-03-04 18:06:18 -05:00
final_page . show ( ) ;
2009-04-20 14:41:46 -04:00
final_page_index = append_page ( final_page ) ;
2009-03-04 18:06:18 -05:00
set_page_complete ( final_page , true ) ;
set_page_header_image ( final_page , icon_pixbuf ) ;
set_page_type ( final_page , ASSISTANT_PAGE_CONFIRM ) ;
}
void
ArdourStartup : : on_cancel ( )
{
2009-12-01 08:23:27 -05:00
_response = RESPONSE_CANCEL ;
2009-10-19 14:12:20 -04:00
gtk_main_quit ( ) ;
2009-03-04 18:06:18 -05:00
}
2009-12-01 08:23:27 -05:00
bool
ArdourStartup : : on_delete_event ( GdkEventAny * )
2009-03-04 18:06:18 -05:00
{
2009-12-01 08:23:27 -05:00
_response = RESPONSE_CLOSE ;
2009-10-19 14:12:20 -04:00
gtk_main_quit ( ) ;
2009-12-01 08:23:27 -05:00
return true ;
2009-03-04 18:06:18 -05:00
}
void
ArdourStartup : : on_apply ( )
{
2009-04-20 14:41:46 -04:00
if ( engine_dialog ) {
engine_dialog - > setup_engine ( ) ;
}
if ( config_modified ) {
if ( default_dir_chooser ) {
2011-08-03 07:14:31 -04:00
Config - > set_default_session_parent_dir ( default_dir_chooser - > get_filename ( ) ) ;
2009-04-20 14:41:46 -04:00
}
2009-10-14 12:10:01 -04:00
2009-04-20 14:41:46 -04:00
if ( monitor_via_hardware_button . get_active ( ) ) {
Config - > set_monitoring_model ( ExternalMonitoring ) ;
} else if ( monitor_via_ardour_button . get_active ( ) ) {
Config - > set_monitoring_model ( SoftwareMonitoring ) ;
}
2009-10-14 12:10:01 -04:00
2010-11-25 15:37:39 -05:00
Config - > set_use_monitor_bus ( use_monitor_section_button . get_active ( ) ) ;
2010-03-21 23:46:09 -04:00
2011-11-07 20:43:44 -05:00
/* "touch" the been-here-before path now that we're about to save Config */
ofstream fout ( been_here_before_path ( ) . to_string ( ) . c_str ( ) ) ;
2009-04-20 14:41:46 -04:00
Config - > save_state ( ) ;
}
2009-12-01 08:23:27 -05:00
_response = RESPONSE_OK ;
2009-03-04 18:06:18 -05:00
gtk_main_quit ( ) ;
}
void
ArdourStartup : : on_prepare ( Gtk : : Widget * page )
{
if ( page = = & session_vbox ) {
2009-10-14 12:10:01 -04:00
2009-03-04 18:06:18 -05:00
if ( ic_new_session_button . get_active ( ) ) {
/* new session requested */
setup_new_session_page ( ) ;
} else {
/* existing session requested */
setup_existing_session_page ( ) ;
2011-06-21 18:16:07 -04:00
}
/* 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 < Gtk : : Window * > ( 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 < Gtk : : Button * > ( def ) ) ! = 0 ) {
2011-08-09 15:05:29 -04:00
if ( more_new_session_options_button . get_active ( ) ) {
button - > set_label ( _ ( " Forward " ) ) ;
} else {
button - > set_label ( _ ( " Open " ) ) ;
}
2011-06-21 18:16:07 -04:00
}
2009-03-04 18:06:18 -05:00
}
2009-10-14 12:10:01 -04:00
}
2009-03-04 18:06:18 -05:00
}
2009-04-21 21:35:31 -04:00
void
ArdourStartup : : populate_session_templates ( )
{
vector < TemplateInfo > templates ;
2009-10-14 12:10:01 -04:00
2009-04-21 21:35:31 -04:00
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 ( ) ) ;
2009-10-14 12:10:01 -04:00
2009-04-21 21:35:31 -04:00
row [ session_template_columns . name ] = ( * x ) . name ;
row [ session_template_columns . path ] = ( * x ) . path ;
}
}
2010-03-23 08:19:21 -04:00
static bool
2010-09-02 13:01:36 -04:00
lost_name_entry_focus ( GdkEventFocus * )
2010-03-23 08:19:21 -04:00
{
2010-11-25 15:37:39 -05:00
cerr < < " lost focus \n " ;
return false ;
2010-03-23 08:19:21 -04:00
}
2010-11-25 15:37:39 -05:00
2009-03-04 18:06:18 -05:00
void
ArdourStartup : : setup_new_session_page ( )
{
if ( ! session_hbox . get_children ( ) . empty ( ) ) {
session_hbox . remove ( * * session_hbox . get_children ( ) . begin ( ) ) ;
}
2009-06-25 16:46:39 -04:00
session_new_vbox . set_spacing ( 18 ) ;
2009-04-21 21:35:31 -04:00
2009-06-25 16:46:39 -04:00
if ( session_new_vbox . get_children ( ) . empty ( ) ) {
VBox * vbox1 = manage ( new VBox ) ;
2009-03-04 18:06:18 -05:00
HBox * hbox1 = manage ( new HBox ) ;
Label * label1 = manage ( new Label ) ;
2009-10-14 12:10:01 -04:00
2009-06-25 16:46:39 -04:00
vbox1 - > set_spacing ( 6 ) ;
2009-03-04 18:06:18 -05:00
hbox1 - > set_spacing ( 6 ) ;
hbox1 - > pack_start ( * label1 , false , false ) ;
hbox1 - > pack_start ( new_name_entry , true , true ) ;
2009-10-14 12:10:01 -04:00
2009-03-04 18:06:18 -05:00
label1 - > set_text ( _ ( " Session name: " ) ) ;
2009-10-14 12:10:01 -04:00
2009-04-21 21:35:31 -04:00
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 ) ;
}
2009-10-14 12:10:01 -04:00
2009-12-11 18:29:48 -05:00
new_name_entry . signal_changed ( ) . connect ( sigc : : mem_fun ( * this , & ArdourStartup : : new_name_changed ) ) ;
new_name_entry . signal_activate ( ) . connect ( sigc : : mem_fun ( * this , & ArdourStartup : : move_along_now ) ) ;
2009-10-14 12:10:01 -04:00
2009-06-25 16:46:39 -04:00
vbox1 - > pack_start ( * hbox1 , true , true ) ;
2009-04-21 21:35:31 -04:00
/* --- */
2009-03-04 18:06:18 -05:00
HBox * hbox2 = manage ( new HBox ) ;
Label * label2 = manage ( new Label ) ;
2009-10-14 12:10:01 -04:00
2009-03-04 18:06:18 -05:00
hbox2 - > set_spacing ( 6 ) ;
hbox2 - > pack_start ( * label2 , false , false ) ;
hbox2 - > pack_start ( new_folder_chooser , true , true ) ;
2009-10-14 12:10:01 -04:00
2009-03-04 18:06:18 -05:00
label2 - > set_text ( _ ( " Create session folder in: " ) ) ;
2009-10-14 12:10:01 -04:00
2009-04-21 21:35:31 -04:00
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 ( ) ) ) ;
2009-04-20 14:41:46 -04:00
}
2009-03-04 18:06:18 -05:00
new_folder_chooser . set_title ( _ ( " Select folder for session " ) ) ;
2009-04-21 21:35:31 -04:00
2010-08-16 20:28:20 -04:00
# ifdef GTKOSX
2010-11-25 15:37:39 -05:00
new_folder_chooser . add_shortcut_folder ( " /Volumes " ) ;
2010-08-16 20:28:20 -04:00
# endif
2009-06-25 16:46:39 -04:00
vbox1 - > pack_start ( * hbox2 , false , false ) ;
session_new_vbox . pack_start ( * vbox1 , false , false ) ;
2009-04-21 21:35:31 -04:00
/* --- */
2009-06-25 16:46:39 -04:00
VBox * vbox2 = manage ( new VBox ) ;
HBox * hbox3 = manage ( new HBox ) ;
Label * label3 = manage ( new Label ) ;
2009-04-21 21:35:31 -04:00
template_model = ListStore : : create ( session_template_columns ) ;
populate_session_templates ( ) ;
2009-06-25 16:46:39 -04:00
vbox2 - > set_spacing ( 6 ) ;
2009-10-14 12:10:01 -04:00
2009-06-25 16:46:39 -04:00
label3 - > set_markup ( _ ( " <b>Options</b> " ) ) ;
label3 - > set_alignment ( 0.0 , 0.0 ) ;
vbox2 - > pack_start ( * label3 , false , true ) ;
VBox * vbox3 = manage ( new VBox ) ;
vbox3 - > set_spacing ( 6 ) ;
2009-04-21 21:35:31 -04:00
if ( ! template_model - > children ( ) . empty ( ) ) {
2009-06-25 16:46:39 -04:00
HBox * hbox4a = manage ( new HBox ) ;
2009-04-21 21:35:31 -04:00
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 ( ) ;
2009-06-25 16:46:39 -04:00
hbox4a - > set_spacing ( 6 ) ;
hbox4a - > pack_start ( use_template_button , false , false ) ;
hbox4a - > pack_start ( template_chooser , true , true ) ;
2009-10-14 12:10:01 -04:00
2009-04-21 21:35:31 -04:00
template_chooser . set_model ( template_model ) ;
2009-10-14 12:10:01 -04:00
2009-04-21 21:35:31 -04:00
Gtk : : CellRendererText * text_renderer = Gtk : : manage ( new Gtk : : CellRendererText ) ;
text_renderer - > property_editable ( ) = false ;
2009-10-14 12:10:01 -04:00
2009-04-21 21:35:31 -04:00
template_chooser . pack_start ( * text_renderer ) ;
template_chooser . add_attribute ( text_renderer - > property_text ( ) , session_template_columns . name ) ;
template_chooser . set_active ( 0 ) ;
2009-10-14 12:10:01 -04:00
2009-04-21 21:35:31 -04:00
use_template_button . show ( ) ;
template_chooser . show ( ) ;
2009-06-25 16:46:39 -04:00
vbox3 - > pack_start ( * hbox4a , false , false ) ;
2009-03-04 18:06:18 -05:00
}
2009-10-14 12:10:01 -04:00
2009-04-21 21:35:31 -04:00
/* --- */
if ( ! new_user ) {
session_template_chooser . set_current_folder ( poor_mans_glob ( Config - > get_default_session_parent_dir ( ) ) ) ;
2009-10-14 12:10:01 -04:00
2009-06-25 16:46:39 -04:00
HBox * hbox4b = manage ( new HBox ) ;
2009-04-21 21:35:31 -04:00
use_session_as_template_button . set_label ( _ ( " Use an existing session as a template: " ) ) ;
2009-10-14 12:10:01 -04:00
2009-06-25 16:46:39 -04:00
hbox4b - > set_spacing ( 6 ) ;
hbox4b - > pack_start ( use_session_as_template_button , false , false ) ;
hbox4b - > pack_start ( session_template_chooser , true , true ) ;
2009-10-14 12:10:01 -04:00
2009-04-21 21:35:31 -04:00
use_session_as_template_button . show ( ) ;
session_template_chooser . show ( ) ;
2009-10-14 12:10:01 -04:00
2011-02-17 09:06:42 -05:00
Gtk : : FileFilter * session_filter = manage ( new ( Gtk : : FileFilter ) ) ;
session_filter - > add_pattern ( X_ ( " *.ardour " ) ) ;
session_template_chooser . set_filter ( * session_filter ) ;
2009-04-21 21:35:31 -04:00
session_template_chooser . set_title ( _ ( " Select template " ) ) ;
2009-06-25 16:46:39 -04:00
vbox3 - > pack_start ( * hbox4b , false , false ) ;
2009-03-04 18:06:18 -05:00
}
2009-04-21 21:35:31 -04:00
/* --- */
2009-10-14 12:10:01 -04:00
2009-06-25 16:46:39 -04:00
HBox * hbox5 = manage ( new HBox ) ;
2009-10-14 12:10:01 -04:00
2009-06-25 16:46:39 -04:00
hbox5 - > set_spacing ( 6 ) ;
hbox5 - > pack_start ( more_new_session_options_button , false , false ) ;
2009-10-14 12:10:01 -04:00
2009-03-04 18:06:18 -05:00
more_new_session_options_button . show ( ) ;
2009-12-11 18:29:48 -05:00
more_new_session_options_button . signal_clicked ( ) . connect ( sigc : : mem_fun ( * this , & ArdourStartup : : more_new_session_options_button_clicked ) ) ;
2009-04-21 21:35:31 -04:00
2009-06-25 16:46:39 -04:00
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 ) ;
2009-03-04 18:06:18 -05:00
}
2009-06-25 16:46:39 -04:00
session_new_vbox . show_all ( ) ;
session_hbox . pack_start ( session_new_vbox , true , true ) ;
2009-03-04 18:06:18 -05:00
set_page_title ( session_vbox , _ ( " New Session " ) ) ;
2009-04-20 14:41:46 -04:00
set_page_type ( session_vbox , ASSISTANT_PAGE_CONFIRM ) ;
2011-08-09 15:05:29 -04:00
if ( more_new_session_options_button . get_active ( ) ) {
set_page_type ( session_vbox , ASSISTANT_PAGE_CONTENT ) ;
}
2010-03-23 08:19:21 -04:00
new_name_entry . signal_map ( ) . connect ( sigc : : mem_fun ( * this , & ArdourStartup : : new_name_mapped ) ) ;
2010-11-25 15:37:39 -05:00
new_name_entry . signal_focus_out_event ( ) . connect ( sigc : : ptr_fun ( lost_name_entry_focus ) ) ;
2010-03-23 08:19:21 -04:00
}
void
ArdourStartup : : new_name_mapped ( )
{
2010-11-25 15:37:39 -05:00
cerr < < " Grab new name focus \n " ;
2009-04-20 14:41:46 -04:00
new_name_entry . grab_focus ( ) ;
2009-03-04 18:06:18 -05:00
}
void
ArdourStartup : : new_name_changed ( )
{
if ( ! new_name_entry . get_text ( ) . empty ( ) ) {
set_page_complete ( session_vbox , true ) ;
} else {
set_page_complete ( session_vbox , false ) ;
}
}
2009-12-01 08:23:27 -05:00
int
2009-03-04 18:06:18 -05:00
ArdourStartup : : redisplay_recent_sessions ( )
{
std : : vector < sys : : path > session_directories ;
RecentSessionsSorter cmp ;
2009-10-14 12:10:01 -04:00
2009-03-04 18:06:18 -05:00
recent_session_display . set_model ( Glib : : RefPtr < TreeModel > ( 0 ) ) ;
recent_session_model - > clear ( ) ;
ARDOUR : : RecentSessions rs ;
ARDOUR : : read_recent_sessions ( rs ) ;
if ( rs . empty ( ) ) {
recent_session_display . set_model ( recent_session_model ) ;
2009-12-01 08:23:27 -05:00
return 0 ;
2009-03-04 18:06:18 -05:00
}
//
// sort them alphabetically
sort ( rs . begin ( ) , rs . end ( ) , cmp ) ;
2009-10-14 12:10:01 -04:00
2009-03-04 18:06:18 -05:00
for ( ARDOUR : : RecentSessions : : iterator i = rs . begin ( ) ; i ! = rs . end ( ) ; + + i ) {
2010-11-25 15:37:39 -05:00
session_directories . push_back ( ( * i ) . second ) ;
2009-03-04 18:06:18 -05:00
}
2009-10-14 12:10:01 -04:00
2009-04-20 14:41:46 -04:00
for ( vector < sys : : path > : : const_iterator i = session_directories . begin ( ) ; i ! = session_directories . end ( ) ; + + i )
2009-03-04 18:06:18 -05:00
{
std : : vector < sys : : path > state_file_paths ;
2009-04-20 14:41:46 -04:00
2009-03-04 18:06:18 -05:00
// now get available states for this session
get_state_files_in_directory ( * i , state_file_paths ) ;
vector < string * > * states ;
vector < const gchar * > item ;
string fullpath = ( * i ) . to_string ( ) ;
2009-10-14 12:10:01 -04:00
2009-03-04 18:06:18 -05:00
/* 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 . c_str ( ) , Glib : : FILE_TEST_EXISTS ) ) {
/* session doesn't exist */
continue ;
2009-10-14 12:10:01 -04:00
}
2009-03-04 18:06:18 -05:00
/* now get available states for this session */
if ( ( states = Session : : possible_states ( fullpath ) ) = = 0 ) {
/* no state file? */
continue ;
}
2009-10-14 12:10:01 -04:00
2009-03-04 18:06:18 -05:00
std : : vector < string > state_file_names ( get_file_names_no_extension ( state_file_paths ) ) ;
Gtk : : TreeModel : : Row row = * ( recent_session_model - > append ( ) ) ;
row [ recent_session_columns . visible_name ] = Glib : : path_get_basename ( fullpath ) ;
row [ recent_session_columns . fullpath ] = fullpath ;
2009-10-14 12:10:01 -04:00
2009-03-04 18:06:18 -05:00
if ( state_file_names . size ( ) > 1 ) {
// add the children
for ( std : : vector < std : : string > : : iterator i2 = state_file_names . begin ( ) ;
i2 ! = state_file_names . end ( ) ; + + i2 )
{
Gtk : : TreeModel : : Row child_row = * ( recent_session_model - > append ( row . children ( ) ) ) ;
child_row [ recent_session_columns . visible_name ] = * i2 ;
child_row [ recent_session_columns . fullpath ] = fullpath ;
}
}
}
recent_session_display . set_model ( recent_session_model ) ;
2009-12-01 08:23:27 -05:00
return rs . size ( ) ;
2009-03-04 18:06:18 -05:00
}
void
ArdourStartup : : recent_session_row_selected ( )
{
if ( recent_session_display . get_selection ( ) - > count_selected_rows ( ) > 0 ) {
set_page_complete ( session_vbox , true ) ;
} else {
set_page_complete ( session_vbox , false ) ;
}
}
void
ArdourStartup : : setup_existing_session_page ( )
{
2010-07-25 21:55:08 -04:00
recent_session_model = TreeStore : : create ( recent_session_columns ) ;
redisplay_recent_sessions ( ) ;
2009-10-14 12:10:01 -04:00
2010-08-26 22:01:40 -04:00
if ( ! session_hbox . get_children ( ) . empty ( ) ) {
session_hbox . remove ( * * session_hbox . get_children ( ) . begin ( ) ) ;
}
2010-08-27 20:52:27 -04:00
if ( session_existing_vbox . get_children ( ) . empty ( ) ) {
2009-03-04 18:06:18 -05:00
2010-08-27 20:52:27 -04:00
recent_session_display . set_model ( recent_session_model ) ;
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 ) ;
2011-06-01 13:00:29 -04:00
2010-08-27 20:52:27 -04:00
recent_session_display . get_selection ( ) - > signal_changed ( ) . connect ( sigc : : mem_fun ( * this , & ArdourStartup : : recent_session_row_selected ) ) ;
2011-06-01 13:00:29 -04:00
2010-08-27 20:52:27 -04:00
recent_scroller . add ( recent_session_display ) ;
recent_scroller . set_policy ( Gtk : : POLICY_NEVER , Gtk : : POLICY_AUTOMATIC ) ;
recent_scroller . set_shadow_type ( Gtk : : SHADOW_IN ) ;
2011-06-01 13:00:29 -04:00
2010-08-27 20:52:27 -04:00
recent_session_display . show ( ) ;
2011-06-01 13:00:29 -04:00
2010-08-27 20:52:27 -04:00
recent_scroller . show ( ) ;
int cnt = redisplay_recent_sessions ( ) ;
recent_session_display . signal_row_activated ( ) . connect ( sigc : : mem_fun ( * this , & ArdourStartup : : recent_row_activated ) ) ;
2011-06-01 13:00:29 -04:00
2010-08-27 20:52:27 -04:00
if ( cnt > 4 ) {
recent_scroller . set_size_request ( - 1 , 300 ) ;
}
2009-12-01 08:23:27 -05:00
2010-08-27 20:52:27 -04:00
session_existing_vbox . set_spacing ( 8 ) ;
session_existing_vbox . pack_start ( recent_scroller , true , true ) ;
2010-07-25 21:55:08 -04:00
2010-08-27 20:52:27 -04:00
existing_session_chooser . set_title ( _ ( " Select session file " ) ) ;
existing_session_chooser . signal_file_set ( ) . connect ( sigc : : mem_fun ( * this , & ArdourStartup : : existing_session_selected ) ) ;
2011-06-01 13:00:29 -04:00
2010-08-20 18:36:35 -04:00
# ifdef GTKOSX
2010-11-13 00:14:48 -05:00
existing_session_chooser . add_shortcut_folder ( " /Volumes " ) ;
2010-08-20 18:36:35 -04:00
# endif
2011-06-01 13:00:29 -04:00
2010-08-27 20:52:27 -04:00
HBox * hbox = manage ( new HBox ) ;
hbox - > set_spacing ( 4 ) ;
hbox - > pack_start ( * manage ( new Label ( _ ( " Browse: " ) ) ) , PACK_SHRINK ) ;
hbox - > pack_start ( existing_session_chooser ) ;
2011-02-06 12:24:34 -05:00
session_existing_vbox . pack_start ( * hbox , false , false ) ;
2010-08-27 20:52:27 -04:00
hbox - > show_all ( ) ;
}
2011-06-01 13:00:29 -04:00
2010-08-27 20:52:27 -04:00
session_existing_vbox . show_all ( ) ;
session_hbox . pack_start ( session_existing_vbox , true , true ) ;
2010-07-25 21:55:08 -04:00
2009-03-04 18:06:18 -05:00
set_page_title ( session_vbox , _ ( " Select a session " ) ) ;
set_page_type ( session_vbox , ASSISTANT_PAGE_CONFIRM ) ;
}
void
ArdourStartup : : more_new_session_options_button_clicked ( )
{
if ( more_new_session_options_button . get_active ( ) ) {
2009-04-20 14:41:46 -04:00
more_options_vbox . show_all ( ) ;
set_page_type ( more_options_vbox , ASSISTANT_PAGE_CONFIRM ) ;
set_page_type ( session_vbox , ASSISTANT_PAGE_CONTENT ) ;
2009-03-04 18:06:18 -05:00
} else {
2009-04-20 14:41:46 -04:00
set_page_type ( session_vbox , ASSISTANT_PAGE_CONFIRM ) ;
2009-03-04 18:06:18 -05:00
more_options_vbox . hide ( ) ;
}
}
void
ArdourStartup : : setup_more_options_page ( )
{
2009-06-25 16:46:39 -04:00
more_options_vbox . set_border_width ( 24 ) ;
2009-03-04 18:06:18 -05:00
2009-04-20 14:41:46 -04:00
_output_limit_count . set_adjustment ( _output_limit_count_adj ) ;
_input_limit_count . set_adjustment ( _input_limit_count_adj ) ;
_master_bus_channel_count . set_adjustment ( _master_bus_channel_count_adj ) ;
2009-10-14 12:10:01 -04:00
2009-04-20 14:41:46 -04:00
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 ) ;
2009-10-14 12:10:01 -04:00
2009-04-20 14:41:46 -04:00
_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 ) ;
2011-07-19 19:12:42 -04:00
_connect_inputs . set_active ( Config - > get_input_auto_connect ( ) ! = ManualConnect ) ;
2009-04-20 14:41:46 -04:00
_connect_inputs . set_border_width ( 0 ) ;
2009-10-14 12:10:01 -04:00
2009-04-20 14:41:46 -04:00
_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 ) ;
2009-10-14 12:10:01 -04:00
2009-04-20 14:41:46 -04:00
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 ) ;
2011-07-19 19:12:42 -04:00
_connect_outputs . set_active ( Config - > get_output_auto_connect ( ) ! = ManualConnect ) ;
2009-04-20 14:41:46 -04:00
_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 ) ;
2011-07-19 19:12:42 -04:00
_connect_outputs_to_master . set_active ( Config - > get_output_auto_connect ( ) = = AutoConnectMaster ) ;
2009-04-20 14:41:46 -04:00
_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 ) ;
2011-07-19 19:12:42 -04:00
_connect_outputs_to_physical . set_active ( Config - > get_output_auto_connect ( ) = = AutoConnectPhysical ) ;
2009-04-20 14:41:46 -04:00
_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 */
2009-12-11 18:29:48 -05:00
_connect_inputs . signal_clicked ( ) . connect ( sigc : : mem_fun ( * this , & ArdourStartup : : connect_inputs_clicked ) ) ;
_connect_outputs . signal_clicked ( ) . connect ( sigc : : mem_fun ( * this , & ArdourStartup : : connect_outputs_clicked ) ) ;
_limit_input_ports . signal_clicked ( ) . connect ( sigc : : mem_fun ( * this , & ArdourStartup : : limit_inputs_clicked ) ) ;
_limit_output_ports . signal_clicked ( ) . connect ( sigc : : mem_fun ( * this , & ArdourStartup : : limit_outputs_clicked ) ) ;
_create_master_bus . signal_clicked ( ) . connect ( sigc : : mem_fun ( * this , & ArdourStartup : : master_bus_button_clicked ) ) ;
2009-03-04 18:06:18 -05:00
/* note that more_options_vbox is NOT visible by
* default . this is entirely by design - this page
* should be skipped unless explicitly requested .
*/
2009-10-14 12:10:01 -04:00
2009-04-20 14:41:46 -04:00
session_options_page_index = append_page ( more_options_vbox ) ;
2009-03-04 18:06:18 -05:00
set_page_title ( more_options_vbox , _ ( " Advanced Session Options " ) ) ;
set_page_complete ( more_options_vbox , true ) ;
}
2009-04-20 14:41:46 -04:00
bool
ArdourStartup : : create_master_bus ( ) const
{
return _create_master_bus . get_active ( ) ;
}
int
ArdourStartup : : master_channel_count ( ) const
{
return _master_bus_channel_count . get_value_as_int ( ) ;
}
bool
ArdourStartup : : connect_inputs ( ) const
{
return _connect_inputs . get_active ( ) ;
}
bool
ArdourStartup : : limit_inputs_used_for_connection ( ) const
{
return _limit_input_ports . get_active ( ) ;
}
int
ArdourStartup : : input_limit_count ( ) const
{
return _input_limit_count . get_value_as_int ( ) ;
}
bool
ArdourStartup : : connect_outputs ( ) const
{
return _connect_outputs . get_active ( ) ;
}
bool
ArdourStartup : : limit_outputs_used_for_connection ( ) const
{
return _limit_output_ports . get_active ( ) ;
}
int
ArdourStartup : : output_limit_count ( ) const
{
return _output_limit_count . get_value_as_int ( ) ;
}
bool
ArdourStartup : : connect_outs_to_master ( ) const
{
return _connect_outputs_to_master . get_active ( ) ;
}
bool
ArdourStartup : : connect_outs_to_physical ( ) const
{
return _connect_outputs_to_physical . get_active ( ) ;
}
void
ArdourStartup : : 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
ArdourStartup : : connect_outputs_clicked ( )
{
_limit_output_ports . set_sensitive ( _connect_outputs . get_active ( ) ) ;
if ( _connect_outputs . get_active ( ) & & _limit_output_ports . get_active ( ) ) {
_output_limit_count . set_sensitive ( true ) ;
} else {
_output_limit_count . set_sensitive ( false ) ;
}
}
void
ArdourStartup : : limit_inputs_clicked ( )
{
_input_limit_count . set_sensitive ( _limit_input_ports . get_active ( ) ) ;
}
void
ArdourStartup : : limit_outputs_clicked ( )
{
_output_limit_count . set_sensitive ( _limit_output_ports . get_active ( ) ) ;
}
void
ArdourStartup : : master_bus_button_clicked ( )
{
2010-11-25 15:37:39 -05:00
bool yn = _create_master_bus . get_active ( ) ;
2010-03-21 13:02:30 -04:00
_master_bus_channel_count . set_sensitive ( yn ) ;
2009-04-20 14:41:46 -04:00
}
void
ArdourStartup : : move_along_now ( )
{
gint cur = get_current_page ( ) ;
if ( cur = = session_page_index ) {
if ( more_new_session_options_button . get_active ( ) ) {
set_current_page ( session_options_page_index ) ;
} else {
on_apply ( ) ;
}
}
}
void
2009-07-21 11:55:17 -04:00
ArdourStartup : : recent_row_activated ( const Gtk : : TreePath & , Gtk : : TreeViewColumn * )
2009-04-20 14:41:46 -04:00
{
set_page_complete ( session_vbox , true ) ;
move_along_now ( ) ;
}
2010-07-25 21:55:08 -04:00
void
ArdourStartup : : existing_session_selected ( )
{
_existing_session_chooser_used = true ;
set_page_complete ( session_vbox , true ) ;
move_along_now ( ) ;
}
2011-11-07 20:43:44 -05:00
sys : : path
ArdourStartup : : been_here_before_path ( ) const
{
sys : : path b = user_config_directory ( ) ;
b / = " .a3 " ; // XXXX use more specific version so we can catch upgrades
return b ;
}