public void SetAllVisibleState(bool visible) { foreach (var v in Items) { if (v is MeshListItem mesh) { mesh.Visible = visible; } } ItemVisiblilityChanged?.Invoke(this, new EventArgs()); Invalidate(); }
public void SetVisibleState(int index, bool visible) { if (index < Items.Count && index >= 0) { if (Items[index] is MeshListItem mesh) { mesh.Visible = visible; } } ItemVisiblilityChanged?.Invoke(this, new EventArgs()); Invalidate(); }
public MeshList() : base() { //Activate double buffering this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); //Enable the OnNotifyMessage event so we get a chance to filter out // Windows messages before they get to the form's WndProc this.SetStyle(ControlStyles.EnableNotifyMessage, true); this.DrawMode = DrawMode.OwnerDrawFixed; this.DrawItem += Ditem; HashSet <int> _selIndex = new HashSet <int>(); HashSet <int> _newSet = new HashSet <int>(); bool updating = false; SelectedIndexChanged += (sender, args) => { if (updating) { return; } var mpos = PointToClient(Cursor.Position); var index = IndexFromPoint(mpos); if (index != -1 && Items[index] is MeshListItem checkable && mpos.X < ItemHeight) { // undo selection _newSet.Clear(); foreach (int i in SelectedIndices) { _newSet.Add(i); } if (!_newSet.SetEquals(_selIndex)) { updating = true; BeginUpdate(); SelectedIndices.Clear(); SelectedIndex = -1; foreach (var v in _selIndex) { SelectedIndices.Add(v); } EndUpdate(); updating = false; } // toggle visibility { if (SelectedIndices.Contains(index)) { bool state = !checkable.Visible; foreach (var s in SelectedItems) { if (s is MeshListItem mesh) { mesh.Visible = state; } } } else { checkable.Visible = !checkable.Visible; } ItemVisiblilityChanged?.Invoke(this, new EventArgs()); Invalidate(); } return; } _selIndex.Clear(); foreach (int v in SelectedIndices) { _selIndex.Add(v); } }; }