diff options
author | Sakari Bergen <sakari.bergen@beatwaves.net> | 2008-09-26 08:29:30 +0000 |
---|---|---|
committer | Sakari Bergen <sakari.bergen@beatwaves.net> | 2008-09-26 08:29:30 +0000 |
commit | 572fa80aa713e723f63e1e1822db614307eea6af (patch) | |
tree | 6d8e8ed27d6192790f54482f14e93dda73d3a485 /gtk2_ardour/session_import_dialog.cc | |
parent | 10d57b266cbec7054399f20f8e8c76cdff7e1592 (diff) |
Add Import from session -functionality
git-svn-id: svn://localhost/ardour2/branches/3.0@3805 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/session_import_dialog.cc')
-rw-r--r-- | gtk2_ardour/session_import_dialog.cc | 321 |
1 files changed, 321 insertions, 0 deletions
diff --git a/gtk2_ardour/session_import_dialog.cc b/gtk2_ardour/session_import_dialog.cc new file mode 100644 index 0000000000..42eb7c56cb --- /dev/null +++ b/gtk2_ardour/session_import_dialog.cc @@ -0,0 +1,321 @@ +/* + Copyright (C) 2008 Paul Davis + Author: Sakari Bergen + + 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. + +*/ + +#include "session_import_dialog.h" + +#include <pbd/failed_constructor.h> + +#include <ardour/audio_region_importer.h> +#include <ardour/audio_playlist_importer.h> +#include <ardour/location_importer.h> +#include <ardour/tempo_map_importer.h> + +#include <gtkmm2ext/utils.h> +#include <gtkmm2ext/window_title.h> + +#include "prompter.h" +#include "i18n.h" + +using namespace ARDOUR; + +SessionImportDialog::SessionImportDialog (ARDOUR::Session & target) : + ArdourDialog (_("Import from session")), + target (target), + file_browse_button (_("Browse")) +{ + // 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_hbox.set_spacing (5); + file_hbox.set_border_width (5); + file_hbox.pack_start (file_entry, true, true); + file_hbox.pack_start (file_browse_button, false, false); + + file_frame.add (file_hbox); + file_frame.set_border_width (5); + file_frame.set_name ("ImportFrom"); + file_frame.set_label (_("Import from Session")); + + get_vbox()->pack_start (file_frame, false, false); + + // Session browser + session_tree = Gtk::TreeStore::create (sb_cols); + session_browser.set_model (session_tree); + + session_browser.set_name ("SessionBrowser"); + session_browser.append_column (_("Elements"), sb_cols.name); + session_browser.append_column_editable (_("Import"), sb_cols.queued); + 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_scroll.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + session_scroll.add (session_browser); + session_scroll.set_size_request (220, 400); + + // Connect signals + Gtk::CellRendererToggle *toggle = dynamic_cast<Gtk::CellRendererToggle *> (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)); + + get_vbox()->pack_start (session_scroll, false, false); + + // Tooltips + session_browser.set_has_tooltip(); + session_browser.signal_query_tooltip().connect(mem_fun(*this, &SessionImportDialog::query_tooltip)); + + // 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)); + + // prompt signals + ElementImporter::Rename.connect (mem_fun (*this, &SessionImportDialog::open_rename_dialog)); + ElementImporter::Prompt.connect (mem_fun (*this, &SessionImportDialog::open_prompt_dialog)); + + // Finalize + show_all(); +} + +void +SessionImportDialog::load_session (const string& filename) +{ + tree.read (filename); + AudioRegionImportHandler *region_handler; + + region_handler = new AudioRegionImportHandler (tree, target); + handlers.push_back (HandlerPtr(region_handler)); + handlers.push_back (HandlerPtr(new AudioPlaylistImportHandler (tree, target, *region_handler))); + handlers.push_back (HandlerPtr(new UnusedAudioPlaylistImportHandler (tree, target, *region_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(); + } +} + +void +SessionImportDialog::fill_list () +{ + session_tree->clear(); + + // 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; + row[sb_cols.name] = (*handler)->get_info(); + row[sb_cols.queued] = false; + row[sb_cols.element] = ElementPtr(); // "Null" pointer + + // Loop through elements + 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; + child[sb_cols.name] = (*element)->get_name(); + child[sb_cols.queued] = false; + child[sb_cols.element] = *element; + } + } +} + +void +SessionImportDialog::browse () +{ + Gtk::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); + + int result = dialog.run(); + + if (result == Gtk::RESPONSE_OK) { + string filename = dialog.get_filename(); + + if (filename.length()) { + file_entry.set_text (filename); + load_session (filename); + } + } +} + +void +SessionImportDialog::do_merge () +{ + + // element types + Gtk::TreeModel::Children types = session_browser.get_model()->children(); + Gtk::TreeModel::Children::iterator ti; + for (ti = types.begin(); ti != types.end(); ++ti) { + // elements + Gtk::TreeModel::Children elements = ti->children(); + Gtk::TreeModel::Children::iterator ei; + for (ei = elements.begin(); ei != elements.end(); ++ei) { + if ((*ei)[sb_cols.queued]) { + ElementPtr element = (*ei)[sb_cols.element]; + element->move(); + } + } + } + + end_dialog(); + + 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); + msg.run(); + } +} + + +void +SessionImportDialog::update (string path) +{ + Gtk::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) { + (*cell)[sb_cols.queued] = false; + return; + } + } + + Gtk::TreeModel::Children elements = cell->children(); + Gtk::TreeModel::Children::iterator ei; + for (ei = elements.begin(); ei != elements.end(); ++ei) { + ElementPtr element = (*ei)[sb_cols.element]; + if (element->prepare_move()) { + (*ei)[sb_cols.queued] = true; + } else { + (*cell)[sb_cols.queued] = false; // Not all are selected + } + } + return; + } + + ElementPtr element = (*cell)[sb_cols.element]; + if ((*cell)[sb_cols.queued]) { + if (!element->prepare_move()) { + (*cell)[sb_cols.queued] = false; + } + } else { + element->cancel_move(); + } +} + +void +SessionImportDialog::show_info(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* column) +{ + if (path.size() == 1) { + return; + } + + Gtk::TreeModel::iterator cell = session_browser.get_model()->get_iter (path); + ElementPtr element = (*cell)[sb_cols.element]; + string info = element->get_info(); + + Gtk::MessageDialog msg (info, false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_OK, true); + msg.run(); +} + +bool +SessionImportDialog::query_tooltip(int x, int y, bool keyboard_tooltip, const Glib::RefPtr<Gtk::Tooltip>& tooltip) +{ + Gtk::TreeModel::Path path; + Gtk::TreeViewColumn* column; + int cell_x, cell_y; + + // Get element + session_browser.get_path_at_pos (x, y, path, column, cell_x, cell_y); + if (path.gobj() == 0) { + return false; + } + Gtk::TreeModel::iterator row = session_browser.get_model()->get_iter (path); + //--row; // FIXME Strange offset in rows, if someone figures this out, please fix + ElementPtr element = (*row)[sb_cols.element]; + if (element.get() == 0) { + return false; + } + + // Prepare tooltip + tooltip->set_text(element->get_info()); + + return true; +} + +void +SessionImportDialog::end_dialog () +{ + hide_all(); + + set_modal (false); + ok_button->set_sensitive(true); +} + +std::pair<bool, string> +SessionImportDialog::open_rename_dialog (string text, string name) +{ + ArdourPrompter prompter(true); + string new_name; + + prompter.set_name ("Prompter"); + prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); + prompter.set_prompt (text); + prompter.set_initial_text (name); + + if (prompter.run() == Gtk::RESPONSE_ACCEPT) { + prompter.get_result (new_name); + if (new_name.length()) { + name = new_name; + } + return std::make_pair (true, new_name); + } + return std::make_pair (false, new_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) { + return true; + } + return false; +} |