// license:BSD-3-Clause // copyright-holders:Fabio Priuli /*************************************************************************** ui/barcode.cpp "Barcode Reader" control ***************************************************************************/ #include "emu.h" #include "ui/barcode.h" #include "ui/ui.h" namespace ui { // itemrefs for key menu items #define ITEMREF_NEW_BARCODE ((void *) 0x0001) #define ITEMREF_ENTER_BARCODE ((void *) 0x0002) #define ITEMREF_SELECT_READER ((void *) 0x0003) /************************************************** BARCODE READER MENU **************************************************/ //------------------------------------------------- // ctor //------------------------------------------------- menu_barcode_reader::menu_barcode_reader(mame_ui_manager &mui, render_container *container, barcode_reader_device *device) : menu_device_control(mui, container, device) { } //------------------------------------------------- // dtor //------------------------------------------------- menu_barcode_reader::~menu_barcode_reader() { } //------------------------------------------------- // populate - populates the barcode input menu //------------------------------------------------- void menu_barcode_reader::populate() { if (current_device()) { std::string buffer; const char *new_barcode; // selected device item_append(current_display_name().c_str(), "", current_display_flags(), ITEMREF_SELECT_READER); // append the "New Barcode" item if (get_selection() == ITEMREF_NEW_BARCODE) { buffer.append(m_barcode_buffer); new_barcode = buffer.c_str(); } else { new_barcode = m_barcode_buffer; } item_append(_("New Barcode:"), new_barcode, 0, ITEMREF_NEW_BARCODE); // finish up the menu item_append(menu_item_type::SEPARATOR); item_append(_("Enter Code"), nullptr, 0, ITEMREF_ENTER_BARCODE); customtop = ui().get_line_height() + 3.0f * UI_BOX_TB_BORDER; } } //------------------------------------------------- // handle - manages inputs in the barcode input menu //------------------------------------------------- void menu_barcode_reader::handle() { // rebuild the menu (so to update the selected device, if the user has pressed L or R) reset(reset_options::REMEMBER_POSITION); populate(); // process the menu const event *event = process(PROCESS_LR_REPEAT); // process the event if (event) { // handle selections switch (event->iptkey) { case IPT_UI_LEFT: if (event->itemref == ITEMREF_SELECT_READER) previous(); break; case IPT_UI_RIGHT: if (event->itemref == ITEMREF_SELECT_READER) next(); break; case IPT_UI_SELECT: if (event->itemref == ITEMREF_ENTER_BARCODE) { std::string tmp_file(m_barcode_buffer); //printf("code %s\n", m_barcode_buffer); if (!current_device()->is_valid(tmp_file.length())) ui().popup_time(5, "%s", _("Barcode length invalid!")); else { current_device()->write_code(tmp_file.c_str(), tmp_file.length()); // if sending was successful, reset char buffer if (m_barcode_buffer[0] != '\0') memset(m_barcode_buffer, '\0', ARRAY_LENGTH(m_barcode_buffer)); reset(reset_options::REMEMBER_POSITION); } } break; case IPT_SPECIAL: if (get_selection() == ITEMREF_NEW_BARCODE) { auto const buflen = std::strlen(m_barcode_buffer); // if it's a backspace and we can handle it, do so if ((event->unichar == 8) || (event->unichar == 0x7f)) { if (0 < buflen) *const_cast(utf8_previous_char(&m_barcode_buffer[buflen])) = 0; } else if ((event->unichar >= '0') && (event->unichar <= '9')) { event->append_char(m_barcode_buffer, buflen); } reset(reset_options::REMEMBER_POSITION); } break; case IPT_UI_CANCEL: // reset the char buffer also in this case if (m_barcode_buffer[0] != '\0') memset(m_barcode_buffer, '\0', ARRAY_LENGTH(m_barcode_buffer)); break; } } } } // namespace ui