From 4f86319ca7413c423dfd01334c1591a08668fe77 Mon Sep 17 00:00:00 2001 From: Adrien GIVRY Date: Thu, 8 May 2025 17:44:04 -0400 Subject: [PATCH 1/3] Added buttons to select gizmo operations from the toolbar --- Resources/Editor/Textures/Move.png | Bin 0 -> 1341 bytes Resources/Editor/Textures/Rotate.png | Bin 0 -> 2927 bytes Resources/Editor/Textures/Scale.png | Bin 0 -> 1708 bytes .../include/OvEditor/Core/EditorActions.h | 20 ++- .../include/OvEditor/Panels/SceneView.h | 12 ++ .../src/OvEditor/Core/EditorActions.cpp | 27 +++- .../src/OvEditor/Core/EditorResources.cpp | 3 + .../src/OvEditor/Panels/SceneView.cpp | 17 ++- .../OvEditor/src/OvEditor/Panels/Toolbar.cpp | 124 ++++++++++++------ 9 files changed, 152 insertions(+), 51 deletions(-) create mode 100644 Resources/Editor/Textures/Move.png create mode 100644 Resources/Editor/Textures/Rotate.png create mode 100644 Resources/Editor/Textures/Scale.png diff --git a/Resources/Editor/Textures/Move.png b/Resources/Editor/Textures/Move.png new file mode 100644 index 0000000000000000000000000000000000000000..c39980c881773474d366135fad072eb38d221343 GIT binary patch literal 1341 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBphSslL`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zo_Y7R@0LI{+fpMu(>y)37&w3&Rt70XRt82O%L|C5p=^+AG#Ht|;!HrcAtMum0FaIX z;>>myuy_`b4FWvnj0`WB5j2{m3_z&~>vp@3Xlx~Oh9v) zz$$|*Er2YjE<*zYkgQUL>)Q27H}^6yFu(D1aSW-5dpp}VPuNkQHQw^bJpo505tXu- z#_p8II!WsU{Fu`lSm(5At4tJ97U*g^!ZgXEpEcBTr*ZD}KQ}g}fAU=1Q@tyF*S#

