/*
- Copyright (C) 2008 Paul Davis
+ Copyright (C) 2008 Paul Davis
Author: Sakari Bergen
This program is free software; you can redistribute it and/or modify it
#include <sstream>
#include <gtkmm2ext/utils.h>
-#include <gtkmm2ext/window_title.h>
#include "pbd/xml++.h"
#include "ardour/session.h"
TextMetadataField::edit_widget ()
{
entry = Gtk::manage (new Gtk::Entry());
-
+
entry->set_text (_value);
entry->set_width_chars (width);
entry->signal_changed().connect (sigc::mem_fun(*this, &TextMetadataField::update_value));
-
+
return *entry;
}
NumberMetadataField::edit_widget ()
{
entry = Gtk::manage (new Gtk::Entry());
-
+
entry->set_text (_value);
entry->set_width_chars (width);
entry->set_max_length (numbers);
entry->signal_changed().connect (sigc::mem_fun(*this, &NumberMetadataField::update_value));
-
+
return *entry;
}
while ((i = tmp.find_first_not_of("1234567890")) != ustring::npos) {
tmp.erase (i, 1);
}
-
+
std::istringstream iss(tmp);
uint32_t result = 0;
iss >> result;
SessionMetadataSet::SessionMetadataSet (ustring const & name) :
name (name)
{
- session = 0;
}
void
{
table.set_row_spacings (6);
table.set_col_spacings (12);
+ vbox.pack_start (table, false, false);
+ vbox.set_spacing (6);
+ vbox.set_border_width (6);
}
Gtk::Widget &
void
SessionMetadataSetEditable::set_session (ARDOUR::Session * s)
{
- session = s;
-
- ARDOUR::SessionMetadata const & data = session->metadata();
-
+ SessionHandlePtr::set_session (s);
+
+ if (!_session) {
+ return;
+ }
+
+ ARDOUR::SessionMetadata const & data = _session->metadata();
+
table.resize (list.size(), 2);
uint32_t row = 0;
MetadataPtr field;
void
SessionMetadataSetEditable::save_data ()
{
- ARDOUR::SessionMetadata & data = session->metadata();
+ ARDOUR::SessionMetadata & data = _session->metadata();
for (DataList::const_iterator it = list.begin(); it != list.end(); ++it) {
(*it)->save_data(data);
}
{
tree = Gtk::ListStore::create (tree_cols);
tree_view.set_model (tree);
-
+
Gtk::TreeView::Column * viewcol;
-
+
// Add import column
Gtk::CellRendererToggle * import_render = Gtk::manage(new Gtk::CellRendererToggle());
import_render->signal_toggled().connect (sigc::mem_fun(*this, &SessionMetadataSetImportable::selection_changed));
viewcol = Gtk::manage(new Gtk::TreeView::Column (_("Import"), *import_render));
viewcol->add_attribute (import_render->property_active(), tree_cols.import);
tree_view.append_column (*viewcol);
-
+
// Add field name column
tree_view.append_column(_("Field"), tree_cols.field);
-
+
// Add values column with pango markup
Gtk::CellRendererText * values_render = Gtk::manage(new Gtk::CellRendererText());
viewcol = Gtk::manage(new Gtk::TreeView::Column (_("Values (current value on top)"), *values_render));
viewcol->add_attribute (values_render->property_markup(), tree_cols.values);
tree_view.append_column (*viewcol);
-
+
select_all_check.signal_toggled().connect (sigc::mem_fun(*this, &SessionMetadataSetImportable::select_all));
-
- session = 0;
}
Gtk::Widget &
void
SessionMetadataSetImportable::load_extra_data (ARDOUR::SessionMetadata const & data)
{
- if (!session) {
+ if (!_session) {
std::cerr << "Programming error: no session set for SessionMetaDataSetImportable (in load_data)!" << std::endl;
return;
}
-
- ARDOUR::SessionMetadata & session_data = session->metadata();
-
+
+ ARDOUR::SessionMetadata & session_data = _session->metadata();
+
MetadataPtr session_field;
MetadataPtr import_field;
DataList::iterator session_it;
DataList::iterator import_it;
-
+
// Copy list and load data to import
for (session_it = session_list.begin(); session_it != session_list.end(); ++session_it) {
session_field = *session_it;
while (session_it != session_list.end() && import_it != import_list.end()) { // _should_ be the same...
session_field = *session_it;
import_field = *import_it;
-
+
import_field->load_data(data); // hasn't been done yet
-
+
// Make string for values TODO get color from somewhere?
ustring values = "<span weight=\"ultralight\" color=\"#777\">" + session_field->value() + "</span>\n"
+ "<span weight=\"bold\">" + import_field->value() + "</span>";
-
+
Gtk::TreeModel::iterator row_iter = tree->append();
Gtk::TreeModel::Row row = *row_iter;
row[tree_cols.values] = values;
row[tree_cols.import] = false;
row[tree_cols.data] = import_field;
-
+
++session_it;
++import_it;
}
void
SessionMetadataSetImportable::save_data ()
{
- if (!session) {
+ if (!_session) {
std::cerr << "Programming error: no session set for SessionMetaDataSetImportable (in import_data)!" << std::endl;
return;
}
- ARDOUR::SessionMetadata & session_data = session->metadata();
+ ARDOUR::SessionMetadata & session_data = _session->metadata();
Gtk::TreeModel::Children fields = tree->children();
Gtk::TreeModel::Children::iterator it;
{
select_all_check.set_inconsistent (false);
bool state = select_all_check.get_active();
-
+
Gtk::TreeModel::Children fields = tree->children();
Gtk::TreeModel::Children::iterator it;
for (it = fields.begin(); it != fields.end(); ++it) {
SessionMetadataSetImportable::selection_changed (ustring const & path)
{
select_all_check.set_inconsistent (true);
-
+
Gtk::TreeModel::iterator iter = tree->get_iter (path);
bool value((*iter)[tree_cols.import]);
(*iter)[tree_cols.import] = !value;
ArdourDialog (name, true)
{
cancel_button = add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
- cancel_button->signal_clicked().connect (mem_fun(*this, &SessionMetadataDialog::end_dialog));
+ cancel_button->signal_clicked().connect (sigc::mem_fun(*this, &SessionMetadataDialog::end_dialog));
save_button = add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
- save_button->signal_clicked().connect (mem_fun(*this, &SessionMetadataDialog::save_and_close));
+ save_button->signal_clicked().connect (sigc::mem_fun(*this, &SessionMetadataDialog::save_and_close));
}
template <typename DataSet>
void
SessionMetadataDialog<DataSet>::init_data ()
{
- if (!session) {
+ if (!_session) {
std::cerr << "Programming error: no session set for SessionMetaDataDialog (in init_data)!" << std::endl;
return;
}
-
+
init_track_data ();
init_album_data ();
init_people_data ();
-
+
for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it) {
- (*it)->set_session (session);
-
+ (*it)->set_session (_session);
+
notebook.append_page ((*it)->get_widget(), (*it)->get_tab_widget());
}
}
DataSet * set = dynamic_cast<DataSet *> (it->get());
list->push_back (& CALL_MEMBER_FN (*set, f) ());
}
-
+
return list;
}
data_list.push_back (data_set);
MetadataPtr ptr;
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::title, &ARDOUR::SessionMetadata::set_title, _("Title")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::track_number, &ARDOUR::SessionMetadata::set_track_number, _("Track Number"), 3));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::subtitle, &ARDOUR::SessionMetadata::set_subtitle, _("Subtitle")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::grouping, &ARDOUR::SessionMetadata::set_grouping, _("Grouping")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::artist, &ARDOUR::SessionMetadata::set_artist, _("Artist")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::genre, &ARDOUR::SessionMetadata::set_genre, _("Genre")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::comment, &ARDOUR::SessionMetadata::set_comment, _("Comment")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::copyright, &ARDOUR::SessionMetadata::set_copyright, _("Copyright")));
data_set->add_data_field (ptr);
}
{
DataSetPtr data_set (new DataSet (_("Album")));
data_list.push_back (data_set);
-
+
MetadataPtr ptr;
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::album, &ARDOUR::SessionMetadata::set_album, _("Album")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::year, &ARDOUR::SessionMetadata::set_year, _("Year"), 4));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::album_artist, &ARDOUR::SessionMetadata::set_album_artist, _("Album Artist")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::total_tracks, &ARDOUR::SessionMetadata::set_total_tracks, _("Total Tracks"), 3));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::disc_subtitle, &ARDOUR::SessionMetadata::set_disc_subtitle, _("Disc Subtitle")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::disc_number, &ARDOUR::SessionMetadata::set_disc_number, _("Disc Number"), 2));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new NumberMetadataField (&ARDOUR::SessionMetadata::total_discs, &ARDOUR::SessionMetadata::set_total_discs, _("Total Discs"), 2));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::compilation, &ARDOUR::SessionMetadata::set_compilation, _("Compilation")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::isrc, &ARDOUR::SessionMetadata::set_isrc, _("ISRC")));
data_set->add_data_field (ptr);
}
data_list.push_back (data_set);
MetadataPtr ptr;
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::lyricist, &ARDOUR::SessionMetadata::set_lyricist, _("Lyricist")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::composer, &ARDOUR::SessionMetadata::set_composer, _("Composer")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::conductor, &ARDOUR::SessionMetadata::set_conductor, _("Conductor")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::remixer, &ARDOUR::SessionMetadata::set_remixer, _("Remixer")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::arranger, &ARDOUR::SessionMetadata::set_arranger, _("Arranger")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::engineer, &ARDOUR::SessionMetadata::set_engineer, _("Engineer")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::producer, &ARDOUR::SessionMetadata::set_producer, _("Producer")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::dj_mixer, &ARDOUR::SessionMetadata::set_dj_mixer, _("DJ Mixer")));
data_set->add_data_field (ptr);
-
+
ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::mixer, &ARDOUR::SessionMetadata::set_mixer, _("Mixer")));
data_set->add_data_field (ptr);
}
/* SessionMetadataEditor */
SessionMetadataEditor::SessionMetadataEditor () :
- SessionMetadataDialog<SessionMetadataSetEditable> (_("Edit session metadata"))
+ SessionMetadataDialog<SessionMetadataSetEditable> (_("Edit Session Metadata"))
{
}
void
SessionMetadataEditor::run ()
-{
+{
init_data ();
init_gui();
-
+
ArdourDialog::run();
}
SessionMetadataEditor::init_gui ()
{
add_widget (notebook);
-
+
show_all();
}
void
SessionMetadataImporter::run ()
-{
- if (!session) {
+{
+ if (!_session) {
std::cerr << "Programming error: no session set for SessionMetaDataImporter (in run)!" << std::endl;
return;
}
/* Open session file selector */
-
+
Gtk::FileChooserDialog session_selector(_("Choose session to import metadata from"), Gtk::FILE_CHOOSER_ACTION_OPEN);
session_selector.add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
session_selector.add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
Gtk::FileFilter session_filter;
session_filter.add_pattern ("*.ardour");
- session_filter.set_name (_("Ardour sessions"));
+ session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME));
session_selector.add_filter (session_filter);
session_selector.set_filter (session_filter);
} else {
return;
}
-
+
/* We have a session: load the data and run dialog */
-
+
string filename = Glib::build_filename (path, name + ".ardour");
XMLTree session_tree;
if (!session_tree.read (filename)) {
- warn_user (_("A proper ardour session file was not selected!"));
+ warn_user (_("This session file could not be read!"));
return;
}
-
+
+ /* XXX GET VERSION FROM TREE */
+ int version = 3000;
+
XMLNode * node = session_tree.root()->child ("Metadata");
-
+
if (!node) {
warn_user (_("The session file didn't contain metadata!\nMaybe this is an old session format?"));
return;
}
-
+
ARDOUR::SessionMetadata data;
- data.set_state (*node);
-
+ data.set_state (*node, version);
+
init_data ();
load_extra_data (data);
init_gui();
-
+
ArdourDialog::run();
}
add_widget (selection_hbox);
selection_label.set_text (_("Import all from:"));
selection_hbox.pack_start (selection_label, false, false);
-
+
WidgetListPtr list = get_custom_widgets (&SessionMetadataSetImportable::get_select_all_widget);
for (WidgetList::iterator it = list->begin(); it != list->end(); ++it) {
selection_hbox.pack_start (**it, false, false, 6);
}
add_widget (notebook);
-
+
show_all();
}