Page layout modes

This commit is contained in:
Jakub Melka 2019-02-03 13:57:37 +01:00
parent 4d7eaf7587
commit 0a28869c94
5 changed files with 191 additions and 0 deletions

View File

@ -630,6 +630,15 @@ void PDFDrawWidgetProxy::zoom(PDFReal zoom)
}
}
void PDFDrawWidgetProxy::setPageLayout(PageLayout pageLayout)
{
if (getPageLayout() != pageLayout)
{
m_controller->setPageLayout(pageLayout);
emit pageLayoutChanged();
}
}
QRectF PDFDrawWidgetProxy::fromDeviceSpace(const QRectF& rect) const
{
Q_ASSERT(rect.isValid());

View File

@ -167,10 +167,18 @@ public:
/// and each 1 cm of widget area corresponds to 0.5 cm of the device space area.
PDFReal getZoom() const { return m_zoom; }
/// Sets the page layout. Page layout can be one of the PDF's page layouts.
/// \param pageLayout Page layout
void setPageLayout(PageLayout pageLayout);
/// Returns the page layout
PageLayout getPageLayout() const { return m_controller->getPageLayout(); }
static constexpr PDFReal ZOOM_STEP = 1.2;
signals:
void drawSpaceChanged();
void pageLayoutChanged();
private:
struct LayoutItem

View File

@ -75,7 +75,10 @@ PDFViewerMainWindow::PDFViewerMainWindow(QWidget *parent) :
setCentralWidget(m_pdfWidget);
setFocusProxy(m_pdfWidget);
connect(m_pdfWidget->getDrawWidgetProxy(), &pdf::PDFDrawWidgetProxy::pageLayoutChanged, this, &PDFViewerMainWindow::updatePageLayoutActions);
readSettings();
updatePageLayoutActions();
}
PDFViewerMainWindow::~PDFViewerMainWindow()
@ -153,6 +156,41 @@ void PDFViewerMainWindow::updateTitle()
}
}
void PDFViewerMainWindow::updatePageLayoutActions()
{
for (QAction* action : { ui->actionPageLayoutContinuous, ui->actionPageLayoutSinglePage, ui->actionPageLayoutTwoColumns, ui->actionPageLayoutTwoPages })
{
action->setChecked(false);
}
const pdf::PageLayout pageLayout = m_pdfWidget->getDrawWidgetProxy()->getPageLayout();
switch (pageLayout)
{
case pdf::PageLayout::SinglePage:
ui->actionPageLayoutSinglePage->setChecked(true);
break;
case pdf::PageLayout::OneColumn:
ui->actionPageLayoutContinuous->setChecked(true);
break;
case pdf::PageLayout::TwoColumnLeft:
case pdf::PageLayout::TwoColumnRight:
ui->actionPageLayoutTwoColumns->setChecked(true);
ui->actionFirstPageOnRightSide->setChecked(pageLayout == pdf::PageLayout::TwoColumnRight);
break;
case pdf::PageLayout::TwoPagesLeft:
case pdf::PageLayout::TwoPagesRight:
ui->actionPageLayoutTwoPages->setChecked(true);
ui->actionFirstPageOnRightSide->setChecked(pageLayout == pdf::PageLayout::TwoPagesRight);
break;
default:
Q_ASSERT(false);
}
}
void PDFViewerMainWindow::openDocument(const QString& fileName)
{
// First close old document
@ -194,6 +232,11 @@ void PDFViewerMainWindow::closeDocument()
m_pdfDocument.reset();
}
void PDFViewerMainWindow::setPageLayout(pdf::PageLayout pageLayout)
{
m_pdfWidget->getDrawWidgetProxy()->setPageLayout(pageLayout);
}
void PDFViewerMainWindow::closeEvent(QCloseEvent* event)
{
writeSettings();
@ -201,4 +244,47 @@ void PDFViewerMainWindow::closeEvent(QCloseEvent* event)
event->accept();
}
void PDFViewerMainWindow::on_actionPageLayoutSinglePage_triggered()
{
setPageLayout(pdf::PageLayout::SinglePage);
}
void PDFViewerMainWindow::on_actionPageLayoutContinuous_triggered()
{
setPageLayout(pdf::PageLayout::OneColumn);
}
void PDFViewerMainWindow::on_actionPageLayoutTwoPages_triggered()
{
setPageLayout(ui->actionFirstPageOnRightSide->isChecked() ? pdf::PageLayout::TwoPagesRight : pdf::PageLayout::TwoPagesLeft);
}
void PDFViewerMainWindow::on_actionPageLayoutTwoColumns_triggered()
{
setPageLayout(ui->actionFirstPageOnRightSide->isChecked() ? pdf::PageLayout::TwoColumnRight : pdf::PageLayout::TwoColumnLeft);
}
void PDFViewerMainWindow::on_actionFirstPageOnRightSide_triggered()
{
switch (m_pdfWidget->getDrawWidgetProxy()->getPageLayout())
{
case pdf::PageLayout::SinglePage:
case pdf::PageLayout::OneColumn:
break;
case pdf::PageLayout::TwoColumnLeft:
case pdf::PageLayout::TwoColumnRight:
on_actionPageLayoutTwoColumns_triggered();
break;
case pdf::PageLayout::TwoPagesLeft:
case pdf::PageLayout::TwoPagesRight:
on_actionPageLayoutTwoPages_triggered();
break;
default:
Q_ASSERT(false);
}
}
} // namespace pdfviewer

