diff --git a/src/PowderToySDL.cpp b/src/PowderToySDL.cpp index 524c1ef41..49f279fe4 100644 --- a/src/PowderToySDL.cpp +++ b/src/PowderToySDL.cpp @@ -349,7 +349,7 @@ static void EventProcess(const SDL_Event &event) mousey = event.button.y; } mouseButton = event.button.button; - engine.onMouseClick(mousex, mousey, mouseButton); + engine.onMouseDown(mousex, mousey, mouseButton); mouseDown = true; if constexpr (!DEBUG) @@ -365,7 +365,7 @@ static void EventProcess(const SDL_Event &event) mousey = event.button.y; } mouseButton = event.button.button; - engine.onMouseUnclick(mousex, mousey, mouseButton); + engine.onMouseUp(mousex, mousey, mouseButton); mouseDown = false; if constexpr (!DEBUG) diff --git a/src/gui/game/GameView.cpp b/src/gui/game/GameView.cpp index 6f502e9bb..e73caacdd 100644 --- a/src/gui/game/GameView.cpp +++ b/src/gui/game/GameView.cpp @@ -87,7 +87,7 @@ public: } } } - void OnMouseUnclick(int x, int y, unsigned int button) override + void OnMouseClick(int x, int y, unsigned int button) override { if(isButtonDown) { @@ -96,7 +96,7 @@ public: else if(rightDown) DoRightAction(); } - ui::Button::OnMouseUnclick(x, y, button); + ui::Button::OnMouseClick(x, y, button); } void OnMouseHover(int x, int y) override @@ -120,15 +120,18 @@ public: toolTip = newToolTip1; toolTip2 = newToolTip2; } - void OnMouseClick(int x, int y, unsigned int button) override + void OnMouseDown(int x, int y, unsigned int button) override { - ui::Button::OnMouseClick(x, y, button); - rightDown = false; - leftDown = false; - if(x >= splitPosition) - rightDown = true; - else if(x < splitPosition) - leftDown = true; + ui::Button::OnMouseDown(x, y, button); + if (MouseDownInside) + { + rightDown = false; + leftDown = false; + if(x - Position.X >= splitPosition) + rightDown = true; + else if(x - Position.X < splitPosition) + leftDown = true; + } } void DoRightAction() { diff --git a/src/gui/game/ToolButton.cpp b/src/gui/game/ToolButton.cpp index 5fafc498a..d925bfec8 100644 --- a/src/gui/game/ToolButton.cpp +++ b/src/gui/game/ToolButton.cpp @@ -16,12 +16,15 @@ ToolButton::ToolButton(ui::Point position, ui::Point size, String text, ByteStri Component::TextPosition(buttonDisplayText); } -void ToolButton::OnMouseClick(int x, int y, unsigned int button) +void ToolButton::OnMouseDown(int x, int y, unsigned int button) { - isButtonDown = true; + if (MouseDownInside) + { + isButtonDown = true; + } } -void ToolButton::OnMouseUnclick(int x, int y, unsigned int button) +void ToolButton::OnMouseClick(int x, int y, unsigned int button) { if(isButtonDown) { diff --git a/src/gui/game/ToolButton.h b/src/gui/game/ToolButton.h index 18687a93e..01c632e33 100644 --- a/src/gui/game/ToolButton.h +++ b/src/gui/game/ToolButton.h @@ -9,7 +9,7 @@ class ToolButton: public ui::Button ByteString toolIdentifier; public: ToolButton(ui::Point position, ui::Point size, String text, ByteString toolIdentifier, String toolTip = String()); - void OnMouseUnclick(int x, int y, unsigned int button) override; + void OnMouseDown(int x, int y, unsigned int button) override; void OnMouseUp(int x, int y, unsigned int button) override; void OnMouseClick(int x, int y, unsigned int button) override; void Draw(const ui::Point& screenPos) override; diff --git a/src/gui/interface/AvatarButton.cpp b/src/gui/interface/AvatarButton.cpp index 1bef78953..c7bd20354 100644 --- a/src/gui/interface/AvatarButton.cpp +++ b/src/gui/interface/AvatarButton.cpp @@ -51,7 +51,7 @@ void AvatarButton::Draw(const Point& screenPos) } } -void AvatarButton::OnMouseUnclick(int x, int y, unsigned int button) +void AvatarButton::OnMouseClick(int x, int y, unsigned int button) { if(button != 1) { @@ -70,16 +70,19 @@ void AvatarButton::OnContextMenuAction(int item) //Do nothing } -void AvatarButton::OnMouseClick(int x, int y, unsigned int button) +void AvatarButton::OnMouseDown(int x, int y, unsigned int button) { - if(button == SDL_BUTTON_RIGHT) + if (MouseDownInside) { - if(menu) - menu->Show(GetScreenPos() + ui::Point(x, y)); - } - else - { - isButtonDown = true; + if(button == SDL_BUTTON_RIGHT) + { + if(menu) + menu->Show(GetContainerPos() + ui::Point(x, y)); + } + else + { + isButtonDown = true; + } } } diff --git a/src/gui/interface/AvatarButton.h b/src/gui/interface/AvatarButton.h index 4558354a7..3f1734f1c 100644 --- a/src/gui/interface/AvatarButton.h +++ b/src/gui/interface/AvatarButton.h @@ -30,7 +30,7 @@ public: virtual ~AvatarButton() = default; void OnMouseClick(int x, int y, unsigned int button) override; - void OnMouseUnclick(int x, int y, unsigned int button) override; + void OnMouseDown(int x, int y, unsigned int button) override; void OnMouseEnter(int x, int y) override; void OnMouseLeave(int x, int y) override; diff --git a/src/gui/interface/Button.cpp b/src/gui/interface/Button.cpp index 81155cc36..8319ce2a7 100644 --- a/src/gui/interface/Button.cpp +++ b/src/gui/interface/Button.cpp @@ -86,7 +86,7 @@ void Button::Draw(const Point& screenPos) if (Enabled) { - if (isButtonDown || (isTogglable && toggle)) + if ((isButtonDown && MouseDownInside) || (isTogglable && toggle)) { textColour = Appearance.TextActive; borderColour = Appearance.BorderActive; @@ -140,7 +140,7 @@ void Button::Draw(const Point& screenPos) } } -void Button::OnMouseUnclick(int x, int y, unsigned int button) +void Button::OnMouseClick(int x, int y, unsigned int button) { if(button == 1) { @@ -171,17 +171,20 @@ void Button::OnMouseUp(int x, int y, unsigned int button) isAltButtonDown = false; } -void Button::OnMouseClick(int x, int y, unsigned int button) +void Button::OnMouseDown(int x, int y, unsigned int button) { - if(!Enabled) - return; - if(button == 1) + if (MouseDownInside) { - isButtonDown = true; - } - else if(button == 3) - { - isAltButtonDown = true; + if(!Enabled) + return; + if(button == 1) + { + isButtonDown = true; + } + else if(button == 3) + { + isAltButtonDown = true; + } } } diff --git a/src/gui/interface/Button.h b/src/gui/interface/Button.h index ca1c8af45..36bb4037a 100644 --- a/src/gui/interface/Button.h +++ b/src/gui/interface/Button.h @@ -18,7 +18,7 @@ public: virtual ~Button() = default; void OnMouseClick(int x, int y, unsigned int button) override; - void OnMouseUnclick(int x, int y, unsigned int button) override; + void OnMouseDown(int x, int y, unsigned int button) override; void OnMouseUp(int x, int y, unsigned int button) override; void OnMouseEnter(int x, int y) override; diff --git a/src/gui/interface/Component.cpp b/src/gui/interface/Component.cpp index 735e62899..6ec1ac76d 100644 --- a/src/gui/interface/Component.cpp +++ b/src/gui/interface/Component.cpp @@ -124,17 +124,21 @@ void Component::SetParent(Panel* new_parent) this->_parent = new_parent; } -Point Component::GetScreenPos() +Point Component::GetContainerPos() { Point newPos(0,0); if(GetParentWindow()) newPos += GetParentWindow()->Position; if(GetParent()) newPos += GetParent()->Position + GetParent()->ViewportPosition; - newPos += Position; return newPos; } +Point Component::GetScreenPos() +{ + return GetContainerPos() + Position; +} + Graphics * Component::GetGraphics() { return parentstate_->GetGraphics(); @@ -201,10 +205,6 @@ void Component::OnMouseLeave(int localx, int localy) { } -void Component::OnMouseUnclick(int localx, int localy, unsigned button) -{ -} - void Component::OnMouseUp(int x, int y, unsigned button) { } diff --git a/src/gui/interface/Component.h b/src/gui/interface/Component.h index 20c1d875e..7fc8f0612 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 MouseDownInside; ui::Appearance Appearance; //virtual void SetAppearance(ui::Appearance); @@ -51,6 +52,7 @@ namespace ui void Refresh(); + Point GetContainerPos(); Point GetScreenPos(); /* See the parent of this component. @@ -146,7 +148,7 @@ namespace ui virtual void OnMouseUp(int x, int y, unsigned button); /// - // Called: When a mouse button is pressed on top of the item. + // Called: When a mouse button is pressed and then released on top of the item. // Params: // x: X position of the mouse. // y: Y position of the mouse. @@ -154,15 +156,6 @@ namespace ui /// virtual void OnMouseClick(int localx, int localy, unsigned button); - /// - // Called: When a mouse button is released on top of the item. - // Params: - // x: X position of the mouse. - // y: Y position of the mouse. - // button: The button that is being released. - /// - virtual void OnMouseUnclick(int localx, int localy, unsigned button); - /// // Called: When the mouse wheel moves/changes. // Params: diff --git a/src/gui/interface/DirectionSelector.cpp b/src/gui/interface/DirectionSelector.cpp index 6fc83321b..1953f69ef 100644 --- a/src/gui/interface/DirectionSelector.cpp +++ b/src/gui/interface/DirectionSelector.cpp @@ -142,11 +142,14 @@ void DirectionSelector::OnMouseMoved(int x, int y, int dx, int dy) CheckHovering(x, y); } -void DirectionSelector::OnMouseClick(int x, int y, unsigned button) +void DirectionSelector::OnMouseDown(int x, int y, unsigned button) { - mouseDown = true; - SetPositionAbs({ x, y }); - CheckHovering(x, y); + if (MouseDownInside) + { + mouseDown = true; + SetPositionAbs({ x - Position.X, y - Position.Y }); + CheckHovering(x - Position.X, y - Position.Y); + } } void DirectionSelector::OnMouseUp(int x, int y, unsigned button) diff --git a/src/gui/interface/DirectionSelector.h b/src/gui/interface/DirectionSelector.h index a3745f1c7..661e55b26 100644 --- a/src/gui/interface/DirectionSelector.h +++ b/src/gui/interface/DirectionSelector.h @@ -79,7 +79,7 @@ public: void Draw(const ui::Point& screenPos) override; void OnMouseMoved(int x, int y, int dx, int dy) override; - void OnMouseClick(int x, int y, unsigned int button) 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; } inline void OnKeyRelease(int key, int scan, bool repeat, bool shift, bool ctrl, bool alt) override { altDown = alt; } diff --git a/src/gui/interface/Engine.cpp b/src/gui/interface/Engine.cpp index 4ccab0986..75b4134a2 100644 --- a/src/gui/interface/Engine.cpp +++ b/src/gui/interface/Engine.cpp @@ -268,14 +268,14 @@ void Engine::onTextEditing(String text, int start) } } -void Engine::onMouseClick(int x, int y, unsigned button) +void Engine::onMouseDown(int x, int y, unsigned button) { mouseb_ |= button; if (state_ && !ignoreEvents) state_->DoMouseDown(x, y, button); } -void Engine::onMouseUnclick(int x, int y, unsigned button) +void Engine::onMouseUp(int x, int y, unsigned button) { mouseb_ &= ~button; if (state_ && !ignoreEvents) diff --git a/src/gui/interface/Engine.h b/src/gui/interface/Engine.h index 4649f2f0e..9cd5a6c3a 100644 --- a/src/gui/interface/Engine.h +++ b/src/gui/interface/Engine.h @@ -30,8 +30,8 @@ namespace ui void initialMouse(int x, int y); void onMouseMove(int x, int y); - void onMouseClick(int x, int y, unsigned button); - void onMouseUnclick(int x, int y, unsigned button); + void onMouseDown(int x, int y, unsigned button); + void onMouseUp(int x, int y, unsigned button); void onMouseWheel(int x, int y, int delta); void onKeyPress(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); diff --git a/src/gui/interface/Label.cpp b/src/gui/interface/Label.cpp index 181db8def..0f232bd72 100644 --- a/src/gui/interface/Label.cpp +++ b/src/gui/interface/Label.cpp @@ -88,24 +88,27 @@ void Label::OnContextMenuAction(int item) } } -void Label::OnMouseClick(int x, int y, unsigned button) +void Label::OnMouseDown(int x, int y, unsigned button) { - if(button == SDL_BUTTON_RIGHT) + if (MouseDownInside) { - if (menu) + if(button == SDL_BUTTON_RIGHT) { - menu->Show(GetScreenPos() + ui::Point(x, y)); + if (menu) + { + menu->Show(GetContainerPos() + ui::Point(x, y)); + } } - } - else - { - selecting = true; - auto tp = textPosition - Vec2{ scrollX, 0 }; - selectionIndex0 = textWrapper.Point2Index(x - tp.X, y - tp.Y); - selectionIndexL = selectionIndex0; - selectionIndexH = selectionIndex0; + else + { + selecting = true; + auto tp = textPosition - Vec2{ scrollX, 0 }; + selectionIndex0 = textWrapper.Point2Index(x - Position.X - tp.X, y - Position.Y - tp.Y); + selectionIndexL = selectionIndex0; + selectionIndexH = selectionIndex0; - updateSelection(); + updateSelection(); + } } } diff --git a/src/gui/interface/Label.h b/src/gui/interface/Label.h index 12fa6451e..6552ea8c9 100644 --- a/src/gui/interface/Label.h +++ b/src/gui/interface/Label.h @@ -58,7 +58,7 @@ namespace ui void SetTextColour(Colour textColour) { this->textColour = textColour; } void OnContextMenuAction(int item) override; - virtual void OnMouseClick(int x, int y, unsigned button) 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 OnKeyPress(int key, int scan, bool repeat, bool shift, bool ctrl, bool alt) override; diff --git a/src/gui/interface/Panel.cpp b/src/gui/interface/Panel.cpp index 8bfdc395b..4f38a3bc5 100644 --- a/src/gui/interface/Panel.cpp +++ b/src/gui/interface/Panel.cpp @@ -27,6 +27,7 @@ void Panel::AddChild(Component* c) { c->SetParent(this); c->SetParentWindow(this->GetParentWindow()); + c->MouseDownInside = false; } int Panel::GetChildCount() @@ -108,8 +109,13 @@ void Panel::OnKeyRelease(int key, int scan, bool repeat, bool shift, bool ctrl, void Panel::OnMouseClick(int localx, int localy, unsigned button) { - bool childclicked = false; + XOnMouseClick(localx, localy, button); +} +void Panel::OnMouseDown(int x, int y, unsigned button) +{ + auto localx = x - Position.X; + auto localy = y - Position.Y; //check if clicked a child for(int i = children.size()-1; i >= 0 ; --i) { @@ -122,29 +128,18 @@ void Panel::OnMouseClick(int localx, int localy, unsigned button) localx < children[i]->Position.X + ViewportPosition.X + children[i]->Size.X && localy < children[i]->Position.Y + ViewportPosition.Y + children[i]->Size.Y ) { - childclicked = true; GetParentWindow()->FocusComponent(children[i]); - children[i]->OnMouseClick(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y, button); + children[i]->MouseDownInside = true; break; } } } - //if a child wasn't clicked, send click to ourself - if(!childclicked) - { - XOnMouseClick(localx, localy, button); - GetParentWindow()->FocusComponent(this); - } -} - -void Panel::OnMouseDown(int x, int y, unsigned button) -{ XOnMouseDown(x, y, button); for (size_t i = 0; i < children.size(); ++i) { if(children[i]->Enabled) - children[i]->OnMouseDown(x, y, button); + children[i]->OnMouseDown(x - Position.X - ViewportPosition.X, y - Position.Y - ViewportPosition.Y, button); } } @@ -239,43 +234,38 @@ void Panel::OnMouseLeave(int localx, int localy) XOnMouseLeave(localx, localy); } -void Panel::OnMouseUnclick(int localx, int localy, unsigned button) +void Panel::OnMouseUp(int x, int y, unsigned button) { - bool childunclicked = false; - + auto localx = x - Position.X; + auto localy = y - Position.Y; //check if clicked a child for(int i = children.size()-1; i >= 0 ; --i) { - //child must be unlocked + //child must be enabled if(children[i]->Enabled) { //is mouse inside? - if( localx >= children[i]->Position.X + ViewportPosition.X && + if( children[i]->MouseDownInside && + localx >= children[i]->Position.X + ViewportPosition.X && localy >= children[i]->Position.Y + ViewportPosition.Y && localx < children[i]->Position.X + ViewportPosition.X + children[i]->Size.X && localy < children[i]->Position.Y + ViewportPosition.Y + children[i]->Size.Y ) { - childunclicked = true; - children[i]->OnMouseUnclick(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y, button); + children[i]->OnMouseClick(localx - children[i]->Position.X - ViewportPosition.X, localy - children[i]->Position.Y - ViewportPosition.Y, button); break; } } } - - //if a child wasn't clicked, send click to ourself - if (!childunclicked) + for (auto *child : children) { - XOnMouseUnclick(localx, localy, button); + child->MouseDownInside = false; } -} -void Panel::OnMouseUp(int x, int y, unsigned button) -{ XOnMouseUp(x, y, button); for (size_t i = 0; i < children.size(); ++i) { if (children[i]->Enabled) - children[i]->OnMouseUp(x, y, button); + children[i]->OnMouseUp(x - Position.X - ViewportPosition.X, y - Position.Y - ViewportPosition.Y, button); } } @@ -358,10 +348,6 @@ void Panel::XOnMouseLeave(int localx, int localy) { } -void Panel::XOnMouseUnclick(int localx, int localy, unsigned button) -{ -} - void Panel::XOnMouseUp(int x, int y, unsigned button) { } diff --git a/src/gui/interface/Panel.h b/src/gui/interface/Panel.h index f6a98e617..50fb984d7 100644 --- a/src/gui/interface/Panel.h +++ b/src/gui/interface/Panel.h @@ -58,7 +58,6 @@ namespace ui void OnMouseDown(int x, int y, unsigned button) override; void OnMouseUp(int x, int y, unsigned button) override; void OnMouseClick(int localx, int localy, unsigned button) override; - void OnMouseUnclick(int localx, int localy, unsigned button) override; void OnMouseWheel(int localx, int localy, int d) override; void OnMouseWheelInside(int localx, int localy, int d) override; void OnKeyPress(int key, int scan, bool repeat, bool shift, bool ctrl, bool alt) override; @@ -100,9 +99,6 @@ namespace ui // Overridable. Called by XComponent::OnMouseClick() virtual void XOnMouseClick(int localx, int localy, unsigned button); - // Overridable. Called by XComponent::OnMouseUnclick() - virtual void XOnMouseUnclick(int localx, int localy, unsigned button); - // Overridable. Called by XComponent::OnMouseWheel() virtual void XOnMouseWheel(int localx, int localy, int d); diff --git a/src/gui/interface/RichLabel.cpp b/src/gui/interface/RichLabel.cpp index b64769855..a82c4eec2 100644 --- a/src/gui/interface/RichLabel.cpp +++ b/src/gui/interface/RichLabel.cpp @@ -64,19 +64,22 @@ void RichLabel::SetText(String newText) regions = newRegions; } -void RichLabel::OnMouseClick(int x, int y, unsigned button) +void RichLabel::OnMouseDown(int x, int y, unsigned button) { - int cursorPosition = displayTextWrapper.Point2Index(x - textPosition.X, y - textPosition.Y).raw_index; - for (auto const ®ion : regions) + if (MouseDownInside) { - if (region.begin <= cursorPosition && region.end > cursorPosition) + int cursorPosition = displayTextWrapper.Point2Index(x - Position.X - textPosition.X, y - Position.Y - textPosition.Y).raw_index; + for (auto const ®ion : regions) { - if (auto *linkAction = std::get_if(®ion.action)) + if (region.begin <= cursorPosition && region.end > cursorPosition) { - Platform::OpenURI(linkAction->uri); - return; + if (auto *linkAction = std::get_if(®ion.action)) + { + Platform::OpenURI(linkAction->uri); + return; + } } } } - Label::OnMouseClick(x, y, button); + Label::OnMouseDown(x, y, button); } diff --git a/src/gui/interface/RichLabel.h b/src/gui/interface/RichLabel.h index 8001fa657..8a12360d3 100644 --- a/src/gui/interface/RichLabel.h +++ b/src/gui/interface/RichLabel.h @@ -24,6 +24,6 @@ namespace ui RichLabel(Point position, Point size, String text); void SetText(String newText) override; - void OnMouseClick(int x, int y, unsigned button) override; + void OnMouseDown(int x, int y, unsigned button) override; }; } diff --git a/src/gui/interface/SaveButton.cpp b/src/gui/interface/SaveButton.cpp index 30d92bea5..ab0e9dd4a 100644 --- a/src/gui/interface/SaveButton.cpp +++ b/src/gui/interface/SaveButton.cpp @@ -262,7 +262,7 @@ void SaveButton::Draw(const Point& screenPos) } } -void SaveButton::OnMouseUnclick(int x, int y, unsigned int button) +void SaveButton::OnMouseClick(int x, int y, unsigned int button) { if(button != 1) { @@ -333,22 +333,25 @@ void SaveButton::OnContextMenuAction(int item) } } -void SaveButton::OnMouseClick(int x, int y, unsigned int button) +void SaveButton::OnMouseDown(int x, int y, unsigned int button) { - if(button == SDL_BUTTON_RIGHT) + if (MouseDownInside) { - if(menu) - menu->Show(GetScreenPos() + ui::Point(x, y)); - } - else - { - isButtonDown = true; - if(button !=1 && selectable) + if(button == SDL_BUTTON_RIGHT) { - selected = !selected; - DoSelection(); + if(menu) + menu->Show(GetContainerPos() + ui::Point(x, y)); } + else + { + isButtonDown = true; + if(button !=1 && selectable) + { + selected = !selected; + DoSelection(); + } + } } } diff --git a/src/gui/interface/SaveButton.h b/src/gui/interface/SaveButton.h index ead5504f2..b397dbc44 100644 --- a/src/gui/interface/SaveButton.h +++ b/src/gui/interface/SaveButton.h @@ -48,7 +48,7 @@ public: virtual ~SaveButton(); void OnMouseClick(int x, int y, unsigned int button) override; - void OnMouseUnclick(int x, int y, unsigned int button) override; + void OnMouseDown(int x, int y, unsigned int button) override; void OnMouseEnter(int x, int y) override; void OnMouseLeave(int x, int y) override; diff --git a/src/gui/interface/ScrollPanel.cpp b/src/gui/interface/ScrollPanel.cpp index 87c2336b2..f8b4cff4d 100644 --- a/src/gui/interface/ScrollPanel.cpp +++ b/src/gui/interface/ScrollPanel.cpp @@ -70,15 +70,18 @@ void ScrollPanel::Draw(const Point& screenPos) } } -void ScrollPanel::XOnMouseClick(int x, int y, unsigned int button) +void ScrollPanel::XOnMouseDown(int x, int y, unsigned int button) { - if (isMouseInsideScrollbar) + if (MouseDownInside) { - scrollbarSelected = true; - scrollbarInitialYOffset = int(offsetY); + if (isMouseInsideScrollbar) + { + scrollbarSelected = true; + scrollbarInitialYOffset = int(offsetY); + } + scrollbarInitialYClick = y - Position.Y; + scrollbarClickLocation = 100; } - scrollbarInitialYClick = y; - scrollbarClickLocation = 100; } void ScrollPanel::XOnMouseUp(int x, int y, unsigned int button) diff --git a/src/gui/interface/ScrollPanel.h b/src/gui/interface/ScrollPanel.h index ecbc8860a..a1ccb719b 100644 --- a/src/gui/interface/ScrollPanel.h +++ b/src/gui/interface/ScrollPanel.h @@ -28,7 +28,7 @@ namespace ui void Draw(const Point& screenPos) override; void XTick(float dt) override; void XOnMouseWheelInside(int localx, int localy, int d) override; - void XOnMouseClick(int localx, int localy, unsigned int button) 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; }; diff --git a/src/gui/interface/Slider.cpp b/src/gui/interface/Slider.cpp index eac1c9ad8..e47a54dec 100644 --- a/src/gui/interface/Slider.cpp +++ b/src/gui/interface/Slider.cpp @@ -48,10 +48,10 @@ void Slider::OnMouseMoved(int x, int y, int dx, int dy) } } -void Slider::OnMouseClick(int x, int y, unsigned button) +void Slider::OnMouseDown(int x, int y, unsigned button) { isMouseDown = true; - updatePosition(x); + updatePosition(x - Position.X); } void Slider::OnMouseUp(int x, int y, unsigned button) diff --git a/src/gui/interface/Slider.h b/src/gui/interface/Slider.h index 25bee8b3d..0f674ec91 100644 --- a/src/gui/interface/Slider.h +++ b/src/gui/interface/Slider.h @@ -25,7 +25,7 @@ public: virtual ~Slider() = default; void OnMouseMoved(int x, int y, int dx, int dy) override; - void OnMouseClick(int x, int y, unsigned button) 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; void SetColour(Colour col1, Colour col2); diff --git a/src/gui/interface/Textbox.cpp b/src/gui/interface/Textbox.cpp index 3b95a2b2a..e5d45256f 100644 --- a/src/gui/interface/Textbox.cpp +++ b/src/gui/interface/Textbox.cpp @@ -569,18 +569,21 @@ void Textbox::OnTextEditing(String text) updateSelection(); } -void Textbox::OnMouseClick(int x, int y, unsigned button) +void Textbox::OnMouseDown(int x, int y, unsigned button) { - if (button != SDL_BUTTON_RIGHT) + if (MouseDownInside) { - StopTextEditing(); - mouseDown = true; - auto tp = textPosition - Vec2{ scrollX, 0 }; - auto index = textWrapper.Point2Index(x-tp.X, y-tp.Y); - cursor = index.raw_index; - resetCursorPosition(); + if (button != SDL_BUTTON_RIGHT) + { + StopTextEditing(); + mouseDown = true; + auto tp = textPosition - Vec2{ scrollX, 0 }; + auto index = textWrapper.Point2Index(x-Position.X-tp.X, y-Position.Y-tp.Y); + cursor = index.raw_index; + resetCursorPosition(); + } } - Label::OnMouseClick(x, y, button); + Label::OnMouseDown(x, y, button); } void Textbox::OnMouseUp(int x, int y, unsigned button) diff --git a/src/gui/interface/Textbox.h b/src/gui/interface/Textbox.h index 6db21e414..ac6f07640 100644 --- a/src/gui/interface/Textbox.h +++ b/src/gui/interface/Textbox.h @@ -53,7 +53,7 @@ public: void Tick(float dt) override; void OnContextMenuAction(int item) override; - void OnMouseClick(int x, int y, unsigned button) 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 OnKeyPress(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 f0368d1ba..713669472 100644 --- a/src/gui/interface/Window.cpp +++ b/src/gui/interface/Window.cpp @@ -43,6 +43,7 @@ void Window::AddComponent(Component* c) if (c->GetParentWindow() == NULL) { c->SetParentWindow(this); + 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 && @@ -440,7 +441,7 @@ void Window::DoMouseDown(int x_, int y_, unsigned button) FocusComponent(Components[i]); if (!DEBUG || !debugMode) { - Components[i]->OnMouseClick(x - Components[i]->Position.X, y - Components[i]->Position.Y, button); + Components[i]->MouseDownInside = true; } clickState = true; break; @@ -537,13 +538,17 @@ void Window::DoMouseUp(int x_, int y_, unsigned button) { if (Components[i]->Enabled && Components[i]->Visible) { - if (x >= Components[i]->Position.X && y >= Components[i]->Position.Y && x < Components[i]->Position.X + Components[i]->Size.X && y < Components[i]->Position.Y + Components[i]->Size.Y) + if (Components[i]->MouseDownInside && x >= Components[i]->Position.X && y >= Components[i]->Position.Y && x < Components[i]->Position.X + Components[i]->Size.X && y < Components[i]->Position.Y + Components[i]->Size.Y) { - Components[i]->OnMouseUnclick(x - Components[i]->Position.X, y - Components[i]->Position.Y, button); + Components[i]->OnMouseClick(x - Components[i]->Position.X, y - Components[i]->Position.Y, button); break; } } } + for (auto *component : Components) + { + component->MouseDownInside = false; + } //on mouse up for (int i = Components.size() - 1; i >= 0 && !halt; --i)