Skip to content

Commit e50ce80

Browse files
authored
Merge pull request #5 from Matheos96/dev
Implement IConfiguration and use-cases
2 parents 88ac63a + 2ac0257 commit e50ce80

6 files changed

Lines changed: 55 additions & 11 deletions

File tree

MainWindow.axaml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
Icon="avares://SelectSight/Assets/icon.ico">
1010

1111
<Grid RowDefinitions="*,Auto" Background="WhiteSmoke">
12-
<Grid Grid.Row="0" ColumnDefinitions="8*,1*">
12+
<Grid x:Name="FilesGrid" Grid.Row="0" ColumnDefinitions="8*,1*">
1313
<Border Grid.Column="0" BorderBrush="LightGray" BorderThickness="0,0,1,0" Background="Transparent">
1414
<Grid RowDefinitions="Auto,*">
1515
<ListBox Grid.Row="1"
@@ -37,7 +37,8 @@
3737
VerticalAlignment="Stretch"
3838
Background="Transparent">
3939
<Image Source="{Binding Thumbnail}"
40-
Width="300" Height="300"
40+
Width="{Binding Source={x:Static selectSight:Program.AppSettings}, Path=ThumbnailSize}"
41+
Height="{Binding Source={x:Static selectSight:Program.AppSettings}, Path=ThumbnailSize}"
4142
Stretch="Uniform"
4243
ClipToBounds="True"
4344
VerticalAlignment="Center"
@@ -47,7 +48,7 @@
4748
TextAlignment="Center"
4849
TextWrapping="NoWrap"
4950
TextTrimming="CharacterEllipsis"
50-
MaxWidth="300"
51+
MaxWidth="{Binding Source={x:Static selectSight:Program.AppSettings}, Path=ThumbnailSize}"
5152
ToolTip.Tip="{Binding Name}"
5253
Margin="0,5,0,0"/>
5354
</StackPanel>
@@ -57,7 +58,7 @@
5758
</Grid>
5859
</Border>
5960

60-
<Border Grid.Column="1" Background="Transparent">
61+
<Border Grid.Column="1" Background="Transparent" x:Name="SelectedFilesBorder">
6162
<ListBox x:Name="SelectedFilesListBox" Background="Transparent">
6263
<ListBox.ItemTemplate>
6364
<DataTemplate x:DataType="selectSight:FileItem">

MainWindow.axaml.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,23 @@ public partial class MainWindow : Window
3434
public MainWindow()
3535
{
3636
InitializeComponent();
37+
38+
InitConditionalUiElements();
3739

3840
AllFilesListBox.ItemsSource = _allFiles;
3941
SelectedFilesListBox.ItemsSource = _selectedFiles;
4042
AllFilesListBox.SelectedItems = _selectedFiles;
4143

4244
_ = Initialize(); // Start the initialization process asynchronously
4345
}
46+
47+
private void InitConditionalUiElements()
48+
{
49+
// Show/hide the selected files list based on app settings
50+
if (Program.AppSettings.ShowSelectedFilesList) return;
51+
SelectedFilesBorder.IsVisible = false;
52+
FilesGrid.ColumnDefinitions = new ColumnDefinitions("*, Auto");
53+
}
4454