View File

@ -18,6 +18,8 @@
#ifndef PDFVIEWERMAINWINDOW_H
#define PDFVIEWERMAINWINDOW_H
#include "pdfcatalog.h"
#include <QMainWindow>
#include <QSharedPointer>
@ -45,6 +47,13 @@ public:
virtual void closeEvent(QCloseEvent* event) override;
private slots:
void on_actionPageLayoutSinglePage_triggered();
void on_actionPageLayoutContinuous_triggered();
void on_actionPageLayoutTwoPages_triggered();
void on_actionPageLayoutTwoColumns_triggered();
void on_actionFirstPageOnRightSide_triggered();
private:
void onActionOpenTriggered();
void onActionCloseTriggered();
@ -54,11 +63,14 @@ private:
void writeSettings();
void updateTitle();
void updatePageLayoutActions();
void openDocument(const QString& fileName);
void setDocument(const pdf::PDFDocument* document);
void closeDocument();
void setPageLayout(pdf::PageLayout pageLayout);
Ui::PDFViewerMainWindow* ui;
pdf::PDFWidget* m_pdfWidget;
QSharedPointer<pdf::PDFDocument> m_pdfDocument;

View File

@ -36,7 +36,25 @@
<string>Go To</string>
</property>
</widget>
<widget class="QMenu" name="menuView">
<property name="title">
<string>View</string>
</property>
<widget class="QMenu" name="menuPage_Layout">
<property name="title">
<string>Page Layout</string>
</property>
<addaction name="actionPageLayoutSinglePage"/>
<addaction name="actionPageLayoutContinuous"/>
<addaction name="actionPageLayoutTwoPages"/>
<addaction name="actionPageLayoutTwoColumns"/>
<addaction name="separator"/>
<addaction name="actionFirstPageOnRightSide"/>
</widget>
<addaction name="menuPage_Layout"/>
</widget>
<addaction name="menuFile"/>
<addaction name="menuView"/>
<addaction name="menuGoTo"/>
</widget>
<widget class="QToolBar" name="mainToolBar">
@ -63,6 +81,64 @@
<string>Quit</string>
</property>
</action>
<action name="actionPageLayoutSinglePage">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Single Page</string>
</property>
<property name="shortcut">
<string>Ctrl+1</string>
</property>
</action>
<action name="actionPageLayoutContinuous">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Continuous</string>
</property>
<property name="shortcut">
<string>Ctrl+2</string>
</property>
</action>
<action name="actionPageLayoutTwoPages">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Two Pages</string>
</property>
<property name="shortcut">
<string>Ctrl+3</string>
</property>
</action>
<action name="actionPageLayoutTwoColumns">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Two columns</string>
</property>
<property name="shortcut">
<string>Ctrl+4</string>
</property>
</action>
<action name="actionFirstPageOnRightSide">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>First page on right side</string>
</property>
<property name="toolTip">
<string>First page on right side</string>
</property>
<property name="shortcut">
<string>Ctrl+5</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>