Skip to content

Commit dfff4c1

Browse files
committed
📂 v3.1.1
Added: - Open folder option (Ctrl+Shift+O) Changes: - New hotkey for "Open folder recursively": Alt+O Fixed: - App crashes if a corrupted file is first in the folder - App hangs if a previous file is corrupted - Error on "Save as" if this file is currently opened - App hangs if trying to open multiple corrupted files in a row
1 parent 764d127 commit dfff4c1

File tree

82 files changed

+324
-106
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+324
-106
lines changed

.vs/quick-picture-viewer/v16/.suo

45 KB
Binary file not shown.
Binary file not shown.
3.87 KB
Binary file not shown.

inno-setup/beta/v3.0.0-beta1.exe

-3.68 MB
Binary file not shown.

inno-setup/beta/v3.0.1-beta2.exe

-3.69 MB
Binary file not shown.

inno-setup/beta/v3.0.2-beta3.exe

-3.69 MB
Binary file not shown.

inno-setup/beta/v3.0.3-beta4.exe

-2.96 MB
Binary file not shown.

inno-setup/quick-picture-viewer.iss

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#define MyAppName "Quick Picture Viewer"
2-
#define MyAppVersion "3.1.0"
2+
#define MyAppVersion "3.1.1"
33
#define MyAppPublisher "Module Art"
44
#define MyAppURL "https://moduleart.github.io/quick-picture-viewer"
55
#define MyAppExeName "quick-picture-viewer.exe"
@@ -196,14 +196,4 @@ Root: HKCR; Subkey: "PsdImg\shell\open\command"; ValueType: string; ValueName: "
196196
Root: HKCR; Subkey: ".cr2"; ValueType: string; ValueName: ""; ValueData: "Cr2Img"; Flags: uninsdeletevalue
197197
Root: HKCR; Subkey: "Cr2Img"; ValueType: string; ValueName: ""; ValueData: "CR2 image (Canon Digital Camera Raw)"; Flags: uninsdeletekey
198198
Root: HKCR; Subkey: "Cr2Img\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\icons\cr2.ico"
199-
Root: HKCR; Subkey: "Cr2Img\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""
200-
201-
202-
203-
204-
205-
; ICO fix
206-
Root: HKCR; Subkey: ".ico"; ValueType: none; ValueName: ""; ValueData: "IcoImg"; Flags: deletevalue
207-
Root: HKCR; Subkey: "IcoImg"; ValueType: none; ValueName: ""; ValueData: "ICO image (Icons file)"; Flags: deletevalue
208-
Root: HKCR; Subkey: "IcoImg\DefaultIcon"; ValueType: none; ValueName: ""; ValueData: "{app}\icons\ico.ico"; Flags: deletevalue;
209-
Root: HKCR; Subkey: "IcoImg\shell\open\command"; ValueType: none; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Flags: deletevalue
199+
Root: HKCR; Subkey: "Cr2Img\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""

quick-picture-viewer/CustomOpenFolderDialog.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
using Microsoft.WindowsAPICodePack.Dialogs;
2-
using QuickLibrary;
32

43
namespace quick_picture_viewer
54
{
65
class CustomOpenFolderDialog
76
{
8-
public static string GetFolder()
7+
public static string GetFolder(string title)
98
{
109
CommonOpenFileDialog dialog = new CommonOpenFileDialog();
1110
dialog.IsFolderPicker = true;
12-
dialog.Title = LangMan.Get("open-recursive");
11+
dialog.Title = title;
1312
if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
1413
{
1514
string p = dialog.FileName;

quick-picture-viewer/MainForm.Designer.cs

Lines changed: 22 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

quick-picture-viewer/MainForm.cs

Lines changed: 97 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ private void InitLanguage()
200200

201201
openBtn.Text = LangMan.Get("open");
202202
openFileBtn.Text = LangMan.Get("open-file");
203+
openFolderBtn.Text = LangMan.Get("open-folder");
203204
openRecursive.Text = LangMan.Get("open-recursive");
204205

205206
saveAsButton.Text = LangMan.Get("save-as") + " | Ctrl+S";
@@ -351,7 +352,7 @@ private void showTypeOpsButton(bool show, string type = null)
351352
}));
352353
}
353354

