diff --git a/ShareX.HelpersLib/Colors/GradientInfo.cs b/ShareX.HelpersLib/Colors/GradientInfo.cs index e3ef4f74c..0def21831 100644 --- a/ShareX.HelpersLib/Colors/GradientInfo.cs +++ b/ShareX.HelpersLib/Colors/GradientInfo.cs @@ -46,6 +46,11 @@ public GradientInfo() Colors = new List(); } + public void Sort() + { + Colors.Sort((x, y) => x.Location.CompareTo(y.Location)); + } + public void Draw(Graphics g, Rectangle rect) { if (IsValid) diff --git a/ShareX.HelpersLib/Forms/GradientPickerForm.cs b/ShareX.HelpersLib/Forms/GradientPickerForm.cs index 41b471624..078538c8d 100644 --- a/ShareX.HelpersLib/Forms/GradientPickerForm.cs +++ b/ShareX.HelpersLib/Forms/GradientPickerForm.cs @@ -45,10 +45,20 @@ public GradientPickerForm(GradientInfo gradient) cbGradientType.Items.AddRange(Helpers.GetEnumNamesProper()); cbGradientType.SelectedIndex = (int)Gradient.Type; + UpdateGradientList(); + } + + private void UpdateGradientList() + { + Gradient.Sort(); + + isReady = false; + lvGradientPoints.Items.Clear(); foreach (GradientStop gradientStop in Gradient.Colors) { AddGradientStop(gradientStop); } + isReady = true; UpdatePreview(); } @@ -73,12 +83,6 @@ private void UpdatePreview() } } - private void cbGradientType_SelectedIndexChanged(object sender, EventArgs e) - { - Gradient.Type = (LinearGradientMode)cbGradientType.SelectedIndex; - UpdatePreview(); - } - private void AddGradientStop(GradientStop gradientStop) { ListViewItem lvi = new ListViewItem(); @@ -89,34 +93,80 @@ private void AddGradientStop(GradientStop gradientStop) lvGradientPoints.Items.Add(lvi); } + private GradientStop GetSelectedGradientStop() + { + return GetSelectedGradientStop(out _); + } + + private GradientStop GetSelectedGradientStop(out ListViewItem lvi) + { + if (lvGradientPoints.SelectedItems.Count > 0) + { + lvi = lvGradientPoints.SelectedItems[0]; + return lvi.Tag as GradientStop; + } + + lvi = null; + return null; + } + + private ListViewItem FindListViewItem(GradientStop gradientStop) + { + foreach (ListViewItem lvi in lvGradientPoints.Items) + { + GradientStop itemGradientstop = lvi.Tag as GradientStop; + if (itemGradientstop == gradientStop) + { + return lvi; + } + } + + return null; + } + + private ListViewItem SelectGradientStop(GradientStop gradientStop) + { + ListViewItem lvi = FindListViewItem(gradientStop); + if (lvi != null) + { + lvi.Selected = true; + } + return lvi; + } + + private void cbGradientType_SelectedIndexChanged(object sender, EventArgs e) + { + Gradient.Type = (LinearGradientMode)cbGradientType.SelectedIndex; + UpdatePreview(); + } + private void btnAdd_Click(object sender, EventArgs e) { Color color = cbtnCurrentColor.Color; float offset = (float)nudLocation.Value; GradientStop gradientStop = new GradientStop(color, offset); Gradient.Colors.Add(gradientStop); - AddGradientStop(gradientStop); - UpdatePreview(); + UpdateGradientList(); + SelectGradientStop(gradientStop); } private void btnRemove_Click(object sender, EventArgs e) { - if (lvGradientPoints.SelectedItems.Count > 0) + GradientStop gradientStop = GetSelectedGradientStop(); + + if (gradientStop != null) { - ListViewItem lvi = lvGradientPoints.SelectedItems[0]; - GradientStop gradientStop = (GradientStop)lvi.Tag; Gradient.Colors.Remove(gradientStop); - lvGradientPoints.Items.Remove(lvi); - UpdatePreview(); + UpdateGradientList(); } } private void cbtnCurrentColor_ColorChanged(Color color) { - if (lvGradientPoints.SelectedItems.Count > 0) + GradientStop gradientStop = GetSelectedGradientStop(out ListViewItem lvi); + + if (gradientStop != null) { - ListViewItem lvi = lvGradientPoints.SelectedItems[0]; - GradientStop gradientStop = (GradientStop)lvi.Tag; gradientStop.Color = color; lvi.BackColor = gradientStop.Color; lvi.ForeColor = ColorHelpers.VisibleColor(gradientStop.Color); @@ -126,24 +176,29 @@ private void cbtnCurrentColor_ColorChanged(Color color) private void nudLocation_ValueChanged(object sender, EventArgs e) { - if (lvGradientPoints.SelectedItems.Count > 0) + if (isReady) { - ListViewItem lvi = lvGradientPoints.SelectedItems[0]; - GradientStop gradientStop = (GradientStop)lvi.Tag; - gradientStop.Location = (float)nudLocation.Value; - lvi.Text = string.Format(" {0:0.##}%", gradientStop.Location); - UpdatePreview(); + GradientStop gradientStop = GetSelectedGradientStop(out ListViewItem lvi); + + if (gradientStop != null) + { + gradientStop.Location = (float)nudLocation.Value; + UpdateGradientList(); + SelectGradientStop(gradientStop); + } } } private void lvGradientPoints_SelectedIndexChanged(object sender, EventArgs e) { - if (lvGradientPoints.SelectedItems.Count > 0) + GradientStop gradientStop = GetSelectedGradientStop(); + + if (gradientStop != null) { - ListViewItem lvi = lvGradientPoints.SelectedItems[0]; - GradientStop gradientStop = (GradientStop)lvi.Tag; + isReady = false; cbtnCurrentColor.Color = gradientStop.Color; nudLocation.SetValue((decimal)gradientStop.Location); + isReady = true; } }