diff --git a/src/BizHawk.Client.Common/tools/CheatList.cs b/src/BizHawk.Client.Common/tools/CheatList.cs index d38ae84211..2b33b0cff8 100644 --- a/src/BizHawk.Client.Common/tools/CheatList.cs +++ b/src/BizHawk.Client.Common/tools/CheatList.cs @@ -46,6 +46,9 @@ namespace BizHawk.Client.Common public int ActiveCount => _cheatList.Count(c => c.Enabled); + public bool AnyActive + => _cheatList.Any(static c => c.Enabled); + public bool Changes { get => _changes; diff --git a/src/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.cs b/src/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.cs index 917ce76702..3d79b2383d 100644 --- a/src/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.cs +++ b/src/BizHawk.Client.EmuHawk/CustomControls/InputRoll/InputRoll.cs @@ -586,6 +586,12 @@ namespace BizHawk.Client.EmuHawk Refresh(); } + public void ToggleSelectAll() + { + if (SelectedRows.Count() == RowCount) DeselectAll(); + else SelectAll(); + } + public void TruncateSelection(int index) { _selectedItems.RemoveWhere(cell => cell.RowIndex > index); @@ -596,17 +602,17 @@ namespace BizHawk.Client.EmuHawk [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool IsPointingAtColumnHeader => IsHoveringOnColumnCell; + /// the of the selected row with the earliest index, or if no rows are selected [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public int? FirstSelectedIndex => AnyRowsSelected - ? SelectedRows.Min() - : (int?)null; + public int? SelectionStartIndex + => AnyRowsSelected ? SelectedRowsWithDuplicates.Min() : null; + /// the of the selected row with the latest index, or if no rows are selected [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public int? LastSelectedIndex => AnyRowsSelected - ? SelectedRows.Max() - : (int?)null; + public int? SelectionEndIndex + => AnyRowsSelected ? SelectedRowsWithDuplicates.Max() : null; /// /// Gets or sets the current Cell that the mouse was in. @@ -919,13 +925,26 @@ namespace BizHawk.Client.EmuHawk } [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public IEnumerable SelectedRows => _selectedItems - .Where(cell => cell.RowIndex.HasValue) - .Select(cell => cell.RowIndex.Value) - .Distinct(); + private IEnumerable SelectedRowsWithDuplicates + => _selectedItems.Where(static cell => cell.RowIndex is not null).Select(static cell => cell.RowIndex.Value); - public bool AnyRowsSelected => _selectedItems.Any(cell => cell.RowIndex.HasValue); + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public IEnumerable SelectedRows + => SelectedRowsWithDuplicates.Distinct(); + + [Browsable(false)] + public bool AnyRowsSelected + => _selectedItems.Any(static cell => cell.RowIndex is not null); + + /// the of the first row in the selection list (throws if no rows are selected) + /// you probably want , TODO check existing callsites + [Browsable(false)] + public int FirstSelectedRowIndex + => SelectedRowsWithDuplicates.First(); + + public bool IsRowSelected(int rowIndex) + => _selectedItems.Any(cell => cell.RowIndex == rowIndex); public IEnumerable GenerateContextMenuItems() { @@ -1356,7 +1375,7 @@ namespace BizHawk.Client.EmuHawk { if (ChangeSelectionWhenPaging) { - var selectedRow = SelectedRows.Any() ? SelectedRows.First() : FirstVisibleRow; + var selectedRow = AnyRowsSelected ? FirstSelectedRowIndex : FirstVisibleRow; var increment = LastVisibleRow - FirstVisibleRow; var newSelectedRow = selectedRow - increment; if (newSelectedRow < 0) @@ -1378,7 +1397,7 @@ namespace BizHawk.Client.EmuHawk { if (ChangeSelectionWhenPaging) { - var selectedRow = SelectedRows.Any() ? SelectedRows.First() : FirstVisibleRow; + var selectedRow = AnyRowsSelected ? FirstSelectedRowIndex : FirstVisibleRow; var increment = LastVisibleRow - FirstVisibleRow; var newSelectedRow = selectedRow + increment; if (newSelectedRow > RowCount - 1) @@ -1412,9 +1431,9 @@ namespace BizHawk.Client.EmuHawk } else if (e.IsPressed(Keys.Up)) { - if (SelectedRows.Any()) + if (AnyRowsSelected) { - var selectedRow = SelectedRows.First(); + var selectedRow = FirstSelectedRowIndex; if (selectedRow > 0) { var targetSelectedRow = selectedRow - 1; @@ -1427,9 +1446,9 @@ namespace BizHawk.Client.EmuHawk } else if (e.IsPressed(Keys.Down)) { - if (SelectedRows.Any()) + if (AnyRowsSelected) { - var selectedRow = SelectedRows.First(); + var selectedRow = FirstSelectedRowIndex; if (selectedRow < RowCount - 1) { var targetSelectedRow = selectedRow + 1; @@ -1482,7 +1501,7 @@ namespace BizHawk.Client.EmuHawk // Selection cursor else if (e.IsCtrl(Keys.Up)) { - if (SelectedRows.Any() && LetKeysModifySelection && SelectedRows.First() > 0) + if (AnyRowsSelected && LetKeysModifySelection && FirstSelectedRowIndex > 0) { foreach (var row in SelectedRows.ToList()) // clones SelectedRows { @@ -1493,7 +1512,7 @@ namespace BizHawk.Client.EmuHawk } else if (e.IsCtrl(Keys.Down)) { - if (SelectedRows.Any() && LetKeysModifySelection) + if (AnyRowsSelected && LetKeysModifySelection) { foreach (var row in SelectedRows.Reverse()) // clones SelectedRows { @@ -1504,30 +1523,30 @@ namespace BizHawk.Client.EmuHawk } else if (e.IsCtrl(Keys.Left)) { - if (SelectedRows.Any() && LetKeysModifySelection) + if (AnyRowsSelected && LetKeysModifySelection) { SelectRow(SelectedRows.Last(), false); } } else if (e.IsCtrl(Keys.Right)) { - if (SelectedRows.Any() && LetKeysModifySelection && SelectedRows.Last() < _rowCount - 1) + if (AnyRowsSelected && LetKeysModifySelection && SelectedRows.Last() < _rowCount - 1) { SelectRow(SelectedRows.Last() + 1, true); } } else if (e.IsCtrlShift(Keys.Left)) { - if (SelectedRows.Any() && LetKeysModifySelection && SelectedRows.First() > 0) + if (AnyRowsSelected && LetKeysModifySelection && FirstSelectedRowIndex > 0) { - SelectRow(SelectedRows.First() - 1, true); + SelectRow(FirstSelectedRowIndex - 1, true); } } else if (e.IsCtrlShift(Keys.Right)) { - if (SelectedRows.Any() && LetKeysModifySelection) + if (AnyRowsSelected && LetKeysModifySelection) { - SelectRow(SelectedRows.First(), false); + SelectRow(FirstSelectedRowIndex, false); } } else if (e.IsCtrl(Keys.PageUp)) diff --git a/src/BizHawk.Client.EmuHawk/MainForm.cs b/src/BizHawk.Client.EmuHawk/MainForm.cs index b9add8567b..8218ff05a3 100644 --- a/src/BizHawk.Client.EmuHawk/MainForm.cs +++ b/src/BizHawk.Client.EmuHawk/MainForm.cs @@ -1462,7 +1462,7 @@ namespace BizHawk.Client.EmuHawk public void UpdateCheatStatus() { - if (CheatList.ActiveCount > 0) + if (CheatList.AnyActive) { CheatStatusButton.ToolTipText = "Cheats are currently active"; CheatStatusButton.Image = Properties.Resources.Freeze; diff --git a/src/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.cs b/src/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.cs index b8ffd179f1..630ab95e19 100644 --- a/src/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.cs +++ b/src/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.cs @@ -384,10 +384,11 @@ namespace BizHawk.Client.EmuHawk MoveUpMenuItem.Enabled = MoveDownMenuItem.Enabled = ToggleMenuItem.Enabled = - SelectedIndices.Any(); + CheatListView.AnyRowsSelected; - // Always leave enabled even if no cheats enabled. This way the hotkey will always work however a new cheat is enabled - // DisableAllCheatsMenuItem.Enabled = MainForm.CheatList.ActiveCount > 0; +#if false // Always leave enabled even if no cheats enabled. This way the hotkey will always work, even if a new cheat is enabled without also refreshing the menu + DisableAllCheatsMenuItem.Enabled = MainForm.CheatList.AnyActive; +#endif GameGenieSeparator.Visible = OpenGameGenieEncoderDecoderMenuItem.Visible = @@ -411,15 +412,7 @@ namespace BizHawk.Client.EmuHawk private void InsertSeparatorMenuItem_Click(object sender, EventArgs e) { - if (SelectedIndices.Any()) - { - MainForm.CheatList.Insert(SelectedIndices.Max(), Cheat.Separator); - } - else - { - MainForm.CheatList.Add(Cheat.Separator); - } - + MainForm.CheatList.Insert(CheatListView.SelectionStartIndex ?? MainForm.CheatList.Count, Cheat.Separator); GeneralUpdate(); UpdateMessageLabel(); } @@ -480,9 +473,7 @@ namespace BizHawk.Client.EmuHawk } private void SelectAllMenuItem_Click(object sender, EventArgs e) - { - CheatListView.SelectAll(); - } + => CheatListView.ToggleSelectAll(); private void ToggleMenuItem_Click(object sender, EventArgs e) { @@ -606,7 +597,7 @@ namespace BizHawk.Client.EmuHawk RemoveContextMenuItem.Enabled = SelectedCheats.Any(); - DisableAllContextMenuItem.Enabled = MainForm.CheatList.ActiveCount > 0; + DisableAllContextMenuItem.Enabled = MainForm.CheatList.AnyActive; } private void ViewInHexEditorContextMenuItem_Click(object sender, EventArgs e) diff --git a/src/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.Disassembler.cs b/src/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.Disassembler.cs index 50508b5f7a..19a7f0e3be 100644 --- a/src/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.Disassembler.cs +++ b/src/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.Disassembler.cs @@ -209,25 +209,13 @@ namespace BizHawk.Client.EmuHawk private void CopySelectedDisassembler() { - var indices = DisassemblerView.SelectedRows.ToList(); - - if (indices.Count > 0) + if (!DisassemblerView.AnyRowsSelected) return; + StringBuilder blob = new(); + foreach (var line in DisassemblerView.SelectedRows.Select(i => _disassemblyLines[i])) { - var blob = new StringBuilder(); - foreach (int index in indices) - { - if (blob.Length != 0) - { - blob.AppendLine(); - } - - blob.Append(_disassemblyLines[index].Address.ToHexString(_pcRegisterSize)) - .Append(' ') - .Append(_disassemblyLines[index].Mnemonic); - } - - Clipboard.SetDataObject(blob.ToString()); + blob.AppendFormat("{0} {1}\n", line.Address.ToHexString(_pcRegisterSize), line.Mnemonic); } + Clipboard.SetDataObject(blob.ToString()); } private void OnPauseChanged(bool isPaused) @@ -237,16 +225,14 @@ namespace BizHawk.Client.EmuHawk private void DisassemblerContextMenu_Opening(object sender, EventArgs e) { - AddBreakpointContextMenuItem.Enabled = DisassemblerView.SelectedRows.Any(); + AddBreakpointContextMenuItem.Enabled = DisassemblerView.AnyRowsSelected; } private void AddBreakpointContextMenuItem_Click(object sender, EventArgs e) { - var indices = DisassemblerView.SelectedRows.ToList(); - - if (indices.Count > 0) + if (DisassemblerView.AnyRowsSelected) { - var line = _disassemblyLines[indices[0]]; + var line = _disassemblyLines[DisassemblerView.FirstSelectedRowIndex]; BreakPointControl1.AddBreakpoint(line.Address, 0xFFFFFFFF, Emulation.Common.MemoryCallbackType.Execute); } } diff --git a/src/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs b/src/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs index c63b31e416..6169b435dd 100644 --- a/src/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs +++ b/src/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs @@ -1991,7 +1991,7 @@ namespace BizHawk.Client.EmuHawk (_highlightedAddress.HasValue || _secondaryHighlightedAddresses.Any()) && _domain.Writable; - UnfreezeAllContextItem.Visible = MainForm.CheatList.ActiveCount > 0; + UnfreezeAllContextItem.Visible = MainForm.CheatList.AnyActive; PasteContextItem.Visible = _domain.Writable && data != null && data.GetDataPresent(DataFormats.Text); ContextSeparator1.Visible = diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs index bf9abe96eb..115d55aa9c 100644 --- a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs +++ b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs @@ -829,7 +829,7 @@ namespace BizHawk.Client.EmuHawk DuplicateScriptMenuItem.Enabled = MoveUpMenuItem.Enabled = MoveDownMenuItem.Enabled = - LuaListView.SelectedRows.Any(); + LuaListView.AnyRowsSelected; SelectAllMenuItem.Enabled = LuaImp.ScriptList.Any(); StopAllScriptsMenuItem.Enabled = LuaImp.ScriptList.Any(script => script.Enabled); @@ -986,7 +986,7 @@ namespace BizHawk.Client.EmuHawk private void DuplicateScriptMenuItem_Click(object sender, EventArgs e) { - if (LuaListView.SelectedRows.Any()) + if (LuaListView.AnyRowsSelected) { var script = SelectedItems.First(); @@ -1024,16 +1024,7 @@ namespace BizHawk.Client.EmuHawk private void InsertSeparatorMenuItem_Click(object sender, EventArgs e) { - var indices = LuaListView.SelectedRows.ToList(); - if (indices.Any() && indices.Last() < LuaImp.ScriptList.Count) - { - LuaImp.ScriptList.Insert(indices.Last(), LuaFile.SeparatorInstance); - } - else - { - LuaImp.ScriptList.Add(LuaFile.SeparatorInstance); - } - + LuaImp.ScriptList.Insert(LuaListView.SelectionStartIndex ?? LuaImp.ScriptList.Count, LuaFile.SeparatorInstance); UpdateDialog(); } @@ -1090,9 +1081,7 @@ namespace BizHawk.Client.EmuHawk } private void SelectAllMenuItem_Click(object sender, EventArgs e) - { - LuaListView.SelectAll(); - } + => LuaListView.ToggleSelectAll(); private void StopAllScriptsMenuItem_Click(object sender, EventArgs e) { diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/BookmarksBranchesBox.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/BookmarksBranchesBox.cs index 6c619e420a..d524124174 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/BookmarksBranchesBox.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/BookmarksBranchesBox.cs @@ -170,9 +170,8 @@ namespace BizHawk.Client.EmuHawk MainForm.UpdateStatusSlots(); } - public TasBranch SelectedBranch => BranchView.AnyRowsSelected - ? Branches[BranchView.SelectedRows.First()] - : null; + public TasBranch SelectedBranch + => BranchView.AnyRowsSelected ? Branches[BranchView.FirstSelectedRowIndex] : null; private TasBranch CreateBranch() { @@ -214,8 +213,7 @@ namespace BizHawk.Client.EmuHawk { if (SelectedBranch != null) { - int index = BranchView.SelectedRows.First(); - Branches.Current = index; + Branches.Current = BranchView.FirstSelectedRowIndex; LoadBranch(SelectedBranch); BranchView.Refresh(); Tastudio.MainForm.AddOnScreenMessage($"Loaded branch {Branches.Current + 1}"); @@ -267,7 +265,7 @@ namespace BizHawk.Client.EmuHawk if (BranchView.AnyRowsSelected) { LoadSelectedBranch(); - LoadedCallback?.Invoke(BranchView.SelectedRows.First()); + LoadedCallback?.Invoke(BranchView.FirstSelectedRowIndex); } } @@ -278,7 +276,7 @@ namespace BizHawk.Client.EmuHawk return; } - Branches.Current = BranchView.SelectedRows.First(); + Branches.Current = BranchView.FirstSelectedRowIndex; _backupBranch = SelectedBranch.Clone(); UndoBranchToolStripMenuItem.Enabled = UndoBranchButton.Enabled = true; @@ -300,7 +298,7 @@ namespace BizHawk.Client.EmuHawk return; } - int index = BranchView.SelectedRows.First(); + var index = BranchView.FirstSelectedRowIndex; string oldText = SelectedBranch.UserText; if (EditBranchTextPopUp(index)) @@ -318,14 +316,7 @@ namespace BizHawk.Client.EmuHawk private void JumpToBranchToolStripMenuItem_Click(object sender, EventArgs e) { - if (!BranchView.AnyRowsSelected) - { - return; - } - - int index = BranchView.SelectedRows.First(); - var branch = Branches[index]; - Tastudio.GoToFrame(branch.Frame); + if (BranchView.AnyRowsSelected) Tastudio.GoToFrame(Branches[BranchView.FirstSelectedRowIndex].Frame); } private void RemoveBranchToolStripMenuItem_Click(object sender, EventArgs e) @@ -491,7 +482,7 @@ namespace BizHawk.Client.EmuHawk return; } - int sel = BranchView.SelectedRows.First(); + var sel = BranchView.FirstSelectedRowIndex; if (next) { if (Branches[sel + 1] != null) diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs index 9261ca38f8..8268855870 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Linq; @@ -17,6 +16,9 @@ namespace BizHawk.Client.EmuHawk public IDialogController DialogController => Tastudio.MainForm; + private TasMovieMarker FirstSelectedMarker + => Markers[MarkerView.FirstSelectedRowIndex]; + public MarkerControl() { InitializeComponent(); @@ -122,7 +124,7 @@ namespace BizHawk.Client.EmuHawk { EditMarkerToolStripMenuItem.Enabled = RemoveMarkerToolStripMenuItem.Enabled = - MarkerInputRoll.AnyRowsSelected && MarkerView.SelectedRows.First() != 0; + MarkerInputRoll.AnyRowsSelected && MarkerView.FirstSelectedRowIndex is not 0; JumpToMarkerToolStripMenuItem.Enabled = ScrollToMarkerToolStripMenuItem.Enabled = @@ -133,29 +135,19 @@ namespace BizHawk.Client.EmuHawk { if (MarkerView.AnyRowsSelected) { - Tastudio.SetVisibleFrame(SelectedMarkerFrame()); + Tastudio.SetVisibleFrame(FirstSelectedMarker.Frame); Tastudio.RefreshDialog(); } } private void JumpToMarkerToolStripMenuItem_Click(object sender, EventArgs e) { - if (MarkerView.AnyRowsSelected) - { - var index = MarkerView.SelectedRows.First(); - var marker = Markers[index]; - Tastudio.GoToFrame(marker.Frame); - } + if (MarkerView.AnyRowsSelected) Tastudio.GoToFrame(FirstSelectedMarker.Frame); } private void EditMarkerToolStripMenuItem_Click(object sender, EventArgs e) { - if (MarkerView.AnyRowsSelected) - { - var index = MarkerView.SelectedRows.First(); - var marker = Markers[index]; - EditMarkerPopUp(marker); - } + if (MarkerView.AnyRowsSelected) EditMarkerPopUp(FirstSelectedMarker); } private void AddMarkerToolStripMenuItem_Click(object sender, EventArgs e) @@ -170,12 +162,10 @@ namespace BizHawk.Client.EmuHawk private void RemoveMarkerToolStripMenuItem_Click(object sender, EventArgs e) { - if (MarkerView.AnyRowsSelected) - { - SelectedMarkers.ForEach(i => Markers.Remove(i)); - MarkerView.RowCount = Markers.Count; - Tastudio.RefreshDialog(); - } + if (!MarkerView.AnyRowsSelected) return; + foreach (var i in MarkerView.SelectedRows.Select(index => Markers[index]).ToList()) Markers.Remove(i); + MarkerView.RowCount = Markers.Count; + Tastudio.RefreshDialog(); } public void UpdateMarkerCount() @@ -283,41 +273,18 @@ namespace BizHawk.Client.EmuHawk { EditMarkerButton.Enabled = RemoveMarkerButton.Enabled = - MarkerInputRoll.AnyRowsSelected && MarkerView.SelectedRows.First() != 0; + MarkerInputRoll.AnyRowsSelected && MarkerView.FirstSelectedRowIndex is not 0; JumpToMarkerButton.Enabled = ScrollToMarkerButton.Enabled = MarkerInputRoll.AnyRowsSelected; } - private List SelectedMarkers => MarkerView - .SelectedRows - .Select(index => Markers[index]) - .ToList(); - - // SuuperW: Marker renaming can be done with a right-click. // A much more useful feature would be to easily jump to it. private void MarkerView_MouseDoubleClick(object sender, EventArgs e) { - if (MarkerView.AnyRowsSelected) - { - var index = MarkerView.SelectedRows.First(); - var marker = Markers[index]; - Tastudio.GoToFrame(marker.Frame); - } - } - - public int SelectedMarkerFrame() - { - if (MarkerView.AnyRowsSelected) - { - var index = MarkerView.SelectedRows.First(); - var marker = Markers[index]; - return marker.Frame; - } - - return -1; + if (MarkerView.AnyRowsSelected) Tastudio.GoToFrame(FirstSelectedMarker.Frame); } } } diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs index dac31e1785..17206a9827 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs @@ -377,11 +377,11 @@ namespace BizHawk.Client.EmuHawk if (columnName == FrameColumnName) { - CurrentTasMovie.Markers.Add(TasView.LastSelectedIndex.Value, ""); + CurrentTasMovie.Markers.Add(TasView.SelectionEndIndex!.Value, ""); } else if (columnName != CursorColumnName) { - int frame = TasView.SelectedRows.FirstOrDefault(); + var frame = TasView.AnyRowsSelected ? TasView.FirstSelectedRowIndex : 0; string buttonName = TasView.CurrentCell.Column.Name; if (ControllerType.BoolButtons.Contains(buttonName)) @@ -566,7 +566,7 @@ namespace BizHawk.Client.EmuHawk _extraAxisRows.Clear(); _extraAxisRows.AddRange(TasView.SelectedRows); _startSelectionDrag = true; - _selectionDragState = TasView.SelectedRows.Contains(frame); + _selectionDragState = TasView.IsRowSelected(frame); return; } if (_axisEditColumn != buttonName @@ -608,7 +608,7 @@ namespace BizHawk.Client.EmuHawk else { _startSelectionDrag = true; - _selectionDragState = TasView.SelectedRows.Contains(frame); + _selectionDragState = TasView.IsRowSelected(frame); } } else if (TasView.CurrentCell.Column.Type != ColumnType.Text) // User changed input @@ -637,12 +637,12 @@ namespace BizHawk.Client.EmuHawk else if (ModifierKeys == Keys.Shift && ModifierKeys != Keys.Alt) { if (!TasView.AnyRowsSelected) return; - int firstSel = TasView.SelectedRows.First(); + var firstSel = TasView.FirstSelectedRowIndex; if (frame <= firstSel) { firstSel = frame; - frame = TasView.SelectedRows.First(); + frame = TasView.FirstSelectedRowIndex; } bool allPressed = true; @@ -729,13 +729,13 @@ namespace BizHawk.Client.EmuHawk _rightClickControl = (ModifierKeys | Keys.Control) == ModifierKeys; _rightClickShift = (ModifierKeys | Keys.Shift) == ModifierKeys; _rightClickAlt = (ModifierKeys | Keys.Alt) == ModifierKeys; - if (TasView.SelectedRows.Contains(frame)) + if (TasView.IsRowSelected(frame)) { _rightClickInput = new string[TasView.SelectedRows.Count()]; - _rightClickFrame = TasView.FirstSelectedIndex.Value; + _rightClickFrame = TasView.SelectionStartIndex!.Value; try { - CurrentTasMovie.GetLogEntries().CopyTo(_rightClickFrame, _rightClickInput, 0, TasView.SelectedRows.Count()); + CurrentTasMovie.GetLogEntries().CopyTo(_rightClickFrame, _rightClickInput, 0, _rightClickInput.Length); } catch { } if (_rightClickControl && _rightClickShift) @@ -817,10 +817,10 @@ namespace BizHawk.Client.EmuHawk private void TasView_MouseUp(object sender, MouseEventArgs e) { - if (e.Button == MouseButtons.Right && !TasView.IsPointingAtColumnHeader && - !_suppressContextMenu && TasView.SelectedRows.Any() && !_leftButtonHeld) + if (e.Button == MouseButtons.Right && !TasView.IsPointingAtColumnHeader + && !_suppressContextMenu && !_leftButtonHeld && TasView.AnyRowsSelected) { - if (CurrentTasMovie.FrameCount < TasView.SelectedRows.Max()) + if (CurrentTasMovie.FrameCount < TasView.SelectionEndIndex) { // trying to be smart here // if a loaded branch log is shorter than selection, keep selection until you attempt to call context menu diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs index 579650e007..6d24070431 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs @@ -54,13 +54,7 @@ namespace BizHawk.Client.EmuHawk { if (SaveRamEmulator.CloneSaveRam() != null) { - int index = 0; - if (TasView.SelectedRows.Any()) - { - index = TasView.SelectedRows.First(); - } - - GoToFrame(index); + GoToFrame(TasView.AnyRowsSelected ? TasView.FirstSelectedRowIndex : 0); var newProject = CurrentTasMovie.ConvertToSaveRamAnchoredMovie( SaveRamEmulator.CloneSaveRam()); MainForm.PauseEmulator(); @@ -224,7 +218,7 @@ namespace BizHawk.Client.EmuHawk return; } - if (TasView.LastSelectedIndex == CurrentTasMovie.InputLogLength) + if (TasView.SelectionEndIndex == CurrentTasMovie.InputLogLength) { TasView.SelectRow(CurrentTasMovie.InputLogLength, false); } @@ -238,12 +232,13 @@ namespace BizHawk.Client.EmuHawk if (file != null) { + var selectionStart = TasView.SelectionStartIndex!.Value; new MovieZone( Emulator, Tools, MovieSession, - TasView.FirstSelectedIndex.Value, - TasView.LastSelectedIndex.Value - TasView.FirstSelectedIndex.Value + 1) + start: selectionStart, + length: TasView.SelectionEndIndex!.Value - selectionStart + 1) .Save(file.FullName); Config.RecentMacros.Add(file.FullName); @@ -406,6 +401,7 @@ namespace BizHawk.Client.EmuHawk TasView.Refresh(); } + /// TODO merge w/ Deselect? private void SelectAllMenuItem_Click(object sender, EventArgs e) { TasView.SelectAll(); @@ -416,8 +412,9 @@ namespace BizHawk.Client.EmuHawk { if (TasView.Focused && TasView.AnyRowsSelected) { - var prevMarker = CurrentTasMovie.Markers.PreviousOrCurrent(TasView.LastSelectedIndex ?? 0); - var nextMarker = CurrentTasMovie.Markers.Next(TasView.LastSelectedIndex ?? 0); + var selectionEnd = TasView.SelectionEndIndex ?? 0; + var prevMarker = CurrentTasMovie.Markers.PreviousOrCurrent(selectionEnd); + var nextMarker = CurrentTasMovie.Markers.Next(selectionEnd); int prev = prevMarker?.Frame ?? 0; int next = nextMarker?.Frame ?? CurrentTasMovie.InputLogLength; @@ -499,7 +496,7 @@ namespace BizHawk.Client.EmuHawk _tasClipboard.Add(new TasClipboardEntry(i, line)); } - var rollbackFrame = CurrentTasMovie.CopyOverInput(TasView.FirstSelectedIndex ?? 0, _tasClipboard.Select(x => x.ControllerState)); + var rollbackFrame = CurrentTasMovie.CopyOverInput(TasView.SelectionStartIndex ?? 0, _tasClipboard.Select(static x => x.ControllerState)); if (rollbackFrame > 0) { GoToLastEmulatedFrameIfNecessary(rollbackFrame); @@ -539,11 +536,12 @@ namespace BizHawk.Client.EmuHawk _tasClipboard.Add(new TasClipboardEntry(i, line)); } - var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame; - CurrentTasMovie.InsertInput(TasView.FirstSelectedIndex ?? 0, _tasClipboard.Select(x => x.ControllerState)); + var selectionStart = TasView.SelectionStartIndex; + var needsToRollback = selectionStart < Emulator.Frame; + CurrentTasMovie.InsertInput(selectionStart ?? 0, _tasClipboard.Select(static x => x.ControllerState)); if (needsToRollback) { - GoToLastEmulatedFrameIfNecessary(TasView.FirstSelectedIndex.Value); + GoToLastEmulatedFrameIfNecessary(selectionStart!.Value); DoAutoRestore(); } @@ -558,8 +556,9 @@ namespace BizHawk.Client.EmuHawk { if (TasView.Focused && TasView.AnyRowsSelected) { - var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame; - var rollBackFrame = TasView.FirstSelectedIndex ?? 0; + var selectionStart = TasView.SelectionStartIndex; + var needsToRollback = selectionStart < Emulator.Frame; + var rollBackFrame = selectionStart ?? 0; _tasClipboard.Clear(); var list = TasView.SelectedRows.ToArray(); @@ -598,9 +597,9 @@ namespace BizHawk.Client.EmuHawk { var firstWithInput = FirstNonEmptySelectedFrame; bool needsToRollback = firstWithInput.HasValue && firstWithInput < Emulator.Frame; - int rollBackFrame = TasView.FirstSelectedIndex ?? 0; + var rollBackFrame = TasView.SelectionStartIndex ?? 0; - CurrentTasMovie.ChangeLog.BeginNewBatch($"Clear frames {TasView.SelectedRows.Min()}-{TasView.SelectedRows.Max()}"); + CurrentTasMovie.ChangeLog.BeginNewBatch($"Clear frames {TasView.SelectionStartIndex}-{TasView.SelectionEndIndex}"); foreach (int frame in TasView.SelectedRows) { CurrentTasMovie.ClearFrame(frame); @@ -622,8 +621,9 @@ namespace BizHawk.Client.EmuHawk { if (TasView.Focused && TasView.AnyRowsSelected) { - var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame; - var rollBackFrame = TasView.FirstSelectedIndex ?? 0; + var selectionStart = TasView.SelectionStartIndex; + var needsToRollback = selectionStart < Emulator.Frame; + var rollBackFrame = selectionStart ?? 0; if (rollBackFrame >= CurrentTasMovie.InputLogLength) { // Cannot delete non-existent frames @@ -665,8 +665,8 @@ namespace BizHawk.Client.EmuHawk if (TasView.Focused && TasView.AnyRowsSelected) { var framesToInsert = TasView.SelectedRows; - var insertionFrame = Math.Min((TasView.LastSelectedIndex ?? 0) + 1, CurrentTasMovie.InputLogLength); - var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame; + var insertionFrame = Math.Min((TasView.SelectionEndIndex ?? 0) + 1, CurrentTasMovie.InputLogLength); + var needsToRollback = TasView.SelectionStartIndex < Emulator.Frame; var inputLog = framesToInsert .Select(frame => CurrentTasMovie.GetInputLogEntry(frame)) @@ -689,8 +689,9 @@ namespace BizHawk.Client.EmuHawk { if (TasView.Focused && TasView.AnyRowsSelected) { - var insertionFrame = TasView.FirstSelectedIndex ?? 0; - var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame; + var selectionStart = TasView.SelectionStartIndex; + var insertionFrame = selectionStart ?? 0; + var needsToRollback = selectionStart < Emulator.Frame; CurrentTasMovie.InsertEmptyFrame(insertionFrame); @@ -708,7 +709,7 @@ namespace BizHawk.Client.EmuHawk { if (TasView.Focused && TasView.AnyRowsSelected) { - int insertionFrame = TasView.FirstSelectedIndex ?? 0; + var insertionFrame = TasView.SelectionStartIndex ?? 0; using var framesPrompt = new FramesPrompt(); if (framesPrompt.ShowDialog().IsOk()) { @@ -721,8 +722,8 @@ namespace BizHawk.Client.EmuHawk { if (TasView.Focused && TasView.AnyRowsSelected) { - var rollbackFrame = TasView.LastSelectedIndex ?? 0; - var needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame; + var rollbackFrame = TasView.SelectionEndIndex ?? 0; + var needsToRollback = TasView.SelectionStartIndex < Emulator.Frame; CurrentTasMovie.Truncate(rollbackFrame); MarkerControl.MarkerInputRoll.TruncateSelection(CurrentTasMovie.Markers.Count - 1); @@ -755,12 +756,12 @@ namespace BizHawk.Client.EmuHawk private void SetMarkerWithTextMenuItem_Click(object sender, EventArgs e) { - MarkerControl.AddMarker(TasView.SelectedRows.FirstOrDefault(), true); + MarkerControl.AddMarker(TasView.AnyRowsSelected ? TasView.FirstSelectedRowIndex : 0, true); } private void RemoveMarkersMenuItem_Click(object sender, EventArgs e) { - CurrentTasMovie.Markers.RemoveAll(m => TasView.SelectedRows.Contains(m.Frame)); + CurrentTasMovie.Markers.RemoveAll(m => TasView.IsRowSelected(m.Frame)); MarkerControl.UpdateMarkerCount(); RefreshDialog(); } @@ -1405,7 +1406,7 @@ namespace BizHawk.Client.EmuHawk StartNewProjectFromNowMenuItem.Visible = TasView.SelectedRows.Count() == 1 - && TasView.SelectedRows.Contains(Emulator.Frame) + && TasView.IsRowSelected(Emulator.Frame) && !CurrentTasMovie.StartsFromSaveRam; StartANewProjectFromSaveRamMenuItem.Visible = @@ -1414,7 +1415,7 @@ namespace BizHawk.Client.EmuHawk && !CurrentTasMovie.StartsFromSavestate; StartFromNowSeparator.Visible = StartNewProjectFromNowMenuItem.Visible || StartANewProjectFromSaveRamMenuItem.Visible; - RemoveMarkersContextMenuItem.Enabled = CurrentTasMovie.Markers.Any(m => TasView.SelectedRows.Contains(m.Frame)); // Disable the option to remove markers if no markers are selected (FCEUX does this). + RemoveMarkersContextMenuItem.Enabled = CurrentTasMovie.Markers.Any(m => TasView.IsRowSelected(m.Frame)); // Disable the option to remove markers if no markers are selected (FCEUX does this). CancelSeekContextMenuItem.Enabled = MainForm.PauseOnFrame.HasValue; BranchContextMenuItem.Visible = TasView.CurrentCell?.RowIndex == Emulator.Frame; diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs index 91e38794d9..a4fa5fb03c 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs @@ -686,7 +686,7 @@ namespace BizHawk.Client.EmuHawk var loadZone = new MovieZone(path, MainForm, Emulator, MovieSession, Tools) { - Start = TasView.FirstSelectedIndex.Value + Start = TasView.SelectionStartIndex!.Value, }; loadZone.PlaceZone(CurrentTasMovie, Config); } @@ -981,7 +981,8 @@ namespace BizHawk.Client.EmuHawk private void SetSplicer() { // TODO: columns selected? - var temp = $"Selected: {TasView.SelectedRows.Count()} {(TasView.SelectedRows.Count() == 1 ? "frame" : "frames")}, States: {CurrentTasMovie.TasStateManager.Count}"; + var selectedRowCount = TasView.SelectedRows.Count(); + var temp = $"Selected: {selectedRowCount} {(selectedRowCount == 1 ? "frame" : "frames")}, States: {CurrentTasMovie.TasStateManager.Count}"; if (_tasClipboard.Any()) temp += $", Clipboard: {_tasClipboard.Count} {(_tasClipboard.Count == 1 ? "frame" : "frames")}"; SplicerStatusLabel.Text = temp; } @@ -1014,7 +1015,7 @@ namespace BizHawk.Client.EmuHawk { if (insertionFrame <= CurrentTasMovie.InputLogLength) { - bool needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame; + var needsToRollback = TasView.SelectionStartIndex < Emulator.Frame; CurrentTasMovie.InsertEmptyFrame(insertionFrame, numberOfFrames); @@ -1055,7 +1056,7 @@ namespace BizHawk.Client.EmuHawk { if (beginningFrame < CurrentTasMovie.InputLogLength) { - bool needsToRollback = TasView.FirstSelectedIndex < Emulator.Frame; + var needsToRollback = TasView.SelectionStartIndex < Emulator.Frame; int last = Math.Min(beginningFrame + numberOfFrames, CurrentTasMovie.InputLogLength); for (int i = beginningFrame; i < last; i++) { diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/UndoHistoryForm.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/UndoHistoryForm.cs index ccc3318a72..bf41f39b6b 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/UndoHistoryForm.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/UndoHistoryForm.cs @@ -1,6 +1,5 @@ using System; using System.Drawing; -using System.Linq; using System.Windows.Forms; using BizHawk.Client.Common; @@ -85,9 +84,8 @@ namespace BizHawk.Client.EmuHawk _tastudio.RefreshDialog(); } - private int SelectedItem => HistoryView.SelectedRows.Any() - ? HistoryView.SelectedRows.First() - : -1; + private int SelectedItem + => HistoryView.AnyRowsSelected ? HistoryView.FirstSelectedRowIndex : -1; private void UndoToHere(int index) { diff --git a/src/BizHawk.Client.EmuHawk/tools/TraceLogger.cs b/src/BizHawk.Client.EmuHawk/tools/TraceLogger.cs index 1f72c60743..9461097321 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TraceLogger.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TraceLogger.cs @@ -321,17 +321,13 @@ namespace BizHawk.Client.EmuHawk private void CopyMenuItem_Click(object sender, EventArgs e) { - var indices = TraceView.SelectedRows.ToList(); - - if (indices.Count > 0) + if (!TraceView.AnyRowsSelected) return; + StringBuilder blob = new(); + foreach (var info in TraceView.SelectedRows.Select(index => _instructions[index])) { - var blob = new StringBuilder(); - foreach (int index in indices) - { - blob.Append($"{_instructions[index].Disassembly} {_instructions[index].RegisterInfo}\n"); - } - Clipboard.SetDataObject(blob.ToString()); + blob.AppendFormat("{0} {1}\n", info.Disassembly, info.RegisterInfo); } + Clipboard.SetDataObject(blob.ToString()); } private void SelectAllMenuItem_Click(object sender, EventArgs e) diff --git a/src/BizHawk.Client.EmuHawk/tools/Watch/RamSearch.cs b/src/BizHawk.Client.EmuHawk/tools/Watch/RamSearch.cs index 4ba37bc8c5..fd00087ec6 100644 --- a/src/BizHawk.Client.EmuHawk/tools/Watch/RamSearch.cs +++ b/src/BizHawk.Client.EmuHawk/tools/Watch/RamSearch.cs @@ -421,8 +421,7 @@ namespace BizHawk.Client.EmuHawk PokeAddressToolBarItem.Enabled = FreezeAddressToolBarItem.Enabled = - SelectedIndices.Any() - && _searches.Domain.Writable; + WatchListView.AnyRowsSelected && _searches.Domain.Writable; } private long? CompareToValue @@ -546,6 +545,9 @@ namespace BizHawk.Client.EmuHawk private IEnumerable SelectedWatches => SelectedItems.Where(x => !x.IsSeparator); + private bool MayPokeAllSelected + => WatchListView.AnyRowsSelected && SelectedWatches.All(static w => w.Domain.Writable); + private void SetRemovedMessage(int val) { MessageLabel.Text = $"{val} {(val == 1 ? "address" : "addresses")} removed"; @@ -876,16 +878,10 @@ namespace BizHawk.Client.EmuHawk private void PokeAddress() { - if (SelectedIndices.Any()) - { - var poke = new RamPoke(DialogController, SelectedIndices.Select(t => _searches[t]), MainForm.CheatList) - { - InitialLocation = this.ChildPointToScreen(WatchListView) - }; - - this.ShowDialogWithTempMute(poke); - UpdateList(); - } + if (!WatchListView.AnyRowsSelected) return; + using RamPoke poke = new(DialogController, SelectedItems, MainForm.CheatList) { InitialLocation = this.ChildPointToScreen(WatchListView) }; + this.ShowDialogWithTempMute(poke); + UpdateList(); } private void RemoveRamWatchesFromList() @@ -944,12 +940,6 @@ namespace BizHawk.Client.EmuHawk } } - private void SelectAllAddresses() - { - if (SelectedIndices.Count() == WatchListView.RowCount) WatchListView.DeselectAll(); - else WatchListView.SelectAll(); - } - public class RamSearchSettings { public RamSearchSettings() @@ -1196,12 +1186,11 @@ namespace BizHawk.Client.EmuHawk RemoveMenuItem.Enabled = AddToRamWatchMenuItem.Enabled = - SelectedIndices.Any(); + WatchListView.AnyRowsSelected; PokeAddressMenuItem.Enabled = FreezeAddressMenuItem.Enabled = - SelectedIndices.Any() && - SelectedWatches.All(w => w.Domain.Writable); + MayPokeAllSelected; UndoMenuItem.Enabled = ClearUndoMenuItem.Enabled = @@ -1299,9 +1288,7 @@ namespace BizHawk.Client.EmuHawk } private void SelectAllMenuItem_Click(object sender, EventArgs e) - { - SelectAllAddresses(); - } + => WatchListView.ToggleSelectAll(); private void SettingsSubMenu_DropDownOpened(object sender, EventArgs e) { @@ -1379,27 +1366,17 @@ namespace BizHawk.Client.EmuHawk FreezeContextMenuItem.Visible = ContextMenuSeparator2.Visible = ViewInHexEditorContextMenuItem.Visible = - SelectedIndices.Any(); + WatchListView.AnyRowsSelected; PokeContextMenuItem.Enabled = FreezeContextMenuItem.Visible = - SelectedIndices.Any() && - SelectedWatches.All(w => w.Domain.Writable); + MayPokeAllSelected; - UnfreezeAllContextMenuItem.Visible = MainForm.CheatList.ActiveCount > 0; + UnfreezeAllContextMenuItem.Visible = MainForm.CheatList.AnyActive; - ContextMenuSeparator3.Visible = SelectedIndices.Any() || (MainForm.CheatList.ActiveCount > 0); + ContextMenuSeparator3.Visible = WatchListView.AnyRowsSelected || MainForm.CheatList.AnyActive; - var allCheats = true; - foreach (var index in SelectedIndices) - { - if (!MainForm.CheatList.IsActive(_settings.Domain, _searches[index].Address)) - { - allCheats = false; - } - } - - if (allCheats) + if (SelectedItems.All(watch => MainForm.CheatList.IsActive(_settings.Domain, watch.Address))) { FreezeContextMenuItem.Text = "&Unfreeze Address"; FreezeContextMenuItem.Image = Resources.Unfreeze; @@ -1658,12 +1635,11 @@ namespace BizHawk.Client.EmuHawk { RemoveToolBarItem.Enabled = AddToRamWatchToolBarItem.Enabled = - SelectedIndices.Any(); + WatchListView.AnyRowsSelected; PokeAddressToolBarItem.Enabled = FreezeAddressToolBarItem.Enabled = - SelectedIndices.Any() - && _searches.Domain.Writable; + WatchListView.AnyRowsSelected && _searches.Domain.Writable; } private void WatchListView_Enter(object sender, EventArgs e) @@ -1688,7 +1664,7 @@ namespace BizHawk.Client.EmuHawk private void WatchListView_MouseDoubleClick(object sender, MouseEventArgs e) { - if (SelectedIndices.Any()) + if (WatchListView.AnyRowsSelected) { AddToRamWatch(); } diff --git a/src/BizHawk.Client.EmuHawk/tools/Watch/RamWatch.cs b/src/BizHawk.Client.EmuHawk/tools/Watch/RamWatch.cs index bb59bbd46e..7b4dfda2c5 100644 --- a/src/BizHawk.Client.EmuHawk/tools/Watch/RamWatch.cs +++ b/src/BizHawk.Client.EmuHawk/tools/Watch/RamWatch.cs @@ -142,6 +142,9 @@ namespace BizHawk.Client.EmuHawk private IEnumerable SelectedWatches => SelectedItems.Where(x => !x.IsSeparator); private IEnumerable SelectedSeparators => SelectedItems.Where(x => x.IsSeparator); + private bool MayPokeAllSelected + => WatchListView.AnyRowsSelected && SelectedWatches.All(static w => w.Domain.Writable); + public IEnumerable Watches => _watches.Where(x => !x.IsSeparator); protected override void GeneralUpdate() => FrameUpdate(); @@ -233,8 +236,7 @@ namespace BizHawk.Client.EmuHawk GeneralUpdate(); PokeAddressToolBarItem.Enabled = FreezeAddressToolBarItem.Enabled = - SelectedIndices.Any() - && SelectedWatches.All(w => w.Domain.Writable); + MayPokeAllSelected; } } } @@ -507,8 +509,7 @@ namespace BizHawk.Client.EmuHawk PokeAddressToolBarItem.Enabled = FreezeAddressToolBarItem.Enabled = - SelectedIndices.Any() && - SelectedWatches.All(w => w.Domain.Writable); + MayPokeAllSelected; } } @@ -704,14 +705,13 @@ namespace BizHawk.Client.EmuHawk MoveDownMenuItem.Enabled = MoveTopMenuItem.Enabled = MoveBottomMenuItem.Enabled = - SelectedIndices.Any(); + WatchListView.AnyRowsSelected; SplitWatchMenuItem.Enabled = MaySplitAllSelected; PokeAddressMenuItem.Enabled = FreezeAddressMenuItem.Enabled = - SelectedIndices.Any() && - SelectedWatches.All(w => w.Domain.Writable); + MayPokeAllSelected; } private MemoryDomain _currentDomain; @@ -756,19 +756,11 @@ namespace BizHawk.Client.EmuHawk private void RemoveWatchMenuItem_Click(object sender, EventArgs e) { - var indices = SelectedIndices - .OrderByDescending(i => i) - .ToList(); - if (indices.Any()) - { - foreach (var index in indices) - { - _watches.RemoveAt(index); - } - WatchListView.RowCount = _watches.Count; - GeneralUpdate(); - UpdateWatchCount(); - } + if (!WatchListView.AnyRowsSelected) return; + foreach (var index in SelectedIndices.OrderByDescending(static i => i).ToList()) _watches.RemoveAt(index); + WatchListView.RowCount = _watches.Count; + GeneralUpdate(); + UpdateWatchCount(); } private void DuplicateWatchMenuItem_Click(object sender, EventArgs e) @@ -840,16 +832,7 @@ namespace BizHawk.Client.EmuHawk private void InsertSeparatorMenuItem_Click(object sender, EventArgs e) { - var indexes = SelectedIndices.ToList(); - if (indexes.Any()) - { - _watches.Insert(indexes[0], SeparatorWatch.Instance); - } - else - { - _watches.Add(SeparatorWatch.Instance); - } - + _watches.Insert(WatchListView.SelectionStartIndex ?? _watches.Count, SeparatorWatch.Instance); WatchListView.RowCount = _watches.Count; Changes(); UpdateWatchCount(); @@ -975,9 +958,7 @@ namespace BizHawk.Client.EmuHawk } private void SelectAllMenuItem_Click(object sender, EventArgs e) - { - WatchListView.SelectAll(); - } + => WatchListView.ToggleSelectAll(); private void SettingsSubMenu_DropDownOpened(object sender, EventArgs e) { @@ -1051,8 +1032,7 @@ namespace BizHawk.Client.EmuHawk UpdateStatusBar(); PokeAddressToolBarItem.Enabled = FreezeAddressToolBarItem.Enabled = - SelectedIndices.Any() && - SelectedWatches.All(w => w.Domain.Writable); + MayPokeAllSelected; } private void ColumnToggleCallback() @@ -1072,12 +1052,11 @@ namespace BizHawk.Client.EmuHawk } } - private bool MaySplitAllSelected => SelectedIndices.Any() && SelectedWatches.All(static w => w.IsSplittable); + private bool MaySplitAllSelected + => WatchListView.AnyRowsSelected && SelectedWatches.All(static w => w.IsSplittable); private void ListViewContextMenu_Opening(object sender, CancelEventArgs e) { - var indexes = WatchListView.SelectedRows.ToList(); - EditContextMenuItem.Visible = RemoveContextMenuItem.Visible = DuplicateContextMenuItem.Visible = @@ -1093,7 +1072,7 @@ namespace BizHawk.Client.EmuHawk MoveDownContextMenuItem.Visible = MoveTopContextMenuItem.Visible = MoveBottomContextMenuItem.Visible = - indexes.Count > 0; + WatchListView.AnyRowsSelected; ReadBreakpointContextMenuItem.Visible = WriteBreakpointContextMenuItem.Visible = @@ -1107,8 +1086,7 @@ namespace BizHawk.Client.EmuHawk PokeContextMenuItem.Enabled = FreezeContextMenuItem.Visible = - SelectedIndices.Any() - && SelectedWatches.All(w => w.Domain.Writable); + MayPokeAllSelected; var allCheats = SelectedWatches.All(x => MainForm.CheatList.IsActive(x.Domain, x.Address)); @@ -1123,11 +1101,11 @@ namespace BizHawk.Client.EmuHawk FreezeContextMenuItem.Image = Resources.Freeze; } - UnfreezeAllContextMenuItem.Visible = MainForm.CheatList.ActiveCount > 0; + UnfreezeAllContextMenuItem.Visible = MainForm.CheatList.AnyActive; ViewInHexEditorContextMenuItem.Visible = SelectedWatches.Count() == 1; - newToolStripMenuItem.Visible = indexes.Count == 0; + newToolStripMenuItem.Visible = !WatchListView.AnyRowsSelected; } private void UnfreezeAllContextMenuItem_Click(object sender, EventArgs e) @@ -1207,8 +1185,7 @@ namespace BizHawk.Client.EmuHawk { PokeAddressToolBarItem.Enabled = FreezeAddressToolBarItem.Enabled = - SelectedIndices.Any() - && SelectedWatches.All(w => w.Domain.Writable); + MayPokeAllSelected; } private void WatchListView_MouseDoubleClick(object sender, MouseEventArgs e)