354-
private void openFile(string path)
355+
private void openFile(string path, bool goPrev = false)
355356
{
356357
try
357358
{
@@ -435,25 +436,23 @@ private void openFile(string path)
435436
}
436437
else
437438
{
438-
if (ext == ".gif")
439-
{
440-
openImage(new Bitmap(path), Path.GetDirectoryName(path), Path.GetFileName(path));
441-
}
442-
else
443-
{
444-
using (Image img = Image.FromFile(path, true))
445-
{
446-
openImage(new Bitmap(path), Path.GetDirectoryName(path), Path.GetFileName(path));
447-
}
448-
}
439+
openImage(new Bitmap(path), Path.GetDirectoryName(path), Path.GetFileName(path));
449440
}
450441

451442
if (!showTypeOps) showTypeOpsButton(false);
452443
}
453444
catch
454445
{
455-
if (NextFile(true) > 1) showSuggestion(LangMan.Get("unable-open-file-skipped") + ": " + Path.GetFileName(path), SuggestionIcon.Next);
456-
else showSuggestion(LangMan.Get("unable-open-file") + ": " + Path.GetFileName(path), SuggestionIcon.Warning);
446+
if (goPrev)
447+
{
448+
if (PrevFile(true) > 1) showSuggestion(LangMan.Get("unable-open-file-skipped") + ": " + Path.GetFileName(path), SuggestionIcon.Prev);
449+
else showSuggestion(LangMan.Get("unable-open-file") + ": " + Path.GetFileName(path), SuggestionIcon.Warning);
450+
}
451+
else
452+
{
453+
if (NextFile(true) > 1) showSuggestion(LangMan.Get("unable-open-file-skipped") + ": " + Path.GetFileName(path), SuggestionIcon.Next);
454+
else showSuggestion(LangMan.Get("unable-open-file") + ": " + Path.GetFileName(path), SuggestionIcon.Warning);
455+
}
457456
}
458457
}
459458

@@ -886,37 +885,59 @@ private void saveAsButton_Click(object sender, EventArgs e)
886885

887886
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
888887
{
889-
FileStream fs = (FileStream)saveFileDialog1.OpenFile();
890-
switch (saveFileDialog1.FilterIndex)
888+
using (Bitmap bmpToSave = new Bitmap(originalImage))
891889
{
892-
case 1:
893-
originalImage.Save(fs, ImageFormat.Png);
894-
break;
895-
case 2:
896-
originalImage.Save(fs, ImageFormat.Jpeg);
897-
break;
898-
case 3:
899-
originalImage.Save(fs, ImageFormat.Gif);
900-
break;
901-
case 4:
902-
originalImage.Save(fs, ImageFormat.Bmp);
903-
break;
904-
case 5:
905-
originalImage.Save(fs, ImageFormat.Tiff);
906-
break;
907-
case 6:
908-
IcoWrapper.ConvertToIcon(originalImage, fs);
909-
break;
910-
case 7:
911-
using (WebP webp = new WebP())
890+
originalImage.Dispose();
891+
originalImage = null;
892+
pictureBox.Image.Dispose();
893+
pictureBox.Image = null;
894+
895+
using (MemoryStream memory = new MemoryStream())
896+
{
897+
using (FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
912898
{
913-
byte[] rawWebP = webp.EncodeLossy(originalImage);
914-
fs.Write(rawWebP, 0, rawWebP.Length);
899+
byte[] bytes;
900+
switch (saveFileDialog1.FilterIndex)
901+
{
902+
case 1:
903+
bmpToSave.Save(memory, ImageFormat.Png);
904+
bytes = memory.ToArray();
905+
fs.Write(bytes, 0, bytes.Length);
906+
break;
907+
case 2:
908+
bmpToSave.Save(memory, ImageFormat.Jpeg);
909+
bytes = memory.ToArray();
910+
fs.Write(bytes, 0, bytes.Length);
911+
break;
912+
case 3:
913+
bmpToSave.Save(memory, ImageFormat.Gif);
914+
bytes = memory.ToArray();
915+
fs.Write(bytes, 0, bytes.Length);
916+
break;
917+
case 4:
918+
bmpToSave.Save(memory, ImageFormat.Bmp);
919+
bytes = memory.ToArray();
920+
fs.Write(bytes, 0, bytes.Length);
921+
break;
922+
case 5:
923+
bmpToSave.Save(memory, ImageFormat.Tiff);
924+
bytes = memory.ToArray();
925+
fs.Write(bytes, 0, bytes.Length);
926+
break;
927+
case 6:
928+
IcoWrapper.ConvertToIcon(bmpToSave, memory);
929+
break;
930+
case 7:
931+
using (WebP webp = new WebP())
932+
{
933+
bytes = webp.EncodeLossy(bmpToSave);
934+
fs.Write(bytes, 0, bytes.Length);
935+
}
936+
break;
937+
}
915938
}
916-
break;
939+
}
917940
}
918-
fs.Close();
919-
920941
setImageChanged(false);
921942
CheckRecursiveFolder(saveFileDialog1.FileName);
922943
openFile(saveFileDialog1.FileName);
@@ -1271,6 +1292,8 @@ public int NextFile(bool skipNextFile = false)
12711292
else
12721293
{
12731294
if (skipNextFile) currentIndex++;
1295+
if (currentIndex > filePaths.Length - 1) currentIndex = 0;
1296+
if (skipNextFile) currentFile = Path.GetFileName(filePaths[currentIndex]);
12741297
openFile(currentIndex == filePaths.Length - 1 ? filePaths[0] : filePaths[currentIndex + 1]);
12751298
return filePaths.Length;
12761299
}
@@ -1281,7 +1304,7 @@ private void nextButton_Click(object sender, EventArgs e)
12811304
NextFile();
12821305
}
12831306

1284-
public void PrevFile()
1307+
public int PrevFile(bool skipPrevFile = false)
12851308
{
12861309
string[] filePaths = GetCurrentFiles();
12871310

@@ -1295,8 +1318,20 @@ public void PrevFile()
12951318
}
12961319
}
12971320

