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