Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

225 lines
6.4 KiB

5 years ago
//=========== Copyright Valve Corporation, All rights reserved. ===============//
//
// Purpose:
//=============================================================================//
#ifndef PANORAMA_FILEOPENDIALOG_H
#define PANORAMA_FILEOPENDIALOG_H
#ifdef _WIN32
#pragma once
#endif
#include "panel2d.h"
#include "../uievent.h"
#include "panorama/controls/button.h"
namespace panorama
{
class CDropDown;
class CLabel;
class CTextEntry;
class CFileOpenDialogEntry;
DECLARE_PANORAMA_EVENT0( FileOpenDialogOpen );
DECLARE_PANORAMA_EVENT0( FileOpenDialogCancel );
DECLARE_PANORAMA_EVENT0( FileOpenDialogClose );
DECLARE_PANORAMA_EVENT0( FileOpenDialogFolderUp );
DECLARE_PANEL_EVENT1( FileOpenDialogSortByColumn, int );
DECLARE_PANEL_EVENT1( FileOpenDialogSelectFile, uint32 );
DECLARE_PANEL_EVENT1( FileOpenDialogDoubleClickFile, uint32 );
DECLARE_PANORAMA_EVENT0( FileOpenDialogFullPathChanged );
DECLARE_PANORAMA_EVENT0( FileOpenDialogFilterChanged );
DECLARE_PANEL_EVENT1( FileOpenDialogFilesSelected, const char * );
//-----------------------------------------------------------------------------
// Purpose: generic open/save as file dialog, by default deletes itself on close
//-----------------------------------------------------------------------------
enum FileOpenDialogType_t
{
FOD_SAVE = 0,
FOD_OPEN,
FOD_SELECT_DIRECTORY,
FOD_OPEN_MULTIPLE,
};
struct FileData_t
{
CUtlString m_FileAttributes;
CUtlString m_CreationTime;
int64 m_nCreationTime;
CUtlString m_LastAccessTime;
CUtlString m_LastWriteTime;
int64 m_nLastWriteTime;
int64 m_nFileSize;
CUtlString m_FileName;
CUtlString m_FullPath;
CUtlString m_FileType;
bool m_bDirectory;
};
enum FileOpenDialogSorting_t
{
FOD_SORT_NAME = 0,
FOD_SORT_SIZE,
FOD_SORT_TYPE,
FOD_SORT_DATE_MODIFIED
};
//-----------------------------------------------------------------------------
// Purpose: FileOpenDialog
//-----------------------------------------------------------------------------
class CFileOpenDialog : public CPanel2D
{
DECLARE_PANEL2D( CFileOpenDialog, CPanel2D );
public:
CFileOpenDialog( CPanel2D *parent, const char * pchPanelID, FileOpenDialogType_t type );
CFileOpenDialog( panorama::IUIWindow *pParent, const char * pchPanelID, FileOpenDialogType_t type );
virtual ~CFileOpenDialog();
// Set the directory the file search starts in
void SetStartDirectory(const char *dir);
// Sets the start directory context (and resets the start directory in the process)
// NOTE: If you specify a startdir context, then if you've already opened
// a file with that same start dir context before, it will start in the
// same directory it ended up in.
void SetStartDirectoryContext( const char *pContext, const char *pDefaultDir );
// Add filters for the drop down combo box
// The filter info, if specified, gets sent back to the app in the FileSelected message
void AddFilter( const char *filter, const char *filterName, bool bActive, const char *pFilterInfo = NULL );
// Get the directory this is currently in
void GetDirectory( char *buf, int bufSize );
// Get the last selected file name
void GetSelectedFileName( char *buf, int bufSize );
/*
messages sent:
"FileSelected"
"fullpath" // specifies the fullpath of the file
"filterinfo" // Returns the filter info associated with the active filter
"FileSelectionCancelled"
*/
static bool FileNameWildCardMatch( char const *pchFileName, char const *pchPattern );
// event handlers
bool EventOpen();
bool EventCancel();
bool EventClose();
bool EventFolderUp();
bool EventColumnSortingChanged( const CPanelPtr< IUIPanel > &pPanel, int nColumn );
bool EventSelectFile( const CPanelPtr< IUIPanel > &pPanel, uint32 unModifiers );
bool EventDoubleClickFile( const CPanelPtr< IUIPanel > &pPanel, uint32 unModifiers );
bool EventFullPathChanged();
bool EventFilterChanged();
protected:
void Init();
void PopulateFileList();
void PopulateDriveList();
void OnOpen();
// TODO: needs message? hooked up to buttons/rows?
void OnSelectFolder();
void OnMatchStringSelected();
// moves the directory structure up
void MoveUpFolder();
// validates that the current path is valid
void ValidatePath();
private:
// Does the specified extension match something in the filter list?
bool ExtensionMatchesFilter( const char *pExt );
// Choose the first non *.* filter in the filter list
void ChooseExtension( char *pExt, int nBufLen );
// Saves the file to the start dir context
void SaveFileToStartDirContext( const char *pFullPath );
// Posts a file selected message
void PostFileSelectedMessage( const char *pFileName );
// Posts a multiple file selected message
void PostMultiFileSelectedMessage();
void BuildFileList();
void FilterFileList();
void SortEntries();
bool PassesFilter( FileData_t *fd );
int CountSubstringMatches();
void DeselectAllEntries();
CDropDown *m_pFullPathDropDown;
CPanel2D *m_pFileList; // TODO: custom spreadsheet style control?
CTextEntry *m_pFileNameTextEntry;
CDropDown *m_pFileTypeCombo;
CButton *m_pOpenButton;
CButton *m_pCancelButton;
CButton *m_pFolderUpButton;
CLabel *m_pFileTypeLabel;
CUtlVector<CPanel2D*> m_vecColumnHeaders;
KeyValues *m_pContextKeyValues;
FileOpenDialogSorting_t m_nSorting;
bool m_bSortingReversed;
char m_szLastPath[1024];
unsigned short m_nStartDirContext;
FileOpenDialogType_t m_DialogType;
bool m_bFileSelected : 1;
CUtlVector< FileData_t > m_Files;
CUtlVector< FileData_t * > m_Filtered;
CUtlVector< CFileOpenDialogEntry* > m_vecSelectedEntries;
CUtlString m_CurrentSubstringFilter;
};
//-----------------------------------------------------------------------------
// Purpose: CFileOpenDialogEntry - single row in the dialog, represents one file
//-----------------------------------------------------------------------------
class CFileOpenDialogEntry : public CButton
{
DECLARE_PANEL2D( CFileOpenDialogEntry, CButton );
public:
CFileOpenDialogEntry( CPanel2D *parent, const char * pchPanelID );
virtual ~CFileOpenDialogEntry();
void SetFileData( FileData_t *pFileData );
const FileData_t* GetFileData() const { return &m_FileData; }
virtual bool OnMouseButtonUp( const panorama::MouseData_t &code ) OVERRIDE;
virtual bool OnMouseButtonDoubleClick( const panorama::MouseData_t &code ) OVERRIDE;
bool OnScrolledIntoView( const CPanelPtr< IUIPanel > &panelPtr );
private:
FileData_t m_FileData;
bool m_bCreatedControls;
};
} // namespace panorama
#endif // PANORAMA_FILEOPENDIALOG_H