Skip to content

Commit 1c7d396

Browse files
authored
Merge pull request #115 from pablogventura/fix/issues-51-and-84
Fix Follow page auto-toggle (#51) and every-other scope order (#84)
2 parents cc5b626 + c093aea commit 1c7d396

13 files changed

Lines changed: 426 additions & 68 deletions

File tree

.github/workflows/cmake.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ name: CMake
22

33
on:
44
push:
5-
branches: [ "master" ]
5+
branches: [master, main]
66
pull_request:
7-
branches: [ "master" ]
7+
branches: [master, main]
88

99
env:
1010
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
@@ -24,10 +24,10 @@ jobs:
2424
run: |
2525
sudo apt-get update
2626
sudo apt-get install -y --fix-missing \
27-
gcc g++ cmake \
27+
build-essential gcc g++ cmake \
2828
libjpeg-dev libpng-dev \
29-
libtiff6 libtiff5-dev \
30-
libboost-test-dev \
29+
libtiff6 libtiff-dev zlib1g-dev \
30+
libboost-test-dev libboost-dev \
3131
qtbase5-dev libqt5svg5-dev \
3232
qttools5-dev qttools5-dev-tools \
3333
libqt5opengl5-dev \

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,9 @@ Go to [this repository](https://github.com/ScanTailor-Advanced/scantailor-libs-b
7676

7777
**Linux – Wayland (issue #97):** If you see rendering issues (blank or corrupted windows) when running under Wayland, try starting the application with `QT_QPA_PLATFORM=xcb` to use the X11 compatibility layer.
7878

79-
**Linux – Flatpak / Flathub (issue #105):** A Flatpak manifest is provided in `flatpak/org.scantailor.Advanced.json`. To build locally: `flatpak-builder --user --force-clean build flatpak/org.scantailor.Advanced.json` (requires `flatpak` and `flatpak-builder`). To publish on Flathub, use a distinct application ID (e.g. `org.scantailor.Advanced`) so it does not conflict with the original ScanTailor package.
79+
**Linux – Flatpak / Flathub (issue #105):** End users should prefer **pre-built** binaries from [GitHub Releases](https://github.com/ScanTailor-Advanced/scantailor-advanced/releases) when available (`.deb` / AppImage on tagged releases). A Flatpak manifest for **maintainers** is in `flatpak/org.scantailor.Advanced.json` (`flatpak-builder --user --force-clean build flatpak/org.scantailor.Advanced.json`). Publishing on Flathub needs a **new** application ID (e.g. `org.scantailor.Advanced`) so it does not replace the legacy `com.github._4lex4.*` app.
80+
81+
**Community examples / test data:** See also [scantailor-testing](https://github.com/ImageProcessing-ElectronicPublications/scantailor-testing) (community repository; issue [#43](https://github.com/ScanTailor-Advanced/scantailor-advanced/issues/43)).
8082

8183
## About this fork
8284

scripts/post_issue_followups.py

Lines changed: 354 additions & 0 deletions
Large diffs are not rendered by default.

src/app/MainWindow.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -956,7 +956,8 @@ void MainWindow::goPrevSelectedPage() {
956956
}
957957

958958
void MainWindow::goToPage(const PageId& pageId, const ThumbnailSequence::SelectionAction selectionAction) {
959-
focusButton->setChecked(true);
959+
// Do not toggle Follow page here (issue #51): keyboard navigation used to force it on while mouse
960+
// selection did not. Batch processing and similar flows set focus explicitly where needed.
960961

961962
m_thumbSequence->setSelection(pageId, selectionAction);
962963

src/core/PageSequence.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
#include "PageSequence.h"
55

6+
#include <vector>
7+
68
void PageSequence::append(const PageInfo& pageInfo) {
79
m_pages.push_back(pageInfo);
810
}
@@ -78,6 +80,48 @@ std::set<PageId> PageSequence::selectEveryOther(const PageId& base) const {
7880
return selection;
7981
}
8082

83+
std::set<PageId> PageSequence::selectThisPageAndFollowingEveryOther(const PageId& page) const {
84+
std::set<PageId> selection;
85+
const int baseIdx = pageNo(page);
86+
if (baseIdx < 0) {
87+
return selection;
88+
}
89+
for (size_t i = static_cast<size_t>(baseIdx); i < m_pages.size(); i += 2) {
90+
selection.insert(m_pages[i].id());
91+
}
92+
return selection;
93+
}
94+
95+
std::set<PageId> PageSequence::selectEveryOtherInSubsetFromPage(const PageId& base,
96+
const std::set<PageId>& subset) const {
97+
std::set<PageId> selection;
98+
if (subset.empty()) {
99+
return selection;
100+
}
101+
std::vector<PageId> ordered;
102+
ordered.reserve(subset.size());
103+
for (size_t i = 0; i < m_pages.size(); ++i) {
104+
const PageId id = m_pages[i].id();
105+
if (subset.count(id) != 0) {
106+
ordered.push_back(id);
107+
}
108+
}
109+
int start = -1;
110+
for (size_t i = 0; i < ordered.size(); ++i) {
111+
if (ordered[i] == base) {
112+
start = static_cast<int>(i);
113+
break;
114+
}
115+
}
116+
if (start < 0) {
117+
return selection;
118+
}
119+
for (int i = start; i < static_cast<int>(ordered.size()); i += 2) {
120+
selection.insert(ordered[i]);
121+
}
122+
return selection;
123+
}
124+
81125
std::vector<PageInfo>::iterator PageSequence::begin() {
82126
return m_pages.begin();
83127
}

src/core/PageSequence.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,15 @@ class PageSequence {
2929

3030
std::set<PageId> selectEveryOther(const PageId& base) const;
3131

32+
/** Current page and every second page after it in thumbnail/document order (issue #84). */
33+
std::set<PageId> selectThisPageAndFollowingEveryOther(const PageId& page) const;
34+
35+
/**
36+
* Among pages in \p subset, in document order, take \p base and every second page after it
37+
* within that ordered subset (issue #84; fixes std::set iteration order in some Apply dialogs).
38+
*/
39+
std::set<PageId> selectEveryOtherInSubsetFromPage(const PageId& base, const std::set<PageId>& subset) const;
40+
3241
std::vector<PageInfo>::iterator begin();
3342

3443
std::vector<PageInfo>::iterator end();

src/core/filters/deskew/ApplyDialog.cpp

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33

44
#include "ApplyDialog.h"
55

6-
#include <iostream>
7-
86
#include "PageSelectionAccessor.h"
97

108
namespace deskew {
@@ -49,22 +47,10 @@ void ApplyDialog::onSubmit() {
4947
m_pages.selectEveryOther(m_curPage).swap(pages);
5048
emit appliedTo(pages);
5149
} else if (thisEveryOtherRB->isChecked()) {
52-
std::set<PageId> tmp;
53-
m_pages.selectPagePlusFollowers(m_curPage).swap(tmp);
54-
auto it = tmp.begin();
55-
for (int i = 0; it != tmp.end(); ++it, ++i) {
56-
if (i % 2 == 0) {
57-
pages.insert(*it);
58-
}
59-
}
50+
m_pages.selectThisPageAndFollowingEveryOther(m_curPage).swap(pages);
6051
emit appliedTo(pages);
6152
} else if (everyOtherSelectedRB->isChecked()) {
62-
auto it = m_selectedPages.begin();
63-
for (int i = 0; it != m_selectedPages.end(); ++it, ++i) {
64-
if (i % 2 == 0) {
65-
pages.insert(*it);
66-
}
67-
}
53+
m_pages.selectEveryOtherInSubsetFromPage(m_curPage, m_selectedPages).swap(pages);
6854
emit appliedTo(pages);
6955
}
7056
accept();

src/core/filters/fix_orientation/ApplyDialog.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,7 @@ void ApplyDialog::onSubmit() {
5353
} else if (everyOtherRB->isChecked()) {
5454
m_pages.selectEveryOther(m_curPage).swap(pages);
5555
} else if (thisEveryOtherRB->isChecked()) {
56-
std::set<PageId> tmp;
57-
m_pages.selectPagePlusFollowers(m_curPage).swap(tmp);
58-
auto it = tmp.begin();
59-
for (int i = 0; it != tmp.end(); ++it, ++i) {
60-
if (i % 2 == 0) {
61-
pages.insert(*it);
62-
}
63-
}
56+
m_pages.selectThisPageAndFollowingEveryOther(m_curPage).swap(pages);
6457
} else if (everyOtherSelectedRB->isChecked()) {
6558
assert(m_selectedRanges.size() == 1);
6659
const PageRange& range = m_selectedRanges.front();

src/core/filters/page_layout/ApplyDialog.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,7 @@ void ApplyDialog::onSubmit() {
5151
} else if (everyOtherRB->isChecked()) {
5252
m_pages.selectEveryOther(m_curPage).swap(pages);
5353
} else if (thisEveryOtherRB->isChecked()) {
54-
std::set<PageId> tmp;
55-
m_pages.selectPagePlusFollowers(m_curPage).swap(tmp);
56-
auto it = tmp.begin();
57-
for (int i = 0; it != tmp.end(); ++it, ++i) {
58-
if (i % 2 == 0) {
59-
pages.insert(*it);
60-
}
61-
}
54+
m_pages.selectThisPageAndFollowingEveryOther(m_curPage).swap(pages);
6255
} else if (everyOtherSelectedRB->isChecked()) {
6356
assert(m_selectedRanges.size() == 1);
6457
const PageRange& range = m_selectedRanges.front();

src/core/filters/page_layout/ApplyMarginsDialog.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,7 @@ void ApplyMarginsDialog::onSubmit() {
5858
} else if (everyOtherRB->isChecked()) {
5959
m_pages.selectEveryOther(m_curPage).swap(pages);
6060
} else if (thisEveryOtherRB->isChecked()) {
61-
std::set<PageId> tmp;
62-
m_pages.selectPagePlusFollowers(m_curPage).swap(tmp);
63-
auto it = tmp.begin();
64-
for (int i = 0; it != tmp.end(); ++it, ++i) {
65-
if (i % 2 == 0) {
66-
pages.insert(*it);
67-
}
68-
}
61+
m_pages.selectThisPageAndFollowingEveryOther(m_curPage).swap(pages);
6962
} else if (everyOtherSelectedRB->isChecked()) {
7063
assert(m_selectedRanges.size() == 1);
7164
const PageRange& range = m_selectedRanges.front();

0 commit comments

Comments
 (0)