Skip to content

Commit d40f0cf

Browse files
committed
feat(app): pause automatic thumbnail reordering (#86)
Add a toolbar toggle that skips the page order provider while enabled so thumbnail refreshes keep a stable order during editing.
1 parent 04cb736 commit d40f0cf

2 files changed

Lines changed: 105 additions & 2 deletions

File tree

src/app/MainWindow.cpp

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <QDir>
1111
#include <QFileDialog>
1212
#include <QFileSystemModel>
13+
#include <QMenu>
1314
#include <QMessageBox>
1415
#include <QResource>
1516
#include <QScrollBar>
@@ -295,12 +296,19 @@ MainWindow::MainWindow()
295296
});
296297
connect(sortingOrderBtn, &QToolButton::clicked, this,
297298
[this](bool) { pageOrderingChanged(m_stages->filterAt(m_curFilter)->selectedPageOrder()); });
299+
connect(pauseSortingBtn, &QToolButton::toggled, this, [this](bool) {
300+
if (!isProjectLoaded()) {
301+
return;
302+
}
303+
resetThumbSequence(currentPageOrderProvider(), ThumbnailSequence::KEEP_SELECTION);
304+
});
298305
connect(deviationHighlightingBtn, &QToolButton::clicked, this, [this, &settings](bool checked) {
299306
settings.setHighlightDeviationEnabled(checked);
300307
m_thumbSequence->invalidateAllThumbnails();
301308
});
302309

303310
connect(actionFixDpi, SIGNAL(triggered(bool)), SLOT(fixDpiDialogRequested()));
311+
connect(actionReverseTwoPageOrder, SIGNAL(triggered(bool)), SLOT(toggleTwoPageSpreadReadingOrder()));
304312
connect(actionRelinking, SIGNAL(triggered(bool)), SLOT(showRelinkingDialog()));
305313
#ifdef ENABLE_DEBUG_FEATURES
306314
connect(actionDebug, SIGNAL(toggled(bool)), SLOT(debugToggled(bool)));
@@ -599,6 +607,10 @@ bool MainWindow::compareFiles(const QString& fpath1, const QString& fpath2) {
599607
}
600608

