if a (file) source really cannot be found, differentiate between audio & MIDI.
[ardour.git] / gtk2_ardour / session_metadata_dialog.cc
index e43762548088afda5d07d1d724fd37c99ed809f4..67d04faa9e58d75ec5bfcaac80a614bd1b77a086 100644 (file)
 #include <gtkmm2ext/utils.h>
 
 #include "pbd/xml++.h"
+#include "pbd/error.h"
+
 #include "ardour/session.h"
-#include "ardour/session_directory.h"
 #include "ardour/session_utils.h"
 
 #include "i18n.h"
 
 using namespace std;
 using namespace Glib;
+using namespace PBD;
 
 #define CALL_MEMBER_FN(object,ptrToMember)  ((object).*(ptrToMember))
 
@@ -81,7 +83,8 @@ TextMetadataField::load_data (ARDOUR::SessionMetadata const & data)
 Gtk::Widget &
 TextMetadataField::name_widget ()
 {
-       label = Gtk::manage (new Gtk::Label(_name + ':', Gtk::ALIGN_LEFT));
+       label = Gtk::manage (new Gtk::Label(_name + ':'));
+       label->set_alignment (1, 0.5);
        return *label;
 }
 
@@ -159,7 +162,8 @@ NumberMetadataField::update_value ()
 Gtk::Widget &
 NumberMetadataField::name_widget ()
 {
-       label = Gtk::manage (new Gtk::Label(_name + ':', Gtk::ALIGN_LEFT));
+       label = Gtk::manage (new Gtk::Label(_name + ':'));
+       label->set_alignment (1, 0.5);
        return *label;
 }
 
@@ -213,7 +217,7 @@ NumberMetadataField::str_to_uint (string const & str) const
 
 /* SessionMetadataSet */
 
-SessionMetadataSet::SessionMetadataSet (string const & name) 
+SessionMetadataSet::SessionMetadataSet (string const & name)
   : name (name)
 {
 }
@@ -226,11 +230,12 @@ SessionMetadataSet::add_data_field (MetadataPtr field)
 
 /* SessionMetadataSetEditable */
 
-SessionMetadataSetEditable::SessionMetadataSetEditable (string const & name) 
+SessionMetadataSetEditable::SessionMetadataSetEditable (string const & name)
   : SessionMetadataSet (name)
 {
        table.set_row_spacings (6);
        table.set_col_spacings (12);
+       table.set_homogeneous (false);
        vbox.pack_start (table, false, false);
        vbox.set_spacing (6);
        vbox.set_border_width (6);
@@ -252,7 +257,7 @@ SessionMetadataSetEditable::set_session (ARDOUR::Session * s)
                return;
        }
 
-       ARDOUR::SessionMetadata const & data = _session->metadata();
+       ARDOUR::SessionMetadata const & data = *(ARDOUR::SessionMetadata::Metadata());
 
        table.resize (list.size(), 2);
        uint32_t row = 0;
@@ -260,7 +265,7 @@ SessionMetadataSetEditable::set_session (ARDOUR::Session * s)
        for (DataList::const_iterator it = list.begin(); it != list.end(); ++it) {
                field = *it;
                field->load_data (data);
-               table.attach (field->name_widget(), 0, 1, row, row + 1);
+               table.attach (field->name_widget(), 0, 1, row, row + 1, Gtk::FILL);
                table.attach (field->edit_widget(), 1, 2, row, row + 1);
                ++row;
        }
