@@ -35,10 +35,6 @@ internal enum ImageInfos
35
35
internal class Context
36
36
{
37
37
private static Context _Instance ;
38
-
39
- private readonly string [ ] FileTypes = { ".jpg" , ".jpeg" , ".bmp" , ".png" , ".gif" , ".tif" , ".ico" , ".webp" , ".svg" } ;
40
- private readonly string [ ] SaveTypes = { ".jpg" , ".png" , ".webp" } ;
41
-
42
38
private string [ ] FolderFiles ;
43
39
private int CurrentIndex ;
44
40
private bool MemoryOnly ;
@@ -61,7 +57,7 @@ public void ChangeTheme(ElementTheme theme)
61
57
/// </summary>
62
58
public bool CheckFileExtension ( string path )
63
59
{
64
- return FileTypes . Any ( x => path . EndsWith ( x , true , null ) ) ;
60
+ return Image . SupportedFileTypes . Any ( x => path . EndsWith ( x , true , null ) ) ;
65
61
}
66
62
67
63
/// <summary>
@@ -89,7 +85,7 @@ public void LoadDirectoryFiles()
89
85
if ( ! string . IsNullOrEmpty ( CurrentFilePath ) )
90
86
{
91
87
FolderFiles = Directory . EnumerateFiles ( Path . GetDirectoryName ( CurrentFilePath ) , "*.*" , SearchOption . TopDirectoryOnly )
92
- . Where ( s => FileTypes . Any ( x => s . EndsWith ( x , true , null ) ) )
88
+ . Where ( s => Image . SupportedFileTypes . Any ( x => s . EndsWith ( x , true , null ) ) )
93
89
. OrderBy ( s => s , new NaturalStringComparer ( ) )
94
90
. ToArray ( ) ;
95
91
@@ -160,7 +156,7 @@ public async void LoadImageFromPicker()
160
156
{
161
157
FileOpenPicker openFilePicker = new ( ) ;
162
158
163
- foreach ( string fileType in FileTypes )
159
+ foreach ( string fileType in Image . SupportedFileTypes )
164
160
{
165
161
openFilePicker . FileTypeFilter . Add ( fileType ) ;
166
162
}
@@ -174,7 +170,7 @@ public async void LoadImageFromPicker()
174
170
175
171
MemoryOnly = false ;
176
172
177
- LoadImage ( ) ;
173
+ OpenImage ( ) ;
178
174
LoadDirectoryFiles ( ) ;
179
175
}
180
176
@@ -187,7 +183,7 @@ public async void LoadImageFromBuffer(RandomAccessStreamReference clipboard)
187
183
MemoryOnly = true ;
188
184
189
185
MainWindow . SplitViewContainer . IsPaneOpen = false ;
190
- LoadImage ( await clipboard . OpenReadAsync ( ) ) ;
186
+ OpenImage ( await clipboard . OpenReadAsync ( ) ) ;
191
187
192
188
MainWindow . UpdateTitle ( Culture . GetString ( "SYSTEM_PASTED_CONTENT" ) ) ;
193
189
}
@@ -202,7 +198,7 @@ public bool LoadImageFromString(string imagePath, bool reloadDirectories = false
202
198
CurrentFilePath = imagePath ;
203
199
MemoryOnly = false ;
204
200
205
- LoadImage ( ) ;
201
+ OpenImage ( ) ;
206
202
207
203
if ( reloadDirectories )
208
204
{
@@ -223,7 +219,6 @@ public void UpdateFileInfo()
223
219
MainWindow . TextBlockInfoDate . Text = data [ ImageInfos . FileDate ] ;
224
220
MainWindow . TextBlockInfoDimensions . Text = data [ ImageInfos . ImageDimensions ] ;
225
221
MainWindow . TextBlockInfoSize . Text = data [ ImageInfos . ImageSize ] ;
226
- MainWindow . TextBlockInfoDpi . Text = data [ ImageInfos . ImageDpi ] ;
227
222
MainWindow . TextBlockInfoDepth . Text = data [ ImageInfos . ImageDepth ] ;
228
223
MainWindow . TextBlockInfoFolder . Text = data [ ImageInfos . FolderPath ] ;
229
224
}
@@ -239,7 +234,6 @@ public Dictionary<ImageInfos, string> GetFileInfos()
239
234
{ ImageInfos . FileDate , "" } ,
240
235
{ ImageInfos . ImageDimensions , "" } ,
241
236
{ ImageInfos . ImageSize , "" } ,
242
- { ImageInfos . ImageDpi , "" } ,
243
237
{ ImageInfos . ImageDepth , "" } ,
244
238
{ ImageInfos . FolderPath , "" }
245
239
} ;
@@ -253,7 +247,6 @@ public Dictionary<ImageInfos, string> GetFileInfos()
253
247
dict [ ImageInfos . FileDate ] = File . GetLastWriteTime ( CurrentFilePath ) . ToString ( CultureInfo . CurrentCulture ) ;
254
248
dict [ ImageInfos . ImageSize ] = HumanizeBytes ( oFileInfo . Length ) ;
255
249
dict [ ImageInfos . ImageDimensions ] = CurrentImage . GetImageDimensionsAsString ( ) ;
256
- dict [ ImageInfos . ImageDpi ] = CurrentImage . GetDpiAsString ( ) ;
257
250
dict [ ImageInfos . ImageDepth ] = CurrentImage . GetDepthAsString ( ) ;
258
251
259
252
return dict ;
@@ -305,6 +298,12 @@ public void DeleteImage()
305
298
/// </summary>
306
299
public void LoadingDisplay ( bool status )
307
300
{
301
+ if ( status )
302
+ {
303
+ MainWindow . GlobalErrorMessage . Visibility = Visibility . Collapsed ;
304
+ MainWindow . GlobalErrorMessageFileName . Text = "" ;
305
+ }
306
+
308
307
MainWindow . ImageLoadingIndicator . IsActive = status ;
309
308
MainWindow . ImageView . Opacity = status ? 0 : 1 ;
310
309
@@ -389,6 +388,8 @@ public void UpdateButtonsAccessiblity()
389
388
390
389
MainWindow . ButtonImageDelete . IsEnabled = true ;
391
390
MainWindow . ButtonFileSave . IsEnabled = true ;
391
+
392
+ MainWindow . ButtonFileInfo . IsEnabled = CurrentFilePath != null ;
392
393
}
393
394
else
394
395
{
@@ -401,6 +402,8 @@ public void UpdateButtonsAccessiblity()
401
402
402
403
MainWindow . ButtonImageDelete . IsEnabled = false ;
403
404
MainWindow . ButtonFileSave . IsEnabled = false ;
405
+
406
+ MainWindow . ButtonFileInfo . IsEnabled = false ;
404
407
}
405
408
406
409
if ( FolderFiles is { Length : > 1 } )
@@ -414,8 +417,6 @@ public void UpdateButtonsAccessiblity()
414
417
MainWindow . ButtonImageNext . IsEnabled = false ;
415
418
}
416
419
417
- MainWindow . ButtonFileInfo . IsEnabled = CurrentFilePath != null ;
418
-
419
420
MainWindow . ButtonImageTransformFlipHorizontal . IsEnabled = MainWindow . ButtonImageTransform . IsEnabled ;
420
421
MainWindow . ButtonImageTransformFlipVertical . IsEnabled = MainWindow . ButtonImageTransform . IsEnabled ;
421
422
MainWindow . ButtonImageTransformRotateLeft . IsEnabled = MainWindow . ButtonImageTransform . IsEnabled ;
@@ -472,21 +473,27 @@ public async void SaveAs()
472
473
{
473
474
if ( ! HasImageLoaded ( ) ) return ;
474
475
475
- FileSavePicker saveFilePicker = new ( )
476
+ FileSavePicker saveFilePicker = new ( ) ;
477
+
478
+ if ( CurrentFilePath != null )
476
479
{
477
- SuggestedFileName = Path . GetFileNameWithoutExtension ( CurrentFilePath )
478
- } ;
480
+ saveFilePicker . SuggestedFileName = Path . GetFileNameWithoutExtension ( CurrentFilePath ) ;
481
+ }
482
+ else
483
+ {
484
+ saveFilePicker . SuggestedFileName = DateTime . Now . ToString ( "yyyy-MM-dd-hh-mm-ss" ) ;
485
+ }
479
486
480
- foreach ( string fileType in SaveTypes )
487
+ foreach ( string fileType in Image . SaveFileTypes )
481
488
{
482
- saveFilePicker . FileTypeChoices . Add ( fileType , new List < string > ( ) { fileType } ) ;
489
+ saveFilePicker . FileTypeChoices . Add ( Culture . GetString ( "FOOTER_TOOLBAR_MENU_FILE_SAVE_FORMAT" ) . Replace ( "{0}" , fileType . Remove ( 0 , 1 ) . ToUpper ( ) ) , new List < string > ( ) { fileType } ) ;
483
490
}
484
491
485
492
InitializeWithWindow . Initialize ( saveFilePicker , WindowNative . GetWindowHandle ( MainWindow ) ) ;
486
493
StorageFile outputFile = await saveFilePicker . PickSaveFileAsync ( ) ;
487
494
488
495
if ( outputFile == null ) return ;
489
- if ( ! SaveTypes . Contains ( outputFile . FileType ) ) return ;
496
+ if ( ! Image . SaveFileTypes . Contains ( outputFile . FileType ) ) return ;
490
497
491
498
CurrentImage . Save ( outputFile . Path , outputFile . FileType ) ;
492
499
@@ -505,80 +512,97 @@ public void ReloadImageView()
505
512
CreateOptions = BitmapCreateOptions . IgnoreImageCache ,
506
513
} ;
507
514
508
- bitmapImage . ImageOpened += CurrentImage_ImageOpened ;
509
- bitmapImage . ImageFailed += CurrentImage_ImageFailed ;
515
+ bitmapImage . ImageOpened += ImageView_ImageOpened ;
516
+ bitmapImage . ImageFailed += ImageView_ImageFailed ;
510
517
511
518
MainWindow . ImageView . Source = bitmapImage ;
512
519
513
520
bitmapImage . SetSource ( CurrentImage . GetBitmapImageSource ( ) ) ;
514
521
}
515
522
516
523
/// <summary>
517
- /// Load current image
524
+ /// Event: When image view is loaded and ready.
518
525
/// </summary>
519
- private void LoadImage ( IInputStream stream = null )
526
+ private void ImageView_ImageOpened ( object sender , RoutedEventArgs e )
520
527
{
521
- CurrentImage ? . Dispose ( ) ;
522
-
523
- LoadingDisplay ( true ) ;
524
-
525
- CurrentImage = new ( ) ;
526
- CurrentImage . ImageLoaded += CurrentImage_ImageLoaded ;
528
+ if ( ! HasImageLoaded ( ) ) return ;
527
529
528
- if ( stream != null )
530
+ if ( CurrentFilePath != null )
529
531
{
530
- CurrentImage . Load ( stream ) ;
532
+ MainWindow . UpdateTitle ( Path . GetFileName ( CurrentFilePath ) ) ;
531
533
}
532
- else
534
+
535
+ UpdateButtonsAccessiblity ( ) ;
536
+ AdjustImage ( ) ;
537
+
538
+ LoadingDisplay ( false ) ;
539
+
540
+ if ( MainWindow . SplitViewContainer . IsPaneOpen )
533
541
{
534
- CurrentImage . Load ( CurrentFilePath ) ;
542
+ UpdateFileInfo ( ) ;
535
543
}
536
544
}
537
545
538
546
/// <summary>
539
- /// Event: When image is loaded.
547
+ /// Event: When image view loaded failed .
540
548
/// </summary>
541
- private void CurrentImage_ImageLoaded ( object sender , EventArgs e )
549
+ private void ImageView_ImageFailed ( object sender , ExceptionRoutedEventArgs e )
542
550
{
543
- ReloadImageView ( ) ;
551
+ MainWindow . UpdateTitle ( ) ;
552
+ MainWindow . ImageLoadingIndicator . IsActive = false ;
553
+
554
+ CurrentImage = null ;
555
+
556
+ UpdateButtonsAccessiblity ( ) ;
544
557
}
545
558
546
559
/// <summary>
547
- /// Event: When image is opened.
560
+ /// Load current image
548
561
/// </summary>
549
- private void CurrentImage_ImageOpened ( object sender , RoutedEventArgs e )
562
+ private void OpenImage ( IInputStream stream = null )
550
563
{
551
- if ( ! HasImageLoaded ( ) ) return ;
552
-
553
- if ( CurrentFilePath != null )
554
- {
555
- MainWindow . UpdateTitle ( Path . GetFileName ( CurrentFilePath ) ) ;
556
- }
564
+ CurrentImage ? . Dispose ( ) ;
557
565
558
- UpdateButtonsAccessiblity ( ) ;
559
- AdjustImage ( ) ;
566
+ LoadingDisplay ( true ) ;
560
567
561
- LoadingDisplay ( false ) ;
568
+ CurrentImage = new ( ) ;
569
+ CurrentImage . ImageLoaded += WorkingImage_ImageLoaded ;
570
+ CurrentImage . ImageFailed += WorkingImage_ImageFailed ;
562
571
563
- if ( MainWindow . SplitViewContainer . IsPaneOpen )
572
+ if ( stream != null )
564
573
{
565
- UpdateFileInfo ( ) ;
574
+ CurrentImage . Load ( stream ) ;
575
+ }
576
+ else
577
+ {
578
+ CurrentImage . Load ( CurrentFilePath ) ;
566
579
}
567
580
}
568
581
569
582
/// <summary>
570
- /// Event: When image loaded failed.
583
+ /// Event: When image load failed.
571
584
/// </summary>
572
- private void CurrentImage_ImageFailed ( object sender , ExceptionRoutedEventArgs e )
585
+ private void WorkingImage_ImageFailed ( object sender , EventArgs e )
573
586
{
574
587
MainWindow . UpdateTitle ( ) ;
588
+
575
589
MainWindow . ImageLoadingIndicator . IsActive = false ;
590
+ MainWindow . GlobalErrorMessage . Visibility = Visibility . Visible ;
576
591
577
- CurrentImage = null ;
592
+ MainWindow . GlobalErrorMessageFileName . Text = ( ( ImageFailedEventArgs ) e ) . Path ;
578
593
594
+ CurrentImage . Dispose ( ) ;
579
595
UpdateButtonsAccessiblity ( ) ;
580
596
}
581
597
598
+ /// <summary>
599
+ /// Event: When image is loaded.
600
+ /// </summary>
601
+ private void WorkingImage_ImageLoaded ( object sender , EventArgs e )
602
+ {
603
+ ReloadImageView ( ) ;
604
+ }
605
+
582
606
/// <summary>
583
607
/// Round value to unit 10.
584
608
/// </summary>
0 commit comments