1298-
if (currentIndex == -1) showSuggestion(LangMan.Get("cur-file-not-found"), SuggestionIcon.Warning);
1299-
else openFile(currentIndex == 0 ? filePaths[filePaths.Length - 1] : filePaths[currentIndex - 1]);
1321+
if (currentIndex == -1)
1322+
{
1323+
setSlideshow(false);
1324+
showSuggestion(LangMan.Get("cur-file-not-found"), SuggestionIcon.Warning);
1325+
return 0;
1326+
}
1327+
else
1328+
{
1329+
if (skipPrevFile) currentIndex--;
1330+
if (currentIndex < 0) currentIndex = filePaths.Length - 1;
1331+
if (skipPrevFile) currentFile = Path.GetFileName(filePaths[currentIndex]);
1332+
openFile(currentIndex == 0 ? filePaths[filePaths.Length - 1] : filePaths[currentIndex - 1], true);
1333+
return filePaths.Length;
1334+
}
13001335
}
13011336

13021337
private void prevButton_Click(object sender, EventArgs e)
@@ -1450,6 +1485,7 @@ private void SetDarkMode(bool dark)
14501485

14511486
openBtn.Image = Properties.Resources.white_open;
14521487
openFileBtn.Image = Properties.Resources.white_imgfile;
1488+
openFolderBtn.Image = Properties.Resources.white_picfolder;
14531489
openRecursive.Image = Properties.Resources.white_recursive;
14541490

14551491
saveAsButton.Image = Properties.Resources.white_saveas;
@@ -1665,7 +1701,8 @@ public enum SuggestionIcon
16651701
Slideshow = 3,
16661702
Fullscreen = 4,
16671703
Next = 5,
1668-
Trash = 6
1704+
Prev = 6,
1705+
Trash = 7
16691706
}
16701707

16711708
public void showSuggestion(string text, SuggestionIcon icon)
@@ -1691,6 +1728,9 @@ public void showSuggestion(string text, SuggestionIcon icon)
16911728
case SuggestionIcon.Next:
16921729
suggestionIcon.Image = Properties.Resources.white_next;
16931730
break;
1731+
case SuggestionIcon.Prev:
1732+
suggestionIcon.Image = Properties.Resources.white_prev;
1733+
break;
16941734
case SuggestionIcon.Trash:
16951735
suggestionIcon.Image = Properties.Resources.white_trash;
16961736
break;
@@ -2152,7 +2192,7 @@ private void openFileBtn_Click(object sender, EventArgs e)
21522192
private void openRecursive_Click(object sender, EventArgs e)
21532193
{
21542194
setSlideshow(false);
2155-
string p = CustomOpenFolderDialog.GetFolder();
2195+
string p = CustomOpenFolderDialog.GetFolder(LangMan.Get("open-recursive"));
21562196
if (p != null)
21572197
{
21582198
recursiveFolder = p;
@@ -2453,5 +2493,16 @@ private void permDeleteBtn_Click(object sender, EventArgs e)
24532493
}
24542494
}
24552495
}
2496+
2497+
private void openFolderBtn_Click(object sender, EventArgs e)
2498+
{
2499+
setSlideshow(false);
2500+
string p = CustomOpenFolderDialog.GetFolder(LangMan.Get("open-folder"));
2501+
if (p != null)
2502+
{
2503+
recursiveFolder = null;
2504+
openFirstFileInFolder(p);
2505+
}
2506+
}
24562507
}
24572508
}

0 commit comments

Comments
 (0)