2 Copyright (C) 2008 Paul Davis
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the Free
7 Software Foundation; either version 2 of the License, or (at your option)
10 This program is distributed in the hope that it will be useful, but WITHOUT
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include <gtkmm/filechooserdialog.h>
22 #include <gtkmm/messagedialog.h>
23 #include <gtkmm/stock.h>
25 #include "pbd/xml++.h"
26 #include "pbd/error.h"
28 #include "ardour/filename_extensions.h"
29 #include "ardour/session.h"
30 #include "ardour/session_utils.h"
32 #include "gtkmm2ext/utils.h"
34 #include "session_metadata_dialog.h"
42 #define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember))
44 /*** MetadataField ***/
46 MetadataField::MetadataField (string const & field_name) :
51 MetadataField::~MetadataField() { }
53 /* TextMetadataField */
55 TextMetadataField::TextMetadataField (Getter getter, Setter setter, string const & field_name, guint width ) :
56 MetadataField (field_name),
67 TextMetadataField::copy ()
69 return MetadataPtr (new TextMetadataField (getter, setter, _name, width));
73 TextMetadataField::save_data (ARDOUR::SessionMetadata & data) const
75 CALL_MEMBER_FN (data, setter) (_value);
79 TextMetadataField::load_data (ARDOUR::SessionMetadata const & data)
81 _value = CALL_MEMBER_FN (data, getter) ();
83 entry->set_text (_value);
88 TextMetadataField::name_widget ()
90 label = Gtk::manage (new Gtk::Label(_name + ':'));
91 label->set_alignment (1, 0.5);
96 TextMetadataField::value_widget ()
98 value_label = Gtk::manage (new Gtk::Label(_value));
103 TextMetadataField::edit_widget ()
105 entry = Gtk::manage (new Gtk::Entry());
107 entry->set_text (_value);
108 entry->set_width_chars (width);
109 entry->signal_changed().connect (sigc::mem_fun(*this, &TextMetadataField::update_value));
115 TextMetadataField::update_value ()
117 _value = entry->get_text ();
120 /* NumberMetadataField */
122 NumberMetadataField::NumberMetadataField (Getter getter, Setter setter, string const & field_name, guint numbers, guint width) :
123 MetadataField (field_name),
135 NumberMetadataField::copy ()
137 return MetadataPtr (new NumberMetadataField (getter, setter, _name, numbers, width));
141 NumberMetadataField::save_data (ARDOUR::SessionMetadata & data) const
143 uint32_t number = str_to_uint (_value);
144 CALL_MEMBER_FN (data, setter) (number);
148 NumberMetadataField::load_data (ARDOUR::SessionMetadata const & data)
150 uint32_t number = CALL_MEMBER_FN (data, getter) ();
151 _value = uint_to_str (number);
153 entry->set_text (_value);
158 NumberMetadataField::update_value ()
160 // Accept only numbers that will fit into a uint32_t
161 uint32_t number = str_to_uint (entry->get_text());
162 _value = uint_to_str (number);
163 entry->set_text (_value);
167 NumberMetadataField::name_widget ()
169 label = Gtk::manage (new Gtk::Label(_name + ':'));
170 label->set_alignment (1, 0.5);
175 NumberMetadataField::value_widget ()
177 value_label = Gtk::manage (new Gtk::Label(_value));
182 NumberMetadataField::edit_widget ()
184 entry = Gtk::manage (new Gtk::Entry());
186 entry->set_text (_value);
187 entry->set_width_chars (width);
188 entry->set_max_length (numbers);
189 entry->signal_changed().connect (sigc::mem_fun(*this, &NumberMetadataField::update_value));
195 NumberMetadataField::uint_to_str (uint32_t i) const
197 std::ostringstream oss ("");
199 if (oss.str().compare("0")) {
207 NumberMetadataField::str_to_uint (string const & str) const
211 while ((i = tmp.find_first_not_of("1234567890")) != string::npos) {
215 std::istringstream iss(tmp);
223 /* EAN13MetadataField */
225 EAN13MetadataField::EAN13MetadataField (Getter getter, Setter setter, string const & field_name, guint width) :
226 MetadataField (field_name),
234 status_label = Gtk::manage (new Gtk::Label (""));
238 EAN13MetadataField::copy ()
240 return MetadataPtr (new EAN13MetadataField (getter, setter, _name, width));
244 EAN13MetadataField::save_data (ARDOUR::SessionMetadata & data) const
246 CALL_MEMBER_FN (data, setter) (_value);
250 EAN13MetadataField::load_data (ARDOUR::SessionMetadata const & data)
252 _value = CALL_MEMBER_FN (data, getter) ();
254 entry->set_text (_value);
260 EAN13MetadataField::update_value ()
262 // Accept only numeric characters
263 _value = numeric_string (entry->get_text());
264 entry->set_text (_value);
269 EAN13MetadataField::update_status ()
271 int len = _value.length ();
273 // calculate EAN-13 modulo 10 check digit
275 const char *p = _value.c_str();
276 for (int i = 0; i < 12; i++) {
288 if (sum == p[12] - '0') {
289 status_label->set_markup (string_compose(
290 "<span color=\"green\">%1: %2</span>",
291 _("EAN Check digit OK"), sum));
293 status_label->set_markup (string_compose(
294 "<span color=\"#ffa755\">%1: %2 (%3 %4)</span>",
295 _("EAN Check digit error"), p[12] - '0', _("expected"), sum));
297 } else if (len > 0) {
298 status_label->set_markup (string_compose(
299 "<span color=\"#ffa755\">%1: %2 (<13)</span>",
300 _("EAN Length error"), len));
302 status_label->set_text("");
307 EAN13MetadataField::name_widget ()
309 label = Gtk::manage (new Gtk::Label(_name + ':'));
310 label->set_alignment (1, 0.5);
315 EAN13MetadataField::value_widget ()
317 value_label = Gtk::manage (new Gtk::Label(_value));
322 EAN13MetadataField::edit_widget ()
324 entry = Gtk::manage (new Gtk::Entry());
326 entry->set_text (_value);
327 entry->set_width_chars (width);
328 entry->set_max_length (13);
329 entry->signal_changed().connect (sigc::mem_fun(*this, &EAN13MetadataField::update_value));
335 EAN13MetadataField::numeric_string (string const & str) const
339 while ((i = tmp.find_first_not_of("1234567890")) != string::npos) {
345 /* SessionMetadataSet */
347 SessionMetadataSet::SessionMetadataSet (string const & name)
353 SessionMetadataSet::add_data_field (MetadataPtr field)
355 list.push_back (field);
358 /* SessionMetadataSetEditable */
360 SessionMetadataSetEditable::SessionMetadataSetEditable (string const & name)
361 : SessionMetadataSet (name)
363 table.set_row_spacings (6);
364 table.set_col_spacings (12);
365 table.set_homogeneous (false);
366 vbox.pack_start (table, false, false);
367 vbox.set_spacing (6);
368 vbox.set_border_width (6);
372 SessionMetadataSetEditable::get_tab_widget ()
374 tab_widget.set_text (name);
379 SessionMetadataSetEditable::set_session (ARDOUR::Session * s)
381 SessionHandlePtr::set_session (s);
387 ARDOUR::SessionMetadata const & data = *(ARDOUR::SessionMetadata::Metadata());
389 table.resize (list.size(), 2);
392 for (DataList::const_iterator it = list.begin(); it != list.end(); ++it) {
394 field->load_data (data);
395 table.attach (field->name_widget(), 0, 1, row, row + 1, Gtk::FILL);
396 table.attach (field->edit_widget(), 1, 2, row, row + 1);
402 SessionMetadataSetEditable::save_data ()
404 ARDOUR::SessionMetadata & data = *(ARDOUR::SessionMetadata::Metadata());
405 for (DataList::const_iterator it = list.begin(); it != list.end(); ++it) {
406 (*it)->save_data(data);
410 /* SessionMetadataSetImportable */
412 SessionMetadataSetImportable::SessionMetadataSetImportable (string const & name)
413 : SessionMetadataSet (name)
414 , session_list (list)
416 tree = Gtk::ListStore::create (tree_cols);
417 tree_view.set_model (tree);
419 Gtk::TreeView::Column * viewcol;
422 Gtk::CellRendererToggle * import_render = Gtk::manage(new Gtk::CellRendererToggle());
423 import_render->signal_toggled().connect (sigc::mem_fun(*this, &SessionMetadataSetImportable::selection_changed));
424 viewcol = Gtk::manage(new Gtk::TreeView::Column (_("Import"), *import_render));
425 viewcol->add_attribute (import_render->property_active(), tree_cols.import);
426 tree_view.append_column (*viewcol);
428 // Add field name column
429 tree_view.append_column(_("Field"), tree_cols.field);
431 // Add values column with pango markup
432 Gtk::CellRendererText * values_render = Gtk::manage(new Gtk::CellRendererText());
433 viewcol = Gtk::manage(new Gtk::TreeView::Column (_("Values (current value on top)"), *values_render));
434 viewcol->add_attribute (values_render->property_markup(), tree_cols.values);
435 tree_view.append_column (*viewcol);
437 select_all_check.signal_toggled().connect (sigc::mem_fun(*this, &SessionMetadataSetImportable::select_all));
441 SessionMetadataSetImportable::get_tab_widget ()
443 tab_widget.set_text (name);
448 SessionMetadataSetImportable::get_select_all_widget ()
450 select_all_check.set_label (name);
451 return select_all_check;
455 SessionMetadataSetImportable::load_extra_data (ARDOUR::SessionMetadata const & data)
458 error << string_compose (_("programming error: %1"), "no session set for SessionMetaDataSetImportable (in load_data)!") << endmsg;
462 ARDOUR::SessionMetadata const & session_data = *(ARDOUR::SessionMetadata::Metadata());
464 MetadataPtr session_field;
465 MetadataPtr import_field;
466 DataList::iterator session_it;
467 DataList::iterator import_it;
469 // Copy list and load data to import
470 for (session_it = session_list.begin(); session_it != session_list.end(); ++session_it) {
471 session_field = *session_it;
472 session_field->load_data(session_data);
473 import_list.push_back (session_field->copy());
477 session_it = session_list.begin();
478 import_it = import_list.begin();
479 while (session_it != session_list.end() && import_it != import_list.end()) { // _should_ be the same...
480 session_field = *session_it;
481 import_field = *import_it;
483 import_field->load_data(data); // hasn't been done yet
485 // Make string for values TODO get color from somewhere?
486 string values = "<span weight=\"ultralight\" color=\"#777\">" + session_field->value() + "</span>\n"
487 + "<span weight=\"bold\">" + import_field->value() + "</span>";
489 Gtk::TreeModel::iterator row_iter = tree->append();
490 Gtk::TreeModel::Row row = *row_iter;
492 row[tree_cols.field] = import_field->name();
493 row[tree_cols.values] = values;
494 row[tree_cols.import] = false;
495 row[tree_cols.data] = import_field;
503 SessionMetadataSetImportable::save_data ()
506 error << string_compose (_("programming error: %1"), "no session set for SessionMetaDataSetImportable (in import_data)!") << endmsg;
510 ARDOUR::SessionMetadata & session_data = *(ARDOUR::SessionMetadata::Metadata());
512 Gtk::TreeModel::Children fields = tree->children();
513 Gtk::TreeModel::Children::iterator it;
514 for (it = fields.begin(); it != fields.end(); ++it) {
515 if ((*it)[tree_cols.import]) {
516 MetadataPtr field = (*it)[tree_cols.data];
517 field->save_data (session_data);
523 SessionMetadataSetImportable::select_all ()
525 select_all_check.set_inconsistent (false);
526 bool state = select_all_check.get_active();
528 Gtk::TreeModel::Children fields = tree->children();
529 Gtk::TreeModel::Children::iterator it;
530 for (it = fields.begin(); it != fields.end(); ++it) {
531 (*it)[tree_cols.import] = state;
536 SessionMetadataSetImportable::selection_changed (string const & path)
538 select_all_check.set_inconsistent (true);
540 Gtk::TreeModel::iterator iter = tree->get_iter (path);
541 bool value((*iter)[tree_cols.import]);
542 (*iter)[tree_cols.import] = !value;
545 /* SessionMetadataDialog */
547 template <typename DataSet>
548 SessionMetadataDialog<DataSet>::SessionMetadataDialog (string const & name) :
549 ArdourDialog (name, true)
551 cancel_button = add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
552 cancel_button->signal_clicked().connect (sigc::mem_fun(*this, &SessionMetadataDialog::end_dialog));
553 save_button = add_button (Gtk::Stock::OK, Gtk::RESPONSE_ACCEPT);
554 save_button->signal_clicked().connect (sigc::mem_fun(*this, &SessionMetadataDialog::save_and_close));
557 template <typename DataSet>
559 SessionMetadataDialog<DataSet>::init_data ( bool skip_user )
562 error << string_compose (_("programming error: %1"), "no session set for SessionMetaDataDialog (in init_data)!") << endmsg;
573 for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it) {
574 (*it)->set_session (_session);
576 notebook.append_page ((*it)->get_widget(), (*it)->get_tab_widget());
580 template <typename DataSet>
582 SessionMetadataDialog<DataSet>::load_extra_data (ARDOUR::SessionMetadata const & data)
584 for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it) {
585 (*it)->load_extra_data (data);
589 template <typename DataSet>
591 SessionMetadataDialog<DataSet>::save_data ()
593 for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it) {
598 template <typename DataSet>
600 SessionMetadataDialog<DataSet>::save_and_close ()
603 _session->set_dirty();
607 template <typename DataSet>
609 SessionMetadataDialog<DataSet>::end_dialog ()
614 template <typename DataSet>
616 SessionMetadataDialog<DataSet>::warn_user (string const & string)
618 Gtk::MessageDialog msg (string, false, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK, true);
622 template <typename DataSet>
623 boost::shared_ptr<std::list<Gtk::Widget *> >
624 SessionMetadataDialog<DataSet>::get_custom_widgets (WidgetFunc f)
626 WidgetListPtr list (new WidgetList);
627 for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it)
629 DataSet * set = dynamic_cast<DataSet *> (it->get());
630 list->push_back (& CALL_MEMBER_FN (*set, f) ());
636 template <typename DataSet>
638 SessionMetadataDialog<DataSet>::add_widget (Gtk::Widget & widget)
640 get_vbox()->pack_start (widget, true, true, 0);
643 template <typename DataSet>
645 SessionMetadataDialog<DataSet>::init_user_data ()
647 DataSetPtr data_set (new DataSet (_("User")));
648 data_list.push_back (data_set);
652 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::user_name, &ARDOUR::SessionMetadata::set_user_name, _("Name")));
653 data_set->add_data_field (ptr);
655 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::user_email, &ARDOUR::SessionMetadata::set_user_email, _("Email")));
656 data_set->add_data_field (ptr);
658 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::user_web, &ARDOUR::SessionMetadata::set_user_web, _("Web")));
659 data_set->add_data_field (ptr);
661 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::organization, &ARDOUR::SessionMetadata::set_organization, _("Organization")));
662 data_set->add_data_field (ptr);
664 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::country, &ARDOUR::SessionMetadata::set_country, _("Country")));
665 data_set->add_data_field (ptr);
669 template <typename DataSet>
671 SessionMetadataDialog<DataSet>::init_track_data ()
673 DataSetPtr data_set (new DataSet (_("Track")));
674 data_list.push_back (data_set);
678 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::title, &ARDOUR::SessionMetadata::set_title, _("Title")));
679 data_set->add_data_field (ptr);
681 ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::track_number, &ARDOUR::SessionMetadata::set_track_number, _("Track Number"), 3));
682 data_set->add_data_field (ptr);
684 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::subtitle, &ARDOUR::SessionMetadata::set_subtitle, _("Subtitle")));
685 data_set->add_data_field (ptr);
687 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::grouping, &ARDOUR::SessionMetadata::set_grouping, _("Grouping")));
688 data_set->add_data_field (ptr);
690 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::artist, &ARDOUR::SessionMetadata::set_artist, _("Artist")));
691 data_set->add_data_field (ptr);
693 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::genre, &ARDOUR::SessionMetadata::set_genre, _("Genre")));
694 data_set->add_data_field (ptr);
696 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::comment, &ARDOUR::SessionMetadata::set_comment, _("Comment")));
697 data_set->add_data_field (ptr);
699 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::copyright, &ARDOUR::SessionMetadata::set_copyright, _("Copyright")));
700 data_set->add_data_field (ptr);
703 template <typename DataSet>
705 SessionMetadataDialog<DataSet>::init_album_data ()
707 DataSetPtr data_set (new DataSet (_("Album")));
708 data_list.push_back (data_set);
712 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::album, &ARDOUR::SessionMetadata::set_album, _("Album")));
713 data_set->add_data_field (ptr);
715 ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::year, &ARDOUR::SessionMetadata::set_year, _("Year"), 4));
716 data_set->add_data_field (ptr);
718 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::album_artist, &ARDOUR::SessionMetadata::set_album_artist, _("Album Artist")));
719 data_set->add_data_field (ptr);
721 ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::total_tracks, &ARDOUR::SessionMetadata::set_total_tracks, _("Total Tracks"), 3));
722 data_set->add_data_field (ptr);
724 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::disc_subtitle, &ARDOUR::SessionMetadata::set_disc_subtitle, _("Disc Subtitle")));
725 data_set->add_data_field (ptr);
727 ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::disc_number, &ARDOUR::SessionMetadata::set_disc_number, _("Disc Number"), 2));
728 data_set->add_data_field (ptr);
730 ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::total_discs, &ARDOUR::SessionMetadata::set_total_discs, _("Total Discs"), 2));
731 data_set->add_data_field (ptr);
733 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::compilation, &ARDOUR::SessionMetadata::set_compilation, _("Compilation")));
734 data_set->add_data_field (ptr);
736 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::isrc, &ARDOUR::SessionMetadata::set_isrc, _("ISRC")));
737 data_set->add_data_field (ptr);
739 ptr = MetadataPtr (new EAN13MetadataField (&ARDOUR::SessionMetadata::barcode, &ARDOUR::SessionMetadata::set_barcode, _("EAN barcode")));
740 data_set->add_data_field (ptr);
742 // EAN13MetadataField is the only kind of MetadataField which has a status label.
743 EAN13MetadataField &emf = (EAN13MetadataField &) *ptr;
744 ((Gtk::VBox &) data_set->get_widget()).pack_end (*emf.status_label);
745 emf.update_status ();
748 template <typename DataSet>
750 SessionMetadataDialog<DataSet>::init_people_data ()
752 DataSetPtr data_set (new DataSet (_("People")));
753 data_list.push_back (data_set);
757 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::lyricist, &ARDOUR::SessionMetadata::set_lyricist, _("Lyricist")));
758 data_set->add_data_field (ptr);
760 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::composer, &ARDOUR::SessionMetadata::set_composer, _("Composer")));
761 data_set->add_data_field (ptr);
763 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::conductor, &ARDOUR::SessionMetadata::set_conductor, _("Conductor")));
764 data_set->add_data_field (ptr);
766 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::remixer, &ARDOUR::SessionMetadata::set_remixer, _("Remixer")));
767 data_set->add_data_field (ptr);
769 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::arranger, &ARDOUR::SessionMetadata::set_arranger, _("Arranger")));
770 data_set->add_data_field (ptr);
772 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::engineer, &ARDOUR::SessionMetadata::set_engineer, _("Engineer")));
773 data_set->add_data_field (ptr);
775 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::producer, &ARDOUR::SessionMetadata::set_producer, _("Producer")));
776 data_set->add_data_field (ptr);
778 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::dj_mixer, &ARDOUR::SessionMetadata::set_dj_mixer, _("DJ Mixer")));
779 data_set->add_data_field (ptr);
781 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::mixer, &ARDOUR::SessionMetadata::set_mixer, S_("Metadata|Mixer")));
782 data_set->add_data_field (ptr);
785 template <typename DataSet>
787 SessionMetadataDialog<DataSet>::init_school_data ()
789 DataSetPtr data_set (new DataSet (_("School")));
790 data_list.push_back (data_set);
794 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::instructor, &ARDOUR::SessionMetadata::set_instructor, _("Instructor")));
795 data_set->add_data_field (ptr);
797 ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::course, &ARDOUR::SessionMetadata::set_course, _("Course")));
798 data_set->add_data_field (ptr);
802 /* SessionMetadataEditor */
804 SessionMetadataEditor::SessionMetadataEditor () :
805 SessionMetadataDialog<SessionMetadataSetEditable> (_("Edit Session Metadata"))
810 SessionMetadataEditor::~SessionMetadataEditor ()
812 // Remove pages from notebook to get rid of gsignal runtime warnings
813 notebook.pages().clear();
817 SessionMetadataEditor::run ()
826 SessionMetadataEditor::init_gui ()
828 add_widget (notebook);
833 /* SessionMetadataImporter */
835 SessionMetadataImporter::SessionMetadataImporter () :
836 SessionMetadataDialog<SessionMetadataSetImportable> (_("Import session metadata"))
841 SessionMetadataImporter::~SessionMetadataImporter ()
843 // Remove pages from notebook to get rid of gsignal runtime warnings
844 notebook.pages().clear();
848 SessionMetadataImporter::run ()
851 error << string_compose (_("programming error: %1"), "no session set for SessionMetaDataImporter (in run)!") << endmsg;
855 /* Open session file selector */
857 Gtk::FileChooserDialog session_selector(_("Choose session to import metadata from"), Gtk::FILE_CHOOSER_ACTION_OPEN);
858 session_selector.add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
859 session_selector.add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
860 session_selector.set_default_response(Gtk::RESPONSE_ACCEPT);
862 Gtk::FileFilter session_filter;
863 session_filter.add_pattern (string_compose(X_("*%1"), ARDOUR::statefile_suffix));
864 session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME));
865 session_selector.add_filter (session_filter);
866 session_selector.set_filter (session_filter);
868 int response = session_selector.run();
869 session_selector.hide ();
872 case Gtk::RESPONSE_ACCEPT:
878 string session_path = session_selector.get_filename();
882 if (session_path.length() > 0) {
883 if (ARDOUR::find_session (session_path, path, name, isnew) != 0) {
890 /* We have a session: load the data and run dialog */
892 string filename = Glib::build_filename (path, name + ARDOUR::statefile_suffix);
893 XMLTree session_tree;
894 if (!session_tree.read (filename)) {
895 warn_user (_("This session file could not be read!"));
899 /* XXX GET VERSION FROM TREE */
902 XMLNode * node = session_tree.root()->child ("Metadata");
905 warn_user (_("The session file didn't contain metadata!\nMaybe this is an old session format?"));
910 ARDOUR::SessionMetadata data;
911 data.set_state (*node, version);
912 init_data ( true ); //skip user data here
913 load_extra_data (data);
920 SessionMetadataImporter::init_gui ()
922 // Select all from -widget
923 add_widget (selection_hbox);
924 selection_label.set_text (_("Import all from:"));
925 selection_hbox.pack_start (selection_label, false, false);
927 WidgetListPtr list = get_custom_widgets (&SessionMetadataSetImportable::get_select_all_widget);
928 for (WidgetList::iterator it = list->begin(); it != list->end(); ++it) {
929 selection_hbox.pack_start (**it, false, false, 6);
932 add_widget (notebook);