summaryrefslogtreecommitdiff
path: root/public/panorama/controls/fileopendialog.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/panorama/controls/fileopendialog.h')
-rw-r--r--public/panorama/controls/fileopendialog.h224
1 files changed, 224 insertions, 0 deletions
diff --git a/public/panorama/controls/fileopendialog.h b/public/panorama/controls/fileopendialog.h
new file mode 100644
index 0000000..79dc451
--- /dev/null
+++ b/public/panorama/controls/fileopendialog.h
@@ -0,0 +1,224 @@
+//=========== 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