Skip to content

Commit d2e5397

Browse files
committed
Preserve thumbnail aspect ratio
1 parent 94e1645 commit d2e5397

8 files changed

Lines changed: 43 additions & 7 deletions

File tree

src/Platforms/SecureFolderFS.Maui/Popups/PropertiesPopup.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
</Border.StrokeShape>
5151
<Image
5252
x:Name="ImageView"
53+
Aspect="{Binding Thumbnail, Converter={StaticResource ThumbnailToAspectConverter}}"
5354
BindingContext="{Binding ViewModel, Mode=OneWay}"
5455
HeightRequest="40"
5556
HorizontalOptions="Center"

src/Platforms/SecureFolderFS.Maui/Resources/Styles/Converters.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<vc:NullToOpacityConverter x:Key="NullToOpacityConverter" />
1515
<vc:ImageToSourceConverter x:Key="ImageToSourceConverter" />
1616
<vc:DateTimeToStringConverter x:Key="DateTimeToStringConverter" />
17+
<vc:ThumbnailToAspectConverter x:Key="ThumbnailToAspectConverter" />
1718
<vc:StringInterpolationConverter x:Key="StringInterpolationConverter" />
1819

1920
</ResourceDictionary>

src/Platforms/SecureFolderFS.Maui/UserControls/Browser/BrowserControl.Rendering.xaml.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using SecureFolderFS.Maui.ValueConverters;
22
using SecureFolderFS.Sdk.Enums;
33
using SecureFolderFS.Sdk.Services;
4-
using SecureFolderFS.Sdk.ViewModels.Controls.Storage.Browser;
54
using SecureFolderFS.Shared.ComponentModel;
65

76
namespace SecureFolderFS.Maui.UserControls.Browser
@@ -80,7 +79,7 @@ public async Task ReloadCollectionViewAsync()
8079
#else
8180
newCollectionView.SetBinding(SelectableItemsView.SelectionModeProperty,
8281
new Binding(nameof(IsSelecting), mode: BindingMode.OneWay, source: this,
83-
converter: GetConverter("BoolSelectionModeConverter")));
82+
converter: GetConverter(nameof(BoolSelectionModeConverter))));
8483
#endif
8584

8685
// Wire up the events
@@ -166,7 +165,7 @@ private void ItemsCollectionView_Loaded(object? sender, EventArgs e)
166165
// On other platforms, bind SelectionMode to IsSelecting
167166
_collectionView?.SetBinding(SelectableItemsView.SelectionModeProperty,
168167
new Binding(nameof(IsSelecting), mode: BindingMode.OneWay, source: this,
169-
converter: GetConverter("BoolSelectionModeConverter")));
168+
converter: GetConverter(nameof(BoolSelectionModeConverter))));
170169
#endif
171170
}
172171

src/Platforms/SecureFolderFS.Maui/UserControls/Browser/BrowserControl.xaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
<HorizontalStackLayout Grid.Column="0" Spacing="8">
6363
<CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}" IsVisible="{Binding ParentFolder.BrowserViewModel.IsSelecting, Mode=OneWay}" />
6464
<Image
65+
Aspect="{Binding Thumbnail, Converter={StaticResource ThumbnailToAspectConverter}}"
6566
HeightRequest="40"
6667
HorizontalOptions="Center"
6768
IsOpaque="True"
@@ -159,6 +160,7 @@
159160
</Grid.RowDefinitions>
160161
<Image
161162
Grid.Row="0"
163+
Aspect="{Binding Thumbnail, Converter={StaticResource ThumbnailToAspectConverter}}"
162164
IsOpaque="True"
163165
Source="{Binding Thumbnail, Converter={StaticResource FileIconConverter}, ConverterParameter={x:Reference SourceGrid}}" />
164166

