This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

191 lines
5.7 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================
#ifndef BASEASSETPICKER_H
#define BASEASSETPICKER_H
#ifdef _WIN32
#pragma once
#endif
#include "filesystem.h"
#include "tier1/utllinkedlist.h"
#include "tier1/utlstring.h"
#include "vgui_controls/EditablePanel.h"
#include "vgui_controls/Frame.h"
//-----------------------------------------------------------------------------
// Forward declarations
//-----------------------------------------------------------------------------
class CAssetTreeView;
namespace vgui {
class Panel;
}
FORWARD_DECLARE_HANDLE(AssetList_t);
typedef unsigned short DirHandle_t;
//-----------------------------------------------------------------------------
// Purpose: Base class for choosing raw assets
//-----------------------------------------------------------------------------
class CBaseAssetPicker : public vgui::EditablePanel {
DECLARE_CLASS_SIMPLE(CBaseAssetPicker, vgui::EditablePanel);
public:
CBaseAssetPicker(vgui::Panel *pParent, const char *pAssetType,
const char *pExt, const char *pSubDir,
const char *pTextType);
~CBaseAssetPicker();
// overridden frame functions
virtual void OnTick();
virtual bool HasUserConfigSettings();
virtual void ApplyUserConfigSettings(KeyValues *pUserConfig);
virtual void GetUserConfigSettings(KeyValues *pUserConfig);
virtual void OnCommand(const char *pCommand);
// Purpose:
virtual void OnKeyCodePressed(vgui::KeyCode code);
// Returns the selected asset name
int GetSelectedAssetCount();
const char *GetSelectedAsset(int nAssetIndex = -1);
// Is multiselect enabled?
bool IsMultiselectEnabled() const;
// Sets the initial selected asset
void SetInitialSelection(const char *pAssetName);
// Set/get the filter
void SetFilter(const char *pFilter);
const char *GetFilter();
// Purpose: refreshes the file tree
void RefreshFileTree();
virtual void Activate();
protected:
// Creates standard controls. Allows the derived class to
// add these controls to various splitter windows
void CreateStandardControls(vgui::Panel *pParent,
bool bAllowMultiselect = false);
// Allows the picker to browse multiple asset types
void AddExtension(const char *pExtension);
// Derived classes have this called when the previewed asset changes
virtual void OnSelectedAssetPicked(const char *pAssetName) {}
// Derived classes have this called when the next selected asset is selected
// by default
virtual void OnNextSelectionIsDefault() {}
// Request focus of the filter box
void RequestFilterFocus();
// Rescan assets
void RescanAssets();
const char *GetModPath(int nModIndex);
MESSAGE_FUNC_PARAMS(OnTextChanged, "TextChanged", kv);
MESSAGE_FUNC_PARAMS(OnItemSelected, "ItemSelected", kv);
MESSAGE_FUNC_PARAMS(OnCheckButtonChecked, "CheckButtonChecked", kv);
MESSAGE_FUNC(OnFileSelected, "TreeViewItemSelected");
protected:
struct AssetInfo_t {
int m_nAssetIndex;
int m_nItemId;
};
void BuildAssetNameList();
void RefreshAssetList();
int GetSelectedAssetModIndex();
// Is a particular asset visible?
bool IsAssetVisible(int nAssetIndex);
// Recursively add all files matching the wildcard under this directory
void AddAssetToList(int nAssetIndex);
// Update column headers
void UpdateAssetColumnHeader();
vgui::Splitter *m_pAssetSplitter;
CAssetTreeView *m_pFileTree;
vgui::CheckButton *m_pSubDirCheck;
vgui::TextEntry *m_pFilter;
vgui::ListPanel *m_pAssetBrowser;
vgui::TextEntry *m_pFullPath;
vgui::ComboBox *m_pModSelector;
vgui::Button *m_pRescanButton;
AssetList_t m_hAssetList;
CUtlString m_FolderFilter;
CUtlString m_Filter;
CUtlString m_SelectedAsset;
CUtlVector<AssetInfo_t> m_AssetList;
const char *m_pAssetType;
const char *m_pAssetTextType;
const char *m_pAssetExt;
const char *m_pAssetSubDir;
CUtlVector<const char *> m_ExtraAssetExt;
bool m_bBuiltAssetList : 1;
bool m_bFirstAssetScan : 1;
bool m_bFinishedAssetListScan : 1;
int m_nCurrentModFilter;
int m_nMatchingAssets;
bool m_bSubDirCheck;
friend class CBaseAssetPickerFrame;
};
//-----------------------------------------------------------------------------
// Purpose: Modal dialog for asset picker
//-----------------------------------------------------------------------------
class CBaseAssetPickerFrame : public vgui::Frame {
DECLARE_CLASS_SIMPLE(CBaseAssetPickerFrame, vgui::Frame);
public:
CBaseAssetPickerFrame(vgui::Panel *pParent);
~CBaseAssetPickerFrame();
// Inherited from Frame
virtual void OnCommand(const char *pCommand);
// Purpose: Activate the dialog
// The message "AssetSelected" will be sent if an asset is picked
// Pass in optional keyvalues to add to the message
void DoModal(KeyValues *pContextKeyValues = NULL);
// Sets the initial selected asset
void SetInitialSelection(const char *pAssetName);
// Set/get the filter
void SetFilter(const char *pFilter);
const char *GetFilter();
protected:
// Allows the derived class to create the picker
void SetAssetPicker(CBaseAssetPicker *pPicker);
CBaseAssetPicker *GetAssetPicker() { return m_pPicker; }
// Posts a message (passing the key values)
void PostMessageAndClose(KeyValues *pKeyValues);
private:
void CleanUpMessage();
CBaseAssetPicker *m_pPicker;
vgui::Button *m_pOpenButton;
vgui::Button *m_pCancelButton;
KeyValues *m_pContextKeyValues;
};
#endif // BASEASSETPICKER_H