Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mulit page view #4182

Merged
merged 1 commit into from
Apr 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/Commands.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ Cmd* enum (e.g. CmdOpen) and a human-readable name (not used yet).
V(CmdSinglePageView, "Single Page View") \
V(CmdFacingView, "Facing View") \
V(CmdBookView, "Book View") \
V(CmdMultiPage, "Multi Page View") \
V(CmdToggleContinuousView, "Toggle Continuous View") \
V(CmdToggleMangaMode, "Toggle Manga Mode") \
V(CmdRotateLeft, "Rotate Left") \
Expand Down
9 changes: 8 additions & 1 deletion src/DisplayMode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ bool IsContinuous(DisplayMode mode) {
case DisplayMode::Continuous:
case DisplayMode::ContinuousFacing:
case DisplayMode::ContinuousBookView:
case DisplayMode::ContinuousMultiPage:
return true;
}
return false;
Expand All @@ -32,6 +33,10 @@ bool IsBookView(DisplayMode mode) {
return DisplayMode::BookView == mode || DisplayMode::ContinuousBookView == mode;
}

bool IsMultiPage(DisplayMode mode) {
return DisplayMode::MultiPage == mode || DisplayMode::ContinuousMultiPage == mode;
}

bool IsValidZoom(float zoom) {
if ((kZoomMin - 0.01f <= zoom) && (zoom <= kZoomMax + 0.01f)) {
return true;
Expand All @@ -56,7 +61,9 @@ static const char* displayModeNames =
"book view\0"
"continuous\0"
"continuous facing\0"
"continuous book view\0";
"continuous book view\0"
"multi pages\0"
"continuous multi pages\0";

const char* DisplayModeToString(DisplayMode mode) {
int idx = (int)mode;
Expand Down
1 change: 1 addition & 0 deletions src/DisplayMode.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ bool IsSingle(DisplayMode mode);
bool IsContinuous(DisplayMode mode);
bool IsFacing(DisplayMode mode);
bool IsBookView(DisplayMode mode);
bool IsMultiPage(DisplayMode mode);
bool IsValidZoom(float zoomLevel);

const char* DisplayModeToString(DisplayMode mode);
Expand Down
18 changes: 14 additions & 4 deletions src/DisplayModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,12 @@
// if true, we pre-render the pages right before and after the visible pages
static bool gPredictiveRender = true;

static int ColumnsFromDisplayMode(DisplayMode displayMode) {
int DisplayModel::ColumnsFromDisplayMode(DisplayMode displayMode) const {
if (!IsSingle(displayMode)) {
if (IsMultiPage(displayMode)) {
SizeF pageSize = PageSizeAfterRotation(startPage);
return std::max(std::min((int)(viewPort.dx / (pageSize.dx * zoomReal)), 12),1);
}
return 2;
}
return 1;
Expand Down Expand Up @@ -681,7 +685,9 @@ void DisplayModel::Relayout(float newZoomVirtual, int newRotation) {
rotation, columns parameters. You can think of it as a simple
table layout i.e. rows with a fixed number of columns. */
int columns = ColumnsFromDisplayMode(GetDisplayMode());
int columnMaxWidth[2] = {0, 0};
int columnMaxWidth[12] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
int pageInARow = 0;
int rowMaxPageDy = 0;
for (int pageNo = 1; pageNo <= PageCount(); ++pageNo) {
Expand Down Expand Up @@ -766,8 +772,9 @@ void DisplayModel::Relayout(float newZoomVirtual, int newRotation) {

// restart the layout if we detect we need to show scrollbars
// (there are some edge cases we can't catch in the above loop)
int canvasDx = windowMargin.left + columnMaxWidth[0] + (columns == 2 ? pageSpacing.dx + columnMaxWidth[1] : 0) +
windowMargin.right;
int canvasDx = windowMargin.left + columnMaxWidth[0] + windowMargin.right;
for (int c = 1; c < columns; c++)
canvasDx += pageSpacing.dx + columnMaxWidth[c];
if ((!gGlobalPrefs->fixedPageUI.hideScrollbars) && (!needHScroll) && canvasDx > viewPort.dx) {
needHScroll = true;
viewPort.dy -= GetSystemMetrics(SM_CYHSCROLL);
Expand Down Expand Up @@ -1288,6 +1295,9 @@ void DisplayModel::SetDisplayMode(DisplayMode newDisplayMode, bool keepContinuou
case DisplayMode::BookView:
newDisplayMode = DisplayMode::ContinuousBookView;
break;
case DisplayMode::MultiPage:
newDisplayMode = DisplayMode::ContinuousMultiPage;
break;
}
}
if (displayMode == newDisplayMode) {
Expand Down
2 changes: 2 additions & 0 deletions src/DisplayModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ struct DisplayModel : DocController {

~DisplayModel() override;

int ColumnsFromDisplayMode(DisplayMode displayMode) const;

// meta data
const char* GetFilePath() const override;
const char* GetDefaultFileExt() const override;
Expand Down
9 changes: 8 additions & 1 deletion src/Menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ bool gShowDebugMenu = false;

// note: IDM_VIEW_SINGLE_PAGE - IDM_VIEW_CONTINUOUS and also
// CmdZoomFIT_PAGE - CmdZoomCUSTOM must be in a continuous range!
static_assert(CmdViewLayoutLast - CmdViewLayoutFirst == 4, "view layout ids are not in a continuous range");
static_assert(CmdViewLayoutLast - CmdViewLayoutFirst == 5, "view layout ids are not in a continuous range");
static_assert(CmdZoomLast - CmdZoomFirst == 17, "zoom ids are not in a continuous range");

// clang-format off
Expand Down Expand Up @@ -230,6 +230,10 @@ static MenuDef menuDefView[] = {
_TRN("&Book View"),
CmdBookView,
},
{
_TRN("&Multi Page View"),
CmdMultiPage,
},
{
_TRN("Show &Pages Continuously"),
CmdToggleContinuousView,
Expand Down Expand Up @@ -980,6 +984,7 @@ UINT_PTR removeIfChm[] = {
CmdSinglePageView,
CmdFacingView,
CmdBookView,
CmdMultiPage,
CmdToggleContinuousView,
CmdRotateLeft,
CmdRotateRight,
Expand Down Expand Up @@ -1550,6 +1555,8 @@ void MenuUpdateDisplayMode(MainWindow* win) {
id = CmdFacingView;
} else if (IsBookView(displayMode)) {
id = CmdBookView;
} else if (IsMultiPage(displayMode)) {
id = CmdMultiPage;
} else {
CrashIf(win->ctrl || DisplayMode::Automatic != displayMode);
}
Expand Down
2 changes: 2 additions & 0 deletions src/Settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ enum class DisplayMode {
Continuous,
ContinuousFacing,
ContinuousBookView,
MultiPage,
ContinuousMultiPage,
};

constexpr float kZoomFitPage = -1.f;
Expand Down
8 changes: 8 additions & 0 deletions src/SumatraPDF.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3638,6 +3638,10 @@ static void ToggleContinuousView(MainWindow* win) {
case DisplayMode::ContinuousBookView:
newMode = IsContinuous(newMode) ? DisplayMode::BookView : DisplayMode::ContinuousBookView;
break;
case DisplayMode::MultiPage:
case DisplayMode::ContinuousMultiPage:
newMode = IsContinuous(newMode) ? DisplayMode::MultiPage : DisplayMode::ContinuousMultiPage;
break;
}
SwitchToDisplayMode(win, newMode);
}
Expand Down Expand Up @@ -4970,6 +4974,10 @@ static LRESULT FrameOnCommand(MainWindow* win, HWND hwnd, UINT msg, WPARAM wp, L
SwitchToDisplayMode(win, DisplayMode::BookView, true);
break;

case CmdMultiPage:
SwitchToDisplayMode(win, DisplayMode::MultiPage, true);
break;

case CmdToggleContinuousView:
ToggleContinuousView(win);
break;
Expand Down
Loading