123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- /*
- * FileDialog.h
- * ------------
- * Purpose: File and folder selection dialogs implementation.
- * Notes : (currently none)
- * Authors: OpenMPT Devs
- * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
- */
- #pragma once
- #include "openmpt/all/BuildSettings.hpp"
- #include <string>
- #include <vector>
- OPENMPT_NAMESPACE_BEGIN
- // Generic open / save file dialog. Cannot be instanced by the user, use OpenFileDialog / SaveFileDialog instead.
- class FileDialog
- {
- public:
- using PathList = std::vector<mpt::PathString>;
- protected:
- mpt::RawPathString m_defaultExtension;
- mpt::RawPathString m_defaultFilename;
- mpt::RawPathString m_extFilter;
- mpt::RawPathString m_lastPreviewFile;
- mpt::RawPathString m_workingDirectory;
- mpt::RawPathString m_extension;
- PathList m_filenames;
- PathList m_places;
- int *m_filterIndex = nullptr;
- bool m_load;
- bool m_multiSelect = false;
- bool m_preview = false;
- protected:
- FileDialog(bool load) : m_load(load) { }
- public:
- // Default extension to use if none is specified.
- FileDialog &DefaultExtension(const mpt::PathString &ext) { m_defaultExtension = ext.AsNative(); return *this; }
- FileDialog &DefaultExtension(const AnyStringLocale &ext) { m_defaultExtension = mpt::ToWin(ext); return *this; }
- // Default suggested filename.
- FileDialog &DefaultFilename(const mpt::PathString &name) { m_defaultFilename = name.AsNative(); return *this; }
- FileDialog &DefaultFilename(const AnyStringLocale &name) { m_defaultFilename = mpt::ToWin(name); return *this; }
- // List of possible extensions. Format: "description|extensions|...|description|extensions||"
- FileDialog &ExtensionFilter(const mpt::PathString &filter) { m_extFilter = filter.AsNative(); return *this; }
- FileDialog &ExtensionFilter(const AnyStringLocale &filter) { m_extFilter = mpt::ToWin(filter); return *this; }
- // Default directory of the dialog.
- FileDialog &WorkingDirectory(const mpt::PathString &dir) { m_workingDirectory = dir.AsNative(); return *this; }
- // Pointer to a variable holding the index of the last extension filter to use. Holds the selected filter after the dialog has been closed.
- FileDialog &FilterIndex(int *index) { m_filterIndex = index; return *this; }
- // Enable preview of instrument files (if globally enabled).
- FileDialog &EnableAudioPreview() { m_preview = true; return *this; }
- // Add a directory to the application-specific quick-access directories in the file dialog
- FileDialog &AddPlace(mpt::PathString path) { m_places.push_back(std::move(path)); return *this; }
- // Show the file selection dialog.
- bool Show(CWnd *parent = nullptr);
- // Get some selected file. Mostly useful when only one selected file is possible anyway.
- mpt::PathString GetFirstFile() const
- {
- if(!m_filenames.empty())
- return m_filenames.front();
- else
- return {};
- }
- // Gets a reference to all selected filenames.
- const PathList &GetFilenames() const { return m_filenames; }
- // Gets directory in which the selected files are placed.
- mpt::PathString GetWorkingDirectory() const { return mpt::PathString::FromNative(m_workingDirectory); }
- // Gets the extension of the first selected file, without dot.
- mpt::PathString GetExtension() const { return mpt::PathString::FromNative(m_extension); }
- };
- // Dialog for opening files
- class OpenFileDialog : public FileDialog
- {
- public:
- OpenFileDialog() : FileDialog(true) { }
- // Enable selection of multiple files
- OpenFileDialog &AllowMultiSelect() { m_multiSelect = true; return *this; }
- };
- // Dialog for saving files
- class SaveFileDialog : public FileDialog
- {
- public:
- SaveFileDialog() : FileDialog(false) { }
- };
- // Folder browser.
- class BrowseForFolder
- {
- protected:
- mpt::PathString m_workingDirectory;
- CString m_caption;
- public:
- BrowseForFolder(const mpt::PathString &dir, const CString &caption) : m_workingDirectory(dir), m_caption(caption) { }
- // Show the folder selection dialog.
- bool Show(CWnd *parent = nullptr);
- // Gets selected directory.
- mpt::PathString GetDirectory() const { return m_workingDirectory; }
- protected:
- static int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData);
- };
- OPENMPT_NAMESPACE_END
|