From b6969b360efa88498175474b676fa0fe5eb12732 Mon Sep 17 00:00:00 2001 From: Ray Date: Wed, 3 Nov 2021 00:08:07 +0000 Subject: [PATCH] Added: load next file button --- MainForm.Designer.cs | 35 ++- MainForm.cs | 198 +++------------ Resources/UI/arrow_right.png | Bin 0 -> 597 bytes Resources/UI/arrow_right2.png | Bin 0 -> 414 bytes RyzStudio/IO/AccessibleDirectory.cs | 381 ++++++++++++++++++++++++++++ UIResource.Designer.cs | 20 ++ UIResource.resx | 6 + VideoPreview.csproj | 3 +- 8 files changed, 479 insertions(+), 164 deletions(-) create mode 100644 Resources/UI/arrow_right.png create mode 100644 Resources/UI/arrow_right2.png create mode 100644 RyzStudio/IO/AccessibleDirectory.cs diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs index 13c008c..513e7f5 100644 --- a/MainForm.Designer.cs +++ b/MainForm.Designer.cs @@ -42,6 +42,7 @@ namespace VideoPreview this.button2 = new RyzStudio.Windows.ThemedForms.TButton(); this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); this.button3 = new RyzStudio.Windows.ThemedForms.TButton(); + this.button4 = new RyzStudio.Windows.ThemedForms.TButton(); this.label4 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); this.label5 = new System.Windows.Forms.Label(); @@ -164,7 +165,7 @@ namespace VideoPreview this.textBox1.Name = "textBox1"; this.textBox1.NormalImage = ((System.Drawing.Image)(resources.GetObject("textBox1.NormalImage"))); this.textBox1.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9); - this.textBox1.Size = new System.Drawing.Size(294, 35); + this.textBox1.Size = new System.Drawing.Size(286, 35); this.textBox1.SubmitButton = null; this.textBox1.TabIndex = 16; this.textBox1.UseSystemPasswordChar = false; @@ -173,14 +174,14 @@ namespace VideoPreview // this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.button2.BackColor = System.Drawing.Color.Transparent; - this.button2.DefaultImage = null; - this.button2.DownImage = null; + this.button2.DefaultImage = global::VideoPreview.UIResource.cog2; + this.button2.DownImage = global::VideoPreview.UIResource.cog; this.button2.IsSelected = false; this.button2.LabelText = ""; this.button2.Location = new System.Drawing.Point(12, 705); this.button2.Margin = new System.Windows.Forms.Padding(10); this.button2.Name = "button2"; - this.button2.OverImage = null; + this.button2.OverImage = global::VideoPreview.UIResource.cog; this.button2.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); this.button2.Size = new System.Drawing.Size(37, 37); this.button2.TabIndex = 17; @@ -191,20 +192,38 @@ namespace VideoPreview // this.button3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.button3.BackColor = System.Drawing.Color.Transparent; - this.button3.DefaultImage = null; - this.button3.DownImage = null; + this.button3.DefaultImage = global::VideoPreview.UIResource.refresh2; + this.button3.DownImage = global::VideoPreview.UIResource.refresh; this.button3.IsSelected = false; this.button3.LabelText = ""; this.button3.Location = new System.Drawing.Point(410, 9); this.button3.Margin = new System.Windows.Forms.Padding(10); this.button3.Name = "button3"; - this.button3.OverImage = null; + this.button3.OverImage = global::VideoPreview.UIResource.refresh; this.button3.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); this.button3.Size = new System.Drawing.Size(35, 35); this.button3.TabIndex = 23; this.toolTip1.SetToolTip(this.button3, "Refresh"); this.button3.MouseClick += new System.Windows.Forms.MouseEventHandler(this.button3_MouseClick); // + // button4 + // + this.button4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.button4.BackColor = System.Drawing.Color.Transparent; + this.button4.DefaultImage = global::VideoPreview.UIResource.arrow_right2; + this.button4.DownImage = global::VideoPreview.UIResource.arrow_right; + this.button4.IsSelected = false; + this.button4.LabelText = ""; + this.button4.Location = new System.Drawing.Point(53, 705); + this.button4.Margin = new System.Windows.Forms.Padding(10); + this.button4.Name = "button4"; + this.button4.OverImage = global::VideoPreview.UIResource.arrow_right; + this.button4.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.button4.Size = new System.Drawing.Size(37, 37); + this.button4.TabIndex = 24; + this.toolTip1.SetToolTip(this.button4, "Next"); + this.button4.MouseClick += new System.Windows.Forms.MouseEventHandler(this.button4_MouseClick); + // // label4 // this.label4.AutoSize = true; @@ -262,6 +281,7 @@ namespace VideoPreview this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(250)))), ((int)(((byte)(250)))), ((int)(((byte)(250))))); this.ClientSize = new System.Drawing.Size(464, 761); + this.Controls.Add(this.button4); this.Controls.Add(this.button3); this.Controls.Add(this.label6); this.Controls.Add(this.label7); @@ -305,6 +325,7 @@ namespace VideoPreview private System.Windows.Forms.Label label6; private System.Windows.Forms.Label label7; private RyzStudio.Windows.ThemedForms.TButton button3; + private RyzStudio.Windows.ThemedForms.TButton button4; } } diff --git a/MainForm.cs b/MainForm.cs index 7d6cd61..02d6fb7 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -1,10 +1,13 @@ using MediaToolkit; using MediaToolkit.Model; using MediaToolkit.Options; +using RyzStudio.IO; using RyzStudio.Windows.Forms; using System; +using System.Collections.Generic; using System.Drawing; using System.IO; +using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; @@ -30,11 +33,6 @@ namespace VideoPreview textBox1.InnerTextBox.ReadOnly = true; textBox1.InnerTextBox.BackColor = Color.White; textBox1.InnerTextBox.TextChanged += textBox1_TextChanged; - - button2.DefaultImage = UIResource.cog2; - button2.DownImage = button2.OverImage = UIResource.cog; - button3.DefaultImage = UIResource.refresh2; - button3.DownImage = button3.OverImage = UIResource.refresh; } protected override void OnFormClosing(FormClosingEventArgs e) @@ -64,118 +62,6 @@ namespace VideoPreview } - //private void button1_Click(object sender, EventArgs e) - //{ - // //string searchPattern = "*.avi|*.mp4|*.ogm|*.mkv"; - - // //string[] parts = searchPattern.Split(',', ';', '|'); - - - // //var inputFile = new MediaFile { Filename = videoFilename }; - // ////var outputFile = new MediaFile { Filename = @"N:\#\invincible.2021.s01e02.here.goes.nothing.720p.webrip.hevc.x265.mkv.jpg" }; - - // //using (var engine = new Engine()) - // //{ - // // engine.GetMetadata(inputFile); - - // // // Saves the frame located on the 15th second of the video. - // // var options = new ConversionOptions { Seek = TimeSpan.FromSeconds(150) }; - // // engine.GetThumbnail(inputFile, outputFile, options); - // //} - - - // //int i = 0; - - // //FFmpegLoader.FFmpegPath = @"L:\repos\WinFormsApp1\bin\Debug\net5.0-windows"; - - // //MediaFile file = MediaFile.Open(@"N:\#\invincible.2021.s01e03.who.you.calling.ugly.720p.webrip.hevc.x265.mkv"); - - // //FFMediaToolkit.Graphics.ImageData img; - // //if (file.Video.TryGetNextFrame(out img)) - // //{ - // // //img..ToBitmap() - // //} - - // //while (file.Video.TryGetNextFrame(out var imageData)) - // //{ - // // imageData.ToBitmap().Save($@"C:\images\frame_{i++}.png"); - // // // See the #Usage details for example .ToBitmap() implementation - // // // The .Save() method may be different depending on your graphics library - // //} - - // //MessageBox.Show("!"); - //} - - //private async void button2_Click(object sender, EventArgs e) - //{ - // //await Task.Run(() => - // //{ - // // if (string.IsNullOrWhiteSpace(textBox1.Text)) return; - // // if (!Directory.Exists(textBox1.Text)) return; - - // // ThreadControl.Clear(richTextBox1); - - // // //string[] extensionFilters = new string[] { ".avi", ".mp4", ".ogm", ".mkv" }; - - // // ThreadControl.SetText(textBox1, @"C:\Windows"); - - // // List fileList = RyzStudio.IO.SmarterFileSystem.GetFiles(textBox1.Text, "*.avi|*.mp4|*.ogm|*.mkv", SearchOption.AllDirectories); - - // // //string[] fileList = Directory.GetFiles(textBox1.Text, "*.avi|*.mp4|*.ogm|*.mkv", SearchOption.TopDirectoryOnly); - // // foreach (string item in fileList) - // // { - // // ThreadControl.AddLine(richTextBox1, item); - - - // // //if (IsMatchExtension(item, extensionFilters)) - // // //{ - // // // ThreadControl.AddLine(richTextBox1, item); - - // // //} - - - // // } - - - // // MessageBox.Show("!"); - - // //}); - //} - - //private bool IsMatchExtension(string filename, string[] extensionFilters) - //{ - // string ext = Path.GetExtension(filename)?.ToLower(); - - // foreach (var item in extensionFilters) - // { - // if (ext.Equals(item)) - // { - // return true; - // } - // } - - // return false; - //} - - - //private string[] Split(string lines) - //{ - // string[] rs = new string[0]; - - // foreach (string item in lines.Split(',', ';', '|')) - // { - // if (string.IsNullOrWhiteSpace(item)) - // { - // continue; - // } - - // Array.Resize(ref rs, (rs.Length + 1)); - // rs[(rs.Length - 1)] = item?.Trim(); - // } - - // return rs; - //} - private void Form1_DragOver(object sender, DragEventArgs e) { e.Effect = (e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None); @@ -206,11 +92,21 @@ namespace VideoPreview public AppSession CurrentSession { get; set; } = new AppSession(); - private void button1_MouseClick(object sender, MouseEventArgs e) + /// + /// Refresh + /// + /// + /// + private async void button3_MouseClick(object sender, MouseEventArgs e) { - this.Close(); + await ReadVideoFile(textBox1.Text); } + /// + /// Options + /// + /// + /// private void button2_MouseClick(object sender, MouseEventArgs e) { if (this.IsBusy) @@ -227,9 +123,33 @@ namespace VideoPreview } } - private async void button3_MouseClick(object sender, MouseEventArgs e) + /// + /// Next file + /// + /// + /// + private async void button4_MouseClick(object sender, MouseEventArgs e) { - await ReadVideoFile(textBox1.Text); + await Task.Run(() => + { + if (this.IsBusy) return; + if (string.IsNullOrWhiteSpace(textBox1.Text)) return; + + string path = AccessibleDirectory.GetNextFile(textBox1.Text, "*.avi;*.mkv;*.mp4;*.ogm;*.mov;*.mpg;*.mpeg"); + if (string.IsNullOrWhiteSpace(path)) return; + + textBox1.Text = path; + }); + } + + /// + /// Close + /// + /// + /// + private void button1_MouseClick(object sender, MouseEventArgs e) + { + this.Close(); } @@ -291,37 +211,6 @@ namespace VideoPreview } } - //protected string GetTempFolder() - //{ - // string path = Path.Combine(Application.StartupPath, "tmp"); - // if (Directory.Exists(path)) - // { - // return path; - // } - - // try - // { - // Directory.CreateDirectory(path); - // } - // catch - // { - // // do nothing - // } - - // if (Directory.Exists(path)) - // { - // return path; - // } - - // path = Path.GetTempPath(); - // if (Directory.Exists(path)) - // { - // return path; - // } - - // return null; - //} - protected decimal ParseFrameSizeRatio(string videoSize) { if (string.IsNullOrWhiteSpace(videoSize)) @@ -361,10 +250,7 @@ namespace VideoPreview { await Task.Run(() => { - if (this.IsBusy) - { - return; - } + if (this.IsBusy) return; this.IsBusy = true; diff --git a/Resources/UI/arrow_right.png b/Resources/UI/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..96c8e26a795c5dcd18846fa3d38925d06e984670 GIT binary patch literal 597 zcmV-b0;>IqP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!TNp4? zmqJHX@C71HtjX#3@14_JkkB92S$qBKUu$2^-mcSyN~IF>eSa1kbzOI`Nnc}m;!Hdq zuUN|BUjquCG#ZU{&+`^2zJRnP9GH`I7jdX|D|59e@&%Q zcgh7o^OW2&nic#H{CLpBDVNLJ2p+IWL-c?&(w0i4EyXTD9A9Km00000NkvXXu0mjfmVyDB literal 0 HcmV?d00001 diff --git a/Resources/UI/arrow_right2.png b/Resources/UI/arrow_right2.png new file mode 100644 index 0000000000000000000000000000000000000000..33981824f7ec406e7aef383da308be0db412ad6d GIT binary patch literal 414 zcmV;P0b%}$P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!T3-z5w#$pIzfCzqZO_Ig{wG3qSunp`3TQ5XJ_qhCY$gk zznD2@CNuw?$r72sE;@M4-C+-tsH7+VYx>Z}GTv~FN0@O;qlFW!;T=Vse2Y(PVgU6F zVhfIOtaFMS!hg(#UUMAd*n`j`p35ILLa&;6EOeWdxJ&0)uTY$4q_(|{Z>)sgZyfsq z=Y|TO+eoArXGkq_iH-wC5UXw6_D${z!+3(9_6RW#7Ctf5kUy*o~UBsQFj^nnyY)&q& za{V!RF_z#9EI+0(%wPzoSViSAm19jTtY624e3`Zr&pFF}0I!xyPtXGqi~s-t07*qo IM6N<$f++2+V*mgE literal 0 HcmV?d00001 diff --git a/RyzStudio/IO/AccessibleDirectory.cs b/RyzStudio/IO/AccessibleDirectory.cs new file mode 100644 index 0000000..a4af53d --- /dev/null +++ b/RyzStudio/IO/AccessibleDirectory.cs @@ -0,0 +1,381 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace RyzStudio.IO +{ + public class AccessibleDirectory + { + + public static List GetFiles(string path, string pattern, bool searchTopOnly) + { + List fileList = new List(); + List directoryList = new List(); + + if (string.IsNullOrWhiteSpace(pattern)) pattern = "*"; + + directoryList.Add(path); + + while (true) + { + if (directoryList.Count <= 0) + { + break; + } + + string directory = directoryList.First(); + directoryList.RemoveAt(0); + + if (IsDirectoryAccessible(directory)) + { + IEnumerable searchDirList = new List(); + + try + { + searchDirList = Directory.EnumerateDirectories(directory, "*", SearchOption.TopDirectoryOnly); + } + catch (Exception) + { + continue; + } + + if (!searchTopOnly) + { + foreach (string item in searchDirList) + { + if (!IsDirectoryAccessible(item)) + { + continue; + } + + directoryList.Add(item); + } + } + + foreach (string item in Directory.EnumerateFiles(directory, "*", SearchOption.TopDirectoryOnly)) + { + if (!MatchFileSearchPattern(pattern, Path.GetFileName(item))) + { + continue; + } + + if (!IsFileAccessible(item)) + { + continue; + } + + fileList.Add(item); + } + } + } + + return fileList; + } + + public static IEnumerable EnumerateFiles(string path, string pattern, bool searchTopOnly) + { + List directoryList = new List(); + + if (string.IsNullOrWhiteSpace(pattern)) pattern = "*"; + + directoryList.Add(path); + + while (true) + { + if (directoryList.Count <= 0) + { + yield break; + } + + string directory = directoryList.First(); + directoryList.RemoveAt(0); + + if (IsDirectoryAccessible(directory)) + { + IEnumerable searchDirList = new List(); + + try + { + searchDirList = Directory.EnumerateDirectories(directory, "*", SearchOption.TopDirectoryOnly); + } + catch (Exception) + { + continue; + } + + if (!searchTopOnly) + { + foreach (string item in searchDirList) + { + if (!IsDirectoryAccessible(item)) + { + continue; + } + + directoryList.Add(item); + } + } + + foreach (string item in Directory.EnumerateFiles(directory, "*", SearchOption.TopDirectoryOnly)) + { + if (!MatchFileSearchPattern(pattern, Path.GetFileName(item))) + { + continue; + } + + if (!IsFileAccessible(item)) + { + continue; + } + + yield return item; + } + } + } + } + + public static void GetFiles(string path, string pattern, bool searchTopOnly, Func callback) + { + List directoryList = new List(); + ulong searchCount = 0; + + if (string.IsNullOrWhiteSpace(pattern)) pattern = "*"; + + directoryList.Add(path); + searchCount++; + + while (true) + { + if (directoryList.Count <= 0) + { + break; + } + + string directory = directoryList.First(); + directoryList.RemoveAt(0); + + callback(null, searchCount, directoryList.Count); + + if (IsDirectoryAccessible(directory)) + { + IEnumerable searchDirList = new List(); + + try + { + searchDirList = Directory.EnumerateDirectories(directory, "*", SearchOption.TopDirectoryOnly); + } + catch (Exception) + { + continue; + } + + if (!searchTopOnly) + { + foreach (string item in searchDirList) + { + if (!IsDirectoryAccessible(item)) + { + continue; + } + + directoryList.Add(item); + searchCount++; + + callback(null, searchCount, directoryList.Count); + } + } + + foreach (string item in Directory.EnumerateFiles(directory, "*", SearchOption.TopDirectoryOnly)) + { + if (!MatchFileSearchPattern(pattern, Path.GetFileName(item))) + { + continue; + } + + if (!IsFileAccessible(item)) + { + continue; + } + + callback(item, searchCount, directoryList.Count); + } + } + } + } + + public static string GetNextFile(string filepath, string pattern) + { + if (string.IsNullOrWhiteSpace(filepath)) return null; + + string path = Path.GetDirectoryName(filepath); + if (string.IsNullOrWhiteSpace(path)) return null; + + string filename = Path.GetFileName(filepath); + if (string.IsNullOrWhiteSpace(filename)) return null; + + List fileList = AccessibleDirectory.GetFiles(path, pattern, true); + if (fileList == null) return null; + if (fileList.Count <= 0) return null; + if (fileList.Count(x => (Path.GetFileName(x).Equals(filename))) < 0) return null; + + int pos = fileList.FindIndex(x => Path.GetFileName(x).Equals(filename)); + if (pos < 0) return null; + if (pos >= (fileList.Count - 1)) return null; + + return fileList[(pos + 1)]; + } + + public static bool IsAccessible(string path) + { + if (string.IsNullOrWhiteSpace(path)) return false; + + if (File.Exists(path)) return IsFileAccessible(path); + if (Directory.Exists(path)) return IsDirectoryAccessible(path); + + return false; + } + + public static bool IsFileAccessible(string filename) + { + if (string.IsNullOrWhiteSpace(filename)) return false; + if (!File.Exists(filename)) return false; + + try + { + FileInfo fi = new FileInfo(filename); + fi.GetAccessControl(); + } + catch + { + return false; + } + + return true; + } + + public static bool IsDirectoryAccessible(string path) + { + if (string.IsNullOrWhiteSpace(path)) return false; + if (!Directory.Exists(path)) return false; + + try + { + DirectoryInfo di = new DirectoryInfo(path); + di.GetAccessControl(); + } + catch + { + return false; + } + + return true; + } + + public static bool MatchFileSearchPattern(string pattern, string subject) + { + if (string.IsNullOrWhiteSpace(pattern)) + { + return false; + } + + Func matchPattern = (pattern, subject) => + { + string[] parts = pattern.Split('*'); + if (parts.Length <= 1) + { + return subject.Equals(pattern, StringComparison.CurrentCultureIgnoreCase); + } + + int pos = 0; + + for (int i = 0; i < parts.Length; i++) + { + if (i <= 0) + { + // first + pos = subject.IndexOf(parts[i], pos, StringComparison.CurrentCultureIgnoreCase); + if (pos != 0) + { + return false; + } + } + else if (i >= (parts.Length - 1)) + { + // last + if (!subject.EndsWith(parts[i], StringComparison.CurrentCultureIgnoreCase)) + { + return false; + } + } + else + { + pos = subject.IndexOf(parts[i], pos, StringComparison.CurrentCultureIgnoreCase); + if (pos < 0) + { + return false; + } + + pos += parts[i].Length; + } + } + + return true; + }; + + Func matchAllPattern = (pattern, subject) => + { + int wildcardCount = pattern.Count(x => x.Equals('*')); + if (wildcardCount <= 0) + { + return subject.Equals(pattern, StringComparison.CurrentCultureIgnoreCase); + } + else if (wildcardCount == 1) + { + string newWildcardPattern = pattern.Replace("*", ""); + + if (pattern.StartsWith("*")) + { + return subject.EndsWith(newWildcardPattern, StringComparison.CurrentCultureIgnoreCase); + } + else if (pattern.EndsWith("*")) + { + return subject.StartsWith(newWildcardPattern, StringComparison.CurrentCultureIgnoreCase); + } + else + { + return matchPattern(pattern, subject); + } + } + else + { + return matchPattern(pattern, subject); + } + }; + + if (pattern.Contains(';')) + { + string[] parts = pattern.Split(';'); + for (int i=0; i + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrow_right { + get { + object obj = ResourceManager.GetObject("arrow_right", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrow_right2 { + get { + object obj = ResourceManager.GetObject("arrow_right2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/UIResource.resx b/UIResource.resx index 0c7337a..9281e5c 100644 --- a/UIResource.resx +++ b/UIResource.resx @@ -118,6 +118,12 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Resources\UI\arrow_right.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\arrow_right2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Resources\UI\cog.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/VideoPreview.csproj b/VideoPreview.csproj index 0834cea..1859923 100644 --- a/VideoPreview.csproj +++ b/VideoPreview.csproj @@ -11,7 +11,7 @@ Ray Lam favicon.ico true - 0.1.0.097 + 0.1.1.008 @@ -61,6 +61,7 @@ +