Skip to content

Commit 4774aae

Browse files
authored
New properties in Storage.Pickers - SuggestedDefaultFolder, SuggestedFolder, FileTypeChoices (#5772)
This pull request introduces new experimental features to the Windows Storage Pickers API, including: - Introducing a new property, SuggestedStartFolder, across all storage pickers (FileOpenPicker, FileSavePicker, FolderPicker). This property sets a string-type path that appears the first time the picker is launched. - Adding FileTypeChoices in FileOpenPicker - expanding its availability beyond just FileSavePicker. - Adding SuggestedFolder in both FileOpenPicker and FolderPicker, expanding its availability beyond just FileSavePicker. More design details can be found in the design spec (#5771)
1 parent ec3cd77 commit 4774aae

15 files changed

+348
-37
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright (c) Microsoft Corporation and Contributors.
2+
// Licensed under the MIT License.
3+
4+
// THIS FILE IS AUTOMATICALLY GENERATED; DO NOT EDIT IT
5+
6+
// INPUT FILE: dev\Common\TerminalVelocityFeatures-StoragePickers2.xml
7+
// OPTIONS: -Channel Experimental -Language C++ -Namespace Microsoft.Windows.Storage.Pickers -Path dev\Common\TerminalVelocityFeatures-StoragePickers2.xml -Output dev\Common\TerminalVelocityFeatures-StoragePickers2.h
8+
9+
#if defined(__midlrt)
10+
namespace features
11+
{
12+
feature_name Feature_StoragePickers2 = { DisabledByDefault, FALSE };
13+
}
14+
#endif // defined(__midlrt)
15+
16+
// Feature constants
17+
#define WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_STORAGE_PICKERS_FEATURE_STORAGEPICKERS2_ENABLED 1
18+
19+
#if defined(__cplusplus)
20+
21+
namespace Microsoft::Windows::Storage::Pickers
22+
{
23+
24+
__pragma(detect_mismatch("ODR_violation_WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_STORAGE_PICKERS_FEATURE_STORAGEPICKERS2_ENABLED_mismatch", "AlwaysEnabled"))
25+
struct Feature_StoragePickers2
26+
{
27+
static constexpr bool IsEnabled() { return WINDOWSAPPRUNTIME_MICROSOFT_WINDOWS_STORAGE_PICKERS_FEATURE_STORAGEPICKERS2_ENABLED == 1; }
28+
};
29+
30+
} // namespace Microsoft.Windows.Storage.Pickers
31+
32+
#endif // defined(__cplusplus)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0"?>
2+
<features xmlns="http://microsoft.com/windowsappsdk/TerminalVelocity/20210729/TerminalVelocityFeatures.xsd">
3+
4+
<!-- Copyright (c) Microsoft Corporation. All rights reserved.
5+
Licensed under the MIT License. See LICENSE in the project root for license information.
6+
-->
7+
8+
<!-- See docs/Coding-Guidelines/TerminalVelocity.md for more info. -->
9+
10+
<!-- Enabled variants -->
11+
<feature>
12+
<name>Feature_StoragePickers2</name>
13+
<description>New functionalities in StoragePickers for the WindowsAppRuntime: SuggestedDefaultFolder, FileTypeChoices</description>
14+
<state>AlwaysEnabled</state>
15+
<alwaysDisabledChannelTokens>
16+
<channelToken>Preview</channelToken>
17+
<channelToken>Stable</channelToken>
18+
</alwaysDisabledChannelTokens>
19+
</feature>
20+
</features>

dev/Interop/StoragePickers/FileOpenPicker.cpp

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <shobjidl_core.h>
1111
#include <winrt/Microsoft.UI.Interop.h>
1212
#include "TerminalVelocityFeatures-StoragePickers.h"
13+
#include "TerminalVelocityFeatures-StoragePickers2.h"
1314
#include "PickerCommon.h"
1415
#include "PickFileResult.h"
1516
#include "PickerLocalization.h"
@@ -49,17 +50,46 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation
4950
PickerCommon::ValidateStringNoEmbeddedNulls(value);
5051
m_commitButtonText = value;
5152
}
52-
winrt::Windows::Foundation::Collections::IVector<hstring> FileOpenPicker::FileTypeFilter()
53+
winrt::Windows::Foundation::Collections::IMap<winrt::hstring, winrt::Windows::Foundation::Collections::IVector<winrt::hstring>> FileOpenPicker::FileTypeChoices()
54+
{
55+
THROW_HR_IF(E_NOTIMPL, !::Microsoft::Windows::Storage::Pickers::Feature_StoragePickers2::IsEnabled());
56+
return m_fileTypeChoices;
57+
}
58+
winrt::Windows::Foundation::Collections::IVector<winrt::hstring> FileOpenPicker::FileTypeFilter()
5359
{
5460
return m_fileTypeFilter;
5561
}
62+
winrt::hstring FileOpenPicker::SuggestedFolder()
63+
{
64+
THROW_HR_IF(E_NOTIMPL, !::Microsoft::Windows::Storage::Pickers::Feature_StoragePickers2::IsEnabled());
65+
return m_suggestedFolder;
66+
}
67+
void FileOpenPicker::SuggestedFolder(winrt::hstring const& value)
68+
{
69+
THROW_HR_IF(E_NOTIMPL, !::Microsoft::Windows::Storage::Pickers::Feature_StoragePickers2::IsEnabled());
70+
PickerCommon::ValidateFolderPath(value, "SuggestedFolder");
71+
m_suggestedFolder = value;
72+
}
73+
winrt::hstring FileOpenPicker::SuggestedStartFolder()
74+
{
75+
THROW_HR_IF(E_NOTIMPL, !::Microsoft::Windows::Storage::Pickers::Feature_StoragePickers2::IsEnabled());
76+
return m_suggestedStartFolder;
77+
}
78+
void FileOpenPicker::SuggestedStartFolder(winrt::hstring const& value)
79+
{
80+
THROW_HR_IF(E_NOTIMPL, !::Microsoft::Windows::Storage::Pickers::Feature_StoragePickers2::IsEnabled());
81+
PickerCommon::ValidateFolderPath(value, "SuggestedStartFolder");
82+
m_suggestedStartFolder = value;
83+
}
5684

5785
void FileOpenPicker::CaptureParameters(PickerCommon::PickerParameters& parameters)
5886
{
5987
parameters.HWnd = winrt::Microsoft::UI::GetWindowFromWindowId(m_windowId);
6088
parameters.CommitButtonText = m_commitButtonText;
61-
parameters.PickerLocationId = m_suggestedStartLocation;
62-
parameters.CaptureFilterSpec(m_fileTypeFilter.GetView());
89+
parameters.SuggestedFolder = m_suggestedFolder;
90+
parameters.SuggestedStartLocation = m_suggestedStartLocation;
91+
parameters.SuggestedStartFolder = m_suggestedStartFolder;
92+
parameters.CaptureFilterSpecData(m_fileTypeFilter.GetView(), m_fileTypeChoices.GetView());
6393
}
6494

6595
winrt::Windows::Foundation::IAsyncOperation<winrt::Microsoft::Windows::Storage::Pickers::PickFileResult> FileOpenPicker::PickSingleFileAsync()
@@ -87,7 +117,6 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation
87117
auto dialog = create_instance<IFileOpenDialog>(CLSID_FileOpenDialog, CLSCTX_INPROC_SERVER);
88118

89119
parameters.ConfigureDialog(dialog);
90-
check_hresult(dialog->SetFileTypeIndex(parameters.FileTypeFilterPara.size()));
91120

92121
{
93122
auto hr = dialog->Show(parameters.HWnd);
@@ -142,7 +171,6 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation
142171
auto dialog = create_instance<IFileOpenDialog>(CLSID_FileOpenDialog, CLSCTX_INPROC_SERVER);
143172

144173
parameters.ConfigureDialog(dialog);
145-
check_hresult(dialog->SetFileTypeIndex(parameters.FileTypeFilterPara.size()));
146174

147175
FILEOPENDIALOGOPTIONS dialogOptions;
148176
check_hresult(dialog->GetOptions(&dialogOptions));

dev/Interop/StoragePickers/FileOpenPicker.h

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "PickerCommon.h"
77
#include "StoragePickersTelemetryHelper.h"
88
#include <winrt/Windows.Foundation.Collections.h>
9+
#include "FileTypeChoicesMap.h"
910
#include "FileTypeFilterVector.h"
1011

1112
namespace winrt::Microsoft::Windows::Storage::Pickers::implementation
@@ -23,7 +24,14 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation
2324
winrt::hstring CommitButtonText();
2425
void CommitButtonText(winrt::hstring const& value);
2526

26-
winrt::Windows::Foundation::Collections::IVector<hstring> FileTypeFilter();
27+
winrt::Windows::Foundation::Collections::IVector<winrt::hstring> FileTypeFilter();
28+
winrt::Windows::Foundation::Collections::IMap<winrt::hstring, winrt::Windows::Foundation::Collections::IVector<winrt::hstring>> FileTypeChoices();
29+
30+
winrt::hstring SuggestedFolder();
31+
void SuggestedFolder(winrt::hstring const& value);
32+
33+
winrt::hstring SuggestedStartFolder();
34+
void SuggestedStartFolder(winrt::hstring const& value);
2735

2836
winrt::Windows::Foundation::IAsyncOperation<winrt::Microsoft::Windows::Storage::Pickers::PickFileResult> PickSingleFileAsync();
2937
winrt::Windows::Foundation::IAsyncOperation<winrt::Windows::Foundation::Collections::IVectorView<winrt::Microsoft::Windows::Storage::Pickers::PickFileResult>> PickMultipleFilesAsync();
@@ -34,7 +42,18 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation
3442
PickerLocationId m_suggestedStartLocation{ PickerLocationId::Unspecified };
3543
winrt::hstring m_commitButtonText{};
3644

37-
winrt::Windows::Foundation::Collections::IVector<hstring> m_fileTypeFilter{ make<FileTypeFilterVector>() };
45+
winrt::Windows::Foundation::Collections::IVector<winrt::hstring> m_fileTypeFilter{ make<FileTypeFilterVector>() };
46+
winrt::Windows::Foundation::Collections::IMap<winrt::hstring, winrt::Windows::Foundation::Collections::IVector<winrt::hstring>> m_fileTypeChoices{
47+
[]()
48+
{
49+
auto map = winrt::make_self<FileTypeChoicesMap>();
50+
map->ForFeature_StoragePickers2 = true;
51+
return map.as<winrt::Windows::Foundation::Collections::IMap<winrt::hstring, winrt::Windows::Foundation::Collections::IVector<winrt::hstring>>>();
52+
}()
53+
};
54+
55+
winrt::hstring m_suggestedFolder{};
56+
winrt::hstring m_suggestedStartFolder{};
3857

3958
StoragePickersTelemetryHelper m_telemetryHelper{};
4059

dev/Interop/StoragePickers/FileSavePicker.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <winrt/Microsoft.UI.Interop.h>
1616
#include <winrt/Windows.Foundation.Collections.h>
1717
#include "TerminalVelocityFeatures-StoragePickers.h"
18+
#include "TerminalVelocityFeatures-StoragePickers2.h"
1819
#include "PickerCommon.h"
1920
#include "PickerLocalization.h"
2021
#include "PickFileResult.h"
@@ -63,10 +64,22 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation
6364
}
6465
void FileSavePicker::SuggestedFolder(hstring const& value)
6566
{
66-
PickerCommon::ValidateSuggestedFolder(value);
67+
PickerCommon::ValidateFolderPath(value, "SuggestedFolder");
6768
m_suggestedFolder = value;
6869
}
6970

71+
hstring FileSavePicker::SuggestedStartFolder()
72+
{
73+
THROW_HR_IF(E_NOTIMPL, !::Microsoft::Windows::Storage::Pickers::Feature_StoragePickers2::IsEnabled());
74+
return m_suggestedStartFolder;
75+
}
76+
void FileSavePicker::SuggestedStartFolder(hstring const& value)
77+
{
78+
THROW_HR_IF(E_NOTIMPL, !::Microsoft::Windows::Storage::Pickers::Feature_StoragePickers2::IsEnabled());
79+
PickerCommon::ValidateFolderPath(value, "SuggestedStartFolder");
80+
m_suggestedStartFolder = value;
81+
}
82+
7083
hstring FileSavePicker::SuggestedFileName()
7184
{
7285
return m_suggestedFileName;
@@ -82,10 +95,13 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation
8295
{
8396
parameters.HWnd = winrt::Microsoft::UI::GetWindowFromWindowId(m_windowId);
8497
parameters.CommitButtonText = m_commitButtonText;
85-
parameters.PickerLocationId = m_suggestedStartLocation;
8698
parameters.SuggestedFileName = m_suggestedFileName;
8799
parameters.SuggestedFolder = m_suggestedFolder;
88-
parameters.CaptureFilterSpec(m_fileTypeChoices.GetView());
100+
parameters.SuggestedStartLocation = m_suggestedStartLocation;
101+
parameters.SuggestedStartFolder = m_suggestedStartFolder;
102+
parameters.CaptureFilterSpecData(
103+
winrt::Windows::Foundation::Collections::IVectorView<winrt::hstring>{},
104+
m_fileTypeChoices.GetView());
89105
}
90106

91107
winrt::Windows::Foundation::IAsyncOperation<winrt::Microsoft::Windows::Storage::Pickers::PickFileResult> FileSavePicker::PickSaveFileAsync()

dev/Interop/StoragePickers/FileSavePicker.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation
2929
hstring SuggestedFolder();
3030
void SuggestedFolder(hstring const& value);
3131

32+
hstring SuggestedStartFolder();
33+
void SuggestedStartFolder(hstring const& value);
34+
3235
hstring SuggestedFileName();
3336
void SuggestedFileName(hstring const& value);
3437

@@ -41,6 +44,7 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation
4144
winrt::Windows::Foundation::Collections::IMap<hstring, winrt::Windows::Foundation::Collections::IVector<hstring>> m_fileTypeChoices{ make<FileTypeChoicesMap>() };
4245
hstring m_defaultFileExtension{};
4346
hstring m_suggestedFolder{};
47+
hstring m_suggestedStartFolder{};
4448
hstring m_suggestedFileName{};
4549
StoragePickersTelemetryHelper m_telemetryHelper{};
4650

dev/Interop/StoragePickers/FileTypeChoicesMap.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "pch.h"
55
#include "FileTypeChoicesMap.h"
66
#include "FileTypeFilterVector.h"
7+
#include "TerminalVelocityFeatures-StoragePickers2.h"
78

89
namespace winrt::Microsoft::Windows::Storage::Pickers::implementation
910
{
@@ -13,6 +14,11 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation
1314

1415
bool FileTypeChoicesMap::Insert(hstring const& key, winrt::Windows::Foundation::Collections::IVector<hstring> const& value)
1516
{
17+
if (ForFeature_StoragePickers2)
18+
{
19+
THROW_HR_IF(E_NOTIMPL, !::Microsoft::Windows::Storage::Pickers::Feature_StoragePickers2::IsEnabled());
20+
}
21+
1622
// Create a new FileTypeFilterVector and copy all values from the input vector
1723
auto validatingVector = make<FileTypeFilterVector>();
1824

dev/Interop/StoragePickers/FileTypeChoicesMap.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation
1313
{
1414
FileTypeChoicesMap();
1515

16+
bool ForFeature_StoragePickers2{ false };
17+
1618
// IMap<hstring, IVector<hstring>>
1719
winrt::Windows::Foundation::Collections::IVector<hstring> Lookup(hstring const& key) const;
1820
uint32_t Size() const;

dev/Interop/StoragePickers/FolderPicker.cpp

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <shobjidl_core.h>
1010
#include <winrt/Microsoft.UI.Interop.h>
1111
#include "TerminalVelocityFeatures-StoragePickers.h"
12+
#include "TerminalVelocityFeatures-StoragePickers2.h"
1213
#include "PickerCommon.h"
1314
#include "PickFolderResult.h"
1415
#include "PickerLocalization.h"
@@ -47,15 +48,38 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation
4748
PickerCommon::ValidateStringNoEmbeddedNulls(value);
4849
m_commitButtonText = value;
4950
}
51+
hstring FolderPicker::SuggestedFolder()
52+
{
53+
THROW_HR_IF(E_NOTIMPL, !::Microsoft::Windows::Storage::Pickers::Feature_StoragePickers2::IsEnabled());
54+
return m_suggestedFolder;
55+
}
56+
void FolderPicker::SuggestedFolder(hstring const& value)
57+
{
58+
THROW_HR_IF(E_NOTIMPL, !::Microsoft::Windows::Storage::Pickers::Feature_StoragePickers2::IsEnabled());
59+
PickerCommon::ValidateFolderPath(value, "SuggestedFolder");
60+
m_suggestedFolder = value;
61+
}
62+
hstring FolderPicker::SuggestedStartFolder()
63+
{
64+
THROW_HR_IF(E_NOTIMPL, !::Microsoft::Windows::Storage::Pickers::Feature_StoragePickers2::IsEnabled());
65+
return m_suggestedStartFolder;
66+
}
67+
void FolderPicker::SuggestedStartFolder(hstring const& value)
68+
{
69+
THROW_HR_IF(E_NOTIMPL, !::Microsoft::Windows::Storage::Pickers::Feature_StoragePickers2::IsEnabled());
70+
PickerCommon::ValidateFolderPath(value, "SuggestedStartFolder");
71+
m_suggestedStartFolder = value;
72+
}
5073

5174
void FolderPicker::CaptureParameters(PickerCommon::PickerParameters& parameters)
5275
{
5376
parameters.HWnd = winrt::Microsoft::UI::GetWindowFromWindowId(m_windowId);
5477
parameters.CommitButtonText = m_commitButtonText;
55-
parameters.PickerLocationId = m_suggestedStartLocation;
78+
parameters.SuggestedFolder = m_suggestedFolder;
79+
parameters.SuggestedStartLocation = m_suggestedStartLocation;
80+
parameters.SuggestedStartFolder = m_suggestedStartFolder;
5681
}
5782

58-
5983
winrt::Windows::Foundation::IAsyncOperation<winrt::Microsoft::Windows::Storage::Pickers::PickFolderResult> FolderPicker::PickSingleFolderAsync()
6084
{
6185
// TODO: remove get strong reference when telementry is safe stop

dev/Interop/StoragePickers/FolderPicker.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation
2121
hstring CommitButtonText();
2222
void CommitButtonText(hstring const& value);
2323

24+
hstring SuggestedFolder();
25+
void SuggestedFolder(hstring const& value);
26+
27+
hstring SuggestedStartFolder();
28+
void SuggestedStartFolder(hstring const& value);
29+
2430
winrt::Windows::Foundation::IAsyncOperation<winrt::Microsoft::Windows::Storage::Pickers::PickFolderResult> PickSingleFolderAsync();
2531

2632
private:
@@ -29,6 +35,8 @@ namespace winrt::Microsoft::Windows::Storage::Pickers::implementation
2935
PickerViewMode m_viewMode{ PickerViewMode::List };
3036
PickerLocationId m_suggestedStartLocation{ PickerLocationId::Unspecified };
3137
hstring m_commitButtonText{};
38+
hstring m_suggestedFolder{};
39+
hstring m_suggestedStartFolder{};
3240
StoragePickersTelemetryHelper m_telemetryHelper{};
3341

3442
void CaptureParameters(PickerCommon::PickerParameters& parameters);

0 commit comments

Comments
 (0)