Hello everyone!
I have written a patch which allows user to shift page numbering in
document in order to make it corresponding to actual page numbering in
the book or article. This may be useful, for example, if we have a file
with an article somewhere from the middle of the journal, or we have a
scanned book with shifted page numbering. So, I have two questions:
1) Will it be useful for anyone else?
2) If so, I would like to ask for an advice on the patch structure. I
tried to change as little code as possible, but I am not sure that this
is the best solution here. The point is that currently I notify document
observers of document changing (sending
Okular::DocumentObserver::DocumentChanged flag) just in order to reload
the info about page labels. So, a lot of extra job is done by a program.
You may find the patch attached to this letter.
Best regards,
Dmitri Ovodok
diff -U 3 -H -b -d -r -- okular_orig/okular/core/document.cpp okular/core/document.cpp
--- okular_orig/okular/core/document.cpp 2016-03-01 00:55:19.712112472 +0300
+++ okular/core/document.cpp 2016-02-29 16:20:15.826557994 +0300
@@ -728,6 +728,16 @@
viewNode = viewNode.nextSibling();
}
}
+ else if ( infoElement.tagName() == "pageNumbering" )
+ {
+ const QString str = infoElement.attribute( "offset" );
+ bool ok = true;
+ int offset = str.toInt( &ok );
+ if ( ok && offset != 0 )
+ {
+ m_parent->setPageNumberingOffset( offset );
+ }
+ }
infoNode = infoNode.nextSibling();
}
}
@@ -1284,6 +1294,13 @@
++backIterator;
}
}
+ //save info about page numbering offset
+ if ( m_pageNumberingOffset != 0 )
+ {
+ QDomElement pageNumberingNode = doc.createElement( "pageNumbering" );
+ generalInfo.appendChild( pageNumberingNode );
+ pageNumberingNode.setAttribute( "offset", QString::number( m_pageNumberingOffset ) );
+ }
// create views root node
QDomElement viewsNode = doc.createElement( "views" );
generalInfo.appendChild( viewsNode );
@@ -2583,6 +2600,7 @@
d->m_fontsCached = false;
d->m_fontsCache.clear();
d->m_rotation = Rotation0;
+ d->m_pageNumberingOffset = 0;
// send an empty list to observers (to free their data)
foreachObserver( notifySetup( QVector< Page * >(), DocumentObserver::DocumentChanged ) );
@@ -2869,6 +2887,22 @@
return d->m_pagesVector.size();
}
+void Document::setPageNumberingOffset( int offset )
+{
+ for ( int i = 0; i < d->m_pagesVector.size(); ++i )
+ {
+ int number = i + 1;
+ d->m_pagesVector[i]->setLabel( QString::number(number + offset) );
+ }
+ d->m_pageNumberingOffset = offset;
+ foreachObserver( notifySetup( d->m_pagesVector, Okular::DocumentObserver::DocumentChanged ) ); //FIXME: only page labels has changed!
+}
+
+int Document::pageNumberingOffset() const
+{
+ return d->m_pageNumberingOffset;
+}
+
KUrl Document::currentDocument() const
{
return d->m_url;
diff -U 3 -H -b -d -r -- okular_orig/okular/core/document.h okular/core/document.h
--- okular_orig/okular/core/document.h 2016-03-01 00:55:19.712112472 +0300
+++ okular/core/document.h 2016-02-29 16:20:15.890558263 +0300
@@ -320,6 +320,16 @@
uint pages() const;
/**
+ * Changes page labels so that page numbering is shifted by @p offset.
+ */
+ void setPageNumberingOffset( int offset );
+
+ /**
+ * Returns the page numbering offset (or 0, if there isn't any offset)
+ */
+ int pageNumberingOffset() const;
+
+ /**
* Returns the url of the currently opened document.
*/
KUrl currentDocument() const;
diff -U 3 -H -b -d -r -- okular_orig/okular/core/document_p.h okular/core/document_p.h
--- okular_orig/okular/core/document_p.h 2016-03-01 00:55:19.712112472 +0300
+++ okular/core/document_p.h 2016-02-29 16:20:15.942558482 +0300
@@ -87,6 +87,7 @@
m_maxAllocatedTextPages( 0 ),
m_warnedOutOfMemory( false ),
m_rotation( Rotation0 ),
+ m_pageNumberingOffset( 0 ),
m_exportCached( false ),
m_bookmarkManager( 0 ),
m_memCheckTimer( 0 ),
@@ -232,6 +233,9 @@
PageSize m_pageSize;
PageSize::List m_pageSizes;
+ //page numbering offset (if set by Document::setPageNumberingOffset)
+ int m_pageNumberingOffset;
+
// cache of the export formats
bool m_exportCached;
ExportFormat::List m_exportFormats;
diff -U 3 -H -b -d -r -- okular_orig/okular/part.cpp okular/part.cpp
--- okular_orig/okular/part.cpp 2016-03-01 00:55:19.764112798 +0300
+++ okular/part.cpp 2016-02-29 16:29:34.353530885 +0300
@@ -733,6 +733,14 @@
KAction *pageno = new KAction( i18n( "Page Number" ), ac );
pageno->setDefaultWidget( m_pageNumberTool );
ac->addAction( "page_number", pageno );
+
+ m_pageNumberingOffset = ac->addAction( "page_numbering_offset", this, SLOT(slotPageNumberingOffset()) );
+ m_pageNumberingOffset->setText( i18n("Set &page numbering offset") );
+ m_pageNumberingOffset->setEnabled(false);
+
+ m_resetPageNumbering = ac->addAction( "page_numbering_reset", this, SLOT(slotResetPageNumbering()) );
+ m_resetPageNumbering->setText( i18n("&Reset page numbering") );
+ m_resetPageNumbering->setEnabled(false);
}
void Part::setViewerShortcuts()
@@ -1384,6 +1392,8 @@
m_find->setEnabled( ok && canSearch );
m_findNext->setEnabled( ok && canSearch );
m_findPrev->setEnabled( ok && canSearch );
+ m_pageNumberingOffset->setEnabled( ok );
+ m_resetPageNumbering->setEnabled( m_document->pageNumberingOffset() != 0 );
if( m_saveAs ) m_saveAs->setEnabled( ok && (m_document->canSaveChanges() || isDocumentArchive) );
if( m_saveCopyAs ) m_saveCopyAs->setEnabled( ok );
emit enablePrintAction( ok && m_document->printingSupport() != Okular::Document::NoPrinting );
@@ -1583,6 +1593,8 @@
m_find->setEnabled( false );
m_findNext->setEnabled( false );
m_findPrev->setEnabled( false );
+ m_pageNumberingOffset->setEnabled( false );
+ m_resetPageNumbering->setEnabled( false );
if( m_saveAs ) m_saveAs->setEnabled( false );
if( m_saveCopyAs ) m_saveCopyAs->setEnabled( false );
m_printPreview->setEnabled( false );
@@ -2013,6 +2025,60 @@
m_document->setViewportPage( pageDialog.getPage() - 1 );
}
+//BEGIN page number offset dialog
+class pageNumberingOffsetDialog : public KDialog
+{
+ public:
+ pageNumberingOffsetDialog(QWidget *p, int currentPage) : KDialog(p)
+ {
+ setCaption(i18n("Set page numbering offset"));
+ setButtons(Ok | Cancel);
+ setDefaultButton(Ok);
+
+ QWidget *w = new QWidget(this);
+ setMainWidget(w);
+
+ QHBoxLayout *topLayout = new QHBoxLayout(w);
+
+ e1 = new KIntNumInput(currentPage, w);
+ e1->setEditFocus(true);
+ e1->setSliderEnabled(false);
+
+ QLabel *label = new QLabel(i18n("&Enter current page number:"), w);
+ label->setBuddy(e1);
+ topLayout->addWidget(label);
+ topLayout->addWidget(e1);
+
+ e1->setFocus();
+ }
+
+ int getDesiredPageNumber() const
+ {
+ return e1->value();
+ }
+
+ protected:
+ KIntNumInput *e1;
+};
+//END page number offset dialog
+
+void Part::slotPageNumberingOffset()
+{
+ int currentPage = m_document->currentPage() + 1;
+ pageNumberingOffsetDialog offsetDialog( m_pageView, currentPage );
+ if ( offsetDialog.exec() == QDialog::Accepted )
+ m_document->setPageNumberingOffset( offsetDialog.getDesiredPageNumber() - currentPage );
+
+ m_resetPageNumbering->setEnabled( true );
+}
+
+void Part::slotResetPageNumbering()
+{
+ m_document->setPageNumberingOffset( 0 );
+ reload();
+}
+
void Part::slotPreviousPage()
{
diff -U 3 -H -b -d -r -- okular_orig/okular/part.h okular/part.h
--- okular_orig/okular/part.h 2016-03-01 00:55:19.764112798 +0300
+++ okular/part.h 2016-02-29 16:20:15.774557775 +0300
@@ -182,6 +182,8 @@
void openUrlFromBookmarks(const KUrl &url);
void handleDroppedUrls( const KUrl::List& urls );
void slotGoToPage();
+ void slotPageNumberingOffset();
+ void slotResetPageNumbering();
void slotHistoryBack();
void slotHistoryNext();
void slotAddBookmark();
@@ -301,6 +303,8 @@
KAction *m_gotoPage;
KAction *m_prevPage;
KAction *m_nextPage;
+ KAction *m_pageNumberingOffset;
+ KAction *m_resetPageNumbering;
KAction *m_beginningOfDocument;
KAction *m_endOfDocument;
KAction *m_historyBack;
diff -U 3 -H -b -d -r -- okular_orig/okular/part.rc okular/part.rc
--- okular_orig/okular/part.rc 2016-03-01 00:55:19.764112798 +0300
+++ okular/part.rc 2016-02-29 16:26:11.157139190 +0300
@@ -57,6 +57,10 @@
<Action name="go_document_back"/>
<Action name="go_document_forward" />
<Separator/>
+ <Menu name="page_numbering"><text>&Page numbering</text>
+ <Action name="page_numbering_offset" />
+ <Action name="page_numbering_reset"/>
+ </Menu>
<Action name="go_goto_page"/>
</Menu>
<Menu name="bookmarks"><text>&Bookmarks</text>
_______________________________________________
Okular-devel mailing list
Okular-devel@kde.org
https://mail.kde.org/mailman/listinfo/okular-devel