#region License Information (GPL v3) /* ShareX - A program that allows you to take screenshots and share any file type Copyright (c) 2007-2022 ShareX Team This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Optionally you can also view the license at . */ #endregion License Information (GPL v3) using System; using System.Drawing; using System.Windows.Forms; namespace ShareX.HelpersLib { public class ImageViewer : Form { public Image CurrentImage { get; private set; } public bool SupportsImageNavigation => Images != null && Images.Length > 0; public string[] Images { get; private set; } public int CurrentImageIndex { get; private set; } private ImageViewer(Image img) { InitializeComponent(); ShareXResources.ApplyTheme(this); LoadImage(img); } private ImageViewer(string[] images, int currentImageIndex = 0) { InitializeComponent(); ShareXResources.ApplyTheme(this); Images = images; CurrentImageIndex = currentImageIndex; LoadCurrentImage(); } private void LoadImage(Image img) { CurrentImage?.Dispose(); CurrentImage = img; pbPreview.LoadImage(CurrentImage); } private void LoadCurrentImage() { if (!SupportsImageNavigation) return; CurrentImageIndex = CurrentImageIndex.Clamp(0, Images.Length - 1); string imageFilePath = Images[CurrentImageIndex]; Image img = ImageHelpers.LoadImage(imageFilePath); LoadImage(img); } private void NavigateImage(int position) { if (!SupportsImageNavigation) return; int nextImageIndex = CurrentImageIndex + position; if (nextImageIndex > Images.Length - 1) { nextImageIndex = 0; } else if (nextImageIndex < 0) { nextImageIndex = Images.Length - 1; } if (CurrentImageIndex != nextImageIndex) { CurrentImageIndex = nextImageIndex; LoadCurrentImage(); } } public static void ShowImage(Image img) { if (img != null) { using (Image tempImage = img.CloneSafe()) { if (tempImage != null) { using (ImageViewer viewer = new ImageViewer(tempImage)) { viewer.ShowDialog(); } } } } } public static void ShowImage(string filePath) { using (Bitmap bmp = ImageHelpers.LoadImage(filePath)) { if (bmp != null) { using (ImageViewer viewer = new ImageViewer(bmp)) { viewer.ShowDialog(); } } } } public static void ShowImage(string[] images, int currentImageIndex = 0) { if (images != null && images.Length > 0) { using (ImageViewer viewer = new ImageViewer(images, currentImageIndex)) { viewer.ShowDialog(); } } } private void ImageViewer_Shown(object sender, EventArgs e) { this.ForceActivate(); } private void ImageViewer_Deactivate(object sender, EventArgs e) { Close(); } private void pbPreview_MouseDown(object sender, MouseEventArgs e) { Close(); } private void pbPreview_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Escape: case Keys.Enter: case Keys.Space: Close(); break; case Keys.Left: NavigateImage(-1); break; case Keys.Right: NavigateImage(1); break; } } private void pbPreview_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { switch (e.KeyCode) { case Keys.Left: case Keys.Right: e.IsInputKey = true; break; } } #region Windows Form Designer generated code private System.ComponentModel.IContainer components = null; protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } CurrentImage?.Dispose(); base.Dispose(disposing); } private void InitializeComponent() { pbPreview = new MyPictureBox(); SuspendLayout(); BackColor = SystemColors.Window; Bounds = CaptureHelpers.GetActiveScreenBounds(); DoubleBuffered = true; FormBorderStyle = FormBorderStyle.None; // TODO: Translate Text = "ShareX - Image viewer"; TopMost = true; WindowState = FormWindowState.Normal; StartPosition = FormStartPosition.Manual; pbPreview.Cursor = Cursors.Hand; pbPreview.Dock = DockStyle.Fill; pbPreview.DrawCheckeredBackground = true; pbPreview.FullscreenOnClick = false; pbPreview.Location = new Point(0, 0); pbPreview.Name = "pbPreview"; pbPreview.ShowImageSizeLabel = true; pbPreview.Size = new Size(96, 100); pbPreview.TabIndex = 0; Controls.Add(pbPreview); Shown += ImageViewer_Shown; Deactivate += ImageViewer_Deactivate; pbPreview.MouseDown += pbPreview_MouseDown; pbPreview.KeyDown += pbPreview_KeyDown; pbPreview.PreviewKeyDown += pbPreview_PreviewKeyDown; ResumeLayout(false); } private MyPictureBox pbPreview; #endregion Windows Form Designer generated code } }