From e6e36a6b7ce9605292e43dc86700223d67dcc935 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20B=C3=A1lint=20Misius?= Date: Tue, 6 Feb 2024 14:56:40 +0100 Subject: [PATCH] Fix OnMouseEnter/Leave inside Panels Also remove OnMouseMovedInside and the dx and dy parameters of OnMouseMoved because nothing used these for anything. --- src/gui/game/GameView.cpp | 11 +++++-- src/gui/interface/Component.cpp | 6 +--- src/gui/interface/Component.h | 15 ++------- src/gui/interface/DirectionSelector.cpp | 2 +- src/gui/interface/DirectionSelector.h | 2 +- src/gui/interface/Label.cpp | 2 +- src/gui/interface/Label.h | 2 +- src/gui/interface/Panel.cpp | 44 +++++++++---------------- src/gui/interface/Panel.h | 11 +++---- src/gui/interface/SaveButton.cpp | 19 ++++++----- src/gui/interface/SaveButton.h | 2 +- src/gui/interface/ScrollPanel.cpp | 19 +++++++++-- src/gui/interface/ScrollPanel.h | 2 +- src/gui/interface/Slider.cpp | 2 +- src/gui/interface/Slider.h | 2 +- src/gui/interface/Textbox.cpp | 4 +-- src/gui/interface/Textbox.h | 2 +- src/gui/interface/Window.cpp | 20 +++++------ 18 files changed, 78 insertions(+), 89 deletions(-) diff --git a/src/gui/game/GameView.cpp b/src/gui/game/GameView.cpp index e73caacdd..9da595661 100644 --- a/src/gui/game/GameView.cpp +++ b/src/gui/game/GameView.cpp @@ -1055,10 +1055,17 @@ void GameView::updateToolButtonScroll() { for (auto *button : toolButtons) { - if (button->Position.X < x && button->Position.X + button->Size.X > x) + auto inside = button->Position.X < x && button->Position.X + button->Size.X > x; + if (inside && !button->MouseInside) + { + button->MouseInside = true; button->OnMouseEnter(x, y); - else + } + if (!inside && button->MouseInside) + { + button->MouseInside = false; button->OnMouseLeave(x, y); + } } } } diff --git a/src/gui/interface/Component.cpp b/src/gui/interface/Component.cpp index 6ec1ac76d..33cb2354f 100644 --- a/src/gui/interface/Component.cpp +++ b/src/gui/interface/Component.cpp @@ -189,11 +189,7 @@ void Component::OnMouseHover(int localx, int localy) { } -void Component::OnMouseMoved(int localx, int localy, int dx, int dy) -{ -} - -void Component::OnMouseMovedInside(int localx, int localy, int dx, int dy) +void Component::OnMouseMoved(int localx, int localy) { } diff --git a/src/gui/interface/Component.h b/src/gui/interface/Component.h index 7fc8f0612..0b6ff2a6e 100644 --- a/src/gui/interface/Component.h +++ b/src/gui/interface/Component.h @@ -43,6 +43,7 @@ namespace ui bool Enabled; bool Visible; bool DoesTextInput; + bool MouseInside; bool MouseDownInside; ui::Appearance Appearance; @@ -96,20 +97,8 @@ namespace ui // Params: // localx: Local mouse X position. // localy: Local mouse Y position. - // dx: Mouse X delta. - // dy: Mouse Y delta. /// - virtual void OnMouseMoved(int localx, int localy, int dx, int dy); - - /// - // Called: When the mouse moves. - // Params: - // localx: Local mouse X position. - // localy: Local mouse Y position. - // dx: Mouse X delta. - // dy: Mouse Y delta. - /// - virtual void OnMouseMovedInside(int localx, int localy, int dx, int dy); + virtual void OnMouseMoved(int localx, int localy); /// // Called: When the mouse moves on top of the item. diff --git a/src/gui/interface/DirectionSelector.cpp b/src/gui/interface/DirectionSelector.cpp index 1953f69ef..7413ce892 100644 --- a/src/gui/interface/DirectionSelector.cpp +++ b/src/gui/interface/DirectionSelector.cpp @@ -133,7 +133,7 @@ void DirectionSelector::Draw(const ui::Point& screenPos) g->BlendEllipse(center + value.offset, { handleRadius, handleRadius }, borderColor); } -void DirectionSelector::OnMouseMoved(int x, int y, int dx, int dy) +void DirectionSelector::OnMouseMoved(int x, int y) { if (mouseDown) { diff --git a/src/gui/interface/DirectionSelector.h b/src/gui/interface/DirectionSelector.h index 661e55b26..1298c33a5 100644 --- a/src/gui/interface/DirectionSelector.h +++ b/src/gui/interface/DirectionSelector.h @@ -78,7 +78,7 @@ public: void SetValues(float x, float y); void Draw(const ui::Point& screenPos) override; - void OnMouseMoved(int x, int y, int dx, int dy) override; + void OnMouseMoved(int x, int y) override; void OnMouseDown(int x, int y, unsigned int button) override; void OnMouseUp(int x, int y, unsigned button) override; inline void OnKeyPress(int key, int scan, bool repeat, bool shift, bool ctrl, bool alt) override { altDown = alt; } diff --git a/src/gui/interface/Label.cpp b/src/gui/interface/Label.cpp index 0f232bd72..de8eb4e36 100644 --- a/src/gui/interface/Label.cpp +++ b/src/gui/interface/Label.cpp @@ -146,7 +146,7 @@ void Label::OnKeyPress(int key, int scan, bool repeat, bool shift, bool ctrl, bo } } -void Label::OnMouseMoved(int localx, int localy, int dx, int dy) +void Label::OnMouseMoved(int localx, int localy) { if (selecting) { diff --git a/src/gui/interface/Label.h b/src/gui/interface/Label.h index 6552ea8c9..1227a7b09 100644 --- a/src/gui/interface/Label.h +++ b/src/gui/interface/Label.h @@ -60,7 +60,7 @@ namespace ui void OnContextMenuAction(int item) override; virtual void OnMouseDown(int x, int y, unsigned button) override; void OnMouseUp(int x, int y, unsigned button) override; - void OnMouseMoved(int localx, int localy, int dx, int dy) override; + void OnMouseMoved(int localx, int localy) override; void OnKeyPress(int key, int scan, bool repeat, bool shift, bool ctrl, bool alt) override; void Draw(const Point& screenPos) override; void Tick(float dt) override; diff --git a/src/gui/interface/Panel.cpp b/src/gui/interface/Panel.cpp index 4f38a3bc5..3aa28451d 100644 --- a/src/gui/interface/Panel.cpp +++ b/src/gui/interface/Panel.cpp @@ -10,8 +10,7 @@ using namespace ui; Panel::Panel(Point position, Point size): Component(position, size), InnerSize(size), - ViewportPosition(0, 0), - mouseInside(false) + ViewportPosition(0, 0) { } @@ -27,6 +26,7 @@ void Panel::AddChild(Component* c) { c->SetParent(this); c->SetParentWindow(this->GetParentWindow()); + c->MouseInside = false; c->MouseDownInside = false; } @@ -165,25 +165,26 @@ void Panel::OnMouseHover(int localx, int localy) XOnMouseHover(localx, localy); } -void Panel::OnMouseMoved(int localx, int localy, int dx, int dy) +void Panel::OnMouseMoved(int localx, int localy) { - XOnMouseMoved(localx, localy, dx, dy); + PropagateMouseMove(); + XOnMouseMoved(localx, localy); for (size_t i = 0; i < children.size(); ++i) { if(children[i]->Enabled) - children[i]->OnMouseMoved(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y, dx, dy); + children[i]->OnMouseMoved(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y); } } -void Panel::OnMouseMovedInside(int localx, int localy, int dx, int dy) +void Panel::PropagateMouseMove() { - mouseInside = true; + auto localx = ui::Engine::Ref().GetMouseX() - GetScreenPos().X; + auto localy = ui::Engine::Ref().GetMouseY() - GetScreenPos().Y; for (size_t i = 0; i < children.size(); ++i) { if (children[i]->Enabled) { - Point local (localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y) - , prevlocal (local.X - dx, local.Y - dy); + Point local (localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y); // mouse currently inside? if( local.X >= 0 && @@ -191,14 +192,12 @@ void Panel::OnMouseMovedInside(int localx, int localy, int dx, int dy) local.X < children[i]->Size.X && local.Y < children[i]->Size.Y ) { - children[i]->OnMouseMovedInside(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y, dx, dy); + children[i]->OnMouseMoved(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y); // was the mouse outside? - if(!(prevlocal.X >= 0 && - prevlocal.Y >= 0 && - prevlocal.X < children[i]->Size.X && - prevlocal.Y < children[i]->Size.Y ) ) + if (!children[i]->MouseInside) { + children[i]->MouseInside = true; children[i]->OnMouseEnter(local.X, local.Y); } } @@ -206,31 +205,24 @@ void Panel::OnMouseMovedInside(int localx, int localy, int dx, int dy) else { // was the mouse inside? - if( prevlocal.X >= 0 && - prevlocal.Y >= 0 && - prevlocal.X < children[i]->Size.X && - prevlocal.Y < children[i]->Size.Y ) + if (children[i]->MouseInside) { + children[i]->MouseInside = false; children[i]->OnMouseLeave(local.X, local.Y); } } } } - - // always allow hover on parent (?) - XOnMouseMovedInside(localx, localy, dx, dy); } void Panel::OnMouseEnter(int localx, int localy) { - mouseInside = true; XOnMouseEnter(localx, localy); } void Panel::OnMouseLeave(int localx, int localy) { - mouseInside = false; XOnMouseLeave(localx, localy); } @@ -332,11 +324,7 @@ void Panel::XOnMouseHover(int localx, int localy) { } -void Panel::XOnMouseMoved(int localx, int localy, int dx, int dy) -{ -} - -void Panel::XOnMouseMovedInside(int localx, int localy, int dx, int dy) +void Panel::XOnMouseMoved(int localx, int localy) { } diff --git a/src/gui/interface/Panel.h b/src/gui/interface/Panel.h index 50fb984d7..7f7f1a1ae 100644 --- a/src/gui/interface/Panel.h +++ b/src/gui/interface/Panel.h @@ -51,8 +51,7 @@ namespace ui void Draw(const Point& screenPos) override; void OnMouseHover(int localx, int localy) override; - void OnMouseMoved(int localx, int localy, int dx, int dy) override; - void OnMouseMovedInside(int localx, int localy, int dx, int dy) override; + void OnMouseMoved(int localx, int localy) override; void OnMouseEnter(int localx, int localy) override; void OnMouseLeave(int localx, int localy) override; void OnMouseDown(int x, int y, unsigned button) override; @@ -66,7 +65,6 @@ namespace ui protected: // child components std::vector children; - bool mouseInside; // Overridable. Called by XComponent::Tick() virtual void XTick(float dt); @@ -79,10 +77,7 @@ namespace ui virtual void XOnMouseHover(int localx, int localy); // Overridable. Called by XComponent::OnMouseMoved() - virtual void XOnMouseMoved(int localx, int localy, int dx, int dy); - - // Overridable. Called by XComponent::OnMouseMovedInside() - virtual void XOnMouseMovedInside(int localx, int localy, int dx, int dy); + virtual void XOnMouseMoved(int localx, int localy); // Overridable. Called by XComponent::OnMouseEnter() virtual void XOnMouseEnter(int localx, int localy); @@ -110,6 +105,8 @@ namespace ui // Overridable. Called by XComponent::OnKeyRelease() virtual void XOnKeyRelease(int key, int scan, bool repeat, bool shift, bool ctrl, bool alt); + + void PropagateMouseMove(); }; } diff --git a/src/gui/interface/SaveButton.cpp b/src/gui/interface/SaveButton.cpp index ab0e9dd4a..5c4652ead 100644 --- a/src/gui/interface/SaveButton.cpp +++ b/src/gui/interface/SaveButton.cpp @@ -355,17 +355,18 @@ void SaveButton::OnMouseDown(int x, int y, unsigned int button) } } -void SaveButton::OnMouseMovedInside(int x, int y, int dx, int dy) +void SaveButton::OnMouseMoved(int x, int y) { - if(y > Size.Y-11) - isMouseInsideAuthor = true; - else - isMouseInsideAuthor = false; + isMouseInsideAuthor = false; + isMouseInsideHistory = false; + if (MouseInside) + { + if(y > Size.Y-11) + isMouseInsideAuthor = true; - if(showVotes && y > Size.Y-29 && y < Size.Y - 18 && x > 0 && x < 9) - isMouseInsideHistory = true; - else - isMouseInsideHistory = false; + if(showVotes && y > Size.Y-29 && y < Size.Y - 18 && x > 0 && x < 9) + isMouseInsideHistory = true; + } } void SaveButton::OnMouseEnter(int x, int y) diff --git a/src/gui/interface/SaveButton.h b/src/gui/interface/SaveButton.h index b397dbc44..2f973fb3e 100644 --- a/src/gui/interface/SaveButton.h +++ b/src/gui/interface/SaveButton.h @@ -53,7 +53,7 @@ public: void OnMouseEnter(int x, int y) override; void OnMouseLeave(int x, int y) override; - void OnMouseMovedInside(int x, int y, int dx, int dy) override; + void OnMouseMoved(int x, int y) override; void AddContextMenu(int menuType); void OnContextMenuAction(int item) override; diff --git a/src/gui/interface/ScrollPanel.cpp b/src/gui/interface/ScrollPanel.cpp index 9ad0c728b..9eeb8e704 100644 --- a/src/gui/interface/ScrollPanel.cpp +++ b/src/gui/interface/ScrollPanel.cpp @@ -108,10 +108,11 @@ void ScrollPanel::XOnMouseUp(int x, int y, unsigned int button) scrollbarClickLocation = 0; } -void ScrollPanel::XOnMouseMoved(int x, int y, int dx, int dy) +void ScrollPanel::XOnMouseMoved(int x, int y) { if(maxOffset.Y>0 && InnerSize.Y>0) { + auto oldViewportPositionY = ViewportPosition.Y; float scrollHeight = float(Size.Y)*(float(Size.Y)/float(InnerSize.Y)); float scrollPos = 0; if (-ViewportPosition.Y>0) @@ -155,11 +156,18 @@ void ScrollPanel::XOnMouseMoved(int x, int y, int dx, int dy) } else isMouseInsideScrollbar = false; + + if (oldViewportPositionY != ViewportPosition.Y) + { + PropagateMouseMove(); + } } } void ScrollPanel::XTick(float dt) { + auto oldViewportPositionY = ViewportPosition.Y; + if (panning) { auto scrollY = initialOffsetY + scrollbarInitialYClick - (Engine::Ref().GetMouseY() - GetScreenPos().Y); @@ -229,9 +237,9 @@ void ScrollPanel::XTick(float dt) } } - if (mouseInside && scrollBarWidth < 6) + if (MouseInside && scrollBarWidth < 6) scrollBarWidth++; - else if (!mouseInside && scrollBarWidth > 0 && !scrollbarSelected) + else if (!MouseInside && scrollBarWidth > 0 && !scrollbarSelected) scrollBarWidth--; if (isMouseInsideScrollbarArea && scrollbarClickLocation && !scrollbarSelected) @@ -251,4 +259,9 @@ void ScrollPanel::XTick(float dt) offsetY += scrollbarClickLocation*scrollHeight/10; ViewportPosition.Y -= int(scrollbarClickLocation*scrollHeight/10); } + + if (oldViewportPositionY != ViewportPosition.Y) + { + PropagateMouseMove(); + } } diff --git a/src/gui/interface/ScrollPanel.h b/src/gui/interface/ScrollPanel.h index eb41508ab..fdd6a1321 100644 --- a/src/gui/interface/ScrollPanel.h +++ b/src/gui/interface/ScrollPanel.h @@ -41,6 +41,6 @@ namespace ui void XOnMouseWheelInside(int localx, int localy, int d) override; void XOnMouseDown(int localx, int localy, unsigned int button) override; void XOnMouseUp(int x, int y, unsigned int button) override; - void XOnMouseMoved(int localx, int localy, int dx, int dy) override; + void XOnMouseMoved(int localx, int localy) override; }; } diff --git a/src/gui/interface/Slider.cpp b/src/gui/interface/Slider.cpp index e47a54dec..673e6b7eb 100644 --- a/src/gui/interface/Slider.cpp +++ b/src/gui/interface/Slider.cpp @@ -40,7 +40,7 @@ void Slider::updatePosition(int position) } } -void Slider::OnMouseMoved(int x, int y, int dx, int dy) +void Slider::OnMouseMoved(int x, int y) { if(isMouseDown) { diff --git a/src/gui/interface/Slider.h b/src/gui/interface/Slider.h index 0f674ec91..b1e48d0b7 100644 --- a/src/gui/interface/Slider.h +++ b/src/gui/interface/Slider.h @@ -24,7 +24,7 @@ public: Slider(Point position, Point size, int steps); virtual ~Slider() = default; - void OnMouseMoved(int x, int y, int dx, int dy) override; + void OnMouseMoved(int x, int y) override; void OnMouseDown(int x, int y, unsigned button) override; void OnMouseUp(int x, int y, unsigned button) override; void Draw(const Point& screenPos) override; diff --git a/src/gui/interface/Textbox.cpp b/src/gui/interface/Textbox.cpp index e5d45256f..a65c65eee 100644 --- a/src/gui/interface/Textbox.cpp +++ b/src/gui/interface/Textbox.cpp @@ -592,7 +592,7 @@ void Textbox::OnMouseUp(int x, int y, unsigned button) Label::OnMouseUp(x, y, button); } -void Textbox::OnMouseMoved(int localx, int localy, int dx, int dy) +void Textbox::OnMouseMoved(int localx, int localy) { if(mouseDown) { @@ -601,7 +601,7 @@ void Textbox::OnMouseMoved(int localx, int localy, int dx, int dy) cursor = index.raw_index; resetCursorPosition(); } - Label::OnMouseMoved(localx, localy, dx, dy); + Label::OnMouseMoved(localx, localy); } void Textbox::OnDefocus() diff --git a/src/gui/interface/Textbox.h b/src/gui/interface/Textbox.h index ac6f07640..079c09306 100644 --- a/src/gui/interface/Textbox.h +++ b/src/gui/interface/Textbox.h @@ -55,7 +55,7 @@ public: void OnContextMenuAction(int item) override; void OnMouseDown(int x, int y, unsigned button) override; void OnMouseUp(int x, int y, unsigned button) override; - void OnMouseMoved(int localx, int localy, int dx, int dy) override; + void OnMouseMoved(int localx, int localy) override; void OnKeyPress(int key, int scan, bool repeat, bool shift, bool ctrl, bool alt) override; void OnVKeyPress(int key, int scan, bool repeat, bool shift, bool ctrl, bool alt); void OnKeyRelease(int key, int scan, bool repeat, bool shift, bool ctrl, bool alt) override; diff --git a/src/gui/interface/Window.cpp b/src/gui/interface/Window.cpp index 713669472..cb8534986 100644 --- a/src/gui/interface/Window.cpp +++ b/src/gui/interface/Window.cpp @@ -43,12 +43,16 @@ void Window::AddComponent(Component* c) if (c->GetParentWindow() == NULL) { c->SetParentWindow(this); + c->MouseInside = false; c->MouseDownInside = false; Components.push_back(c); if (Engine::Ref().GetMouseX() > Position.X + c->Position.X && Engine::Ref().GetMouseX() < Position.X + c->Position.X + c->Size.X && Engine::Ref().GetMouseY() > Position.Y + c->Position.Y && Engine::Ref().GetMouseY() < Position.Y + c->Position.Y + c->Size.Y) + { + c->MouseInside = true; c->OnMouseEnter(Engine::Ref().GetMouseX() - (Position.X + c->Position.X), Engine::Ref().GetMouseY() - (Position.Y + c->Position.Y)); + } } else { @@ -486,21 +490,17 @@ void Window::DoMouseMove(int x_, int y_, int dx, int dy) Point local(x - Components[i]->Position.X, y - Components[i]->Position.Y); Point a(local.X - dx, local.Y - dy); - Components[i]->OnMouseMoved(local.X, local.Y, dx, dy); + Components[i]->OnMouseMoved(local.X, local.Y); if (local.X >= 0 && local.Y >= 0 && local.X < Components[i]->Size.X && local.Y < Components[i]->Size.Y && !halt) { - Components[i]->OnMouseMovedInside(local.X, local.Y, dx, dy); - // entering? - if (!(a.X >= 0 && - a.Y >= 0 && - a.X < Components[i]->Size.X && - a.Y < Components[i]->Size.Y )) + if (!Components[i]->MouseInside) { + Components[i]->MouseInside = true; Components[i]->OnMouseEnter(local.X, local.Y); } if (Components[i]->Enabled) @@ -509,11 +509,9 @@ void Window::DoMouseMove(int x_, int y_, int dx, int dy) else if (!halt) { // leaving? - if (a.X >= 0 && - a.Y >= 0 && - a.X < Components[i]->Size.X && - a.Y < Components[i]->Size.Y ) + if (Components[i]->MouseInside) { + Components[i]->MouseInside = false; Components[i]->OnMouseLeave(local.X, local.Y); }