new files from sakari, missed last time
[ardour.git] / gtk2_ardour / session_metadata_dialog.cc
1 /*
2     Copyright (C) 2008 Paul Davis 
3     Author: Sakari Bergen
4
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)
8     any later version.
9
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
13     for more details.
14
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.
18 */
19
20 #include "session_metadata_dialog.h"
21
22 #include <sstream>
23
24 #include <gtkmm2ext/utils.h>
25 #include <gtkmm2ext/window_title.h>
26
27 #include "i18n.h"
28 #include <pbd/xml++.h>
29 #include <ardour/session.h>
30 #include <ardour/session_directory.h>
31 #include <ardour/session_utils.h>
32
33 #define CALL_MEMBER_FN(object,ptrToMember)  ((object).*(ptrToMember))
34
35 /*** MetadataField ***/
36
37 MetadataField::MetadataField (ustring const & field_name) :
38   _name (field_name)
39 {
40 }
41
42 MetadataField::~MetadataField() { }
43
44 /* TextMetadataField */
45
46 TextMetadataField::TextMetadataField (Getter getter, Setter setter, ustring const & field_name, guint width ) :
47   MetadataField (field_name),
48   getter (getter),
49   setter (setter),
50   width (width)
51 {
52         entry = 0;
53         label = 0;
54         value_label = 0;
55 }
56
57 MetadataPtr
58 TextMetadataField::copy ()
59 {
60         return MetadataPtr (new TextMetadataField (getter, setter, _name, width));
61 }
62
63 void
64 TextMetadataField::save_data (ARDOUR::SessionMetadata & data) const
65 {
66         CALL_MEMBER_FN (data, setter) (_value);
67 }
68
69 void
70 TextMetadataField::load_data (ARDOUR::SessionMetadata const & data)
71 {
72         _value = CALL_MEMBER_FN (data, getter) ();
73         if (entry) {
74                 entry->set_text (_value);
75         }
76 }
77
78 Gtk::Widget &
79 TextMetadataField::name_widget ()
80 {
81         label = Gtk::manage (new Gtk::Label(_name + ':', Gtk::ALIGN_LEFT));
82         return *label;
83 }
84
85 Gtk::Widget &
86 TextMetadataField::value_widget ()
87 {
88         value_label = Gtk::manage (new Gtk::Label(_value));
89         return *value_label;
90 }
91
92 Gtk::Widget &
93 TextMetadataField::edit_widget ()
94 {
95         entry = Gtk::manage (new Gtk::Entry());
96         
97         entry->set_text (_value);
98         entry->set_width_chars (width);
99         entry->signal_changed().connect (sigc::mem_fun(*this, &TextMetadataField::update_value));
100         
101         return *entry;
102 }
103
104 void
105 TextMetadataField::update_value ()
106 {
107         _value = entry->get_text ();
108 }
109
110 /* NumberMetadataField */
111
112 NumberMetadataField::NumberMetadataField (Getter getter, Setter setter, ustring const & field_name, guint numbers, guint width) :
113   MetadataField (field_name),
114   getter (getter),
115   setter (setter),
116   numbers (numbers),
117   width (width)
118 {
119         entry = 0;
120         label = 0;
121         value_label = 0;
122 }
123
124 MetadataPtr
125 NumberMetadataField::copy ()
126 {
127         return MetadataPtr (new NumberMetadataField (getter, setter, _name, numbers, width));
128 }
129
130 void
131 NumberMetadataField::save_data (ARDOUR::SessionMetadata & data) const
132 {
133         uint32_t number = str_to_uint (_value);
134         CALL_MEMBER_FN (data, setter) (number);
135 }
136
137 void
138 NumberMetadataField::load_data (ARDOUR::SessionMetadata const & data)
139 {
140         uint32_t number = CALL_MEMBER_FN (data, getter) ();
141         _value = uint_to_str (number);
142         if (entry) {
143                 entry->set_text (_value);
144         }
145 }
146
147 void
148 NumberMetadataField::update_value ()
149 {
150         // Accpt only numbers
151         uint32_t number = str_to_uint (entry->get_text());
152         _value = uint_to_str (number);
153         entry->set_text (_value);
154 }
155
156 Gtk::Widget &
157 NumberMetadataField::name_widget ()
158 {
159         label = Gtk::manage (new Gtk::Label(_name + ':', Gtk::ALIGN_LEFT));
160         return *label;
161 }
162
163 Gtk::Widget &
164 NumberMetadataField::value_widget ()
165 {
166         value_label = Gtk::manage (new Gtk::Label(_value));
167         return *value_label;
168 }
169
170 Gtk::Widget &
171 NumberMetadataField::edit_widget ()
172 {
173         entry = Gtk::manage (new Gtk::Entry());
174         
175         entry->set_text (_value);
176         entry->set_width_chars (width);
177         entry->set_max_length (numbers);
178         entry->signal_changed().connect (sigc::mem_fun(*this, &NumberMetadataField::update_value));
179         
180         return *entry;
181 }
182
183 ustring
184 NumberMetadataField::uint_to_str (uint32_t i) const
185 {
186         std::ostringstream oss ("");
187         oss << i;
188         if (oss.str().compare("0")) {
189                 return oss.str();
190         } else {
191                 return "";
192         }
193 }
194
195 uint32_t
196 NumberMetadataField::str_to_uint (ustring const & str) const
197 {
198         ustring tmp (str);
199         ustring::size_type i;
200         while ((i = tmp.find_first_not_of("1234567890")) != ustring::npos) {
201                 tmp.erase (i, 1);
202         }
203         
204         std::istringstream iss(tmp);
205         uint32_t result = 0;
206         iss >> result;
207         return result;
208 }
209
210
211 /* SessionMetadataSet */
212
213 SessionMetadataSet::SessionMetadataSet (ustring const & name) :
214   name (name)
215 {
216         session = 0;
217 }
218
219 void
220 SessionMetadataSet::add_data_field (MetadataPtr field)
221 {
222         list.push_back (field);
223 }
224
225 /* SessionMetadataSetEditable */
226
227 SessionMetadataSetEditable::SessionMetadataSetEditable (ustring const & name) :
228   SessionMetadataSet (name)
229 {
230         table.set_row_spacings (6);
231         table.set_col_spacings (12);
232 }
233
234 Gtk::Widget &
235 SessionMetadataSetEditable::get_tab_widget ()
236 {
237         tab_widget.set_text (name);
238         return tab_widget;
239 }
240
241 void
242 SessionMetadataSetEditable::set_session (ARDOUR::Session * s)
243 {
244         session = s;
245         
246         ARDOUR::SessionMetadata const & data = session->metadata();
247         
248         table.resize (list.size(), 2);
249         uint32_t row = 0;
250         MetadataPtr field;
251         for (DataList::const_iterator it = list.begin(); it != list.end(); ++it) {
252                 field = *it;
253                 field->load_data (data);
254                 table.attach (field->name_widget(), 0, 1, row, row + 1);
255                 table.attach (field->edit_widget(), 1, 2, row, row + 1);
256                 ++row;
257         }
258 }
259
260 void
261 SessionMetadataSetEditable::save_data ()
262 {
263         ARDOUR::SessionMetadata & data = session->metadata();
264         for (DataList::const_iterator it = list.begin(); it != list.end(); ++it) {
265                 (*it)->save_data(data);
266         }
267 }
268
269 /* SessionMetadataSetImportable */
270
271 SessionMetadataSetImportable::SessionMetadataSetImportable (ustring const & name) :
272   SessionMetadataSet (name),
273   session_list (list)
274 {
275         tree = Gtk::ListStore::create (tree_cols);
276         tree_view.set_model (tree);
277         
278         Gtk::TreeView::Column * viewcol;
279         
280         // Add import column
281         Gtk::CellRendererToggle * import_render = Gtk::manage(new Gtk::CellRendererToggle());
282         import_render->signal_toggled().connect (sigc::mem_fun(*this, &SessionMetadataSetImportable::selection_changed));
283         viewcol = Gtk::manage(new Gtk::TreeView::Column (_("Import"), *import_render));
284         viewcol->add_attribute (import_render->property_active(), tree_cols.import);
285         tree_view.append_column (*viewcol);
286         
287         // Add field name column
288         tree_view.append_column(_("Field"), tree_cols.field);
289         
290         // Add values column with pango markup
291         Gtk::CellRendererText * values_render = Gtk::manage(new Gtk::CellRendererText());
292         viewcol = Gtk::manage(new Gtk::TreeView::Column (_("Values (current value on top)"), *values_render));
293         viewcol->add_attribute (values_render->property_markup(), tree_cols.values);
294         tree_view.append_column (*viewcol);
295         
296         select_all_check.signal_toggled().connect (sigc::mem_fun(*this, &SessionMetadataSetImportable::select_all));
297         
298         session = 0;
299 }
300
301 Gtk::Widget &
302 SessionMetadataSetImportable::get_tab_widget ()
303 {
304         tab_widget.set_text (name);
305         return tab_widget;
306 }
307
308 Gtk::Widget &
309 SessionMetadataSetImportable::get_select_all_widget ()
310 {
311         select_all_check.set_label (name);
312         return select_all_check;
313 }
314
315 void
316 SessionMetadataSetImportable::load_extra_data (ARDOUR::SessionMetadata const & data)
317 {
318         if (!session) {
319                 std::cerr << "Programming error: no session set for SessionMetaDataSetImportable (in load_data)!" << std::endl;
320                 return;
321         }
322         
323         ARDOUR::SessionMetadata & session_data = session->metadata();
324         
325         MetadataPtr session_field;
326         MetadataPtr import_field;
327         DataList::iterator session_it;
328         DataList::iterator import_it;
329         
330         // Copy list and load data to import
331         for (session_it = session_list.begin(); session_it != session_list.end(); ++session_it) {
332                 session_field = *session_it;
333                 session_field->load_data(session_data);
334                 import_list.push_back (session_field->copy());
335         }
336
337         // Fill widget
338         session_it = session_list.begin();
339         import_it = import_list.begin();
340         while (session_it != session_list.end() && import_it != import_list.end()) { // _should_ be the same...
341                 session_field = *session_it;
342                 import_field = *import_it;
343                 
344                 import_field->load_data(data); // hasn't been done yet
345                 
346                 // Make string for values TODO get color from somewhere?
347                 ustring values = "<span weight=\"ultralight\" color=\"#777\">" + session_field->value() + "</span>\n"
348                                 + "<span weight=\"bold\">" + import_field->value() + "</span>";
349                 
350                 Gtk::TreeModel::iterator row_iter = tree->append();
351                 Gtk::TreeModel::Row row = *row_iter;
352
353                 row[tree_cols.field] = import_field->name();
354                 row[tree_cols.values] = values;
355                 row[tree_cols.import] = false;
356                 row[tree_cols.data] = import_field;
357                 
358                 ++session_it;
359                 ++import_it;
360         }
361 }
362
363 void
364 SessionMetadataSetImportable::save_data ()
365 {
366         if (!session) {
367                 std::cerr << "Programming error: no session set for SessionMetaDataSetImportable (in import_data)!" << std::endl;
368                 return;
369         }
370
371         ARDOUR::SessionMetadata & session_data = session->metadata();
372
373         Gtk::TreeModel::Children fields = tree->children();
374         Gtk::TreeModel::Children::iterator it;
375         for (it = fields.begin(); it != fields.end(); ++it) {
376                 if ((*it)[tree_cols.import]) {
377                         MetadataPtr field = (*it)[tree_cols.data];
378                         field->save_data (session_data);
379                 }
380         }
381 }
382
383 void
384 SessionMetadataSetImportable::select_all ()
385 {
386         select_all_check.set_inconsistent (false);
387         bool state = select_all_check.get_active();
388         
389         Gtk::TreeModel::Children fields = tree->children();
390         Gtk::TreeModel::Children::iterator it;
391         for (it = fields.begin(); it != fields.end(); ++it) {
392                 (*it)[tree_cols.import] = state;
393         }
394 }
395
396 void
397 SessionMetadataSetImportable::selection_changed (ustring const & path)
398 {
399         select_all_check.set_inconsistent (true);
400         
401         Gtk::TreeModel::iterator iter = tree->get_iter (path);
402         bool value((*iter)[tree_cols.import]);
403         (*iter)[tree_cols.import] = !value;
404 }
405
406 /* SessionMetadataDialog */
407
408 template <typename DataSet>
409 SessionMetadataDialog<DataSet>::SessionMetadataDialog (ustring const & name) :
410   ArdourDialog (name, true)
411 {
412         cancel_button = add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
413         cancel_button->signal_clicked().connect (mem_fun(*this, &SessionMetadataDialog::end_dialog));
414         save_button = add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
415         save_button->signal_clicked().connect (mem_fun(*this, &SessionMetadataDialog::save_and_close));
416 }
417
418 template <typename DataSet>
419 void
420 SessionMetadataDialog<DataSet>::init_data ()
421 {
422         if (!session) {
423                 std::cerr << "Programming error: no session set for SessionMetaDataDialog (in init_data)!" << std::endl;
424                 return;
425         }
426         
427         init_track_data ();
428         init_album_data ();
429         init_people_data ();
430         
431         for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it) {
432                 (*it)->set_session (session);
433                 
434                 notebook.append_page ((*it)->get_widget(), (*it)->get_tab_widget());
435         }
436 }
437
438 template <typename DataSet>
439 void
440 SessionMetadataDialog<DataSet>::load_extra_data (ARDOUR::SessionMetadata const & data)
441 {
442         for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it) {
443                 (*it)->load_extra_data (data);
444         }
445 }
446
447 template <typename DataSet>
448 void
449 SessionMetadataDialog<DataSet>::save_data ()
450 {
451         for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it) {
452                 (*it)->save_data ();
453         }
454 }
455
456 template <typename DataSet>
457 void
458 SessionMetadataDialog<DataSet>::save_and_close ()
459 {
460         save_data ();
461         end_dialog ();
462 }
463
464 template <typename DataSet>
465 void
466 SessionMetadataDialog<DataSet>::end_dialog ()
467 {
468         hide_all();
469 }
470
471 template <typename DataSet>
472 void
473 SessionMetadataDialog<DataSet>::warn_user (ustring const & string)
474 {
475         Gtk::MessageDialog msg (string, false, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK, true);
476         msg.run();
477 }
478
479 template <typename DataSet>
480 boost::shared_ptr<std::list<Gtk::Widget *> >
481 SessionMetadataDialog<DataSet>::get_custom_widgets (WidgetFunc f)
482 {
483         WidgetListPtr list (new WidgetList);
484         for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it)
485         {
486                 DataSet * set = dynamic_cast<DataSet *> (it->get());
487                 list->push_back (& CALL_MEMBER_FN (*set, f) ());
488         }
489         
490         return list;
491 }
492
493 template <typename DataSet>
494 void
495 SessionMetadataDialog<DataSet>::add_widget (Gtk::Widget & widget)
496 {
497         get_vbox()->pack_start (widget, true, true, 0);
498 }
499
500 template <typename DataSet>
501 void
502 SessionMetadataDialog<DataSet>::init_track_data ()
503 {
504         DataSetPtr data_set (new DataSet (_("Track")));
505         data_list.push_back (data_set);
506
507         MetadataPtr ptr;
508         
509         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::title, &ARDOUR::SessionMetadata::set_title, _("Title")));
510         data_set->add_data_field (ptr);
511         
512         ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::track_number, &ARDOUR::SessionMetadata::set_track_number, _("Track Number"), 3));
513         data_set->add_data_field (ptr);
514         
515         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::subtitle, &ARDOUR::SessionMetadata::set_subtitle, _("Subtitle")));
516         data_set->add_data_field (ptr);
517         
518         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::grouping, &ARDOUR::SessionMetadata::set_grouping, _("Grouping")));
519         data_set->add_data_field (ptr);
520         
521         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::artist, &ARDOUR::SessionMetadata::set_artist, _("Artist")));
522         data_set->add_data_field (ptr);
523         
524         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::genre, &ARDOUR::SessionMetadata::set_genre, _("Genre")));
525         data_set->add_data_field (ptr);
526         
527         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::comment, &ARDOUR::SessionMetadata::set_comment, _("Comment")));
528         data_set->add_data_field (ptr);
529         
530         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::copyright, &ARDOUR::SessionMetadata::set_copyright, _("Copyright")));
531         data_set->add_data_field (ptr);
532 }
533
534 template <typename DataSet>
535 void
536 SessionMetadataDialog<DataSet>::init_album_data ()
537 {
538         DataSetPtr data_set (new DataSet (_("Album")));
539         data_list.push_back (data_set);
540         
541         MetadataPtr ptr;
542         
543         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::album, &ARDOUR::SessionMetadata::set_album, _("Album")));
544         data_set->add_data_field (ptr);
545         
546         ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::year, &ARDOUR::SessionMetadata::set_year, _("Year"), 4));
547         data_set->add_data_field (ptr);
548         
549         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::album_artist, &ARDOUR::SessionMetadata::set_album_artist, _("Album Artist")));
550         data_set->add_data_field (ptr);
551         
552         ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::total_tracks, &ARDOUR::SessionMetadata::set_total_tracks, _("Total Tracks"), 3));
553         data_set->add_data_field (ptr);
554         
555         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::disc_subtitle, &ARDOUR::SessionMetadata::set_disc_subtitle, _("Disc Subtitle")));
556         data_set->add_data_field (ptr);
557         
558         ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::disc_number, &ARDOUR::SessionMetadata::set_disc_number, _("Disc Number"), 2));
559         data_set->add_data_field (ptr);
560         
561         ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::total_discs, &ARDOUR::SessionMetadata::set_total_discs, _("Total Discs"), 2));
562         data_set->add_data_field (ptr);
563         
564         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::compilation, &ARDOUR::SessionMetadata::set_compilation, _("Compilation")));
565         data_set->add_data_field (ptr);
566         
567         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::isrc, &ARDOUR::SessionMetadata::set_isrc, _("ISRC")));
568         data_set->add_data_field (ptr);
569 }
570
571 template <typename DataSet>
572 void
573 SessionMetadataDialog<DataSet>::init_people_data ()
574 {
575         DataSetPtr data_set (new DataSet (_("People")));
576         data_list.push_back (data_set);
577
578         MetadataPtr ptr;
579         
580         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::lyricist, &ARDOUR::SessionMetadata::set_lyricist, _("Lyricist")));
581         data_set->add_data_field (ptr);
582         
583         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::composer, &ARDOUR::SessionMetadata::set_composer, _("Composer")));
584         data_set->add_data_field (ptr);
585         
586         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::conductor, &ARDOUR::SessionMetadata::set_conductor, _("Conductor")));
587         data_set->add_data_field (ptr);
588         
589         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::remixer, &ARDOUR::SessionMetadata::set_remixer, _("Remixer")));
590         data_set->add_data_field (ptr);
591         
592         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::arranger, &ARDOUR::SessionMetadata::set_arranger, _("Arranger")));
593         data_set->add_data_field (ptr);
594         
595         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::engineer, &ARDOUR::SessionMetadata::set_engineer, _("Engineer")));
596         data_set->add_data_field (ptr);
597         
598         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::producer, &ARDOUR::SessionMetadata::set_producer, _("Producer")));
599         data_set->add_data_field (ptr);
600         
601         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::dj_mixer, &ARDOUR::SessionMetadata::set_dj_mixer, _("DJ Mixer")));
602         data_set->add_data_field (ptr);
603         
604         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::mixer, &ARDOUR::SessionMetadata::set_mixer, _("Mixer")));
605         data_set->add_data_field (ptr);
606 }
607
608 /* SessionMetadataEditor */
609
610 SessionMetadataEditor::SessionMetadataEditor () :
611   SessionMetadataDialog<SessionMetadataSetEditable> (_("Edit session metadata"))
612 {
613
614 }
615
616 SessionMetadataEditor::~SessionMetadataEditor ()
617 {
618         // Remove pages from notebook to get rid of gsignal runtime warnings
619         notebook.pages().clear();
620 }
621
622 void
623 SessionMetadataEditor::run ()
624 {       
625         init_data ();
626         init_gui();
627         
628         ArdourDialog::run();
629 }
630
631 void
632 SessionMetadataEditor::init_gui ()
633 {
634         add_widget (notebook);
635         
636         show_all();
637 }
638
639 /* SessionMetadataImporter */
640
641 SessionMetadataImporter::SessionMetadataImporter () :
642   SessionMetadataDialog<SessionMetadataSetImportable> (_("Import session metadata"))
643 {
644
645 }
646
647 SessionMetadataImporter::~SessionMetadataImporter ()
648 {
649         // Remove pages from notebook to get rid of gsignal runtime warnings
650         notebook.pages().clear();
651 }
652
653 void
654 SessionMetadataImporter::run ()
655 {       
656         if (!session) {
657                 std::cerr << "Programming error: no session set for SessionMetaDataImporter (in run)!" << std::endl;
658                 return;
659         }
660
661         /* Open session file selector */
662         
663         Gtk::FileChooserDialog session_selector(_("Choose session to import metadata from"), Gtk::FILE_CHOOSER_ACTION_OPEN);
664         session_selector.add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
665         session_selector.add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
666         session_selector.set_default_response(Gtk::RESPONSE_ACCEPT);
667
668         Gtk::FileFilter session_filter;
669         session_filter.add_pattern ("*.ardour");
670         session_filter.set_name (_("Ardour sessions"));
671         session_selector.add_filter (session_filter);
672         session_selector.set_filter (session_filter);
673
674         int response = session_selector.run();
675         session_selector.hide ();
676
677         switch (response) {
678         case Gtk::RESPONSE_ACCEPT:
679                 break;
680         default:
681                 return;
682         }
683
684         string session_path = session_selector.get_filename();
685         string path, name;
686         bool isnew;
687
688         if (session_path.length() > 0) {
689                 if (ARDOUR::find_session (session_path, path, name, isnew) != 0) {
690                         return;
691                 }
692         } else {
693                 return;
694         }
695         
696         /* We have a session: load the data and run dialog */
697         
698         string filename = Glib::build_filename (path, name + ".ardour");
699         XMLTree session_tree;
700         if (!session_tree.read (filename)) {
701                 warn_user (_("A proper ardour session file was not selected!"));
702                 return;
703         }
704         
705         XMLNode * node = session_tree.root()->child ("Metadata");
706         
707         if (!node) {
708                 warn_user (_("The session file didn't contain metadata!\nMaybe this is an old session format?"));
709                 return;
710         }
711         
712         ARDOUR::SessionMetadata data;
713         data.set_state (*node);
714         
715         init_data ();
716         load_extra_data (data);
717         init_gui();
718         
719         ArdourDialog::run();
720 }
721
722 void
723 SessionMetadataImporter::init_gui ()
724 {
725         // Select all from -widget
726         add_widget (selection_hbox);
727         selection_label.set_text (_("Import all from:"));
728         selection_hbox.pack_start (selection_label, false, false);
729         
730         WidgetListPtr list = get_custom_widgets (&SessionMetadataSetImportable::get_select_all_widget);
731         for (WidgetList::iterator it = list->begin(); it != list->end(); ++it) {
732                 selection_hbox.pack_start (**it, false, false, 6);
733         }
734
735         add_widget (notebook);
736         
737         show_all();
738 }