From b153aafee9d74ecfaef7b1447b79012e6e60c11a Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Fri, 24 Oct 2025 19:49:09 +0200 Subject: [PATCH] Fix handling filters in wxFileDialog in wxOSX As allowedTypes were restricted to the first filter expression, choosing another filter only showed the files conforming to both expressions instead of only applying the selected filter. This commit is best viewed ignoring whitespace-only changes. Fixes wxWidgets/Phoenix/issues#2806 Closes #25918. Closes #25922. --- src/osx/cocoa/filedlg.mm | 44 +++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/osx/cocoa/filedlg.mm b/src/osx/cocoa/filedlg.mm index 05421b46b7..af98e93dab 100644 --- a/src/osx/cocoa/filedlg.mm +++ b/src/osx/cocoa/filedlg.mm @@ -260,7 +260,7 @@ void wxFileDialog::ShowWindowModal() wxCHECK_RET(parentWindow, "Window modal display requires parent."); - NSArray* types = GetTypesFromFilter( m_wildCard, m_filterNames, m_filterExtensions, m_currentExtensions ) ; + NSArray* allTypes = GetTypesFromFilter( m_wildCard, m_filterNames, m_filterExtensions, m_currentExtensions ) ; m_useFileTypeFilter = m_filterExtensions.GetCount() > 1; @@ -286,7 +286,6 @@ void wxFileDialog::ShowWindowModal() else if ( m_useFileTypeFilter ) { m_firstFileTypeFilter = GetMatchingFilterExtension(m_fileName); - types = GetTypesFromExtension(m_filterExtensions[m_firstFileTypeFilter], m_currentExtensions); } if ( HasFlag(wxFD_SAVE) ) @@ -302,7 +301,7 @@ void wxFileDialog::ShowWindowModal() // be able to pass this in [sPanel setTreatsFilePackagesAsDirectories:NO]; [sPanel setCanSelectHiddenExtension:YES]; - [sPanel setAllowedFileTypes:types]; + [sPanel setAllowedFileTypes:allTypes]; [sPanel setAllowsOtherFileTypes:NO]; [sPanel setShowsHiddenFiles: HasFlag(wxFD_SHOW_HIDDEN) ? YES : NO]; @@ -316,14 +315,17 @@ void wxFileDialog::ShowWindowModal() */ if(m_firstFileTypeFilter > 0) { - DoOnFilterSelected(m_firstFileTypeFilter); + DoOnFilterSelected(m_firstFileTypeFilter); } else { - if ( m_delegate ) - [(wxOpenSavePanelDelegate*) m_delegate setAllowedExtensions: m_currentExtensions]; - else - [sPanel setAllowedFileTypes: types]; + NSArray* types = GetTypesFromExtension(m_filterExtensions[m_firstFileTypeFilter], m_currentExtensions); + if ( m_delegate ) + [(wxOpenSavePanelDelegate*) m_delegate setAllowedExtensions: m_currentExtensions]; + else + { + [sPanel setAllowedFileTypes: types]; + } } NSWindow* nativeParent = parentWindow->GetWXWindow(); @@ -351,7 +353,7 @@ void wxFileDialog::ShowWindowModal() [oPanel setCanChooseFiles:YES]; [oPanel setMessage:cf.AsNSString()]; [oPanel setAllowsMultipleSelection: (HasFlag(wxFD_MULTIPLE) ? YES : NO )]; - [oPanel setAllowedFileTypes:types]; + [oPanel setAllowedFileTypes:allTypes]; [oPanel setAllowsOtherFileTypes:NO]; [oPanel setShowsHiddenFiles: HasFlag(wxFD_SHOW_HIDDEN) ? YES : NO]; @@ -367,8 +369,6 @@ void wxFileDialog::ShowWindowModal() { if ( m_delegate ) [(wxOpenSavePanelDelegate*) m_delegate setAllowedExtensions: m_currentExtensions]; - else - [oPanel setAllowedFileTypes: types]; } NSWindow* nativeParent = parentWindow->GetWXWindow(); @@ -463,7 +463,9 @@ void wxFileDialog::DoOnFilterSelected(int index) [panel validateVisibleColumns]; } else + { [panel setAllowedFileTypes:types]; + } m_currentlySelectedFilterIndex = index; @@ -578,7 +580,7 @@ int wxFileDialog::ShowModal() int returnCode = -1; - NSArray* types = GetTypesFromFilter( m_wildCard, m_filterNames, m_filterExtensions, m_currentExtensions ) ; + NSArray* allTypes = GetTypesFromFilter( m_wildCard, m_filterNames, m_filterExtensions, m_currentExtensions ) ; m_useFileTypeFilter = m_filterExtensions.GetCount() > 1; @@ -604,7 +606,6 @@ int wxFileDialog::ShowModal() else if ( m_useFileTypeFilter ) { m_firstFileTypeFilter = GetMatchingFilterExtension(m_fileName); - types = GetTypesFromExtension(m_filterExtensions[m_firstFileTypeFilter], m_currentExtensions); } OSXBeginModalDialog(); @@ -622,7 +623,7 @@ int wxFileDialog::ShowModal() // be able to pass this in [sPanel setTreatsFilePackagesAsDirectories:NO]; [sPanel setCanSelectHiddenExtension:YES]; - [sPanel setAllowedFileTypes:types]; + [sPanel setAllowedFileTypes:allTypes]; [sPanel setAllowsOtherFileTypes:NO]; [sPanel setShowsHiddenFiles: HasFlag(wxFD_SHOW_HIDDEN) ? YES : NO]; @@ -644,10 +645,11 @@ int wxFileDialog::ShowModal() } else { - if ( m_delegate ) - [(wxOpenSavePanelDelegate*) m_delegate setAllowedExtensions: m_currentExtensions]; - else - [sPanel setAllowedFileTypes: types]; + NSArray* types = GetTypesFromExtension(m_filterExtensions[m_firstFileTypeFilter], m_currentExtensions); + if ( m_delegate ) + [(wxOpenSavePanelDelegate*) m_delegate setAllowedExtensions: m_currentExtensions]; + else + [sPanel setAllowedFileTypes: types]; } if ( !m_dir.IsEmpty() ) @@ -676,7 +678,7 @@ int wxFileDialog::ShowModal() [oPanel setCanChooseFiles:YES]; [oPanel setMessage:cf.AsNSString()]; [oPanel setAllowsMultipleSelection: (HasFlag(wxFD_MULTIPLE) ? YES : NO )]; - [oPanel setAllowedFileTypes:types]; + [oPanel setAllowedFileTypes:allTypes]; [oPanel setAllowsOtherFileTypes:NO]; [oPanel setShowsHiddenFiles: HasFlag(wxFD_SHOW_HIDDEN) ? YES : NO]; @@ -692,9 +694,9 @@ int wxFileDialog::ShowModal() { if ( m_delegate ) [(wxOpenSavePanelDelegate*) m_delegate setAllowedExtensions: m_currentExtensions]; - else - [oPanel setAllowedFileTypes: types]; } + + if ( !m_dir.IsEmpty() ) [oPanel setDirectoryURL:[NSURL fileURLWithPath:dir.AsNSString() isDirectory:YES]];