diff options
author | Vas Crabb <vas@vastheman.com> | 2017-08-10 18:05:54 +1000 |
---|---|---|
committer | Vas Crabb <vas@vastheman.com> | 2017-08-10 18:05:54 +1000 |
commit | b363e92b5d14d988833242b4ce876bcdfac3cc65 (patch) | |
tree | a3b23a966362eb76bcbf6d2afe3120c630093d3d /src | |
parent | 7145f33cdf207267a7d0f3a56932e94f154851d0 (diff) |
Don't process every character individually when searching - this reduces
lag if you keep typing while a big list is searched.
(nw) patch up German translation
Diffstat (limited to 'src')
-rw-r--r-- | src/emu/uiinput.cpp | 51 | ||||
-rw-r--r-- | src/emu/uiinput.h | 33 | ||||
-rw-r--r-- | src/frontend/mame/ui/menu.cpp | 8 | ||||
-rw-r--r-- | src/frontend/mame/ui/selgame.cpp | 24 | ||||
-rw-r--r-- | src/frontend/mame/ui/selgame.h | 2 | ||||
-rw-r--r-- | src/frontend/mame/ui/selmenu.cpp | 46 | ||||
-rw-r--r-- | src/frontend/mame/ui/selmenu.h | 1 | ||||
-rw-r--r-- | src/frontend/mame/ui/selsoft.cpp | 15 | ||||
-rw-r--r-- | src/frontend/mame/ui/selsoft.h | 1 | ||||
-rw-r--r-- | src/frontend/mame/ui/ui.cpp | 2 | ||||
-rw-r--r-- | src/osd/modules/debugger/debugimgui.cpp | 2 | ||||
-rw-r--r-- | src/osd/modules/input/input_uwp.cpp | 2 |
12 files changed, 90 insertions, 97 deletions
diff --git a/src/emu/uiinput.cpp b/src/emu/uiinput.cpp index 9123a6af526..18fee890eec 100644 --- a/src/emu/uiinput.cpp +++ b/src/emu/uiinput.cpp @@ -98,13 +98,13 @@ bool ui_input_manager::push_event(ui_event evt) /* some pre-processing (this is an icky place to do this stuff!) */ switch (evt.event_type) { - case UI_EVENT_MOUSE_MOVE: + case ui_event::MOUSE_MOVE: m_current_mouse_target = evt.target; m_current_mouse_x = evt.mouse_x; m_current_mouse_y = evt.mouse_y; break; - case UI_EVENT_MOUSE_LEAVE: + case ui_event::MOUSE_LEAVE: if (m_current_mouse_target == evt.target) { m_current_mouse_target = nullptr; @@ -113,11 +113,11 @@ bool ui_input_manager::push_event(ui_event evt) } break; - case UI_EVENT_MOUSE_DOWN: + case ui_event::MOUSE_DOWN: m_current_mouse_down = true; break; - case UI_EVENT_MOUSE_UP: + case ui_event::MOUSE_UP: m_current_mouse_down = false; break; @@ -142,20 +142,17 @@ bool ui_input_manager::push_event(ui_event evt) bool ui_input_manager::pop_event(ui_event *evt) { - bool result; - if (m_events_start != m_events_end) { *evt = m_events[m_events_start++]; m_events_start %= ARRAY_LENGTH(m_events); - result = true; + return true; } else { memset(evt, 0, sizeof(*evt)); - result = false; + return false; } - return result; } @@ -293,8 +290,8 @@ g_profiler.stop(); void ui_input_manager::push_mouse_move_event(render_target* target, s32 x, s32 y) { - ui_event event = { UI_EVENT_NONE }; - event.event_type = UI_EVENT_MOUSE_MOVE; + ui_event event = { ui_event::NONE }; + event.event_type = ui_event::MOUSE_MOVE; event.target = target; event.mouse_x = x; event.mouse_y = y; @@ -308,8 +305,8 @@ void ui_input_manager::push_mouse_move_event(render_target* target, s32 x, s32 y void ui_input_manager::push_mouse_leave_event(render_target* target) { - ui_event event = { UI_EVENT_NONE }; - event.event_type = UI_EVENT_MOUSE_LEAVE; + ui_event event = { ui_event::NONE }; + event.event_type = ui_event::MOUSE_LEAVE; event.target = target; push_event(event); } @@ -321,8 +318,8 @@ void ui_input_manager::push_mouse_leave_event(render_target* target) void ui_input_manager::push_mouse_down_event(render_target* target, s32 x, s32 y) { - ui_event event = { UI_EVENT_NONE }; - event.event_type = UI_EVENT_MOUSE_DOWN; + ui_event event = { ui_event::NONE }; + event.event_type = ui_event::MOUSE_DOWN; event.target = target; event.mouse_x = x; event.mouse_y = y; @@ -336,8 +333,8 @@ void ui_input_manager::push_mouse_down_event(render_target* target, s32 x, s32 y void ui_input_manager::push_mouse_up_event(render_target* target, s32 x, s32 y) { - ui_event event = { UI_EVENT_NONE }; - event.event_type = UI_EVENT_MOUSE_UP; + ui_event event = { ui_event::NONE }; + event.event_type = ui_event::MOUSE_UP; event.target = target; event.mouse_x = x; event.mouse_y = y; @@ -351,8 +348,8 @@ down event to the specified render_target void ui_input_manager::push_mouse_rdown_event(render_target* target, s32 x, s32 y) { - ui_event event = { UI_EVENT_NONE }; - event.event_type = UI_EVENT_MOUSE_RDOWN; + ui_event event = { ui_event::NONE }; + event.event_type = ui_event::MOUSE_RDOWN; event.target = target; event.mouse_x = x; event.mouse_y = y; @@ -366,8 +363,8 @@ down event to the specified render_target void ui_input_manager::push_mouse_rup_event(render_target* target, s32 x, s32 y) { - ui_event event = { UI_EVENT_NONE }; - event.event_type = UI_EVENT_MOUSE_RUP; + ui_event event = { ui_event::NONE }; + event.event_type = ui_event::MOUSE_RUP; event.target = target; event.mouse_x = x; event.mouse_y = y; @@ -381,8 +378,8 @@ void ui_input_manager::push_mouse_rup_event(render_target* target, s32 x, s32 y) -------------------------------------------------*/ void ui_input_manager::push_mouse_double_click_event(render_target* target, s32 x, s32 y) { - ui_event event = { UI_EVENT_NONE }; - event.event_type = UI_EVENT_MOUSE_DOUBLE_CLICK; + ui_event event = { ui_event::NONE }; + event.event_type = ui_event::MOUSE_DOUBLE_CLICK; event.target = target; event.mouse_x = x; event.mouse_y = y; @@ -395,8 +392,8 @@ void ui_input_manager::push_mouse_double_click_event(render_target* target, s32 -------------------------------------------------*/ void ui_input_manager::push_char_event(render_target* target, char32_t ch) { - ui_event event = { UI_EVENT_NONE }; - event.event_type = UI_EVENT_CHAR; + ui_event event = { ui_event::NONE }; + event.event_type = ui_event::IME_CHAR; event.target = target; event.ch = ch; push_event(event); @@ -409,8 +406,8 @@ void ui_input_manager::push_char_event(render_target* target, char32_t ch) void ui_input_manager::push_mouse_wheel_event(render_target *target, s32 x, s32 y, short delta, int ucNumLines) { - ui_event event = { UI_EVENT_NONE }; - event.event_type = UI_EVENT_MOUSE_WHEEL; + ui_event event = { ui_event::NONE }; + event.event_type = ui_event::MOUSE_WHEEL; event.target = target; event.mouse_x = x; event.mouse_y = y; diff --git a/src/emu/uiinput.h b/src/emu/uiinput.h index e6673c4d763..2a7aeeff084 100644 --- a/src/emu/uiinput.h +++ b/src/emu/uiinput.h @@ -23,23 +23,23 @@ TYPE DEFINITIONS ***************************************************************************/ -enum ui_event_type -{ - UI_EVENT_NONE, - UI_EVENT_MOUSE_MOVE, - UI_EVENT_MOUSE_LEAVE, - UI_EVENT_MOUSE_DOWN, - UI_EVENT_MOUSE_UP, - UI_EVENT_MOUSE_RDOWN, - UI_EVENT_MOUSE_RUP, - UI_EVENT_MOUSE_DOUBLE_CLICK, - UI_EVENT_MOUSE_WHEEL, - UI_EVENT_CHAR -}; - struct ui_event { - ui_event_type event_type; + enum type + { + NONE, + MOUSE_MOVE, + MOUSE_LEAVE, + MOUSE_DOWN, + MOUSE_UP, + MOUSE_RDOWN, + MOUSE_RUP, + MOUSE_DOUBLE_CLICK, + MOUSE_WHEEL, + IME_CHAR + }; + + type event_type; render_target * target; s32 mouse_x; s32 mouse_y; @@ -65,6 +65,9 @@ public: /* pops an event off of the queue */ bool pop_event(ui_event *event); + /* check the next event type without removing it */ + ui_event::type peek_event_type() const { return (m_events_start != m_events_end) ? m_events[m_events_start].event_type : ui_event::NONE; } + /* clears all outstanding events */ void reset(); diff --git a/src/frontend/mame/ui/menu.cpp b/src/frontend/mame/ui/menu.cpp index eac424ea412..5f1056bc45d 100644 --- a/src/frontend/mame/ui/menu.cpp +++ b/src/frontend/mame/ui/menu.cpp @@ -907,7 +907,7 @@ void menu::handle_events(uint32_t flags, event &ev) switch (local_menu_event.event_type) { // if we are hovering over a valid item, select it with a single click - case UI_EVENT_MOUSE_DOWN: + case ui_event::MOUSE_DOWN: if (custom_mouse_down()) return; @@ -943,7 +943,7 @@ void menu::handle_events(uint32_t flags, event &ev) break; // if we are hovering over a valid item, fake a UI_SELECT with a double-click - case UI_EVENT_MOUSE_DOUBLE_CLICK: + case ui_event::MOUSE_DOUBLE_CLICK: if (!(flags & PROCESS_ONLYCHAR) && hover >= 0 && hover < item.size()) { selected = hover; @@ -958,7 +958,7 @@ void menu::handle_events(uint32_t flags, event &ev) break; // caught scroll event - case UI_EVENT_MOUSE_WHEEL: + case ui_event::MOUSE_WHEEL: if (!(flags & PROCESS_ONLYCHAR)) { if (local_menu_event.zdelta > 0) @@ -991,7 +991,7 @@ void menu::handle_events(uint32_t flags, event &ev) break; // translate CHAR events into specials - case UI_EVENT_CHAR: + case ui_event::IME_CHAR: ev.iptkey = IPT_SPECIAL; ev.unichar = local_menu_event.ch; stop = true; diff --git a/src/frontend/mame/ui/selgame.cpp b/src/frontend/mame/ui/selgame.cpp index 86e1ac06dce..cb66194acb5 100644 --- a/src/frontend/mame/ui/selgame.cpp +++ b/src/frontend/mame/ui/selgame.cpp @@ -224,11 +224,6 @@ void menu_select_game::handle() highlight = machine_filter::LAST; break; - case IPT_SPECIAL: - // typed characters append to the buffer - inkey_special(menu_event); - break; - case IPT_OTHER: // this is generated when something in the left box is clicked m_prev_selected = nullptr; @@ -849,22 +844,9 @@ void menu_select_game::inkey_select_favorite(const event *menu_event) // returns if the search can be activated //------------------------------------------------- -inline bool menu_select_game::isfavorite() const +bool menu_select_game::isfavorite() const { - return (main_filters::actual == machine_filter::FAVORITE); -} - -//------------------------------------------------- -// handle special key event -//------------------------------------------------- - -void menu_select_game::inkey_special(const event *menu_event) -{ - if (!isfavorite()) - { - if (input_character(m_search, menu_event->unichar, uchar_is_printable)) - reset(reset_options::SELECT_FIRST); - } + return machine_filter::FAVORITE == main_filters::actual; } @@ -1432,7 +1414,7 @@ void menu_select_game::make_topbox_text(std::string &line0, std::string &line1, { line1.clear(); } - if (main_filters::actual == machine_filter::CATEGORY && inifile.total() > 0) + else if (main_filters::actual == machine_filter::CATEGORY && inifile.total() > 0) { line1 = string_format(_("%1$s (%2$s - %3$s) - Search: %4$s_"), machine_filter::display_name(main_filters::actual), diff --git a/src/frontend/mame/ui/selgame.h b/src/frontend/mame/ui/selgame.h index e8093ff5f78..0a2b49e08bd 100644 --- a/src/frontend/mame/ui/selgame.h +++ b/src/frontend/mame/ui/selgame.h @@ -56,6 +56,7 @@ private: // get selected software and/or driver virtual void get_selection(ui_software_info const *&software, game_driver const *&driver) const override; + virtual bool accept_search() const override { return !isfavorite(); } // text for main top/bottom panels virtual void make_topbox_text(std::string &line0, std::string &line1, std::string &line2) const override; @@ -88,7 +89,6 @@ private: // handlers void inkey_select(const event *menu_event); void inkey_select_favorite(const event *menu_event); - void inkey_special(const event *menu_event); void inkey_export(); }; diff --git a/src/frontend/mame/ui/selmenu.cpp b/src/frontend/mame/ui/selmenu.cpp index 2af76f00d0b..7ae24e1cdae 100644 --- a/src/frontend/mame/ui/selmenu.cpp +++ b/src/frontend/mame/ui/selmenu.cpp @@ -1310,9 +1310,6 @@ void menu_select_launch::handle_keys(uint32_t flags, int &iptkey) void menu_select_launch::handle_events(uint32_t flags, event &ev) { - bool stop = false; - ui_event local_menu_event; - if (m_pressed) { bool const pressed = mouse_pressed(); @@ -1331,12 +1328,14 @@ void menu_select_launch::handle_events(uint32_t flags, event &ev) } // loop while we have interesting events + bool stop(false), search_changed(false); + ui_event local_menu_event; while (!stop && machine().ui_input().pop_event(&local_menu_event)) { switch (local_menu_event.event_type) { // if we are hovering over a valid item, select it with a single click - case UI_EVENT_MOUSE_DOWN: + case ui_event::MOUSE_DOWN: if (m_ui_error) { ev.iptkey = IPT_OTHER; @@ -1433,7 +1432,7 @@ void menu_select_launch::handle_events(uint32_t flags, event &ev) break; // if we are hovering over a valid item, fake a UI_SELECT with a double-click - case UI_EVENT_MOUSE_DOUBLE_CLICK: + case ui_event::MOUSE_DOUBLE_CLICK: if (hover >= 0 && hover < item.size()) { selected = hover; @@ -1449,7 +1448,7 @@ void menu_select_launch::handle_events(uint32_t flags, event &ev) break; // caught scroll event - case UI_EVENT_MOUSE_WHEEL: + case ui_event::MOUSE_WHEEL: if (hover >= 0 && hover < item.size() - skip_main_items - 1) { if (local_menu_event.zdelta > 0) @@ -1481,21 +1480,25 @@ void menu_select_launch::handle_events(uint32_t flags, event &ev) break; // translate CHAR events into specials - case UI_EVENT_CHAR: + case ui_event::IME_CHAR: if (exclusive_input_pressed(ev.iptkey, IPT_UI_CONFIGURE, 0)) { ev.iptkey = IPT_UI_CONFIGURE; stop = true; } - else + else if (m_ui_error) { ev.iptkey = IPT_SPECIAL; - ev.unichar = local_menu_event.ch; stop = true; } + else if (accept_search()) + { + if (input_character(m_search, local_menu_event.ch, uchar_is_printable)) + search_changed = true; + } break; - case UI_EVENT_MOUSE_RDOWN: + case ui_event::MOUSE_RDOWN: if (hover >= 0 && hover < item.size() - skip_main_items - 1) { selected = hover; @@ -1512,7 +1515,30 @@ void menu_select_launch::handle_events(uint32_t flags, event &ev) default: break; } + + // need to update search before processing certain kinds of events, but others don't matter + if (search_changed) + { + switch (machine().ui_input().peek_event_type()) + { + case ui_event::MOUSE_DOWN: + case ui_event::MOUSE_RDOWN: + case ui_event::MOUSE_DOUBLE_CLICK: + case ui_event::MOUSE_WHEEL: + stop = true; + break; + case ui_event::NONE: + case ui_event::MOUSE_MOVE: + case ui_event::MOUSE_LEAVE: + case ui_event::MOUSE_UP: + case ui_event::MOUSE_RUP: + case ui_event::IME_CHAR: + break; + } + } } + if (search_changed) + reset(reset_options::SELECT_FIRST); } diff --git a/src/frontend/mame/ui/selmenu.h b/src/frontend/mame/ui/selmenu.h index 888a72e085d..8b8d0157448 100644 --- a/src/frontend/mame/ui/selmenu.h +++ b/src/frontend/mame/ui/selmenu.h @@ -195,6 +195,7 @@ private: // get selected software and/or driver virtual void get_selection(ui_software_info const *&software, game_driver const *&driver) const = 0; + virtual bool accept_search() const { return true; } void select_prev() { if (!m_prev_selected) diff --git a/src/frontend/mame/ui/selsoft.cpp b/src/frontend/mame/ui/selsoft.cpp index a3a3cd072ef..e64a6136cf7 100644 --- a/src/frontend/mame/ui/selsoft.cpp +++ b/src/frontend/mame/ui/selsoft.cpp @@ -244,11 +244,6 @@ void menu_select_software::handle() } } } - else if (menu_event->iptkey == IPT_SPECIAL) - { - // typed characters append to the buffer - inkey_special(menu_event); - } } } } @@ -528,16 +523,6 @@ void menu_select_software::inkey_select(const event *menu_event) } } -//------------------------------------------------- -// handle special key event -//------------------------------------------------- - -void menu_select_software::inkey_special(const event *menu_event) -{ - if (input_character(m_search, menu_event->unichar, uchar_is_printable)) - reset(reset_options::SELECT_FIRST); -} - //------------------------------------------------- // load custom filters info from file diff --git a/src/frontend/mame/ui/selsoft.h b/src/frontend/mame/ui/selsoft.h index bcde4479f80..0982580a5f0 100644 --- a/src/frontend/mame/ui/selsoft.h +++ b/src/frontend/mame/ui/selsoft.h @@ -62,7 +62,6 @@ private: // handlers void inkey_select(const event *menu_event); - void inkey_special(const event *menu_event); virtual void general_info(const game_driver *driver, std::string &buffer) override {} }; diff --git a/src/frontend/mame/ui/ui.cpp b/src/frontend/mame/ui/ui.cpp index 04a03f7fc44..a7434c6df54 100644 --- a/src/frontend/mame/ui/ui.cpp +++ b/src/frontend/mame/ui/ui.cpp @@ -821,7 +821,7 @@ void mame_ui_manager::process_natural_keyboard() while (machine().ui_input().pop_event(&event)) { // if this was a UI_EVENT_CHAR event, post it - if (event.event_type == UI_EVENT_CHAR) + if (event.event_type == ui_event::IME_CHAR) machine().ioport().natkeyboard().post(event.ch); } diff --git a/src/osd/modules/debugger/debugimgui.cpp b/src/osd/modules/debugger/debugimgui.cpp index 05f56521b18..293ac0229df 100644 --- a/src/osd/modules/debugger/debugimgui.cpp +++ b/src/osd/modules/debugger/debugimgui.cpp @@ -358,7 +358,7 @@ void debug_imgui::handle_keys() { switch (event.event_type) { - case UI_EVENT_CHAR: + case ui_event::IME_CHAR: m_key_char = event.ch; if(focus_view != nullptr) focus_view->view->process_char(m_key_char); diff --git a/src/osd/modules/input/input_uwp.cpp b/src/osd/modules/input/input_uwp.cpp index 2130d000fea..6b3b8675cff 100644 --- a/src/osd/modules/input/input_uwp.cpp +++ b/src/osd/modules/input/input_uwp.cpp @@ -492,7 +492,7 @@ internal: { ui_event uiev; memset(&uiev, 0, sizeof(uiev)); - uiev.event_type = UI_EVENT_CHAR; + uiev.event_type = ui_event::IME_CHAR; this->Machine.ui_input().push_event(uiev); } } |