diff --git a/gtk2_ardour/SConscript b/gtk2_ardour/SConscript index 752e336013..23368ad910 100644 --- a/gtk2_ardour/SConscript +++ b/gtk2_ardour/SConscript @@ -43,7 +43,8 @@ gtkardour.Merge ([ libraries['xml'], libraries['soundtouch'], libraries['samplerate'], - libraries['jack'] + libraries['jack'], + libraries['libglademm'] ]) if gtkardour['VST']: @@ -110,6 +111,8 @@ export_dialog.cc gain_automation_time_axis.cc gain_meter.cc ghostregion.cc +glade_path.cc +glade_factory.cc grouped_buttons.cc gtk-custom-hruler.c gtk-custom-ruler.c @@ -166,6 +169,10 @@ visual_time_axis.cc waveview.cc """) +glade_files=glob.glob('glade/*.glade') + +intl_files = gtkardour_files + glade_files + glob.glob('*.h') + mtest_files=Split(""" mtest.cc """) @@ -180,9 +187,12 @@ vst_files = [ 'vst_pluginui.cc' ] if env['VST']: extra_sources += vst_files +intl_files += extra_sources + gtkardour.Append(CCFLAGS="-D_REENTRANT -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE") gtkardour.Append(CXXFLAGS="-DDATA_DIR=\\\""+final_prefix+"/share\\\"") gtkardour.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"") +gtkardour.Append(CXXFLAGS="-DGLADEPATH=\\\""+final_prefix+"/share/ardour/glade\\\"") versionflag = '-DVERSIONSTRING=\\\"' + env['VERSION'] + '\\\"' @@ -202,14 +212,16 @@ if env['VERSIONED']: Default (env.VersionedExecutable ('tagged_executable', ardour)) if env['NLS']: - i18n (gtkardour, gtkardour_files + extra_sources, env) - + Export('gtkardour', 'intl_files') + SConscript ('po/SConscript') + #install env.Alias('install', env.InstallAs(os.path.join(install_prefix, 'bin')+'/ardour', ardour)) env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour'), 'ardour_ui.rc')) env.Alias('install', env.Install(os.path.join(install_prefix, 'share/ardour'), 'splash.ppm')) +env.Alias('install', env.Install(os.path.join(install_prefix, 'share/ardour/glade'), glade_files)) #dist env.Alias ('tarball', env.Distribute (env['DISTTREE'], @@ -218,7 +230,7 @@ env.Alias ('tarball', env.Distribute (env['DISTTREE'], 'editor_xpms', 'misc_xpms', 'transport_xpms', 'ardour_ui.rc', 'splash.ppm' ] + - gtkardour_files + vst_files + + gtkardour_files + vst_files + glade_files + glob.glob('po/*.po') + glob.glob('*.h'))) # generate a prototype full-featured ardour_ui.rc file diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index f45243bb1b..f66b6ff0d1 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -781,7 +781,7 @@ vector channel_combo_strings; ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile), - + primary_clock (X_("TransportClockDisplay"), true, false, true), secondary_clock (X_("SecondaryClockDisplay"), true, false, true), preroll_clock (X_("PreRollClock"), true, true), @@ -830,7 +830,11 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) if (theArdourUI == 0) { theArdourUI = this; } - + + m_new_session_dialog = 0; + m_new_session_dialog_ref = NewSessionDialogFactory::create(); + m_new_session_dialog_ref->get_widget_derived(NewSessionDialogFactory::top_level_widget_name(), + m_new_session_dialog); editor = 0; mixer = 0; session = 0; @@ -844,7 +848,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) meter_bridge = 0; option_editor = 0; location_ui = 0; - new_session_window = 0; open_session_selector = 0; have_configure_timeout = false; have_disk_overrun_displayed = false; @@ -852,6 +855,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) _will_create_new_session_automatically = false; session_loaded = false; + last_configure_time.tv_sec = 0; last_configure_time.tv_usec = 0; @@ -1778,21 +1782,6 @@ ARDOUR_UI::open_recent_session () } -void -ARDOUR_UI::fs_cancel_clicked (Gtk::FileSelection* fs) -{ - fs->hide_all(); - fs->get_selection_entry()->set_text(""); - allow_focus (false); -} - -gint -ARDOUR_UI::fs_delete_event (GdkEventAny* ev, Gtk::FileSelection* fs) -{ - fs_cancel_clicked (fs); - return 1; -} - bool ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info) { @@ -2697,87 +2686,81 @@ ARDOUR_UI::save_template () } void -ARDOUR_UI::new_session (bool startup, string predetermined_path) +ARDOUR_UI::new_session (bool startup, std::string predetermined_path) { - if (new_session_window == 0){ - new_session_window = new NewSessionDialog (*engine, startup, predetermined_path); - editor->ensure_float (*new_session_window); - } + m_new_session_dialog->show_all(); + m_new_session_dialog->set_transient_for(*editor); + m_new_session_dialog->set_name(predetermined_path); - new_session_window->run (); + int response = Gtk::RESPONSE_CANCEL; -#if 0 - // GTK2FIX + do { + response = m_new_session_dialog->run (); - /* write favorites either way */ - Session::FavoriteDirs favs; - new_session_window->file_selector.get_favorites (favs); - Session::write_favorite_dirs (favs); + if(response == Gtk::RESPONSE_OK) { - if (new_session_window->run_status()) { - return; - } -#endif - - string session_path = new_session_window->file_selector.get_filename (); - string session_name = PBD::basename (session_path); - - // Check that it doesn't already exist. - access(session_path.c_str(), R_OK); - if (errno != ENOENT){ - error << string_compose(_("Session %1 already exists at %2"), session_name, session_path) << endmsg; - return; - } - - _session_is_new = true; - - if (session_path[session_path.length()-1] != '/') { - - string template_name = new_session_window->get_template_name (); - - if (template_name.length()) { - - load_session (session_path, session_name, &template_name); - - } else { - - uint32_t cchns; - uint32_t mchns; - Session::AutoConnectOption iconnect; - Session::AutoConnectOption oconnect; - - if (new_session_window->use_control_button.get_active()) { - cchns = (uint32_t) channel_combo_get_channel_count (new_session_window->control_out_channel_combo); + _session_is_new = true; + + std::string session_name = m_new_session_dialog->session_name(); + std::string session_path = m_new_session_dialog->session_folder(); + std::string template_name = m_new_session_dialog->session_template_name(); + + if (m_new_session_dialog->use_session_template()) { + + load_session (session_path, session_name, &template_name); + } else { - cchns = 0; - } - if (new_session_window->use_master_button.get_active()) { - mchns = (uint32_t) channel_combo_get_channel_count (new_session_window->master_out_channel_combo); - } else { - mchns = 0; - } + + uint32_t cchns; + uint32_t mchns; + Session::AutoConnectOption iconnect; + Session::AutoConnectOption oconnect; + + if (m_new_session_dialog->create_control_track()) { + cchns = (uint32_t) m_new_session_dialog->control_channel_count(); + } else { + cchns = 0; + } + + if (m_new_session_dialog->create_master_track()) { + mchns = (uint32_t) m_new_session_dialog->master_channel_count(); + } else { + mchns = 0; + } + + if (m_new_session_dialog->connect_inputs()) { + iconnect = Session::AutoConnectPhysical; + } else { + iconnect = Session::AutoConnectOption (0); + } + + /// @todo some minor tweaks. - if (new_session_window->connect_to_physical_inputs_button.get_active()) { - iconnect = Session::AutoConnectPhysical; - } else { - iconnect = Session::AutoConnectOption (0); - } - - if (new_session_window->connect_to_master_button.get_active ()) { - oconnect = Session::AutoConnectMaster; - } else if (new_session_window->connect_to_physical_outputs_button.get_active ()) { - oconnect = Session::AutoConnectPhysical; - } else { - oconnect = Session::AutoConnectOption (0); - } - - uint32_t nphysin = (uint32_t) new_session_window->in_count_adjustment.get_value(); - uint32_t nphysout = (uint32_t) new_session_window->out_count_adjustment.get_value(); - - build_session (session_path, session_name, cchns, mchns, iconnect, oconnect, nphysin, nphysout, - engine->frame_rate() * 60 * 5); + if (m_new_session_dialog->connect_outs_to_master()) { + oconnect = Session::AutoConnectMaster; + } else if (m_new_session_dialog->connect_outs_to_physical()) { + oconnect = Session::AutoConnectPhysical; + } else { + oconnect = Session::AutoConnectOption (0); + } + + uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count(); + uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count(); + + build_session (session_path, + session_name, + cchns, + mchns, + iconnect, + oconnect, + nphysin, + nphysout, + engine->frame_rate() * 60 * 5); + } } - } + + } while(response == Gtk::RESPONSE_HELP); + m_new_session_dialog->hide_all(); } int @@ -2875,12 +2858,6 @@ ARDOUR_UI::build_session (string path, string snap_name, return 0; } -void -ARDOUR_UI::hide_dialog (ArdourDialog *dialog) -{ - dialog->hide_all(); -} - void ARDOUR_UI::show () { diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index c835303de7..b5ed3b4e3a 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -61,6 +61,7 @@ #include "audio_clock.h" #include "ardour_dialog.h" #include "editing.h" +#include "glade_factory.h" class AudioClock; class PublicEditor; @@ -127,7 +128,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI _will_create_new_session_automatically = yn; } - void new_session (bool startup = false, std::string path = string()); + void new_session(bool startup = false, std::string path = string()); gint cmdline_new_session (std::string path); int unload_session (); void close_session() { unload_session(); } @@ -548,16 +549,9 @@ class ARDOUR_UI : public Gtkmm2ext::UI bool _will_create_new_session_automatically; - NewSessionDialog* new_session_window; - string template_name; - - void new_session_ok_clicked (); - void new_session_template_choice (Gtk::TreeView&, Glib::RefPtr); - void hide_dialog (ArdourDialog *dialog); - - void fs_cancel_clicked (Gtk::FileSelection*); - gint fs_delete_event (GdkEventAny*, Gtk::FileSelection*); - + GladeRef m_new_session_dialog_ref; + NewSessionDialog* m_new_session_dialog; + void open_session (); void open_recent_session (); void open_ok_clicked (); diff --git a/gtk2_ardour/audio_time_axis.cc b/gtk2_ardour/audio_time_axis.cc index 5f9c020025..af98f55d68 100644 --- a/gtk2_ardour/audio_time_axis.cc +++ b/gtk2_ardour/audio_time_axis.cc @@ -1199,14 +1199,21 @@ AudioTimeAxisView::add_gain_automation_child () XMLProperty* prop; AutomationLine* line; - gain_track = new GainAutomationTimeAxisView (_session, _route, editor, *this, parent_canvas, _("gain"), + gain_track = new GainAutomationTimeAxisView (_session, + _route, + editor, + *this, + parent_canvas, + _("gain"), _route.gain_automation_curve()); sigc::slot cslot = mem_fun (editor, &PublicEditor::canvas_control_point_event); sigc::slot lslot = mem_fun (editor, &PublicEditor::canvas_line_event); - line = new AutomationGainLine ("automation gain", _session, *gain_track, + line = new AutomationGainLine ("automation gain", + _session, + *gain_track, *gain_track->canvas_display, _route.gain_automation_curve(), cslot, lslot); diff --git a/gtk2_ardour/glade_factory.cc b/gtk2_ardour/glade_factory.cc new file mode 100644 index 0000000000..b92f36b1de --- /dev/null +++ b/gtk2_ardour/glade_factory.cc @@ -0,0 +1,37 @@ +/* + Copyright (C) 2005 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Id$ +*/ + +#include + +#include "glade_factory.h" + +Glib::RefPtr +GladeFactory::create(const std::string& full_path_to_file, + const Glib::ustring& toplevel_widget) +{ + try { + return Gnome::Glade::Xml::create(full_path_to_file, + toplevel_widget, + PACKAGE ); + } catch(const Gnome::Glade::XmlError& ex) { + std::cerr << ex.what() << std::endl; + throw ex; + } +} diff --git a/gtk2_ardour/glade_factory.h b/gtk2_ardour/glade_factory.h new file mode 100644 index 0000000000..2fff3bd167 --- /dev/null +++ b/gtk2_ardour/glade_factory.h @@ -0,0 +1,45 @@ +/* + Copyright (C) 2005 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Id$ +*/ + +// -*- c++ -*- + +#ifndef GLADE_FACTORY_H +#define GLADE_FACTORY_H + +#include +#include + +typedef Glib::RefPtr GladeRef; + +/** + This is the base class for all glade + factories so that the same domain is + used. +*/ +class GladeFactory { + +protected: + static GladeRef + create(const std::string& full_path, + const Glib::ustring& toplevel_widget = Glib::ustring()); +}; + + +#endif // GLADE_FACTORY_H diff --git a/gtk2_ardour/glade_path.cc b/gtk2_ardour/glade_path.cc new file mode 100644 index 0000000000..e922ec2e13 --- /dev/null +++ b/gtk2_ardour/glade_path.cc @@ -0,0 +1,59 @@ +/* + Copyright (C) 2005 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Id$ +*/ + +#include +#include + +#include "i18n.h" +#include "glade_path.h" + +#include + +std::string +GladePath::path(const std::string& glade_file) +{ + std::string user_glade_dir = Glib::getenv(X_("ARDOUR_GLADE_PATH")); + std::string full_path; + + if(user_glade_dir != "") { + full_path = Glib::build_filename(user_glade_dir, glade_file); + if(Glib::file_test(full_path, Glib::FILE_TEST_EXISTS)) return full_path; + } + + // check if file ~/.ardour/glade/glade_file exists. + std::vector path; + path.push_back(Glib::get_home_dir()); + path.push_back(X_(".ardour")); // define as a constant somewhere? + path.push_back(X_("glade")); + path.push_back(glade_file); + full_path = Glib::build_filename(path); + + // temporary debugging + std::cout << "Path to glade file" << full_path << std::endl; + + if(Glib::file_test(full_path, Glib::FILE_TEST_EXISTS)) return full_path; + + /* + If for some wierd reason the system wide glade file + doesn't exist libglademm will throw an exception + so don't bother testing if it exists etc. + */ + return Glib::build_filename(GLADEPATH, glade_file); +} diff --git a/gtk2_ardour/glade_path.h b/gtk2_ardour/glade_path.h new file mode 100644 index 0000000000..a651b5fd1c --- /dev/null +++ b/gtk2_ardour/glade_path.h @@ -0,0 +1,49 @@ +/* + Copyright (C) 2005 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Id$ +*/ + +#ifndef GLADE_PATH_H +#define GLADE_PATH_H + +#include + +struct GladePath { + + /** + @return Path to glade file. + + XXX subject to change upon discussion. + + glade files are currently looked for in + three possible directories in this order. + + In the directory defined in the environment + variable ARDOUR_GLADE_PATH + + In the users .ardour/glade directory. + + In the system defined glade path. + */ + static std::string + path(const std::string& glade_filename); + +}; + +#endif // GLADE_PATH_H + diff --git a/gtk2_ardour/new_session_dialog.cc b/gtk2_ardour/new_session_dialog.cc index 854e702232..428facdfba 100644 --- a/gtk2_ardour/new_session_dialog.cc +++ b/gtk2_ardour/new_session_dialog.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 1999-2002 Paul Davis + Copyright (C) 2005 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,322 +18,171 @@ $Id$ */ -#include -#include -#include -#include - -#include "prompter.h" -#include "new_session_dialog.h" - -using namespace Gtkmm2ext; -using namespace Gtk; -using namespace ARDOUR; - #include "i18n.h" +#include "new_session_dialog.h" +#include "glade_path.h" -extern std::vector channel_combo_strings; +const char* NewSessionDialogFactory::s_m_top_level_widget_name = X_("new_session_dialog"); -NewSessionDialog::NewSessionDialog (ARDOUR::AudioEngine& engine, bool startup, string given_path) - : ArdourDialog ("new session dialog"), - file_selector (_("Session name:"), _("Create")), - use_control_button (_("use control outs")), - use_master_button (_("use master outs")), - connect_to_physical_inputs_button (_("automatically connect track inputs to physical ports")), - connect_to_master_button (_("automatically connect track outputs to master outs")), - connect_to_physical_outputs_button (_("automatically connect track outputs to physical ports")), - manual_connect_outputs_button (_("manually connect track outputs")), - in_count_adjustment (2, 1, 1000, 1, 2), - out_count_adjustment (2, 1, 1000, 1, 2), - output_label (_("Output Connections")), - input_label (_("Input Connections")), - expansion_button (_("Advanced...")), - out_table (2, 2), - show_again (_("show again")), - in_count_spinner (in_count_adjustment), - out_count_spinner (out_count_adjustment), - in_count_label (_("Hardware Inputs: use")), - out_count_label (_("Hardware Outputs: use")) - + +Glib::RefPtr +NewSessionDialogFactory::create() { - using namespace Notebook_Helpers; + return GladeFactory::create(GladePath::path(X_("new_session_dialog.glade"))); +} - set_name ("NewSessionDialog"); - set_title (_("new session setup")); - set_wmclass (_("ardour_new_session"), "Ardour"); - set_position (Gtk::WIN_POS_MOUSE); - set_keyboard_input (true); - // GTK2FIX - // set_policy (false, true, false); - set_modal (true); - /* sample rate */ +NewSessionDialog::NewSessionDialog(BaseObjectType* cobject, + const Glib::RefPtr& xml) + : Gtk::Dialog(cobject) +{ + // look up the widgets we care about. - sr_label1.set_text (string_compose - (_("This session will playback and record at %1 Hz"), - engine.frame_rate())); - sr_label2.set_text (_("This rate is set by JACK and cannot be changed.\n" - "If you want to use a different sample rate\n" - "please exit and restart JACK")); - sr_box.set_spacing (12); - sr_box.set_border_width (12); - sr_box.pack_start (sr_label1, false, false); - sr_box.pack_start (sr_label2, false, false); - sr_frame.add (sr_box); - - /* input */ - - connect_to_physical_inputs_button.set_active (true); - connect_to_physical_inputs_button.set_name ("NewSessionDialogButton"); + xml->get_widget(X_("SessionName"), m_name); + xml->get_widget(X_("SessionFolder"), m_folder); + xml->get_widget(X_("SessionTemplate"), m_template); - HBox* input_limit_box = manage (new HBox); - input_limit_box->set_spacing (7); - input_limit_box->pack_start (in_count_label, false, false); - input_limit_box->pack_start (in_count_spinner, false, false); - - input_label.set_alignment (0.1, 0.5); - input_vbox.pack_start (input_label, false, false, 7); - input_vbox.pack_start (connect_to_physical_inputs_button, false, false); - - if (engine.n_physical_inputs() > 2) { - input_vbox.pack_start (*input_limit_box, false, false); - } - - /* output */ - - use_master_button.set_active (true); - use_master_button.set_name ("NewSessionDialogButton"); + xml->get_widget(X_("CreateMasterTrack"), m_create_master_track); + xml->get_widget(X_("MasterChannelCount"), m_master_track_channel_count); - connect_to_physical_outputs_button.set_group (connect_to_master_button.get_group()); - manual_connect_outputs_button.set_group (connect_to_master_button.get_group()); - connect_to_master_button.set_active (true); - - connect_to_physical_outputs_button.set_name ("NewSessionDialogButton"); - manual_connect_outputs_button.set_name ("NewSessionDialogButton"); - connect_to_master_button.set_name ("NewSessionDialogButton"); - use_control_button.set_name ("NewSessionDialogButton"); - - out_count_adjustment.set_value (engine.n_physical_outputs()); - in_count_adjustment.set_value (engine.n_physical_inputs()); + xml->get_widget(X_("CreateControlTrack"), m_create_control_track); + xml->get_widget(X_("ControlChannelCount"), m_control_track_channel_count); - set_popdown_strings (control_out_channel_combo, channel_combo_strings); - control_out_channel_combo.set_name (X_("NewSessionChannelCombo")); - // use stereo as default - control_out_channel_combo.set_active_text (channel_combo_strings.front()); + xml->get_widget(X_("ConnectInputs"), m_connect_inputs); + xml->get_widget(X_("LimitInputPorts"), m_limit_input_ports); + xml->get_widget(X_("InputLimitCount"), m_input_limit_count); - set_popdown_strings (master_out_channel_combo, channel_combo_strings); - master_out_channel_combo.set_name (X_("NewSessionChannelCombo")); - // use stereo as default - master_out_channel_combo.set_active_text (channel_combo_strings.front()); + xml->get_widget(X_("ConnectOutputs"), m_connect_outputs); + xml->get_widget(X_("LimitOutputPorts"), m_limit_output_ports); + xml->get_widget(X_("OutputLimitCount"), m_output_limit_count); + xml->get_widget(X_("ConnectOutsToMaster"), m_connect_outputs_to_master); + xml->get_widget(X_("ConnectOutsToPhysical"), m_connect_outputs_to_physical); - - out_table.set_col_spacings (7); - out_table.set_row_spacings (7); - if (engine.n_physical_outputs() > 2) { - out_table.attach (out_count_label, 0, 1, 0, 1, 0, 0); - out_table.attach (out_count_spinner, 1, 2, 0, 1, 0, 0); - } - out_table.attach (use_control_button, 0, 1, 1, 2, 0, 0); - out_table.attach (control_out_channel_combo, 1, 2, 1, 2, 0, 0); - out_table.attach (use_master_button, 0, 1, 2, 3, 0, 0); - out_table.attach (master_out_channel_combo, 1, 2, 2, 3, 0, 0); - - output_label.set_alignment (0.1, 0.5); - output_vbox.pack_start (output_label, true, true, 7); - output_vbox.pack_start (out_table, false, false, 5); - output_vbox.pack_start (connect_to_master_button, false); - output_vbox.pack_start (connect_to_physical_outputs_button, false); - output_vbox.pack_start (manual_connect_outputs_button, false); - - input_hbox.pack_start (input_vbox, false, false); - output_hbox.pack_start (output_vbox, false, false); + ///@ todo connect some signals - VBox* template_vbox = manage (new VBox); - Label* template_label = manage (new Label (_("Session template"))); - - template_label->set_alignment (0.1, 0.5); - template_vbox->pack_start (*template_label, true, true, 7); - template_vbox->pack_start (template_combo, false, false); - - io_box.set_border_width (12); - io_box.set_spacing (7); - io_box.pack_start (*template_vbox); - - io_box.pack_start (input_hbox); - io_box.pack_start (output_hbox); - - reset_templates(); - - option_hbox.set_spacing (7); - option_hbox.pack_start (io_box); - - fsbox.set_border_width (12); - fsbox.set_spacing (7); - fsbox.pack_start (file_selector.table, false, false); - - notebook.pages().push_back (TabElem (fsbox, _("Location"))); - notebook.pages().push_back (TabElem (option_hbox, _("Configuration"))); - - if (startup) { - show_again.set_active(true); - show_again.toggled.connect (mem_fun(*this, &NewSessionDialog::show_again_toggled)); - file_selector.button_box.pack_end(show_again, false, false); - } - - main_vbox.set_border_width (12); - main_vbox.set_border_width (12); - main_vbox.set_spacing (7); - main_vbox.pack_start (sr_frame, false, false); - main_vbox.pack_start (notebook, false, false); - main_vbox.pack_start (file_selector.button_box, false, false); - - add (main_vbox); - -// template_selector.shift_made.connect ( -// mem_fun(*this, &NewSessionDialog::mix_template_shift)); -// template_selector.control_made.connect ( -// mem_fun(*this, &NewSessionDialog::mix_template_control)); - - file_selector.cancel_button.signal_clicked().connect (bind (mem_fun(*this, &ArdourDialog::stop), -1)); - file_selector.op_button.signal_clicked().connect (bind (mem_fun(*this, &ArdourDialog::stop), 0)); - file_selector.Expanded.connect (mem_fun(*this, &NewSessionDialog::file_selector_expansion)); - - delete_event.connect (mem_fun(*this, &ArdourDialog::wm_close_event)); - show.connect (mem_fun(*this, &NewSessionDialog::fixup_at_show)); - - file_selector.entry_label.set_name ("NewSessionMainLabel"); - file_selector.where_label.set_name ("NewSessionMainLabel"); - template_label->set_name ("NewSessionIOLabel"); - input_label.set_name ("NewSessionIOLabel"); - output_label.set_name ("NewSessionIOLabel"); - sr_label1.set_name ("NewSessionSR1Label"); - sr_label2.set_name ("NewSessionSR2Label"); - - if (given_path.empty()) { - Session::FavoriteDirs favs; - Session::read_favorite_dirs (favs); - file_selector.set_favorites (favs); - } else { - file_selector.set_path (given_path, true); - notebook.set_page (-1); - notebook.show.connect (bind (mem_fun (notebook, &Notebook::set_page), -1)); - } - - set_default_size(531, 358); } void -NewSessionDialog::file_selector_expansion (bool expanded) +NewSessionDialog::set_session_name(const Glib::ustring& name) { - if (expanded) { - fsbox.pack_start (file_selector.expansion_vbox); - fsbox.reorder_child (file_selector.expansion_vbox, 2); - } else { - fsbox.remove (file_selector.expansion_vbox); - } + m_name->set_text(name); } -void -NewSessionDialog::fixup_at_show () +std::string +NewSessionDialog::session_name() const { -// if (template_selector.clist().rows().size() == 0) { -// use_template_button.set_sensitive (false); -// } - - Session::FavoriteDirs favs; - Session::read_favorite_dirs (favs); - file_selector.set_favorites (favs); - - file_selector.entry.grab_focus (); + return Glib::filename_from_utf8(m_name->get_text()); } -void -NewSessionDialog::_mix_template_refiller (CList &clist, void *arg) - +std::string +NewSessionDialog::session_folder() const { - ((NewSessionDialog*) arg)->mix_template_refiller (clist); + return Glib::filename_from_utf8(m_folder->get_current_folder()); } -void -NewSessionDialog::mix_template_refiller (CList &clist) +bool +NewSessionDialog::use_session_template() const { - const gchar *rowdata[2]; - list templates; - list::iterator i; + if(m_template->get_filename().empty()) return false; + return true; +} + +std::string +NewSessionDialog::session_template_name() const +{ + return Glib::filename_from_utf8(m_template->get_filename()); +} + +bool +NewSessionDialog::create_master_track() const +{ + return m_create_master_track->get_active(); +} + +int +NewSessionDialog::master_channel_count() const +{ + return m_master_track_channel_count->get_value_as_int(); +} + +bool +NewSessionDialog::create_control_track() const +{ + return m_create_control_track->get_active(); +} + +int +NewSessionDialog::control_channel_count() const +{ + return m_control_track_channel_count->get_value_as_int(); +} + +bool +NewSessionDialog::connect_inputs() const +{ + return m_connect_inputs->get_active(); +} + +bool +NewSessionDialog::limit_inputs_used_for_connection() const +{ + return m_limit_input_ports->get_active(); +} + +int +NewSessionDialog::input_limit_count() const +{ + return m_input_limit_count->get_value_as_int(); +} + +bool +NewSessionDialog::connect_outputs() const +{ + return m_connect_outputs->get_active(); +} + +bool +NewSessionDialog::limit_outputs_used_for_connection() const +{ + return m_limit_output_ports->get_active(); +} + +int +NewSessionDialog::output_limit_count() const +{ + return m_output_limit_count->get_value_as_int(); +} + +bool +NewSessionDialog::connect_outs_to_master() const +{ + return m_connect_outputs_to_master->get_active(); +} + +bool +NewSessionDialog::connect_outs_to_physical() const +{ + return m_connect_outputs_to_physical->get_active(); +} + + +void +NewSessionDialog::reset_name() +{ + m_name->set_text(Glib::ustring()); - Session::get_template_list(templates); - - rowdata[0] = _("blank"); - clist.insert_row (0, rowdata); +} + +/// @todo +void +NewSessionDialog::reset_template() +{ - guint row; - for (row=1, i=templates.begin(); i != templates.end(); ++row, ++i) { - rowdata[0] = (*i).c_str(); - clist.insert_row (row, rowdata); - } } void -NewSessionDialog::mix_template_shift (Gtkmm2ext::Selector* selector, Gtkmm2ext::SelectionResult* res) +NewSessionDialog::reset() { - if (res && res->text){ - Session::delete_template(*res->text); - // template_selector.rescan(); - } -} - -void -NewSessionDialog::mix_template_control (Gtkmm2ext::Selector* selector, Gtkmm2ext::SelectionResult* res) -{ -#if 0 - if (res && res->text) { - ArdourPrompter prompter (true); - prompter.set_prompt(_("Name for mix template:")); - - string old_name = *(res->text); - prompter.set_initial_text (old_name); - prompter.done.connect (Gtk::Main::quit.slot()); - prompter.show_all(); - - Gtk::Main::run(); - - if (prompter.status == Gtkmm2ext::Prompter::entered) { - string name; - - prompter.get_result (name); - - if (name.length() && name != old_name) { - Session::rename_template(old_name, name); - template_selector.rescan(); - } - } - } -#endif -} - -void -NewSessionDialog::show_again_toggled () -{ - Config->set_no_new_session_dialog(!show_again.get_active()); - Config->save_state(); -} - -void -NewSessionDialog::reset_templates () -{ - templates.clear (); - templates.push_back (_("No template - create tracks/busses manually")); - Session::get_template_list (templates); - set_popdown_strings (template_combo, templates); -} - -string -NewSessionDialog::get_template_name() -{ - string str = template_combo.get_entry()->get_text(); - if (str.substr (0, 11) == _("No template")) { - return ""; - } else { - return str; - } + reset_name(); + reset_template(); } diff --git a/gtk2_ardour/new_session_dialog.h b/gtk2_ardour/new_session_dialog.h index ba79598c8f..79e7000ee7 100644 --- a/gtk2_ardour/new_session_dialog.h +++ b/gtk2_ardour/new_session_dialog.h @@ -1,99 +1,110 @@ -#ifndef __gtk_ardour_new_session_dialog_h__ -#define __gtk_ardour_new_session_dialog_h__ +/* + Copyright (C) 2005 Paul Davis -#include -#include -#include -#include -#include -#include -#include + 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. -namespace Gtk { - class CList; -} + 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. -namespace ARDOUR { - class AudioEngine; -} + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -#include -#include -#include "ardour_dialog.h" + $Id$ +*/ -class NewSessionDialog : public ArdourDialog +// -*- c++ -*- + +#ifndef NEW_SESSION_DIALOG_H +#define NEW_SESSION_DIALOG_H + +#include +#include + +#include "glade_factory.h" + +struct NewSessionDialogFactory : public GladeFactory { - public: - NewSessionDialog (ARDOUR::AudioEngine&, bool startup, std::string path); + static GladeRef create(); + + static const char* top_level_widget_name(); + +private: + + static const char* s_m_top_level_widget_name; - Gtk::FileChooserWidget file_selector; - Gtk::ComboBoxText control_out_channel_combo; - Gtk::ComboBoxText master_out_channel_combo; - Gtk::CheckButton use_control_button; - Gtk::CheckButton use_master_button; - Gtk::CheckButton connect_to_physical_inputs_button; - - Gtk::RadioButton connect_to_master_button; - Gtk::RadioButton connect_to_physical_outputs_button; - Gtk::RadioButton manual_connect_outputs_button; - - Gtk::VBox input_vbox; - Gtk::VBox manual_vbox; - Gtk::VBox output_vbox; - Gtk::VBox vbox; - - Gtk::Adjustment in_count_adjustment; - Gtk::Adjustment out_count_adjustment; - - string get_template_name (); - - private: - Gtk::Notebook notebook; - Gtk::VBox main_vbox; - Gtk::VBox fsbox; - - Gtk::Frame control_out_config_frame; - Gtk::Frame master_out_config_frame; - Gtk::Label output_label; - Gtk::Label input_label; - Gtk::Frame sr_frame; - Gtk::Frame template_frame; - Gtk::Frame manual_frame; - Gtk::HBox control_hbox; - Gtk::HBox master_hbox; - Gtk::Table io_table; - Gtk::VBox template_box; - Gtk::HBox output_hbox; - Gtk::HBox input_hbox; - Gtk::HBox option_hbox; - Gtk::VBox io_box; - Gtk::Label sr_label2; - Gtk::Label sr_label1; - Gtk::VBox sr_box; - Gtk::Button expansion_button; - Gtk::Table out_table; - Gtk::CheckButton show_again; - Gtk::ComboBoxText template_combo; - list templates; - Gtk::SpinButton in_count_spinner; - Gtk::SpinButton out_count_spinner; - Gtk::Label in_count_label; - Gtk::Label out_count_label; - - void reset_templates (); - - static void _mix_template_refiller (Gtk::CList &clist, void *); - void mix_template_refiller (Gtk::CList &clist); - - void mix_template_shift (Gtkmm2ext::Selector *, Gtkmm2ext::Selector::Result*); - void mix_template_control (Gtkmm2ext::Selector *, Gtkmm2ext::Selector::Result*); - - void fixup_at_realize (); - void fixup_at_show (); - void toggle_expansion (); - void file_selector_expansion (bool); - - void show_again_toggled (); }; -#endif // __gtk_ardour_new_session_dialog_h__ */ +class NewSessionDialog : public Gtk::Dialog +{ +public: + + NewSessionDialog(BaseObjectType* cobject, + const Glib::RefPtr& xml); + + void set_session_name(const Glib::ustring& name); + + std::string session_name() const; + std::string session_folder() const; + + bool use_session_template() const; + std::string session_template_name() const; + + // advanced. + + bool create_master_track() const; + int master_channel_count() const; + + bool create_control_track() const; + int control_channel_count() const; + + bool connect_inputs() const; + bool limit_inputs_used_for_connection() const; + int input_limit_count() const; + + bool connect_outputs() const; + bool limit_outputs_used_for_connection() const; + int output_limit_count() const; + + bool connect_outs_to_master() const; + bool connect_outs_to_physical() const ; + +protected: + + void reset_name(); + void reset_template(); + + // reset everything to default values. + void reset(); + + // references to widgets we care about. + + Gtk::Entry* m_name; + Gtk::FileChooserButton* m_folder; + Gtk::FileChooserButton* m_template; + + Gtk::CheckButton* m_create_master_track; + Gtk::SpinButton* m_master_track_channel_count; + + Gtk::CheckButton* m_create_control_track; + Gtk::SpinButton* m_control_track_channel_count; + + Gtk::CheckButton* m_connect_inputs; + Gtk::CheckButton* m_limit_input_ports; + Gtk::SpinButton* m_input_limit_count; + + Gtk::CheckButton* m_connect_outputs; + Gtk::CheckButton* m_limit_output_ports; + Gtk::SpinButton* m_output_limit_count; + + Gtk::RadioButton* m_connect_outputs_to_master; + Gtk::RadioButton* m_connect_outputs_to_physical; + +}; + +#endif // NEW_SESSION_DIALOG_H diff --git a/gtk2_ardour/po/SConscript b/gtk2_ardour/po/SConscript new file mode 100644 index 0000000000..55a4642433 --- /dev/null +++ b/gtk2_ardour/po/SConscript @@ -0,0 +1,47 @@ +# -*- python -*- +import os +import os.path +import glob + +Import ('env gtkardour install_prefix intl_files') + +potfiles_in = open('POTFILES.in', 'w') + +intl_files.sort() + +print "Generating POTFILES.in in gtk_ardour/po" + +potfiles_in.write("""# This file was automatically generated by a configuration script. +# Contains a list of source files containing translatable +# strings sorted alphabetically. +[encoding: UTF-8] +""") + +for f in intl_files[:]: + potfiles_in.write(f + '\n') + +potfiles_in.close() + +print "Updating pot file: " + +domain = gtkardour['DOMAIN'] +potfile = gtkardour['POTFILE'] + +poaction = Action('intltool-update -p -g=' + domain) + +Execute(poaction) + +# this should probably be merged with the i18n builder somehow + +p_oze = [ os.path.basename (po) for po in glob.glob ('*.po') ] +languages = [ po.replace ('.po', '') for po in p_oze ] +m_oze = [ po.replace (".po", ".mo") for po in p_oze ] + +for mo in m_oze[:]: + po = mo.replace (".mo", ".po") + env.Alias ('install', gtkardour.MoBuild (mo, [ po, potfile ])) + +for lang in languages[:]: + modir = (os.path.join (install_prefix, 'share/locale/' + lang + '/LC_MESSAGES/')) + moname = domain + '.mo' + env.Alias('install', env.InstallAs (os.path.join (modir, moname), lang + '.mo'))