public ConfigWindow() { InitializeComponent(); linkLabel1.TabStop = false; // won't set to false in the Designer.cs for weird reason // Load Config File vimageConfig = new Config(); vimageConfig.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config.txt")); // Set Settings checkBox_OpenAtMousePosition.Checked = vimageConfig.Setting_OpenAtMousePosition; checkBox_SmoothingDefault.Checked = vimageConfig.Setting_SmoothingDefault; checkBox_BackgroundForImagesWithTransparencyDefault.Checked = vimageConfig.Setting_BackgroundForImagesWithTransparencyDefault; checkBox_PositionLargeWideImagesInCorner.Checked = vimageConfig.Setting_PositionLargeWideImagesInCorner; checkBox_PreloadNextImage.Checked = vimageConfig.Setting_PreloadNextImage; checkBox_OpenSettingsEXE.Checked = vimageConfig.Setting_OpenSettingsEXE; checkBox_ListenForConfigChanges.Checked = vimageConfig.Setting_ListenForConfigChanges; comboBox_LimitImagesToMonitor.SelectedIndex = vimageConfig.Setting_LimitImagesToMonitor; numericUpDown_MinImageSize.Value = vimageConfig.Setting_MinImageSize; numericUpDown_SmoothingMinImageSize.Value = vimageConfig.Setting_SmoothingMinImageSize; numericUpDown_ZoomSpeed.Value = vimageConfig.Setting_ZoomSpeed; numericUpDown_ZoomSpeedFast.Value = vimageConfig.Setting_ZoomSpeedFast; comboBox_DefaultSortBy.SelectedIndex = (int)vimageConfig.Setting_DefaultSortBy; comboBox_DefaultSortDir.SelectedIndex = (int)vimageConfig.Setting_DefaultSortDir; // Setup Control Bindings AddControlItem("Drag", vimageConfig.Control_Drag); AddControlItem("Close", vimageConfig.Control_Close); AddControlItem("Open Context Menu", vimageConfig.Control_OpenContextMenu); AddControlItem("Prev Image", vimageConfig.Control_PrevImage); AddControlItem("Next Image", vimageConfig.Control_NextImage); AddControlItem("Rotate Clockwise", vimageConfig.Control_RotateClockwise); AddControlItem("Rotate Anti-Clockwise", vimageConfig.Control_RotateAntiClockwise); AddControlItem("Flip", vimageConfig.Control_Flip); AddControlItem("Fit To Monitor Auto", vimageConfig.Control_FitToMonitorAuto); AddControlItem("Fit To Monitor Width", vimageConfig.Control_FitToMonitorWidth); AddControlItem("Fit To Monitor Height", vimageConfig.Control_FitToMonitorHeight); AddControlItem("Fit To Monitor Alt", vimageConfig.Control_FitToMonitorAlt); AddControlItem("Zoom Faster", vimageConfig.Control_ZoomFaster); AddControlItem("Zoom Alt", vimageConfig.Control_ZoomAlt); AddControlItem("Toggle Smoothing", vimageConfig.Control_ToggleSmoothing); AddControlItem("Toggle Background For Transparency", vimageConfig.Control_ToggleBackgroundForTransparency); AddControlItem("Toggle Always On Top", vimageConfig.Control_ToggleAlwaysOnTop); AddControlItem("Pause Animation", vimageConfig.Control_PauseAnimation); AddControlItem("Prev Frame", vimageConfig.Control_PrevFrame); AddControlItem("Next Frame", vimageConfig.Control_NextFrame); AddControlItem("Open Config", vimageConfig.Control_OpenConfig); AddControlItem("Reload Config", vimageConfig.Control_ReloadConfig); AddControlItem("Reset Image", vimageConfig.Control_ResetImage); AddControlItem("Open At Location", vimageConfig.Control_OpenAtLocation); AddControlItem("Delete", vimageConfig.Control_Delete); AddControlItem("Copy", vimageConfig.Control_Copy); AddControlItem("Copy as Image", vimageConfig.Control_CopyAsImage); AddControlItem("Open Duplicate Image", vimageConfig.Control_OpenDuplicateImage); AddControlItem("Random Image", vimageConfig.Control_RandomImage); // Setup Context Menu Editor checkBox_ContextMenuShowMargin.Checked = vimageConfig.ContextMenuShowMargin; numericUpDown_ContextMenu_Animation_InsertAtIndex.Value = vimageConfig.ContextMenu_Animation_InsertAtIndex; AddContextMenuItems(vimageConfig.ContextMenu); tabControl_ContextMenus.SelectedIndex = 1; AddContextMenuItems(vimageConfig.ContextMenu_Animation); tabControl_ContextMenus.SelectedIndex = 0; if (ContextMenuItems.Count > 0) ContextMenuItems[0].GiveItemFocus(); AddCustomActionItems(vimageConfig.CustomActions); AddCustomActionBindings(vimageConfig.CustomActionBindings); }
public ImageViewer(string file) { IL.Initialize(); // Extension supported? if (!ImageViewerUtils.IsValidExtension(file, EXTENSIONS)) return; // Save Mouse Position -> will open image at this position Vector2i mousePos = Mouse.GetPosition(); // Get Image LoadImage(file); if (Image == null) return; // Load Config File Config = new Config(); Config.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config.txt")); if (Config.Setting_ListenForConfigChanges) { ConfigFileWatcher = new FileSystemWatcher(AppDomain.CurrentDomain.BaseDirectory, "config.txt"); ConfigFileWatcher.NotifyFilter = NotifyFilters.LastWrite; ConfigFileWatcher.Changed += new FileSystemEventHandler(OnConfigChanged); ConfigFileWatcher.EnableRaisingEvents = true; } // Get/Set Folder Sorting SortImagesBy = Config.Setting_DefaultSortBy; SortImagesByDir = Config.Setting_DefaultSortDir; if (SortImagesBy == SortBy.FolderDefault || SortImagesByDir == SortDirection.FolderDefault) { // Get parent folder name string parentFolder = file.Substring(0, file.LastIndexOf('\\')); parentFolder = parentFolder.Substring(parentFolder.LastIndexOf('\\') + 1, parentFolder.Length - parentFolder.LastIndexOf('\\') - 1); // Get sort column info from window with corresponding name SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows(); foreach (SHDocVw.ShellBrowserWindow shellWindow in shellWindows) { if (shellWindow.LocationName != parentFolder) continue; Shell32.ShellFolderView view = (Shell32.ShellFolderView)shellWindow.Document; string sort = view.SortColumns; sort = sort.Substring(5, sort.Length - 5); // Direction if (sort[0] == '-') { sort = sort.Substring(1, sort.Length - 1); if (SortImagesByDir == SortDirection.FolderDefault) SortImagesByDir = SortDirection.Descending; } else if (SortImagesByDir == SortDirection.FolderDefault) SortImagesByDir = SortDirection.Ascending; // By if (SortImagesBy == SortBy.FolderDefault) { switch (sort) { case "System.ItemDate;": SortImagesBy = SortBy.Date; break; case "System.DateModified;": SortImagesBy = SortBy.DateModified; break; case "System.DateCreated;": SortImagesBy = SortBy.DateCreated; break; case "System.Size;": SortImagesBy = SortBy.Size; break; default: SortImagesBy = SortBy.Name; break; } } } } // Default sorting if folder was closed if (SortImagesBy == SortBy.FolderDefault) SortImagesBy = SortBy.Name; if (SortImagesByDir == SortDirection.FolderDefault) SortImagesByDir = SortDirection.Ascending; // Create Context Menu ContextMenu = new ContextMenu(this); ContextMenu.LoadItems(Config.ContextMenu, Config.ContextMenu_Animation, Config.ContextMenu_Animation_InsertAtIndex); ContextMenu.Setup(false); // Create Window Window = new RenderWindow(new VideoMode(Image.Texture.Size.X, Image.Texture.Size.Y), File + " - vimage", Styles.None); Window.SetActive(); // Make Window Transparent (can only tell if image being viewed has transparency) DWM_BLURBEHIND bb = new DWM_BLURBEHIND(false); bb.dwFlags = DWM_BB.Enable; bb.fEnable = true; bb.hRgnBlur = new IntPtr(); DWM.DwmEnableBlurBehindWindow(Window.SystemHandle, ref bb); bool _forceAlwaysOnTop = false; // Get Bounds IntRect bounds = ImageViewerUtils.GetCurrentBounds(mousePos); // Resize Window if (Config.Setting_LimitImagesToMonitor != Config.NONE) { // Fit to monitor height/width int limit = Config.Setting_LimitImagesToMonitor; if (limit == Config.AUTO) { if (bounds.Height < bounds.Width) limit = Config.HEIGHT; else limit = Config.WIDTH; } if (limit == Config.HEIGHT && Image.Texture.Size.Y > bounds.Height) { Zoom(1 + (((float)bounds.Height - Image.Texture.Size.Y) / Image.Texture.Size.Y), true); FitToMonitorHeightForced = true; } else if (limit == Config.WIDTH && Image.Texture.Size.X > bounds.Width) { Zoom(1 + (((float)bounds.Width - Image.Texture.Size.X) / Image.Texture.Size.X), true); AutomaticallyZoomed = true; } } if (Math.Min(Image.Texture.Size.X, Image.Texture.Size.Y) < Config.Setting_MinImageSize) { // Reisze images smaller than min size to min size AutomaticallyZoomed = true; Zoom(Config.Setting_MinImageSize / Math.Min(Image.Texture.Size.X, Image.Texture.Size.Y), true); } // Use Texture Size * Zoom instead of Window.Size since it wouldn't have updated yet Vector2i winSize = new Vector2i((int)(Image.Texture.Size.X * CurrentZoom), (int)(Image.Texture.Size.Y * CurrentZoom)); // Position Window Vector2i winPos; if (Config.Setting_PositionLargeWideImagesInCorner && CurrentImageSize().X > CurrentImageSize().Y && CurrentImageSize().X * CurrentZoom >= bounds.Width) { // Position Window in top-left if the image is wide (ie: a Desktop Wallpaper / Screenshot) winPos = new Vector2i(bounds.Left, bounds.Top); } else if (Config.Setting_OpenAtMousePosition) { // At Mouse Position winPos = new Vector2i(mousePos.X - (int)(winSize.X / 2), mousePos.Y - (int)(winSize.Y / 2)); if (!FitToMonitorHeightForced) { if (winPos.Y < bounds.Top) winPos.Y = 0; else if (winPos.Y + winSize.Y > bounds.Height) winPos.Y = bounds.Height - (int)winSize.Y; } else winPos.Y = bounds.Top; if (winPos.X < bounds.Left) winPos.X = bounds.Left; else if (winPos.X + winSize.X > bounds.Left + bounds.Width) winPos.X = bounds.Left + bounds.Width - (int)winSize.X; } else { // At Monitor Center IntRect monitorBounds = ImageViewerUtils.GetCurrentBounds(mousePos); winPos = new Vector2i(monitorBounds.Left + (int)((monitorBounds.Width - winSize.X) / 2), monitorBounds.Top + (int)((monitorBounds.Height - winSize.Y) / 2)); } Window.Position = winPos; // Force Always On Top Mode (so it's above the task bar) if (FitToMonitorHeightForced || (Image.Texture.Size.Y >= bounds.Height && Image.Texture.Size.X < bounds.Width)) _forceAlwaysOnTop = true; // Defaults // Rotation (some images have a rotation set in their exif data) RotateImage(DefaultRotation, false); // Smoothing if (Image is AnimatedImage) Image.Data.Smooth = Math.Min(Image.Texture.Size.X, Image.Texture.Size.Y) < Config.Setting_SmoothingMinImageSize ? false : Config.Setting_SmoothingDefault; else Image.Texture.Smooth = Math.Min(Image.Texture.Size.X, Image.Texture.Size.Y) < Config.Setting_SmoothingMinImageSize ? false : Config.Setting_SmoothingDefault; // Backgrounds For Images With Transparency BackgroundsForImagesWithTransparency = Config.Setting_BackgroundForImagesWithTransparencyDefault; ForceAlwaysOnTopNextTick = _forceAlwaysOnTop; Redraw(); NextWindowPos = Window.Position; // Interaction Window.Closed += OnWindowClosed; Window.MouseButtonPressed += OnMouseDown; Window.MouseButtonReleased += OnMouseUp; Window.MouseWheelScrolled += OnMouseWheelScrolled; Window.MouseMoved += OnMouseMoved; Window.KeyReleased += OnKeyUp; Window.KeyPressed += OnKeyDown; // Loop Stopwatch clock = new Stopwatch(); clock.Start(); while (Window.IsOpen) { // Add in some idle time to not thrash the CPU Thread.Sleep(1); if (CloseNextTick) { Window.Close(); break; } // Process events Window.DispatchEvents(); if (ReloadConfigNextTick) { ReloadConfig(); ReloadConfigNextTick = false; } // Animated Image? if (Image is AnimatedImage) { bool imageUpdated = Image.Update((float)clock.Elapsed.TotalMilliseconds); if (!Updated && imageUpdated) Update(); } clock.Restart(); // Drag Window if (Dragging) Window.Position = new Vector2i(Mouse.GetPosition().X - DragPos.X, Mouse.GetPosition().Y - DragPos.Y); // Update if (Updated) { Updated = false; Redraw(); Window.Position = NextWindowPos; } if (ForceAlwaysOnTopNextTick) { bounds = ImageViewerUtils.GetCurrentBounds(Window.Position); if (Window.Size.Y >= bounds.Height && Window.Size.X < bounds.Width) ForceAlwaysOnTop(); else ForceAlwaysOnTopNextTick = false; } if (PreloadNextImageStart) PreloadNextImage(); } }