diff --git a/PictureViewer.sln b/PictureViewer.sln
new file mode 100644
index 0000000..9aed0c4
--- /dev/null
+++ b/PictureViewer.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27004.2006
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PictureViewer", "PictureViewer\PictureViewer.csproj", "{8A346D98-6813-4ECF-B7D4-99A61FC2310D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8A346D98-6813-4ECF-B7D4-99A61FC2310D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8A346D98-6813-4ECF-B7D4-99A61FC2310D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8A346D98-6813-4ECF-B7D4-99A61FC2310D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8A346D98-6813-4ECF-B7D4-99A61FC2310D}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {70033B2E-1C44-4996-95F6-C5AF9A8568A7}
+ EndGlobalSection
+EndGlobal
diff --git a/PictureViewer/AboutWindow.xaml b/PictureViewer/AboutWindow.xaml
new file mode 100644
index 0000000..418523b
--- /dev/null
+++ b/PictureViewer/AboutWindow.xaml
@@ -0,0 +1,23 @@
+
+
+
+ Picture Viewer
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PictureViewer/AboutWindow.xaml.cs b/PictureViewer/AboutWindow.xaml.cs
new file mode 100644
index 0000000..122e676
--- /dev/null
+++ b/PictureViewer/AboutWindow.xaml.cs
@@ -0,0 +1,23 @@
+using System.Windows;
+using System.Reflection;
+using System;
+
+namespace PictureViewer {
+ public partial class AboutWindow : Window {
+ public AboutWindow() {
+ InitializeComponent();
+
+ Assembly app = Assembly.GetExecutingAssembly();
+ AssemblyTitleAttribute title = (AssemblyTitleAttribute)app.GetCustomAttributes(typeof(AssemblyTitleAttribute), false)[0];
+ AssemblyDescriptionAttribute desc = (AssemblyDescriptionAttribute)app.GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false)[0];
+
+ Version ver = app.GetName().Version;
+
+ txtDesc.Text = title.Title + "\nVersion " + ver.ToString() + "\n\n" + desc.Description;
+ }
+
+ private void OK_Click(object sender, RoutedEventArgs e) {
+ this.Close();
+ }
+ }
+}
diff --git a/PictureViewer/AddImageURL.xaml b/PictureViewer/AddImageURL.xaml
new file mode 100644
index 0000000..bae2fe0
--- /dev/null
+++ b/PictureViewer/AddImageURL.xaml
@@ -0,0 +1,16 @@
+
+
+
+ Enter Address:
+
+
+
+
+
diff --git a/PictureViewer/AddImageURL.xaml.cs b/PictureViewer/AddImageURL.xaml.cs
new file mode 100644
index 0000000..50bb6f3
--- /dev/null
+++ b/PictureViewer/AddImageURL.xaml.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Windows;
+
+namespace PictureViewer {
+ public partial class AddImageURL : Window {
+ public Uri Address {
+ get;
+ private set;
+ }
+
+ public AddImageURL() {
+ InitializeComponent();
+ Address = null;
+ txtURL.Focus();
+ }
+
+ private void OK_Clicked(object sender, RoutedEventArgs e) {
+ String url = txtURL.Text;
+ bool res = Uri.TryCreate(url, UriKind.Absolute, out Uri outUri)
+ && (outUri.Scheme == Uri.UriSchemeHttp
+ || outUri.Scheme == Uri.UriSchemeHttps);
+
+ if (!res) {
+ MessageBox.Show("Invalid Address", "Invalid Address");
+ } else {
+ Address = outUri;
+ this.Close();
+ }
+ }
+ }
+}
diff --git a/PictureViewer/App.config b/PictureViewer/App.config
new file mode 100644
index 0000000..016d28f
--- /dev/null
+++ b/PictureViewer/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/PictureViewer/App.xaml b/PictureViewer/App.xaml
new file mode 100644
index 0000000..a3ed3e2
--- /dev/null
+++ b/PictureViewer/App.xaml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/PictureViewer/App.xaml.cs b/PictureViewer/App.xaml.cs
new file mode 100644
index 0000000..e1611b0
--- /dev/null
+++ b/PictureViewer/App.xaml.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace PictureViewer {
+ ///
+ /// Interaction logic for App.xaml
+ ///
+ public partial class App : Application {
+ }
+}
diff --git a/PictureViewer/AskForTime.xaml b/PictureViewer/AskForTime.xaml
new file mode 100644
index 0000000..b3af8d3
--- /dev/null
+++ b/PictureViewer/AskForTime.xaml
@@ -0,0 +1,21 @@
+
+
+
+
+ Time in seconds:
+
+
+
+
+
+
+
+
+
diff --git a/PictureViewer/AskForTime.xaml.cs b/PictureViewer/AskForTime.xaml.cs
new file mode 100644
index 0000000..8bc4d14
--- /dev/null
+++ b/PictureViewer/AskForTime.xaml.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Windows;
+
+namespace PictureViewer {
+ public partial class AskForTime : Window {
+ public double time;
+ private string type;
+
+ public AskForTime(double defaultValue, string name, string type) {
+ InitializeComponent();
+ this.txtTime.Text = defaultValue.ToString();
+ this.Title = "Change " + name + " Time";
+ this.type = type;
+ }
+
+ private void BtnOK_Clicked(object sender, RoutedEventArgs e) {
+ if (type.Equals("int")) {
+ bool res = int.TryParse(this.txtTime.Text, out int newTime);
+ if (res && newTime >= 0) {
+ this.time = newTime;
+ this.DialogResult = true;
+ this.Close();
+ } else {
+ MessageBox.Show("Invalid time: " + this.txtTime.Text, "Invalid Time", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ } else {
+ bool res = Double.TryParse(this.txtTime.Text, out double newTime);
+ if (res && newTime >= 0) {
+ this.time = newTime;
+ this.DialogResult = true;
+ this.Close();
+ } else {
+ MessageBox.Show("Invalid time: " + this.txtTime.Text, "Invalid Time", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+ }
+ }
+}
diff --git a/PictureViewer/MainWindow.xaml b/PictureViewer/MainWindow.xaml
new file mode 100644
index 0000000..8ec576c
--- /dev/null
+++ b/PictureViewer/MainWindow.xaml
@@ -0,0 +1,180 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Ready
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Queue
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PictureViewer/MainWindow.xaml.cs b/PictureViewer/MainWindow.xaml.cs
new file mode 100644
index 0000000..3f6bd5e
--- /dev/null
+++ b/PictureViewer/MainWindow.xaml.cs
@@ -0,0 +1,410 @@
+/**
+ * Picture Viewer
+ * Neil Brommer
+ *
+ * Note: the window will not resize itself to the full size of large images.
+ * This is due to Windows preventing the window from growing too large.
+ */
+
+using Microsoft.Win32;
+using System;
+using System.IO;
+using System.Collections.Generic;
+using System.Net;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media.Imaging;
+using System.Windows.Threading;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+
+namespace PictureViewer {
+ public partial class MainWindow : Window {
+ private List queue;
+ private int curImage;
+ private double delayTime;
+ private String tempDir;
+ private DispatcherTimer timer;
+ private GridLength sidebarWidth;
+ private int nextImage;
+ private TimeSpan animationDuration;
+
+ public MainWindow() {
+ InitializeComponent();
+ queue = new List();
+ curImage = -1;
+ delayTime = 5.0;
+ tempDir = Environment.GetEnvironmentVariable("TEMP");
+ timer = new DispatcherTimer {
+ Interval = new TimeSpan(0, 0, 1)
+ };
+ timer.Tick += Timer_Tick;
+ this.sidebarWidth = this.colQueue.Width; // initialize it just in case
+ this.nextImage = -1;
+ animationDuration = TimeSpan.FromSeconds(0.25);
+ }
+
+ private void ImgMain_Drop(object sender, DragEventArgs e) {
+ if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
+ string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
+
+ AddFiles(files);
+ } else if (e.Data.GetDataPresent(DataFormats.Text)) {
+ string url = (String)e.Data.GetData(DataFormats.Text);
+ AddURL(url);
+ }
+ }
+
+ private void OpenFiles_Clicked(object sender, RoutedEventArgs e) {
+ OpenFileDialog dlg = new OpenFileDialog {
+ Title = "Open Images",
+ Multiselect = true,
+ DefaultExt = ".png",
+ Filter = "Image Files|*.jpeg;*.jpg;*.png;*.gif;*.bmp;*.ico|All files (*.*)|*.*"
+ };
+ bool? res = dlg.ShowDialog();
+
+ if (res != null && res == true) {
+ AddFiles(dlg.FileNames);
+ }
+ }
+
+ private void LoadURL_Clicked(object sender, RoutedEventArgs e) {
+ AddImageURL dlg = new AddImageURL();
+ dlg.ShowDialog();
+ Uri address = dlg.Address;
+
+ if (address != null)
+ AddURL(address.AbsoluteUri);
+ }
+
+ private void Start_Clicked(object sender, RoutedEventArgs e) {
+ if (queue.Count > 0 && curImage < queue.Count - 1) {
+ timer.Start();
+ btnStart.IsEnabled = false;
+ btnPause.IsEnabled = true;
+ } else
+ MessageBox.Show("Finished Queue", "Finished");
+ }
+
+ private void Pause_Clicked(object sender, RoutedEventArgs e) {
+ timer.Stop();
+ btnPause.IsEnabled = false;
+ btnStart.IsEnabled = true;
+ }
+
+ private void Timer_Tick(object sender, EventArgs e) {
+ progressBar.Value = progressBar.Value + (1.0 / delayTime * 1000);
+ if (progressBar.Value == progressBar.Maximum) {
+ Next_Clicked(null, null);
+ progressBar.Value = 0;
+
+ if (curImage == queue.Count - 2)
+ Pause_Clicked(null, null);
+ }
+ }
+
+ private void ClearQueue_Clicked(object sender, RoutedEventArgs e) {
+ imageQueue.Items.Clear();
+ queue.Clear();
+ EnableUI(false);
+
+ this.SizeToContent = SizeToContent.Manual;
+ if (this.chkResizeWindow.IsChecked == true) {
+ this.Width = 500;
+ this.Height = 350;
+ }
+
+ imgMain.Source = new BitmapImage(new Uri("pack://application:,,,/PictureViewer;component/Resources/image.ico", UriKind.Absolute));
+ imgMain.Stretch = Stretch.None;
+ curImage = -1;
+
+ if (timer.IsEnabled) {
+ timer.Stop();
+ progressBar.Value = 0;
+ }
+
+ SetStatus("Ready");
+ }
+
+ private void Previous_Clicked(object sender, RoutedEventArgs e) {
+ if (curImage > 0 && curImage < queue.Count) {
+ SetImage(curImage - 1);
+ }
+ }
+
+ private void Next_Clicked(object sender, RoutedEventArgs e) {
+ if (curImage < queue.Count - 1 && curImage >= 0) {
+ SetImage(curImage + 1);
+ }
+ }
+
+ private void ImageQueue_Clicked(object sender, RoutedEventArgs e) {
+ int index = imageQueue.Items.IndexOf((UIElement)((Image)sender).Parent);
+ SetImage(index);
+ }
+
+ private void SetImage(int index) {
+ if (index >= imageQueue.Items.Count || index < 0)
+ throw new IndexOutOfRangeException("index given to SetImage is out of range");
+
+ this.nextImage = index;
+
+ // fade the current image out
+ DoubleAnimation animation = new DoubleAnimation(1, 0, this.animationDuration);
+ animation.Completed += SetNewImage;
+ this.canvas.BeginAnimation(Image.OpacityProperty, animation);
+ }
+
+ private void SetNewImage(object sender, EventArgs e) {
+ // set the new image
+ BitmapImage newMain = null;
+ try {
+ newMain = new BitmapImage(new Uri(queue[this.nextImage]));
+ } catch (FileNotFoundException ex) {
+ MessageBox.Show("File bot found: " + ex.FileName, "File Not Found", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+
+ if (newMain == null) {
+ RemoveImage(this.nextImage);
+ return;
+ }
+
+ imgMain.Source = newMain;
+
+ // deselect the old thumbnail in the queue
+ StackPanel thumb;
+ if (curImage != -1) {
+ thumb = (StackPanel)imageQueue.Items[curImage];
+ thumb.Background = Brushes.Transparent;
+ }
+
+ this.curImage = this.nextImage;
+
+ // select the new thumbnail in the queue
+ thumb = (StackPanel)this.imageQueue.Items[this.curImage];
+ thumb.Background = SystemColors.HighlightBrush;
+
+ SetStatus(queue[this.curImage]);
+
+ // size window or image to show the full image
+ if (this.chkResizeWindow.IsChecked == true) {
+ double windowExtrasX = this.ActualWidth - this.canvas.ActualWidth;
+ double windowExtrasY = this.ActualHeight - this.canvas.ActualHeight;
+
+ this.Width = windowExtrasX + newMain.Width;
+ this.Height = windowExtrasY + newMain.Height;
+
+ Console.WriteLine("WindowX: " + this.ActualWidth + ", WindowY: " + this.ActualHeight);
+ Console.WriteLine("ImageX: " + newMain.Width + ", ImageY: " + newMain.Height);
+ Console.WriteLine();
+ } else {
+ if (this.chkFitToWindow.IsChecked == true)
+ this.OnCanvasResize(null, null); // fit the image to the window
+ }
+
+ // scroll the current thumbnail into view
+ if (imageQueue.ItemContainerGenerator.ContainerFromIndex(curImage) is FrameworkElement container) {
+ container.BringIntoView();
+ }
+
+ // fade the new image in
+ DoubleAnimation animation = new DoubleAnimation(0, 1, this.animationDuration);
+ this.canvas.BeginAnimation(Image.OpacityProperty, animation);
+ }
+
+ private void RemoveImage_Clicked(object sender, RoutedEventArgs e) {
+ if (sender is MenuItem mnu) {
+ Image img = ((ContextMenu)mnu.Parent).PlacementTarget as Image;
+ int index = imageQueue.Items.IndexOf(img);
+ this.RemoveImage(index);
+ }
+ }
+
+ private void RemoveImage(int index) {
+ if (index == curImage || curImage > index)
+ curImage--;
+
+ imageQueue.Items.RemoveAt(index);
+ queue.RemoveAt(index);
+
+ if (queue.Count == 0)
+ ClearQueue_Clicked(null, null);
+ else
+ SetImage(curImage);
+ }
+
+ private void AddFiles(string[] files) {
+ foreach (String filename in files) {
+ try {
+ StackPanel panel = new StackPanel();
+ Image img = new Image();
+ BitmapImage bi = new BitmapImage();
+ bi.BeginInit();
+ bi.CacheOption = BitmapCacheOption.OnLoad;
+ bi.DecodePixelWidth = 300;
+ bi.UriSource = new Uri(filename);
+ bi.EndInit();
+ img.Source = bi;
+ img.Stretch = Stretch.Uniform;
+ if (queue.Count == 0)
+ img.Margin = new Thickness(5, 5, 5, 5);
+ else
+ img.Margin = new Thickness(5, 5, 5, 5);
+ img.MouseLeftButtonUp += ImageQueue_Clicked;
+ img.ContextMenu = this.Resources["imageMenu"] as ContextMenu;
+ panel.Children.Add(img);
+ imageQueue.Items.Add(panel);
+ queue.Add(filename);
+ } catch (NotSupportedException) {
+ MessageBox.Show(filename + " is not in a supported format", "Invalid Format", MessageBoxButton.OK, MessageBoxImage.Error);
+ } catch (FileNotFoundException) {
+ MessageBox.Show(filename + " was not found", "File Not Found", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ if (imageQueue.Items.Count > 0 && curImage == -1) {
+ SetImage(0);
+ imgMain.Stretch = Stretch.Uniform;
+ EnableUI(true);
+ }
+ }
+
+ private void AddURL(string url) {
+ bool res = Uri.TryCreate(url, UriKind.Absolute, out Uri address)
+ && (address.Scheme == Uri.UriSchemeHttp
+ || address.Scheme == Uri.UriSchemeHttps);
+
+ if (res) {
+ String localPath = Path.Combine(tempDir, Path.GetFileName(address.LocalPath));
+
+ Console.WriteLine("Got this far");
+
+ WebClient client = new WebClient();
+ try {
+ client.DownloadFile(address, localPath);
+ AddFiles(new string[] { localPath });
+ } catch (WebException ex) {
+ MessageBox.Show("Error loading image:\n" + ex.Message, "Error");
+ }
+ }
+ }
+
+ private void EnableUI(bool en) {
+ btnClear.IsEnabled = en;
+ btnStart.IsEnabled = en;
+ btnPrev.IsEnabled = en;
+ btnNext.IsEnabled = en;
+
+ mnuClear.IsEnabled = en;
+ mnuStart.IsEnabled = en;
+ mnuPrev.IsEnabled = en;
+ mnuNext.IsEnabled = en;
+
+ if (!en) { // don't automatically enable these
+ btnPause.IsEnabled = false;
+ mnuPause.IsEnabled = false;
+ }
+ }
+
+ private void SetImageToActualSize() {
+ this.imgMain.Width = Double.NaN; // set to auto
+ this.imgMain.Height = Double.NaN;
+
+ this.canvas.Width = Double.NaN;
+ this.canvas.Height = Double.NaN;
+ }
+
+ private void SetStatus(string status) {
+ statusText.Text = status;
+ }
+
+ private void About_Clicked(object sender, RoutedEventArgs e) {
+ AboutWindow abt = new AboutWindow();
+ abt.Show();
+ }
+
+ private void Exit_Clicked(object sender, RoutedEventArgs e) {
+ this.Close();
+ }
+
+ private void OnShowQueueChecked(object sender, RoutedEventArgs e) {
+ if (this.IsLoaded) {
+ if (this.chkShowQueue.IsChecked == true) {
+ this.mnuShowQueue.IsChecked = true;
+ this.queueSidebar.Visibility = Visibility.Visible;
+ this.colQueue.Width = sidebarWidth;
+ this.colQueue.MinWidth = 50;
+ this.colSplitter.IsEnabled = true;
+ } else {
+ this.mnuShowQueue.IsChecked = false;
+ this.sidebarWidth = this.colQueue.Width;
+ this.colQueue.MinWidth = 0;
+ this.colSplitter.IsEnabled = false;
+ this.queueSidebar.Visibility = Visibility.Collapsed;
+ this.colQueue.Width = new GridLength(0);
+ }
+ }
+ }
+
+ private void OnCanvasResize(object sender, SizeChangedEventArgs e) {
+ // TODO scale the canvas/image to fit the window
+ this.imgMain.Width = this.canvas.ActualWidth;
+ this.imgMain.Height = this.canvas.ActualHeight;
+ }
+
+ private void OnChkFitToWindowChecked(object sender, RoutedEventArgs e) {
+ if (this.IsLoaded) {
+ if (this.chkFitToWindow.IsChecked == true) {
+ this.mnuFitImage.IsChecked = true;
+ this.canvas.SizeChanged += OnCanvasResize;
+ this.OnCanvasResize(null, null);
+ } else {
+ this.mnuFitImage.IsChecked = false;
+ this.canvas.SizeChanged -= OnCanvasResize;
+ this.SetImageToActualSize();
+ }
+ }
+ }
+
+ private void OnChkResizeWindowChecked(object sender, RoutedEventArgs e) {
+ if (this.IsLoaded) {
+ if (this.chkResizeWindow.IsChecked == true)
+ this.mnuResizeWindow.IsChecked = true;
+ else
+ this.mnuResizeWindow.IsChecked = false;
+ }
+ }
+
+ private void OnMnuResizeWindowChecked(object sender, RoutedEventArgs e) {
+ if (this.IsLoaded)
+ this.chkResizeWindow.IsChecked = this.mnuResizeWindow.IsChecked;
+ }
+
+ private void OnMnuFitImageChecked(object sender, RoutedEventArgs e) {
+ if (this.IsLoaded)
+ this.chkFitToWindow.IsChecked = this.mnuFitImage.IsChecked;
+ }
+
+ private void OnMnuShowQueueChecked(object sender, RoutedEventArgs e) {
+ if (this.IsLoaded)
+ this.chkShowQueue.IsChecked = this.mnuShowQueue.IsChecked;
+ }
+
+ private void OnChangeAnimLength_Clicked(object sender, RoutedEventArgs e) {
+ AskForTime ask = new AskForTime(this.animationDuration.TotalSeconds, "Animation", "double");
+ ask.ShowDialog();
+ if (ask.DialogResult == true) {
+ this.animationDuration = TimeSpan.FromSeconds(ask.time);
+ }
+ }
+
+ private void OnChangeSlideDelay_Clicked(object sender, RoutedEventArgs e) {
+ AskForTime ask = new AskForTime(this.delayTime, "Slide Delay", "int");
+ ask.ShowDialog();
+ if (ask.DialogResult == true) {
+ this.delayTime = ask.time;
+ }
+ }
+ }
+}
diff --git a/PictureViewer/PictureViewer.csproj b/PictureViewer/PictureViewer.csproj
new file mode 100644
index 0000000..cef8f02
--- /dev/null
+++ b/PictureViewer/PictureViewer.csproj
@@ -0,0 +1,203 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {8A346D98-6813-4ECF-B7D4-99A61FC2310D}
+ WinExe
+ PictureViewer
+ PictureViewer
+ v4.7
+ 512
+ {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ 4
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+ 4.0
+
+
+
+
+
+
+
+ MSBuild:Compile
+ Designer
+
+
+ AddImageURL.xaml
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ MSBuild:Compile
+ Designer
+
+
+ AboutWindow.xaml
+
+
+ App.xaml
+ Code
+
+
+ AskForTime.xaml
+
+
+ MainWindow.xaml
+ Code
+
+
+ Designer
+ MSBuild:Compile
+
+
+
+
+ Code
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ Settings.settings
+ True
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+
+
+ PreserveNewest
+
+
+
+
+ PreserveNewest
+
+
+
+
+ PreserveNewest
+
+
+
+
+ PreserveNewest
+
+
+
+
+ PreserveNewest
+
+
+
+
+ PreserveNewest
+
+
+
+
+ PreserveNewest
+
+
+
+
+ PreserveNewest
+
+
+
+
+ PreserveNewest
+
+
+
+
+ PreserveNewest
+
+
+
+
+ PreserveNewest
+
+
+
+
+ PreserveNewest
+
+
+
+
+ PreserveNewest
+
+
+
+
+ PreserveNewest
+
+
+
+
+ PreserveNewest
+
+
+
+
+ PreserveNewest
+
+
+
+
diff --git a/PictureViewer/Properties/AssemblyInfo.cs b/PictureViewer/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..10d0ec5
--- /dev/null
+++ b/PictureViewer/Properties/AssemblyInfo.cs
@@ -0,0 +1,61 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Windows;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Picture Viewer")]
+[assembly: AssemblyDescription(
+ "Features:\n" +
+ "Slideshow with adjustable delay\n" +
+ "Queue sidebar\n" +
+ "Drag and drop files and urls\n" +
+ "Enable/disable window autoresizing\n" +
+ "Enable/disable fit image to window")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("PictureViewer")]
+[assembly: AssemblyCopyright("Copyright © 2018")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+//In order to begin building localizable applications, set
+//CultureYouAreCodingWith in your .csproj file
+//inside a . For example, if you are using US english
+//in your source files, set the to en-US. Then uncomment
+//the NeutralResourceLanguage attribute below. Update the "en-US" in
+//the line below to match the UICulture setting in the project file.
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
+
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/PictureViewer/Properties/Resources.Designer.cs b/PictureViewer/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..46541d2
--- /dev/null
+++ b/PictureViewer/Properties/Resources.Designer.cs
@@ -0,0 +1,62 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace PictureViewer.Properties {
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if ((resourceMan == null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PictureViewer.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/PictureViewer/Properties/Resources.resx b/PictureViewer/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/PictureViewer/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/PictureViewer/Properties/Settings.Designer.cs b/PictureViewer/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..3645a64
--- /dev/null
+++ b/PictureViewer/Properties/Settings.Designer.cs
@@ -0,0 +1,26 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace PictureViewer.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/PictureViewer/Properties/Settings.settings b/PictureViewer/Properties/Settings.settings
new file mode 100644
index 0000000..033d7a5
--- /dev/null
+++ b/PictureViewer/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/PictureViewer/Resources/CleanData_16x.png b/PictureViewer/Resources/CleanData_16x.png
new file mode 100644
index 0000000..ea3eda3
Binary files /dev/null and b/PictureViewer/Resources/CleanData_16x.png differ
diff --git a/PictureViewer/Resources/ClearWindowContent_16x.png b/PictureViewer/Resources/ClearWindowContent_16x.png
new file mode 100644
index 0000000..4ec5e5c
Binary files /dev/null and b/PictureViewer/Resources/ClearWindowContent_16x.png differ
diff --git a/PictureViewer/Resources/Close_16x.png b/PictureViewer/Resources/Close_16x.png
new file mode 100644
index 0000000..159e70d
Binary files /dev/null and b/PictureViewer/Resources/Close_16x.png differ
diff --git a/PictureViewer/Resources/FitToScreen_16x.png b/PictureViewer/Resources/FitToScreen_16x.png
new file mode 100644
index 0000000..af9cc17
Binary files /dev/null and b/PictureViewer/Resources/FitToScreen_16x.png differ
diff --git a/PictureViewer/Resources/Image.ico b/PictureViewer/Resources/Image.ico
new file mode 100644
index 0000000..07a934d
Binary files /dev/null and b/PictureViewer/Resources/Image.ico differ
diff --git a/PictureViewer/Resources/Next_16x.png b/PictureViewer/Resources/Next_16x.png
new file mode 100644
index 0000000..3986852
Binary files /dev/null and b/PictureViewer/Resources/Next_16x.png differ
diff --git a/PictureViewer/Resources/OpenFolder.ico b/PictureViewer/Resources/OpenFolder.ico
new file mode 100644
index 0000000..e916b41
Binary files /dev/null and b/PictureViewer/Resources/OpenFolder.ico differ
diff --git a/PictureViewer/Resources/Pause.ico b/PictureViewer/Resources/Pause.ico
new file mode 100644
index 0000000..85bb611
Binary files /dev/null and b/PictureViewer/Resources/Pause.ico differ
diff --git a/PictureViewer/Resources/Previous.ico b/PictureViewer/Resources/Previous.ico
new file mode 100644
index 0000000..4ea105b
Binary files /dev/null and b/PictureViewer/Resources/Previous.ico differ
diff --git a/PictureViewer/Resources/Question_16x.png b/PictureViewer/Resources/Question_16x.png
new file mode 100644
index 0000000..07d43ab
Binary files /dev/null and b/PictureViewer/Resources/Question_16x.png differ
diff --git a/PictureViewer/Resources/ResizableControl_16x.png b/PictureViewer/Resources/ResizableControl_16x.png
new file mode 100644
index 0000000..c9d264b
Binary files /dev/null and b/PictureViewer/Resources/ResizableControl_16x.png differ
diff --git a/PictureViewer/Resources/Run.ico b/PictureViewer/Resources/Run.ico
new file mode 100644
index 0000000..7faddd6
Binary files /dev/null and b/PictureViewer/Resources/Run.ico differ
diff --git a/PictureViewer/Resources/ShowDetailsPane_16x.png b/PictureViewer/Resources/ShowDetailsPane_16x.png
new file mode 100644
index 0000000..a8bd86d
Binary files /dev/null and b/PictureViewer/Resources/ShowDetailsPane_16x.png differ
diff --git a/PictureViewer/Resources/Stop.ico b/PictureViewer/Resources/Stop.ico
new file mode 100644
index 0000000..868d9ee
Binary files /dev/null and b/PictureViewer/Resources/Stop.ico differ
diff --git a/PictureViewer/Resources/Time.ico b/PictureViewer/Resources/Time.ico
new file mode 100644
index 0000000..f2004c9
Binary files /dev/null and b/PictureViewer/Resources/Time.ico differ
diff --git a/PictureViewer/Resources/TransitioningContentControl_16x.png b/PictureViewer/Resources/TransitioningContentControl_16x.png
new file mode 100644
index 0000000..c047c5f
Binary files /dev/null and b/PictureViewer/Resources/TransitioningContentControl_16x.png differ
diff --git a/PictureViewer/Resources/Web.ico b/PictureViewer/Resources/Web.ico
new file mode 100644
index 0000000..70446ad
Binary files /dev/null and b/PictureViewer/Resources/Web.ico differ