/// <summary> /// Reset to default state /// </summary> internal static void Unload() { ConfigureWindows.GetMainWindow.TitleText.ToolTip = ConfigureWindows.GetMainWindow.TitleText.Text = Application.Current.Resources["NoImage"] as string; ConfigureWindows.GetMainWindow.Title = Application.Current.Resources["NoImage"] as string + " - " + UILogic.SetTitle.AppName; CanNavigate = false; ConfigureWindows.GetMainWindow.MainImage.Source = null; FreshStartup = true; if (Pics != null) { Pics.Clear(); } Preloader.Clear(); GalleryFunctions.Clear(); ConfigureWindows.GetMainWindow.MainImage.Width = ConfigureWindows.GetMainWindow.Scroller.Width = ConfigureWindows.GetMainWindow.Scroller.Height = ConfigureWindows.GetMainWindow.MainImage.Height = double.NaN; ScaleImage.xWidth = ScaleImage.xHeight = 0; if (!string.IsNullOrWhiteSpace(ArchiveExtraction.TempZipPath)) { DeleteTempFiles(); ArchiveExtraction.TempZipPath = string.Empty; } SystemIntegration.Taskbar.NoProgress(); }
/// <summary> /// Refresh the current list of pics and reload them if there is some missing or changes. /// </summary> internal static void Reload(bool fromBackup = false) { if (fromBackup && string.IsNullOrWhiteSpace(BackupPath)) { Unload(); return; } string s; if (Pics != null && Pics.Count > 0) { s = fromBackup ? BackupPath : Pics[FolderIndex]; } else { // TODO extract url from path or get alternative method s = Path.GetFileName(ConfigureWindows.GetMainWindow.TitleText.Text); } if (File.Exists(s)) { // Force reloading values by setting freshStartup to true FreshStartup = true; // Clear Preloader, to avoid errors by FolderIndex changing location because of re-sorting Preloader.Clear(); // Need a sort method instead GalleryFunctions.Clear(); Pic(s); // Reset if (Flipped) { Flip(); } if (Rotateint != 0) { Rotate(0); } } else if (Clipboard.ContainsImage() || Base64.IsBase64String(s)) { return; } else if (Uri.IsWellFormedUriString(s, UriKind.Absolute)) // Check if from web { LoadFromWeb.PicWeb(s); } else { Unload(); ShowTooltipMessage(Application.Current.Resources["UnexpectedError"]); } }
/// <summary> /// Update after FastPic() was used /// </summary> internal static void FastPicUpdate() { if (!Preloader.Contains(Pics[FolderIndex])) { Preloader.Clear(); } Pic(FolderIndex); }
/// <summary> /// Update after FastPic() was used /// </summary> internal static void FastPicUpdate() { /// TODO optimize preloader usage here, to not cause delays /// when very quickly browsing images /// Need a solution that will make sure no unused values /// are in the preloader collection // Make sure it's only updated when the key is actually held down if (!FastPicRunning) { return; } Preloader.Clear(); Pic(FolderIndex); FastPicRunning = false; }
/// <summary> /// Clears data, to free objects no longer necessary to store in memory and allow changing folder without error. /// </summary> internal static void ChangeFolder(bool backup = false) { if (Pics.Count > 0 && backup) { // Make a backup of xPicPath and FolderIndex if (!string.IsNullOrWhiteSpace(Pics[FolderIndex])) { BackupPath = Pics[FolderIndex]; } } Pics.Clear(); GalleryFunctions.Clear(); Preloader.Clear(); FreshStartup = true; DeleteTempFiles(); }
/// <summary> /// Loads a picture from a given file path and does extra error checking /// </summary> /// <param name="path"></param> internal static async void Pic(string path) { // Set Loading SetLoadingString(); // Handle if from web if (!File.Exists(path)) { if (Uri.IsWellFormedUriString(path, UriKind.Absolute)) { LoadFromWeb.PicWeb(path); return; } else if (Directory.Exists(path)) { ChangeFolder(true); await GetValues(path).ConfigureAwait(true); } else { Unload(); return; } } // If count not correct or just started, get values if (Pics.Count <= FolderIndex || FolderIndex < 0 || FreshStartup) { await GetValues(path).ConfigureAwait(true); } // If the file is in the same folder, navigate to it. If not, start manual loading procedure. else if (!string.IsNullOrWhiteSpace(Pics[FolderIndex]) && Path.GetDirectoryName(path) != Path.GetDirectoryName(Pics[FolderIndex])) { // Reset old values and get new ChangeFolder(true); await GetValues(path).ConfigureAwait(true); } FolderIndex = Pics.IndexOf(path); // Fix large archive extraction error if (FolderIndex == -1) { var recovery = await RecoverFailedArchiveAsync().ConfigureAwait(true); if (!recovery) { Reload(true); return; } else { LoadWindows.GetMainWindow.TitleText.Text = Application.Current.Resources["Unzipping"] as string; LoadWindows.GetMainWindow.TitleText.ToolTip = LoadWindows.GetMainWindow.TitleText.Text; FolderIndex = 0; } LoadWindows.GetMainWindow.Focus(); } if (!FreshStartup) { Preloader.Clear(); } #if DEBUG if (FreshStartup) { Trace.WriteLine("Pic(string path) entering Pic(int x)"); } #endif // Navigate to picture using obtained index Pic(FolderIndex); // Load new gallery values, if changing folder if (GetPicGallery != null && Properties.Settings.Default.PicGallery == 2 && !GalleryFunctions.IsLoading) { await GalleryLoad.Load().ConfigureAwait(false); } }
/// <summary> /// Goes to next, previous, first or last file in folder /// </summary> /// <param name="next">Whether it's forward or not</param> /// <param name="end">Whether to go to last or first, /// depending on the next value</param> internal static void Pic(bool next = true, bool end = false) { // Exit if not intended to change picture if (!CanNavigate) { return; } // exit if browsing PicGallery if (GetPicGallery != null) { if (Properties.Settings.Default.PicGallery == 1) { if (GalleryFunctions.IsOpen) { return; } } } // Make backup var indexBackup = FolderIndex; if (!end) // Go to next or previous { if (next) { // loop next if (Properties.Settings.Default.Looping || Slideshow.SlideTimer != null && Slideshow.SlideTimer.Enabled) { FolderIndex = FolderIndex == Pics.Count - 1 ? 0 : FolderIndex + 1; } else { // Go to next if able if (FolderIndex + 1 == Pics.Count) { return; } FolderIndex++; } Reverse = false; } else { // Loop prev if (Properties.Settings.Default.Looping || Slideshow.SlideTimer != null && Slideshow.SlideTimer.Enabled) { FolderIndex = FolderIndex == 0 ? Pics.Count - 1 : FolderIndex - 1; } else { // Go to prev if able if (FolderIndex - 1 < 0) { return; } FolderIndex--; } Reverse = true; } } else // Go to first or last { FolderIndex = next ? Pics.Count - 1 : 0; indexBackup = FolderIndex; // Reset preloader values to prevent errors if (Pics.Count > 20) { Preloader.Clear(); } } // Go to the image! Pic(FolderIndex); // Update PicGallery selected item, if needed if (GetPicGallery != null) { if (GetPicGallery.Container.Children.Count > FolderIndex && GetPicGallery.Container.Children.Count > indexBackup) { if (indexBackup != FolderIndex) { GalleryFunctions.SetUnselected(indexBackup); } GalleryFunctions.SetSelected(FolderIndex); GalleryScroll.ScrollTo(); } else { // TODO Find way to get PicGalleryItem an alternative way... } } CloseToolTipMessage(); }
/// <summary> /// Goes to next, previous, first or last file in folder /// </summary> /// <param name="next">Whether it's forward or not</param> /// <param name="end">Whether to go to last or first, /// depending on the next value</param> internal static async void Pic(bool next = true, bool end = false) { // Exit if not intended to change picture if (!CanNavigate) { return; } // exit if browsing PicGallery if (GetPicGallery != null) { if (Properties.Settings.Default.FullscreenGallery == false) { if (GalleryFunctions.IsOpen) { return; } } } // Make backup var indexBackup = FolderIndex; if (!end) // Go to next or previous { if (next) { // loop next if (Properties.Settings.Default.Looping || Slideshow.SlideTimer != null && Slideshow.SlideTimer.Enabled) { FolderIndex = FolderIndex == Pics.Count - 1 ? 0 : FolderIndex + 1; } else { // Go to next if able if (FolderIndex + 1 == Pics.Count) { return; } FolderIndex++; } Reverse = false; } else { // Loop prev if (Properties.Settings.Default.Looping || Slideshow.SlideTimer != null && Slideshow.SlideTimer.Enabled) { FolderIndex = FolderIndex == 0 ? Pics.Count - 1 : FolderIndex - 1; } else { // Go to prev if able if (FolderIndex - 1 < 0) { return; } FolderIndex--; } Reverse = true; } } else // Go to first or last { FolderIndex = next ? Pics.Count - 1 : 0; indexBackup = FolderIndex; // Reset preloader values to prevent errors if (Pics.Count > 20) { Preloader.Clear(); } } // Go to the image! await LoadPicAt(FolderIndex).ConfigureAwait(true); // Update PicGallery selected item, if needed if (GalleryFunctions.IsOpen) { await ConfigureWindows.GetMainWindow.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)(() => { if (GetPicGallery.Container.Children.Count > FolderIndex && GetPicGallery.Container.Children.Count > indexBackup) { if (indexBackup != FolderIndex) { GalleryNavigation.SetSelected(indexBackup, false); } GalleryNavigation.SetSelected(FolderIndex, true); GalleryNavigation.ScrollTo(); } else { // TODO Find way to get PicGalleryItem an alternative way... } })); } CloseToolTipMessage(); }
/// <summary> /// Loads a picture from a given file path and does extra error checking /// </summary> /// <param name="path"></param> internal static async Task LoadPiFrom(string path) { // Set Loading SetLoadingString(); // Handle if from web if (!File.Exists(path)) { if (Uri.IsWellFormedUriString(path, UriKind.Absolute)) { LoadFromWeb.PicWeb(path); return; } else if (Directory.Exists(path)) { ChangeFolder(true); await GetValues(path).ConfigureAwait(true); } else { Unload(); return; } } // If count not correct or just started, get values if (Pics.Count <= FolderIndex || FolderIndex < 0 || FreshStartup) { await GetValues(path).ConfigureAwait(true); } // If the file is in the same folder, navigate to it. If not, start manual loading procedure. else if (!string.IsNullOrWhiteSpace(Pics[FolderIndex]) && Path.GetDirectoryName(path) != Path.GetDirectoryName(Pics[FolderIndex])) { // Reset old values and get new ChangeFolder(true); await GetValues(path).ConfigureAwait(true); } FolderIndex = Pics.IndexOf(path); if (!FreshStartup) { Preloader.Clear(); } if (FolderIndex != -1) // if it is -1, it means it being extracted and need to wait for it instead { // Navigate to picture using obtained index await LoadPicAt(FolderIndex).ConfigureAwait(false); } await ConfigureWindows.GetMainWindow.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, (Action)(async() => { // Load new gallery values, if changing folder if (GetPicGallery != null && Properties.Settings.Default.FullscreenGallery) { if (GetPicGallery.Container.Children.Count == 0) { await GalleryLoad.Load().ConfigureAwait(false); } } })); }
/// <summary> /// Loads a picture from a given file path and does extra error checking /// </summary> /// <param name="path"></param> internal static async void Pic(string path) { // Set Loading SetLoadingString(); // Handle if from web if (!File.Exists(path)) { if (Uri.IsWellFormedUriString(path, UriKind.Absolute)) { LoadFromWeb.PicWeb(path); return; } else if (Directory.Exists(path)) { ChangeFolder(true); await GetValues(path).ConfigureAwait(true); } else { Unload(); return; } } // If count not correct or just started, get values if (Pics.Count <= FolderIndex || FolderIndex < 0 || FreshStartup) { await GetValues(path).ConfigureAwait(true); } // If the file is in the same folder, navigate to it. If not, start manual loading procedure. else if (!string.IsNullOrWhiteSpace(Pics[FolderIndex]) && Path.GetDirectoryName(path) != Path.GetDirectoryName(Pics[FolderIndex])) { // Reset old values and get new ChangeFolder(true); await GetValues(path).ConfigureAwait(true); } FolderIndex = Pics.IndexOf(path); if (!FreshStartup) { Preloader.Clear(); } #if DEBUG if (FreshStartup) { Trace.WriteLine("Pic(string path) entering Pic(int x)"); } #endif // Navigate to picture using obtained index Pic(FolderIndex == -1 ? 0 : FolderIndex); // Load new gallery values, if changing folder if (GetPicGallery != null && Properties.Settings.Default.PicGallery == 2) { if (GetPicGallery.Container.Children.Count == 0) { await GalleryLoad.Load().ConfigureAwait(false); } } }