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