diff --git a/ShareX.ScreenCaptureLib/Forms/RegionCaptureForm.cs b/ShareX.ScreenCaptureLib/Forms/RegionCaptureForm.cs
index dc21dd74d..32a188336 100644
--- a/ShareX.ScreenCaptureLib/Forms/RegionCaptureForm.cs
+++ b/ShareX.ScreenCaptureLib/Forms/RegionCaptureForm.cs
@@ -101,6 +101,7 @@ public Color CurrentColor
private TextAnimation editorPanTipAnimation;
private Bitmap bmpBackgroundImage;
private Cursor defaultCursor;
+ private ScrollbarManager scrollbarManager;
public RegionCaptureForm(RegionCaptureMode mode, RegionCaptureOptions options, Image canvas = null)
{
@@ -118,14 +119,20 @@ public RegionCaptureForm(RegionCaptureMode mode, RegionCaptureOptions options, I
{
Duration = TimeSpan.FromMilliseconds(200)
};
- if (IsEditorMode && Options.ShowEditorPanTip)
+
+ if (IsEditorMode)
{
- editorPanTipAnimation = new TextAnimation()
+ scrollbarManager = new ScrollbarManager(this);
+
+ if (Options.ShowEditorPanTip)
{
- Duration = TimeSpan.FromMilliseconds(5000),
- FadeOutDuration = TimeSpan.FromMilliseconds(1000),
- Text = Resources.RegionCaptureForm_TipYouCanPanImageByHoldingMouseMiddleButtonAndDragging
- };
+ editorPanTipAnimation = new TextAnimation()
+ {
+ Duration = TimeSpan.FromMilliseconds(5000),
+ FadeOutDuration = TimeSpan.FromMilliseconds(1000),
+ Text = Resources.RegionCaptureForm_TipYouCanPanImageByHoldingMouseMiddleButtonAndDragging
+ };
+ }
}
borderPen = new Pen(Color.Black);
@@ -667,6 +674,11 @@ private new void Update()
borderDotPen.DashOffset = (float)timerStart.Elapsed.TotalSeconds * -15;
ShapeManager.Update();
+
+ if (scrollbarManager != null)
+ {
+ scrollbarManager.Update();
+ }
}
protected override void OnPaintBackground(PaintEventArgs e)
@@ -864,10 +876,10 @@ private void Draw(Graphics g)
DrawTextAnimation(g, ShapeManager.MenuTextAnimation);
}
- // Draw scroll bars while panning
- if (ShapeManager.IsPanning)
+ // Draw scroll bars
+ if (scrollbarManager != null)
{
- DrawPanningScrollbars(g);
+ scrollbarManager.Draw(g);
}
}
@@ -1023,60 +1035,6 @@ private void DrawBottomTipAnimation(Graphics g, TextAnimation textAnimation)
DrawTextAnimation(g, textAnimation, textRectangle, padding);
}
- private void DrawPanningScrollbars(Graphics g)
- {
- if (ClientArea.Contains(CanvasRectangle)) return;
-
- int scrollbarThickness = 10;
- int trackMargin = 15;
- int trackPadding = 2;
-
- Rectangle imageRectangleVisible = CanvasRectangle;
- imageRectangleVisible.Intersect(ClientArea);
-
- using (Brush trackBrush = new SolidBrush(Color.FromArgb(255, 60, 60, 60)))
- using (Brush thumbBrush = new SolidBrush(Color.FromArgb(255, 130, 130, 130)))
- {
- if (CanvasRectangle.Left < ClientArea.Left || CanvasRectangle.Right > ClientArea.Right)
- {
- int trackHorizontalLength = ClientArea.Width - trackMargin * 2 - scrollbarThickness - trackPadding * 2;
- int thumbHorizontalLength = Math.Max(scrollbarThickness, (int)Math.Round((float)imageRectangleVisible.Width / CanvasRectangle.Width * trackHorizontalLength));
-
- Rectangle trackHorizontalRegion = new Rectangle(new Point(trackMargin - trackPadding, ClientArea.Bottom - (scrollbarThickness + trackMargin) - trackPadding), new Size(trackHorizontalLength + trackPadding * 2, scrollbarThickness + trackPadding * 2));
-
- double limitHorizontal = (trackHorizontalLength - thumbHorizontalLength) / 2.0f;
- double thumbHorizontalPositionX = Math.Round(trackHorizontalRegion.X + trackHorizontalRegion.Width / 2.0f - (thumbHorizontalLength / 2.0f) -
- Math.Min(limitHorizontal, Math.Max(-limitHorizontal, CanvasCenterOffset.X / CanvasRectangle.Width * trackHorizontalLength)));
-
- Rectangle thumbHorizontalRegion = new Rectangle(new Point((int)thumbHorizontalPositionX, ClientArea.Bottom - (scrollbarThickness + trackMargin)), new Size(thumbHorizontalLength, scrollbarThickness));
-
- g.SmoothingMode = SmoothingMode.HighQuality;
- g.DrawCapsule(trackBrush, trackHorizontalRegion);
- g.DrawCapsule(thumbBrush, thumbHorizontalRegion);
- g.SmoothingMode = SmoothingMode.None;
- }
-
- if (CanvasRectangle.Top < ClientArea.Top || CanvasRectangle.Bottom > ClientArea.Bottom)
- {
- int trackVerticalLength = ClientArea.Height - trackMargin * 2 - scrollbarThickness - trackPadding * 2;
- int thumbVerticalLength = Math.Max(scrollbarThickness, (int)Math.Round((float)imageRectangleVisible.Height / CanvasRectangle.Height * trackVerticalLength));
-
- Rectangle trackVerticalRegion = new Rectangle(new Point(ClientArea.Right - (scrollbarThickness + trackMargin) - trackPadding, trackMargin - trackPadding), new Size(scrollbarThickness + trackPadding * 2, trackVerticalLength + trackPadding * 2));
-
- double limitVertical = (trackVerticalLength - thumbVerticalLength) / 2.0f;
- double thumbVerticalPositionY = Math.Round(trackVerticalRegion.Y + trackVerticalRegion.Height / 2.0f - (thumbVerticalLength / 2.0f) -
- Math.Min(limitVertical, Math.Max(-limitVertical, CanvasCenterOffset.Y / CanvasRectangle.Height * trackVerticalLength)));
-
- Rectangle thumbVerticalRegion = new Rectangle(new Point(ClientArea.Right - (scrollbarThickness + trackMargin), (int)thumbVerticalPositionY), new Size(scrollbarThickness, thumbVerticalLength));
-
- g.SmoothingMode = SmoothingMode.HighQuality;
- g.DrawCapsule(trackBrush, trackVerticalRegion);
- g.DrawCapsule(thumbBrush, thumbVerticalRegion);
- g.SmoothingMode = SmoothingMode.None;
- }
- }
- }
-
private void WriteTips(StringBuilder sb)
{
sb.AppendLine(Resources.RectangleRegion_WriteTips__F1__Hide_tips);
diff --git a/ShareX.ScreenCaptureLib/RegionHelpers/ScrollbarManager.cs b/ShareX.ScreenCaptureLib/RegionHelpers/ScrollbarManager.cs
new file mode 100644
index 000000000..255549c19
--- /dev/null
+++ b/ShareX.ScreenCaptureLib/RegionHelpers/ScrollbarManager.cs
@@ -0,0 +1,119 @@
+#region License Information (GPL v3)
+
+/*
+ ShareX - A program that allows you to take screenshots and share any file type
+ Copyright (c) 2007-2017 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 ShareX.HelpersLib;
+using System;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+
+namespace ShareX.ScreenCaptureLib
+{
+ internal class ScrollbarManager
+ {
+ public bool IsVisible => form.ShapeManager.IsPanning && (IsHorizontalScrollbarVisible || IsVerticalScrollbarVisible);
+ public bool IsHorizontalScrollbarVisible { get; private set; }
+ public bool IsVerticalScrollbarVisible { get; private set; }
+
+ public int Thickness { get; set; } = 10;
+ public int Margin { get; set; } = 15;
+ public int Padding { get; set; } = 2;
+
+ private RegionCaptureForm form;
+ private Rectangle horizontalTrackRectangle, horizontalThumbRectangle, verticalTrackRectangle, verticalThumbRectangle;
+
+ public ScrollbarManager(RegionCaptureForm regionCaptureForm)
+ {
+ form = regionCaptureForm;
+ }
+
+ public void Update()
+ {
+ Rectangle imageRectangleVisible = form.CanvasRectangle;
+ imageRectangleVisible.Intersect(form.ClientArea);
+
+ IsHorizontalScrollbarVisible = form.CanvasRectangle.Left < form.ClientArea.Left || form.CanvasRectangle.Right > form.ClientArea.Right;
+
+ if (IsHorizontalScrollbarVisible)
+ {
+ int horizontalTrackLength = form.ClientArea.Width - Margin * 2 - Thickness - Padding * 2;
+ int horizontalThumbLength = Math.Max(Thickness, (int)Math.Round((float)imageRectangleVisible.Width / form.CanvasRectangle.Width * horizontalTrackLength));
+
+ horizontalTrackRectangle = new Rectangle(new Point(Margin - Padding, form.ClientArea.Bottom - (Thickness + Margin) - Padding),
+ new Size(horizontalTrackLength + Padding * 2, Thickness + Padding * 2));
+
+ double limitHorizontal = (horizontalTrackLength - horizontalThumbLength) / 2.0f;
+ double thumbHorizontalPositionX = Math.Round(horizontalTrackRectangle.X + horizontalTrackRectangle.Width / 2.0f - (horizontalThumbLength / 2.0f) -
+ Math.Min(limitHorizontal, Math.Max(-limitHorizontal, form.CanvasCenterOffset.X / form.CanvasRectangle.Width * horizontalTrackLength)));
+
+ horizontalThumbRectangle = new Rectangle(new Point((int)thumbHorizontalPositionX, form.ClientArea.Bottom - (Thickness + Margin)),
+ new Size(horizontalThumbLength, Thickness));
+ }
+
+ IsVerticalScrollbarVisible = form.CanvasRectangle.Top < form.ClientArea.Top || form.CanvasRectangle.Bottom > form.ClientArea.Bottom;
+
+ if (IsVerticalScrollbarVisible)
+ {
+ int verticalTrackLength = form.ClientArea.Height - Margin * 2 - Thickness - Padding * 2;
+ int verticalThumbLength = Math.Max(Thickness, (int)Math.Round((float)imageRectangleVisible.Height / form.CanvasRectangle.Height * verticalTrackLength));
+
+ verticalTrackRectangle = new Rectangle(new Point(form.ClientArea.Right - (Thickness + Margin) - Padding, Margin - Padding),
+ new Size(Thickness + Padding * 2, verticalTrackLength + Padding * 2));
+
+ double limitVertical = (verticalTrackLength - verticalThumbLength) / 2.0f;
+ double thumbVerticalPositionY = Math.Round(verticalTrackRectangle.Y + verticalTrackRectangle.Height / 2.0f - (verticalThumbLength / 2.0f) -
+ Math.Min(limitVertical, Math.Max(-limitVertical, form.CanvasCenterOffset.Y / form.CanvasRectangle.Height * verticalTrackLength)));
+
+ verticalThumbRectangle = new Rectangle(new Point(form.ClientArea.Right - (Thickness + Margin), (int)thumbVerticalPositionY),
+ new Size(Thickness, verticalThumbLength));
+ }
+ }
+
+ public void Draw(Graphics g)
+ {
+ if (IsVisible)
+ {
+ using (Brush trackBrush = new SolidBrush(Color.FromArgb(255, 60, 60, 60)))
+ using (Brush thumbBrush = new SolidBrush(Color.FromArgb(255, 130, 130, 130)))
+ {
+ if (IsHorizontalScrollbarVisible)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.DrawCapsule(trackBrush, horizontalTrackRectangle);
+ g.DrawCapsule(thumbBrush, horizontalThumbRectangle);
+ g.SmoothingMode = SmoothingMode.None;
+ }
+
+ if (IsVerticalScrollbarVisible)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.DrawCapsule(trackBrush, verticalTrackRectangle);
+ g.DrawCapsule(thumbBrush, verticalThumbRectangle);
+ g.SmoothingMode = SmoothingMode.None;
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/ShareX.ScreenCaptureLib/ShareX.ScreenCaptureLib.csproj b/ShareX.ScreenCaptureLib/ShareX.ScreenCaptureLib.csproj
index 59dd4bb28..a233db806 100644
--- a/ShareX.ScreenCaptureLib/ShareX.ScreenCaptureLib.csproj
+++ b/ShareX.ScreenCaptureLib/ShareX.ScreenCaptureLib.csproj
@@ -93,6 +93,7 @@
ImageSizeForm.cs
+