Ensure SnapToGrid only appears when GridSnapping is enabled LYN-2302 (#1362)

* updates to better support showing/hiding viewport ui when grid snapping is enabled/disabled

* connect up editor settings callbacks

* minor polish changes

* api rename

* updates following review feedback
This commit is contained in:
Tom Hulton-Harrop
2021-06-17 18:31:56 +01:00
committed by GitHub
parent f0da36a301
commit 8ffd16b0be
7 changed files with 102 additions and 2 deletions
@@ -14,6 +14,7 @@
#include <AzCore/Casting/numeric_cast.h>
#include <AzCore/Settings/SettingsRegistry.h>
#include <AzCore/Settings/SettingsRegistryMergeUtils.h>
#include <AzCore/std/string/string_view.h>
namespace SandboxEditor
@@ -56,6 +57,39 @@ namespace SandboxEditor
return value;
}
struct EditorViewportSettingsCallbacksImpl : public EditorViewportSettingsCallbacks
{
EditorViewportSettingsCallbacksImpl()
{
if (auto* registry = AZ::SettingsRegistry::Get())
{
using AZ::SettingsRegistryMergeUtils::IsPathAncestorDescendantOrEqual;
m_notifyEventHandler = registry->RegisterNotifier(
[this](const AZStd::string_view path, [[maybe_unused]] const AZ::SettingsRegistryInterface::Type type)
{
if (IsPathAncestorDescendantOrEqual(GridSnappingSetting, path))
{
m_gridSnappingChanged.Signal(GridSnappingEnabled());
}
});
}
}
void SetGridSnappingChangedEvent(GridSnappingChangedEvent::Handler& handler) override
{
handler.Connect(m_gridSnappingChanged);
}
GridSnappingChangedEvent m_gridSnappingChanged;
AZ::SettingsRegistryInterface::NotifyEventHandler m_notifyEventHandler;
};
AZStd::unique_ptr<EditorViewportSettingsCallbacks> CreateEditorViewportSettingsCallbacks()
{
return AZStd::make_unique<EditorViewportSettingsCallbacksImpl>();
}
bool GridSnappingEnabled()
{
return GetRegistry(GridSnappingSetting, false);
@@ -14,8 +14,27 @@
#include <SandboxAPI.h>
#include <AzCore/Settings/SettingsRegistry.h>
#include <AzCore/std/smart_ptr/unique_ptr.h>
namespace SandboxEditor
{
using GridSnappingChangedEvent = AZ::Event<bool>;
//! Set callbacks to listen for editor settings change events.
class EditorViewportSettingsCallbacks
{
public:
virtual ~EditorViewportSettingsCallbacks() = default;
virtual void SetGridSnappingChangedEvent(GridSnappingChangedEvent::Handler& handler) = 0;
};
//! Create an instance of EditorViewportSettingsCallbacks
//! Note: EditorViewportSettingsCallbacks is implemented in EditorViewportSettings.cpp - a change
//! event will fire when a value in the settings registry (editorpreferences.setreg) is modified.
SANDBOX_API AZStd::unique_ptr<EditorViewportSettingsCallbacks> CreateEditorViewportSettingsCallbacks();
SANDBOX_API bool GridSnappingEnabled();
SANDBOX_API void SetGridSnapping(bool enabled);
+11 -1
View File
@@ -76,7 +76,6 @@
#include "EditorPreferencesPageGeneral.h"
#include "ViewportManipulatorController.h"
#include "LegacyViewportCameraController.h"
#include "EditorViewportSettings.h"
#include "ViewPane.h"
#include "CustomResolutionDlg.h"
@@ -1450,6 +1449,17 @@ void EditorViewportWidget::SetViewportId(int id)
{
SetAsActiveViewport();
}
m_editorViewportSettingsCallbacks = SandboxEditor::CreateEditorViewportSettingsCallbacks();
m_gridSnappingHandler = SandboxEditor::GridSnappingChangedEvent::Handler(
[id](const bool snapping)
{
AzToolsFramework::ViewportInteraction::ViewportSettingsNotificationBus::Event(
id, &AzToolsFramework::ViewportInteraction::ViewportSettingsNotificationBus::Events::OnGridSnappingChanged, snapping);
});
m_editorViewportSettingsCallbacks->SetGridSnappingChangedEvent(m_gridSnappingHandler);
}
void EditorViewportWidget::ConnectViewportInteractionRequestBus()
@@ -24,6 +24,7 @@
#include "Objects/DisplayContext.h"
#include "Undo/Undo.h"
#include "Util/PredefinedAspectRatios.h"
#include "EditorViewportSettings.h"
#include <AzCore/Component/EntityId.h>
#include <AzCore/std/optional.h>
@@ -571,6 +572,9 @@ private:
AzFramework::EntityVisibilityQuery m_entityVisibilityQuery;
SandboxEditor::GridSnappingChangedEvent::Handler m_gridSnappingHandler;
AZStd::unique_ptr<SandboxEditor::EditorViewportSettingsCallbacks> m_editorViewportSettingsCallbacks;
QSet<int> m_keyDown;
bool m_freezeViewportInput = false;