ardour
session_metadata_dialog.cc
Go to the documentation of this file.
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 
21 
22 #include <sstream>
23 
24 #include <gtkmm2ext/utils.h>
25 
26 #include "pbd/xml++.h"
27 #include "pbd/error.h"
28 
30 #include "ardour/session.h"
31 #include "ardour/session_utils.h"
32 
33 #include "i18n.h"
34 
35 using namespace std;
36 using namespace Glib;
37 using namespace PBD;
38 
39 #define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember))
40 
41 /*** MetadataField ***/
42 
43 MetadataField::MetadataField (string const & field_name) :
44  _name (field_name)
45 {
46 }
47 
49 
50 /* TextMetadataField */
51 
52 TextMetadataField::TextMetadataField (Getter getter, Setter setter, string const & field_name, guint width ) :
53  MetadataField (field_name),
54  getter (getter),
55  setter (setter),
56  width (width)
57 {
58  entry = 0;
59  label = 0;
60  value_label = 0;
61 }
62 
65 {
67 }
68 
69 void
71 {
72  CALL_MEMBER_FN (data, setter) (_value);
73 }
74 
75 void
77 {
78  _value = CALL_MEMBER_FN (data, getter) ();
79  if (entry) {
80  entry->set_text (_value);
81  }
82 }
83 
84 Gtk::Widget &
86 {
87  label = Gtk::manage (new Gtk::Label(_name + ':'));
88  label->set_alignment (1, 0.5);
89  return *label;
90 }
91 
92 Gtk::Widget &
94 {
95  value_label = Gtk::manage (new Gtk::Label(_value));
96  return *value_label;
97 }
98 
99 Gtk::Widget &
101 {
102  entry = Gtk::manage (new Gtk::Entry());
103 
104  entry->set_text (_value);
105  entry->set_width_chars (width);
106  entry->signal_changed().connect (sigc::mem_fun(*this, &TextMetadataField::update_value));
107 
108  return *entry;
109 }
110 
111 void
113 {
114  _value = entry->get_text ();
115 }
116 
117 /* NumberMetadataField */
118 
119 NumberMetadataField::NumberMetadataField (Getter getter, Setter setter, string const & field_name, guint numbers, guint width) :
120  MetadataField (field_name),
121  getter (getter),
122  setter (setter),
123  numbers (numbers),
124  width (width)
125 {
126  entry = 0;
127  label = 0;
128  value_label = 0;
129 }
130 
133 {
135 }
136 
137 void
139 {
140  uint32_t number = str_to_uint (_value);
141  CALL_MEMBER_FN (data, setter) (number);
142 }
143 
144 void
146 {
147  uint32_t number = CALL_MEMBER_FN (data, getter) ();
148  _value = uint_to_str (number);
149  if (entry) {
150  entry->set_text (_value);
151  }
152 }
153 
154 void
156 {
157  // Accept only numbers that will fit into a uint32_t
158  uint32_t number = str_to_uint (entry->get_text());
159  _value = uint_to_str (number);
160  entry->set_text (_value);
161 }
162 
163 Gtk::Widget &
165 {
166  label = Gtk::manage (new Gtk::Label(_name + ':'));
167  label->set_alignment (1, 0.5);
168  return *label;
169 }
170 
171 Gtk::Widget &
173 {
174  value_label = Gtk::manage (new Gtk::Label(_value));
175  return *value_label;
176 }
177 
178 Gtk::Widget &
180 {
181  entry = Gtk::manage (new Gtk::Entry());
182 
183  entry->set_text (_value);
184  entry->set_width_chars (width);
185  entry->set_max_length (numbers);
186  entry->signal_changed().connect (sigc::mem_fun(*this, &NumberMetadataField::update_value));
187 
188  return *entry;
189 }
190 
191 string
193 {
194  std::ostringstream oss ("");
195  oss << i;
196  if (oss.str().compare("0")) {
197  return oss.str();
198  } else {
199  return "";
200  }
201 }
202 
203 uint32_t
204 NumberMetadataField::str_to_uint (string const & str) const
205 {
206  string tmp (str);
207  string::size_type i;
208  while ((i = tmp.find_first_not_of("1234567890")) != string::npos) {
209  tmp.erase (i, 1);
210  }
211 
212  std::istringstream iss(tmp);
213  uint32_t result = 0;
214  iss >> result;
215  return result;
216 }
217 
218 
219 
220 /* EAN13MetadataField */
221 
222 EAN13MetadataField::EAN13MetadataField (Getter getter, Setter setter, string const & field_name, guint width) :
223  MetadataField (field_name),
224  getter (getter),
225  setter (setter),
226  width (width)
227 {
228  entry = 0;
229  label = 0;
230  value_label = 0;
231  status_label = Gtk::manage (new Gtk::Label (""));
232 }
233 
236 {
238 }
239 
240 void
242 {
243  CALL_MEMBER_FN (data, setter) (_value);
244 }
245 
246 void
248 {
249  _value = CALL_MEMBER_FN (data, getter) ();
250  if (entry) {
251  entry->set_text (_value);
252  }
253  update_status ();
254 }
255 
256 void
258 {
259  // Accept only numeric characters
260  _value = numeric_string (entry->get_text());
261  entry->set_text (_value);
262  update_status ();
263 }
264 
265 void
267 {
268  int len = _value.length ();
269  if (len == 13) {
270  // calculate EAN-13 modulo 10 check digit
271  int sum = 0;
272  const char *p = _value.c_str();
273  for (int i =0; i < 12; i++) {
274  char c = p[i] - '0';
275  if (i % 2) {
276  sum += c;
277  } else {
278  sum += c * 3;
279  }
280  }
281  sum %= 10;
282  if (sum == p[12] - '0') {
283  status_label->set_markup (string_compose(
284  "<span color=\"green\">%1: %2</span>",
285  _("EAN Check digit OK"), sum));
286  } else {
287  status_label->set_markup (string_compose(
288  "<span color=\"#ffa755\">%1: %2 (%3 %4)</span>",
289  _("EAN Check digit error"), p[12] - '0', _("expected"), sum));
290  }
291  } else if (len > 0) {
292  status_label->set_markup (string_compose(
293  "<span color=\"#ffa755\">%1: %2 (&lt;13)</span>",
294  _("EAN Length error"), len));
295  } else {
296  status_label->set_text("");
297  }
298 }
299 
300 Gtk::Widget &
302 {
303  label = Gtk::manage (new Gtk::Label(_name + ':'));
304  label->set_alignment (1, 0.5);
305  return *label;
306 }
307 
308 Gtk::Widget &
310 {
311  value_label = Gtk::manage (new Gtk::Label(_value));
312  return *value_label;
313 }
314 
315 Gtk::Widget &
317 {
318  entry = Gtk::manage (new Gtk::Entry());
319 
320  entry->set_text (_value);
321  entry->set_width_chars (width);
322  entry->set_max_length (13);
323  entry->signal_changed().connect (sigc::mem_fun(*this, &EAN13MetadataField::update_value));
324 
325  return *entry;
326 }
327 
328 string
329 EAN13MetadataField::numeric_string (string const & str) const
330 {
331  string tmp (str);
332  string::size_type i;
333  while ((i = tmp.find_first_not_of("1234567890")) != string::npos) {
334  tmp.erase (i, 1);
335  }
336  return tmp;
337 }
338 
339 /* SessionMetadataSet */
340 
342  : name (name)
343 {
344 }
345 
346 void
348 {
349  list.push_back (field);
350 }
351 
352 /* SessionMetadataSetEditable */
353 
355  : SessionMetadataSet (name)
356 {
357  table.set_row_spacings (6);
358  table.set_col_spacings (12);
359  table.set_homogeneous (false);
360  vbox.pack_start (table, false, false);
361  vbox.set_spacing (6);
362  vbox.set_border_width (6);
363 }
364 
365 Gtk::Widget &
367 {
368  tab_widget.set_text (name);
369  return tab_widget;
370 }
371 
372 void
374 {
375  SessionHandlePtr::set_session (s);
376 
377  if (!_session) {
378  return;
379  }
380 
382 
383  table.resize (list.size(), 2);
384  uint32_t row = 0;
385  MetadataPtr field;
386  for (DataList::const_iterator it = list.begin(); it != list.end(); ++it) {
387  field = *it;
388  field->load_data (data);
389  table.attach (field->name_widget(), 0, 1, row, row + 1, Gtk::FILL);
390  table.attach (field->edit_widget(), 1, 2, row, row + 1);
391  ++row;
392  }
393 }
394 
395 void
397 {
399  for (DataList::const_iterator it = list.begin(); it != list.end(); ++it) {
400  (*it)->save_data(data);
401  }
402 }
403 
404 /* SessionMetadataSetImportable */
405 
407  : SessionMetadataSet (name)
408  , session_list (list)
409 {
410  tree = Gtk::ListStore::create (tree_cols);
411  tree_view.set_model (tree);
412 
413  Gtk::TreeView::Column * viewcol;
414 
415  // Add import column
416  Gtk::CellRendererToggle * import_render = Gtk::manage(new Gtk::CellRendererToggle());
417  import_render->signal_toggled().connect (sigc::mem_fun(*this, &SessionMetadataSetImportable::selection_changed));
418  viewcol = Gtk::manage(new Gtk::TreeView::Column (_("Import"), *import_render));
419  viewcol->add_attribute (import_render->property_active(), tree_cols.import);
420  tree_view.append_column (*viewcol);
421 
422  // Add field name column
423  tree_view.append_column(_("Field"), tree_cols.field);
424 
425  // Add values column with pango markup
426  Gtk::CellRendererText * values_render = Gtk::manage(new Gtk::CellRendererText());
427  viewcol = Gtk::manage(new Gtk::TreeView::Column (_("Values (current value on top)"), *values_render));
428  viewcol->add_attribute (values_render->property_markup(), tree_cols.values);
429  tree_view.append_column (*viewcol);
430 
431  select_all_check.signal_toggled().connect (sigc::mem_fun(*this, &SessionMetadataSetImportable::select_all));
432 }
433 
434 Gtk::Widget &
436 {
437  tab_widget.set_text (name);
438  return tab_widget;
439 }
440 
441 Gtk::Widget &
443 {
444  select_all_check.set_label (name);
445  return select_all_check;
446 }
447 
448 void
450 {
451  if (!_session) {
452  error << string_compose (_("programming error: %1"), "no session set for SessionMetaDataSetImportable (in load_data)!") << endmsg;
453  return;
454  }
455 
457 
458  MetadataPtr session_field;
459  MetadataPtr import_field;
460  DataList::iterator session_it;
461  DataList::iterator import_it;
462 
463  // Copy list and load data to import
464  for (session_it = session_list.begin(); session_it != session_list.end(); ++session_it) {
465  session_field = *session_it;
466  session_field->load_data(session_data);
467  import_list.push_back (session_field->copy());
468  }
469 
470  // Fill widget
471  session_it = session_list.begin();
472  import_it = import_list.begin();
473  while (session_it != session_list.end() && import_it != import_list.end()) { // _should_ be the same...
474  session_field = *session_it;
475  import_field = *import_it;
476 
477  import_field->load_data(data); // hasn't been done yet
478 
479  // Make string for values TODO get color from somewhere?
480  string values = "<span weight=\"ultralight\" color=\"#777\">" + session_field->value() + "</span>\n"
481  + "<span weight=\"bold\">" + import_field->value() + "</span>";
482 
483  Gtk::TreeModel::iterator row_iter = tree->append();
484  Gtk::TreeModel::Row row = *row_iter;
485 
486  row[tree_cols.field] = import_field->name();
487  row[tree_cols.values] = values;
488  row[tree_cols.import] = false;
489  row[tree_cols.data] = import_field;
490 
491  ++session_it;
492  ++import_it;
493  }
494 }
495 
496 void
498 {
499  if (!_session) {
500  error << string_compose (_("programming error: %1"), "no session set for SessionMetaDataSetImportable (in import_data)!") << endmsg;
501  return;
502  }
503 
505 
506  Gtk::TreeModel::Children fields = tree->children();
507  Gtk::TreeModel::Children::iterator it;
508  for (it = fields.begin(); it != fields.end(); ++it) {
509  if ((*it)[tree_cols.import]) {
510  MetadataPtr field = (*it)[tree_cols.data];
511  field->save_data (session_data);
512  }
513  }
514 }
515 
516 void
518 {
519  select_all_check.set_inconsistent (false);
520  bool state = select_all_check.get_active();
521 
522  Gtk::TreeModel::Children fields = tree->children();
523  Gtk::TreeModel::Children::iterator it;
524  for (it = fields.begin(); it != fields.end(); ++it) {
525  (*it)[tree_cols.import] = state;
526  }
527 }
528 
529 void
531 {
532  select_all_check.set_inconsistent (true);
533 
534  Gtk::TreeModel::iterator iter = tree->get_iter (path);
535  bool value((*iter)[tree_cols.import]);
536  (*iter)[tree_cols.import] = !value;
537 }
538 
539 /* SessionMetadataDialog */
540 
541 template <typename DataSet>
543  ArdourDialog (name, true)
544 {
545  cancel_button = add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
546  cancel_button->signal_clicked().connect (sigc::mem_fun(*this, &SessionMetadataDialog::end_dialog));
547  save_button = add_button (Gtk::Stock::OK, Gtk::RESPONSE_ACCEPT);
548  save_button->signal_clicked().connect (sigc::mem_fun(*this, &SessionMetadataDialog::save_and_close));
549 }
550 
551 template <typename DataSet>
552 void
554 {
555  if (!_session) {
556  error << string_compose (_("programming error: %1"), "no session set for SessionMetaDataDialog (in init_data)!") << endmsg;
557  return;
558  }
559 
560  if (!skip_user)
561  init_user_data ();
562  init_track_data ();
563  init_album_data ();
564  init_people_data ();
565  init_school_data ();
566 
567  for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it) {
568  (*it)->set_session (_session);
569 
570  notebook.append_page ((*it)->get_widget(), (*it)->get_tab_widget());
571  }
572 }
573 
574 template <typename DataSet>
575 void
577 {
578  for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it) {
579  (*it)->load_extra_data (data);
580  }
581 }
582 
583 template <typename DataSet>
584 void
586 {
587  for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it) {
588  (*it)->save_data ();
589  }
590 }
591 
592 template <typename DataSet>
593 void
595 {
596  save_data ();
597  _session->set_dirty();
598  end_dialog ();
599 }
600 
601 template <typename DataSet>
602 void
604 {
605  hide_all();
606 }
607 
608 template <typename DataSet>
609 void
611 {
612  Gtk::MessageDialog msg (string, false, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK, true);
613  msg.run();
614 }
615 
616 template <typename DataSet>
619 {
620  WidgetListPtr list (new WidgetList);
621  for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it)
622  {
623  DataSet * set = dynamic_cast<DataSet *> (it->get());
624  list->push_back (& CALL_MEMBER_FN (*set, f) ());
625  }
626 
627  return list;
628 }
629 
630 template <typename DataSet>
631 void
633 {
634  get_vbox()->pack_start (widget, true, true, 0);
635 }
636 
637 template <typename DataSet>
638 void
640 {
641  DataSetPtr data_set (new DataSet (_("User")));
642  data_list.push_back (data_set);
643 
644  MetadataPtr ptr;
645 
647  data_set->add_data_field (ptr);
648 
650  data_set->add_data_field (ptr);
651 
653  data_set->add_data_field (ptr);
654 
656  data_set->add_data_field (ptr);
657 
659  data_set->add_data_field (ptr);
660 
661 }
662 
663 template <typename DataSet>
664 void
666 {
667  DataSetPtr data_set (new DataSet (_("Track")));
668  data_list.push_back (data_set);
669 
670  MetadataPtr ptr;
671 
673  data_set->add_data_field (ptr);
674 
676  data_set->add_data_field (ptr);
677 
679  data_set->add_data_field (ptr);
680 
682  data_set->add_data_field (ptr);
683 
685  data_set->add_data_field (ptr);
686 
688  data_set->add_data_field (ptr);
689 
691  data_set->add_data_field (ptr);
692 
694  data_set->add_data_field (ptr);
695 }
696 
697 template <typename DataSet>
698 void
700 {
701  DataSetPtr data_set (new DataSet (_("Album")));
702  data_list.push_back (data_set);
703 
704  MetadataPtr ptr;
705 
707  data_set->add_data_field (ptr);
708 
710  data_set->add_data_field (ptr);
711 
713  data_set->add_data_field (ptr);
714 
716  data_set->add_data_field (ptr);
717 
719  data_set->add_data_field (ptr);
720 
722  data_set->add_data_field (ptr);
723 
725  data_set->add_data_field (ptr);
726 
728  data_set->add_data_field (ptr);
729 
731  data_set->add_data_field (ptr);
732 
734  data_set->add_data_field (ptr);
735 
736  // EAN13MetadataField is the only kind of MetadataField which has a status label.
737  EAN13MetadataField &emf = (EAN13MetadataField &) *ptr;
738  ((Gtk::VBox &) data_set->get_widget()).pack_end (*emf.status_label);
739  emf.update_status ();
740 }
741 
742 template <typename DataSet>
743 void
745 {
746  DataSetPtr data_set (new DataSet (_("People")));
747  data_list.push_back (data_set);
748 
749  MetadataPtr ptr;
750 
752  data_set->add_data_field (ptr);
753 
755  data_set->add_data_field (ptr);
756 
758  data_set->add_data_field (ptr);
759 
761  data_set->add_data_field (ptr);
762 
764  data_set->add_data_field (ptr);
765 
767  data_set->add_data_field (ptr);
768 
770  data_set->add_data_field (ptr);
771 
773  data_set->add_data_field (ptr);
774 
776  data_set->add_data_field (ptr);
777 }
778 
779 template <typename DataSet>
780 void
782 {
783  DataSetPtr data_set (new DataSet (_("School")));
784  data_list.push_back (data_set);
785 
786  MetadataPtr ptr;
787 
789  data_set->add_data_field (ptr);
790 
792  data_set->add_data_field (ptr);
793 
794 }
795 
796 /* SessionMetadataEditor */
797 
799  SessionMetadataDialog<SessionMetadataSetEditable> (_("Edit Session Metadata"))
800 {
801 
802 }
803 
805 {
806  // Remove pages from notebook to get rid of gsignal runtime warnings
807  notebook.pages().clear();
808 }
809 
810 void
812 {
813  init_data ();
814  init_gui();
815 
816  ArdourDialog::run();
817 }
818 
819 void
821 {
823 
824  show_all();
825 }
826 
827 /* SessionMetadataImporter */
828 
830  SessionMetadataDialog<SessionMetadataSetImportable> (_("Import session metadata"))
831 {
832 
833 }
834 
836 {
837  // Remove pages from notebook to get rid of gsignal runtime warnings
838  notebook.pages().clear();
839 }
840 
841 void
843 {
844  if (!_session) {
845  error << string_compose (_("programming error: %1"), "no session set for SessionMetaDataImporter (in run)!") << endmsg;
846  return;
847  }
848 
849  /* Open session file selector */
850 
851  Gtk::FileChooserDialog session_selector(_("Choose session to import metadata from"), Gtk::FILE_CHOOSER_ACTION_OPEN);
852  session_selector.add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
853  session_selector.add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
854  session_selector.set_default_response(Gtk::RESPONSE_ACCEPT);
855 
856  Gtk::FileFilter session_filter;
857  session_filter.add_pattern (string_compose(X_("*%1"), ARDOUR::statefile_suffix));
858  session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME));
859  session_selector.add_filter (session_filter);
860  session_selector.set_filter (session_filter);
861 
862  int response = session_selector.run();
863  session_selector.hide ();
864 
865  switch (response) {
866  case Gtk::RESPONSE_ACCEPT:
867  break;
868  default:
869  return;
870  }
871 
872  string session_path = session_selector.get_filename();
873  string path, name;
874  bool isnew;
875 
876  if (session_path.length() > 0) {
877  if (ARDOUR::find_session (session_path, path, name, isnew) != 0) {
878  return;
879  }
880  } else {
881  return;
882  }
883 
884  /* We have a session: load the data and run dialog */
885 
886  string filename = Glib::build_filename (path, name + ARDOUR::statefile_suffix);
887  XMLTree session_tree;
888  if (!session_tree.read (filename)) {
889  warn_user (_("This session file could not be read!"));
890  return;
891  }
892 
893  /* XXX GET VERSION FROM TREE */
894  int version = 3000;
895 
896  XMLNode * node = session_tree.root()->child ("Metadata");
897 
898  if (!node) {
899  warn_user (_("The session file didn't contain metadata!\nMaybe this is an old session format?"));
900  return;
901  }
902 
903  //create a temporary
905  data.set_state (*node, version);
906  init_data ( true ); //skip user data here
907  load_extra_data (data);
908  init_gui();
909 
910  ArdourDialog::run();
911 }
912 
913 void
915 {
916  // Select all from -widget
918  selection_label.set_text (_("Import all from:"));
919  selection_hbox.pack_start (selection_label, false, false);
920 
922  for (WidgetList::iterator it = list->begin(); it != list->end(); ++it) {
923  selection_hbox.pack_start (**it, false, false, 6);
924  }
925 
927 
928  show_all();
929 }
void set_user_web(const std::string &)
void add_data_field(MetadataPtr field)
std::string compilation() const
std::string lyricist() const
void set_arranger(const std::string &)
MetadataField that contains text.
Contains MetadataFields for importing.
void set_mixer(const std::string &)
void set_course(const std::string &)
Gtk::Widget & value_widget()
Get label containing value of field.
void load_extra_data(ARDOUR::SessionMetadata const &data)
Loads importable data from data.
Gtk::Widget & name_widget()
Get widget containing name of field.
std::string mixer() const
std::string producer() const
void set_engineer(const std::string &)
void set_dj_mixer(const std::string &)
int set_state(const XMLNode &, int version_num)
std::string comment() const
WidgetListPtr get_custom_widgets(WidgetFunc f)
Returns list of widgets gathered by calling f for each data set.
void set_user_email(const std::string &)
Contains MetadataFields for editing.
void set_session(ARDOUR::Session *s)
Sets session and loads data.
void set_genre(const std::string &)
tuple f
Definition: signals.py:35
Definition: Beats.hpp:239
LIBPBD_API Transmitter error
Gtk::TreeModelColumn< std::string > field
std::string uint_to_str(uint32_t i) const
std::list< Gtk::Widget * > WidgetList
void set_grouping(const std::string &)
std::ostream & endmsg(std::ostream &ostr)
Definition: transmitter.h:71
void set_total_tracks(uint32_t)
uint32_t track_number() const
std::string genre() const
std::string country() const
void set_artist(const std::string &)
Definition: xml++.h:55
void load_extra_data(ARDOUR::SessionMetadata const &data)
std::string conductor() const
uint32_t disc_number() const
#define _(Text)
Definition: i18n.h:11
std::string organization() const
uint32_t total_tracks() const
void set_organization(const std::string &)
std::string barcode() const
std::string numeric_string(std::string const &str) const
void load_data(ARDOUR::SessionMetadata const &data)
Glib::RefPtr< Gtk::ListStore > tree
std::string user_name() const
void save_data(ARDOUR::SessionMetadata &data) const
#define X_(Text)
Definition: i18n.h:13
std::string dj_mixer() const
void load_data(ARDOUR::SessionMetadata const &data)
uint32_t total_discs() const
void set_disc_subtitle(const std::string &)
uint32_t str_to_uint(std::string const &str) const
void set_copyright(const std::string &)
Metadata dialog interface.
Gtk::TreeModelColumn< MetadataPtr > data
void set_remixer(const std::string &)
std::string composer() const
std::string title() const
void set_album(const std::string &)
void selection_changed(std::string const &path)
void save_data(ARDOUR::SessionMetadata &data) const
XMLNode * root() const
Definition: xml++.h:62
void set_conductor(const std::string &)
void add_widget(Gtk::Widget &widget)
Adds a widget to the table (vertical stacking) with automatic spacing.
void init_data(bool skip_user=false)
std::string disc_subtitle() const
void set_album_artist(const std::string &)
std::string isrc() const
bool read()
Definition: xml++.h:71
void set_producer(const std::string &)
std::string album_artist() const
std::string arranger() const
void set_country(const std::string &)
void save_data(ARDOUR::SessionMetadata &data) const
void set_subtitle(const std::string &)
std::string user_email() const
void set_total_discs(uint32_t)
SessionMetadataSet(std::string const &name)
MetadataField that accepts EAN-13 data only.
NumberMetadataField(Getter getter, Setter setter, std::string const &field_name, guint numbers, guint width=50)
EAN13MetadataField(Getter getter, Setter setter, std::string const &field_name, guint width=13)
static SessionMetadata * Metadata()
Gtk::Widget & value_widget()
Get label containing value of field.
TextMetadataField(Getter getter, Setter setter, std::string const &field_name, guint width=50)
void set_comment(const std::string &)
void set_track_number(uint32_t)
LIBARDOUR_API const char *const statefile_suffix
SessionMetadataDialog(std::string const &name)
std::string grouping() const
void save_data()
Saves from MetadataFields into data.
Wraps a metadata field to be used in a GUI.
void set_compilation(const std::string &)
const char * name
void set_instructor(const std::string &)
SessionMetadataSetImportable(std::string const &name)
Gtk::Widget & name_widget()
Get widget containing name of field.
void set_isrc(const std::string &)
Definition: xml++.h:95
std::string engineer() const
void warn_user(std::string const &string)
void set_user_name(const std::string &)
std::string album() const
std::string user_web() const
MetadataField(std::string const &field_name)
Definition: debug.h:30
Gtk::TreeModelColumn< std::string > values
void set_barcode(const std::string &)
void set_composer(const std::string &)
#define S_(Text)
Definition: i18n.h:18
XMLNode * child(const char *) const
Definition: xml++.cc:309
std::string remixer() const
LIBARDOUR_API int find_session(std::string str, std::string &path, std::string &snapshot, bool &isnew)
Gtk::Widget & edit_widget()
Get widget for editing value.
Gtk::Widget & edit_widget()
Get widget for editing value.
std::string artist() const
std::string course() const
Gtk::Widget & edit_widget()
Get widget for editing value.
void set_title(const std::string &)
std::string copyright() const
void load_data(ARDOUR::SessionMetadata const &data)
Gtk::Widget & value_widget()
Get label containing value of field.
boost::shared_ptr< MetadataField > MetadataPtr
std::string subtitle() const
#define CALL_MEMBER_FN(object, ptrToMember)
SessionMetadataSetEditable(std::string const &name)
void set_lyricist(const std::string &)
MetadataField that accepts only numbers.
void set_disc_number(uint32_t)
std::string instructor() const
ARDOUR::Session * _session
void save_data()
Saves from importable data (see load_data) to session_data.
std::string string_compose(const std::string &fmt, const T1 &o1)
Definition: compose.h:208
Gtk::Widget & name_widget()
Get widget containing name of field.
Interface for MetadataFields.