summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/session_metadata_dialog.cc87
-rw-r--r--gtk2_ardour/session_metadata_dialog.h29
2 files changed, 115 insertions, 1 deletions
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<DataSet>::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 <typename DataSet>
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: