You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
6.0 KiB
C++
139 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
|