From 9d35a105bd3cfa14bd139028490ce880ce4d7fb5 Mon Sep 17 00:00:00 2001 From: Colin Fletcher Date: Tue, 10 Feb 2015 11:06:55 +0000 Subject: Add EAN barcode field to session metadata dialogue Add an EAN13MetadataField type to the session metadata dialogue, and use it for entry of the EAN barcode in the 'album' tab. --- gtk2_ardour/session_metadata_dialog.cc | 87 +++++++++++++++++++++++++++++++++- gtk2_ardour/session_metadata_dialog.h | 29 ++++++++++++ 2 files changed, 115 insertions(+), 1 deletion(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/session_metadata_dialog.cc b/gtk2_ardour/session_metadata_dialog.cc index 69f215a9e2..f4e708f62a 100644 --- a/gtk2_ardour/session_metadata_dialog.cc +++ b/gtk2_ardour/session_metadata_dialog.cc @@ -154,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); @@ -216,6 +216,88 @@ 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; +} + +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); + } +} + +void +EAN13MetadataField::update_value () +{ + // Accept only numeric characters + _value = numeric_string (entry->get_text()); + entry->set_text (_value); +} + +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) @@ -609,6 +691,9 @@ 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); } template diff --git a/gtk2_ardour/session_metadata_dialog.h b/gtk2_ardour/session_metadata_dialog.h index 1599e50bb3..6dc4e6e371 100644 --- a/gtk2_ardour/session_metadata_dialog.h +++ b/gtk2_ardour/session_metadata_dialog.h @@ -120,6 +120,35 @@ class NumberMetadataField : public MetadataField { guint width; }; +/// MetadataField that accepts EAN-13 data only +class EAN13MetadataField : public MetadataField { + private: + typedef std::string (ARDOUR::SessionMetadata::*Getter) () const; + typedef void (ARDOUR::SessionMetadata::*Setter) (std::string const &); + public: + EAN13MetadataField (Getter getter, Setter setter, std::string const & field_name, guint width = 13); + MetadataPtr copy (); + + void save_data (ARDOUR::SessionMetadata & data) const; + void load_data (ARDOUR::SessionMetadata const & data); + + Gtk::Widget & name_widget (); + Gtk::Widget & value_widget (); + Gtk::Widget & edit_widget (); + private: + void update_value (); + std::string numeric_string (std::string const & str) const; + + Getter getter; + Setter setter; + + Gtk::Label* label; + Gtk::Label* value_label; + Gtk::Entry* entry; + + guint width; +}; + /// Interface for MetadataFields class SessionMetadataSet : public ARDOUR::SessionHandlePtr { public: -- cgit v1.2.3