601609
std::shared_ptr<const PageOrderProvider> MainWindow::currentPageOrderProvider() const {
610+
if (pauseSortingBtn->isChecked()) {
611+
return nullptr;
612+
}
613+
602614
const int idx = sortOptions->currentIndex();
603615
if (idx < 0) {
604616
return nullptr;
@@ -623,6 +635,11 @@ void MainWindow::updateSortOptions() {
623635

624636
sortOptions->setVisible(sortOptions->count() > 0);
625637

638+
pauseSortingBtn->setEnabled(sortOptions->count() > 0);
639+
if (sortOptions->count() == 0) {
640+
pauseSortingBtn->setChecked(false);
641+
}
642+
626643
if (sortOptions->count() > 0) {
627644
sortOptions->setCurrentIndex(filter->selectedPageOrder());
628645
}
@@ -1016,7 +1033,8 @@ void MainWindow::pageContextMenuRequested(const PageInfo& pageInfo_, const QPoin
10161033
goToPage(pageInfo.id());
10171034
}
10181035

1019-
QMenu menu;
1036+
// Parent widget helps correct multi-monitor placement (issue #75).
1037+
QMenu menu(thumbView);
10201038

10211039
auto& iconProvider = IconProvider::getInstance();
10221040
QAction* insBefore = menu.addAction(iconProvider.getIcon("insert-before"), tr("Insert before ..."));
@@ -1036,12 +1054,24 @@ void MainWindow::pageContextMenuRequested(const PageInfo& pageInfo_, const QPoin
10361054
}
10371055
} // MainWindow::pageContextMenuRequested
10381056

1057+
void MainWindow::toggleTwoPageSpreadReadingOrder() {
1058+
if (!isProjectLoaded() || !m_pages) {
1059+
return;
1060+
}
1061+
const Qt::LayoutDirection nextDir
1062+
= (m_pages->layoutDirection() == Qt::LeftToRight) ? Qt::RightToLeft : Qt::LeftToRight;
1063+
m_pages->setLayoutDirection(nextDir);
1064+
m_outFileNameGen.setLayoutDirection(nextDir);
1065+
resetThumbSequence(currentPageOrderProvider(), ThumbnailSequence::KEEP_SELECTION);
1066+
invalidateAllThumbnails();
1067+
}
1068+
10391069
void MainWindow::pastLastPageContextMenuRequested(const QPoint& screenPos) {
10401070
if (!isProjectLoaded()) {
10411071
return;
10421072
}
10431073

1044-
QMenu menu;
1074+
QMenu menu(thumbView);
10451075
menu.addAction(IconProvider::getInstance().getIcon("insert-here"), tr("Insert here ..."));
10461076

10471077
if (menu.exec(screenPos)) {
@@ -1579,6 +1609,7 @@ void MainWindow::updateProjectActions() {
15791609
actionSaveProjectAs->setEnabled(loaded);
15801610
actionFixDpi->setEnabled(loaded);
15811611
actionRelinking->setEnabled(loaded);
1612+
actionReverseTwoPageOrder->setEnabled(loaded);
15821613
}
15831614

15841615
bool MainWindow::isBatchProcessingInProgress() const {
@@ -2157,6 +2188,7 @@ void MainWindow::setupIcons() {
21572188
gotoPageBtn->setIcon(iconProvider.getIcon("right-pointing"));
21582189
selectionModeBtn->setIcon(iconProvider.getIcon("checkbox-styled"));
21592190
thumbColumnViewBtn->setIcon(iconProvider.getIcon("column-view"));
2191+
pauseSortingBtn->setIcon(iconProvider.getIcon("stop"));
21602192
sortingOrderBtn->setIcon(iconProvider.getIcon("sorting-order"));
21612193
deviationHighlightingBtn->setIcon(iconProvider.getIcon("six-spoked-asterisk"));
21622194
diminishThumbnailsBtn->setIcon(iconProvider.getIcon("diminishing-glass"));

src/app/MainWindow.ui

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
</widget>
7676
<addaction name="actionFixDpi"/>
7777
<addaction name="actionRelinking"/>
78+
<addaction name="actionReverseTwoPageOrder"/>
7879
<addaction name="separator"/>
7980
<addaction name="actionDebug"/>
8081
<addaction name="separator"/>
@@ -713,6 +714,62 @@ QToolButton:pressed {
713714
</property>
714715
</widget>
715716
</item>
717+
<item>
718+
<widget class="QToolButton" name="pauseSortingBtn">
719+
<property name="sizePolicy">
720+
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
721+
<horstretch>0</horstretch>
722+
<verstretch>0</verstretch>
723+
</sizepolicy>
724+
</property>
725+
<property name="minimumSize">
726+
<size>
727+
<width>22</width>
728+
<height>22</height>
729+
</size>
730+
</property>
731+
<property name="maximumSize">
732+
<size>
733+
<width>22</width>
734+
<height>22</height>
735+
</size>
736+
</property>
737+
<property name="toolTip">
738+
<string>Pause automatic thumbnail reordering while thumbnails refresh.</string>
739+
</property>
740+
<property name="styleSheet">
741+
<string notr="true">QToolButton:!hover {
742+
padding: 0;
743+
border: none;
744+
background-color: transparent;
745+
}
746+
747+
QToolButton:hover {
748+
padding: 0;
749+
border: 1px solid palette(highlight);
750+
background-color: palette(base);
751+
}
752+
753+
QToolButton:pressed {
754+
padding: 0;
755+
border: 1px solid palette(highlight);
756+
background-color: palette(alternative-base);
757+
}</string>
758+
</property>
759+
<property name="text">
760+
<string notr="true"/>
761+
</property>
762+
<property name="iconSize">
763+
<size>
764+
<width>16</width>
765+
<height>16</height>
766+
</size>
767+
</property>
768+
<property name="checkable">
769+
<bool>true</bool>
770+
</property>
771+
</widget>
772+
</item>
716773
<item>
717774
<widget class="QToolButton" name="sortingOrderBtn">
718775
<property name="sizePolicy">
@@ -1214,6 +1271,20 @@ QToolButton:pressed {
12141271
<bool>false</bool>
12151272
</property>
12161273
</action>
1274+
<action name="actionReverseTwoPageOrder">
1275+
<property name="text">
1276+
<string>Reverse two-page spread order</string>
1277+
</property>
1278+
<property name="toolTip">
1279+
<string>Swap left/right page order for two-page scans (e.g. Japanese book reading order).</string>
1280+
</property>
1281+
<property name="shortcut">
1282+
<string notr="true"/>
1283+
</property>
1284+
<property name="autoRepeat">
1285+
<bool>false</bool>
1286+
</property>
1287+
</action>
12171288
<action name="actionSwitchFilter1">
12181289
<property name="text">
12191290
<string>Switch filter to orientation</string>

0 commit comments

Comments
 (0)