Merge pull request #4058 from Danielku15/feature/select-tool

Added select tool to image editor
This commit is contained in:
Jaex 2019-04-14 09:40:10 +03:00 committed by GitHub
commit 7b107fcd31
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 157 additions and 14 deletions

View file

@ -19,7 +19,7 @@ namespace ShareX.HelpersLib.Properties {
// 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", "15.0.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
@ -3140,6 +3140,15 @@ internal static string ShapeType_ToolCrop {
}
}
/// <summary>
/// Looks up a localized string similar to Select and Move (M).
/// </summary>
internal static string ShapeType_ToolSelect {
get {
return ResourceManager.GetString("ShapeType_ToolSelect", resourceCulture);
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>

View file

@ -868,6 +868,9 @@ Möchtest du sie herunterladen?</value>
<data name="ShapeType_DrawingLine" xml:space="preserve">
<value>Linie zeichnen</value>
</data>
<data name="ShapeType_ToolSelect" xml:space="preserve">
<value>Auswählen und Verschieben</value>
</data>
<data name="ShapeType_DrawingRectangle" xml:space="preserve">
<value>Rechteck zeichnen</value>
</data>

View file

@ -1073,6 +1073,9 @@ Would you like to download and install it?</value>
<data name="PastebinExpiration_W1" xml:space="preserve">
<value>1 Week</value>
</data>
<data name="ShapeType_ToolSelect" xml:space="preserve">
<value>Select and Move (M)</value>
</data>
<data name="ShapeType_DrawingRectangle" xml:space="preserve">
<value>Drawing: Rectangle (R)</value>
</data>

View file

@ -267,6 +267,7 @@ public enum ShapeType // Localized
RegionRectangle,
RegionEllipse,
RegionFreehand,
ToolSelect,
DrawingRectangle,
DrawingEllipse,
DrawingFreehand,

View file

@ -527,6 +527,11 @@ internal void RegionCaptureForm_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Escape)
{
if (ShapeManager.HandleEscape())
{
return;
}
if (!IsEditorMode || ShowExitConfirmation())
{
CloseWindow();

View file

@ -1227,6 +1227,24 @@ internal static string ShapeManager_CreateContextMenu_Square_shape_magnifier {
}
}
/// <summary>
/// Looks up a localized string similar to Switch to drawing tool after shape selection.
/// </summary>
internal static string ShapeManager_CreateContextMenu_SwitchToDrawingToolAfterSelection {
get {
return ResourceManager.GetString("ShapeManager_CreateContextMenu_SwitchToDrawingToolAfterSelection", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Switch to selection tool after shape drawing.
/// </summary>
internal static string ShapeManager_CreateContextMenu_SwitchToSelectionToolAfterDrawing {
get {
return ResourceManager.GetString("ShapeManager_CreateContextMenu_SwitchToSelectionToolAfterDrawing", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Width:.
/// </summary>

View file

@ -333,6 +333,12 @@ Distance: {6:0.00} px / Angle: {7:0.00}°</value>
<data name="ShapeManager_CreateContextMenu_Show_FPS" xml:space="preserve">
<value>Show FPS</value>
</data>
<data name="ShapeManager_CreateContextMenu_SwitchToDrawingToolAfterSelection" xml:space="preserve">
<value>Switch to drawing tool after shape selection</value>
</data>
<data name="ShapeManager_CreateContextMenu_SwitchToSelectionToolAfterDrawing" xml:space="preserve">
<value>Switch to selection tool after shape drawing</value>
</data>
<data name="FFmpegOptionsForm_UpdateUI_Quality_" xml:space="preserve">
<value>Quality:</value>
</data>

View file

@ -73,11 +73,14 @@ public class RegionCaptureOptions
public bool MenuCollapsed = false;
public Point MenuPosition = Point.Empty;
public bool SwitchToDrawingToolAfterSelection = true;
public bool SwitchToSelectionToolAfterDrawing = false;
// Annotation
public AnnotationOptions AnnotationOptions = new AnnotationOptions();
public ShapeType LastRegionTool = ShapeType.RegionRectangle;
public ShapeType LastAnnotationTool = ShapeType.DrawingRectangle;
public ShapeType LastEditorTool = ShapeType.DrawingRectangle;
public ShapeType LastRegionTool = ShapeType.ToolSelect;
public ShapeType LastAnnotationTool = ShapeType.ToolSelect;
public ShapeType LastEditorTool = ShapeType.ToolSelect;
// Image editor
public ImageEditorStartMode ImageEditorStartMode = ImageEditorStartMode.AutoSize;

View file

@ -140,7 +140,7 @@ public virtual void ShowNodes()
Manager.NodesVisible = true;
}
public void Remove()
public virtual void Remove()
{
Manager.DeleteShape(this);
}
@ -486,5 +486,10 @@ public virtual void OnNodePositionUpdate()
public virtual void Dispose()
{
}
public virtual bool CanBeSelectedByTool(ShapeType currentTool)
{
return ShapeType == currentTool || currentTool == ShapeType.ToolSelect;
}
}
}

View file

@ -68,8 +68,11 @@ public ShapeType CurrentTool
{
return currentTool;
}
private set
set
{
if (currentTool == value) return;
var previousTool = currentTool;
currentTool = value;
if (Form.IsAnnotationMode)
@ -90,7 +93,10 @@ private set
ClearTools();
}
DeselectCurrentShape();
if (previousTool != ShapeType.ToolSelect && currentTool != ShapeType.ToolSelect)
{
DeselectCurrentShape();
}
OnCurrentShapeTypeChanged(currentTool);
}
@ -399,6 +405,36 @@ private void form_MouseWheel(object sender, MouseEventArgs e)
}
}
public bool HandleEscape()
{
// the escape key handling has 3 stages:
// 1. initiate exit if region selection is active
// 2. if a shape is selected, unselect it
// 3. switch to the select tool if a any other tool is active
switch (CurrentTool)
{
case ShapeType.RegionRectangle:
case ShapeType.RegionEllipse:
case ShapeType.RegionFreehand:
return false;
}
if (CurrentShape != null)
{
ClearTools();
DeselectCurrentShape();
}
if (CurrentTool != ShapeType.ToolSelect)
{
CurrentTool = ShapeType.ToolSelect;
return true;
}
return false;
}
private void form_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
@ -547,6 +583,9 @@ private void form_KeyDown(object sender, KeyEventArgs e)
Options.QuickCrop = !Options.QuickCrop;
tsmiQuickCrop.Checked = !Options.QuickCrop;
break;
case Keys.M:
CurrentTool = ShapeType.ToolSelect;
break;
}
}
@ -770,7 +809,7 @@ private void StartRegionSelection()
BaseShape shape = GetIntersectShape();
if (shape != null && shape.ShapeType == CurrentTool) // Select shape
if (shape != null && shape.CanBeSelectedByTool(CurrentTool)) // Select shape
{
IsMoving = true;
shape.OnMoving();
@ -778,7 +817,12 @@ private void StartRegionSelection()
CurrentShape = shape;
SelectCurrentShape();
}
else if (!IsCreating) // Create new shape
else if (shape == null && CurrentTool == ShapeType.ToolSelect)
{
ClearTools();
DeselectCurrentShape();
}
else if (!IsCreating && CurrentTool != ShapeType.ToolSelect) // Create new shape
{
ClearTools();
DeselectCurrentShape();
@ -832,13 +876,19 @@ private void EndRegionSelection()
shape.OnCreated();
OnShapeCreated(shape);
SelectCurrentShape();
if (Options.SwitchToSelectionToolAfterDrawing && (shape.ShapeCategory == ShapeCategory.Drawing || shape.ShapeCategory == ShapeCategory.Effect))
{
CurrentTool = ShapeType.ToolSelect;
}
}
else if (wasMoving)
{
shape.OnMoved();
SelectCurrentShape();
}
SelectCurrentShape();
}
}
}
@ -1209,6 +1259,10 @@ private void SelectShape(BaseShape shape)
if (shape != null)
{
shape.ShowNodes();
if (Options.SwitchToDrawingToolAfterSelection)
{
CurrentTool = shape.ShapeType;
}
}
}
@ -1311,7 +1365,7 @@ public BaseShape GetIntersectShape(Point position)
{
BaseShape shape = Shapes[i];
if (shape.ShapeType == CurrentTool && shape.Intersects(position))
if (shape.CanBeSelectedByTool(CurrentTool) && shape.Intersects(position))
{
return shape;
}
@ -1911,4 +1965,4 @@ public void Dispose()
DeleteAllShapes();
}
}
}
}

