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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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