Fix folder picker not displying as the given directory is invalid issue

Fix #9569, close #9570
This commit is contained in:
mere-human 2021-02-23 23:04:16 +02:00 committed by Don HO
parent 064d844a41
commit 91a570a305
No known key found for this signature in database
GPG Key ID: 6C429F1D8D84F46E
1 changed files with 18 additions and 19 deletions

View File

@ -535,8 +535,16 @@ public:
if (SUCCEEDED(hr) && _title)
hr = _dialog->SetTitle(_title);
if (SUCCEEDED(hr) && _folder)
hr = setFolder(_folder) ? S_OK : E_FAIL;
if (SUCCEEDED(hr))
{
// Do not fail the initialization if failed to set a folder.
bool isFolderSet = false;
if (!_initialFolder.empty())
isFolderSet = setDialogFolder(_dialog, _initialFolder.c_str());
if (!isFolderSet && !_fallbackFolder.empty())
isFolderSet = setDialogFolder(_dialog, _fallbackFolder.c_str());
}
if (SUCCEEDED(hr) && _defExt && _defExt[0] != '\0')
hr = _dialog->SetDefaultExtension(_defExt);
@ -614,11 +622,6 @@ public:
return true;
}
bool setFolder(const TCHAR* dir)
{
return setDialogFolder(_dialog, dir);
}
bool show()
{
bool okPressed = false;
@ -708,7 +711,8 @@ public:
HWND _hwndOwner = nullptr;
const TCHAR* _title = nullptr;
const TCHAR* _defExt = nullptr;
const TCHAR* _folder = nullptr;
generic_string _initialFolder;
generic_string _fallbackFolder;
const TCHAR* _checkboxLabel = nullptr;
const TCHAR* _initialFileName = nullptr;
bool _isCheckboxActive = true;
@ -727,6 +731,11 @@ private:
CustomFileDialog::CustomFileDialog(HWND hwnd) : _impl{std::make_unique<Impl>()}
{
_impl->_hwndOwner = hwnd;
NppParameters& params = NppParameters::getInstance();
const TCHAR* workDir = params.getWorkingDir();
if (workDir)
_impl->_fallbackFolder = workDir;
}
CustomFileDialog::~CustomFileDialog() = default;
@ -755,7 +764,6 @@ void CustomFileDialog::setExtFilter(const TCHAR *extText, const TCHAR *exts)
_impl->_filterSpec.push_back({ extText, newExts });
}
void CustomFileDialog::setExtFilter(const TCHAR *extText, std::initializer_list<const TCHAR*> extList)
{
generic_string exts;
@ -780,7 +788,7 @@ void CustomFileDialog::setDefFileName(const TCHAR* fn)
void CustomFileDialog::setFolder(const TCHAR* folder)
{
_impl->_folder = folder;
_impl->_initialFolder = folder ? folder : _T("");
}
void CustomFileDialog::setCheckbox(const TCHAR* text, bool isActive)
@ -811,9 +819,6 @@ generic_string CustomFileDialog::doSaveDlg()
CurrentDirBackup backup;
NppParameters& params = NppParameters::getInstance();
_impl->setFolder(params.getWorkingDir());
_impl->addFlags(FOS_PATHMUSTEXIST | FOS_FILEMUSTEXIST | FOS_FORCEFILESYSTEM);
bool bOk = _impl->show();
return bOk ? _impl->getResultFilename() : _T("");
@ -826,9 +831,6 @@ generic_string CustomFileDialog::doOpenSingleFileDlg()
CurrentDirBackup backup;
NppParameters& params = NppParameters::getInstance();
_impl->setFolder(params.getWorkingDir());
_impl->addFlags(FOS_PATHMUSTEXIST | FOS_FILEMUSTEXIST | FOS_FORCEFILESYSTEM);
bool bOk = _impl->show();
return bOk ? _impl->getResultFilename() : _T("");
@ -841,9 +843,6 @@ std::vector<generic_string> CustomFileDialog::doOpenMultiFilesDlg()
CurrentDirBackup backup;
NppParameters& params = NppParameters::getInstance();
_impl->setFolder(params.getWorkingDir());
_impl->addFlags(FOS_PATHMUSTEXIST | FOS_FILEMUSTEXIST | FOS_FORCEFILESYSTEM | FOS_ALLOWMULTISELECT);
bool bOk = _impl->show();
if (bOk)