4555
private async Task Initialize()
4656
{

Program.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,39 @@
22

33
using System;
44
using Avalonia;
5+
using Microsoft.Extensions.Configuration;
56

67
class Program
78
{
9+
public static AppSettings AppSettings { get; private set; } = null!;
10+
811
// Initialization code. Don't use any Avalonia, third-party APIs or any
912
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
1013
// yet and stuff might break.
1114
[STAThread]
12-
public static void Main(string[] args) => BuildAvaloniaApp()
13-
.StartWithClassicDesktopLifetime(args);
15+
public static void Main(string[] args)
16+
{
17+
var configuration = new ConfigurationBuilder()
18+
.AddJsonFile("appsettings.json", optional:true)
19+
.Build();
20+
21+
AppSettings = configuration.GetSection("AppSettings").Get<AppSettings>() ?? new AppSettings();
22+
23+
BuildAvaloniaApp()
24+
.StartWithClassicDesktopLifetime(args);
25+
}
1426

1527
// Avalonia configuration, don't remove; also used by visual designer.
1628
public static AppBuilder BuildAvaloniaApp()
1729
=> AppBuilder.Configure<App>()
1830
.UsePlatformDetect()
1931
.WithInterFont()
2032
.LogToTrace();
33+
}
34+
35+
internal class AppSettings
36+
{
37+
public bool ReadExif { get; init; } = true;
38+
public bool ShowSelectedFilesList { get; init; } = true;
39+
public int ThumbnailSize { get; init; } = 300; // Default thumbnail size is 300 pixels
2140
}

SelectSight.csproj

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,20 @@
2222
<PrivateAssets Condition="'$(Configuration)' != 'Debug'">All</PrivateAssets>
2323
</PackageReference>
2424

25+
<!-- Non-Avalonia (3rdparty) packages -->
2526
<PackageReference Include="MessageBox.Avalonia" Version="3.2.0" />
26-
2727
<PackageReference Include="MetadataExtractor" Version="2.8.1" />
28+
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="9.0.7" />
29+
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.7" />
2830
</ItemGroup>
2931

3032
<ItemGroup>
3133
<None Remove="Assets\icon.ico" />
3234
<AvaloniaResource Include="Assets\icon.ico" />
3335
<None Remove="Assets\no-photo.png" />
3436
<AvaloniaResource Include="Assets\no-photo.png" />
37+
<None Update="appsettings.json">
38+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
39+
</None>
3540
</ItemGroup>
3641
</Project>

ThumbnailUtils.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,17 @@ namespace SelectSight;
1111

1212
public static class ThumbnailUtils
1313
{
14-
private const int TargetThumbnailSize = 300; // Define target size once
15-
1614
public static async Task<Bitmap?> GenerateBitmap(Stream fileStream)
1715
{
16+
var thumbnailSize = Program.AppSettings.ThumbnailSize;
17+
// First check app settings to see if we should read EXIF data
18+
if (!Program.AppSettings.ReadExif) return Bitmap.DecodeToWidth(fileStream, thumbnailSize);
19+
1820
var skEncodedOrigin = GetSkiaEncodedOrigin(fileStream);
1921
fileStream.Position = 0; // Reset stream position to the beginning for decoding
2022

2123
// If no adjustment is needed, decode directly to the target size
22-
if (skEncodedOrigin == SKEncodedOrigin.Default) return Bitmap.DecodeToWidth(fileStream, TargetThumbnailSize);
24+
if (skEncodedOrigin == SKEncodedOrigin.Default) return Bitmap.DecodeToWidth(fileStream, thumbnailSize);
2325

2426
// Needs adjustment for orientation
2527
using var originalDecodedBitmap = SKBitmap.Decode(fileStream);
@@ -47,7 +49,7 @@ public static class ThumbnailUtils
4749

4850
// 3. Resize the finalSkBitmap (which is now correctly oriented)
4951
// Calculate target dimensions maintaining aspect ratio
50-
var scale = Math.Min((float)TargetThumbnailSize / orientedBitmap.Width, (float)TargetThumbnailSize / orientedBitmap.Height);
52+
var scale = Math.Min((float)thumbnailSize / orientedBitmap.Width, (float)thumbnailSize / orientedBitmap.Height);
5153
var finalScaledWidth = (int)(orientedBitmap.Width * scale);
5254
var finalScaledHeight = (int)(orientedBitmap.Height * scale);
5355

appsettings.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"AppSettings": {
3+
"ReadEXIF": "true",
4+
"ShowSelectedFilesList": "false",
5+
"ThumbnailSize": "300"
6+
}
7+
}

0 commit comments

Comments
 (0)