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
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
|