diff --git a/src/input.cpp b/src/input.cpp index 5c78f4c..e165506 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -13,7 +13,7 @@ Input::Input(sf::Window *w) : m_window(w), m_closeRequested(false), - m_imgui_requested_focus(false), + m_imgui_enabled(true), m_mouseGrabbed(false), m_mouseWasGrabbed(false) { @@ -53,8 +53,7 @@ void Input::setKeysMap(IKeysMap km){ void Input::updateEvents(){ sf::Event event; ImGuiIO& io = ImGui::GetIO(); - KeyBindings kb; - char c; + KeyBindings kb; /* reset variables */ m_closeRequested = false; @@ -72,11 +71,10 @@ void Input::updateEvents(){ m_actions.clear(); Action action; - bool focus_on_imgui = false; - if(m_imgui_requested_focus) - focus_on_imgui = ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow); - if(focus_on_imgui) - std::cout << "focused" << std::endl; + + bool imguiEnabled = !m_mouseGrabbed && m_imgui_enabled; + bool keyboardEnabled = !(imguiEnabled && io.WantCaptureKeyboard); + bool mouseEnabled = !(imguiEnabled && io.WantCaptureMouse); /* event-parsing loop */ while(m_window->pollEvent(event)) @@ -96,76 +94,74 @@ void Input::updateEvents(){ m_mouseGrabbed = m_mouseWasGrabbed; break; case sf::Event::TextEntered: - if (focus_on_imgui) + if(imguiEnabled) io.AddInputCharacter(static_cast(event.text.unicode)); - else + if(keyboardEnabled) sf::Utf32::encodeAnsi(event.text.unicode,std::back_inserter(m_buffer)); break; case sf::Event::KeyPressed: - if(focus_on_imgui) + if(imguiEnabled) { io.KeysDown[event.key.code] = true; io.KeyCtrl = event.key.control; io.KeyShift = event.key.shift; io.KeyAlt = event.key.alt; } - else + if(keyboardEnabled) { action = kb.getPressedAction(input::KEYBOARD,event.key.code); if(!action.isNull()) m_actions.push_back(action); - m_heldKeys.push_back(event.key.code); } + m_heldKeys.push_back(event.key.code); break; case sf::Event::KeyReleased: - if (focus_on_imgui) + if(imguiEnabled) { io.KeysDown[event.key.code] = false; io.KeyCtrl = event.key.control; io.KeyShift = event.key.shift; io.KeyAlt = event.key.alt; } - else + if(keyboardEnabled) { action = kb.getReleasedAction(input::KEYBOARD,event.key.code); if(!action.isNull()) m_actions.push_back(action); - releaseHeldKeys(event.key.code); } + releaseHeldKeys(event.key.code); break; case sf::Event::MouseWheelScrolled: - if (!focus_on_imgui) + if(imguiEnabled) + io.MouseWheel += event.mouseWheelScroll.delta; + if(mouseEnabled) { if (event.mouseWheelScroll.wheel == sf::Mouse::VerticalWheel) m_delta_vertical_scroll = event.mouseWheelScroll.delta; } - else - io.MouseWheel += event.mouseWheelScroll.delta; break; case sf::Event::MouseButtonPressed: - if (!focus_on_imgui) + if(mouseEnabled) { action = kb.getPressedAction(input::MOUSE,event.mouseButton.button); if(!action.isNull()) m_actions.push_back(action); - m_heldMouseButtons.push_back(event.mouseButton.button); } + m_heldMouseButtons.push_back(event.mouseButton.button); break; case sf::Event::MouseButtonReleased: - if(!focus_on_imgui) + if(mouseEnabled) { action = kb.getReleasedAction(input::MOUSE,event.mouseButton.button); if(!action.isNull()) m_actions.push_back(action); - releaseHeldMouseButton(event.mouseButton.button); } + releaseHeldMouseButton(event.mouseButton.button); break; case sf::Event::MouseMoved: - m_mouse_position = sf::Mouse::getPosition(*m_window); - if (focus_on_imgui) - { + if(imguiEnabled) io.MousePos = ImVec2(m_mouse_position.x, m_mouse_position.y); - } + m_mouse_position = sf::Mouse::getPosition(*m_window); break; case sf::Event::MouseEntered: // action MouseEntered @@ -203,16 +199,24 @@ void Input::updateEvents(){ if(m_mouseGrabbed) sf::Mouse::setPosition(m_last_mouse_position, *m_window); - for (auto key: m_heldKeys) - m_actions.push_back(kb.getHoldAction(input::KEYBOARD,key)); + if(keyboardEnabled) + { + for (auto key: m_heldKeys) + m_actions.push_back(kb.getHoldAction(input::KEYBOARD,key)); + } for (int i = 0; i < 3; i++) io.MouseDown[i] = false; - for (int button: m_heldMouseButtons) + if(imguiEnabled) { - m_actions.push_back(kb.getHoldAction(input::MOUSE, button)); - io.MouseDown[button] = true; + for (int button: m_heldMouseButtons) + io.MouseDown[button] = true; + } + if(mouseEnabled) + { + for (int button: m_heldMouseButtons) + m_actions.push_back(kb.getHoldAction(input::MOUSE, button)); } for (auto heldJoystickButton : m_heldJoystickButtons) @@ -259,12 +263,12 @@ bool Input::isResized() const return m_hasBeenResized; } -void Input::ImguiRequestFocus(){ - m_imgui_requested_focus = true; +void Input::enableImgui(){ + m_imgui_enabled = true; } -void Input::ImguiReleaseFocus(){ - m_imgui_requested_focus = false; +void Input::disableImgui(){ + m_imgui_enabled = false; } /* keyboard-related functions */ diff --git a/src/input.h b/src/input.h index be6e1eb..8f80724 100644 --- a/src/input.h +++ b/src/input.h @@ -18,7 +18,7 @@ private: sf::Window* m_window; bool m_closeRequested; bool m_hasBeenResized; - bool m_imgui_requested_focus; + bool m_imgui_enabled; /* general action-mapping variables */ IKeysMap m_keysmap; @@ -70,8 +70,8 @@ public: /* window-related function */ bool isCloseRequested() const; bool isResized() const; - void ImguiRequestFocus(); - void ImguiReleaseFocus(); + void enableImgui(); + void disableImgui(); /* keyboard-related functions */ bool isKeyPressed(int key) const;