Files
o3de/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserComponent.h
T
Steve Pham b4a2edec6a Final update copyright headers to reference license files at the repo root (#1693)
* Final update copyright headers to reference license files at the repo root

Signed-off-by: spham <spham@amazon.com>

* Fix copyright validator unit tests to support the stale O3DE header scenario

Signed-off-by: spham <spham@amazon.com>
2021-06-30 19:51:55 -07:00

138 lines
6.0 KiB
C++

/*
* 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
*
*/
#pragma once
#include <AzCore/std/smart_ptr/unique_ptr.h>
#include <AzCore/std/smart_ptr/shared_ptr.h>
#include <AzCore/std/parallel/binary_semaphore.h>
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/Component/Component.h>
#include <AzCore/Component/TickBus.h>
#include <AzFramework/Asset/AssetCatalogBus.h>
#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h>
#include <AzToolsFramework/API/EditorAssetSystemAPI.h>
#include <AzFramework/Network/SocketConnection.h>
#include <AzQtComponents/Components/StyledBusyLabel.h>
namespace AzToolsFramework
{
namespace AssetDatabase
{
class AssetDatabaseConnection;
}
namespace AssetBrowser
{
class AssetBrowserModel;
class SourceAssetBrowserEntry;
class FolderAssetBrowserEntry;
class RootAssetBrowserEntry;
class AssetEntryChangeset;
//! AssetBrowserComponent caches database entries
/*!
Database entries are cached so that they can be quickly accessed by asset browser views.
Additionally this class watches for any changes to the database and updates the views if such changes happen
*/
class AssetBrowserComponent
: public AZ::Component
, public AssetBrowserComponentRequestBus::Handler
, public AssetDatabaseLocationNotificationBus::Handler
, public AzFramework::AssetCatalogEventBus::Handler
, public AZ::TickBus::Handler
, public AssetSystemBus::Handler
, public AssetBrowserInteractionNotificationBus::Handler
{
public:
AZ_COMPONENT(AssetBrowserComponent, "{4BC5F93F-2F9E-412E-B00A-396C68CFB5FB}")
AssetBrowserComponent();
virtual ~AssetBrowserComponent();
//////////////////////////////////////////////////////////////////////////
// AZ::Component
//////////////////////////////////////////////////////////////////////////
void Activate() override;
void Deactivate() override;
static void Reflect(AZ::ReflectContext* context);
static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& services);
static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required);
static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible);
//////////////////////////////////////////////////////////////////////////
// AssetDatabaseLocationNotificationBus
//////////////////////////////////////////////////////////////////////////
void OnDatabaseInitialized() override;
//////////////////////////////////////////////////////////////////////////
// AssetBrowserComponentRequestBus
//////////////////////////////////////////////////////////////////////////
AssetBrowserModel* GetAssetBrowserModel() override;
bool AreEntriesReady() override;
void PickAssets(AssetSelectionModel& selection, QWidget* parent) override;
AzQtComponents::StyledBusyLabel* GetStyledBusyLabel() override;
//////////////////////////////////////////////////////////////////////////
// AssetCatalogEventBus
//////////////////////////////////////////////////////////////////////////
void OnCatalogAssetAdded(const AZ::Data::AssetId& assetId) override;
void OnCatalogAssetChanged(const AZ::Data::AssetId& assetId) override;
void OnCatalogAssetRemoved(const AZ::Data::AssetId& assetId, const AZ::Data::AssetInfo& assetInfo) override;
//////////////////////////////////////////////////////////////////////////
// TickBus
//////////////////////////////////////////////////////////////////////////
void OnTick(float deltaTime, AZ::ScriptTimePoint time) override;
//////////////////////////////////////////////////////////////////////////
// AssetSystemBus
//////////////////////////////////////////////////////////////////////////
void SourceFileChanged(AZStd::string relativePath, AZStd::string scanFolder, AZ::Uuid sourceUuid) override;
//////////////////////////////////////////////////////////////////////////
// AssetBrowserInteractionNotificationBus
SourceFileDetails GetSourceFileDetails(const char* fullSourceFileName) override;
//////////////////////////////////////////////////////////////////////////
void AddFile(const AZ::s64& fileId);
void RemoveFile(const AZ::s64& fileId);
void PopulateAssets();
void UpdateAssets();
private:
AZStd::shared_ptr<AssetDatabase::AssetDatabaseConnection> m_databaseConnection;
AZStd::shared_ptr<RootAssetBrowserEntry> m_rootEntry;
AZStd::binary_semaphore m_updateWait;
AZStd::thread m_thread;
//! wait until database is ready
bool m_dbReady;
//! have entries been populated yet
bool m_entriesReady = false;
//! is query waiting for more update requests
AZStd::atomic_bool m_waitingForMore;
//! should the query thread stop
AZStd::atomic_bool m_disposed;
AZStd::unique_ptr<AssetBrowserModel> m_assetBrowserModel;
AZStd::shared_ptr<AssetEntryChangeset> m_changeset;
AzFramework::SocketConnection::TMessageCallbackHandle m_cbHandle = 0;
//! Notify to start the query thread
void NotifyUpdateThread();
void HandleFileInfoNotification(const void* buffer, unsigned int bufferSize);
AzQtComponents::StyledBusyLabel* m_styledBusyLabel;
};
}
} // namespace AssetBrowser