mirror of
https://github.com/ShareX/ShareX.git
synced 2024-10-01 17:56:51 +13:00
Merge pull request #4058 from Danielku15/feature/select-tool
Added select tool to image editor
This commit is contained in:
commit
7b107fcd31
12 changed files with 157 additions and 14 deletions
11
ShareX.HelpersLib/Properties/Resources.Designer.cs
generated
11
ShareX.HelpersLib/Properties/Resources.Designer.cs
generated
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -267,6 +267,7 @@ public enum ShapeType // Localized
|
|||
RegionRectangle,
|
||||
RegionEllipse,
|
||||
RegionFreehand,
|
||||
ToolSelect,
|
||||
DrawingRectangle,
|
||||
DrawingEllipse,
|
||||
DrawingFreehand,
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue