Skip to content

Commit

Permalink
Mulit page view
Browse files Browse the repository at this point in the history
  • Loading branch information
changlichun authored and kjk committed Apr 13, 2024
1 parent d5d5006 commit 78aa745
Show file tree
Hide file tree
Showing 8 changed files with 44 additions and 6 deletions.
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

0 comments on commit 78aa745

Please sign in to comment.