mirror of https://github.com/JakubMelka/PDF4QT.git
Inserting blank pages
This commit is contained in:
parent
688c0b701c
commit
83eb35e1c0
|
@ -27,6 +27,7 @@
|
||||||
#include <QDesktopWidget>
|
#include <QDesktopWidget>
|
||||||
#include <QClipboard>
|
#include <QClipboard>
|
||||||
#include <QToolBar>
|
#include <QToolBar>
|
||||||
|
#include <QDesktopServices>
|
||||||
|
|
||||||
namespace pdfdocpage
|
namespace pdfdocpage
|
||||||
{
|
{
|
||||||
|
@ -69,6 +70,11 @@ MainWindow::MainWindow(QWidget* parent) :
|
||||||
ui->actionUnited_Document->setData(int(Operation::Unite));
|
ui->actionUnited_Document->setData(int(Operation::Unite));
|
||||||
ui->actionSeparate_to_Multiple_Documents->setData(int(Operation::Separate));
|
ui->actionSeparate_to_Multiple_Documents->setData(int(Operation::Separate));
|
||||||
ui->actionSeparate_to_Multiple_Documents_Grouped->setData(int(Operation::SeparateGrouped));
|
ui->actionSeparate_to_Multiple_Documents_Grouped->setData(int(Operation::SeparateGrouped));
|
||||||
|
ui->actionInsert_Image->setData(int(Operation::InsertImage));
|
||||||
|
ui->actionInsert_Empty_Page->setData(int(Operation::InsertEmptyPage));
|
||||||
|
ui->actionInsert_Page_from_PDF->setData(int(Operation::InsertPDF));
|
||||||
|
ui->actionGet_Source->setData(int(Operation::GetSource));
|
||||||
|
ui->actionAbout->setData(int(Operation::About));
|
||||||
|
|
||||||
QToolBar* mainToolbar = addToolBar(tr("Main"));
|
QToolBar* mainToolbar = addToolBar(tr("Main"));
|
||||||
mainToolbar->setObjectName("main_toolbar");
|
mainToolbar->setObjectName("main_toolbar");
|
||||||
|
@ -312,6 +318,13 @@ bool MainWindow::canPerformOperation(Operation operation) const
|
||||||
case Operation::SeparateGrouped:
|
case Operation::SeparateGrouped:
|
||||||
return !isModelEmpty;
|
return !isModelEmpty;
|
||||||
|
|
||||||
|
case Operation::InsertImage:
|
||||||
|
case Operation::InsertEmptyPage:
|
||||||
|
case Operation::InsertPDF:
|
||||||
|
case Operation::GetSource:
|
||||||
|
case Operation::About:
|
||||||
|
return true;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Q_ASSERT(false);
|
Q_ASSERT(false);
|
||||||
break;
|
break;
|
||||||
|
@ -462,6 +475,18 @@ void MainWindow::performOperation(Operation operation)
|
||||||
Q_ASSERT(false);
|
Q_ASSERT(false);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Operation::GetSource:
|
||||||
|
QDesktopServices::openUrl(QUrl("https://github.com/JakubMelka/PdfForQt"));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Operation::InsertEmptyPage:
|
||||||
|
m_model->insertEmptyPage(ui->documentItemsView->selectionModel()->selection().indexes());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Operation::InsertImage:
|
||||||
|
case Operation::InsertPDF:
|
||||||
|
case Operation::About:
|
||||||
|
|
||||||
case Operation::Unite:
|
case Operation::Unite:
|
||||||
case Operation::Separate:
|
case Operation::Separate:
|
||||||
case Operation::SeparateGrouped:
|
case Operation::SeparateGrouped:
|
||||||
|
|
|
@ -75,7 +75,14 @@ public:
|
||||||
|
|
||||||
Unite,
|
Unite,
|
||||||
Separate,
|
Separate,
|
||||||
SeparateGrouped
|
SeparateGrouped,
|
||||||
|
|
||||||
|
InsertImage,
|
||||||
|
InsertEmptyPage,
|
||||||
|
InsertPDF,
|
||||||
|
|
||||||
|
GetSource,
|
||||||
|
About
|
||||||
};
|
};
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
|
@ -344,6 +344,46 @@ void PageItemModel::removeSelection(const QModelIndexList& list)
|
||||||
endResetModel();
|
endResetModel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PageItemModel::insertEmptyPage(const QModelIndexList& list)
|
||||||
|
{
|
||||||
|
if (list.isEmpty())
|
||||||
|
{
|
||||||
|
insertEmptyPage(QModelIndex());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QModelIndexList listCopy = list;
|
||||||
|
std::sort(listCopy.begin(), listCopy.end());
|
||||||
|
std::reverse(listCopy.begin(), listCopy.end());
|
||||||
|
|
||||||
|
for (const QModelIndex& index: listCopy)
|
||||||
|
{
|
||||||
|
insertEmptyPage(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PageItemModel::insertEmptyPage(const QModelIndex& index)
|
||||||
|
{
|
||||||
|
int insertRow = index.isValid()? index.row() + 1 : int(m_pageGroupItems.size());
|
||||||
|
|
||||||
|
const int templateRow = index.isValid() ? index.row() : int(m_pageGroupItems.size()) - 1;
|
||||||
|
const bool isTemplateRowValid = templateRow > -1;
|
||||||
|
|
||||||
|
PageGroupItem::GroupItem groupItem;
|
||||||
|
groupItem.pageAdditionalRotation = isTemplateRowValid ? m_pageGroupItems[templateRow].groups.back().pageAdditionalRotation : pdf::PageRotation::None;
|
||||||
|
groupItem.pageType = PT_Empty;
|
||||||
|
groupItem.rotatedPageDimensionsMM = isTemplateRowValid ? m_pageGroupItems[templateRow].groups.back().rotatedPageDimensionsMM : QSizeF(210, 297);
|
||||||
|
|
||||||
|
PageGroupItem blankPageItem;
|
||||||
|
blankPageItem.groups.push_back(groupItem);
|
||||||
|
updateItemCaptionAndTags(blankPageItem);
|
||||||
|
|
||||||
|
beginInsertRows(QModelIndex(), insertRow, insertRow);
|
||||||
|
m_pageGroupItems.insert(std::next(m_pageGroupItems.begin(), insertRow), std::move(blankPageItem));
|
||||||
|
endInsertRows();
|
||||||
|
}
|
||||||
|
|
||||||
void PageItemModel::rotateLeft(const QModelIndexList& list)
|
void PageItemModel::rotateLeft(const QModelIndexList& list)
|
||||||
{
|
{
|
||||||
if (list.isEmpty())
|
if (list.isEmpty())
|
||||||
|
@ -460,6 +500,11 @@ void PageItemModel::createDocumentGroup(int index)
|
||||||
|
|
||||||
QString PageItemModel::getGroupNameFromDocument(int index) const
|
QString PageItemModel::getGroupNameFromDocument(int index) const
|
||||||
{
|
{
|
||||||
|
if (index == -1)
|
||||||
|
{
|
||||||
|
return tr("Page Group");
|
||||||
|
}
|
||||||
|
|
||||||
const DocumentItem& item = m_documents.at(index);
|
const DocumentItem& item = m_documents.at(index);
|
||||||
|
|
||||||
QString title = item.document.getInfo()->title;
|
QString title = item.document.getInfo()->title;
|
||||||
|
@ -481,9 +526,12 @@ void PageItemModel::updateItemCaptionAndTags(PageGroupItem& item) const
|
||||||
{
|
{
|
||||||
pdf::PDFClosedIntervalSet pageSet;
|
pdf::PDFClosedIntervalSet pageSet;
|
||||||
for (const auto& groupItem : item.groups)
|
for (const auto& groupItem : item.groups)
|
||||||
|
{
|
||||||
|
if (groupItem.pageIndex != -1)
|
||||||
{
|
{
|
||||||
pageSet.addInterval(groupItem.pageIndex, groupItem.pageIndex);
|
pageSet.addInterval(groupItem.pageIndex, groupItem.pageIndex);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
item.groupName = getGroupNameFromDocument(*documentIndices.begin());
|
item.groupName = getGroupNameFromDocument(*documentIndices.begin());
|
||||||
item.pagesCaption = pageSet.toText(true);
|
item.pagesCaption = pageSet.toText(true);
|
||||||
|
@ -494,6 +542,41 @@ void PageItemModel::updateItemCaptionAndTags(PageGroupItem& item) const
|
||||||
item.pagesCaption = tr("Page Count: %1").arg(item.groups.size());
|
item.pagesCaption = tr("Page Count: %1").arg(item.groups.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool hasImages = false;
|
||||||
|
bool hasEmptyPage = false;
|
||||||
|
|
||||||
|
size_t imageCount = 0;
|
||||||
|
size_t emptyPageCount = 0;
|
||||||
|
|
||||||
|
for (const PageGroupItem::GroupItem& group : item.groups)
|
||||||
|
{
|
||||||
|
switch (group.pageType)
|
||||||
|
{
|
||||||
|
case pdfdocpage::PT_DocumentPage:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case pdfdocpage::PT_Image:
|
||||||
|
hasImages = true;
|
||||||
|
++imageCount;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case pdfdocpage::PT_Empty:
|
||||||
|
hasEmptyPage = true;
|
||||||
|
++emptyPageCount;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (imageCount == pageCount)
|
||||||
|
{
|
||||||
|
item.groupName = imageCount == 1 ? tr("Image") : tr("Images");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (emptyPageCount == pageCount)
|
||||||
|
{
|
||||||
|
item.groupName = emptyPageCount == 1 ? tr("Blank Page") : tr("Blank Pages");
|
||||||
|
}
|
||||||
|
|
||||||
item.tags.clear();
|
item.tags.clear();
|
||||||
if (pageCount > 1)
|
if (pageCount > 1)
|
||||||
{
|
{
|
||||||
|
@ -501,7 +584,15 @@ void PageItemModel::updateItemCaptionAndTags(PageGroupItem& item) const
|
||||||
}
|
}
|
||||||
if (documentIndices.size() > 1)
|
if (documentIndices.size() > 1)
|
||||||
{
|
{
|
||||||
item.tags << QString("#BBBB00@Collection");
|
item.tags << tr("#BBBB00@Collection");
|
||||||
|
}
|
||||||
|
if (hasEmptyPage)
|
||||||
|
{
|
||||||
|
item.tags << tr("#D98335@Blank");
|
||||||
|
}
|
||||||
|
if (hasImages)
|
||||||
|
{
|
||||||
|
item.tags << tr("#24A5EA@Image");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,13 @@
|
||||||
namespace pdfdocpage
|
namespace pdfdocpage
|
||||||
{
|
{
|
||||||
|
|
||||||
|
enum PageType
|
||||||
|
{
|
||||||
|
PT_DocumentPage,
|
||||||
|
PT_Image,
|
||||||
|
PT_Empty
|
||||||
|
};
|
||||||
|
|
||||||
struct PageGroupItem
|
struct PageGroupItem
|
||||||
{
|
{
|
||||||
QString groupName;
|
QString groupName;
|
||||||
|
@ -36,10 +43,12 @@ struct PageGroupItem
|
||||||
{
|
{
|
||||||
auto operator<=>(const GroupItem&) const = default;
|
auto operator<=>(const GroupItem&) const = default;
|
||||||
|
|
||||||
int documentIndex = 0;
|
int documentIndex = -1;
|
||||||
pdf::PDFInteger pageIndex;
|
pdf::PDFInteger pageIndex = -1;
|
||||||
|
pdf::PDFInteger imageIndex = -1;
|
||||||
QSizeF rotatedPageDimensionsMM;
|
QSizeF rotatedPageDimensionsMM;
|
||||||
pdf::PageRotation pageAdditionalRotation = pdf::PageRotation::None;
|
pdf::PageRotation pageAdditionalRotation = pdf::PageRotation::None;
|
||||||
|
PageType pageType = PT_DocumentPage;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<GroupItem> groups;
|
std::vector<GroupItem> groups;
|
||||||
|
@ -122,6 +131,7 @@ public:
|
||||||
QModelIndexList restoreRemovedItems();
|
QModelIndexList restoreRemovedItems();
|
||||||
QModelIndexList cloneSelection(const QModelIndexList& list);
|
QModelIndexList cloneSelection(const QModelIndexList& list);
|
||||||
void removeSelection(const QModelIndexList& list);
|
void removeSelection(const QModelIndexList& list);
|
||||||
|
void insertEmptyPage(const QModelIndexList& list);
|
||||||
|
|
||||||
void rotateLeft(const QModelIndexList& list);
|
void rotateLeft(const QModelIndexList& list);
|
||||||
void rotateRight(const QModelIndexList& list);
|
void rotateRight(const QModelIndexList& list);
|
||||||
|
@ -132,6 +142,7 @@ private:
|
||||||
void createDocumentGroup(int index);
|
void createDocumentGroup(int index);
|
||||||
QString getGroupNameFromDocument(int index) const;
|
QString getGroupNameFromDocument(int index) const;
|
||||||
void updateItemCaptionAndTags(PageGroupItem& item) const;
|
void updateItemCaptionAndTags(PageGroupItem& item) const;
|
||||||
|
void insertEmptyPage(const QModelIndex& index);
|
||||||
|
|
||||||
QItemSelection getSelectionImpl(std::function<bool(const PageGroupItem::GroupItem&)> filter) const;
|
QItemSelection getSelectionImpl(std::function<bool(const PageGroupItem::GroupItem&)> filter) const;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue