X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fsession_import_dialog.cc;h=775b73607637c8a9058bf9aef46e547dcfc0e8f1;hb=9bc8b32b8eaf8304d0c51c3340e15345b7300988;hp=61f046e4ca2a599c4d6d9dab18d5af1754007c98;hpb=09ec34292683c8a4edcc0060b938192ae18225c4;p=ardour.git diff --git a/gtk2_ardour/session_import_dialog.cc b/gtk2_ardour/session_import_dialog.cc index 61f046e4ca..775b736076 100644 --- a/gtk2_ardour/session_import_dialog.cc +++ b/gtk2_ardour/session_import_dialog.cc @@ -18,36 +18,44 @@ */ -#include "session_import_dialog.h" +#include +#include #include "pbd/failed_constructor.h" #include "ardour/audio_region_importer.h" #include "ardour/audio_playlist_importer.h" #include "ardour/audio_track_importer.h" +#include "ardour/filename_extensions.h" #include "ardour/location_importer.h" #include "ardour/tempo_map_importer.h" -#include +#include "gtkmm2ext/utils.h" +#include "widgets/prompter.h" + +#include "gui_thread.h" +#include "session_import_dialog.h" -#include "prompter.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace ARDOUR; +using namespace PBD; +using namespace Gtk; -SessionImportDialog::SessionImportDialog (ARDOUR::Session & target) : - ArdourDialog (_("Import from session")), - target (target), +SessionImportDialog::SessionImportDialog (ARDOUR::Session* target) : + ArdourDialog (_("Import from Session")), file_browse_button (_("Browse")) { + set_session (target); + // File entry file_entry.set_name ("ImportFileNameEntry"); file_entry.set_text ("/"); Gtkmm2ext::set_size_request_to_display_given_text (file_entry, X_("Kg/quite/a/reasonable/size/for/files/i/think"), 5, 8); file_browse_button.set_name ("EditorGTKButton"); - file_browse_button.signal_clicked().connect (mem_fun(*this, &SessionImportDialog::browse)); + file_browse_button.signal_clicked().connect (sigc::mem_fun(*this, &SessionImportDialog::browse)); file_hbox.set_spacing (5); file_hbox.set_border_width (5); @@ -62,7 +70,7 @@ SessionImportDialog::SessionImportDialog (ARDOUR::Session & target) : get_vbox()->pack_start (file_frame, false, false); // Session browser - session_tree = Gtk::TreeStore::create (sb_cols); + session_tree = TreeStore::create (sb_cols); session_browser.set_model (session_tree); session_browser.set_name ("SessionBrowser"); @@ -71,28 +79,28 @@ SessionImportDialog::SessionImportDialog (ARDOUR::Session & target) : session_browser.set_tooltip_column (3); session_browser.get_column(0)->set_min_width (180); session_browser.get_column(1)->set_min_width (40); - session_browser.get_column(1)->set_sizing (Gtk::TREE_VIEW_COLUMN_AUTOSIZE); + session_browser.get_column(1)->set_sizing (TREE_VIEW_COLUMN_AUTOSIZE); - session_scroll.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + session_scroll.set_policy (POLICY_AUTOMATIC, POLICY_AUTOMATIC); session_scroll.add (session_browser); session_scroll.set_size_request (220, 400); // Connect signals - Gtk::CellRendererToggle *toggle = dynamic_cast (session_browser.get_column_cell_renderer (1)); - toggle->signal_toggled().connect(mem_fun (*this, &SessionImportDialog::update)); - session_browser.signal_row_activated().connect(mem_fun (*this, &SessionImportDialog::show_info)); + CellRendererToggle *toggle = dynamic_cast (session_browser.get_column_cell_renderer (1)); + toggle->signal_toggled().connect(sigc::mem_fun (*this, &SessionImportDialog::update)); + session_browser.signal_row_activated().connect(sigc::mem_fun (*this, &SessionImportDialog::show_info)); get_vbox()->pack_start (session_scroll, false, false); // Buttons - cancel_button = add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); - cancel_button->signal_clicked().connect (mem_fun (*this, &SessionImportDialog::end_dialog)); - ok_button = add_button (_("Import"), Gtk::RESPONSE_ACCEPT); - ok_button->signal_clicked().connect (mem_fun (*this, &SessionImportDialog::do_merge)); + cancel_button = add_button (Stock::CANCEL, RESPONSE_CANCEL); + cancel_button->signal_clicked().connect (sigc::mem_fun (*this, &SessionImportDialog::end_dialog)); + ok_button = add_button (_("Import"), RESPONSE_ACCEPT); + ok_button->signal_clicked().connect (sigc::mem_fun (*this, &SessionImportDialog::do_merge)); - // prompt signals - ElementImporter::Rename.connect (mem_fun (*this, &SessionImportDialog::open_rename_dialog)); - ElementImporter::Prompt.connect (mem_fun (*this, &SessionImportDialog::open_prompt_dialog)); + // prompt signals XXX: problem - handlers to be in the same thread since they return values + ElementImporter::Rename.connect_same_thread (connections, boost::bind (&SessionImportDialog::open_rename_dialog, this, _1, _2)); + ElementImporter::Prompt.connect_same_thread (connections, boost::bind (&SessionImportDialog::open_prompt_dialog, this, _1)); // Finalize show_all(); @@ -101,24 +109,29 @@ SessionImportDialog::SessionImportDialog (ARDOUR::Session & target) : void SessionImportDialog::load_session (const string& filename) { - tree.read (filename); - boost::shared_ptr region_handler (new AudioRegionImportHandler (tree, target)); - boost::shared_ptr pl_handler (new AudioPlaylistImportHandler (tree, target, *region_handler)); - - handlers.push_back (boost::static_pointer_cast (region_handler)); - handlers.push_back (boost::static_pointer_cast (pl_handler)); - handlers.push_back (HandlerPtr(new UnusedAudioPlaylistImportHandler (tree, target, *region_handler))); - handlers.push_back (HandlerPtr(new AudioTrackImportHandler (tree, target, *pl_handler))); - handlers.push_back (HandlerPtr(new LocationImportHandler (tree, target))); - handlers.push_back (HandlerPtr(new TempoMapImportHandler (tree, target))); - - fill_list(); - - if (ElementImportHandler::dirty()) { - // Warn user - string txt = _("Some elements had errors in them. Please see the log for details"); - Gtk::MessageDialog msg (txt, false, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK, true); - msg.run(); + if (_session) { + if (tree.read (filename)) { + error << string_compose (_("Cannot load XML for session from %1"), filename) << endmsg; + return; + } + boost::shared_ptr region_handler (new AudioRegionImportHandler (tree, *_session)); + boost::shared_ptr pl_handler (new AudioPlaylistImportHandler (tree, *_session, *region_handler)); + + handlers.push_back (boost::static_pointer_cast (region_handler)); + handlers.push_back (boost::static_pointer_cast (pl_handler)); + handlers.push_back (HandlerPtr(new UnusedAudioPlaylistImportHandler (tree, *_session, *region_handler))); + handlers.push_back (HandlerPtr(new AudioTrackImportHandler (tree, *_session, *pl_handler))); + handlers.push_back (HandlerPtr(new LocationImportHandler (tree, *_session))); + handlers.push_back (HandlerPtr(new TempoMapImportHandler (tree, *_session))); + + fill_list(); + + if (ElementImportHandler::dirty()) { + // Warn user + string txt = _("Some elements had errors in them. Please see the log for details"); + MessageDialog msg (txt, false, MESSAGE_WARNING, BUTTONS_OK, true); + msg.run(); + } } } @@ -129,8 +142,8 @@ SessionImportDialog::fill_list () // Loop through element types for (HandlerList::iterator handler = handlers.begin(); handler != handlers.end(); ++handler) { - Gtk::TreeModel::iterator iter = session_tree->append(); - Gtk::TreeModel::Row row = *iter; + TreeModel::iterator iter = session_tree->append(); + TreeModel::Row row = *iter; row[sb_cols.name] = (*handler)->get_info(); row[sb_cols.queued] = false; row[sb_cols.element] = ElementPtr(); // "Null" pointer @@ -139,7 +152,7 @@ SessionImportDialog::fill_list () ElementList &elements = (*handler)->elements; for (ElementList::iterator element = elements.begin(); element != elements.end(); ++element) { iter = session_tree->append(row.children()); - Gtk::TreeModel::Row child = *iter; + TreeModel::Row child = *iter; child[sb_cols.name] = (*element)->get_name(); child[sb_cols.queued] = false; child[sb_cols.element] = *element; @@ -151,16 +164,22 @@ SessionImportDialog::fill_list () void SessionImportDialog::browse () { - Gtk::FileChooserDialog dialog(_("Import from session"), browse_action()); + FileChooserDialog dialog(_("Import from session"), browse_action()); dialog.set_transient_for(*this); dialog.set_filename (file_entry.get_text()); - dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); - dialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK); + FileFilter session_filter; + session_filter.add_pattern (string_compose(X_("*%1"), ARDOUR::statefile_suffix)); + session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME)); + dialog.add_filter (session_filter); + dialog.set_filter (session_filter); + + dialog.add_button(Stock::CANCEL, RESPONSE_CANCEL); + dialog.add_button(Stock::OK, RESPONSE_OK); int result = dialog.run(); - if (result == Gtk::RESPONSE_OK) { + if (result == RESPONSE_OK) { string filename = dialog.get_filename(); if (filename.length()) { @@ -175,12 +194,12 @@ SessionImportDialog::do_merge () { // element types - Gtk::TreeModel::Children types = session_browser.get_model()->children(); - Gtk::TreeModel::Children::iterator ti; + TreeModel::Children types = session_browser.get_model()->children(); + TreeModel::Children::iterator ti; for (ti = types.begin(); ti != types.end(); ++ti) { // elements - Gtk::TreeModel::Children elements = ti->children(); - Gtk::TreeModel::Children::iterator ei; + TreeModel::Children elements = ti->children(); + TreeModel::Children::iterator ei; for (ei = elements.begin(); ei != elements.end(); ++ei) { if ((*ei)[sb_cols.queued]) { ElementPtr element = (*ei)[sb_cols.element]; @@ -194,7 +213,7 @@ SessionImportDialog::do_merge () if (ElementImportHandler::errors()) { // Warn user string txt = _("Some elements had errors in them. Please see the log for details"); - Gtk::MessageDialog msg (txt, false, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK, true); + MessageDialog msg (txt, false, MESSAGE_WARNING, BUTTONS_OK, true); msg.run(); } } @@ -203,22 +222,22 @@ SessionImportDialog::do_merge () void SessionImportDialog::update (string path) { - Gtk::TreeModel::iterator cell = session_browser.get_model()->get_iter (path); + TreeModel::iterator cell = session_browser.get_model()->get_iter (path); // Select all elements if element type is selected if (path.size() == 1) { { // Prompt user for verification string txt = _("This will select all elements of this type!"); - Gtk::MessageDialog msg (txt, false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL, true); - if (msg.run() == Gtk::RESPONSE_CANCEL) { + MessageDialog msg (txt, false, MESSAGE_QUESTION, BUTTONS_OK_CANCEL, true); + if (msg.run() == RESPONSE_CANCEL) { (*cell)[sb_cols.queued] = false; return; } } - Gtk::TreeModel::Children elements = cell->children(); - Gtk::TreeModel::Children::iterator ei; + TreeModel::Children elements = cell->children(); + TreeModel::Children::iterator ei; for (ei = elements.begin(); ei != elements.end(); ++ei) { ElementPtr element = (*ei)[sb_cols.element]; if (element->prepare_move()) { @@ -241,16 +260,16 @@ SessionImportDialog::update (string path) } void -SessionImportDialog::show_info(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn*) +SessionImportDialog::show_info(const TreeModel::Path& path, TreeViewColumn*) { if (path.size() == 1) { return; } - Gtk::TreeModel::iterator cell = session_browser.get_model()->get_iter (path); + TreeModel::iterator cell = session_browser.get_model()->get_iter (path); string info = (*cell)[sb_cols.info]; - Gtk::MessageDialog msg (info, false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_OK, true); + MessageDialog msg (info, false, MESSAGE_INFO, BUTTONS_OK, true); msg.run(); } @@ -266,15 +285,15 @@ SessionImportDialog::end_dialog () std::pair SessionImportDialog::open_rename_dialog (string text, string name) { - ArdourPrompter prompter(true); + ArdourWidgets::Prompter prompter(true); string new_name; prompter.set_name ("Prompter"); - prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); + prompter.add_button (Stock::SAVE, RESPONSE_ACCEPT); prompter.set_prompt (text); prompter.set_initial_text (name); - if (prompter.run() == Gtk::RESPONSE_ACCEPT) { + if (prompter.run() == RESPONSE_ACCEPT) { prompter.get_result (new_name); if (new_name.length()) { name = new_name; @@ -287,8 +306,8 @@ SessionImportDialog::open_rename_dialog (string text, string name) bool SessionImportDialog::open_prompt_dialog (string text) { - Gtk::MessageDialog msg (text, false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL, true); - if (msg.run() == Gtk::RESPONSE_OK) { + MessageDialog msg (text, false, MESSAGE_QUESTION, BUTTONS_OK_CANCEL, true); + if (msg.run() == RESPONSE_OK) { return true; } return false;