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>&amp;Page numbering</text>
+        <Action name="page_numbering_offset" />
+        <Action name="page_numbering_reset"/>
+    </Menu>
     <Action name="go_goto_page"/>
   </Menu>
   <Menu name="bookmarks"><text>&amp;Bookmarks</text>
_______________________________________________
Okular-devel mailing list
Okular-devel@kde.org
https://mail.kde.org/mailman/listinfo/okular-devel

Reply via email to