From 3a5582204937ab413f600de2f34125f18a303cba Mon Sep 17 00:00:00 2001 From: Christian Schulz Date: Mon, 28 Feb 2022 18:27:16 +0100 Subject: [PATCH] Add option menu for crop modes move auto crop to crop option refactor CropStyle from property to enum CropMode App menu images and translations --- .../Configuration/LanguageKeys.cs | 1 + src/Greenshot.Editor/Drawing/CropContainer.cs | 67 +++++++------ .../Drawing/Fields/FieldType.cs | 4 +- src/Greenshot.Editor/Drawing/Surface.cs | 6 +- .../Forms/ImageEditorForm.Designer.cs | 93 +++++++++++++----- src/Greenshot.Editor/Forms/ImageEditorForm.cs | 62 +++++++----- .../Forms/ImageEditorForm.resx | 9 ++ .../Resources/AutoCrop.Image.png | Bin 0 -> 3164 bytes .../Resources/CropHorizontal.Image.png | Bin 0 -> 2786 bytes .../Resources/CropVertical.Image.png | Bin 0 -> 3176 bytes src/Greenshot/Languages/language-de-DE.xml | 12 ++- src/Greenshot/Languages/language-en-US.xml | 6 ++ 12 files changed, 172 insertions(+), 88 deletions(-) create mode 100644 src/Greenshot.Editor/Resources/AutoCrop.Image.png create mode 100644 src/Greenshot.Editor/Resources/CropHorizontal.Image.png create mode 100644 src/Greenshot.Editor/Resources/CropVertical.Image.png diff --git a/src/Greenshot.Editor/Configuration/LanguageKeys.cs b/src/Greenshot.Editor/Configuration/LanguageKeys.cs index f15b113d4..b1f410e66 100644 --- a/src/Greenshot.Editor/Configuration/LanguageKeys.cs +++ b/src/Greenshot.Editor/Configuration/LanguageKeys.cs @@ -33,6 +33,7 @@ namespace Greenshot.Editor.Configuration contextmenu_capturefullscreen_right, contextmenu_capturefullscreen_bottom, contextmenu_captureie, + editor_autocrop_not_possible, editor_clipboardfailed, editor_close_on_save, editor_close_on_save_title, diff --git a/src/Greenshot.Editor/Drawing/CropContainer.cs b/src/Greenshot.Editor/Drawing/CropContainer.cs index 2a4797760..23e0ccbed 100644 --- a/src/Greenshot.Editor/Drawing/CropContainer.cs +++ b/src/Greenshot.Editor/Drawing/CropContainer.cs @@ -35,10 +35,28 @@ namespace Greenshot.Editor.Drawing /// public class CropContainer : DrawableContainer { - //awailable Styles - public static readonly string DefaultCropStyle = nameof(DefaultCropStyle); - public static readonly string VerticalCropOutStyle = nameof(VerticalCropOutStyle); - public static readonly string HorizontalCropOutStyle = nameof(HorizontalCropOutStyle); + /// + /// awailable modes + /// + public enum CropMode + { + /// + /// crop all outside the selection rectangle + /// + Default, + /// + /// like default, but initially creates the selection rectangle + /// + AutoCrop, + /// + /// crop all inside the selection, anchors the selection to the top and bottom edges + /// + Vertical, + /// + /// crop all inside the selection, anchors the selection to the left and right edges + /// + Horizontal + } public CropContainer(ISurface parent) : base(parent) { @@ -53,14 +71,14 @@ namespace Greenshot.Editor.Drawing private void Init() { - switch (GetFieldValueAsString(FieldType.CROPSTYLE)) + switch (GetFieldValue(FieldType.CROPMODE)) { - case string s when s.Equals(HorizontalCropOutStyle): + case CropMode.Horizontal: { InitHorizontalCropOutStyle(); break; } - case string s when s.Equals(VerticalCropOutStyle): + case CropMode.Vertical: { InitVerticalCropOutStyle(); break; @@ -73,21 +91,6 @@ namespace Greenshot.Editor.Drawing } } - /// - /// rotate through all awailable Styles - /// - /// - /// - public static string GetNextStyle(string style) - { - return style switch - { - var s when s.Equals(HorizontalCropOutStyle) => VerticalCropOutStyle, - var s when s.Equals(VerticalCropOutStyle) => DefaultCropStyle, - _ => HorizontalCropOutStyle, - }; - } - private void InitCropStyle() { CreateDefaultAdorners(); @@ -130,7 +133,7 @@ namespace Greenshot.Editor.Drawing protected override void InitializeFields() { AddField(GetType(), FieldType.FLAGS, FieldFlag.CONFIRMABLE); - AddField(GetType(), FieldType.CROPSTYLE, DefaultCropStyle); + AddField(GetType(), FieldType.CROPMODE, CropMode.Default); } public override void Invalidate() @@ -170,10 +173,10 @@ namespace Greenshot.Editor.Drawing DrawSelectionBorder(g, selectionRect); - switch (GetFieldValueAsString(FieldType.CROPSTYLE)) + switch (GetFieldValue(FieldType.CROPMODE)) { - case var s when s.Equals(HorizontalCropOutStyle): - case var t when t.Equals(VerticalCropOutStyle): + case CropMode.Horizontal: + case CropMode.Vertical: { //draw inside g.FillRectangle(cropBrush, cropRectangle); @@ -204,12 +207,12 @@ namespace Greenshot.Editor.Drawing public override bool HandleMouseDown(int x, int y) { - return GetFieldValueAsString(FieldType.CROPSTYLE) switch + return GetFieldValue(FieldType.CROPMODE) switch { //force horizontal crop to left edge - var s when s.Equals(HorizontalCropOutStyle) => base.HandleMouseDown(0, y), + CropMode.Horizontal => base.HandleMouseDown(0, y), //force vertical crop to top edge - var s when s.Equals(VerticalCropOutStyle) => base.HandleMouseDown(x, 0), + CropMode.Vertical => base.HandleMouseDown(x, 0), _ => base.HandleMouseDown(x, y), }; } @@ -218,9 +221,9 @@ namespace Greenshot.Editor.Drawing { Invalidate(); - switch (GetFieldValueAsString(FieldType.CROPSTYLE)) + switch (GetFieldValue(FieldType.CROPMODE)) { - case var s when s.Equals(HorizontalCropOutStyle): + case CropMode.Horizontal: { //stick on left and right //allow only horizontal changes @@ -233,7 +236,7 @@ namespace Greenshot.Editor.Drawing } break; } - case var s when s.Equals(VerticalCropOutStyle): + case CropMode.Vertical: { //stick on top and bottom //allow only vertical changes diff --git a/src/Greenshot.Editor/Drawing/Fields/FieldType.cs b/src/Greenshot.Editor/Drawing/Fields/FieldType.cs index 610cbb7ca..eead7452a 100644 --- a/src/Greenshot.Editor/Drawing/Fields/FieldType.cs +++ b/src/Greenshot.Editor/Drawing/Fields/FieldType.cs @@ -51,13 +51,13 @@ namespace Greenshot.Editor.Drawing.Fields public static readonly IFieldType PREPARED_FILTER_OBFUSCATE = new FieldType(nameof(PREPARED_FILTER_OBFUSCATE)); public static readonly IFieldType PREPARED_FILTER_HIGHLIGHT = new FieldType(nameof(PREPARED_FILTER_HIGHLIGHT)); public static readonly IFieldType FLAGS = new FieldType(nameof(FLAGS)); - public static readonly IFieldType CROPSTYLE = new FieldType(nameof(CROPSTYLE)); + public static readonly IFieldType CROPMODE = new FieldType(nameof(CROPMODE)); public static IFieldType[] Values = { ARROWHEADS, BLUR_RADIUS, BRIGHTNESS, FILL_COLOR, FONT_BOLD, FONT_FAMILY, FONT_ITALIC, FONT_SIZE, TEXT_HORIZONTAL_ALIGNMENT, TEXT_VERTICAL_ALIGNMENT, HIGHLIGHT_COLOR, - LINE_COLOR, LINE_THICKNESS, MAGNIFICATION_FACTOR, PIXEL_SIZE, PREVIEW_QUALITY, SHADOW, PREPARED_FILTER_OBFUSCATE, PREPARED_FILTER_HIGHLIGHT, FLAGS, CROPSTYLE + LINE_COLOR, LINE_THICKNESS, MAGNIFICATION_FACTOR, PIXEL_SIZE, PREVIEW_QUALITY, SHADOW, PREPARED_FILTER_OBFUSCATE, PREPARED_FILTER_HIGHLIGHT, FLAGS, CROPMODE }; public string Name { get; set; } diff --git a/src/Greenshot.Editor/Drawing/Surface.cs b/src/Greenshot.Editor/Drawing/Surface.cs index 2979026ab..3dd7155fc 100644 --- a/src/Greenshot.Editor/Drawing/Surface.cs +++ b/src/Greenshot.Editor/Drawing/Surface.cs @@ -2069,14 +2069,14 @@ namespace Greenshot.Editor.Drawing { if (dc is CropContainer e) { - switch (e.GetFieldValueAsString(FieldType.CROPSTYLE)) + switch (e.GetFieldValue(FieldType.CROPMODE)) { - case var s when s.Equals(CropContainer.HorizontalCropOutStyle): + case CropContainer.CropMode.Horizontal: { ApplyHorizontalCrop(_cropContainer.Bounds); break; } - case var s when s.Equals(CropContainer.VerticalCropOutStyle): + case CropContainer.CropMode.Vertical: { ApplyVerticalCrop(_cropContainer.Bounds); break; diff --git a/src/Greenshot.Editor/Forms/ImageEditorForm.Designer.cs b/src/Greenshot.Editor/Forms/ImageEditorForm.Designer.cs index 82fecf559..34cca0f7b 100644 --- a/src/Greenshot.Editor/Forms/ImageEditorForm.Designer.cs +++ b/src/Greenshot.Editor/Forms/ImageEditorForm.Designer.cs @@ -98,8 +98,6 @@ namespace Greenshot.Editor.Forms { this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); this.preferencesToolStripMenuItem = new GreenshotToolStripMenuItem(); this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); - this.autoCropToolStripMenuItem = new GreenshotToolStripMenuItem(); - this.toolStripSeparator17 = new System.Windows.Forms.ToolStripSeparator(); this.insert_window_toolstripmenuitem = new GreenshotToolStripMenuItem(); this.objectToolStripMenuItem = new GreenshotToolStripMenuItem(); this.addRectangleToolStripMenuItem = new GreenshotToolStripMenuItem(); @@ -143,10 +141,15 @@ namespace Greenshot.Editor.Forms { this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); this.btnHelp = new GreenshotToolStripButton(); this.propertiesToolStrip = new ToolStripEx(); - this.obfuscateModeButton = new BindableToolStripDropDownButton(); - this.pixelizeToolStripMenuItem = new GreenshotToolStripMenuItem(); + this.obfuscateModeButton = new BindableToolStripDropDownButton(); + this.cropModeButton = new BindableToolStripDropDownButton(); + this.pixelizeToolStripMenuItem = new GreenshotToolStripMenuItem(); this.blurToolStripMenuItem = new GreenshotToolStripMenuItem(); - this.highlightModeButton = new BindableToolStripDropDownButton(); + this.defaultCropModeToolStripMenuItem = new GreenshotToolStripMenuItem(); + this.verticalCropModeToolStripMenuItem = new GreenshotToolStripMenuItem(); + this.horizontalCropModeToolStripMenuItem = new GreenshotToolStripMenuItem(); + this.autoCropModeToolStripMenuItem = new GreenshotToolStripMenuItem(); + this.highlightModeButton = new BindableToolStripDropDownButton(); this.textHighlightMenuItem = new GreenshotToolStripMenuItem(); this.areaHighlightMenuItem = new GreenshotToolStripMenuItem(); this.grayscaleHighlightMenuItem = new GreenshotToolStripMenuItem(); @@ -593,8 +596,6 @@ namespace Greenshot.Editor.Forms { this.toolStripSeparator12, this.preferencesToolStripMenuItem, this.toolStripSeparator5, - this.autoCropToolStripMenuItem, - this.toolStripSeparator17, this.insert_window_toolstripmenuitem}); this.editToolStripMenuItem.LanguageKey = "editor_edit"; this.editToolStripMenuItem.Name = "editToolStripMenuItem"; @@ -678,16 +679,6 @@ namespace Greenshot.Editor.Forms { // this.toolStripSeparator5.Name = "toolStripSeparator5"; // - // autoCropToolStripMenuItem - // - this.autoCropToolStripMenuItem.LanguageKey = "editor_autocrop"; - this.autoCropToolStripMenuItem.Name = "autoCropToolStripMenuItem"; - this.autoCropToolStripMenuItem.Click += new System.EventHandler(this.AutoCropToolStripMenuItemClick); - // - // toolStripSeparator17 - // - this.toolStripSeparator17.Name = "toolStripSeparator17"; - // // insert_window_toolstripmenuitem // this.insert_window_toolstripmenuitem.LanguageKey = "editor_insertwindow"; @@ -1082,6 +1073,7 @@ namespace Greenshot.Editor.Forms { this.toolStripSeparator10, this.btnConfirm, this.btnCancel, + this.cropModeButton, this.counterLabel, this.counterUpDown}); // @@ -1111,10 +1103,60 @@ namespace Greenshot.Editor.Forms { this.blurToolStripMenuItem.LanguageKey = "editor_obfuscate_blur"; this.blurToolStripMenuItem.Name = "blurToolStripMenuItem"; this.blurToolStripMenuItem.Tag = FilterContainer.PreparedFilter.BLUR; - // - // highlightModeButton - // - this.highlightModeButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + + // + // cropModeButton + // + this.cropModeButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.cropModeButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.defaultCropModeToolStripMenuItem, + this.verticalCropModeToolStripMenuItem, + this.horizontalCropModeToolStripMenuItem, + this.autoCropModeToolStripMenuItem}); + this.cropModeButton.Image = ((System.Drawing.Image)(resources.GetObject("btnCrop.Image"))); + this.cropModeButton.ImageTransparentColor = System.Drawing.Color.Magenta; + //TODO translate + this.cropModeButton.LanguageKey = "editor_crop_mode"; + this.cropModeButton.Name = "cropModeButton"; + this.cropModeButton.SelectedTag = CropContainer.CropMode.Default; + this.cropModeButton.Tag = CropContainer.CropMode.Default; + + // + // defaultCropStyleToolStripMenuItem + // + this.defaultCropModeToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("btnCrop.Image"))); + this.defaultCropModeToolStripMenuItem.LanguageKey = "editor_cropmode_default"; + this.defaultCropModeToolStripMenuItem.Name = "defaultCropModeToolStripMenuItem"; + this.defaultCropModeToolStripMenuItem.Tag = CropContainer.CropMode.Default; + + // + // verticalCropStyleToolStripMenuItem + // + this.verticalCropModeToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("CropVertical.Image"))); + this.verticalCropModeToolStripMenuItem.LanguageKey = "editor_cropmode_vertical"; + this.verticalCropModeToolStripMenuItem.Name = "verticalCropModeToolStripMenuItem"; + this.verticalCropModeToolStripMenuItem.Tag = CropContainer.CropMode.Vertical; + + // + // horizontalCropStyleToolStripMenuItem + // + this.horizontalCropModeToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("CropHorizontal.Image"))); + this.horizontalCropModeToolStripMenuItem.LanguageKey = "editor_cropmode_horizontal"; + this.horizontalCropModeToolStripMenuItem.Name = "horizontalCropModeToolStripMenuItem"; + this.horizontalCropModeToolStripMenuItem.Tag = CropContainer.CropMode.Horizontal; + + // + // horizontalCropStyleToolStripMenuItem + // + this.autoCropModeToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("AutoCrop.Image"))); + this.autoCropModeToolStripMenuItem.LanguageKey = "editor_cropmode_auto"; + this.autoCropModeToolStripMenuItem.Name = "autoCropModeToolStripMenuItem"; + this.autoCropModeToolStripMenuItem.Tag = CropContainer.CropMode.AutoCrop; + + // + // highlightModeButton + // + this.highlightModeButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this.highlightModeButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.textHighlightMenuItem, this.areaHighlightMenuItem, @@ -1872,8 +1914,13 @@ namespace Greenshot.Editor.Forms { private BindableToolStripButton btnCancel; private BindableToolStripButton btnConfirm; private GreenshotToolStripMenuItem selectAllToolStripMenuItem; - private BindableToolStripDropDownButton highlightModeButton; - private GreenshotToolStripMenuItem pixelizeToolStripMenuItem; + private BindableToolStripDropDownButton highlightModeButton; + private BindableToolStripDropDownButton cropModeButton; + private GreenshotToolStripMenuItem defaultCropModeToolStripMenuItem; + private GreenshotToolStripMenuItem verticalCropModeToolStripMenuItem; + private GreenshotToolStripMenuItem horizontalCropModeToolStripMenuItem; + private GreenshotToolStripMenuItem autoCropModeToolStripMenuItem; + private GreenshotToolStripMenuItem pixelizeToolStripMenuItem; private GreenshotToolStripMenuItem blurToolStripMenuItem; private BindableToolStripDropDownButton obfuscateModeButton; private GreenshotToolStripButton btnHighlight; diff --git a/src/Greenshot.Editor/Forms/ImageEditorForm.cs b/src/Greenshot.Editor/Forms/ImageEditorForm.cs index 277f04252..ee37302ea 100644 --- a/src/Greenshot.Editor/Forms/ImageEditorForm.cs +++ b/src/Greenshot.Editor/Forms/ImageEditorForm.cs @@ -284,6 +284,7 @@ namespace Greenshot.Editor.Forms obfuscateModeButton.DropDownItemClicked += FilterPresetDropDownItemClicked; highlightModeButton.DropDownItemClicked += FilterPresetDropDownItemClicked; + cropModeButton.DropDownItemClicked += CropStyleDropDownItemClicked; _toolbarButtons = new[] { @@ -727,21 +728,12 @@ namespace Greenshot.Editor.Forms private void BtnCropClick(object sender, EventArgs e) { - if (_surface.DrawingMode == DrawingModes.Crop) - { - //intercept repeated click event - //rotate through crop styles - _surface.FieldAggregator.GetField(FieldType.CROPSTYLE).Value = CropContainer.GetNextStyle((string)_surface.FieldAggregator.GetField(FieldType.CROPSTYLE).Value); - _surface.RemoveCropContainer(); - - //reinitialize crop modus - _surface.DrawingMode = DrawingModes.Crop; - } - else + if (_surface.DrawingMode != DrawingModes.Crop) { _surface.DrawingMode = DrawingModes.Crop; + InitCropMode((CropContainer.CropMode)_surface.FieldAggregator.GetField(FieldType.CROPMODE).Value); + RefreshFieldControls(); } - RefreshFieldControls(); } private void BtnHighlightClick(object sender, EventArgs e) @@ -1305,6 +1297,7 @@ namespace Greenshot.Editor.Forms new BidirectionalBinding(previewQualityUpDown, "Value", _surface.FieldAggregator.GetField(FieldType.PREVIEW_QUALITY), "Value", DecimalDoublePercentageConverter.GetInstance(), NotNullValidator.GetInstance()); new BidirectionalBinding(obfuscateModeButton, "SelectedTag", _surface.FieldAggregator.GetField(FieldType.PREPARED_FILTER_OBFUSCATE), "Value"); + new BidirectionalBinding(cropModeButton, "SelectedTag", _surface.FieldAggregator.GetField(FieldType.CROPMODE), "Value"); new BidirectionalBinding(highlightModeButton, "SelectedTag", _surface.FieldAggregator.GetField(FieldType.PREPARED_FILTER_HIGHLIGHT), "Value"); new BidirectionalBinding(counterUpDown, "Value", _surface, "CounterStart", DecimalIntConverter.GetInstance(), NotNullValidator.GetInstance()); } @@ -1340,6 +1333,7 @@ namespace Greenshot.Editor.Forms && ((FieldFlag) props.GetFieldValue(FieldType.FLAGS) & FieldFlag.CONFIRMABLE) == FieldFlag.CONFIRMABLE; obfuscateModeButton.Visible = props.HasFieldValue(FieldType.PREPARED_FILTER_OBFUSCATE); + cropModeButton.Visible = props.HasFieldValue(FieldType.CROPMODE); highlightModeButton.Visible = props.HasFieldValue(FieldType.PREPARED_FILTER_HIGHLIGHT); } else @@ -1392,11 +1386,6 @@ namespace Greenshot.Editor.Forms ToolStripItemEndisabler.Enable(helpToolStripMenuItem); ToolStripItemEndisabler.Enable(aboutToolStripMenuItem); ToolStripItemEndisabler.Enable(preferencesToolStripMenuItem); - if (_surface.DrawingMode == DrawingModes.Crop) - { - //While cropping, enable the button to change crop style - btnCrop.Enabled = true; - } _controlsDisabledDueToConfirmable = true; } } @@ -1600,6 +1589,37 @@ namespace Greenshot.Editor.Forms Invalidate(true); } + protected void CropStyleDropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + InitCropMode((CropContainer.CropMode)e.ClickedItem.Tag); + + RefreshFieldControls(); + Invalidate(true); + } + + private void InitCropMode(CropContainer.CropMode mode) + { + _surface.DrawingMode = DrawingModes.None; + _surface.RemoveCropContainer(); + + if (mode == CropContainer.CropMode.AutoCrop) + { + if (!_surface.AutoCrop()) + { + //not AutoCrop possible automatic switch to default crop mode + _surface.DrawingMode = DrawingModes.Crop; + _surface.FieldAggregator.GetField(FieldType.CROPMODE).Value = CropContainer.CropMode.Default; + this.cropModeButton.SelectedTag = CropContainer.CropMode.Default; + this.statusLabel.Text = Language.GetString(LangKey.editor_autocrop_not_possible); + } + } + else + { + _surface.DrawingMode = DrawingModes.Crop; + } + + } + private void SelectAllToolStripMenuItemClick(object sender, EventArgs e) { _surface.SelectAllElements(); @@ -1661,14 +1681,6 @@ namespace Greenshot.Editor.Forms } } - private void AutoCropToolStripMenuItemClick(object sender, EventArgs e) - { - if (_surface.AutoCrop()) - { - RefreshFieldControls(); - } - } - private void AddBorderToolStripMenuItemClick(object sender, EventArgs e) { _surface.ApplyBitmapEffect(new BorderEffect()); diff --git a/src/Greenshot.Editor/Forms/ImageEditorForm.resx b/src/Greenshot.Editor/Forms/ImageEditorForm.resx index 57fe2f2c7..1c5b104fd 100644 --- a/src/Greenshot.Editor/Forms/ImageEditorForm.resx +++ b/src/Greenshot.Editor/Forms/ImageEditorForm.resx @@ -1107,4 +1107,13 @@ 782, 17 + + ..\Resources\AutoCrop.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\CropHorizontal.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\CropVertical.Image.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/src/Greenshot.Editor/Resources/AutoCrop.Image.png b/src/Greenshot.Editor/Resources/AutoCrop.Image.png new file mode 100644 index 0000000000000000000000000000000000000000..1f9d86c4d8711de86e90e08b6e20e3dbba7c8908 GIT binary patch literal 3164 zcmV-i45RajP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bvk}M|-{O1%t0*F<|VG$9&fsgM5M0L;R=jZU$ zbW`jiGbPbR{`zy8Kk!E(6cb`DiBq!p3mlj#UWz?`yuY0d`&%pazIbjvc<1f@E@zBiAM$mV6`z7}&L_M_@67JFC<2fV$9n*@?*M%O z`M#OY=s$0tz^AJ1{u7o-F~ZBY9WH(k{)YH%WB*u0A3I`w82$qCoTJPs=X5nBAevNB z)?9Sf91LuL-0x`#PsS(WJ@1F{6kBZv<->N{@N~zHz{)f(xZ$dsPIlQ{hlzoNGD@OO zezz5$iK+X=Q&^9ils)_53;63K#(Ol=V~gAS^4_nzf}MxMP;ywzZTf$B%s+Mh&SU26 z3nFLBgB9$eB~h5Mm|Nc%1w!0Z-r@%MK1#oR(+{Ky2IGdg;DFV(vqX#Tr7gdC_81pY z9v5;Z4_yEdVebfIoCgDNARpcGBBJaZa4aCG!gBI~8W?af(twc^yia5@!DX;F=47|W zQlvzy8Lk;=mPXCD&|*t1x6-)P4*B%ZV^2Nz z(z(|`!w-askwzY6@TlU9AW}$>C`qyuVW|^Zn|_8FXPSAI$+JGJDXU+e-(bxtYqXhK zH9Lt84dfVwm9mTrdI4;4#u)5FQm z_~az)eazd0UzJWI9*er?39Yqs))#SNK=rue;#A8KrTcU>YZY$;u$);T@bv!8qG*5D zqBqO(yJfr8M8My6Gj26<+RPvCDCCq4#|$w88MCTn9!4sgTy6;mm26@4SqD8mF={!q@UhmXRt=* z>6D3EM?Gj0l}S2EmLj{a=~QtJKg3t-w2Ha&9xHMg=OLYJDv5y)t9e zI^0ug$!ATVnYwOVBp+N7k!eR-joAsu*CBf5tJ}Da*VQWohiyFWi7ZQmK+_WBRwxEX zxRIW0@Nyx(*sd=m-=+rS{?gy2_RIBk?GDMBhh!oF#)z(Rl_uXR9Cw08k`8XRJJ8 ze7N$Poo^2Cgc0{ReNWI~$;~NXZE+co2^O0?fiW{^$*kI0q07`BrqY}%KQS(h+nDlw z8y9!@P@{AQ11R{mSqJRJkA!riytf5g_>9woS4tPoFl+OpY>Q2uF#zg*dT|S#nmpRX z1qwl0vW6J02(W%ox-0t20L|gdIm)`c?$aXIGT{(6TqDGfWKYmos$%!@lnPH)S&eFt zi^7c~pUX!-3r%Ds>FPpoVK}2dkfnl9;f?NqFbw8%ZBacTWOq@ftJ6Ln#g=(Zam%=o zHH=8?$l$oKTw9plTn0zD^BBCR?@nOO5iUe-1+SM3hg%C-U8PdCPryud!5PlHMBX%Y z7AZxDG?}mX)4w7%bvs_Vm9_FEdhAOCR^cF)ZpvsKp~gO={M8M;yWtGig4Abq-W1IT z1KEZAut$_5bgZB&ub(}msjnh^3G}4lEPDLvYU|Z3kB-ka?us!Y!L2|bH*T|+9@^tL z7dOWvNO_bK`n+bglR)VP)S2WAaHVT zW@&6?004NLeUUv#!$2IxUsFYqN{4n3=@6tkSr8R*lqwd%LTM|s>R@u|7c^-|Qd}Gb z*Mfr|i&X~~XI&j!1wrrw#L>w~(M3x9Us7lhs^dzd7t}p3@Qba0X~st?f%Ws@Z4huXpY-H2(#9?Bw)Wvcav$CNQPZLKKRik_%=d!|i zi?dp-v-Umt3j+mhCBt=^5hSpLBvKF|qmBxyun?nFBgI6T_TwJ@VaJ~$mrSk-7&#VD zg9^#K-LC&sz}00Rt3L_t(I%Y~C|Xj@enfS=nN(h<_c zvaC{MqtwPyY|zSdjW}G_;pWU@ozvQYkxs;kV{D@6^hfa<{9tYrSLcr?ncZ5~&2}B5 zr9sEgb|8(A+OT$=`)r$dTiQAka_>F&_`_yp;PCnL!uy`{obw*uqp--2+ig1(Dene| zdQ%U+T_y%J=U(AtPja8+>ThY`nfpYF7=UbTco)o>Ln2V1GF-CyQ(xXXaebAM$Szno^nrd@pcw9gK-02Ek~0-@^&A&^3F zZSpsMPZd(?zK8iK4I`5wnMjfxyUM+rb}@AHJt~Xm{^*VHFo5lyY+sH1KvE}HreCSK zR5E9z@ZXsre7GKf?7}s!B!;;%(#h#BcT@X76;%CQgvy7#5suz`jP54&(86G=9E^lz zb+B75raJ){4u|D3k6&Jm?UVCAACSjGwnM!U+5igj0uxlrG%3HUid@bBps=v;nNTQ1 zG#aJ4%s`*l5T=P;ks{E{j#~u6LbZfoM$?#^j^lE zJ;!K!JwQX9g{Jl6@pz~|_z0=%*C}$jXkI;1yl+E-ldXGa@+|~UjLI7S`X@Nu{XL)T z4D#5TN-~)Y4u^wGCWGDXWVy$KB?LL$z|eIT42o<(5IEr57+Q9&r`>q2Qn@%e)HVCv z(5*9XFMZyhPNi@SFv)*1tIYQ{6 zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bxmMkX@{AU%j1SDQ!IXusq9eDW@fXJ?@d)sc0 zU3oGgfs}+o3Q=bK@!x6wgCBGB#)l*^$7u2M*=H{3h&{i&pJe@h>WjUdw{i1KFoqmj zcV1J`^#$YM>w~L<>if76oncWySF#FpOEaU>UyZ~#pKwr)2QV&q%n1>^0_fyUqw{CW2w*|Lg9l3-)IW~LZS^|f>ZSQfQeRa^A zlW)&_djIKtIG>A-yANMR^$|M1ouKf0=WiFkD0YuU{610Ck#F14d(JL%j4 zqO7^zS>Iq`h0ERkEaFPI1Nv!S8JE~%8zAqt*@~-CCI%|gkf%D$1jBZ-V1vchBccZSiY>Qsc32nC zo)jXJx(a}cpgX`AazFqH(K5xCuZ67m-f_gbKj&J|KRQ7sOBrF8B~a3@L~SIh5$4k0HjG;v%_{T=FTTm{O9I zQxPX#f<#FolBHzM4jdSA%qdIGxfC`9iV9>EtS=a;TwV1w)L2uMnrmqYpXOU=v85(0 zx6--04w~q(r!GDBGRO=t#qcAHIMR@jN12GV>877y#+jzfJj;WcqWa7AH&7!*jW<$j zU3yT%s7dLHphYKPVFtw56A(`e0R%KJ%&d_2ypUU%+000az%Vi_Y)q$x7$Ee6I81u5 z`$FzVxS1e7!j1n5IkTYqH;^-c?pNG?gIZs8u5H9l7A~J!hwQ`rkYZTMDr)7Qwnxwm zd5v%#O(y#;=WSAiWyrYw?wxk9-Zou7EKIg|F}SVWqyMaZ6Xbe4#?A`*%x(y&X&~59 zT2_mEk`f4}hCzA2tCYQ21F1KVc3V?EtaAR|0?YH+bT)MYQSY}5^v0GfARIIIYA<$f zhz7!R+h(C;(c4nVxX%Z}L1_5!jLYir zj^lwCwXU`3)i^40ty??UA|3U!&)Z?j;jVh}A!@A(rS@jVX_}Bm+1r^H~?TRBS-R;>7>QYrU)+4+57*$K_Cy|7G%U9g0 z>1)=s^*dsyz%8ev z(2_34nWw0;*^KL*r~z%OQ*U!r`>CB(p@UzCQ==O^iX>5|n$%jJKBm%6>~)_UvBsfI zGER4v@|un*S4}^Hons05NYAG8p!dwFs`LpMW+=*9IopNkSNh9EjTR65hz6nxc8uit zikaG#Mm)9l^IiOQ6GnIOj92@*o0hWfZpCfO-zAmhf0W^?4UJjF;2|a?k5|=yLTuK3<{aB^>EVIj zEc(KR{+5+yX?R54t+wVncwA^z85W{-4!N{rm< zWF+1?^}zw-ha8am&PKB&^r-|0_tVgHNux+=iALhEGZVpm-jaUMZ1yQt?hq+F2q^PlEX>4Tx0C=2zkv&MmKpe$iQ$>+VhjtL@5TrU;5EXHhDi*;)X)CnqU~=gf zG-*guTpR`0f`cE6RR0!X5l%$?&0I>U5saWpZjwRDg~1PK9P8i>4rtT zK|Hf*>74h8!>lYR#OK8023?T&k?XR{Z=6dG3p_JyWYhD+VPdh=#c~(3vY`@B6Gs(Q zqkJLfvch?bvs$gQ_C5Iv0|jj*!*!YwB(Q`eQV=1djtZ)<5TjKi#YCF+;~xHD$DbmX zOs)zTITlcZ3d!+<|H1EW&EnLgn-quxy)U-?F$(nU0jdyW16NwdUuy!h zpQJZBTJ#7AZUYzB9ZlW?E_Z;TCtWfmNAlAYibdf4jJ_!kgl>U>HMh6+K29HiEOoVf z0~{OzVsH|aP00006VoOIv00000008+zyMF)x010qN zS#tmY4#EHc4#EKyC`y0;000McNliru<^miL3q_ZDu~tG$Y)sQ?ku?31naqrf(wA;};c^dmap0bFu3&|=@6;=KGu9qR0a6GKKd1p9 zS4t2P28S-)C)4!^5rzwUF%NDX6~t{wTA(y&30g{&gr4A~dVh61P>~3)@81diN*Sw^ zMGAp<)2Xiwj`9D-jG>Uv zQ#FP{E{AIj`O#54V;Ik7@jY)*gM;VB`s2au{&XGoA1}hE(XRwSl`!;CN?_X-v6%DG zahyGgL;}Z&6N@=mk;vO`!{s>PYXg1*!L*>T~)peXm-M z!@#}HC{WEj^lQsp=*|cL+0l6+=y=iwV2$)1^OleR)IUA_t~B=SW-as3Up&FmHeRiI z$aTxi^$e~%yX=%yY7@3yH?zG?id@->E8nlqqCV*BYHRPxCuKooVJkKMMNKi3`Rmmh(V@Rb^ zxW-VwW(}?}G&DB;m(XQF+K}EN949(1grMv?vvx4G%by+_RuW$-d>!HoMIZ&ie2~O^ zgg2zO@MSm~ZEbD!T8^BsTkr1n?yf%JDG5@64nZjR_nBDg!mBF>nCk0cd;5!({up{5 oCZP+JMXUl1z~`D2ta-v9sr07*qoM6N<$f(zO)tN;K2 literal 0 HcmV?d00001 diff --git a/src/Greenshot.Editor/Resources/CropVertical.Image.png b/src/Greenshot.Editor/Resources/CropVertical.Image.png new file mode 100644 index 0000000000000000000000000000000000000000..fe1dea06e4bc9c0700b7e8cf4e34d8fc41f176b2 GIT binary patch literal 3176 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 O0000 Endpunkt Keine Anfangspunkt - Automatisch zuschneiden - Hintergrundfarbe (0-9) + Automatisch zuschneiden + Automatisches Zuschneiden nicht möglich + Hintergrundfarbe (0-9) Weichzeichner-Radius Fett Rand @@ -91,7 +92,12 @@ schnell zu finden. Vielen Dank :) Grafik in die Zwischenablage kopieren Pfad in Zwischenablage kopieren Kopieren - Zuschneiden (C) + Zuschneiden (C) + Zuschneiden - Modus + Zuschneiden + Vertikal ausschneiden + Horizontal ausschneiden + Automatisch zuschneiden Auswahlwerkzeug (Esc) Ausschneiden Gewähltes Element löschen diff --git a/src/Greenshot/Languages/language-en-US.xml b/src/Greenshot/Languages/language-en-US.xml index b575f549b..c51854d5f 100644 --- a/src/Greenshot/Languages/language-en-US.xml +++ b/src/Greenshot/Languages/language-en-US.xml @@ -78,6 +78,7 @@ Also, we would highly appreciate if you checked whether a tracker item already e None Start point Auto crop + Auto crop not possible Fill color (0-9) Blur radius Bold @@ -93,6 +94,11 @@ Also, we would highly appreciate if you checked whether a tracker item already e Copy path to clipboard Copy Crop (C) + Crop mode + Crop + Crop out vertically + Crop out horizontally + Auto crop Selection Tool (ESC) Cut Delete