From 50dd7ad8284f726482be6421542f16837699a3c7 Mon Sep 17 00:00:00 2001 From: Jakub Melka Date: Sun, 22 Dec 2024 16:06:35 +0100 Subject: [PATCH] Issue #228: [feature] reverse pages order --- Pdf4QtPageMaster/mainwindow.cpp | 14 +++- Pdf4QtPageMaster/mainwindow.h | 1 + Pdf4QtPageMaster/mainwindow.ui | 26 ++++-- Pdf4QtPageMaster/pageitemmodel.cpp | 29 +++++++ Pdf4QtPageMaster/pageitemmodel.h | 1 + Pdf4QtPageMaster/resources.qrc | 1 + .../resources/regroup-reverse.svg | 79 +++++++++++++++++++ RELEASES.txt | 1 + 8 files changed, 143 insertions(+), 9 deletions(-) create mode 100644 Pdf4QtPageMaster/resources/regroup-reverse.svg diff --git a/Pdf4QtPageMaster/mainwindow.cpp b/Pdf4QtPageMaster/mainwindow.cpp index b5b9178..ccba902 100644 --- a/Pdf4QtPageMaster/mainwindow.cpp +++ b/Pdf4QtPageMaster/mainwindow.cpp @@ -95,6 +95,7 @@ MainWindow::MainWindow(QWidget* parent) : ui->actionAbout->setData(int(Operation::About)); ui->actionInvert_Selection->setData(int(Operation::InvertSelection)); ui->actionRegroup_Even_Odd->setData(int(Operation::RegroupEvenOdd)); + ui->actionRegroup_Reverse->setData(int(Operation::RegroupReversed)); ui->actionRegroup_by_Page_Pairs->setData(int(Operation::RegroupPaired)); ui->actionRegroup_by_Outline->setData(int(Operation::RegroupOutline)); ui->actionRegroup_by_Alternating_Pages->setData(int(Operation::RegroupAlternatingPages)); @@ -164,7 +165,7 @@ MainWindow::MainWindow(QWidget* parent) : selectToolbar->addActions({ ui->actionSelect_None, ui->actionSelect_All, ui->actionSelect_Even, ui->actionSelect_Odd, ui->actionSelect_Portrait, ui->actionSelect_Landscape, ui->actionInvert_Selection }); QToolBar* regroupToolbar = addToolBar(tr("&Regroup")); regroupToolbar->setObjectName("regroup_toolbar"); - regroupToolbar->addActions({ ui->actionRegroup_Even_Odd, ui->actionRegroup_by_Page_Pairs, ui->actionRegroup_by_Outline, ui->actionRegroup_by_Alternating_Pages, ui->actionRegroup_by_Alternating_Pages_Reversed_Order }); + regroupToolbar->addActions({ ui->actionRegroup_Even_Odd, ui->actionRegroup_by_Page_Pairs, ui->actionRegroup_by_Outline, ui->actionRegroup_by_Alternating_Pages, ui->actionRegroup_by_Alternating_Pages_Reversed_Order, ui->actionRegroup_Reverse }); QToolBar* zoomToolbar = addToolBar(tr("&Zoom")); zoomToolbar->setObjectName("zoom_toolbar"); zoomToolbar->addActions({ ui->actionZoom_In, ui->actionZoom_Out }); @@ -290,6 +291,7 @@ void MainWindow::onWorkspaceCustomContextMenuRequested(const QPoint& point) regroupMenu->addAction(ui->actionRegroup_by_Alternating_Pages_Reversed_Order); regroupMenu->addAction(ui->actionRegroup_by_Page_Pairs); regroupMenu->addAction(ui->actionRegroup_by_Outline); + regroupMenu->addAction(ui->actionRegroup_Reverse); contextMenu->addSeparator(); contextMenu->addAction(ui->actionGroup); contextMenu->addAction(ui->actionUngroup); @@ -485,6 +487,9 @@ bool MainWindow::canPerformOperation(Operation operation) const return info.isDocumentOnly(); } + case Operation::RegroupReversed: + return !isModelEmpty && !selection.isEmpty(); + case Operation::RegroupPaired: return !isModelEmpty && !selection.isEmpty(); @@ -908,6 +913,13 @@ void MainWindow::performOperation(Operation operation) break; } + case Operation::RegroupReversed: + { + QModelIndexList indexes = ui->documentItemsView->selectionModel()->selection().indexes(); + m_model->regroupReversed(indexes); + break; + } + case Operation::RegroupEvenOdd: { QModelIndexList indexes = ui->documentItemsView->selectionModel()->selection().indexes(); diff --git a/Pdf4QtPageMaster/mainwindow.h b/Pdf4QtPageMaster/mainwindow.h index 83a6191..57f1b88 100644 --- a/Pdf4QtPageMaster/mainwindow.h +++ b/Pdf4QtPageMaster/mainwindow.h @@ -94,6 +94,7 @@ public: RegroupOutline, RegroupAlternatingPages, RegroupAlternatingPagesReversed, + RegroupReversed, GetSource, BecomeSponsor, diff --git a/Pdf4QtPageMaster/mainwindow.ui b/Pdf4QtPageMaster/mainwindow.ui index 466e4ba..e731e33 100644 --- a/Pdf4QtPageMaster/mainwindow.ui +++ b/Pdf4QtPageMaster/mainwindow.ui @@ -21,28 +21,28 @@ - Qt::CustomContextMenu + Qt::ContextMenuPolicy::CustomContextMenu true - QAbstractItemView::DragDrop + QAbstractItemView::DragDropMode::DragDrop - Qt::MoveAction + Qt::DropAction::MoveAction - QAbstractItemView::ExtendedSelection + QAbstractItemView::SelectionMode::ExtendedSelection - QListView::LeftToRight + QListView::Flow::LeftToRight - QListView::IconMode + QListView::ViewMode::IconMode - Qt::AlignCenter + Qt::AlignmentFlag::AlignCenter @@ -54,7 +54,7 @@ 0 0 800 - 21 + 22 @@ -141,6 +141,7 @@ + @@ -524,6 +525,15 @@ Regroup by &Even/Odd Pages + + + + :/pdfpagemaster/resources/regroup-reverse.svg:/pdfpagemaster/resources/regroup-reverse.svg + + + Regroup by Re&verse + + diff --git a/Pdf4QtPageMaster/pageitemmodel.cpp b/Pdf4QtPageMaster/pageitemmodel.cpp index 3f35ea1..36197d4 100644 --- a/Pdf4QtPageMaster/pageitemmodel.cpp +++ b/Pdf4QtPageMaster/pageitemmodel.cpp @@ -583,6 +583,35 @@ void PageItemModel::rotateRight(const QModelIndexList& list) Q_EMIT dataChanged(index(rowMin, 0, QModelIndex()), index(rowMax, 0, QModelIndex())); } +void PageItemModel::regroupReversed(const QModelIndexList& list) +{ + if (list.empty()) + { + return; + } + + Modifier modifier(this); + + std::vector pageGroupItems = m_pageGroupItems; + std::vector extractedItems = extractItems(pageGroupItems, list); + std::reverse(extractedItems.begin(), extractedItems.end()); + + if (!extractedItems.empty()) + { + PageGroupItem item; + item.groups = std::move(extractedItems); + updateItemCaptionAndTags(item); + pageGroupItems.emplace_back(std::move(item)); + } + + if (pageGroupItems != m_pageGroupItems) + { + beginResetModel(); + m_pageGroupItems = std::move(pageGroupItems); + endResetModel(); + } +} + PageItemModel::SelectionInfo PageItemModel::getSelectionInfo(const QModelIndexList& list) const { SelectionInfo info; diff --git a/Pdf4QtPageMaster/pageitemmodel.h b/Pdf4QtPageMaster/pageitemmodel.h index 8f27e3b..a6eb53a 100644 --- a/Pdf4QtPageMaster/pageitemmodel.h +++ b/Pdf4QtPageMaster/pageitemmodel.h @@ -190,6 +190,7 @@ public: SelectionInfo getSelectionInfo(const QModelIndexList& list) const; + void regroupReversed(const QModelIndexList& list); void regroupEvenOdd(const QModelIndexList& list); void regroupPaired(const QModelIndexList& list); void regroupOutline(const QModelIndexList& list, const std::vector& indices); diff --git a/Pdf4QtPageMaster/resources.qrc b/Pdf4QtPageMaster/resources.qrc index 89983d1..1da075f 100644 --- a/Pdf4QtPageMaster/resources.qrc +++ b/Pdf4QtPageMaster/resources.qrc @@ -40,5 +40,6 @@ resources/bookmark.svg resources/wallet.svg resources/regroup-outline.svg + resources/regroup-reverse.svg diff --git a/Pdf4QtPageMaster/resources/regroup-reverse.svg b/Pdf4QtPageMaster/resources/regroup-reverse.svg new file mode 100644 index 0000000..21b3556 --- /dev/null +++ b/Pdf4QtPageMaster/resources/regroup-reverse.svg @@ -0,0 +1,79 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/RELEASES.txt b/RELEASES.txt index 8f380f8..422f551 100644 --- a/RELEASES.txt +++ b/RELEASES.txt @@ -1,4 +1,5 @@ CURRENT: + - Issue #228: [feature] reverse pages order - Issue #222: UnitTests fails several tests - Issue #207: Zoom to Cursor (Zoom Anchoring) - Issue #206: Name of the executable / command