From fde24556042b76863bdec34dcc213cb7298f68f9 Mon Sep 17 00:00:00 2001 From: crupest Date: Wed, 28 Oct 2020 16:17:20 +0800 Subject: ... --- src/ui/ShortcutHub.cpp | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) (limited to 'src/ui/ShortcutHub.cpp') diff --git a/src/ui/ShortcutHub.cpp b/src/ui/ShortcutHub.cpp index e5847f8c..145cfa87 100644 --- a/src/ui/ShortcutHub.cpp +++ b/src/ui/ShortcutHub.cpp @@ -1,5 +1,11 @@ #include "cru/ui/ShortcutHub.hpp" + +#include "cru/common/Logger.hpp" +#include "cru/ui/Control.hpp" +#include "cru/ui/DebugFlags.hpp" + #include +#include #include #include @@ -55,4 +61,60 @@ const std::vector& ShortcutHub::GetShortcutByKeyBind( if (result != map_.cend()) return result->second; return empty_list_; } + +void ShortcutHub::Install(Control* control) { + if (!event_guard_.IsEmpty()) { + log::Error(u"Shortcut hub is already installed. Failed to install."); + return; + } + + event_guard_ += control->KeyDownEvent()->Bubble()->AddHandler( + std::bind(&ShortcutHub::OnKeyDown, this, std::placeholders::_1)); +} + +void ShortcutHub::Uninstall() { + if (event_guard_.IsEmpty()) { + log::Warn(u"Shortcut hub is not installed. Failed to uninstall."); + return; + } + + event_guard_.Clear(); +} + +void ShortcutHub::OnKeyDown(event::KeyEventArgs& event) { + ShortcutKeyBind key_bind(event.GetKeyCode(), event.GetKeyModifier()); + const auto& shortcut_list = this->GetShortcutByKeyBind(key_bind); + + if constexpr (debug_flags::shortcut) { + if (shortcut_list.empty()) { + log::Debug(u"No shortcut for key bind {}.", key_bind.ToString()); + } + log::Debug(u"Begin to handle shortcut for key bind {}.", + key_bind.ToString()); + } + + for (const auto& shortcut : shortcut_list) { + auto is_handled = shortcut.handler(); + if (is_handled) { + if constexpr (debug_flags::shortcut) { + log::Debug(u"Handle {} handled it.", shortcut.name); + } + + event.SetHandled(); + + break; + } else { + if constexpr (debug_flags::shortcut) { + log::Debug(u"Handle {} disdn't handle it.", shortcut.name); + } + } + } + + if constexpr (debug_flags::shortcut) { + if (!shortcut_list.empty()) { + log::Debug(u"End handling shortcut for key bind {}.", + key_bind.ToString()); + } + } +} } // namespace cru::ui -- cgit v1.2.3