Imgui focus grabbing is now working

This commit is contained in:
Anselme 2018-05-12 13:39:11 +02:00
parent 12df6e84f9
commit 4ea0189a36
2 changed files with 43 additions and 39 deletions

View File

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

View File

@ -18,7 +18,7 @@ private:
sf::Window* m_window; sf::Window* m_window;
bool m_closeRequested; bool m_closeRequested;
bool m_hasBeenResized; bool m_hasBeenResized;
bool m_imgui_requested_focus; bool m_imgui_enabled;
/* general action-mapping variables */ /* general action-mapping variables */
IKeysMap m_keysmap; IKeysMap m_keysmap;
@ -70,8 +70,8 @@ public:
/* window-related function */ /* window-related function */
bool isCloseRequested() const; bool isCloseRequested() const;
bool isResized() const; bool isResized() const;
void ImguiRequestFocus(); void enableImgui();
void ImguiReleaseFocus(); void disableImgui();
/* keyboard-related functions */ /* keyboard-related functions */
bool isKeyPressed(int key) const; bool isKeyPressed(int key) const;