Tidy up window titles, according to GNOME HIG and as suggested in mantis 2803.
[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
26 #include "pbd/xml++.h"
27 #include "ardour/session.h"
28 #include "ardour/session_directory.h"
29 #include "ardour/session_utils.h"
30
31 #include "i18n.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         vbox.pack_start (table, false, false);
236         vbox.set_spacing (6);
237         vbox.set_border_width (6);
238 }
239
240 Gtk::Widget &
241 SessionMetadataSetEditable::get_tab_widget ()
242 {
243         tab_widget.set_text (name);
244         return tab_widget;
245 }
246
247 void
248 SessionMetadataSetEditable::set_session (ARDOUR::Session * s)
249 {
250         session = s;
251
252         ARDOUR::SessionMetadata const & data = session->metadata();
253
254         table.resize (list.size(), 2);
255         uint32_t row = 0;
256         MetadataPtr field;
257         for (DataList::const_iterator it = list.begin(); it != list.end(); ++it) {
258                 field = *it;
259                 field->load_data (data);
260                 table.attach (field->name_widget(), 0, 1, row, row + 1);
261                 table.attach (field->edit_widget(), 1, 2, row, row + 1);
262                 ++row;
263         }
264 }
265
266 void
267 SessionMetadataSetEditable::save_data ()
268 {
269         ARDOUR::SessionMetadata & data = session->metadata();
270         for (DataList::const_iterator it = list.begin(); it != list.end(); ++it) {
271                 (*it)->save_data(data);
272         }
273 }
274
275 /* SessionMetadataSetImportable */
276
277 SessionMetadataSetImportable::SessionMetadataSetImportable (ustring const & name) :
278   SessionMetadataSet (name),
279   session_list (list)
280 {
281         tree = Gtk::ListStore::create (tree_cols);
282         tree_view.set_model (tree);
283
284         Gtk::TreeView::Column * viewcol;
285
286         // Add import column
287         Gtk::CellRendererToggle * import_render = Gtk::manage(new Gtk::CellRendererToggle());
288         import_render->signal_toggled().connect (sigc::mem_fun(*this, &SessionMetadataSetImportable::selection_changed));
289         viewcol = Gtk::manage(new Gtk::TreeView::Column (_("Import"), *import_render));
290         viewcol->add_attribute (import_render->property_active(), tree_cols.import);
291         tree_view.append_column (*viewcol);
292
293         // Add field name column
294         tree_view.append_column(_("Field"), tree_cols.field);
295
296         // Add values column with pango markup
297         Gtk::CellRendererText * values_render = Gtk::manage(new Gtk::CellRendererText());
298         viewcol = Gtk::manage(new Gtk::TreeView::Column (_("Values (current value on top)"), *values_render));
299         viewcol->add_attribute (values_render->property_markup(), tree_cols.values);
300         tree_view.append_column (*viewcol);
301
302         select_all_check.signal_toggled().connect (sigc::mem_fun(*this, &SessionMetadataSetImportable::select_all));
303
304         session = 0;
305 }
306
307 Gtk::Widget &
308 SessionMetadataSetImportable::get_tab_widget ()
309 {
310         tab_widget.set_text (name);
311         return tab_widget;
312 }
313
314 Gtk::Widget &
315 SessionMetadataSetImportable::get_select_all_widget ()
316 {
317         select_all_check.set_label (name);
318         return select_all_check;
319 }
320
321 void
322 SessionMetadataSetImportable::load_extra_data (ARDOUR::SessionMetadata const & data)
323 {
324         if (!session) {
325                 std::cerr << "Programming error: no session set for SessionMetaDataSetImportable (in load_data)!" << std::endl;
326                 return;
327         }
328
329         ARDOUR::SessionMetadata & session_data = session->metadata();
330
331         MetadataPtr session_field;
332         MetadataPtr import_field;
333         DataList::iterator session_it;
334         DataList::iterator import_it;
335
336         // Copy list and load data to import
337         for (session_it = session_list.begin(); session_it != session_list.end(); ++session_it) {
338                 session_field = *session_it;
339                 session_field->load_data(session_data);
340                 import_list.push_back (session_field->copy());
341         }
342
343         // Fill widget
344         session_it = session_list.begin();
345         import_it = import_list.begin();
346         while (session_it != session_list.end() && import_it != import_list.end()) { // _should_ be the same...
347                 session_field = *session_it;
348                 import_field = *import_it;
349
350                 import_field->load_data(data); // hasn't been done yet
351
352                 // Make string for values TODO get color from somewhere?
353                 ustring values = "<span weight=\"ultralight\" color=\"#777\">" + session_field->value() + "</span>\n"
354                                 + "<span weight=\"bold\">" + import_field->value() + "</span>";
355
356                 Gtk::TreeModel::iterator row_iter = tree->append();
357                 Gtk::TreeModel::Row row = *row_iter;
358
359                 row[tree_cols.field] = import_field->name();
360                 row[tree_cols.values] = values;
361                 row[tree_cols.import] = false;
362                 row[tree_cols.data] = import_field;
363
364                 ++session_it;
365                 ++import_it;
366         }
367 }
368
369 void
370 SessionMetadataSetImportable::save_data ()
371 {
372         if (!session) {
373                 std::cerr << "Programming error: no session set for SessionMetaDataSetImportable (in import_data)!" << std::endl;
374                 return;
375         }
376
377         ARDOUR::SessionMetadata & session_data = session->metadata();
378
379         Gtk::TreeModel::Children fields = tree->children();
380         Gtk::TreeModel::Children::iterator it;
381         for (it = fields.begin(); it != fields.end(); ++it) {
382                 if ((*it)[tree_cols.import]) {
383                         MetadataPtr field = (*it)[tree_cols.data];
384                         field->save_data (session_data);
385                 }
386         }
387 }
388
389 void
390 SessionMetadataSetImportable::select_all ()
391 {
392         select_all_check.set_inconsistent (false);
393         bool state = select_all_check.get_active();
394
395         Gtk::TreeModel::Children fields = tree->children();
396         Gtk::TreeModel::Children::iterator it;
397         for (it = fields.begin(); it != fields.end(); ++it) {
398                 (*it)[tree_cols.import] = state;
399         }
400 }
401
402 void
403 SessionMetadataSetImportable::selection_changed (ustring const & path)
404 {
405         select_all_check.set_inconsistent (true);
406
407         Gtk::TreeModel::iterator iter = tree->get_iter (path);
408         bool value((*iter)[tree_cols.import]);
409         (*iter)[tree_cols.import] = !value;
410 }
411
412 /* SessionMetadataDialog */
413
414 template <typename DataSet>
415 SessionMetadataDialog<DataSet>::SessionMetadataDialog (ustring const & name) :
416   ArdourDialog (name, true)
417 {
418         cancel_button = add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
419         cancel_button->signal_clicked().connect (mem_fun(*this, &SessionMetadataDialog::end_dialog));
420         save_button = add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
421         save_button->signal_clicked().connect (mem_fun(*this, &SessionMetadataDialog::save_and_close));
422 }
423
424 template <typename DataSet>
425 void
426 SessionMetadataDialog<DataSet>::init_data ()
427 {
428         if (!session) {
429                 std::cerr << "Programming error: no session set for SessionMetaDataDialog (in init_data)!" << std::endl;
430                 return;
431         }
432
433         init_track_data ();
434         init_album_data ();
435         init_people_data ();
436
437         for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it) {
438                 (*it)->set_session (session);
439
440                 notebook.append_page ((*it)->get_widget(), (*it)->get_tab_widget());
441         }
442 }
443
444 template <typename DataSet>
445 void
446 SessionMetadataDialog<DataSet>::load_extra_data (ARDOUR::SessionMetadata const & data)
447 {
448         for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it) {
449                 (*it)->load_extra_data (data);
450         }
451 }
452
453 template <typename DataSet>
454 void
455 SessionMetadataDialog<DataSet>::save_data ()
456 {
457         for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it) {
458                 (*it)->save_data ();
459         }
460 }
461
462 template <typename DataSet>
463 void
464 SessionMetadataDialog<DataSet>::save_and_close ()
465 {
466         save_data ();
467         end_dialog ();
468 }
469
470 template <typename DataSet>
471 void
472 SessionMetadataDialog<DataSet>::end_dialog ()
473 {
474         hide_all();
475 }
476
477 template <typename DataSet>
478 void
479 SessionMetadataDialog<DataSet>::warn_user (ustring const & string)
480 {
481         Gtk::MessageDialog msg (string, false, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK, true);
482         msg.run();
483 }
484
485 template <typename DataSet>
486 boost::shared_ptr<std::list<Gtk::Widget *> >
487 SessionMetadataDialog<DataSet>::get_custom_widgets (WidgetFunc f)
488 {
489         WidgetListPtr list (new WidgetList);
490         for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it)
491         {
492                 DataSet * set = dynamic_cast<DataSet *> (it->get());
493                 list->push_back (& CALL_MEMBER_FN (*set, f) ());
494         }
495
496         return list;
497 }
498
499 template <typename DataSet>
500 void
501 SessionMetadataDialog<DataSet>::add_widget (Gtk::Widget & widget)
502 {
503         get_vbox()->pack_start (widget, true, true, 0);
504 }
505
506 template <typename DataSet>
507 void
508 SessionMetadataDialog<DataSet>::init_track_data ()
509 {
510         DataSetPtr data_set (new DataSet (_("Track")));
511         data_list.push_back (data_set);
512
513         MetadataPtr ptr;
514
515         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::title, &ARDOUR::SessionMetadata::set_title, _("Title")));
516         data_set->add_data_field (ptr);
517
518         ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::track_number, &ARDOUR::SessionMetadata::set_track_number, _("Track Number"), 3));
519         data_set->add_data_field (ptr);
520
521         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::subtitle, &ARDOUR::SessionMetadata::set_subtitle, _("Subtitle")));
522         data_set->add_data_field (ptr);
523
524         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::grouping, &ARDOUR::SessionMetadata::set_grouping, _("Grouping")));
525         data_set->add_data_field (ptr);
526
527         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::artist, &ARDOUR::SessionMetadata::set_artist, _("Artist")));
528         data_set->add_data_field (ptr);
529
530         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::genre, &ARDOUR::SessionMetadata::set_genre, _("Genre")));
531         data_set->add_data_field (ptr);
532
533         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::comment, &ARDOUR::SessionMetadata::set_comment, _("Comment")));
534         data_set->add_data_field (ptr);
535
536         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::copyright, &ARDOUR::SessionMetadata::set_copyright, _("Copyright")));
537         data_set->add_data_field (ptr);
538 }
539
540 template <typename DataSet>
541 void
542 SessionMetadataDialog<DataSet>::init_album_data ()
543 {
544         DataSetPtr data_set (new DataSet (_("Album")));
545         data_list.push_back (data_set);
546
547         MetadataPtr ptr;
548
549         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::album, &ARDOUR::SessionMetadata::set_album, _("Album")));
550         data_set->add_data_field (ptr);
551
552         ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::year, &ARDOUR::SessionMetadata::set_year, _("Year"), 4));
553         data_set->add_data_field (ptr);
554
555         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::album_artist, &ARDOUR::SessionMetadata::set_album_artist, _("Album Artist")));
556         data_set->add_data_field (ptr);
557
558         ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::total_tracks, &ARDOUR::SessionMetadata::set_total_tracks, _("Total Tracks"), 3));
559         data_set->add_data_field (ptr);
560
561         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::disc_subtitle, &ARDOUR::SessionMetadata::set_disc_subtitle, _("Disc Subtitle")));
562         data_set->add_data_field (ptr);
563
564         ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::disc_number, &ARDOUR::SessionMetadata::set_disc_number, _("Disc Number"), 2));
565         data_set->add_data_field (ptr);
566
567         ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::total_discs, &ARDOUR::SessionMetadata::set_total_discs, _("Total Discs"), 2));
568         data_set->add_data_field (ptr);
569
570         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::compilation, &ARDOUR::SessionMetadata::set_compilation, _("Compilation")));
571         data_set->add_data_field (ptr);
572
573         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::isrc, &ARDOUR::SessionMetadata::set_isrc, _("ISRC")));
574         data_set->add_data_field (ptr);
575 }
576
577 template <typename DataSet>
578 void
579 SessionMetadataDialog<DataSet>::init_people_data ()
580 {
581         DataSetPtr data_set (new DataSet (_("People")));
582         data_list.push_back (data_set);
583
584         MetadataPtr ptr;
585
586         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::lyricist, &ARDOUR::SessionMetadata::set_lyricist, _("Lyricist")));
587         data_set->add_data_field (ptr);
588
589         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::composer, &ARDOUR::SessionMetadata::set_composer, _("Composer")));
590         data_set->add_data_field (ptr);
591
592         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::conductor, &ARDOUR::SessionMetadata::set_conductor, _("Conductor")));
593         data_set->add_data_field (ptr);
594
595         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::remixer, &ARDOUR::SessionMetadata::set_remixer, _("Remixer")));
596         data_set->add_data_field (ptr);
597
598         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::arranger, &ARDOUR::SessionMetadata::set_arranger, _("Arranger")));
599         data_set->add_data_field (ptr);
600
601         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::engineer, &ARDOUR::SessionMetadata::set_engineer, _("Engineer")));
602         data_set->add_data_field (ptr);
603
604         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::producer, &ARDOUR::SessionMetadata::set_producer, _("Producer")));
605         data_set->add_data_field (ptr);
606
607         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::dj_mixer, &ARDOUR::SessionMetadata::set_dj_mixer, _("DJ Mixer")));
608         data_set->add_data_field (ptr);
609
610         ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::mixer, &ARDOUR::SessionMetadata::set_mixer, _("Mixer")));
611         data_set->add_data_field (ptr);
612 }
613
614 /* SessionMetadataEditor */
615
616 SessionMetadataEditor::SessionMetadataEditor () :
617   SessionMetadataDialog<SessionMetadataSetEditable> (_("Edit Session Metadata"))
618 {
619
620 }
621
622 SessionMetadataEditor::~SessionMetadataEditor ()
623 {
624         // Remove pages from notebook to get rid of gsignal runtime warnings
625         notebook.pages().clear();
626 }
627
628 void
629 SessionMetadataEditor::run ()
630 {
631         init_data ();
632         init_gui();
633
634         ArdourDialog::run();
635 }
636
637 void
638 SessionMetadataEditor::init_gui ()
639 {
640         add_widget (notebook);
641
642         show_all();
643 }
644
645 /* SessionMetadataImporter */
646
647 SessionMetadataImporter::SessionMetadataImporter () :
648   SessionMetadataDialog<SessionMetadataSetImportable> (_("Import session metadata"))
649 {
650
651 }
652
653 SessionMetadataImporter::~SessionMetadataImporter ()
654 {
655         // Remove pages from notebook to get rid of gsignal runtime warnings
656         notebook.pages().clear();
657 }
658
659 void
660 SessionMetadataImporter::run ()
661 {
662         if (!session) {
663                 std::cerr << "Programming error: no session set for SessionMetaDataImporter (in run)!" << std::endl;
664                 return;
665         }
666
667         /* Open session file selector */
668
669         Gtk::FileChooserDialog session_selector(_("Choose session to import metadata from"), Gtk::FILE_CHOOSER_ACTION_OPEN);
670         session_selector.add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
671         session_selector.add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
672         session_selector.set_default_response(Gtk::RESPONSE_ACCEPT);
673
674         Gtk::FileFilter session_filter;
675         session_filter.add_pattern ("*.ardour");
676         session_filter.set_name (_("Ardour sessions"));
677         session_selector.add_filter (session_filter);
678         session_selector.set_filter (session_filter);
679
680         int response = session_selector.run();
681         session_selector.hide ();
682
683         switch (response) {
684         case Gtk::RESPONSE_ACCEPT:
685                 break;
686         default:
687                 return;
688         }
689
690         string session_path = session_selector.get_filename();
691         string path, name;
692         bool isnew;
693
694         if (session_path.length() > 0) {
695                 if (ARDOUR::find_session (session_path, path, name, isnew) != 0) {
696                         return;
697                 }
698         } else {
699                 return;
700         }
701
702         /* We have a session: load the data and run dialog */
703
704         string filename = Glib::build_filename (path, name + ".ardour");
705         XMLTree session_tree;
706         if (!session_tree.read (filename)) {
707                 warn_user (_("A proper ardour session file was not selected!"));
708                 return;
709         }
710
711         /* XXX GET VERSION FROM TREE */
712         int version = 3000;
713
714         XMLNode * node = session_tree.root()->child ("Metadata");
715
716         if (!node) {
717                 warn_user (_("The session file didn't contain metadata!\nMaybe this is an old session format?"));
718                 return;
719         }
720
721         ARDOUR::SessionMetadata data;
722         data.set_state (*node, version);
723
724         init_data ();
725         load_extra_data (data);
726         init_gui();
727
728         ArdourDialog::run();
729 }
730
731 void
732 SessionMetadataImporter::init_gui ()
733 {
734         // Select all from -widget
735         add_widget (selection_hbox);
736         selection_label.set_text (_("Import all from:"));
737         selection_hbox.pack_start (selection_label, false, false);
738
739         WidgetListPtr list = get_custom_widgets (&SessionMetadataSetImportable::get_select_all_widget);
740         for (WidgetList::iterator it = list->begin(); it != list->end(); ++it) {
741                 selection_hbox.pack_start (**it, false, false, 6);
742         }
743
744         add_widget (notebook);
745
746         show_all();
747 }