@@ -269,7 +274,7 @@ SessionMetadataSetEditable::set_session (ARDOUR::Session * s)
 void
 SessionMetadataSetEditable::save_data ()
 {
-       ARDOUR::SessionMetadata & data = _session->metadata();
+       ARDOUR::SessionMetadata & data = *(ARDOUR::SessionMetadata::Metadata());
        for (DataList::const_iterator it = list.begin(); it != list.end(); ++it) {
                (*it)->save_data(data);
        }
@@ -277,7 +282,7 @@ SessionMetadataSetEditable::save_data ()
 
 /* SessionMetadataSetImportable */
 
-SessionMetadataSetImportable::SessionMetadataSetImportable (string const & name) 
+SessionMetadataSetImportable::SessionMetadataSetImportable (string const & name)
   : SessionMetadataSet (name)
   , session_list (list)
 {
@@ -323,11 +328,11 @@ void
 SessionMetadataSetImportable::load_extra_data (ARDOUR::SessionMetadata const & data)
 {
        if (!_session) {
-               std::cerr << "Programming error: no session set for SessionMetaDataSetImportable (in load_data)!" << std::endl;
+               error << string_compose (_("programming error: %1"), "no session set for SessionMetaDataSetImportable (in load_data)!") << endmsg;
                return;
        }
 
-       ARDOUR::SessionMetadata & session_data = _session->metadata();
+       ARDOUR::SessionMetadata const & session_data = *(ARDOUR::SessionMetadata::Metadata());
 
        MetadataPtr session_field;
        MetadataPtr import_field;
@@ -371,11 +376,11 @@ void
 SessionMetadataSetImportable::save_data ()
 {
        if (!_session) {
-               std::cerr << "Programming error: no session set for SessionMetaDataSetImportable (in import_data)!" << std::endl;
+               error << string_compose (_("programming error: %1"), "no session set for SessionMetaDataSetImportable (in import_data)!") << endmsg;
                return;
        }
 
-       ARDOUR::SessionMetadata & session_data = _session->metadata();
+       ARDOUR::SessionMetadata & session_data = *(ARDOUR::SessionMetadata::Metadata());
 
        Gtk::TreeModel::Children fields = tree->children();
        Gtk::TreeModel::Children::iterator it;
@@ -418,22 +423,25 @@ SessionMetadataDialog<DataSet>::SessionMetadataDialog (string const & name) :
 {
        cancel_button = add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
        cancel_button->signal_clicked().connect (sigc::mem_fun(*this, &SessionMetadataDialog::end_dialog));
-       save_button = add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
+       save_button = add_button (Gtk::Stock::OK, Gtk::RESPONSE_ACCEPT);
        save_button->signal_clicked().connect (sigc::mem_fun(*this, &SessionMetadataDialog::save_and_close));
 }
 
 template <typename DataSet>
 void
-SessionMetadataDialog<DataSet>::init_data ()
+SessionMetadataDialog<DataSet>::init_data ( bool skip_user )
 {
        if (!_session) {
-               std::cerr << "Programming error: no session set for SessionMetaDataDialog (in init_data)!" << std::endl;
+               error << string_compose (_("programming error: %1"), "no session set for SessionMetaDataDialog (in init_data)!") << endmsg;
                return;
        }
 
+       if (!skip_user)
+               init_user_data ();
        init_track_data ();
        init_album_data ();
        init_people_data ();
+       init_school_data ();
 
        for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it) {
                (*it)->set_session (_session);
@@ -465,6 +473,7 @@ void
 SessionMetadataDialog<DataSet>::save_and_close ()
 {
        save_data ();
+       _session->set_dirty();
        end_dialog ();
 }
 
@@ -504,6 +513,32 @@ SessionMetadataDialog<DataSet>::add_widget (Gtk::Widget & widget)
        get_vbox()->pack_start (widget, true, true, 0);
 }
 
+template <typename DataSet>
+void
+SessionMetadataDialog<DataSet>::init_user_data ()
+{
+       DataSetPtr data_set (new DataSet (_("User")));
+       data_list.push_back (data_set);
+
+       MetadataPtr ptr;
+
+       ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::user_name, &ARDOUR::SessionMetadata::set_user_name, _("Name")));
+       data_set->add_data_field (ptr);
+
+       ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::user_email, &ARDOUR::SessionMetadata::set_user_email, _("Email")));
+       data_set->add_data_field (ptr);
+
+       ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::user_web, &ARDOUR::SessionMetadata::set_user_web, _("Web")));
+       data_set->add_data_field (ptr);
+
+       ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::organization, &ARDOUR::SessionMetadata::set_organization, _("Organization")));
+       data_set->add_data_field (ptr);
+
+       ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::country, &ARDOUR::SessionMetadata::set_country, _("Country")));
+       data_set->add_data_field (ptr);
+
+}
+
 template <typename DataSet>
 void
 SessionMetadataDialog<DataSet>::init_track_data ()
@@ -608,10 +643,27 @@ SessionMetadataDialog<DataSet>::init_people_data ()
        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")));
+       ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::mixer, &ARDOUR::SessionMetadata::set_mixer, S_("Metadata|Mixer")));
        data_set->add_data_field (ptr);
 }
 
+template <typename DataSet>
+void
+SessionMetadataDialog<DataSet>::init_school_data ()
+{
+       DataSetPtr data_set (new DataSet (_("School")));
+       data_list.push_back (data_set);
+
+       MetadataPtr ptr;
+
+       ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::instructor, &ARDOUR::SessionMetadata::set_instructor, _("Instructor")));
+       data_set->add_data_field (ptr);
+
+       ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::course, &ARDOUR::SessionMetadata::set_course, _("Course")));
+       data_set->add_data_field (ptr);
+
+}
+
 /* SessionMetadataEditor */
 
 SessionMetadataEditor::SessionMetadataEditor () :
@@ -661,7 +713,7 @@ void
 SessionMetadataImporter::run ()
 {
        if (!_session) {
-               std::cerr << "Programming error: no session set for SessionMetaDataImporter (in run)!" << std::endl;
+               error << string_compose (_("programming error: %1"), "no session set for SessionMetaDataImporter (in run)!") << endmsg;
                return;
        }
 
@@ -719,10 +771,10 @@ SessionMetadataImporter::run ()
                return;
        }
 
+       //create a temporary 
        ARDOUR::SessionMetadata data;
        data.set_state (*node, version);
-
-       init_data ();
+       init_data ( true );  //skip user data here
        load_extra_data (data);
        init_gui();