diff options
Diffstat (limited to 'gtk2_ardour/sfdb_ui.cc')
-rw-r--r-- | gtk2_ardour/sfdb_ui.cc | 324 |
1 files changed, 184 insertions, 140 deletions
diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc index c4d6d7edfc..5d3be0399b 100644 --- a/gtk2_ardour/sfdb_ui.cc +++ b/gtk2_ardour/sfdb_ui.cc @@ -1,6 +1,5 @@ /* - Copyright (C) 2005 Paul Davis - Written by Taybin Rutkin + Copyright (C) 2005-2006 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 @@ -16,16 +15,17 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ #include <map> #include <cerrno> +#include <sstream> #include <gtkmm/box.h> #include <gtkmm/stock.h> #include <pbd/convert.h> +#include <pbd/tokenizer.h> #include <gtkmm2ext/utils.h> @@ -52,16 +52,16 @@ SoundFileBox::SoundFileBox () : _session(0), current_pid(0), - fields(Gtk::ListStore::create(label_columns)), main_box (false, 3), - top_box (true, 4), bottom_box (true, 4), play_btn(_("Play")), stop_btn(_("Stop")), - add_field_btn(_("Add Field...")), - remove_field_btn(_("Remove Field")) + apply_btn(_("Apply")) { set_name (X_("SoundFileBox")); + + set_size_request (250, 500); + border_frame.set_label (_("Soundfile Info")); border_frame.add (main_box); @@ -75,41 +75,29 @@ SoundFileBox::SoundFileBox () main_box.pack_start(channels, false, false); main_box.pack_start(samplerate, false, false); main_box.pack_start(timecode, false, false); - main_box.pack_start(field_view, true, true); - main_box.pack_start(top_box, false, false); + main_box.pack_start(tags_entry, true, true); + main_box.pack_start(apply_btn, false, false); main_box.pack_start(bottom_box, false, false); - field_view.set_model (fields); - field_view.set_size_request(200, 150); - field_view.append_column (_("Field"), label_columns.field); - field_view.append_column_editable (_("Value"), label_columns.data); - - top_box.set_homogeneous(true); - top_box.pack_start(add_field_btn); - top_box.pack_start(remove_field_btn); - - remove_field_btn.set_sensitive(false); - bottom_box.set_homogeneous(true); bottom_box.pack_start(play_btn); bottom_box.pack_start(stop_btn); +// tags_entry.signal_focus_out_event().connect (mem_fun (*this, &SoundFileBox::tags_entry_left)); play_btn.signal_clicked().connect (mem_fun (*this, &SoundFileBox::play_btn_clicked)); stop_btn.signal_clicked().connect (mem_fun (*this, &SoundFileBox::stop_btn_clicked)); + apply_btn.signal_clicked().connect (mem_fun (*this, &SoundFileBox::apply_btn_clicked)); - add_field_btn.signal_clicked().connect - (mem_fun (*this, &SoundFileBox::add_field_clicked)); - remove_field_btn.signal_clicked().connect - (mem_fun (*this, &SoundFileBox::remove_field_clicked)); - - Gtk::CellRendererText* cell(dynamic_cast<Gtk::CellRendererText*>(field_view.get_column_cell_renderer(1))); - cell->signal_edited().connect (mem_fun (*this, &SoundFileBox::field_edited)); - - field_view.get_selection()->signal_changed().connect (mem_fun (*this, &SoundFileBox::field_selected)); - Library->fields_changed.connect (mem_fun (*this, &SoundFileBox::setup_fields)); + length.set_alignment (0.0f, 0.0f); + format.set_alignment (0.0f, 0.0f); + channels.set_alignment (0.0f, 0.0f); + samplerate.set_alignment (0.0f, 0.0f); + timecode.set_alignment (0.0f, 0.0f); - show_all(); + stop_btn.set_no_show_all (true); stop_btn.hide(); + + show_all(); } void @@ -132,53 +120,52 @@ SoundFileBox::setup_labels (string filename) string error_msg; if(!AudioFileSource::get_soundfile_info (filename, sf_info, error_msg)) { + length.set_text (_("Length: n/a")); + format.set_text (_("Format: n/a")); + channels.set_text (_("Channels: n/a")); + samplerate.set_text (_("Samplerate: n/a")); + timecode.set_text (_("Timecode: n/a")); + tags_entry.set_text (""); + + tags_entry.set_sensitive (false); + play_btn.set_sensitive (false); + apply_btn.set_sensitive (false); + return false; } - length.set_alignment (0.0f, 0.0f); - length.set_text (string_compose(_("Length: %1"), PBD::length2string(sf_info.length, sf_info.samplerate))); - - format.set_alignment (0.0f, 0.0f); + length.set_text (string_compose(_("Length: %1"), length2string(sf_info.length, sf_info.samplerate))); format.set_text (sf_info.format_name); - - channels.set_alignment (0.0f, 0.0f); channels.set_text (string_compose(_("Channels: %1"), sf_info.channels)); - - samplerate.set_alignment (0.0f, 0.0f); samplerate.set_text (string_compose(_("Samplerate: %1"), sf_info.samplerate)); + timecode.set_text (string_compose (_("Timecode: %1"), length2string(sf_info.timecode, sf_info.samplerate))); - timecode.set_alignment (0.0f, 0.0f); - timecode.set_text (string_compose (_("Timecode: %1"), PBD::length2string(sf_info.timecode, sf_info.samplerate))); - - setup_fields (); - + vector<string> tags = Library->get_tags (filename); + + stringstream tag_string; + for (vector<string>::iterator i = tags.begin(); i != tags.end(); ++i) { + if (i != tags.begin()) { + tag_string << ", "; + } + tag_string << *i; + } + tags_entry.set_text (tag_string.str()); + + tags_entry.set_sensitive (true); + if (_session) { + play_btn.set_sensitive (true); + } + apply_btn.set_sensitive (true); + return true; } -void -SoundFileBox::setup_fields () -{ - ENSURE_GUI_THREAD(mem_fun (*this, &SoundFileBox::setup_fields)); - - fields->clear (); - - vector<string> field_list; - Library->get_fields(field_list); - - vector<string>::iterator i; - Gtk::TreeModel::iterator iter; - Gtk::TreeModel::Row row; - for (i = field_list.begin(); i != field_list.end(); ++i) { - if (!(*i == _("channels") || *i == _("samplerate") || - *i == _("resolution") || *i == _("format"))) { - iter = fields->append(); - row = *iter; - - string value = Library->get_field(path, *i); - row[label_columns.field] = *i; - row[label_columns.data] = value; - } - } +bool +SoundFileBox::tags_entry_left (GdkEventFocus* event) +{ + apply_btn_clicked (); + + return true; } void @@ -228,7 +215,6 @@ SoundFileBox::play_btn_clicked () newpair.first = path; newpair.second = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (srclist, 0, srclist[0]->length(), rname, 0, Region::DefaultFlags, false)); - res = region_cache.insert (newpair); the_region = res.first; } @@ -252,57 +238,22 @@ SoundFileBox::stop_btn_clicked () } void -SoundFileBox::add_field_clicked () -{ - ArdourPrompter prompter (true); - string name; - - prompter.set_prompt (_("Name for Field")); - prompter.add_button (Gtk::Stock::ADD, Gtk::RESPONSE_ACCEPT); - prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); - - switch (prompter.run ()) { - case Gtk::RESPONSE_ACCEPT: - prompter.get_result (name); - if (name.length()) { - Library->add_field (name); - Library->save_changes (); - } - break; - - default: - break; - } -} - -void -SoundFileBox::remove_field_clicked () +SoundFileBox::apply_btn_clicked () { - field_view.get_selection()->selected_foreach_iter(mem_fun(*this, &SoundFileBox::delete_row)); + string tag_string = tags_entry.get_text (); - Library->save_changes (); -} + vector<string> tags; -void -SoundFileBox::field_edited (const Glib::ustring& str1, const Glib::ustring& str2) -{ - Gtk::TreeModel::Children rows(fields->children()); - Gtk::TreeModel::Row row(rows[atoi(str1.c_str())]); - - Library->set_field (path, row[label_columns.field], str2); + if (!PBD::tokenize (tag_string, string(","), std::back_inserter (tags), true)) { + warning << _("SoundFileBox: Could not tokenize string: ") << tag_string << endmsg; + return; + } + Library->set_tags (path, tags); Library->save_changes (); } void -SoundFileBox::delete_row (const Gtk::TreeModel::iterator& iter) -{ - Gtk::TreeModel::Row row = *iter; - - Library->remove_field(row[label_columns.field]); -} - -void SoundFileBox::audition_status_changed (bool active) { ENSURE_GUI_THREAD(bind (mem_fun (*this, &SoundFileBox::audition_status_changed), active)); @@ -312,16 +263,6 @@ SoundFileBox::audition_status_changed (bool active) } } -void -SoundFileBox::field_selected () -{ - if (field_view.get_selection()->count_selected_rows()) { - remove_field_btn.set_sensitive(true); - } else { - remove_field_btn.set_sensitive(false); - } -} - // this needs to be kept in sync with the ImportMode enum defined in editing.h and editing_syms.h. static const char *import_mode_strings[] = { N_("Add to Region list"), @@ -333,14 +274,41 @@ static const char *import_mode_strings[] = { SoundFileBrowser::SoundFileBrowser (string title, ARDOUR::Session* s) : ArdourDialog (title, false), - chooser (Gtk::FILE_CHOOSER_ACTION_OPEN) + chooser (Gtk::FILE_CHOOSER_ACTION_OPEN), + found_list (Gtk::ListStore::create(found_list_columns)), + found_list_view (found_list), + found_search_btn (_("Search")) { - get_vbox()->pack_start(chooser); - chooser.set_preview_widget(preview); - chooser.set_select_multiple (true); + set_default_size (700, 500); + Gtk::HBox* hbox = manage(new Gtk::HBox); + hbox->pack_start(notebook); + hbox->pack_start(preview, Gtk::PACK_SHRINK); + get_vbox()->pack_start(*hbox); + + hbox = manage(new Gtk::HBox); + hbox->pack_start (found_entry); + hbox->pack_start (found_search_btn); + + Gtk::VBox* vbox = manage(new Gtk::VBox); + vbox->pack_start (*hbox, Gtk::PACK_SHRINK); + vbox->pack_start (found_list_view); + found_list_view.append_column(_("Paths"), found_list_columns.pathname); + + notebook.append_page (chooser, _("Files")); + notebook.append_page (*vbox, _("Tags")); + + found_list_view.get_selection()->set_mode (Gtk::SELECTION_MULTIPLE); + filter.add_custom (Gtk::FILE_FILTER_FILENAME, mem_fun(*this, &SoundFileBrowser::on_custom)); + chooser.set_filter (filter); + chooser.set_select_multiple (true); chooser.signal_update_preview().connect(mem_fun(*this, &SoundFileBrowser::update_preview)); + found_list_view.get_selection()->signal_changed().connect(mem_fun(*this, &SoundFileBrowser::found_list_view_selected)); + + found_search_btn.signal_clicked().connect(mem_fun(*this, &SoundFileBrowser::found_search_clicked)); + show_all (); + set_session (s); } @@ -350,10 +318,54 @@ SoundFileBrowser::set_session (Session* s) preview.set_session(s); } +bool +SoundFileBrowser::on_custom (const Gtk::FileFilter::Info& filter_info) +{ + return AudioFileSource::safe_file_extension(filter_info.filename); +} + void SoundFileBrowser::update_preview () { - chooser.set_preview_widget_active(preview.setup_labels(chooser.get_filename())); + preview.setup_labels(chooser.get_filename()); +} + +void +SoundFileBrowser::found_list_view_selected () +{ + string file; + + Gtk::TreeView::Selection::ListHandle_Path rows = found_list_view.get_selection()->get_selected_rows (); + + if (!rows.empty()) { + Gtk::TreeIter iter = found_list->get_iter(*rows.begin()); + file = (*iter)[found_list_columns.pathname]; + chooser.set_filename (file); + } + preview.setup_labels (file); +} + +void +SoundFileBrowser::found_search_clicked () +{ + string tag_string = found_entry.get_text (); + + vector<string> tags; + + if (!PBD::tokenize (tag_string, string(","), std::back_inserter (tags), true)) { + warning << _("SoundFileBrowser: Could not tokenize string: ") << tag_string << endmsg; + return; + } + + vector<string> results; + Library->search_members_and (results, tags); + + found_list->clear(); + for (vector<string>::iterator i = results.begin(); i != results.end(); ++i) { + Gtk::TreeModel::iterator new_row = found_list->append(); + Gtk::TreeModel::Row row = *new_row; + row[found_list_columns.pathname] = *i; + } } SoundFileChooser::SoundFileChooser (string title, ARDOUR::Session* s) @@ -362,19 +374,37 @@ SoundFileChooser::SoundFileChooser (string title, ARDOUR::Session* s) { add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_OK); add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); + + chooser.set_select_multiple (false); + found_list_view.get_selection()->set_mode (Gtk::SELECTION_SINGLE); show_all (); } +string +SoundFileChooser::get_filename () +{ + Gtk::TreeModel::iterator iter; + Gtk::TreeModel::Row row; + + switch (notebook.get_current_page()) { + case 0: + return chooser.get_filename(); + case 1: + iter = found_list_view.get_selection()->get_selected(); + row = *iter; + return row[found_list_columns.pathname]; + default: + /* NOT REACHED */ + return ""; + } +} + vector<string> SoundFileOmega::mode_strings; SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s) : SoundFileBrowser (title, s), split_check (_("Split Channels")) { - if (mode_strings.empty()) { - mode_strings = I18N (import_mode_strings); - } - ARDOUR_UI::instance()->tooltips().set_tip(split_check, _("Create a region for each channel")); @@ -382,24 +412,23 @@ SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s) ARDOUR_UI::instance()->tooltips().set_tip(*btn, _("Link to an external file")); - add_button (Gtk::Stock::CLOSE, Gtk::RESPONSE_CLOSE); - btn = add_button (_("Import"), ResponseImport); ARDOUR_UI::instance()->tooltips().set_tip(*btn, _("Copy a file to the session folder")); - Gtk::HBox *box = manage (new Gtk::HBox()); - + add_button (Gtk::Stock::CLOSE, Gtk::RESPONSE_CLOSE); + + if (mode_strings.empty()) { + mode_strings = I18N (import_mode_strings); + } Gtkmm2ext::set_popdown_strings (mode_combo, mode_strings); set_mode (Editing::ImportAsRegion); - box->pack_start (split_check); - box->pack_start (mode_combo); + get_action_area()->pack_start (split_check); + get_action_area()->pack_start (mode_combo); mode_combo.signal_changed().connect (mem_fun (*this, &SoundFileOmega::mode_changed)); - - chooser.set_extra_widget (*box); show_all (); } @@ -413,7 +442,22 @@ SoundFileOmega::get_split () vector<Glib::ustring> SoundFileOmega::get_paths () { - return chooser.get_filenames(); + int n = notebook.get_current_page (); + + if (n == 0) { + return chooser.get_filenames (); + } + + typedef Gtk::TreeView::Selection::ListHandle_Path ListPath; + + vector<Glib::ustring> results; + ListPath rows = found_list_view.get_selection()->get_selected_rows (); + for (ListPath::iterator i = rows.begin() ; i != rows.end(); ++i) { + Gtk::TreeIter iter = found_list->get_iter(*i); + string str = (*iter)[found_list_columns.pathname]; + results.push_back (str); + } + return results; } void |