From 6120f2fcdb680c05798202695ed05dcc57449c4b Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Sun, 28 Nov 2004 10:49:01 +0000 Subject: [PATCH] fixed subtle SetDirectory bug re-introduced by latest changes (explained in comment in UpdateDialog); reintroduced UpdateDialog so that fixes like this are kept in single place and affect all ways of setting the patch git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30806 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/filedlg.h | 5 ++- include/wx/gtk1/filedlg.h | 5 ++- src/gtk/filedlg.cpp | 71 +++++++++++++++++++++++---------------- src/gtk1/filedlg.cpp | 71 +++++++++++++++++++++++---------------- 4 files changed, 92 insertions(+), 60 deletions(-) diff --git a/include/wx/gtk/filedlg.h b/include/wx/gtk/filedlg.h index 31c9992dce..70e26820cf 100644 --- a/include/wx/gtk/filedlg.h +++ b/include/wx/gtk/filedlg.h @@ -43,8 +43,11 @@ public: virtual void SetFilename(const wxString& name); virtual void SetWildcard(const wxString& wildCard); virtual void SetFilterIndex(int filterIndex); - void UpdateFromDialog(); + + void UpdateFromDialog(); private: + void UpdateDialog(); + DECLARE_DYNAMIC_CLASS(wxFileDialog) }; diff --git a/include/wx/gtk1/filedlg.h b/include/wx/gtk1/filedlg.h index 31c9992dce..70e26820cf 100644 --- a/include/wx/gtk1/filedlg.h +++ b/include/wx/gtk1/filedlg.h @@ -43,8 +43,11 @@ public: virtual void SetFilename(const wxString& name); virtual void SetWildcard(const wxString& wildCard); virtual void SetFilterIndex(int filterIndex); - void UpdateFromDialog(); + + void UpdateFromDialog(); private: + void UpdateDialog(); + DECLARE_DYNAMIC_CLASS(wxFileDialog) }; diff --git a/src/gtk/filedlg.cpp b/src/gtk/filedlg.cpp index f7eb5eeffb..6234348501 100644 --- a/src/gtk/filedlg.cpp +++ b/src/gtk/filedlg.cpp @@ -239,21 +239,7 @@ void wxFileDialog::SetPath(const wxString& path) m_path = fn.GetFullPath(); m_dir = fn.GetPath(); m_fileName = fn.GetFullName(); - - gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(m_widget), - wxGTK_CONV(m_dir)); - - gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget), - wxGTK_CONV(m_path)); - - // pre-fill the filename when saving, too (there's no text entry - // control when opening a file, so it doesn't make sense to - // do this in when opening files): - if (GetWindowStyle() & wxSAVE) - { - gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(m_widget), - wxGTK_CONV(m_fileName)); - } + UpdateDialog(); } void wxFileDialog::SetDirectory(const wxString& dir) @@ -261,29 +247,56 @@ void wxFileDialog::SetDirectory(const wxString& dir) if (wxDirExists(dir)) { m_dir = dir; - gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(m_widget), - wxGTK_CONV(m_dir)); - wxFileName fn(m_dir,m_fileName); - m_path = fn.GetFullPath(); + m_path = wxFileName(m_dir, m_fileName).GetFullPath(); + UpdateDialog(); } } void wxFileDialog::SetFilename(const wxString& name) { m_fileName = name; - wxFileName fn(m_dir,m_fileName); - m_path = fn.GetFullPath(); - - gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget), - wxGTK_CONV(m_path)); + m_path = wxFileName(m_dir, m_fileName).GetFullPath(); + UpdateDialog(); +} - // pre-fill the filename when saving, too (there's no text entry - // control when opening a file, so it doesn't make sense to - // do this in when opening files): - if (GetWindowStyle() & wxSAVE) +void wxFileDialog::UpdateDialog() +{ + // set currently selected directory to match the path: + if (!m_dir.empty() && wxDirExists(m_dir)) { - gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(m_widget), + // NB: This is important -- if we set directory only and not the path, + // then dialog will still remember old path set using previous + // call to gtk_chooser_set_filename. If the previous directory + // was a subdirectory of the directory we want to select now, + // the dialog would still contain directory selector controls + // for the subdirectory (with the parent directory selected), + // instead of showing only the parent directory as expected. + // This way, we force GtkFileChooser to really change the + // directory. Finally, it doesn't have to be done if filename + // is not empty because of the code that sets the filename below. + if (m_fileName.empty()) + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget), + wxGTK_CONV(m_dir)); + + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(m_widget), + wxGTK_CONV(m_dir)); + } + + // if the user set only the directory (e.g. by calling SetDirectory) + // and not the default filename, then we don't want to set the filename: + if (!m_fileName.empty()) + { + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget), + wxGTK_CONV(m_path)); + + // pre-fill the filename when saving, too (there's no text entry + // control when opening a file, so it doesn't make sense to + // do this when opening files): + if (GetWindowStyle() & wxSAVE) + { + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(m_widget), wxGTK_CONV(m_fileName)); + } } } diff --git a/src/gtk1/filedlg.cpp b/src/gtk1/filedlg.cpp index f7eb5eeffb..6234348501 100644 --- a/src/gtk1/filedlg.cpp +++ b/src/gtk1/filedlg.cpp @@ -239,21 +239,7 @@ void wxFileDialog::SetPath(const wxString& path) m_path = fn.GetFullPath(); m_dir = fn.GetPath(); m_fileName = fn.GetFullName(); - - gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(m_widget), - wxGTK_CONV(m_dir)); - - gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget), - wxGTK_CONV(m_path)); - - // pre-fill the filename when saving, too (there's no text entry - // control when opening a file, so it doesn't make sense to - // do this in when opening files): - if (GetWindowStyle() & wxSAVE) - { - gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(m_widget), - wxGTK_CONV(m_fileName)); - } + UpdateDialog(); } void wxFileDialog::SetDirectory(const wxString& dir) @@ -261,29 +247,56 @@ void wxFileDialog::SetDirectory(const wxString& dir) if (wxDirExists(dir)) { m_dir = dir; - gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(m_widget), - wxGTK_CONV(m_dir)); - wxFileName fn(m_dir,m_fileName); - m_path = fn.GetFullPath(); + m_path = wxFileName(m_dir, m_fileName).GetFullPath(); + UpdateDialog(); } } void wxFileDialog::SetFilename(const wxString& name) { m_fileName = name; - wxFileName fn(m_dir,m_fileName); - m_path = fn.GetFullPath(); - - gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget), - wxGTK_CONV(m_path)); + m_path = wxFileName(m_dir, m_fileName).GetFullPath(); + UpdateDialog(); +} - // pre-fill the filename when saving, too (there's no text entry - // control when opening a file, so it doesn't make sense to - // do this in when opening files): - if (GetWindowStyle() & wxSAVE) +void wxFileDialog::UpdateDialog() +{ + // set currently selected directory to match the path: + if (!m_dir.empty() && wxDirExists(m_dir)) { - gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(m_widget), + // NB: This is important -- if we set directory only and not the path, + // then dialog will still remember old path set using previous + // call to gtk_chooser_set_filename. If the previous directory + // was a subdirectory of the directory we want to select now, + // the dialog would still contain directory selector controls + // for the subdirectory (with the parent directory selected), + // instead of showing only the parent directory as expected. + // This way, we force GtkFileChooser to really change the + // directory. Finally, it doesn't have to be done if filename + // is not empty because of the code that sets the filename below. + if (m_fileName.empty()) + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget), + wxGTK_CONV(m_dir)); + + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(m_widget), + wxGTK_CONV(m_dir)); + } + + // if the user set only the directory (e.g. by calling SetDirectory) + // and not the default filename, then we don't want to set the filename: + if (!m_fileName.empty()) + { + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget), + wxGTK_CONV(m_path)); + + // pre-fill the filename when saving, too (there's no text entry + // control when opening a file, so it doesn't make sense to + // do this when opening files): + if (GetWindowStyle() & wxSAVE) + { + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(m_widget), wxGTK_CONV(m_fileName)); + } } } -- 2.47.2