diff options
Diffstat (limited to 'src/emu/ui/selector.cpp')
-rw-r--r-- | src/emu/ui/selector.cpp | 244 |
1 files changed, 0 insertions, 244 deletions
diff --git a/src/emu/ui/selector.cpp b/src/emu/ui/selector.cpp deleted file mode 100644 index c9cc3c7b6c0..00000000000 --- a/src/emu/ui/selector.cpp +++ /dev/null @@ -1,244 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Dankan1890 -/********************************************************************* - - ui/m_selector.cpp - - Internal UI user interface. - -*********************************************************************/ - -#include "emu.h" -#include "ui/ui.h" -#include "ui/menu.h" -#include "ui/selector.h" -#include "ui/inifile.h" - -//------------------------------------------------- -// ctor / dtor -//------------------------------------------------- - -ui_menu_selector::ui_menu_selector(running_machine &machine, render_container *container, std::vector<std::string> s_sel, UINT16 &s_actual, int category, int _hover) - : ui_menu(machine, container), m_selector(s_actual) -{ - m_category = category; - m_first_pass = true; - m_hover = _hover; - m_str_items = s_sel; - m_search[0] = '\0'; - m_searchlist[0] = nullptr; -} - -ui_menu_selector::~ui_menu_selector() -{ -} - -//------------------------------------------------- -// handle -//------------------------------------------------- - -void ui_menu_selector::handle() -{ - // process the menu - const ui_menu_event *m_event = process(0); - - if (m_event != nullptr && m_event->itemref != nullptr) - { - if (m_event->iptkey == IPT_UI_SELECT) - { - for (size_t idx = 0; idx < m_str_items.size(); ++idx) - if ((void*)&m_str_items[idx] == m_event->itemref) - m_selector = idx; - - switch (m_category) - { - case SELECTOR_INIFILE: - machine().inifile().current_file = m_selector; - machine().inifile().current_category = 0; - ui_menu::menu_stack->parent->reset(UI_MENU_RESET_REMEMBER_REF); - break; - - case SELECTOR_CATEGORY: - machine().inifile().current_category = m_selector; - ui_menu::menu_stack->parent->reset(UI_MENU_RESET_REMEMBER_REF); - break; - - case SELECTOR_GAME: - main_filters::actual = m_hover; - ui_menu::menu_stack->parent->reset(UI_MENU_RESET_SELECT_FIRST); - break; - - case SELECTOR_SOFTWARE: - sw_filters::actual = m_hover; - ui_menu::menu_stack->parent->reset(UI_MENU_RESET_SELECT_FIRST); - break; - - default: - ui_menu::menu_stack->parent->reset(UI_MENU_RESET_REMEMBER_REF); - break; - } - - ui_globals::switch_image = true; - ui_menu::stack_pop(machine()); - } - else if (m_event->iptkey == IPT_SPECIAL) - { - int buflen = strlen(m_search); - - // if it's a backspace and we can handle it, do so - if ((m_event->unichar == 8 || m_event->unichar == 0x7f) && buflen > 0) - { - *(char *)utf8_previous_char(&m_search[buflen]) = 0; - reset(UI_MENU_RESET_SELECT_FIRST); - } - - // if it's any other key and we're not maxed out, update - else if (m_event->unichar >= ' ' && m_event->unichar < 0x7f) - { - buflen += utf8_from_uchar(&m_search[buflen], ARRAY_LENGTH(m_search) - buflen, m_event->unichar); - m_search[buflen] = 0; - reset(UI_MENU_RESET_SELECT_FIRST); - } - } - - // escape pressed with non-empty text clears the text - else if (m_event->iptkey == IPT_UI_CANCEL && m_search[0] != 0) - { - m_search[0] = '\0'; - reset(UI_MENU_RESET_SELECT_FIRST); - } - } -} - -//------------------------------------------------- -// populate -//------------------------------------------------- - -void ui_menu_selector::populate() -{ - if (m_search[0] != 0) - { - find_matches(m_search); - - for (int curitem = 0; m_searchlist[curitem]; ++curitem) - item_append(m_searchlist[curitem]->c_str(), nullptr, 0, (void *)m_searchlist[curitem]); - } - else - { - for (size_t index = 0, added = 0; index < m_str_items.size(); ++index) - if (m_str_items[index] != "_skip_") - { - if (m_first_pass && m_selector == index) - selected = added; - - added++; - item_append(m_str_items[index].c_str(), nullptr, 0, (void *)&m_str_items[index]); - } - } - - item_append(MENU_SEPARATOR_ITEM, nullptr, 0, nullptr); - customtop = custombottom = machine().ui().get_line_height() + 3.0f * UI_BOX_TB_BORDER; - m_first_pass = false; -} - -//------------------------------------------------- -// perform our special rendering -//------------------------------------------------- - -void ui_menu_selector::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) -{ - float width; - ui_manager &mui = machine().ui(); - std::string tempbuf = std::string("Selection List - Search: ").append(m_search).append("_"); - - // get the size of the text - mui.draw_text_full(container, tempbuf.c_str(), 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_TRUNCATE, - DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, nullptr); - width += (2.0f * UI_BOX_LR_BORDER) + 0.01f; - float maxwidth = MAX(width, origx2 - origx1); - - // compute our bounds - float x1 = 0.5f - 0.5f * maxwidth; - float x2 = x1 + maxwidth; - float y1 = origy1 - top; - float y2 = origy1 - UI_BOX_TB_BORDER; - - // draw a box - mui.draw_outlined_box(container, x1, y1, x2, y2, UI_GREEN_COLOR); - - // take off the borders - x1 += UI_BOX_LR_BORDER; - x2 -= UI_BOX_LR_BORDER; - y1 += UI_BOX_TB_BORDER; - - // draw the text within it - mui.draw_text_full(container, tempbuf.c_str(), x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_TRUNCATE, - DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, nullptr, nullptr); - - // bottom text - // get the text for 'UI Select' - std::string ui_select_text = machine().input().seq_name(machine().ioport().type_seq(IPT_UI_SELECT, 0, SEQ_TYPE_STANDARD)); - tempbuf.assign("Double click or press ").append(ui_select_text).append(" to select"); - - mui.draw_text_full(container, tempbuf.c_str(), 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_NEVER, - DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, nullptr); - width += 2 * UI_BOX_LR_BORDER; - maxwidth = MAX(maxwidth, width); - - // compute our bounds - x1 = 0.5f - 0.5f * maxwidth; - x2 = x1 + maxwidth; - y1 = origy2 + UI_BOX_TB_BORDER; - y2 = origy2 + bottom; - - // draw a box - mui.draw_outlined_box(container, x1, y1, x2, y2, UI_RED_COLOR); - - // take off the borders - x1 += UI_BOX_LR_BORDER; - x2 -= UI_BOX_LR_BORDER; - y1 += UI_BOX_TB_BORDER; - - // draw the text within it - mui.draw_text_full(container, tempbuf.c_str(), x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_NEVER, - DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, nullptr, nullptr); -} - -//------------------------------------------------- -// find approximate matches -//------------------------------------------------- - -void ui_menu_selector::find_matches(const char *str) -{ - // allocate memory to track the penalty value - std::vector<int> penalty(VISIBLE_GAMES_IN_SEARCH, 9999); - int index = 0; - - for (; index < m_str_items.size(); ++index) - { - if (m_str_items[index] == "_skip_") - continue; - - // pick the best match between driver name and description - int curpenalty = fuzzy_substring(str, m_str_items[index]); - - // insert into the sorted table of matches - for (int matchnum = VISIBLE_GAMES_IN_SEARCH - 1; matchnum >= 0; --matchnum) - { - // stop if we're worse than the current entry - if (curpenalty >= penalty[matchnum]) - break; - - // as long as this isn't the last entry, bump this one down - if (matchnum < VISIBLE_GAMES_IN_SEARCH - 1) - { - penalty[matchnum + 1] = penalty[matchnum]; - m_searchlist[matchnum + 1] = m_searchlist[matchnum]; - } - - m_searchlist[matchnum] = &m_str_items[index]; - penalty[matchnum] = curpenalty; - } - } - (index < VISIBLE_GAMES_IN_SEARCH) ? m_searchlist[index] = nullptr : m_searchlist[VISIBLE_GAMES_IN_SEARCH] = nullptr; -} |