dhewm3/neo/sys/sys_imgui.h
Daniel Gibson 4bdee4f638 Dhewm3SettingsMenu: Improve cursor handling and opening menu ingame
Pause the game (with g_stopTime) when the settings menu is opened
while ingame, unpause it when it's closed.
If the menu is open while ingame and an ImGui window has focus,
the mouse cursor is shown. If the player clicks outside an ImGui window,
it gets unfocused and the cursor is hidden and the player can look
around. Pressing F10 (or whatever key is bound to "dhewm3Settings")
will give focus back to an open ImGui window, pressing it again then
will close the settings window, pressing it once again afterwards will
open the settings window again.

handleMouseGrab() (in sys/events.cpp) now checks if sys_imgui thinks
that a cursor should be shown (via D3::ImGuiHooks::ShouldShowCursor())
and if so, shows it and ungrabs the mouse. This, together with
D3::ImGuiHooks::NewFrame() checking ShouldShowCursor() to (unset)
ImGuiConfigFlags_NoMouseCursorChange, should prevent flickering cursor
problems that sometimes occurred when ImGui's SDL2 backend and dhewm3
disagreed on whether the cursor should be visible.
2024-05-28 04:49:24 +02:00

129 lines
3.4 KiB
C++

#ifndef NEO_SYS_SYS_IMGUI_H_
#define NEO_SYS_SYS_IMGUI_H_
#include "../libs/imgui/imgui.h"
namespace D3 {
namespace ImGuiHooks {
enum D3ImGuiWindow {
D3_ImGuiWin_None = 0,
D3_ImGuiWin_Settings = 1, // advanced dhewm3 settings menu
D3_ImGuiWin_Demo = 2, // ImGui demo window
// next should be 4, then 8, etc so a bitmask can be used
};
#ifndef IMGUI_DISABLE
extern ImGuiContext* imguiCtx; // this is only here so IsImguiEnabled() can use it inline
inline bool IsImguiEnabled()
{
return imguiCtx != NULL;
}
// using void* instead of SDL_Window and SDL_GLContext to avoid dragging SDL headers into sys_imgui.h
extern bool Init(void* sdlWindow, void* sdlGlContext);
extern void Shutdown();
extern void OpenWindow( D3ImGuiWindow win );
extern void CloseWindow( D3ImGuiWindow win );
// enum D3ImGuiWindow values of all currently open imgui windows or-ed together
// (0 if none are open)
extern int GetOpenWindowsMask();
// called with every SDL event by Sys_GetEvent()
// returns true if ImGui has handled the event (so it shouldn't be handled by D3)
extern bool ProcessEvent(const void* sdlEvent);
// for binding keys from an ImGui-based menu: send input events to dhewm3
// even if ImGui window has focus
extern void SetKeyBindMode( bool enable );
// returns true if the system cursor should be shown because an ImGui menu is active
extern bool ShouldShowCursor();
// NewFrame() is called once per D3 frame, after all events have been gotten
// => ProcessEvent() has already been called (probably multiple times)
extern void NewFrame();
// called at the end of the D3 frame, when all other D3 rendering is done
// renders ImGui menus then
extern void EndFrame();
extern float GetScale();
extern void SetScale( float scale );
// show a red overlay-window at the center of the screen that contains
// a warning symbol (triangle with !) and the given text
// disappears after a few seconds or when a key is pressed or the mouse is moved
extern void ShowWarningOverlay( const char* text );
enum Style {
Dhewm3,
ImGui_Default,
User
};
// set the overall style for ImGui: Both shape (sizes, roundings, etc) and colors
extern void SetImGuiStyle( Style style );
// set the default dhewm3 imgui style colors
extern void SetDhewm3StyleColors( ImGuiStyle* dst = nullptr );
extern void SetUserStyleColors();
// write current style settings (incl. colors) as userStyle
extern bool WriteUserStyle();
// copy current style to clipboard
extern void CopyCurrentStyle( bool onlyChanges );
#else // IMGUI_DISABLE - just stub out everything
inline bool IsImguiEnabled()
{
return false;
}
// using void* instead of SDL_Window and SDL_GLContext to avoid dragging SDL headers into sys_imgui.h
inline bool Init(void* sdlWindow, void* sdlGlContext)
{
return false;
}
inline void Shutdown() {}
inline bool ProcessEvent(const void* sdlEvent) { return false; }
inline void SetKeyBindMode( bool enable ) {}
inline bool ShouldShowCursor() { return false; }
inline void NewFrame() {}
inline void EndFrame() {}
inline void OpenWindow( D3ImGuiWindow win ) {}
inline void CloseWindow( D3ImGuiWindow win ) {}
inline int GetOpenWindowsMask() { return 0; }
inline float GetScale() { return 1.0f; }
inline void SetScale( float scale ) {}
inline void ShowWarningOverlay( const char* text ) {}
inline bool WriteUserStyle() { return false; }
#endif
}} //namespace D3::ImGuiHooks
#endif /* NEO_SYS_SYS_IMGUI_H_ */