123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
- #include <QPainter>
- #include <AzCore/Serialization/EditContext.h>
- #include <AzCore/Serialization/SerializeContext.h>
- #include <Components/BookmarkAnchor/BookmarkAnchorComponent.h>
- #include <GraphCanvas/Editor/AssetEditorBus.h>
- #include <GraphCanvas/Utils/ConversionUtils.h>
- #include <GraphCanvas/Utils/ColorUtils.h>
- namespace GraphCanvas
- {
- ////////////////////////////
- // BookmarkAnchorComponent
- ////////////////////////////
- void BookmarkAnchorComponent::Reflect(AZ::ReflectContext* reflectContext)
- {
- AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(reflectContext);
- if (serializeContext)
- {
- serializeContext->Class<BookmarkAnchorComponentSaveData>()
- ->Version(3)
- ->Field("QuickIndex", &BookmarkAnchorComponentSaveData::m_shortcut)
- ->Field("Name", &BookmarkAnchorComponentSaveData::m_bookmarkName)
- ->Field("Color", &BookmarkAnchorComponentSaveData::m_color)
- ->Field("Position", &BookmarkAnchorComponentSaveData::m_position)
- ->Field("Dimension", &BookmarkAnchorComponentSaveData::m_dimension)
- ;
- serializeContext->Class<BookmarkAnchorComponent, GraphCanvasPropertyComponent>()
- ->Version(1)
- ->Field("SaveData", &BookmarkAnchorComponent::m_saveData)
- ;
- AZ::EditContext* editContext = serializeContext->GetEditContext();
- if (editContext)
- {
- editContext->Class<BookmarkAnchorComponentSaveData>("BookmarkAnchorComponent", "The Save data utilized by the BookmarkAnchorComponent")
- ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
- ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)
- ->DataElement(AZ::Edit::UIHandlers::Default, &BookmarkAnchorComponentSaveData::m_bookmarkName, "Bookmark Name", "The name associated with the given Bookmark Anchor")
- ->Attribute(AZ::Edit::Attributes::ChangeNotify, &BookmarkAnchorComponentSaveData::OnBookmarkNameChanged)
- ->DataElement(AZ::Edit::UIHandlers::Default, &BookmarkAnchorComponentSaveData::m_color, "Color", "The color associated with the given Bookmark Anchor")
- ->Attribute(AZ::Edit::Attributes::ChangeNotify, &BookmarkAnchorComponentSaveData::OnBookmarkColorChanged)
- ;
- editContext->Class<BookmarkAnchorComponent>("BookmarkAnchorComponent", "The Save data utilized by the BookmarkAnchorComponent")
- ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
- ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)
- ->DataElement(AZ::Edit::UIHandlers::Default, &BookmarkAnchorComponent::m_saveData, "Save Data", "Save Data")
- ;
- }
- }
- }
- BookmarkAnchorComponent::BookmarkAnchorComponent()
- : m_saveData(this)
- {
- }
- void BookmarkAnchorComponent::Init()
- {
- GraphCanvasPropertyComponent::Init();
- }
- void BookmarkAnchorComponent::Activate()
- {
- GraphCanvasPropertyComponent::Activate();
- BookmarkRequestBus::Handler::BusConnect(GetEntityId());
- SceneMemberNotificationBus::Handler::BusConnect(GetEntityId());
- EntitySaveDataRequestBus::Handler::BusConnect(GetEntityId());
- }
- void BookmarkAnchorComponent::Deactivate()
- {
- GraphCanvasPropertyComponent::Deactivate();
- EntitySaveDataRequestBus::Handler::BusDisconnect();
- SceneMemberNotificationBus::Handler::BusDisconnect();
- BookmarkRequestBus::Handler::BusDisconnect();
- SceneBookmarkRequestBus::Handler::BusDisconnect();
- }
- void BookmarkAnchorComponent::OnSceneSet(const AZ::EntityId& sceneId)
- {
- BookmarkManagerRequestBus::Event(sceneId, &BookmarkManagerRequests::RegisterBookmark, GetEntityId());
- SceneBookmarkRequestBus::Handler::BusConnect(sceneId);
- if (m_saveData.m_bookmarkName.empty())
- {
- EditorId editorId;
- SceneRequestBus::EventResult(editorId, sceneId, &SceneRequests::GetEditorId);
- AZ::u32 bookmarkId = 0;
- SceneBookmarkActionBus::EventResult(bookmarkId, sceneId, &SceneBookmarkActions::GetNewBookmarkCounter);
- m_saveData.m_bookmarkName = AZStd::string::format("Bookmark #%u", bookmarkId);
- AZ::EntityId viewId;
- SceneRequestBus::EventResult(viewId, sceneId, &SceneRequests::GetViewId);
- QRectF viewport;
- ViewRequestBus::EventResult(viewport, viewId, &ViewRequests::GetViewableAreaInSceneCoordinates);
- m_saveData.SetVisibleArea(viewport);
- }
- }
- void BookmarkAnchorComponent::OnRemovedFromScene(const AZ::EntityId& sceneId)
- {
- SceneBookmarkRequestBus::Handler::BusDisconnect(sceneId);
- BookmarkManagerRequestBus::Event(sceneId, &BookmarkManagerRequests::UnregisterBookmark, GetEntityId());
- }
- void BookmarkAnchorComponent::OnSceneMemberDeserialized(const AZ::EntityId& graphId, const GraphSerialization&)
- {
- AZ::EntityId conflictId;
- BookmarkManagerRequestBus::EventResult(conflictId, graphId, &BookmarkManagerRequests::FindBookmarkForShortcut, m_saveData.m_shortcut);
- if (m_saveData.m_shortcut < 0 || conflictId.IsValid())
- {
- // If we have a conflict. We're going to copy the 'spirit' of the bookmark
- // Rather then the actual bookmark.
- //
- // This means we will re-randomize the color, assign a new shortcut, and a default name
- // If we do not have a shortcut, we'll do this anyway since we can't be sure what state we are currently in.
- m_saveData.m_shortcut = k_findShortcut;
- m_saveData.m_color = ColorUtils::GetRandomColor();
- AZ::u32 bookmarkId = 0;
- SceneBookmarkActionBus::EventResult(bookmarkId, graphId, &SceneBookmarkActions::GetNewBookmarkCounter);
- m_saveData.m_bookmarkName = AZStd::string::format("Bookmark #%u", bookmarkId);
- }
- }
- AZ::EntityId BookmarkAnchorComponent::GetBookmarkId() const
- {
- return GetEntityId();
- }
- void BookmarkAnchorComponent::RemoveBookmark()
- {
- AZ::EntityId graphId;
- SceneMemberRequestBus::EventResult(graphId, GetEntityId(), &SceneMemberRequests::GetScene);
- if (graphId.IsValid())
- {
- AZStd::unordered_set<AZ::EntityId> deleteIds = { GetEntityId() };
- SceneRequestBus::Event(graphId, &SceneRequests::Delete, deleteIds);
- }
- }
- int BookmarkAnchorComponent::GetShortcut() const
- {
- return m_saveData.m_shortcut;
- }
- void BookmarkAnchorComponent::SetShortcut(int shortcut)
- {
- m_saveData.m_shortcut = shortcut;
- }
- AZStd::string BookmarkAnchorComponent::GetBookmarkName() const
- {
- return m_saveData.m_bookmarkName;
- }
- void BookmarkAnchorComponent::SetBookmarkName(const AZStd::string& bookmarkName)
- {
- m_saveData.m_bookmarkName = bookmarkName;
- OnBookmarkNameChanged();
- }
- QRectF BookmarkAnchorComponent::GetBookmarkTarget() const
- {
- AZ::EntityId graphId;
- SceneMemberRequestBus::EventResult(graphId, GetEntityId(), &SceneMemberRequests::GetScene);
- EditorId editorId;
- SceneRequestBus::EventResult(editorId, graphId, &SceneRequests::GetEditorId);
- bool trackVisibleArea = false;
- AssetEditorSettingsRequestBus::EventResult(trackVisibleArea, editorId, &AssetEditorSettingsRequests::IsBookmarkViewportControlEnabled);
- QGraphicsItem* graphicsItem;
- SceneMemberUIRequestBus::EventResult(graphicsItem, GetEntityId(), &SceneMemberUIRequests::GetRootGraphicsItem);
- if (trackVisibleArea && m_saveData.HasVisibleArea())
- {
- return m_saveData.GetVisibleArea(graphicsItem->pos());
- }
- else
- {
- return graphicsItem->sceneBoundingRect();
- }
- }
- QColor BookmarkAnchorComponent::GetBookmarkColor() const
- {
- return ConversionUtils::AZToQColor(m_saveData.m_color);
- }
- void BookmarkAnchorComponent::WriteSaveData(EntitySaveDataContainer& saveDataContainer) const
- {
- BookmarkAnchorComponentSaveData* saveData = saveDataContainer.FindCreateSaveData<BookmarkAnchorComponentSaveData>();
- if (saveData)
- {
- (*saveData) = m_saveData;
- }
- }
- void BookmarkAnchorComponent::ReadSaveData(const EntitySaveDataContainer& saveDataContainer)
- {
- const BookmarkAnchorComponentSaveData* saveData = saveDataContainer.FindSaveDataAs<BookmarkAnchorComponentSaveData>();
- if (saveData)
- {
- m_saveData = (*saveData);
- }
- }
- void BookmarkAnchorComponent::OnBookmarkNameChanged()
- {
- BookmarkNotificationBus::Event(GetEntityId(), &BookmarkNotifications::OnBookmarkNameChanged);
- }
- void BookmarkAnchorComponent::OnBookmarkColorChanged()
- {
- BookmarkNotificationBus::Event(GetEntityId(), &BookmarkNotifications::OnBookmarkColorChanged);
- }
- }
|