From 4603bf77670139d98ce6299c0aada5e0a8e76cfa Mon Sep 17 00:00:00 2001 From: RickyRister Date: Mon, 30 Dec 2024 17:02:18 -0800 Subject: [PATCH] support multiselect in deck editor --- .../src/client/tabs/tab_deck_editor.cpp | 40 ++++++++++++++----- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/cockatrice/src/client/tabs/tab_deck_editor.cpp b/cockatrice/src/client/tabs/tab_deck_editor.cpp index 7a0cfff14..bd8fd3c52 100644 --- a/cockatrice/src/client/tabs/tab_deck_editor.cpp +++ b/cockatrice/src/client/tabs/tab_deck_editor.cpp @@ -64,6 +64,7 @@ void TabDeckEditor::createDeckDock() deckView->header()->setSectionResizeMode(QHeaderView::ResizeToContents); deckView->installEventFilter(&deckViewKeySignals); deckView->setContextMenuPolicy(Qt::CustomContextMenu); + deckView->setSelectionMode(QAbstractItemView::ExtendedSelection); connect(deckView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateCardInfoRight(const QModelIndex &, const QModelIndex &))); connect(deckView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, @@ -1299,14 +1300,23 @@ void TabDeckEditor::actAddCardToSideboard() void TabDeckEditor::actRemoveCard() { - const QModelIndex ¤tIndex = deckView->selectionModel()->currentIndex(); - if (!currentIndex.isValid() || deckModel->hasChildren(currentIndex)) - return; - deckModel->removeRow(currentIndex.row(), currentIndex.parent()); + auto selectedRows = deckView->selectionModel()->selectedRows(); + std::reverse(selectedRows.begin(), selectedRows.end()); - DeckLoader *const deck = deckModel->getDeckList(); - setSaveStatus(!deck->isEmpty()); - setModified(true); + bool modified = false; + for (const auto &index : selectedRows) { + if (!index.isValid() || deckModel->hasChildren(index)) { + continue; + } + deckModel->removeRow(index.row(), index.parent()); + modified = true; + } + + if (modified) { + DeckLoader *const deck = deckModel->getDeckList(); + setSaveStatus(!deck->isEmpty()); + setModified(true); + } } void TabDeckEditor::offsetCountAtIndex(const QModelIndex &idx, int offset) @@ -1357,14 +1367,22 @@ void TabDeckEditor::copyDatabaseCellContents() void TabDeckEditor::actIncrement() { - const QModelIndex ¤tIndex = deckView->selectionModel()->currentIndex(); - offsetCountAtIndex(currentIndex, 1); + auto selectedRows = deckView->selectionModel()->selectedRows(); + + for (const auto &index : selectedRows) { + offsetCountAtIndex(index, 1); + } } void TabDeckEditor::actDecrement() { - const QModelIndex ¤tIndex = deckView->selectionModel()->currentIndex(); - offsetCountAtIndex(currentIndex, -1); + auto selectedRows = deckView->selectionModel()->selectedRows(); + // we need to iterate the rows in reverse order since there may be row deletions + std::reverse(selectedRows.begin(), selectedRows.end()); + + for (const auto &index : selectedRows) { + offsetCountAtIndex(index, -1); + } } void TabDeckEditor::setDeck(DeckLoader *_deck)