X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fsession_metadata_dialog.cc;h=7973d035bb389f186837b17811a896be92620fe7;hb=1b5247ebb9ef89b922c3c0b2a8194d510bdd75e1;hp=67d04faa9e58d75ec5bfcaac80a614bd1b77a086;hpb=98834c05324b6e5be70e642ef5b5d62f6d34334a;p=ardour.git diff --git a/gtk2_ardour/session_metadata_dialog.cc b/gtk2_ardour/session_metadata_dialog.cc index 67d04faa9e..7973d035bb 100644 --- a/gtk2_ardour/session_metadata_dialog.cc +++ b/gtk2_ardour/session_metadata_dialog.cc @@ -26,6 +26,7 @@ #include "pbd/xml++.h" #include "pbd/error.h" +#include "ardour/filename_extensions.h" #include "ardour/session.h" #include "ardour/session_utils.h" @@ -153,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); @@ -215,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) @@ -608,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 @@ -725,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); @@ -754,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!")); @@ -771,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