13
0

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.
This commit is contained in:
Colin Fletcher 2015-02-10 11:06:55 +00:00 committed by Robin Gareus
parent c625d7a637
commit 9d35a105bd
2 changed files with 115 additions and 1 deletions

View File

@ -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>

View File

@ -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: