mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-10-26 12:27:30 +00:00 
			
		
		
		
	Merge branch 'tseeker/20171127-feature-horiz-wheel' of https://github.com/tseeker/imgui into tseeker-tseeker/20171127-feature-horiz-wheel
# Conflicts: # examples/sdl_opengl2_example/imgui_impl_sdl_gl2.cpp # examples/sdl_opengl3_example/imgui_impl_sdl_gl3.cpp
This commit is contained in:
		| @@ -31,6 +31,7 @@ | |||||||
| static GLFWwindow*  g_Window = NULL; | static GLFWwindow*  g_Window = NULL; | ||||||
| static double       g_Time = 0.0f; | static double       g_Time = 0.0f; | ||||||
| static bool         g_MouseJustPressed[3] = { false, false, false }; | static bool         g_MouseJustPressed[3] = { false, false, false }; | ||||||
|  | static float        g_MouseHorizWheel = 0.0f; | ||||||
| static float        g_MouseWheel = 0.0f; | static float        g_MouseWheel = 0.0f; | ||||||
| static GLuint       g_FontTexture = 0; | static GLuint       g_FontTexture = 0; | ||||||
|  |  | ||||||
| @@ -134,9 +135,10 @@ void ImGui_ImplGlfwGL2_MouseButtonCallback(GLFWwindow*, int button, int action, | |||||||
|         g_MouseJustPressed[button] = true; |         g_MouseJustPressed[button] = true; | ||||||
| } | } | ||||||
|  |  | ||||||
| void ImGui_ImplGlfwGL2_ScrollCallback(GLFWwindow*, double /*xoffset*/, double yoffset) | void ImGui_ImplGlfwGL2_ScrollCallback(GLFWwindow*, double xoffset, double yoffset) | ||||||
| { | { | ||||||
|     g_MouseWheel += (float)yoffset; // Use fractional mouse wheel. |     g_MouseHorizWheel += (float)xoffset; // Use fractional mouse wheel. | ||||||
|  |     g_MouseWheel += (float)yoffset; | ||||||
| } | } | ||||||
|  |  | ||||||
| void ImGui_ImplGlfwGL2_KeyCallback(GLFWwindow*, int key, int, int action, int mods) | void ImGui_ImplGlfwGL2_KeyCallback(GLFWwindow*, int key, int, int action, int mods) | ||||||
| @@ -295,8 +297,9 @@ void ImGui_ImplGlfwGL2_NewFrame() | |||||||
|         g_MouseJustPressed[i] = false; |         g_MouseJustPressed[i] = false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     io.MouseHorizWheel = g_MouseHorizWheel; | ||||||
|     io.MouseWheel = g_MouseWheel; |     io.MouseWheel = g_MouseWheel; | ||||||
|     g_MouseWheel = 0.0f; |     g_MouseHorizWheel = g_MouseWheel = 0.0f; | ||||||
|  |  | ||||||
|     // Hide OS mouse cursor if ImGui is drawing it |     // Hide OS mouse cursor if ImGui is drawing it | ||||||
|     glfwSetInputMode(g_Window, GLFW_CURSOR, io.MouseDrawCursor ? GLFW_CURSOR_HIDDEN : GLFW_CURSOR_NORMAL); |     glfwSetInputMode(g_Window, GLFW_CURSOR, io.MouseDrawCursor ? GLFW_CURSOR_HIDDEN : GLFW_CURSOR_NORMAL); | ||||||
|   | |||||||
| @@ -25,6 +25,7 @@ | |||||||
| static GLFWwindow*  g_Window = NULL; | static GLFWwindow*  g_Window = NULL; | ||||||
| static double       g_Time = 0.0f; | static double       g_Time = 0.0f; | ||||||
| static bool         g_MouseJustPressed[3] = { false, false, false }; | static bool         g_MouseJustPressed[3] = { false, false, false }; | ||||||
|  | static float        g_MouseHorizWheel = 0.0f; | ||||||
| static float        g_MouseWheel = 0.0f; | static float        g_MouseWheel = 0.0f; | ||||||
| static GLuint       g_FontTexture = 0; | static GLuint       g_FontTexture = 0; | ||||||
| static int          g_ShaderHandle = 0, g_VertHandle = 0, g_FragHandle = 0; | static int          g_ShaderHandle = 0, g_VertHandle = 0, g_FragHandle = 0; | ||||||
| @@ -155,9 +156,10 @@ void ImGui_ImplGlfwGL3_MouseButtonCallback(GLFWwindow*, int button, int action, | |||||||
|         g_MouseJustPressed[button] = true; |         g_MouseJustPressed[button] = true; | ||||||
| } | } | ||||||
|  |  | ||||||
| void ImGui_ImplGlfwGL3_ScrollCallback(GLFWwindow*, double /*xoffset*/, double yoffset) | void ImGui_ImplGlfwGL3_ScrollCallback(GLFWwindow*, double xoffset, double yoffset) | ||||||
| { | { | ||||||
|     g_MouseWheel += (float)yoffset; // Use fractional mouse wheel. |     g_MouseHorizWheel += (float)xoffset; // Use fractional mouse wheel. | ||||||
|  |     g_MouseWheel += (float)yoffset; | ||||||
| } | } | ||||||
|  |  | ||||||
| void ImGui_ImplGlfwGL3_KeyCallback(GLFWwindow*, int key, int, int action, int mods) | void ImGui_ImplGlfwGL3_KeyCallback(GLFWwindow*, int key, int, int action, int mods) | ||||||
| @@ -407,8 +409,9 @@ void ImGui_ImplGlfwGL3_NewFrame() | |||||||
|         g_MouseJustPressed[i] = false; |         g_MouseJustPressed[i] = false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     io.MouseHorizWheel = g_MouseHorizWheel; | ||||||
|     io.MouseWheel = g_MouseWheel; |     io.MouseWheel = g_MouseWheel; | ||||||
|     g_MouseWheel = 0.0f; |     g_MouseHorizWheel = g_MouseWheel = 0.0f; | ||||||
|  |  | ||||||
|     // Hide OS mouse cursor if ImGui is drawing it |     // Hide OS mouse cursor if ImGui is drawing it | ||||||
|     glfwSetInputMode(g_Window, GLFW_CURSOR, io.MouseDrawCursor ? GLFW_CURSOR_HIDDEN : GLFW_CURSOR_NORMAL); |     glfwSetInputMode(g_Window, GLFW_CURSOR, io.MouseDrawCursor ? GLFW_CURSOR_HIDDEN : GLFW_CURSOR_NORMAL); | ||||||
|   | |||||||
| @@ -24,6 +24,7 @@ | |||||||
| // Data | // Data | ||||||
| static double       g_Time = 0.0f; | static double       g_Time = 0.0f; | ||||||
| static bool         g_MousePressed[3] = { false, false, false }; | static bool         g_MousePressed[3] = { false, false, false }; | ||||||
|  | static float        g_MouseHorizWheel = 0.0f; | ||||||
| static float        g_MouseWheel = 0.0f; | static float        g_MouseWheel = 0.0f; | ||||||
| static GLuint       g_FontTexture = 0; | static GLuint       g_FontTexture = 0; | ||||||
|  |  | ||||||
| @@ -132,6 +133,10 @@ bool ImGui_ImplSdlGL2_ProcessEvent(SDL_Event* event) | |||||||
|     { |     { | ||||||
|     case SDL_MOUSEWHEEL: |     case SDL_MOUSEWHEEL: | ||||||
|         { |         { | ||||||
|  |             if (event->wheel.x > 0) | ||||||
|  |                 g_MouseHorizWheel = 1; | ||||||
|  |             if (event->wheel.x < 0) | ||||||
|  |                 g_MouseHorizWheel = -1; | ||||||
|             if (event->wheel.y > 0) |             if (event->wheel.y > 0) | ||||||
|                 g_MouseWheel = 1; |                 g_MouseWheel = 1; | ||||||
|             if (event->wheel.y < 0) |             if (event->wheel.y < 0) | ||||||
| @@ -275,11 +280,12 @@ void ImGui_ImplSdlGL2_NewFrame(SDL_Window *window) | |||||||
|     Uint32 mouse_buttons = SDL_GetMouseState(&mx, &my); |     Uint32 mouse_buttons = SDL_GetMouseState(&mx, &my); | ||||||
|     io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); |     io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); | ||||||
|     io.MouseWheel = g_MouseWheel; |     io.MouseWheel = g_MouseWheel; | ||||||
|  |     io.MouseHorizWheel = g_MouseHorizWheel; | ||||||
|     io.MouseDown[0] = g_MousePressed[0] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_LEFT)) != 0;  // If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame. |     io.MouseDown[0] = g_MousePressed[0] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_LEFT)) != 0;  // If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame. | ||||||
|     io.MouseDown[1] = g_MousePressed[1] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_RIGHT)) != 0; |     io.MouseDown[1] = g_MousePressed[1] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_RIGHT)) != 0; | ||||||
|     io.MouseDown[2] = g_MousePressed[2] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_MIDDLE)) != 0; |     io.MouseDown[2] = g_MousePressed[2] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_MIDDLE)) != 0; | ||||||
|     g_MousePressed[0] = g_MousePressed[1] = g_MousePressed[2] = false; |     g_MousePressed[0] = g_MousePressed[1] = g_MousePressed[2] = false; | ||||||
|     g_MouseWheel = 0.0f; |     g_MouseWheel = g_MouseHorizWheel = 0.0f; | ||||||
|  |  | ||||||
|     // We need to use SDL_CaptureMouse() to easily retrieve mouse coordinates outside of the client area. This is only supported from SDL 2.0.4 (released Jan 2016) |     // We need to use SDL_CaptureMouse() to easily retrieve mouse coordinates outside of the client area. This is only supported from SDL 2.0.4 (released Jan 2016) | ||||||
| #if (SDL_MAJOR_VERSION >= 2) && (SDL_MINOR_VERSION >= 0) && (SDL_PATCHLEVEL >= 4)    | #if (SDL_MAJOR_VERSION >= 2) && (SDL_MINOR_VERSION >= 0) && (SDL_PATCHLEVEL >= 4)    | ||||||
|   | |||||||
| @@ -19,6 +19,7 @@ | |||||||
| // Data | // Data | ||||||
| static double       g_Time = 0.0f; | static double       g_Time = 0.0f; | ||||||
| static bool         g_MousePressed[3] = { false, false, false }; | static bool         g_MousePressed[3] = { false, false, false }; | ||||||
|  | static float        g_MouseHorizWheel = 0.0f; | ||||||
| static float        g_MouseWheel = 0.0f; | static float        g_MouseWheel = 0.0f; | ||||||
| static GLuint       g_FontTexture = 0; | static GLuint       g_FontTexture = 0; | ||||||
| static int          g_ShaderHandle = 0, g_VertHandle = 0, g_FragHandle = 0; | static int          g_ShaderHandle = 0, g_VertHandle = 0, g_FragHandle = 0; | ||||||
| @@ -154,6 +155,10 @@ bool ImGui_ImplSdlGL3_ProcessEvent(SDL_Event* event) | |||||||
|     { |     { | ||||||
|     case SDL_MOUSEWHEEL: |     case SDL_MOUSEWHEEL: | ||||||
|         { |         { | ||||||
|  |             if (event->wheel.x > 0) | ||||||
|  |                 g_MouseHorizWheel = 1; | ||||||
|  |             if (event->wheel.x < 0) | ||||||
|  |                 g_MouseHorizWheel = -1; | ||||||
|             if (event->wheel.y > 0) |             if (event->wheel.y > 0) | ||||||
|                 g_MouseWheel = 1; |                 g_MouseWheel = 1; | ||||||
|             if (event->wheel.y < 0) |             if (event->wheel.y < 0) | ||||||
| @@ -386,11 +391,12 @@ void ImGui_ImplSdlGL3_NewFrame(SDL_Window* window) | |||||||
|     Uint32 mouse_buttons = SDL_GetMouseState(&mx, &my); |     Uint32 mouse_buttons = SDL_GetMouseState(&mx, &my); | ||||||
|     io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); |     io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); | ||||||
|     io.MouseWheel = g_MouseWheel; |     io.MouseWheel = g_MouseWheel; | ||||||
|  |     io.MouseHorizWheel = g_MouseHorizWheel; | ||||||
|     io.MouseDown[0] = g_MousePressed[0] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_LEFT)) != 0;  // If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame. |     io.MouseDown[0] = g_MousePressed[0] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_LEFT)) != 0;  // If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame. | ||||||
|     io.MouseDown[1] = g_MousePressed[1] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_RIGHT)) != 0; |     io.MouseDown[1] = g_MousePressed[1] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_RIGHT)) != 0; | ||||||
|     io.MouseDown[2] = g_MousePressed[2] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_MIDDLE)) != 0; |     io.MouseDown[2] = g_MousePressed[2] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_MIDDLE)) != 0; | ||||||
|     g_MousePressed[0] = g_MousePressed[1] = g_MousePressed[2] = false; |     g_MousePressed[0] = g_MousePressed[1] = g_MousePressed[2] = false; | ||||||
|     g_MouseWheel = 0.0f; |     g_MouseHorizWheel = g_MouseWheel = 0.0f; | ||||||
|  |  | ||||||
|     // We need to use SDL_CaptureMouse() to easily retrieve mouse coordinates outside of the client area. This is only supported from SDL 2.0.4 (released Jan 2016) |     // We need to use SDL_CaptureMouse() to easily retrieve mouse coordinates outside of the client area. This is only supported from SDL 2.0.4 (released Jan 2016) | ||||||
| #if (SDL_MAJOR_VERSION >= 2) && (SDL_MINOR_VERSION >= 0) && (SDL_PATCHLEVEL >= 4)    | #if (SDL_MAJOR_VERSION >= 2) && (SDL_MINOR_VERSION >= 0) && (SDL_PATCHLEVEL >= 4)    | ||||||
|   | |||||||
							
								
								
									
										18
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -639,6 +639,7 @@ static bool             IsKeyPressedMap(ImGuiKey key, bool repeat = true); | |||||||
| static ImFont*          GetDefaultFont(); | static ImFont*          GetDefaultFont(); | ||||||
| static void             SetCurrentFont(ImFont* font); | static void             SetCurrentFont(ImFont* font); | ||||||
| static void             SetCurrentWindow(ImGuiWindow* window); | static void             SetCurrentWindow(ImGuiWindow* window); | ||||||
|  | static void             SetWindowScrollX(ImGuiWindow* window, float new_scroll_x); | ||||||
| static void             SetWindowScrollY(ImGuiWindow* window, float new_scroll_y); | static void             SetWindowScrollY(ImGuiWindow* window, float new_scroll_y); | ||||||
| static void             SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond); | static void             SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond); | ||||||
| static void             SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond); | static void             SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond); | ||||||
| @@ -2516,6 +2517,16 @@ void ImGui::NewFrame() | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     // Horizontal wheel scrolling; for consistency, only allowed if Ctrl is not pressed. | ||||||
|  |     if (g.HoveredWindow && g.IO.MouseHorizWheel != 0.0f && !g.HoveredWindow->Collapsed) | ||||||
|  |     { | ||||||
|  |         ImGuiWindow* window = g.HoveredWindow; | ||||||
|  |         if (!g.IO.KeyCtrl && !(window->Flags & ImGuiWindowFlags_NoScrollWithMouse)) | ||||||
|  |         { | ||||||
|  |             SetWindowScrollX(window, window->Scroll.x - g.IO.MouseHorizWheel * 10.f); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     // Pressing TAB activate widget focus |     // Pressing TAB activate widget focus | ||||||
|     if (g.ActiveId == 0 && g.NavWindow != NULL && g.NavWindow->Active && IsKeyPressedMap(ImGuiKey_Tab, false)) |     if (g.ActiveId == 0 && g.NavWindow != NULL && g.NavWindow->Active && IsKeyPressedMap(ImGuiKey_Tab, false)) | ||||||
|         g.NavWindow->FocusIdxTabRequestNext = 0; |         g.NavWindow->FocusIdxTabRequestNext = 0; | ||||||
| @@ -5609,6 +5620,13 @@ ImVec2 ImGui::GetWindowPos() | |||||||
|     return window->Pos; |     return window->Pos; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void SetWindowScrollX(ImGuiWindow* window, float new_scroll_x) | ||||||
|  | { | ||||||
|  |     window->DC.CursorMaxPos.x += window->Scroll.x; // SizeContents is generally computed based on CursorMaxPos which is affected by scroll position, so we need to apply our change to it. | ||||||
|  |     window->Scroll.x = new_scroll_x; | ||||||
|  |     window->DC.CursorMaxPos.x -= window->Scroll.x; | ||||||
|  | } | ||||||
|  |  | ||||||
| static void SetWindowScrollY(ImGuiWindow* window, float new_scroll_y) | static void SetWindowScrollY(ImGuiWindow* window, float new_scroll_y) | ||||||
| { | { | ||||||
|     window->DC.CursorMaxPos.y += window->Scroll.y; // SizeContents is generally computed based on CursorMaxPos which is affected by scroll position, so we need to apply our change to it. |     window->DC.CursorMaxPos.y += window->Scroll.y; // SizeContents is generally computed based on CursorMaxPos which is affected by scroll position, so we need to apply our change to it. | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -931,6 +931,7 @@ struct ImGuiIO | |||||||
|     ImVec2      MousePos;                   // Mouse position, in pixels. Set to ImVec2(-FLT_MAX,-FLT_MAX) if mouse is unavailable (on another screen, etc.) |     ImVec2      MousePos;                   // Mouse position, in pixels. Set to ImVec2(-FLT_MAX,-FLT_MAX) if mouse is unavailable (on another screen, etc.) | ||||||
|     bool        MouseDown[5];               // Mouse buttons: left, right, middle + extras. ImGui itself mostly only uses left button (BeginPopupContext** are using right button). Others buttons allows us to track if the mouse is being used by your application + available to user as a convenience via IsMouse** API. |     bool        MouseDown[5];               // Mouse buttons: left, right, middle + extras. ImGui itself mostly only uses left button (BeginPopupContext** are using right button). Others buttons allows us to track if the mouse is being used by your application + available to user as a convenience via IsMouse** API. | ||||||
|     float       MouseWheel;                 // Mouse wheel: 1 unit scrolls about 5 lines text. |     float       MouseWheel;                 // Mouse wheel: 1 unit scrolls about 5 lines text. | ||||||
|  |     float       MouseHorizWheel;            // Horizontal mouse wheel | ||||||
|     bool        MouseDrawCursor;            // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor). |     bool        MouseDrawCursor;            // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor). | ||||||
|     bool        KeyCtrl;                    // Keyboard modifier pressed: Control |     bool        KeyCtrl;                    // Keyboard modifier pressed: Control | ||||||
|     bool        KeyShift;                   // Keyboard modifier pressed: Shift |     bool        KeyShift;                   // Keyboard modifier pressed: Shift | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 omar
					omar