From afd1d88d64eab7bcad7cb2d84a502b4e71ceff66 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Sat, 5 Aug 2023 23:31:35 -0500 Subject: [PATCH] Ability to drag windows around. --- FiestaOnlineEditor/FiestaOnlineEditor.cpp | 18 +++++++++++++++ FiestaOnlineEditor/ItemEditor.cpp | 4 ++++ FiestaOnlineEditor/ItemEditor.h | 1 + FiestaOnlineEditor/Window.cpp | 28 ++++++++++++++++++++++- FiestaOnlineEditor/Window.h | 5 ++++ 5 files changed, 55 insertions(+), 1 deletion(-) diff --git a/FiestaOnlineEditor/FiestaOnlineEditor.cpp b/FiestaOnlineEditor/FiestaOnlineEditor.cpp index 818da9a..4bb050b 100644 --- a/FiestaOnlineEditor/FiestaOnlineEditor.cpp +++ b/FiestaOnlineEditor/FiestaOnlineEditor.cpp @@ -132,16 +132,34 @@ bool FiestaOnlineEditor::OnUserUpdate(float fElapsedTime){ SetDrawTarget(1); //BACKGROUND DRAWING + bool internalMouseFocus=false; + for(Window*w:windows){ if(!w->IsFocusedWindow()){ SetDrawTarget(1); } else { SetDrawTarget(nullptr); + if(w->IsInBounds(GetMousePos())){ + w->InternalMouseFocus(this); + w->MouseFocus(this); + internalMouseFocus=true; + } } w->InternalUpdate(this,fElapsedTime); w->Draw(this); } + if(!internalMouseFocus){ + for(Window*w:windows){ //A second iteration through the windows because windows without focus should only have priority after a window with focus. + if(!w->IsFocusedWindow()){ + if(w->IsInBounds(GetMousePos())){ + w->InternalMouseFocus(this); + w->MouseFocus(this); + } + } + } + } + SetDrawTarget(nullptr); //FOREGROUND DRAWING manager.Draw(sprMenu,{64,64}); diff --git a/FiestaOnlineEditor/ItemEditor.cpp b/FiestaOnlineEditor/ItemEditor.cpp index 8e2380e..9f4ff0c 100644 --- a/FiestaOnlineEditor/ItemEditor.cpp +++ b/FiestaOnlineEditor/ItemEditor.cpp @@ -32,4 +32,8 @@ void ItemEditor::Update(FiestaOnlineEditor*pge,float fElapsedTime){ void ItemEditor::Refresh(FiestaOnlineEditor*pge){ pge->DrawRect(pos,{16,16},WHITE); +} + +void ItemEditor::MouseFocus(FiestaOnlineEditor*pge){ + } \ No newline at end of file diff --git a/FiestaOnlineEditor/ItemEditor.h b/FiestaOnlineEditor/ItemEditor.h index 2d137d4..27feff2 100644 --- a/FiestaOnlineEditor/ItemEditor.h +++ b/FiestaOnlineEditor/ItemEditor.h @@ -13,4 +13,5 @@ public: void Load(std::string basePath); void Refresh(FiestaOnlineEditor*pge)override; void Update(FiestaOnlineEditor*pge,float fElapsedTime)override; + void MouseFocus(FiestaOnlineEditor*pge)override; }; \ No newline at end of file diff --git a/FiestaOnlineEditor/Window.cpp b/FiestaOnlineEditor/Window.cpp index 4e2ba89..3a52f92 100644 --- a/FiestaOnlineEditor/Window.cpp +++ b/FiestaOnlineEditor/Window.cpp @@ -14,6 +14,9 @@ void Window::InternalUpdate(FiestaOnlineEditor*pge,float fElapsedTime){ if(this==focusedWindow){ Update(pge,fElapsedTime); } + if(dragging){ + pos=pge->GetMousePos()-dragPoint; + } } void Window::InternalRefresh(FiestaOnlineEditor*pge){ @@ -54,4 +57,27 @@ void Window::Draw(FiestaOnlineEditor*pge){ void Window::Cleanup(){ delete sprWindow; delete decWindow; -} \ No newline at end of file +} + +bool Window::IsInBounds(vf2d point){ + return point.x>=pos.x&&point.x<=pos.x+size.x&&point.y>=pos.y&&point.y<=pos.y+size.y+headerHeight; +} + +void Window::InternalMouseFocus(FiestaOnlineEditor*pge){ + if(pge->GetMouse(0).bPressed){ + if(pge->GetMouseY()GetMousePos()-pos; + } + if(focusedWindow!=this){ + Window*prevFocusedWindow=focusedWindow; + focusedWindow=this; + InternalRefresh(pge); + prevFocusedWindow->InternalRefresh(pge); + } + } + if(pge->GetMouse(0).bReleased){ + dragging=false; + } +} +void Window::MouseFocus(FiestaOnlineEditor*pge){} \ No newline at end of file diff --git a/FiestaOnlineEditor/Window.h b/FiestaOnlineEditor/Window.h index abc39da..2afbdf8 100644 --- a/FiestaOnlineEditor/Window.h +++ b/FiestaOnlineEditor/Window.h @@ -8,6 +8,8 @@ private: vi2d pos; Decal*decWindow; const int headerHeight=12; + bool dragging=false; + vf2d dragPoint; protected: vi2d size; Sprite*sprWindow; @@ -22,4 +24,7 @@ public: void Draw(FiestaOnlineEditor*pge); bool IsFocusedWindow(); void Cleanup(); + bool IsInBounds(vf2d point); + void InternalMouseFocus(FiestaOnlineEditor*pge); + virtual void MouseFocus(FiestaOnlineEditor*pge); }; \ No newline at end of file