X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fsession_metadata_dialog.cc;h=7973d035bb389f186837b17811a896be92620fe7;hb=ebcd8f696cead9682cafc75815ec4c5702e85fc8;hp=5bac70610627b570f75a04094d673d15280f6e3e;hpb=45ac9c8861be4b4290fdf64f2bea8e300ab13e8f;p=ardour.git diff --git a/gtk2_ardour/session_metadata_dialog.cc b/gtk2_ardour/session_metadata_dialog.cc index 5bac706106..7973d035bb 100644 --- a/gtk2_ardour/session_metadata_dialog.cc +++ b/gtk2_ardour/session_metadata_dialog.cc @@ -24,15 +24,17 @@ #include #include "pbd/xml++.h" +#include "pbd/error.h" + +#include "ardour/filename_extensions.h" #include "ardour/session.h" -#include "ardour/session_directory.h" #include "ardour/session_utils.h" -#include "ardour/configuration.h" #include "i18n.h" using namespace std; using namespace Glib; +using namespace PBD; #define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember)) @@ -152,7 +154,7 @@ NumberMetadataField::load_data (ARDOUR::SessionMetadata const & data) void NumberMetadataField::update_value () { - // Accpt only numbers + // Accept only numbers that will fit into a uint32_t uint32_t number = str_to_uint (entry->get_text()); _value = uint_to_str (number); entry->set_text (_value); @@ -214,6 +216,126 @@ NumberMetadataField::str_to_uint (string const & str) const } + +/* EAN13MetadataField */ + +EAN13MetadataField::EAN13MetadataField (Getter getter, Setter setter, string const & field_name, guint width) : + MetadataField (field_name), + getter (getter), + setter (setter), + width (width) +{ + entry = 0; + label = 0; + value_label = 0; + status_label = Gtk::manage (new Gtk::Label ("")); +} + +MetadataPtr +EAN13MetadataField::copy () +{ + return MetadataPtr (new EAN13MetadataField (getter, setter, _name, width)); +} + +void +EAN13MetadataField::save_data (ARDOUR::SessionMetadata & data) const +{ + CALL_MEMBER_FN (data, setter) (_value); +} + +void +EAN13MetadataField::load_data (ARDOUR::SessionMetadata const & data) +{ + _value = CALL_MEMBER_FN (data, getter) (); + if (entry) { + entry->set_text (_value); + } + update_status (); +} + +void +EAN13MetadataField::update_value () +{ + // Accept only numeric characters + _value = numeric_string (entry->get_text()); + entry->set_text (_value); + update_status (); +} + +void +EAN13MetadataField::update_status () +{ + int len = _value.length (); + if (len == 13) { + // calculate EAN-13 modulo 10 check digit + int sum = 0; + const char *p = _value.c_str(); + for (int i =0; i < 12; i++) { + char c = p[i] - '0'; + if (i % 2) { + sum += c; + } else { + sum += c * 3; + } + } + sum %= 10; + if (sum == p[12] - '0') { + status_label->set_markup (string_compose( + "%1: %2", + _("EAN Check digit OK"), sum)); + } else { + status_label->set_markup (string_compose( + "%1: %2 (%3 %4)", + _("EAN Check digit error"), p[12] - '0', _("expected"), sum)); + } + } else if (len > 0) { + status_label->set_markup (string_compose( + "%1: %2 (<13)", + _("EAN Length error"), len)); + } else { + status_label->set_text(""); + } +} + +Gtk::Widget & +EAN13MetadataField::name_widget () +{ + label = Gtk::manage (new Gtk::Label(_name + ':')); + label->set_alignment (1, 0.5); + return *label; +} + +Gtk::Widget & +EAN13MetadataField::value_widget () +{ + value_label = Gtk::manage (new Gtk::Label(_value)); + return *value_label; +} + +Gtk::Widget & +EAN13MetadataField::edit_widget () +{ + entry = Gtk::manage (new Gtk::Entry()); + + entry->set_text (_value); + entry->set_width_chars (width); + entry->set_max_length (13); + entry->signal_changed().connect (sigc::mem_fun(*this, &EAN13MetadataField::update_value)); + + return *entry; +} + +string +EAN13MetadataField::numeric_string (string const & str) const +{ + string tmp (str); + string::size_type i; + while ((i = tmp.find_first_not_of("1234567890")) != string::npos) { + tmp.erase (i, 1); + } + return tmp; +} + /* SessionMetadataSet */ SessionMetadataSet::SessionMetadataSet (string const & name) @@ -327,7 +449,7 @@ 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; } @@ -375,7 +497,7 @@ 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; } @@ -431,7 +553,7 @@ void SessionMetadataDialog::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; } @@ -607,6 +729,14 @@ SessionMetadataDialog::init_album_data () ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::isrc, &ARDOUR::SessionMetadata::set_isrc, _("ISRC"))); data_set->add_data_field (ptr); + + ptr = MetadataPtr (new EAN13MetadataField (&ARDOUR::SessionMetadata::barcode, &ARDOUR::SessionMetadata::set_barcode, _("EAN barcode"))); + data_set->add_data_field (ptr); + + // EAN13MetadataField is the only kind of MetadataField which has a status label. + EAN13MetadataField &emf = (EAN13MetadataField &) *ptr; + ((Gtk::VBox &) data_set->get_widget()).pack_end (*emf.status_label); + emf.update_status (); } template @@ -712,7 +842,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; } @@ -724,7 +854,7 @@ SessionMetadataImporter::run () session_selector.set_default_response(Gtk::RESPONSE_ACCEPT); Gtk::FileFilter session_filter; - session_filter.add_pattern ("*.ardour"); + session_filter.add_pattern (string_compose(X_("*%1"), ARDOUR::statefile_suffix)); session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME)); session_selector.add_filter (session_filter); session_selector.set_filter (session_filter); @@ -753,7 +883,7 @@ SessionMetadataImporter::run () /* We have a session: load the data and run dialog */ - string filename = Glib::build_filename (path, name + ".ardour"); + string filename = Glib::build_filename (path, name + ARDOUR::statefile_suffix); XMLTree session_tree; if (!session_tree.read (filename)) { warn_user (_("This session file could not be read!")); @@ -770,7 +900,7 @@ SessionMetadataImporter::run () return; } - //create a temporary + //create a temporary ARDOUR::SessionMetadata data; data.set_state (*node, version); init_data ( true ); //skip user data here