zfy@h8vxOfyfyXd(-2|BNyxlcyPNK@myNxZO*3&R~r zMU|yJAKmVL3e@5hh&?GNc&)Pd;-`zhL;|B2viq)`x%~R{vb*)A7pzO##L*Va08M{Gglw?We}3T^y2+{{~&Hi(00mvYm_NhS%q*sxSE#KHa+V*|TSr_7Co6*fD%lHfC3_D!ri%677f8QwSNf#c>z&71aEza^ z=GqhK^5$%Y`;0bMzgTfJq`&*g@?rI&hx6nb?lZ(ORV>Q9*H$a|^O5TYN6#xOU#y<| znd<3~r^~lcVC@o(Q5XNw)Qz7OJiQO?Aj!^A*u{r<_fL@<+fl9IQ=98Kap4;}-8~$4e?;6m(P2>d+%@y9!99?_ANPVpr%Ng; zH*LJf95*E;HPceta&_BhVYbllqHA*b1rAMxwQkdLUmrIeR0epu`njxg HN@xNA)`%Rb literal 0 HcmV?d00001 diff --git a/Resources/Editor/Textures/Rotate.png b/Resources/Editor/Textures/Rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..e13a665788e41283218bbc4b08d67b4f1e3b7b46 GIT binary patch literal 2927 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 literal 0 HcmV?d00001 diff --git a/Resources/Editor/Textures/Scale.png b/Resources/Editor/Textures/Scale.png new file mode 100644 index 0000000000000000000000000000000000000000..cb53d0ae46ca407b0f96f6f338451b4823533012 GIT binary patch literal 1708 zcmZ8hdpOhkAOCKK&DtSLDYt1jp`2;uR<2EacW`oIy-a# z0KkC0q#%er)Ie%MZyoKl6e1Ws$j1wKFkmc)97LR_zb61RanNfqnvjo5^$n*3z!#6z zfEnx}=RiTjH1Dvq;1p^aBj!vja3qG7oMso`9fI3$XK&|NG`#E#)wITjfm9H*0g#ZR z3G9Gr0x(FCAsGFw)xX&V)A$^RL)sn&2lOC53W4?m;&VI!(rTMO3j^M3{Gb1^6o68f zwE+ZFN!Uvyz$*Wms@|ws`PZbYkX9QUnhXD28RYB)slU7I2?TZ4>)yS$!j;&MP~S0- zvgcv82WQ|S%qKu1|7|L9a_${D(h@4P%t@0JbpeOipZ zXwEV`krVT%63I=FTk^`zgd2rn-LHp|Z^qUQa{66jZ4BCz;t!UVRBH56?MJLHltuQ&I+Ibzk}gcgrU<2$PT2FsNH?7|9lz_66s`+3^rd94g%P(^BQD28 z)Sy4<6VZiCL`aDb@$B4U;ia0>;K*xZ?anpdO%3Vajrq9zw$EXgIycIYiN+>cC1&i2y%bTZcQh^K$l?!@i-$PqAvo}i= z@llC6-*yJwIInLnQgOMPaqEdeDpVdu~cS*`tkxw_RVCA%8zFaH)=J&`*`H z`KjS&YJSXn64;2zbJ2}U-y=`=oXwl;?g)ZgJ$9NpSvo-rgP~BX)yb;F+Hb-ril>5# zS+Rmw=ypnI_GsXK4XV^Yf3R0``#WYLhckB(PcZwC-k-RGN1i8y+k<#&Ycy3^F#;;7 zt+;zwMNxITHL-k2D9b%4U!Pf-bo1KnZEovy(hV{3#f+94{mwOvbuiv_zKH68p)w5;LyyXF5He^>z8Bv*w3n7}3|FZPc?>vtW35o3)oBJDYFH z_W!MXT-U9**?FvQ`bF{Tjg5gJrBxfICb^yGl7{G6`ebfKW}#U z4P#G78;-^pRy9Sm>2MEQ@^#NHwRceT>$>3n#WVg|l0f3>NE|zq$S#xYnTr33E>gaD z)`}Xl!u@ty+z6jkEny!Z)@_^odcGC0dYl zYd-U6&xPlQqqQ>j-i>ImcQnLIm`)x1X{7JL{s=vJd-4W)XY$>xE^7LxJVSayc&B#aOo&TQDxNYfQ`+WiK8)5H= ziIhb}-p8yBkEYU_b8>p5ri{!ojrw6#o{j#Rv`&vO=W|MH>2ipR6@zw!(>pPuZHdl5 zDhZU#o_Bo7>i6Hwls|YKDCs${yFch1N276{lify$?26}Mb(%~FT1~` zHZB!r7Z=C+?jH7#9bbJyvV0*7_-Y~ew$7)~`@y$^&R=Kk94lmA`uSfR^_jc4s #include -#include "OvEditor/Core/Context.h" -#include "OvEditor/Core/PanelsManager.h" +#include +#include #define EDITOR_EXEC(action) OvCore::Global::ServiceLocator::Get().action #define EDITOR_BIND(method, ...) std::bind(&OvEditor::Core::EditorActions::method, &OvCore::Global::ServiceLocator::Get(), ##__VA_ARGS__) @@ -21,6 +21,8 @@ namespace OvEditor::Core { + enum class EGizmoOperation; + /** * A set of editor actions */ @@ -140,6 +142,19 @@ namespace OvEditor::Core void NextFrame(); #pragma endregion + #pragma region SCENE_VIEW + /** + * Sets the gizmo operation to use + * @param p_operation + */ + void SetGizmoOperation(EGizmoOperation p_operation); + + /** + * Returns the current gizmo operation + */ + EGizmoOperation GetGizmoOperation() const; + #pragma endregion + #pragma region ACTOR_CREATION_DESTRUCTION /** * Create an actor with the given component type @@ -385,6 +400,7 @@ namespace OvEditor::Core OvTools::Eventing::Event ActorSelectedEvent; OvTools::Eventing::Event ActorUnselectedEvent; OvTools::Eventing::Event EditorModeChangedEvent; + OvTools::Eventing::Event EditorOperationChanged; OvTools::Eventing::Event<> PlayEvent; private: diff --git a/Sources/Overload/OvEditor/include/OvEditor/Panels/SceneView.h b/Sources/Overload/OvEditor/include/OvEditor/Panels/SceneView.h index 2cd00f8f2..97965b0a0 100644 --- a/Sources/Overload/OvEditor/include/OvEditor/Panels/SceneView.h +++ b/Sources/Overload/OvEditor/include/OvEditor/Panels/SceneView.h @@ -9,6 +9,7 @@ #include #include #include +#include namespace OvEditor::Panels { @@ -42,6 +43,17 @@ namespace OvEditor::Panels */ virtual OvCore::SceneSystem::Scene* GetScene(); + /** + * Set the gizmo operation + * @param p_operation + */ + void SetGizmoOperation(Core::EGizmoOperation p_operation); + + /** + * Returns the current gizmo operation + */ + Core::EGizmoOperation GetGizmoOperation() const; + protected: virtual OvCore::Rendering::SceneRenderer::SceneDescriptor CreateSceneDescriptor() override; diff --git a/Sources/Overload/OvEditor/src/OvEditor/Core/EditorActions.cpp b/Sources/Overload/OvEditor/src/OvEditor/Core/EditorActions.cpp index 88293f0bc..4cadfb2da 100644 --- a/Sources/Overload/OvEditor/src/OvEditor/Core/EditorActions.cpp +++ b/Sources/Overload/OvEditor/src/OvEditor/Core/EditorActions.cpp @@ -25,13 +25,14 @@ #include #include -#include "OvEditor/Core/EditorActions.h" -#include "OvEditor/Panels/SceneView.h" -#include "OvEditor/Panels/AssetView.h" -#include "OvEditor/Panels/GameView.h" -#include "OvEditor/Panels/Inspector.h" -#include "OvEditor/Panels/ProjectSettings.h" -#include "OvEditor/Panels/MaterialEditor.h" +#include +#include +#include +#include +#include +#include +#include +#include OvEditor::Core::EditorActions::EditorActions(Context& p_context, PanelsManager& p_panelsManager) : m_context(p_context), @@ -485,6 +486,18 @@ void OvEditor::Core::EditorActions::NextFrame() SetEditorMode(EEditorMode::FRAME_BY_FRAME); } +void OvEditor::Core::EditorActions::SetGizmoOperation(OvEditor::Core::EGizmoOperation p_operation) +{ + auto& sceneView = m_panelsManager.GetPanelAs("Scene View"); + sceneView.SetGizmoOperation(p_operation); +} + +OvEditor::Core::EGizmoOperation OvEditor::Core::EditorActions::GetGizmoOperation() const +{ + auto& sceneView = m_panelsManager.GetPanelAs("Scene View"); + return sceneView.GetGizmoOperation(); +} + OvMaths::FVector3 OvEditor::Core::EditorActions::CalculateActorSpawnPoint(float p_distanceToCamera) { auto& sceneView = m_panelsManager.GetPanelAs("Scene View"); diff --git a/Sources/Overload/OvEditor/src/OvEditor/Core/EditorResources.cpp b/Sources/Overload/OvEditor/src/OvEditor/Core/EditorResources.cpp index e8351b980..6af23e85b 100644 --- a/Sources/Overload/OvEditor/src/OvEditor/Core/EditorResources.cpp +++ b/Sources/Overload/OvEditor/src/OvEditor/Core/EditorResources.cpp @@ -89,6 +89,9 @@ OvEditor::Core::EditorResources::EditorResources(const std::string& p_editorAsse {"Stop", CreateTexture(texturesFolder / "Stop.png")}, {"Next", CreateTexture(texturesFolder / "Next.png")}, {"Refresh", CreateTexture(texturesFolder / "Refresh.png")}, + {"Move", CreateTexture(texturesFolder / "Move.png")}, + {"Rotate", CreateTexture(texturesFolder / "Rotate.png")}, + {"Scale", CreateTexture(texturesFolder / "Scale.png")}, {"File", CreateTexture(texturesFolder / "File.png")}, {"Folder", CreateTexture(texturesFolder / "Folder.png")}, {"Texture", CreateTexture(texturesFolder / "Texture.png")}, diff --git a/Sources/Overload/OvEditor/src/OvEditor/Panels/SceneView.cpp b/Sources/Overload/OvEditor/src/OvEditor/Panels/SceneView.cpp index 9c615d18a..6b1da60ce 100644 --- a/Sources/Overload/OvEditor/src/OvEditor/Panels/SceneView.cpp +++ b/Sources/Overload/OvEditor/src/OvEditor/Panels/SceneView.cpp @@ -83,17 +83,17 @@ void OvEditor::Panels::SceneView::Update(float p_deltaTime) { if (EDITOR_CONTEXT(inputManager)->IsKeyPressed(EKey::KEY_W)) { - m_currentOperation = OvEditor::Core::EGizmoOperation::TRANSLATE; + SetGizmoOperation(Core::EGizmoOperation::TRANSLATE); } if (EDITOR_CONTEXT(inputManager)->IsKeyPressed(EKey::KEY_E)) { - m_currentOperation = OvEditor::Core::EGizmoOperation::ROTATE; + SetGizmoOperation(Core::EGizmoOperation::ROTATE); } if (EDITOR_CONTEXT(inputManager)->IsKeyPressed(EKey::KEY_R)) { - m_currentOperation = OvEditor::Core::EGizmoOperation::SCALE; + SetGizmoOperation(Core::EGizmoOperation::SCALE); } } } @@ -122,6 +122,17 @@ OvCore::SceneSystem::Scene* OvEditor::Panels::SceneView::GetScene() return m_sceneManager.GetCurrentScene(); } +void OvEditor::Panels::SceneView::SetGizmoOperation(OvEditor::Core::EGizmoOperation p_operation) +{ + m_currentOperation = p_operation; + EDITOR_EVENT(EditorOperationChanged).Invoke(m_currentOperation); +} + +OvEditor::Core::EGizmoOperation OvEditor::Panels::SceneView::GetGizmoOperation() const +{ + return m_currentOperation; +} + OvCore::Rendering::SceneRenderer::SceneDescriptor OvEditor::Panels::SceneView::CreateSceneDescriptor() { auto descriptor = AViewControllable::CreateSceneDescriptor(); diff --git a/Sources/Overload/OvEditor/src/OvEditor/Panels/Toolbar.cpp b/Sources/Overload/OvEditor/src/OvEditor/Panels/Toolbar.cpp index 274d3fc2d..6e2e36043 100644 --- a/Sources/Overload/OvEditor/src/OvEditor/Panels/Toolbar.cpp +++ b/Sources/Overload/OvEditor/src/OvEditor/Panels/Toolbar.cpp @@ -4,14 +4,24 @@ * @licence: MIT */ -#include - -#include "OvEditor/Panels/Toolbar.h" -#include "OvEditor/Core/EditorActions.h" - #include #include +#include +#include +#include + +#include + +namespace +{ + void SetButtonState(OvUI::Widgets::Buttons::ButtonImage* p_button, bool p_enable) + { + p_button->disabled = !p_enable; + p_button->tint = p_enable ? OvUI::Types::Color{ 1.0f, 1.0f, 1.0f, 1.0f } : OvUI::Types::Color{ 1.0f, 1.0f, 1.0f, 0.15f }; + } +} + OvEditor::Panels::Toolbar::Toolbar ( const std::string& p_title, @@ -19,17 +29,59 @@ OvEditor::Panels::Toolbar::Toolbar const OvUI::Settings::PanelWindowSettings& p_windowSettings ) : PanelWindow(p_title, p_opened, p_windowSettings) { - std::string iconFolder = ":Textures/Icons/"; + using namespace OvUI::Widgets; + using namespace OvUI::Widgets::Buttons; + const auto iconSize = OvMaths::FVector2{ 20, 20 }; auto& textureManager = OvCore::Global::ServiceLocator::Get(); + auto& editorResources = EDITOR_CONTEXT(editorResources); - m_playButton = &CreateWidget(EDITOR_CONTEXT(editorResources)->GetTexture("Play")->GetTexture().GetID(), OvMaths::FVector2{ 20, 20 }); - m_pauseButton = &CreateWidget(EDITOR_CONTEXT(editorResources)->GetTexture("Pause")->GetTexture().GetID(), OvMaths::FVector2{ 20, 20 }); - m_stopButton = &CreateWidget(EDITOR_CONTEXT(editorResources)->GetTexture("Stop")->GetTexture().GetID(), OvMaths::FVector2{ 20, 20 }); - m_nextButton = &CreateWidget(EDITOR_CONTEXT(editorResources)->GetTexture("Next")->GetTexture().GetID(), OvMaths::FVector2{ 20, 20 }); + auto& translate = CreateWidget(editorResources->GetTexture("Move")->GetTexture().GetID(), iconSize); + translate.lineBreak = false; + translate.ClickedEvent += []() { EDITOR_EXEC(SetGizmoOperation(OvEditor::Core::EGizmoOperation::TRANSLATE)); }; - CreateWidget(0).lineBreak = false; - auto& refreshButton = CreateWidget(EDITOR_CONTEXT(editorResources)->GetTexture("Refresh")->GetTexture().GetID(), OvMaths::FVector2{ 20, 20 }); + auto& rotate = CreateWidget(editorResources->GetTexture("Rotate")->GetTexture().GetID(), iconSize); + rotate.lineBreak = false; + rotate.ClickedEvent += []() { EDITOR_EXEC(SetGizmoOperation(OvEditor::Core::EGizmoOperation::ROTATE)); }; + + auto& scale = CreateWidget(editorResources->GetTexture("Scale")->GetTexture().GetID(), iconSize); + scale.lineBreak = false; + scale.ClickedEvent += []() { EDITOR_EXEC(SetGizmoOperation(OvEditor::Core::EGizmoOperation::SCALE)); }; + + auto updateGizmoOperation = [&translate, &rotate, &scale](Core::EGizmoOperation p_operation) { + switch (p_operation) + { + case Core::EGizmoOperation::TRANSLATE: + SetButtonState(&translate, true); + SetButtonState(&rotate, false); + SetButtonState(&scale, false); + break; + case Core::EGizmoOperation::ROTATE: + SetButtonState(&translate, false); + SetButtonState(&rotate, true); + SetButtonState(&scale, false); + break; + case Core::EGizmoOperation::SCALE: + SetButtonState(&translate, false); + SetButtonState(&rotate, false); + SetButtonState(&scale, true); + break; + } + }; + + updateGizmoOperation(EDITOR_EXEC(GetGizmoOperation())); + + EDITOR_EVENT(EditorOperationChanged) += updateGizmoOperation; + + CreateWidget().lineBreak = false; + + m_playButton = &CreateWidget(editorResources->GetTexture("Play")->GetTexture().GetID(), iconSize); + m_pauseButton = &CreateWidget(editorResources->GetTexture("Pause")->GetTexture().GetID(), iconSize); + m_stopButton = &CreateWidget(editorResources->GetTexture("Stop")->GetTexture().GetID(), iconSize); + m_nextButton = &CreateWidget(editorResources->GetTexture("Next")->GetTexture().GetID(), iconSize); + + CreateWidget(0).lineBreak = false; + auto& refreshButton = CreateWidget(editorResources->GetTexture("Refresh")->GetTexture().GetID(), iconSize); m_playButton->lineBreak = false; m_pauseButton->lineBreak = false; @@ -43,39 +95,33 @@ OvEditor::Panels::Toolbar::Toolbar m_nextButton->ClickedEvent += EDITOR_BIND(NextFrame); refreshButton.ClickedEvent += EDITOR_BIND(RefreshScripts); - EDITOR_EVENT(EditorModeChangedEvent) += [this](OvEditor::Core::EditorActions::EEditorMode p_newMode) + EDITOR_EVENT(EditorModeChangedEvent) += [this](Core::EditorActions::EEditorMode p_newMode) { - auto enable = [](OvUI::Widgets::Buttons::ButtonImage* p_button, bool p_enable) - { - p_button->disabled = !p_enable; - p_button->tint = p_enable ? OvUI::Types::Color{ 1.0f, 1.0f, 1.0f, 1.0f} : OvUI::Types::Color{1.0f, 1.0f, 1.0f, 0.15f}; - }; - switch (p_newMode) { - case OvEditor::Core::EditorActions::EEditorMode::EDIT: - enable(m_playButton, true); - enable(m_pauseButton, false); - enable(m_stopButton, false); - enable(m_nextButton, false); + case Core::EditorActions::EEditorMode::EDIT: + SetButtonState(m_playButton, true); + SetButtonState(m_pauseButton, false); + SetButtonState(m_stopButton, false); + SetButtonState(m_nextButton, false); break; - case OvEditor::Core::EditorActions::EEditorMode::PLAY: - enable(m_playButton, false); - enable(m_pauseButton, true); - enable(m_stopButton, true); - enable(m_nextButton, true); + case Core::EditorActions::EEditorMode::PLAY: + SetButtonState(m_playButton, false); + SetButtonState(m_pauseButton, true); + SetButtonState(m_stopButton, true); + SetButtonState(m_nextButton, true); break; - case OvEditor::Core::EditorActions::EEditorMode::PAUSE: - enable(m_playButton, true); - enable(m_pauseButton, false); - enable(m_stopButton, true); - enable(m_nextButton, true); + case Core::EditorActions::EEditorMode::PAUSE: + SetButtonState(m_playButton, true); + SetButtonState(m_pauseButton, false); + SetButtonState(m_stopButton, true); + SetButtonState(m_nextButton, true); break; - case OvEditor::Core::EditorActions::EEditorMode::FRAME_BY_FRAME: - enable(m_playButton, true); - enable(m_pauseButton, false); - enable(m_stopButton, true); - enable(m_nextButton, true); + case Core::EditorActions::EEditorMode::FRAME_BY_FRAME: + SetButtonState(m_playButton, true); + SetButtonState(m_pauseButton, false); + SetButtonState(m_stopButton, true); + SetButtonState(m_nextButton, true); break; } }; From 9d261a2e8b8667c9517465819bf8bd86bfba5ca6 Mon Sep 17 00:00:00 2001 From: Adrien GIVRY Date: Sat, 10 May 2025 20:36:42 -0400 Subject: [PATCH 2/3] Code cleanup --- .../OvEditor/src/OvEditor/Panels/Toolbar.cpp | 88 ++++++------------- 1 file changed, 26 insertions(+), 62 deletions(-) diff --git a/Sources/Overload/OvEditor/src/OvEditor/Panels/Toolbar.cpp b/Sources/Overload/OvEditor/src/OvEditor/Panels/Toolbar.cpp index 6e2e36043..46b46d8aa 100644 --- a/Sources/Overload/OvEditor/src/OvEditor/Panels/Toolbar.cpp +++ b/Sources/Overload/OvEditor/src/OvEditor/Panels/Toolbar.cpp @@ -15,10 +15,11 @@ namespace { - void SetButtonState(OvUI::Widgets::Buttons::ButtonImage* p_button, bool p_enable) + OvUI::Types::Color GetButtonTint(bool p_selected) { - p_button->disabled = !p_enable; - p_button->tint = p_enable ? OvUI::Types::Color{ 1.0f, 1.0f, 1.0f, 1.0f } : OvUI::Types::Color{ 1.0f, 1.0f, 1.0f, 0.15f }; + return p_selected ? + OvUI::Types::Color::Yellow : + OvUI::Types::Color::White; } } @@ -49,24 +50,10 @@ OvEditor::Panels::Toolbar::Toolbar scale.ClickedEvent += []() { EDITOR_EXEC(SetGizmoOperation(OvEditor::Core::EGizmoOperation::SCALE)); }; auto updateGizmoOperation = [&translate, &rotate, &scale](Core::EGizmoOperation p_operation) { - switch (p_operation) - { - case Core::EGizmoOperation::TRANSLATE: - SetButtonState(&translate, true); - SetButtonState(&rotate, false); - SetButtonState(&scale, false); - break; - case Core::EGizmoOperation::ROTATE: - SetButtonState(&translate, false); - SetButtonState(&rotate, true); - SetButtonState(&scale, false); - break; - case Core::EGizmoOperation::SCALE: - SetButtonState(&translate, false); - SetButtonState(&rotate, false); - SetButtonState(&scale, true); - break; - } + using enum Core::EGizmoOperation; + translate.tint = GetButtonTint(p_operation == TRANSLATE); + rotate.tint = GetButtonTint(p_operation == ROTATE); + scale.tint = GetButtonTint(p_operation == SCALE); }; updateGizmoOperation(EDITOR_EXEC(GetGizmoOperation())); @@ -83,47 +70,24 @@ OvEditor::Panels::Toolbar::Toolbar CreateWidget(0).lineBreak = false; auto& refreshButton = CreateWidget(editorResources->GetTexture("Refresh")->GetTexture().GetID(), iconSize); - m_playButton->lineBreak = false; - m_pauseButton->lineBreak = false; - m_stopButton->lineBreak = false; - m_nextButton->lineBreak = false; - refreshButton.lineBreak = false; - - m_playButton->ClickedEvent += EDITOR_BIND(StartPlaying); - m_pauseButton->ClickedEvent += EDITOR_BIND(PauseGame); - m_stopButton->ClickedEvent += EDITOR_BIND(StopPlaying); - m_nextButton->ClickedEvent += EDITOR_BIND(NextFrame); - refreshButton.ClickedEvent += EDITOR_BIND(RefreshScripts); - - EDITOR_EVENT(EditorModeChangedEvent) += [this](Core::EditorActions::EEditorMode p_newMode) - { - switch (p_newMode) - { - case Core::EditorActions::EEditorMode::EDIT: - SetButtonState(m_playButton, true); - SetButtonState(m_pauseButton, false); - SetButtonState(m_stopButton, false); - SetButtonState(m_nextButton, false); - break; - case Core::EditorActions::EEditorMode::PLAY: - SetButtonState(m_playButton, false); - SetButtonState(m_pauseButton, true); - SetButtonState(m_stopButton, true); - SetButtonState(m_nextButton, true); - break; - case Core::EditorActions::EEditorMode::PAUSE: - SetButtonState(m_playButton, true); - SetButtonState(m_pauseButton, false); - SetButtonState(m_stopButton, true); - SetButtonState(m_nextButton, true); - break; - case Core::EditorActions::EEditorMode::FRAME_BY_FRAME: - SetButtonState(m_playButton, true); - SetButtonState(m_pauseButton, false); - SetButtonState(m_stopButton, true); - SetButtonState(m_nextButton, true); - break; - } + m_playButton->lineBreak = false; + m_pauseButton->lineBreak = false; + m_stopButton->lineBreak = false; + m_nextButton->lineBreak = false; + refreshButton.lineBreak = false; + + m_playButton->ClickedEvent += EDITOR_BIND(StartPlaying); + m_pauseButton->ClickedEvent += EDITOR_BIND(PauseGame); + m_stopButton->ClickedEvent += EDITOR_BIND(StopPlaying); + m_nextButton->ClickedEvent += EDITOR_BIND(NextFrame); + refreshButton.ClickedEvent += EDITOR_BIND(RefreshScripts); + + EDITOR_EVENT(EditorModeChangedEvent) += [this](Core::EditorActions::EEditorMode p_mode) { + using enum Core::EditorActions::EEditorMode; + m_playButton->disabled = !(p_mode == EDIT || p_mode == FRAME_BY_FRAME || p_mode == PAUSE); + m_pauseButton->disabled = !(p_mode == PLAY); + m_stopButton->disabled = !(p_mode == PLAY || p_mode == FRAME_BY_FRAME || p_mode == PAUSE); + m_nextButton->disabled = !(p_mode == PLAY || p_mode == FRAME_BY_FRAME || p_mode == PAUSE); }; EDITOR_EXEC(SetEditorMode(OvEditor::Core::EditorActions::EEditorMode::EDIT)); From 5cd782dc14548e23844a9511031d93e7d2a3f4a6 Mon Sep 17 00:00:00 2001 From: Adrien GIVRY Date: Sat, 10 May 2025 20:38:41 -0400 Subject: [PATCH 3/3] Updated scale icon --- Resources/Editor/Textures/Scale.png | Bin 1708 -> 1987 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/Editor/Textures/Scale.png b/Resources/Editor/Textures/Scale.png index cb53d0ae46ca407b0f96f6f338451b4823533012..fb08552b21d8a013be16ad3ce7341ed18852bf08 100644 GIT binary patch delta 1729 zcmV;y20r<$4Z{zRNeaOL01m+cxRGn^kyCaF*>(W{=mP)%*^$y;e`~td85!?iq*@=Hdb{buX zE&}r>xXH^1i4u~4=t3kIa3Lx#j3yc~Gu{2Um~-0G)ps75^y8ZTps4%!s&1WgtIj!9 zw=Nn)$MYX0wE!f|e|Ubx@2w<$+w=X-ne}{c;skN0W*HSBi##Z^L!3ydYbiX zQ7+I-dC9%gbMut1%@$=yc_5yZxpRIk+L#ft%=q(qN-#-Ef5Kk@E&$tspMZDFtRt!E z`61wK;Lp^kE^rs{o|&DI)H1WSq&>i=#TyCk88dq?dZ3wgB^?G9fNRBzX#fY!>~gAm z0XST6JHS1_qM3b=+S~+=0=t2KfO+8Fp3FWjmVHPZOAqdYqiaN>VjuxVNGvKxJ~E{ku}Fko#8^Phi*9x)`F$6ffu|jdO(#e z@axU&Wd?e{S_SI@e_{JP2Iv+t2xtKp%k$$4*^dA*TV~BoOg2Vyg>MNNju$&%jW`}lp>ya)ww-ek-Wh9B(EAk z8(4DQpHZO3FyMi79B`= zQSVB`+Q5ZhapBLpz)K#_|C)xwW^6#nI14n*S90W){o+&F+PJ|A;b&d=Ie(jv11|%g z0KfZ`_;oY;at$}Q06gTqXHZe=O(n;Tw5&BRe`(1**A35?Bt7T%cSyR=UF5DJy6vG- zHc7K7<%!YQAgSr86~22D!q5Bt^#Y;+_%nJkm-lOdwD`G^@S!BjsjP23n6J3X4aik9 zyIhh+3Ga2U0C%`?yW-=wYRoSKFPYheunlE>8^M?AcDNTXT&sc8P8xZ9kV4x#C0$Ex ze>f}Yi4@kZ`Q~p1DHJ}Pp4Ag{(s96F>G)CLw0otYz4?S32lTDJP7>k2JHR8rPIpst zK37>7lJEnlivj`-w?|#?0at)$&Fs8~!9x|Enufxb0+hdjk0rhAVel{}Yqbo8qfuS& z0i@xu&p%{P8M)m&`aIB;?p8r>37 zY`z`%3V7J9er{72xEpw@T;duQEV)8s^}E1W?SRJv5d@Wxx9f(Pwac4Zfy-;rn+6on zPahq|t?0mj0!qRpuu=Rz%Bi`-zxCn%Vo38sq8-@htxgzt3H4!?e0Te_-7B z+RR>@kOIyD&&Tx~2z5pr2z5NB$F)BxT=RSx=#)L6?Sys56S0bjGb;?GdtCRcJtg|r@U zD$86pAV|$}nQ4nD>aWwP}ehk=CR^DcHoV3lXJA@QL$KS~f zRidJ7FJ)fL>Pk*ZDwW{Ze`9mSKc24uUDM!?lNWs_^|}q-B+OTrXMq>ICp7Y^Fy6pP z{x})vrsGke{CT>WHb#C`a5J8APV65%P!bY8bx!OdY^5J80zFx?rsIog{!%o|RE4~7 z8efZ+E6SDSqdRAA{Pb}>@d8&pUrD_kDvXoGG;suJBSc%O%9VyKAI__|rA+x+v#jf1 Xh?%cJDcTO$00000NkvXXu0mjftdmaY delta 1448 zcmV;Z1y}mR53CK4NeaRM01m_tyqS5OTHw8Ja&zaMIrrRizvs@( z{q4~m7oL6nVBS6 zD-rO9B%8oiU@_Mzf|*^(WjRU-2$jAKybN6P1`1fn^<6#+{0dB(*>93MW>(ADG9(+4 zwgYE?9l)&;-$z`&2y6u2GqWR&gOR$9q;W~t)f@-C{77!Qe<_j;NeA;vYT$b6y=9L> zp)f>$9JmNf0P{c>_!IaP*pl@G0qcQtz*}ZE-Vl+0d6~6_q!%U4XTHu=^?*WT1kAdzKe7s5cbzdwT}dOJx{WHU z2}xE^&zRqPe=Yd6AnB4{&$dCpUvBIjXIYXKJwM`l-Q31%Bh@KsD)Z@(`zrUnH3Ck# zEU~?2B=l%}>XoPbcdG=P4EOVj|2GnPH2z4?Iq9vf`w}vAt z{{H6(c+C3@6YO(iaunzAGyw~qzRW5641#78RmR!kB{((BQPKBb!351lq5~O0P}Pc_z5^|W;1w{o$S3p$IQM=b%yfM z=MBJ1z!zqAq3=mqS+^-d>VAHm9*s@mo7@jRk+eD5%RDCLrN)&#waC`1K7lQ=Q}s9su8l&)8$0 zf47RZ2}m!sQO|FA>KCzmvf1-R+!SpSaL-{#KrR?G3<<~ugN7jixnR)HHUVjr7Qfx; z``r&>`J0~K6C=Tko^Ju3@$2;kL*ByVTWkQ&x{YY_?nRgk?Fy5a3%)?n2$D8<*@Rs# zU#+0EgD@RV3zLb2NlDv$y4x#lbKThZe)z)*tZGrT3%me)=OtUHGeCg^=KS(f7z0) zuMq9DX(4wMh4uY@Am1bK>wUp~+I%VV<(TW8jctj#2~}^@t$rp4KbZkxJ{}@71xzP- z=vhkZ`%Xrk&5@+n@d&5-VgsfnO{IN_AWyo<*B#!5W(cee{MOiTbF_ef!QLKsd6@&N z*7$@f68zq(5HRpZWCr$-R5~Vie`!#U$=%lnB@2aG*-_c=fj7&B%}o(}>8{mL*}*$3 z%~Ix%1FtkVF8_-km;b%*lNkZoarx80qYaMBziVc%_KJRyk!46M)0A002ov22Mn-LSTY^ C>%^e|