diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2007-09-02 15:17:13 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2007-09-02 15:17:13 +0000 |
commit | f2a2e9c00281c9bfe5ff7df31cdc8860129b282c (patch) | |
tree | e45988a790da04e1e72e917d2b0f7935526fe8a2 /gtk2_ardour/sfdb_ui.cc | |
parent | 6c2728f9815bcdbf1cbd702f271344e295ddb074 (diff) |
limited history depth (no GUI yet); more work on import dialog and semantics
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@2361 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/sfdb_ui.cc')
-rw-r--r-- | gtk2_ardour/sfdb_ui.cc | 256 |
1 files changed, 187 insertions, 69 deletions
diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc index 819d13aa5b..0abb810bc2 100644 --- a/gtk2_ardour/sfdb_ui.cc +++ b/gtk2_ardour/sfdb_ui.cc @@ -295,7 +295,6 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S found_list_view (found_list), import (rgroup2, _("Copy to Ardour-native files")), embed (rgroup2, _("Use file without copying")), - mode (ImportAsTrack), found_search_btn (_("Search")), selected_track_cnt (selected_tracks) { @@ -303,8 +302,9 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S VBox* vbox; HBox* hbox; HBox* hpacker; - + set_session (s); + resetting_ourselves = false; vpacker = manage (new VBox); vpacker->pack_start (preview, true, true); @@ -320,6 +320,25 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S options.set_spacing (12); + vector<string> action_strings; + vector<string> where_strings; + + action_strings.push_back (_("as new tracks")); + if (selected_track_cnt > 0) { + action_strings.push_back (_("to selected tracks")); + } + action_strings.push_back (_("to the region list")); + action_strings.push_back (_("as new tape tracks")); + set_popdown_strings (action_combo, action_strings); + action_combo.set_active_text (action_strings.front()); + + where_strings.push_back (_("use file timestamp")); + where_strings.push_back (_("at edit cursor")); + where_strings.push_back (_("at playhead")); + where_strings.push_back (_("at session start")); + set_popdown_strings (where_combo, where_strings); + where_combo.set_active_text (where_strings.front()); + Label* l = manage (new Label); l->set_text (_("Add files:")); @@ -358,6 +377,8 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S options.pack_start (*vbox, false, false); reset_options (); + + action_combo.signal_changed().connect (mem_fun (*this, &SoundFileBrowser::reset_options_noret)); block_four.pack_start (import, false, false); block_four.pack_start (embed, false, false); @@ -394,6 +415,7 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S chooser.add_filter (matchall_filter); chooser.set_select_multiple (true); chooser.signal_update_preview().connect(mem_fun(*this, &SoundFileBrowser::update_preview)); + chooser.signal_selection_changed().connect (mem_fun (*this, &SoundFileBrowser::file_selection_changed)); chooser.signal_file_activated().connect (mem_fun (*this, &SoundFileBrowser::chooser_file_activated)); if (!persistent_folder.empty()) { @@ -405,10 +427,19 @@ SoundFileBrowser::SoundFileBrowser (Gtk::Window& parent, string title, ARDOUR::S found_search_btn.signal_clicked().connect(mem_fun(*this, &SoundFileBrowser::found_search_clicked)); found_entry.signal_activate().connect(mem_fun(*this, &SoundFileBrowser::found_search_clicked)); - add_button (Stock::OK, RESPONSE_OK); add_button (Stock::CANCEL, RESPONSE_CANCEL); + add_button (Stock::OK, RESPONSE_OK); + + /* setup disposition map */ - set_response_sensitive (RESPONSE_OK, false); + disposition_map.insert (pair<Glib::ustring,ImportChannel>(_("one track per file"), ImportDistinctFiles)); + disposition_map.insert (pair<Glib::ustring,ImportChannel>(_("one track per channel"), ImportDistinctChannels)); + disposition_map.insert (pair<Glib::ustring,ImportChannel>(_("merge files"), ImportMergeFiles)); + disposition_map.insert (pair<Glib::ustring,ImportChannel>(_("sequence files"), ImportSerializeFiles)); + + disposition_map.insert (pair<Glib::ustring,ImportChannel>(_("one region per file"), ImportDistinctFiles)); + disposition_map.insert (pair<Glib::ustring,ImportChannel>(_("one region per channel"), ImportDistinctChannels)); + disposition_map.insert (pair<Glib::ustring,ImportChannel>(_("all files in one region"), ImportMergeFiles)); } SoundFileBrowser::~SoundFileBrowser () @@ -417,6 +448,24 @@ SoundFileBrowser::~SoundFileBrowser () } void +SoundFileBrowser::file_selection_changed () +{ + if (resetting_ourselves) { + return; + } + + if (!reset_options ()) { + set_response_sensitive (RESPONSE_OK, false); + } else { + if (chooser.get_filenames().size() > 0) { + set_response_sensitive (RESPONSE_OK, true); + } else { + set_response_sensitive (RESPONSE_OK, false); + } + } +} + +void SoundFileBrowser::chooser_file_activated () { preview.audition (); @@ -438,32 +487,36 @@ SoundFileBrowser::set_session (Session* s) bool SoundFileBrowser::on_custom (const FileFilter::Info& filter_info) { - return AudioFileSource::safe_file_extension(filter_info.filename); + return AudioFileSource::safe_file_extension (filter_info.filename); } void SoundFileBrowser::update_preview () { preview.setup_labels (chooser.get_filename()); - set_response_sensitive (RESPONSE_OK, true); - reset_options (); } void SoundFileBrowser::found_list_view_selected () { - Glib::ustring file; - - TreeView::Selection::ListHandle_Path rows = found_list_view.get_selection()->get_selected_rows (); - - if (!rows.empty()) { - TreeIter iter = found_list->get_iter(*rows.begin()); - file = (*iter)[found_list_columns.pathname]; - chooser.set_filename (file); + if (!reset_options ()) { + set_response_sensitive (RESPONSE_OK, false); + } else { + Glib::ustring file; + + TreeView::Selection::ListHandle_Path rows = found_list_view.get_selection()->get_selected_rows (); + + if (!rows.empty()) { + TreeIter iter = found_list->get_iter(*rows.begin()); + file = (*iter)[found_list_columns.pathname]; + chooser.set_filename (file); + set_response_sensitive (RESPONSE_OK, true); + } else { + set_response_sensitive (RESPONSE_OK, false); + } + + preview.setup_labels (file); } - preview.setup_labels (file); - set_response_sensitive (RESPONSE_OK, true); - reset_options (); } void @@ -524,95 +577,155 @@ SoundFileBrowser::get_paths () } void +SoundFileBrowser::reset_options_noret () +{ + (void) reset_options (); +} + +bool SoundFileBrowser::reset_options () { vector<Glib::ustring> paths = get_paths (); - bool selection_includes_multichannel = check_multichannel_status (paths); - bool selection_can_be_embedded_with_links = check_link_status (*session, paths); - vector<string> action_strings; - vector<string> where_strings; - vector<string> channel_strings; + if (paths.empty()) { - action_strings.push_back (_("as new tracks")); - if (selected_track_cnt > 0) { - action_strings.push_back (_("to selected tracks")); - } - action_strings.push_back (_("to the region list")); - action_strings.push_back (_("as new tape tracks")); + channel_combo.set_sensitive (false); + action_combo.set_sensitive (false); + where_combo.set_sensitive (false); + import.set_sensitive (false); + embed.set_sensitive (false); + return false; - set_popdown_strings (action_combo, action_strings); - action_combo.set_active_text (action_strings.front()); + } else { - where_strings.push_back (_("use file timestamp")); - where_strings.push_back (_("at edit cursor")); - where_strings.push_back (_("at playhead")); - where_strings.push_back (_("at session start")); - - set_popdown_strings (where_combo, where_strings); - where_combo.set_active_text (where_strings.front()); + channel_combo.set_sensitive (true); + action_combo.set_sensitive (true); + where_combo.set_sensitive (true); + import.set_sensitive (true); + embed.set_sensitive (true); + + } - if (mode == ImportAsTrack) { - channel_strings.push_back (_("one file per track")); + bool same_size; + bool err; + bool selection_includes_multichannel = check_multichannel_status (paths, same_size, err); + bool selection_can_be_embedded_with_links = check_link_status (*session, paths); + ImportMode mode; + + if (err) { + Glib::signal_idle().connect (mem_fun (*this, &SoundFileBrowser::bad_file_message)); + return false; + } + + if ((mode = get_mode()) == ImportAsRegion) { + where_combo.set_sensitive (false); + } else { + where_combo.set_sensitive (true); + } + + vector<string> channel_strings; + + if (mode == ImportAsTrack || mode == ImportAsTapeTrack || mode == ImportToTrack) { + channel_strings.push_back (_("one track per file")); if (selection_includes_multichannel) { - channel_strings.push_back (_("one channel per track")); + channel_strings.push_back (_("one track per channel")); } + if (paths.size() > 1) { - channel_strings.push_back (_("all files in one track")); + /* tape tracks are a single region per track, so we cannot + sequence multiple files. + */ + if (mode != ImportAsTapeTrack) { + channel_strings.push_back (_("sequence files")); + } + if (same_size) { + channel_strings.push_back (_("all files in one track")); + } + } - channel_combo.show(); + } else { - channel_combo.hide(); + channel_strings.push_back (_("one region per file")); + + if (selection_includes_multichannel) { + channel_strings.push_back (_("one region per channel")); + } + + if (paths.size() > 1) { + if (same_size) { + channel_strings.push_back (_("all files in one region")); + } + } } set_popdown_strings (channel_combo, channel_strings); channel_combo.set_active_text (channel_strings.front()); - + if (Profile->get_sae()) { if (selection_can_be_embedded_with_links) { - block_four.show (); + embed.set_sensitive (true); } else { - block_four.hide (); + embed.set_sensitive (false); } } else { - block_four.show (); - } - - if ((mode == ImportAsTrack || mode == ImportAsTapeTrack) && paths.size() == 2) { - merge_stereo.set_sensitive (true); - } else { - merge_stereo.set_sensitive (false); + embed.set_sensitive (true); } - if (selection_includes_multichannel) { - split_files.set_sensitive (true); - } else { - split_files.set_sensitive (false); - } + return true; } bool -SoundFileBrowser::check_multichannel_status (const vector<Glib::ustring>& paths) +SoundFileBrowser::bad_file_message() +{ + MessageDialog msg (*this, + _("One or more of the selected files\ncannot be used by Ardour"), + true, + Gtk::MESSAGE_INFO, + Gtk::BUTTONS_OK); + msg.run (); + resetting_ourselves = true; + chooser.unselect_uri (chooser.get_preview_uri()); + resetting_ourselves = false; +} + +bool +SoundFileBrowser::check_multichannel_status (const vector<Glib::ustring>& paths, bool& same_size, bool& err) { SNDFILE* sf; SF_INFO info; - + nframes64_t sz = 0; + bool some_mult = false; + + same_size = true; + err = false; + for (vector<Glib::ustring>::const_iterator i = paths.begin(); i != paths.end(); ++i) { info.format = 0; // libsndfile says to clear this before sf_open(). if ((sf = sf_open ((char*) (*i).c_str(), SFM_READ, &info)) != 0) { sf_close (sf); + if (info.channels > 1) { - return true; + some_mult = true; } + + if (sz == 0) { + sz = info.frames; + } else { + if (sz != info.frames) { + same_size = false; + } + } + } else { + err = true; } } - return false; + return some_mult; } bool @@ -720,13 +833,18 @@ SoundFileBrowser::get_position() const ImportChannel SoundFileBrowser::get_channel_disposition () const { + /* we use a map here because the channel combo can contain different strings + depending on the state of the other combos. the map contains all possible strings + and the ImportDisposition enum that corresponds to it. + */ + Glib::ustring str = channel_combo.get_active_text(); + DispositionMap::const_iterator x = disposition_map.find (str); - if (str == _("one file per track")) { - return ImportThingPerFile; - } else if (str == _("one channel per track")) { - return ImportThingPerChannel; - } else { - return ImportThingForAll; + if (x == disposition_map.end()) { + fatal << string_compose (_("programming error: %1"), "unknown string for import disposition") << endmsg; + /*NOTREACHED*/ } + + return x->second; } |