@@ -245,7 +247,7 @@
245247
HeightRequest="{Binding Width, Source={x:Reference SourceGrid}}"
246248
Style="{StaticResource SelectableItemGridStyle}">
247249
<Image
248-
Aspect="AspectFill"
250+
Aspect="{Binding Thumbnail, Converter={StaticResource ThumbnailToAspectConverter}}"
249251
HorizontalOptions="Fill"
250252
IsOpaque="True"
251253
Source="{Binding Thumbnail, Converter={StaticResource FileIconConverter}, ConverterParameter={x:Reference SourceGrid}}"

src/Platforms/SecureFolderFS.Maui/ValueConverters/FileIconConverter.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010

1111
namespace SecureFolderFS.Maui.ValueConverters
1212
{
13+
/// <summary>
14+
/// Converts file-related image data into an appropriate <see cref="ImageSource"/>
15+
/// representation for display purposes. This converter is designed to handle
16+
/// file type determination and generate corresponding icons or thumbnails.
17+
/// </summary>
1318
internal sealed class FileIconConverter : IValueConverter
1419
{
1520
/// <inheritdoc/>
@@ -18,17 +23,19 @@ internal sealed class FileIconConverter : IValueConverter
1823
if (parameter is not View { BindingContext: IWrapper<IStorable> storableWrapper })
1924
return ImageSource.FromFile(GetDefaultFileIcon());
2025

21-
// Thumbnail loaded return optimized ImageSource
26+
// Thumbnail loaded - return optimized ImageSource
2227
if (value is IImage image)
2328
return FromImage(image);
2429

25-
// Fallback icon (folder, file, PDF, archive)
30+
// Fallback icon (folder, file, PDF, archive, etc.)
2631
return GetFallbackImageSource(storableWrapper);
2732
}
2833

2934
/// <inheritdoc/>
3035
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
31-
=> throw new NotImplementedException();
36+
{
37+
throw new NotImplementedException();
38+
}
3239

3340
private static ImageSource FromImage(IImage image)
3441
{
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System.Globalization;
2+
using IImage = SecureFolderFS.Shared.ComponentModel.IImage;
3+
4+
namespace SecureFolderFS.Maui.ValueConverters
5+
{
6+
/// <summary>
7+
/// Returns AspectFill when a real thumbnail (IImage) is present,
8+
/// otherwise AspectFit for static fallback icons (folder/file/PDF/etc.).
9+
/// </summary>
10+
internal sealed class ThumbnailToAspectConverter : IValueConverter
11+
{
12+
/// <inheritdoc/>
13+
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
14+
{
15+
return value is IImage ? Aspect.AspectFill : Aspect.AspectFit;
16+
}
17+
18+
/// <inheritdoc/>
19+
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
20+
{
21+
throw new NotImplementedException();
22+
}
23+
}
24+
}

src/Platforms/SecureFolderFS.Maui/Views/Modals/Vault/BrowserSearchModalPage.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
ColumnSpacing="12">
6969
<Image
7070
Grid.Column="0"
71+
Aspect="{Binding Thumbnail, Converter={StaticResource ThumbnailToAspectConverter}}"
7172
HeightRequest="32"
7273
HorizontalOptions="Center"
7374
Source="{Binding Thumbnail, Converter={StaticResource FileIconConverter}, ConverterParameter={x:Reference SourceGrid}}"

src/Platforms/SecureFolderFS.Maui/Views/Modals/Vault/RecycleBinModalPage.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@
192192
<HorizontalStackLayout Grid.Column="0" Spacing="8">
193193
<CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}" IsVisible="{Binding OverlayViewModel.IsSelecting, Mode=OneWay}" />
194194
<Image
195+
Aspect="{Binding Thumbnail, Converter={StaticResource ThumbnailToAspectConverter}}"
195196
HeightRequest="32"
196197
HorizontalOptions="Center"
197198
Source="{Binding Thumbnail, Mode=OneWay, Converter={StaticResource FileIconConverter}, ConverterParameter={x:Reference SourceGrid}}"

0 commit comments

Comments
 (0)