Simplify and correct setting of initial directory for wxFilePickerCtrl.

Create wxFileDialog with correct initial directory and default file name from
the very beginning instead of updating it later. This makes the code simpler
and also actually makes it work as the initial directory setting was
overwritten by setting the default path later even if it didn't contain any
directory component.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72451 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2012-09-09 13:34:49 +00:00
parent d965bcda31
commit 06a419244f
3 changed files with 26 additions and 40 deletions

View File

@@ -156,10 +156,6 @@ protected:
void UpdatePathFromDialog(wxDialog *p) void UpdatePathFromDialog(wxDialog *p)
{ m_path = wxStaticCast(p, wxFileDialog)->GetPath(); } { m_path = wxStaticCast(p, wxFileDialog)->GetPath(); }
// Set the initial directory for the dialog but without overriding the
// directory of the currently selected file, if any.
void DoSetInitialDirectory(wxFileDialog* dialog, const wxString& dir);
private: private:
DECLARE_DYNAMIC_CLASS(wxGenericFileButton) DECLARE_DYNAMIC_CLASS(wxGenericFileButton)
}; };

View File

@@ -113,46 +113,28 @@ void wxGenericFileDirButton::SetInitialDirectory(const wxString& dir)
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxGenericFileutton // wxGenericFileButton
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void
wxGenericFileButton::DoSetInitialDirectory(wxFileDialog* dialog,
const wxString& dir)
{
if ( m_path.find_first_of(wxFileName::GetPathSeparators()) ==
wxString::npos )
{
dialog->SetDirectory(dir);
}
}
wxDialog *wxGenericFileButton::CreateDialog() wxDialog *wxGenericFileButton::CreateDialog()
{ {
wxFileDialog* const dialog = new wxFileDialog // Determine the initial directory for the dialog: it comes either from the
// default path, if it has it, or from the separately specified initial
// directory that can be set even if the path is e.g. empty.
wxFileName fn(m_path);
wxString initialDir = fn.GetPath();
if ( initialDir.empty() )
initialDir = m_initialDir;
return new wxFileDialog
( (
GetDialogParent(), GetDialogParent(),
m_message, m_message,
wxEmptyString, initialDir,
wxEmptyString, fn.GetFullName(),
m_wildcard, m_wildcard,
GetDialogStyle() GetDialogStyle()
); );
// If there is no default file or if it doesn't have any path, use the
// explicitly set initial directory.
//
// Notice that it is important to call this before SetPath() below as if we
// do have m_initialDir and no directory in m_path, we need to interpret
// the path as being relative with respect to m_initialDir.
if ( !m_initialDir.empty() )
DoSetInitialDirectory(dialog, m_initialDir);
// This sets both the default file name and the default directory of the
// dialog if m_path contains directory part.
dialog->SetPath(m_path);
return dialog;
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -131,7 +131,15 @@ void wxFileButton::SetPath(const wxString &str)
void wxFileButton::SetInitialDirectory(const wxString& dir) void wxFileButton::SetInitialDirectory(const wxString& dir)
{ {
if (m_dialog) if (m_dialog)
DoSetInitialDirectory(static_cast<wxFileDialog*>(m_dialog), dir); {
// Only change the directory if the default file name doesn't have any
// directory in it, otherwise it takes precedence.
if ( m_path.find_first_of(wxFileName::GetPathSeparators()) ==
wxString::npos )
{
static_cast<wxFileDialog*>(m_dialog)->SetDirectory(dir);
}
}
else else
wxGenericFileButton::SetInitialDirectory(dir); wxGenericFileButton::SetInitialDirectory(dir);
} }