diff --git a/include/libpdw/gui/canvas.hpp b/include/libpdw/gui/canvas.hpp index 860c659..7d38f83 100644 --- a/include/libpdw/gui/canvas.hpp +++ b/include/libpdw/gui/canvas.hpp @@ -40,8 +40,8 @@ public: bool m_bKeysInit = false; int m_iMouseX; int m_iMouseY; - int mouse_dx; - int mouse_dy; + [[deprecated]] int mouse_dx; + [[deprecated]] int mouse_dy; bool fake_scroll = false; glez::rgba GetColor(); diff --git a/include/libpdw/gui/listmenu/list.hpp b/include/libpdw/gui/listmenu/list.hpp index 1f36cb1..541a1db 100644 --- a/include/libpdw/gui/listmenu/list.hpp +++ b/include/libpdw/gui/listmenu/list.hpp @@ -52,6 +52,7 @@ public: virtual void OnKeyPress(CatKey key, bool repeat) override; virtual void OnMouseEnter() override; virtual void OnMouseLeave() override; + virtual void OnMouseMove(std::pair) override; virtual void Draw(int x, int y) override; virtual void Update() override; virtual void MoveChildren() override; diff --git a/include/libpdw/gui/ncc/logo.hpp b/include/libpdw/gui/ncc/logo.hpp index f194870..cc6882f 100644 --- a/include/libpdw/gui/ncc/logo.hpp +++ b/include/libpdw/gui/ncc/logo.hpp @@ -30,7 +30,7 @@ public: Logo(IWidget*); virtual bool AlwaysVisible() override; virtual void Draw(int x, int y) override; - virtual void Update() override; + virtual void OnMouseMove(std::pair) override; glez::texture texture; }; diff --git a/include/libpdw/gui/widgets/basecontainer.hpp b/include/libpdw/gui/widgets/basecontainer.hpp index 0608379..58f2982 100644 --- a/include/libpdw/gui/widgets/basecontainer.hpp +++ b/include/libpdw/gui/widgets/basecontainer.hpp @@ -49,6 +49,7 @@ public: virtual void OnMouseLeave(); virtual void OnMousePress(); virtual void OnMouseRelease(); + virtual void OnMouseMove(std::pair); virtual void Update(); virtual void HandleCustomEvent(std::string_view event); diff --git a/include/libpdw/gui/widgets/basewidget.hpp b/include/libpdw/gui/widgets/basewidget.hpp index a370913..c598349 100644 --- a/include/libpdw/gui/widgets/basewidget.hpp +++ b/include/libpdw/gui/widgets/basewidget.hpp @@ -45,6 +45,7 @@ public: inline virtual void OnMouseLeave() { this->hover = false; } inline virtual void OnMousePress() { this->press = true; } inline virtual void OnMouseRelease() { this->press = false; } + inline virtual void OnMouseMove(std::pair) { } inline virtual void OnKeyPress(CatKey key, bool repeat) {}; inline virtual void OnKeyRelease(CatKey key) {}; inline virtual void OnFocusGain() { this->focus = true; } diff --git a/include/libpdw/gui/widgets/iwidget.hpp b/include/libpdw/gui/widgets/iwidget.hpp index 98e3076..a0b2e01 100644 --- a/include/libpdw/gui/widgets/iwidget.hpp +++ b/include/libpdw/gui/widgets/iwidget.hpp @@ -48,6 +48,7 @@ public: virtual void OnMouseLeave() = 0; virtual void OnMousePress() = 0; virtual void OnMouseRelease() = 0; + virtual void OnMouseMove(std::pair) = 0; virtual void OnKeyPress(CatKey key, bool repeat) = 0; virtual void OnKeyRelease(CatKey key) = 0; virtual void OnFocusGain() = 0; diff --git a/include/libpdw/gui/widgets/titlebar.hpp b/include/libpdw/gui/widgets/titlebar.hpp index 21af66c..33d9c81 100644 --- a/include/libpdw/gui/widgets/titlebar.hpp +++ b/include/libpdw/gui/widgets/titlebar.hpp @@ -29,10 +29,8 @@ public: CTitleBar(IWidget* parent, std::string title); virtual void Draw(int x, int y); + virtual void OnMouseMove(std::pair); virtual void Update(); std::string m_strTitle; - int m_iDraggingStage; - int m_nLastX; - int m_nLastY; }; diff --git a/src/gui/canvas.cpp b/src/gui/canvas.cpp index 8845ffd..1536733 100644 --- a/src/gui/canvas.cpp +++ b/src/gui/canvas.cpp @@ -152,8 +152,12 @@ void Canvas::Update() { auto nmouse = input::GetMouse(); - mouse_dx = nmouse.first - m_iMouseX; - mouse_dy = nmouse.second - m_iMouseY; + { + auto mouse_delta = std::make_pair(nmouse.first - m_iMouseX, nmouse.second - m_iMouseY); + mouse_dx = mouse_delta.first, mouse_dy = mouse_delta.second; + if (mouse_delta.first || mouse_delta.second) + this->OnMouseMove(mouse_delta); + } m_iMouseX = nmouse.first; m_iMouseY = nmouse.second; diff --git a/src/gui/listmenu/list.cpp b/src/gui/listmenu/list.cpp index ca59e1b..67606e6 100644 --- a/src/gui/listmenu/list.cpp +++ b/src/gui/listmenu/list.cpp @@ -267,14 +267,17 @@ void List::SetParent(IWidget* parent) { root_list = this; } -void List::Update() { - CBaseContainer::Update(); +void List::OnMouseMove(std::pair delta) { if (IsPressed() && root_list == this) { const auto& offset = root_list->GetOffset(); - root_list->SetOffset(offset.first + this->GetCanvas()->mouse_dx, offset.second + this->GetCanvas()->mouse_dy); + root_list->SetOffset(offset.first + delta.first, offset.second + delta.second); } } +void List::Update() { + CBaseContainer::Update(); +} + void List::MoveChildren() { int accy = 2; int j = 0; diff --git a/src/gui/ncc/logo.cpp b/src/gui/ncc/logo.cpp index 260622e..8603d4c 100644 --- a/src/gui/ncc/logo.cpp +++ b/src/gui/ncc/logo.cpp @@ -44,11 +44,11 @@ void Logo::Draw(int x, int y) { glez::draw::rect_textured(x, y, embeded_logo_png_rgba.width, embeded_logo_png_rgba.height, this->GetCanvas()->GetColor(), this->texture, 0, 0, embeded_logo_png_rgba.width, embeded_logo_png_rgba.height, 0.0f); } -void Logo::Update() { +void Logo::OnMouseMove(std::pair delta) { if (this->IsPressed()) { auto offset = GetOffset(); - offset.first += this->GetCanvas()->mouse_dx; - offset.second += this->GetCanvas()->mouse_dy; + offset.first += delta.first; + offset.second += delta.second; SetOffset(offset.first, offset.second); } } diff --git a/src/gui/widgets/basecontainer.cpp b/src/gui/widgets/basecontainer.cpp index b82ad43..ff99afc 100644 --- a/src/gui/widgets/basecontainer.cpp +++ b/src/gui/widgets/basecontainer.cpp @@ -185,6 +185,12 @@ void CBaseContainer::OnMouseRelease() { GetPressedChild()->OnMouseRelease(); } +void CBaseContainer::OnMouseMove(std::pair delta) { + CBaseWidget::OnMouseMove(delta); + for (auto* i : this->m_children) + i->OnMouseMove(delta); +} + void CBaseContainer::PressOn(IWidget* child) { m_pPressedChild = child; if (child) { diff --git a/src/gui/widgets/titlebar.cpp b/src/gui/widgets/titlebar.cpp index 64d3026..81884be 100644 --- a/src/gui/widgets/titlebar.cpp +++ b/src/gui/widgets/titlebar.cpp @@ -26,9 +26,6 @@ CTitleBar::CTitleBar(IWidget* parent, std::string title) : CBaseWidget("titlebar", parent) { m_strTitle = title; - m_iDraggingStage = 0; - m_nLastX = 0; - m_nLastY = 0; SetPositionMode(ABSOLUTE); } @@ -40,23 +37,16 @@ void CTitleBar::Draw(int x, int y) { glez::draw::string(x + (size.first - l) / 2, y + TITLEBAR_PADDING_H, m_strTitle, this->GetCanvas()->GetFont(), glez::color::white, nullptr, nullptr); } +void CTitleBar::OnMouseMove(std::pair delta) { + if (this->IsPressed()) { + auto offset = GetParent()->GetOffset(); + GetParent()->SetOffset(offset.first + delta.first, offset.second + delta.second); + } +} + void CTitleBar::Update() { auto psize = GetParent()->GetSize(); float l, h; this->GetCanvas()->GetFont().stringSize(m_strTitle, &l, &h); SetSize(psize.first, 2 * TITLEBAR_PADDING_H + h); - if (!IsPressed()) { - m_iDraggingStage = 0; - return; - } - if (m_iDraggingStage == 0) { - m_iDraggingStage = 1; - } else { - int dx = this->GetCanvas()->m_iMouseX - m_nLastX; - int dy = this->GetCanvas()->m_iMouseY - m_nLastY; - auto offset = GetParent()->GetOffset(); - GetParent()->SetOffset(offset.first + dx, offset.second + dy); - } - m_nLastX = this->GetCanvas()->m_iMouseX; - m_nLastY = this->GetCanvas()->m_iMouseY; }