From 9713f23e13ec35d1e652545566d45b40fc587d0d Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 26 May 2022 20:43:24 +1000 Subject: [PATCH 01/11] Add SetSelectedFeature to SectionViewModel, Dispatcher --- Mappy/Models/ISectionViewViewModel.cs | 2 ++ Mappy/Models/SectionViewViewModel.cs | 10 +++++++++- Mappy/Services/Dispatcher.cs | 9 +++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Mappy/Models/ISectionViewViewModel.cs b/Mappy/Models/ISectionViewViewModel.cs index d804bb8..50e002a 100644 --- a/Mappy/Models/ISectionViewViewModel.cs +++ b/Mappy/Models/ISectionViewViewModel.cs @@ -14,5 +14,7 @@ public interface ISectionViewViewModel void SelectComboBox1Item(int index); void SelectComboBox2Item(int index); + + void SetSelectedFeature(string featureName); } } \ No newline at end of file diff --git a/Mappy/Models/SectionViewViewModel.cs b/Mappy/Models/SectionViewViewModel.cs index 1725652..587956a 100644 --- a/Mappy/Models/SectionViewViewModel.cs +++ b/Mappy/Models/SectionViewViewModel.cs @@ -22,7 +22,9 @@ public sealed class SectionViewViewModel : ISectionViewViewModel, IDisposable private readonly SectionService sectionService; - public SectionViewViewModel(SectionService sectionService) + private readonly Dispatcher dispatcher; + + public SectionViewViewModel(SectionService sectionService, Dispatcher dispatcher) { sectionService.SectionsChanged += this.OnSectionsChanged; @@ -44,6 +46,7 @@ public SectionViewViewModel(SectionService sectionService) }); this.sectionService = sectionService; + this.dispatcher = dispatcher; } public IObservable ComboBox1Model => this.worlds; @@ -107,5 +110,10 @@ private void OnSectionsChanged(object sender, EventArgs e) this.UpdateCategories(); this.UpdateSections(); } + + public void SetSelectedFeature(string featureName) + { + this.dispatcher.SetSelectedFeature(featureName); + } } } diff --git a/Mappy/Services/Dispatcher.cs b/Mappy/Services/Dispatcher.cs index 71c8bd2..5477882 100644 --- a/Mappy/Services/Dispatcher.cs +++ b/Mappy/Services/Dispatcher.cs @@ -545,6 +545,15 @@ public void SelectStartPosition(int index) this.model.Map.IfSome(x => x.SelectStartPosition(index)); } + public void SetSelectedFeature(string featureName) + { + var featureFromTag = this.featureService.TryGetFeature(featureName); + if (featureFromTag.HasValue) + { + this.featureService.SelectedFeature = featureFromTag.UnsafeValue; + } + } + private static IEnumerable GetMapNames(HpiArchive hpi) { return hpi.GetFiles("maps") From fe9a30fa5e64f9a653a76f65551495a9304affa8 Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 26 May 2022 20:43:57 +1000 Subject: [PATCH 02/11] Add SelectedFeature Property to FeatureService --- Mappy/Services/FeatureService.cs | 86 ++++++++++++++++---------------- 1 file changed, 44 insertions(+), 42 deletions(-) diff --git a/Mappy/Services/FeatureService.cs b/Mappy/Services/FeatureService.cs index f8c6bbc..2ba8ab8 100644 --- a/Mappy/Services/FeatureService.cs +++ b/Mappy/Services/FeatureService.cs @@ -30,6 +30,8 @@ public FeatureService() public event EventHandler FeaturesChanged; + public Feature SelectedFeature { get; set; } + public void AddFeatures(IEnumerable features) { foreach (var f in features) @@ -88,31 +90,31 @@ private static OffsetBitmap LoadRenderFile(HpiArchive archive, HpiArchive.FileIn private static OffsetBitmap LoadBitmap(GafEntry[] gaf, string sequenceName) { - var entry = gaf.FirstOrDefault( - x => string.Equals(x.Name, sequenceName, StringComparison.OrdinalIgnoreCase)); - if (entry == null) - { - // skip if the sequence is not in this gaf file - return null; - } + var entry = gaf.FirstOrDefault( + x => string.Equals(x.Name, sequenceName, StringComparison.OrdinalIgnoreCase)); + if (entry == null) + { + // skip if the sequence is not in this gaf file + return null; + } - var frame = entry.Frames[0]; + var frame = entry.Frames[0]; - Bitmap bmp; - if (frame.Data == null || frame.Width == 0 || frame.Height == 0) - { - bmp = new Bitmap(50, 50); - } - else - { - bmp = BitmapConvert.ToBitmap( - frame.Data, - frame.Width, - frame.Height, - frame.TransparencyIndex); - } + Bitmap bmp; + if (frame.Data == null || frame.Width == 0 || frame.Height == 0) + { + bmp = new Bitmap(50, 50); + } + else + { + bmp = BitmapConvert.ToBitmap( + frame.Data, + frame.Width, + frame.Height, + frame.TransparencyIndex); + } - return new OffsetBitmap(-frame.OffsetX, -frame.OffsetY, bmp); + return new OffsetBitmap(-frame.OffsetX, -frame.OffsetY, bmp); } private static GafEntry[] LoadGafEntries(HpiArchive.FileInfo fileInfo, HpiArchive archive) @@ -193,16 +195,16 @@ private IEnumerable EnumerateFeaturesFromInternal(IEnumerable EnumerateFeaturesFromInternal(IEnumerable Date: Thu, 26 May 2022 20:46:57 +1000 Subject: [PATCH 03/11] Add OnSelectionIndexChange event handler to SectionView. Reorder method order. --- Mappy/Models/SectionViewViewModel.cs | 10 +++--- Mappy/UI/Controls/SectionView.cs | 50 ++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/Mappy/Models/SectionViewViewModel.cs b/Mappy/Models/SectionViewViewModel.cs index 587956a..2709666 100644 --- a/Mappy/Models/SectionViewViewModel.cs +++ b/Mappy/Models/SectionViewViewModel.cs @@ -65,6 +65,11 @@ public void SelectComboBox2Item(int index) this.selectCategoryEvent.OnNext(index); } + public void SetSelectedFeature(string featureName) + { + this.dispatcher.SetSelectedFeature(featureName); + } + public void Dispose() { this.worlds.Dispose(); @@ -110,10 +115,5 @@ private void OnSectionsChanged(object sender, EventArgs e) this.UpdateCategories(); this.UpdateSections(); } - - public void SetSelectedFeature(string featureName) - { - this.dispatcher.SetSelectedFeature(featureName); - } } } diff --git a/Mappy/UI/Controls/SectionView.cs b/Mappy/UI/Controls/SectionView.cs index b9a1229..51a406e 100644 --- a/Mappy/UI/Controls/SectionView.cs +++ b/Mappy/UI/Controls/SectionView.cs @@ -18,6 +18,8 @@ public partial class SectionView : UserControl private bool suppressCombo1SelectedItemEvents; private bool suppressCombo2SelectedItemEvents; + private ListViewItem previousSelection; + public SectionView() { this.InitializeComponent(); @@ -25,6 +27,7 @@ public SectionView() this.control.ComboBox1.SelectedIndexChanged += this.ComboBox1SelectedIndexChanged; this.control.ComboBox2.SelectedIndexChanged += this.ComboBox2SelectedIndexChanged; this.control.ListView.ItemDrag += this.ListViewItemDrag; + this.control.ListView.SelectedIndexChanged += this.ListViewItemSelectionChanged; } public Size ImageSize { get; set; } = new Size(128, 128); @@ -134,5 +137,52 @@ private void ListViewItemDrag(object sender, ItemDragEventArgs e) var data = view.SelectedItems[0].Tag; view.DoDragDrop(data, DragDropEffects.Copy); } + + private void ListViewItemSelectionChanged(object sender, EventArgs e) + { + var view = (ListView)sender; + if (view.SelectedItems.Count == 0) + { + return; + } + + view.ItemSelectionChanged -= this.ListViewItemSelectionChanged; + var selItem = view.SelectedItems[0]; + + if (this.previousSelection == null || + this.previousSelection.Index < 0 || + view.Items[this.previousSelection.Index] == null) + { + this.previousSelection = selItem; + } + + if (selItem != this.previousSelection) + { + this.UpdateItemDeselected(view.Items[this.previousSelection.Index]); + this.UpdateItemSelected(view.Items[selItem.Index]); + this.previousSelection = selItem; + this.model.SetSelectedFeature(selItem.Text); + } + + view.ItemSelectionChanged += this.ListViewItemSelectionChanged; + } + + private void UpdateItemSelected(ListViewItem toBeSelected) + { + // Functionality + toBeSelected.Selected = true; + + // Appearance + toBeSelected.BackColor = Color.Orange; + toBeSelected.ForeColor = Color.Black; + } + + private void UpdateItemDeselected(ListViewItem toBeSelected) + { + toBeSelected.Selected = false; + + toBeSelected.BackColor = Color.White; + toBeSelected.ForeColor = Color.Black; + } } } From d91ac5197817f01b85de505f6d2c1006bdbe7094 Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 26 May 2022 20:49:42 +1000 Subject: [PATCH 04/11] Implement dispatcher, SetSelectedFeature on FeatureViewViewModel --- Mappy/Models/FeatureViewViewModel.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Mappy/Models/FeatureViewViewModel.cs b/Mappy/Models/FeatureViewViewModel.cs index 1531593..7923173 100644 --- a/Mappy/Models/FeatureViewViewModel.cs +++ b/Mappy/Models/FeatureViewViewModel.cs @@ -27,7 +27,9 @@ public sealed class FeatureViewViewModel : ISectionViewViewModel, IDisposable private readonly FeatureService featureService; - public FeatureViewViewModel(FeatureService featureService) + private readonly Dispatcher dispatcher; + + public FeatureViewViewModel(FeatureService featureService, Dispatcher dispatcher) { featureService.FeaturesChanged += this.OnFeaturesChanged; @@ -58,6 +60,7 @@ public FeatureViewViewModel(FeatureService featureService) .Subscribe(_ => this.UpdateFeatures()); this.featureService = featureService; + this.dispatcher = dispatcher; } public IObservable ComboBox1Model => this.worlds; @@ -76,6 +79,11 @@ public void SelectComboBox2Item(int index) this.selectCategoryEvent.OnNext(index); } + public void SetSelectedFeature(string featureName) + { + this.dispatcher.SetSelectedFeature(featureName); + } + public void Dispose() { this.worlds.Dispose(); From 7906c78b58baeff4fe9533663c90dbf70a8b7c20 Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 26 May 2022 20:50:33 +1000 Subject: [PATCH 05/11] Pass dispatcher to ViewModels --- Mappy/Program.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mappy/Program.cs b/Mappy/Program.cs index 662246a..3839b2d 100644 --- a/Mappy/Program.cs +++ b/Mappy/Program.cs @@ -67,8 +67,8 @@ public static void Main() tileCache); mainForm.SetModel(new MainFormViewModel(model, dispatcher, featureService)); - mainForm.SectionView.SetModel(new SectionViewViewModel(sectionsService)); - mainForm.FeatureView.SetModel(new FeatureViewViewModel(featureService)); + mainForm.SectionView.SetModel(new SectionViewViewModel(sectionsService, dispatcher)); + mainForm.FeatureView.SetModel(new FeatureViewViewModel(featureService, dispatcher)); mainForm.MapViewPanel.SetModel(new MapViewViewModel(model, dispatcher, featureService)); From dd16b1859a96a3bad877cbd35cec34f3255e7466 Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 26 May 2022 21:14:17 +1000 Subject: [PATCH 06/11] Milestone commit. Rename SetSelectedFeature to SetSelectedItem - make generic. --- Mappy/Models/FeatureViewViewModel.cs | 2 +- Mappy/Models/ISectionViewViewModel.cs | 2 +- Mappy/Models/SectionViewViewModel.cs | 4 ++-- Mappy/UI/Controls/SectionView.cs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Mappy/Models/FeatureViewViewModel.cs b/Mappy/Models/FeatureViewViewModel.cs index 7923173..a720ec0 100644 --- a/Mappy/Models/FeatureViewViewModel.cs +++ b/Mappy/Models/FeatureViewViewModel.cs @@ -79,7 +79,7 @@ public void SelectComboBox2Item(int index) this.selectCategoryEvent.OnNext(index); } - public void SetSelectedFeature(string featureName) + public void SetSelectedItem(string featureName) { this.dispatcher.SetSelectedFeature(featureName); } diff --git a/Mappy/Models/ISectionViewViewModel.cs b/Mappy/Models/ISectionViewViewModel.cs index 50e002a..9237930 100644 --- a/Mappy/Models/ISectionViewViewModel.cs +++ b/Mappy/Models/ISectionViewViewModel.cs @@ -15,6 +15,6 @@ public interface ISectionViewViewModel void SelectComboBox2Item(int index); - void SetSelectedFeature(string featureName); + void SetSelectedItem(string selectedItemName); } } \ No newline at end of file diff --git a/Mappy/Models/SectionViewViewModel.cs b/Mappy/Models/SectionViewViewModel.cs index 2709666..6eb0729 100644 --- a/Mappy/Models/SectionViewViewModel.cs +++ b/Mappy/Models/SectionViewViewModel.cs @@ -65,9 +65,9 @@ public void SelectComboBox2Item(int index) this.selectCategoryEvent.OnNext(index); } - public void SetSelectedFeature(string featureName) + public void SetSelectedItem(string sectionName) { - this.dispatcher.SetSelectedFeature(featureName); + // this.dispatcher.SetSelectedSection(sectionName); } public void Dispose() diff --git a/Mappy/UI/Controls/SectionView.cs b/Mappy/UI/Controls/SectionView.cs index 51a406e..f2a061b 100644 --- a/Mappy/UI/Controls/SectionView.cs +++ b/Mappy/UI/Controls/SectionView.cs @@ -161,7 +161,7 @@ private void ListViewItemSelectionChanged(object sender, EventArgs e) this.UpdateItemDeselected(view.Items[this.previousSelection.Index]); this.UpdateItemSelected(view.Items[selItem.Index]); this.previousSelection = selItem; - this.model.SetSelectedFeature(selItem.Text); + this.model.SetSelectedItem(selItem.Text); } view.ItemSelectionChanged += this.ListViewItemSelectionChanged; From a6bba42dead3ea7a2510c3a19fbfd9af5ff7014d Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 26 May 2022 21:26:17 +1000 Subject: [PATCH 07/11] MVP feature complete. Add MouseRightClick event handler. --- Mappy/Models/IMapViewViewModel.cs | 4 +++- Mappy/Models/MapViewViewModel.cs | 18 +++++++++++++++++- Mappy/UI/Controls/MapViewPanel.cs | 9 ++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/Mappy/Models/IMapViewViewModel.cs b/Mappy/Models/IMapViewViewModel.cs index 74f90de..43d42d0 100644 --- a/Mappy/Models/IMapViewViewModel.cs +++ b/Mappy/Models/IMapViewViewModel.cs @@ -20,7 +20,9 @@ public interface IMapViewViewModel IObservable ViewportLocation { get; } - void MouseDown(Point location); + void MouseLeftDown(Point location); + + void MouseRightDown(Point location); void MouseMove(Point locattion); diff --git a/Mappy/Models/MapViewViewModel.cs b/Mappy/Models/MapViewViewModel.cs index 5c365e7..7738cad 100644 --- a/Mappy/Models/MapViewViewModel.cs +++ b/Mappy/Models/MapViewViewModel.cs @@ -186,7 +186,7 @@ public void ScrollPositionChanged(Point position) this.dispatcher.SetViewportLocation(position); } - public void MouseDown(Point location) + public void MouseLeftDown(Point location) { this.mouseDown = true; this.lastMousePos = location; @@ -207,6 +207,22 @@ public void MouseDown(Point location) } } + public void MouseRightDown(Point location) + { + this.mouseDown = true; + this.lastMousePos = location; + + if (!this.itemsLayer.Value.IsInSelection(location.X, location.Y) && + this.featureService.SelectedFeature != null) + { + this.dispatcher.DragDropFeature( + this.featureService.SelectedFeature.Name, + location.X, + location.Y + ); + } + } + public void MouseMove(Point location) { this.dispatcher.UpdateMousePosition(Maybe.Return(location)); diff --git a/Mappy/UI/Controls/MapViewPanel.cs b/Mappy/UI/Controls/MapViewPanel.cs index d9fa18f..f0894f6 100644 --- a/Mappy/UI/Controls/MapViewPanel.cs +++ b/Mappy/UI/Controls/MapViewPanel.cs @@ -44,7 +44,14 @@ private void MapViewDragDrop(object sender, DragEventArgs e) private void MapViewMouseDown(object sender, MouseEventArgs e) { var loc = this.mapView.ToVirtualPoint(e.Location); - this.model.MouseDown(loc); + if (e.Button == MouseButtons.Left) + { + this.model.MouseLeftDown(loc); + } + else if (e.Button == MouseButtons.Right) + { + this.model.MouseRightDown(loc); + } } private void MapViewMouseMove(object sender, MouseEventArgs e) From 329fe50a3452228276d932fb2fdbbb0a20be6552 Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 30 May 2022 10:54:51 +1000 Subject: [PATCH 08/11] Fix null first section, feature selection bug --- Mappy/UI/Controls/SectionView.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Mappy/UI/Controls/SectionView.cs b/Mappy/UI/Controls/SectionView.cs index f2a061b..65e017f 100644 --- a/Mappy/UI/Controls/SectionView.cs +++ b/Mappy/UI/Controls/SectionView.cs @@ -154,6 +154,8 @@ private void ListViewItemSelectionChanged(object sender, EventArgs e) view.Items[this.previousSelection.Index] == null) { this.previousSelection = selItem; + this.UpdateItemSelected(view.Items[selItem.Index]); + this.model.SetSelectedItem(selItem.Text); } if (selItem != this.previousSelection) From 94a6e84aa6bf70b52aa9ddcc2bcd44b0f08ecdd9 Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 30 May 2022 12:15:53 +1000 Subject: [PATCH 09/11] Add border to selected listviewitem, remove multi-select --- .../Controls/DoubleComboListView.Designer.cs | 24 ++++++++++++------- Mappy/UI/Controls/DoubleComboListView.cs | 15 ++++++++++++ Mappy/UI/Controls/SectionView.cs | 24 +++---------------- 3 files changed, 34 insertions(+), 29 deletions(-) diff --git a/Mappy/UI/Controls/DoubleComboListView.Designer.cs b/Mappy/UI/Controls/DoubleComboListView.Designer.cs index 5828fd6..418e801 100644 --- a/Mappy/UI/Controls/DoubleComboListView.Designer.cs +++ b/Mappy/UI/Controls/DoubleComboListView.Designer.cs @@ -40,9 +40,9 @@ private void InitializeComponent() this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.comboBox1.FormattingEnabled = true; this.comboBox1.Location = new System.Drawing.Point(0, 0); - this.comboBox1.Margin = new System.Windows.Forms.Padding(0, 0, 0, 3); + this.comboBox1.Margin = new System.Windows.Forms.Padding(0, 0, 0, 5); this.comboBox1.Name = "comboBox1"; - this.comboBox1.Size = new System.Drawing.Size(177, 21); + this.comboBox1.Size = new System.Drawing.Size(264, 28); this.comboBox1.TabIndex = 0; // // comboBox2 @@ -51,9 +51,10 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Right))); this.comboBox2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.comboBox2.FormattingEnabled = true; - this.comboBox2.Location = new System.Drawing.Point(0, 27); + this.comboBox2.Location = new System.Drawing.Point(0, 42); + this.comboBox2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.comboBox2.Name = "comboBox2"; - this.comboBox2.Size = new System.Drawing.Size(177, 21); + this.comboBox2.Size = new System.Drawing.Size(264, 28); this.comboBox2.TabIndex = 1; // // listView1 @@ -61,21 +62,28 @@ private void InitializeComponent() this.listView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.listView1.Location = new System.Drawing.Point(0, 54); + this.listView1.HideSelection = false; + this.listView1.Location = new System.Drawing.Point(0, 83); + this.listView1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.listView1.MultiSelect = false; this.listView1.Name = "listView1"; - this.listView1.Size = new System.Drawing.Size(177, 300); + this.listView1.OwnerDraw = true; + this.listView1.Size = new System.Drawing.Size(264, 459); this.listView1.TabIndex = 2; this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.DrawItem += new System.Windows.Forms.DrawListViewItemEventHandler(this.ListView1_DrawItem); + this.listView1.DrawSubItem += new System.Windows.Forms.DrawListViewSubItemEventHandler(this.ListView1_DrawSubItem); // // DoubleComboListView // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.listView1); this.Controls.Add(this.comboBox2); this.Controls.Add(this.comboBox1); + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.Name = "DoubleComboListView"; - this.Size = new System.Drawing.Size(177, 354); + this.Size = new System.Drawing.Size(266, 545); this.ResumeLayout(false); } diff --git a/Mappy/UI/Controls/DoubleComboListView.cs b/Mappy/UI/Controls/DoubleComboListView.cs index 8f80da5..bf959fa 100644 --- a/Mappy/UI/Controls/DoubleComboListView.cs +++ b/Mappy/UI/Controls/DoubleComboListView.cs @@ -1,5 +1,6 @@ namespace Mappy.UI.Controls { + using System.Drawing; using System.Windows.Forms; public partial class DoubleComboListView : UserControl @@ -14,5 +15,19 @@ public DoubleComboListView() public ComboBox ComboBox2 => this.comboBox2; public ListView ListView => this.listView1; + + private void ListView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) + { + e.DrawDefault = true; + } + + private void ListView1_DrawItem(object sender, DrawListViewItemEventArgs e) + { + e.DrawDefault = true; + if (e.Item.Selected) + { + e.Graphics.DrawRectangle(Pens.Red, e.Bounds); + } + } } } diff --git a/Mappy/UI/Controls/SectionView.cs b/Mappy/UI/Controls/SectionView.cs index 65e017f..4c17ba1 100644 --- a/Mappy/UI/Controls/SectionView.cs +++ b/Mappy/UI/Controls/SectionView.cs @@ -154,37 +154,19 @@ private void ListViewItemSelectionChanged(object sender, EventArgs e) view.Items[this.previousSelection.Index] == null) { this.previousSelection = selItem; - this.UpdateItemSelected(view.Items[selItem.Index]); + view.Items[selItem.Index].Selected = true; this.model.SetSelectedItem(selItem.Text); } if (selItem != this.previousSelection) { - this.UpdateItemDeselected(view.Items[this.previousSelection.Index]); - this.UpdateItemSelected(view.Items[selItem.Index]); + view.Items[this.previousSelection.Index].Selected = false; + view.Items[selItem.Index].Selected = true; this.previousSelection = selItem; this.model.SetSelectedItem(selItem.Text); } view.ItemSelectionChanged += this.ListViewItemSelectionChanged; } - - private void UpdateItemSelected(ListViewItem toBeSelected) - { - // Functionality - toBeSelected.Selected = true; - - // Appearance - toBeSelected.BackColor = Color.Orange; - toBeSelected.ForeColor = Color.Black; - } - - private void UpdateItemDeselected(ListViewItem toBeSelected) - { - toBeSelected.Selected = false; - - toBeSelected.BackColor = Color.White; - toBeSelected.ForeColor = Color.Black; - } } } From ee2fb840cc56c9afa7aa17116e6df977d716ed31 Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 30 May 2022 12:39:23 +1000 Subject: [PATCH 10/11] DoubleComboListView keeps the border around the last selected ListItem. --- Mappy/UI/Controls/DoubleComboListView.cs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/Mappy/UI/Controls/DoubleComboListView.cs b/Mappy/UI/Controls/DoubleComboListView.cs index bf959fa..23e8f6a 100644 --- a/Mappy/UI/Controls/DoubleComboListView.cs +++ b/Mappy/UI/Controls/DoubleComboListView.cs @@ -5,9 +5,16 @@ public partial class DoubleComboListView : UserControl { + private readonly Pen selectionPen; + private readonly Pen defaultPen; + + private ListViewItem previousSelection; + public DoubleComboListView() { this.InitializeComponent(); + this.selectionPen = new Pen(Color.Red, 3); + this.defaultPen = new Pen(Color.White, 3); } public ComboBox ComboBox1 => this.comboBox1; @@ -26,7 +33,17 @@ private void ListView1_DrawItem(object sender, DrawListViewItemEventArgs e) e.DrawDefault = true; if (e.Item.Selected) { - e.Graphics.DrawRectangle(Pens.Red, e.Bounds); + e.Graphics.DrawRectangle(this.selectionPen, e.Bounds); + this.previousSelection = e.Item; + } + else if (sender is ListView && ((ListView)sender).SelectedItems.Count <= 0 && + this.previousSelection != null && this.previousSelection.Index == e.Item.Index) + { + e.Graphics.DrawRectangle(this.selectionPen, this.previousSelection.Bounds); + } + else + { + e.Graphics.DrawRectangle(this.defaultPen, e.Bounds); } } } From e769c774cda9a63e2b748ae6cb414967e3075c9f Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 2 Jun 2022 21:45:30 +1000 Subject: [PATCH 11/11] Force repaint on selection change to remove "burn-in" of previous selection border. --- Mappy/UI/Controls/DoubleComboListView.Designer.cs | 1 + Mappy/UI/Controls/DoubleComboListView.cs | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/Mappy/UI/Controls/DoubleComboListView.Designer.cs b/Mappy/UI/Controls/DoubleComboListView.Designer.cs index 418e801..f89fc24 100644 --- a/Mappy/UI/Controls/DoubleComboListView.Designer.cs +++ b/Mappy/UI/Controls/DoubleComboListView.Designer.cs @@ -73,6 +73,7 @@ private void InitializeComponent() this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.DrawItem += new System.Windows.Forms.DrawListViewItemEventHandler(this.ListView1_DrawItem); this.listView1.DrawSubItem += new System.Windows.Forms.DrawListViewSubItemEventHandler(this.ListView1_DrawSubItem); + this.listView1.ItemSelectionChanged += new System.Windows.Forms.ListViewItemSelectionChangedEventHandler(this.ListView1_ItemSelectionChanged); // // DoubleComboListView // diff --git a/Mappy/UI/Controls/DoubleComboListView.cs b/Mappy/UI/Controls/DoubleComboListView.cs index 23e8f6a..0d7f21c 100644 --- a/Mappy/UI/Controls/DoubleComboListView.cs +++ b/Mappy/UI/Controls/DoubleComboListView.cs @@ -46,5 +46,10 @@ private void ListView1_DrawItem(object sender, DrawListViewItemEventArgs e) e.Graphics.DrawRectangle(this.defaultPen, e.Bounds); } } + + private void ListView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) + { + this.ListView.Refresh(); + } } }