View file

@ -208,7 +208,7 @@ internal void CreateToolbar()
continue;
}
}
else if (shapeType == ShapeType.DrawingRectangle)
else if (shapeType == ShapeType.ToolSelect)
{
tsMain.Items.Add(new ToolStripSeparator());
}
@ -291,6 +291,9 @@ internal void CreateToolbar()
case ShapeType.ToolCrop:
img = Resources.image_crop;
break;
case ShapeType.ToolSelect:
img = Resources.cursor;
break;
}
tsbShapeType.Image = img;
@ -952,6 +955,24 @@ internal void CreateToolbar()
};
tsddbOptions.DropDownItems.Add(tsmiShowFPS);
ToolStripMenuItem tsmiSwitchToDrawingToolAfterSelection = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_SwitchToDrawingToolAfterSelection);
tsmiSwitchToDrawingToolAfterSelection.Checked = Options.SwitchToDrawingToolAfterSelection;
tsmiSwitchToDrawingToolAfterSelection.CheckOnClick = true;
tsmiSwitchToDrawingToolAfterSelection.Click += (sender, e) =>
{
Options.SwitchToDrawingToolAfterSelection = tsmiSwitchToDrawingToolAfterSelection.Checked;
};
tsddbOptions.DropDownItems.Add(tsmiSwitchToDrawingToolAfterSelection);
ToolStripMenuItem tsmiSwitchToSelectionToolAfterDrawing = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_SwitchToSelectionToolAfterDrawing);
tsmiSwitchToSelectionToolAfterDrawing.Checked = Options.SwitchToSelectionToolAfterDrawing;
tsmiSwitchToSelectionToolAfterDrawing.CheckOnClick = true;
tsmiSwitchToSelectionToolAfterDrawing.Click += (sender, e) =>
{
Options.SwitchToSelectionToolAfterDrawing = tsmiSwitchToSelectionToolAfterDrawing.Checked;
};
tsddbOptions.DropDownItems.Add(tsmiSwitchToSelectionToolAfterDrawing);
if (!Form.IsEditorMode)
{
ToolStripMenuItem tsmiRememberMenuState = new ToolStripMenuItem(Resources.ShapeManager_CreateContextMenu_RememberMenuState);
@ -1239,6 +1260,12 @@ private void UpdateMenu()
}
}
// use menu of current shape in case of an active select tool.
if (CurrentShape != null && shapeType == ShapeType.ToolSelect)
{
shapeType = CurrentShape.ShapeType;
}
Color borderColor;
if (shapeType == ShapeType.DrawingTextBackground || shapeType == ShapeType.DrawingSpeechBalloon)

View file

@ -111,6 +111,15 @@ private void CancelButton_MousePressed(object sender, MouseEventArgs e)
Remove();
}
public override void Remove()
{
base.Remove();
if (Options.SwitchToSelectionToolAfterDrawing)
{
Manager.CurrentTool = ShapeType.ToolSelect;
}
}
public override void Dispose()
{
base.Dispose();