diff --git a/ShareX.HelpersLib/Controls/BlackStyle/BlackStyleLabel.cs b/ShareX.HelpersLib/Controls/BlackStyle/BlackStyleLabel.cs index d794448db..f4b976b23 100644 --- a/ShareX.HelpersLib/Controls/BlackStyle/BlackStyleLabel.cs +++ b/ShareX.HelpersLib/Controls/BlackStyle/BlackStyleLabel.cs @@ -112,6 +112,23 @@ public bool DrawBorder } } + private Color borderColor = Color.Black; + + [DefaultValue(typeof(Color), "Black")] + public Color BorderColor + { + get + { + return borderColor; + } + set + { + borderColor = value; + + Invalidate(); + } + } + private bool autoEllipsis; [DefaultValue(false)] @@ -150,7 +167,10 @@ protected override void OnPaint(PaintEventArgs pe) if (drawBorder) { - g.DrawRectangleProper(Pens.Black, ClientRectangle); + using (Pen pen = new Pen(BorderColor, 1)) + { + g.DrawRectangleProper(pen, ClientRectangle); + } } } } diff --git a/ShareX/Controls/TaskThumbnailPanel.Designer.cs b/ShareX/Controls/TaskThumbnailPanel.Designer.cs index 6b8e29b94..ec133cca3 100644 --- a/ShareX/Controls/TaskThumbnailPanel.Designer.cs +++ b/ShareX/Controls/TaskThumbnailPanel.Designer.cs @@ -36,7 +36,9 @@ private void InitializeComponent() this.ttMain = new System.Windows.Forms.ToolTip(this.components); this.lblTitle = new ShareX.HelpersLib.BlackStyleLabel(); this.pThumbnail = new ShareX.TaskRoundedCornerPanel(); + this.lblCombineVertical = new ShareX.HelpersLib.BlackStyleLabel(); this.lblError = new ShareX.HelpersLib.BlackStyleLabel(); + this.lblCombineHorizontal = new ShareX.HelpersLib.BlackStyleLabel(); this.pbProgress = new ShareX.HelpersLib.BlackStyleProgressBar(); this.pbThumbnail = new System.Windows.Forms.PictureBox(); this.pThumbnail.SuspendLayout(); @@ -63,8 +65,11 @@ private void InitializeComponent() // // pThumbnail // + this.pThumbnail.AllowDrop = true; this.pThumbnail.BackColor = System.Drawing.Color.Transparent; + this.pThumbnail.Controls.Add(this.lblCombineVertical); this.pThumbnail.Controls.Add(this.lblError); + this.pThumbnail.Controls.Add(this.lblCombineHorizontal); this.pThumbnail.Controls.Add(this.pbProgress); this.pThumbnail.Controls.Add(this.pbThumbnail); resources.ApplyResources(this.pThumbnail, "pThumbnail"); @@ -73,6 +78,19 @@ private void InitializeComponent() this.pThumbnail.Radius = 5F; this.pThumbnail.Selected = false; this.pThumbnail.StatusLocation = ShareX.ThumbnailTitleLocation.Top; + this.pThumbnail.DragDrop += new System.Windows.Forms.DragEventHandler(this.pThumbnail_DragDrop); + this.pThumbnail.DragEnter += new System.Windows.Forms.DragEventHandler(this.pThumbnail_DragEnter); + this.pThumbnail.DragLeave += new System.EventHandler(this.pThumbnail_DragLeave); + // + // lblCombineVertical + // + this.lblCombineVertical.BackColor = System.Drawing.Color.Transparent; + this.lblCombineVertical.BorderColor = System.Drawing.Color.Empty; + this.lblCombineVertical.DrawBorder = true; + resources.ApplyResources(this.lblCombineVertical, "lblCombineVertical"); + this.lblCombineVertical.ForeColor = System.Drawing.Color.White; + this.lblCombineVertical.Name = "lblCombineVertical"; + this.lblCombineVertical.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // lblError // @@ -84,6 +102,16 @@ private void InitializeComponent() this.lblError.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.lblError.MouseClick += new System.Windows.Forms.MouseEventHandler(this.lblError_MouseClick); // + // lblCombineHorizontal + // + this.lblCombineHorizontal.BackColor = System.Drawing.Color.Transparent; + this.lblCombineHorizontal.BorderColor = System.Drawing.Color.Empty; + this.lblCombineHorizontal.DrawBorder = true; + resources.ApplyResources(this.lblCombineHorizontal, "lblCombineHorizontal"); + this.lblCombineHorizontal.ForeColor = System.Drawing.Color.White; + this.lblCombineHorizontal.Name = "lblCombineHorizontal"; + this.lblCombineHorizontal.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // // pbProgress // resources.ApplyResources(this.pbProgress, "pbProgress"); @@ -125,5 +153,7 @@ private void InitializeComponent() private System.Windows.Forms.PictureBox pbThumbnail; private System.Windows.Forms.ToolTip ttMain; private HelpersLib.BlackStyleLabel lblError; + private HelpersLib.BlackStyleLabel lblCombineHorizontal; + private HelpersLib.BlackStyleLabel lblCombineVertical; } } diff --git a/ShareX/Controls/TaskThumbnailPanel.cs b/ShareX/Controls/TaskThumbnailPanel.cs index e85cf3416..78c62d1df 100644 --- a/ShareX/Controls/TaskThumbnailPanel.cs +++ b/ShareX/Controls/TaskThumbnailPanel.cs @@ -257,6 +257,8 @@ public void UpdateTheme() pThumbnail.PanelColor = ShareXResources.Theme.DarkBackgroundColor; ttMain.BackColor = ShareXResources.Theme.BackgroundColor; ttMain.ForeColor = ShareXResources.Theme.TextColor; + lblCombineHorizontal.BorderColor = ShareXResources.Theme.BorderColor; + lblCombineVertical.BorderColor = ShareXResources.Theme.BorderColor; } else { @@ -265,6 +267,8 @@ public void UpdateTheme() pThumbnail.PanelColor = SystemColors.ControlLight; ttMain.BackColor = SystemColors.Window; ttMain.ForeColor = SystemColors.ControlText; + lblCombineHorizontal.BorderColor = Color.Black; + lblCombineVertical.BorderColor = Color.Black; } } @@ -316,6 +320,11 @@ private void UpdateLayout() lblTitle.Location = new Point(0, pThumbnail.Height + 2); lblError.Location = new Point((ClientSize.Width - lblError.Width) / 2, pThumbnail.Height - lblError.Height - 1); } + + lblCombineHorizontal.Location = new Point(pbThumbnail.Left, pbThumbnail.Top); + lblCombineHorizontal.Size = new Size(pbThumbnail.Width, pbThumbnail.Height / 2); + lblCombineVertical.Location = new Point(pbThumbnail.Left, pbThumbnail.Top + pbThumbnail.Height / 2 - 1); + lblCombineVertical.Size = new Size(pbThumbnail.Width, pbThumbnail.Height / 2 + 1); } public void UpdateThumbnail(Bitmap bmp = null) @@ -560,11 +569,20 @@ private void PbThumbnail_MouseMove(object sender, MouseEventArgs e) { if (Task.Info != null && !string.IsNullOrEmpty(Task.Info.FilePath) && File.Exists(Task.Info.FilePath)) { + pThumbnail.AllowDrop = false; Program.MainForm.AllowDrop = false; - IDataObject dataObject = new DataObject(DataFormats.FileDrop, new string[] { Task.Info.FilePath }); - dragBoxFromMouseDown = Rectangle.Empty; - pbThumbnail.DoDragDrop(dataObject, DragDropEffects.Copy | DragDropEffects.Move); - Program.MainForm.AllowDrop = true; + + try + { + IDataObject dataObject = new DataObject(DataFormats.FileDrop, new string[] { Task.Info.FilePath }); + dragBoxFromMouseDown = Rectangle.Empty; + pbThumbnail.DoDragDrop(dataObject, DragDropEffects.Copy | DragDropEffects.Move); + } + finally + { + pThumbnail.AllowDrop = true; + Program.MainForm.AllowDrop = true; + } } else { @@ -573,6 +591,55 @@ private void PbThumbnail_MouseMove(object sender, MouseEventArgs e) } } + private void pThumbnail_DragEnter(object sender, DragEventArgs e) + { + string filePath = Task.Info.FilePath; + + if (FileHelpers.IsImageFile(filePath) && e.Data.GetDataPresent(DataFormats.FileDrop, false) && + e.Data.GetData(DataFormats.FileDrop, false) is string[] files && files.Length > 0 && FileHelpers.IsImageFile(files[0])) + { + lblCombineHorizontal.Visible = true; + lblCombineVertical.Visible = true; + + e.Effect = DragDropEffects.Copy; + } + else + { + e.Effect = DragDropEffects.None; + } + } + + private void pThumbnail_DragLeave(object sender, EventArgs e) + { + lblCombineHorizontal.Visible = false; + lblCombineVertical.Visible = false; + } + + private void pThumbnail_DragDrop(object sender, DragEventArgs e) + { + Orientation combineOrientation = Orientation.Horizontal; + + Point vertical = lblCombineVertical.PointToScreen(lblCombineVertical.ClientRectangle.Location); + + if (e.Y >= vertical.Y) + { + combineOrientation = Orientation.Vertical; + } + + string filePath = Task.Info.FilePath; + + if (FileHelpers.IsImageFile(filePath) && e.Data.GetDataPresent(DataFormats.FileDrop, false) && + e.Data.GetData(DataFormats.FileDrop, false) is string[] files && files.Length > 0 && FileHelpers.IsImageFile(files[0])) + { + string filePathDrop = files[0]; + + TaskHelpers.CombineImages(new string[] { filePathDrop, filePath }, combineOrientation); + } + + lblCombineHorizontal.Visible = false; + lblCombineVertical.Visible = false; + } + private void TtMain_Draw(object sender, DrawToolTipEventArgs e) { e.DrawBackground(); diff --git a/ShareX/Controls/TaskThumbnailPanel.resx b/ShareX/Controls/TaskThumbnailPanel.resx index 258adaab8..ff41cd986 100644 --- a/ShareX/Controls/TaskThumbnailPanel.resx +++ b/ShareX/Controls/TaskThumbnailPanel.resx @@ -138,7 +138,7 @@ lblTitle - ShareX.HelpersLib.BlackStyleLabel, ShareX.HelpersLib, Version=13.6.2.0, Culture=neutral, PublicKeyToken=null + ShareX.HelpersLib.BlackStyleLabel, ShareX.HelpersLib, Version=14.1.3.0, Culture=neutral, PublicKeyToken=null $this @@ -146,6 +146,37 @@ 1 + + Segoe UI, 14.25pt + + + 40, 128 + + + 184, 80 + + + 6 + + + Combine images +(Vertical) + + + False + + + lblCombineVertical + + + ShareX.HelpersLib.BlackStyleLabel, ShareX.HelpersLib, Version=14.1.3.0, Culture=neutral, PublicKeyToken=null + + + pThumbnail + + + 0 + Top @@ -172,13 +203,44 @@ lblError - ShareX.HelpersLib.BlackStyleLabel, ShareX.HelpersLib, Version=13.6.2.0, Culture=neutral, PublicKeyToken=null + ShareX.HelpersLib.BlackStyleLabel, ShareX.HelpersLib, Version=14.1.3.0, Culture=neutral, PublicKeyToken=null pThumbnail - 0 + 1 + + + Segoe UI, 14.25pt + + + 40, 40 + + + 184, 80 + + + 5 + + + Combine images +(Horizontal) + + + False + + + lblCombineHorizontal + + + ShareX.HelpersLib.BlackStyleLabel, ShareX.HelpersLib, Version=14.1.3.0, Culture=neutral, PublicKeyToken=null + + + pThumbnail + + + 2 Bottom, Left, Right @@ -205,17 +267,20 @@ pbProgress - ShareX.HelpersLib.BlackStyleProgressBar, ShareX.HelpersLib, Version=13.6.2.0, Culture=neutral, PublicKeyToken=null + ShareX.HelpersLib.BlackStyleProgressBar, ShareX.HelpersLib, Version=14.1.3.0, Culture=neutral, PublicKeyToken=null pThumbnail - 1 + 3 Fill + + NoControl + 4, 4 @@ -235,7 +300,7 @@ pThumbnail - 2 + 4 0, 24 @@ -253,7 +318,7 @@ pThumbnail - ShareX.TaskRoundedCornerPanel, ShareX, Version=13.6.2.0, Culture=neutral, PublicKeyToken=null + ShareX.TaskRoundedCornerPanel, ShareX, Version=14.1.3.0, Culture=neutral, PublicKeyToken=null $this