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.
o3de/Code/Sandbox/Editor/Material/MaterialBrowser.h

249 lines
7.4 KiB
C++

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
// Original file Copyright Crytek GMBH or its affiliates, used under license.
#ifndef CRYINCLUDE_EDITOR_MATERIAL_MATERIALBROWSER_H
#define CRYINCLUDE_EDITOR_MATERIAL_MATERIALBROWSER_H
#pragma once
#if !defined(Q_MOC_RUN)
#include "Include/IDataBaseManager.h"
#include "Material/Material.h"
#include "Material/MaterialBrowserFilterModel.h"
#include <QMenu>
#include <QDateTime>
#include <QModelIndex>
#include <ISourceControl.h>
#include <AzToolsFramework/AssetBrowser/Search/Filter.h>
#endif
class CMaterial;
class MaterialBrowserWidget;
class CMaterialImageListCtrl;
class QMaterialImageListModel;
class QTreeView;
class QAction;
struct IDataBaseItem;
class CMaterialBrowserRecord;
typedef std::vector<CMaterialBrowserRecord> TMaterialBrowserRecords;
namespace AzToolsFramework
{
namespace AssetBrowser
{
class AssetBrowserModel;
class AssetBrowserFilterModel;
class AssetTypeFilter;
}
}
enum ESccFileAttributes;
namespace Ui
{
class MaterialBrowser;
}
//////////////////////////////////////////////////////////////////////////
struct IMaterialBrowserListener
{
virtual void OnBrowserSelectItem(IDataBaseItem* pItem, bool bForce) = 0;
};
//////////////////////////////////////////////////////////////////////////
// MaterialBrowserWidget
//////////////////////////////////////////////////////////////////////////
class MaterialBrowserFilterModel;
class MaterialBrowserWidget
: public QWidget
, public IDataBaseManagerListener
, public IEditorNotifyListener
, public MaterialBrowserWidgetBus::Handler
{
Q_OBJECT
public:
enum EViewType
{
VIEW_LEVEL = 0,
VIEW_ALL = 1,
};
enum EFilter
{
eFilter_Materials = 0x01,
eFilter_Textures = 0x02,
eFilter_Materials_And_Textures = 0x03,
eFilter_Submaterials = 0x04
};
MaterialBrowserWidget(QWidget* parent);
~MaterialBrowserWidget();
void SetListener(IMaterialBrowserListener* pListener) { m_pListener = pListener; }
EViewType GetViewType() const { return m_viewType; };
void ClearItems();
void SelectItem(IDataBaseItem* pItem, IDataBaseItem* pParentItem);
void DeleteItem();
void PopulateItems();
void StartRecordUpdateJobs();
bool ShowCheckedOutRecursive(TMaterialBrowserRecords* pRecords);
void ShowOnlyLevelMaterials(bool levelOnly);
void OnCopy();
void OnCopyName();
void OnPaste();
void OnCut();
void OnDuplicate();
void OnAddNewMaterial();
void OnAddNewMultiMaterial();
void OnConvertToMulti();
void OnMergeMaterials();
public slots:
void OnSelectionChanged();
void OnSubMaterialSelectedInPreviewPane(const QModelIndex& current);
void SaveCurrentMaterial();
void OnRefreshSelection();
void OnMaterialAdded();
signals:
void refreshSelection();
void materialAdded();
public:
void OnUpdateShowCheckedOut();
bool CanPaste() const;
void SetImageListCtrl(CMaterialImageListCtrl* pCtrl);
//////////////////////////////////////////////////////////////////////////
// IDataBaseManagerListener implementation.
//////////////////////////////////////////////////////////////////////////
virtual void OnDataBaseItemEvent(IDataBaseItem* pItem, EDataBaseItemEvent event);
//////////////////////////////////////////////////////////////////////////
virtual void OnEditorNotifyEvent(EEditorNotifyEvent event);
void AddContextMenuActionsSingleSelection(QMenu &menu, _smart_ptr<CMaterial> material) const;
void OnContextMenuAction(int command, _smart_ptr<CMaterial> material);
// MaterialBrowserWidgetBus event handlers
void MaterialAddFinished() override;
void MaterialFinishedProcessing(_smart_ptr<CMaterial> material, const QPersistentModelIndex &filterModelIndex) override;
void MaterialRecordUpdateFinished() override;
protected:
// Item definition.
enum ESourceControlOp
{
ESCM_IMPORT,
ESCM_CHECKOUT,
ESCM_UNDO_CHECKOUT,
ESCM_GETLATEST,
ESCM_GETLATESTTEXTURES,
};
void DeleteItem(const CMaterialBrowserRecord &record);
void SetSelectedItem(_smart_ptr<CMaterial> material, const TMaterialBrowserRecords* pMarkedRecords, bool selectInTreeView);
void OnAddSubMtl();
void OnSelectAssignedObjects();
void OnAssignMaterialToSelection();
void OnRenameItem();
void OnResetItem();
void OnSetSubMtlCount(const CMaterialBrowserRecord &record);
void DoSourceControlOp(CMaterialBrowserRecord &record, ESourceControlOp);
void OnMakeSubMtlSlot(const CMaterialBrowserRecord &record);
void OnClearSubMtlSlot(_smart_ptr<CMaterial> subMaterial);
void SetSubMaterial(_smart_ptr<CMaterial> parentMaterial, int slot, _smart_ptr<CMaterial> subMaterial);
void OnSaveToFile(bool bMulti);
void RefreshSelected();
void TickRefreshMaterials();
void TryLoadRecordMaterial(CMaterialBrowserRecord &record);
void ShowContextMenu(const CMaterialBrowserRecord &record, const QPoint& point);
_smart_ptr<CMaterial> GetCurrentMaterial();
uint32 MaterialNameToCrc32(const QString& str);
bool TryGetSelectedRecord(CMaterialBrowserRecord &record);
AZStd::string GetSelectedMaterialID();
private:
void expandAllNotMatchingIndexes(const QModelIndex& parent = QModelIndex());
void ClearImageListControlSelection();
void ClearSelection(QMaterialImageListModel* materialModel);
QMenu *InitializeSearchMenu();
void AddContextMenuActionsMultiSelect(QMenu &menu) const;
void AddContextMenuActionsNoSelection(QMenu &menu) const;
void AddContextMenuActionsSubMaterial(QMenu &menu, _smart_ptr<CMaterial> parentMaterial, _smart_ptr<CMaterial> subMaterial) const;
void AddContextMenuActionsMultiMaterial(QMenu &menu) const;
void AddContextMenuActionsSingleMaterial(QMenu &menu) const;
void AddContextMenuActionsCommon(QMenu &menu, _smart_ptr<CMaterial> material) const;
void AddContextMenuActionsSourceControl(QMenu &menu, _smart_ptr<CMaterial> material, uint32 fileAttributes) const;
QScopedPointer<Ui::MaterialBrowser> m_ui;
AzToolsFramework::AssetBrowser::AssetBrowserModel* m_assetBrowserModel;
QSharedPointer<MaterialBrowserFilterModel> m_filterModel;
int m_selectedSubMaterialIndex = -1;
bool m_bIgnoreSelectionChange;
bool m_bItemsValid;
CMaterialManager* m_pMatMan;
IMaterialBrowserListener* m_pListener;
CMaterialImageListCtrl* m_pMaterialImageListCtrl;
EViewType m_viewType;
bool m_bNeedReload;
bool m_bHighlightMaterial;
uint32 m_timeOfHighlight;
TMaterialBrowserRecords m_markedRecords;
_smart_ptr<CMaterial> m_pLastActiveMultiMaterial;
_smart_ptr<CMaterial> m_delayedSelection;
bool m_bShowOnlyCheckedOut;
QAction* m_cutAction;
QAction* m_copyAction;
QAction* m_pasteAction;
QAction* m_duplicateAction;
QAction* m_deleteAction;
QAction* m_renameItemAction;
QAction* m_addNewMaterialAction;
};
#endif // CRYINCLUDE_EDITOR_MATERIAL_MATERIALBROWSER_H