mirror of
https://github.com/dhewm/dhewm3.git
synced 2024-12-11 21:40:49 +00:00
4bdee4f638
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.
129 lines
3.4 KiB
C++
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_ */
|