Issue #228: [feature] reverse pages order

This commit is contained in:
Jakub Melka 2024-12-22 16:06:35 +01:00
parent c1fd0cdd4a
commit 50dd7ad828
8 changed files with 143 additions and 9 deletions

View File

@ -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();

View File

@ -94,6 +94,7 @@ public:
RegroupOutline,
RegroupAlternatingPages,
RegroupAlternatingPagesReversed,
RegroupReversed,
GetSource,
BecomeSponsor,

View File

@ -21,28 +21,28 @@
<item>
<widget class="QListView" name="documentItemsView">
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
<enum>Qt::ContextMenuPolicy::CustomContextMenu</enum>
</property>
<property name="dragEnabled">
<bool>true</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DragDrop</enum>
<enum>QAbstractItemView::DragDropMode::DragDrop</enum>
</property>
<property name="defaultDropAction">
<enum>Qt::MoveAction</enum>
<enum>Qt::DropAction::MoveAction</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
<enum>QAbstractItemView::SelectionMode::ExtendedSelection</enum>
</property>
<property name="flow">
<enum>QListView::LeftToRight</enum>
<enum>QListView::Flow::LeftToRight</enum>
</property>
<property name="viewMode">
<enum>QListView::IconMode</enum>
<enum>QListView::ViewMode::IconMode</enum>
</property>
<property name="itemAlignment">
<set>Qt::AlignCenter</set>
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
@ -54,7 +54,7 @@
<x>0</x>
<y>0</y>
<width>800</width>
<height>21</height>
<height>22</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@ -141,6 +141,7 @@
<addaction name="actionRegroup_by_Outline"/>
<addaction name="actionRegroup_by_Alternating_Pages"/>
<addaction name="actionRegroup_by_Alternating_Pages_Reversed_Order"/>
<addaction name="actionRegroup_Reverse"/>
</widget>
<addaction name="menuFile"/>
<addaction name="menuEdit"/>
@ -524,6 +525,15 @@
<string>Regroup by &amp;Even/Odd Pages</string>
</property>
</action>
<action name="actionRegroup_Reverse">
<property name="icon">
<iconset resource="resources.qrc">
<normaloff>:/pdfpagemaster/resources/regroup-reverse.svg</normaloff>:/pdfpagemaster/resources/regroup-reverse.svg</iconset>
</property>
<property name="text">
<string>Regroup by Re&amp;verse</string>
</property>
</action>
<action name="actionRegroup_by_Page_Pairs">
<property name="icon">
<iconset resource="resources.qrc">

View File

@ -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<PageGroupItem> pageGroupItems = m_pageGroupItems;
std::vector<PageGroupItem::GroupItem> 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;

View File

@ -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<pdf::PDFInteger>& indices);

View File

@ -40,5 +40,6 @@
<file>resources/bookmark.svg</file>
<file>resources/wallet.svg</file>
<file>resources/regroup-outline.svg</file>
<file>resources/regroup-reverse.svg</file>
</qresource>
</RCC>

View File

@ -0,0 +1,79 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="24"
viewBox="0 0 24 24"
version="1.1"
id="svg12"
sodipodi:docname="regroup-reverse.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<metadata
id="metadata18">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs16" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="3840"
inkscape:window-height="2035"
id="namedview14"
showgrid="false"
inkscape:zoom="75.52"
inkscape:cx="16.066795"
inkscape:cy="14.361849"
inkscape:window-x="-13"
inkscape:window-y="-13"
inkscape:window-maximized="1"
inkscape:current-layer="svg12" />
<!-- Základní stránky -->
<!-- Šipka obrácení -->
<rect
style="fill:none;stroke:#000000;stroke-width:0.40000001"
x="10.29036"
y="5.7347455"
width="8"
height="12"
id="rect2" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.40000001"
x="11.29036"
y="6.7347455"
width="8"
height="12"
id="rect4" />
<path
style="fill:#000000;stroke-width:0.2"
inkscape:connector-curvature="0"
d="m 7.0652542,15.734746 q -2,-4 0,-8.0000003 h -1 l 2,-3 1.9999998,3 H 9.0652542 q -2,4.0000003 0,8.0000003 z"
id="path6" />
<g
id="g10">
<path
d="m 22.077,17.182 c 0.128,-0.621 0.193,-1.346 0.203,-2.216 V 9.031 C 22.268,8.141 22.204,7.438 22.076,6.821 21.824,5.428 21.317,4.36 20.526,3.55 19.936,2.931 19.137,2.458 18.149,2.145 17.244,1.864 16.128,1.72 14.838,1.72 l -5.68,0.002 c -5.146,0 -7.439,2.293 -7.439,7.438 v 5.689 c 0,5.14 2.295,7.431 7.439,7.431 h 5.681 c 1.291,0 2.403,-0.146 3.312,-0.425 0.98,-0.307 1.762,-0.764 2.379,-1.397 0.785,-0.808 1.291,-1.878 1.547,-3.276 z m -3.857,2.952 c -0.643,0.284 -1.443,0.446 -2.451,0.496 -0.304,0.021 -0.604,0.031 -0.927,0.031 H 9.161 c -4.354,0 -5.821,-1.466 -5.821,-5.812 v -5.69 c 0,-4.323 1.439,-5.79 5.714,-5.811 l 0.108,-0.02 h 5.68 c 0.33,0 0.646,0.011 0.938,0.03 1.016,0.062 1.818,0.228 2.453,0.509 1.193,0.507 1.901,1.432 2.228,2.911 0.131,0.631 0.196,1.367 0.205,2.252 v 5.937 c -0.009,0.889 -0.074,1.624 -0.205,2.254 -0.326,1.481 -1.038,2.407 -2.241,2.913 z"
id="path8"
inkscape:connector-curvature="0"
style="fill:#292d32" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -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