From ef818392cd2bca426d2c0ad2ce587d8de10532a9 Mon Sep 17 00:00:00 2001 From: Thomas Etter Date: Wed, 23 May 2012 00:23:36 +0200 Subject: [PATCH 001/155] Use the left/right arrow keys to change the page REVIEW: 104596 --- ui/pageview.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/ui/pageview.cpp b/ui/pageview.cpp index 3f59d3087..0015aa19e 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -1621,11 +1621,25 @@ void PageView::keyPressEvent( QKeyEvent * e ) break; case Qt::Key_Left: case Qt::Key_H: - horizontalScrollBar()->triggerAction( QScrollBar::SliderSingleStepSub ); + if ( horizontalScrollBar()->maximum() == 0 ) + { + //if we cannot scroll we go to the previous page vertically + int next_page = d->document->currentPage() - viewColumns(); + d->document->setViewportPage(next_page); + } + else + horizontalScrollBar()->triggerAction( QScrollBar::SliderSingleStepSub ); break; case Qt::Key_Right: case Qt::Key_L: - horizontalScrollBar()->triggerAction( QScrollBar::SliderSingleStepAdd ); + if ( horizontalScrollBar()->maximum() == 0 ) + { + //if we cannot scroll we advance the page vertically + int next_page = d->document->currentPage() + viewColumns(); + d->document->setViewportPage(next_page); + } + else + horizontalScrollBar()->triggerAction( QScrollBar::SliderSingleStepAdd ); break; case Qt::Key_Escape: selectionClear( d->tableDividersGuessed ? ClearOnlyDividers : ClearAllSelection ); From 04935266d21a4b1563cb3ca7aa78c6218b121650 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Wed, 23 May 2012 00:45:35 +0200 Subject: [PATCH 002/155] Fix wrong text --- core/document.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/document.cpp b/core/document.cpp index b06fb3693..e27b7906a 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -781,7 +781,7 @@ void DocumentPrivate::warnLimitedAnnotSupport() { // Show only if there are external annotations (we follow the usual XML path otherwise) if ( m_containsExternalAnnotations ) - KMessageBox::sorry( m_parent->widget(), i18n("Your changes will not be saved automatically. Use File -> Save As... or your changes will be lost") ); + KMessageBox::sorry( m_parent->widget(), i18n("Your annotation changes will not be saved automatically. Use File -> Save As...\nor your changes will be lost once the document is closed") ); } else { From e3e36577887f3c618c8d5543ec656dbeb0ce2f26 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Wed, 23 May 2012 17:30:41 +0200 Subject: [PATCH 003/155] When renaming a bookmark folder, don't assume that we are renaming the current document --- ui/bookmarklist.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/bookmarklist.cpp b/ui/bookmarklist.cpp index 034afa4a4..0b61104c9 100644 --- a/ui/bookmarklist.cpp +++ b/ui/bookmarklist.cpp @@ -229,7 +229,8 @@ void BookmarkList::slotChanged( QTreeWidgetItem * item ) FileItem* fItem = dynamic_cast( item ); if ( fItem ) { - m_document->bookmarkManager()->renameBookmark( m_document->currentDocument(), fItem->text( 0 ) ); + const KUrl url = fItem->data( 0, UrlRole ).value< KUrl >(); + m_document->bookmarkManager()->renameBookmark( url, fItem->text( 0 ) ); m_document->bookmarkManager()->save(); } } From 0fc1883eb1e7f8f9211e2e00879550517dc65194 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 23 May 2012 20:21:16 +0200 Subject: [PATCH 004/155] New pdf generator version --- generators/poppler/generator_pdf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index 86a69d044..a10dd5d39 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -358,7 +358,7 @@ static KAboutData createAboutData() "okular_poppler", "okular_poppler", ki18n( "PDF Backend" ), - "0.5", + "0.6", ki18n( "A PDF file renderer" ), KAboutData::License_GPL, ki18n( "© 2005-2008 Albert Astals Cid" ) From 7d3a064e15fcf041e10e0ec8699bb59acf111c8a Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 23 May 2012 20:26:01 +0200 Subject: [PATCH 005/155] New ABI compatible changes in okularcore --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 744d10a5e..e4cb88f53 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -120,7 +120,7 @@ ENDIF(APPLE) target_link_libraries(okularcore ${OKULAR_IOKIT} ${KDE4_KIO_LIBS} ${KDE4_PHONON_LIBRARY} ${KDE4_KJSAPI_LIBRARY} ${MATH_LIB} ${KDE4_THREADWEAVER_LIBRARY} ) -set_target_properties(okularcore PROPERTIES VERSION 1.8.0 SOVERSION 1 ) +set_target_properties(okularcore PROPERTIES VERSION 1.9.0 SOVERSION 1 ) install(TARGETS okularcore ${INSTALL_TARGETS_DEFAULT_ARGS} ) From e3f1c388de409843150280a2e1b3a738ab982af6 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Wed, 23 May 2012 23:43:44 +0200 Subject: [PATCH 006/155] Ask "Save annotation changes?" if there are unsaved annotations that cannot be saved locally This patch turns Okular into a ReadWritePart. Annotation editing is always disabled if we're loaded as ReadOnlyPart, no matter the document type. REVIEW: 105020 --- core/document.cpp | 27 +++++++++-- core/document.h | 8 ++++ core/document_p.h | 3 ++ core/observer.h | 5 +- okular_part.desktop | 2 +- part.cpp | 110 ++++++++++++++++++++++++++++++++++++++------ part.h | 27 +++++++++-- shell/shell.cpp | 14 +++++- shell/shell.h | 3 +- 9 files changed, 173 insertions(+), 26 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index e27b7906a..7d834f54c 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -2138,6 +2138,9 @@ KUrl Document::currentDocument() const bool Document::isAllowed( Permission action ) const { + if ( action == Okular::AllowNotes && !d->m_annotationEditingEnabled ) + return false; + #if !OKULAR_FORCE_DRM if ( KAuthorized::authorize( "skip_drm" ) && !Okular::Settings::obeyDRM() ) return true; @@ -2354,6 +2357,16 @@ void Document::requestTextPage( uint page ) d->m_generator->generateTextPage( kp ); } +void DocumentPrivate::notifyAnnotationChanges( int page ) +{ + int flags = DocumentObserver::Annotations; + + if ( canAddAnnotationsNatively() && m_containsExternalAnnotations ) + flags |= DocumentObserver::NeedSaveAs; // Annotations are not saved locally in this case + + foreachObserverD( notifyPageChanged( page, flags ) ); +} + void Document::addPageAnnotation( int page, Annotation * annotation ) { Okular::SaveInterface * iface = qobject_cast< Okular::SaveInterface * >( d->m_generator ); @@ -2376,7 +2389,7 @@ void Document::addPageAnnotation( int page, Annotation * annotation ) proxy->notifyAddition( annotation, page ); // notify observers about the change - foreachObserver( notifyPageChanged( page, DocumentObserver::Annotations ) ); + d->notifyAnnotationChanges( page ); if ( annotation->flags() & Annotation::ExternallyDrawn ) { @@ -2432,7 +2445,7 @@ void Document::modifyPageAnnotation( int page, Annotation * annotation, bool app proxy->notifyModification( annotation, page, appearanceChanged ); // notify observers about the change - foreachObserver( notifyPageChanged( page, DocumentObserver::Annotations ) ); + d->notifyAnnotationChanges( page ); if ( appearanceChanged && (annotation->flags() & Annotation::ExternallyDrawn) ) { @@ -2507,7 +2520,7 @@ void Document::removePageAnnotation( int page, Annotation * annotation ) kp->removeAnnotation( annotation ); // Also destroys the object // in case of success, notify observers about the change - foreachObserver( notifyPageChanged( page, DocumentObserver::Annotations ) ); + d->notifyAnnotationChanges( page ); if ( isExternallyDrawn ) { @@ -2555,7 +2568,7 @@ void Document::removePageAnnotations( int page, const QList< Annotation * > &ann if ( changed ) { // in case we removed even only one annotation, notify observers about the change - foreachObserver( notifyPageChanged( page, DocumentObserver::Annotations ) ); + d->notifyAnnotationChanges( page ); if ( refreshNeeded ) { @@ -3717,6 +3730,12 @@ QPrinter::Orientation Document::orientation() const return (landscape > portrait) ? QPrinter::Landscape : QPrinter::Portrait; } +void Document::setAnnotationEditingEnabled( bool enable ) +{ + d->m_annotationEditingEnabled = enable; + foreachObserver( notifySetup( d->m_pagesVector, 0 ) ); +} + void DocumentPrivate::requestDone( PixmapRequest * req ) { if ( !req ) diff --git a/core/document.h b/core/document.h index cd36ae7f1..680cd9064 100644 --- a/core/document.h +++ b/core/document.h @@ -642,6 +642,14 @@ class OKULAR_EXPORT Document : public QObject */ QPrinter::Orientation orientation() const; + /** + * Control annotation editing (creation, modification and removal), + * which is enabled by default. + * + * @since 0.15 (KDE 4.9) + */ + void setAnnotationEditingEnabled( bool enable ); + public Q_SLOTS: /** diff --git a/core/document_p.h b/core/document_p.h index ac24cf9d7..1db982878 100644 --- a/core/document_p.h +++ b/core/document_p.h @@ -86,6 +86,7 @@ class DocumentPrivate m_archiveData( 0 ), m_fontsCached( false ), m_documentInfo( 0 ), + m_annotationEditingEnabled ( true ), m_annotationBeingMoved( false ) { calculateMaxTextPages(); @@ -115,6 +116,7 @@ class DocumentPrivate bool openDocumentInternal( const KService::Ptr& offer, bool isstdin, const QString& docFile, const QByteArray& filedata ); bool savePageDocumentInfo( KTemporaryFile *infoFile, int what ) const; DocumentViewport nextDocumentViewport() const; + void notifyAnnotationChanges( int page ); bool canAddAnnotationsNatively() const; bool canModifyExternalAnnotations() const; bool canRemoveExternalAnnotations() const; @@ -233,6 +235,7 @@ class DocumentPrivate QSet< View * > m_views; + bool m_annotationEditingEnabled; bool m_annotationBeingMoved; // is an annotation currently being moved? bool m_containsExternalAnnotations; // set on opening and never changed bool m_showWarningLimitedAnnotSupport; diff --git a/core/observer.h b/core/observer.h index 266993ce9..76c096c2a 100644 --- a/core/observer.h +++ b/core/observer.h @@ -72,8 +72,9 @@ class OKULAR_EXPORT DocumentObserver Bookmark = 2, ///< Bookmarks has been changed Highlights = 4, ///< Highlighting information has been changed TextSelection = 8, ///< Text selection has been changed - Annotations = 16, ///< Annotations has been changed - BoundingBox = 32 ///< Bounding boxes have been changed + Annotations = 16, ///< Annotations have been changed + BoundingBox = 32, ///< Bounding boxes have been changed + NeedSaveAs = 64 ///< Set along with Annotations when Save As is needed or annotation changes will be lost @since 0.15 (KDE 4.9) }; /** diff --git a/okular_part.desktop b/okular_part.desktop index 9307253d7..763d466c0 100644 --- a/okular_part.desktop +++ b/okular_part.desktop @@ -58,7 +58,7 @@ Name[uk]=Okular Name[x-test]=xxOkularxx Name[zh_CN]=Okular Name[zh_TW]=文件檢視_Okular -X-KDE-ServiceTypes=KParts/ReadOnlyPart +X-KDE-ServiceTypes=KParts/ReadOnlyPart,KParts/ReadWritePart X-KDE-Library=okularpart Type=Service MimeType=application/vnd.kde.okular-archive; diff --git a/part.cpp b/part.cpp index 4c6aac8ea..c344110d5 100644 --- a/part.cpp +++ b/part.cpp @@ -151,8 +151,25 @@ class FileKeeper std::FILE * m_handle; }; -K_PLUGIN_FACTORY( okularPartFactory, registerPlugin< Okular::Part >(); ) -K_EXPORT_PLUGIN( okularPartFactory( okularAboutData( "okular", I18N_NOOP( "Okular" ) ) ) ) +Okular::PartFactory::PartFactory() +: KPluginFactory(okularAboutData( "okular", I18N_NOOP( "Okular" ) )) +{ +} + +Okular::PartFactory::~PartFactory() +{ +} + +QObject *Okular::PartFactory::create(const char *iface, QWidget *parentWidget, QObject *parent, const QVariantList &args, const QString &keyword) +{ + Q_UNUSED ( keyword ); + + Okular::Part *object = new Okular::Part( parentWidget, parent, args, componentData() ); + object->setReadWrite( QLatin1String(iface) == QLatin1String("KParts::ReadWritePart") ); + return object; +} + +K_EXPORT_PLUGIN( Okular::PartFactory() ) static QAction* actionForExportFormat( const Okular::ExportFormat& format, QObject *parent = 0 ) { @@ -264,8 +281,9 @@ namespace Okular Part::Part(QWidget *parentWidget, QObject *parent, -const QVariantList &args ) -: KParts::ReadOnlyPart(parent), +const QVariantList &args, +KComponentData componentData ) +: KParts::ReadWritePart(parent), m_tempfile( 0 ), m_fileWasRemoved( false ), m_showMenuBarAction( 0 ), m_showFullScreenAction( 0 ), m_actionsSearched( false ), m_cliPresentation(false), m_embedMode(detectEmbedMode(parentWidget, parent, args)), m_generatorGuiClient(0), m_keeper( 0 ) { @@ -300,7 +318,7 @@ m_cliPresentation(false), m_embedMode(detectEmbedMode(parentWidget, parent, args new OkularLiveConnectExtension( this ); // we need an instance - setComponentData(okularPartFactory::componentData()); + setComponentData( componentData ); GuiUtils::addIconLoader( iconLoader() ); @@ -1025,6 +1043,9 @@ void Part::notifyViewportChanged( bool /*smoothMove*/ ) void Part::notifyPageChanged( int page, int flags ) { + if ( flags & Okular::DocumentObserver::NeedSaveAs ) + setModified(); + if ( !(flags & Okular::DocumentObserver::Bookmark ) ) return; @@ -1258,6 +1279,10 @@ bool Part::openFile() bool Part::openUrl(const KUrl &_url) { + // Close current document if any + if ( !closeUrl() ) + return false; + KUrl url( _url ); if ( url.hasHTMLRef() ) { @@ -1281,7 +1306,7 @@ bool Part::openUrl(const KUrl &_url) } // this calls in sequence the 'closeUrl' and 'openFile' methods - bool openOk = KParts::ReadOnlyPart::openUrl( url ); + bool openOk = KParts::ReadWritePart::openUrl( url ); if ( openOk ) { @@ -1297,9 +1322,36 @@ bool Part::openUrl(const KUrl &_url) return openOk; } - -bool Part::closeUrl() +bool Part::queryClose() { + if ( !isReadWrite() || !isModified() ) + return true; + + const int res = KMessageBox::warningYesNoCancel( widget(), + i18n( "Do you want to save your annotation changes or discard them?" ), + i18n( "Close Document" ), + KStandardGuiItem::saveAs(), + KStandardGuiItem::discard() ); + + switch ( res ) + { + case KMessageBox::Yes: // Save as + slotSaveFileAs(); + return !isModified(); // Only allow closing if file was really saved + case KMessageBox::No: // Discard + return true; + default: // Cancel + return false; + } +} + +bool Part::closeUrl(bool promptToSave) +{ + if ( promptToSave && !queryClose() ) + return false; + + setModified( false ); + if (!m_temporaryLocalFile.isNull() && m_temporaryLocalFile != localFilePath()) { QFile::remove( m_temporaryLocalFile ); @@ -1358,17 +1410,22 @@ bool Part::closeUrl() #ifdef OKULAR_KEEP_FILE_OPEN m_keeper->close(); #endif - bool r = KParts::ReadOnlyPart::closeUrl(); + bool r = KParts::ReadWritePart::closeUrl(); setUrl(KUrl()); return r; } +bool Part::closeUrl() +{ + return closeUrl( true ); +} + void Part::guiActivateEvent(KParts::GUIActivateEvent *event) { updateViewActions(); - KParts::ReadOnlyPart::guiActivateEvent(event); + KParts::ReadWritePart::guiActivateEvent(event); } void Part::close() @@ -1473,7 +1530,12 @@ void Part::slotDoFileDirty() } // close and (try to) reopen the document - if ( KParts::ReadOnlyPart::openUrl( url() ) ) + KUrl oldUrl = url(); + + if ( !closeUrl() ) + return; + + if ( KParts::ReadWritePart::openUrl( oldUrl ) ) { // on successful opening, restore the previous viewport if ( m_viewportDirty.pageNumber >= (int) m_document->pages() ) @@ -1864,6 +1926,11 @@ void Part::slotFindPrev() m_findBar->findPrev(); } +bool Part::saveFile() +{ + kDebug() << "Okular part doesn't support saving the file in the location from which it was opened"; + return false; +} void Part::slotSaveFileAs() { @@ -1876,12 +1943,17 @@ void Part::slotSaveFileAs() if ( !saveUrl.isValid() || saveUrl.isEmpty() ) return; + saveAs( saveUrl ); +} + +bool Part::saveAs( const KUrl & saveUrl ) +{ KTemporaryFile tf; QString fileName; if ( !tf.open() ) { KMessageBox::information( widget(), i18n("Could not open the temporary file for saving." ) ); - return; + return false; } fileName = tf.fileName(); tf.close(); @@ -1897,12 +1969,18 @@ void Part::slotSaveFileAs() { KMessageBox::information( widget(), i18n("File could not be saved in '%1'. %2", fileName, errorText ) ); } - return; + return false; } KIO::Job *copyJob = KIO::file_copy( fileName, saveUrl, -1, KIO::Overwrite ); if ( !KIO::NetAccess::synchronousRun( copyJob, widget() ) ) + { KMessageBox::information( widget(), i18n("File could not be saved in '%1'. Try to save it to another location.", saveUrl.prettyUrl() ) ); + return false; + } + + setModified( false ); + return true; } @@ -2577,6 +2655,12 @@ void Part::updateAboutBackendAction() } } +void Part::setReadWrite(bool readwrite) +{ + m_document->setAnnotationEditingEnabled( readwrite ); + ReadWritePart::setReadWrite( readwrite ); +} + } // namespace Okular #include "part.moc" diff --git a/part.h b/part.h index 39cdb7218..70b2afa2a 100644 --- a/part.h +++ b/part.h @@ -17,6 +17,7 @@ #define _PART_H_ #include +#include #include #include #include @@ -89,7 +90,7 @@ enum EmbedMode * @author Wilco Greven * @version 0.2 */ -class Part : public KParts::ReadOnlyPart, public Okular::DocumentObserver, public KDocumentViewer, public Okular::ViewerInterface +class Part : public KParts::ReadWritePart, public Okular::DocumentObserver, public KDocumentViewer, public Okular::ViewerInterface { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.kde.okular") @@ -104,7 +105,7 @@ class Part : public KParts::ReadOnlyPart, public Okular::DocumentObserver, publi * which config file should be used by adding a string containing "ConfigFileName=" * to 'args'. **/ - Part(QWidget* parentWidget, QObject* parent, const QVariantList& args); + Part(QWidget* parentWidget, QObject* parent, const QVariantList& args, KComponentData componentData); // Destructor ~Part(); @@ -151,11 +152,17 @@ class Part : public KParts::ReadOnlyPart, public Okular::DocumentObserver, publi void viewerMenuStateChange(bool enabled); protected: - // reimplemented from KParts::ReadOnlyPart + // reimplemented from KParts::ReadWritePart bool openFile(); bool openUrl(const KUrl &url); - bool closeUrl(); void guiActivateEvent(KParts::GUIActivateEvent *event); + public: + bool saveFile(); + bool queryClose(); + bool closeUrl(); + bool closeUrl(bool promptToSave); + void setReadWrite(bool readwrite); + bool saveAs(const KUrl & saveUrl); protected slots: // connected to actions @@ -319,6 +326,18 @@ class Part : public KParts::ReadOnlyPart, public Okular::DocumentObserver, publi void slotHandleActivatedSourceReference(const QString& absFileName, int line, int col, bool *handled); }; +class PartFactory : public KPluginFactory +{ + Q_OBJECT + + public: + PartFactory(); + virtual ~PartFactory(); + + protected: + virtual QObject *create(const char *iface, QWidget *parentWidget, QObject *parent, const QVariantList &args, const QString &keyword); +}; + } #endif diff --git a/shell/shell.cpp b/shell/shell.cpp index af4aa25f6..1c126f6e4 100644 --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -85,7 +85,7 @@ void Shell::init() // now that the Part is loaded, we cast it to a Part to get // our hands on it - m_part = factory->create< KParts::ReadOnlyPart >( this ); + m_part = factory->create< KParts::ReadWritePart >( this ); if (m_part) { // then, setup our actions @@ -234,6 +234,10 @@ QStringList Shell::fileFormats() const void Shell::fileOpen() { + // Don't open dialog if current document can't be closed + if ( !m_part->queryClose() ) + return; + // this slot is called whenever the File->Open menu is selected, // the Open shortcut is pressed (usually CTRL+O) or the Open toolbar // button is clicked @@ -267,7 +271,10 @@ void Shell::fileOpen() return; KUrl url = dlg.selectedUrl(); if ( !url.isEmpty() ) + { + m_part->closeUrl( false ); openUrl( url ); + } } void Shell::slotQuit() @@ -331,6 +338,11 @@ QSize Shell::sizeHint() const return QApplication::desktop()->availableGeometry( this ).size() * 0.75; } +bool Shell::queryClose() +{ + return m_part ? m_part->closeUrl() : true; +} + #include "shell.moc" /* kate: replace-tabs on; indent-width 4; */ diff --git a/shell/shell.h b/shell/shell.h index 850e7e37f..8430b9c1c 100644 --- a/shell/shell.h +++ b/shell/shell.h @@ -68,6 +68,7 @@ protected: void readSettings(); void writeSettings(); void setFullScreen( bool ); + bool queryClose(); void showEvent(QShowEvent *event); @@ -92,7 +93,7 @@ private: private: KCmdLineArgs* m_args; - KParts::ReadOnlyPart* m_part; + KParts::ReadWritePart* m_part; KDocumentViewer* m_doc; KRecentFilesAction* m_recent; QStringList m_fileformats; From d2fa4c9bf3ebb21b0e1fd6d3b2429e32586d7590 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Tue, 22 May 2012 12:57:07 +0200 Subject: [PATCH 007/155] TextAnnotation stamp fix - Make "Comment" the default stamp instead of "Note" (because we used to omit the "icon" in the exported DOM if it was "Comment") - Don't omit the icon name anymore --- core/annotations.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/annotations.cpp b/core/annotations.cpp index 79d9b180f..bc55f4bbb 100644 --- a/core/annotations.cpp +++ b/core/annotations.cpp @@ -893,7 +893,7 @@ class Okular::TextAnnotationPrivate : public Okular::AnnotationPrivate public: TextAnnotationPrivate() : AnnotationPrivate(), m_textType( TextAnnotation::Linked ), - m_textIcon( "Note" ), m_inplaceAlign( 0 ), + m_textIcon( "Comment" ), m_inplaceAlign( 0 ), m_inplaceIntent( TextAnnotation::Unknown ) { } @@ -1098,7 +1098,7 @@ void TextAnnotation::store( QDomNode & node, QDomDocument & document ) const // store the optional attributes if ( d->m_textType != Linked ) textElement.setAttribute( "type", (int)d->m_textType ); - if ( d->m_textIcon != "Comment" ) + if ( !d->m_textIcon.isEmpty() ) textElement.setAttribute( "icon", d->m_textIcon ); if ( d->m_textFont != QApplication::font() ) textElement.setAttribute( "font", d->m_textFont.toString() ); From e130068726c1cd2c4bb29263db338c99a490b2d1 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Tue, 22 May 2012 13:14:40 +0200 Subject: [PATCH 008/155] Show latex button when the annotation popup window is opened Check for latex contents after creating the MovableTitle, bacause it's in MovableTitle ctor where the containsLatex signal is connected. --- ui/annotwindow.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/annotwindow.cpp b/ui/annotwindow.cpp index dc84b6f7e..c1bafb9c4 100644 --- a/ui/annotwindow.cpp +++ b/ui/annotwindow.cpp @@ -202,9 +202,6 @@ AnnotWindow::AnnotWindow( QWidget * parent, Okular::Annotation * annot, Okular:: if (!canEditAnnotation) textEdit->setReadOnly(true); - m_latexRenderer = new GuiUtils::LatexRenderer(); - emit containsLatex( GuiUtils::LatexRenderer::mightContainLatex( GuiUtils::contents( m_annot ) ) ); - QVBoxLayout * mainlay = new QVBoxLayout( this ); mainlay->setMargin( 2 ); mainlay->setSpacing( 0 ); @@ -217,6 +214,9 @@ AnnotWindow::AnnotWindow( QWidget * parent, Okular::Annotation * annot, Okular:: QSizeGrip * sb = new QSizeGrip( this ); lowerlay->addWidget( sb ); + m_latexRenderer = new GuiUtils::LatexRenderer(); + emit containsLatex( GuiUtils::LatexRenderer::mightContainLatex( GuiUtils::contents( m_annot ) ) ); + m_title->setTitle( m_annot->window().summary() ); m_title->connectOptionButton( this, SLOT(slotOptionBtn()) ); From d0a05bc3019ca3111a4e814ba67d2f5113173333 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Tue, 22 May 2012 13:27:00 +0200 Subject: [PATCH 009/155] poppler gen: The "Hide annotations" print option has no effect on windows. Don't show it --- generators/poppler/generator_pdf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index a10dd5d39..9aec059d6 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -82,7 +82,7 @@ class PDFOptionsPage : public QWidget layout->addWidget(m_forceRaster); layout->addStretch(1); -#ifndef HAVE_POPPLER_0_20 +#if defined(Q_WS_WIN) || !defined(HAVE_POPPLER_0_20) m_printAnnots->setVisible( false ); #endif setPrintAnnots( true ); // Default value From 8ce3978caa74f7f840af8abedf2878c610312904 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Tue, 22 May 2012 13:50:44 +0200 Subject: [PATCH 010/155] poppler gen: Show inplace text annotations' contents with poppler 0.18 --- generators/poppler/annots.cpp | 18 ++++++++++++++++-- generators/poppler/generator_pdf.cpp | 6 ------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/generators/poppler/annots.cpp b/generators/poppler/annots.cpp index ad8189873..3d055e28c 100644 --- a/generators/poppler/annots.cpp +++ b/generators/poppler/annots.cpp @@ -350,12 +350,16 @@ Okular::Annotation* createAnnotationFromPopplerAnnotation( Poppler::Annotation * } if ( annotation ) { + // the Contents field might have lines separated by \r + QString contents = ann->contents(); + contents.replace( QLatin1Char( '\r' ), QLatin1Char( '\n' ) ); + annotation->setAuthor( ann->author() ); - annotation->setContents( ann->contents() ); + annotation->setContents( contents ); annotation->setUniqueName( ann->uniqueName() ); annotation->setModificationDate( ann->modificationDate() ); annotation->setCreationDate( ann->creationDate() ); - annotation->setFlags( ann->flags() ); + annotation->setFlags( ann->flags() | Okular::Annotation::External ); annotation->setBoundingRectangle( Okular::NormalizedRect::fromQRectF( ann->boundary() ) ); if (externallyDrawn) @@ -378,6 +382,16 @@ Okular::Annotation* createAnnotationFromPopplerAnnotation( Poppler::Annotation * } } +#ifndef HAVE_POPPLER_0_20 + // Poppler <0.20 returns the inplaceText in contents + if ( annotation->subType() == Okular::Annotation::AText ) + { + Okular::TextAnnotation * txtann = static_cast( annotation ); + if ( txtann->textType() == Okular::TextAnnotation::InPlace ) + txtann->setInplaceText( txtann->contents() ); + } +#endif + // TODO clone style // TODO clone window // TODO clone revisions diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index 9aec059d6..ce82568a9 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -1402,12 +1402,6 @@ void PDFGenerator::addAnnotations( Poppler::Page * popplerPage, Okular::Page * p Okular::Annotation * newann = createAnnotationFromPopplerAnnotation( a, &doDelete ); if (newann) { - // the Contents field has lines separated by \r - QString contents = newann->contents(); - contents.replace( QLatin1Char( '\r' ), QLatin1Char( '\n' ) ); - newann->setContents( contents ); - // explicitly mark as external - newann->setFlags( newann->flags() | Okular::Annotation::External ); page->addAnnotation(newann); if ( !doDelete ) From 7087f20f238ccd0b1ab97e977bc80789f1fdbdec Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Tue, 22 May 2012 13:52:28 +0200 Subject: [PATCH 011/155] poppler gen: Removed block of old debug and TODO comments --- generators/poppler/generator_pdf.cpp | 34 ---------------------------- 1 file changed, 34 deletions(-) diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index ce82568a9..851e0901f 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -1364,40 +1364,6 @@ void PDFGenerator::addAnnotations( Poppler::Page * popplerPage, Okular::Page * p foreach(Poppler::Annotation *a, popplerAnnotations) { - //a->window.width = (int)(page->width() * a->window.width); - //a->window.height = (int)(page->height() * a->window.height); - //a->window.width = a->window.width < 200 ? 200 : a->window.width; - // a->window.height = a->window.height < 120 ? 120 : a->window.height; - // resize annotation's geometry to an icon - // TODO okular geom.right = geom.left + 22.0 / page->width(); - // TODO okular geom.bottom = geom.top + 22.0 / page->height(); - /* - QString szanno; - QTextStream(&szanno)<<"PopplerAnnotation={author:"<author - <<", contents:"<contents - <<", uniqueName:"<uniqueName - <<", modifyDate:"<modifyDate.toString("hh:mm:ss, dd.MM.yyyy") - <<", creationDate:"<creationDate.toString("hh:mm:ss, dd.MM.yyyy") - <<", flags:"<flags - <<", boundary:"<boundary.left()<<","<boundary.top()<<","<boundary.right()<<","<boundary.bottom() - <<", style.color:"<style.color.name() - <<", style.opacity:"<style.opacity - <<", style.width:"<style.width - <<", style.LineStyle:"<style.style - <<", style.xyCorners:"<style.xCorners<<","<style.yCorners - <<", style.marks:"<style.marks - <<", style.spaces:"<style.spaces - <<", style.LineEffect:"<style.effect - <<", style.effectIntensity:"<style.effectIntensity - <<", window.flags:"<window.flags - <<", window.topLeft:"<<(a->window.topLeft.x()) - <<","<<(a->window.topLeft.y()) - <<", window.width,height:"<window.width<<","<window.height - <<", window.title:"<window.title - <<", window.summary:"<window.summary - <<", window.text:"<window.text; - kDebug(PDFDebug) << "astario: " << szanno; */ - //TODO add annotations after poppler write feather is full suported bool doDelete = true; Okular::Annotation * newann = createAnnotationFromPopplerAnnotation( a, &doDelete ); if (newann) From a6922a4430ec4bcb4d3b112ad4b6f97a752737cd Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Wed, 30 May 2012 18:33:07 +0200 Subject: [PATCH 012/155] Don't produce unusable file if user presses "Save As" on a .okular archive Make "Save As" behave like "Export as Document Archive" if we are saving a .okular file. BUG: 258475 --- part.cpp | 17 +++++++++++++++-- part.h | 1 + 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/part.cpp b/part.cpp index c344110d5..9741433c5 100644 --- a/part.cpp +++ b/part.cpp @@ -1175,12 +1175,18 @@ bool Part::openFile() mime = KMimeType::findByPath( fileNameToOpen ); } bool ok = false; + isDocumentArchive = false; if ( uncompressOk ) { if ( mime->is( "application/vnd.kde.okular-archive" ) ) + { ok = m_document->openDocumentArchive( fileNameToOpen, url() ); + isDocumentArchive = true; + } else + { ok = m_document->openDocument( fileNameToOpen, url(), mime ); + } } bool canSearch = m_document->supportsSearching(); @@ -1188,7 +1194,7 @@ bool Part::openFile() m_find->setEnabled( ok && canSearch ); m_findNext->setEnabled( ok && canSearch ); m_findPrev->setEnabled( ok && canSearch ); - if( m_saveAs ) m_saveAs->setEnabled( ok && m_document->canSaveChanges() ); + 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 ); m_printPreview->setEnabled( ok && m_document->printingSupport() != Okular::Document::NoPrinting ); @@ -1959,7 +1965,14 @@ bool Part::saveAs( const KUrl & saveUrl ) tf.close(); QString errorText; - if ( !m_document->saveChanges( fileName, &errorText ) ) + bool saved; + + if ( isDocumentArchive ) + saved = m_document->saveDocumentArchive( fileName ); + else + saved = m_document->saveChanges( fileName, &errorText ); + + if ( !saved ) { if (errorText.isEmpty()) { diff --git a/part.h b/part.h index 70b2afa2a..d9a5cc4c7 100644 --- a/part.h +++ b/part.h @@ -236,6 +236,7 @@ class Part : public KParts::ReadWritePart, public Okular::DocumentObserver, publ // the document Okular::Document * m_document; QString m_temporaryLocalFile; + bool isDocumentArchive; // main widgets Sidebar *m_sidebar; From 86c92ffec26b0a8e9f6e40767df0a57743224279 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Wed, 30 May 2012 18:38:51 +0200 Subject: [PATCH 013/155] Fixes against causes of annotation data loss + Improved GUI message logic 1) If the user had previously annotated the document with an old okular version and the document contains existing annotations and no /Encrypt (ie the case where annotation changes are no longer saved locally), make Document::saveDocumentInfo write the original unmodified local annotations back to XML, so that it seems that the original file was not changed. If the user makes annotation changes, code from previous patches already asks him to save them to a different document on close. 2) Ask "Save changes?" if the user has modified annotations in a .okular archive. BUG: 300197 3) Turned a "sorry" message in a "information" (with dontshowthisagain), because now we also have the "Save changes?" prompt to inform the user. 4) Suppressed all annotation-related message boxes on document opening --- core/document.cpp | 39 +++++++++++++++++++++++++++------------ core/document_p.h | 2 +- core/page.cpp | 19 ++++++++++++++----- core/page_p.h | 10 +++++++--- 4 files changed, 49 insertions(+), 21 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index 7d834f54c..3a09d08af 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -777,13 +777,14 @@ void DocumentPrivate::warnLimitedAnnotSupport() return; m_showWarningLimitedAnnotSupport = false; // Show the warning once - if ( canAddAnnotationsNatively() ) + if ( m_annotationsNeedSaveAs ) { - // Show only if there are external annotations (we follow the usual XML path otherwise) - if ( m_containsExternalAnnotations ) - KMessageBox::sorry( m_parent->widget(), i18n("Your annotation changes will not be saved automatically. Use File -> Save As...\nor your changes will be lost once the document is closed") ); + KMessageBox::information( m_parent->widget(), i18n("Your annotation changes will not be saved automatically. Use File -> Save As...\nor your changes will be lost once the document is closed"), QString(), "annotNeedSaveAs" ); } - else + + // Warn the user that he can only save as okular archive, but don't warn if + // this document is already an archive + if ( !canAddAnnotationsNatively() && !m_archiveData ) { KMessageBox::information( m_parent->widget(), i18n("You can save the annotated document using File -> Export As -> Document Archive"), QString(), "annotExportAsArchive" ); } @@ -810,8 +811,14 @@ void DocumentPrivate::saveDocumentInfo() const QDomElement pageList = doc.createElement( "pageList" ); root.appendChild( pageList ); PageItems saveWhat = AllPageItems; - if ( canAddAnnotationsNatively() && m_containsExternalAnnotations ) - saveWhat &= ~AnnotationPageItems; // Don't save local annotations in this case + if ( m_annotationsNeedSaveAs ) + { + /* In this case, if the user makes a modification, he's requested to + * save to a new document. Therefore, if there are existing local + * annotations, we save them back unmodified in the original + * document's metadata, so that it appears that it was not changed */ + saveWhat |= OriginalAnnotationPageItems; + } // .... save pages that hold data QVector< Page * >::const_iterator pIt = m_pagesVector.constBegin(), pEnd = m_pagesVector.constEnd(); for ( ; pIt != pEnd; ++pIt ) @@ -1678,24 +1685,32 @@ bool Document::openDocument( const QString & docFile, const KUrl& url, const KMi } d->m_generatorName = offer->name(); - d->m_containsExternalAnnotations = false; - d->m_showWarningLimitedAnnotSupport = true; + + bool containsExternalAnnotations = false; foreach ( Page * p, d->m_pagesVector ) { p->d->m_doc = d; if ( !p->annotations().empty() ) - d->m_containsExternalAnnotations = true; + containsExternalAnnotations = true; } + // Be quiet while restoring local annotations + d->m_showWarningLimitedAnnotSupport = false; + d->m_annotationsNeedSaveAs = false; + // 2. load Additional Data (bookmarks, local annotations and metadata) about the document if ( d->m_archiveData ) { d->loadDocumentInfo( d->m_archiveData->metadataFileName ); + d->m_annotationsNeedSaveAs = true; } else { d->loadDocumentInfo(); + d->m_annotationsNeedSaveAs = ( d->canAddAnnotationsNatively() && containsExternalAnnotations ); } + + d->m_showWarningLimitedAnnotSupport = true; d->m_bookmarkManager->setUrl( d->m_url ); // 3. setup observers inernal lists and data @@ -2361,8 +2376,8 @@ void DocumentPrivate::notifyAnnotationChanges( int page ) { int flags = DocumentObserver::Annotations; - if ( canAddAnnotationsNatively() && m_containsExternalAnnotations ) - flags |= DocumentObserver::NeedSaveAs; // Annotations are not saved locally in this case + if ( m_annotationsNeedSaveAs ) + flags |= DocumentObserver::NeedSaveAs; foreachObserverD( notifyPageChanged( page, flags ) ); } diff --git a/core/document_p.h b/core/document_p.h index 1db982878..909325365 100644 --- a/core/document_p.h +++ b/core/document_p.h @@ -236,8 +236,8 @@ class DocumentPrivate QSet< View * > m_views; bool m_annotationEditingEnabled; + bool m_annotationsNeedSaveAs; bool m_annotationBeingMoved; // is an annotation currently being moved? - bool m_containsExternalAnnotations; // set on opening and never changed bool m_showWarningLimitedAnnotSupport; }; diff --git a/core/page.cpp b/core/page.cpp index 641e8cfe3..c778fe286 100644 --- a/core/page.cpp +++ b/core/page.cpp @@ -736,6 +736,9 @@ void PagePrivate::restoreLocalContents( const QDomNode & pageNode ) QTime time; time.start(); #endif + // Clone annotationList as root node in restoredLocalAnnotationList + const QDomNode clonedNode = restoredLocalAnnotationList.importNode( childElement, true ); + restoredLocalAnnotationList.appendChild( clonedNode ); // iterate over all annotations QDomNode annotationNode = childElement.firstChild(); @@ -803,10 +806,6 @@ void PagePrivate::restoreLocalContents( const QDomNode & pageNode ) void PagePrivate::saveLocalContents( QDomNode & parentNode, QDomDocument & document, PageItems what ) const { - // only add a node if there is some stuff to write into - if ( m_page->m_annotations.isEmpty() && formfields.isEmpty() ) - return; - // create the page node and set the 'number' attribute QDomElement pageElement = document.createElement( "page" ); pageElement.setAttribute( "number", m_number ); @@ -825,7 +824,17 @@ void PagePrivate::saveLocalContents( QDomNode & parentNode, QDomDocument & docum #endif // add annotations info if has got any - if ( ( what & AnnotationPageItems ) && !m_page->m_annotations.isEmpty() ) + if ( ( what & AnnotationPageItems ) && ( what & OriginalAnnotationPageItems ) ) + { + const QDomElement savedDocRoot = restoredLocalAnnotationList.documentElement(); + if ( !savedDocRoot.isNull() ) + { + // Import and append node in target document + const QDomNode importedNode = document.importNode( savedDocRoot, true ); + pageElement.appendChild( importedNode ); + } + } + else if ( ( what & AnnotationPageItems ) && !m_page->m_annotations.isEmpty() ) { // create the annotationList QDomElement annotListElement = document.createElement( "annotationList" ); diff --git a/core/page_p.h b/core/page_p.h index 4cbfb193a..02281f1ae 100644 --- a/core/page_p.h +++ b/core/page_p.h @@ -16,14 +16,13 @@ #include #include #include +#include // local includes #include "global.h" #include "area.h" class QColor; -class QDomDocument; -class QDomNode; namespace Okular { @@ -43,7 +42,11 @@ enum PageItem None = 0, AnnotationPageItems = 0x01, FormFieldPageItems = 0x02, - AllPageItems = 0xff + AllPageItems = 0xff, + + /* If set along with AnnotationPageItems, tells saveLocalContents to save + * the original annotations (if any) instead of the modified ones */ + OriginalAnnotationPageItems = 0x100 }; Q_DECLARE_FLAGS(PageItems, PageItem) @@ -125,6 +128,7 @@ class PagePrivate QString m_label; bool m_isBoundingBoxKnown : 1; + QDomDocument restoredLocalAnnotationList; // ... }; } From 4d06efb64d5e83a64b6e1333bd188af092b8f3a3 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Thu, 31 May 2012 20:22:14 +0200 Subject: [PATCH 014/155] Do not crash if the user attempts to draw on the presentation summary frame --- ui/presentationwidget.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ui/presentationwidget.cpp b/ui/presentationwidget.cpp index a3b8be447..229e838e3 100644 --- a/ui/presentationwidget.cpp +++ b/ui/presentationwidget.cpp @@ -573,6 +573,7 @@ void PresentationWidget::mouseMoveEvent( QMouseEvent * e ) if ( m_drawingEngine && e->buttons() != Qt::NoButton ) { QRect r = routeMouseDrawingEvent( e ); + if ( r.isValid() ) { m_drawingRect |= r.translated( m_frames[ m_frameIndex ]->geometry.topLeft() ); update( m_drawingRect ); @@ -1094,6 +1095,9 @@ void PresentationWidget::generateOverlay() QRect PresentationWidget::routeMouseDrawingEvent( QMouseEvent * e ) { + if ( m_frameIndex == -1 ) // Can't draw on the summary page + return QRect(); + const QRect & geom = m_frames[ m_frameIndex ]->geometry; const Okular::Page * page = m_frames[ m_frameIndex ]->page; From ac695d448db95d2e31ba1c3469694e2a576185b4 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Fri, 1 Jun 2012 22:55:54 +0200 Subject: [PATCH 015/155] Do not close the document in Shell::queryClose() Because if we do, Shell::saveProperties will find it closed and won't save the session correctly. BUG: 300985 --- part.cpp | 2 +- shell/shell.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/part.cpp b/part.cpp index 9741433c5..1cb9be791 100644 --- a/part.cpp +++ b/part.cpp @@ -798,7 +798,7 @@ Part::~Part() m_document->removeObserver( this ); if ( m_document->isOpened() ) - Part::closeUrl(); + Part::closeUrl( false ); delete m_toc; delete m_pageView; diff --git a/shell/shell.cpp b/shell/shell.cpp index 1c126f6e4..8b42a2759 100644 --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -340,7 +340,7 @@ QSize Shell::sizeHint() const bool Shell::queryClose() { - return m_part ? m_part->closeUrl() : true; + return m_part ? m_part->queryClose() : true; } #include "shell.moc" From 07c4a16da596cbba2c4101b724b6df5bdb7067e3 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Tue, 5 Jun 2012 00:31:28 +0200 Subject: [PATCH 016/155] Make it possible to type a page number and press enter in Print Preview Do not close Print Preview if enter is pressed --- ui/fileprinterpreview.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/fileprinterpreview.cpp b/ui/fileprinterpreview.cpp index b19dd0768..85fa32aeb 100644 --- a/ui/fileprinterpreview.cpp +++ b/ui/fileprinterpreview.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -128,6 +129,7 @@ FilePrinterPreview::FilePrinterPreview( const QString &filename, QWidget *parent // Set up the dialog setCaption(i18n("Print Preview")); setButtons(KDialog::Close); + button(KDialog::Close)->setAutoDefault(false); restoreDialogSize(d->config->group("Print Preview")); } From 9a11294b12361a99a263e71aba25c6806ab63ca8 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Mon, 4 Jun 2012 16:10:33 +0200 Subject: [PATCH 017/155] Sort bookmarks from the same page in viewport order --- core/bookmarkmanager.cpp | 25 ++++--------------------- core/document.cpp | 19 +++++++++++++++++++ core/document.h | 1 + ui/bookmarklist.cpp | 4 +--- 4 files changed, 25 insertions(+), 24 deletions(-) diff --git a/core/bookmarkmanager.cpp b/core/bookmarkmanager.cpp index b9f88c4fa..accd65f6f 100644 --- a/core/bookmarkmanager.cpp +++ b/core/bookmarkmanager.cpp @@ -73,29 +73,12 @@ static inline bool documentViewportFuzzyCompare( const DocumentViewport &vp1, co return true; } -static inline bool documentViewportLessThan( const DocumentViewport &vp1, const DocumentViewport &vp2 ) -{ - if ( vp1.pageNumber != vp2.pageNumber ) - return vp1.pageNumber < vp2.pageNumber; - - if ( !vp1.rePos.enabled && vp2.rePos.enabled ) - return true; - - if ( !vp2.rePos.enabled ) - return false; - - if ( vp1.rePos.normalizedY != vp2.rePos.normalizedY ) - return vp1.rePos.normalizedY < vp2.rePos.normalizedY; - - return vp1.rePos.normalizedX < vp2.rePos.normalizedX; -} - static inline bool bookmarkLessThan( const KBookmark &b1, const KBookmark &b2 ) { DocumentViewport vp1( b1.url().htmlRef() ); DocumentViewport vp2( b2.url().htmlRef() ); - return documentViewportLessThan( vp1, vp2 ); + return vp1 < vp2; } static inline bool okularBookmarkActionLessThan( QAction * a1, QAction * a2 ) @@ -103,7 +86,7 @@ static inline bool okularBookmarkActionLessThan( QAction * a1, QAction * a2 ) DocumentViewport vp1( static_cast< OkularBookmarkAction * >( a1 )->htmlRef() ); DocumentViewport vp2( static_cast< OkularBookmarkAction * >( a2 )->htmlRef() ); - return documentViewportLessThan( vp1, vp2 ); + return vp1 < vp2; } class BookmarkManager::Private : public KBookmarkOwner @@ -724,7 +707,7 @@ KBookmark BookmarkManager::nextBookmark( const DocumentViewport &viewport) const foreach ( const KBookmark &bm, bmarks ) { DocumentViewport vp( bm.url().htmlRef() ); - if ( documentViewportLessThan( viewport, vp ) ) + if ( viewport < vp ) { bookmark = bm; break; @@ -744,7 +727,7 @@ KBookmark BookmarkManager::previousBookmark( const DocumentViewport &viewport ) { KBookmark bm = *(it-1); DocumentViewport vp( bm.url().htmlRef() ); - if ( documentViewportLessThan( vp, viewport ) ) + if ( vp < viewport ) { bookmark = bm; break; diff --git a/core/document.cpp b/core/document.cpp index 3a09d08af..7c49868e1 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -4053,6 +4053,25 @@ bool DocumentViewport::operator==( const DocumentViewport & vp ) const return true; } +bool DocumentViewport::operator<( const DocumentViewport & vp ) const +{ + // TODO: Check autoFit and Position + + if ( pageNumber != vp.pageNumber ) + return pageNumber < vp.pageNumber; + + if ( !rePos.enabled && vp.rePos.enabled ) + return true; + + if ( !vp.rePos.enabled ) + return false; + + if ( rePos.normalizedY != vp.rePos.normalizedY ) + return rePos.normalizedY < vp.rePos.normalizedY; + + return rePos.normalizedX < vp.rePos.normalizedX; +} + /** DocumentInfo **/ diff --git a/core/document.h b/core/document.h index 680cd9064..bda43072e 100644 --- a/core/document.h +++ b/core/document.h @@ -837,6 +837,7 @@ class OKULAR_EXPORT DocumentViewport * @internal */ bool operator==( const DocumentViewport &other ) const; + bool operator<( const DocumentViewport &other ) const; /** * The number of the page nearest the center of the viewport. diff --git a/ui/bookmarklist.cpp b/ui/bookmarklist.cpp index 0b61104c9..e1b386904 100644 --- a/ui/bookmarklist.cpp +++ b/ui/bookmarklist.cpp @@ -62,9 +62,7 @@ class BookmarkItem : public QTreeWidgetItem if ( other.type() == BookmarkItemType ) { const BookmarkItem *cmp = static_cast< const BookmarkItem* >( &other ); - const int v = m_viewport.pageNumber - cmp->m_viewport.pageNumber; - if ( v != 0 ) - return v < 0; + return m_viewport < cmp->m_viewport; } return QTreeWidgetItem::operator<( other ); } From f96839c12318d1ae07bfcd45abc03d39b465a7b6 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Tue, 5 Jun 2012 23:59:54 +0200 Subject: [PATCH 018/155] Do not crash on file from bug 300477 You also need a new (as of now unreleaed) version of libepub BUGS: 300477 FIXED-IN: 4.9.0 --- generators/epub/converter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/epub/converter.cpp b/generators/epub/converter.cpp index 96652b50d..74df151a3 100644 --- a/generators/epub/converter.cpp +++ b/generators/epub/converter.cpp @@ -188,7 +188,7 @@ QTextDocument* Converter::convert( const QString &fileName ) if (mSectionMap.contains(link)) { block = mSectionMap.value(link); } else { // load missing resource - char *data; + char *data = 0; int size = epub_get_data(mTextDocument->getEpub(), clink, &data); if (data) { _cursor->insertBlock(); From c8bc6dabeb53f9a963c0663a8de6d274e349bd0e Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Wed, 6 Jun 2012 22:07:16 +0200 Subject: [PATCH 019/155] Fixes in presentation page switch logic Do not assume that oldPage == m_document->viewport().pageNumber, because it's false if we are processing a viewport change notification. It caused presentation drawings to turn into persistent annotations, when switching page from the main okular window. In general, this patch also tidies up PresentationWidget::changePage a bit: - Removed redundant checks: they are always true - Removed duplicated code that performed the page opening actions: Previously the first slide and the other ones followed different code paths, both doing the same things. I unified them. I also changed slotNextPage so that it never sets m_frameIndex = -1, because it confuses changePage and makes it skip page closing actions. --- ui/presentationwidget.cpp | 91 +++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 52 deletions(-) diff --git a/ui/presentationwidget.cpp b/ui/presentationwidget.cpp index 229e838e3..61d2b7f57 100644 --- a/ui/presentationwidget.cpp +++ b/ui/presentationwidget.cpp @@ -779,9 +779,32 @@ void PresentationWidget::changePage( int newPage ) if ( m_frameIndex == newPage ) return; - const int oldIndex = m_frameIndex; - // check if pixmap exists or else request it + // prepare to leave the current page + if ( m_frameIndex != -1 ) + { + // remove the drawings on the old page before switching + clearDrawings(); + + // stop video playback + Q_FOREACH ( VideoWidget *vw, m_frames[ m_frameIndex ]->videoWidgets ) + { + vw->stop(); + vw->hide(); + } + + // stop audio playback, if any + Okular::AudioPlayer::instance()->stopPlaybacks(); + + // perform the page closing action, if any + if ( m_document->page( m_frameIndex )->pageAction( Okular::Page::Closing ) ) + m_document->processAction( m_document->page( m_frameIndex )->pageAction( Okular::Page::Closing ) ); + } + + // switch to newPage m_frameIndex = newPage; + m_document->setViewportPage( m_frameIndex, PRESENTATION_ID ); + + // check if pixmap exists or else request it PresentationFrame * frame = m_frames[ m_frameIndex ]; int pixW = frame->geometry.width(); int pixH = frame->geometry.height(); @@ -803,51 +826,13 @@ void PresentationWidget::changePage( int newPage ) generatePage(); } - // set a new viewport in document if page number differs - if ( m_frameIndex != -1 && m_frameIndex != m_document->viewport().pageNumber ) - { - // stop the audio playback, if any - Okular::AudioPlayer::instance()->stopPlaybacks(); - // perform the page closing action, if any - if ( m_document->page( m_document->viewport().pageNumber )->pageAction( Okular::Page::Closing ) ) - m_document->processAction( m_document->page( m_document->viewport().pageNumber )->pageAction( Okular::Page::Closing ) ); + // perform the page opening action, if any + if ( m_document->page( m_frameIndex )->pageAction( Okular::Page::Opening ) ) + m_document->processAction( m_document->page( m_frameIndex )->pageAction( Okular::Page::Opening ) ); - // remove the drawing on the old page before switching - clearDrawings(); - m_document->setViewportPage( m_frameIndex, PRESENTATION_ID ); - - // perform the page opening action, if any - if ( m_document->page( m_frameIndex)->pageAction( Okular::Page::Opening ) ) - m_document->processAction( m_document->page( m_frameIndex )->pageAction( Okular::Page::Opening ) ); - - Q_FOREACH ( VideoWidget *vw, m_frames[ m_frameIndex ]->videoWidgets ) - { - vw->pageEntered(); - } - } - - if ( oldIndex != m_frameIndex ) - { - if ( oldIndex != -1 ) - { - Q_FOREACH ( VideoWidget *vw, m_frames[ oldIndex ]->videoWidgets ) - { - vw->stop(); - vw->hide(); - } - } - else - { - // we have just opened the presentation view - if ( m_document->page( m_frameIndex )->pageAction( Okular::Page::Opening ) ) - m_document->processAction( m_document->page( m_frameIndex )->pageAction( Okular::Page::Opening ) ); - - Q_FOREACH ( VideoWidget *vw, m_frames[ m_frameIndex ]->videoWidgets ) - { - vw->pageEntered(); - } - } - } + // start autoplay video playback + Q_FOREACH ( VideoWidget *vw, m_frames[ m_frameIndex ]->videoWidgets ) + vw->pageEntered(); } void PresentationWidget::generatePage( bool disableTransition ) @@ -1222,14 +1207,16 @@ void PresentationWidget::requestPixmaps() void PresentationWidget::slotNextPage() { - // loop when configured - if ( m_frameIndex == (int)m_frames.count() - 1 && Okular::Settings::slidesLoop() ) - m_frameIndex = -1; + int nextIndex = m_frameIndex + 1; - if ( m_frameIndex < (int)m_frames.count() - 1 ) + // loop when configured + if ( nextIndex == m_frames.count() && Okular::Settings::slidesLoop() ) + nextIndex = 0; + + if ( nextIndex < m_frames.count() ) { // go to next page - changePage( m_frameIndex + 1 ); + changePage( nextIndex ); // auto advance to the next page if set startAutoChangeTimer(); } @@ -1369,7 +1356,7 @@ void PresentationWidget::togglePencilMode( bool on ) void PresentationWidget::clearDrawings() { - m_document->removePageAnnotations( m_document->viewport().pageNumber, m_currentPageDrawings ); + m_document->removePageAnnotations( m_frameIndex, m_currentPageDrawings ); m_currentPageDrawings.clear(); } From 3a383f64fd569a863c43de63ee000a353f8c7d3b Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Thu, 7 Jun 2012 15:48:53 +0200 Subject: [PATCH 020/155] Store and render presentation drawings at UI level instead of involving core. This prevents spurious annotation warnings from being shown in presentation mode. BUG: 300938 --- ui/annotationtools.cpp | 30 ++++++++++++++++++++++++++++-- ui/annotationtools.h | 14 ++++++++++++++ ui/presentationwidget.cpp | 26 ++++++++++++++++++-------- ui/presentationwidget.h | 6 +++--- 4 files changed, 63 insertions(+), 13 deletions(-) diff --git a/ui/annotationtools.cpp b/ui/annotationtools.cpp index cfa47b5b6..40fa6fe6b 100644 --- a/ui/annotationtools.cpp +++ b/ui/annotationtools.cpp @@ -50,6 +50,10 @@ AnnotatorEngine::~AnnotatorEngine() { } +SmoothPath::SmoothPath( const QLinkedList &points, const QPen &pen ) + : points ( points ), pen ( pen ) +{ +} /** SmoothPathEngine */ SmoothPathEngine::SmoothPathEngine( const QDomElement & engineElement ) @@ -112,12 +116,20 @@ QRect SmoothPathEngine::event( EventType type, Button button, double nX, double } void SmoothPathEngine::paint( QPainter * painter, double xScale, double yScale, const QRect & /*clipRect*/ ) +{ + // use engine's color for painting + const SmoothPath path( points, QPen(m_engineColor, 1) ); + + // draw the path + path.paint( painter, xScale, yScale ); +} + +void SmoothPath::paint( QPainter * painter, double xScale, double yScale ) const { // draw SmoothPaths with at least 2 points if ( points.count() > 1 ) { - // use engine's color for painting - painter->setPen( QPen( m_engineColor, 1 ) ); + painter->setPen( pen ); QLinkedList::const_iterator pIt = points.begin(), pEnd = points.end(); Okular::NormalizedPoint pA = *pIt; @@ -173,3 +185,17 @@ QList< Okular::Annotation* > SmoothPathEngine::end() return QList< Okular::Annotation* >() << ann; } +SmoothPath SmoothPathEngine::endSmoothPath() +{ + m_creationCompleted = false; + + double width = 1; + if ( m_annotElement.hasAttribute( "width" ) ) + width = m_annotElement.attribute( "width" ).toDouble(); + + QColor color( m_annotElement.hasAttribute( "color" ) ? + m_annotElement.attribute( "color" ) : m_engineColor ); + + return SmoothPath( points, QPen(color, width) ); +} + diff --git a/ui/annotationtools.h b/ui/annotationtools.h index 600de6c6d..7107042e0 100644 --- a/ui/annotationtools.h +++ b/ui/annotationtools.h @@ -12,6 +12,7 @@ #include #include +#include #include #include "core/area.h" @@ -64,6 +65,17 @@ class AnnotatorEngine PageViewItem * m_item; }; +class SmoothPath +{ + public: + SmoothPath( const QLinkedList &points, const QPen &pen ); + void paint( QPainter * painter, double xScale, double yScale ) const; + + private: + const QLinkedList points; + const QPen pen; +}; + /** @short SmoothPathEngine */ class SmoothPathEngine : public AnnotatorEngine @@ -75,7 +87,9 @@ class SmoothPathEngine void paint( QPainter * painter, double xScale, double yScale, const QRect & /*clipRect*/ ); + // These are two alternative ways to get the resulting path. Don't call them both! QList< Okular::Annotation* > end(); + SmoothPath endSmoothPath(); private: // data diff --git a/ui/presentationwidget.cpp b/ui/presentationwidget.cpp index 61d2b7f57..e9fb74260 100644 --- a/ui/presentationwidget.cpp +++ b/ui/presentationwidget.cpp @@ -266,7 +266,6 @@ PresentationWidget::~PresentationWidget() disconnect( drawingAct, 0, this, 0 ); if ( drawingAct->isChecked() ) drawingAct->toggle(); - m_document->removePageAnnotations( m_document->viewport().pageNumber, m_currentPageDrawings ); delete m_drawingEngine; // delete frames @@ -526,15 +525,17 @@ void PresentationWidget::mouseReleaseEvent( QMouseEvent * e ) (void)r; if ( m_drawingEngine->creationCompleted() ) { - QList< Okular::Annotation * > annots = m_drawingEngine->end(); + // add drawing to current page + m_currentPageDrawings << m_drawingEngine->endSmoothPath(); + // manually disable and re-enable the pencil mode, so we can do // cleaning of the actual drawer and create a new one just after // that - that gives continuous drawing togglePencilMode( false ); togglePencilMode( true ); - foreach( Okular::Annotation * ann, annots ) - m_document->addPageAnnotation( m_frameIndex, ann ); - m_currentPageDrawings << annots; + + // schedule repaint + update(); } return; } @@ -660,12 +661,21 @@ void PresentationWidget::paintEvent( QPaintEvent * pe ) // copy the rendered pixmap to the screen painter.drawPixmap( r.topLeft(), m_lastRenderedPixmap, r ); } - if ( m_drawingEngine && m_drawingRect.intersects( pe->rect() ) ) + + // paint drawings + if ( m_frameIndex != -1 ) { const QRect & geom = m_frames[ m_frameIndex ]->geometry; painter.save(); painter.translate( geom.topLeft() ); - m_drawingEngine->paint( &painter, geom.width(), geom.height(), m_drawingRect.intersect( pe->rect() ) ); + painter.setRenderHints( QPainter::Antialiasing ); + + foreach ( const SmoothPath &drawing, m_currentPageDrawings ) + drawing.paint( &painter, geom.width(), geom.height() ); + + if ( m_drawingEngine && m_drawingRect.intersects( pe->rect() ) ) + m_drawingEngine->paint( &painter, geom.width(), geom.height(), m_drawingRect.intersect( pe->rect() ) ); + painter.restore(); } painter.end(); @@ -1356,8 +1366,8 @@ void PresentationWidget::togglePencilMode( bool on ) void PresentationWidget::clearDrawings() { - m_document->removePageAnnotations( m_frameIndex, m_currentPageDrawings ); m_currentPageDrawings.clear(); + update(); } void PresentationWidget::screenResized( int screen ) diff --git a/ui/presentationwidget.h b/ui/presentationwidget.h index 126985eb5..20dbcbb8a 100644 --- a/ui/presentationwidget.h +++ b/ui/presentationwidget.h @@ -14,6 +14,7 @@ #include #include #include +#include "ui/annotationtools.h" #include "core/area.h" #include "core/observer.h" #include "core/pagetransition.h" @@ -23,7 +24,6 @@ class QToolBar; class QTimer; class KActionCollection; class KSelectAction; -class AnnotatorEngine; struct PresentationFrame; class PresentationSearchBar; @@ -104,8 +104,8 @@ class PresentationWidget : public QWidget, public Okular::DocumentObserver QRect m_overlayGeometry; const Okular::Action * m_pressedLink; bool m_handCursor; - QList< Okular::Annotation * > m_currentPageDrawings; - AnnotatorEngine * m_drawingEngine; + QLinkedList< SmoothPath > m_currentPageDrawings; + SmoothPathEngine * m_drawingEngine; QRect m_drawingRect; int m_screen; int m_screenInhibitCookie; From dee51ee71b336594c80fb6e45e9e59d027c323c4 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Thu, 7 Jun 2012 16:35:13 +0200 Subject: [PATCH 021/155] Disable presentation-related actions if presentation mode is not open - Keep "Toggle drawing mode", "Erase Drawings" and "Switch blackscreen mode" actions disabled unless the presentation mode is open. - Uncheck blackscreen mode on presentation exit --- part.cpp | 3 +++ ui/presentationwidget.cpp | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/part.cpp b/part.cpp index 1cb9be791..aaeaf8b7d 100644 --- a/part.cpp +++ b/part.cpp @@ -782,14 +782,17 @@ void Part::setupActions() ac->addAction( "switch_blackscreen_mode", blackscreenAction ); blackscreenAction->setShortcut( QKeySequence( Qt::Key_B ) ); blackscreenAction->setIcon( KIcon( "view-presentation" ) ); + blackscreenAction->setEnabled( false ); KToggleAction *drawingAction = new KToggleAction( i18n( "Toggle Drawing Mode" ), ac ); ac->addAction( "presentation_drawing_mode", drawingAction ); drawingAction->setIcon( KIcon( "draw-freehand" ) ); + drawingAction->setEnabled( false ); KAction *eraseDrawingAction = new KAction( i18n( "Erase Drawings" ), ac ); ac->addAction( "presentation_erase_drawings", eraseDrawingAction ); eraseDrawingAction->setIcon( KIcon( "draw-eraser" ) ); + eraseDrawingAction->setEnabled( false ); } Part::~Part() diff --git a/ui/presentationwidget.cpp b/ui/presentationwidget.cpp index e9fb74260..fad832698 100644 --- a/ui/presentationwidget.cpp +++ b/ui/presentationwidget.cpp @@ -173,9 +173,11 @@ PresentationWidget::PresentationWidget( QWidget * parent, Okular::Document * doc m_topBar->addSeparator(); QAction *drawingAct = collection->action( "presentation_drawing_mode" ); connect( drawingAct, SIGNAL(toggled(bool)), SLOT(togglePencilMode(bool)) ); + drawingAct->setEnabled( true ); m_topBar->addAction( drawingAct ); addAction( drawingAct ); QAction *eraseDrawingAct = collection->action( "presentation_erase_drawings" ); + eraseDrawingAct->setEnabled( true ); connect( eraseDrawingAct, SIGNAL(triggered()), SLOT(clearDrawings()) ); m_topBar->addAction( eraseDrawingAct ); addAction( eraseDrawingAct ); @@ -264,8 +266,15 @@ PresentationWidget::~PresentationWidget() QAction *drawingAct = m_ac->action( "presentation_drawing_mode" ); disconnect( drawingAct, 0, this, 0 ); - if ( drawingAct->isChecked() ) - drawingAct->toggle(); + drawingAct->setChecked( false ); + drawingAct->setEnabled( false ); + + QAction *eraseDrawingAct = m_ac->action( "presentation_erase_drawings" ); + eraseDrawingAct->setEnabled( false ); + + QAction *blackScreenAct = m_ac->action( "switch_blackscreen_mode" ); + blackScreenAct->setChecked( false ); + blackScreenAct->setEnabled( false ); delete m_drawingEngine; // delete frames @@ -382,6 +391,7 @@ void PresentationWidget::setupActions( KActionCollection * collection ) QAction *action = m_ac->action( "switch_blackscreen_mode" ); connect( action, SIGNAL(toggled(bool)), SLOT(toggleBlackScreenMode(bool)) ); + action->setEnabled( true ); addAction( action ); } From 5930478352ed89e021e7f5a10de40e1fe3f20319 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Thu, 7 Jun 2012 17:05:00 +0200 Subject: [PATCH 022/155] Keep original filename when creating a .okular archive from a .okular archive This patch makes sure that the file saved in the .okular file keeps the original filename (and, in particular, the extension) even if the user is re-exporting a .okular archive as .okular archive. Before this patch, the file boundled in the .okular archive would be named like the .okular file it was exported from (eg foo.okular instead of foo.pdf). Note: Okular had no problems in reopening it, but advanced users unpacking the ZIP file obtained a .okular file which is actually a native file, and not an okular archive. --- core/document.cpp | 5 ++++- core/document_p.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/core/document.cpp b/core/document.cpp index 7c49868e1..f250964b1 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -3625,6 +3625,7 @@ bool Document::openDocumentArchive( const QString & docFile, const KUrl & url ) const KMimeType::Ptr docMime = KMimeType::findByPath( tempFileName, 0, true /* local file */ ); d->m_archiveData = archiveData.get(); + d->m_archivedFileName = documentFileName; bool ret = openDocument( tempFileName, url, docMime ); if ( ret ) @@ -3644,7 +3645,9 @@ bool Document::saveDocumentArchive( const QString &fileName ) if ( !d->m_generator ) return false; - QString docFileName = d->m_url.fileName(); + /* If we opened an archive, use the name of original file (eg foo.pdf) + * instead of the archive's one (eg foo.okular) */ + QString docFileName = d->m_archiveData ? d->m_archivedFileName : d->m_url.fileName(); if ( docFileName == QLatin1String( "-" ) ) return false; diff --git a/core/document_p.h b/core/document_p.h index 909325365..b9186e225 100644 --- a/core/document_p.h +++ b/core/document_p.h @@ -227,6 +227,7 @@ class DocumentPrivate Scripter *m_scripter; ArchiveData *m_archiveData; + QString m_archivedFileName; QPointer< FontExtractionThread > m_fontThread; bool m_fontsCached; From c5391e464316c969a39506d1fcdf099f28c05f74 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Tue, 5 Jun 2012 11:04:09 +0200 Subject: [PATCH 023/155] Restore default "Note" stamp for linked text annotations It was "Note" before d2fa4c9, but it was changed to "Comment" for compatibility reasons. Setting it to "Note", this time in UI code, doesn't break d2fa4c9 and restores the default icon users are used to. --- ui/pageviewannotator.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/pageviewannotator.cpp b/ui/pageviewannotator.cpp index 3f2b38382..52a464b7e 100644 --- a/ui/pageviewannotator.cpp +++ b/ui/pageviewannotator.cpp @@ -187,6 +187,7 @@ class PickPointEngine : public AnnotatorEngine Okular::TextAnnotation * ta = new Okular::TextAnnotation(); ann = ta; ta->setTextType( Okular::TextAnnotation::Linked ); + ta->setTextIcon( "Note" ); ta->window().setText( QString() ); //ta->window.flags &= ~(Okular::Annotation::Hidden); double iconhei=0.03; From 07495549bbb19448cb5073737b0fe97a8feb7d55 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Thu, 7 Jun 2012 22:47:34 +0200 Subject: [PATCH 024/155] Bump versions --- VERSION | 2 +- core/version.h | 4 ++-- generators/epub/generator_epub.cpp | 2 +- generators/poppler/generator_pdf.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/VERSION b/VERSION index 70feb6d0f..a715f6910 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -okular v0.14.80 +okular v0.14.90 diff --git a/core/version.h b/core/version.h index 27467c884..f5cb21008 100644 --- a/core/version.h +++ b/core/version.h @@ -10,10 +10,10 @@ #ifndef _OKULAR_VERSION_H_ #define _OKULAR_VERSION_H_ -#define OKULAR_VERSION_STRING "0.14.80" +#define OKULAR_VERSION_STRING "0.14.90" #define OKULAR_VERSION_MAJOR 0 #define OKULAR_VERSION_MINOR 14 -#define OKULAR_VERSION_RELEASE 80 +#define OKULAR_VERSION_RELEASE 90 #define OKULAR_MAKE_VERSION( a,b,c ) (((a) << 16) | ((b) << 8) | (c)) #define OKULAR_VERSION \ diff --git a/generators/epub/generator_epub.cpp b/generators/epub/generator_epub.cpp index c329dd857..59bb2bf54 100644 --- a/generators/epub/generator_epub.cpp +++ b/generators/epub/generator_epub.cpp @@ -19,7 +19,7 @@ static KAboutData createAboutData() "okular_epub", "okular_epub", ki18n("EPub Backend"), - "0.2", + "0.2.1", ki18n("An EPub backend"), KAboutData::License_GPL, ki18n("© 2008 Ely Levy") diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index 851e0901f..ffa0def84 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -358,7 +358,7 @@ static KAboutData createAboutData() "okular_poppler", "okular_poppler", ki18n( "PDF Backend" ), - "0.6", + "0.6.1", ki18n( "A PDF file renderer" ), KAboutData::License_GPL, ki18n( "© 2005-2008 Albert Astals Cid" ) From 42c4e4c5dbd3838f3d9c2ff538f247c75ef5e21d Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Sun, 10 Jun 2012 18:28:47 +0200 Subject: [PATCH 025/155] TextAnnotation stamp: fix icon name mismatch in DOM methods with poppler 0.20.1 Fixes the situation where Poppler thinks "Note" and omits the icon attribute, Okular sees nothing and defaults to "Comment". --- generators/poppler/annots.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/generators/poppler/annots.cpp b/generators/poppler/annots.cpp index 3d055e28c..06128c54c 100644 --- a/generators/poppler/annots.cpp +++ b/generators/poppler/annots.cpp @@ -382,15 +382,26 @@ Okular::Annotation* createAnnotationFromPopplerAnnotation( Poppler::Annotation * } } -#ifndef HAVE_POPPLER_0_20 - // Poppler <0.20 returns the inplaceText in contents if ( annotation->subType() == Okular::Annotation::AText ) { Okular::TextAnnotation * txtann = static_cast( annotation ); + if ( txtann->textType() == Okular::TextAnnotation::InPlace ) + { +#ifndef HAVE_POPPLER_0_20 + // Poppler before 0.20 returns the inplaceText in contents txtann->setInplaceText( txtann->contents() ); - } #endif + } + else if ( txtann->textType() == Okular::TextAnnotation::Linked ) + { + Poppler::TextAnnotation * ppl_txtann = static_cast( ann ); + + // Poppler and Okular assume a different default icon name in XML + // We re-read it via getter, which always tells the right one + txtann->setTextIcon( ppl_txtann->textIcon() ); + } + } // TODO clone style // TODO clone window From 7e8aed437633c55116839c6f5fb5f795d3201deb Mon Sep 17 00:00:00 2001 From: Pino Toscano Date: Sun, 10 Jun 2012 22:04:27 +0200 Subject: [PATCH 026/155] add the svg of the annotation tool icons as of Eugene Trounev sent them to me more than three years ago, just gz-compressing them now; followup of b8111867815d612ac2335f8de6210ddcb18014c5 (apparently I forgot to commit them at that time) --- ui/data/sources/tool-ellipse-okular.svgz | Bin 0 -> 18082 bytes ui/data/sources/tool-highlighter-okular.svgz | Bin 0 -> 22446 bytes ui/data/sources/tool-ink-okular.svgz | Bin 0 -> 22334 bytes ui/data/sources/tool-line-okular.svgz | Bin 0 -> 18071 bytes ui/data/sources/tool-note-inline-okular.svgz | Bin 0 -> 22703 bytes ui/data/sources/tool-note-okular.svgz | Bin 0 -> 30485 bytes ui/data/sources/tool-polygon-okular.svgz | Bin 0 -> 18142 bytes ui/data/sources/tool-stamp-okular.svgz | Bin 0 -> 25597 bytes ui/data/sources/tool-underline-okular.svgz | Bin 0 -> 18176 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 ui/data/sources/tool-ellipse-okular.svgz create mode 100644 ui/data/sources/tool-highlighter-okular.svgz create mode 100644 ui/data/sources/tool-ink-okular.svgz create mode 100644 ui/data/sources/tool-line-okular.svgz create mode 100644 ui/data/sources/tool-note-inline-okular.svgz create mode 100644 ui/data/sources/tool-note-okular.svgz create mode 100644 ui/data/sources/tool-polygon-okular.svgz create mode 100644 ui/data/sources/tool-stamp-okular.svgz create mode 100644 ui/data/sources/tool-underline-okular.svgz diff --git a/ui/data/sources/tool-ellipse-okular.svgz b/ui/data/sources/tool-ellipse-okular.svgz new file mode 100644 index 0000000000000000000000000000000000000000..a880e3ab6e28a4c0e5f6ec8a1edf31c855d47ddc GIT binary patch literal 18082 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

O2tD??pTE!xWPs1{bTpmzPO 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 literal 0 HcmV?d00001 diff --git a/ui/data/sources/tool-ink-okular.svgz b/ui/data/sources/tool-ink-okular.svgz new file mode 100644 index 0000000000000000000000000000000000000000..035b5fdd74de0d82791eb2614cb6c8ba67b6b7c7 GIT binary patch literal 22334 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%0Av_Z1O(O$|lUYQ@ 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 literal 0 HcmV?d00001 diff --git a/ui/data/sources/tool-line-okular.svgz b/ui/data/sources/tool-line-okular.svgz new file mode 100644 index 0000000000000000000000000000000000000000..71594e326d5b13bc12ebdbe0e4ed9f82f975faf0 GIT binary patch literal 18071 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 literal 0 HcmV?d00001 diff --git a/ui/data/sources/tool-note-inline-okular.svgz b/ui/data/sources/tool-note-inline-okular.svgz new file mode 100644 index 0000000000000000000000000000000000000000..4da04f3ee1dafcc24a1370f95bf19db9cf9428e1 GIT binary patch literal 22703 zcmV)LK)JskiwFql`qWPV19We1Y%OkYbY(4RZft38Wi4-Ob!=gBE^~Hg0MuJqZ==VR zeb2Ap$S(<|N!Gq7Ee99{4gz#A#yFmN4A>%D&9OuZB;}U+*Uvro)VGjQy9JD3*fMPC ze06KTb?#E-w|{xKy_x*H+U?id&Bd9WnX}1ibG2QrH`f! z?t1>G$#g0;_dj3%VKSLWx10U>^6KKO$=}`YZd7i0HDBGVZdaSber{)Wem00-4dPem zeEsw4YI}RT-R!mIX8+Adc(?q}OJgvfyb9S`>)g1xb5oI+?jJXY#l!Tts*Lfus?HcQ zm$E_fWm4yRS8KdqOCkFve4DEzouUw=Fdc)h$hlM%aQlHzUz=e=T>nRgUz&5nx# zYaMCPQ8UZ!6-IV(wpcEwo9$sWU2ksIo7JparoPqf{o(HZ@UPXwVYOjnGOf`ZwHVcA zNAnx^^nS6Ip5{O9WjOQY;^*~p{{3!yy*eD$vMrnW_Tlk*wV6xho5lN^)%ObiKnWe^}h~%iQ;XqUqgsy}zf;8`!-{3a^42orZFGQm@vzCZ8TN|j)2?LW%5e@v!AAhlGV z-=vxMw%AxE?}o4LjWcx?tE+W#`TXY?X33fy^H;vTn^+rW&WBLn*dPt1>f+JYXGbvl z`gu42hsPUPqo%0mqQ8F@yL}@ouvzI})2_(=d4Je#e_EZZ@*C42spC9!5C;2yg{aPD z12)UI&rh_>53KPEy4f$(bdqcRxG%jhv-A9Wh{;Y zU&XZ7SnH_Zy7l)X4fnnHwLiec|If{jy`}6~;b??bb})^Za(~#~jhRpVe)$H$@mTr= zLg7@+#rZcye~zTKA3p3?2bjfy4u82DZ@$*ef9TJ%-Pj}6J)Ud-eSFSNPTKR^d%S|E zUSl2)Q;%S z8m$KiNjnhNwnHkKa~zeHkhEe5Ba}^|Y=?!0fZAAzviF#VH-)pbz)>+rkGfIBsv@KN zXO56F-HH&0s^j-I>(2WKR735MZfCTv!`S(%DB5zOQJ=@U{fk5srFN(%M3ZDDMd-Pn zQjHWC(VJ7EkydQ-*4Wn~8t-37G(P@1M3a9XM3bKoO%#(VN)l8_E{Tg`Ie|b`OOtbB zltPoOdYC;+b1FckMj%g8@_JxH5H?CAr3mDsS2nSA68tR3(4k9UF|>WDn^mXOS1}?7 z-BuMZa6bh5P}q;kI^*>ynE{Ck2T$3CjnExxR-I_nW^?jDmQ(X`Vx=1ySq?xkD-!OL zu^Vv-2y|k?h(nnREUP+6P^cH`rXW$2bFG37D7X>up*Bfk=PT<~AmI?MTmUlOQ?_b{ zCRbhbtjNnOupufb>J7<+<F>r|@SEYIj6u2zas;sY>C{tFxO8mSXHOPa*+c`LeF7qh12mlq#Cocdp_34F zqHtXW+1O62h4YPLnsqg6qDhKGS*MaJWwlgRt|$wLb=HX+cd`#JHzW?OOF1$DYD#1g zsy($Mq70^lQ!}Cl)t1*XBEh`Shy?em7?BWu7e?f0UuZ-!eIaoxEjb{8lmr&1jF3{# z=E5b}kGNhKB8&>H^K2*eNLa(RW*deF29$VeLS!>~N{j}O=*FrsvK^sC=V`jMpO_O# zD~yooM04sW0mv)87o#Y^Oo&;awG=WmY8aB&Ayw1ZUxrkW8|}~~u(NSg>MCp2JVLce zRMs9 zodgufgHDM?u=qHmQVk;niTf=m`$Y5QDO+gif{ltYm%+FZO1jts&SJ69k`6CxA8P2- zqEfPvkkLZR0bucvtBDP8Ry7V~-bEU+isdNW=~4q1OO2H5z-;#2l;NpE>3J-zKwdkLqnv?>n zio&B+800v{2t%qWFVrxTP^ghfpq9G*-@!u+>|}lf+2^= zZBKHfKP{mIrcrc(iYX_PdNGM&bzD5oOMpZR`~YWadP1Ubx=T8)&|FQ~p;yaS#PC8A zjp^4R(XZxTe;XuPo{%WAWb}8`*AV`Rs@4`)3>ooCe|F(;h0(z-vrtEc$temFISr_2 z&alIbas@?(fygnSnV?QYEpRnspYAlywz|F#1aU(im}bD~twJX_S&$RAh5ld=-cI7) zl+uk(P%>^9y5JgyQcEAuYalwHqVCs#Ytd4pr^?GQM>9zW1JZs6T#|Y`K4*4QNdLk= zKv~(g3fndSBDRzyM4~~P$xKdL?J;#ghZAb)3x&**Qc}X;5J5Me4ojIdaY1vW;}N1} z(g-1}w4~Whnh_mA7>tZyZ^osDLn?Lzta{=dM*0fCTFyCf8;nvhvah;At}@2=t*VcS zMn<>EGg*c>en3|90|PceTlNejYSo=^1EMli*I_}iF{2D$6slSsZfI)k>2CU{g&JkZ zMAHaBH7|QCo~UV}n(Rkd0hBb!W@yX=dwQ)Y;v`jG27rtO=)xMM_)H6pg?5T;zYT)a zBKMXb(bKpzxY~tx9l{m`$~K&%wyTkrsEw$GwxbAkjqOHND&(^C*oQ9o6O?H6ir)KT zOmyoR3hMZ2`9!HOH>(>gPRR&4-}-6T6kU|kyeHG7QI;*7 z3%Es;Fhu%4X@nS{47g%+ksc1VSADt48yVx9Y++;#qJh)KiyhHSL8(i(=H}*g?wXcr z@+aXq3?O%{cG##l$!+jr!2#%|YV$8?71RXU_mZLQaMyR;na~5VOA3}9?XrU z7OHiLGr_U?QK>Ivb2tccXuV@QP1ewk;t(hCTxgL)2_xk6_IALc_lY_7sJEH`j>z`2Ai;JEfeAE%qgo$tuoF4ZcnyiAZrRS4Q#8%H+i%d~EZH2Q;OwHw@6?1eQ zQqfAsM@w-B#55k}+z>85xX=xHs}0qx1Ba~vGK`dJ^^v}h`u@oYmK0?3Nt=8a1ceiRe~W4DC- z;ITR)UhKxUdR7_>!< z%t0Gqk&U_^rLbN2QHl5PuHBZP*P#7W?oQEdhQFc5Aa;n`!TYdQnvJ?uCZ--asyj}O6l;%%PF7xf_ur+XE<`;qQs`J$mQjQT%N!BJmyun zJb(52#o4c}8Z>`1l7lj45@;kuwx^3or$m0);Buowm%!PCzSMTM#%B-Y0`L6;SW<9cXkTSn1Zj98ge*3GK)3?G z>@f^v0`f&IZV@uiNCGhHtFF1=&|Guuc4cf255NNX7VCM-xf$2|1JypYoT<~rk(R58 zDBwgUdz(ILmJh+0u8fU*f>E=sYVCk_RA{+?Gs0X(aZV=?d8eWt4A!u!Wrb6X*?A^C zg^oJ}ZY-2-7*4;S7KnMLdy^_3Hkc+$ivVkhjq}Y(@IabyAkxuhKHdPvR9Xa(R9%d3 zodh0=(W1QELO`kWaV85E!Wt_F!#}kV88Ok*$C?&tl_Pia|79a`e5sB2>dU6ru@PUr zJo;_ehH=rbe1mKigl1ObK>Z7CzfoMwlU<`_}2 zjT{u_c;k$4!cjKz!6)9`XEQnpSMUA+Z=!ap0(YH?-FU*+xH5sTfG3?PxkD>-_1J2cHP0O5**P6b0)7f(T znfW12HD%nGFjfeWI~-!W#fU(;w97RaV&uC{eHRDWh&woCxC#*Y7AhDOEzPGFqafWN zHe=Ge1XfL~iX}!~I&@2VtexQYjOS>csk64^HT20_EGj8lhB`tuH;qvY*IqXyD{#7q z#?}UO4P6hhXoaf91&t;$@0cmta#~uJc&R9!!w5y5tRCy4cwQ>!WA@-v+cPwMBxsRkl~3X`p(R@-~iIsVlE~l^UxPY+>>^$7fv#H zy~IdSy_3cJRRGUC4K8{IWc7Zu!*X`TmqkTh?b@g(p4Sq#v;j1JtBxaR%$VW`(L)>I zCYyPk8-t>DE2cT!jPRd#RJkn*J!Zh%o{&n_P)CUG;|C0%9u-@%988F02NN!|M2R*N z4>yY;bL&cc`j%q2 zw#tbs+DbFu^&;&Hpl=EAvO-5+5PZ>5v_LVmm&0j25EzX3aekS#ik+ET}~;aKSqesH#1bs1JatH~hZ^K(XIXiZbTGBTyj6(`LC-k~UO8V45vZsD(=a+egZ z>TPl<#~Y@0x2$W3Xc+xss){hl^?VJ%g~dAMb3hsnA_zo$Tx7(Ucgni?YTVaDWZit# zzwt%Lx}0xi-9P|Y+#(}Jk_|_Z5hE)dLjeQ>q48Usgk6i(yoE*>mD^aM5j&;Oh(#+j z0+h!W7%v=UIn5Lrf#-Pc7mpFRy5|)dF^WvC3XK@hf1^Sp2K<#}g+>fFmHXQ@xxcq} zha^4rD)b+b5gVbvh>b*C1PE~<1V)S|%kT<}z)eHh10x1Q>Q`U{C>d!G8L_Ap8nM%e zjo_WOaEQ?se~^?JUEADy5kEXuaKwO}uI<4Q!`NuZdvJvHN4KV!Ak|l7 z#K;@4a9-g*CU}2xDS1r4<}8kh54;aKuh2IAW&} z90B$h(h80MmB$_&fol~z1XdGeI92$=K&WWigCmTld2{Oxp6NOdL|=DZwCN|HT&*ze z7`KrGrzQ8~I6hmADZqxU$h?5BVdk*0tz47YVZ2XYWo$;~odhH(fM%ivLhi~}c~H4U zBDG09q?=byvo5B&BdI$_rG3Y*kWU?%g>Gl8MJY!e&)IqraEG5DxqZ+OhM!EoHrT4h zPmF(Mg}dP=+uxmR<->tC{Y3Z4UuC2&f@sFAGNkLu>&8thb3Bo2ZbvpO*v!;><0p&a zAlPa>^x{mJ5lc~!s|_DpR?NXKneRXCTHEK;qmbcmk`{DJ+tqSnFzdT6iqC;hZuJH_ z)Om2PDrt|JK;kStlL42 zHWtNn%wUXb^#XW=3(yoeWNOx_#mP&V9tAp@^k@DhXB?3VNWbJ-P^<+KP5JVvcyeYm zWgs^yoX8=bybpvcp2GE}j89^VfE*_0@UnAg8BcvyTNFPt^o{1wbGu+{HzKS#BF!W< zQk~?3n(yiszA0)zBxDzJf>{xuF z2>V&UB(!pcN$8C9$Zf$Sbe@<&LxgqOD9IJlkrI}G(_JtLIC7A`5GH{xbqXHAB($}z z36oHHhF^QV5ZGkr1cj-odvDZkAxuJMrX#kHU=lK8DEJ)mqN43Wm;|T#f=SqD!X)5` zL#{@g1RndjL7L~*BSJq{;Up9Z?@BBLAwY;=N;wq$tq*w+Ac$Ik^a?Efs0(Y{geb4f zph`Lr4wSIb1WK@9@Sem;z^yAN$4S63nRg{nLgR4&H)=#4n1g+elwdPOhC!f&&Hyto zh_3Y8Ru{z#(xSQcUK7y#C6E#jKtRf&5+;vrWIX;`q>o`_3$ss4>s&R;J`G}84wca1 zz!R;ErG3Q3ye?+ptwC8Dq-s-R6^m|2SPwN4@ENG zp%Mz+epu#$c38p?$_*C6B79j%0nFT4Lpy*_35_W;&;T?Hji?Y1AdMqN3ETyh(3lC0 zPZ3mt_clQ#z>>pWLM5E$;eK%vVK2+qRA4|?v=`#UbHXA2g1Qq2w4R3vlXxdw!a0!c zdBPkjnf6)4G%7PCA^}RU9|{wJgA~P4n3mtPG;{St{HTSC5OHHEJ?#Qw zGC64%5I8N(t(P)I=OM8w-d5rP`#|C%WU(SX1Aeld3c;@}+MlpZfzsOwoS?S8)OB&Z zqH~L++av@D=sERzAVwfIfu9QoeKNdn-g=<}MjlK?Jy5X#L~N%+TWS5FtiuUDkvBr( z^8N-&V>Y^mc<6;A2vkf$MDW9je@r7Ah}B0oPSS{ND{^^(Wq=KAlsrF+9s~fxJO!%z zu=?T^MqL!IMR1$bnC~nFp)ens=OyH74Xp-1-QcN-Nwdg0g5dUia-B_>v2t2-_p>5~ zq|OT~f?>GW;_4U879oo-c#Xc6nK(bpJk#QxxCG~zt>>|$^s~Svu;cZG9Rc-cS8YkQ zrP_k(OS9bx?lUK)*8+AxhfV0UfD72QTBN(zvb0)ekjKTAkTJfDHq1i=c)+IRR#|mj zt3`UZi~Hdj^3r&#f}o_;;wwYlv|99)v9wxH$(7peZ|Srf36&N^?MtWi)cZ}RC5pgUIxU7= z<|gR0mB3lMP75%H*_TqwtiHI^RwN6$V%j|$PnWV29Ahkj+H@X} zPFveLEkKK{1by6fS|s+hxpZ0rRm7#!p4KE$4l+SrHkG!@Wh0#y1L1Z!&H^$=H=VZ1 z=ixdn(H%Ce6(icquG0b}K_fbaV^L%qfKCe>1}SsWX#puw4s zMoX&f8tv+pMhi-34QRCIX}DjEWaQjl!M_I5!{Q4XEu}>aS1|&(H~YcEkR)5W6Pe*0 zUG_vV^0Po@Xze9r25#@^s3A>u(@798@P(2$t`44ZVEK($~{-inF!it9`HA*~P) zhFWSPH6*8z=(|zM5ZP(?qHw1oU3h>%J{?>wO0UiD zv?L?OV2TL5{w1&R`Xzd0ic^LNK1Sv@WQa86^0}R{A1GyrEV?p7gpU!wLIN_317thO z5NTOvJq0&mbj7e?b=fIpi0m{nL|P^y7g$v0FQfarm?6SmvLXiDG^njrr;@4}rs<+H zL!==CogBO|O}~rVD`8UkA`oIsgij+$Da%YVm&{;#2)t2pQ7b(JDfEHEqI7?XP!89z(Sqw>=tW<6 z9Z6pB1=oQz1?>C<*HNN4so*+_4uOu>;nW7$;j|-mluQNA5j(PM6dPg(jXiZib_^-a zLhP9G4?1Fp`=aVX>`;J=19n6=SLi}fgzIRGtjh|2#64t1*x)+m3KDUEh#{M_<8=&~ zQys6vsSU5gX${}399c)?h~gg`UPo~Ut9pmLRF2n?le>5wuVVzxgyVH2v1`Zc=%MW~ zB&XHra2ODZUEnK@8IAFhZCRw8d+ zHaJZ3f$JMfKX83PL$X2*5kiVscb7C7?--MInzX7apZP2)}{u#?d)1 zEsF}gcDWOWE}g9`8n6&i43LNs9zZ!5|BOo^d}s&d+~*`NOT>_}zd7JKN?WwRJX&6K z$B{_AnTggx3~o>wcaMw2d4!i{j~wL>heGeNvfxm1NQVAS1d-ae`NbXlXX-$R=o`oHjBZ$Q=AE(BiZgd4gth*O+);d^%)C(@E=0d{Z8F`+ zqr)aq9fC|7LD}g{iIshI2uq@hUv#FN_q-@&r^m7NHo5*3Y2Mpr+Nhq1-K%>enNB?= zJ7A6NUF@~GZ5DJn^-3P3l9*cWvG2;##&2D+uvdP}9+h`rWxlA)`RyyhUa8GplPE7? zM*@#x6Kg(DMFM}Lk>$mNesQI~z3fduViDYH!yXa%5ryMn-(9~>0V-eOk%w}d?P3ZN5AKXFVBVe(K=4zKgZ zu`=;ZAKZGIOgzvic8V~8x;D#EP@13&bPi;$_;Je+9|Uf{JqjFqXvKi{DnF*8ys?Ai zy3Ia#u+K@|m?Y5+#Ih=3-QX<#soI9Z)a3>W5j-R!-!o0Bu6g#UJ z@Lt|)MvL}0u%6+kw~9?yrB-j0=T>htldCIH)bZ+x8M|(MW@h5sV8y0C;2Wn$l`u~MrynyJ-7s&&&ep0X6ns5feUoKoVoo`JU`AD796 zL)j&w+e)nV7+%Fr;6BT9?eACjlrxNAKK4evk#dur@Wg7TJ2Oek@^Ub-x)AAw0;X$> zm~7QnX7$ECnOP0PhipW#A1KeP-e_i4quvPTkh#-E5jS;ZRu@*(TD>Ytf~O4TL^EKi zdunx(e|0FgI?2#Dm|MLOo?GqoRBkmW_Y-l!N98toZZ+xw@O;eN>O^Kg-z!ZxxHUC+ z!mPUtm|7i)1hU3GGNpK*m8i_2tyfX8%&ZnMR$}!cnO7Z^ZZVWsjhlErndb$&#=yL4 zZ27t(4nVnSVJZ)HC@j;{s-pyZQ(|>mDMw7K-Y8G3-e@LPv*NW_f`4aUlwN6N7_c{K zksz-+5NJAg&#Mk{Q^+tJe^-fRq zMo(4aFPEWM+0{o8^!F$xww=qZT7nqo9Ii&s0ED;OOoEKS;+!9+mb5!ltIuIZ&r?fY z2SWZL)RK5ft%fX9u9j+wEqXAvW#9<0IVpy~dN&uwz?pP&X#ieC{JjqlN=TsCok7AA zMnU`A6Om9)Y)1K%n%5JXo~Ycsp4g1JLxgt!TotOvRU~9dcR}W5qXz3o0;9uIM1waS_a;B2oLIjU> zYSM{xZ0T&MC^jH&$;tHDBBYs#B1|5CB^z_+Et>~W(||gVFEJ0jLD~wciQ&zZDz0i` z)Z(T>A_#|*bCr{A+! z9U%D2;GLJ8-kIg*T<#*!Qkmc`ngGs;%iO$Eau+RH?xLAjk`7d_30%~+yNf2OSk2`w znu(Y(Zag#w*;C(5i$<4P4!ucnQ}7oV72FL)CID6}5ChZ5LFj0N)5fBf!)T}BFfwY! zv>Zm@(eBNs!w3(Zy9dE8?sCh^gD?S)Hx@lnwyZCY(F}xC+&o6;)%g}4BZv{j0>ER$ z`|J)QNC&}Tz+r@khRsKW_YHmbvtW?oJkw+BE+a~z>@FjWur7|GhCJwU8BNtBbeEA) zWY6*n%_IZd@)=FlHr#t#?CvuHG1Kldnn}r~@)=V zys(Cn`-~>57woCM$ga}BNOx&5@>rC32h>M_WSrvMt1VAkbP@SuZ0X3p{?MR2t>7CGYi+sBX zsr7vtPDB^7q@8*=o z*3`wlw<_uw0Z6B5_=tLb~)M!V^lKAwk+vuYgpqn$QFUvh!Pw z1o_EITyaXMU45gawt+%YB~`kN`}FScMJ74%luq~}0AM0d92jDvP=1~U%SEH$57Ed{ z8=#OK!vN;5R8(GX0O;|80zLU1*-!n7urUJOG9KWRzRYCo-fQX?h`})knLo@d_=7Rw zO$SlA5LR8_c}xci2;m<#8pu()j|pT9yKtjmCM$@9c2p^7A?WRb5F5JIl)9aYEN8Rm z&R9nRidDS>5vWjsx-2g%xBo_iS>~=^5>d)#6SpNSm;!FUBHVyr;1b8#Sf&$`?v)Qa zIgIaRA*v#!K5&@fG_Qdu2Yf#A`76v6Re(~Q+a^>xgxokK^s}+iMfeRY???bKRPV-E z!j^wt!}lv5Q1Xmd^&92}bm~0M3dssre4#V}P!VG|$>)EFwat68CFk2@OTG@h_+_xR zOSWW@FC9xbIy_Pj+*JgWf^mdvnt)O})f}aV^c0{}<>`lfkia%%bzuQY6O>Nx(;wsxKK9dlF2j zm9i*;2~7?{SP(q6W%o!;MSp>xM z>dh>iU52ovvIci7EGeWC@ePP2l{A7=SW;TEkimM{t(RC*i4`Ahl@d!TvCa=1BNYUz8 zQrAePi=9`2VTFfSuq{Z@_;towR=MZ)hTEConXt=GpnfNYK3Cr8ea7*CTU z{dN4qFG7x#OL{5TOp_M8(3x8A+uoULPeNHFpi$mcNvv2qweG#Zego@0P=m(yUy7!b zi3~v8X;hJ^LV)Ey6E(F3sJ26daDSj$9~5g!3WPEchGh{1%5Wj$owZZRLID)OZKSD3 zymOcsJ)a0IWfTdRx}a95fbrEceF4eZ7f_BAUV(1_Ckze< znZgs!Z+ujoixL!5nup#Z_5q(d?iU7GOZ01_1}Fo$BQOJSB!nWK`fi71&k*MMu5BegIWot&A{t`80nN|)j`Q6t-RDe@4AlSVvEAkr+Q zr86ySS7|zHaqhiQhs3F0I^|q_qoHPjYEqc_rIGxVSVt5SC`oJh z+;&PnwVe({H=>GT>OLPjC?$LJOL3~j7tbOgFAAchv$$VbrT;h(-0M}kLv!^=!zpd0 zy0U;o^0F}7fjf+REc0KQa?_5`nJx;^HGPb!bFTFR121n$Mq=OledN z-hpTRJ+@e23tmBFP%f^tYc4L(*T${?j)x+|KKI8ZnQKq*{v(Sh-k_+c4~^8gV| zHYS240F!Ex5dka#h*iyPPDKb{X$==e9q<9mbhL!Za?9Fy1dv*abl(YKB{iK=E~O%HoTFFAa9R(zWm<@yIDq_To zPLWl&YSg0!Pc3j)SVDg!bWmPG600Qzc z+w(S5;%h)^^cljVZ1FwbnOu904|pPH{#hi~_IgRKt*Wy~^Y#Mma_zheDN840#F7z3 zsV$0#OC@e}6{Z6Cb|(N8d~Q%D9q>$7 z2m-4LRT>)}()6y3Hp3fqY3GF~TS?LY@nnE;svGq|s9$?80JEj04gx2l_89gU!_CNd z_#A|r0pC!ZdR8YedOCWE90I+ngwCXIK;Vlqjg*C>7Ude?xcd1`2w!fD8Z+dvh_Bi@bWawMFA@+^$fve*DVfQmo9O(L` zHY19}=W)?&qcw+q$sR(2?4#hmZAIV7In$eDrS{kH7rzM3*)CbBt>~b(yqEyP>}h#1 ziFY)X8x!zWee+@hjZ5cecrjaaZ4+)v<9(>gwK*}3M%9G9H`cP8m~}G8e{*6Isc$SV zCIR^3@?tu*c`+9)FJ@(c!}4O{DShm2%m&xw@?zTCrmz{CfFqVSucf|h_N_P3KH_dn z!gl4|jY-I_u^gEMq>9Utxl?jvE?SOEKv2o40!JpEIqL4n1S(nR%aI96IwXY2PRWtE zXgM;QJ2d2~Y>_Dmn?`?Bto|p39qa7C0 zsxQoq=}7sOxdBjdgm9_whU0vXk1Mm@)1AqY=g5TTak$r^6u$@#*DuMD#9$&vYYS{B zCaMOAq$Ns`TUgtHa?m)@(9Hr-fo78hxD29X$<6M-E0u8))V>I1H`-jbJz?iP+;lqI@@JePeH5j=%feWWJE(cywavj)K zaOgj&8;-=0<%JUs3_Q6d0V|SZTI&mV1(=`!0enh@8zMjhN=Ls#|iiH_$-!u;JCkQ514h;X4%aiYl+b)!7Nx6q=~ONz5DZ zL0D(y(1{U5emQ45IpLsV8GhU*;1vO#p`;425obTVd1E0!r-?ojpeXxiD;EG%CfF4s z&r0(kT41_K?F)o^LxQBtuEfET&sRaTK+Td(H46YIgl&HD3Z))qyAai8pKhZi!i2#% zWPcUWrFC{6^qH0e7E@BC6{jQRxGSQub$o^-0*I_q)lp)nSyUh%&p41wuU;VeDhnTK`` z;CP+{cpayKr)!1l4JZ;tiz%9kyIsinV zuvrH>a?v*H0HKc#)&Za|g@bjVtFEuC0{|21%Q|2W(eq^;z#Ej!IzW`J?feg%t8}mq zG~t@;y?~B#>i|Ik57q%d^2N0utGQVQ0M;~?Wx$DL8Q4fz28e;SSq6XyRSuQ` z3}M|Y14JC#ECc6-L%_q%q>;@s0HCqDSqAW(ZCM5ylLB_j0HDLlW*KNIDdd)couXx6 zk+KZnhhwt^05UBdECU2AD~H~YHp>9st{p4`6fc`)0P>_P%fR`=?q{7?m-z}o8(~5% zSK9zE7{|plfYS00t1H>dojGXdfQ2XW&7VgO+PLJP^{jBPr8#$xc$4Pb5rkBi=-nxY zEEMgUbI;5xa?QCDNn}%;y9$Z8;tZ_0E$k0yayjmbb4Lc+IP@kd3Q(L8Suf|46z9GL zdQ{@(4aL(!b9QReoOc?Ua}NZ9b=?#S0Xw`sxxLkXIGtjk`aA- zb>yG*U3VtN(soK9&RAc%bB7Bq@47SS=$=7dT9)bzz$dB0j#&s*b!pDPbn4su;stb` z@!5_99ouJH6>?m62BjFLDniC_DbEhL=*n{^B-2u!cS_2$)2=*sA^5m@j7jlOaJ{`v ziw=z5TSHsQGj>{@yYk$LSMRzrH|22yA2$2_0svXw_3B%Tz#6aD6f^)n=Q=NGE)i-@ z8jp*5sCTBJo&EgJlLD{9BYqK5U|!PDdedQXc)378kOf-$Y9~ftte&<|1Y}E(g|LSZZbOO$wC?+S-0T9E=gdu52Ff4Pp$}T=Rj7f}#^mR?nR; zmpK6A3X5%R)=qE%@r#+}&J$p|-H66=E<5QLCXZzz_ei5j?WLZtiUy<|8WFy9r!gWr zUJC+JL>KQ}7(1Ch(MVYh{|484On+V8f4Y$*X}Su9#+G!DBx8FS#wg=oti>KvYr|jB>>I6vn?}_ z5EQ!tZfa{uALBazc?BqF?3UuGcSmnnL}!HOaSa93|6_=_8f zfQ2ag!gMG^YK1ZqjVy1Xj6}n=-DM;K4xda&G7^nU*fbf51}yDvBLe>2JQ#`a1|uya z(TFVe>1H70=(V~Vi2x8*HyTi4IW8j+fW~ItjYQb33XUlPFoXNe%|uRZhN4BwRMds$ zEmINE*Ya*E0+v{Gp{cR0%N{f$;VL(45kckVp?A0qoLGKAp(16W_a*V>Cd59M?u0CI zYT1i+nvg|lrI-@4D883t(;T3+~aemfzXVU07cH)T) z^k)TbIT9$SO|IR8k(EPkr_mlC;=ORf@kVWN2nFJk;783P=Teo#j9UzjTx>2@sTLqy$n()#H8}{;7&N zZbGV!T@Ew=xhen7DMw3fhh9&Mz{z5#7FMboZ=wPmgmx?N#G5ry2(W^Z+$;fs=9gF z5_hvn#MRlz-J)WGb!R(7Tx{wLvwx`^al#r-595^m-n7X6HffQsL&*K3obvxG%%GLE z_EOd8n0vYayuch5@(Z&BuW_CavwQV>vwgD8_HCD0qAB@; zQ;~q|{lNN&09?Ft^xh`$|8=aNCr{EC;i?w`{I8V}ZiDb5@>DJncnKkg4-3AS_XZfx zw+S$Q9kS$^GZX{DQ^O^J28X?HTRs9#4AbN0Z5e35w1)Y(+H}~}cMab8wEwg@8n43v zJa>*5iFYwj1#qu)*+VFD`%>*F;{}gmbGE1NouD^~U>dI{xITA+i2Qu5?uC%@ew&0w zDEjzoxZRt^v2 zawFa8$Q-hlB zogW+Db42Q@G!xA5hcE zxYgz&vmmx zue+O{J3$Deskie3n69&p;BV3hQVF+Zg^&b4!vpoWcBe&Qv^TLRjMx2HPo1HJgsOIN z1riw{ja$21%J0irec&9?*YGF<_h|Rp6Z+fO6JEEYKXrys9AUOwH35YSdWjdK912{F z5wG@bfU`s2epE&3(eJe?^tZ7pylzN;>NEj+vt3fx0`hs<#ib6Epi! z<6gVMcpJOI>xT4aPf{9J1PxfS=XEPFcCKD#3GU5@1wM>$EU$}L_LWs3-E0rP{x-IT*RAW%ogqMOT}8)L)kw)N*u z5z4Jx;~jHD+TksuLta!m+rnvUU{%!z>fhsDTf=-CTf^(t_20fij{5s>4shTk z0bsyXxZ6oW#nImDef_DE1UR7FFDe6)zjL@u5-byATqgu>+~-8aAc^y8oZ z_=g{VV~_m)+rNGH$)CcJ1HHyz`@#3${`+^||F8e{<6pk}WEXg^zw{0Y;m`i`-LJQ0 z@i$Y~15#z{*th6^B5tLp9P;5*_WSQX{_gkoajCu^rf466&j0%HH=lpcq6}f2%p`bU zJS?{Z54?RVB3FF#!;e3FcY|Re^3$Kc{|>$X_1&i*fAOc!pMLz0@4oq$9!m_t$*=kR zZ_*+$-Zm)T*ckrsn`7hu{qf@u=hi=b{A>gE(f<3UthV2L`={T3`{~oSf73f1S~b1j zY|lNtsom(CKY#lEfBcL7E_sIkxh;d!kiR?t|MJ`4{x;2d_ZS>sP6H7Cc?0m$jF+ES z9|u#%?UE|j6<7{IV28EZ_n|#Pqby*QAAk7#^`Ace*LUB<^vD1Fg-CSS7k&D}x8JMf zFW-Lp`0Wp$Pi=qY8=ac$Tfh7K>))@o&)@y$=dZv0{^Rd{_~uWazy0+27Z}*D^(Eif zqWtf_`0J;SpFjTayRWf-zxn>t*Ps90fAqtze{YOKzgj~V-glq>z<;;%|I@Q=A9gd} z|NiICpD)wR8Gd2K;?sWn?H@jV|F>`cw~fR1zxaAFldtvJfBf#(AAkGt*WZ5r_~Q?{ zWSar*irc)RN~zoS`%)I()0-!x29Rz3q$}Wp*m(lCD&AeL4{h@5e1(=pw$j% zKrYM^)f`R1e3y!y?<#840p4hI6t=W=oWlTUmbVd91!-=rw>pkjw)X>}n{2aDu=D)8 zMAVgn;*luvSOIJG0j;wIly`Og`; zY7JX!t}O_>(;kcp*x2cIEEa5jnYp!k7`46a1ID-HoCW*7u0&mx$~sT1(>Ys18*;!@ zFD->qTh@FxI|QgcN-j0Fa$Ex_sb(^yytrC^^^TG2E#~tQQez^Ta*wTsfwooxfhZe* zghJ?On>M(5bh4j^qR+{BI>^wd)h<9=@1qGW&QAHjqdW}8*7kwJmP1ylz?A!{0k`7m9ly~t*o0yM) z8Us>ZM}cxYI~HOp#rM62K=2{Fq@AQI_n5uE&5u6Dwr$2bx4&%79zR=cT7UZh?N{yt zi942%$8pH**`^w>B<^8ySPnPDd7Q)ySn3*InrvGEFv!d**wu~U?5!Dq3AwSZY({Bz z6y18Uv9L-+;F`_=Z)=1i2L@)v`pqb%H39Gj1gwF2!kGb&bCR_T1jScVmPy;fdau90AK;N>4BdfVoO{a z@M_pxdzrcj^hj&V!#KZqL5am!TL#o|%!0*gwp@s^n*pF$io|2GU)ad8-ef5Gz&|q( z<5Sdi8>h|ik0CkPbd#uhq1X4vSN zFj#Gq+@;%h`DCvv0T>4kr?wKshq?_~&uYV-N1MHC901t2&rbHjSQc9=2g80N%>G#s zSi?!Q!5U=zrt;X#qiy6^9P};4n0yHU`9t-kpz0V?Md)H|6fm32;Q|^VpQV$vR^z23 zpRZiY4?vNbe63^ob=4(nHax6{jjAN%Ax&js!j{s5~e?z zWI{3 zVbt^aN;?!LDcH?8qNzd!=!&%#SFmRw$TUT~sh^Q=nM_Tt@0diATj!fMQ$cK17NE1& z9LG^+Avqz=E+%Ay0r`Z@*0O)%dL7$rCPGs^zc?0mHFf5AB{es|UuM=PGo}9>QNml$ zINF}%Dxj)uyISf|$h-`ELx-0J5SF&uB<>*iCgjbb^|%TEe3=|^`=wS>k4i&1*AJ_8 z@V<6{w*%5Uf?;-6a)oLUTkC8~wnn*v2jqwU8s_+-Wet6dW04z+O-CT{oBED6Q!G%O z_NXzjYDlddjX3~nz~MDjyJJPM1Hj~4ya74jVh&a5EL@~<+1fRzRcNcszm)#E7rUnPqom| zILMm-AY6b9X`6&^Zc_y4XKQPAdE$r{fCnV~wAjPDm`gTRi6-0hK9FlD60nlvi045| zU^ug%FEq737e2)XY!vQyJ8_V8Mu4~_@^Y%*Id;BdnYKs9JD+xmO5=G@DbZ`(FOd~z zxN(N_m7JrPogE@=tG%Nt*lbKOHYJ-Z=v$kPy3qEcc-3lsk=q?LvufiO2NodpDLc>N z4u{r*ouZ;fO~=9JCt6>=!`6Cy+VRZ}*B&_T;l3}nzI=z%w>6{ygA*gqz@~sI{N8%H zFH0?Soitu(#jXR+6>GdRcqccSMr=m|2OI^^O)KqevvWC)_$U-_+E(OunZUAFc*nZ$ z#yk^0%k(_d-GGzTRHqXwucmGGf(i&n-l_W1rV<~nYylW2wrhAt8yeJM1;A^MTIIlO z>0U*8Od@^<6u1xFOG&5P4&ofq%cc!!*Gzl?OXq>PPE<>Qh_biUm3E$C%_E>m*_kmP z+nBCvdb@tTT9MdhN-}R~dvdTKl8sVHY%|d?R2ajyyv!%4s%$!yv?b*Kn!bZiiKVMd zUJX;FnC-`2Jbu6~Q8Z$9g6sl4PhkHnybZ+00;7W)$@!Y(N0oXzz!-n>op{nyJz)|qC<-*FD5Jy=x-8ANcsuuq-yDT>&uIG zZ~YaQX@!DDExJ(be>k>Q9E4GJ5K9-S`8$)4HelU%4}f0 z*r>}CV9T=@hsSr@_ROn^lFAxQ(M@6(`-KtbCo0Ugb!X))bgg_;h=a}3xr&XLHkd7B z`^j+%QPbF@(Tj8aE0$v)si?YGiC7}4i`;Txfn!=;A&^yR+0<9BHfBO&vfi?3D?{~Z za>xNZ1o+RkVN@*04!N`$pfWC{p^D0x7N1yX*Or$6|9!eqP`V7-&<+a&^>3kA9*!Eppvy@cq)3jw(r?EZQdObAx@+tc5)|iYH zqaJF5fn#Wc*yaZx$AdejL7T?(Zm%zD+qbDgoT}|v0@9A7DI(+CmP#G8rW{&LV*&fGyki2Q zA~hRZi;->iIJa!s{7hAF&Bz-Y5<)f2frc{PS$OQrChw(ZlsvgnNwr27CB(yaRTA^6jlmZhj>)L#+kLBPWz~2Zto**=oc0;mpr9U z*^*)X_-S9qBL^~`lh;}wkp5HZyzy?XlWtmo7GqD`*M~L~P=RFBulH6voDL`q8Fins zhRm2*oT@8tU!Q5GGKIOUI`5_m%u1_hhsl*34(WBN%2H}#S2e>i>*IJ>;lf)^0z34i z?n|#Vor_Y{5ZXzh!qUUVKeX^rxv~V9M>5R)S>=lpY_!O1PX*?HQ+EJIP3J*g9N4HZI=0x=uG)NFF?!EOS6uv_mR| zM8z>v^)Rq&T_D)l6=`xAk7*P!rV*y25%)0O2kj1XRZ=cTcN>>UlERlvQWdTo<5XV9 z40EL_$0$Z=!YauI9Pwn>8cg$0ISOMNb_#h(Ftavo#F_bg`aQIED6m0gi)axFog#Ch zFqf)xf*l{f5v5*jfW17^`bHF6#r==1sLl$lqpM~t%lF}w5K>b)pEkX^G!RHlY3PSX zql~q&N3R7fvwNeu7gaAh!w%+UtWA*628b#kwiQ?^I%eZ$T?Giez_oo`?o>0Palhg} z4yN#6cpL1rIjPRHX$nQvUlW+iu?-34Cg@;u*jtaMIr~VH$WR|%ZpDU(877zy=ho5i zhHO(4%DqOY8W^{nN2D$V7!MUHh2bxtC=6{mrcUt3*|fx_@~Z=0EtbWty*4j-UA>+j zrYz^4y@m)l70Lsf!lNw_Xl+4Jc2i$eI#Eq3(+b6No~|=ZH8gi!gJrSmYE4Z={1VU_ zwa{$ICh2>HQ^FFgQ1AI;4%#u`jje@clWj9Vzn0!&2D4KeFw)qa5b>r-*Z8l$)u`w>44mMwJ zb7#P^`5syit6;#}Hb(o2#)HMz8;=HGG(j|^gTZ$|1HeF^48Hj6VcPXPSbPWk%65>e z2aB(@u?WsQS$qe4&C#6;Zt~^uPSjK0jglz%hGTg-Suasm4d;*Jg@B5*L&-Q;d|6V> zMAq5Y!rE$)K?s}07scY>1xp8uueV9t*(|7noA06RVDmk+ uzR2yi)>DAuZ@>TXum9)AA3wwV=5d4!#QnE_{nKCUzyAk3nr-zjf|X z<+p!%xV@SDyxQ&8+s(z9otd-AYIC(+t~b{gXFvY)yJ<^30a&fcWtS-(r+q1uX z`-ivxHl0o`cdNx=wVZrfA3je0zWHf?wYXbN{`m25xI3TEKYjW%Tepw1?e2R1r^$3G zHTOSX|6wwjNVl8)`SR-GtjXWq?`~9Xc{N|%tZrAE!+vgOc78U9Uk&0{=zRV2>S}v? zyWQ-y=4SuRNO-sW&`V=5pS%j$TI<}nxpPyInC>4phsDG6xT=itxvI_>GncYK@?}!z zds)vr`L`GEKFs#p``y**gVbBiHmk$@umAjOUpO_h%W40ye~IFk{(WRl`;1n0eCn3;DJZOx900&5*<(NQzY z?G;9Lakf}4r%Ui5hwW~@{ptQ@v6~;Z+Z#^u zZgc%?(+|r#Q3dB_@!8_Xq4--Vf4f|L*h7x{1SA_(v`k9-+IKSTI~j=_3QCVw2h+Sb zI~Mg+t;x}*-u>%Ac64$+NkRT&pOtu|gcUuPU*=hv&#GL%&`uk|bh}$$uVuGYF1T63 zPd=_AvmQ;(RpF?)uFM>Zp?~!=#g;99Uavk4D+ax2jorz9U2Si+yNk1LKIl&?c)#5( zSG%rA2a%47wsNZ0hsQy=$8(WZ`*QPq`TpZ#x&0*DdRq8-yS#hPwS1W z=d>SXezNLKq8oG$_6riw_%9S;Kc5^l%xSEfe-r%OZhQOvZe>FH0erK$-uLRuvnSjm zV*N*|J$mj}vitaW{1J36?TKi3`t|YnYp1_*GEJ}AlgaA#?h7R&t#xDZ(f2U^-nxYv zcSrE)$~^6ej!sSrpl)#o>9=DjU8mdU%}t9#>2 zoyF>Eom@WuIfhxXCdd4hZ|^47hMDsr)HgOrL#euW^!3>hjJ|#z4#45@M%Jh)>bdCe zpT%O|$O>#$`q#88vVYzmcH5s;=c@e1G)U?=4;{Q&Z&v>+M0GA3uvvCrMGIEDo3;EJ zB$o>z^WARo$j;i=zPnyej<<;8)iE~Hb27}6T}ighzRZdZ#fOYF>AuSHTiA?bEOzC& z&(ZZe@QdHD{;t~<5eU(_eDw9%5sbcmexhZ5V2xkU&3>V-d#>CqHhUakp^L>~w|@Ae zoB86T!|=w)KLeUd-!g$%to$hoVvV!*Pe%i}t}*#9DU7AMd=vHObSwIU4y{=1{fxot(7ixA%AjQN6}I9;P0_U}ve+H!jUw z@p8(5Z2*p@07VypQg%SWIiQ>)Wkm~sOIBHv0BTATQJWN`nLINgKvcNP6=3Toq7Av~ z-@YhBt+?w7^j@M~}Ku#Hu2r`)7`jGu?_1hpOZEHtWv& z2vkGukZxzRuEW^*swmoWqEVm6y8Vkp6Qy>jCq$EECPnDEo>Gkz7}1+kqLEf?5}vfL zMKs>OkZ64Tb%-YaK8PkiA(|*ARg@&Cl3WrO#c~3Hs+K0_#wdj*TlFw|mgZD|N{v9C zq~!I$h9GQ|NJm>MDj-f-Bz^>-L)Xl0>>Z=%$gKn#e7q}mSeJJclWu5VQ zl+1ucg@dPT!$#;1HLFfEYO^_cAj_$FIkD1>j4TJBm=y{4$=Hopegd7CFyc_=0?VpS z5)|r%x+zE$_(EzPr_Dq)L)tgT4YFVrTmCaaRQ)r^(;BSa|3xuhC{ zy_3xku|qnd*z^gDEL&&-b!fNsx#WMm@I0aQ30#V*;+Qb38^GZyvD#Kid>cI zEl}XHRI9SSW}-}4F;ji1Y+ceWg-C&Pb)^B{)YN1ha4xA=Q(?N|i9GFGq3X5L8m-o} zs>BY1mz}Mu;NsG;U7tN!TxAmtc=id1Bo5GYDiG_bN`_8C(1{l4scd^}r`5vw#xc#h znl;fRMWU=zNtLo%Dl1o%1;je*#Em=IhnE`?2iK(>nE*8a;Y%7SZGOym$eTybZSv4*+|G}q2&Ouc*xbn z1~{u4hcfRX4Ozu<6z;Ty@mwr5R>EjGbLpaTHjI@lG{cs*(KS%pWZ6~UEhDZm0=K_A zJ`FGD#|%pspYUUb17456_ffrUu5nLTQusgT^lB`bU&@m8S7FI$e-|uyWYd%-qlA?- zxyj&|cQ~o`MZ~h|$R?}FGEaR=%6)>1_kAfm1UlEEe}ZaK3aBayk5*xj;}|0hsj9qK zYe6y6p-J%G1eefkISz#2V6-j{8R}Sd7$Sf*8hE;j1A!q_lC#jS3@_Wp@de1_9_d6= z8cMB9O$RTh7Rb_P$<8%GNK7Wgtb`D>S5sq;WC4Aqtm4oSMx_fce1T3X34-ildrrz+ z+=1%EH5-UeXXavGC>6*pUY9*3I_mK0% z>OxyzxY>!c6eKheWPRw==2(f~7e`CeCL~s3BRR-H>Ubj?>O!qcK>oC}wT7(6@i;F55-sopoT=#viNfhF>9|63HD!lhEngAC3rRGlUx!4$nt%OmkZ5^A zqR5ib-%(#f_$R7bTU;?@#4G*Tg~Js_2fNHd9Tg_0C`jZqprSd$4l~LX6d490$AD&n zIuW(N)r@_*(>UAe`aTfE4S8Ui0jIYLo#13aPTUsygF$#ZiF;E@H#$MdxMApmYZyu` zeL$~)=zxm4Ujwd1OO2i?FUK6sBpnP$`yFse>hbuT*-at+3;zIRW!oxj+W?5zQj!pf z25lxYIc>Ga)Bzn%sHHCyGD}KH34=of-F!MMWzxh2&5@2rh?+?wgs{?*W;ba@bOd2A zGJ?Gsml_VK*b%VmiFX+3D*$Ub=frI=O2x>&>I%8a7~i+5J|-F&-6qdu8RGZ>S7y2ElpzyMBLLOB?6G*Frip5@ zA7KSh(j=RqF%#_RwWf%ZRCyTyG8Ui=27v6OU zTNEhUaE{upMp~jaq8i$cBG@&y8&#>0%hF>Xy5LVxqSY&U?~5_ft!F5x8dBjkMRr(sicQA+ckOq*-!5XUqsvrI0AP(V_Nsg_1rws0=s7E!_w>Hnk=Vt_K> ziqS=SIM`nGlwH|OpzD*BVl3;K^Lc^5paIM@W-A`||ruB@vMK|9aTcMYScvV#0yW@yW zzE|;&V-82(nFWJ4mHboh#K2p|YtmQCg(dq!2W51v{RPkARUDM`)q9)Yf`gJwJate~ z5ucv9C7SL64eFfxgzUK@SYSaeMN&CbJK@xk5@A*oGak&1r537ni8H~m`cbJbWOFzO za%jC{J5AQmj^Yp}@my$;LkT0~^!9eZqW6h8_Ncd-0OYakaNq^o!0Vq-*o%vv9(>dh z(S(U`51bzN9-6FzuBGRbPQ+HvTZ>FlI&FosOiaz?q7`#=9a7Os$45(X2gEcU=G+i2 zKe*5hdaDi9tOJLw0Wyq~YUDKO2F2vqOXej~DNaX}YUdXX$aaHon9G+-AK)i7RzrZF z@Q%cdN;QK@qD@G3Mp`tL&3Lw<4gqAvaP!8c2tNvnfw5ace(+cw5ifS*aJbmz{EAP+ zZP2wVR~>}^D3PRBjSTRHB&_57kN~T|Hs~-7LU}6+Gz{7zM&_Umu*gQ;k5bq!{HVlx zc-L-A&}-0sDtD*oHpAc0V-P#U?cjY_E6qmTDic$W9CCNv)+x?KbuxSHBn5l2DlZQ> z#q}-8Jf(DajkeZjrt=`$QTa8Y8@SLE{YLN3o=eID~FT%Nyree#>&a_gSq^5%9H z=XjVLuGEUUgUaoiP#1~^brr-HKnc-6kBY05ZCHFb))Z8=C2d!c)o1`m8c{|S15j~t zpqY5alGK2t4(O?h$OQI<0bGT4YLBGH(qtP}E=9gs#}k9vrC0%M<~$>_XMFqv8^)Bn zYMcDpjRhX-JRe2ewG<=l*G{()+rTF%tz;z-NYL=V!%>0?ccw91jY`Tw#JIlk0JeD!71>)42|ULO56Y(zb^5jpVn2D~UR zP!4ow)x!kxe1jo=To1f@IXz4{YcssguA<+*3+0{qP8pAjG`AI4$}98aq@Ji(?7$^p za&}Z0C<@0mN8`QQ`p z?lYV(W=F;6%D8Ke-D151w(SL3ZT*zU1f}?Im`vr3j?W`xNx==Q4rkXNtOc*PK$Q=%` z-C{(bT-xQD3^DRur@o7WY{VU$GF%0Sd`5nR>cw{FCDri zJ=RWed&YA#&(v94@*4W&Ef$p&Ekhllnw!QbhHI}Ik`*{zL}P0Mx`wWYShPab;(|sK znRm<-Z8Xh3OSdrUP}EY$l0YQd!( z$l3N>8lrHANXYQS5`AZ8TW|pBYcUs-k$LC~BkoB%*9#|^yk26YsNTuq{VITGo(31a z1G0KQ+F?1n;>)5UuXb(J6VGc2TiO5`zg5Q(G-gb3gy^A-aFflv&W%A)yA{)%Zbtae zJF46kg&s3tZcj+1YN#W`_wfUUPmhW%Sq>&dvV#d1TB1aoiHDm-5g&7^%a-Uu3c2~% z$gfyFa0;wza&5OG08T-MP3=*wZAgYU4Bl(QmbrB$K7C6uTwCSD6>X)N?|PB;1<pjc+tXjJ`+zQcAYo+_<$D!m zg0vmJ5;uw*({c==bLF)sagnf!3Wb)6g&V_n90-jIo++f^6|zVthEljx`@ibmY{$0a zND_VTuMkwYKsP{U#XL||4P5Y5e7S$Xk|>GY6j`8HgZk@ln3>10_THy+3(CwQ4<@bGXqx2Q;==~~V7HKsy>y?%CaU2Q^n(>XW`&=&UkAy%#8Syzif%Kk>FJ-yZy zAR1b|b5(h`WJHTf#}I&^0UEz>5~D6g^MXcvkBX&v9h*=gi0wu#23|-jL44MfV zf#+E67q=0pUE_pCv?Q0Spb-uBuNO3;Azqm#G@_ZS+}^Gz{Jq{CE9rSv(0?E!Rzbjs zRRk^q1!*AwBU+JXcmgAEQf#1RjO*UKDP!fvowA>i_GXLkjKiY|)4qzBX)$obE(jbk z%LGTDAbSbmh=w@O#zx?#TA787Xhi8vY{V#e0p5U(*d<{jb{W_R{8DZipdavWM6(Sc zkr6E_5;L(8jkxBCjc72cRxdO_2@h0c1A6+r>Pws0h*_H0h+PIY0>9LHg>60W6E-%Y z#Tl^&Hi8pBPHY59scmco-br05Yy{qaA|vp(!g)YO?2?cXy9|R4U#k2O=j=-t7D8_n z`??CqV4K*8hAgbUz!5`<^$;dFq9JE7O>o362^_J@07pRmxiG;ID8;tH5vVKd5LAtq z<5cj62B>J*;D}MCdvjfNmg(A$LY;S=1_ajnZY4_w492^Vpc z)dZF)23!PgQ#UN)vIPAtoA4f5xZ8vm4CH(NXhuWEd)Rw)P~PS3lG*#S$?W|@lG%&< zMI^JAbf3%)=Y9ArVlp!C#34ZeWhPnxa+f}fjm9k!smH2^bn|R!)@fMoNa~JWY2W@c z?LO`SK_a`$YGN zpGBlDqELpmidbD|UN>%afQ?MOANpjL*a%~^9#^rajKESPjUkChhX5>{;mF_`t8XNk{2Om1Fv49cOTr(*LGBSYZon6c@N*a7lt zYW(HU_#~X*551pNSreJRj{Zp$D$~vplCzSi3x&$RX~$4;EKEh2u>b zpX3%nv5j>OFWZ}jao1;+S>k89y2@;NP8YQ8D!AE4EHg=srONh-wcpH1=GTsX^ZXi5 z`x1jAau7DpUjvd6VVRR1qK7_99QfE3@2k4lN)^`u8-<1!Cm=g`Y_&0e#;U~b^+%~z zmK^qyBDhjn%EhQr~C^EAB~}glk~&9hb0Q1WiIo_cRHWNRL=1 zO+w|48D%VCl|D*pg>aU{C1B+$ngnb)s9#8vz>qo@9?>L}Ij%{QkhzDSb3KvRWNU)N z)YN^|YqpRkAu`huQ%E!kkr)a-hq@?fx{xNpN_EmCtTJg5u*IQPBToXi{hT1ha_fQ6 zk6AnkNsD(T7lIfdRA5Ru4E=Qtc@QX&wE*cA82VlnvtNrSYetk(I0{CTu*xJ#7{A~> z$&-LvXOxU50o!EWl|%`J+X39Dka?gtUNfeI(Nk0yBuc0Rm_b2QrQeo3OUxim>TA0? z7HIwwObGxGuw+yTo!d4l9{VlQ$I!Bg*{7*gjv8g3Iw>uqN~j3nsjQ6Ulr-M_&Df+W zhqt{+sTuV{& z!#1qXB&Cs=Dd9;_g87h`2<&7iw#2mjqM;eHCE|MxTtLK!N~vKl5S__Mdx5}isjsVC zQ?wtFs^V?6JYXJZxo}ach|fTrY?qv~x=HgBzA2RSwjw9UrA~8Q8ZT+zqSdXFf&}H> z^?E2YM{WY!7c|CXc;C3L!Upu*n6!M9d;*EsF1s?*`dylv6MQ0Xgv90j21;Wdd=MjoZBFcC3e|wm*1Ep43~XCc$O|e1YG9QV`I+TL0xo*I}mi>xCo+?G$Sy$Lf`E@SR_RYXW?zf(nU45u-; z>YZf^$l`;j(dTj#$2W7&6#pbI!4 z1(`#y)2L-upPyzck_F8$t(J|as=Nq|(WXtCi){62(`IEXEt@tM?FVGj<}!B+uwpYw zAGb}5#J0l({iBtY15*#E!uqz7A;CWOp6vnO$)Is zT0A9BgBByNEgKfJ5T$O5mV?7ji#7{oXBI7IT-z2cnorI$ShSf?jA_xbl(t1XugaoD zNqY@gwAXHUei@0#xxFX7suq&U5fqPi~www;5uYxwB}8sT5^FC zMf6{p(QMAfI@OZaEk2y;ypa5Bm)xuKpmh=gsEaMB z9v*OcooiLAg&B-OPX+2&XMJ3?`vUD38r)NHXB=>pZ?c3$6PqCehvf* zF`UBNdgLC0bvokjs^1|+WS4~Pn&n2c6`1<9QN>oFC}D)tDA*fhs%xZ(lprTYV~Pl( z{wdD(`Yo=?6{idle2m<0$Pg*Wq=q6>#|GA5ZPs9h?Gc1E~u!;UwVsoF++q`sfq}=DKJ~Jb|qOoOxHzahDbpMIyHD< zntqkGSHh(7MX-o55k9maqbxGbTx$l?LlBKph+63(NTGLZ7Nz@BZK^%5gOjO$;B}KL zG+BGsu)Gr-IxdSHDvPdz(2F|xI)b9$ldc14 z3Yhtmt|NJAQqgrJZ32z2!%B;=!^+0kks=K^W9*3XQ7py|I(zb@>}WEY#n{mmA2h}e zi$&$h*dc(75q5ZUSE!;&r0Xa|)x# ztmf;PEo+P%UixG4btDV0>S|Mz%J@2Bun@2Dbu`DGFusl;b!~hd)s>AQxr|1m>)>mo zN!L;IxAAZId5sJr(0*xBbY#Ut?kZ&87e%`Brt0W&NlhXT8SF;Y!BW~(9ac7~4(@!?r0O_Yws_Q?hGe3 zRqZ9sGH4;Z6d)NR3_#h4e@0a-KJ-?KBte5;` zy7v`I@O}%x>m0;Civ^(Hr+dSC0`~h`Ka>CAwka%qy|f!kHTr!W{o(?npLKdR(Q75TaF`lT0@AtP2MWH_-&1+e%jcl3NHCr^2>C|0o2fVShO1)MKk>$mNerct;Ubf9fsXPvCUPa&_3s=DeTcp}Uw|GnNZk7Sylr$|9y)-6GS0UZt zb!WzMm)jP7_$QW2Gb_JPb5Kc@`&K@j%aC~(Z7i2<)!aZI7SF@qH35C$BBP-_dX zCIyBC0ta%fDWp7STM%dtJ6w>ID0JHUE(io}MPb14v*IVr8*@O|Sz*9ydQp!i&2Ml` z83w!-*=Q33jMm!h1T|4(Z(0^azu0$3p}Lu+(b&G*A2i@E1Vzps- zg`L2CX5`x5FYlByv|v21dcBcyldWKh)mE;|Buz8Q!NlrBrWYgIm-=L8 zH5?!E5&3$QEVFu*nOTkVM%ahUolZjBL>%y5xlNW^jq?DwKW1)qptA2TN)vYGO?8$qYas)sR(mpm z%y#!oDc-%}l{vJo3Kh%DY8Bc{te!>YRePmdH04#}CYDcTdBJ8eFs~X@K2O8}O6FSV z%7bl!Wm;Ob*TP*k!;neR?!PS|v70NaxikE1AjFt7OU5yWDlvTdEp=IUU8y zu0EHbzr`>a(>dLmCBQgGcklFcV0gRDB!~bO$M|+;NqI80`U*38KeOa@BIKWiS>o?f ztFe|TS4(G#&2l5QrC|%Pf)q_;y(@&#uqRz14bY27zt@I>5)!!VcBjP?PQmfFB_iQG zvF;U9Dt4Y&w?yS)=ZSUyA|u=t{4y8K+>8fUz(hFwCN5s02QuD_DF&v$E1B4~cE?`w zyegmp_E(K_MT#wGDKAocI8CgTxfjQ2VzX53G_hGO1R{Z{#WI*k%;Ghpb($F3wbH^H zdkZ$}HvSrkfwvLWWTe>Du2ewK`=XHKdDT+bc>tEFm{BU#pl5lNik&95%h>DSM#49Z zM#lq{1favjnvN?%_l+HMV;F3Xm+R=k?hle`cm(^>Dk}hsASh=twJnz5Hg`?hk+zl2 zh7-jamRo8veYOg+%v2&x9)BetbLB0I0jTLfZOE7C$5kh51*eJO&6Fyx)5K`SbwMIX zhZAE~kgeT()$`6mI8S}Qr|y*-qu!l@y`?^z(_23#r}uS&;Gc)? zyvynBQDM#*E<#x*6T(Fu#5sPtn|Dd!qFGkBsK=S41JkR67q#qgQO7A(eTIvAAZLs@ z4~K%Rp>EgWD5so`t3kLa#EVABSs02+0IFCd2E!spL0cp2HfCuCjCL6TqfzQU%zzPe zv_Ol^;88hlS+i+hkzFN!(g&uays0SsRDrSTMpm;jkCWyAHM!+j9X`rs#f(sr zV>hcHm!E=0Jjkfepb@$u%$U(CC}d0t+q&?l`OSF`eg5HP|_i+Kl( zM!72o9(yOw%3}f_ll^(?Il#^d_ijDnN%|${OG^M^#pRZqh}qHUt@wdUdo~ldeM~0q z>omkaizOi3W#abuqCIJ4A}&DJ@+#EA6#!>Rpj0`U2&hqsbz3+tcDo2mHz~FYNUhCN zuLw~JofBLRrBLEga@A&kGJvJ#sk59OKBNh7u1v9>lpNNWnT219d`N9F$CM@>)Jb6vHkho>9y*6aM;>nryqlHOw!>W9 zSF=#Z03cnu;cqd|T8!bIbp@H6VmQ4U zZ3$ogbqqgmc)-XTx~kqNH?UL3elcyXj zYP-vpOp2vr2z#SPs*baYgi>&ha7>d>YL|+!^swATD3!VUp&lf$4ON|+gi?tfIh<1m zf}%849T`DL^FK=@esWTMyc!tzf(peO1#*k*84$?Z&gYOf4G1u3LbpmFwvaMjWfDp; z$b%2fyls-=F+M4z*B2@#@El=BPK5!^sK`C63SWxhs_$#P=o*=@T&hwes@PQzbW*4& zr5KKa(Mhc`>7+<_iW2#xlq8+%xl|vFFy2 zD-z?~){*);|KZPK9Z7fTrBE|PR`6tJDz&b;)90Lou}DIrxJ^ln*s*KfSHb-T)q9j0 zo$bF>nX8N^0CAUbicA&*Ea#a@T~mN&JC+d651iHq!5xO4nE2D|g^U2VXTG9fOC)ElKFuraZrsv5~ZVl8vMB1(YL& zSKu2U2!jnm3oH$KYuSrQdf=*QJ0^?{f=?&lg+i?_O74HUuL;h2F=-lwDBi&wj| zOe#0~smiIVwv$qbBCIOX#@0nny9z2`oo9*hl9QOO`Yag_Rz0pdJtLFhYv>QQG@T?# zM{eSNiOgK+2fh~Ts&m6+$!wYB9LSQ1eGRl`I!lvt(TY8CwX2N{griGw8?TnFs){@W z@}!YZ6O1&|XsJxg+9plqS)BW-*Cw&+msT>ZzREDOP%1K{ViCt8yJe_Bt-k<)nn|Pe zSIat3Oekr!M$B!O6jR$}mvkeVIK$lMLmOAg>a8kvwfN$mw8*Q3rKIw3zci2jV?%JR zXW0(L%p*0Ytd(rW0uss7+jAWez&=p^ttOdF@jR5tc zRBVyv^LwUJYFUkU=&ZlR7YlB|dlDHO7njO?E-u*D+HL%fn<8MJ>)R#cR`+Bw?lpq{ ze#_bG42(aE)8;e3xtH4bM*b;V0YzeyzwuGF>heQ=Z5+iC1 zktL8kie<1RfG{dkM_?jh^(d=kt3_K^d0IG1fQWJ3;cb#pmqjfJAnQUbNqVWZqa?WI zEIZ;S@x#=n<^dy`d`u)u04G(aA_7?g7^{l;oRS#8!fY-sb>Ig~-PjT`k6YHnBZ1U3 zr0Xt-E5VADR0({DHb$AWV?~NZR0-gKsxm4Z+u2KHfGS~^M3u11ph_SMmG%pfEuE8X zg}h$AOW6=amw^#a+C^sFs?d%Ggghs0&N`_QKxgK;c@|ef<{`q;#$-1O`fNvn7X(qM z%8FQ9VzgaW(odUy+Q>-;9IG|wb!-|bS&OoBthK>hi{;LF4IC{mEgU5UkZ0MGD*>&q zK^F=s%3`qs@0wOI%ZrYmsXc4pO~jRe_emT&*4Wy!q`V7aN?1iUNd$oq2Uv~QZ+c!g zGp<(dc@oHj@gT9vb9&xFB|ZnGM(xhMl`p>fCzETh_<(oR%)f}_+M4f@YqQQ-qagbU_-=5M1!1<# z)JEb&oIQp)Mz|UE4xaMZ1yvBp#4}soflRQH zxjF-xD9MJzVzNsLWX`eznZ*Jc3RM=*l!O(?ES?!J^C}}RGmwdHl51O$%;HD|ZjnrO zTbrTGS(>rTT}Ci-ltNB3n2DuO!5RfK(G_xaBbbSI&;UU2hVNH*Chi@GU5F+-0M_| zKMM_4?~)_Q!9n%q^&$^&YGlb$nB9n1GI0{L zzDQ-)N}s+xapx_^Um@|)anWgKM&cD6;)UCacm>-i&J_-Sn>Zw1QOPF5mq(ezE0Kq( z!O2xgT-arC8S#pe>!7xrQUA%@FeZ+uD4fdRz*ATfv?4*SwK|Dcz$qx@spka6&Pcox zf$-$!yx6xyDIXHAL}r*H9$16kcNX}9$k{y0z%-|Mx+N!jK^d$bqj^=?tAyNC#16&0 zqLWt;>a3(|az!P_PK>MYrMS-0aS<(u{Brhou!50}MZ|H7h*v~(h9gzTjo9n)=7k3V zTAA!K4u-OQwsHYbiX^)N@+=ht(Sp-WW}hS78xkbtb|nv%V!i^=f;CG%)hGfS=T`sX z6;eKWJCW69clRi32@?lnlmAtPDyy?vqxUcau;`L3t2mq`<6Ti1Q^$HpO8}Ww(%h&R z?@HzoH}h&{lQ7UCGP**0KrmWR)%89t0#3@L0JRexW2S6rNr*~jHM9-IZ z0B?|%cYrKiYyS_Pt8jP+ig-=-RZvHncYvgThj##!e13TcMk!C{0RLXT0hQz$fLig> zHBfj!&~^==S(~{AK(RIV{^S%qJOkiza?3LS)~q-^1EkD4JOf~~>dP|#vZgjY16G)x zfmMWOfE;McGXOrQba)2Pgn4-e$T+q<1J{8=!o$j>k>wcx(O6!d0eokfo`J%ofbAIo zby!-SfubXY%rme{^bE|RJOlV)TfP8LriH^ZK*F+gTyH zt{?Wi>cqH=_Y|}qF4T1I8vqAmyK@cTX!$ogSF)xjbI`7Ug?H4Ozl>JKz$rM(cE;55Q5{ z=g4$M@5gASa}9E$uUAL@S>3iXIhNKgfjnb%+RharxVUX+l)Xg;Sv5`58H7(VhmErk zrs}ku!Rb_2|KbI-pRwNdBputmtrK$0c1B4UrmTXT<1(I&aM6tCN=l|_Jnxc>XDgfW zT*csH<}o_Opx}D@(Jk6A+STmJG@dcjV&BGdC11VS&YYCz1U@GF^9um7yz_l*&4X(^ z->0B~@Hyswm*(PO=7jcksE7Py8rn6^|9-2$>-2~}i&dcCrJ>cL&0@3T0zpCM=;_Oq z9DP1p+CmbIVK<%orC8Vma~PVQ9Bf;)C-A!*sy*?jm3=h`D&;h_ZGYH^5yGr2hWAFH zHM3mfQSzdqQ<)b!;$pDNVLTD-M&t67nHz2MGzCK=zT;^WaxZT3d_wA1Bn5 zzeF~&l~}jN^J-IaPw4e1B@NSEh9y(g@}PGhbENW#tXrzQDu7Gl5%SKI!tXMFOy#DI zW%hMYRWDba=i8KOCcJ%@B|HHVf>IEAwDOllsTeUDS!EX7)>aDhE@4N)cTaMi=%H4~ z+1MVFe3BqQ#}Avfy{_n^%Pf(BG75;wt2{Me-U(@tS+Ad~(F7T+hOj8`RXTZdLe`y% zARhRU*C+Mz2+y=Ij^9J_gm&(r)vB;EOS>oL(5#(E_*tOtZYsq(p%N(1_FPX z&=W>hDr9okSoS>v21YFk1zVNg^;q z_|4ozR$7jtS(dA)ip^WDBC@Z=?J5G7n72h!ZJVb*sCm*=E^iS@<@#~8nGc*?eoj!4 zG}-%tbaN47pRMksEV9z{7ws}Bi^5DXC1;U;QDD<3i-t)e4-qMgfF2KX)Lh3932Qs~ zE0({gIYmI^FCq_KGk;ODjppsuy^p&A%vk>wzmk> zpv!sG28A`A?z4#rsoRXu%0WDYLVS#mG_M9l4#OZ1@nn ziXa?sR94BEuV$C4v|zGW5i}j{qx~&U+9YWxXPZ%7#+jXmvo@OmsZg&y9VKT~TUtqg zC|O2|V+pBxoNvuORhZ)KxK0@kIBpY3cb4o(xNXZqHdh|G2`<`Dmx3*Va4+>s z%Ch5Xmzx?#Zi4GhI~E0+n8^GqmQPQECyNpveabG!AjO=dOxLPd=>F>Ep zk{3^}&`F^et$>O^;2$HG> zkvHJfO%8fR>+4z4shgK6@wA!*u5Ps4Eh{EecO09DJD)mX_K%Ju4j9AX%`|0wHZ8J# zOj_jY6moyBru@GyX0Xaid30*Dk2Ty8yucmi;)7m7)HwDx^Ly22vwhmfWc$3%^7O8~ zgp^@d?=y^fuy48RCAyODcq#&zz2ESBL=Y}M*?J!X{C}P6=bbyLHFs|pg8Z+f=59fF z9(gKv2)qEu;hTXk`m+Gz{xJaK*C|WhvxmF`Jk{ML&|tIYZjX;Z5M$VJ{q`7W(6qY# zc4yOJRzKBv*WLcR^-+7B4&Z(Jh)BFU2bF{N3U_k|hul6oJ8I~Hw^DOsPCwg0AA(?N zuP3;^ZwHb2`Tle-K+5ZF5*n%K{ewVR06_oEy2w8XmT3M%z!L5COt<&#A{+^HhXwc8 zS6-H4P9e|)Uc!1@hOlTw_hwqIg(m}8y04}1$B;(>3k=L5WN|BUv%B2wo`Q@+&Oy{iW%uHIU5I!f2SS)Of+Px|;; z{16{sdmXU*zFh>iuXdNt2iCOIZml`b?8w_)Yb4I=t!U$se)C+*r4Ml}wAYb=@7qC0 zw7YWvc@S1!L5qJCawev`4x$_G%~)ewdeW=V@`rd8+Uua5cVC439sT84fL?}ucdO(A zKy7z^A8;(B^kyBDpY$lS{2?BN_IkMaeLDy+ntavRIAS8EttPqmmyL&@B zt~}{cXyrpZ3hniH*1PslKtffy3k8xHA+%e+T!=5}YCf=!7;AVd2X`ya`V;EM_!D0D zqrYnp;c$drZp{Q7Tu_t0bIRd>i`M+Te;efNu(#jpMCw+b^(xel@hZITNPpLE0{3RQ zOI>rw=P7p~b+81rbWbu5b|d$Oq+_i;>sM$W<5zgyk^bJD6xuz520YpQeku_=m+yKB z;mtP#KD7RQSUd(yGc-G?|9`s;r5ckLiDzg?3) z=6RlX79G-$dMNh@SpdW9TgCCZf6}wi{fBrK`s;4=_nkuET)5vD;SAO5c}(acChsAV zckBEC27as`Z?$>t{z>mb4F?V|$e4+D6A3K-Io#y~kYcWs`(7HGqmth$^SQ?-T?{>bh>M}W z?oNN-<%sTqdlv%|Pu*Q=A_!7rx+VRD%P6|?W*eg(pL8h4mJ#HW5Y$f^61;BE|H;1jmURx9Fh1ualm1HT3c^u7=lL z?C;u1pz0iR<4)swko>vZ5G)q4(r#BJPX_2WQ+D-PUqk&EU&HI(_4n-|P;T7&>p}rz z_w6(Sscd%lE0PBpRedWMLvPPI8`{S>8(#OVzi$`exRranV=PEJyj66_iwaj?IDHK~ zRrL++@Aj;(p?{38;dSr&`}Ps?QrdkV)faaKIIxpIFfdHG+fKrXqqXL@TaEg&&W8Rm z&W6|h>+jl0paY8a&SXIHcXW511kXfk_nidp3IApRqyP@&XIgJm{0MKuc+7vTx1naV zufKOU;Oz2x+e;+va^Y@8!r>=x#)UW9HPdi~`nSjP32Fl7G(MFe-k8zhR8Z|5|?osTITX z4u|oW_jNe@(?9+Zf6V{=QI)^_{(t}FcVGYOH(&hm#~=RfU;q5W@5dv*`}(in{Af>M z%b`5mVEy2`um9zn@BaDMKm7YQKaL7^)n0m&LfEr^{N{ISSp1bZy^_m$7Vm$KHH|jr z3Bmc(H{bs8PvhfCc?l)-gCX@lzWx1Ae;Q-LgXTCM7x2D#SS*JQynQP&SA6mP58r=t z!(pM~kN@`FH@NzLzWMQo-~8pLAAk7Y-+b{8)hF+q6+h?mzX&gm{{kIh<6o<@0(xLH z(-)&vzyJLy{9iwO`~6k==Wl-+P5ABj-xq1he*g7f{`B>aKYsmJz2zZQhkvo&ePYBMp5B{5 zcIcx$CJ%tfF?!?UroGhozus#;TFEdc5ArA9_V~8)%J?3g`TIPE>@Tx3SJR$6G(Y|L z_4j}I!w*0H`JaFN=dXYI@!S9W?>NLV;)DY?{zGQU`15m+b$gHVCO(hgzbY;LkK4xj z!w=v8^!Z=D{XgG);lscF=WkTRrSXnG{`u?gB>DHRfBg3A?|-_;{)4@C5skP1=BMBN zY07^3=0AV>{Oj+&{p0sv{N<;wfBfk;XsXZE+g}VV^8ftiKYsl7r*FUi7fyKn#S?eD(+>DwQ^SC!SwBKyI?P?2XS;r#3nz47gs z6h59*!M;an%RZOz32B0#G^a+!6mqsyoS*S2>4T?j=~pDMX`%V?G|)MhLgL#)+FqJ> zsYMdWq<~{lhHTg?HIPrHjbYb3WZsoXGHcM&M292S0DY;s`vh6a6`u;ynz3c;5Vhp- zno~y392`v7aR}2~jN8YfHU6D(WwXyXJnU8KElR~xOAg+Kz+ak!x{Ae@ChPBiZ zUwr&8gUm>>tj|tCJi4ZQr;J-DjhM$F%?&gnk$x86$zMjR;Rqs_LA4W33*q??*9$I4f1 zHS{quaJcgLb>sW>Sa?V(y44q+uHZn8A6vT)iat!TlpYQg4xb(p*uZaw52cCi*s|-M z?}HR=KHUv-*Yh2bij%6^F?v$rHByvDFx7!I$l+Ym1`4*ugNWcf>kfQMyDgTCE$Lm% z{!)`{sW?LjcdTRZvlmj&;2Ywz#~!Zf*QJcDZPZ(G0JN8yGfsbqWO@yC%Q`>1bSJ*7 zU6ZGNMX(#ovc64I+b@(?&8i znKjR)o;4%ym%(Ve8=Oxb1H2jal)8rRI9jZnU5IaK!PkeK{S_ud$8;}OZL_3=zl{fh zVzqU9 zHN$A^$m0l?s_jT(%q0FkbZrL#Cnl40ZNOQ8LpDCkRjJys?Yl^Da-m~Kcs^&Iavv|G2;Gmmvk-{C-!cZ~4y#m@PjuX7xw&4y_up<`*oQo(?HnojQoBzhQngK56uwY^Z`E z&QZ{?z^HHgo?m4ceC}L!I(d6b^lMl~jkW?V-Rn^81uM&05p6!SfNnUNWz%aaj6w@`2se;Zy^B zj9F`7cpY=EYx0e)MW3=ttvn0`Hsg|A8h6;L*#ERoNYUhDS>qA8Qz|Qas7Ve>SEf0g z{hTJFm!Ou>Xg%6^DLBz3$ruW?V0SrW+myGq7#pRbuTs4>8W>f_hO=EN2H6M@4U-8< z417B^nXQKhXZ?6Ao=JU;l|E88Xey%H>ev}Tfk>x}J6Sj5Y@qRN+R={9OQBL3D~gNU zyN*dV7O5rEHf7YyQ%_0ySks+$8E|$z;=BT+H|JqKkE)08@KAs`4aR5sl=R^Zrto~! z`C6B%OVwWP`at^l4%ZJG>rVmSZJ5JwiLUpI)AD*OZ8!xZ@NjEL5wc-tISi0Y87w{- zUocnvuW(rM-WyG02U4ut`ley+4toW%l*+{!0$E95#XnUhq(fV~bg2p6UaLv8kYuow zrR$;d5`UeC63@2ox`4C9A*(VQ*FsLhFE5`9aAPsrkGqEl0s3xiv09J}OA<$8;ktW~ z!P~*(tuE4`__95^W8+I323DgUU1g6u5d7yfpABs(UqJAp;_V~^;44pG*M>^UL1D`EE)Jwc<1=u$+!ydcT3|xnC$Du)jb@o(lb7AMO=sZOY zJJr$7QNyQ2nTIvvp9Wfwnw4BP{2YFg-jCiX`pQOW@-*+#T-PtsvB3vlJ|B(!G7U+G zJ%Wwg%6$?H=`e?xh7=88dq*5zm`^thM5819)iuMm9gUtYHAf$e9o*^c;kd0l$K`Mf zapb0?hBOBfWGS@j<(q*8e3eBwSBm}Gq>VPFJtq!JLPjmjY@0K~_z2pt3{z>1lz{UR zxI~25H8)|UXv2eXmi67eo4-b5Pv323;Ze`b9x`l?jSpqE{en5|JXJk=COT)nnK8xl zwFjZ{Il1op8Y7_47Gih7)^LSG1x(~P^cmADdhKl}rLMskNI1x5^b1mmHJl?>TdNG!Fq4vDrCxSHm)-EMd95bT>{k3#Hr)4CtcNt^)(KTPbt=7&c9iY}jYEX`IFurEc^# z2VWlVohftUWu?t}!AT_iX4u!1jj@xPeetJ;|)^kGxC*ei}!buL+7 zRk*()4Z}W56cr7r&OB77-(u^;YHrL&SM0~M2sss!4XJ|ZtS#R#^IW}%#ya6`B5Yv> zHHO#iJPt{rQ8mU*kgVdgUyg4M2mN^L6STdV*sNu{>hmu71(%KUPef5QTFvuWKv981ye3 zHQ|&jR#Of}4v0!EakwHm#$Y)fK1;}Q50$#ZMSC5XuFlrrvCXxWd90~p{mU241FKKg zJ7c7sY0N-e=irUCTnImLq?B9AP|Iy+2I9#<@QX z3^|NApmL0g*o=wSqYWpVx=HU@?z&yeQK7J0X^QB_Q|-_jTqUa9Tz19L+988loqO1e zG-%*a2HS{gy28e=fjr%0(1BB*V~vo_)96>{7gjS+XdGwL)LyGbo3SSj+tw6QLO3o~ zTVHw&7gKGv_tmJYbPn~Kn)p*2h+$47>C4(XEyqJo46WCi!c3Unrhw|| zkEPoCp&U)RH!r6&wYkw4($T1q?S}CPy*FgTj0%@;^rHcDySlI;)K>Ib5wluOaj9I$ z;AoX~?A8L%8QQAnqa9qSCHTY94q0tH1!lZMvaL3yU@*|4j)tR5FNqVCvex99&WW-??9 zfU_?d^Q9~+>;b2QUq5bUk!1S$AqoiFacq>)6Z&l|a8IK(lBaJ)J!TUEK`ndmY7BTP zf^Il$;Bw0JYeXBbH8EJsyPf4YgG^xp8doi;(SgYs+d+Aqhc?xZVVEiUJvQ7yKh88> zxq+zigi(sOlzk;T46^YQ#fHb*!qhlrX=o0@7!K*BZ-S`4KOz0(?Acp?khxDo_ozFi z*Zanog;97UJv_bQz0O)Y%+(8--e9|WAsd_i5-zS@NTH+R;pzo(CP&g?ci^P>g1zX) zLIJ}jFaw%x9{4e1OzPM? zD1pqDpf)xv;*^F1&6rKYKNfy!{Oz%-sCl^Uo+X6oiPwyv0OxVWP=&AsbyT4?BIN*` zCAlH}IfRl7BG#NxvSePQazM_KFkbaquNk1POv4=wi9Id{bii0CYF=Wpcu#aF1~h^( zptQud0GTkXY{{V2hAhP>>+VvM5E&iU*HXqPPXZlwJ=+nGk`BxnoZThCR!s|YHhu%3 zXJ$VdmJCFwfEZ4h&0-h`<*XNJgm)X`V=3V&lTBNEJh=f?sm>zMF7X{}=I~n`n6wGW zk2?CqtWtW1SxxC4vzpR9W)<&!k6Fdgzrm~?vu0xs&-t}5t4Ga+S;efm#jJ9Q++kMH zK)0Axe9SFo6`y^NS;erw!>pDEnAP$SvsxZtR?7p-YI%TJEe|lO^#NwJKE$lnd(3LN z$E=oznALKRS%qr9#jNgua$;6*hK~UrsXlHotK|V^wLHYEmIs*C@&L119%5F@1I%i9 zfLSdMF{|Ycvx<+o#jN79?=h>GbhnsQ>W>@D>P3Gn%<7>(7H0L(3;VOvJ!bV%Z#HAP z$E@~Plo?8V0C8a3SsjPsp((XMTcs>Mgd_Qy*fN2Hr z)Qhg_JeauIFp#by3XL}AQdLtFFRE%+T$&0Z=-qf|s?KxU;psm$6>w$4OiumKRKS(> z21L=;RQMLfLAItEGRLjVR#ZJGfZ`AJbF^2zKt2JYif2XtQrTdKq5|$$p}$j80pr^P zfVNvxT?T|{sz-z5D_e_L+maRsc-T?M_nQ!?(*yqEjdo()EbqE30F|=jOOe_GNHML;@dQ%bt73;zR5dVm^nL0vPfDSJZu->QM=nUKI*IUED^*_2O zTx(*7DofL_03C37P4jYM0i5O~-*SQh99YcF6)@2NhwOj@ENR|&fFVQX2e)Fv1K`=n zB%yh=@Bm#=5XYK^2f){0OU>prJOJ^j9UdmgCLRFzRs@+SH9P=7p2;d2902__-*CYJ zfak=L&Zh_t(BXg*emze(0M6i+OOO5wg98BeDeN$Gk>CK3!9%0%hwuOw*#ZPyq=pFK z9i{x!Lo(p zp`j2DMGH}Y`)b zGQ2aeYBD?*C;$`0N!6qY3cv`!V39f&C}7Gs#uq5yQqw>Ikgc(6pa5d6BlT(8pa4iS zR3hgHBfDMUY;8&m6o8L0yi_^>%T4Q5*QAqC(3Jup|A$ZkXfq}GV9HKZ0Qv!F4NmTb z3UG#Iz=Stg0J1{7mleKY0f_Z>?F|i*6Blqu7cOAjkwFS*?1>8y7Ert7jSFyw^C}w_FeVLfJ#rBnEC5RYBhO{S0-&5> zdQ#yVEPzW*rWLbI``zH@9ss(cay{HNZQHFo3Kq}}>OXAVJcB^49+|;kW6o(bo@nh+Ss2G4g?vTrouoj&#r+1^y{F#=%uEBc97wS2MqY2 z>;R6N9xSNq!iz;Pih}-GGNC1qCV;M|tP=Z!(V6oE4h5uXXb+WbUIlDbqjfxX?^oGa zv%PiEk|xsHrU|I0x%nw+yaM9w4xf^`;zSz2X7Y$XgOoqP;Jr%Y4g5Vn6kXnF{r0i6 z%%^{Ol_H&@s*^%!HbtDFspE@MTp`O)7WU&gye!^FS+*GnVvErY23^`sMAB&fw&fiyAp7VC54_MJ|sK2 zFDtZvw;y*ixw9g2d`Hhl%s43?VFbvOAqv?B;g_iyvN9?KK807CDtYk38T|`3oVwk#iP@Vy{{h3T)_;FDBJ_jt((zk zO0yiDt&d@nOh%tL+;Gf(oHB((#-`0w+EKF@PQ}#;;euapJlt^0MPA?tJ>~7k1wLO+ zY72V<&d8*t?H>_7(jIMo6hU|oFR;^yV%FqR5^6>T$4@hpV^k>_B&Qi8qdu^DPWSpj_pWg}v5nhS=PN;|okqe|;iLS$IT ze(XD={1}X5M~xqVcI2-;G2A%QNxOwwTerbt-j)NC45PAN_8(LWj^MFN%^K)nl?&Ct zi=z#SwDo9~uwcB*_t`rq0w?t~$W0Nbgt%afZo5w9V+i88mt$)Pf*PCI$k;&{ELEHd zXkGbT56nHfEVgbCRHZp_Q(|-Jko8Gzb4W9j2HpG|lVYAD_AJ@duqh%fNiywU;9EeR zll|JTYegv*!pQH$+voHg%`V&Y;e>%fMIX zq|ZAUUcKv!+2}}o*ThRQ1< zy@gXl|+>l2=XKRluz$DxuGRvG( z9BV=z7dm7TR&i@3mqgTIkqGI7FCnnj7&+ zI0Pw~PN>X9I7E;#(lupDkZ_3iWLgha_(?cKU~Z&uwoJkyKw%j{IQLsV&%NZiGXoBr zNe5@m1l=JwnuVW?2#07=4jsZYIfryVa}*or zke=M##jUGXdZ+tXNvKuX#nWKBvl5hehN@cSj;WS8VwH^CW(?(yJoI}KlS6Rl3a)?8B z`V>St#BP{RHp-z#bLlHXVK+_DMLDFpw3qXy9O7M@Ve*V}NFaA@DvfbS7X)_M- z)fLuSp?HGaWvQ*O0vky1vU8wj5klQm^xE2|$vDKmQ3UF;K%|!yJ2T25emCMFS|CJy z@SrWwLT$Tywhz=dOMkuiKs^Fm)7xx5&>s}B^?FgIOhG($FhOVbH@%C-}9OHU`FuX7YW zmY$aDzQd=a+X;$xiazD56Ld>2cUZmmSbBN0b%)2&(-mscbh<*>e=fw+6$)9lJ?3(S zLZ|_`U7@}ac^*z*C}hamx%xsOHNT>{LNT0%BD**^G3=NFd~t@tk;ME+i50Y?)Bv;!QkiMzJpPj;%7BPh3A!n00(z@r12L zX)h0HgfoRT;U^gSFnc=3024lCu{XuaFH#_90TPYes|;O{k^0BzJD#FwQ$_%|WI;@$ z*akAB0ZK*SYFf}kL^yyx23YMeE;>;h&VJk(eT8&vAx5hb91rJwf^6p$kREKy3?2_m zI5vd4W@h*chD4uxo+c-3=PRyF54skMOM%ojJwwKLP=GA)yjcwkE+J@&vA@VG{ea7C zc6xKmXaK)R=9A0=+IXf3&_cK;cIOFi-mM#v{1^l~!1n;ms-_%cc&K84=7IC$(`^|+ z)`eW4Q>Gsyp|$2~MZ=QehHzN2XTdIzc*CI>45f~g7}#-qal~ZVi^hqXk-O`QFH2TA zf*NE0U!FBF%Y0F~3C&oJRP4nx{zzk_8P<~^R(MM#m<_2Wb2Dp@1Numi5Lv>ODMg~= zh}vsSSYk~zJyr(x0)dd6BF+4J=&vz!1EnB_%Sw@mqeCep!;pWdMu_(YTj?;X*ccn{ zJ*DnQ7YO2$K!2}vfvltrbl6H4K>9ZsiZFgxx&RT$^cVK`%onJ%PUA)Ot~R@ zy)$7Tr7_ZqRPW9h;EbtEnxs* zJNkIpkUL?(&Gy;(0)Za3V~XsiI44tmSv|8Wc9>(j-^vyMHl*5vceVgRDqZttW(#n) zANeIKTObLxf=@oO1!hfmWD5Xz9w^({0%UWgp4!<0aDb1|%9=AJ#jL3kpE*Cf&J(MQQ)sO-htJMmbm1N6>c~Dt18tN`Ad*!f0AO(C^qh+jb zUAYTLy^|G#nG~ih1X??x!)yE7Q+jj;J`&)c_9-cv&@xx2R0aX;<2oCuG_9%(+d>An zq27M1?e^&jFra#9UbZ^Z2DT$>2=Bb_R|c~PsmaYurqoB$XT zIphDXAgU{uiX?j0?Ha>q;8CajC9`N^c}YA0L?pfhQG!gF8`fabaxv_$xMW-yLgL){ z?J0dY{I`@O!&Q8GP%R5#yoj`+X4hK*bwqY|*d0O`1D*k;LLF@g<0$3}YV(aSjtafY z?l6RLRBHHXi%cfta#5e%IQqi1CiI3ZjEOJ?a+`ryJbNOHK{hRZW4xt8dqai>?)(@- z7(@j$F^ma%7%;O8SsWPPmTarnAZlKjPKGQ-{x*#^=r}_bj}J6#M?a9o z#@{WeA&V{7L|YcqagmmAl^M8@#Zl}v+VB{%I4W`GG!Bvc#I)M0YELU4c-Kq{{OFE` zEJjFz%z*QKjJ%tE*PvxZIUGp=8McK%iy^c9t=rIIiC#2lagx_odmDomC(hd}v%C#jY%+b|f)<}OC$xCT*5IAc zVt~(_ZPx3NCuJuJWH+J3k!GUSs0l3w_>5$Vm|qK8jL`=@qgf|taTFCykhvphaU#e_ z-jxk4P6E_$b{n)9T?kAxYYJN26O(irO~wT+#-J)0WcD-~2`%Q33e>FLpv4$HW!jbt zTFjIga!pg45n9ZQB;Ol2(6Gg6nsqhttlQak)am!WKuS z3}|D0$>tP^IJY~(76;d7Fd$ju^ThT1Xb6m8_n=WxThVuF@1Jxv^{db>;?SE~chA%riHTAx79fEsA;O1`~Eor|dH~ikMI2cd|1#ip*wq%RF@aa=d^)dXKqw_!t@+F zbED2oL%g`1x$$5ceZ|jSI&z=60puMMS+M6C zl&MfJ>WBFxWO_Z+Pq)Op?efRD5i$i&mp@OaC>De;mp@XTl)<`P{ukMD`Cp{w@<)~s zNj^5?Kh*@uhEpHJ^a zYI}j6ffnnwotMiWZ;m}^ySV)MJ!IY6E`P`b*WMF{twE&kF~Qhuqy@fKbaNh?%O5F9 zjmKb|E`M}S;PFD+<&VUrIJZ3J@;_vU%l{%Zmp|_4)s)NSk7pwZB3@kn%6)a(>&{$; znWnh)sZzyCOBcaXqc6xFf zoY_TUDufz1vx_W-7S8M?J8X4imcArPhU>OaN?d&4K!JsnE>>_gwhBLcJ zq+n2CJG&@NoA;7k6q%cZ*4*huF`H66(u&}Y-)!FD6Vh-d86DD)C(e!86d|X>$X7Ovll`=DZp@_sL zk{SM%Ur@LYx!CwT;{+SVj$(O3Fv!pu$+Uv*pV z7ZaaSQd4XbU%5u6Z70Z$iEieO+8{R!mhRJG;q$x6r*zsCS;y+#4pPA>&x+|~TZe{m zk^iVI&_Yerfj290GpgI`N(_gBZXNqjYjtgQ2+(yI1_;jw ze^WD(F5p;)???Ps!s9b5CWjOFe@G8{e`k4o9F0cr?~Hi)Tp#<3=s2z`X*ZJOYt1r! zhm+rb$d;XX;rB=SUO%5bWS)rDz1~yiWb$9={ap;2){EZ1&6fE!o^jLbT8n~L8bGI{&LLGX|B z1*U^^GW&d5WB5l`D6kwh!$12h$h|Qc{?WT@S=$W%=5-5KhW{`Fl}Akx2l9@_ z@Q+hAnnb8x&syxnR{;U{O$k=cP@nQeKG%#MlQzF53Iy|lGknwcGm!PI_Qyk1$+^=k1V z8-hsP!{P-kI8!o@*#{19#re;9>Z7GYoHYYUWzuQ!BCDzOa0N6$8m5j|nH>OE(CAqf z?VTyW;_!>bi#r%Nc_nqEmkF?3NgYY3%d5TX z)3%mZQirGk+iAygnDurYqR{~F*LupLIqY3@%$>Q59;^mkTPYog3I^S9rF7gk#8*rm zDLg6as;H*)s?%o5%_CuU*Yh5h^U}>c#4=I+E6}gxn(nWV0A@+){GtUO&`A|plkRfv zM!(&qBGHLQhMYC)OpxhD)(BCUfVf50sETthGszlxOVT@KH^~~6V@Cvun-q+Ep&8#k z@^2^c#QP}7zZM2yvP<=;~{-GHkS0)|Ls@$_wDch`PYB=?uY;Q|9<%4r=b?puYdKA|8rdX cr+@t8|NL+N^pAh}_wm2~AKcRmrg^CW0PH5i;{X5v literal 0 HcmV?d00001 diff --git a/ui/data/sources/tool-polygon-okular.svgz b/ui/data/sources/tool-polygon-okular.svgz new file mode 100644 index 0000000000000000000000000000000000000000..dac8f0e5757c6062f67dfc99ecfef0abb58c4e7f GIT binary patch literal 18142 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⋘WqGguEZb*%hVAoM<>{@X1j=ye zSB5bU_HCC@Vk-HfQ<0$T{lfDRA-MQt?|laN|5)qi&4V;XxWVgNifTnIGS?1lT|BT&RR;<$N#3^Zg~!+hP@bePpo zb>8i6|7~M59?Jo|cZ`U{yCkRryjQx+Asll1wX>rRU+^k7cg*Q$2k0XRrtz5I`rZMe z^7Hj{FF?xsJqe9c^zkc&vIKzs%Z4aE36>b~BVdW~nCbT3A;OVB7c6+hzVc=%<`jZV z;7wVN%Mcc=9A4(-MtZW4InqZ8nd32|=B*Tp^=`< zz>oBi4E%V^2YB!J9Q}KXNcEGZV(a&N*9c5pzmMc}lx}<(&vxV|b9^IzB*!-%19sm# zL{R%07djtQ)5^Gy<|5gV_q*0ioY$*l<3Yc9uII`}QVZiTGVr|v1fty~0Tdxvc?(+n zn~*cPTn30~xR-xb|d5VYH8A6vpFv z)>}s?fl$>hr9dhpq;a2@OZiK=4Iem0tTntU!9Ciu`Go$Ne8S^A`ddc`ha=2(A12`7 zf?nb!DTf0t#)#MaHpJNxZ@=n9>d~LgD)i4}6&@$j-#Sdt-fS1@S^%G?T}tXu2^!@p zG7oj5@IukCF`msUjL+m19w*Y@JxFO>6*Q2^p4X{F>|DK!63Uw|13rxTY+hl0Ca>@~ zk^b%x>S10-2nS)#`;dXsy?4O@lXDp6oALa|hUnSU!u&{TVLr~Izjuf#a2?|c9|AtD z-RFJ^0=WAcL_%pjziNPHcrvjt!$%Se^Kl;itph~mw_DPOpXYgr=s-W3sa+AW0EYKh z)$wM0GP5w_M=}fZaT@)-QwW+1*NqX*P`y2m2}4Bk9x8eF$sb_gkM-kKo7Wki%r4CI zk?g{JoJoJTpG%`%Qm8n5GhfCi0kIG-GO{?GpdV}0%f=`@nP8adBMFB2IGg_7F#=;I zUnUY%{A;@K0Vpxo+I5tU%~7kbVm{COWQt+tkE9sp<8=Camm{VJt|$`W2={ z4%vO}2ttbGDe+_*;v{bPglWU67d&!ie2r`X>*NRaA0=ElY2MTq=``w}b`u{Q2k zrAP(nmpQxsY_6eyCfD#dyZ+u0g5<_EUzZvbyYHtFL}hEZu1FDLRQ**jhB=;1HjK|C z8y@G@-#bJ&Zsm%1%nh`|dq)ReRJzTDGuOaVRbLo?k7siY^E0`I$JzDwjuCh%<2pwD zOSlC%aF8G{aD;I8gM<@Dd#|rsjpnn-hWVLf!{hw=TL%epK)GK+29UpVxC|096JuNl z3EC6!Wd)=J4diEf@3`<2*@ok5{<+zPUeUktnr^_^<^6t?DB2a$Wktf_Coj{&JNo3g zYy;A~9~q;^S@w4a4aXXDEl|`7HJWn2k)^Cnxz;EU9p*eA8Hvap5QO4ae8~bMp-&;*`m99VTd6 zk9?U;ka!Du-XrY}$C>(k;V|Xr5)Q|OpGY_yU-RCC!@vH^|FS>M$_{5;hd=%Dr=KM1 z@aup5$4|fi>A!#a(=R{%_&@*h*I$46KR^Bce}qu`AAd6QcmMb2AOHIAzb|g$8~^Q( zfByZizx>yqemwu<|NiCYKi&T8fByW}pML$1pO63SkN^0`zx?|jfBp53f73(Qzh1Q^ zC?SCZ;Y$uUpaQZ=rN?GER=qW7$9?@@adb`!Q2qSFcQXU{330fu{Uc6kj5+bR2z=Ru zG4?;N$8n*HdUo=E`Q^u-|9t%a_$fdB^w+=r`KRN}{5Ss3#)u>FumAFw|33cn{{X{8 Jtn5b|0RUkJ*7^Vd literal 0 HcmV?d00001 diff --git a/ui/data/sources/tool-stamp-okular.svgz b/ui/data/sources/tool-stamp-okular.svgz new file mode 100644 index 0000000000000000000000000000000000000000..89b8ecc860a758a56ca0aa3df86a9b78e5a611c2 GIT binary patch literal 25597 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 literal 0 HcmV?d00001 diff --git a/ui/data/sources/tool-underline-okular.svgz b/ui/data/sources/tool-underline-okular.svgz new file mode 100644 index 0000000000000000000000000000000000000000..3aa9201d0fdad013c65884d4009183c26baf160f GIT binary patch literal 18176 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

O2tD??pTE!xWPs1{bTpmzPOn0A>6 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 rBkXnbn^8>AXlSK Date: Tue, 12 Jun 2012 17:04:54 +0200 Subject: [PATCH 027/155] SVN_SILENT made messages (.desktop file) --- generators/chm/okularApplication_chm.desktop | 1 + generators/comicbook/okularApplication_comicbook.desktop | 1 + generators/djvu/okularApplication_djvu.desktop | 1 + generators/dvi/okularApplication_dvi.desktop | 1 + generators/epub/okularApplication_epub.desktop | 1 + generators/fictionbook/okularApplication_fb.desktop | 1 + generators/plucker/okularApplication_plucker.desktop | 1 + generators/poppler/okularApplication_pdf.desktop | 1 + generators/xps/okularApplication_xps.desktop | 1 + 9 files changed, 9 insertions(+) diff --git a/generators/chm/okularApplication_chm.desktop b/generators/chm/okularApplication_chm.desktop index 8bc83a039..947b02d40 100755 --- a/generators/chm/okularApplication_chm.desktop +++ b/generators/chm/okularApplication_chm.desktop @@ -143,6 +143,7 @@ X-KDE-Keywords[ga]=chm X-KDE-Keywords[hu]=chm X-KDE-Keywords[it]=chm X-KDE-Keywords[kk]=chm +X-KDE-Keywords[km]=chm X-KDE-Keywords[ko]=chm X-KDE-Keywords[nb]=chm X-KDE-Keywords[nds]=CHM diff --git a/generators/comicbook/okularApplication_comicbook.desktop b/generators/comicbook/okularApplication_comicbook.desktop index c48684b0f..c2c811eda 100755 --- a/generators/comicbook/okularApplication_comicbook.desktop +++ b/generators/comicbook/okularApplication_comicbook.desktop @@ -143,6 +143,7 @@ X-KDE-Keywords[ga]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[hu]=cbr, cbz, cbt, Képregény X-KDE-Keywords[it]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[kk]=cbr, cbz, cbt, Comic Book +X-KDE-Keywords[km]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[ko]=cbr, cbz, cbt, Comic Book,만화책 X-KDE-Keywords[nb]=cbr, cbz, cbt, tegneserie X-KDE-Keywords[nds]=cbr, cbz, cbt, Comicbook diff --git a/generators/djvu/okularApplication_djvu.desktop b/generators/djvu/okularApplication_djvu.desktop index ed0e3b22e..cccc1a893 100755 --- a/generators/djvu/okularApplication_djvu.desktop +++ b/generators/djvu/okularApplication_djvu.desktop @@ -143,6 +143,7 @@ X-KDE-Keywords[ga]=djvu X-KDE-Keywords[hu]=djvu X-KDE-Keywords[it]=djvu X-KDE-Keywords[kk]=djvu +X-KDE-Keywords[km]=djvu X-KDE-Keywords[ko]=djvu X-KDE-Keywords[nb]=djvu X-KDE-Keywords[nds]=DjVu diff --git a/generators/dvi/okularApplication_dvi.desktop b/generators/dvi/okularApplication_dvi.desktop index 43d68a26f..aca5e1894 100755 --- a/generators/dvi/okularApplication_dvi.desktop +++ b/generators/dvi/okularApplication_dvi.desktop @@ -143,6 +143,7 @@ X-KDE-Keywords[ga]=dvi X-KDE-Keywords[hu]=dvi X-KDE-Keywords[it]=dvi X-KDE-Keywords[kk]=dvi +X-KDE-Keywords[km]=dvi X-KDE-Keywords[ko]=dvi X-KDE-Keywords[nb]=dvi X-KDE-Keywords[nds]=DVI diff --git a/generators/epub/okularApplication_epub.desktop b/generators/epub/okularApplication_epub.desktop index 91e2f7523..518698a4a 100755 --- a/generators/epub/okularApplication_epub.desktop +++ b/generators/epub/okularApplication_epub.desktop @@ -143,6 +143,7 @@ X-KDE-Keywords[ga]=epub, ríomhleabhar, r-leabhar X-KDE-Keywords[hu]=epub, e-book X-KDE-Keywords[it]=epub, e-book X-KDE-Keywords[kk]=epub, e-book +X-KDE-Keywords[km]=epub, e-book X-KDE-Keywords[ko]=epub, e-book,전자책,이북 X-KDE-Keywords[nb]=epub, e-bok X-KDE-Keywords[nds]=epub, e-book diff --git a/generators/fictionbook/okularApplication_fb.desktop b/generators/fictionbook/okularApplication_fb.desktop index b89b6ac02..2835b5245 100755 --- a/generators/fictionbook/okularApplication_fb.desktop +++ b/generators/fictionbook/okularApplication_fb.desktop @@ -142,6 +142,7 @@ X-KDE-Keywords[ga]=FictionBook, r-leabhar, ríomhleabhar, fb2 X-KDE-Keywords[hu]=FictionBook, e-book, fb2 X-KDE-Keywords[it]=FictionBook, e-book, fb2 X-KDE-Keywords[kk]=FictionBook, e-book, fb2 +X-KDE-Keywords[km]=FictionBook, e-book, fb2 X-KDE-Keywords[ko]=FictionBook, e-book, fb2 X-KDE-Keywords[nb]=FictionBook, e-bok, fb2 X-KDE-Keywords[nds]=FictionBook, e-book, fb2 diff --git a/generators/plucker/okularApplication_plucker.desktop b/generators/plucker/okularApplication_plucker.desktop index beb866fd2..03b2a8226 100755 --- a/generators/plucker/okularApplication_plucker.desktop +++ b/generators/plucker/okularApplication_plucker.desktop @@ -142,6 +142,7 @@ X-KDE-Keywords[ga]=plucker X-KDE-Keywords[hu]=plucker X-KDE-Keywords[it]=plucker X-KDE-Keywords[kk]=plucker +X-KDE-Keywords[km]=plucker X-KDE-Keywords[ko]=plucker X-KDE-Keywords[nb]=plucker X-KDE-Keywords[nds]=Plucker diff --git a/generators/poppler/okularApplication_pdf.desktop b/generators/poppler/okularApplication_pdf.desktop index 030e4312a..2d9026354 100755 --- a/generators/poppler/okularApplication_pdf.desktop +++ b/generators/poppler/okularApplication_pdf.desktop @@ -142,6 +142,7 @@ X-KDE-Keywords[ga]=PDF, Portable Document Format X-KDE-Keywords[hu]=PDF, Portable Document Format X-KDE-Keywords[it]=PDF, Portable Document Format, formato per documenti portabile X-KDE-Keywords[kk]=PDF, Portable Document Format +X-KDE-Keywords[km]=PDF, Portable Document Format X-KDE-Keywords[ko]=PDF, Portable Document Format X-KDE-Keywords[nb]=PDF, Portabelt Dokument Format X-KDE-Keywords[nds]=PDF, Porteerbor Dokmentformaat diff --git a/generators/xps/okularApplication_xps.desktop b/generators/xps/okularApplication_xps.desktop index 635aa6cfd..c63ba6e0e 100755 --- a/generators/xps/okularApplication_xps.desktop +++ b/generators/xps/okularApplication_xps.desktop @@ -142,6 +142,7 @@ X-KDE-Keywords[ga]=XPS X-KDE-Keywords[hu]=XPS X-KDE-Keywords[it]=XPS X-KDE-Keywords[kk]=XPS +X-KDE-Keywords[km]=XPS X-KDE-Keywords[ko]=XPS X-KDE-Keywords[nb]=XPS X-KDE-Keywords[nds]=XPS From c13e81cccde7d321fcc804803a8f3276d03d27c9 Mon Sep 17 00:00:00 2001 From: Script Kiddy Date: Wed, 13 Jun 2012 10:08:23 +0200 Subject: [PATCH 028/155] SVN_SILENT made messages (.desktop file) --- generators/epub/libokularGenerator_epub.desktop | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generators/epub/libokularGenerator_epub.desktop b/generators/epub/libokularGenerator_epub.desktop index 63ba0b140..daeeb8e84 100644 --- a/generators/epub/libokularGenerator_epub.desktop +++ b/generators/epub/libokularGenerator_epub.desktop @@ -9,7 +9,7 @@ Name[ca]=Document EPub Name[ca@valencia]=Document EPub Name[cs]=EPub dokument Name[da]=EPub-dokument -Name[de]=EPub-Dokument +Name[de]=EPUB-Dokument Name[el]=Έγγραφο EPub Name[en_GB]=EPub document Name[es]=Documento EPub @@ -65,7 +65,7 @@ Comment[ca]=Dorsal d'EPub per a l'Okular Comment[ca@valencia]=Dorsal d'EPub per a l'Okular Comment[cs]=Implementace Epub pro Okular Comment[da]=EPub-motor til Okular -Comment[de]=Anzeigemodul für EPub in Okular +Comment[de]=Anzeigemodul für EPUB in Okular Comment[el]=Σύστημα υποστήριξης EPub για το Okular Comment[en_GB]=EPub backend for Okular Comment[es]=Motor EPub para Okular From 23eb083b00b11f0819afe932ce68cfbcddecda7f Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Wed, 13 Jun 2012 15:33:49 +0200 Subject: [PATCH 029/155] Show a warning if annotations will not be saved to PDF. The only affected generator is poppler (because it's the only one with saving support). Since version 0.20, Poppler can save annotations to PDF. If the user is using an older version, this patch warns him that annotations are not saved. --- core/document.cpp | 17 +++++++++++++++++ core/document.h | 24 ++++++++++++++++++++++++ part.cpp | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+) diff --git a/core/document.cpp b/core/document.cpp index f250964b1..b2998b9d1 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -3479,6 +3479,23 @@ bool Document::canSaveChanges() const return saveIface->supportsOption( SaveInterface::SaveChanges ); } +bool Document::canSaveChanges( SaveCapability cap ) const +{ + switch ( cap ) + { + case Document::Forms: + /* Assume that if the generator supports saving, forms can be saved. + * We have no means to actually query the generator at the moment + * TODO: Add some method to query the generator in SaveInterface */ + return canSaveChanges(); + + case Document::Annotations: + return d->canAddAnnotationsNatively(); + } + + return false; +} + bool Document::saveChanges( const QString &fileName ) { QString errorText; diff --git a/core/document.h b/core/document.h index bda43072e..e9cd9c669 100644 --- a/core/document.h +++ b/core/document.h @@ -561,10 +561,34 @@ class OKULAR_EXPORT Document : public QObject */ const KComponentData* componentData() const; + /** + * Saving capabilities. Their availability varies according to the + * underlying generator and/or the document type. + * + * @see canSaveChanges (SaveCapability) + * @since 0.15 (KDE 4.9) + */ + enum SaveCapability + { + Forms = 1, ///< Can save form changes + Annotations = 2 ///< Can save annotation changes + }; + + /** + * Returns whether it's possible to save a given category of changes to + * another document. + * + * @since 0.15 (KDE 4.9) + */ + bool canSaveChanges( SaveCapability cap ) const; + /** * Returns whether the changes to the document (modified annotations, * values in form fields, etc) can be saved to another document. * + * Equivalent to the logical OR of canSaveChanges(SaveCapability) for + * each capability. + * * @since 0.7 (KDE 4.1) */ bool canSaveChanges() const; diff --git a/part.cpp b/part.cpp index aaeaf8b7d..8f762df3c 100644 --- a/part.cpp +++ b/part.cpp @@ -86,6 +86,7 @@ #include "conf/preferencesdialog.h" #include "settings.h" #include "core/action.h" +#include "core/annotations.h" #include "core/bookmarkmanager.h" #include "core/document.h" #include "core/generator.h" @@ -1946,6 +1947,38 @@ void Part::slotSaveFileAs() if ( m_embedMode == PrintPreviewMode ) return; + /* Show a warning before saving if the generator can't save annotations, + * unless we are going to save a .okular archive. */ + if ( !isDocumentArchive && !m_document->canSaveChanges( Document::Annotations ) ) + { + /* Search local annotations */ + bool containsLocalAnnotations = false; + const int pagecount = m_document->pages(); + + for ( int pageno = 0; pageno < pagecount; ++pageno ) + { + const Okular::Page *page = m_document->page( pageno ); + foreach ( const Okular::Annotation *ann, page->annotations() ) + { + if ( !(ann->flags() & Okular::Annotation::External) ) + { + containsLocalAnnotations = true; + break; + } + } + if ( containsLocalAnnotations ) + break; + } + + /* Don't show it if there are no local annotations */ + if ( containsLocalAnnotations ) + { + int res = KMessageBox::warningContinueCancel( widget(), "Your annotations will not be exported.\nYou can export the annotated document using File -> Export As -> Document Archive" ); + if ( res != KMessageBox::Continue ) + return; // Canceled + } + } + KUrl saveUrl = KFileDialog::getSaveUrl( KUrl("kfiledialog:///okular/" + url().fileName()), QString(), widget(), QString(), KFileDialog::ConfirmOverwrite ); From 7c3c28fdf6b2302d486f5824371290d68a274827 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Wed, 13 Jun 2012 23:06:12 +0200 Subject: [PATCH 030/155] Fixed unclear text Also turns a if-if sequence in a if-elseif to make more evident that we never show both messages. --- core/document.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index b2998b9d1..b9b3351ef 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -779,14 +779,14 @@ void DocumentPrivate::warnLimitedAnnotSupport() if ( m_annotationsNeedSaveAs ) { + // Shown if the user is editing annotations in a file whose metadata is + // not stored locally (.okular archives belong to this category) KMessageBox::information( m_parent->widget(), i18n("Your annotation changes will not be saved automatically. Use File -> Save As...\nor your changes will be lost once the document is closed"), QString(), "annotNeedSaveAs" ); } - - // Warn the user that he can only save as okular archive, but don't warn if - // this document is already an archive - if ( !canAddAnnotationsNatively() && !m_archiveData ) + else if ( !canAddAnnotationsNatively() ) { - KMessageBox::information( m_parent->widget(), i18n("You can save the annotated document using File -> Export As -> Document Archive"), QString(), "annotExportAsArchive" ); + // If the generator doesn't support native annotations + KMessageBox::information( m_parent->widget(), i18n("Your annotations are saved internally by Okular.\nYou can export the annotated document using File -> Export As -> Document Archive"), QString(), "annotExportAsArchive" ); } } From 0acab905f3bbebea715ec15b97f135cad7da6866 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Thu, 14 Jun 2012 00:12:16 +0200 Subject: [PATCH 031/155] Added Fabio D'Urso in the about box credits tab --- aboutdata.h | 1 + 1 file changed, 1 insertion(+) diff --git a/aboutdata.h b/aboutdata.h index d34bf240b..8d7d5d11f 100644 --- a/aboutdata.h +++ b/aboutdata.h @@ -39,6 +39,7 @@ inline KAboutData okularAboutData( const char* name, const char* iname ) about.addAuthor(ki18n("Enrico Ros"), ki18n("KPDF developer"), "eros.kde@email.it"); about.addCredit(ki18n("Eugene Trounev"), ki18n("Annotations artwork"), "eugene.trounev@gmail.com"); about.addCredit(ki18n("Jiri Baum - NICTA"), ki18n("Table selection tool"), "jiri@baum.com.au"); + about.addCredit(ki18n("Fabio D'Urso"), ki18n("Annotation improvements"), "fabiodurso@hotmail.it"); return about; } From 939891c9ddd7329e6ecd7ad5239d8a22663495cd Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Thu, 14 Jun 2012 00:27:22 +0200 Subject: [PATCH 032/155] Renamed Document::SaveCapability members I added ten minutes ago Forms -> SaveFormsCapability Annotations -> SaveAnnotationsCapability --- core/document.cpp | 4 ++-- core/document.h | 4 ++-- part.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index b9b3351ef..85ce60472 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -3483,13 +3483,13 @@ bool Document::canSaveChanges( SaveCapability cap ) const { switch ( cap ) { - case Document::Forms: + case SaveFormsCapability: /* Assume that if the generator supports saving, forms can be saved. * We have no means to actually query the generator at the moment * TODO: Add some method to query the generator in SaveInterface */ return canSaveChanges(); - case Document::Annotations: + case SaveAnnotationsCapability: return d->canAddAnnotationsNatively(); } diff --git a/core/document.h b/core/document.h index e9cd9c669..85cd82144 100644 --- a/core/document.h +++ b/core/document.h @@ -570,8 +570,8 @@ class OKULAR_EXPORT Document : public QObject */ enum SaveCapability { - Forms = 1, ///< Can save form changes - Annotations = 2 ///< Can save annotation changes + SaveFormsCapability = 1, ///< Can save form changes + SaveAnnotationsCapability = 2 ///< Can save annotation changes }; /** diff --git a/part.cpp b/part.cpp index 8f762df3c..83558c35e 100644 --- a/part.cpp +++ b/part.cpp @@ -1949,7 +1949,7 @@ void Part::slotSaveFileAs() /* Show a warning before saving if the generator can't save annotations, * unless we are going to save a .okular archive. */ - if ( !isDocumentArchive && !m_document->canSaveChanges( Document::Annotations ) ) + if ( !isDocumentArchive && !m_document->canSaveChanges( Document::SaveAnnotationsCapability ) ) { /* Search local annotations */ bool containsLocalAnnotations = false; From 4f9095879f7d400107a90a966c8f26c10ad4bc1e Mon Sep 17 00:00:00 2001 From: Yuri Chornoivan Date: Mon, 18 Jun 2012 21:49:11 +0300 Subject: [PATCH 033/155] Update Okular documentation to version 0.15. --- doc/configure.png | Bin 50811 -> 62384 bytes doc/index.docbook | 135 +++++++++++++++++++++++++++++----------------- 2 files changed, 86 insertions(+), 49 deletions(-) diff --git a/doc/configure.png b/doc/configure.png index b3a31071ada8bc6fdf3b94caa0bd1a8643fad5d6..ffde405a9e975a1b85f088ed8b5eaf99b3cea67b 100644 GIT binary patch literal 62384 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

hmEzgWNVuT+#DrsuJdlG(5n za-x}>BeE)2deh20S*FM1;_Fc-FaGvPgsWpRllsLs!CC~VJ%O*#&)$;DFb;$y2884I zcN#^jh97j^jnuLY@|W)#ZA=#R%ES^@MktX8CyN2K5%0AuQS1CCt+pPdBTQMjBl}9r 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 E59D-CEdT%j literal 50811 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 diff --git a/doc/index.docbook b/doc/index.docbook index 7399fe258..02cf463fc 100644 --- a/doc/index.docbook +++ b/doc/index.docbook @@ -36,8 +36,8 @@ Context menu actions like Rename Bookmarks etc) &FDLNotice; - 2010-10-05 - 0.11.80 (&kde; 4.6) + 2012-06-18 + 0.15 (&kde; 4.9) &okular; is a &kde; universal document viewer based on &kpdf; code. @@ -67,9 +67,9 @@ Context menu actions like Rename Bookmarks etc) improved presentation support and annotation support. - &okular; supports a lot of different formats like PDF, Postscript, Tiff, CHM, DjVU, Images (png, jpg, &etc;) + &okular; supports a lot of different formats like PDF, Postscript, Tiff, CHM, DjVU, Images (png, jpg, &etc;) XPS, Open Document (ODT), Fiction Books, Comic Book, Plucker, EPub and Fax. - For all supported formats and their features see + For all supported formats and their features see &okular; Document Format Handlers. @@ -106,8 +106,8 @@ Context menu actions like Rename Bookmarks etc) the FileOpen Recent menu. &okular; is the default &kde; application for PDF and Postscript files, launched when you click with the - &LMB; on such a file type in the filemanager. If you want to open any file whose format is supported by &okular; - use Open with...&okular; from context + &LMB; on such a file type in the filemanager. If you want to open any file whose format is supported by &okular; + use Open with...&okular; from context menu in the filemanager. @@ -123,7 +123,7 @@ Presentation mode: add Up (previous page) and Down (next page) keys Add a 'Find Previous' entry --> - There are multiple ways of scrolling the viewing area. One is to use the + There are multiple ways of scrolling the viewing area. One is to use the Up Arrow and Down Arrow keys. You may also use the scrollbar, your mousewheel or the Page Up and Page Down keys. @@ -135,8 +135,8 @@ Add a 'Find Previous' entry . If you want to read a document with several pages use the automatic scrolling feature of &okular;. - Start automatic scrolling with &Shift;Down Arrow or - &Shift;Up Arrow. Then use these keys to increase and + Start automatic scrolling with &Shift;Down Arrow or + &Shift;Up Arrow. Then use these keys to increase and decrease the scrolling speed. You can start or stop automatic scrolling temporarily by pressing the &Shift; key; pressing any other key deactivates this feature. @@ -163,15 +163,15 @@ Add a 'Find Previous' entry - If the document has bookmarks, enable the Bookmarks view + If the document has bookmarks, enable the Bookmarks view and click them to go to the associated page. - If bookmarks are not only shown for the current document, you can quickly + If bookmarks are not only shown for the current document, you can quickly switch to bookmarks in all recently opened files. - If the document has annotations, enable the Reviews view + If the document has annotations, enable the Reviews view and click the annotations or select them with the Up Arrow and Down Arrow keys and press Return to go to the associated page. @@ -190,9 +190,9 @@ Add a 'Find Previous' entry - You can go to the beginning of the document using + You can go to the beginning of the document using &Ctrl;Home or - using + using Go Beginning of the document @@ -201,9 +201,9 @@ Add a 'Find Previous' entry - You can go to the end of the document using + You can go to the end of the document using &Ctrl;End or - using + using Go End of the document @@ -214,7 +214,7 @@ Add a 'Find Previous' entry You can go forward in the document using Space or Page Down. To go to the next page of the document use the Next Page Toolbar - button or + button or Go Next Page @@ -225,7 +225,7 @@ Add a 'Find Previous' entry You can go back in the document using &Backspace; or Page Up. To go to the previous page of the document use Previous Page Toolbar - button or + button or Go Previous Page @@ -241,7 +241,7 @@ Add a 'Find Previous' entry enabled in ViewPresentation. It shows the document on a page per page basis. The pages are shown with - zoom to page, that means all the page is visible. + zoom to page, that means all the page is visible. @@ -277,12 +277,12 @@ Add a 'Find Previous' entry You can also draw on the current page with a pencil. Click on the Toggle Drawing Mode icon in the top bar to enable or disable the possibility - of draw in the presentation mode. The drawings are cleared automatically when leaving the presentation + of draw in the presentation mode. The drawings are cleared automatically when leaving the presentation mode, switching to another page, or manually selecting the Erase Drawings icon in the top bar. - The presentation mode has support for more than one screen in a multi-monitor configuration. - With more than one screen a new button will appear in the top bar, with the icon of a screen: + The presentation mode has support for more than one screen in a multi-monitor configuration. + With more than one screen a new button will appear in the top bar, with the icon of a screen: this is a drop down box that allows you to move the presentation to any of the other available screens. @@ -298,7 +298,7 @@ Add a 'Find Previous' entry Embedded Files If the current document has some files embedded in it, when you open it a yellow bar - will appear above the page view to notify you about the embedded files. + will appear above the page view to notify you about the embedded files. The embedded files bar @@ -322,7 +322,7 @@ Add a 'Find Previous' entry Forms If the current document has forms, when you open it a bar - will appear above the page view where you can enable the forms. + will appear above the page view where you can enable the forms. The forms bar @@ -361,7 +361,7 @@ Add a 'Find Previous' entry &okular; has two different kind of annotations: - Text annotations like Yellow Highlighter and Black Underlining + Text annotations like Yellow Highlighter and Black Underlining for files with text like ⪚ PDF. Graphic annotations like Note, Inline Note, Green Freehand Line, Straight Yellow Line, Blue Polygon, Stamp and Cyan Ellipse for all formats supported by &okular;. Using the context menu either in the Reviews view of the navigation panel or in the main window you can open a Pop up Note for any kind of annotation and add or edit comments. @@ -369,6 +369,20 @@ Add a 'Find Previous' entry Since &kde; 4.2, &okular; has the "document archiving" feature. This is an &okular;-specific format for carrying the document plus various metadata related to it (currently only annotations). You can save a "document archive" from the open document by choosing FileExport AsDocument Archive. To open an &okular; document archive, just open it with &okular; as it would be ⪚ a &PDF; document. + + Since &okular; 0.15 you can also save annotations directly into PDF files. This feature is only available if &okular; has been built with version 0.20 or later of Poppler rendering library. You can use File Save As... to save the copy of &PDF; file with annotations. + + + + It is not possible to save annotations into &PDF; file if original file was encrypted. + + + + + If you open a &PDF; with existing annotations, your annotation changes are not automatically saved in the internal local data folder, and you need to save the modified document (using FileSave As...) before closing it. Should you forget to do this &okular; will show confirmation window that allows you to save the document. + + + Due to DRM limitations (typically with &PDF; documents), adding, editing some properties @@ -406,7 +420,7 @@ Add a 'Find Previous' entry Using stamps a single click just places a square stamp (useful for icons). - To add a rectangular stamp you can click with the &LMB; and hold to place the top-left point, + To add a rectangular stamp you can click with the &LMB; and hold to place the top-left point, then drag to place the bottom-right one. @@ -446,7 +460,7 @@ Add a 'Find Previous' entry - To move an annotation, hold down the &Ctrl; key, move the mouse pointer on it and + To move an annotation, hold down the &Ctrl; key, move the mouse pointer on it and then start dragging with the &LMB;. @@ -458,7 +472,7 @@ Add a 'Find Previous' entry - + The Menubar @@ -493,7 +507,7 @@ Add a 'Find Previous' entry Open a file which was used previously from a submenu. If a file is currently being displayed it - will be closed. For more information, see the section about + will be closed. For more information, see the section about Opening Files. @@ -534,7 +548,7 @@ Add a 'Find Previous' entry - Save the currently open file under a different name using the document backend. With the &PDF; backend (Poppler >= 0.8 required) it is possible to save the document with the changed values of the form fields. + Save the currently open file under a different name using the document backend. With the &PDF; backend (Poppler >= 0.8 required) it is possible to save the document with the changed values of the form fields. It can be possible (provided that the data were not encrypted or secured using DRM) to save annotations with &PDF; files (Poppler >= 0.20 required). @@ -546,7 +560,7 @@ Add a 'Find Previous' entry - Save a copy of the currently open file under a different name + Save a copy of the currently open file under a different name without using the current document backend. @@ -578,7 +592,7 @@ Add a 'Find Previous' entry - + @@ -662,7 +676,7 @@ Add a 'Find Previous' entry - Copy the currently selected text in + Copy the currently selected text in Text Selection mode to the clipboard. @@ -678,7 +692,7 @@ Add a 'Find Previous' entry - Selects all the text (if the document provides it). This works only in + Selects all the text (if the document provides it). This works only in Text Selection mode. @@ -728,7 +742,7 @@ Add a 'Find Previous' entry - + The View Menu @@ -821,7 +835,7 @@ Add a 'Find Previous' entry This submenu makes you choose the view mode for the pages. The possible options are: Single Page (only one page per row), - Facing Pages (two pages per row, in a book style), + Facing Pages (two pages per row, in a book style), Facing Pages (Center First Page) and Overview (the number of columns is the one specified in the &okular; settings). @@ -1044,7 +1058,7 @@ Add a 'Find Previous' entry - This is an always disabled action that appears in this menu only if the current document has + This is an always disabled action that appears in this menu only if the current document has no bookmarks. Otherwise a list of all bookmarked pages is displayed here. Clicking on these bookmarks allows you to go directly to the associated pages. @@ -1159,9 +1173,9 @@ Add a 'Find Previous' entry Toggle the Menubar display on and off. Once - hidden it can be made visible using the shortcut + hidden it can be made visible using the shortcut &Ctrl;M again. - If the menubar is hidden, the context menu opened with a right mouse button + If the menubar is hidden, the context menu opened with a right mouse button click anywhere in the view area has an extra entry Show Menubar. @@ -1252,14 +1266,14 @@ Add a 'Find Previous' entry window. - + The Help Menu &help.menu.documentation; - + Configuring &okular; @@ -1332,6 +1346,14 @@ Add a 'Find Previous' entry load, &etc;. + + Display document title in title bar + + Whether to show the current document title in the title bar of &okular; window. If no metadata for title + found in the document or this item is unchecked &okular; shows filename of the document. + + + Obey DRM limitations @@ -1368,7 +1390,15 @@ Add a 'Find Previous' entry Overview columns - This options represent the number of columns to use in the overview mode. + This option represents the number of columns to use in the overview mode. + + + + + Page Up/Down overlap + + + Here you can define the percentage of the current viewing area that should be visible after pressing Page Up/Page Down keys. @@ -1414,7 +1444,7 @@ Add a 'Find Previous' entry Change Dark & Light Colors - Changes the dark and light color to your preference, that means + Changes the dark and light color to your preference, that means black will not be rendered as black but as the selected dark color and white will not be rendered as white but as the selected light color. @@ -1454,7 +1484,8 @@ Add a 'Find Previous' entry &okular; can achieve best performance by tuning the memory usage, based on your system and your tastes. The more memory you let it to use, the faster the program will behave. The Default profile is good for every system, but you can prevent &okular; from using more memory than necessary by selecting the Low - profile, or let it get the most out of your system using Aggressive. + profile, or let it get the most out of your system using Aggressive. Use Greedy profile to preload all + pages without risk of system memory overfull (only 50% of total memory or free memory will be used). @@ -1505,6 +1536,12 @@ Add a 'Find Previous' entry Whether to show a summary page at the beginning of the presentation with the title, author and number of pages of the document. + + Enable transitions + + Use this checkbox to enable or disable transition effects between pages. + + Default transition @@ -1515,7 +1552,7 @@ Add a 'Find Previous' entry Placement - In this section you can select the Screen used to display the presentation. + In this section you can select the Screen used to display the presentation. Current Screen is same screen of the &okular; window that starts the presentation mode. Default Screen is the screen marked as default in the xinerama configuration. Screen 0, Screen 1 &etc; are the available screens. @@ -1541,8 +1578,8 @@ Add a 'Find Previous' entry Editor - Choose the editor you want to launch when &okular; wants to open a source file. - This is the case when the document has references to the various points (usually row and column number) of sources it was generated from. The &DVI; format supports natively the addition of the information about the sources the LaTeX document was generated from. A similar system exists for &PDF; documents, called pdfsync, which stores these extra information in an external file named after the &PDF; file itself (for example mydocument.pdfsync for mydocument.pdf). + Choose the editor you want to launch when &okular; wants to open a source file. + This is the case when the document has references to the various points (usually row and column number) of sources it was generated from. The &DVI; format supports natively the addition of the information about the sources the LaTeX document was generated from. A similar system exists for &PDF; documents, called pdfsync, which stores these extra information in an external file named after the &PDF; file itself (for example mydocument.pdfsync for mydocument.pdf). @@ -1557,7 +1594,7 @@ Add a 'Find Previous' entry Credits and License - + Program Copyright: Albert Astals Cidaacid@kde.org @@ -1593,7 +1630,7 @@ Add a 'Find Previous' entry &install.compile.documentation; - &documentation.index; + &documentation.index; From afd1cd5d6647e6a8c066fa4889b74cc87f4f6b64 Mon Sep 17 00:00:00 2001 From: Yuri Chornoivan Date: Tue, 19 Jun 2012 09:28:31 +0300 Subject: [PATCH 034/155] Add missing menu item to the documentation. --- doc/index.docbook | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/doc/index.docbook b/doc/index.docbook index 02cf463fc..efbe9847b 100644 --- a/doc/index.docbook +++ b/doc/index.docbook @@ -1202,6 +1202,17 @@ Add a 'Find Previous' entry Toggle the navigation panel on and off. + + + + Settings + Show Page Bar + + + + Toggle the page bar at the bottom of document area on and off to save vertical place in &okular; window. + + From fb644714359c9a05ea6cdc44bf5e302e59c98b27 Mon Sep 17 00:00:00 2001 From: Yuri Chornoivan Date: Tue, 19 Jun 2012 18:02:49 +0300 Subject: [PATCH 035/155] Add a section about bookmarks to documentation. --- doc/bookmark-management.png | Bin 0 -> 46855 bytes doc/index.docbook | 42 ++++++++++++++++++++++++++++++++++++ doc/rating.png | Bin 0 -> 744 bytes 3 files changed, 42 insertions(+) create mode 100644 doc/bookmark-management.png create mode 100644 doc/rating.png diff --git a/doc/bookmark-management.png b/doc/bookmark-management.png new file mode 100644 index 0000000000000000000000000000000000000000..e958b9de99d3d8c3c897cbddbeefd52e91f064ff GIT binary patch literal 46855 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 + + Bookmark Management + + &okular; has a very flexible bookmark system. &okular; saves the position on the page in bookmark and allows you to define more than one bookmark per page. + + + To manage bookmarks in &okular; you can use Bookmarks view from Navigation Panel, Bookmarks menu or context menu of document view (click with &RMB; to open it). + + + Bookmarks view + + To open Bookmarks view click on Bookmarks item on the Navigation Panel. If the Navigation Panel is not shown, use F7 SettingsShow Navigation Panel + main menu item to make it visible. + + + Bookmark view context menu + + + + + + Bookmark view context menu + + + + + The filter bar at the top of Bookmarks view can be used to filter the content of bookmark list pane according to the text in the box. + + + The list pane permits to view the bookmark list in a tree-like fashion: each document in the list can be expanded or collapsed by clicking on the < or v icon next to it. + + + Click on icon below the list to show only the bookmarks from the current document. + + + Right-click menu of document item can be used to open document, rename its item or remove it from the list. Remember that the removal of a document item leads to the removal of all bookmarks in the corresponding document. + + + Right-click menus of individual bookmark items allow you to go to the bookmark, rename or remove it. + + + diff --git a/doc/rating.png b/doc/rating.png new file mode 100644 index 0000000000000000000000000000000000000000..3630d8ff194e8fc8953bcb0d9dc75b85a33113bb GIT binary patch literal 744 zcmVP)@X1W@%1z^^1>U9w;i?(osTkg-1=E}c*qR8~nhDdK2F{cO(U1hxmJ!&W zA=;uP)t3^{j|9-hKDqeelR&^UG)V)Oq*Q zcK6nH_}O;&+IINccK6tJ_ttsz%WLnvRQAbk_Rntj({A_IZur@5_}Xsx*lzdLZuik{ z@yKQIzf0Bm`PWGI z%P{u05b&}R_qr1J#0vS%0Q%AZ`OpCP$N=@d0P(K^_qzc3%mDh@0Q=$q``-Zi(*X9! z0QIZ@_q_o5(E#+^0P^4f{Okbu#{l%F0N9oQ)uRCS#sD%W^8^3@06TP2PE!EJ%8~v3 zmKgc^8xQ8@6h+VG`1tA8RVVlOE&}K21Qhr77eV^^MBd}*?CtOF^6c&O@3QW(92uAdeb zkT~SLw|4&22W9=kb3g0%4(8D&O5#s(T`2 zyI*^Fe5yB^&tgE3yu7yBZ=G)M01eXjkI%3EpglZ9gKYGDBv&ZM6BQcNnqw`1?&MSt abC?3Rt0d}&F$kmp0000 Date: Tue, 19 Jun 2012 18:13:30 +0300 Subject: [PATCH 036/155] Fix Section 4.5 according to Fabio D'Urso proposals. --- doc/index.docbook | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/doc/index.docbook b/doc/index.docbook index 061ea0933..ddaaa909f 100644 --- a/doc/index.docbook +++ b/doc/index.docbook @@ -1064,7 +1064,20 @@ Add a 'Find Previous' entry - Add or remove a bookmark for the current page. + Add or remove a bookmark for the current position. + + + + + + + Bookmarks + Rename Bookmark + + + + + Rename a bookmark for the current position. @@ -1077,7 +1090,7 @@ Add a 'Find Previous' entry Go to the previous bookmarked page, or do nothing if there - are no bookmarked pages prior to the current one. + are no bookmark prior to the current one. @@ -1089,7 +1102,7 @@ Add a 'Find Previous' entry Go to the next bookmarked page, or do nothing if there - are no bookmarked pages after the current one. + are no bookmark after the current one. From dcf302f58eca9b312e8fb6f95837d5c5528a20b7 Mon Sep 17 00:00:00 2001 From: Yuri Chornoivan Date: Tue, 19 Jun 2012 18:15:20 +0300 Subject: [PATCH 037/155] Fix spacing in Credits. --- doc/index.docbook | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/index.docbook b/doc/index.docbook index ddaaa909f..08497d964 100644 --- a/doc/index.docbook +++ b/doc/index.docbook @@ -1663,15 +1663,15 @@ Add a 'Find Previous' entry Program Copyright: - Albert Astals Cidaacid@kde.org + Albert Astals Cid aacid@kde.org Pino Toscano pino@kde.org Current maintainer - Enrico Roseros.kde@email.it &kpdf; developer + Enrico Ros eros.kde@email.it &kpdf; developer Documentation Copyright: - Albert Astals Cidaacid@kde.org Author - Titus Laskatitus.laska@gmx.de Some updates and additions + Albert Astals Cid aacid@kde.org Author + Titus Laska titus.laska@gmx.de Some updates and additions Pino Toscano pino@kde.org From ae207b060a8e410e7849d31c72fb5c48210783c6 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Tue, 19 Jun 2012 19:35:25 +0200 Subject: [PATCH 038/155] I'm the current maintainer --- doc/index.docbook | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/index.docbook b/doc/index.docbook index 08497d964..883fccecd 100644 --- a/doc/index.docbook +++ b/doc/index.docbook @@ -1663,8 +1663,8 @@ Add a 'Find Previous' entry Program Copyright: - Albert Astals Cid aacid@kde.org - Pino Toscano pino@kde.org Current maintainer + Albert Astals Cid aacid@kde.org Current maintainer + Pino Toscano pino@kde.org Enrico Ros eros.kde@email.it &kpdf; developer From c254653d105034544fce5c6d9c81a9741376f6bc Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Tue, 19 Jun 2012 20:09:34 +0200 Subject: [PATCH 039/155] Fix Section 4.5 ("The Bookmarks Menu") Removed further occurrences of "bookmarked page". --- doc/index.docbook | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/index.docbook b/doc/index.docbook index 883fccecd..5c14f26a5 100644 --- a/doc/index.docbook +++ b/doc/index.docbook @@ -1089,8 +1089,8 @@ Add a 'Find Previous' entry - Go to the previous bookmarked page, or do nothing if there - are no bookmark prior to the current one. + Go to the previous bookmark, or do nothing if there + are no bookmarks prior to the current one. @@ -1101,8 +1101,8 @@ Add a 'Find Previous' entry - Go to the next bookmarked page, or do nothing if there - are no bookmark after the current one. + Go to the next bookmark, or do nothing if there + are no bookmarks after the current one. @@ -1114,8 +1114,8 @@ Add a 'Find Previous' entry This is an always disabled action that appears in this menu only if the current document has - no bookmarks. Otherwise a list of all bookmarked pages is displayed here. Clicking on these bookmarks - allows you to go directly to the associated pages. + no bookmarks. Otherwise a list of all bookmarks is displayed here. Clicking on these bookmarks + allows you to go directly to the associated position. From e7a4e3b392fa07c98f680a5e1bb3f282967b91c3 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Tue, 19 Jun 2012 23:38:44 +0200 Subject: [PATCH 040/155] Remove misleading comment --- core/document.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index 85ce60472..6eae931d1 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -249,8 +249,6 @@ qulonglong DocumentPrivate::getTotalMemory() if ( !memFile.open( QIODevice::ReadOnly ) ) return (cachedValue = 134217728); - // read /proc/meminfo and sum up the contents of 'MemFree', 'Buffers' - // and 'Cached' fields. consider swapped memory as used memory. QTextStream readStream( &memFile ); while ( true ) { From 791a4ac39e3605b0673855c83dfb4d60bac2d97f Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Tue, 19 Jun 2012 23:38:54 +0200 Subject: [PATCH 041/155] Fix spacing --- core/document.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/document.cpp b/core/document.cpp index 6eae931d1..0317bfa6e 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -250,7 +250,7 @@ qulonglong DocumentPrivate::getTotalMemory() return (cachedValue = 134217728); QTextStream readStream( &memFile ); - while ( true ) + while ( true ) { QString entry = readStream.readLine(); if ( entry.isNull() ) break; From 444e6b7b19bee5285f39a44007cf00f6e0b235d2 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 20 Jun 2012 00:33:43 +0200 Subject: [PATCH 042/155] Fix underflow in getFreeMemory() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It actually serves three purposes: a) Make sure all the values are there (this should be always true, but doesn't hurt making sure) because if SwapFree was there but SwapTotal was not, it'd be a mess b) add up things in order so we don't underflow, currently the code did process stuff as it came in the file, and it happens that SwapTotal appears before SwapFree in /proc/meminfo so it actually did "MemFree:" + "Buffers:" + "Cached:" - "SwapTotal:" + "SwapFree:", which can underflow if "MemFree:" + "Buffers:" + "Cached:" < "SwapTotal:" c) Do not underflow at all, so if "MemFree:" + "Buffers:" + "Cached:" + "SwapFree:" < "SwapTotal:" we return 0 correctly not a zillion of free memory Aurélien you might want to update gwenviews copy of this code (there's a few other bugfixes we did a while ago you didn't update either) CCMAIL: agateau@kde.org BUGS: 291129 --- core/document.cpp | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index 0317bfa6e..e77890b8a 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -292,19 +292,34 @@ qulonglong DocumentPrivate::getFreeMemory() qulonglong memoryFree = 0; QString entry; QTextStream readStream( &memFile ); + static const int nElems = 5; + QString names[nElems] = { "MemFree:", "Buffers:", "Cached:", "SwapFree:", "SwapTotal:" }; + qulonglong values[nElems] = { 0, 0, 0, 0, 0 }; + bool foundValues[nElems] = { false, false, false, false, false }; while ( true ) { entry = readStream.readLine(); if ( entry.isNull() ) break; - if ( entry.startsWith( "MemFree:" ) || - entry.startsWith( "Buffers:" ) || - entry.startsWith( "Cached:" ) || - entry.startsWith( "SwapFree:" ) ) - memoryFree += entry.section( ' ', -2, -2 ).toULongLong(); - if ( entry.startsWith( "SwapTotal:" ) ) - memoryFree -= entry.section( ' ', -2, -2 ).toULongLong(); + for ( int i = 0; i < nElems; ++i ) + { + if ( entry.startsWith( names[i] ) ) + { + values[i] = entry.section( ' ', -2, -2 ).toULongLong( &foundValues[i] ); + } + } } memFile.close(); + bool found = true; + for ( int i = 0; found && i < nElems; ++i ) + found = found && foundValues[i]; + if ( found ) + { + memoryFree = values[0] + values[1] + values[2] + values[3]; + if ( values[4] > memoryFree ) + memoryFree = 0; + else + memoryFree -= values[4]; + } lastUpdate = QTime::currentTime(); From 73c95bfe1e7130bb3444f334c8fcb87632e43ee8 Mon Sep 17 00:00:00 2001 From: Script Kiddy Date: Thu, 21 Jun 2012 10:36:30 +0200 Subject: [PATCH 043/155] SVN_SILENT made messages (.desktop file) --- generators/fictionbook/okularApplication_fb.desktop | 1 + generators/plucker/okularApplication_plucker.desktop | 1 + 2 files changed, 2 insertions(+) diff --git a/generators/fictionbook/okularApplication_fb.desktop b/generators/fictionbook/okularApplication_fb.desktop index 2835b5245..701d4de04 100755 --- a/generators/fictionbook/okularApplication_fb.desktop +++ b/generators/fictionbook/okularApplication_fb.desktop @@ -131,6 +131,7 @@ X-KDE-Keywords[ar]=FictionBook, e-book, fb2 X-KDE-Keywords[bg]=FictionBook, e-book, fb2 X-KDE-Keywords[ca]=FictionBook, e-book, fb2 X-KDE-Keywords[ca@valencia]=FictionBook, e-book, fb2 +X-KDE-Keywords[cs]=FictionBook, e-book, fb2 X-KDE-Keywords[da]=FictionBook,e-book,fb2 X-KDE-Keywords[de]=FictionBook, e-book, fb2 X-KDE-Keywords[el]=FictionBook, e-book, fb2 diff --git a/generators/plucker/okularApplication_plucker.desktop b/generators/plucker/okularApplication_plucker.desktop index 03b2a8226..0c50f1999 100755 --- a/generators/plucker/okularApplication_plucker.desktop +++ b/generators/plucker/okularApplication_plucker.desktop @@ -131,6 +131,7 @@ X-KDE-Keywords[ar]=plucker X-KDE-Keywords[bg]=plucker X-KDE-Keywords[ca]=plucker X-KDE-Keywords[ca@valencia]=plucker +X-KDE-Keywords[cs]=plucker X-KDE-Keywords[da]=plucker X-KDE-Keywords[de]=plucker X-KDE-Keywords[el]=plucker From dc6823c135dfcf3edcda8c28489a668846619adc Mon Sep 17 00:00:00 2001 From: Script Kiddy Date: Sun, 24 Jun 2012 10:17:10 +0200 Subject: [PATCH 044/155] SVN_SILENT made messages (.desktop file) --- generators/chm/okularApplication_chm.desktop | 1 + generators/comicbook/okularApplication_comicbook.desktop | 1 + generators/djvu/okularApplication_djvu.desktop | 1 + generators/dvi/okularApplication_dvi.desktop | 1 + generators/epub/okularApplication_epub.desktop | 1 + generators/fictionbook/okularApplication_fb.desktop | 1 + generators/plucker/okularApplication_plucker.desktop | 1 + generators/poppler/okularApplication_pdf.desktop | 1 + generators/xps/okularApplication_xps.desktop | 1 + 9 files changed, 9 insertions(+) diff --git a/generators/chm/okularApplication_chm.desktop b/generators/chm/okularApplication_chm.desktop index 947b02d40..7e81d2875 100755 --- a/generators/chm/okularApplication_chm.desktop +++ b/generators/chm/okularApplication_chm.desktop @@ -160,6 +160,7 @@ X-KDE-Keywords[sr@ijekavian]=chm,ЦХМ X-KDE-Keywords[sr@ijekavianlatin]=chm,CHM X-KDE-Keywords[sr@latin]=chm,CHM X-KDE-Keywords[sv]=chm +X-KDE-Keywords[tr]=chm X-KDE-Keywords[uk]=chm X-KDE-Keywords[x-test]=xxchmxx X-KDE-Keywords[zh_CN]=chm diff --git a/generators/comicbook/okularApplication_comicbook.desktop b/generators/comicbook/okularApplication_comicbook.desktop index c2c811eda..23c96b15f 100755 --- a/generators/comicbook/okularApplication_comicbook.desktop +++ b/generators/comicbook/okularApplication_comicbook.desktop @@ -160,6 +160,7 @@ X-KDE-Keywords[sr@ijekavian]=cbr, cbz, cbt, Comic Book,комикбук X-KDE-Keywords[sr@ijekavianlatin]=cbr, cbz, cbt, Comic Book,ComicBook X-KDE-Keywords[sr@latin]=cbr, cbz, cbt, Comic Book,ComicBook X-KDE-Keywords[sv]=cbr, cbz, cbt, Comic Book +X-KDE-Keywords[tr]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[uk]=cbr,cbz,cbt,Comic Book,комікс X-KDE-Keywords[x-test]=xxcbr, cbz, cbt, Comic Bookxx X-KDE-Keywords[zh_CN]=cbr, cbz, cbt, Comic Book,漫画书,漫画,连环画 diff --git a/generators/djvu/okularApplication_djvu.desktop b/generators/djvu/okularApplication_djvu.desktop index cccc1a893..e6fd483b9 100755 --- a/generators/djvu/okularApplication_djvu.desktop +++ b/generators/djvu/okularApplication_djvu.desktop @@ -160,6 +160,7 @@ X-KDE-Keywords[sr@ijekavian]=djvu,ДјВу X-KDE-Keywords[sr@ijekavianlatin]=djvu,DjVu X-KDE-Keywords[sr@latin]=djvu,DjVu X-KDE-Keywords[sv]=djvu +X-KDE-Keywords[tr]=djvu X-KDE-Keywords[ug]=djvu X-KDE-Keywords[uk]=djvu X-KDE-Keywords[x-test]=xxdjvuxx diff --git a/generators/dvi/okularApplication_dvi.desktop b/generators/dvi/okularApplication_dvi.desktop index aca5e1894..6c5990f23 100755 --- a/generators/dvi/okularApplication_dvi.desktop +++ b/generators/dvi/okularApplication_dvi.desktop @@ -160,6 +160,7 @@ X-KDE-Keywords[sr@ijekavian]=dvi,ДВИ X-KDE-Keywords[sr@ijekavianlatin]=dvi,DVI X-KDE-Keywords[sr@latin]=dvi,DVI X-KDE-Keywords[sv]=dvi +X-KDE-Keywords[tr]=dvi X-KDE-Keywords[ug]=dvi X-KDE-Keywords[uk]=dvi X-KDE-Keywords[x-test]=xxdvixx diff --git a/generators/epub/okularApplication_epub.desktop b/generators/epub/okularApplication_epub.desktop index 518698a4a..400073359 100755 --- a/generators/epub/okularApplication_epub.desktop +++ b/generators/epub/okularApplication_epub.desktop @@ -160,6 +160,7 @@ X-KDE-Keywords[sr@ijekavian]=epub, e-book,ЕПУБ,е‑књига X-KDE-Keywords[sr@ijekavianlatin]=epub, e-book,EPUB,e‑knjiga X-KDE-Keywords[sr@latin]=epub, e-book,EPUB,e‑knjiga X-KDE-Keywords[sv]=epub, e-bok +X-KDE-Keywords[tr]=epub, e-book X-KDE-Keywords[uk]=epub,e-book,електронна,книга X-KDE-Keywords[x-test]=xxepub, e-bookxx X-KDE-Keywords[zh_CN]=epub, e-book,电子书 diff --git a/generators/fictionbook/okularApplication_fb.desktop b/generators/fictionbook/okularApplication_fb.desktop index 701d4de04..0e9e63a00 100755 --- a/generators/fictionbook/okularApplication_fb.desktop +++ b/generators/fictionbook/okularApplication_fb.desktop @@ -160,6 +160,7 @@ X-KDE-Keywords[sr@ijekavian]=FictionBook, e-book, fb2,фикшнбук,е‑књ X-KDE-Keywords[sr@ijekavianlatin]=FictionBook, e-book, fb2,FictionBook,e‑knjiga X-KDE-Keywords[sr@latin]=FictionBook, e-book, fb2,FictionBook,e‑knjiga X-KDE-Keywords[sv]=FictionBook, e-bok, fb2 +X-KDE-Keywords[tr]=FictionBook, e-book, fb2 X-KDE-Keywords[uk]=FictionBook,fb2,електронна,книга X-KDE-Keywords[x-test]=xxFictionBook, e-book, fb2xx X-KDE-Keywords[zh_CN]=FictionBook, e-book, fb2,电子书,虚拟书籍 diff --git a/generators/plucker/okularApplication_plucker.desktop b/generators/plucker/okularApplication_plucker.desktop index 0c50f1999..952e0259a 100755 --- a/generators/plucker/okularApplication_plucker.desktop +++ b/generators/plucker/okularApplication_plucker.desktop @@ -160,6 +160,7 @@ X-KDE-Keywords[sr@ijekavian]=plucker,Плакер X-KDE-Keywords[sr@ijekavianlatin]=plucker,Plucker X-KDE-Keywords[sr@latin]=plucker,Plucker X-KDE-Keywords[sv]=plucker +X-KDE-Keywords[tr]=plucker X-KDE-Keywords[uk]=plucker X-KDE-Keywords[x-test]=xxpluckerxx X-KDE-Keywords[zh_CN]=plucker diff --git a/generators/poppler/okularApplication_pdf.desktop b/generators/poppler/okularApplication_pdf.desktop index 2d9026354..7b6029dcc 100755 --- a/generators/poppler/okularApplication_pdf.desktop +++ b/generators/poppler/okularApplication_pdf.desktop @@ -159,6 +159,7 @@ X-KDE-Keywords[sr@ijekavian]=PDF, Portable Document Format,ПДФ X-KDE-Keywords[sr@ijekavianlatin]=PDF, Portable Document Format,PDF X-KDE-Keywords[sr@latin]=PDF, Portable Document Format,PDF X-KDE-Keywords[sv]=PDF, Portabelt dokumentformat +X-KDE-Keywords[tr]=PDF, Taşınabilir Belge Biçimi X-KDE-Keywords[uk]=PDF,Portable Document Format,пдф X-KDE-Keywords[x-test]=xxPDF, Portable Document Formatxx X-KDE-Keywords[zh_CN]=PDF, Portable Document Format,开放文档格式 diff --git a/generators/xps/okularApplication_xps.desktop b/generators/xps/okularApplication_xps.desktop index c63ba6e0e..819a27de1 100755 --- a/generators/xps/okularApplication_xps.desktop +++ b/generators/xps/okularApplication_xps.desktop @@ -159,6 +159,7 @@ X-KDE-Keywords[sr@ijekavian]=XPS,ИксПС X-KDE-Keywords[sr@ijekavianlatin]=XPS,XPS X-KDE-Keywords[sr@latin]=XPS,XPS X-KDE-Keywords[sv]=XPS +X-KDE-Keywords[tr]=XPS X-KDE-Keywords[uk]=XPS X-KDE-Keywords[x-test]=xxXPSxx X-KDE-Keywords[zh_CN]=mXPS From fb5a1783111070c6bd62a00f50f0efc9c919d241 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Sun, 24 Jun 2012 19:03:38 +0200 Subject: [PATCH 045/155] Fix underflwo in memoryToFree found by Fabio --- core/document.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/document.cpp b/core/document.cpp index e77890b8a..f6e815d1a 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -223,8 +223,14 @@ void DocumentPrivate::cleanupPixmapMemory( qulonglong /*sure? bytesOffset*/ ) { // update internal variables pIt = m_allocatedPixmapsFifo.erase( pIt ); + // m_allocatedPixmapsTotalMemory can't underflow because we always add or remove + // the memory used by the AllocatedPixmap so at most it can reach zero m_allocatedPixmapsTotalMemory -= p->memory; - memoryToFree -= p->memory; + // Make sure memoryToFree does not underflow + if ( p->memory > memoryToFree ) + memoryToFree = 0; + else + memoryToFree -= p->memory; pagesFreed++; // delete pixmap m_pagesVector.at( p->page )->deletePixmap( p->id ); From 0e01e11717010a142b947204ab7ba914139e2f22 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Sun, 24 Jun 2012 20:08:18 +0200 Subject: [PATCH 046/155] Do not update the last update time on failure Because the code *should* work so it failing is exceptional and we don't want to cache the value --- core/document.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/document.cpp b/core/document.cpp index f6e815d1a..d910ce3b2 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -326,6 +326,10 @@ qulonglong DocumentPrivate::getFreeMemory() else memoryFree -= values[4]; } + else + { + return 0; + } lastUpdate = QTime::currentTime(); From 3c2d2e1b7afb3174997071fdfa77f4ed2f23add0 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Sun, 24 Jun 2012 20:35:37 +0200 Subject: [PATCH 047/155] Better memory limit tuning in greedy mode to avoid triggering the OOM if swap is full Using Albert's new formula --- core/document.cpp | 24 ++++++++++++++++++++---- core/document_p.h | 2 +- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index d910ce3b2..b8a5de29f 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -178,6 +178,8 @@ void DocumentPrivate::cleanupPixmapMemory( qulonglong /*sure? bytesOffset*/ ) // [MEM] choose memory parameters based on configuration profile qulonglong clipValue = 0; qulonglong memoryToFree = 0; + qulonglong freeSwap; + switch ( Settings::memoryLevel() ) { case Settings::EnumMemoryLevel::Low: @@ -187,7 +189,7 @@ void DocumentPrivate::cleanupPixmapMemory( qulonglong /*sure? bytesOffset*/ ) case Settings::EnumMemoryLevel::Normal: { qulonglong thirdTotalMemory = getTotalMemory() / 3; - qulonglong freeMemory = getFreeMemory(); + qulonglong freeMemory = getFreeMemory( &freeSwap ); if (m_allocatedPixmapsTotalMemory > thirdTotalMemory) memoryToFree = m_allocatedPixmapsTotalMemory - thirdTotalMemory; if (m_allocatedPixmapsTotalMemory > freeMemory) clipValue = (m_allocatedPixmapsTotalMemory - freeMemory) / 2; } @@ -195,13 +197,14 @@ void DocumentPrivate::cleanupPixmapMemory( qulonglong /*sure? bytesOffset*/ ) case Settings::EnumMemoryLevel::Aggressive: { - qulonglong freeMemory = getFreeMemory(); + qulonglong freeMemory = getFreeMemory( &freeSwap ); if (m_allocatedPixmapsTotalMemory > freeMemory) clipValue = (m_allocatedPixmapsTotalMemory - freeMemory) / 2; } break; case Settings::EnumMemoryLevel::Greedy: { - const qulonglong memoryLimit = qMax(getFreeMemory(), getTotalMemory() / 2); + qulonglong freeMemory = getFreeMemory( &freeSwap ); + const qulonglong memoryLimit = qMin( qMax( freeMemory, getTotalMemory()/2 ), freeMemory+freeSwap ); if (m_allocatedPixmapsTotalMemory > memoryLimit) clipValue = (m_allocatedPixmapsTotalMemory - memoryLimit) / 2; } break; @@ -279,13 +282,21 @@ qulonglong DocumentPrivate::getTotalMemory() return (cachedValue = 134217728); } -qulonglong DocumentPrivate::getFreeMemory() +qulonglong DocumentPrivate::getFreeMemory( qulonglong *freeSwap ) { static QTime lastUpdate = QTime::currentTime().addSecs(-3); static qulonglong cachedValue = 0; + static qulonglong cachedFreeSwap = 0; if ( qAbs( lastUpdate.secsTo( QTime::currentTime() ) ) <= 2 ) + { + *freeSwap = cachedFreeSwap; return cachedValue; + } + + /* Initialize the returned free swap value to 0. It is overwritten if the + * actual value is available */ + *freeSwap = 0; #if defined(Q_OS_LINUX) // if /proc/meminfo doesn't exist, return MEMORY FULL @@ -320,6 +331,9 @@ qulonglong DocumentPrivate::getFreeMemory() found = found && foundValues[i]; if ( found ) { + /* MemFree + Buffers + Cached - SwapUsed = + * = MemFree + Buffers + Cached - (SwapTotal - SwapFree) = + * = MemFree + Buffers + Cached + SwapFree - SwapTotal */ memoryFree = values[0] + values[1] + values[2] + values[3]; if ( values[4] > memoryFree ) memoryFree = 0; @@ -333,6 +347,7 @@ qulonglong DocumentPrivate::getFreeMemory() lastUpdate = QTime::currentTime(); + *freeSwap = ( cachedFreeSwap = (Q_UINT64_C(1024) * values[3]) ); return ( cachedValue = (Q_UINT64_C(1024) * memoryFree) ); #elif defined(Q_OS_FREEBSD) qulonglong cache, inact, free, psize; @@ -361,6 +376,7 @@ qulonglong DocumentPrivate::getFreeMemory() lastUpdate = QTime::currentTime(); + *freeSwap = ( cachedFreeSwap = stat.ullAvailPageFile ); return ( cachedValue = stat.ullAvailPhys ); #else // tell the memory is full.. will act as in LOW profile diff --git a/core/document_p.h b/core/document_p.h index b9186e225..af3bfd76e 100644 --- a/core/document_p.h +++ b/core/document_p.h @@ -98,7 +98,7 @@ class DocumentPrivate void cleanupPixmapMemory( qulonglong bytesOffset = 0 ); void calculateMaxTextPages(); qulonglong getTotalMemory(); - qulonglong getFreeMemory(); + qulonglong getFreeMemory( qulonglong *freeSwap ); void loadDocumentInfo(); void loadDocumentInfo( const QString &fileName ); void loadViewsInfo( View *view, const QDomElement &e ); From cd8485c7bc25550315830c6f05c6282f39e7347e Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Sun, 24 Jun 2012 23:53:01 +0200 Subject: [PATCH 048/155] Make the freeSwap out param optional --- core/document.cpp | 18 +++++++++++------- core/document_p.h | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index b8a5de29f..a51b86ed8 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -178,7 +178,6 @@ void DocumentPrivate::cleanupPixmapMemory( qulonglong /*sure? bytesOffset*/ ) // [MEM] choose memory parameters based on configuration profile qulonglong clipValue = 0; qulonglong memoryToFree = 0; - qulonglong freeSwap; switch ( Settings::memoryLevel() ) { @@ -189,7 +188,7 @@ void DocumentPrivate::cleanupPixmapMemory( qulonglong /*sure? bytesOffset*/ ) case Settings::EnumMemoryLevel::Normal: { qulonglong thirdTotalMemory = getTotalMemory() / 3; - qulonglong freeMemory = getFreeMemory( &freeSwap ); + qulonglong freeMemory = getFreeMemory(); if (m_allocatedPixmapsTotalMemory > thirdTotalMemory) memoryToFree = m_allocatedPixmapsTotalMemory - thirdTotalMemory; if (m_allocatedPixmapsTotalMemory > freeMemory) clipValue = (m_allocatedPixmapsTotalMemory - freeMemory) / 2; } @@ -197,12 +196,13 @@ void DocumentPrivate::cleanupPixmapMemory( qulonglong /*sure? bytesOffset*/ ) case Settings::EnumMemoryLevel::Aggressive: { - qulonglong freeMemory = getFreeMemory( &freeSwap ); + qulonglong freeMemory = getFreeMemory(); if (m_allocatedPixmapsTotalMemory > freeMemory) clipValue = (m_allocatedPixmapsTotalMemory - freeMemory) / 2; } break; case Settings::EnumMemoryLevel::Greedy: { + qulonglong freeSwap; qulonglong freeMemory = getFreeMemory( &freeSwap ); const qulonglong memoryLimit = qMin( qMax( freeMemory, getTotalMemory()/2 ), freeMemory+freeSwap ); if (m_allocatedPixmapsTotalMemory > memoryLimit) clipValue = (m_allocatedPixmapsTotalMemory - memoryLimit) / 2; @@ -290,13 +290,15 @@ qulonglong DocumentPrivate::getFreeMemory( qulonglong *freeSwap ) if ( qAbs( lastUpdate.secsTo( QTime::currentTime() ) ) <= 2 ) { - *freeSwap = cachedFreeSwap; + if (freeSwap) + *freeSwap = cachedFreeSwap; return cachedValue; } /* Initialize the returned free swap value to 0. It is overwritten if the * actual value is available */ - *freeSwap = 0; + if (freeSwap) + *freeSwap = 0; #if defined(Q_OS_LINUX) // if /proc/meminfo doesn't exist, return MEMORY FULL @@ -347,7 +349,8 @@ qulonglong DocumentPrivate::getFreeMemory( qulonglong *freeSwap ) lastUpdate = QTime::currentTime(); - *freeSwap = ( cachedFreeSwap = (Q_UINT64_C(1024) * values[3]) ); + if (freeSwap) + *freeSwap = ( cachedFreeSwap = (Q_UINT64_C(1024) * values[3]) ); return ( cachedValue = (Q_UINT64_C(1024) * memoryFree) ); #elif defined(Q_OS_FREEBSD) qulonglong cache, inact, free, psize; @@ -376,7 +379,8 @@ qulonglong DocumentPrivate::getFreeMemory( qulonglong *freeSwap ) lastUpdate = QTime::currentTime(); - *freeSwap = ( cachedFreeSwap = stat.ullAvailPageFile ); + if (freeSwap) + *freeSwap = ( cachedFreeSwap = stat.ullAvailPageFile ); return ( cachedValue = stat.ullAvailPhys ); #else // tell the memory is full.. will act as in LOW profile diff --git a/core/document_p.h b/core/document_p.h index af3bfd76e..48e91fd16 100644 --- a/core/document_p.h +++ b/core/document_p.h @@ -98,7 +98,7 @@ class DocumentPrivate void cleanupPixmapMemory( qulonglong bytesOffset = 0 ); void calculateMaxTextPages(); qulonglong getTotalMemory(); - qulonglong getFreeMemory( qulonglong *freeSwap ); + qulonglong getFreeMemory( qulonglong *freeSwap = 0 ); void loadDocumentInfo(); void loadDocumentInfo( const QString &fileName ); void loadViewsInfo( View *view, const QDomElement &e ); From ff92bac0056b09869b50111a2aa3933b1f9bf090 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Mon, 25 Jun 2012 22:03:43 +0200 Subject: [PATCH 049/155] Bump devel version to 0.15.70 --- VERSION | 2 +- core/version.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/VERSION b/VERSION index a715f6910..92466b4ed 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -okular v0.14.90 +okular v0.15.70 diff --git a/core/version.h b/core/version.h index f5cb21008..41c14a05f 100644 --- a/core/version.h +++ b/core/version.h @@ -10,10 +10,10 @@ #ifndef _OKULAR_VERSION_H_ #define _OKULAR_VERSION_H_ -#define OKULAR_VERSION_STRING "0.14.90" +#define OKULAR_VERSION_STRING "0.15.70" #define OKULAR_VERSION_MAJOR 0 -#define OKULAR_VERSION_MINOR 14 -#define OKULAR_VERSION_RELEASE 90 +#define OKULAR_VERSION_MINOR 15 +#define OKULAR_VERSION_RELEASE 70 #define OKULAR_MAKE_VERSION( a,b,c ) (((a) << 16) | ((b) << 8) | (c)) #define OKULAR_VERSION \ From 42911929fb2970d0455294ca98db8e1359e078e0 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Mon, 25 Jun 2012 22:04:27 +0200 Subject: [PATCH 050/155] Bump to RC1 version --- VERSION | 2 +- core/version.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/VERSION b/VERSION index a715f6910..47aca7832 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -okular v0.14.90 +okular v0.14.95 diff --git a/core/version.h b/core/version.h index f5cb21008..7b474394e 100644 --- a/core/version.h +++ b/core/version.h @@ -10,10 +10,10 @@ #ifndef _OKULAR_VERSION_H_ #define _OKULAR_VERSION_H_ -#define OKULAR_VERSION_STRING "0.14.90" +#define OKULAR_VERSION_STRING "0.14.95" #define OKULAR_VERSION_MAJOR 0 #define OKULAR_VERSION_MINOR 14 -#define OKULAR_VERSION_RELEASE 90 +#define OKULAR_VERSION_RELEASE 95 #define OKULAR_MAKE_VERSION( a,b,c ) (((a) << 16) | ((b) << 8) | (c)) #define OKULAR_VERSION \ From 98a073558ac99b1e7db26e040ab5e4efba036a1d Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Thu, 28 Jun 2012 00:13:00 +0200 Subject: [PATCH 051/155] Normalize ligatures on text export too BUGS: 302634 FIXED-IN: 4.9.0 --- generators/poppler/generator_pdf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index ffa0def84..ca9ae2471 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -1238,7 +1238,7 @@ bool PDFGenerator::exportTo( const QString &fileName, const Okular::ExportFormat Poppler::Page *pp = pdfdoc->page(i); if (pp) { - text = pp->text(QRect()); + text = pp->text(QRect()).normalized(QString::NormalizationForm_KC); } userMutex()->unlock(); ts << text; From 2c3b98a8a7502ffb0a2efa98a326222a1caa9905 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Thu, 28 Jun 2012 00:13:00 +0200 Subject: [PATCH 052/155] Normalize ligatures on text export too BUGS: 302634 FIXED-IN: 4.9.0 (cherry picked from commit 98a073558ac99b1e7db26e040ab5e4efba036a1d) --- generators/poppler/generator_pdf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index ffa0def84..ca9ae2471 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -1238,7 +1238,7 @@ bool PDFGenerator::exportTo( const QString &fileName, const Okular::ExportFormat Poppler::Page *pp = pdfdoc->page(i); if (pp) { - text = pp->text(QRect()); + text = pp->text(QRect()).normalized(QString::NormalizationForm_KC); } userMutex()->unlock(); ts << text; From 15084ea0d8c4dfe853ebf3d10ca90090c705a381 Mon Sep 17 00:00:00 2001 From: Yuri Chornoivan Date: Sun, 1 Jul 2012 17:21:40 +0300 Subject: [PATCH 053/155] Add sections about inverse search configuration. --- doc/configure-editor.png | Bin 0 -> 17570 bytes doc/index.docbook | 62 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 doc/configure-editor.png diff --git a/doc/configure-editor.png b/doc/configure-editor.png new file mode 100644 index 0000000000000000000000000000000000000000..e567acd4c6ce39b4d780154865303284278d69b5 GIT binary patch literal 17570 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 + ATEX"> KPDF"> PDF"> @@ -36,7 +37,7 @@ Context menu actions like Rename Bookmarks etc) &FDLNotice; - 2012-06-18 + 2012-06-29 0.15 (&kde; 4.9) @@ -290,6 +291,42 @@ Add a 'Find Previous' entry description in the chapter Configuring &okular;. + + + Inverse Search between &latex; Editors and &okular; + + Inverse search is a very useful feature when you are writing a &latex; document yourself. If everything is set up properly, you can + click into &okular;'s window with the left mouse button while pressing &Shift;. After that editor loads the &latex; source file and jumps to + the proper paragraph. + + Inverse search cannot work unless: + + + The source file has been compiled successfully. + &okular; knows which editor you would like to use. + + + With this feature of &okular;, a left mouse click while pressing &Shift; in the &DVI; or &PDF; document will + result in editor opening the corresponding &latex; document and attempt to go to the + corresponding line. Remember to tell &okular; to use proper editor, in &okular;'s + menu item SettingsConfigure Okular... + (on the page Editor). + + For more details on editor configuration please refer to the corresponding section of this manual. + + + Configuring &okular; + + + + + + Configuring editor in &okular; + + Configuring editor in &okular; + + + @@ -1647,12 +1684,35 @@ Add a 'Find Previous' entry Choose the editor you want to launch when &okular; wants to open a source file. This is the case when the document has references to the various points (usually row and column number) of sources it was generated from. The &DVI; format supports natively the addition of the information about the sources the LaTeX document was generated from. A similar system exists for &PDF; documents, called pdfsync, which stores these extra information in an external file named after the &PDF; file itself (for example mydocument.pdfsync for mydocument.pdf). + + &okular; ships with preconfigured settings for the following editors: &kate;, Kile, SciTE, Emacs client, and LyX client. + + + + To use inverse search in Kile, you have to compile your &latex; file with the Modern configuration. + + Command This is the command and its parameters to invoke the selected editor with the source file of the actual document. + This field will be filled automatically if you use one of the preconfigured editors. Otherwise, please choose Custom Text Editor in Editor drop-down list and refer to the documentation on your favorite editor to find the proper command. + + You can use the following placeholders: + + + %f - the file name + + + %l - the line of the file to be reached + + + %c - the column of the file to be reached + + + If %f is not specified, then the document name is appended to the specified command. From 1b7074cacd2da446193f8f29c9e2ca88a3cd07bf Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Mon, 2 Jul 2012 11:49:55 +0200 Subject: [PATCH 054/155] warning-- --- core/generator.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/core/generator.cpp b/core/generator.cpp index 2c63ca17f..17b5e6309 100644 --- a/core/generator.cpp +++ b/core/generator.cpp @@ -254,7 +254,6 @@ bool Generator::canGenerateTextPage() const void Generator::generateTextPage( Page *page ) { - Q_D( Generator ); TextPage *tp = textPage( page ); page->setTextPage( tp ); signalTextGenerationDone( page, tp ); From 48651d22ddb0453bad60e9a3f0bdc13f6e4fbd5f Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Mon, 2 Jul 2012 11:49:55 +0200 Subject: [PATCH 055/155] warning-- --- core/generator.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/core/generator.cpp b/core/generator.cpp index 2c63ca17f..17b5e6309 100644 --- a/core/generator.cpp +++ b/core/generator.cpp @@ -254,7 +254,6 @@ bool Generator::canGenerateTextPage() const void Generator::generateTextPage( Page *page ) { - Q_D( Generator ); TextPage *tp = textPage( page ); page->setTextPage( tp ); signalTextGenerationDone( page, tp ); From 9cb9e4e017501424564cf46fb637e0b244bc32c7 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Mon, 2 Jul 2012 11:54:39 +0200 Subject: [PATCH 056/155] Do not use deprecated API to get the pdf version --- generators/poppler/generator_pdf.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index ca9ae2471..a7b86eb21 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -649,8 +649,10 @@ const Okular::DocumentInfo * PDFGenerator::generateDocumentInfo() docInfo.set( Okular::DocumentInfo::ModificationDate, KGlobal::locale()->formatDateTime( pdfdoc->date("ModDate"), KLocale::LongDate, true ) ); - docInfo.set( "format", i18nc( "PDF v. ", "PDF v. %1", - QString::number( pdfdoc->pdfVersion() ) ), i18n( "Format" ) ); + int major, minor; + pdfdoc->getPdfVersion(&major, &minor); + docInfo.set( "format", i18nc( "PDF v. ", "PDF v. %1.%2", + major, minor ), i18n( "Format" ) ); docInfo.set( "encryption", pdfdoc->isEncrypted() ? i18n( "Encrypted" ) : i18n( "Unencrypted" ), i18n("Security") ); docInfo.set( "optimization", pdfdoc->isLinearized() ? i18n( "Yes" ) : i18n( "No" ), From e33816010991860c2e3fea579749de5971a51d6a Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Mon, 2 Jul 2012 12:03:45 +0200 Subject: [PATCH 057/155] orderedProperties should contain keys (i.e. tagnames) not titles Otherwise we are not showing "custom" generator properties like PDF format version number, encryption, etc --- ui/propertiesdialog.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ui/propertiesdialog.cpp b/ui/propertiesdialog.cpp index fb2dfab0a..2ef8220d0 100644 --- a/ui/propertiesdialog.cpp +++ b/ui/propertiesdialog.cpp @@ -85,8 +85,9 @@ PropertiesDialog::PropertiesDialog(QWidget *parent, Okular::Document *doc) const QString valueString = element.attribute( "value" ); if ( titleString.isEmpty() || valueString.isEmpty() ) continue; - if ( !orderedProperties.contains( titleString ) ) - orderedProperties << titleString; + if ( !orderedProperties.contains( element.tagName() ) ) { + orderedProperties << element.tagName(); + } } QDomNodeList list; From 6d9c889422181ed1dc39589ecb10dec6855548a3 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Mon, 2 Jul 2012 12:03:45 +0200 Subject: [PATCH 058/155] orderedProperties should contain keys (i.e. tagnames) not titles Otherwise we are not showing "custom" generator properties like PDF format version number, encryption, etc --- ui/propertiesdialog.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ui/propertiesdialog.cpp b/ui/propertiesdialog.cpp index fb2dfab0a..2ef8220d0 100644 --- a/ui/propertiesdialog.cpp +++ b/ui/propertiesdialog.cpp @@ -85,8 +85,9 @@ PropertiesDialog::PropertiesDialog(QWidget *parent, Okular::Document *doc) const QString valueString = element.attribute( "value" ); if ( titleString.isEmpty() || valueString.isEmpty() ) continue; - if ( !orderedProperties.contains( titleString ) ) - orderedProperties << titleString; + if ( !orderedProperties.contains( element.tagName() ) ) { + orderedProperties << element.tagName(); + } } QDomNodeList list; From 1a7a7656661c94afec4c0cd991e8664847394c70 Mon Sep 17 00:00:00 2001 From: Yuri Chornoivan Date: Sun, 1 Jul 2012 17:21:40 +0300 Subject: [PATCH 059/155] Add sections about inverse search configuration. --- doc/configure-editor.png | Bin 0 -> 17570 bytes doc/index.docbook | 62 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 doc/configure-editor.png diff --git a/doc/configure-editor.png b/doc/configure-editor.png new file mode 100644 index 0000000000000000000000000000000000000000..e567acd4c6ce39b4d780154865303284278d69b5 GIT binary patch literal 17570 zcmb@rbzIb4urLm?z|u=gFC`t)CGe#|Ku|g*q(fg zkdRQ2)RZ-35!L?}KV&2%0wh#COiW@VZ0sl4_{i803~W+NTv8-FJPdpa417v3Ar%f0 zEe0_Z0qCUE2*7^IfJ07;Mahgw$&5$Mjz`0R2j#}2eU4AhkI%qQ$Rtd}B1+6APJ#dq z$*0^h2q1ngMb0BfDWpO!tV%7WPAR5A1L#0y4Cv+FGN@QEtJ|AG7sRf z4CJ+o)b5l7BA}cUECiIgysu|HAsIdSN`7i_&rw zE_W_(&(BUzPfkvb|NJ>RygnK^Iy~6_y^Hwv_kWM?n^%X?AjDVG;`IV)G)uqMd#rc)R`K9^U<+-uN`B_9^X?|{D zcKTnKn4X=TnwXg!o12=*pZqgDF^YhxvC*l~;fayK$&n#MA#vnzVt8= z{4EUhAz%an{e8~;ck{n;hJW=UV5qlyu&-yR@8>{I7Xk)*x)Eu4cYl9(hjsV$KzB!9 zSNlKE*4Ne6*V%U1<=xlOih$ns)}Hp(j`lW_w)390mY(*O?$)NR)}~%W+S2s5+}wbG zj;8wm0-eT__NLnZs&@WET5B}=FU-FM1irbUeySnDy>6kcuKG>&VRlVRLuIK_`F>_; ztxU;oWl7OlKAuG0VqR``NnU0qJUur(^;23!=J({xq;Hc6vMTX|iScov!9kUNZ<5`O z-nvG9bam>q6LdFzjcioGshRRYQR0U@tGKiY6!5bbW0m9;VB%DgV4!}+z~M?oKu<+O zgN=1sGlQ^QBn_9>s&9~=Jb8i+!o_p7Zew3yVnrfQ+J|!b^1xO&voMbNlyhp0Ln}FJJG!XXciT)bt*f(II?I@?KE} z(D0bsUv#u1v`lL|R=Ug)F?2mr&DA1Cm!V^URF9ylzh&{$Qwn!G;;8s-vfs5bQ?AG( zc>Db*V<*NXRIW02d`>#jd59VQf>8Ow?Tb^U z;hFWbgn_qApSKGcaffl661OW`E$wD5n*9WLdB3pq4iK4JVDj*yCMCfJ29yDd94POb z*dzr0|4*2g8fi_eHliRh-+RuRwew;;hRhU98gzS&UXC}Q$7tR8L0SfK*i$uLP)s|< zl9xOzkzB1c8Ri21g52l%&{uT+g?N%F2S$5?Elfc`27?w>wjVLHXy z?m&YkeJeV5flTW`Qa~$C;scuGCjq zKD9RBRoD*gvuJo=I<>gd{zii3kgv}}3f8g_w{295@ZmK!!+y6%VKyWCCeRvH`E?d(ykz>ziYH4QVbZB9I!efGqh4);n%3^=DJ z_rAYge2wes=4z*+tdiFg)j!jlQ^7wwDLmo&QaHOr3;l8(bI>qVzT_3vg0r#8wAH;P zPTm?cy~p*qW7_gnx(Kecm0wTGVq@>~8g*bYG?5S1azkaN6UAU=6a7jhG6>_S9PEy1KXs^_DAm4AKDt>Y(3aMK&g+ajA$P zoW0?g1$ezoGLG*BGXiWUVRb7yGc?p#PLr^yntbwDNLm=KJX42l1e$&8^~K%nI8&>? znVp~htp&&jPT~STt)%bq^|@KNj%=;|(4>(}E6DzBH#mVWm#E>OT+f8!#sOUh2;_%V z1>Gd`1-+NjllBlGQj3#=2(FSiHZlFoM?QXTUC;H5**^>}sXUt#tEa}z$<-71>)7=6 zGID!3_2ImnKHZgC4eLg-78-&Hn@90~YNev~er`zNb|Vqj21G_9^%Dc2@Ccdyfqn(` zJwxe`htL=|9*3K-GRMMi@iSnsf=wtfQBI>EVLWPit9>4Pv_xHwLqVZ|N|ojI8-wFp zFn!0`QN4Tv1bx8&HYDmZKll@PaNc|V%9QHJIaQS7` zp3yJ*$d1Si?5aCGb3n*&B^*Ks(@}|uSIU-MDJ{uW8))*io7dTJXKtyp`^|Fk`o*H- zW6)JQ(ymx%#>P*klVfjW2XAj>e7>Ben5#Ovo%kxsZ#CAixX5-VT0H$&wl=3CVc6@g zn8CEIZ2U9$&RA?MUHKCtlcnoV2OzBko2y=MMO9j9KU(_2>hIK+)b=4Mh}HuIA6r6#badqdcp%o+`YrzJ#A z$3II-tMx+y_FvYyeK}y+#3B>jL-!*ML4gVF{zM-OZt__Fc>O$?ofK2BG!zT9f?dI} z>&e>WaR026R+C6qIBH)-3LEju(L!_K87RO`42lvbYmQTj%K7+N%_TbW3nrm@SPE7o zELqy>O~~8rZ`$)6DN9~|PRf4s+=YI;PxMJO@r;)R*uk*JIZUOZH^D{}(t*Yp#(?Ro z=NGKb^_D6S=X25D&4SG@vcE>n=Fyn>!(+YIU(T|vMYYoU5V-`hUy@=G29K51(Tq`) zbL*yY4fBj|va>%v-Bf6*@>()rJPOd}q_Y1C|6x+z=Dd3x_n~u|4-W@NcKpXNMi^Nj zms$JSU_dh3oo7G2*5;$x|K6veQIq68B+el~R+7DkVikk&thUKd!QRby9iZRPUlM2cT(wB@0 zlJT7=rhl+C_DBL(De3EDU6nm^2M3HgMo^1mv=N6nI1|_spaN|cyVW>XuQy(5H6l`X{ zqthY)E$e!j18xL|^2_@_J~n^%Uax%QSoCNyR)!=vibVJbPTbHBKU=_GOP0B4RbrU8{T`k`M0qC>kWZC8WJ^{Q+y>&ls!bskN zT_uvgv#NeED^OCq{QW8QyD8S6uXpia)1>@tqRxlucW4#AzV=oMCGJ+Bd`ocjY+OA{ zVZ{f6hB`3uvo_5ZUinBaJ!~M%%h`{_(R*x}>nGD=410{egVOEufpCmVlaw4wh4HdG zXj^1(@8P@5JLQq|;LX{$(x`)vqn*NWr)k%_4z`yAr+i%e$9Et1TQv5sPxUEt(;?y^ zRUv#~Q<@CTDMyT4&;U$2f)&LEo!;04?*MQ`Z0>QE}A>mQP#yaukpJ~=2qfDqi z5vMuo$la~PR=3l!85T#E=;}J*ppbUDFF$v?7G?Vt8cmbw>)jGyJsFjLeEAaR#9g!B zJyf_p*?w(P%0)OuC4`)f+4$EsrNEa{>z1!CPo3ItXBT4pKHem_aC*_G8h(v+!#0s8 zv!{}NO7~VnLd(G>UkBD+S-(H2E(T6NzpE4U^hbsgq<YcnP54OvOdSkDKz;6)rI=VgZ4~Fbc?BKw;AD(B&qc>y|tLS8sDx@Hc zqmEck8JW)lYC%FB9INVrbyVc-nS+^u!;Qx%{xwDrhP*e})~C|npKWjlHZjP24*5(p z8T5H9M5nz?jo-<^;8p4?obvU^@r}?c*C%{?Pk#RtlvAU}*_8}pej=Ah|D7-ztro=t z@Vkj0 zrRO6TlDvI=}bwR0I_z79YB=Q@>;>6z+c5JAtVID@U2(wdF zOu^>`Q&M@H?FFcbi^@Wtjs^aezJnH^rl)n_77?PBiBT0_vDC-vK>v(}FA$MOH^?nT z{h2Q|mK;FKm8Nm4$_)KENg*yo<8o)$3|H8j)%qF%kqe`jc};ja`d-u@eKZi8CTRGA zfaqg<@0LEZ1P8pE9p!sO=hy}fn<{rUa+Pc$#ytfTjL!^P z#o9D!wMOCubfIITGpl=>m!}FcpF}v)V~5DOc4p0w-1XIuHYyuvXsl^hzr5EHA~AIG z$E^-rX+Ix*7lfIlmq*r(yqvYk!C2QJFnto3RhOqdlq zNe)bzuVNE7b}svg^S^Hx=c#VsQKG5QjF&UwOz7_>r978uGrWD!eC}H85CJKA za3#-rA4b`QOTF^Efaz)QDB%g=3%AD3_~GHu6xRq0z%>kt9n*hsEMmwRDGu;Ks$R2` zFntUI6NEtN6nvV1&W--wd8K-tg0H-HbMwL?6?yzsfC|d*p3xAERV}LtoEuKIFaavu z>)U3Bg!zNxMvhng62qvSfPLo$2Vu}F>c^cdEGLmv>P}crd^^hSsM9qLK8S(3IKnI( z`}?>UB>mcWGa63)m=OP&1DRX{3f!=D5yB{BqrLSS|qX`cby-=?mCO&1+x`JEG0@ zLp~kG&1vD}iRr_T)Vu65gO7wC>oAwi-wFk!rqfXhqDJRvv2`yvW&a+1{f;p`1qo={ zJ25qJWkl^IIekgy5NFOzQB1Lb3qzj{B&AuGqHUdiXGs=Hug^K$Hm3?P|KK4sg#L=N zMe)jDcGsnicA&y7R2)!}iRF_eLF(z%SB$-)?23uqb#ZikcS3syd8{+v;6S3aG`N1Q z&UXgkq)%|BhlUvp^(Dk~JTa&^SyPljhRJk8?I0pyRFrr|9v$1xjf<+K)4!ES{L-Qh zA%K>u|D8Yc>Ao)Lu8bX}9vcJJ%Yqi$VvIz|ZI%ahYRT^6G7nBjkLz_`!+ydleQ6FL z?)mjj3iSpI=T5{{IUbmxm}QsFIx2o@1H2{sTEUY>Uv%5bitF^#1c!sKWE=GUH$FyB z0kXar94B2DFhSN7sNFqaj*L&yGL{`oHw@f`ol%08S$M;k-tKHxK+|Zh=U=X2)tX}C zW(Urwm7L-kk>fO9t`Mlfx)c=~AbC@k5Qrg=3c`Zm{`}0{_ z`|gUz8Ptc4LWr|GNUd; z*k9}LQxm(U7Rk{c4T!`E<{gnSSWG#eGBNNNW#2dA^Ji(U1kinp8qAhy`7^~TDb@s= zMk)Mw%{P=#!2bh@?@(h?5j}oULfHYR{2ml*TUE$Lk5VD|sWS|k?5}n2{-w*g z=ggE!=sjjl`bC5menkdJjpmjI1I1Kyy=&*~ga(4(35UGXl3o`JZy!#(8C5-Fy<7|>xO6| zE2HVp%wH@>aaBc&YF=KleJk@4BEVlD9B&svtx1RG_HVk($O08Kz2`yC>A;mi(^i~y zDO*@dbsR-rd+(+&D&0o5Qxk)$Q=wtO_~w>xpb8*{`+np%WTCV`9b<1ebmb>$e z&7-f$ub=WgX5~5zJhjrGSut){qM`@x7o_KqCSGSU(je!8f^c)BK{vYvPnPuNROO#i z_eK)iN=LD82G&CGyXsaJ@5tfcyRLWEc~AqQK_ntp3nrr4vuy(W(nX8P+l=sfI}au> z%zztaC*brc-2eLz(WHSmHM;#8zBiB|EVjD!mt~)bAD9N~f*zHJmSQ@74M8@7@XaeD zf}T=PL@z34(|uwRNiY{+>mB%$S=C7x&6wke{=3EywR}+~c9JJKp!2sZ>-k3C`0)on zp}sj~V9tdSYsPJUjnn^L{sHDktgejd)$p0*mSZ^pC(OqPJ-3w&by%n-@}#< zNOF1_dn)S`%G)=k)#>)fX!V62o3QwAP~mlhv#><^GBAJMN- zOp_8VJEYT+H4U|s!wr7&Gm>D^Ht#kkOC8d=ntG|TjB8$4Od8pjp4bEk>~j7ZD_{8o z5u*sinXYd&lm3uCCYjp3a;m9+D^#Uf7&9cSN_6*QEz8oR(dlRSwx5_$BHm4BikBC< zSNJ^es^jHsIh1|pWFZFc5bb_x?fM#EXrYpcQFbddW(qXL0tKL&011{c*&S&sWS8<{ z<;~9h0Id|~0kYvkwGc@Vst-4&fcW<_g7^}R*o+(4Lc5NQ=vo`B42~zCBUA2CMSA>Z zr_dC)mk@h+xM80Gcnj!^gr)ck$#N`BpZ9tX66rlc9`=XZ8Ms8izI6p3WR@s;f-afX5z*AVG*XK z{A{P(@`CWY$)G27k881V3%m>e9Al_0FSDx-%ZdM6dI@J3i%9%?G&y3jag39EM-(kQ z6NESlFmIJV^a>}eAFLUK%V8OV9nEN7mVF=`j$Y?eSkAAA@3a_RBA~d>6U12K?}OzX zx#d-_>r}N3WG(h!-}4nQKRuHfNey|@SNH;WdA)F8h%c9E{sBPh5GYRNCn_J?b@=>F zHs4u^ZR5@IK`t>YfqCttYF;{qQok?@%tM4Ea^VmQwnXIOXC21Q-aD-ot!ON-u5(u6 z!uzg!D@eF^H?UotIoXz#3&O($sJ>F)*~*w@bm-l(k6 zztsM90vn;+D6ArOBYg^pfnjWKvy1X(+XkGgR^@0Cc;gtYv{_{e4P9x1w&2XlDzgG! z?zNpAp{3+Y=lKGy4_?hQ``-u1$ET$38e_G#Lbl;Vk>$)&5D!uBgG2I(_9w6NH+iIFf6zpLTH#A80OM=xEld zYF~=d5_JL^NpFcjJ~l&TP)dZQB9TicU+^ep9BiV%)0G z=h3!%CkEQ|s7asSbgI0+`pyC>W>83&|5D%E^-BosbXud0N`)&pPgBNGO9ry{GN6v! zIf~9{U*<+5O$-imDaIo@5A%0Y^k%_vTP9XdI3C+pAhSp zHEe5pRR8@KH__dYxa*HoXvg(2gk8_#`eyFapjYQAKz}(K#>wqH)Cvs=b(IKoT|A}( z9^*1a4ei`y-bpBrAtF+bnT$3_a4L(~6g5=LI+fDq?3N^CD!<0O2Y_fvC=v{5MENag zv1xD{rDto{fb!cX`Y)|RtC7we03&CNwR6~lQK>#xn4si{lkPxv3J*cn5HKt7a+^^o z0qgVayJJk4g@uK;iaKi>{so}^1F}TQ8>#u6k2m1M*t5F^mJe3kBrrWs;NksDDPdQQ z95GSA*a2skT#6k-1=~5Q>_xW$!(3VS$Tjg3VD-Jw-2MrzkcBKch(kcPj={Wxa7I-- zA~f#xB|f=79Ly&NgJIQnpkbQ2ySeSS+Z8*=-4ls-HPl9umiF0pnX&t;TZt>xzT+B zhDsseDU0=IK3cHTDBij1cfnkRwI0rG-91c~cGu-C#= zs%ULtGM@FVc&}00Rc|_BBqSt~BTpb1{6J(`wcaP{Q7pow+OcAf>hW?&SD^-<6sjZl z4hK@2?_CeZYd8s2v7)JAN??Ultvi=oAtlC@u=gMF0jbijKdh?GD8*h zvg6tzEl(i<6%+ft1hMO`)vnELZ;{H}=-+7W>(oY6!?G|y#df5_tnvFrb=VON=>blsM8XyDr$cSZ9AG-CQ&Gkl)!(+0?pst0f44yG zl;FEFljiJ8X9aWN4{qs4&O#>udsoOJpix}nuW zJFJMl*U=vu#&BSh_0!S?zCWPYrU2FpDB;`%4cpS#u$LkY8tc#OP0TOeCdB1&c zlRh^i2Qxsj+Aj- z^FR9ksIQGpEQ^X?4>B;%tLyz>!<-|X(S}iKet1b7#ChoMv2Dz?6Gjd`p%UT32hlJt z4fQCxG69-c8+8~NxC8XyE#mA(S%VjvBPp*^T0a6KjIbr%?23|~mm8eS9WXi44O=(H zDr}W&o79rTU8X#F>|@N4Y8!3_ zm^8y{1~Hb+OTD@^X1DC^zRg;*@7%)(Xb8+5nFWj+u^!8<1o`+EMbFX&@OlUiWC%4` zw)c;+HZ_G-&tX+QkV&<)+c_sh7lDXFp}qEeBwj-ne3}|`s1^4fMnPE8gX-Mm9ap$= zvor3Tl*L);pGg@3{oF#j-;{!Y{0DyR4}oM~>u>=UpCd@nnLpi%YkH*=bSgO z>c*3#Q0WBM3$1d9UZKSj0jM={`Di9*nUOjBqHIS|3a`M)db@C3B$ZNt!HRnfRJ~fd zk9A_beBPAZp-xou=>f+FAY)Lt#Qd76Hxrt)qi?eSVw_y)4$TJyX{~IGGwDiOgwd^E zrKCSI*kzTHl^xZ~#e}UlZbSJrG0NEdTH#Ujjs(AIW@QMn#d};%fuwDbH51J*voa03 zqz!AxpRmID<|4mMy!_&ksGNa=ZTZrit$rGW5&E9@$_Cf-fdq7G3p4WTCbG-yFQYK+ z(TLr)S`R^O@1S?4oK`o=qktaHFa3C|`k0P%OOxnGeqKr5J9-e9_8Yam+o5>_q=WS5 zHShqc;@TcTw)<0WH~;hN=9nG|^X8;`pzwfz?9)@1n;3(J2+nFJZ0vSJ*5z`>lh?FA zCYRB#=l0Lu(#UxFy>BrdIkPSO^Px~db3M15@T=PCQXN#MtL32BP+YZ{bo?LV5mMZp z(x&2u>GPiWT$+xT*q{$;wBUX>M*QRD|10AeGZqPT8+^d=*~xnjHli^V3WL2U+5-YO zq2T2zrpWXd7M*|Wp^)X}SHeCGPX@{E^8n~3_mp1~oVX=n zI{{D1m z?80?1XnoISPxF=alm)Ge8wKFj>f`>X*a+J0rP>dCT^46ih5PhNnYr6lZsFj)m?Er- zlk{x;NuZK#I-b%y;h6wOo+JD-uCp!fgBIurLs-V!m&mMgzx$a!)S}{iKD>(KBC8Ij zDSo!I%ki_f<<6q#iw}zbgu{#KWO(yD_E1~=MbWdJMo~oR(A#|xmgwpu$ZTb3zpls- z%v-j}MDaT?v26p(v*}9*+01rK@iQx?mT2CxtLSb}u|48og*j(L@e0@&wf?{W#1Q-z zLU}3HU;zaD#&>xwYM+kF1@`PMTF3tMvCel9Hg@v~f1~)$>83UE>^*Euk0PIMsO>ey z&1fQ6DNQbBj?~^%0jT@EJBM1l%PXZ;9uJZvmB41P!g0Tk3Wh5k=;9!K03i-~QDfJ; zm3k_5u?p;9Eb{DMT*Ed7QNM#Q{?^1##I7&jATivhw84t#n5%yrt%GKV&HO}dYK3>d zJ~bLaJG^#)0f7Xzt5hzW6JvC3-^-xMKL%YGt{ z^!I?-c{YrR?#U;)-GM6q_o4&2e&yvW(wdG8RiypfJS=)>^d{RyWUSKi2~tCB88i|@ z?=iH67FC@XNcCk{y|b;uipz?OtW-z6M{&O|PEj7A%(e2*dhCjTqi?n&M0l)pcbBkF z@p;V_88Efg_5kdQNbY^HmjhB`?5*eF570I15HMwwWt+y;o?0s$lp_xG^F zLE-afVFd{)o!p|s(jw>paA*WU?W54UEzO~>PFAUWfdfD`R3MLK1rJMn44hK}D&s3q zW;Dol?9YNd*f9Z!%ZKM5Ds=Rm zSvg3KmePhS--Tm$XNV!ju6<7$2nEBSV5!F{xZ_r;7)FHsc+eFTbl-ool}<`jE}vXz zSfZ0_>4MfD37@-rYHU>obknfqsmr}g!4#;R0}n-!(N%++3X zfNNYd-M7qZi-VO{UUPqti;Jhw=;kjrOtu#fNDQ;wU!f6bf-#feXTFwuNr^huJ2kSR zg_;61kIDAA$yF)I;_x2>XoH0{I~nivIQVUbO9~izZJzFP4C&mPm?cDWfidHtQ>(ms z*1l{NUeh(*NM&p_G7@b+yJp?f%y>`FJi5M$MRwI$&86vN`%GQr|JWJz`7KBdEBOSk z|LDFgflh|=Emu0|U8(RqZ0%MnigX8Sv0LMoF(f!g!|&7Rd#-be;iW+%G3r9gQCrAF z!qy$6YUl8-ab|SO**=Qg1ynx_l^=oAhfVDi7T!j~-&l^kxse@ejO3tuOzFQnfblG1 zMwD$s2WOlyB7}y4bWBfGnA;pD&|`KU8r9$+4uh9rWUT#0-;dEQCj<=47tQrg7jj{y zqCx#WXtD-o=f!A4a0vKB@bBvU3sU!_e61TLF|hd9M`C$eFo011f5Hz*FnKVXn;#F@ zvB6vmmN^j$SP#l-lZJp?skr(g==z9FG;Tp98} z%;!f`O|@ri{Q^`)J56J_nJ^=wE-LS0ibKWSWx!d&qZ+H-*-uNd>J2$7i zIEv>^yVFj>xBz708~ibig;Ddc%k)@?$sEc|1pAu(&fN$#%9nLV`guD!sTii7+yki) z(3v^^H8a#Ox9bRNe8Lp zuUuStmVq!njy||kX{_aaK!!bGXQp5PH0UIJa{55%2p;)R=C*Ipzvf}c0q7#Q`(s6v z1u%m#i=lJRt7eLH5=yM}_sQHTaU!Eeq>^+4;c8emWPB=?r35EUmOx#kp)1f|csN8T zLmyoA^JQccPGvUrLAShUU}#L;nQ9!B+E9^L^XG!>!5UfV5G?zCIGFZQ_#bGO*6otsL#c)OaZB~ezA?XDP= z!vhS_vDuILF-YMd?uXx;?;%|_`3yUAZ@XqAnSjX-sC?Ye9t4BT#bWcIQOCtUhNieA z+9fS(eTbEBJ}Y-GQo4U2bPB|rR{fPiQ1cz(J2(7+!nQxiS&mBgr zhvTL}I_ifZBkwu82^?E4*b~z zJ%my!G2T_w8_X&oT-a3?$alzlC0HPT-x8maIEIbb+vu&%zrA?{Yx!jp{P{D!CdY!> zoW`DvZioXR5mo<1Vr7{(_i9JoI#T(k!65`p1qIG>oraaw9Y=;p`U9K=Ax4vNvugD(d0@=+)j8*{qxGJ~WY-M8;I3#1yldNxP>+W2QL8m?RV z@0U?GOPH*7+vB)EsP|zGEh&&QyDJ(ni^AabW3elzqi#`$i?Q0A-Vybi)=~__ z&m zxFcq;^Tp$Ivrzjto)y|=Yszm5gURdDUOWW=-zH{T)j=BBP{)U)uMFx$9=Hg#ZZN+d z2(A8>Mfd*xuTy38roTYUWE$f?{B2|hYmY0lQOFM+@jfOq5*P~$A&veFkE{*$yWN7f zni0d~inopLghAJc(0d;MHCdO)MQ7L{yxrO*qS#M%9M6z;h+2|_fN-!*rgNxAMFwt| zE(YV^cWOYxiGe|&RP*)?Cuqxu|7PIBh!bEkWs;d9yv zvl2YpB^2pGNErh1(V;PJ^;o|10%RX6hZ~x;uo3!Q_Zry+rd!bsn;e%&CzknXn3S8x z3DP2g5qVe_P6N|8_DxsIN8=F$Yx&`!2dYpgxWVa6thF0)Vlb=@Z(bj#Gg1$Nvt1H4 z5A;fp2w~kkkw`%_`n$C2^m+UC%f5p=pr}Z=XQf`teZimzC@LI&;Cani;3z$k2)?QJ zWP%k)AO-_Qb}kplJ^-4v8czM_=m=jZf#2}|Axg^Db@<)nPJV-kE%+od9tJcq`PSh< zCHoH5!?eu5UWJbcnGCD@X*?Nr>t^yWQ^azxIicm_^&O5=`gdZ)kR+ z0qR6D_7+&Wq3WpP8nOYTb$XZkcX^lqJ=;$ID8a@U%TK$P+6=lH?>JucZu^8;r2GS!01L*qKQM9#kvgELQfp5xE!MLrDz-~iE-N3Ghz@)vA)<@PPi6;a zFy~9%?ibaT>_*Vd8ND!v5a|NMx}W)Mr&x4iFw{chWE8(>Ah@$LFWlwz7W}j`OsI1x zbi~fEoVE!@yf``F$XpV zC^#Yq`pZo0a>vfL`DYHl;ulR`TYYP{5gQK(ktRS}_@{g>B0g5;guV|WQqv7j+?Kyt z4Nwb0t%voViuIhrm7QYwkQ2_`a z1G53bGJH`0l_O4@zutlHA6>O$>Qkl5rwGe<4@^Fl&!+)>i^|ZB>ElFTBmo%U1Cc?r zyM`qrqbj1XZ`N5giFWTj7!WMTJ?HF-q<+C;)}_>r1dMQC=ry4N?FBtobpX0H{SbxR zKDF%^xZLw+M3FdwZ?HXcb=P*@ELg-snIm9##EHB{Nz-D(Pr)_kh zF0JbjLC0{S4MX#p?BH4%+(wzI>6j(}zJoD`%Mv!-y!B|I=52)*Oi+abj1q1v2Vys% zW5_+fFp7N)u>3=A7^d_$H1!_>lu_TE#4MU5x|6eoUThGrdpFGl!SgWbq-vK0KvAFJ zjsKo)cTf>-k9ddoW$10B2dMvshS%q+NSfsw-gY3e=Z6=OWdA4%p@VqsH#%CSvPz9n+5;9Bz?xDs&*JYG1v_tq~)Jm z&7h6&4E!2aXv(gSz4*r@(4G=f9*HruKkQ8_#lj)Wjd}Vy4?qy&qz)DY3u!4n7`;^ggmu@uar^ zlD{6eMS3eG)Bha_G5Jok=jr}{_}{tw!&%%amigC9`UvMO{gxqE*qWY}>%BG0Z37O0 z-$#$fhrms7YOy=n@4U+=u3MoEy1ts|uWGcqD+AfcNcfwL0=qg(X?z>`@LJ_Eu1`3O zEsgS0HnkbWy&IZY)5M8N&2=Wuh$%K2->QAE{oVMy^?s@(=E{M#rY7QR3^-n?hhC}u zC_Z419jQTAu{vXT+n7pxxvNYIH`yo`$T(RcGfCG-$Lo{O|8yH6G$c>ycRrb5?0ek3 z*yw(=Q15eR$C5WhIkFcYpjCZ-sae5qtFw}ugZe2w-oY~!&3ajk(K9+J0dr5HMLSze zHaEZ8ua43i9=`6~H3Jt-189`$?1kLCqscWaIrCDiU*GiSo=O&a5+%x>2$5fbSC#IZ z{@~--5=>TOYx1*e`!qa#5*3r&A`qxS>vE*3z-{H1vgCjnEz@{w>JZoxBzcdrb8({Eruf+VsZkdV)v_#?^ql!c2;c6z z_sKGh)Jfg02PFN6X=DF#b%rk{-24SDm}E(k(NR2Agz6>J>=FyK9(p!aD06rHsnu zwmRR0^-JXX0QG?oGzFE?dANPX_IFIie*VE|Tge~D+&kSD0yRFO6GFd}j_n=YMVWGO z9WZ#pOmQ^rCo4*gntx4^*E%@FhnnmYl~g-;Qye{%TuZ(8RGs%KoMm2BV6Iy&t?nE= zO?!ivdf|EDlKK%oiGSloIQ`Y|TUNmfOf+`(Qon8joGNY%GNM#?7F*rnZvDMrg?Mxh zv0}JWmv!P>!bPjO>Gjvvo(VaQK6F3p&9K5_v=Er(C>k~M#N6aT{&-nC5G#S2#tKU@gt@NZu#%y#Ol!$Vw_tsB_ z87hC*^#o0&RMpSeKIOq@zDR4(;R6wlu&YGg?1y&YZU+N@>@b!O6{Pk6MItt0>T zS(t}>;!IF>@c>R;b+$S$L2%csIm7tMxUT5c=!wL=#?-9nl~*eWT4K$ z8ukbwp&(v#7ZWw2Mhff<$D7v(Yf1yE-H(dgkKU@OsD=Ea`sy^4xqNnlVDh?i_HSzM z>3IqQ-cKu|hRfn$5~PXI2QXvC1;YK%cB9EKRHe`uF;v*7`<2Rd26lO5Wi^$kR|(M= zI#n>vK(02P{&@m0fOX*6?B0O; z2OE=M+9viy)7(l;za@o&g6P0ebO`?7T%6jWPfuCoGXQ173Sf8DuNDgyF;|;RQPBQ{ zOSr;sw<1P8)i!~~kG2V#(3^t32G1-y#VY9QP}|hJ*?IYXU`IKyWib^AlcjszNj-bH4PD&OfxbJUtq&z+N2#{H?C zENG|X5>zq^=l-x%K}~TkUL5-a7j|`Q&a{8P>5!FIw14J49WRv{#q7gECi5I?smUv0 zX`#t-qGHzK&`k?Ax3vs9<>9;@b)` z%YCmkkRB0)#y$g=h=4uOx=o)t?&q!EPj|J!33I2Td%y_O(4tviilUHGQP}A-@wj>f z6e5h7-xGFHVAe+aJb4)$ZI&WJYlFkHt zL)Ojp-LXyYX~Fq+o%IVI|otZ!=tt;+PYWdOi(H zRm5&fV*G6_P>PLiH|0gqWR#T;8nW)Vsh?r;(h%wYsn&vXyvT~uQ7H6R_OG$8<{yT<`=@omE|mqE-?Y0YaS^mW zD73_1_!Mz4F`23=`2FhTZ0Q30vBp@U(7H>VsE72Bp~auh)IzdnAZ#a024}C!Pmvq; z@#_Uu1ILd8)V0A3<;tE4)3I#E{s_A;VHwP}Q>if`Z*TTa1dXcy{>lEmbx;om*(SibUObM z$%5~+)Sgv9KPpWdei~VE;Y&*6eWAjXIgb3Sx42*0vlUu}Pb6-pS{#s|=D30*zm73J z=D~;98k%6_{7l}6HxmC0%wMDtjDA7nDv&*|C6@8H?Q`V3**{Eq8tfbNSYJXRLo*gZ zcgy7#jVRJ6IZRi(RVfcKPoG&icWsbWX~%w2tI_#MBHr%tVIQf zPaR$3bK!Q=lb(|tQ?;fwJ3l)l5G?X%hecvvsOCwQlY-U3K%EX8?Q7Va*WFHuDvJHF z@?i^WLrT*(u1SKo?imUg>E3QsT&DG-Fy}POg15ZD6*Sr&ZW;<9X4=zYUHL8tiQWu5 zs>2S{0Cc|$$HGN{O^TkR%`)n7{&Dh|S%Z_g&Z-3;xDHO}?|8{o^FV!%!$g*o9IP!& z&Odc7huM7)W|+izOLWV80iK^vXUu9~KX{&R!HTAqfCP??8JiBMe^73C#KEL!$l~G? z`#`ylL8EU$tdql$E39_b4NBZX&XQC7 + ATEX"> KPDF"> PDF"> @@ -36,7 +37,7 @@ Context menu actions like Rename Bookmarks etc) &FDLNotice; - 2012-06-18 + 2012-06-29 0.15 (&kde; 4.9) @@ -290,6 +291,42 @@ Add a 'Find Previous' entry description in the chapter Configuring &okular;. + + + Inverse Search between &latex; Editors and &okular; + + Inverse search is a very useful feature when you are writing a &latex; document yourself. If everything is set up properly, you can + click into &okular;'s window with the left mouse button while pressing &Shift;. After that editor loads the &latex; source file and jumps to + the proper paragraph. + + Inverse search cannot work unless: + + + The source file has been compiled successfully. + &okular; knows which editor you would like to use. + + + With this feature of &okular;, a left mouse click while pressing &Shift; in the &DVI; or &PDF; document will + result in editor opening the corresponding &latex; document and attempt to go to the + corresponding line. Remember to tell &okular; to use proper editor, in &okular;'s + menu item SettingsConfigure Okular... + (on the page Editor). + + For more details on editor configuration please refer to the corresponding section of this manual. + + + Configuring &okular; + + + + + + Configuring editor in &okular; + + Configuring editor in &okular; + + + @@ -1647,12 +1684,35 @@ Add a 'Find Previous' entry Choose the editor you want to launch when &okular; wants to open a source file. This is the case when the document has references to the various points (usually row and column number) of sources it was generated from. The &DVI; format supports natively the addition of the information about the sources the LaTeX document was generated from. A similar system exists for &PDF; documents, called pdfsync, which stores these extra information in an external file named after the &PDF; file itself (for example mydocument.pdfsync for mydocument.pdf). + + &okular; ships with preconfigured settings for the following editors: &kate;, Kile, SciTE, Emacs client, and LyX client. + + + + To use inverse search in Kile, you have to compile your &latex; file with the Modern configuration. + + Command This is the command and its parameters to invoke the selected editor with the source file of the actual document. + This field will be filled automatically if you use one of the preconfigured editors. Otherwise, please choose Custom Text Editor in Editor drop-down list and refer to the documentation on your favorite editor to find the proper command. + + You can use the following placeholders: + + + %f - the file name + + + %l - the line of the file to be reached + + + %c - the column of the file to be reached + + + If %f is not specified, then the document name is appended to the specified command. From 1ed8014ad05733de277e44bf2e8df28eac062bd7 Mon Sep 17 00:00:00 2001 From: Script Kiddy Date: Fri, 6 Jul 2012 10:13:36 +0200 Subject: [PATCH 060/155] SVN_SILENT made messages (.desktop file) --- generators/chm/okularApplication_chm.desktop | 1 + generators/comicbook/okularApplication_comicbook.desktop | 1 + generators/djvu/okularApplication_djvu.desktop | 1 + generators/dvi/okularApplication_dvi.desktop | 1 + generators/epub/okularApplication_epub.desktop | 1 + generators/fictionbook/okularApplication_fb.desktop | 1 + generators/plucker/okularApplication_plucker.desktop | 1 + generators/poppler/okularApplication_pdf.desktop | 1 + generators/xps/okularApplication_xps.desktop | 1 + 9 files changed, 9 insertions(+) diff --git a/generators/chm/okularApplication_chm.desktop b/generators/chm/okularApplication_chm.desktop index 7e81d2875..371c29c94 100755 --- a/generators/chm/okularApplication_chm.desktop +++ b/generators/chm/okularApplication_chm.desktop @@ -145,6 +145,7 @@ X-KDE-Keywords[it]=chm X-KDE-Keywords[kk]=chm X-KDE-Keywords[km]=chm X-KDE-Keywords[ko]=chm +X-KDE-Keywords[lv]=chm X-KDE-Keywords[nb]=chm X-KDE-Keywords[nds]=CHM X-KDE-Keywords[nl]=chm diff --git a/generators/comicbook/okularApplication_comicbook.desktop b/generators/comicbook/okularApplication_comicbook.desktop index 23c96b15f..cde2e8395 100755 --- a/generators/comicbook/okularApplication_comicbook.desktop +++ b/generators/comicbook/okularApplication_comicbook.desktop @@ -145,6 +145,7 @@ X-KDE-Keywords[it]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[kk]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[km]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[ko]=cbr, cbz, cbt, Comic Book,만화책 +X-KDE-Keywords[lv]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[nb]=cbr, cbz, cbt, tegneserie X-KDE-Keywords[nds]=cbr, cbz, cbt, Comicbook X-KDE-Keywords[nl]=cbr, cbz, cbt, Stripverhaal diff --git a/generators/djvu/okularApplication_djvu.desktop b/generators/djvu/okularApplication_djvu.desktop index e6fd483b9..377d231ea 100755 --- a/generators/djvu/okularApplication_djvu.desktop +++ b/generators/djvu/okularApplication_djvu.desktop @@ -145,6 +145,7 @@ X-KDE-Keywords[it]=djvu X-KDE-Keywords[kk]=djvu X-KDE-Keywords[km]=djvu X-KDE-Keywords[ko]=djvu +X-KDE-Keywords[lv]=djvu X-KDE-Keywords[nb]=djvu X-KDE-Keywords[nds]=DjVu X-KDE-Keywords[nl]=djvu diff --git a/generators/dvi/okularApplication_dvi.desktop b/generators/dvi/okularApplication_dvi.desktop index 6c5990f23..84bddb3cf 100755 --- a/generators/dvi/okularApplication_dvi.desktop +++ b/generators/dvi/okularApplication_dvi.desktop @@ -145,6 +145,7 @@ X-KDE-Keywords[it]=dvi X-KDE-Keywords[kk]=dvi X-KDE-Keywords[km]=dvi X-KDE-Keywords[ko]=dvi +X-KDE-Keywords[lv]=dvi X-KDE-Keywords[nb]=dvi X-KDE-Keywords[nds]=DVI X-KDE-Keywords[nl]=dvi diff --git a/generators/epub/okularApplication_epub.desktop b/generators/epub/okularApplication_epub.desktop index 400073359..16f6a13d2 100755 --- a/generators/epub/okularApplication_epub.desktop +++ b/generators/epub/okularApplication_epub.desktop @@ -145,6 +145,7 @@ X-KDE-Keywords[it]=epub, e-book X-KDE-Keywords[kk]=epub, e-book X-KDE-Keywords[km]=epub, e-book X-KDE-Keywords[ko]=epub, e-book,전자책,이북 +X-KDE-Keywords[lv]=epub, e-book, e-grāmata X-KDE-Keywords[nb]=epub, e-bok X-KDE-Keywords[nds]=epub, e-book X-KDE-Keywords[nl]=epub, e-book diff --git a/generators/fictionbook/okularApplication_fb.desktop b/generators/fictionbook/okularApplication_fb.desktop index 0e9e63a00..eafaa0d11 100755 --- a/generators/fictionbook/okularApplication_fb.desktop +++ b/generators/fictionbook/okularApplication_fb.desktop @@ -145,6 +145,7 @@ X-KDE-Keywords[it]=FictionBook, e-book, fb2 X-KDE-Keywords[kk]=FictionBook, e-book, fb2 X-KDE-Keywords[km]=FictionBook, e-book, fb2 X-KDE-Keywords[ko]=FictionBook, e-book, fb2 +X-KDE-Keywords[lv]=FictionBook, e-book, fb2, e-grāmata X-KDE-Keywords[nb]=FictionBook, e-bok, fb2 X-KDE-Keywords[nds]=FictionBook, e-book, fb2 X-KDE-Keywords[nl]=Fictieboek, e-book, fb2 diff --git a/generators/plucker/okularApplication_plucker.desktop b/generators/plucker/okularApplication_plucker.desktop index 952e0259a..7d06d93fc 100755 --- a/generators/plucker/okularApplication_plucker.desktop +++ b/generators/plucker/okularApplication_plucker.desktop @@ -145,6 +145,7 @@ X-KDE-Keywords[it]=plucker X-KDE-Keywords[kk]=plucker X-KDE-Keywords[km]=plucker X-KDE-Keywords[ko]=plucker +X-KDE-Keywords[lv]=plucker X-KDE-Keywords[nb]=plucker X-KDE-Keywords[nds]=Plucker X-KDE-Keywords[nl]=plucker diff --git a/generators/poppler/okularApplication_pdf.desktop b/generators/poppler/okularApplication_pdf.desktop index 7b6029dcc..9949772f1 100755 --- a/generators/poppler/okularApplication_pdf.desktop +++ b/generators/poppler/okularApplication_pdf.desktop @@ -144,6 +144,7 @@ X-KDE-Keywords[it]=PDF, Portable Document Format, formato per documenti portabil X-KDE-Keywords[kk]=PDF, Portable Document Format X-KDE-Keywords[km]=PDF, Portable Document Format X-KDE-Keywords[ko]=PDF, Portable Document Format +X-KDE-Keywords[lv]=PDF, Portable Document formāts X-KDE-Keywords[nb]=PDF, Portabelt Dokument Format X-KDE-Keywords[nds]=PDF, Porteerbor Dokmentformaat X-KDE-Keywords[nl]=PDF, Portable Document Format diff --git a/generators/xps/okularApplication_xps.desktop b/generators/xps/okularApplication_xps.desktop index 819a27de1..71e636848 100755 --- a/generators/xps/okularApplication_xps.desktop +++ b/generators/xps/okularApplication_xps.desktop @@ -144,6 +144,7 @@ X-KDE-Keywords[it]=XPS X-KDE-Keywords[kk]=XPS X-KDE-Keywords[km]=XPS X-KDE-Keywords[ko]=XPS +X-KDE-Keywords[lv]=XPS X-KDE-Keywords[nb]=XPS X-KDE-Keywords[nds]=XPS X-KDE-Keywords[nl]=XPS From 0bbc23b859628cbcda06b9a4828a713736f2dde2 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Mon, 9 Jul 2012 23:04:31 +0200 Subject: [PATCH 061/155] Bump to RC2 version --- VERSION | 2 +- core/version.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/VERSION b/VERSION index 47aca7832..bd1db3a13 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -okular v0.14.95 +okular v0.14.97 diff --git a/core/version.h b/core/version.h index 7b474394e..9cb34f083 100644 --- a/core/version.h +++ b/core/version.h @@ -10,10 +10,10 @@ #ifndef _OKULAR_VERSION_H_ #define _OKULAR_VERSION_H_ -#define OKULAR_VERSION_STRING "0.14.95" +#define OKULAR_VERSION_STRING "0.14.97" #define OKULAR_VERSION_MAJOR 0 #define OKULAR_VERSION_MINOR 14 -#define OKULAR_VERSION_RELEASE 95 +#define OKULAR_VERSION_RELEASE 97 #define OKULAR_MAKE_VERSION( a,b,c ) (((a) << 16) | ((b) << 8) | (c)) #define OKULAR_VERSION \ From 1feb549d3dfa491de567d5289b8e2c4b415cdefc Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Mon, 2 Jul 2012 01:05:02 +0200 Subject: [PATCH 062/155] Clean pixmap cache in order of descreasing distance from current viewport Previously it was cleaned in FIFO order I also moved the pixmap selection logic in a separate function, that will be needed in the next patches. Note: This behaviour is yet not optimal for the thumbnails panel, because it is allowed to be at a page different than the current viewport --- core/document.cpp | 146 +++++++++++++++++++++++----------------------- core/document_p.h | 3 +- 2 files changed, 74 insertions(+), 75 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index a51b86ed8..9bb27ae1a 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -217,35 +217,66 @@ void DocumentPrivate::cleanupPixmapMemory( qulonglong /*sure? bytesOffset*/ ) { // [MEM] free memory starting from older pixmaps int pagesFreed = 0; - QLinkedList< AllocatedPixmap * >::iterator pIt = m_allocatedPixmapsFifo.begin(); - QLinkedList< AllocatedPixmap * >::iterator pEnd = m_allocatedPixmapsFifo.end(); - while ( (pIt != pEnd) && (memoryToFree > 0) ) + while ( memoryToFree > 0 ) { - AllocatedPixmap * p = *pIt; - if ( m_observers.value( p->id )->canUnloadPixmap( p->page ) ) - { - // update internal variables - pIt = m_allocatedPixmapsFifo.erase( pIt ); - // m_allocatedPixmapsTotalMemory can't underflow because we always add or remove - // the memory used by the AllocatedPixmap so at most it can reach zero - m_allocatedPixmapsTotalMemory -= p->memory; - // Make sure memoryToFree does not underflow - if ( p->memory > memoryToFree ) - memoryToFree = 0; - else - memoryToFree -= p->memory; - pagesFreed++; - // delete pixmap - m_pagesVector.at( p->page )->deletePixmap( p->id ); - // delete allocation descriptor - delete p; - } else - ++pIt; + AllocatedPixmap * p = searchLowestPriorityUnloadablePixmap( true ); + if ( !p ) // No pixmap to remove + break; + + kDebug().nospace() << "Evicting cache pixmap id=" << p->id << " page=" << p->page; + + // m_allocatedPixmapsTotalMemory can't underflow because we always add or remove + // the memory used by the AllocatedPixmap so at most it can reach zero + m_allocatedPixmapsTotalMemory -= p->memory; + // Make sure memoryToFree does not underflow + if ( p->memory > memoryToFree ) + memoryToFree = 0; + else + memoryToFree -= p->memory; + pagesFreed++; + // delete pixmap + m_pagesVector.at( p->page )->deletePixmap( p->id ); + // delete allocation descriptor + delete p; } - //p--rintf("freeMemory A:[%d -%d = %d] \n", m_allocatedPixmapsFifo.count() + pagesFreed, pagesFreed, m_allocatedPixmapsFifo.count() ); + //p--rintf("freeMemory A:[%d -%d = %d] \n", m_allocatedPixmaps.count() + pagesFreed, pagesFreed, m_allocatedPixmaps.count() ); } } +/* Returns the next pixmap to evict from cache, or NULL if no suitable pixmap + * is found. If thenRemoveIt is set, the pixmap is removed from + * m_allocatedPixmaps before returning it */ +AllocatedPixmap * DocumentPrivate::searchLowestPriorityUnloadablePixmap( bool thenRemoveIt ) +{ + QLinkedList< AllocatedPixmap * >::iterator pIt = m_allocatedPixmaps.begin(); + QLinkedList< AllocatedPixmap * >::iterator pEnd = m_allocatedPixmaps.end(); + QLinkedList< AllocatedPixmap * >::iterator farthestPixmap = pEnd; + const int currentViewportPage = (*m_viewportIterator).pageNumber; + + /* Find the pixmap that is farthest from the current viewport */ + int maxDistance = -1; + while ( pIt != pEnd ) + { + const AllocatedPixmap * p = *pIt; + const int distance = qAbs( p->page - currentViewportPage ); + if ( maxDistance < distance && m_observers.value( p->id )->canUnloadPixmap( p->page ) ) + { + maxDistance = distance; + farthestPixmap = pIt; + } + ++pIt; + } + + /* No pixmap to remove */ + if ( farthestPixmap == pEnd ) + return 0; + + AllocatedPixmap * selectedPixmap = *farthestPixmap; + if ( thenRemoveIt ) + m_allocatedPixmaps.erase( farthestPixmap ); + return selectedPixmap; +} + qulonglong DocumentPrivate::getTotalMemory() { static qulonglong cachedValue = 0; @@ -1058,11 +1089,8 @@ void DocumentPrivate::slotGeneratorConfigChanged( const QString& ) } // [MEM] remove allocation descriptors - QLinkedList< AllocatedPixmap * >::const_iterator aIt = m_allocatedPixmapsFifo.constBegin(); - QLinkedList< AllocatedPixmap * >::const_iterator aEnd = m_allocatedPixmapsFifo.constEnd(); - for ( ; aIt != aEnd; ++aIt ) - delete *aIt; - m_allocatedPixmapsFifo.clear(); + qDeleteAll( m_allocatedPixmaps ); + m_allocatedPixmaps.clear(); m_allocatedPixmapsTotalMemory = 0; // send reload signals to observers @@ -1071,7 +1099,7 @@ void DocumentPrivate::slotGeneratorConfigChanged( const QString& ) // free memory if in 'low' profile if ( Settings::memoryLevel() == Settings::EnumMemoryLevel::Low && - !m_allocatedPixmapsFifo.isEmpty() && !m_pagesVector.isEmpty() ) + !m_allocatedPixmaps.isEmpty() && !m_pagesVector.isEmpty() ) cleanupPixmapMemory(); } @@ -1921,11 +1949,8 @@ void Document::closeDocument() d->m_pagesVector.clear(); // clear 'memory allocation' descriptors - QLinkedList< AllocatedPixmap * >::const_iterator aIt = d->m_allocatedPixmapsFifo.constBegin(); - QLinkedList< AllocatedPixmap * >::const_iterator aEnd = d->m_allocatedPixmapsFifo.constEnd(); - for ( ; aIt != aEnd; ++aIt ) - delete *aIt; - d->m_allocatedPixmapsFifo.clear(); + qDeleteAll( d->m_allocatedPixmaps ); + d->m_allocatedPixmaps.clear(); // clear 'running searches' descriptors QMap< int, RunningSearch * >::const_iterator rIt = d->m_searches.constBegin(); @@ -1983,14 +2008,14 @@ void Document::removeObserver( DocumentObserver * pObserver ) (*it)->deletePixmap( observerId ); // [MEM] free observer's allocation descriptors - QLinkedList< AllocatedPixmap * >::iterator aIt = d->m_allocatedPixmapsFifo.begin(); - QLinkedList< AllocatedPixmap * >::iterator aEnd = d->m_allocatedPixmapsFifo.end(); + QLinkedList< AllocatedPixmap * >::iterator aIt = d->m_allocatedPixmaps.begin(); + QLinkedList< AllocatedPixmap * >::iterator aEnd = d->m_allocatedPixmaps.end(); while ( aIt != aEnd ) { AllocatedPixmap * p = *aIt; if ( p->id == observerId ) { - aIt = d->m_allocatedPixmapsFifo.erase( aIt ); + aIt = d->m_allocatedPixmaps.erase( aIt ); delete p; } else @@ -2021,11 +2046,8 @@ void Document::reparseConfig() } // [MEM] remove allocation descriptors - QLinkedList< AllocatedPixmap * >::const_iterator aIt = d->m_allocatedPixmapsFifo.constBegin(); - QLinkedList< AllocatedPixmap * >::const_iterator aEnd = d->m_allocatedPixmapsFifo.constEnd(); - for ( ; aIt != aEnd; ++aIt ) - delete *aIt; - d->m_allocatedPixmapsFifo.clear(); + qDeleteAll( d->m_allocatedPixmaps ); + d->m_allocatedPixmaps.clear(); d->m_allocatedPixmapsTotalMemory = 0; // send reload signals to observers @@ -2034,7 +2056,7 @@ void Document::reparseConfig() // free memory if in 'low' profile if ( Settings::memoryLevel() == Settings::EnumMemoryLevel::Low && - !d->m_allocatedPixmapsFifo.isEmpty() && !d->m_pagesVector.isEmpty() ) + !d->m_allocatedPixmaps.isEmpty() && !d->m_pagesVector.isEmpty() ) d->cleanupPixmapMemory(); } @@ -2757,27 +2779,6 @@ void Document::setViewport( const DocumentViewport & viewport, int excludeId, bo for ( ; it != end ; ++ it ) if ( it.key() != excludeId ) (*it)->notifyViewportChanged( smoothMove ); - - // [MEM] raise position of currently viewed page in allocation queue - if ( d->m_allocatedPixmapsFifo.count() > 1 ) - { - const int page = viewport.pageNumber; - QLinkedList< AllocatedPixmap * > viewportPixmaps; - QLinkedList< AllocatedPixmap * >::iterator aIt = d->m_allocatedPixmapsFifo.begin(); - QLinkedList< AllocatedPixmap * >::iterator aEnd = d->m_allocatedPixmapsFifo.end(); - while ( aIt != aEnd ) - { - if ( (*aIt)->page == page ) - { - viewportPixmaps.append( *aIt ); - aIt = d->m_allocatedPixmapsFifo.erase( aIt ); - continue; - } - ++aIt; - } - if ( !viewportPixmaps.isEmpty() ) - d->m_allocatedPixmapsFifo += viewportPixmaps; - } } void Document::setZoom(int factor, int excludeId) @@ -3836,13 +3837,13 @@ void DocumentPrivate::requestDone( PixmapRequest * req ) #endif // [MEM] 1.1 find and remove a previous entry for the same page and id - QLinkedList< AllocatedPixmap * >::iterator aIt = m_allocatedPixmapsFifo.begin(); - QLinkedList< AllocatedPixmap * >::iterator aEnd = m_allocatedPixmapsFifo.end(); + QLinkedList< AllocatedPixmap * >::iterator aIt = m_allocatedPixmaps.begin(); + QLinkedList< AllocatedPixmap * >::iterator aEnd = m_allocatedPixmaps.end(); for ( ; aIt != aEnd; ++aIt ) if ( (*aIt)->page == req->pageNumber() && (*aIt)->id == req->id() ) { AllocatedPixmap * p = *aIt; - m_allocatedPixmapsFifo.erase( aIt ); + m_allocatedPixmaps.erase( aIt ); m_allocatedPixmapsTotalMemory -= p->memory; delete p; break; @@ -3854,7 +3855,7 @@ void DocumentPrivate::requestDone( PixmapRequest * req ) // [MEM] 1.2 append memory allocation descriptor to the FIFO qulonglong memoryBytes = 4 * req->width() * req->height(); AllocatedPixmap * memoryPage = new AllocatedPixmap( req->id(), req->pageNumber(), memoryBytes ); - m_allocatedPixmapsFifo.append( memoryPage ); + m_allocatedPixmaps.append( memoryPage ); m_allocatedPixmapsTotalMemory += memoryBytes; // 2. notify an observer that its pixmap changed @@ -3989,11 +3990,8 @@ void Document::setPageSize( const PageSize &size ) for ( ; pIt != pEnd; ++pIt ) (*pIt)->d->changeSize( size ); // clear 'memory allocation' descriptors - QLinkedList< AllocatedPixmap * >::const_iterator aIt = d->m_allocatedPixmapsFifo.constBegin(); - QLinkedList< AllocatedPixmap * >::const_iterator aEnd = d->m_allocatedPixmapsFifo.constEnd(); - for ( ; aIt != aEnd; ++aIt ) - delete *aIt; - d->m_allocatedPixmapsFifo.clear(); + qDeleteAll( d->m_allocatedPixmaps ); + d->m_allocatedPixmaps.clear(); d->m_allocatedPixmapsTotalMemory = 0; // notify the generator that the current page size has changed d->m_generator->pageSizeChanged( size, d->m_pageSize ); diff --git a/core/document_p.h b/core/document_p.h index 48e91fd16..98ba0f3a8 100644 --- a/core/document_p.h +++ b/core/document_p.h @@ -96,6 +96,7 @@ class DocumentPrivate QString pagesSizeString() const; QString localizedSize(const QSizeF &size) const; void cleanupPixmapMemory( qulonglong bytesOffset = 0 ); + AllocatedPixmap * searchLowestPriorityUnloadablePixmap( bool thenRemoveIt = false ); void calculateMaxTextPages(); qulonglong getTotalMemory(); qulonglong getFreeMemory( qulonglong *freeSwap = 0 ); @@ -186,7 +187,7 @@ class DocumentPrivate QLinkedList< PixmapRequest * > m_pixmapRequestsStack; QLinkedList< PixmapRequest * > m_executingPixmapRequests; QMutex m_pixmapRequestsMutex; - QLinkedList< AllocatedPixmap * > m_allocatedPixmapsFifo; + QLinkedList< AllocatedPixmap * > m_allocatedPixmaps; qulonglong m_allocatedPixmapsTotalMemory; QList< int > m_allocatedTextPagesFifo; int m_maxAllocatedTextPages; From 00afec8617b26bf460165b6cf2fa86a3845fdd9d Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Mon, 2 Jul 2012 01:19:32 +0200 Subject: [PATCH 063/155] Refactoring of cleanupPixmapMemory memoryToFree calculation now lives in DocumentPrivate::calculateMemoryToFree() --- core/document.cpp | 14 ++++++++++++-- core/document_p.h | 4 +++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index 9bb27ae1a..3200ebdb3 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -173,7 +173,7 @@ QString DocumentPrivate::localizedSize(const QSizeF &size) const } } -void DocumentPrivate::cleanupPixmapMemory( qulonglong /*sure? bytesOffset*/ ) +qulonglong DocumentPrivate::calculateMemoryToFree() { // [MEM] choose memory parameters based on configuration profile qulonglong clipValue = 0; @@ -213,6 +213,16 @@ void DocumentPrivate::cleanupPixmapMemory( qulonglong /*sure? bytesOffset*/ ) if ( clipValue > memoryToFree ) memoryToFree = clipValue; + return memoryToFree; +} + +void DocumentPrivate::cleanupPixmapMemory() +{ + cleanupPixmapMemory( calculateMemoryToFree() ); +} + +void DocumentPrivate::cleanupPixmapMemory( qulonglong memoryToFree ) +{ if ( memoryToFree > 0 ) { // [MEM] free memory starting from older pixmaps @@ -1004,7 +1014,7 @@ void DocumentPrivate::sendGeneratorRequest() // [MEM] preventive memory freeing qulonglong pixmapBytes = 4 * request->width() * request->height(); if ( pixmapBytes > (1024 * 1024) ) - cleanupPixmapMemory( pixmapBytes ); + cleanupPixmapMemory(); // submit the request to the generator if ( m_generator->canGeneratePixmap() ) diff --git a/core/document_p.h b/core/document_p.h index 98ba0f3a8..54e922d32 100644 --- a/core/document_p.h +++ b/core/document_p.h @@ -95,7 +95,9 @@ class DocumentPrivate // private methods QString pagesSizeString() const; QString localizedSize(const QSizeF &size) const; - void cleanupPixmapMemory( qulonglong bytesOffset = 0 ); + qulonglong calculateMemoryToFree(); + void cleanupPixmapMemory(); + void cleanupPixmapMemory( qulonglong memoryToFree ); AllocatedPixmap * searchLowestPriorityUnloadablePixmap( bool thenRemoveIt = false ); void calculateMaxTextPages(); qulonglong getTotalMemory(); From 569c9b84cecdef0d7fb7cc3af0a007662a97cece Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Mon, 2 Jul 2012 08:22:51 +0200 Subject: [PATCH 064/155] Before preloading pixmaps check that they fit in cache --- core/document.cpp | 25 ++++++++++++++++++++++++- core/generator.cpp | 14 ++++++++++++++ core/generator_p.h | 1 + 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/core/document.cpp b/core/document.cpp index 3200ebdb3..f6bf699a7 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -11,6 +11,7 @@ #include "document.h" #include "document_p.h" +#include #ifdef Q_OS_WIN #define _WIN32_WINNT 0x0500 #include @@ -973,6 +974,20 @@ void DocumentPrivate::slotTimedMemoryCheck() void DocumentPrivate::sendGeneratorRequest() { + /* If the pixmap cache will have to be cleaned in order to make room for the + * next request, get the distance from the current viewport of the page + * whose pixmap will be removed. We will ignore preload requests for pages + * that are at the same distance or farther */ + const qulonglong memoryToFree = calculateMemoryToFree(); + const int currentViewportPage = (*m_viewportIterator).pageNumber; + int maxDistance = INT_MAX; // Default: No maximum + if ( memoryToFree ) + { + AllocatedPixmap *pixmapToReplace = searchLowestPriorityUnloadablePixmap(); + if ( pixmapToReplace ) + maxDistance = qAbs( pixmapToReplace->page - currentViewportPage ); + } + // find a request PixmapRequest * request = 0; m_pixmapRequestsMutex.lock(); @@ -1000,8 +1015,16 @@ void DocumentPrivate::sendGeneratorRequest() } delete r; } + else if ( !r->d->mForce && r->d->isPreload() && qAbs( r->pageNumber() - currentViewportPage ) >= maxDistance ) + { + m_pixmapRequestsStack.pop_back(); + //kDebug() << "Ignoring request that doesn't fit in cache"; + delete r; + } else + { request = r; + } } // if no request found (or already generated), return @@ -1014,7 +1037,7 @@ void DocumentPrivate::sendGeneratorRequest() // [MEM] preventive memory freeing qulonglong pixmapBytes = 4 * request->width() * request->height(); if ( pixmapBytes > (1024 * 1024) ) - cleanupPixmapMemory(); + cleanupPixmapMemory( memoryToFree /* previously calculated value */ ); // submit the request to the generator if ( m_generator->canGeneratePixmap() ) diff --git a/core/generator.cpp b/core/generator.cpp index 17b5e6309..0073943a0 100644 --- a/core/generator.cpp +++ b/core/generator.cpp @@ -10,6 +10,7 @@ #include "generator.h" #include "generator_p.h" +#include "observer.h" #include #include @@ -477,6 +478,19 @@ void PixmapRequestPrivate::swap() qSwap( mWidth, mHeight ); } +bool PixmapRequestPrivate::isPreload() const +{ + switch ( mPriority ) + { + case PAGEVIEW_PRELOAD_PRIO: + case THUMBNAILS_PRELOAD_PRIO: + case PRESENTATION_PRELOAD_PRIO: + return true; + default: + return false; + } +} + class Okular::ExportFormatPrivate : public QSharedData { public: diff --git a/core/generator_p.h b/core/generator_p.h index f2d746a19..775da7f5b 100644 --- a/core/generator_p.h +++ b/core/generator_p.h @@ -70,6 +70,7 @@ class PixmapRequestPrivate { public: void swap(); + bool isPreload() const; int mId; int mPageNumber; From 47e796c9801667bd9e9512a511a1e7f2ebcbb388 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Mon, 2 Jul 2012 08:28:23 +0200 Subject: [PATCH 065/155] pageview: Send pixmap preload requests in order of increasing distance from the viewport (instead of requesting everything past it till the end of the document, and then starting to load backwards) --- ui/pageview.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ui/pageview.cpp b/ui/pageview.cpp index 0015aa19e..ec29bf0e6 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -4019,10 +4019,7 @@ void PageView::slotRequestVisiblePixmaps( int newValue ) requestedPixmaps.push_back( new Okular::PixmapRequest( PAGEVIEW_ID, i->pageNumber(), i->uncroppedWidth(), i->uncroppedHeight(), PAGEVIEW_PRELOAD_PRIO, true ) ); } - } - for( int j = 1; j <= pagesToPreload; j++ ) - { // add the page before the 'visible series' in preload int headRequest = d->visibleItems.first()->pageNumber() - j; if ( headRequest >= 0 ) @@ -4033,6 +4030,10 @@ void PageView::slotRequestVisiblePixmaps( int newValue ) requestedPixmaps.push_back( new Okular::PixmapRequest( PAGEVIEW_ID, i->pageNumber(), i->uncroppedWidth(), i->uncroppedHeight(), PAGEVIEW_PRELOAD_PRIO, true ) ); } + + // stop if we've already reached both ends of the document + if ( headRequest < 0 && tailRequest >= (int)d->items.count() ) + break; } } From 2e2d9c4d66af5a4cf248db3ac8a607fa1b99b3fe Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Mon, 2 Jul 2012 20:57:33 +0200 Subject: [PATCH 066/155] presentationwidget: Send pixmap preload requests in order of increasing distance from the viewport (instead of requesting everything from page zero to the end) --- ui/presentationwidget.cpp | 47 +++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/ui/presentationwidget.cpp b/ui/presentationwidget.cpp index fad832698..f4da5390c 100644 --- a/ui/presentationwidget.cpp +++ b/ui/presentationwidget.cpp @@ -1191,34 +1191,37 @@ void PresentationWidget::requestPixmaps() // ask for next and previous page if not in low memory usage setting if ( Okular::Settings::memoryLevel() != Okular::Settings::EnumMemoryLevel::Low && Okular::Settings::enableThreading() ) { - if ( m_frameIndex + 1 < (int)m_document->pages() ) - { - PresentationFrame *nextFrame = m_frames[ m_frameIndex + 1 ]; - pixW = nextFrame->geometry.width(); - pixH = nextFrame->geometry.height(); - if ( !nextFrame->page->hasPixmap( PRESENTATION_ID, pixW, pixH ) ) - requests.push_back( new Okular::PixmapRequest( PRESENTATION_ID, m_frameIndex + 1, pixW, pixH, PRESENTATION_PRELOAD_PRIO, true ) ); - } - if ( m_frameIndex - 1 >= 0 ) - { - PresentationFrame *prevFrame = m_frames[ m_frameIndex - 1 ]; - pixW = prevFrame->geometry.width(); - pixH = prevFrame->geometry.height(); - if ( !prevFrame->page->hasPixmap( PRESENTATION_ID, pixW, pixH ) ) - requests.push_back( new Okular::PixmapRequest( PRESENTATION_ID, m_frameIndex - 1, pixW, pixH, PRESENTATION_PRELOAD_PRIO, true ) ); - } + int pagesToPreload = 1; // If greedy, preload everything if (Okular::Settings::memoryLevel() == Okular::Settings::EnumMemoryLevel::Greedy) + pagesToPreload = (int)m_document->pages(); + + for( int j = 1; j <= pagesToPreload; j++ ) { - for(int i = 0; i < (int)m_document->pages(); ++i) + int tailRequest = m_frameIndex + j; + if ( tailRequest < (int)m_document->pages() ) { - PresentationFrame *loopFrame = m_frames[ i ]; - pixW = loopFrame->geometry.width(); - pixH = loopFrame->geometry.height(); - if ( !loopFrame->page->hasPixmap( PRESENTATION_ID, pixW, pixH )) - requests.push_back( new Okular::PixmapRequest( PRESENTATION_ID, i, pixW, pixH, PRESENTATION_PRELOAD_PRIO, true ) ); + PresentationFrame *nextFrame = m_frames[ tailRequest ]; + pixW = nextFrame->geometry.width(); + pixH = nextFrame->geometry.height(); + if ( !nextFrame->page->hasPixmap( PRESENTATION_ID, pixW, pixH ) ) + requests.push_back( new Okular::PixmapRequest( PRESENTATION_ID, tailRequest, pixW, pixH, PRESENTATION_PRELOAD_PRIO, true ) ); } + + int headRequest = m_frameIndex - j; + if ( headRequest >= 0 ) + { + PresentationFrame *prevFrame = m_frames[ headRequest ]; + pixW = prevFrame->geometry.width(); + pixH = prevFrame->geometry.height(); + if ( !prevFrame->page->hasPixmap( PRESENTATION_ID, pixW, pixH ) ) + requests.push_back( new Okular::PixmapRequest( PRESENTATION_ID, headRequest, pixW, pixH, PRESENTATION_PRELOAD_PRIO, true ) ); + } + + // stop if we've already reached both ends of the document + if ( headRequest < 0 && tailRequest >= (int)m_document->pages() ) + break; } } m_document->requestPixmaps( requests ); From 37bb875c307af1ee7ecfaee048f24bcf7309b642 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Mon, 2 Jul 2012 01:05:02 +0200 Subject: [PATCH 067/155] Clean pixmap cache in order of descreasing distance from current viewport Previously it was cleaned in FIFO order I also moved the pixmap selection logic in a separate function, that will be needed in the next patches. Note: This behaviour is yet not optimal for the thumbnails panel, because it is allowed to be at a page different than the current viewport --- core/document.cpp | 146 +++++++++++++++++++++++----------------------- core/document_p.h | 3 +- 2 files changed, 74 insertions(+), 75 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index a51b86ed8..9bb27ae1a 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -217,35 +217,66 @@ void DocumentPrivate::cleanupPixmapMemory( qulonglong /*sure? bytesOffset*/ ) { // [MEM] free memory starting from older pixmaps int pagesFreed = 0; - QLinkedList< AllocatedPixmap * >::iterator pIt = m_allocatedPixmapsFifo.begin(); - QLinkedList< AllocatedPixmap * >::iterator pEnd = m_allocatedPixmapsFifo.end(); - while ( (pIt != pEnd) && (memoryToFree > 0) ) + while ( memoryToFree > 0 ) { - AllocatedPixmap * p = *pIt; - if ( m_observers.value( p->id )->canUnloadPixmap( p->page ) ) - { - // update internal variables - pIt = m_allocatedPixmapsFifo.erase( pIt ); - // m_allocatedPixmapsTotalMemory can't underflow because we always add or remove - // the memory used by the AllocatedPixmap so at most it can reach zero - m_allocatedPixmapsTotalMemory -= p->memory; - // Make sure memoryToFree does not underflow - if ( p->memory > memoryToFree ) - memoryToFree = 0; - else - memoryToFree -= p->memory; - pagesFreed++; - // delete pixmap - m_pagesVector.at( p->page )->deletePixmap( p->id ); - // delete allocation descriptor - delete p; - } else - ++pIt; + AllocatedPixmap * p = searchLowestPriorityUnloadablePixmap( true ); + if ( !p ) // No pixmap to remove + break; + + kDebug().nospace() << "Evicting cache pixmap id=" << p->id << " page=" << p->page; + + // m_allocatedPixmapsTotalMemory can't underflow because we always add or remove + // the memory used by the AllocatedPixmap so at most it can reach zero + m_allocatedPixmapsTotalMemory -= p->memory; + // Make sure memoryToFree does not underflow + if ( p->memory > memoryToFree ) + memoryToFree = 0; + else + memoryToFree -= p->memory; + pagesFreed++; + // delete pixmap + m_pagesVector.at( p->page )->deletePixmap( p->id ); + // delete allocation descriptor + delete p; } - //p--rintf("freeMemory A:[%d -%d = %d] \n", m_allocatedPixmapsFifo.count() + pagesFreed, pagesFreed, m_allocatedPixmapsFifo.count() ); + //p--rintf("freeMemory A:[%d -%d = %d] \n", m_allocatedPixmaps.count() + pagesFreed, pagesFreed, m_allocatedPixmaps.count() ); } } +/* Returns the next pixmap to evict from cache, or NULL if no suitable pixmap + * is found. If thenRemoveIt is set, the pixmap is removed from + * m_allocatedPixmaps before returning it */ +AllocatedPixmap * DocumentPrivate::searchLowestPriorityUnloadablePixmap( bool thenRemoveIt ) +{ + QLinkedList< AllocatedPixmap * >::iterator pIt = m_allocatedPixmaps.begin(); + QLinkedList< AllocatedPixmap * >::iterator pEnd = m_allocatedPixmaps.end(); + QLinkedList< AllocatedPixmap * >::iterator farthestPixmap = pEnd; + const int currentViewportPage = (*m_viewportIterator).pageNumber; + + /* Find the pixmap that is farthest from the current viewport */ + int maxDistance = -1; + while ( pIt != pEnd ) + { + const AllocatedPixmap * p = *pIt; + const int distance = qAbs( p->page - currentViewportPage ); + if ( maxDistance < distance && m_observers.value( p->id )->canUnloadPixmap( p->page ) ) + { + maxDistance = distance; + farthestPixmap = pIt; + } + ++pIt; + } + + /* No pixmap to remove */ + if ( farthestPixmap == pEnd ) + return 0; + + AllocatedPixmap * selectedPixmap = *farthestPixmap; + if ( thenRemoveIt ) + m_allocatedPixmaps.erase( farthestPixmap ); + return selectedPixmap; +} + qulonglong DocumentPrivate::getTotalMemory() { static qulonglong cachedValue = 0; @@ -1058,11 +1089,8 @@ void DocumentPrivate::slotGeneratorConfigChanged( const QString& ) } // [MEM] remove allocation descriptors - QLinkedList< AllocatedPixmap * >::const_iterator aIt = m_allocatedPixmapsFifo.constBegin(); - QLinkedList< AllocatedPixmap * >::const_iterator aEnd = m_allocatedPixmapsFifo.constEnd(); - for ( ; aIt != aEnd; ++aIt ) - delete *aIt; - m_allocatedPixmapsFifo.clear(); + qDeleteAll( m_allocatedPixmaps ); + m_allocatedPixmaps.clear(); m_allocatedPixmapsTotalMemory = 0; // send reload signals to observers @@ -1071,7 +1099,7 @@ void DocumentPrivate::slotGeneratorConfigChanged( const QString& ) // free memory if in 'low' profile if ( Settings::memoryLevel() == Settings::EnumMemoryLevel::Low && - !m_allocatedPixmapsFifo.isEmpty() && !m_pagesVector.isEmpty() ) + !m_allocatedPixmaps.isEmpty() && !m_pagesVector.isEmpty() ) cleanupPixmapMemory(); } @@ -1921,11 +1949,8 @@ void Document::closeDocument() d->m_pagesVector.clear(); // clear 'memory allocation' descriptors - QLinkedList< AllocatedPixmap * >::const_iterator aIt = d->m_allocatedPixmapsFifo.constBegin(); - QLinkedList< AllocatedPixmap * >::const_iterator aEnd = d->m_allocatedPixmapsFifo.constEnd(); - for ( ; aIt != aEnd; ++aIt ) - delete *aIt; - d->m_allocatedPixmapsFifo.clear(); + qDeleteAll( d->m_allocatedPixmaps ); + d->m_allocatedPixmaps.clear(); // clear 'running searches' descriptors QMap< int, RunningSearch * >::const_iterator rIt = d->m_searches.constBegin(); @@ -1983,14 +2008,14 @@ void Document::removeObserver( DocumentObserver * pObserver ) (*it)->deletePixmap( observerId ); // [MEM] free observer's allocation descriptors - QLinkedList< AllocatedPixmap * >::iterator aIt = d->m_allocatedPixmapsFifo.begin(); - QLinkedList< AllocatedPixmap * >::iterator aEnd = d->m_allocatedPixmapsFifo.end(); + QLinkedList< AllocatedPixmap * >::iterator aIt = d->m_allocatedPixmaps.begin(); + QLinkedList< AllocatedPixmap * >::iterator aEnd = d->m_allocatedPixmaps.end(); while ( aIt != aEnd ) { AllocatedPixmap * p = *aIt; if ( p->id == observerId ) { - aIt = d->m_allocatedPixmapsFifo.erase( aIt ); + aIt = d->m_allocatedPixmaps.erase( aIt ); delete p; } else @@ -2021,11 +2046,8 @@ void Document::reparseConfig() } // [MEM] remove allocation descriptors - QLinkedList< AllocatedPixmap * >::const_iterator aIt = d->m_allocatedPixmapsFifo.constBegin(); - QLinkedList< AllocatedPixmap * >::const_iterator aEnd = d->m_allocatedPixmapsFifo.constEnd(); - for ( ; aIt != aEnd; ++aIt ) - delete *aIt; - d->m_allocatedPixmapsFifo.clear(); + qDeleteAll( d->m_allocatedPixmaps ); + d->m_allocatedPixmaps.clear(); d->m_allocatedPixmapsTotalMemory = 0; // send reload signals to observers @@ -2034,7 +2056,7 @@ void Document::reparseConfig() // free memory if in 'low' profile if ( Settings::memoryLevel() == Settings::EnumMemoryLevel::Low && - !d->m_allocatedPixmapsFifo.isEmpty() && !d->m_pagesVector.isEmpty() ) + !d->m_allocatedPixmaps.isEmpty() && !d->m_pagesVector.isEmpty() ) d->cleanupPixmapMemory(); } @@ -2757,27 +2779,6 @@ void Document::setViewport( const DocumentViewport & viewport, int excludeId, bo for ( ; it != end ; ++ it ) if ( it.key() != excludeId ) (*it)->notifyViewportChanged( smoothMove ); - - // [MEM] raise position of currently viewed page in allocation queue - if ( d->m_allocatedPixmapsFifo.count() > 1 ) - { - const int page = viewport.pageNumber; - QLinkedList< AllocatedPixmap * > viewportPixmaps; - QLinkedList< AllocatedPixmap * >::iterator aIt = d->m_allocatedPixmapsFifo.begin(); - QLinkedList< AllocatedPixmap * >::iterator aEnd = d->m_allocatedPixmapsFifo.end(); - while ( aIt != aEnd ) - { - if ( (*aIt)->page == page ) - { - viewportPixmaps.append( *aIt ); - aIt = d->m_allocatedPixmapsFifo.erase( aIt ); - continue; - } - ++aIt; - } - if ( !viewportPixmaps.isEmpty() ) - d->m_allocatedPixmapsFifo += viewportPixmaps; - } } void Document::setZoom(int factor, int excludeId) @@ -3836,13 +3837,13 @@ void DocumentPrivate::requestDone( PixmapRequest * req ) #endif // [MEM] 1.1 find and remove a previous entry for the same page and id - QLinkedList< AllocatedPixmap * >::iterator aIt = m_allocatedPixmapsFifo.begin(); - QLinkedList< AllocatedPixmap * >::iterator aEnd = m_allocatedPixmapsFifo.end(); + QLinkedList< AllocatedPixmap * >::iterator aIt = m_allocatedPixmaps.begin(); + QLinkedList< AllocatedPixmap * >::iterator aEnd = m_allocatedPixmaps.end(); for ( ; aIt != aEnd; ++aIt ) if ( (*aIt)->page == req->pageNumber() && (*aIt)->id == req->id() ) { AllocatedPixmap * p = *aIt; - m_allocatedPixmapsFifo.erase( aIt ); + m_allocatedPixmaps.erase( aIt ); m_allocatedPixmapsTotalMemory -= p->memory; delete p; break; @@ -3854,7 +3855,7 @@ void DocumentPrivate::requestDone( PixmapRequest * req ) // [MEM] 1.2 append memory allocation descriptor to the FIFO qulonglong memoryBytes = 4 * req->width() * req->height(); AllocatedPixmap * memoryPage = new AllocatedPixmap( req->id(), req->pageNumber(), memoryBytes ); - m_allocatedPixmapsFifo.append( memoryPage ); + m_allocatedPixmaps.append( memoryPage ); m_allocatedPixmapsTotalMemory += memoryBytes; // 2. notify an observer that its pixmap changed @@ -3989,11 +3990,8 @@ void Document::setPageSize( const PageSize &size ) for ( ; pIt != pEnd; ++pIt ) (*pIt)->d->changeSize( size ); // clear 'memory allocation' descriptors - QLinkedList< AllocatedPixmap * >::const_iterator aIt = d->m_allocatedPixmapsFifo.constBegin(); - QLinkedList< AllocatedPixmap * >::const_iterator aEnd = d->m_allocatedPixmapsFifo.constEnd(); - for ( ; aIt != aEnd; ++aIt ) - delete *aIt; - d->m_allocatedPixmapsFifo.clear(); + qDeleteAll( d->m_allocatedPixmaps ); + d->m_allocatedPixmaps.clear(); d->m_allocatedPixmapsTotalMemory = 0; // notify the generator that the current page size has changed d->m_generator->pageSizeChanged( size, d->m_pageSize ); diff --git a/core/document_p.h b/core/document_p.h index 48e91fd16..98ba0f3a8 100644 --- a/core/document_p.h +++ b/core/document_p.h @@ -96,6 +96,7 @@ class DocumentPrivate QString pagesSizeString() const; QString localizedSize(const QSizeF &size) const; void cleanupPixmapMemory( qulonglong bytesOffset = 0 ); + AllocatedPixmap * searchLowestPriorityUnloadablePixmap( bool thenRemoveIt = false ); void calculateMaxTextPages(); qulonglong getTotalMemory(); qulonglong getFreeMemory( qulonglong *freeSwap = 0 ); @@ -186,7 +187,7 @@ class DocumentPrivate QLinkedList< PixmapRequest * > m_pixmapRequestsStack; QLinkedList< PixmapRequest * > m_executingPixmapRequests; QMutex m_pixmapRequestsMutex; - QLinkedList< AllocatedPixmap * > m_allocatedPixmapsFifo; + QLinkedList< AllocatedPixmap * > m_allocatedPixmaps; qulonglong m_allocatedPixmapsTotalMemory; QList< int > m_allocatedTextPagesFifo; int m_maxAllocatedTextPages; From 36108c509e52ebf5e3bc9e3c21e7729e151dd950 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Mon, 2 Jul 2012 01:19:32 +0200 Subject: [PATCH 068/155] Refactoring of cleanupPixmapMemory memoryToFree calculation now lives in DocumentPrivate::calculateMemoryToFree() --- core/document.cpp | 14 ++++++++++++-- core/document_p.h | 4 +++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index 9bb27ae1a..3200ebdb3 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -173,7 +173,7 @@ QString DocumentPrivate::localizedSize(const QSizeF &size) const } } -void DocumentPrivate::cleanupPixmapMemory( qulonglong /*sure? bytesOffset*/ ) +qulonglong DocumentPrivate::calculateMemoryToFree() { // [MEM] choose memory parameters based on configuration profile qulonglong clipValue = 0; @@ -213,6 +213,16 @@ void DocumentPrivate::cleanupPixmapMemory( qulonglong /*sure? bytesOffset*/ ) if ( clipValue > memoryToFree ) memoryToFree = clipValue; + return memoryToFree; +} + +void DocumentPrivate::cleanupPixmapMemory() +{ + cleanupPixmapMemory( calculateMemoryToFree() ); +} + +void DocumentPrivate::cleanupPixmapMemory( qulonglong memoryToFree ) +{ if ( memoryToFree > 0 ) { // [MEM] free memory starting from older pixmaps @@ -1004,7 +1014,7 @@ void DocumentPrivate::sendGeneratorRequest() // [MEM] preventive memory freeing qulonglong pixmapBytes = 4 * request->width() * request->height(); if ( pixmapBytes > (1024 * 1024) ) - cleanupPixmapMemory( pixmapBytes ); + cleanupPixmapMemory(); // submit the request to the generator if ( m_generator->canGeneratePixmap() ) diff --git a/core/document_p.h b/core/document_p.h index 98ba0f3a8..54e922d32 100644 --- a/core/document_p.h +++ b/core/document_p.h @@ -95,7 +95,9 @@ class DocumentPrivate // private methods QString pagesSizeString() const; QString localizedSize(const QSizeF &size) const; - void cleanupPixmapMemory( qulonglong bytesOffset = 0 ); + qulonglong calculateMemoryToFree(); + void cleanupPixmapMemory(); + void cleanupPixmapMemory( qulonglong memoryToFree ); AllocatedPixmap * searchLowestPriorityUnloadablePixmap( bool thenRemoveIt = false ); void calculateMaxTextPages(); qulonglong getTotalMemory(); From b78aa89d120ec24de6a034139d9e75f93959c3e7 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Mon, 2 Jul 2012 08:22:51 +0200 Subject: [PATCH 069/155] Before preloading pixmaps check that they fit in cache --- core/document.cpp | 25 ++++++++++++++++++++++++- core/generator.cpp | 14 ++++++++++++++ core/generator_p.h | 1 + 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/core/document.cpp b/core/document.cpp index 3200ebdb3..f6bf699a7 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -11,6 +11,7 @@ #include "document.h" #include "document_p.h" +#include #ifdef Q_OS_WIN #define _WIN32_WINNT 0x0500 #include @@ -973,6 +974,20 @@ void DocumentPrivate::slotTimedMemoryCheck() void DocumentPrivate::sendGeneratorRequest() { + /* If the pixmap cache will have to be cleaned in order to make room for the + * next request, get the distance from the current viewport of the page + * whose pixmap will be removed. We will ignore preload requests for pages + * that are at the same distance or farther */ + const qulonglong memoryToFree = calculateMemoryToFree(); + const int currentViewportPage = (*m_viewportIterator).pageNumber; + int maxDistance = INT_MAX; // Default: No maximum + if ( memoryToFree ) + { + AllocatedPixmap *pixmapToReplace = searchLowestPriorityUnloadablePixmap(); + if ( pixmapToReplace ) + maxDistance = qAbs( pixmapToReplace->page - currentViewportPage ); + } + // find a request PixmapRequest * request = 0; m_pixmapRequestsMutex.lock(); @@ -1000,8 +1015,16 @@ void DocumentPrivate::sendGeneratorRequest() } delete r; } + else if ( !r->d->mForce && r->d->isPreload() && qAbs( r->pageNumber() - currentViewportPage ) >= maxDistance ) + { + m_pixmapRequestsStack.pop_back(); + //kDebug() << "Ignoring request that doesn't fit in cache"; + delete r; + } else + { request = r; + } } // if no request found (or already generated), return @@ -1014,7 +1037,7 @@ void DocumentPrivate::sendGeneratorRequest() // [MEM] preventive memory freeing qulonglong pixmapBytes = 4 * request->width() * request->height(); if ( pixmapBytes > (1024 * 1024) ) - cleanupPixmapMemory(); + cleanupPixmapMemory( memoryToFree /* previously calculated value */ ); // submit the request to the generator if ( m_generator->canGeneratePixmap() ) diff --git a/core/generator.cpp b/core/generator.cpp index 17b5e6309..0073943a0 100644 --- a/core/generator.cpp +++ b/core/generator.cpp @@ -10,6 +10,7 @@ #include "generator.h" #include "generator_p.h" +#include "observer.h" #include #include @@ -477,6 +478,19 @@ void PixmapRequestPrivate::swap() qSwap( mWidth, mHeight ); } +bool PixmapRequestPrivate::isPreload() const +{ + switch ( mPriority ) + { + case PAGEVIEW_PRELOAD_PRIO: + case THUMBNAILS_PRELOAD_PRIO: + case PRESENTATION_PRELOAD_PRIO: + return true; + default: + return false; + } +} + class Okular::ExportFormatPrivate : public QSharedData { public: diff --git a/core/generator_p.h b/core/generator_p.h index f2d746a19..775da7f5b 100644 --- a/core/generator_p.h +++ b/core/generator_p.h @@ -70,6 +70,7 @@ class PixmapRequestPrivate { public: void swap(); + bool isPreload() const; int mId; int mPageNumber; From a022d124e61a8c7d38a598abc36bad46bc8a828b Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Mon, 2 Jul 2012 08:28:23 +0200 Subject: [PATCH 070/155] pageview: Send pixmap preload requests in order of increasing distance from the viewport (instead of requesting everything past it till the end of the document, and then starting to load backwards) --- ui/pageview.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ui/pageview.cpp b/ui/pageview.cpp index 0015aa19e..ec29bf0e6 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -4019,10 +4019,7 @@ void PageView::slotRequestVisiblePixmaps( int newValue ) requestedPixmaps.push_back( new Okular::PixmapRequest( PAGEVIEW_ID, i->pageNumber(), i->uncroppedWidth(), i->uncroppedHeight(), PAGEVIEW_PRELOAD_PRIO, true ) ); } - } - for( int j = 1; j <= pagesToPreload; j++ ) - { // add the page before the 'visible series' in preload int headRequest = d->visibleItems.first()->pageNumber() - j; if ( headRequest >= 0 ) @@ -4033,6 +4030,10 @@ void PageView::slotRequestVisiblePixmaps( int newValue ) requestedPixmaps.push_back( new Okular::PixmapRequest( PAGEVIEW_ID, i->pageNumber(), i->uncroppedWidth(), i->uncroppedHeight(), PAGEVIEW_PRELOAD_PRIO, true ) ); } + + // stop if we've already reached both ends of the document + if ( headRequest < 0 && tailRequest >= (int)d->items.count() ) + break; } } From ff1630fb17583c3d590d6744fbc4d3eaf2c299a2 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Mon, 2 Jul 2012 20:57:33 +0200 Subject: [PATCH 071/155] presentationwidget: Send pixmap preload requests in order of increasing distance from the viewport (instead of requesting everything from page zero to the end) --- ui/presentationwidget.cpp | 47 +++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/ui/presentationwidget.cpp b/ui/presentationwidget.cpp index fad832698..f4da5390c 100644 --- a/ui/presentationwidget.cpp +++ b/ui/presentationwidget.cpp @@ -1191,34 +1191,37 @@ void PresentationWidget::requestPixmaps() // ask for next and previous page if not in low memory usage setting if ( Okular::Settings::memoryLevel() != Okular::Settings::EnumMemoryLevel::Low && Okular::Settings::enableThreading() ) { - if ( m_frameIndex + 1 < (int)m_document->pages() ) - { - PresentationFrame *nextFrame = m_frames[ m_frameIndex + 1 ]; - pixW = nextFrame->geometry.width(); - pixH = nextFrame->geometry.height(); - if ( !nextFrame->page->hasPixmap( PRESENTATION_ID, pixW, pixH ) ) - requests.push_back( new Okular::PixmapRequest( PRESENTATION_ID, m_frameIndex + 1, pixW, pixH, PRESENTATION_PRELOAD_PRIO, true ) ); - } - if ( m_frameIndex - 1 >= 0 ) - { - PresentationFrame *prevFrame = m_frames[ m_frameIndex - 1 ]; - pixW = prevFrame->geometry.width(); - pixH = prevFrame->geometry.height(); - if ( !prevFrame->page->hasPixmap( PRESENTATION_ID, pixW, pixH ) ) - requests.push_back( new Okular::PixmapRequest( PRESENTATION_ID, m_frameIndex - 1, pixW, pixH, PRESENTATION_PRELOAD_PRIO, true ) ); - } + int pagesToPreload = 1; // If greedy, preload everything if (Okular::Settings::memoryLevel() == Okular::Settings::EnumMemoryLevel::Greedy) + pagesToPreload = (int)m_document->pages(); + + for( int j = 1; j <= pagesToPreload; j++ ) { - for(int i = 0; i < (int)m_document->pages(); ++i) + int tailRequest = m_frameIndex + j; + if ( tailRequest < (int)m_document->pages() ) { - PresentationFrame *loopFrame = m_frames[ i ]; - pixW = loopFrame->geometry.width(); - pixH = loopFrame->geometry.height(); - if ( !loopFrame->page->hasPixmap( PRESENTATION_ID, pixW, pixH )) - requests.push_back( new Okular::PixmapRequest( PRESENTATION_ID, i, pixW, pixH, PRESENTATION_PRELOAD_PRIO, true ) ); + PresentationFrame *nextFrame = m_frames[ tailRequest ]; + pixW = nextFrame->geometry.width(); + pixH = nextFrame->geometry.height(); + if ( !nextFrame->page->hasPixmap( PRESENTATION_ID, pixW, pixH ) ) + requests.push_back( new Okular::PixmapRequest( PRESENTATION_ID, tailRequest, pixW, pixH, PRESENTATION_PRELOAD_PRIO, true ) ); } + + int headRequest = m_frameIndex - j; + if ( headRequest >= 0 ) + { + PresentationFrame *prevFrame = m_frames[ headRequest ]; + pixW = prevFrame->geometry.width(); + pixH = prevFrame->geometry.height(); + if ( !prevFrame->page->hasPixmap( PRESENTATION_ID, pixW, pixH ) ) + requests.push_back( new Okular::PixmapRequest( PRESENTATION_ID, headRequest, pixW, pixH, PRESENTATION_PRELOAD_PRIO, true ) ); + } + + // stop if we've already reached both ends of the document + if ( headRequest < 0 && tailRequest >= (int)m_document->pages() ) + break; } } m_document->requestPixmaps( requests ); From 8ab7683ea1499b71eec16c07d16fdaf688f99da3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20D=C3=B6rner?= Date: Tue, 10 Jul 2012 17:45:23 +0100 Subject: [PATCH 072/155] Let additional mouse buttons trigger history navigation This is consistent with a recent change in Dolphin and with what browsers have been doing for a long time. REVIEW: 105440 DIGEST: --- part.cpp | 2 ++ ui/pageview.cpp | 12 ++++++++++++ ui/pageview.h | 2 ++ 3 files changed, 16 insertions(+) diff --git a/part.cpp b/part.cpp index 83558c35e..ce1db4d6f 100644 --- a/part.cpp +++ b/part.cpp @@ -2561,9 +2561,11 @@ void Part::unsetDummyMode() // add back and next in history m_historyBack = KStandardAction::documentBack( this, SLOT(slotHistoryBack()), actionCollection() ); m_historyBack->setWhatsThis( i18n( "Go to the place you were before" ) ); + connect(m_pageView, SIGNAL(mouseBackButtonClick()), m_historyBack, SLOT(trigger())); m_historyNext = KStandardAction::documentForward( this, SLOT(slotHistoryNext()), actionCollection()); m_historyNext->setWhatsThis( i18n( "Go to the place you were after" ) ); + connect(m_pageView, SIGNAL(mouseForwardButtonClick()), m_historyNext, SLOT(trigger())); m_pageView->setupActions( actionCollection() ); diff --git a/ui/pageview.cpp b/ui/pageview.cpp index ec29bf0e6..34baf7058 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -1949,6 +1949,18 @@ void PageView::mousePressEvent( QMouseEvent * e ) return; } + // trigger history navigation for additional mouse buttons + if ( e->button() == Qt::XButton1 ) + { + emit mouseBackButtonClick(); + return; + } + if ( e->button() == Qt::XButton2 ) + { + emit mouseForwardButtonClick(); + return; + } + // update press / 'start drag' mouse position d->mousePressPos = e->globalPos(); diff --git a/ui/pageview.h b/ui/pageview.h index bd9bdd967..7fe597983 100644 --- a/ui/pageview.h +++ b/ui/pageview.h @@ -131,6 +131,8 @@ Q_OBJECT signals: void urlDropped( const KUrl& ); void rightClick( const Okular::Page *, const QPoint & ); + void mouseBackButtonClick(); + void mouseForwardButtonClick(); protected: void resizeEvent( QResizeEvent* ); From 06b0cf86169a92802ff4e4df0e9d22bc67b387fb Mon Sep 17 00:00:00 2001 From: Tobias Koenig Date: Wed, 11 Jul 2012 12:24:26 +0200 Subject: [PATCH 073/155] Always create temporary movie files with a sane name BUGS: 303227 --- core/movie.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/movie.cpp b/core/movie.cpp index 6cffb8687..1b5f2a708 100644 --- a/core/movie.cpp +++ b/core/movie.cpp @@ -58,7 +58,8 @@ Movie::Movie( const QString& fileName, const QByteArray &data ) * GStreamer backend). Storing the data in a temporary file works fine * though, not to mention, it releases much needed memory. (gamaral) */ - d->m_tmp = new QTemporaryFile( QString( "%1/okrXXXXXX_%2" ).arg( QDir::tempPath() ).arg( fileName ) ); + const QString relativeFileName = (fileName.startsWith("./") ? fileName.mid( 2 ) : fileName); + d->m_tmp = new QTemporaryFile( QString( "%1/okrXXXXXX_%2" ).arg( QDir::tempPath() ).arg( relativeFileName ) ); if ( d->m_tmp->open() ) { d->m_tmp->write( data ); d->m_tmp->flush(); From ceba1bcb3dcc43c4025317b50aa371934c697ea9 Mon Sep 17 00:00:00 2001 From: Tobias Koenig Date: Wed, 11 Jul 2012 16:42:52 +0200 Subject: [PATCH 074/155] Follow-up fix for ensuring sane temporary movie file names --- core/movie.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/movie.cpp b/core/movie.cpp index 1b5f2a708..0183f234e 100644 --- a/core/movie.cpp +++ b/core/movie.cpp @@ -58,7 +58,9 @@ Movie::Movie( const QString& fileName, const QByteArray &data ) * GStreamer backend). Storing the data in a temporary file works fine * though, not to mention, it releases much needed memory. (gamaral) */ - const QString relativeFileName = (fileName.startsWith("./") ? fileName.mid( 2 ) : fileName); + QString relativeFileName = (fileName.startsWith("./") ? fileName.mid( 2 ) : fileName); + relativeFileName.replace( '/', '_' ); + relativeFileName.replace( '\\', '_' ); d->m_tmp = new QTemporaryFile( QString( "%1/okrXXXXXX_%2" ).arg( QDir::tempPath() ).arg( relativeFileName ) ); if ( d->m_tmp->open() ) { d->m_tmp->write( data ); From 4c8f0bc5def7c755ab810adec78826fd51f713b1 Mon Sep 17 00:00:00 2001 From: Tobias Koenig Date: Wed, 11 Jul 2012 16:47:17 +0200 Subject: [PATCH 075/155] Fix temporary movie file names correctly Actually we don't need the source name included into the name of the temporary file. So don't do it to prevent bogus names. --- core/movie.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/movie.cpp b/core/movie.cpp index 0183f234e..94e71a955 100644 --- a/core/movie.cpp +++ b/core/movie.cpp @@ -58,10 +58,7 @@ Movie::Movie( const QString& fileName, const QByteArray &data ) * GStreamer backend). Storing the data in a temporary file works fine * though, not to mention, it releases much needed memory. (gamaral) */ - QString relativeFileName = (fileName.startsWith("./") ? fileName.mid( 2 ) : fileName); - relativeFileName.replace( '/', '_' ); - relativeFileName.replace( '\\', '_' ); - d->m_tmp = new QTemporaryFile( QString( "%1/okrXXXXXX_%2" ).arg( QDir::tempPath() ).arg( relativeFileName ) ); + d->m_tmp = new QTemporaryFile( QString( "%1/okrXXXXXX" ).arg( QDir::tempPath() ) ); if ( d->m_tmp->open() ) { d->m_tmp->write( data ); d->m_tmp->flush(); From ea8ec188c97aba09b742cf32502584effee13704 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 11 Jul 2012 22:42:25 +0200 Subject: [PATCH 076/155] Don't be so noisy! --- core/textpage.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/core/textpage.cpp b/core/textpage.cpp index 06acf95b0..57d0d0cea 100644 --- a/core/textpage.cpp +++ b/core/textpage.cpp @@ -863,7 +863,6 @@ RegularAreaRect* TextPagePrivate::findTextInternalForward( int searchID, const Q { curEntity = *it; const QString &str = curEntity->text(); - kDebug() << str; if ( !offsetMoved && ( it == start ) ) { if ( m_searchPoints.contains( searchID ) ) From 9ce6c555594ddc6882648b75515b177fbb09bdf4 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 11 Jul 2012 22:42:25 +0200 Subject: [PATCH 077/155] Don't be so noisy! --- core/textpage.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/core/textpage.cpp b/core/textpage.cpp index 06acf95b0..57d0d0cea 100644 --- a/core/textpage.cpp +++ b/core/textpage.cpp @@ -863,7 +863,6 @@ RegularAreaRect* TextPagePrivate::findTextInternalForward( int searchID, const Q { curEntity = *it; const QString &str = curEntity->text(); - kDebug() << str; if ( !offsetMoved && ( it == start ) ) { if ( m_searchPoints.contains( searchID ) ) From 0c92af1e296017582604be53954e5cf55d2b1116 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 11 Jul 2012 22:54:06 +0200 Subject: [PATCH 078/155] Remove search highlights on pressing Esc BUGS: 301960 FIXED-IN: 4.9.0 --- ui/pageview.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/pageview.cpp b/ui/pageview.cpp index 34baf7058..b298a4e6c 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -1642,6 +1642,7 @@ void PageView::keyPressEvent( QKeyEvent * e ) horizontalScrollBar()->triggerAction( QScrollBar::SliderSingleStepAdd ); break; case Qt::Key_Escape: + d->document->resetSearch( PART_SEARCH_ID ); selectionClear( d->tableDividersGuessed ? ClearOnlyDividers : ClearAllSelection ); d->mousePressPos = QPoint(); if ( d->aPrevAction ) From f7abc568bcafceeb97b1d5daa3424ac20f6aedd9 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 11 Jul 2012 22:55:03 +0200 Subject: [PATCH 079/155] Correctly start a search if Return is pressed after a back search FindNext was early quitting because the previous search was a back search and thus never got to startSearch, now we call startSearch if m_changed BUGS: 301248 FIXED-IN: 4.9.0 --- ui/searchlineedit.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ui/searchlineedit.cpp b/ui/searchlineedit.cpp index 21c4d562a..101e60aef 100644 --- a/ui/searchlineedit.cpp +++ b/ui/searchlineedit.cpp @@ -173,7 +173,10 @@ void SearchLineEdit::slotReturnPressed( const QString &text ) { m_inputDelayTimer->stop(); prepareLineEditForSearch(); - findNext(); + if ( m_changed ) + startSearch(); + else + findNext(); } void SearchLineEdit::startSearch() From 4c94ecab239f3506a7407ad004174cc095b9c189 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 11 Jul 2012 22:54:06 +0200 Subject: [PATCH 080/155] Remove search highlights on pressing Esc BUGS: 301960 FIXED-IN: 4.9.0 --- ui/pageview.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/pageview.cpp b/ui/pageview.cpp index ec29bf0e6..787311d5a 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -1642,6 +1642,7 @@ void PageView::keyPressEvent( QKeyEvent * e ) horizontalScrollBar()->triggerAction( QScrollBar::SliderSingleStepAdd ); break; case Qt::Key_Escape: + d->document->resetSearch( PART_SEARCH_ID ); selectionClear( d->tableDividersGuessed ? ClearOnlyDividers : ClearAllSelection ); d->mousePressPos = QPoint(); if ( d->aPrevAction ) From 1609de9fd51991214237a0bd9f97ea67657c60c9 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 11 Jul 2012 22:55:03 +0200 Subject: [PATCH 081/155] Correctly start a search if Return is pressed after a back search FindNext was early quitting because the previous search was a back search and thus never got to startSearch, now we call startSearch if m_changed BUGS: 301248 FIXED-IN: 4.9.0 --- ui/searchlineedit.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ui/searchlineedit.cpp b/ui/searchlineedit.cpp index 21c4d562a..101e60aef 100644 --- a/ui/searchlineedit.cpp +++ b/ui/searchlineedit.cpp @@ -173,7 +173,10 @@ void SearchLineEdit::slotReturnPressed( const QString &text ) { m_inputDelayTimer->stop(); prepareLineEditForSearch(); - findNext(); + if ( m_changed ) + startSearch(); + else + findNext(); } void SearchLineEdit::startSearch() From 369e1485ac4785df3606bbf859d1d0d1f7256573 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Thu, 12 Jul 2012 00:35:44 +0200 Subject: [PATCH 082/155] Make return always search forward This fixes 301248 and also the situation in which you searched back, changed no text, and pressed enter (found by Fabio) --- ui/searchlineedit.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ui/searchlineedit.cpp b/ui/searchlineedit.cpp index 101e60aef..4a3cc5636 100644 --- a/ui/searchlineedit.cpp +++ b/ui/searchlineedit.cpp @@ -173,10 +173,8 @@ void SearchLineEdit::slotReturnPressed( const QString &text ) { m_inputDelayTimer->stop(); prepareLineEditForSearch(); - if ( m_changed ) - startSearch(); - else - findNext(); + m_searchType = Okular::Document::NextMatch; + findNext(); } void SearchLineEdit::startSearch() From beffbf10ff08697a9212abd16fe786fe4173a989 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Thu, 12 Jul 2012 00:35:44 +0200 Subject: [PATCH 083/155] Make return always search forward This fixes 301248 and also the situation in which you searched back, changed no text, and pressed enter (found by Fabio) --- ui/searchlineedit.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ui/searchlineedit.cpp b/ui/searchlineedit.cpp index 101e60aef..4a3cc5636 100644 --- a/ui/searchlineedit.cpp +++ b/ui/searchlineedit.cpp @@ -173,10 +173,8 @@ void SearchLineEdit::slotReturnPressed( const QString &text ) { m_inputDelayTimer->stop(); prepareLineEditForSearch(); - if ( m_changed ) - startSearch(); - else - findNext(); + m_searchType = Okular::Document::NextMatch; + findNext(); } void SearchLineEdit::startSearch() From a72fbc6a8cc65e16aa70914461078d7222a6393a Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Thu, 12 Jul 2012 20:46:24 +0200 Subject: [PATCH 084/155] Keep the find bar working after ESC is pressed in PageView Instead of directly killing the search in the core, emit a signal caught by FindBar to tell its SearchLineEdit to reset the search operation. In this way, SearchLineEdit can set m_changed, and next time a new search operation will be started, instead of attempting to use the old one. --- part.cpp | 1 + ui/findbar.cpp | 5 +++++ ui/findbar.h | 1 + ui/pageview.cpp | 2 +- ui/pageview.h | 1 + ui/searchlineedit.cpp | 13 +++++++++++++ ui/searchlineedit.h | 1 + 7 files changed, 23 insertions(+), 1 deletion(-) diff --git a/part.cpp b/part.cpp index ce1db4d6f..7d8537c5d 100644 --- a/part.cpp +++ b/part.cpp @@ -440,6 +440,7 @@ m_cliPresentation(false), m_embedMode(detectEmbedMode(parentWidget, parent, args connect( m_findBar, SIGNAL(forwardKeyPressEvent(QKeyEvent*)), m_pageView, SLOT(externalKeyPressEvent(QKeyEvent*))); connect( m_miniBar, SIGNAL(forwardKeyPressEvent(QKeyEvent*)), m_pageView, SLOT(externalKeyPressEvent(QKeyEvent*))); + connect( m_pageView, SIGNAL(escPressed()), m_findBar, SLOT(resetSearch()) ); connect( m_pageNumberTool, SIGNAL(forwardKeyPressEvent(QKeyEvent*)), m_pageView, SLOT(externalKeyPressEvent(QKeyEvent*))); connect( m_reviewsWidget, SIGNAL(openAnnotationWindow(Okular::Annotation*,int)), diff --git a/ui/findbar.cpp b/ui/findbar.cpp index 745376ea1..f00f8833b 100644 --- a/ui/findbar.cpp +++ b/ui/findbar.cpp @@ -149,6 +149,11 @@ void FindBar::findPrev() m_search->lineEdit()->findPrev(); } +void FindBar::resetSearch() +{ + m_search->lineEdit()->resetSearch(); +} + void FindBar::caseSensitivityChanged() { m_search->lineEdit()->setSearchCaseSensitivity( m_caseSensitiveAct->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive ); diff --git a/ui/findbar.h b/ui/findbar.h index 2ee712f25..4db285572 100644 --- a/ui/findbar.h +++ b/ui/findbar.h @@ -40,6 +40,7 @@ class FindBar public slots: void findNext(); void findPrev(); + void resetSearch(); private slots: void caseSensitivityChanged(); diff --git a/ui/pageview.cpp b/ui/pageview.cpp index b298a4e6c..b74941d17 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -1642,7 +1642,7 @@ void PageView::keyPressEvent( QKeyEvent * e ) horizontalScrollBar()->triggerAction( QScrollBar::SliderSingleStepAdd ); break; case Qt::Key_Escape: - d->document->resetSearch( PART_SEARCH_ID ); + emit escPressed(); selectionClear( d->tableDividersGuessed ? ClearOnlyDividers : ClearAllSelection ); d->mousePressPos = QPoint(); if ( d->aPrevAction ) diff --git a/ui/pageview.h b/ui/pageview.h index 7fe597983..43ca2abf0 100644 --- a/ui/pageview.h +++ b/ui/pageview.h @@ -133,6 +133,7 @@ Q_OBJECT void rightClick( const Okular::Page *, const QPoint & ); void mouseBackButtonClick(); void mouseForwardButtonClick(); + void escPressed(); protected: void resizeEvent( QResizeEvent* ); diff --git a/ui/searchlineedit.cpp b/ui/searchlineedit.cpp index 4a3cc5636..787582158 100644 --- a/ui/searchlineedit.cpp +++ b/ui/searchlineedit.cpp @@ -90,6 +90,19 @@ void SearchLineEdit::setSearchFromStart( bool fromStart ) m_fromStart = fromStart; } +void SearchLineEdit::resetSearch() +{ + // Stop the currently running search, if any + stopSearch(); + + // Clear highlights + if ( m_id != -1 ) + m_document->resetSearch( m_id ); + + // Make sure that the search will be reset at the next one + m_changed = true; +} + bool SearchLineEdit::isSearchRunning() const { return m_searchRunning; diff --git a/ui/searchlineedit.h b/ui/searchlineedit.h index 5108f5a65..63ff4965b 100644 --- a/ui/searchlineedit.h +++ b/ui/searchlineedit.h @@ -36,6 +36,7 @@ class SearchLineEdit : public KLineEdit void setSearchColor( const QColor &color ); void setSearchMoveViewport( bool move ); void setSearchFromStart( bool fromStart ); + void resetSearch(); bool isSearchRunning() const; From 10865fbcb55fc8c8fd928b05c56f69521460e7fc Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Thu, 12 Jul 2012 21:44:17 +0200 Subject: [PATCH 085/155] Keep m_changed set to true if it was already true when changing search direction Otherwise, next/previous buttons don't work after ESC is pressed in PageView --- ui/searchlineedit.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ui/searchlineedit.cpp b/ui/searchlineedit.cpp index 787582158..e26ef7d0f 100644 --- a/ui/searchlineedit.cpp +++ b/ui/searchlineedit.cpp @@ -65,7 +65,9 @@ void SearchLineEdit::setSearchType( Okular::Document::SearchType type ) return; m_searchType = type; - m_changed = ( m_searchType != Okular::Document::NextMatch && m_searchType != Okular::Document::PreviousMatch ); + + if ( !m_changed ) + m_changed = ( m_searchType != Okular::Document::NextMatch && m_searchType != Okular::Document::PreviousMatch ); } void SearchLineEdit::setSearchId( int id ) From e0b74d7c09248d0017561ecdd1df15a39b9e6af3 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Thu, 12 Jul 2012 21:56:45 +0200 Subject: [PATCH 086/155] Force next search to be restarted when the document is changed --- part.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/part.cpp b/part.cpp index 7d8537c5d..3b7081ea2 100644 --- a/part.cpp +++ b/part.cpp @@ -1373,6 +1373,7 @@ bool Part::closeUrl(bool promptToSave) m_find->setEnabled( false ); m_findNext->setEnabled( false ); m_findPrev->setEnabled( false ); + m_findBar->resetSearch(); if( m_saveAs ) m_saveAs->setEnabled( false ); if( m_saveCopyAs ) m_saveCopyAs->setEnabled( false ); m_printPreview->setEnabled( false ); From e90cec9625093e4fe30cfcdf30a6476a5313909e Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Thu, 12 Jul 2012 22:04:26 +0200 Subject: [PATCH 087/155] Reset search input box color when SearchLineEdit::resetSearch() is called This is especially useful if resetSearch is called because of a document switch, because a search without results in the previous document has no relation with the new one, and therefore keeping the red background doesn't make sense. --- ui/searchlineedit.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ui/searchlineedit.cpp b/ui/searchlineedit.cpp index e26ef7d0f..31be8fb7b 100644 --- a/ui/searchlineedit.cpp +++ b/ui/searchlineedit.cpp @@ -103,6 +103,9 @@ void SearchLineEdit::resetSearch() // Make sure that the search will be reset at the next one m_changed = true; + + // Reset input box color + prepareLineEditForSearch(); } bool SearchLineEdit::isSearchRunning() const From 76b7982f57255ce39cf39ee9168057861b1e5016 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Thu, 12 Jul 2012 20:46:24 +0200 Subject: [PATCH 088/155] Keep the find bar working after ESC is pressed in PageView Instead of directly killing the search in the core, emit a signal caught by FindBar to tell its SearchLineEdit to reset the search operation. In this way, SearchLineEdit can set m_changed, and next time a new search operation will be started, instead of attempting to use the old one. --- part.cpp | 1 + ui/findbar.cpp | 5 +++++ ui/findbar.h | 1 + ui/pageview.cpp | 2 +- ui/pageview.h | 1 + ui/searchlineedit.cpp | 13 +++++++++++++ ui/searchlineedit.h | 1 + 7 files changed, 23 insertions(+), 1 deletion(-) diff --git a/part.cpp b/part.cpp index 83558c35e..30070f4b9 100644 --- a/part.cpp +++ b/part.cpp @@ -440,6 +440,7 @@ m_cliPresentation(false), m_embedMode(detectEmbedMode(parentWidget, parent, args connect( m_findBar, SIGNAL(forwardKeyPressEvent(QKeyEvent*)), m_pageView, SLOT(externalKeyPressEvent(QKeyEvent*))); connect( m_miniBar, SIGNAL(forwardKeyPressEvent(QKeyEvent*)), m_pageView, SLOT(externalKeyPressEvent(QKeyEvent*))); + connect( m_pageView, SIGNAL(escPressed()), m_findBar, SLOT(resetSearch()) ); connect( m_pageNumberTool, SIGNAL(forwardKeyPressEvent(QKeyEvent*)), m_pageView, SLOT(externalKeyPressEvent(QKeyEvent*))); connect( m_reviewsWidget, SIGNAL(openAnnotationWindow(Okular::Annotation*,int)), diff --git a/ui/findbar.cpp b/ui/findbar.cpp index 745376ea1..f00f8833b 100644 --- a/ui/findbar.cpp +++ b/ui/findbar.cpp @@ -149,6 +149,11 @@ void FindBar::findPrev() m_search->lineEdit()->findPrev(); } +void FindBar::resetSearch() +{ + m_search->lineEdit()->resetSearch(); +} + void FindBar::caseSensitivityChanged() { m_search->lineEdit()->setSearchCaseSensitivity( m_caseSensitiveAct->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive ); diff --git a/ui/findbar.h b/ui/findbar.h index 2ee712f25..4db285572 100644 --- a/ui/findbar.h +++ b/ui/findbar.h @@ -40,6 +40,7 @@ class FindBar public slots: void findNext(); void findPrev(); + void resetSearch(); private slots: void caseSensitivityChanged(); diff --git a/ui/pageview.cpp b/ui/pageview.cpp index 787311d5a..bf759a412 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -1642,7 +1642,7 @@ void PageView::keyPressEvent( QKeyEvent * e ) horizontalScrollBar()->triggerAction( QScrollBar::SliderSingleStepAdd ); break; case Qt::Key_Escape: - d->document->resetSearch( PART_SEARCH_ID ); + emit escPressed(); selectionClear( d->tableDividersGuessed ? ClearOnlyDividers : ClearAllSelection ); d->mousePressPos = QPoint(); if ( d->aPrevAction ) diff --git a/ui/pageview.h b/ui/pageview.h index bd9bdd967..438445f7a 100644 --- a/ui/pageview.h +++ b/ui/pageview.h @@ -131,6 +131,7 @@ Q_OBJECT signals: void urlDropped( const KUrl& ); void rightClick( const Okular::Page *, const QPoint & ); + void escPressed(); protected: void resizeEvent( QResizeEvent* ); diff --git a/ui/searchlineedit.cpp b/ui/searchlineedit.cpp index 4a3cc5636..787582158 100644 --- a/ui/searchlineedit.cpp +++ b/ui/searchlineedit.cpp @@ -90,6 +90,19 @@ void SearchLineEdit::setSearchFromStart( bool fromStart ) m_fromStart = fromStart; } +void SearchLineEdit::resetSearch() +{ + // Stop the currently running search, if any + stopSearch(); + + // Clear highlights + if ( m_id != -1 ) + m_document->resetSearch( m_id ); + + // Make sure that the search will be reset at the next one + m_changed = true; +} + bool SearchLineEdit::isSearchRunning() const { return m_searchRunning; diff --git a/ui/searchlineedit.h b/ui/searchlineedit.h index 5108f5a65..63ff4965b 100644 --- a/ui/searchlineedit.h +++ b/ui/searchlineedit.h @@ -36,6 +36,7 @@ class SearchLineEdit : public KLineEdit void setSearchColor( const QColor &color ); void setSearchMoveViewport( bool move ); void setSearchFromStart( bool fromStart ); + void resetSearch(); bool isSearchRunning() const; From eb1a2358746ad005ff2221d47cc81f513f143f30 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Thu, 12 Jul 2012 21:44:17 +0200 Subject: [PATCH 089/155] Keep m_changed set to true if it was already true when changing search direction Otherwise, next/previous buttons don't work after ESC is pressed in PageView --- ui/searchlineedit.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ui/searchlineedit.cpp b/ui/searchlineedit.cpp index 787582158..e26ef7d0f 100644 --- a/ui/searchlineedit.cpp +++ b/ui/searchlineedit.cpp @@ -65,7 +65,9 @@ void SearchLineEdit::setSearchType( Okular::Document::SearchType type ) return; m_searchType = type; - m_changed = ( m_searchType != Okular::Document::NextMatch && m_searchType != Okular::Document::PreviousMatch ); + + if ( !m_changed ) + m_changed = ( m_searchType != Okular::Document::NextMatch && m_searchType != Okular::Document::PreviousMatch ); } void SearchLineEdit::setSearchId( int id ) From a6f57c965b06be86dcbc01dba8fb3b91c597f669 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Thu, 12 Jul 2012 21:56:45 +0200 Subject: [PATCH 090/155] Force next search to be restarted when the document is changed --- part.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/part.cpp b/part.cpp index 30070f4b9..2f0674253 100644 --- a/part.cpp +++ b/part.cpp @@ -1373,6 +1373,7 @@ bool Part::closeUrl(bool promptToSave) m_find->setEnabled( false ); m_findNext->setEnabled( false ); m_findPrev->setEnabled( false ); + m_findBar->resetSearch(); if( m_saveAs ) m_saveAs->setEnabled( false ); if( m_saveCopyAs ) m_saveCopyAs->setEnabled( false ); m_printPreview->setEnabled( false ); From 9e93df074bb0bae694861fe34f7fb4dcd9557826 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Thu, 12 Jul 2012 22:04:26 +0200 Subject: [PATCH 091/155] Reset search input box color when SearchLineEdit::resetSearch() is called This is especially useful if resetSearch is called because of a document switch, because a search without results in the previous document has no relation with the new one, and therefore keeping the red background doesn't make sense. --- ui/searchlineedit.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ui/searchlineedit.cpp b/ui/searchlineedit.cpp index e26ef7d0f..31be8fb7b 100644 --- a/ui/searchlineedit.cpp +++ b/ui/searchlineedit.cpp @@ -103,6 +103,9 @@ void SearchLineEdit::resetSearch() // Make sure that the search will be reset at the next one m_changed = true; + + // Reset input box color + prepareLineEditForSearch(); } bool SearchLineEdit::isSearchRunning() const From 99c4da2f9ef86e345ee02cecb10e0df8f5e5b2e2 Mon Sep 17 00:00:00 2001 From: Luigi Toscano Date: Sun, 15 Jul 2012 21:15:43 +0200 Subject: [PATCH 092/155] Avoid crash when the font is broken. The call to FT_New_Face takes the address of the 'face' variable, whose type is a typedef *something TF_Face; The value of TF_Face (so a pointer to the properly filled font structure) s then replaced inside the call of TF_New_Face; but when the latter function fails, the value of 'face' is not reset and this leads to a crash in the distructor of TeXFont_PFB. So properly initialize TF_Face to 0, its address is valid, and the code works. BUG: 303472 FIXED-IN: 4.8.5 --- generators/dvi/TeXFont_PFB.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/dvi/TeXFont_PFB.cpp b/generators/dvi/TeXFont_PFB.cpp index cc866310a..6b2709361 100644 --- a/generators/dvi/TeXFont_PFB.cpp +++ b/generators/dvi/TeXFont_PFB.cpp @@ -25,7 +25,7 @@ TeXFont_PFB::TeXFont_PFB(TeXFontDefinition *parent, fontEncoding *enc, double slant) - : TeXFont(parent) + : TeXFont(parent), face(0) { #ifdef DEBUG_PFB if (enc != 0) From bd733dab90ab3e7709c0e47796881b9cdf224554 Mon Sep 17 00:00:00 2001 From: Luigi Toscano Date: Sun, 15 Jul 2012 21:15:43 +0200 Subject: [PATCH 093/155] Avoid crash when the font is broken. The call to FT_New_Face takes the address of the 'face' variable, whose type is a typedef *something TF_Face; The value of TF_Face (so a pointer to the properly filled font structure) s then replaced inside the call of TF_New_Face; but when the latter function fails, the value of 'face' is not reset and this leads to a crash in the distructor of TeXFont_PFB. So properly initialize TF_Face to 0, its address is valid, and the code works. BUG: 303472 FIXED-IN: 4.8.5 (cherry picked from commit 99c4da2f9ef86e345ee02cecb10e0df8f5e5b2e2) --- generators/dvi/TeXFont_PFB.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/dvi/TeXFont_PFB.cpp b/generators/dvi/TeXFont_PFB.cpp index cc866310a..6b2709361 100644 --- a/generators/dvi/TeXFont_PFB.cpp +++ b/generators/dvi/TeXFont_PFB.cpp @@ -25,7 +25,7 @@ TeXFont_PFB::TeXFont_PFB(TeXFontDefinition *parent, fontEncoding *enc, double slant) - : TeXFont(parent) + : TeXFont(parent), face(0) { #ifdef DEBUG_PFB if (enc != 0) From 5b12bf685df1c02be025cdb870f97df62da72b09 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Tue, 17 Jul 2012 20:35:54 +0200 Subject: [PATCH 094/155] Call Generator::signalPixmapRequestDone _after_ saving the calculated bounding box Fixes a bug that causes the extraction of a wrong bounding box: If the request queue is not empty, signalPixmapRequestDone causes a new pixmap request to be started, thus overwriting mPixmapGenerationThread's mCalcBoundingBox before it is read by the if in the next line. Now signalPixmapRequestDone is called after the bounding box is saved, so that new requests are started only after all data from mPixmapGenerationThread have been saved. BUG: 257370 REVIEW: 105600 --- core/generator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/generator.cpp b/core/generator.cpp index 0073943a0..72993c077 100644 --- a/core/generator.cpp +++ b/core/generator.cpp @@ -103,9 +103,9 @@ void GeneratorPrivate::pixmapGenerationFinished() request->page()->setPixmap( request->id(), new QPixmap( QPixmap::fromImage( img ) ) ); const int pageNumber = request->page()->number(); - q->signalPixmapRequestDone( request ); if ( mPixmapGenerationThread->calcBoundingBox() ) q->updatePageBoundingBox( pageNumber, mPixmapGenerationThread->boundingBox() ); + q->signalPixmapRequestDone( request ); } void GeneratorPrivate::textpageGenerationFinished() From edbb4ef9f5aa8f120558b9d4f4b9f68970100c4b Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Tue, 17 Jul 2012 20:35:54 +0200 Subject: [PATCH 095/155] Call Generator::signalPixmapRequestDone _after_ saving the calculated bounding box Fixes a bug that causes the extraction of a wrong bounding box: If the request queue is not empty, signalPixmapRequestDone causes a new pixmap request to be started, thus overwriting mPixmapGenerationThread's mCalcBoundingBox before it is read by the if in the next line. Now signalPixmapRequestDone is called after the bounding box is saved, so that new requests are started only after all data from mPixmapGenerationThread have been saved. BUG: 257370 REVIEW: 105600 --- core/generator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/generator.cpp b/core/generator.cpp index 0073943a0..72993c077 100644 --- a/core/generator.cpp +++ b/core/generator.cpp @@ -103,9 +103,9 @@ void GeneratorPrivate::pixmapGenerationFinished() request->page()->setPixmap( request->id(), new QPixmap( QPixmap::fromImage( img ) ) ); const int pageNumber = request->page()->number(); - q->signalPixmapRequestDone( request ); if ( mPixmapGenerationThread->calcBoundingBox() ) q->updatePageBoundingBox( pageNumber, mPixmapGenerationThread->boundingBox() ); + q->signalPixmapRequestDone( request ); } void GeneratorPrivate::textpageGenerationFinished() From 6f2e1fa91871e0306775af2a987cd9cb96b0a28d Mon Sep 17 00:00:00 2001 From: Script Kiddy Date: Thu, 19 Jul 2012 10:10:40 +0200 Subject: [PATCH 096/155] SVN_SILENT made messages (.desktop file) --- core/okularGenerator.desktop | 2 +- generators/chm/kio-msits/msits.protocol | 2 +- generators/chm/libokularGenerator_chmlib.desktop | 2 +- generators/comicbook/libokularGenerator_comicbook.desktop | 4 ++-- generators/comicbook/okularApplication_comicbook.desktop | 2 +- generators/djvu/libokularGenerator_djvu.desktop | 2 +- generators/dvi/libokularGenerator_dvi.desktop | 2 +- generators/epub/libokularGenerator_epub.desktop | 2 +- generators/fax/libokularGenerator_fax.desktop | 2 +- generators/fictionbook/libokularGenerator_fb.desktop | 2 +- generators/kimgio/libokularGenerator_kimgio.desktop | 2 +- generators/ooo/libokularGenerator_ooo.desktop | 4 ++-- generators/plucker/libokularGenerator_plucker.desktop | 2 +- generators/poppler/libokularGenerator_poppler.desktop | 2 +- generators/spectre/libokularGenerator_ghostview.desktop | 2 +- generators/tiff/libokularGenerator_tiff.desktop | 4 ++-- generators/xps/libokularGenerator_xps.desktop | 4 ++-- 17 files changed, 21 insertions(+), 21 deletions(-) diff --git a/core/okularGenerator.desktop b/core/okularGenerator.desktop index 88881b2b7..6cea4fa64 100644 --- a/core/okularGenerator.desktop +++ b/core/okularGenerator.desktop @@ -16,7 +16,7 @@ Comment[en_GB]=File format backend for Okular Comment[es]=Motor de formatos de archivos para Okular Comment[et]=Okulari failivormingu taustaprogramm Comment[eu]=Okular-en fitxategi-formatuaren motorra -Comment[fi]=Tiedostomuodot-taustaosa Okular-lukijalle +Comment[fi]=Tiedostomuototaustaosa Okularille Comment[fr]=Interface du format de fichier d'Okular Comment[ga]=Inneall formáide comhaid le haghaidh Okular Comment[gl]=Infraestrutura dun formato de ficheiro para Okular diff --git a/generators/chm/kio-msits/msits.protocol b/generators/chm/kio-msits/msits.protocol index 1ad4ba172..1df224887 100644 --- a/generators/chm/kio-msits/msits.protocol +++ b/generators/chm/kio-msits/msits.protocol @@ -22,7 +22,7 @@ Description[eo]=Kio-sklavo por montri la WinHelp dosierojn Description[es]=Un «kioslave» para mostrar archivos WinHelp Description[et]=KIO-moodul WinHelp-failide näitamiseks Description[eu]=WinHelp fitxategiak bistaratzeko kioslave bat -Description[fi]=Kioslave WinHelp-tiedostojen näyttämiseksi +Description[fi]=WinHelp-tiedostoja näyttävä kioslave Description[fr]=Module d'entrées / sorties pour l'affichage des fichiers d'aide Win Help Description[ga]=Sclábhaí KIO a thaispeánann comhaid WinHelp Description[gl]=Un kioslave para mostrar ficheiros WinHelp diff --git a/generators/chm/libokularGenerator_chmlib.desktop b/generators/chm/libokularGenerator_chmlib.desktop index 27dca9cbb..bf5018200 100644 --- a/generators/chm/libokularGenerator_chmlib.desktop +++ b/generators/chm/libokularGenerator_chmlib.desktop @@ -75,7 +75,7 @@ Comment[en_GB]=Windows HTMLHelp backend for Okular Comment[es]=Motor de archivos de ayuda en HTML de Windows para Okular Comment[et]=Okulari Windowsi HTMLHelp-failide taustaprogramm Comment[eu]=Okular-en Windows HTMLHelp motorra -Comment[fi]=Windows HTMLHelp -taustaosa Okular-lukijalle +Comment[fi]=Windows HTMLHelp -taustaosa Okularille Comment[fr]=Interface d'Okular pour les fichiers d'aide Windows HTMLHelp Comment[ga]=Inneall HTMLHelp Windows le haghaidh Okular Comment[gl]=Infraestrutura de ficheiros Windows HTMLHelp para Okular diff --git a/generators/comicbook/libokularGenerator_comicbook.desktop b/generators/comicbook/libokularGenerator_comicbook.desktop index bec8c92c3..d2937e301 100644 --- a/generators/comicbook/libokularGenerator_comicbook.desktop +++ b/generators/comicbook/libokularGenerator_comicbook.desktop @@ -16,7 +16,7 @@ Name[eo]=ComicBook Name[es]=Comic Book Name[et]=Koomiks Name[eu]=Komikia -Name[fi]=Sarjakuva +Name[fi]=Comic Book Name[fr]=«  Comic Book » Name[ga]=Comic Book Name[gl]=Libro de banda deseñada @@ -74,7 +74,7 @@ Comment[en_GB]=Comic book backend for Okular Comment[es]=Motor de libros de Comic para Okular Comment[et]=Okulari koomiksite taustaprogramm Comment[eu]=Okular-en komiki motorra -Comment[fi]=Sarjakuvat-taustaosa Okular-ohjelmalle +Comment[fi]=Comic book -taustaosa Okularille Comment[fr]=Interface d'Okular pour les bandes dessinés Comment[ga]=Inneall Comic Book le haghaidh Okular Comment[gl]=Infraestruturas de banda deseñada para Okular diff --git a/generators/comicbook/okularApplication_comicbook.desktop b/generators/comicbook/okularApplication_comicbook.desktop index cde2e8395..ad0455706 100755 --- a/generators/comicbook/okularApplication_comicbook.desktop +++ b/generators/comicbook/okularApplication_comicbook.desktop @@ -137,7 +137,7 @@ X-KDE-Keywords[de]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[el]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[es]=cbr, cbz, cbt, libro de cómic X-KDE-Keywords[et]=cbr, cbz, cbt, Comic Book, koomiks -X-KDE-Keywords[fi]=cbr, cbz, cbt, Sarjakuva +X-KDE-Keywords[fi]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[fr]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[ga]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[hu]=cbr, cbz, cbt, Képregény diff --git a/generators/djvu/libokularGenerator_djvu.desktop b/generators/djvu/libokularGenerator_djvu.desktop index 1093b8b52..384e9af6e 100644 --- a/generators/djvu/libokularGenerator_djvu.desktop +++ b/generators/djvu/libokularGenerator_djvu.desktop @@ -76,7 +76,7 @@ Comment[en_GB]=DjVu backend for Okular Comment[es]=Motor DjVu para Okular Comment[et]=Okulari DjVu taustaprogramm Comment[eu]=Okular-en DjVu motorra -Comment[fi]=DjVu-taustaosa Okular-lukijalle +Comment[fi]=DjVu-taustaosa Okularille Comment[fr]=Interface d'Okular pour DjVu Comment[ga]=Inneall DjVu le haghaidh Okular Comment[gl]=Infraestrutura de DjVu para Okular diff --git a/generators/dvi/libokularGenerator_dvi.desktop b/generators/dvi/libokularGenerator_dvi.desktop index c5224f06b..62b160774 100644 --- a/generators/dvi/libokularGenerator_dvi.desktop +++ b/generators/dvi/libokularGenerator_dvi.desktop @@ -76,7 +76,7 @@ Comment[en_GB]=DVI backend for Okular Comment[es]=Motor DVI para Okular Comment[et]=Okulari DVI taustaprogramm Comment[eu]=Okular-en DVI motorra -Comment[fi]=DVI-taustaosa Okular-lukijalle +Comment[fi]=DVI-taustaosa Okularille Comment[fr]=Interface d'Okular pour le DVI Comment[ga]=Inneall DVI le haghaidh Okular Comment[gl]=Infraestrutura de DVI para Okular diff --git a/generators/epub/libokularGenerator_epub.desktop b/generators/epub/libokularGenerator_epub.desktop index daeeb8e84..f8e578432 100644 --- a/generators/epub/libokularGenerator_epub.desktop +++ b/generators/epub/libokularGenerator_epub.desktop @@ -71,7 +71,7 @@ Comment[en_GB]=EPub backend for Okular Comment[es]=Motor EPub para Okular Comment[et]=Okulari EPubi taustaprogramm Comment[eu]=Okular-en EPub motorra -Comment[fi]=EPub-taustaosa Okular-lukijalle +Comment[fi]=EPub-taustaosa Okularille Comment[fr]=Interface d'Okular pour EPub Comment[ga]=Inneall EPub le haghaidh Okular Comment[gl]=Infraestrutura de EPub para Okular diff --git a/generators/fax/libokularGenerator_fax.desktop b/generators/fax/libokularGenerator_fax.desktop index 83537677e..145f59498 100644 --- a/generators/fax/libokularGenerator_fax.desktop +++ b/generators/fax/libokularGenerator_fax.desktop @@ -71,7 +71,7 @@ Comment[en_GB]=G3/G4 Fax backend for Okular Comment[es]=Motor de fax G3/G4 para Okular Comment[et]=Okulari G3/G4 faksi taustaprogramm Comment[eu]=Okular-en G3/G4 faxaren motorra -Comment[fi]=G3/G4-Faksitaustaosa Okular-lukijalle +Comment[fi]=G3/G4-faksitaustaosa Okularille Comment[fr]=Interface d'Okular pour les fax de type G3/G4 Comment[ga]=Inneall facsála G3/G4 le haghaidh Okular Comment[gl]=Infraestrutura de fax G3/G4 para Okular diff --git a/generators/fictionbook/libokularGenerator_fb.desktop b/generators/fictionbook/libokularGenerator_fb.desktop index c94b9e664..dcaf5ca0d 100644 --- a/generators/fictionbook/libokularGenerator_fb.desktop +++ b/generators/fictionbook/libokularGenerator_fb.desktop @@ -73,7 +73,7 @@ Comment[en_GB]=FictionBook backend for Okular Comment[es]=Motor FictionBook para Okular Comment[et]=Okulari FictionBooki taustaprogramm Comment[eu]=Okular-en fikzio-libururen motorra -Comment[fi]=FictionBook-taustaosa Okular-lukijalle +Comment[fi]=FictionBook-taustaosa Okularille Comment[fr]=Interface d'Okular pour « FictionBook » Comment[ga]=Inneall FictionBook le haghaidh Okular Comment[gl]=Infraestrutura FictionBook para Okular diff --git a/generators/kimgio/libokularGenerator_kimgio.desktop b/generators/kimgio/libokularGenerator_kimgio.desktop index 0b4429b89..340724275 100644 --- a/generators/kimgio/libokularGenerator_kimgio.desktop +++ b/generators/kimgio/libokularGenerator_kimgio.desktop @@ -76,7 +76,7 @@ Comment[en_GB]=Image backend for Okular Comment[es]=Motor de imágenes para Okular Comment[et]=Okulari piltide taustaprogramm Comment[eu]=Okular-en irudi motorra -Comment[fi]=Kuvataustaosta Okular-lukijalle +Comment[fi]=Kuvataustaosta Okularille Comment[fr]=Interface d'Okular pour les images Comment[ga]=Inneall íomhánna le haghaidh Okular Comment[gl]=Infraestrutura de imaxes para Okular diff --git a/generators/ooo/libokularGenerator_ooo.desktop b/generators/ooo/libokularGenerator_ooo.desktop index cf33e82fa..f20838400 100644 --- a/generators/ooo/libokularGenerator_ooo.desktop +++ b/generators/ooo/libokularGenerator_ooo.desktop @@ -16,7 +16,7 @@ Name[eo]=OpenDocument formato Name[es]=Formato OpenDocument Name[et]=OpenDocumenti vorming Name[eu]=OpenDocument formatua -Name[fi]=OpenDocument -muoto +Name[fi]=OpenDocument-muoto Name[fr]=Format OpenDocument Name[ga]=Formáid OpenDocument Name[gl]=Formato OpenDocument @@ -75,7 +75,7 @@ Comment[en_GB]=OpenDocument backend for Okular Comment[es]=Motor OpenDocument para Okular Comment[et]=Okulari OpenDocumenti taustaprogramm Comment[eu]=Okular-en OpenDocument motorra -Comment[fi]=OpenDocument-taustaosa Okular-lukijalle +Comment[fi]=OpenDocument-taustaosa Okularille Comment[fr]=Interface d'Okular pour le format OpenDocument Comment[ga]=Inneall OpenDocument le haghaidh Okular Comment[gl]=Infraestrutura de OpenDocument para Okular diff --git a/generators/plucker/libokularGenerator_plucker.desktop b/generators/plucker/libokularGenerator_plucker.desktop index 579c1ee8f..f50d7b9a6 100644 --- a/generators/plucker/libokularGenerator_plucker.desktop +++ b/generators/plucker/libokularGenerator_plucker.desktop @@ -75,7 +75,7 @@ Comment[en_GB]=Plucker backend for Okular Comment[es]=Motor Plucker para Okular Comment[et]=Okulari Pluckeri taustaprogramm Comment[eu]=Okular-en Plucker motorra -Comment[fi]=Plucker-taustaosa Okular-lukijalle +Comment[fi]=Plucker-taustaosa Okularille Comment[fr]=Interface d'Okular pour les fichiers Plucker Comment[ga]=Inneall Plucker le haghaidh Okular Comment[gl]=Infraestrutura de Plucker para Okular diff --git a/generators/poppler/libokularGenerator_poppler.desktop b/generators/poppler/libokularGenerator_poppler.desktop index 9962dc301..7dd547c3d 100644 --- a/generators/poppler/libokularGenerator_poppler.desktop +++ b/generators/poppler/libokularGenerator_poppler.desktop @@ -75,7 +75,7 @@ Comment[en_GB]=PDF backend for Okular using poppler Comment[es]=Motor PDF para Okular que usa Poppler Comment[et]=Okulari PDF-i taustaprogramm poppleri vahendusel Comment[eu]=Okular-en PDF motorra poppler erabiliz -Comment[fi]=Poppler-kirjastoa käyttävä PDF-taustaosa Okular-lukijalle +Comment[fi]=Poppler-kirjastoa käyttävä PDF-taustaosa Okularille Comment[fr]=Interface d'Okular pour les PDF (utilise poppler) Comment[ga]=Inneall PDF a úsáideann poppler le haghaidh Okular Comment[gl]=Infraestrutura de PDF mediante poppler para Okular diff --git a/generators/spectre/libokularGenerator_ghostview.desktop b/generators/spectre/libokularGenerator_ghostview.desktop index 78e104b32..6780bac9d 100644 --- a/generators/spectre/libokularGenerator_ghostview.desktop +++ b/generators/spectre/libokularGenerator_ghostview.desktop @@ -75,7 +75,7 @@ Comment[en_GB]=Ghostscript PS/PDF backend for Okular Comment[es]=Motor PS/PDF de Ghostscript para Okular Comment[et]=Okulari Ghostscript PS/PDF-i taustaprogramm Comment[eu]=Okular-en Ghostscript PS/PDF motorra -Comment[fi]=Ghostscript-pohjainen PS/PDF-taustaosa ohjelmaa Okular varten +Comment[fi]=Ghostscript-pohjainen PS/PDF-taustaosa Okularille Comment[fr]=Interface d'Okular pour les fichiers Ghostscript PS/PDF Comment[ga]=Inneall PS/PDF Ghostscript le haghaidh Okular Comment[gl]=Infraestrutura Ghostscript PS/PDF para Okular diff --git a/generators/tiff/libokularGenerator_tiff.desktop b/generators/tiff/libokularGenerator_tiff.desktop index 2a7388e1d..e9faff8e3 100644 --- a/generators/tiff/libokularGenerator_tiff.desktop +++ b/generators/tiff/libokularGenerator_tiff.desktop @@ -15,7 +15,7 @@ Name[en_GB]=Okular TIFF Library Name[es]=Biblioteca TIFF de Okular Name[et]=Okulari TIFF-i teek Name[eu]=Okular TIFF liburutegia -Name[fi]=Okular TIFF-kirjasto +Name[fi]=TIFF-kirjasto Okularille Name[fr]=Librairie d'Okular pour le format TIFF Name[ga]=Leabharlann TIFF Okular Name[gl]=Biblioteca TIFF de Okular @@ -71,7 +71,7 @@ Comment[en_GB]=TIFF backend for Okular Comment[es]=Motor TIFF para Okular Comment[et]=Okulari TIFF-i taustaprogramm Comment[eu]=Okular-en TIFF motorra -Comment[fi]=TIFF-taustaosa ohjelmaa Okular varten +Comment[fi]=TIFF-taustaosa Okularille Comment[fr]=Interface d'Okular pour les fichiers TIFF Comment[ga]=Inneall TIFF le haghaidh Okular Comment[gl]=Infraestrutura de TIFF para Okular diff --git a/generators/xps/libokularGenerator_xps.desktop b/generators/xps/libokularGenerator_xps.desktop index 40409aaa5..c6908bb77 100644 --- a/generators/xps/libokularGenerator_xps.desktop +++ b/generators/xps/libokularGenerator_xps.desktop @@ -15,7 +15,7 @@ Name[en_GB]=Okular XPS Plugin Name[es]=Complemento XPS de Okular Name[et]=Okulari XPS-i plugin Name[eu]=Okular-en XPS plugina -Name[fi]=XPS-liitännäinen ohjelmaa Okular varten +Name[fi]=XPS-liitännäinen Okularille Name[fr]=Module externe XPS pour Okular Name[ga]=Breiseán XPS Okular Name[gl]=Extensión XPS para Okular @@ -71,7 +71,7 @@ Comment[en_GB]=XPS backend for Okular Comment[es]=Motor XPS para Okular Comment[et]=Okulari XPS-i taustaprogramm Comment[eu]=Okular-en XPS motorra -Comment[fi]=XPS-taustaosa ohjelmaa Okular varten +Comment[fi]=XPS-taustaosa Okularille Comment[fr]=Interface d'Okular pour les fichiers XPS Comment[ga]=Inneall XPS le haghaidh Okular Comment[gl]=Infraestrutura de XPS para Okular From b441873b6ba88782b92096341b334bb652c245e4 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 25 Jul 2012 19:07:55 +0200 Subject: [PATCH 097/155] 4.9.0 version bump --- VERSION | 2 +- core/version.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/VERSION b/VERSION index bd1db3a13..b79cd474b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -okular v0.14.97 +okular v0.15.0 diff --git a/core/version.h b/core/version.h index 9cb34f083..d8c92e959 100644 --- a/core/version.h +++ b/core/version.h @@ -10,10 +10,10 @@ #ifndef _OKULAR_VERSION_H_ #define _OKULAR_VERSION_H_ -#define OKULAR_VERSION_STRING "0.14.97" +#define OKULAR_VERSION_STRING "0.15.0" #define OKULAR_VERSION_MAJOR 0 -#define OKULAR_VERSION_MINOR 14 -#define OKULAR_VERSION_RELEASE 97 +#define OKULAR_VERSION_MINOR 15 +#define OKULAR_VERSION_RELEASE 0 #define OKULAR_MAKE_VERSION( a,b,c ) (((a) << 16) | ((b) << 8) | (c)) #define OKULAR_VERSION \ From 0a6f211c41fd1b37fbe93c6dfeb36c37516e1500 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Wed, 25 Jul 2012 02:29:49 +0200 Subject: [PATCH 098/155] Moved m_findBar->resetSearch() from closeUrl() to notifySetup() As a side effect, this change fixes bug 303998, that caused a crash if the part's widget was destroyed before the part itself, because m_findBar had already been destroyed. BUG: 303998 FIXED-IN: 4.9.0 --- part.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/part.cpp b/part.cpp index 3b7081ea2..7c1ca7174 100644 --- a/part.cpp +++ b/part.cpp @@ -1038,6 +1038,7 @@ void Part::notifySetup( const QVector< Okular::Page * > & /*pages*/, int setupFl rebuildBookmarkMenu(); updateAboutBackendAction(); + m_findBar->resetSearch(); m_searchWidget->setEnabled( m_document->supportsSearching() ); } @@ -1373,7 +1374,6 @@ bool Part::closeUrl(bool promptToSave) m_find->setEnabled( false ); m_findNext->setEnabled( false ); m_findPrev->setEnabled( false ); - m_findBar->resetSearch(); if( m_saveAs ) m_saveAs->setEnabled( false ); if( m_saveCopyAs ) m_saveCopyAs->setEnabled( false ); m_printPreview->setEnabled( false ); From 739bbe9acea448d53ed47935bcb6aeb9764cc838 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Wed, 25 Jul 2012 02:29:49 +0200 Subject: [PATCH 099/155] Moved m_findBar->resetSearch() from closeUrl() to notifySetup() As a side effect, this change fixes bug 303998, that caused a crash if the part's widget was destroyed before the part itself, because m_findBar had already been destroyed. BUG: 303998 FIXED-IN: 4.9.0 --- part.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/part.cpp b/part.cpp index 2f0674253..258b91500 100644 --- a/part.cpp +++ b/part.cpp @@ -1038,6 +1038,7 @@ void Part::notifySetup( const QVector< Okular::Page * > & /*pages*/, int setupFl rebuildBookmarkMenu(); updateAboutBackendAction(); + m_findBar->resetSearch(); m_searchWidget->setEnabled( m_document->supportsSearching() ); } @@ -1373,7 +1374,6 @@ bool Part::closeUrl(bool promptToSave) m_find->setEnabled( false ); m_findNext->setEnabled( false ); m_findPrev->setEnabled( false ); - m_findBar->resetSearch(); if( m_saveAs ) m_saveAs->setEnabled( false ); if( m_saveCopyAs ) m_saveCopyAs->setEnabled( false ); m_printPreview->setEnabled( false ); From e653d83816c830e1a69925fb71a50b68be7d683f Mon Sep 17 00:00:00 2001 From: Script Kiddy Date: Tue, 7 Aug 2012 18:30:47 +0200 Subject: [PATCH 100/155] SVN_SILENT made messages (.desktop file) --- core/okularGenerator.desktop | 2 +- generators/chm/kio-msits/msits.protocol | 2 +- generators/chm/libokularGenerator_chmlib.desktop | 2 +- generators/chm/okularApplication_chm.desktop | 1 + generators/comicbook/libokularGenerator_comicbook.desktop | 4 ++-- generators/comicbook/okularApplication_comicbook.desktop | 3 ++- generators/djvu/libokularGenerator_djvu.desktop | 2 +- generators/djvu/okularApplication_djvu.desktop | 1 + generators/dvi/libokularGenerator_dvi.desktop | 2 +- generators/dvi/okularApplication_dvi.desktop | 1 + generators/epub/libokularGenerator_epub.desktop | 2 +- generators/epub/okularApplication_epub.desktop | 1 + generators/fax/libokularGenerator_fax.desktop | 2 +- generators/fictionbook/libokularGenerator_fb.desktop | 2 +- generators/fictionbook/okularApplication_fb.desktop | 1 + generators/kimgio/libokularGenerator_kimgio.desktop | 2 +- generators/ooo/libokularGenerator_ooo.desktop | 4 ++-- generators/plucker/libokularGenerator_plucker.desktop | 2 +- generators/plucker/okularApplication_plucker.desktop | 1 + generators/poppler/libokularGenerator_poppler.desktop | 2 +- generators/poppler/okularApplication_pdf.desktop | 1 + generators/spectre/libokularGenerator_ghostview.desktop | 2 +- generators/tiff/libokularGenerator_tiff.desktop | 4 ++-- generators/xps/libokularGenerator_xps.desktop | 4 ++-- generators/xps/okularApplication_xps.desktop | 1 + 25 files changed, 30 insertions(+), 21 deletions(-) diff --git a/core/okularGenerator.desktop b/core/okularGenerator.desktop index 88881b2b7..6cea4fa64 100644 --- a/core/okularGenerator.desktop +++ b/core/okularGenerator.desktop @@ -16,7 +16,7 @@ Comment[en_GB]=File format backend for Okular Comment[es]=Motor de formatos de archivos para Okular Comment[et]=Okulari failivormingu taustaprogramm Comment[eu]=Okular-en fitxategi-formatuaren motorra -Comment[fi]=Tiedostomuodot-taustaosa Okular-lukijalle +Comment[fi]=Tiedostomuototaustaosa Okularille Comment[fr]=Interface du format de fichier d'Okular Comment[ga]=Inneall formáide comhaid le haghaidh Okular Comment[gl]=Infraestrutura dun formato de ficheiro para Okular diff --git a/generators/chm/kio-msits/msits.protocol b/generators/chm/kio-msits/msits.protocol index 1ad4ba172..1df224887 100644 --- a/generators/chm/kio-msits/msits.protocol +++ b/generators/chm/kio-msits/msits.protocol @@ -22,7 +22,7 @@ Description[eo]=Kio-sklavo por montri la WinHelp dosierojn Description[es]=Un «kioslave» para mostrar archivos WinHelp Description[et]=KIO-moodul WinHelp-failide näitamiseks Description[eu]=WinHelp fitxategiak bistaratzeko kioslave bat -Description[fi]=Kioslave WinHelp-tiedostojen näyttämiseksi +Description[fi]=WinHelp-tiedostoja näyttävä kioslave Description[fr]=Module d'entrées / sorties pour l'affichage des fichiers d'aide Win Help Description[ga]=Sclábhaí KIO a thaispeánann comhaid WinHelp Description[gl]=Un kioslave para mostrar ficheiros WinHelp diff --git a/generators/chm/libokularGenerator_chmlib.desktop b/generators/chm/libokularGenerator_chmlib.desktop index 27dca9cbb..bf5018200 100644 --- a/generators/chm/libokularGenerator_chmlib.desktop +++ b/generators/chm/libokularGenerator_chmlib.desktop @@ -75,7 +75,7 @@ Comment[en_GB]=Windows HTMLHelp backend for Okular Comment[es]=Motor de archivos de ayuda en HTML de Windows para Okular Comment[et]=Okulari Windowsi HTMLHelp-failide taustaprogramm Comment[eu]=Okular-en Windows HTMLHelp motorra -Comment[fi]=Windows HTMLHelp -taustaosa Okular-lukijalle +Comment[fi]=Windows HTMLHelp -taustaosa Okularille Comment[fr]=Interface d'Okular pour les fichiers d'aide Windows HTMLHelp Comment[ga]=Inneall HTMLHelp Windows le haghaidh Okular Comment[gl]=Infraestrutura de ficheiros Windows HTMLHelp para Okular diff --git a/generators/chm/okularApplication_chm.desktop b/generators/chm/okularApplication_chm.desktop index 7e81d2875..371c29c94 100755 --- a/generators/chm/okularApplication_chm.desktop +++ b/generators/chm/okularApplication_chm.desktop @@ -145,6 +145,7 @@ X-KDE-Keywords[it]=chm X-KDE-Keywords[kk]=chm X-KDE-Keywords[km]=chm X-KDE-Keywords[ko]=chm +X-KDE-Keywords[lv]=chm X-KDE-Keywords[nb]=chm X-KDE-Keywords[nds]=CHM X-KDE-Keywords[nl]=chm diff --git a/generators/comicbook/libokularGenerator_comicbook.desktop b/generators/comicbook/libokularGenerator_comicbook.desktop index bec8c92c3..d2937e301 100644 --- a/generators/comicbook/libokularGenerator_comicbook.desktop +++ b/generators/comicbook/libokularGenerator_comicbook.desktop @@ -16,7 +16,7 @@ Name[eo]=ComicBook Name[es]=Comic Book Name[et]=Koomiks Name[eu]=Komikia -Name[fi]=Sarjakuva +Name[fi]=Comic Book Name[fr]=«  Comic Book » Name[ga]=Comic Book Name[gl]=Libro de banda deseñada @@ -74,7 +74,7 @@ Comment[en_GB]=Comic book backend for Okular Comment[es]=Motor de libros de Comic para Okular Comment[et]=Okulari koomiksite taustaprogramm Comment[eu]=Okular-en komiki motorra -Comment[fi]=Sarjakuvat-taustaosa Okular-ohjelmalle +Comment[fi]=Comic book -taustaosa Okularille Comment[fr]=Interface d'Okular pour les bandes dessinés Comment[ga]=Inneall Comic Book le haghaidh Okular Comment[gl]=Infraestruturas de banda deseñada para Okular diff --git a/generators/comicbook/okularApplication_comicbook.desktop b/generators/comicbook/okularApplication_comicbook.desktop index 23c96b15f..ad0455706 100755 --- a/generators/comicbook/okularApplication_comicbook.desktop +++ b/generators/comicbook/okularApplication_comicbook.desktop @@ -137,7 +137,7 @@ X-KDE-Keywords[de]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[el]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[es]=cbr, cbz, cbt, libro de cómic X-KDE-Keywords[et]=cbr, cbz, cbt, Comic Book, koomiks -X-KDE-Keywords[fi]=cbr, cbz, cbt, Sarjakuva +X-KDE-Keywords[fi]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[fr]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[ga]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[hu]=cbr, cbz, cbt, Képregény @@ -145,6 +145,7 @@ X-KDE-Keywords[it]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[kk]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[km]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[ko]=cbr, cbz, cbt, Comic Book,만화책 +X-KDE-Keywords[lv]=cbr, cbz, cbt, Comic Book X-KDE-Keywords[nb]=cbr, cbz, cbt, tegneserie X-KDE-Keywords[nds]=cbr, cbz, cbt, Comicbook X-KDE-Keywords[nl]=cbr, cbz, cbt, Stripverhaal diff --git a/generators/djvu/libokularGenerator_djvu.desktop b/generators/djvu/libokularGenerator_djvu.desktop index 1093b8b52..384e9af6e 100644 --- a/generators/djvu/libokularGenerator_djvu.desktop +++ b/generators/djvu/libokularGenerator_djvu.desktop @@ -76,7 +76,7 @@ Comment[en_GB]=DjVu backend for Okular Comment[es]=Motor DjVu para Okular Comment[et]=Okulari DjVu taustaprogramm Comment[eu]=Okular-en DjVu motorra -Comment[fi]=DjVu-taustaosa Okular-lukijalle +Comment[fi]=DjVu-taustaosa Okularille Comment[fr]=Interface d'Okular pour DjVu Comment[ga]=Inneall DjVu le haghaidh Okular Comment[gl]=Infraestrutura de DjVu para Okular diff --git a/generators/djvu/okularApplication_djvu.desktop b/generators/djvu/okularApplication_djvu.desktop index e6fd483b9..377d231ea 100755 --- a/generators/djvu/okularApplication_djvu.desktop +++ b/generators/djvu/okularApplication_djvu.desktop @@ -145,6 +145,7 @@ X-KDE-Keywords[it]=djvu X-KDE-Keywords[kk]=djvu X-KDE-Keywords[km]=djvu X-KDE-Keywords[ko]=djvu +X-KDE-Keywords[lv]=djvu X-KDE-Keywords[nb]=djvu X-KDE-Keywords[nds]=DjVu X-KDE-Keywords[nl]=djvu diff --git a/generators/dvi/libokularGenerator_dvi.desktop b/generators/dvi/libokularGenerator_dvi.desktop index c5224f06b..62b160774 100644 --- a/generators/dvi/libokularGenerator_dvi.desktop +++ b/generators/dvi/libokularGenerator_dvi.desktop @@ -76,7 +76,7 @@ Comment[en_GB]=DVI backend for Okular Comment[es]=Motor DVI para Okular Comment[et]=Okulari DVI taustaprogramm Comment[eu]=Okular-en DVI motorra -Comment[fi]=DVI-taustaosa Okular-lukijalle +Comment[fi]=DVI-taustaosa Okularille Comment[fr]=Interface d'Okular pour le DVI Comment[ga]=Inneall DVI le haghaidh Okular Comment[gl]=Infraestrutura de DVI para Okular diff --git a/generators/dvi/okularApplication_dvi.desktop b/generators/dvi/okularApplication_dvi.desktop index 6c5990f23..84bddb3cf 100755 --- a/generators/dvi/okularApplication_dvi.desktop +++ b/generators/dvi/okularApplication_dvi.desktop @@ -145,6 +145,7 @@ X-KDE-Keywords[it]=dvi X-KDE-Keywords[kk]=dvi X-KDE-Keywords[km]=dvi X-KDE-Keywords[ko]=dvi +X-KDE-Keywords[lv]=dvi X-KDE-Keywords[nb]=dvi X-KDE-Keywords[nds]=DVI X-KDE-Keywords[nl]=dvi diff --git a/generators/epub/libokularGenerator_epub.desktop b/generators/epub/libokularGenerator_epub.desktop index daeeb8e84..f8e578432 100644 --- a/generators/epub/libokularGenerator_epub.desktop +++ b/generators/epub/libokularGenerator_epub.desktop @@ -71,7 +71,7 @@ Comment[en_GB]=EPub backend for Okular Comment[es]=Motor EPub para Okular Comment[et]=Okulari EPubi taustaprogramm Comment[eu]=Okular-en EPub motorra -Comment[fi]=EPub-taustaosa Okular-lukijalle +Comment[fi]=EPub-taustaosa Okularille Comment[fr]=Interface d'Okular pour EPub Comment[ga]=Inneall EPub le haghaidh Okular Comment[gl]=Infraestrutura de EPub para Okular diff --git a/generators/epub/okularApplication_epub.desktop b/generators/epub/okularApplication_epub.desktop index 400073359..16f6a13d2 100755 --- a/generators/epub/okularApplication_epub.desktop +++ b/generators/epub/okularApplication_epub.desktop @@ -145,6 +145,7 @@ X-KDE-Keywords[it]=epub, e-book X-KDE-Keywords[kk]=epub, e-book X-KDE-Keywords[km]=epub, e-book X-KDE-Keywords[ko]=epub, e-book,전자책,이북 +X-KDE-Keywords[lv]=epub, e-book, e-grāmata X-KDE-Keywords[nb]=epub, e-bok X-KDE-Keywords[nds]=epub, e-book X-KDE-Keywords[nl]=epub, e-book diff --git a/generators/fax/libokularGenerator_fax.desktop b/generators/fax/libokularGenerator_fax.desktop index 83537677e..145f59498 100644 --- a/generators/fax/libokularGenerator_fax.desktop +++ b/generators/fax/libokularGenerator_fax.desktop @@ -71,7 +71,7 @@ Comment[en_GB]=G3/G4 Fax backend for Okular Comment[es]=Motor de fax G3/G4 para Okular Comment[et]=Okulari G3/G4 faksi taustaprogramm Comment[eu]=Okular-en G3/G4 faxaren motorra -Comment[fi]=G3/G4-Faksitaustaosa Okular-lukijalle +Comment[fi]=G3/G4-faksitaustaosa Okularille Comment[fr]=Interface d'Okular pour les fax de type G3/G4 Comment[ga]=Inneall facsála G3/G4 le haghaidh Okular Comment[gl]=Infraestrutura de fax G3/G4 para Okular diff --git a/generators/fictionbook/libokularGenerator_fb.desktop b/generators/fictionbook/libokularGenerator_fb.desktop index c94b9e664..dcaf5ca0d 100644 --- a/generators/fictionbook/libokularGenerator_fb.desktop +++ b/generators/fictionbook/libokularGenerator_fb.desktop @@ -73,7 +73,7 @@ Comment[en_GB]=FictionBook backend for Okular Comment[es]=Motor FictionBook para Okular Comment[et]=Okulari FictionBooki taustaprogramm Comment[eu]=Okular-en fikzio-libururen motorra -Comment[fi]=FictionBook-taustaosa Okular-lukijalle +Comment[fi]=FictionBook-taustaosa Okularille Comment[fr]=Interface d'Okular pour « FictionBook » Comment[ga]=Inneall FictionBook le haghaidh Okular Comment[gl]=Infraestrutura FictionBook para Okular diff --git a/generators/fictionbook/okularApplication_fb.desktop b/generators/fictionbook/okularApplication_fb.desktop index 0e9e63a00..eafaa0d11 100755 --- a/generators/fictionbook/okularApplication_fb.desktop +++ b/generators/fictionbook/okularApplication_fb.desktop @@ -145,6 +145,7 @@ X-KDE-Keywords[it]=FictionBook, e-book, fb2 X-KDE-Keywords[kk]=FictionBook, e-book, fb2 X-KDE-Keywords[km]=FictionBook, e-book, fb2 X-KDE-Keywords[ko]=FictionBook, e-book, fb2 +X-KDE-Keywords[lv]=FictionBook, e-book, fb2, e-grāmata X-KDE-Keywords[nb]=FictionBook, e-bok, fb2 X-KDE-Keywords[nds]=FictionBook, e-book, fb2 X-KDE-Keywords[nl]=Fictieboek, e-book, fb2 diff --git a/generators/kimgio/libokularGenerator_kimgio.desktop b/generators/kimgio/libokularGenerator_kimgio.desktop index 0b4429b89..340724275 100644 --- a/generators/kimgio/libokularGenerator_kimgio.desktop +++ b/generators/kimgio/libokularGenerator_kimgio.desktop @@ -76,7 +76,7 @@ Comment[en_GB]=Image backend for Okular Comment[es]=Motor de imágenes para Okular Comment[et]=Okulari piltide taustaprogramm Comment[eu]=Okular-en irudi motorra -Comment[fi]=Kuvataustaosta Okular-lukijalle +Comment[fi]=Kuvataustaosta Okularille Comment[fr]=Interface d'Okular pour les images Comment[ga]=Inneall íomhánna le haghaidh Okular Comment[gl]=Infraestrutura de imaxes para Okular diff --git a/generators/ooo/libokularGenerator_ooo.desktop b/generators/ooo/libokularGenerator_ooo.desktop index cf33e82fa..f20838400 100644 --- a/generators/ooo/libokularGenerator_ooo.desktop +++ b/generators/ooo/libokularGenerator_ooo.desktop @@ -16,7 +16,7 @@ Name[eo]=OpenDocument formato Name[es]=Formato OpenDocument Name[et]=OpenDocumenti vorming Name[eu]=OpenDocument formatua -Name[fi]=OpenDocument -muoto +Name[fi]=OpenDocument-muoto Name[fr]=Format OpenDocument Name[ga]=Formáid OpenDocument Name[gl]=Formato OpenDocument @@ -75,7 +75,7 @@ Comment[en_GB]=OpenDocument backend for Okular Comment[es]=Motor OpenDocument para Okular Comment[et]=Okulari OpenDocumenti taustaprogramm Comment[eu]=Okular-en OpenDocument motorra -Comment[fi]=OpenDocument-taustaosa Okular-lukijalle +Comment[fi]=OpenDocument-taustaosa Okularille Comment[fr]=Interface d'Okular pour le format OpenDocument Comment[ga]=Inneall OpenDocument le haghaidh Okular Comment[gl]=Infraestrutura de OpenDocument para Okular diff --git a/generators/plucker/libokularGenerator_plucker.desktop b/generators/plucker/libokularGenerator_plucker.desktop index 579c1ee8f..f50d7b9a6 100644 --- a/generators/plucker/libokularGenerator_plucker.desktop +++ b/generators/plucker/libokularGenerator_plucker.desktop @@ -75,7 +75,7 @@ Comment[en_GB]=Plucker backend for Okular Comment[es]=Motor Plucker para Okular Comment[et]=Okulari Pluckeri taustaprogramm Comment[eu]=Okular-en Plucker motorra -Comment[fi]=Plucker-taustaosa Okular-lukijalle +Comment[fi]=Plucker-taustaosa Okularille Comment[fr]=Interface d'Okular pour les fichiers Plucker Comment[ga]=Inneall Plucker le haghaidh Okular Comment[gl]=Infraestrutura de Plucker para Okular diff --git a/generators/plucker/okularApplication_plucker.desktop b/generators/plucker/okularApplication_plucker.desktop index 952e0259a..7d06d93fc 100755 --- a/generators/plucker/okularApplication_plucker.desktop +++ b/generators/plucker/okularApplication_plucker.desktop @@ -145,6 +145,7 @@ X-KDE-Keywords[it]=plucker X-KDE-Keywords[kk]=plucker X-KDE-Keywords[km]=plucker X-KDE-Keywords[ko]=plucker +X-KDE-Keywords[lv]=plucker X-KDE-Keywords[nb]=plucker X-KDE-Keywords[nds]=Plucker X-KDE-Keywords[nl]=plucker diff --git a/generators/poppler/libokularGenerator_poppler.desktop b/generators/poppler/libokularGenerator_poppler.desktop index 9962dc301..7dd547c3d 100644 --- a/generators/poppler/libokularGenerator_poppler.desktop +++ b/generators/poppler/libokularGenerator_poppler.desktop @@ -75,7 +75,7 @@ Comment[en_GB]=PDF backend for Okular using poppler Comment[es]=Motor PDF para Okular que usa Poppler Comment[et]=Okulari PDF-i taustaprogramm poppleri vahendusel Comment[eu]=Okular-en PDF motorra poppler erabiliz -Comment[fi]=Poppler-kirjastoa käyttävä PDF-taustaosa Okular-lukijalle +Comment[fi]=Poppler-kirjastoa käyttävä PDF-taustaosa Okularille Comment[fr]=Interface d'Okular pour les PDF (utilise poppler) Comment[ga]=Inneall PDF a úsáideann poppler le haghaidh Okular Comment[gl]=Infraestrutura de PDF mediante poppler para Okular diff --git a/generators/poppler/okularApplication_pdf.desktop b/generators/poppler/okularApplication_pdf.desktop index 7b6029dcc..9949772f1 100755 --- a/generators/poppler/okularApplication_pdf.desktop +++ b/generators/poppler/okularApplication_pdf.desktop @@ -144,6 +144,7 @@ X-KDE-Keywords[it]=PDF, Portable Document Format, formato per documenti portabil X-KDE-Keywords[kk]=PDF, Portable Document Format X-KDE-Keywords[km]=PDF, Portable Document Format X-KDE-Keywords[ko]=PDF, Portable Document Format +X-KDE-Keywords[lv]=PDF, Portable Document formāts X-KDE-Keywords[nb]=PDF, Portabelt Dokument Format X-KDE-Keywords[nds]=PDF, Porteerbor Dokmentformaat X-KDE-Keywords[nl]=PDF, Portable Document Format diff --git a/generators/spectre/libokularGenerator_ghostview.desktop b/generators/spectre/libokularGenerator_ghostview.desktop index 78e104b32..6780bac9d 100644 --- a/generators/spectre/libokularGenerator_ghostview.desktop +++ b/generators/spectre/libokularGenerator_ghostview.desktop @@ -75,7 +75,7 @@ Comment[en_GB]=Ghostscript PS/PDF backend for Okular Comment[es]=Motor PS/PDF de Ghostscript para Okular Comment[et]=Okulari Ghostscript PS/PDF-i taustaprogramm Comment[eu]=Okular-en Ghostscript PS/PDF motorra -Comment[fi]=Ghostscript-pohjainen PS/PDF-taustaosa ohjelmaa Okular varten +Comment[fi]=Ghostscript-pohjainen PS/PDF-taustaosa Okularille Comment[fr]=Interface d'Okular pour les fichiers Ghostscript PS/PDF Comment[ga]=Inneall PS/PDF Ghostscript le haghaidh Okular Comment[gl]=Infraestrutura Ghostscript PS/PDF para Okular diff --git a/generators/tiff/libokularGenerator_tiff.desktop b/generators/tiff/libokularGenerator_tiff.desktop index 2a7388e1d..e9faff8e3 100644 --- a/generators/tiff/libokularGenerator_tiff.desktop +++ b/generators/tiff/libokularGenerator_tiff.desktop @@ -15,7 +15,7 @@ Name[en_GB]=Okular TIFF Library Name[es]=Biblioteca TIFF de Okular Name[et]=Okulari TIFF-i teek Name[eu]=Okular TIFF liburutegia -Name[fi]=Okular TIFF-kirjasto +Name[fi]=TIFF-kirjasto Okularille Name[fr]=Librairie d'Okular pour le format TIFF Name[ga]=Leabharlann TIFF Okular Name[gl]=Biblioteca TIFF de Okular @@ -71,7 +71,7 @@ Comment[en_GB]=TIFF backend for Okular Comment[es]=Motor TIFF para Okular Comment[et]=Okulari TIFF-i taustaprogramm Comment[eu]=Okular-en TIFF motorra -Comment[fi]=TIFF-taustaosa ohjelmaa Okular varten +Comment[fi]=TIFF-taustaosa Okularille Comment[fr]=Interface d'Okular pour les fichiers TIFF Comment[ga]=Inneall TIFF le haghaidh Okular Comment[gl]=Infraestrutura de TIFF para Okular diff --git a/generators/xps/libokularGenerator_xps.desktop b/generators/xps/libokularGenerator_xps.desktop index 40409aaa5..c6908bb77 100644 --- a/generators/xps/libokularGenerator_xps.desktop +++ b/generators/xps/libokularGenerator_xps.desktop @@ -15,7 +15,7 @@ Name[en_GB]=Okular XPS Plugin Name[es]=Complemento XPS de Okular Name[et]=Okulari XPS-i plugin Name[eu]=Okular-en XPS plugina -Name[fi]=XPS-liitännäinen ohjelmaa Okular varten +Name[fi]=XPS-liitännäinen Okularille Name[fr]=Module externe XPS pour Okular Name[ga]=Breiseán XPS Okular Name[gl]=Extensión XPS para Okular @@ -71,7 +71,7 @@ Comment[en_GB]=XPS backend for Okular Comment[es]=Motor XPS para Okular Comment[et]=Okulari XPS-i taustaprogramm Comment[eu]=Okular-en XPS motorra -Comment[fi]=XPS-taustaosa ohjelmaa Okular varten +Comment[fi]=XPS-taustaosa Okularille Comment[fr]=Interface d'Okular pour les fichiers XPS Comment[ga]=Inneall XPS le haghaidh Okular Comment[gl]=Infraestrutura de XPS para Okular diff --git a/generators/xps/okularApplication_xps.desktop b/generators/xps/okularApplication_xps.desktop index 819a27de1..71e636848 100755 --- a/generators/xps/okularApplication_xps.desktop +++ b/generators/xps/okularApplication_xps.desktop @@ -144,6 +144,7 @@ X-KDE-Keywords[it]=XPS X-KDE-Keywords[kk]=XPS X-KDE-Keywords[km]=XPS X-KDE-Keywords[ko]=XPS +X-KDE-Keywords[lv]=XPS X-KDE-Keywords[nb]=XPS X-KDE-Keywords[nds]=XPS X-KDE-Keywords[nl]=XPS From e37c43b1896ff092bcc3a9c22dd99859fd1c6b5b Mon Sep 17 00:00:00 2001 From: "Yury G. Kudryashov" Date: Wed, 8 Aug 2012 02:03:32 +0400 Subject: [PATCH 101/155] Explicitly decode filename using QString::fromLocal8Bit() This fixes inverse search for TeX files having non-ASCII chars in their path. --- generators/poppler/generator_pdf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index a7b86eb21..71c962ce5 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -1634,7 +1634,7 @@ const Okular::SourceReference * PDFGenerator::dynamicSourceReference( int pageNr } const char *name = synctex_scanner_get_name( synctex_scanner, synctex_node_tag( node ) ); - Okular::SourceReference * sourceRef = new Okular::SourceReference( name, line, col ); + Okular::SourceReference * sourceRef = new Okular::SourceReference( QString::fromLocal8Bit( name ), line, col ); return sourceRef; } } From e04ba6827daf6a42ba0e7bc209e745d21f5810a2 Mon Sep 17 00:00:00 2001 From: "Yury G. Kudryashov" Date: Wed, 8 Aug 2012 02:03:32 +0400 Subject: [PATCH 102/155] Explicitly decode filename using QString::fromLocal8Bit() This fixes inverse search for TeX files having non-ASCII chars in their path. --- generators/poppler/generator_pdf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index ca9ae2471..ae95134df 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -1632,7 +1632,7 @@ const Okular::SourceReference * PDFGenerator::dynamicSourceReference( int pageNr } const char *name = synctex_scanner_get_name( synctex_scanner, synctex_node_tag( node ) ); - Okular::SourceReference * sourceRef = new Okular::SourceReference( name, line, col ); + Okular::SourceReference * sourceRef = new Okular::SourceReference( QString::fromLocal8Bit( name ), line, col ); return sourceRef; } } From 06ec381288bf9d560013a4ff0ef19197f370565e Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 8 Aug 2012 21:05:15 +0200 Subject: [PATCH 103/155] Fix crash when a drag contains the url format but doesn't contain any url data for that format KUrl::List::canDecode( ev->mimeData() ) doesn't mean KUrl::List::fromMimeData( ev->mimeData() ) will not be empty BUGS: 304789 FIXED-IN: 4.9.1 --- ui/pageview.cpp | 6 +++++- ui/thumbnaillist.cpp | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ui/pageview.cpp b/ui/pageview.cpp index bf759a412..cf5de1df0 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -2927,7 +2927,11 @@ void PageView::dragMoveEvent( QDragMoveEvent * ev ) void PageView::dropEvent( QDropEvent * ev ) { if ( KUrl::List::canDecode( ev->mimeData() ) ) - emit urlDropped( KUrl::List::fromMimeData( ev->mimeData() ).first() ); + { + const KUrl::List list = KUrl::List::fromMimeData( ev->mimeData() ); + if ( !list.isEmpty() ) + emit urlDropped( list.first() ); + } } bool PageView::viewportEvent( QEvent * e ) diff --git a/ui/thumbnaillist.cpp b/ui/thumbnaillist.cpp index 0511d9342..8b2302586 100644 --- a/ui/thumbnaillist.cpp +++ b/ui/thumbnaillist.cpp @@ -618,7 +618,11 @@ void ThumbnailList::dragEnterEvent( QDragEnterEvent * ev ) void ThumbnailList::dropEvent( QDropEvent * ev ) { if ( KUrl::List::canDecode( ev->mimeData() ) ) - emit urlDropped( KUrl::List::fromMimeData( ev->mimeData() ).first() ); + { + const KUrl::List list = KUrl::List::fromMimeData( ev->mimeData() ); + if ( !list.isEmpty() ) + emit urlDropped( list.first() ); + } } //END widget events From a0339dec66f6e4ad387bdb37c64706d6f1d61cbe Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 8 Aug 2012 21:05:15 +0200 Subject: [PATCH 104/155] Fix crash when a drag contains the url format but doesn't contain any url data for that format KUrl::List::canDecode( ev->mimeData() ) doesn't mean KUrl::List::fromMimeData( ev->mimeData() ) will not be empty BUGS: 304789 FIXED-IN: 4.9.1 --- ui/pageview.cpp | 6 +++++- ui/thumbnaillist.cpp | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ui/pageview.cpp b/ui/pageview.cpp index b74941d17..bcb47959c 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -2939,7 +2939,11 @@ void PageView::dragMoveEvent( QDragMoveEvent * ev ) void PageView::dropEvent( QDropEvent * ev ) { if ( KUrl::List::canDecode( ev->mimeData() ) ) - emit urlDropped( KUrl::List::fromMimeData( ev->mimeData() ).first() ); + { + const KUrl::List list = KUrl::List::fromMimeData( ev->mimeData() ); + if ( !list.isEmpty() ) + emit urlDropped( list.first() ); + } } bool PageView::viewportEvent( QEvent * e ) diff --git a/ui/thumbnaillist.cpp b/ui/thumbnaillist.cpp index 0511d9342..8b2302586 100644 --- a/ui/thumbnaillist.cpp +++ b/ui/thumbnaillist.cpp @@ -618,7 +618,11 @@ void ThumbnailList::dragEnterEvent( QDragEnterEvent * ev ) void ThumbnailList::dropEvent( QDropEvent * ev ) { if ( KUrl::List::canDecode( ev->mimeData() ) ) - emit urlDropped( KUrl::List::fromMimeData( ev->mimeData() ).first() ); + { + const KUrl::List list = KUrl::List::fromMimeData( ev->mimeData() ); + if ( !list.isEmpty() ) + emit urlDropped( list.first() ); + } } //END widget events From 4eee1f34793076d3f7ab4dccff87724806da6141 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Sun, 12 Aug 2012 13:50:41 +0200 Subject: [PATCH 105/155] Do not delete the Part on the Shell destructor The machinery in KParts/QObject is already doing it and this way we don't get the KXMLGUIClient::~KXMLGUIClient: 0x15637528 deleted without having been removed from the factory first. This will leak standalone popupmenus and could lead to crashes. warning I'm not sure if calling this a kdelibs bug yet or not though :D BUGS: 261538 FIXED-IN: 4.9.1 --- shell/shell.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/shell.cpp b/shell/shell.cpp index 8b42a2759..df40f7d64 100644 --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -120,7 +120,7 @@ void Shell::delayedOpen() Shell::~Shell() { if ( m_part ) writeSettings(); - delete m_part; + m_part = 0; // It is deleted by the KPart/QObject machinery if ( m_args ) m_args->clear(); } From 035c32996ea45aa682db1d18460606ef12c5e6b3 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Sun, 12 Aug 2012 13:50:41 +0200 Subject: [PATCH 106/155] Do not delete the Part on the Shell destructor The machinery in KParts/QObject is already doing it and this way we don't get the KXMLGUIClient::~KXMLGUIClient: 0x15637528 deleted without having been removed from the factory first. This will leak standalone popupmenus and could lead to crashes. warning I'm not sure if calling this a kdelibs bug yet or not though :D BUGS: 261538 FIXED-IN: 4.9.1 --- shell/shell.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/shell.cpp b/shell/shell.cpp index 8b42a2759..df40f7d64 100644 --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -120,7 +120,7 @@ void Shell::delayedOpen() Shell::~Shell() { if ( m_part ) writeSettings(); - delete m_part; + m_part = 0; // It is deleted by the KPart/QObject machinery if ( m_args ) m_args->clear(); } From 58eb957f26e0688ceec561160febfaeb28f2b5b1 Mon Sep 17 00:00:00 2001 From: Tobias Koenig Date: Fri, 29 Jun 2012 12:39:42 +0200 Subject: [PATCH 107/155] Support multiple annotations in RMB menu Provide the actions for all annotations in the RMB menu, if multiple annotations are located on top of each other. BUGS: 300942 REVIEW: 106035 FIXED-IN: 4.10.0 --- core/page.cpp | 13 +++++++ core/page.h | 6 ++++ ui/annotationpopup.cpp | 79 +++++++++++++++++++++++------------------- ui/annotationpopup.h | 10 ++++-- ui/pageview.cpp | 18 ++++++---- 5 files changed, 83 insertions(+), 43 deletions(-) diff --git a/core/page.cpp b/core/page.cpp index c778fe286..ca40d92e6 100644 --- a/core/page.cpp +++ b/core/page.cpp @@ -405,6 +405,19 @@ const ObjectRect * Page::objectRect( ObjectRect::ObjectType type, double x, doub return 0; } +QLinkedList< const ObjectRect * > Page::objectRects( ObjectRect::ObjectType type, double x, double y, double xScale, double yScale ) const +{ + QLinkedList< const ObjectRect * > result; + + QLinkedList< ObjectRect * >::const_iterator it = m_rects.begin(), end = m_rects.end(); + for ( ; it != end; ++it ) + if ( ( (*it)->objectType() == type ) && (*it)->contains( x, y, xScale, yScale ) ) + result.append( *it ); + + return result; +} + + const ObjectRect* Page::nearestObjectRect( ObjectRect::ObjectType type, double x, double y, double xScale, double yScale, double * distance ) const { ObjectRect * res = 0; diff --git a/core/page.h b/core/page.h index a2571b753..a8f276113 100644 --- a/core/page.h +++ b/core/page.h @@ -223,6 +223,12 @@ class OKULAR_EXPORT Page */ const ObjectRect * objectRect( ObjectRect::ObjectType type, double x, double y, double xScale, double yScale ) const; + /** + * Returns all object rects of the given @p type which are at point (@p x, @p y) at scale (@p xScale, @p yScale). + * @since 0.16 (KDE 4.10) + */ + QLinkedList< const ObjectRect * > objectRects( ObjectRect::ObjectType type, double x, double y, double xScale, double yScale ) const; + /** * Returns the object rect of the given @p type which is nearest to the point (@p x, @p y) at scale (@p xScale, @p yScale). * diff --git a/ui/annotationpopup.cpp b/ui/annotationpopup.cpp index 1c3a71714..6d0000417 100644 --- a/ui/annotationpopup.cpp +++ b/ui/annotationpopup.cpp @@ -18,6 +18,8 @@ #include "core/document.h" #include "guiutils.h" +Q_DECLARE_METATYPE( AnnotationPopup::AnnotPagePair ) + AnnotationPopup::AnnotationPopup( Okular::Document *document, QWidget *parent ) : mParent( parent ), mDocument( document ) @@ -38,57 +40,64 @@ void AnnotationPopup::exec( const QPoint &point ) KMenu menu( mParent ); - QAction *popoutWindow = 0; - QAction *deleteNote = 0; - QAction *showProperties = 0; - QAction *saveAttachment = 0; + QAction *action = 0; Okular::FileAttachmentAnnotation *fileAttachAnnot = 0; - const bool onlyOne = mAnnotations.count() == 1; + const char *actionTypeId = "actionType"; - menu.addTitle( i18np( "Annotation", "%1 Annotations", mAnnotations.count() ) ); - popoutWindow = menu.addAction( KIcon( "comment" ), i18n( "&Open Pop-up Note" ) ); - popoutWindow->setEnabled( onlyOne ); - deleteNote = menu.addAction( KIcon( "list-remove" ), i18n( "&Delete" ) ); - deleteNote->setEnabled( mDocument->isAllowed( Okular::AllowNotes ) ); + const QString openId = QString::fromLatin1( "open" ); + const QString deleteId = QString::fromLatin1( "delete" ); + const QString propertiesId = QString::fromLatin1( "properties" ); + const QString saveId = QString::fromLatin1( "save" ); - const AnnotPagePair &firstAnnotPagePair = mAnnotations.at(0); foreach ( const AnnotPagePair& pair, mAnnotations ) { - if ( !mDocument->canRemovePageAnnotation(pair.annotation) ) - deleteNote->setEnabled( false ); - } + menu.addTitle( GuiUtils::captionForAnnotation( pair.annotation ) ); - showProperties = menu.addAction( KIcon( "configure" ), i18n( "&Properties" ) ); - showProperties->setEnabled( onlyOne ); + action = menu.addAction( KIcon( "comment" ), i18n( "&Open Pop-up Note" ) ); + action->setData( QVariant::fromValue( pair ) ); + action->setProperty( actionTypeId, openId ); - if ( onlyOne && firstAnnotPagePair.annotation->subType() == Okular::Annotation::AFileAttachment ) - { - menu.addSeparator(); - fileAttachAnnot = static_cast< Okular::FileAttachmentAnnotation * >( firstAnnotPagePair.annotation ); - const QString saveText = i18nc( "%1 is the name of the file to save", "&Save '%1'...", fileAttachAnnot->embeddedFile()->name() ); - saveAttachment = menu.addAction( KIcon( "document-save" ), saveText ); + action = menu.addAction( KIcon( "list-remove" ), i18n( "&Delete" ) ); + action->setEnabled( mDocument->isAllowed( Okular::AllowNotes ) && + mDocument->canRemovePageAnnotation( pair.annotation ) ); + action->setData( QVariant::fromValue( pair ) ); + action->setProperty( actionTypeId, deleteId ); + + action = menu.addAction( KIcon( "configure" ), i18n( "&Properties" ) ); + action->setData( QVariant::fromValue( pair ) ); + action->setProperty( actionTypeId, propertiesId ); + + if ( pair.annotation->subType() == Okular::Annotation::AFileAttachment ) + { + fileAttachAnnot = static_cast< Okular::FileAttachmentAnnotation * >( pair.annotation ); + const QString saveText = i18nc( "%1 is the name of the file to save", "&Save '%1'...", fileAttachAnnot->embeddedFile()->name() ); + + action = menu.addAction( KIcon( "document-save" ), saveText ); + action->setData( QVariant::fromValue( pair ) ); + action->setProperty( actionTypeId, saveId ); + } } QAction *choice = menu.exec( point.isNull() ? QCursor::pos() : point ); // check if the user really selected an action if ( choice ) { - if ( choice == popoutWindow ) { - emit openAnnotationWindow( firstAnnotPagePair.annotation, firstAnnotPagePair.pageNumber ); - } else if( choice == deleteNote ) { - Q_FOREACH ( const AnnotPagePair& pair, mAnnotations ) - { - if ( pair.pageNumber != -1 ) - mDocument->removePageAnnotation( pair.pageNumber, pair.annotation ); - } - } else if( choice == showProperties ) { - if ( firstAnnotPagePair.pageNumber != -1 ) { - AnnotsPropertiesDialog propdialog( mParent, mDocument, firstAnnotPagePair.pageNumber, firstAnnotPagePair.annotation ); + const AnnotPagePair pair = choice->data().value(); + + const QString actionType = choice->property( actionTypeId ).toString(); + if ( actionType == openId ) { + emit openAnnotationWindow( pair.annotation, pair.pageNumber ); + } else if( actionType == deleteId ) { + if ( pair.pageNumber != -1 ) + mDocument->removePageAnnotation( pair.pageNumber, pair.annotation ); + } else if( actionType == propertiesId ) { + if ( pair.pageNumber != -1 ) { + AnnotsPropertiesDialog propdialog( mParent, mDocument, pair.pageNumber, pair.annotation ); propdialog.exec(); } - } else if( choice == saveAttachment ) { - Q_ASSERT( fileAttachAnnot ); + } else if( actionType == saveId ) { + const Okular::FileAttachmentAnnotation * fileAttachAnnot = static_cast< Okular::FileAttachmentAnnotation * >( pair.annotation ); GuiUtils::saveEmbeddedFile( fileAttachAnnot->embeddedFile(), mParent ); } } diff --git a/ui/annotationpopup.h b/ui/annotationpopup.h index e74284c5d..9856933cf 100644 --- a/ui/annotationpopup.h +++ b/ui/annotationpopup.h @@ -35,9 +35,11 @@ class AnnotationPopup : public QObject Q_SIGNALS: void openAnnotationWindow( Okular::Annotation *annotation, int pageNumber ); - private: - QWidget *mParent; + public: struct AnnotPagePair { + AnnotPagePair() : annotation( 0 ), pageNumber( -1 ) + { } + AnnotPagePair( Okular::Annotation *a, int pn ) : annotation( a ), pageNumber( pn ) { } @@ -50,6 +52,10 @@ class AnnotationPopup : public QObject Okular::Annotation* annotation; int pageNumber; }; + + private: + QWidget *mParent; + QList< AnnotPagePair > mAnnotations; Okular::Document *mDocument; }; diff --git a/ui/pageview.cpp b/ui/pageview.cpp index bcb47959c..e158b601a 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -2015,14 +2015,20 @@ void PageView::mousePressEvent( QMouseEvent * e ) const QRect & itemRect = pageItem->uncroppedGeometry(); double nX = pageItem->absToPageX(eventPos.x()); double nY = pageItem->absToPageY(eventPos.y()); - Okular::Annotation * ann = 0; - const Okular::ObjectRect * orect = pageItem->page()->objectRect( Okular::ObjectRect::OAnnotation, nX, nY, itemRect.width(), itemRect.height() ); - if ( orect ) - ann = ( (Okular::AnnotationObjectRect *)orect )->annotation(); - if ( ann ) + + const QLinkedList< const Okular::ObjectRect *> orects = pageItem->page()->objectRects( Okular::ObjectRect::OAnnotation, nX, nY, itemRect.width(), itemRect.height() ); + + if ( !orects.isEmpty() ) { AnnotationPopup popup( d->document, this ); - popup.addAnnotation( ann, pageItem->pageNumber() ); + + foreach ( const Okular::ObjectRect * orect, orects ) + { + Okular::Annotation * ann = ( (Okular::AnnotationObjectRect *)orect )->annotation(); + if ( ann ) + popup.addAnnotation( ann, pageItem->pageNumber() ); + + } connect( &popup, SIGNAL(openAnnotationWindow(Okular::Annotation*,int)), this, SLOT(openAnnotationWindow(Okular::Annotation*,int)) ); From 719a0df886887d0465e95bcd5eca2708b9402464 Mon Sep 17 00:00:00 2001 From: Tobias Koenig Date: Wed, 15 Aug 2012 19:21:25 +0200 Subject: [PATCH 108/155] Use different RMB menus in page view and review pane Since the review pane has different requirements than the page view, this change introduces a mode parameter to the AnnotationPopup ctor. REVIEW: 106045 --- ui/annotationpopup.cpp | 68 ++++++++++++++++++++++++++++++++++++------ ui/annotationpopup.h | 13 ++++++-- ui/pageview.cpp | 2 +- ui/side_reviews.cpp | 2 +- 4 files changed, 72 insertions(+), 13 deletions(-) diff --git a/ui/annotationpopup.cpp b/ui/annotationpopup.cpp index 6d0000417..26b285994 100644 --- a/ui/annotationpopup.cpp +++ b/ui/annotationpopup.cpp @@ -20,9 +20,9 @@ Q_DECLARE_METATYPE( AnnotationPopup::AnnotPagePair ) -AnnotationPopup::AnnotationPopup( Okular::Document *document, +AnnotationPopup::AnnotationPopup( Okular::Document *document, MenuMode mode, QWidget *parent ) - : mParent( parent ), mDocument( document ) + : mParent( parent ), mDocument( document ), mMenuMode( mode ) { } @@ -47,29 +47,41 @@ void AnnotationPopup::exec( const QPoint &point ) const QString openId = QString::fromLatin1( "open" ); const QString deleteId = QString::fromLatin1( "delete" ); + const QString deleteAllId = QString::fromLatin1( "deleteAll" ); const QString propertiesId = QString::fromLatin1( "properties" ); const QString saveId = QString::fromLatin1( "save" ); - foreach ( const AnnotPagePair& pair, mAnnotations ) + if ( mMenuMode == SingleAnnotationMode ) { - menu.addTitle( GuiUtils::captionForAnnotation( pair.annotation ) ); + const bool onlyOne = (mAnnotations.count() == 1); + + const AnnotPagePair &pair = mAnnotations.at(0); + + menu.addTitle( i18np( "Annotation", "%1 Annotations", mAnnotations.count() ) ); action = menu.addAction( KIcon( "comment" ), i18n( "&Open Pop-up Note" ) ); action->setData( QVariant::fromValue( pair ) ); + action->setEnabled( onlyOne ); action->setProperty( actionTypeId, openId ); action = menu.addAction( KIcon( "list-remove" ), i18n( "&Delete" ) ); - action->setEnabled( mDocument->isAllowed( Okular::AllowNotes ) && - mDocument->canRemovePageAnnotation( pair.annotation ) ); - action->setData( QVariant::fromValue( pair ) ); - action->setProperty( actionTypeId, deleteId ); + action->setEnabled( mDocument->isAllowed( Okular::AllowNotes ) ); + action->setProperty( actionTypeId, deleteAllId ); + + foreach ( const AnnotPagePair& pair, mAnnotations ) + { + if ( !mDocument->canRemovePageAnnotation( pair.annotation ) ) + action->setEnabled( false ); + } action = menu.addAction( KIcon( "configure" ), i18n( "&Properties" ) ); action->setData( QVariant::fromValue( pair ) ); + action->setEnabled( onlyOne ); action->setProperty( actionTypeId, propertiesId ); - if ( pair.annotation->subType() == Okular::Annotation::AFileAttachment ) + if ( onlyOne && pair.annotation->subType() == Okular::Annotation::AFileAttachment ) { + menu.addSeparator(); fileAttachAnnot = static_cast< Okular::FileAttachmentAnnotation * >( pair.annotation ); const QString saveText = i18nc( "%1 is the name of the file to save", "&Save '%1'...", fileAttachAnnot->embeddedFile()->name() ); @@ -78,6 +90,38 @@ void AnnotationPopup::exec( const QPoint &point ) action->setProperty( actionTypeId, saveId ); } } + else + { + foreach ( const AnnotPagePair& pair, mAnnotations ) + { + menu.addTitle( GuiUtils::captionForAnnotation( pair.annotation ) ); + + action = menu.addAction( KIcon( "comment" ), i18n( "&Open Pop-up Note" ) ); + action->setData( QVariant::fromValue( pair ) ); + action->setProperty( actionTypeId, openId ); + + action = menu.addAction( KIcon( "list-remove" ), i18n( "&Delete" ) ); + action->setEnabled( mDocument->isAllowed( Okular::AllowNotes ) && + mDocument->canRemovePageAnnotation( pair.annotation ) ); + action->setData( QVariant::fromValue( pair ) ); + action->setProperty( actionTypeId, deleteId ); + + action = menu.addAction( KIcon( "configure" ), i18n( "&Properties" ) ); + action->setData( QVariant::fromValue( pair ) ); + action->setProperty( actionTypeId, propertiesId ); + + if ( pair.annotation->subType() == Okular::Annotation::AFileAttachment ) + { + menu.addSeparator(); + fileAttachAnnot = static_cast< Okular::FileAttachmentAnnotation * >( pair.annotation ); + const QString saveText = i18nc( "%1 is the name of the file to save", "&Save '%1'...", fileAttachAnnot->embeddedFile()->name() ); + + action = menu.addAction( KIcon( "document-save" ), saveText ); + action->setData( QVariant::fromValue( pair ) ); + action->setProperty( actionTypeId, saveId ); + } + } + } QAction *choice = menu.exec( point.isNull() ? QCursor::pos() : point ); @@ -91,6 +135,12 @@ void AnnotationPopup::exec( const QPoint &point ) } else if( actionType == deleteId ) { if ( pair.pageNumber != -1 ) mDocument->removePageAnnotation( pair.pageNumber, pair.annotation ); + } else if( actionType == deleteAllId ) { + Q_FOREACH ( const AnnotPagePair& pair, mAnnotations ) + { + if ( pair.pageNumber != -1 ) + mDocument->removePageAnnotation( pair.pageNumber, pair.annotation ); + } } else if( actionType == propertiesId ) { if ( pair.pageNumber != -1 ) { AnnotsPropertiesDialog propdialog( mParent, mDocument, pair.pageNumber, pair.annotation ); diff --git a/ui/annotationpopup.h b/ui/annotationpopup.h index 9856933cf..71946050d 100644 --- a/ui/annotationpopup.h +++ b/ui/annotationpopup.h @@ -25,8 +25,16 @@ class AnnotationPopup : public QObject Q_OBJECT public: - explicit AnnotationPopup( Okular::Document *document, - QWidget *parent = 0 ); + /** + * Describes the structure of the popup menu. + */ + enum MenuMode + { + SingleAnnotationMode, ///< The menu shows only entries to manipulate a single annotation, or multiple annotations as a group. + MultiAnnotationMode ///< The menu shows entries to manipulate multiple annotations. + }; + + AnnotationPopup( Okular::Document *document, MenuMode mode, QWidget *parent = 0 ); void addAnnotation( Okular::Annotation* annotation, int pageNumber ); @@ -58,6 +66,7 @@ class AnnotationPopup : public QObject QList< AnnotPagePair > mAnnotations; Okular::Document *mDocument; + MenuMode mMenuMode; }; diff --git a/ui/pageview.cpp b/ui/pageview.cpp index e158b601a..5e04412bd 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -2020,7 +2020,7 @@ void PageView::mousePressEvent( QMouseEvent * e ) if ( !orects.isEmpty() ) { - AnnotationPopup popup( d->document, this ); + AnnotationPopup popup( d->document, AnnotationPopup::MultiAnnotationMode, this ); foreach ( const Okular::ObjectRect * orect, orects ) { diff --git a/ui/side_reviews.cpp b/ui/side_reviews.cpp index fc4b307ef..a036c48be 100644 --- a/ui/side_reviews.cpp +++ b/ui/side_reviews.cpp @@ -252,7 +252,7 @@ QModelIndexList Reviews::retrieveAnnotations(const QModelIndex& idx) const void Reviews::contextMenuRequested( const QPoint &pos ) { - AnnotationPopup popup( m_document, this ); + AnnotationPopup popup( m_document, AnnotationPopup::SingleAnnotationMode, this ); connect( &popup, SIGNAL(openAnnotationWindow(Okular::Annotation*,int)), this, SIGNAL(openAnnotationWindow(Okular::Annotation*,int)) ); From d41f00e4bb142e07584ab25e7623e485b7f4e458 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Sat, 18 Aug 2012 18:36:30 +0200 Subject: [PATCH 109/155] Close the url on shell destruction Otherwise we end up in a busy loop on part deletion if there are pending requests Should not happen but if this fixes it don't see the need to lose time investigating why given the number of todo things --- shell/shell.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/shell/shell.cpp b/shell/shell.cpp index df40f7d64..8b99ce4ef 100644 --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -119,7 +119,11 @@ void Shell::delayedOpen() Shell::~Shell() { - if ( m_part ) writeSettings(); + if ( m_part ) + { + writeSettings(); + m_part->closeUrl(); + } m_part = 0; // It is deleted by the KPart/QObject machinery if ( m_args ) m_args->clear(); From aa042bd0f416edfb0eedcac6be6ba90b1c1c161c Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Sat, 18 Aug 2012 18:36:30 +0200 Subject: [PATCH 110/155] Close the url on shell destruction Otherwise we end up in a busy loop on part deletion if there are pending requests Should not happen but if this fixes it don't see the need to lose time investigating why given the number of todo things --- shell/shell.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/shell/shell.cpp b/shell/shell.cpp index df40f7d64..8b99ce4ef 100644 --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -119,7 +119,11 @@ void Shell::delayedOpen() Shell::~Shell() { - if ( m_part ) writeSettings(); + if ( m_part ) + { + writeSettings(); + m_part->closeUrl(); + } m_part = 0; // It is deleted by the KPart/QObject machinery if ( m_args ) m_args->clear(); From 8dbd83ab2a57d691ad2dfdbfa3bd0d5204573950 Mon Sep 17 00:00:00 2001 From: Tobias Koenig Date: Fri, 29 Jun 2012 11:16:28 +0200 Subject: [PATCH 111/155] Implement support for poster image of videos in PDF documents With this commit Okular will show a so called poster image for PDF documents containing movie annotations. The image will be a screenshot of the first frame of the video. BUGS: 301603 REVIEW: 105890 FIXED-IN: 4.10.0 --- CMakeLists.txt | 1 + cmake/modules/FindPoppler.cmake | 19 ++- core/movie.cpp | 25 +++- core/movie.h | 30 ++++ .../poppler/config-okular-poppler.h.cmake | 3 + generators/poppler/generator_pdf.cpp | 4 + ui/pageview.cpp | 4 +- ui/presentationwidget.cpp | 4 +- ui/snapshottaker.cpp | 31 +++++ ui/snapshottaker.h | 27 ++++ ui/videowidget.cpp | 128 +++++++++++++++++- ui/videowidget.h | 6 + 12 files changed, 267 insertions(+), 15 deletions(-) create mode 100644 ui/snapshottaker.cpp create mode 100644 ui/snapshottaker.h diff --git a/CMakeLists.txt b/CMakeLists.txt index e4cb88f53..31d0da594 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -169,6 +169,7 @@ set(okularpart_SRCS ui/searchwidget.cpp ui/sidebar.cpp ui/side_reviews.cpp + ui/snapshottaker.cpp ui/thumbnaillist.cpp ui/toc.cpp ui/tocmodel.cpp diff --git a/cmake/modules/FindPoppler.cmake b/cmake/modules/FindPoppler.cmake index ffa6950d2..06e711751 100644 --- a/cmake/modules/FindPoppler.cmake +++ b/cmake/modules/FindPoppler.cmake @@ -97,17 +97,30 @@ int main() } " HAVE_POPPLER_0_20) +check_cxx_source_compiles(" +#include + +int main() +{ + Poppler::MovieObject *movie = 0; + movie->showPosterImage(); + return 0; +} +" HAVE_POPPLER_0_22) + set(CMAKE_REQUIRED_INCLUDES) set(CMAKE_REQUIRED_LIBRARIES) - if (HAVE_POPPLER_0_20) + if (HAVE_POPPLER_0_22) + set(popplerVersionMessage "0.22") + elseif (HAVE_POPPLER_0_20) set(popplerVersionMessage "0.20") elseif (HAVE_POPPLER_0_16) set(popplerVersionMessage "0.16") elseif (HAVE_POPPLER_0_12_1) set(popplerVersionMessage "0.12.1") - else (HAVE_POPPLER_0_20) + else (HAVE_POPPLER_0_22) set(popplerVersionMessage "0.5.4") - endif (HAVE_POPPLER_0_20) + endif (HAVE_POPPLER_0_22) if (NOT Poppler_FIND_QUIETLY) message(STATUS "Found Poppler-Qt4: ${POPPLER_LIBRARY}, (>= ${popplerVersionMessage})") endif (NOT Poppler_FIND_QUIETLY) diff --git a/core/movie.cpp b/core/movie.cpp index 94e71a955..dd780eba0 100644 --- a/core/movie.cpp +++ b/core/movie.cpp @@ -12,6 +12,7 @@ // qt/kde includes #include +#include #include #include @@ -30,7 +31,8 @@ class Movie::Private m_playMode( PlayOnce ), m_tmp( 0 ), m_showControls( false ), - m_autoPlay( false ) + m_autoPlay( false ), + m_showPosterImage( false ) { } @@ -39,8 +41,10 @@ class Movie::Private Rotation m_rotation; PlayMode m_playMode; QTemporaryFile *m_tmp; + QImage m_posterImage; bool m_showControls : 1; bool m_autoPlay : 1; + bool m_showPosterImage : 1; }; Movie::Movie( const QString& fileName ) @@ -130,3 +134,22 @@ bool Movie::autoPlay() const return d->m_autoPlay; } +void Movie::setShowPosterImage( bool show ) +{ + d->m_showPosterImage = show; +} + +bool Movie::showPosterImage() const +{ + return d->m_showPosterImage; +} + +void Movie::setPosterImage( const QImage &image ) +{ + d->m_posterImage = image; +} + +QImage Movie::posterImage() const +{ + return d->m_posterImage; +} diff --git a/core/movie.h b/core/movie.h index cbe382e56..8d0e2fe70 100644 --- a/core/movie.h +++ b/core/movie.h @@ -16,6 +16,8 @@ #include +class QImage; + namespace Okular { /** @@ -107,6 +109,34 @@ class OKULAR_EXPORT Movie */ bool autoPlay() const; + /** + * Sets whether to show a poster image. + * + * @since 4.10 + */ + void setShowPosterImage( bool show ); + + /** + * Whether to show a poster image. + * + * @since 4.10 + */ + bool showPosterImage() const; + + /** + * Sets the poster image. + * + * @since 4.10 + */ + void setPosterImage( const QImage &image ); + + /** + * Returns the poster image. + * + * @since 4.10 + */ + QImage posterImage() const; + private: class Private; Private* const d; diff --git a/generators/poppler/config-okular-poppler.h.cmake b/generators/poppler/config-okular-poppler.h.cmake index df89d6882..2ce6a4a65 100644 --- a/generators/poppler/config-okular-poppler.h.cmake +++ b/generators/poppler/config-okular-poppler.h.cmake @@ -6,3 +6,6 @@ /* Defined if we have the 0.20 version of the Poppler library */ #cmakedefine HAVE_POPPLER_0_20 1 + +/* Defined if we have the 0.22 version of the Poppler library */ +#cmakedefine HAVE_POPPLER_0_22 1 diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index 71c962ce5..4ae902bc0 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -180,6 +180,10 @@ Okular::Movie* createMovieFromPopplerMovie( const Poppler::MovieObject *popplerM movie->setShowControls( popplerMovie->showControls() ); movie->setPlayMode( (Okular::Movie::PlayMode)popplerMovie->playMode() ); movie->setAutoPlay( false ); // will be triggered by external MovieAnnotation +#ifdef HAVE_POPPLER_0_22 + movie->setShowPosterImage( popplerMovie->showPosterImage() ); + movie->setPosterImage( popplerMovie->posterImage() ); +#endif return movie; } diff --git a/ui/pageview.cpp b/ui/pageview.cpp index 5e04412bd..25dc63b40 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -860,7 +860,7 @@ void PageView::notifySetup( const QVector< Okular::Page * > & pageSet, int setup Okular::MovieAnnotation * movieAnn = static_cast< Okular::MovieAnnotation * >( a ); VideoWidget * vw = new VideoWidget( movieAnn, d->document, viewport() ); item->videoWidgets().insert( movieAnn->movie(), vw ); - vw->hide(); + vw->pageEntered(); } } } @@ -3961,7 +3961,7 @@ void PageView::slotRequestVisiblePixmaps( int newValue ) if ( vw->isPlaying() && viewportRectAtZeroZero.intersect( vw->geometry() ).isEmpty() ) { vw->stop(); - vw->hide(); + vw->pageLeft(); } } diff --git a/ui/presentationwidget.cpp b/ui/presentationwidget.cpp index f4da5390c..37523e8cd 100644 --- a/ui/presentationwidget.cpp +++ b/ui/presentationwidget.cpp @@ -316,7 +316,7 @@ void PresentationWidget::notifySetup( const QVector< Okular::Page * > & pageSet, Okular::MovieAnnotation * movieAnn = static_cast< Okular::MovieAnnotation * >( a ); VideoWidget * vw = new VideoWidget( movieAnn, m_document, this ); frame->videoWidgets.insert( movieAnn->movie(), vw ); - vw->hide(); + vw->pageEntered(); } } frame->recalcGeometry( m_width, m_height, screenRatio ); @@ -809,7 +809,7 @@ void PresentationWidget::changePage( int newPage ) Q_FOREACH ( VideoWidget *vw, m_frames[ m_frameIndex ]->videoWidgets ) { vw->stop(); - vw->hide(); + vw->pageLeft(); } // stop audio playback, if any diff --git a/ui/snapshottaker.cpp b/ui/snapshottaker.cpp new file mode 100644 index 000000000..d48aafe0a --- /dev/null +++ b/ui/snapshottaker.cpp @@ -0,0 +1,31 @@ +#include "snapshottaker.h" + +#include +#include + +#include + +SnapshotTaker::SnapshotTaker( const QString &url, QObject *parent ) + : QObject( parent ) + , m_player( new Phonon::VideoPlayer( Phonon::NoCategory, 0 ) ) +{ + m_player->load( url ); + m_player->hide(); + + connect(m_player->mediaObject(), SIGNAL(stateChanged(Phonon::State, Phonon::State)), + this, SLOT(stateChanged(Phonon::State, Phonon::State))); + + m_player->play(); +} + +void SnapshotTaker::stateChanged(Phonon::State newState, Phonon::State) +{ + if (newState == Phonon::PlayingState) { + const QImage image = m_player->videoWidget()->snapshot(); + if (!image.isNull()) + emit finished( image ); + + m_player->stop(); + deleteLater(); + } +} diff --git a/ui/snapshottaker.h b/ui/snapshottaker.h new file mode 100644 index 000000000..66138d090 --- /dev/null +++ b/ui/snapshottaker.h @@ -0,0 +1,27 @@ +#ifndef SNAPSHOTTAKER_H +#define SNAPSHOTTAKER_H + +#include + +#include + +class QImage; + +class SnapshotTaker : public QObject +{ + Q_OBJECT + + public: + SnapshotTaker( const QString &url, QObject *parent = 0 ); + + Q_SIGNALS: + void finished( const QImage &image ); + + private Q_SLOTS: + void stateChanged(Phonon::State, Phonon::State); + + private: + Phonon::VideoPlayer *m_player; +}; + +#endif diff --git a/ui/videowidget.cpp b/ui/videowidget.cpp index 7d80b4344..3b7782d7d 100644 --- a/ui/videowidget.cpp +++ b/ui/videowidget.cpp @@ -11,10 +11,13 @@ // qt/kde includes #include +#include #include #include +#include #include #include +#include #include #include #include @@ -29,6 +32,7 @@ #include "core/annotations.h" #include "core/document.h" #include "core/movie.h" +#include "snapshottaker.h" static QAction* createToolBarButtonWithWidgetPopup( QToolBar* toolBar, QWidget *widget, const QIcon &icon ) { @@ -62,6 +66,9 @@ public: void load(); void setupPlayPauseAction( PlayPauseMode mode ); + void setPosterImage( const QImage& ); + void takeSnapshot(); + void videoStopped(); // slots void finished(); @@ -78,6 +85,8 @@ public: QAction *stopAction; QAction *seekSliderAction; QAction *seekSliderMenuAction; + QStackedLayout *pageLayout; + QLabel *posterImagePage; bool loaded : 1; }; @@ -121,6 +130,37 @@ void VideoWidget::Private::setupPlayPauseAction( PlayPauseMode mode ) } } +void VideoWidget::Private::takeSnapshot() +{ + const QString url = anno->movie()->url(); + KUrl newurl; + if ( QDir::isRelativePath( url ) ) + { + newurl = document->currentDocument(); + newurl.setFileName( url ); + } + else + { + newurl = url; + } + + SnapshotTaker *taker = 0; + if ( newurl.isLocalFile() ) + taker = new SnapshotTaker( newurl.toLocalFile(), q ); + else + taker = new SnapshotTaker( newurl.url(), q ); + + q->connect( taker, SIGNAL( finished( const QImage& ) ), q, SLOT( setPosterImage( const QImage& ) ) ); +} + +void VideoWidget::Private::videoStopped() +{ + if ( anno->movie()->showPosterImage() ) + pageLayout->setCurrentIndex( 1 ); + else + q->hide(); +} + void VideoWidget::Private::finished() { switch ( anno->movie()->playMode() ) @@ -132,7 +172,7 @@ void VideoWidget::Private::finished() setupPlayPauseAction( PlayMode ); if ( anno->movie()->playMode() == Okular::Movie::PlayOnce ) controlBar->setVisible( false ); - q->setVisible(false); + videoStopped(); break; case Okular::Movie::PlayRepeat: // repeat the playback @@ -158,6 +198,18 @@ void VideoWidget::Private::playOrPause() } } +void VideoWidget::Private::setPosterImage( const QImage &image ) +{ + if ( !image.isNull() ) + { + // cache the snapshot image + anno->movie()->setPosterImage( image ); + } + + posterImagePage->setPixmap( QPixmap::fromImage( image ) ); + q->show(); +} + VideoWidget::VideoWidget( Okular::MovieAnnotation *movieann, Okular::Document *document, QWidget *parent ) : QWidget( parent ), d( new Private( movieann, document, this ) ) { @@ -165,15 +217,18 @@ VideoWidget::VideoWidget( Okular::MovieAnnotation *movieann, Okular::Document *d // they should be tied to this widget, not spread around... setAttribute( Qt::WA_NoMousePropagation ); - QVBoxLayout *mainlay = new QVBoxLayout( this ); + // Setup player page + QWidget *playerPage = new QWidget; + + QVBoxLayout *mainlay = new QVBoxLayout( playerPage ); mainlay->setMargin( 0 ); mainlay->setSpacing( 0 ); - d->player = new Phonon::VideoPlayer( Phonon::NoCategory, this ); - d->player->installEventFilter( this ); + d->player = new Phonon::VideoPlayer( Phonon::NoCategory, playerPage ); + d->player->installEventFilter( playerPage ); mainlay->addWidget( d->player ); - d->controlBar = new QToolBar( this ); + d->controlBar = new QToolBar( playerPage ); d->controlBar->setIconSize( QSize( 16, 16 ) ); d->controlBar->setAutoFillBackground( true ); mainlay->addWidget( d->controlBar ); @@ -203,6 +258,38 @@ VideoWidget::VideoWidget( Okular::MovieAnnotation *movieann, Okular::Document *d connect( d->playPauseAction, SIGNAL(triggered()), this, SLOT(playOrPause()) ); d->geom = movieann->transformedBoundingRectangle(); + + // Setup poster image page + d->posterImagePage = new QLabel; + d->posterImagePage->setScaledContents( true ); + d->posterImagePage->installEventFilter( this ); + d->posterImagePage->setCursor( Qt::PointingHandCursor ); + + d->pageLayout = new QStackedLayout( this ); + d->pageLayout->setMargin( 0 ); + d->pageLayout->setSpacing( 0 ); + d->pageLayout->addWidget( playerPage ); + d->pageLayout->addWidget( d->posterImagePage ); + + + if ( movieann->movie()->showPosterImage() ) + { + d->pageLayout->setCurrentIndex( 1 ); + + const QImage posterImage = movieann->movie()->posterImage(); + if ( posterImage.isNull() ) + { + d->takeSnapshot(); + } + else + { + d->setPosterImage( posterImage ); + } + } + else + { + d->pageLayout->setCurrentIndex( 0 ); + } } VideoWidget::~VideoWidget() @@ -227,14 +314,29 @@ bool VideoWidget::isPlaying() const void VideoWidget::pageEntered() { - if ( d->anno->movie()->autoPlay() ) { + if ( d->anno->movie()->showPosterImage() ) + { + d->pageLayout->setCurrentIndex( 1 ); + show(); + } + + if ( d->anno->movie()->autoPlay() ) + { show(); QMetaObject::invokeMethod(this, "play", Qt::QueuedConnection); } } +void VideoWidget::pageLeft() +{ + d->videoStopped(); + + hide(); +} + void VideoWidget::play() { + d->pageLayout->setCurrentIndex( 0 ); d->load(); d->player->play(); d->stopAction->setEnabled( true ); @@ -256,7 +358,7 @@ void VideoWidget::pause() bool VideoWidget::eventFilter( QObject * object, QEvent * event ) { - if ( object == d->player ) + if ( object == d->player || object == d->posterImagePage ) { switch ( event->type() ) { @@ -272,6 +374,18 @@ bool VideoWidget::eventFilter( QObject * object, QEvent * event ) event->accept(); } } + case QEvent::Wheel: + { + if ( object == d->posterImagePage ) + { + QWheelEvent * we = static_cast< QWheelEvent * >( event ); + + // forward wheel events to parent widget + QWheelEvent *copy = new QWheelEvent( we->pos(), we->globalPos(), we->delta(), we->buttons(), we->modifiers(), we->orientation() ); + QCoreApplication::postEvent( parentWidget(), copy ); + } + break; + } default: ; } } diff --git a/ui/videowidget.h b/ui/videowidget.h index e82753c87..71dda2273 100644 --- a/ui/videowidget.h +++ b/ui/videowidget.h @@ -35,6 +35,11 @@ class VideoWidget : public QWidget */ void pageEntered(); + /** + * This method is called when the page the video widget is located on has been left. + */ + void pageLeft(); + public slots: void play(); void pause(); @@ -48,6 +53,7 @@ class VideoWidget : public QWidget private: Q_PRIVATE_SLOT( d, void finished() ) Q_PRIVATE_SLOT( d, void playOrPause() ) + Q_PRIVATE_SLOT( d, void setPosterImage( const QImage& ) ) // private storage class Private; From 02b04e7e9bcbe4ce045b1be55948d1c37ec5284d Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Tue, 21 Aug 2012 00:35:41 +0200 Subject: [PATCH 112/155] Make the openRecent just be open recent Stop being too smart for own our good, try to merge open and openRecent actions in just one action confuses the hell out of people, so let's KISS and just make open recent be open recent BUGS: 302358 BUGS: 251335 FIXED-IN: 4.10.0 --- shell/shell.cpp | 8 ++++++-- shell/shell.h | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/shell/shell.cpp b/shell/shell.cpp index 8b99ce4ef..1dc80ea40 100644 --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -117,6 +117,11 @@ void Shell::delayedOpen() openUrl( m_openUrl ); } +void Shell::showOpenRecentMenu() +{ + m_recent->menu()->popup(QCursor::pos()); +} + Shell::~Shell() { if ( m_part ) @@ -182,8 +187,7 @@ void Shell::setupActions() KStandardAction::open(this, SLOT(fileOpen()), actionCollection()); m_recent = KStandardAction::openRecent( this, SLOT(openUrl(KUrl)), actionCollection() ); m_recent->setToolBarMode( KRecentFilesAction::MenuMode ); - m_recent->setToolButtonPopupMode( QToolButton::DelayedPopup ); - connect( m_recent, SIGNAL(triggered()), this, SLOT(fileOpen()) ); + connect( m_recent, SIGNAL(triggered()), this, SLOT(showOpenRecentMenu()) ); m_recent->setToolTip( i18n("Click to open a file\nClick and hold to open a recent file") ); m_recent->setWhatsThis( i18n( "Click to open a file or Click and hold to select a recent file" ) ); m_printAction = KStandardAction::print( m_part, SLOT(slotPrint()), actionCollection() ); diff --git a/shell/shell.h b/shell/shell.h index 8430b9c1c..94940d1e7 100644 --- a/shell/shell.h +++ b/shell/shell.h @@ -80,6 +80,7 @@ private slots: void openUrl( const KUrl & url ); void delayedOpen(); + void showOpenRecentMenu(); signals: void restoreDocument(const KConfigGroup &group); From 811e3b253942a1319f2c13a9486378f57c545a10 Mon Sep 17 00:00:00 2001 From: Tobias Koenig Date: Tue, 21 Aug 2012 09:37:05 +0200 Subject: [PATCH 113/155] Switch from poster image to video player after video has started playing If we switch immediately after the play() trigger, a black frame is visible for a moment, which looks ugly. --- ui/videowidget.cpp | 12 +++++++++++- ui/videowidget.h | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/ui/videowidget.cpp b/ui/videowidget.cpp index 3b7782d7d..ea0e5b8da 100644 --- a/ui/videowidget.cpp +++ b/ui/videowidget.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -69,6 +70,7 @@ public: void setPosterImage( const QImage& ); void takeSnapshot(); void videoStopped(); + void stateChanged(Phonon::State, Phonon::State); // slots void finished(); @@ -113,6 +115,9 @@ void VideoWidget::Private::load() else player->load( newurl ); + connect( player->mediaObject(), SIGNAL( stateChanged( Phonon::State, Phonon::State ) ), + q, SLOT( stateChanged( Phonon::State, Phonon::State ) ) ); + seekSlider->setEnabled( true ); } @@ -210,6 +215,12 @@ void VideoWidget::Private::setPosterImage( const QImage &image ) q->show(); } +void VideoWidget::Private::stateChanged( Phonon::State newState, Phonon::State ) +{ + if ( newState == Phonon::PlayingState ) + pageLayout->setCurrentIndex( 0 ); +} + VideoWidget::VideoWidget( Okular::MovieAnnotation *movieann, Okular::Document *document, QWidget *parent ) : QWidget( parent ), d( new Private( movieann, document, this ) ) { @@ -336,7 +347,6 @@ void VideoWidget::pageLeft() void VideoWidget::play() { - d->pageLayout->setCurrentIndex( 0 ); d->load(); d->player->play(); d->stopAction->setEnabled( true ); diff --git a/ui/videowidget.h b/ui/videowidget.h index 71dda2273..384e2ff6c 100644 --- a/ui/videowidget.h +++ b/ui/videowidget.h @@ -54,6 +54,7 @@ class VideoWidget : public QWidget Q_PRIVATE_SLOT( d, void finished() ) Q_PRIVATE_SLOT( d, void playOrPause() ) Q_PRIVATE_SLOT( d, void setPosterImage( const QImage& ) ) + Q_PRIVATE_SLOT( d, void stateChanged( Phonon::State, Phonon::State ) ) // private storage class Private; From 09067debaf933c2f9b4ea0a7c701e699fe62126e Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 22 Aug 2012 00:41:31 +0200 Subject: [PATCH 114/155] Make --unique also raise the window BUGS: 304526 FIXED-IN: 4.10.0 --- shell/main.cpp | 4 +++- shell/shell.cpp | 16 ++++++++++++++-- shell/shell.h | 6 ++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/shell/main.cpp b/shell/main.cpp index 0ded37614..84e9406fc 100644 --- a/shell/main.cpp +++ b/shell/main.cpp @@ -26,13 +26,15 @@ static bool attachUniqueInstance(KCmdLineArgs* args) return false; QDBusInterface iface("org.kde.okular", "/okular", "org.kde.okular"); - if (!iface.isValid()) + QDBusInterface iface2("org.kde.okular", "/okularshell", "org.kde.okular"); + if (!iface.isValid() || !iface2.isValid()) return false; if (args->isSet("page")) iface.call("openDocument", ShellUtils::urlFromArg(args->arg(0), ShellUtils::qfileExistFunc(), args->getOption("page")).url()); else iface.call("openDocument", ShellUtils::urlFromArg(args->arg(0), ShellUtils::qfileExistFunc()).url()); + iface2.call("tryRaise"); return true; } diff --git a/shell/shell.cpp b/shell/shell.cpp index 1dc80ea40..d5e70c706 100644 --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -42,6 +42,7 @@ #include #include #include +#include // local includes #include "kdocumentviewer.h" @@ -104,10 +105,13 @@ void Shell::init() readSettings(); - if (m_args && m_args->isSet("unique") && m_args->count() == 1) + m_unique = false; + if (m_args && m_args->isSet("unique") && m_args->count() <= 1) { - QDBusConnection::sessionBus().registerService("org.kde.okular"); + m_unique = QDBusConnection::sessionBus().registerService("org.kde.okular"); } + + QDBusConnection::sessionBus().registerObject("/okularshell", this, QDBusConnection::ExportScriptableSlots); if (m_openUrl.isValid()) QTimer::singleShot(0, this, SLOT(delayedOpen())); } @@ -290,6 +294,14 @@ void Shell::slotQuit() close(); } +void Shell::tryRaise() +{ + if (m_unique) + { + KWindowSystem::forceActiveWindow( window()->effectiveWinId() ); + } +} + // only called when starting the program void Shell::setFullScreen( bool useFullScreen ) { diff --git a/shell/shell.h b/shell/shell.h index 94940d1e7..4cd67a7fc 100644 --- a/shell/shell.h +++ b/shell/shell.h @@ -18,6 +18,8 @@ #include +#include + class KCmdLineArgs; class KRecentFilesAction; class KToggleAction; @@ -36,6 +38,7 @@ class Part; class Shell : public KParts::MainWindow { Q_OBJECT + Q_CLASSINFO("D-Bus Interface", "org.kde.okular") public: /** @@ -51,6 +54,8 @@ public: QSize sizeHint() const; public slots: void slotQuit(); + + Q_SCRIPTABLE Q_NOREPLY void tryRaise(); protected: /** @@ -103,6 +108,7 @@ private: KToggleAction* m_fullScreenAction; KToggleAction* m_showMenuBarAction; bool m_menuBarWasShown, m_toolBarWasShown; + bool m_unique; KUrl m_openUrl; }; From 6d011cd2f0dfe754435569ab7e8bd5a16acfb18e Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Tue, 21 Aug 2012 22:57:37 +0200 Subject: [PATCH 115/155] Do not show the save changes prompt twice if the main window is closed Call m_part->closeUrl with promptToSave=false in the Shell dtor, so that the save changes prompt is not shown again (it's already shown because of Shell::queryClose) --- shell/shell.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/shell.cpp b/shell/shell.cpp index d5e70c706..f415fe777 100644 --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -131,7 +131,7 @@ Shell::~Shell() if ( m_part ) { writeSettings(); - m_part->closeUrl(); + m_part->closeUrl( false ); } m_part = 0; // It is deleted by the KPart/QObject machinery if ( m_args ) From 77af86fddcdcc0e46914d93c6fee3bc7858d509f Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Tue, 21 Aug 2012 22:57:37 +0200 Subject: [PATCH 116/155] Do not show the save changes prompt twice if the main window is closed Call m_part->closeUrl with promptToSave=false in the Shell dtor, so that the save changes prompt is not shown again (it's already shown because of Shell::queryClose) --- shell/shell.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/shell.cpp b/shell/shell.cpp index 8b99ce4ef..7a105742f 100644 --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -122,7 +122,7 @@ Shell::~Shell() if ( m_part ) { writeSettings(); - m_part->closeUrl(); + m_part->closeUrl( false ); } m_part = 0; // It is deleted by the KPart/QObject machinery if ( m_args ) From a2dd088ebd5511477d0bc6dec6b407886f915772 Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Mon, 27 Aug 2012 20:59:03 +0200 Subject: [PATCH 117/155] Fix Tools->review inconsistency when switching tool BUGS: 304621 FIXED-IN: 4.9.1 --- ui/pageview.cpp | 35 ++++++++++++++++++++++++----------- ui/pageviewannotator.cpp | 12 +++++++++++- ui/pageviewannotator.h | 4 ++++ 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/ui/pageview.cpp b/ui/pageview.cpp index cf5de1df0..e7fa1b148 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -4216,9 +4216,9 @@ void PageView::slotSetMouseNormal() Okular::Settings::setMouseMode( Okular::Settings::EnumMouseMode::Browse ); // hide the messageWindow d->messageWindow->hide(); - // reshow the annotator toolbar if hiding was forced - if ( d->aToggleAnnotator && d->aToggleAnnotator->isChecked() ) - slotToggleAnnotator( true ); + // reshow the annotator toolbar if hiding was forced (and if it is not already visible) + if ( d->annotator && d->annotator->hidingWasForced() && d->aToggleAnnotator && !d->aToggleAnnotator->isChecked() ) + d->aToggleAnnotator->trigger(); // force an update of the cursor updateCursor( contentAreaPosition() + viewport()->mapFromGlobal( QCursor::pos() ) ); Okular::Settings::self()->writeConfig(); @@ -4230,8 +4230,11 @@ void PageView::slotSetMouseZoom() // change the text in messageWindow (and show it if hidden) d->messageWindow->display( i18n( "Select zooming area. Right-click to zoom out." ), QString(), PageViewMessage::Info, -1 ); // force hiding of annotator toolbar - if ( d->annotator ) - d->annotator->setEnabled( false ); + if ( d->aToggleAnnotator && d->aToggleAnnotator->isChecked() ) + { + d->aToggleAnnotator->trigger(); + d->annotator->setHidingForced( true ); + } // force an update of the cursor updateCursor( contentAreaPosition() + viewport()->mapFromGlobal( QCursor::pos() ) ); Okular::Settings::self()->writeConfig(); @@ -4243,8 +4246,11 @@ void PageView::slotSetMouseSelect() // change the text in messageWindow (and show it if hidden) d->messageWindow->display( i18n( "Draw a rectangle around the text/graphics to copy." ), QString(), PageViewMessage::Info, -1 ); // force hiding of annotator toolbar - if ( d->annotator ) - d->annotator->setEnabled( false ); + if ( d->aToggleAnnotator && d->aToggleAnnotator->isChecked() ) + { + d->aToggleAnnotator->trigger(); + d->annotator->setHidingForced( true ); + } // force an update of the cursor updateCursor( contentAreaPosition() + viewport()->mapFromGlobal( QCursor::pos() ) ); Okular::Settings::self()->writeConfig(); @@ -4256,8 +4262,11 @@ void PageView::slotSetMouseTextSelect() // change the text in messageWindow (and show it if hidden) d->messageWindow->display( i18n( "Select text" ), QString(), PageViewMessage::Info, -1 ); // force hiding of annotator toolbar - if ( d->annotator ) - d->annotator->setEnabled( false ); + if ( d->aToggleAnnotator && d->aToggleAnnotator->isChecked() ) + { + d->aToggleAnnotator->trigger(); + d->annotator->setHidingForced( true ); + } // force an update of the cursor updateCursor( contentAreaPosition() + viewport()->mapFromGlobal( QCursor::pos() ) ); Okular::Settings::self()->writeConfig(); @@ -4271,8 +4280,11 @@ void PageView::slotSetMouseTableSelect() "Draw a rectangle around the table, then click near edges to divide up; press Esc to clear." ), QString(), PageViewMessage::Info, -1 ); // force hiding of annotator toolbar - if ( d->annotator ) - d->annotator->setEnabled( false ); + if ( d->aToggleAnnotator && d->aToggleAnnotator->isChecked() ) + { + d->aToggleAnnotator->trigger(); + d->annotator->setHidingForced( true ); + } // force an update of the cursor updateCursor( contentAreaPosition() + viewport()->mapFromGlobal( QCursor::pos() ) ); Okular::Settings::self()->writeConfig(); @@ -4329,6 +4341,7 @@ void PageView::slotToggleAnnotator( bool on ) // initialize/reset annotator (and show/hide toolbar) d->annotator->setEnabled( on ); + d->annotator->setHidingForced( false ); inHere = false; } diff --git a/ui/pageviewannotator.cpp b/ui/pageviewannotator.cpp index 52a464b7e..9754b5eeb 100644 --- a/ui/pageviewannotator.cpp +++ b/ui/pageviewannotator.cpp @@ -604,7 +604,7 @@ class TextSelectorEngine : public AnnotatorEngine PageViewAnnotator::PageViewAnnotator( PageView * parent, Okular::Document * storage ) : QObject( parent ), m_document( storage ), m_pageView( parent ), m_toolBar( 0 ), m_engine( 0 ), m_textToolsEnabled( false ), m_toolsEnabled( false ), - m_continuousMode( false ), m_lastToolID( -1 ), m_lockedItem( 0 ) + m_continuousMode( false ), m_hidingWasForced( false ), m_lastToolID( -1 ), m_lockedItem( 0 ) { // load the tools from the 'xml tools definition' file. store the tree internally. QFile infoFile( KStandardDirs::locate("data", "okular/tools.xml") ); @@ -706,6 +706,16 @@ void PageViewAnnotator::setToolsEnabled( bool enabled ) m_toolBar->setToolsEnabled( m_toolsEnabled ); } +void PageViewAnnotator::setHidingForced( bool forced ) +{ + m_hidingWasForced = forced; +} + +bool PageViewAnnotator::hidingWasForced() const +{ + return m_hidingWasForced; +} + bool PageViewAnnotator::routeEvents() const { return m_engine && m_toolBar; diff --git a/ui/pageviewannotator.h b/ui/pageviewannotator.h index e847208a2..a2ef90d48 100644 --- a/ui/pageviewannotator.h +++ b/ui/pageviewannotator.h @@ -60,6 +60,9 @@ class PageViewAnnotator : public QObject void setToolsEnabled( bool enabled ); + void setHidingForced( bool forced ); + bool hidingWasForced() const; + // methods used when creating the annotation bool routeEvents() const; QRect routeEvent( QMouseEvent * event, PageViewItem * item ); @@ -85,6 +88,7 @@ class PageViewAnnotator : public QObject bool m_textToolsEnabled; bool m_toolsEnabled; bool m_continuousMode; + bool m_hidingWasForced; // creation related variables int m_lastToolID; From 56dd5278d29d117ac9ee04faabea46d7599ecfe7 Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Mon, 27 Aug 2012 20:59:03 +0200 Subject: [PATCH 118/155] Fix Tools->review inconsistency when switching tool BUGS: 304621 FIXED-IN: 4.9.1 (cherry picked from commit a2dd088ebd5511477d0bc6dec6b407886f915772) --- ui/pageview.cpp | 35 ++++++++++++++++++++++++----------- ui/pageviewannotator.cpp | 12 +++++++++++- ui/pageviewannotator.h | 4 ++++ 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/ui/pageview.cpp b/ui/pageview.cpp index 25dc63b40..91d41f94a 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -4234,9 +4234,9 @@ void PageView::slotSetMouseNormal() Okular::Settings::setMouseMode( Okular::Settings::EnumMouseMode::Browse ); // hide the messageWindow d->messageWindow->hide(); - // reshow the annotator toolbar if hiding was forced - if ( d->aToggleAnnotator && d->aToggleAnnotator->isChecked() ) - slotToggleAnnotator( true ); + // reshow the annotator toolbar if hiding was forced (and if it is not already visible) + if ( d->annotator && d->annotator->hidingWasForced() && d->aToggleAnnotator && !d->aToggleAnnotator->isChecked() ) + d->aToggleAnnotator->trigger(); // force an update of the cursor updateCursor( contentAreaPosition() + viewport()->mapFromGlobal( QCursor::pos() ) ); Okular::Settings::self()->writeConfig(); @@ -4248,8 +4248,11 @@ void PageView::slotSetMouseZoom() // change the text in messageWindow (and show it if hidden) d->messageWindow->display( i18n( "Select zooming area. Right-click to zoom out." ), QString(), PageViewMessage::Info, -1 ); // force hiding of annotator toolbar - if ( d->annotator ) - d->annotator->setEnabled( false ); + if ( d->aToggleAnnotator && d->aToggleAnnotator->isChecked() ) + { + d->aToggleAnnotator->trigger(); + d->annotator->setHidingForced( true ); + } // force an update of the cursor updateCursor( contentAreaPosition() + viewport()->mapFromGlobal( QCursor::pos() ) ); Okular::Settings::self()->writeConfig(); @@ -4261,8 +4264,11 @@ void PageView::slotSetMouseSelect() // change the text in messageWindow (and show it if hidden) d->messageWindow->display( i18n( "Draw a rectangle around the text/graphics to copy." ), QString(), PageViewMessage::Info, -1 ); // force hiding of annotator toolbar - if ( d->annotator ) - d->annotator->setEnabled( false ); + if ( d->aToggleAnnotator && d->aToggleAnnotator->isChecked() ) + { + d->aToggleAnnotator->trigger(); + d->annotator->setHidingForced( true ); + } // force an update of the cursor updateCursor( contentAreaPosition() + viewport()->mapFromGlobal( QCursor::pos() ) ); Okular::Settings::self()->writeConfig(); @@ -4274,8 +4280,11 @@ void PageView::slotSetMouseTextSelect() // change the text in messageWindow (and show it if hidden) d->messageWindow->display( i18n( "Select text" ), QString(), PageViewMessage::Info, -1 ); // force hiding of annotator toolbar - if ( d->annotator ) - d->annotator->setEnabled( false ); + if ( d->aToggleAnnotator && d->aToggleAnnotator->isChecked() ) + { + d->aToggleAnnotator->trigger(); + d->annotator->setHidingForced( true ); + } // force an update of the cursor updateCursor( contentAreaPosition() + viewport()->mapFromGlobal( QCursor::pos() ) ); Okular::Settings::self()->writeConfig(); @@ -4289,8 +4298,11 @@ void PageView::slotSetMouseTableSelect() "Draw a rectangle around the table, then click near edges to divide up; press Esc to clear." ), QString(), PageViewMessage::Info, -1 ); // force hiding of annotator toolbar - if ( d->annotator ) - d->annotator->setEnabled( false ); + if ( d->aToggleAnnotator && d->aToggleAnnotator->isChecked() ) + { + d->aToggleAnnotator->trigger(); + d->annotator->setHidingForced( true ); + } // force an update of the cursor updateCursor( contentAreaPosition() + viewport()->mapFromGlobal( QCursor::pos() ) ); Okular::Settings::self()->writeConfig(); @@ -4347,6 +4359,7 @@ void PageView::slotToggleAnnotator( bool on ) // initialize/reset annotator (and show/hide toolbar) d->annotator->setEnabled( on ); + d->annotator->setHidingForced( false ); inHere = false; } diff --git a/ui/pageviewannotator.cpp b/ui/pageviewannotator.cpp index 52a464b7e..9754b5eeb 100644 --- a/ui/pageviewannotator.cpp +++ b/ui/pageviewannotator.cpp @@ -604,7 +604,7 @@ class TextSelectorEngine : public AnnotatorEngine PageViewAnnotator::PageViewAnnotator( PageView * parent, Okular::Document * storage ) : QObject( parent ), m_document( storage ), m_pageView( parent ), m_toolBar( 0 ), m_engine( 0 ), m_textToolsEnabled( false ), m_toolsEnabled( false ), - m_continuousMode( false ), m_lastToolID( -1 ), m_lockedItem( 0 ) + m_continuousMode( false ), m_hidingWasForced( false ), m_lastToolID( -1 ), m_lockedItem( 0 ) { // load the tools from the 'xml tools definition' file. store the tree internally. QFile infoFile( KStandardDirs::locate("data", "okular/tools.xml") ); @@ -706,6 +706,16 @@ void PageViewAnnotator::setToolsEnabled( bool enabled ) m_toolBar->setToolsEnabled( m_toolsEnabled ); } +void PageViewAnnotator::setHidingForced( bool forced ) +{ + m_hidingWasForced = forced; +} + +bool PageViewAnnotator::hidingWasForced() const +{ + return m_hidingWasForced; +} + bool PageViewAnnotator::routeEvents() const { return m_engine && m_toolBar; diff --git a/ui/pageviewannotator.h b/ui/pageviewannotator.h index e847208a2..a2ef90d48 100644 --- a/ui/pageviewannotator.h +++ b/ui/pageviewannotator.h @@ -60,6 +60,9 @@ class PageViewAnnotator : public QObject void setToolsEnabled( bool enabled ); + void setHidingForced( bool forced ); + bool hidingWasForced() const; + // methods used when creating the annotation bool routeEvents() const; QRect routeEvent( QMouseEvent * event, PageViewItem * item ); @@ -85,6 +88,7 @@ class PageViewAnnotator : public QObject bool m_textToolsEnabled; bool m_toolsEnabled; bool m_continuousMode; + bool m_hidingWasForced; // creation related variables int m_lastToolID; From 7407ccb80a5a742e31f0fbc0d55993d348bd304a Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 29 Aug 2012 12:50:42 +0200 Subject: [PATCH 119/155] Update versions --- VERSION | 2 +- core/version.h | 4 ++-- generators/poppler/generator_pdf.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/VERSION b/VERSION index b79cd474b..19b64f782 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -okular v0.15.0 +okular v0.15.1 diff --git a/core/version.h b/core/version.h index d8c92e959..368739f87 100644 --- a/core/version.h +++ b/core/version.h @@ -10,10 +10,10 @@ #ifndef _OKULAR_VERSION_H_ #define _OKULAR_VERSION_H_ -#define OKULAR_VERSION_STRING "0.15.0" +#define OKULAR_VERSION_STRING "0.15.1" #define OKULAR_VERSION_MAJOR 0 #define OKULAR_VERSION_MINOR 15 -#define OKULAR_VERSION_RELEASE 0 +#define OKULAR_VERSION_RELEASE 1 #define OKULAR_MAKE_VERSION( a,b,c ) (((a) << 16) | ((b) << 8) | (c)) #define OKULAR_VERSION \ diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index ae95134df..218b0abe4 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -358,7 +358,7 @@ static KAboutData createAboutData() "okular_poppler", "okular_poppler", ki18n( "PDF Backend" ), - "0.6.1", + "0.6.2", ki18n( "A PDF file renderer" ), KAboutData::License_GPL, ki18n( "© 2005-2008 Albert Astals Cid" ) From 7d18d176bc60855dec4f38262fa32d9aa31146c4 Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Thu, 30 Aug 2012 01:03:16 +0200 Subject: [PATCH 120/155] When there is only one page, "Opposite pages" should have no effect FIXED-IN: 4.10.0 BUGS: 305194 --- ui/pageview.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ui/pageview.cpp b/ui/pageview.cpp index 91d41f94a..8ffca5182 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -3737,8 +3737,9 @@ void PageView::slotRelayoutPages() QRect viewportRect( horizontalScrollBar()->value(), verticalScrollBar()->value(), viewportWidth, viewportHeight ); // handle the 'center first page in row' stuff - const bool facing = Okular::Settings::viewMode() == Okular::Settings::EnumViewMode::Facing; - const bool facingCentered = Okular::Settings::viewMode() == Okular::Settings::EnumViewMode::FacingFirstCentered; + const bool facing = Okular::Settings::viewMode() == Okular::Settings::EnumViewMode::Facing && pageCount > 1; + const bool facingCentered = Okular::Settings::viewMode() == Okular::Settings::EnumViewMode::FacingFirstCentered || + (Okular::Settings::viewMode() == Okular::Settings::EnumViewMode::Facing && pageCount == 1); const bool overrideCentering = facingCentered && pageCount < 3; const bool centerFirstPage = facingCentered && !overrideCentering; const bool facingPages = facing || centerFirstPage; From 88a1a1aa19715800ac89cd7dcd153f4182b14c64 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Fri, 31 Aug 2012 00:53:46 +0200 Subject: [PATCH 121/155] Since Tobias ignores my emails i'll add the copyright header myself CCMAIL: tokoe@kde.org --- ui/snapshottaker.cpp | 9 +++++++++ ui/snapshottaker.h | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/ui/snapshottaker.cpp b/ui/snapshottaker.cpp index d48aafe0a..5e4058de0 100644 --- a/ui/snapshottaker.cpp +++ b/ui/snapshottaker.cpp @@ -1,3 +1,12 @@ +/*************************************************************************** + * Copyright (C) 2012 by Tobias Koening * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + ***************************************************************************/ + #include "snapshottaker.h" #include diff --git a/ui/snapshottaker.h b/ui/snapshottaker.h index 66138d090..f9b09c0b2 100644 --- a/ui/snapshottaker.h +++ b/ui/snapshottaker.h @@ -1,3 +1,12 @@ +/*************************************************************************** + * Copyright (C) 2012 by Tobias Koening * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + ***************************************************************************/ + #ifndef SNAPSHOTTAKER_H #define SNAPSHOTTAKER_H From 6d6a3bfce5d5b1e35500edb2851d6a0d9a8c0e85 Mon Sep 17 00:00:00 2001 From: Jaydeep Solanki Date: Tue, 4 Sep 2012 20:04:01 +0200 Subject: [PATCH 122/155] Open a new Shell when opening a new file BUGS: 166645 FIXED-IN: 4.10.0 REVIEW: 105965 GUI --- part.cpp | 3 +++ part.h | 1 + shell/shell.cpp | 15 ++++++++++++++- shell/shell.h | 2 ++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/part.cpp b/part.cpp index 7c1ca7174..2808083af 100644 --- a/part.cpp +++ b/part.cpp @@ -1197,6 +1197,7 @@ bool Part::openFile() bool canSearch = m_document->supportsSearching(); // update one-time actions + emit enableCloseAction( ok ); m_find->setEnabled( ok && canSearch ); m_findNext->setEnabled( ok && canSearch ); m_findPrev->setEnabled( ok && canSearch ); @@ -1247,6 +1248,7 @@ bool Part::openFile() // if can't open document, update windows so they display blank contents m_pageView->viewport()->update(); m_thumbnailList->update(); + setUrl( KUrl() ); return false; } @@ -1371,6 +1373,7 @@ bool Part::closeUrl(bool promptToSave) } slotHidePresentation(); + emit enableCloseAction( false ); m_find->setEnabled( false ); m_findNext->setEnabled( false ); m_findPrev->setEnabled( false ); diff --git a/part.h b/part.h index d9a5cc4c7..49607beb8 100644 --- a/part.h +++ b/part.h @@ -150,6 +150,7 @@ class Part : public KParts::ReadWritePart, public Okular::DocumentObserver, publ void enablePrintAction(bool enable); void openSourceReference(const QString& absFileName, int line, int column); void viewerMenuStateChange(bool enabled); + void enableCloseAction(bool enable); protected: // reimplemented from KParts::ReadWritePart diff --git a/shell/shell.cpp b/shell/shell.cpp index f415fe777..9eada84f5 100644 --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -102,6 +102,7 @@ void Shell::init() connect( this, SIGNAL(restoreDocument(KConfigGroup)),m_part, SLOT(restoreDocument(KConfigGroup))); connect( this, SIGNAL(saveDocumentRestoreInfo(KConfigGroup&)), m_part, SLOT(saveDocumentRestoreInfo(KConfigGroup&))); connect( m_part, SIGNAL(enablePrintAction(bool)), m_printAction, SLOT(setEnabled(bool))); + connect( m_part, SIGNAL(enableCloseAction(bool)), m_closeAction, SLOT(setEnabled(bool))); readSettings(); @@ -142,6 +143,13 @@ void Shell::openUrl( const KUrl & url ) { if ( m_part ) { + if( !m_part->url().isEmpty() ) + { + Shell* newShell = new Shell(); + newShell->openUrl( url ); + newShell->show(); + return; + } if ( m_doc && m_args && m_args->isSet( "presentation" ) ) m_doc->startPresentation(); bool openOk = m_part->openUrl( url ); @@ -156,6 +164,10 @@ void Shell::openUrl( const KUrl & url ) } } +void Shell::closeUrl() +{ + m_part->closeUrl(); +} void Shell::readSettings() { @@ -196,6 +208,8 @@ void Shell::setupActions() m_recent->setWhatsThis( i18n( "Click to open a file or Click and hold to select a recent file" ) ); m_printAction = KStandardAction::print( m_part, SLOT(slotPrint()), actionCollection() ); m_printAction->setEnabled( false ); + m_closeAction = KStandardAction::close( this, SLOT(closeUrl()), actionCollection() ); + m_closeAction->setEnabled( false ); KStandardAction::quit(this, SLOT(slotQuit()), actionCollection()); setStandardToolBarMenuEnabled(true); @@ -284,7 +298,6 @@ void Shell::fileOpen() KUrl url = dlg.selectedUrl(); if ( !url.isEmpty() ) { - m_part->closeUrl( false ); openUrl( url ); } } diff --git a/shell/shell.h b/shell/shell.h index 4cd67a7fc..393d6c625 100644 --- a/shell/shell.h +++ b/shell/shell.h @@ -86,6 +86,7 @@ private slots: void openUrl( const KUrl & url ); void delayedOpen(); void showOpenRecentMenu(); + void closeUrl(); signals: void restoreDocument(const KConfigGroup &group); @@ -105,6 +106,7 @@ private: QStringList m_fileformats; bool m_fileformatsscanned; KAction* m_printAction; + KAction* m_closeAction; KToggleAction* m_fullScreenAction; KToggleAction* m_showMenuBarAction; bool m_menuBarWasShown, m_toolBarWasShown; From 636d4e1c7571573901d72b8d4b9cc20c82d33f28 Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Wed, 5 Sep 2012 22:12:11 +0200 Subject: [PATCH 123/155] Allow customization of scroll page keybindings REVIEW: 106293 BUGS: 304291 FIXED-IN: 4.10.0 --- ui/pageview.cpp | 112 +++++++++++++++++++++++++++++------------------- ui/pageview.h | 6 ++- 2 files changed, 71 insertions(+), 47 deletions(-) diff --git a/ui/pageview.cpp b/ui/pageview.cpp index 8ffca5182..ccbc39314 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -587,16 +587,28 @@ void PageView::setupActions( KActionCollection * ac ) // Other actions KAction * su = new KAction(i18n("Scroll Up"), this); ac->addAction("view_scroll_up", su ); - connect( su, SIGNAL(triggered()), this, SLOT(slotScrollUp()) ); + connect( su, SIGNAL(triggered()), this, SLOT(slotAutoScrollUp()) ); su->setShortcut( QKeySequence(Qt::SHIFT + Qt::Key_Up) ); addAction(su); KAction * sd = new KAction(i18n("Scroll Down"), this); ac->addAction("view_scroll_down", sd ); - connect( sd, SIGNAL(triggered()), this, SLOT(slotScrollDown()) ); + connect( sd, SIGNAL(triggered()), this, SLOT(slotAutoScrollDown()) ); sd->setShortcut( QKeySequence(Qt::SHIFT + Qt::Key_Down) ); addAction(sd); + KAction * spu = new KAction(i18n("Scroll Page Up"), this); + ac->addAction( "view_scroll_page_up", spu ); + connect( spu, SIGNAL(triggered()), this, SLOT(slotScrollUp()) ); + spu->setShortcut( QKeySequence(Qt::SHIFT + Qt::Key_Space) ); + addAction( spu ); + + KAction * spd = new KAction(i18n("Scroll Page Down"), this); + ac->addAction( "view_scroll_page_down", spd ); + connect( spd, SIGNAL(triggered()), this, SLOT(slotScrollDown()) ); + spd->setShortcut( QKeySequence(Qt::Key_Space) ); + addAction( spd ); + d->aToggleForms = new KAction( this ); ac->addAction( "view_toggle_forms", d->aToggleForms ); connect( d->aToggleForms, SIGNAL(triggered()), this, SLOT(slotToggleForms()) ); @@ -1567,56 +1579,20 @@ void PageView::keyPressEvent( QKeyEvent * e ) case Qt::Key_K: case Qt::Key_Down: case Qt::Key_PageDown: - case Qt::Key_Space: case Qt::Key_Up: case Qt::Key_PageUp: case Qt::Key_Backspace: if ( e->key() == Qt::Key_Down || e->key() == Qt::Key_PageDown - || e->key() == Qt::Key_J - || ( e->key() == Qt::Key_Space && ( e->modifiers() & Qt::ShiftModifier ) != Qt::ShiftModifier ) ) + || e->key() == Qt::Key_J ) { - // if in single page mode and at the bottom of the screen, go to next page - if ( Okular::Settings::viewContinuous() || verticalScrollBar()->value() < verticalScrollBar()->maximum() ) - { - if ( e->key() == Qt::Key_Down || e->key() == Qt::Key_J ) - verticalScrollBar()->triggerAction( QScrollBar::SliderSingleStepAdd ); - else - verticalScrollBar()->triggerAction( QScrollBar::SliderPageStepAdd ); - } - else if ( (int)d->document->currentPage() < d->items.count() - 1 ) - { - // more optimized than document->setNextPage and then move view to top - Okular::DocumentViewport newViewport = d->document->viewport(); - newViewport.pageNumber += viewColumns(); - if ( newViewport.pageNumber >= (int)d->items.count() ) - newViewport.pageNumber = d->items.count() - 1; - newViewport.rePos.enabled = true; - newViewport.rePos.normalizedY = 0.0; - d->document->setViewport( newViewport ); - } + bool singleStep = e->key() == Qt::Key_Down || e->key() == Qt::Key_J; + slotScrollDown( singleStep ); } else { - // if in single page mode and at the top of the screen, go to \ page - if ( Okular::Settings::viewContinuous() || verticalScrollBar()->value() > verticalScrollBar()->minimum() ) - { - if ( e->key() == Qt::Key_Up || e->key() == Qt::Key_K ) - verticalScrollBar()->triggerAction( QScrollBar::SliderSingleStepSub ); - else - verticalScrollBar()->triggerAction( QScrollBar::SliderPageStepSub ); - } - else if ( d->document->currentPage() > 0 ) - { - // more optimized than document->setPrevPage and then move view to bottom - Okular::DocumentViewport newViewport = d->document->viewport(); - newViewport.pageNumber -= viewColumns(); - if ( newViewport.pageNumber < 0 ) - newViewport.pageNumber = 0; - newViewport.rePos.enabled = true; - newViewport.rePos.normalizedY = 1.0; - d->document->setViewport( newViewport ); - } + bool singleStep = e->key() == Qt::Key_Up || e->key() == Qt::Key_K; + slotScrollUp( singleStep ); } break; case Qt::Key_Left: @@ -4365,7 +4341,7 @@ void PageView::slotToggleAnnotator( bool on ) inHere = false; } -void PageView::slotScrollUp() +void PageView::slotAutoScrollUp() { if ( d->scrollIncrement < -9 ) return; @@ -4374,7 +4350,7 @@ void PageView::slotScrollUp() setFocus(); } -void PageView::slotScrollDown() +void PageView::slotAutoScrollDown() { if ( d->scrollIncrement > 9 ) return; @@ -4383,6 +4359,52 @@ void PageView::slotScrollDown() setFocus(); } +void PageView::slotScrollUp( bool singleStep ) +{ + // if in single page mode and at the top of the screen, go to \ page + if ( Okular::Settings::viewContinuous() || verticalScrollBar()->value() > verticalScrollBar()->minimum() ) + { + if ( singleStep ) + verticalScrollBar()->triggerAction( QScrollBar::SliderSingleStepSub ); + else + verticalScrollBar()->triggerAction( QScrollBar::SliderPageStepSub ); + } + else if ( d->document->currentPage() > 0 ) + { + // more optimized than document->setPrevPage and then move view to bottom + Okular::DocumentViewport newViewport = d->document->viewport(); + newViewport.pageNumber -= viewColumns(); + if ( newViewport.pageNumber < 0 ) + newViewport.pageNumber = 0; + newViewport.rePos.enabled = true; + newViewport.rePos.normalizedY = 1.0; + d->document->setViewport( newViewport ); + } +} + +void PageView::slotScrollDown( bool singleStep ) +{ + // if in single page mode and at the bottom of the screen, go to next page + if ( Okular::Settings::viewContinuous() || verticalScrollBar()->value() < verticalScrollBar()->maximum() ) + { + if ( singleStep ) + verticalScrollBar()->triggerAction( QScrollBar::SliderSingleStepAdd ); + else + verticalScrollBar()->triggerAction( QScrollBar::SliderPageStepAdd ); + } + else if ( (int)d->document->currentPage() < d->items.count() - 1 ) + { + // more optimized than document->setNextPage and then move view to top + Okular::DocumentViewport newViewport = d->document->viewport(); + newViewport.pageNumber += viewColumns(); + if ( newViewport.pageNumber >= (int)d->items.count() ) + newViewport.pageNumber = d->items.count() - 1; + newViewport.rePos.enabled = true; + newViewport.rePos.normalizedY = 0.0; + d->document->setViewport( newViewport ); + } +} + void PageView::slotRotateClockwise() { int id = ( (int)d->document->rotation() + 1 ) % 4; diff --git a/ui/pageview.h b/ui/pageview.h index 43ca2abf0..d2b639328 100644 --- a/ui/pageview.h +++ b/ui/pageview.h @@ -232,8 +232,10 @@ Q_OBJECT void slotSetMouseTextSelect(); void slotSetMouseTableSelect(); void slotToggleAnnotator( bool ); - void slotScrollUp(); - void slotScrollDown(); + void slotAutoScrollUp(); + void slotAutoScrollDown(); + void slotScrollUp( bool singleStep = false ); + void slotScrollDown( bool singleStep = false ); void slotRotateClockwise(); void slotRotateCounterClockwise(); void slotRotateOriginal(); From d3e0dadcacd3f11bb536968b5ebccf8377513f27 Mon Sep 17 00:00:00 2001 From: Tobias Koenig Date: Thu, 16 Aug 2012 17:37:39 +0200 Subject: [PATCH 124/155] Introduce notifyCurrentPageChanged callback DocumentObserver interface --- CMakeLists.txt | 2 +- core/document.cpp | 11 ++++ core/observer.cpp | 4 ++ core/observer.h | 10 +++ ui/minibar.cpp | 36 +++++------ ui/minibar.h | 6 +- ui/pagesizelabel.cpp | 19 +++--- ui/pagesizelabel.h | 3 +- ui/presentationwidget.cpp | 126 +++++++++++++++++++++----------------- ui/presentationwidget.h | 2 + ui/side_reviews.cpp | 6 +- ui/side_reviews.h | 2 +- ui/thumbnaillist.cpp | 9 +-- ui/thumbnaillist.h | 2 +- ui/toc.cpp | 11 +--- ui/toc.h | 3 +- 16 files changed, 139 insertions(+), 113 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 31d0da594..e75f76832 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -120,7 +120,7 @@ ENDIF(APPLE) target_link_libraries(okularcore ${OKULAR_IOKIT} ${KDE4_KIO_LIBS} ${KDE4_PHONON_LIBRARY} ${KDE4_KJSAPI_LIBRARY} ${MATH_LIB} ${KDE4_THREADWEAVER_LIBRARY} ) -set_target_properties(okularcore PROPERTIES VERSION 1.9.0 SOVERSION 1 ) +set_target_properties(okularcore PROPERTIES VERSION 2.0.0 SOVERSION 1 ) install(TARGETS okularcore ${INSTALL_TARGETS_DEFAULT_ARGS} ) diff --git a/core/document.cpp b/core/document.cpp index f6bf699a7..9d6b25c64 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -2788,6 +2788,8 @@ void Document::setViewport( const DocumentViewport & viewport, int excludeId, bo //if ( viewport == oldViewport ) // kDebug(OkularDebug) << "setViewport with the same viewport."; + const int oldPageNumber = oldViewport.pageNumber; + // set internal viewport taking care of history if ( oldViewport.pageNumber == viewport.pageNumber || !oldViewport.isValid() ) { @@ -2807,11 +2809,20 @@ void Document::setViewport( const DocumentViewport & viewport, int excludeId, bo d->m_viewportIterator = d->m_viewportHistory.insert( d->m_viewportHistory.end(), viewport ); } + const int currentViewportPage = (*d->m_viewportIterator).pageNumber; + + const bool currentPageChanged = (oldPageNumber != currentViewportPage); + // notify change to all other (different from id) observers QMap< int, DocumentObserver * >::const_iterator it = d->m_observers.constBegin(), end = d->m_observers.constEnd(); for ( ; it != end ; ++ it ) + { if ( it.key() != excludeId ) (*it)->notifyViewportChanged( smoothMove ); + + if ( currentPageChanged ) + (*it)->notifyCurrentPageChanged( oldPageNumber, currentViewportPage ); + } } void Document::setZoom(int factor, int excludeId) diff --git a/core/observer.cpp b/core/observer.cpp index 0201a1d8c..59bbb1163 100644 --- a/core/observer.cpp +++ b/core/observer.cpp @@ -48,3 +48,7 @@ bool DocumentObserver::canUnloadPixmap( int ) const { return true; } + +void DocumentObserver::notifyCurrentPageChanged( int, int ) +{ +} diff --git a/core/observer.h b/core/observer.h index 76c096c2a..f7189beac 100644 --- a/core/observer.h +++ b/core/observer.h @@ -130,6 +130,16 @@ class OKULAR_EXPORT DocumentObserver */ virtual bool canUnloadPixmap( int page ) const; + /** + * This method is called after the current page of the document has been entered. + * + * @param previous The number of the previous page (is @c -1 for the initial page change). + * @param current The number of the current page. + * + * @since 0.16 (KDE 4.10) + */ + virtual void notifyCurrentPageChanged( int previous, int current ); + private: class Private; const Private* d; diff --git a/ui/minibar.cpp b/ui/minibar.cpp index 051df720e..b9e12916d 100644 --- a/ui/minibar.cpp +++ b/ui/minibar.cpp @@ -42,7 +42,6 @@ class HoverButton : public QToolButton MiniBarLogic::MiniBarLogic( QObject * parent, Okular::Document * document ) : QObject(parent) , m_document( document ) - , m_currentPage( -1 ) { } @@ -68,7 +67,7 @@ Okular::Document *MiniBarLogic::document() const int MiniBarLogic::currentPage() const { - return m_currentPage; + return m_document->currentPage(); } void MiniBarLogic::notifySetup( const QVector< Okular::Page * > & pageVector, int setupFlags ) @@ -81,7 +80,6 @@ void MiniBarLogic::notifySetup( const QVector< Okular::Page * > & pageVector, in const int pages = pageVector.count(); if ( pages < 1 ) { - m_currentPage = -1; foreach ( MiniBar *miniBar, m_miniBars ) { miniBar->setEnabled( false ); @@ -124,24 +122,24 @@ void MiniBarLogic::notifySetup( const QVector< Okular::Page * > & pageVector, in } } -void MiniBarLogic::notifyViewportChanged( bool /*smoothMove*/ ) +void MiniBarLogic::notifyCurrentPageChanged( int previousPage, int currentPage ) { + Q_UNUSED( previousPage ) + // get current page number - const int page = m_document->viewport().pageNumber; const int pages = m_document->pages(); // if the document is opened and page is changed - if ( page != m_currentPage && pages > 0 ) + if ( pages > 0 ) { - m_currentPage = page; - const QString pageNumber = QString::number( page + 1 ); - const QString pageLabel = m_document->page(page)->label(); - + const QString pageNumber = QString::number( currentPage + 1 ); + const QString pageLabel = m_document->page( currentPage )->label(); + foreach ( MiniBar *miniBar, m_miniBars ) { // update prev/next button state - miniBar->m_prevButton->setEnabled( page > 0 ); - miniBar->m_nextButton->setEnabled( page < ( pages - 1 ) ); + miniBar->m_prevButton->setEnabled( currentPage > 0 ); + miniBar->m_nextButton->setEnabled( currentPage < ( pages - 1 ) ); // update text on widgets miniBar->m_pageNumberEdit->setText( pageNumber ); miniBar->m_pageNumberLabel->setText( pageNumber ); @@ -292,7 +290,7 @@ void MiniBar::resizeForPage( int pages ) ProgressWidget::ProgressWidget( QWidget * parent, Okular::Document * document ) : QWidget( parent ), m_document( document ), - m_currentPage( -1 ), m_progressPercentage( -1 ) + m_progressPercentage( -1 ) { setObjectName( QLatin1String( "progress" ) ); setAttribute( Qt::WA_OpaquePaintEvent, true ); @@ -305,18 +303,18 @@ ProgressWidget::~ProgressWidget() m_document->removeObserver( this ); } -void ProgressWidget::notifyViewportChanged( bool /*smoothMove*/ ) +void ProgressWidget::notifyCurrentPageChanged( int previousPage, int currentPage ) { + Q_UNUSED( previousPage ) + // get current page number - int page = m_document->viewport().pageNumber; int pages = m_document->pages(); // if the document is opened and page is changed - if ( page != m_currentPage && pages > 0 ) + if ( pages > 0 ) { // update percentage - m_currentPage = page; - float percentage = pages < 2 ? 1.0 : (float)page / (float)(pages - 1); + const float percentage = pages < 2 ? 1.0 : (float)currentPage / (float)(pages - 1); setProgress( percentage ); } } @@ -332,7 +330,7 @@ void ProgressWidget::slotGotoNormalizedPage( float index ) // figure out page number and go to that page int number = (int)( index * (float)m_document->pages() ); if ( number >= 0 && number < (int)m_document->pages() && - number != m_currentPage ) + number != (int)m_document->currentPage() ) m_document->setViewportPage( number ); } diff --git a/ui/minibar.h b/ui/minibar.h index acb1163be..a0c0514d0 100644 --- a/ui/minibar.h +++ b/ui/minibar.h @@ -90,12 +90,11 @@ class MiniBarLogic : public QObject, public Okular::DocumentObserver // [INHERITED] from DocumentObserver uint observerId() const { return MINIBAR_ID; } void notifySetup( const QVector< Okular::Page * > & pages, int setupFlags ); - void notifyViewportChanged( bool smoothMove ); + void notifyCurrentPageChanged( int previous, int current ); private: QSet m_miniBars; Okular::Document * m_document; - int m_currentPage; }; /** @@ -147,7 +146,7 @@ class ProgressWidget : public QWidget, public Okular::DocumentObserver // [INHERITED] from DocumentObserver uint observerId() const { return PROGRESSWIDGET_ID; } - void notifyViewportChanged( bool smoothMove ); + void notifyCurrentPageChanged( int previous, int current ); void slotGotoNormalizedPage( float index ); @@ -165,7 +164,6 @@ class ProgressWidget : public QWidget, public Okular::DocumentObserver private: Okular::Document * m_document; - int m_currentPage; float m_progressPercentage; }; diff --git a/ui/pagesizelabel.cpp b/ui/pagesizelabel.cpp index 4a8077924..aa4a043b8 100644 --- a/ui/pagesizelabel.cpp +++ b/ui/pagesizelabel.cpp @@ -13,7 +13,7 @@ PageSizeLabel::PageSizeLabel( QWidget * parent, Okular::Document * document ) : QLabel( parent ), m_document( document ), - m_currentPage( -1 ), m_antiWidget( NULL ) + m_antiWidget( NULL ) { } @@ -55,20 +55,17 @@ void PageSizeLabel::notifySetup( const QVector< Okular::Page * > & pageVector, i } } -void PageSizeLabel::notifyViewportChanged( bool /*smoothMove*/ ) +void PageSizeLabel::notifyCurrentPageChanged( int previousPage, int currentPage ) { + Q_UNUSED( previousPage ) + if (isVisible()) { - // get current page number - int page = m_document->viewport().pageNumber; - int pages = m_document->pages(); - - // if the document is opened and page is changed - if ( page != m_currentPage && pages > 0 ) + // if the document is opened + if ( m_document->pages() > 0 ) { - m_currentPage = page; - setText( m_document->pageSizeString(page) ); - m_antiWidget->setFixedSize(sizeHint()); + setText( m_document->pageSizeString( currentPage ) ); + m_antiWidget->setFixedSize( sizeHint() ); } } } diff --git a/ui/pagesizelabel.h b/ui/pagesizelabel.h index ea508b87c..7c4a1e2fc 100644 --- a/ui/pagesizelabel.h +++ b/ui/pagesizelabel.h @@ -34,11 +34,10 @@ class PageSizeLabel : public QLabel, public Okular::DocumentObserver // [INHERITED] from DocumentObserver uint observerId() const { return PAGESIZELABEL_ID; } void notifySetup( const QVector< Okular::Page * > & pages, int setupFlags ); - void notifyViewportChanged( bool smoothMove ); + void notifyCurrentPageChanged( int previous, int current ); private: Okular::Document * m_document; - int m_currentPage; QWidget *m_antiWidget; }; diff --git a/ui/presentationwidget.cpp b/ui/presentationwidget.cpp index 37523e8cd..6eca796f9 100644 --- a/ui/presentationwidget.cpp +++ b/ui/presentationwidget.cpp @@ -132,7 +132,8 @@ PresentationWidget::PresentationWidget( QWidget * parent, Okular::Document * doc m_pressedLink( 0 ), m_handCursor( false ), m_drawingEngine( 0 ), m_parentWidget( parent ), m_document( doc ), m_frameIndex( -1 ), m_topBar( 0 ), m_pagesEdit( 0 ), m_searchBar( 0 ), - m_screenSelect( 0 ), m_isSetup( false ), m_blockNotifications( false ), m_inBlackScreenMode( false ) + m_screenSelect( 0 ), m_isSetup( false ), m_blockNotifications( false ), m_inBlackScreenMode( false ), + m_showSummaryView( Okular::Settings::slidesShowSummary() ) { Q_UNUSED( parent ) setAttribute( Qt::WA_DeleteOnClose ); @@ -342,10 +343,6 @@ void PresentationWidget::notifySetup( const QVector< Okular::Page * > & pageSet, void PresentationWidget::notifyViewportChanged( bool /*smoothMove*/ ) { - // discard notifications if displaying the summary - if ( m_frameIndex == -1 && Okular::Settings::slidesShowSummary() ) - return; - // display the current page changePage( m_document->viewport().pageNumber ); @@ -364,6 +361,64 @@ void PresentationWidget::notifyPageChanged( int pageNumber, int changedFlags ) generatePage( changedFlags & ( DocumentObserver::Annotations | DocumentObserver::Highlights ) ); } +void PresentationWidget::notifyCurrentPageChanged( int previousPage, int currentPage ) +{ + if ( previousPage != -1 ) + { + // remove the drawings on the old page before switching + clearDrawings(); + + // stop video playback + Q_FOREACH ( VideoWidget *vw, m_frames[ previousPage ]->videoWidgets ) + { + vw->stop(); + vw->pageLeft(); + } + + // stop audio playback, if any + Okular::AudioPlayer::instance()->stopPlaybacks(); + + // perform the page closing action, if any + if ( m_document->page( previousPage )->pageAction( Okular::Page::Closing ) ) + m_document->processAction( m_document->page( previousPage )->pageAction( Okular::Page::Closing ) ); + } + + if ( currentPage != -1 ) + { + m_frameIndex = currentPage; + + // check if pixmap exists or else request it + PresentationFrame * frame = m_frames[ m_frameIndex ]; + int pixW = frame->geometry.width(); + int pixH = frame->geometry.height(); + + bool signalsBlocked = m_pagesEdit->signalsBlocked(); + m_pagesEdit->blockSignals( true ); + m_pagesEdit->setText( QString::number( m_frameIndex + 1 ) ); + m_pagesEdit->blockSignals( signalsBlocked ); + + // if pixmap not inside the Okular::Page we request it and wait for + // notifyPixmapChanged call or else we can proceed to pixmap generation + if ( !frame->page->hasPixmap( PRESENTATION_ID, pixW, pixH ) ) + { + requestPixmaps(); + } + else + { + // make the background pixmap + generatePage(); + } + + // perform the page opening action, if any + if ( m_document->page( m_frameIndex )->pageAction( Okular::Page::Opening ) ) + m_document->processAction( m_document->page( m_frameIndex )->pageAction( Okular::Page::Opening ) ); + + // start autoplay video playback + Q_FOREACH ( VideoWidget *vw, m_frames[ m_frameIndex ]->videoWidgets ) + vw->pageEntered(); + } +} + bool PresentationWidget::canUnloadPixmap( int pageNumber ) const { if ( Okular::Settings::memoryLevel() == Okular::Settings::EnumMemoryLevel::Low || @@ -796,63 +851,20 @@ void PresentationWidget::overlayClick( const QPoint & position ) void PresentationWidget::changePage( int newPage ) { + if ( m_showSummaryView ) { + m_showSummaryView = false; + m_frameIndex = -1; + return; + } + if ( m_frameIndex == newPage ) return; - // prepare to leave the current page - if ( m_frameIndex != -1 ) - { - // remove the drawings on the old page before switching - clearDrawings(); - - // stop video playback - Q_FOREACH ( VideoWidget *vw, m_frames[ m_frameIndex ]->videoWidgets ) - { - vw->stop(); - vw->pageLeft(); - } - - // stop audio playback, if any - Okular::AudioPlayer::instance()->stopPlaybacks(); - - // perform the page closing action, if any - if ( m_document->page( m_frameIndex )->pageAction( Okular::Page::Closing ) ) - m_document->processAction( m_document->page( m_frameIndex )->pageAction( Okular::Page::Closing ) ); - } - // switch to newPage - m_frameIndex = newPage; - m_document->setViewportPage( m_frameIndex, PRESENTATION_ID ); + m_document->setViewportPage( newPage, PRESENTATION_ID ); - // check if pixmap exists or else request it - PresentationFrame * frame = m_frames[ m_frameIndex ]; - int pixW = frame->geometry.width(); - int pixH = frame->geometry.height(); - - bool signalsBlocked = m_pagesEdit->signalsBlocked(); - m_pagesEdit->blockSignals( true ); - m_pagesEdit->setText( QString::number( m_frameIndex + 1 ) ); - m_pagesEdit->blockSignals( signalsBlocked ); - - // if pixmap not inside the Okular::Page we request it and wait for - // notifyPixmapChanged call or else we can proceed to pixmap generation - if ( !frame->page->hasPixmap( PRESENTATION_ID, pixW, pixH ) ) - { - requestPixmaps(); - } - else - { - // make the background pixmap - generatePage(); - } - - // perform the page opening action, if any - if ( m_document->page( m_frameIndex )->pageAction( Okular::Page::Opening ) ) - m_document->processAction( m_document->page( m_frameIndex )->pageAction( Okular::Page::Opening ) ); - - // start autoplay video playback - Q_FOREACH ( VideoWidget *vw, m_frames[ m_frameIndex ]->videoWidgets ) - vw->pageEntered(); + if ( (Okular::Settings::slidesShowSummary() && !m_showSummaryView) || m_frameIndex == -1 ) + notifyCurrentPageChanged( -1, newPage ); } void PresentationWidget::generatePage( bool disableTransition ) diff --git a/ui/presentationwidget.h b/ui/presentationwidget.h index 20dbcbb8a..f37e6e22b 100644 --- a/ui/presentationwidget.h +++ b/ui/presentationwidget.h @@ -53,6 +53,7 @@ class PresentationWidget : public QWidget, public Okular::DocumentObserver void notifyViewportChanged( bool smoothMove ); void notifyPageChanged( int pageNumber, int changedFlags ); bool canUnloadPixmap( int pageNumber ) const; + void notifyCurrentPageChanged( int previous, int current ); public slots: void slotFind(); @@ -133,6 +134,7 @@ class PresentationWidget : public QWidget, public Okular::DocumentObserver bool m_isSetup; bool m_blockNotifications; bool m_inBlackScreenMode; + bool m_showSummaryView; private slots: void slotNextPage(); diff --git a/ui/side_reviews.cpp b/ui/side_reviews.cpp index a036c48be..a35f9ed56 100644 --- a/ui/side_reviews.cpp +++ b/ui/side_reviews.cpp @@ -158,9 +158,11 @@ Reviews::~Reviews() } //BEGIN DocumentObserver Notifies -void Reviews::notifyViewportChanged( bool ) +void Reviews::notifyCurrentPageChanged( int previousPage, int currentPage ) { - m_filterProxy->setCurrentPage( m_document->currentPage() ); + Q_UNUSED( previousPage ) + + m_filterProxy->setCurrentPage( currentPage ); } //END DocumentObserver Notifies diff --git a/ui/side_reviews.h b/ui/side_reviews.h index d063b7b7a..bbd8324ae 100644 --- a/ui/side_reviews.h +++ b/ui/side_reviews.h @@ -42,7 +42,7 @@ class Reviews : public QWidget, public Okular::DocumentObserver // [INHERITED] from DocumentObserver uint observerId() const { return REVIEWS_ID; } - void notifyViewportChanged( bool smoothMove ); + void notifyCurrentPageChanged( int previous, int current ); void reparseConfig(); diff --git a/ui/thumbnaillist.cpp b/ui/thumbnaillist.cpp index 8b2302586..60288cb53 100644 --- a/ui/thumbnaillist.cpp +++ b/ui/thumbnaillist.cpp @@ -310,11 +310,12 @@ void ThumbnailList::notifySetup( const QVector< Okular::Page * > & pages, int se d->delayedRequestVisiblePixmaps( 200 ); } -void ThumbnailList::notifyViewportChanged( bool /*smoothMove*/ ) +void ThumbnailList::notifyCurrentPageChanged( int previousPage, int currentPage ) { + Q_UNUSED( previousPage ) + // skip notifies for the current page (already selected) - const int newPage = d->m_document->viewport().pageNumber; - if ( d->m_selected && d->m_selected->pageNumber() == newPage ) + if ( d->m_selected && d->m_selected->pageNumber() == currentPage ) return; // deselect previous thumbnail @@ -327,7 +328,7 @@ void ThumbnailList::notifyViewportChanged( bool /*smoothMove*/ ) QVector::const_iterator tIt = d->m_thumbnails.constBegin(), tEnd = d->m_thumbnails.constEnd(); for ( ; tIt != tEnd; ++tIt ) { - if ( (*tIt)->pageNumber() == newPage ) + if ( (*tIt)->pageNumber() == currentPage ) { d->m_selected = *tIt; d->m_selected->setSelected( true ); diff --git a/ui/thumbnaillist.h b/ui/thumbnaillist.h index 0d7136ba0..20c434fa0 100644 --- a/ui/thumbnaillist.h +++ b/ui/thumbnaillist.h @@ -41,7 +41,7 @@ Q_OBJECT // inherited: create thumbnails ( inherited as a DocumentObserver ) void notifySetup( const QVector< Okular::Page * > & pages, int setupFlags ); // inherited: hilihght current thumbnail ( inherited as DocumentObserver ) - void notifyViewportChanged( bool smoothMove ); + void notifyCurrentPageChanged( int previous, int current ); // inherited: redraw thumbnail ( inherited as DocumentObserver ) void notifyPageChanged( int pageNumber, int changedFlags ); // inherited: request all visible pixmap (due to a global shange or so..) diff --git a/ui/toc.cpp b/ui/toc.cpp index 3203c79f8..4c84b62c3 100644 --- a/ui/toc.cpp +++ b/ui/toc.cpp @@ -25,7 +25,7 @@ #include "core/document.h" #include "settings.h" -TOC::TOC(QWidget *parent, Okular::Document *document) : QWidget(parent), m_document(document), m_currentPage(-1) +TOC::TOC(QWidget *parent, Okular::Document *document) : QWidget(parent), m_document(document) { QVBoxLayout *mainlay = new QVBoxLayout( this ); mainlay->setMargin( 0 ); @@ -69,7 +69,6 @@ void TOC::notifySetup( const QVector< Okular::Page * > & /*pages*/, int setupFla // clear contents m_model->clear(); - m_currentPage = -1; // request synopsis description (is a dom tree) const Okular::DocumentSynopsis * syn = m_document->documentSynopsis(); @@ -86,14 +85,8 @@ void TOC::notifySetup( const QVector< Okular::Page * > & /*pages*/, int setupFla emit hasTOC( !m_model->isEmpty() ); } -void TOC::notifyViewportChanged( bool /*smoothMove*/ ) +void TOC::notifyCurrentPageChanged( int, int ) { - int newpage = m_document->viewport().pageNumber; - if ( m_currentPage == newpage ) - return; - - m_currentPage = newpage; - m_model->setCurrentViewport( m_document->viewport() ); } diff --git a/ui/toc.h b/ui/toc.h index 4e63ef65d..eeeff9800 100644 --- a/ui/toc.h +++ b/ui/toc.h @@ -33,7 +33,7 @@ Q_OBJECT // inherited from DocumentObserver uint observerId() const; void notifySetup( const QVector< Okular::Page * > & pages, int setupFlags ); - void notifyViewportChanged( bool smoothMove ); + void notifyCurrentPageChanged( int previous, int current ); void reparseConfig(); @@ -49,7 +49,6 @@ Q_OBJECT QTreeView *m_treeView; KTreeViewSearchLine *m_searchLine; TOCModel *m_model; - int m_currentPage; }; #endif From 23d474e6a9fad82cbea5633bd2a5202a7af7d02e Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Thu, 6 Sep 2012 18:59:26 +0200 Subject: [PATCH 125/155] I'll increase the number myself since tokoe seems to ingore my mails CCMAIL: tokoe@kde.org --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e75f76832..a057e82ec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -120,7 +120,7 @@ ENDIF(APPLE) target_link_libraries(okularcore ${OKULAR_IOKIT} ${KDE4_KIO_LIBS} ${KDE4_PHONON_LIBRARY} ${KDE4_KJSAPI_LIBRARY} ${MATH_LIB} ${KDE4_THREADWEAVER_LIBRARY} ) -set_target_properties(okularcore PROPERTIES VERSION 2.0.0 SOVERSION 1 ) +set_target_properties(okularcore PROPERTIES VERSION 2.0.0 SOVERSION 2 ) install(TARGETS okularcore ${INSTALL_TARGETS_DEFAULT_ARGS} ) From a716b3e4e0b1066d6cda83ed0f90858bd8ab739e Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Thu, 6 Sep 2012 19:10:03 +0200 Subject: [PATCH 126/155] kill all the deprecated functions now that we've change ABI anyway --- core/annotations.cpp | 12 -------- core/annotations.h | 10 ------- core/fileprinter.cpp | 46 ------------------------------- core/fileprinter.h | 65 -------------------------------------------- 4 files changed, 133 deletions(-) diff --git a/core/annotations.cpp b/core/annotations.cpp index bc55f4bbb..d774e1a75 100644 --- a/core/annotations.cpp +++ b/core/annotations.cpp @@ -1546,18 +1546,6 @@ QColor GeomAnnotation::geometricalInnerColor() const return d->m_geomInnerColor; } -void GeomAnnotation::setGeometricalPointWidth( int width ) -{ - Q_D( GeomAnnotation ); - d->m_style.setWidth( width ); -} - -int GeomAnnotation::geometricalPointWidth() const -{ - Q_D( const GeomAnnotation ); - return static_cast< int >( d->m_style.width() ); -} - Annotation::SubType GeomAnnotation::subType() const { return AGeom; diff --git a/core/annotations.h b/core/annotations.h index 23deaf3a9..01a4fb2bf 100644 --- a/core/annotations.h +++ b/core/annotations.h @@ -1050,16 +1050,6 @@ class OKULAR_EXPORT GeomAnnotation : public Annotation */ QColor geometricalInnerColor() const; - /** - * Sets the point @p width of the geometrical annotation. - */ - KDE_DEPRECATED void setGeometricalPointWidth( int width ); - - /** - * Returns the point width of the geometrical annotation. - */ - KDE_DEPRECATED int geometricalPointWidth() const; - /** * Returns the sub type of the geometrical annotation. */ diff --git a/core/fileprinter.cpp b/core/fileprinter.cpp index 28d283998..38c89f54e 100644 --- a/core/fileprinter.cpp +++ b/core/fileprinter.cpp @@ -33,13 +33,6 @@ using namespace Okular; -// Deprecated overload for binary compatibility -int FilePrinter::printFile( QPrinter &printer, const QString file, FileDeletePolicy fileDeletePolicy, - PageSelectPolicy pageSelectPolicy, const QString &pageRange ) -{ - return printFile( printer, file, QPrinter::Portrait, fileDeletePolicy, pageSelectPolicy, pageRange ); -} - int FilePrinter::printFile( QPrinter &printer, const QString file, QPrinter::Orientation documentOrientation, FileDeletePolicy fileDeletePolicy, PageSelectPolicy pageSelectPolicy, const QString &pageRange ) @@ -49,24 +42,6 @@ int FilePrinter::printFile( QPrinter &printer, const QString file, documentOrientation ); } -// Deprecated function kept for binary compatibility -// This is deprecated because it cannot support different original orientations -// for each document in the list. -int FilePrinter::printFiles( QPrinter &printer, const QStringList &fileList, FileDeletePolicy fileDeletePolicy ) -{ - FilePrinter fp; - return fp.doPrintFiles( printer, fileList, fileDeletePolicy, FilePrinter::ApplicationSelectsPages, QString(), - QPrinter::Portrait ); -} - -// Deprecated overload for binary compatibility -int FilePrinter::doPrintFiles( QPrinter &printer, QStringList fileList, FileDeletePolicy fileDeletePolicy, - PageSelectPolicy pageSelectPolicy, const QString &pageRange ) -{ - return doPrintFiles( printer, fileList, fileDeletePolicy, pageSelectPolicy, pageRange, - QPrinter::Portrait ); -} - int FilePrinter::doPrintFiles( QPrinter &printer, QStringList fileList, FileDeletePolicy fileDeletePolicy, PageSelectPolicy pageSelectPolicy, const QString &pageRange, QPrinter::Orientation documentOrientation ) @@ -380,15 +355,6 @@ Generator::PrintError FilePrinter::printError( int c ) -// Deprecated overload for binary compatibility -QStringList FilePrinter::printArguments( QPrinter &printer, FileDeletePolicy fileDeletePolicy, - PageSelectPolicy pageSelectPolicy, bool useCupsOptions, - const QString &pageRange, const QString &version ) -{ - return printArguments( printer, fileDeletePolicy, pageSelectPolicy, useCupsOptions, - pageRange, version, QPrinter::Portrait ); -} - QStringList FilePrinter::printArguments( QPrinter &printer, FileDeletePolicy fileDeletePolicy, PageSelectPolicy pageSelectPolicy, bool useCupsOptions, const QString &pageRange, const QString &version, @@ -516,12 +482,6 @@ QStringList FilePrinter::pages( QPrinter &printer, PageSelectPolicy pageSelectPo return QStringList(); // AllPages } -// Deprecated overload for binary compatibility -QStringList FilePrinter::cupsOptions( QPrinter &printer ) -{ - return cupsOptions( printer, QPrinter::Portrait ); -} - QStringList FilePrinter::cupsOptions( QPrinter &printer, QPrinter::Orientation documentOrientation ) { QStringList optionList; @@ -635,12 +595,6 @@ QString FilePrinter::mediaPaperSource( QPrinter &printer ) } } -// Deprecated overload for binary compatibility -QStringList FilePrinter::optionOrientation( QPrinter &printer ) -{ - return optionOrientation( printer, QPrinter::Portrait ); -} - QStringList FilePrinter::optionOrientation( QPrinter &printer, QPrinter::Orientation documentOrientation ) { // portrait and landscape options rotate the document according to the document orientation diff --git a/core/fileprinter.h b/core/fileprinter.h index 5fbb49263..c7cd32aef 100644 --- a/core/fileprinter.h +++ b/core/fileprinter.h @@ -18,9 +18,6 @@ #include #include -// For KDE_DEPRECATED -#include - #include "okular_export.h" #include "generator.h" @@ -84,60 +81,6 @@ public: PageSelectPolicy pageSelectPolicy = FilePrinter::ApplicationSelectsPages, const QString &pageRange = QString() ); - /** Print a file using the settings in QPrinter (compatibility overload) - * - * Only supports CUPS and LPR on *NIX. Page Range only supported in CUPS. - * Most settings unsupported by LPR, some settings unsupported by CUPS. - * - * @param printer the print settings to use - * @param file the file to print - * @param fileDeletePolicy if the application or system deletes the file - * @param pageSelectPolicy if the application or system selects the pages to print - * @param pageRange page range to print if SystemSlectsPages and user chooses Selection in Print Dialog - * - * @returns Returns exit code: - * -9 if lpr not found - * -8 if empty file name - * -7 if unable to find file - * -6 if invalid printer state - * -5 if print to file copy failed - * -2 if the KProcess could not be started - * -1 if the KProcess crashed - * otherwise the KProcess exit code - * - * @deprecated Use the overload which takes the documentOrientation instead. - */ - - static KDE_DEPRECATED int printFile( QPrinter &printer, const QString file, - FileDeletePolicy fileDeletePolicy = FilePrinter::ApplicationDeletesFiles, - PageSelectPolicy pageSelectPolicy = FilePrinter::ApplicationSelectsPages, - const QString &pageRange = QString() ); - - /** Print a list of files using the settings in QPrinter - * - * Only supports CUPS and LPR on *NIX. - * Most settings unsupported by LPR, some settings unsupported by CUPS. - * - * @param printer the print settings to use - * @param fileList the files to print - * @param fileDeletePolicy if the application or system deletes the file - * - * @returns Returns exit code: - * -9 if lpr not found - * -8 if empty file list - * -7 if unable to find a file - * -6 if invalid printer state - * -5 if print to file copy failed - * -2 if the KProcess could not be started - * -1 if the KProcess crashed - * otherwise the KProcess exit code - * - * @deprecated Use printFile instead, passing the documentOrientation for each file. - */ - - static KDE_DEPRECATED int printFiles( QPrinter &printer, const QStringList &fileList, - FileDeletePolicy fileDeletePolicy = FilePrinter::ApplicationDeletesFiles ); - /** Return the list of pages selected by the user in the Print Dialog * * @param printer the print settings to use @@ -209,17 +152,11 @@ protected: bool detectCupsService(); bool detectCupsConfig(); - KDE_DEPRECATED int doPrintFiles( QPrinter &printer, const QStringList fileList, - FileDeletePolicy fileDeletePolicy, PageSelectPolicy pageSelectPolicy, - const QString &pageRange ); int doPrintFiles( QPrinter &printer, const QStringList fileList, FileDeletePolicy fileDeletePolicy, PageSelectPolicy pageSelectPolicy, const QString &pageRange, QPrinter::Orientation documentOrientation ); - KDE_DEPRECATED QStringList printArguments( QPrinter &printer, - FileDeletePolicy fileDeletePolicy, PageSelectPolicy pageSelectPolicy, - bool useCupsOptions, const QString &pageRange, const QString &version ); QStringList printArguments( QPrinter &printer, FileDeletePolicy fileDeletePolicy, PageSelectPolicy pageSelectPolicy, bool useCupsOptions, const QString &pageRange, const QString &version, @@ -233,12 +170,10 @@ protected: QStringList pages( QPrinter &printer, PageSelectPolicy pageSelectPolicy, const QString &pageRange, bool useCupsOptions, const QString &version ); - KDE_DEPRECATED QStringList cupsOptions( QPrinter &printer ); QStringList cupsOptions( QPrinter &printer, QPrinter::Orientation documentOrientation ); QStringList optionMedia( QPrinter &printer ); QString mediaPageSize( QPrinter &printer ); QString mediaPaperSource( QPrinter &printer ); - KDE_DEPRECATED QStringList optionOrientation( QPrinter &printer ); QStringList optionOrientation( QPrinter &printer, QPrinter::Orientation documentOrientation ); QStringList optionDoubleSidedPrinting( QPrinter &printer ); QStringList optionPageOrder( QPrinter &printer ); From 21fd5cfb0d63457529166a4e01f2bb99e0ba8825 Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Sat, 8 Sep 2012 15:33:42 +0200 Subject: [PATCH 127/155] Add option to show complete file path in window title BUGS: 296870 REVIEW: 106345 FIXED-IN: 4.10.0 --- conf/dlggeneralbase.ui | 69 +++++++++++++++++++++++++++++++++++++++++- conf/okular.kcfg | 7 +++++ part.cpp | 2 +- 3 files changed, 76 insertions(+), 2 deletions(-) diff --git a/conf/dlggeneralbase.ui b/conf/dlggeneralbase.ui index c167b3505..001d4e5fd 100644 --- a/conf/dlggeneralbase.ui +++ b/conf/dlggeneralbase.ui @@ -61,10 +61,71 @@ - Display document title in title bar + Display document title in title bar if available + + + + When not displaying document title: + + + + + + + KButtonGroup {border:0; } + + + true + + + 0 + + + + 8 + + + 0 + + + 0 + + + + + Display file name only + + + true + + + + + + + Display full file path + + + false + + + + + + + + + + 4 + + + 0 + + + @@ -313,6 +374,12 @@ For files which were opened before the previous zoom is applied. + + KButtonGroup + QGroupBox +

kbuttongroup.h
+ 1 + KIntSpinBox QSpinBox diff --git a/conf/okular.kcfg b/conf/okular.kcfg index 6ad0e192b..22783c7c7 100644 --- a/conf/okular.kcfg +++ b/conf/okular.kcfg @@ -167,6 +167,13 @@ true + + Name + + + + + true diff --git a/part.cpp b/part.cpp index 2808083af..fe11189b8 100644 --- a/part.cpp +++ b/part.cpp @@ -991,7 +991,7 @@ void Part::setWindowTitleFromDocument() { // If 'DocumentTitle' should be used, check if the document has one. If // either case is false, use the file name. - QString title = realUrl().fileName(); + QString title = Okular::Settings::displayDocumentNameOrPath() == Okular::Settings::EnumDisplayDocumentNameOrPath::Path ? realUrl().pathOrUrl() : realUrl().fileName(); if ( Okular::Settings::displayDocumentTitle() ) { From aa6ed8afc0f595db1d372b81dc8db2593e7055e1 Mon Sep 17 00:00:00 2001 From: Jan Binder Date: Sat, 8 Sep 2012 17:06:02 +0200 Subject: [PATCH 128/155] Replace deprecated QMatrix by QTransform REVIEW: 105737 --- core/annotations.cpp | 42 +++++++++++------------ core/annotations.h | 2 +- core/annotations_p.h | 8 ++--- core/area.cpp | 8 ++--- core/area.h | 13 ++++---- core/page.cpp | 10 +++--- core/page_p.h | 4 +-- core/rotationjob.cpp | 8 ++--- core/rotationjob_p.h | 4 +-- core/textpage.cpp | 10 +++--- core/textpage.h | 4 +-- core/textpage_p.h | 2 +- generators/spectre/rendererthread.cpp | 6 ++-- generators/xps/generator_xps.cpp | 48 +++++++++++++-------------- generators/xps/generator_xps.h | 4 +-- 15 files changed, 87 insertions(+), 86 deletions(-) diff --git a/core/annotations.cpp b/core/annotations.cpp index d774e1a75..ceb571c4a 100644 --- a/core/annotations.cpp +++ b/core/annotations.cpp @@ -849,18 +849,18 @@ void Annotation::store( QDomNode & annNode, QDomDocument & document ) const } } -void AnnotationPrivate::annotationTransform( const QMatrix &matrix ) +void AnnotationPrivate::annotationTransform( const QTransform &matrix ) { resetTransformation(); transform( matrix ); } -void AnnotationPrivate::transform( const QMatrix &matrix ) +void AnnotationPrivate::transform( const QTransform &matrix ) { m_transformedBoundary.transform( matrix ); } -void AnnotationPrivate::baseTransform( const QMatrix &matrix ) +void AnnotationPrivate::baseTransform( const QTransform &matrix ) { m_boundary.transform( matrix ); } @@ -898,8 +898,8 @@ class Okular::TextAnnotationPrivate : public Okular::AnnotationPrivate { } - virtual void transform( const QMatrix &matrix ); - virtual void baseTransform( const QMatrix &matrix ); + virtual void transform( const QTransform &matrix ); + virtual void baseTransform( const QTransform &matrix ); virtual void resetTransformation(); virtual void translate( const NormalizedPoint &coord ); virtual bool openDialogAfterCreation() const; @@ -1130,7 +1130,7 @@ void TextAnnotation::store( QDomNode & node, QDomDocument & document ) const } } -void TextAnnotationPrivate::transform( const QMatrix &matrix ) +void TextAnnotationPrivate::transform( const QTransform &matrix ) { AnnotationPrivate::transform( matrix ); @@ -1139,7 +1139,7 @@ void TextAnnotationPrivate::transform( const QMatrix &matrix ) } } -void TextAnnotationPrivate::baseTransform( const QMatrix &matrix ) +void TextAnnotationPrivate::baseTransform( const QTransform &matrix ) { AnnotationPrivate::baseTransform( matrix ); @@ -1190,8 +1190,8 @@ class Okular::LineAnnotationPrivate : public Okular::AnnotationPrivate { } - virtual void transform( const QMatrix &matrix ); - virtual void baseTransform( const QMatrix &matrix ); + virtual void transform( const QTransform &matrix ); + virtual void baseTransform( const QTransform &matrix ); virtual void resetTransformation(); virtual void translate( const NormalizedPoint &coord ); @@ -1434,7 +1434,7 @@ void LineAnnotation::store( QDomNode & node, QDomDocument & document ) const } } -void LineAnnotationPrivate::transform( const QMatrix &matrix ) +void LineAnnotationPrivate::transform( const QTransform &matrix ) { AnnotationPrivate::transform( matrix ); @@ -1443,7 +1443,7 @@ void LineAnnotationPrivate::transform( const QMatrix &matrix ) it.next().transform( matrix ); } -void LineAnnotationPrivate::baseTransform( const QMatrix &matrix ) +void LineAnnotationPrivate::baseTransform( const QTransform &matrix ) { AnnotationPrivate::baseTransform( matrix ); @@ -1662,7 +1662,7 @@ double HighlightAnnotation::Quad::feather() const return d->m_feather; } -void HighlightAnnotation::Quad::transform( const QMatrix &matrix ) +void HighlightAnnotation::Quad::transform( const QTransform &matrix ) { for ( int i = 0; i < 4; ++i ) { d->m_transformedPoints[ i ] = d->m_points[ i ]; @@ -1679,8 +1679,8 @@ class Okular::HighlightAnnotationPrivate : public Okular::AnnotationPrivate { } - virtual void transform( const QMatrix &matrix ); - virtual void baseTransform( const QMatrix &matrix ); + virtual void transform( const QTransform &matrix ); + virtual void baseTransform( const QTransform &matrix ); HighlightAnnotation::HighlightType m_highlightType; QList< HighlightAnnotation::Quad > m_highlightQuads; @@ -1725,7 +1725,7 @@ HighlightAnnotation::HighlightAnnotation( const QDomNode & node ) q.setCapEnd( qe.hasAttribute( "end" ) ); q.setFeather( qe.attribute( "feather", "0.1" ).toDouble() ); - q.transform( QMatrix() ); + q.transform( QTransform() ); d->m_highlightQuads.append( q ); } @@ -1800,7 +1800,7 @@ Annotation::SubType HighlightAnnotation::subType() const return AHighlight; } -void HighlightAnnotationPrivate::transform( const QMatrix &matrix ) +void HighlightAnnotationPrivate::transform( const QTransform &matrix ) { AnnotationPrivate::transform( matrix ); @@ -1809,7 +1809,7 @@ void HighlightAnnotationPrivate::transform( const QMatrix &matrix ) it.next().transform( matrix ); } -void HighlightAnnotationPrivate::baseTransform( const QMatrix &matrix ) +void HighlightAnnotationPrivate::baseTransform( const QTransform &matrix ) { AnnotationPrivate::baseTransform( matrix ); @@ -1904,8 +1904,8 @@ class Okular::InkAnnotationPrivate : public Okular::AnnotationPrivate { } - virtual void transform( const QMatrix &matrix ); - virtual void baseTransform( const QMatrix &matrix ); + virtual void transform( const QTransform &matrix ); + virtual void baseTransform( const QTransform &matrix ); virtual void resetTransformation(); virtual void translate( const NormalizedPoint &coord ); @@ -2029,7 +2029,7 @@ void InkAnnotation::store( QDomNode & node, QDomDocument & document ) const } } -void InkAnnotationPrivate::transform( const QMatrix &matrix ) +void InkAnnotationPrivate::transform( const QTransform &matrix ) { AnnotationPrivate::transform( matrix ); @@ -2041,7 +2041,7 @@ void InkAnnotationPrivate::transform( const QMatrix &matrix ) } } -void InkAnnotationPrivate::baseTransform( const QMatrix &matrix ) +void InkAnnotationPrivate::baseTransform( const QTransform &matrix ) { AnnotationPrivate::baseTransform( matrix ); diff --git a/core/annotations.h b/core/annotations.h index 01a4fb2bf..9ba0b6b43 100644 --- a/core/annotations.h +++ b/core/annotations.h @@ -1181,7 +1181,7 @@ class OKULAR_EXPORT HighlightAnnotation : public Annotation * Transforms the quad coordinates with the transformation defined * by @p matrix. */ - void transform( const QMatrix &matrix ); + void transform( const QTransform &matrix ); private: class Private; diff --git a/core/annotations_p.h b/core/annotations_p.h index 36c37853f..221572df9 100644 --- a/core/annotations_p.h +++ b/core/annotations_p.h @@ -19,7 +19,7 @@ #include #include -class QMatrix; +class QTransform; namespace Okular { @@ -36,10 +36,10 @@ class AnnotationPrivate * Transforms the annotation coordinates with the transformation * defined by @p matrix. */ - void annotationTransform( const QMatrix &matrix ); + void annotationTransform( const QTransform &matrix ); - virtual void transform( const QMatrix &matrix ); - virtual void baseTransform( const QMatrix &matrix ); + virtual void transform( const QTransform &matrix ); + virtual void baseTransform( const QTransform &matrix ); virtual void resetTransformation(); virtual void translate( const NormalizedPoint &coord ); virtual bool openDialogAfterCreation() const; diff --git a/core/area.cpp b/core/area.cpp index 94b451426..825976079 100644 --- a/core/area.cpp +++ b/core/area.cpp @@ -40,7 +40,7 @@ NormalizedPoint& NormalizedPoint::operator=( const NormalizedPoint & p ) return *this; } -void NormalizedPoint::transform( const QMatrix &matrix ) +void NormalizedPoint::transform( const QTransform &matrix ) { qreal tmp_x = (qreal)x; qreal tmp_y = (qreal)y; @@ -190,7 +190,7 @@ QRect NormalizedRect::roundedGeometry( int xScale, int yScale ) const return QRect( l, t, r - l + 1, b - t + 1 ); } -void NormalizedRect::transform( const QMatrix &matrix ) +void NormalizedRect::transform( const QTransform &matrix ) { QRectF rect( left, top, right - left, bottom - top ); rect = matrix.mapRect( rect ); @@ -305,7 +305,7 @@ bool ObjectRect::contains( double x, double y, double, double ) const return m_transformedPath.contains( QPointF( x, y ) ); } -void ObjectRect::transform( const QMatrix &matrix ) +void ObjectRect::transform( const QTransform &matrix ) { m_transformedPath = matrix.map( m_path ); } @@ -385,7 +385,7 @@ AnnotationObjectRect::~AnnotationObjectRect() m_object = 0; } -void AnnotationObjectRect::transform( const QMatrix &matrix ) +void AnnotationObjectRect::transform( const QTransform &matrix ) { m_annotation->d_func()->annotationTransform( matrix ); } diff --git a/core/area.h b/core/area.h index a11d4bef4..4f63759bd 100644 --- a/core/area.h +++ b/core/area.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include "global.h" @@ -69,7 +70,7 @@ class OKULAR_EXPORT NormalizedPoint /** * Transforms the normalized point with the operations defined by @p matrix. */ - void transform( const QMatrix &matrix ); + void transform( const QTransform &matrix ); /** * The normalized x coordinate. @@ -206,7 +207,7 @@ class OKULAR_EXPORT NormalizedRect /** * Transforms the normalized rectangle with the operations defined by @p matrix. */ - void transform( const QMatrix &matrix ); + void transform( const QTransform &matrix ); /** * Returns true if the point pt is located to the bottom of the rectangle @@ -370,7 +371,7 @@ class OKULAR_EXPORT ObjectRect /** * Transforms the object rectangle with the operations defined by @p matrix. */ - virtual void transform( const QMatrix &matrix ); + virtual void transform( const QTransform &matrix ); /** * Returns the square of the distance between the object and the point @p x, @p y @@ -425,7 +426,7 @@ class OKULAR_EXPORT AnnotationObjectRect : public ObjectRect /** * Transforms the annotation object rectangle with the operations defined by @p matrix. */ - virtual void transform( const QMatrix &matrix ); + virtual void transform( const QTransform &matrix ); private: Annotation * m_annotation; @@ -576,7 +577,7 @@ template class RegularArea : public QList< /** * Transforms the regular area with the operations defined by @p matrix. */ - void transform( const QMatrix &matrix ); + void transform( const QTransform &matrix ); }; template @@ -808,7 +809,7 @@ QList RegularArea::geometry( int xScale, int ySca } template -void RegularArea::transform( const QMatrix &matrix ) +void RegularArea::transform( const QTransform &matrix ) { if ( !this ) return; diff --git a/core/page.cpp b/core/page.cpp index ca40d92e6..d746382e1 100644 --- a/core/page.cpp +++ b/core/page.cpp @@ -102,9 +102,9 @@ void PagePrivate::imageRotationDone( RotationJob * job ) } } -QMatrix PagePrivate::rotationMatrix() const +QTransform PagePrivate::rotationMatrix() const { - QMatrix matrix; + QTransform matrix; matrix.rotate( (int)m_rotation * 90 ); switch ( m_rotation ) @@ -369,7 +369,7 @@ void PagePrivate::rotateAt( Rotation orientation ) /** * Rotate the object rects on the page. */ - const QMatrix matrix = rotationMatrix(); + const QTransform matrix = rotationMatrix(); QLinkedList< ObjectRect * >::const_iterator objectIt = m_page->m_rects.begin(), end = m_page->m_rects.end(); for ( ; objectIt != end; ++objectIt ) (*objectIt)->transform( matrix ); @@ -519,7 +519,7 @@ void Page::setObjectRects( const QLinkedList< ObjectRect * > & rects ) /** * Rotate the object rects of the page. */ - const QMatrix matrix = d->rotationMatrix(); + const QTransform matrix = d->rotationMatrix(); QLinkedList< ObjectRect * >::const_iterator objectIt = rects.begin(), end = rects.end(); for ( ; objectIt != end; ++objectIt ) @@ -601,7 +601,7 @@ void Page::addAnnotation( Annotation * annotation ) AnnotationObjectRect *rect = new AnnotationObjectRect( annotation ); // Rotate the annotation on the page. - const QMatrix matrix = d->rotationMatrix(); + const QTransform matrix = d->rotationMatrix(); annotation->d_ptr->baseTransform( matrix.inverted() ); annotation->d_ptr->annotationTransform( matrix ); diff --git a/core/page_p.h b/core/page_p.h index 02281f1ae..d25a282d9 100644 --- a/core/page_p.h +++ b/core/page_p.h @@ -14,7 +14,7 @@ // qt/kde includes #include #include -#include +#include #include #include @@ -57,7 +57,7 @@ class PagePrivate ~PagePrivate(); void imageRotationDone( RotationJob * job ); - QMatrix rotationMatrix() const; + QTransform rotationMatrix() const; /** * Loads the local contents (e.g. annotations) of the page. diff --git a/core/rotationjob.cpp b/core/rotationjob.cpp index 625a5d2cc..5659b2d4a 100644 --- a/core/rotationjob.cpp +++ b/core/rotationjob.cpp @@ -9,7 +9,7 @@ #include "rotationjob_p.h" -#include +#include using namespace Okular; @@ -50,14 +50,14 @@ void RotationJob::run() return; } - QMatrix matrix = rotationMatrix( mOldRotation, mNewRotation ); + QTransform matrix = rotationMatrix( mOldRotation, mNewRotation ); mRotatedImage = mImage.transformed( matrix ); } -QMatrix RotationJob::rotationMatrix( Rotation from, Rotation to ) +QTransform RotationJob::rotationMatrix( Rotation from, Rotation to ) { - QMatrix matrix; + QTransform matrix; if ( from == Rotation0 ) { if ( to == Rotation90 ) diff --git a/core/rotationjob_p.h b/core/rotationjob_p.h index 9790b64b5..b855084d7 100644 --- a/core/rotationjob_p.h +++ b/core/rotationjob_p.h @@ -11,7 +11,7 @@ #define _OKULAR_ROTATIONJOB_P_H_ #include -#include +#include #include @@ -35,7 +35,7 @@ class RotationJob : public ThreadWeaver::Job int id() const; PagePrivate * page() const; - static QMatrix rotationMatrix( Rotation from, Rotation to ); + static QTransform rotationMatrix( Rotation from, Rotation to ); protected: virtual void run(); diff --git a/core/textpage.cpp b/core/textpage.cpp index 57d0d0cea..ad090e6f8 100644 --- a/core/textpage.cpp +++ b/core/textpage.cpp @@ -174,7 +174,7 @@ class TinyTextEntity : QString::fromRawData( d.data, length ); } - inline NormalizedRect transformedArea( const QMatrix &matrix ) const + inline NormalizedRect transformedArea( const QTransform &matrix ) const { NormalizedRect transformed_area = area; transformed_area.transform( matrix ); @@ -215,7 +215,7 @@ NormalizedRect* TextEntity::area() const return m_area; } -NormalizedRect TextEntity::transformedArea(const QMatrix &matrix) const +NormalizedRect TextEntity::transformedArea(const QTransform &matrix) const { NormalizedRect transformed_area = *m_area; transformed_area.transform( matrix ); @@ -359,7 +359,7 @@ RegularAreaRect * TextPage::textArea ( TextSelection * sel) const */ RegularAreaRect * ret= new RegularAreaRect; - const QMatrix matrix = d->m_page ? d->m_page->rotationMatrix() : QMatrix(); + const QTransform matrix = d->m_page ? d->m_page->rotationMatrix() : QTransform(); #if 0 int it = -1; int itB = -1; @@ -840,7 +840,7 @@ RegularAreaRect* TextPagePrivate::findTextInternalForward( int searchID, const Q const TextList::ConstIterator &start, const TextList::ConstIterator &end ) { - const QMatrix matrix = m_page ? m_page->rotationMatrix() : QMatrix(); + const QTransform matrix = m_page ? m_page->rotationMatrix() : QTransform(); RegularAreaRect* ret=new RegularAreaRect; @@ -955,7 +955,7 @@ RegularAreaRect* TextPagePrivate::findTextInternalBackward( int searchID, const const TextList::ConstIterator &start, const TextList::ConstIterator &end ) { - const QMatrix matrix = m_page ? m_page->rotationMatrix() : QMatrix(); + const QTransform matrix = m_page ? m_page->rotationMatrix() : QTransform(); RegularAreaRect* ret=new RegularAreaRect; diff --git a/core/textpage.h b/core/textpage.h index a0b41c7d6..36cbe3997 100644 --- a/core/textpage.h +++ b/core/textpage.h @@ -16,7 +16,7 @@ #include "okular_export.h" #include "global.h" -class QMatrix; +class QTransform; namespace Okular { @@ -70,7 +70,7 @@ class OKULAR_EXPORT TextEntity /** * Returns the transformed area of the text entity. */ - NormalizedRect transformedArea(const QMatrix &matrix) const; + NormalizedRect transformedArea(const QTransform &matrix) const; private: QString m_text; diff --git a/core/textpage_p.h b/core/textpage_p.h index 7c2be22cd..8ecf0c907 100644 --- a/core/textpage_p.h +++ b/core/textpage_p.h @@ -14,7 +14,7 @@ #include #include #include -#include +#include class SearchPoint; class TinyTextEntity; diff --git a/generators/spectre/rendererthread.cpp b/generators/spectre/rendererthread.cpp index f185d2277..ef0deabcb 100644 --- a/generators/spectre/rendererthread.cpp +++ b/generators/spectre/rendererthread.cpp @@ -86,7 +86,7 @@ void GSRendererThread::run() { case Okular::Rotation90: { - QMatrix m; + QTransform m; m.rotate(90); img = img.transformed( m ); break; @@ -94,14 +94,14 @@ void GSRendererThread::run() case Okular::Rotation180: { - QMatrix m; + QTransform m; m.rotate(180); img = img.transformed( m ); break; } case Okular::Rotation270: { - QMatrix m; + QTransform m; m.rotate(270); img = img.transformed( m ); } diff --git a/generators/xps/generator_xps.cpp b/generators/xps/generator_xps.cpp index 97f4450a8..2399a9656 100644 --- a/generators/xps/generator_xps.cpp +++ b/generators/xps/generator_xps.cpp @@ -393,18 +393,18 @@ static QPainterPath parseAbbreviatedPathData( const QString &data) /** Parse a "Matrix" attribute string \param csv the comma separated list of values - \return the QMatrix corresponding to the affine transform + \return the QTransform corresponding to the affine transform given in the attribute \see XPS specification 7.4.1 */ -static QMatrix attsToMatrix( const QString &csv ) +static QTransform attsToMatrix( const QString &csv ) { QStringList values = csv.split( ',' ); if ( values.count() != 6 ) { - return QMatrix(); // that is an identity matrix - no effect + return QTransform(); // that is an identity matrix - no effect } - return QMatrix( values.at(0).toDouble(), values.at(1).toDouble(), + return QTransform( values.at(0).toDouble(), values.at(1).toDouble(), values.at(2).toDouble(), values.at(3).toDouble(), values.at(4).toDouble(), values.at(5).toDouble() ); } @@ -440,12 +440,12 @@ static QPen parseRscRefColorForPen( const QString &data ) /** \return Matrix specified by given data or by referenced dictionary */ -static QMatrix parseRscRefMatrix( const QString &data ) +static QTransform parseRscRefMatrix( const QString &data ) { if (data[0] == '{') { //TODO kDebug(XpsDebug) << "Reference" << data; - return QMatrix(); + return QTransform(); } else { return attsToMatrix( data ); } @@ -878,7 +878,7 @@ void XpsHandler::processGlyph( XpsRenderNode &node ) //RenderTransform att = node.attributes.value("RenderTransform"); if (!att.isEmpty()) { - m_painter->setWorldMatrix( parseRscRefMatrix( att ), true); + m_painter->setWorldTransform( parseRscRefMatrix( att ), true); } // Clip @@ -984,27 +984,27 @@ void XpsHandler::processImageBrush( XpsRenderNode &node ) QImage image = m_page->loadImageFromFile( node.attributes.value( "ImageSource" ) ); // Matrix which can transform [0, 0, 1, 1] rectangle to given viewbox - QMatrix viewboxMatrix = QMatrix( viewbox.width() * image.physicalDpiX() / 96, 0, 0, viewbox.height() * image.physicalDpiY() / 96, viewbox.x(), viewbox.y() ); + QTransform viewboxMatrix = QTransform( viewbox.width() * image.physicalDpiX() / 96, 0, 0, viewbox.height() * image.physicalDpiY() / 96, viewbox.x(), viewbox.y() ); // Matrix which can transform [0, 0, 1, 1] rectangle to given viewport //TODO Take ViewPort into account - QMatrix viewportMatrix; + QTransform viewportMatrix; att = node.attributes.value( "Transform" ); if ( att.isEmpty() ) { QVariant data = node.getChildData( "ImageBrush.Transform" ); - if (data.canConvert()) { - viewportMatrix = data.value(); + if (data.canConvert()) { + viewportMatrix = data.value(); } else { - viewportMatrix = QMatrix(); + viewportMatrix = QTransform(); } } else { viewportMatrix = parseRscRefMatrix( att ); } - viewportMatrix = viewportMatrix * QMatrix( viewport.width(), 0, 0, viewport.height(), viewport.x(), viewport.y() ); + viewportMatrix = viewportMatrix * QTransform( viewport.width(), 0, 0, viewport.height(), viewport.x(), viewport.y() ); brush = QBrush( image ); - brush.setMatrix( viewboxMatrix.inverted() * viewportMatrix ); + brush.setTransform( viewboxMatrix.inverted() * viewportMatrix ); node.data = qVariantFromValue( brush ); } @@ -1135,10 +1135,10 @@ void XpsHandler::processPath( XpsRenderNode &node ) // RenderTransform att = node.attributes.value( "RenderTransform" ); if (! att.isEmpty() ) { - m_painter->setWorldMatrix( parseRscRefMatrix( att ), true ); + m_painter->setWorldTransform( parseRscRefMatrix( att ), true ); } if ( !pathdata->transform.isIdentity() ) { - m_painter->setWorldMatrix( pathdata->transform, true ); + m_painter->setWorldTransform( pathdata->transform, true ); } Q_FOREACH ( XpsPathFigure *figure, pathdata->paths ) { @@ -1292,7 +1292,7 @@ void XpsHandler::processStartElement( XpsRenderNode &node ) m_painter->save(); QString att = node.attributes.value( "RenderTransform" ); if ( !att.isEmpty() ) { - m_painter->setWorldMatrix( parseRscRefMatrix( att ), true ); + m_painter->setWorldTransform( parseRscRefMatrix( att ), true ); } att = node.attributes.value( "Opacity" ); if ( !att.isEmpty() ) { @@ -1316,11 +1316,11 @@ void XpsHandler::processEndElement( XpsRenderNode &node ) processPath( node ); } else if (node.name == "MatrixTransform") { //TODO Ignoring x:key - node.data = qVariantFromValue( QMatrix( attsToMatrix( node.attributes.value( "Matrix" ) ) ) ); + node.data = qVariantFromValue( QTransform( attsToMatrix( node.attributes.value( "Matrix" ) ) ) ); } else if ((node.name == "Canvas.RenderTransform") || (node.name == "Glyphs.RenderTransform") || (node.name == "Path.RenderTransform")) { QVariant data = node.getRequiredChildData( "MatrixTransform" ); - if (data.canConvert()) { - m_painter->setWorldMatrix( data.value(), true ); + if (data.canConvert()) { + m_painter->setWorldTransform( data.value(), true ); } } else if (node.name == "Canvas") { m_painter->restore(); @@ -1461,7 +1461,7 @@ bool XpsPage::renderToPainter( QPainter *painter ) { XpsHandler handler( this ); handler.m_painter = painter; - handler.m_painter->setWorldMatrix(QMatrix().scale((qreal)painter->device()->width() / size().width(), (qreal)painter->device()->height() / size().height())); + handler.m_painter->setWorldTransform(QTransform().scale((qreal)painter->device()->width() / size().width(), (qreal)painter->device()->height() / size().height())); QXmlSimpleReader parser; parser.setContentHandler( &handler ); parser.setErrorHandler( &handler ); @@ -1617,9 +1617,9 @@ Okular::TextPage* XpsPage::textPage() QXmlStreamReader xml; xml.addData( readFileOrDirectoryParts( pageFile ) ); - QMatrix matrix = QMatrix(); - QStack matrices; - matrices.push( QMatrix() ); + QTransform matrix = QTransform(); + QStack matrices; + matrices.push( QTransform() ); bool useMatrix = false; QXmlStreamAttributes glyphsAtts; diff --git a/generators/xps/generator_xps.h b/generators/xps/generator_xps.h index b4fa59409..4c56e8c73 100644 --- a/generators/xps/generator_xps.h +++ b/generators/xps/generator_xps.h @@ -76,8 +76,8 @@ struct XpsGradient Types of data in XpsRenderNode::data. Name of each type consist of Xps and name of xml element which data it holds */ -typedef QMatrix XpsMatrixTransform; -typedef QMatrix XpsRenderTransform; +typedef QTransform XpsMatrixTransform; +typedef QTransform XpsRenderTransform; typedef QBrush XpsFill; struct XpsPathFigure { From aea2ec8f7580aed64dac6632dc7441dd8b812c87 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Sat, 8 Sep 2012 17:22:01 +0200 Subject: [PATCH 129/155] Return 0 not false for pointers --- generators/fictionbook/converter.cpp | 10 +++++----- generators/ooo/converter.cpp | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/generators/fictionbook/converter.cpp b/generators/fictionbook/converter.cpp index c7c8d3b66..9f3ec26d3 100644 --- a/generators/fictionbook/converter.cpp +++ b/generators/fictionbook/converter.cpp @@ -67,7 +67,7 @@ QTextDocument* Converter::convert( const QString &fileName ) Document fbDocument( fileName ); if ( !fbDocument.open() ) { emit error( fbDocument.lastErrorString(), -1 ); - return false; + return 0; } mTextDocument = new QTextDocument; @@ -97,7 +97,7 @@ QTextDocument* Converter::convert( const QString &fileName ) if ( documentElement.tagName() != QLatin1String( "FictionBook" ) ) { emit error( i18n( "Document is not a valid FictionBook" ), -1 ); delete mCursor; - return false; + return 0; } /** @@ -108,7 +108,7 @@ QTextDocument* Converter::convert( const QString &fileName ) if ( element.tagName() == QLatin1String( "binary" ) ) { if ( !convertBinary( element ) ) { delete mCursor; - return false; + return 0; } } @@ -123,7 +123,7 @@ QTextDocument* Converter::convert( const QString &fileName ) if ( element.tagName() == QLatin1String( "description" ) ) { if ( !convertDescription( element ) ) { delete mCursor; - return false; + return 0; } } else if ( element.tagName() == QLatin1String( "body" ) ) { if ( !mTitleInfo->mCoverPage.isNull() ) { @@ -165,7 +165,7 @@ QTextDocument* Converter::convert( const QString &fileName ) if ( !convertBody( element ) ) { delete mCursor; - return false; + return 0; } } diff --git a/generators/ooo/converter.cpp b/generators/ooo/converter.cpp index 6371f2d66..1124e2a51 100644 --- a/generators/ooo/converter.cpp +++ b/generators/ooo/converter.cpp @@ -96,7 +96,7 @@ QTextDocument* Converter::convert( const QString &fileName ) if ( !document.setContent( &source, &reader, &errorMsg ) ) { emit error( i18n( "Invalid XML document: %1", errorMsg ), -1 ); delete mCursor; - return false; + return 0; } mStyleInformation = new StyleInformation(); @@ -109,7 +109,7 @@ QTextDocument* Converter::convert( const QString &fileName ) if ( !styleParser.parse() ) { emit error( i18n( "Unable to read style information" ), -1 ); delete mCursor; - return false; + return 0; } /** @@ -156,7 +156,7 @@ QTextDocument* Converter::convert( const QString &fileName ) if ( !convertBody( element ) ) { emit error( i18n( "Unable to convert document content" ), -1 ); delete mCursor; - return false; + return 0; } } From 8426ea944f1b1a49a48b058a7755dc85e5c268a8 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Sat, 8 Sep 2012 19:29:28 +0200 Subject: [PATCH 130/155] Don't remove the drawings when changing page in presentation mode In other words, make drawings per-page and don't delete them on page switch. --- ui/presentationwidget.cpp | 11 +++++------ ui/presentationwidget.h | 3 +-- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/ui/presentationwidget.cpp b/ui/presentationwidget.cpp index 6eca796f9..3f3796b3c 100644 --- a/ui/presentationwidget.cpp +++ b/ui/presentationwidget.cpp @@ -100,6 +100,7 @@ struct PresentationFrame const Okular::Page * page; QRect geometry; QHash< Okular::Movie *, VideoWidget * > videoWidgets; + QLinkedList< SmoothPath > drawings; }; @@ -365,9 +366,6 @@ void PresentationWidget::notifyCurrentPageChanged( int previousPage, int current { if ( previousPage != -1 ) { - // remove the drawings on the old page before switching - clearDrawings(); - // stop video playback Q_FOREACH ( VideoWidget *vw, m_frames[ previousPage ]->videoWidgets ) { @@ -591,7 +589,7 @@ void PresentationWidget::mouseReleaseEvent( QMouseEvent * e ) if ( m_drawingEngine->creationCompleted() ) { // add drawing to current page - m_currentPageDrawings << m_drawingEngine->endSmoothPath(); + m_frames[ m_frameIndex ]->drawings << m_drawingEngine->endSmoothPath(); // manually disable and re-enable the pencil mode, so we can do // cleaning of the actual drawer and create a new one just after @@ -735,7 +733,7 @@ void PresentationWidget::paintEvent( QPaintEvent * pe ) painter.translate( geom.topLeft() ); painter.setRenderHints( QPainter::Antialiasing ); - foreach ( const SmoothPath &drawing, m_currentPageDrawings ) + foreach ( const SmoothPath &drawing, m_frames[ m_frameIndex ]->drawings ) drawing.paint( &painter, geom.width(), geom.height() ); if ( m_drawingEngine && m_drawingRect.intersects( pe->rect() ) ) @@ -1391,7 +1389,8 @@ void PresentationWidget::togglePencilMode( bool on ) void PresentationWidget::clearDrawings() { - m_currentPageDrawings.clear(); + if ( m_frameIndex != -1 ) + m_frames[ m_frameIndex ]->drawings.clear(); update(); } diff --git a/ui/presentationwidget.h b/ui/presentationwidget.h index f37e6e22b..4cb4b2b98 100644 --- a/ui/presentationwidget.h +++ b/ui/presentationwidget.h @@ -14,7 +14,6 @@ #include #include #include -#include "ui/annotationtools.h" #include "core/area.h" #include "core/observer.h" #include "core/pagetransition.h" @@ -24,6 +23,7 @@ class QToolBar; class QTimer; class KActionCollection; class KSelectAction; +class SmoothPathEngine; struct PresentationFrame; class PresentationSearchBar; @@ -105,7 +105,6 @@ class PresentationWidget : public QWidget, public Okular::DocumentObserver QRect m_overlayGeometry; const Okular::Action * m_pressedLink; bool m_handCursor; - QLinkedList< SmoothPath > m_currentPageDrawings; SmoothPathEngine * m_drawingEngine; QRect m_drawingRect; int m_screen; From 081f3e5bcb972aed0ff8ef360f125802c2c7643f Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Wed, 29 Aug 2012 01:05:51 +0200 Subject: [PATCH 131/155] Removed generators/poppler/README.Annotations README.Annotations contained info that are no longer useful, as Okular now relies on Poppler to parse PDF annotations. --- core/annotations.h | 3 - generators/poppler/README.Annotations | 161 -------------------------- 2 files changed, 164 deletions(-) delete mode 100644 generators/poppler/README.Annotations diff --git a/core/annotations.h b/core/annotations.h index 9ba0b6b43..e2b04bcfe 100644 --- a/core/annotations.h +++ b/core/annotations.h @@ -83,9 +83,6 @@ class OKULAR_EXPORT AnnotationUtils * * An Annotation is an object (text note, highlight, sound, popup window, ..) * contained by a Page in the document. - * - * For current state in relations to pdf embedded annotations: - * @see generator_pdf/README.Annotations */ class OKULAR_EXPORT Annotation { diff --git a/generators/poppler/README.Annotations b/generators/poppler/README.Annotations deleted file mode 100644 index c4587b4a3..000000000 --- a/generators/poppler/README.Annotations +++ /dev/null @@ -1,161 +0,0 @@ -Summary: PDF 1.6 Annotations specs and okular support. -Author: Enrico Ros - KPDF project - 2005 - okular team - 2006 - -** Relations to okular: - okular tries to support ALL annotations and ALL parameters in PDF specs. If - this can't be done, we must support at least the most common ones and the - most common parameters. - Current Data Structure status: - complete: - [markup], popup, text, freetext, line, polygon, polyline, highlight, - underline, squiggly, strikeout, stamp, ink - partial: - base{P,AP,AS,A,AA,StructPar,OC}, geom{RD} - missing: - link (handled in another way), caret, {fileattachment, sound, movie}, - screen, widget, {printermark, trapnet, watermark}, 3d - -** Notes on parsing in relation to okular: - Different Data Structures: - To adapt the 'plain' pdf storage to okular data structures we use a couple - of queues to store cross-dependant objects for each page and then adapt - objects to our DSs resolving crossdeps at the end of the loops. - - -** PDF file structure (annotations section): - -COMMON FIELDS (note: '*' is required) - Type name 'Annot' - *Subtype name [Text...3D] - \ see second table (below) - *Rect rectangle norma rect - Contents text string alternate text / description - P dictionary page reference (mandatory for Screen) - NM text string unique name - M date or string last modify date - F integer flags (default:0) - \ OR-ed flags: Invisible(0), Hidden(1), Print(2), NoZoom(3), NoRotate(4), - \NoView(5), ReadOnly(6), Locked(7), ToggleNoView(8) - BS dictionary border styles (also style for: Line,Square,Circle,Ink) - \ Type (name='Border'), W (number), S (name), D (array) - BE dictionary border effect (only for square, circle, and polygon) - \ S (name (effect[S:no effect,C: cloudy])), I (number (intensity(0..2)) - AP dictionary visual representation (handler should provide own impl) - \ renderable data to be used with composition algorithm 8.1 (in pdf spec) - AS name visual state (indexes an AP representation) - Border array pre-BS: x-corner-rad, y-corner-rad, width [,dash array] - C array color (3 components in range [0..1]) - A dictionary action (NA on link, specialized on Movie) - \ 'LinkAction' to extract those and use internal handler instead of external one - AA dictionary additional actions for events (used by Widget only) - StructPar. integer annotation's key in the structural tree(not used) - OC dictionary optional content properties (custom visi-check) - -MARKUP -additional- fields (see 'X' marks in the Subtype table): - Markup annotations have an associated pop-up window that may contain text. - If the popup id is given, that popup is used for displaying text, otherwise a - popup is created on annotation opening but the popup is rendered 'in place' - with the annotation and can not be moved without moving the annotation. - T text string titlebar text (creator name by convention) - Popup dictionary indirect refrence to pupup annot for editing text - CA number opacity (def: 1.0) - RC text string/eam rich text displayed if opened (overrides Contents) - CreationD. date creation date - IRT dictionary reference to the ann this is 'in reply to' (if RT) - Subj text string short subject addressed - RT name 'R':in reply 'Group':grouped (if IRT) - IT name annotation intent (specialized for certail types) - [annotation states? pg 585] - -CUSTOM FIELDS (for each subType) (X: is markup): - Popup . no gfx only a parent (inherits Contents,M,C,T) - Parent dictionary indirect reference to parent (from wich Mark. are inh) - Open boolean initially displayed opened (def:false) - - Text X a 'sticky note' attached to a point in document - Open boolean default:false - Name name icon[Comment,Key,Note,Help,NewParagraph,Paragraph,Insert] - [M]State text string if RT,IRT,StateModel are set - [M]StateM. text string if RT,IRT,State are set - - FreeText X like Text but the text is always visible - *DA string appearance string (AP takes precedence) - Q integer 0(Left-justified) 1(Centered) 2(Right-justified) - RC text string/eam rich text string (overrides Contents) - DS text string default text string - CL array 2 or 3 {x,y} couples for callout line - [M]IT name not present,FreeTextCallout,FreeTextTypeWriter - - Line X a single straight line on the page (has popup note) - *L array 4 numbers (2 x,y couples) - BS dictionary width and dash pattern to be used in drawing the line - LE array 2 names (start and end styles) (def:None,None) - \ values [Square,Circle,Diamond,OpenArrow,ClosedArrow,None, - Butt,ROpenArrow,RClosedArrow,Slash] - IC array interior color (3 components in range [0..1]) - LL number leader line fwd (if LLE) in points - LLE number leader line bk (if LL) in points - Cap boolean has caption (RC or Contents) (def:false) - [M]IT name not present,LineArrow,LineDimension - - Polygon X closed polygon on the page - PolyLine X polygon without first and last vtx closed - *Vertices array n*{x,y} pairs of all line vertices - LE array 2 names (start and end styles) (def:None,None) - BS dictionary width and dash pattern - IC array interior color (3 components in range [0..1]) - BE dictionary border effect - IT name not present,PolygonCloud - - Square X rect or ellipse on the page (has popup note) the square - Circle X or circle have 18pt border are inscribed into rect - BS dictionary line width and dash pattern - IC array interior color (3 components in range [0..1]) - BE dictionary border effect - RD rectangle negative border offsets (4 positive coords) - - Highlight X - Underline X appears as highlights, underlines, strikeouts. has - Squiggly X popup text of associated note) - StrikeOut X - *QuadPo. array array of ccw quadrilats (8 x n numbers) (AP takes prec) - - Caret X visual symbol that indicates the presence of text - RD rectangle rect displacement from effective rect to annotation one - Sy name 'P':paragraph symbol, 'None':no symbol(defaulr) - - Stamp X displays text or graphics intended to look as rubber stamps - Name name [Approved,Experimental,NotApproved,AsIs,Expired, - NotForPublicRelease,Confidential,Final,Sold,Departmental, - ForComment,TopSecret,Draft,ForPublicRelease] - - Ink X freehand ?scribble? composed of one or more disjoint paths - *InkList array array or arrays of {x,y} userspace couples - BS dictionary line width and dash pattern - -UNUSED / INCOMPLETE: - Link . hypertext link to a location in document or action - Dest arr,nam,str if A not present - H name N(none) I(invert) O(outline) P(sunken) - PA dictionary URI action - QuadPoints array array of quadrilaterals (8 x n numbers) - - FileAttachment X reference to file (typically embedded) - *FS file file associated - Name name icon [Graph,PushPin,Paperclip,Tag] - - Sound X like Text but contains sound - *Sound stream sound to be played when annot is activated - Name name icon [Speaker,Mic,_more_] - - Movie . contains animated graphics and sound - Movie dictionary the movie to be played when annot is actived - A boolean whether and how to play the movie (def:true) - - Screen . specifies a region of a page on which play media clips - Widget . appearance of the fields for user interaction - PrinterMark . a graphic symbol used to assist production personnel - TrapNet . add color marks along colour boundaries to avoid artifacts - Watermark . graphics to be printed at a fixed size and position on a page - 3D . the mean by which 3D artwork is represented in a document From 6082396d3b32c75d762e82f7df723710702b6403 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Tue, 21 Aug 2012 00:59:49 +0200 Subject: [PATCH 132/155] Poppler 0.22 can save encrypted documents --- generators/poppler/generator_pdf.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index bdc4e254a..c63753e40 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -1721,9 +1721,13 @@ bool PDFGenerator::supportsOption( SaveOption option ) const { case SaveChanges: { + // Saving files with /Encrypt is not supported before Poppler 0.22 +#ifndef HAVE_POPPLER_0_22 QMutexLocker locker( userMutex() ); - // Saving files with /Encrypt is not supported return pdfdoc->isEncrypted() ? false : true; +#else + return true; +#endif } default: ; } @@ -1746,7 +1750,10 @@ bool PDFGenerator::save( const QString &fileName, SaveOptions options, QString * switch (pdfConv->lastError()) { case Poppler::BaseConverter::NotSupportedInputFileError: +#ifndef HAVE_POPPLER_0_22 + // This can only happen with Poppler before 0.22 *errorText = i18n("Saving files with /Encrypt is not supported."); +#endif break; case Poppler::BaseConverter::NoError: From d22ad1c5f75a037a91a8729d7d6ca63b1148c0d4 Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Sat, 8 Sep 2012 17:22:16 +0200 Subject: [PATCH 133/155] Do not show the Save changes prompt before the Open file dialog Since 6d6a3bfce5d5b1e35500edb2851d6a0d9a8c0e85, files are opened in a new Shell instance and the current one is unaffected, therefore changes to the current file do not get lost any more. --- shell/shell.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/shell/shell.cpp b/shell/shell.cpp index 9eada84f5..db383579d 100644 --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -260,10 +260,6 @@ QStringList Shell::fileFormats() const void Shell::fileOpen() { - // Don't open dialog if current document can't be closed - if ( !m_part->queryClose() ) - return; - // this slot is called whenever the File->Open menu is selected, // the Open shortcut is pressed (usually CTRL+O) or the Open toolbar // button is clicked From 7db0647128911deb8e46de43c1ac05ca2980ba3c Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Tue, 28 Aug 2012 23:43:58 +0200 Subject: [PATCH 134/155] Removed zoom_fit_rect action from part.rc and part-viewermode.rc Because it's not used by Okular. Corresponding KPDF pageview code was removed in 2004 by commit 89cd5a2fa69897cb8e0e61ca7baac408d67a239e --- part-viewermode.rc | 3 +-- part.rc | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/part-viewermode.rc b/part-viewermode.rc index dbd8e4215..bccd4912f 100644 --- a/part-viewermode.rc +++ b/part-viewermode.rc @@ -1,5 +1,5 @@ - + &File @@ -24,7 +24,6 @@ - diff --git a/part.rc b/part.rc index 33d3829d7..39c1571e7 100644 --- a/part.rc +++ b/part.rc @@ -1,5 +1,5 @@ - + &File @@ -29,7 +29,6 @@ - From c6f20bd1eb678f5aeb111a6278fc8b4298ade73c Mon Sep 17 00:00:00 2001 From: Fabio D'Urso Date: Sat, 8 Sep 2012 20:33:54 +0200 Subject: [PATCH 135/155] Killed ZoomFitText, not supported by Okular Commit 02e7c0abfb501f288ebc62e2a077b46ce639fcbf says that it's "not yet implemented", but that was KDE 4.0, before the "Trim margin" feature was introduced. --- TODO | 1 - ui/pageview.cpp | 27 ++------------------------- ui/pageview.h | 5 ++--- 3 files changed, 4 insertions(+), 29 deletions(-) diff --git a/TODO b/TODO index 4d9d3104a..c96e3e5c7 100644 --- a/TODO +++ b/TODO @@ -102,7 +102,6 @@ More items (first items will enter 'In progress list' first): -> add okular manual in PDF format loaded on the first startup or on menu->help->manual this visually explains basic usage, mouse buttons functions & more.. -> ADD: click over image allows "save image" [60% done (activerect of type image)] --> zoom: fit text (with configurable margin) -> bookview: 3d opengl widget for viewing the document as a real book (turning pages, etc..) -> wallet: use asynchronous interface (to prevent ui-blocking) -> restore a location from a given url (like http:/someurl?stringForViewport) (BR99240) diff --git a/ui/pageview.cpp b/ui/pageview.cpp index ccbc39314..d3e1888ee 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -193,7 +193,6 @@ public: KAction * aZoomOut; KToggleAction * aZoomFitWidth; KToggleAction * aZoomFitPage; - KToggleAction * aZoomFitText; KActionMenu * aViewMode; KToggleAction * aViewContinuous; QAction * aPrevAction; @@ -301,7 +300,6 @@ PageView::PageView( QWidget *parent, Okular::Document *document ) d->aToggleAnnotator = 0; d->aZoomFitWidth = 0; d->aZoomFitPage = 0; - d->aZoomFitText = 0; d->aViewMode = 0; d->aViewContinuous = 0; d->aPrevAction = 0; @@ -458,12 +456,6 @@ void PageView::setupViewerActions( KActionCollection * ac ) ac->addAction("view_fit_to_page", d->aZoomFitPage ); connect( d->aZoomFitPage, SIGNAL(toggled(bool)), SLOT(slotFitToPageToggled(bool)) ); -/* - d->aZoomFitText = new KToggleAction(KIcon( "zoom-fit-best" ), i18n("Fit &Text"), this); - ac->addAction("zoom_fit_text", d->aZoomFitText ); - connect( d->aZoomFitText, SIGNAL(toggled(bool)), SLOT(slotFitToTextToggled(bool)) ); -*/ - // View-Layout actions d->aViewMode = new KActionMenu( KIcon( "view-split-left-right" ), i18n( "&View Mode" ), this ); d->aViewMode->setDelayed( false ); @@ -628,7 +620,6 @@ void PageView::fitPageWidth( int page ) Okular::Settings::setViewMode( 0 ); d->aZoomFitWidth->setChecked( true ); d->aZoomFitPage->setChecked( false ); -// d->aZoomFitText->setChecked( false ); d->aViewMode->menu()->actions().at( 0 )->setChecked( true ); viewport()->setUpdatesEnabled( false ); slotRelayoutPages(); @@ -949,8 +940,6 @@ void PageView::updateActionState( bool haspages, bool documentChanged, bool hasf d->aZoomFitWidth->setEnabled( haspages ); if ( d->aZoomFitPage ) d->aZoomFitPage->setEnabled( haspages ); - if ( d->aZoomFitText ) - d->aZoomFitText->setEnabled( haspages ); if ( d->aZoom ) { @@ -3417,9 +3406,6 @@ void PageView::updateZoom( ZoomMode newZoomMode ) case ZoomFitPage: checkedZoomAction = d->aZoomFitPage; break; - case ZoomFitText: - checkedZoomAction = d->aZoomFitText; - break; case ZoomRefreshCurrent: newZoomMode = ZoomFixed; d->zoomFactor = -1; @@ -3449,7 +3435,6 @@ void PageView::updateZoom( ZoomMode newZoomMode ) { d->aZoomFitWidth->setChecked( checkedZoomAction == d->aZoomFitWidth ); d->aZoomFitPage->setChecked( checkedZoomAction == d->aZoomFitPage ); -// d->aZoomFitText->setChecked( checkedZoomAction == d->aZoomFitText ); } } else if ( newZoomMode == ZoomFixed && newFactor == d->zoomFactor ) @@ -3469,13 +3454,12 @@ void PageView::updateZoomText() // add items that describe fit actions QStringList translated; - translated << i18n("Fit Width") << i18n("Fit Page") /*<< i18n("Fit Text")*/; + translated << i18n("Fit Width") << i18n("Fit Page"); // add percent items QString double_oh( "00" ); const float zoomValue[10] = { 0.12, 0.25, 0.33, 0.50, 0.66, 0.75, 1.00, 1.25, 1.50, 2.00 }; - int idx = 0, - selIdx = 2; // use 3 if "fit text" present + int idx = 0, selIdx = 2; bool inserted = false; //use: "d->zoomMode != ZoomFixed" to hide Fit/* zoom ratio while ( idx < 10 || !inserted ) { @@ -3502,8 +3486,6 @@ void PageView::updateZoomText() selIdx = 0; else if ( d->zoomMode == ZoomFitPage ) selIdx = 1; - else if ( d->zoomMode == ZoomFitText ) - selIdx = 2; // we have to temporarily enable the actions as otherwise we can't set a new current item d->aZoom->setEnabled( true ); d->aZoom->selectableActionGroup()->setEnabled( true ); @@ -4178,11 +4160,6 @@ void PageView::slotFitToPageToggled( bool on ) if ( on ) updateZoom( ZoomFitPage ); } -void PageView::slotFitToTextToggled( bool on ) -{ - if ( on ) updateZoom( ZoomFitText ); -} - void PageView::slotViewMode( QAction *action ) { const int nr = action->data().toInt(); diff --git a/ui/pageview.h b/ui/pageview.h index d2b639328..8cf884452 100644 --- a/ui/pageview.h +++ b/ui/pageview.h @@ -56,8 +56,8 @@ Q_OBJECT PageView( QWidget *parent, Okular::Document *document ); ~PageView(); - // Zoom mode ( last 4 are internally used only! ) - enum ZoomMode { ZoomFixed = 0, ZoomFitWidth = 1, ZoomFitPage = 2, ZoomFitText, + // Zoom mode ( last 3 are internally used only! ) + enum ZoomMode { ZoomFixed = 0, ZoomFitWidth = 1, ZoomFitPage = 2, ZoomIn, ZoomOut, ZoomRefreshCurrent }; enum ClearMode { ClearAllSelection, ClearOnlyDividers }; @@ -223,7 +223,6 @@ Q_OBJECT void slotZoomOut(); void slotFitToWidthToggled( bool ); void slotFitToPageToggled( bool ); - void slotFitToTextToggled( bool ); void slotViewMode( QAction *action ); void slotContinuousToggled( bool ); void slotSetMouseNormal(); From 8b438bf933ee9b6663f5a6e14698dad3f69d9c13 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Sun, 9 Sep 2012 00:18:14 +0200 Subject: [PATCH 136/155] Qt needs the missing alpha of QImage::Format_RGB32 to be 0xff BUGS: 306105 FIXED-IN: 4.9.2 --- generators/spectre/rendererthread.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/generators/spectre/rendererthread.cpp b/generators/spectre/rendererthread.cpp index f185d2277..44ebe9695 100644 --- a/generators/spectre/rendererthread.cpp +++ b/generators/spectre/rendererthread.cpp @@ -70,6 +70,13 @@ void GSRendererThread::run() spectre_page_render(req.spectrePage, m_renderContext, &data, &row_length); + // Qt needs the missing alpha of QImage::Format_RGB32 to be 0xff + if (data[3] != 0xff) + { + for (int i = 3; i < row_length * wantedHeight; i += 4) + data[i] = 0xff; + } + QImage img; if (row_length == wantedWidth * 4) { From f44cd58360b6e2ef0a81868b8660b16f3457eb4f Mon Sep 17 00:00:00 2001 From: Yuri Chornoivan Date: Sun, 9 Sep 2012 10:57:33 +0300 Subject: [PATCH 137/155] Update docs to 0.15.70. --- doc/configure.png | Bin 62384 -> 30035 bytes doc/index.docbook | 21 ++++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/doc/configure.png b/doc/configure.png index ffde405a9e975a1b85f088ed8b5eaf99b3cea67b..ff23ba796792d97cef16c7ce2a7bb34a072ea812 100644 GIT binary patch literal 30035 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 literal 62384 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

hmEzgWNVuT+#DrsuJdlG(5n za-x}>BeE)2deh20S*FM1;_Fc-FaGvPgsWpRllsLs!CC~VJ%O*#&)$;DFb;$y2884I zcN#^jh97j^jnuLY@|W)#ZA=#R%ES^@MktX8CyN2K5%0AuQS1CCt+pPdBTQMjBl}9r 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 E59D-CEdT%j diff --git a/doc/index.docbook b/doc/index.docbook index efca4d351..06c3247fb 100644 --- a/doc/index.docbook +++ b/doc/index.docbook @@ -37,8 +37,8 @@ Context menu actions like Rename Bookmarks etc) &FDLNotice; - 2012-06-29 - 0.15 (&kde; 4.9) + 2012-09-09 + 0.15.70 (&kde; 4.10) &okular; is a &kde; universal document viewer based on &kpdf; code. @@ -292,7 +292,7 @@ Add a 'Find Previous' entry - + Inverse Search between &latex; Editors and &okular; Inverse search is a very useful feature when you are writing a &latex; document yourself. If everything is set up properly, you can @@ -311,7 +311,7 @@ Add a 'Find Previous' entry corresponding line. Remember to tell &okular; to use proper editor, in &okular;'s menu item SettingsConfigure Okular... (on the page Editor). - + For more details on editor configuration please refer to the corresponding section of this manual. @@ -411,7 +411,7 @@ Add a 'Find Previous' entry - It is not possible to save annotations into &PDF; file if original file was encrypted. + It is not possible to save annotations into &PDF; file if original file was encrypted and &okular; uses Poppler libraries of version which is lower than 0.22. @@ -627,7 +627,7 @@ Add a 'Find Previous' entry - Save the currently open file under a different name using the document backend. With the &PDF; backend (Poppler >= 0.8 required) it is possible to save the document with the changed values of the form fields. It can be possible (provided that the data were not encrypted or secured using DRM) to save annotations with &PDF; files (Poppler >= 0.20 required). + Save the currently open file under a different name using the document backend. With the &PDF; backend (Poppler >= 0.8 required) it is possible to save the document with the changed values of the form fields. It can be possible (provided that the data were not secured using DRM) to save annotations with &PDF; files (Poppler >= 0.22 required). @@ -1450,13 +1450,20 @@ Add a 'Find Previous' entry - Display document title in title bar + Display document title in title bar if available Whether to show the current document title in the title bar of &okular; window. If no metadata for title found in the document or this item is unchecked &okular; shows filename of the document. + + When not displaying document title + + You can choose any of two options, Display file name only or Display full file path. + + + Obey DRM limitations From 8765a06f52fb8b942047fe7785dd8e9451c252a4 Mon Sep 17 00:00:00 2001 From: Jaydeep Solanki Date: Wed, 19 Sep 2012 22:40:06 +0200 Subject: [PATCH 138/155] Add warnings about --unique errors BUGS: 306312 REVIEW: 106476 FIXED-IN: 4.10.0 --- shell/main.cpp | 7 +++++++ shell/shell.cpp | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/shell/main.cpp b/shell/main.cpp index 84e9406fc..226dab850 100644 --- a/shell/main.cpp +++ b/shell/main.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include "aboutdata.h" #include "shellutils.h" @@ -74,6 +75,12 @@ int main(int argc, char** argv) Shell* widget = new Shell(args); widget->show(); } + else if (args->isSet( "unique" ) && args->count() > 1) + { + QTextStream stream(stderr); + stream << i18n( "Error: Can't open more than one document with the --unique switch" ) << endl; + return -1; + } else { for (int i = 0; i < args->count(); ++i) diff --git a/shell/shell.cpp b/shell/shell.cpp index db383579d..7d11fd976 100644 --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -110,6 +110,8 @@ void Shell::init() if (m_args && m_args->isSet("unique") && m_args->count() <= 1) { m_unique = QDBusConnection::sessionBus().registerService("org.kde.okular"); + if (!m_unique) + KMessageBox::information(this, i18n("There is already an unique Okular instance running. This instance won't be the unique one.")); } QDBusConnection::sessionBus().registerObject("/okularshell", this, QDBusConnection::ExportScriptableSlots); @@ -145,6 +147,11 @@ void Shell::openUrl( const KUrl & url ) { if( !m_part->url().isEmpty() ) { + if( m_unique ) + { + KMessageBox::error(this, i18n("Can't error more than one document in the unique Okular instance.")); + return; + } Shell* newShell = new Shell(); newShell->openUrl( url ); newShell->show(); From 081559252f324f404f1f12b9e484fbebf3dbff1c Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 19 Sep 2012 22:44:18 +0200 Subject: [PATCH 139/155] Remove a few return and add elses --- shell/shell.cpp | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/shell/shell.cpp b/shell/shell.cpp index 7d11fd976..13a6a5d31 100644 --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -150,23 +150,27 @@ void Shell::openUrl( const KUrl & url ) if( m_unique ) { KMessageBox::error(this, i18n("Can't error more than one document in the unique Okular instance.")); - return; } - Shell* newShell = new Shell(); - newShell->openUrl( url ); - newShell->show(); - return; - } - if ( m_doc && m_args && m_args->isSet( "presentation" ) ) - m_doc->startPresentation(); - bool openOk = m_part->openUrl( url ); - const bool isstdin = url.fileName( KUrl::ObeyTrailingSlash ) == QLatin1String( "-" ); - if ( !isstdin ) - { - if ( openOk ) - m_recent->addUrl( url ); else - m_recent->removeUrl( url ); + { + Shell* newShell = new Shell(); + newShell->openUrl( url ); + newShell->show(); + } + } + else + { + if ( m_doc && m_args && m_args->isSet( "presentation" ) ) + m_doc->startPresentation(); + bool openOk = m_part->openUrl( url ); + const bool isstdin = url.fileName( KUrl::ObeyTrailingSlash ) == QLatin1String( "-" ); + if ( !isstdin ) + { + if ( openOk ) + m_recent->addUrl( url ); + else + m_recent->removeUrl( url ); + } } } } From 5c1b8df6f5917e76b7a6acb402b7f5d7f6aa69e7 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 19 Sep 2012 22:44:38 +0200 Subject: [PATCH 140/155] Fix typo in my fix of Jaydeep's texts --- shell/shell.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/shell.cpp b/shell/shell.cpp index 13a6a5d31..f9e3a9f37 100644 --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -149,7 +149,7 @@ void Shell::openUrl( const KUrl & url ) { if( m_unique ) { - KMessageBox::error(this, i18n("Can't error more than one document in the unique Okular instance.")); + KMessageBox::error(this, i18n("Can't open more than one document in the unique Okular instance.")); } else { From b78f6c7fa7bb38e7de8a3cc0cbf92f597349505e Mon Sep 17 00:00:00 2001 From: Yuri Chornoivan Date: Thu, 20 Sep 2012 13:56:09 +0300 Subject: [PATCH 141/155] Fix typo --- shell/shell.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/shell.cpp b/shell/shell.cpp index f9e3a9f37..70e2e9934 100644 --- a/shell/shell.cpp +++ b/shell/shell.cpp @@ -111,7 +111,7 @@ void Shell::init() { m_unique = QDBusConnection::sessionBus().registerService("org.kde.okular"); if (!m_unique) - KMessageBox::information(this, i18n("There is already an unique Okular instance running. This instance won't be the unique one.")); + KMessageBox::information(this, i18n("There is already a unique Okular instance running. This instance won't be the unique one.")); } QDBusConnection::sessionBus().registerObject("/okularshell", this, QDBusConnection::ExportScriptableSlots); From 770e2818bb149211330ddbc35877c20624a71862 Mon Sep 17 00:00:00 2001 From: Tobias Koenig Date: Thu, 16 Aug 2012 11:53:58 +0200 Subject: [PATCH 142/155] Evaluate additional actions of screen and widget annotations This fixes the auto-start feature of PDFs generated with the LaTeX movie package, which uses the additional action of a widget annotation to start the movie when entering the page. BUG: 300051 REVIEW: 106430 FIXED-IN: 4.10 --- cmake/modules/FindPoppler.cmake | 4 + core/annotations.cpp | 147 +++++++++++++++++++++++++++ core/annotations.h | 127 +++++++++++++++++++++++ generators/poppler/annots.cpp | 7 ++ generators/poppler/generator_pdf.cpp | 47 +++++++++ ui/guiutils.cpp | 6 ++ ui/presentationwidget.cpp | 28 +++++ 7 files changed, 366 insertions(+) diff --git a/cmake/modules/FindPoppler.cmake b/cmake/modules/FindPoppler.cmake index 06e711751..1763ee949 100644 --- a/cmake/modules/FindPoppler.cmake +++ b/cmake/modules/FindPoppler.cmake @@ -99,11 +99,15 @@ int main() check_cxx_source_compiles(" #include +#include int main() { Poppler::MovieObject *movie = 0; movie->showPosterImage(); + + const Poppler::Annotation::AdditionalActionType type = Poppler::Annotation::PageOpeningAction; + return 0; } " HAVE_POPPLER_0_22) diff --git a/core/annotations.cpp b/core/annotations.cpp index ceb571c4a..21114af12 100644 --- a/core/annotations.cpp +++ b/core/annotations.cpp @@ -15,6 +15,7 @@ #include // local includes +#include "action.h" #include "document.h" #include "document_p.h" #include "movie.h" @@ -2411,3 +2412,149 @@ void MovieAnnotation::setMovie( Movie *movie ) Q_D( MovieAnnotation ); d->movie = movie; } + +/** ScreenAnnotation [Annotation] */ + +class Okular::ScreenAnnotationPrivate : public Okular::AnnotationPrivate +{ + public: + ~ScreenAnnotationPrivate(); + QMap< Okular::Annotation::AdditionalActionType, Okular::Action* > m_additionalActions; +}; + +ScreenAnnotationPrivate::~ScreenAnnotationPrivate() +{ + qDeleteAll( m_additionalActions ); +} + +ScreenAnnotation::ScreenAnnotation() + : Annotation( *new ScreenAnnotationPrivate() ) +{ +} + +ScreenAnnotation::ScreenAnnotation( const QDomNode & node ) + : Annotation( *new ScreenAnnotationPrivate(), node ) +{ + // loop through the whole children looking for a 'screen' element + QDomNode subNode = node.firstChild(); + while( subNode.isElement() ) + { + QDomElement e = subNode.toElement(); + subNode = subNode.nextSibling(); + if ( e.tagName() != "screen" ) + continue; + + // loading complete + break; + } +} + +ScreenAnnotation::~ScreenAnnotation() +{ +} + +void ScreenAnnotation::store( QDomNode & node, QDomDocument & document ) const +{ + // recurse to parent objects storing properties + Annotation::store( node, document ); + + // create [screen] element + QDomElement movieElement = document.createElement( "screen" ); + node.appendChild( movieElement ); +} + +Annotation::SubType ScreenAnnotation::subType() const +{ + return AScreen; +} + +void ScreenAnnotation::setAdditionalAction( AdditionalActionType type, Action *action ) +{ + Q_D( ScreenAnnotation ); + if ( d->m_additionalActions.contains( type ) ) + delete d->m_additionalActions.value( type ); + + d->m_additionalActions.insert( type, action ); +} + +Action* ScreenAnnotation::additionalAction( AdditionalActionType type ) const +{ + Q_D( const ScreenAnnotation ); + if ( !d->m_additionalActions.contains( type ) ) + return 0; + else + return d->m_additionalActions.value( type ); +} + +/** WidgetAnnotation [Annotation] */ + +class Okular::WidgetAnnotationPrivate : public Okular::AnnotationPrivate +{ + public: + ~WidgetAnnotationPrivate(); + QMap< Okular::Annotation::AdditionalActionType, Okular::Action* > m_additionalActions; +}; + +WidgetAnnotationPrivate::~WidgetAnnotationPrivate() +{ + qDeleteAll( m_additionalActions ); +} + +WidgetAnnotation::WidgetAnnotation() + : Annotation( *new WidgetAnnotationPrivate() ) +{ +} + +WidgetAnnotation::WidgetAnnotation( const QDomNode & node ) + : Annotation( *new WidgetAnnotationPrivate(), node ) +{ + // loop through the whole children looking for a 'widget' element + QDomNode subNode = node.firstChild(); + while( subNode.isElement() ) + { + QDomElement e = subNode.toElement(); + subNode = subNode.nextSibling(); + if ( e.tagName() != "widget" ) + continue; + + // loading complete + break; + } +} + +WidgetAnnotation::~WidgetAnnotation() +{ +} + +void WidgetAnnotation::store( QDomNode & node, QDomDocument & document ) const +{ + // recurse to parent objects storing properties + Annotation::store( node, document ); + + // create [widget] element + QDomElement movieElement = document.createElement( "widget" ); + node.appendChild( movieElement ); +} + +Annotation::SubType WidgetAnnotation::subType() const +{ + return AWidget; +} + +void WidgetAnnotation::setAdditionalAction( AdditionalActionType type, Action *action ) +{ + Q_D( WidgetAnnotation ); + if ( d->m_additionalActions.contains( type ) ) + delete d->m_additionalActions.value( type ); + + d->m_additionalActions.insert( type, action ); +} + +Action* WidgetAnnotation::additionalAction( AdditionalActionType type ) const +{ + Q_D( const WidgetAnnotation ); + if ( !d->m_additionalActions.contains( type ) ) + return 0; + else + return d->m_additionalActions.value( type ); +} diff --git a/core/annotations.h b/core/annotations.h index e2b04bcfe..5fefb290f 100644 --- a/core/annotations.h +++ b/core/annotations.h @@ -23,6 +23,7 @@ namespace Okular { +class Action; class Annotation; class AnnotationObjectRect; class AnnotationPrivate; @@ -42,6 +43,8 @@ class CaretAnnotationPrivate; class FileAttachmentAnnotationPrivate; class SoundAnnotationPrivate; class MovieAnnotationPrivate; +class ScreenAnnotationPrivate; +class WidgetAnnotationPrivate; /** * @short Helper class for (recursive) annotation retrieval/storage. @@ -109,6 +112,8 @@ class OKULAR_EXPORT Annotation AFileAttachment = 9, ///< A file attachment annotation ASound = 10, ///< A sound annotation AMovie = 11, ///< A movie annotation + AScreen = 12, ///< A screen annotation + AWidget = 13, ///< A widget annotation A_BASE = 0 ///< The annotation base class }; @@ -174,6 +179,17 @@ class OKULAR_EXPORT Annotation Completed = 64 ///< Has been completed }; + /** + * Describes the type of additional actions. + * + * @since 0.16 (KDE 4.10) + */ + enum AdditionalActionType + { + PageOpening, ///< Performed when the page containing the annotation is opened. + PageClosing ///< Performed when the page containing the annotation is closed. + }; + /** * A function to be called when the annotation is destroyed. * @@ -1511,6 +1527,117 @@ class OKULAR_EXPORT MovieAnnotation : public Annotation Q_DISABLE_COPY( MovieAnnotation ) }; +/** + * \short Screen annotation. + * + * The screen annotation specifies a region of a page upon which media clips + * may be played. It also serves as an object from which actions can be triggered. + * + * @since 0.16 (KDE 4.10) + */ +class OKULAR_EXPORT ScreenAnnotation : public Annotation +{ + public: + /** + * Creates a new screen annotation. + */ + ScreenAnnotation(); + + /** + * Creates a new screen annotation from the xml @p description + */ + ScreenAnnotation( const QDomNode &description ); + + /** + * Destroys the screen annotation. + */ + virtual ~ScreenAnnotation(); + + /** + * Returns the sub type of the screen annotation. + */ + SubType subType() const; + + /** + * Stores the screen annotation as xml in @p document + * under the given @p parentNode. + */ + void store( QDomNode &parentNode, QDomDocument &document ) const; + + /** + * Sets the additional @p action of the given @p type. + * + * @since 0.16 (KDE 4.10) + */ + void setAdditionalAction( AdditionalActionType type, Action *action ); + + /** + * Returns the additional action of the given @p type or @c 0 if no action has been defined. + * + * @since 0.16 (KDE 4.10) + */ + Action* additionalAction( AdditionalActionType type ) const; + + private: + Q_DECLARE_PRIVATE( ScreenAnnotation ) + Q_DISABLE_COPY( ScreenAnnotation ) +}; + +/** + * \short Widget annotation. + * + * The widget annotation represents a widget on a page. + * + * @since 0.16 (KDE 4.10) + */ +class OKULAR_EXPORT WidgetAnnotation : public Annotation +{ + public: + /** + * Creates a new widget annotation. + */ + WidgetAnnotation(); + + /** + * Creates a new widget annotation from the xml @p description + */ + WidgetAnnotation( const QDomNode &description ); + + /** + * Destroys the widget annotation. + */ + virtual ~WidgetAnnotation(); + + /** + * Returns the sub type of the widget annotation. + */ + SubType subType() const; + + /** + * Stores the widget annotation as xml in @p document + * under the given @p parentNode. + */ + void store( QDomNode &parentNode, QDomDocument &document ) const; + + /** + * Sets the additional @p action of the given @p type. + * + * @since 0.16 (KDE 4.10) + */ + void setAdditionalAction( AdditionalActionType type, Action *action ); + + /** + * Returns the additional action of the given @p type or @c 0 if no action has been defined. + * + * @since 0.16 (KDE 4.10) + */ + Action* additionalAction( AdditionalActionType type ) const; + + private: + Q_DECLARE_PRIVATE( WidgetAnnotation ) + Q_DISABLE_COPY( WidgetAnnotation ) +}; + } #endif diff --git a/generators/poppler/annots.cpp b/generators/poppler/annots.cpp index 06128c54c..02813a13d 100644 --- a/generators/poppler/annots.cpp +++ b/generators/poppler/annots.cpp @@ -310,6 +310,13 @@ Okular::Annotation* createAnnotationFromPopplerAnnotation( Poppler::Annotation * break; } +#ifdef HAVE_POPPLER_0_22 + case Poppler::Annotation::AWidget: + { + annotation = new Okular::WidgetAnnotation(); + break; + } +#endif #ifdef HAVE_POPPLER_0_20 case Poppler::Annotation::AScreen: { diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index c63753e40..946219528 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -945,6 +945,23 @@ void PDFGenerator::resolveMovieLinkReferences( Okular::Page *page ) resolveMovieLinkReference( const_cast( page->pageAction( Okular::Page::Opening ) ), page ); resolveMovieLinkReference( const_cast( page->pageAction( Okular::Page::Closing ) ), page ); + foreach ( Okular::Annotation *annotation, page->annotations() ) + { + if ( annotation->subType() == Okular::Annotation::AScreen ) + { + Okular::ScreenAnnotation *screenAnnotation = static_cast( annotation ); + resolveMovieLinkReference( screenAnnotation->additionalAction( Okular::Annotation::PageOpening ), page ); + resolveMovieLinkReference( screenAnnotation->additionalAction( Okular::Annotation::PageClosing ), page ); + } + + if ( annotation->subType() == Okular::Annotation::AWidget ) + { + Okular::WidgetAnnotation *widgetAnnotation = static_cast( annotation ); + resolveMovieLinkReference( widgetAnnotation->additionalAction( Okular::Annotation::PageOpening ), page ); + resolveMovieLinkReference( widgetAnnotation->additionalAction( Okular::Annotation::PageClosing ), page ); + } + } + foreach ( Okular::FormField *field, page->formFields() ) resolveMovieLinkReference( field->activationAction(), page ); } @@ -1376,6 +1393,36 @@ void PDFGenerator::addAnnotations( Poppler::Page * popplerPage, Okular::Page * p { page->addAnnotation(newann); +#ifdef HAVE_POPPLER_0_22 + if ( a->subType() == Poppler::Annotation::AScreen ) + { + Poppler::ScreenAnnotation *annotScreen = static_cast( a ); + Okular::ScreenAnnotation *screenAnnotation = static_cast( newann ); + + const Poppler::Link *pageOpeningLink = annotScreen->additionalAction( Poppler::Annotation::PageOpeningAction ); + if ( pageOpeningLink ) + screenAnnotation->setAdditionalAction( Okular::Annotation::PageOpening, createLinkFromPopplerLink( pageOpeningLink ) ); + + const Poppler::Link *pageClosingLink = annotScreen->additionalAction( Poppler::Annotation::PageClosingAction ); + if ( pageClosingLink ) + screenAnnotation->setAdditionalAction( Okular::Annotation::PageClosing, createLinkFromPopplerLink( pageClosingLink ) ); + } + + if ( a->subType() == Poppler::Annotation::AWidget ) + { + Poppler::WidgetAnnotation *annotWidget = static_cast( a ); + Okular::WidgetAnnotation *widgetAnnotation = static_cast( newann ); + + const Poppler::Link *pageOpeningLink = annotWidget->additionalAction( Poppler::Annotation::PageOpeningAction ); + if ( pageOpeningLink ) + widgetAnnotation->setAdditionalAction( Okular::Annotation::PageOpening, createLinkFromPopplerLink( pageOpeningLink ) ); + + const Poppler::Link *pageClosingLink = annotWidget->additionalAction( Poppler::Annotation::PageClosingAction ); + if ( pageClosingLink ) + widgetAnnotation->setAdditionalAction( Okular::Annotation::PageClosing, createLinkFromPopplerLink( pageClosingLink ) ); + } +#endif + if ( !doDelete ) annotationsHash.insert( newann, a ); } diff --git a/ui/guiutils.cpp b/ui/guiutils.cpp index f66dc4792..30be525ce 100644 --- a/ui/guiutils.cpp +++ b/ui/guiutils.cpp @@ -99,6 +99,12 @@ QString captionForAnnotation( const Okular::Annotation * ann ) case Okular::Annotation::AMovie: ret = i18n( "Movie" ); break; + case Okular::Annotation::AScreen: + ret = i18nc( "Caption for a screen annotation", "Screen" ); + break; + case Okular::Annotation::AWidget: + ret = i18nc( "Caption for a widget annotation", "Widget" ); + break; case Okular::Annotation::A_BASE: break; } diff --git a/ui/presentationwidget.cpp b/ui/presentationwidget.cpp index 3f3796b3c..95e78d41f 100644 --- a/ui/presentationwidget.cpp +++ b/ui/presentationwidget.cpp @@ -379,6 +379,20 @@ void PresentationWidget::notifyCurrentPageChanged( int previousPage, int current // perform the page closing action, if any if ( m_document->page( previousPage )->pageAction( Okular::Page::Closing ) ) m_document->processAction( m_document->page( previousPage )->pageAction( Okular::Page::Closing ) ); + + // perform the additional actions of the page's annotations, if any + Q_FOREACH ( const Okular::Annotation *annotation, m_document->page( m_frameIndex )->annotations() ) + { + Okular::Action *action = 0; + + if ( annotation->subType() == Okular::Annotation::AScreen ) + action = static_cast( annotation )->additionalAction( Okular::Annotation::PageClosing ); + else if ( annotation->subType() == Okular::Annotation::AWidget ) + action = static_cast( annotation )->additionalAction( Okular::Annotation::PageClosing ); + + if ( action ) + m_document->processAction( action ); + } } if ( currentPage != -1 ) @@ -411,6 +425,20 @@ void PresentationWidget::notifyCurrentPageChanged( int previousPage, int current if ( m_document->page( m_frameIndex )->pageAction( Okular::Page::Opening ) ) m_document->processAction( m_document->page( m_frameIndex )->pageAction( Okular::Page::Opening ) ); + // perform the additional actions of the page's annotations, if any + Q_FOREACH ( const Okular::Annotation *annotation, m_document->page( m_frameIndex )->annotations() ) + { + Okular::Action *action = 0; + + if ( annotation->subType() == Okular::Annotation::AScreen ) + action = static_cast( annotation )->additionalAction( Okular::Annotation::PageOpening ); + else if ( annotation->subType() == Okular::Annotation::AWidget ) + action = static_cast( annotation )->additionalAction( Okular::Annotation::PageOpening ); + + if ( action ) + m_document->processAction( action ); + } + // start autoplay video playback Q_FOREACH ( VideoWidget *vw, m_frames[ m_frameIndex ]->videoWidgets ) vw->pageEntered(); From f70dc3c1e111d9a8cd1b8bcbc595765776d3f7eb Mon Sep 17 00:00:00 2001 From: Tobias Koenig Date: Fri, 21 Sep 2012 11:20:53 +0200 Subject: [PATCH 143/155] Fix visibility of VideoWidget on page change events We have to differ between the initialization and the 'page entered' and 'page left' event. This avoids that all VideoWidgets with poster image show up on first slide or do no disappear when changing slide. --- ui/pageview.cpp | 26 +++++++++++++++++++++++++- ui/pageview.h | 1 + ui/presentationwidget.cpp | 2 +- ui/videowidget.cpp | 6 +++++- ui/videowidget.h | 5 +++++ 5 files changed, 37 insertions(+), 3 deletions(-) diff --git a/ui/pageview.cpp b/ui/pageview.cpp index d3e1888ee..205a9fa9f 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -863,7 +863,7 @@ void PageView::notifySetup( const QVector< Okular::Page * > & pageSet, int setup Okular::MovieAnnotation * movieAnn = static_cast< Okular::MovieAnnotation * >( a ); VideoWidget * vw = new VideoWidget( movieAnn, d->document, viewport() ); item->videoWidgets().insert( movieAnn->movie(), vw ); - vw->pageEntered(); + vw->pageInitialized(); } } } @@ -1232,6 +1232,30 @@ bool PageView::canUnloadPixmap( int pageNumber ) const // if hidden premit unloading return true; } + +void PageView::notifyCurrentPageChanged( int previous, int current ) +{ + if ( previous != -1 ) + { + PageViewItem * item = d->items.at( previous ); + if ( item ) + { + Q_FOREACH ( VideoWidget *videoWidget, item->videoWidgets() ) + videoWidget->pageLeft(); + } + } + + if ( current != -1 ) + { + PageViewItem * item = d->items.at( current ); + if ( item ) + { + Q_FOREACH ( VideoWidget *videoWidget, item->videoWidgets() ) + videoWidget->pageEntered(); + } + } +} + //END DocumentObserver inherited methods //BEGIN View inherited methods diff --git a/ui/pageview.h b/ui/pageview.h index 8cf884452..9f566201c 100644 --- a/ui/pageview.h +++ b/ui/pageview.h @@ -82,6 +82,7 @@ Q_OBJECT void notifyContentsCleared( int changedFlags ); void notifyZoom(int factor); bool canUnloadPixmap( int pageNum ) const; + void notifyCurrentPageChanged( int previous, int current ); // inherited from View uint viewId() const { return observerId(); } diff --git a/ui/presentationwidget.cpp b/ui/presentationwidget.cpp index 95e78d41f..b15ad71bb 100644 --- a/ui/presentationwidget.cpp +++ b/ui/presentationwidget.cpp @@ -318,7 +318,7 @@ void PresentationWidget::notifySetup( const QVector< Okular::Page * > & pageSet, Okular::MovieAnnotation * movieAnn = static_cast< Okular::MovieAnnotation * >( a ); VideoWidget * vw = new VideoWidget( movieAnn, m_document, this ); frame->videoWidgets.insert( movieAnn->movie(), vw ); - vw->pageEntered(); + vw->pageInitialized(); } } frame->recalcGeometry( m_width, m_height, screenRatio ); diff --git a/ui/videowidget.cpp b/ui/videowidget.cpp index ea0e5b8da..3d7ebab29 100644 --- a/ui/videowidget.cpp +++ b/ui/videowidget.cpp @@ -212,7 +212,6 @@ void VideoWidget::Private::setPosterImage( const QImage &image ) } posterImagePage->setPixmap( QPixmap::fromImage( image ) ); - q->show(); } void VideoWidget::Private::stateChanged( Phonon::State newState, Phonon::State ) @@ -323,6 +322,11 @@ bool VideoWidget::isPlaying() const return d->player->isPlaying(); } +void VideoWidget::pageInitialized() +{ + hide(); +} + void VideoWidget::pageEntered() { if ( d->anno->movie()->showPosterImage() ) diff --git a/ui/videowidget.h b/ui/videowidget.h index 384e2ff6c..f5d22b9ed 100644 --- a/ui/videowidget.h +++ b/ui/videowidget.h @@ -30,6 +30,11 @@ class VideoWidget : public QWidget bool isPlaying() const; + /** + * This method is called when the page the video widget is located on has been initialized. + */ + void pageInitialized(); + /** * This method is called when the page the video widget is located on has been entered. */ From 998e322e7a04f05d046afe4da33f089580056441 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Mon, 24 Sep 2012 16:26:09 +0200 Subject: [PATCH 144/155] Version increases for 0.15.2 (4.9.2) --- VERSION | 2 +- core/version.h | 4 ++-- generators/fictionbook/generator_fb.cpp | 2 +- generators/ooo/generator_ooo.cpp | 2 +- generators/spectre/generator_ghostview.cpp | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/VERSION b/VERSION index 19b64f782..319fba2f4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -okular v0.15.1 +okular v0.15.2 diff --git a/core/version.h b/core/version.h index 368739f87..f8b5de1eb 100644 --- a/core/version.h +++ b/core/version.h @@ -10,10 +10,10 @@ #ifndef _OKULAR_VERSION_H_ #define _OKULAR_VERSION_H_ -#define OKULAR_VERSION_STRING "0.15.1" +#define OKULAR_VERSION_STRING "0.15.2" #define OKULAR_VERSION_MAJOR 0 #define OKULAR_VERSION_MINOR 15 -#define OKULAR_VERSION_RELEASE 1 +#define OKULAR_VERSION_RELEASE 2 #define OKULAR_MAKE_VERSION( a,b,c ) (((a) << 16) | ((b) << 8) | (c)) #define OKULAR_VERSION \ diff --git a/generators/fictionbook/generator_fb.cpp b/generators/fictionbook/generator_fb.cpp index 60750dec7..2317083c3 100644 --- a/generators/fictionbook/generator_fb.cpp +++ b/generators/fictionbook/generator_fb.cpp @@ -20,7 +20,7 @@ static KAboutData createAboutData() "okular_fictionbook", "okular_fictionbook", ki18n( "Fiction Book Backend" ), - "0.1.4", + "0.1.5", ki18n( "A renderer for FictionBook eBooks" ), KAboutData::License_GPL, ki18n( "© 2007-2008 Tobias Koenig" ) diff --git a/generators/ooo/generator_ooo.cpp b/generators/ooo/generator_ooo.cpp index 6123387e9..793ee5893 100644 --- a/generators/ooo/generator_ooo.cpp +++ b/generators/ooo/generator_ooo.cpp @@ -20,7 +20,7 @@ static KAboutData createAboutData() "okular_ooo", "okular_ooo", ki18n( "OpenOffice Document Backend" ), - "0.2.2", + "0.2.3", ki18n( "A renderer for OpenOffice text documents" ), KAboutData::License_GPL, ki18n( "© 2006-2008 Tobias Koenig" ) diff --git a/generators/spectre/generator_ghostview.cpp b/generators/spectre/generator_ghostview.cpp index 02c6875d0..77afbfb64 100644 --- a/generators/spectre/generator_ghostview.cpp +++ b/generators/spectre/generator_ghostview.cpp @@ -39,7 +39,7 @@ static KAboutData createAboutData() "okular_ghostview", "okular_ghostview", ki18n( "PS Backend" ), - "0.1.5", + "0.1.6", ki18n( "A PostScript file renderer." ), KAboutData::License_GPL, ki18n( "© 2007-2008 Albert Astals Cid" ), From d917fe1e128ed3cecb94a8a99cabcbbb84cf1c42 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Tue, 25 Sep 2012 00:14:10 +0200 Subject: [PATCH 145/155] Unify the forward and backward search methods Same functionality 60 lines of duplicated code less to maintain --- core/document.cpp | 164 +++++++++++++--------------------------------- core/document.h | 3 +- core/document_p.h | 20 +++++- 3 files changed, 66 insertions(+), 121 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index 9d6b25c64..dd9322365 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -1168,66 +1168,68 @@ void DocumentPrivate::_o_configChanged() } } -void DocumentPrivate::doContinueNextMatchSearch(void *pagesToNotifySet, void * theMatch, int currentPage, int searchID, const QString & text, int theCaseSensitivity, bool moveViewport, const QColor & color, bool noDialogs, int donePages) +void DocumentPrivate::doContinueDirectionMatchSearch(void *doContinueDirectionMatchSearchStruct) { - RegularAreaRect * match = static_cast(theMatch); - Qt::CaseSensitivity caseSensitivity = static_cast(theCaseSensitivity); - QSet< int > *pagesToNotify = static_cast< QSet< int > * >( pagesToNotifySet ); - RunningSearch *search = m_searches.value(searchID); + DoContinueDirectionMatchSearchStruct *searchStruct = static_cast(doContinueDirectionMatchSearchStruct); + RunningSearch *search = m_searches.value(searchStruct->searchID); - if ((m_searchCancelled && !match) || !search) + if ((m_searchCancelled && !searchStruct->match) || !search) { // if the user cancelled but he just got a match, give him the match! QApplication::restoreOverrideCursor(); if (search) search->isCurrentlySearching = false; - emit m_parent->searchFinished( searchID, Document::SearchCancelled ); - delete pagesToNotify; + emit m_parent->searchFinished( searchStruct->searchID, Document::SearchCancelled ); + delete searchStruct->pagesToNotify; + delete searchStruct; return; } // if no match found, loop through the whole doc, starting from currentPage - if ( !match ) + if ( !searchStruct->match ) { - int pageCount = m_pagesVector.count(); - if (donePages < pageCount) + const int pageCount = m_pagesVector.count(); + if (searchStruct->pagesDone < pageCount) { bool doContinue = true; - if ( currentPage >= pageCount ) + if ( searchStruct->currentPage >= pageCount || searchStruct->currentPage < 0 ) { - if ( noDialogs || KMessageBox::questionYesNo(m_parent->widget(), i18n("End of document reached.\nContinue from the beginning?"), QString(), KStandardGuiItem::cont(), KStandardGuiItem::cancel()) == KMessageBox::Yes ) - currentPage = 0; + const QString question = searchStruct->forward ? i18n("End of document reached.\nContinue from the beginning?") : i18n("Beginning of document reached.\nContinue from the bottom?"); + if ( searchStruct->noDialogs || KMessageBox::questionYesNo(m_parent->widget(), question, QString(), KStandardGuiItem::cont(), KStandardGuiItem::cancel()) == KMessageBox::Yes ) + searchStruct->currentPage = searchStruct->forward ? 0 : pageCount - 1; else doContinue = false; } if (doContinue) { // get page - Page * page = m_pagesVector[ currentPage ]; + Page * page = m_pagesVector[ searchStruct->currentPage ]; // request search page if needed if ( !page->hasTextPage() ) m_parent->requestTextPage( page->number() ); // if found a match on the current page, end the loop - match = page->findText( searchID, text, FromTop, caseSensitivity ); + searchStruct->match = page->findText( searchStruct->searchID, searchStruct->text, searchStruct->forward ? FromTop : FromBottom, searchStruct->caseSensitivity ); - if ( !match ) + if ( !searchStruct->match ) { - currentPage++; - donePages++; + if (searchStruct->forward) searchStruct->currentPage++; + else searchStruct->currentPage--; + searchStruct->pagesDone++; } else { - donePages = 1; + searchStruct->pagesDone = 1; } - QMetaObject::invokeMethod(m_parent, "doContinueNextMatchSearch", Qt::QueuedConnection, Q_ARG(void *, pagesToNotifySet), Q_ARG(void *, match), Q_ARG(int, currentPage), Q_ARG(int, searchID), Q_ARG(QString, text), Q_ARG(int, caseSensitivity), Q_ARG(bool, moveViewport), Q_ARG(QColor, color), Q_ARG(bool, noDialogs), Q_ARG(int, donePages)); + QMetaObject::invokeMethod(m_parent, "doContinueDirectionMatchSearch", Qt::QueuedConnection, Q_ARG(void *, searchStruct)); return; } } } - doProcessSearchMatch( match, search, pagesToNotify, currentPage, searchID, moveViewport, color ); + doProcessSearchMatch( searchStruct->match, search, searchStruct->pagesToNotify, searchStruct->currentPage, searchStruct->searchID, searchStruct->moveViewport, searchStruct->color ); + delete searchStruct; } void DocumentPrivate::doProcessSearchMatch( RegularAreaRect *match, RunningSearch *search, QSet< int > *pagesToNotify, int currentPage, int searchID, bool moveViewport, const QColor & color ) @@ -1280,69 +1282,6 @@ void DocumentPrivate::doProcessSearchMatch( RegularAreaRect *match, RunningSearc delete pagesToNotify; } -void DocumentPrivate::doContinuePrevMatchSearch(void *pagesToNotifySet, void * theMatch, int currentPage, int searchID, const QString & text, int theCaseSensitivity, bool moveViewport, const QColor & color, bool noDialogs, int donePages) -{ - RegularAreaRect * match = static_cast(theMatch); - Qt::CaseSensitivity caseSensitivity = static_cast(theCaseSensitivity); - QSet< int > *pagesToNotify = static_cast< QSet< int > * >( pagesToNotifySet ); - RunningSearch *search = m_searches.value(searchID); - - if ((m_searchCancelled && !match) || !search) - { - // if the user cancelled but he just got a match, give him the match! - QApplication::restoreOverrideCursor(); - - if (search) search->isCurrentlySearching = false; - - emit m_parent->searchFinished( searchID, Document::SearchCancelled ); - delete pagesToNotify; - return; - } - - - // if no match found, loop through the whole doc, starting from currentPage - if ( !match ) - { - int pageCount = m_pagesVector.count(); - if (donePages < pageCount) - { - bool doContinue = true; - if ( currentPage < 0 ) - { - if ( noDialogs || KMessageBox::questionYesNo(m_parent->widget(), i18n("Beginning of document reached.\nContinue from the bottom?"), QString(), KStandardGuiItem::cont(), KStandardGuiItem::cancel()) == KMessageBox::Yes ) - currentPage = pageCount - 1; - else - doContinue = false; - } - if (doContinue) - { - // get page - Page * page = m_pagesVector[ currentPage ]; - // request search page if needed - if ( !page->hasTextPage() ) - m_parent->requestTextPage( page->number() ); - // if found a match on the current page, end the loop - match = page->findText( searchID, text, FromBottom, caseSensitivity ); - - if ( !match ) - { - currentPage--; - donePages++; - } - else - { - donePages = 1; - } - - QMetaObject::invokeMethod(m_parent, "doContinuePrevMatchSearch", Qt::QueuedConnection, Q_ARG(void *, pagesToNotifySet), Q_ARG(void *, match), Q_ARG(int, currentPage), Q_ARG(int, searchID), Q_ARG(QString, text), Q_ARG(int, caseSensitivity), Q_ARG(bool, moveViewport), Q_ARG(QColor, color), Q_ARG(bool, noDialogs), Q_ARG(int, donePages)); - return; - } - } - } - - doProcessSearchMatch( match, search, pagesToNotify, currentPage, searchID, moveViewport, color ); -} - void DocumentPrivate::doContinueAllDocumentSearch(void *pagesToNotifySet, void *pageMatchesMap, int currentPage, int searchID, const QString & text, int theCaseSensitivity, const QColor & color) { QMap< Page *, QVector > *pageMatches = static_cast< QMap< Page *, QVector > * >(pageMatchesMap); @@ -2941,37 +2880,14 @@ void Document::searchText( int searchID, const QString & text, bool fromStart, Q QMetaObject::invokeMethod(this, "doContinueAllDocumentSearch", Qt::QueuedConnection, Q_ARG(void *, pagesToNotify), Q_ARG(void *, pageMatches), Q_ARG(int, 0), Q_ARG(int, searchID), Q_ARG(QString, text), Q_ARG(int, caseSensitivity), Q_ARG(QColor, color)); } // 2. NEXTMATCH - find next matching item (or start from top) - else if ( type == NextMatch ) - { - // find out from where to start/resume search from - int viewportPage = (*d->m_viewportIterator).pageNumber; - int currentPage = fromStart ? 0 : ((s->continueOnPage != -1) ? s->continueOnPage : viewportPage); - Page * lastPage = fromStart ? 0 : d->m_pagesVector[ currentPage ]; - int pagesDone = 0; - - // continue checking last TextPage first (if it is the current page) - RegularAreaRect * match = 0; - if ( lastPage && lastPage->number() == s->continueOnPage ) - { - if ( newText ) - match = lastPage->findText( searchID, text, FromTop, caseSensitivity ); - else - match = lastPage->findText( searchID, text, NextResult, caseSensitivity, &s->continueOnMatch ); - if ( !match ) - { - currentPage++; - pagesDone++; - } - } - - QMetaObject::invokeMethod(this, "doContinueNextMatchSearch", Qt::QueuedConnection, Q_ARG(void *, pagesToNotify), Q_ARG(void *, match), Q_ARG(int, currentPage), Q_ARG(int, searchID), Q_ARG(QString, text), Q_ARG(int, caseSensitivity), Q_ARG(bool, moveViewport), Q_ARG(QColor, color), Q_ARG(bool, noDialogs), Q_ARG(int, pagesDone)); - } // 3. PREVMATCH - find previous matching item (or start from bottom) - else if ( type == PreviousMatch ) + else if ( type == NextMatch || type == PreviousMatch ) { // find out from where to start/resume search from - int viewportPage = (*d->m_viewportIterator).pageNumber; - int currentPage = fromStart ? d->m_pagesVector.count() - 1 : ((s->continueOnPage != -1) ? s->continueOnPage : viewportPage); + const bool forward = type == NextMatch; + const int viewportPage = (*d->m_viewportIterator).pageNumber; + const int fromStartSearchPage = forward ? 0 : d->m_pagesVector.count() - 1; + int currentPage = fromStart ? fromStartSearchPage : ((s->continueOnPage != -1) ? s->continueOnPage : viewportPage); Page * lastPage = fromStart ? 0 : d->m_pagesVector[ currentPage ]; int pagesDone = 0; @@ -2980,17 +2896,31 @@ void Document::searchText( int searchID, const QString & text, bool fromStart, Q if ( lastPage && lastPage->number() == s->continueOnPage ) { if ( newText ) - match = lastPage->findText( searchID, text, FromBottom, caseSensitivity ); + match = lastPage->findText( searchID, text, forward ? FromTop : FromBottom, caseSensitivity ); else - match = lastPage->findText( searchID, text, PreviousResult, caseSensitivity, &s->continueOnMatch ); + match = lastPage->findText( searchID, text, forward ? NextResult : PreviousResult, caseSensitivity, &s->continueOnMatch ); if ( !match ) { - currentPage--; + if (forward) currentPage++; + else currentPage--; pagesDone++; } } + + DoContinueDirectionMatchSearchStruct *searchStruct = new DoContinueDirectionMatchSearchStruct(); + searchStruct->forward = forward; + searchStruct->pagesToNotify = pagesToNotify; + searchStruct->match = match; + searchStruct->currentPage = currentPage; + searchStruct->searchID = searchID; + searchStruct->text = text; + searchStruct->caseSensitivity = caseSensitivity; + searchStruct->moveViewport = moveViewport; + searchStruct->color = color; + searchStruct->noDialogs = noDialogs; + searchStruct->pagesDone = pagesDone; - QMetaObject::invokeMethod(this, "doContinuePrevMatchSearch", Qt::QueuedConnection, Q_ARG(void *, pagesToNotify), Q_ARG(void *, match), Q_ARG(int, currentPage), Q_ARG(int, searchID), Q_ARG(QString, text), Q_ARG(int, caseSensitivity), Q_ARG(bool, moveViewport), Q_ARG(QColor, color), Q_ARG(bool, noDialogs), Q_ARG(int, pagesDone)); + QMetaObject::invokeMethod(this, "doContinueDirectionMatchSearch", Qt::QueuedConnection, Q_ARG(void *, searchStruct)); } // 4. GOOGLE* - process all document marking pages else if ( type == GoogleAll || type == GoogleAny ) diff --git a/core/document.h b/core/document.h index 85cd82144..7ddfa9766 100644 --- a/core/document.h +++ b/core/document.h @@ -820,8 +820,7 @@ class OKULAR_EXPORT Document : public QObject Q_PRIVATE_SLOT( d, void _o_configChanged() ) // search thread simulators - Q_PRIVATE_SLOT( d, void doContinueNextMatchSearch(void *pagesToNotifySet, void * match, int currentPage, int searchID, const QString & text, int caseSensitivity, bool moveViewport, const QColor & color, bool noDialogs, int donePages) ) - Q_PRIVATE_SLOT( d, void doContinuePrevMatchSearch(void *pagesToNotifySet, void * match, int currentPage, int searchID, const QString & text, int caseSensitivity, bool moveViewport, const QColor & color, bool noDialogs, int donePages) ) + Q_PRIVATE_SLOT( d, void doContinueDirectionMatchSearch(void *doContinueDirectionMatchSearchStruct) ) Q_PRIVATE_SLOT( d, void doContinueAllDocumentSearch(void *pagesToNotifySet, void *pageMatchesMap, int currentPage, int searchID, const QString & text, int caseSensitivity, const QColor & color) ) Q_PRIVATE_SLOT( d, void doContinueGooglesDocumentSearch(void *pagesToNotifySet, void *pageMatchesMap, int currentPage, int searchID, const QStringList & words, int caseSensitivity, const QColor & color, bool matchAll) ) }; diff --git a/core/document_p.h b/core/document_p.h index 54e922d32..2c4f4d10f 100644 --- a/core/document_p.h +++ b/core/document_p.h @@ -63,6 +63,21 @@ namespace Okular { class FontExtractionThread; +struct DoContinueDirectionMatchSearchStruct +{ + bool forward; + QSet< int > *pagesToNotify; + RegularAreaRect *match; + int currentPage; + int searchID; + QString text; + Qt::CaseSensitivity caseSensitivity; + bool moveViewport; + QColor color; + bool noDialogs; + int pagesDone; +}; + class DocumentPrivate { public: @@ -135,8 +150,7 @@ class DocumentPrivate void slotGeneratorConfigChanged( const QString& ); void refreshPixmaps( int ); void _o_configChanged(); - void doContinueNextMatchSearch(void *pagesToNotifySet, void * match, int currentPage, int searchID, const QString & text, int caseSensitivity, bool moveViewport, const QColor & color, bool noDialogs, int donePages); - void doContinuePrevMatchSearch(void *pagesToNotifySet, void * theMatch, int currentPage, int searchID, const QString & text, int theCaseSensitivity, bool moveViewport, const QColor & color, bool noDialogs, int donePages); + void doContinueDirectionMatchSearch(void *doContinueDirectionMatchSearchStruct); void doContinueAllDocumentSearch(void *pagesToNotifySet, void *pageMatchesMap, int currentPage, int searchID, const QString & text, int caseSensitivity, const QColor & color); void doContinueGooglesDocumentSearch(void *pagesToNotifySet, void *pageMatchesMap, int currentPage, int searchID, const QStringList & words, int caseSensitivity, const QColor & color, bool matchAll); @@ -248,3 +262,5 @@ class DocumentPrivate } #endif + +/* kate: replace-tabs on; indent-width 4; */ From 7a0031870f8552fd9069634c7c0803a949021ce4 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Tue, 25 Sep 2012 01:41:13 +0200 Subject: [PATCH 146/155] Move the plucker generator from canGeneratePixmap()/generatePixmap() to image() --- generators/plucker/generator_plucker.cpp | 18 +++++------------- generators/plucker/generator_plucker.h | 6 +++--- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/generators/plucker/generator_plucker.cpp b/generators/plucker/generator_plucker.cpp index 3bd22b9b2..4ffdead26 100644 --- a/generators/plucker/generator_plucker.cpp +++ b/generators/plucker/generator_plucker.cpp @@ -131,20 +131,15 @@ const Okular::DocumentInfo* PluckerGenerator::generateDocumentInfo() return &mDocumentInfo; } -bool PluckerGenerator::canGeneratePixmap() const -{ - return true; -} - -void PluckerGenerator::generatePixmap( Okular::PixmapRequest * request ) +QImage PluckerGenerator::image( Okular::PixmapRequest *request ) { const QSizeF size = mPages[ request->pageNumber() ]->size(); - QPixmap *pixmap = new QPixmap( request->width(), request->height() ); - pixmap->fill( Qt::white ); + QImage image( request->width(), request->height(), QImage::Format_ARGB32_Premultiplied ); + image.fill( Qt::white ); QPainter p; - p.begin( pixmap ); + p.begin( &image ); qreal width = request->width(); qreal height = request->height(); @@ -153,9 +148,6 @@ void PluckerGenerator::generatePixmap( Okular::PixmapRequest * request ) mPages[ request->pageNumber() ]->drawContents( &p ); p.end(); - request->page()->setPixmap( request->id(), pixmap ); - - if ( !mLinkAdded.contains( request->pageNumber() ) ) { QLinkedList objects; for ( int i = 0; i < mLinks.count(); ++i ) { @@ -176,7 +168,7 @@ void PluckerGenerator::generatePixmap( Okular::PixmapRequest * request ) mLinkAdded.insert( request->pageNumber() ); } - signalPixmapRequestDone( request ); + return image; } Okular::ExportFormat::List PluckerGenerator::exportFormats() const diff --git a/generators/plucker/generator_plucker.h b/generators/plucker/generator_plucker.h index 61f056189..8dac4b830 100644 --- a/generators/plucker/generator_plucker.h +++ b/generators/plucker/generator_plucker.h @@ -32,9 +32,9 @@ class PluckerGenerator : public Okular::Generator // [INHERITED] document information const Okular::DocumentInfo * generateDocumentInfo(); - - bool canGeneratePixmap() const; - void generatePixmap( Okular::PixmapRequest *request ); + + // [INHERITED] perform actions on document / pages + QImage image( Okular::PixmapRequest *request ); // [INHERITED] text exporting Okular::ExportFormat::List exportFormats() const; From 4befd95ef8301e20438d7914c792b7c392645428 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Tue, 25 Sep 2012 11:09:34 +0200 Subject: [PATCH 147/155] sendGeneratorRequest -> sendGeneratorPixmapRequest --- core/document.cpp | 10 +++++----- core/document.h | 2 +- core/document_p.h | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index dd9322365..467b41e85 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -972,7 +972,7 @@ void DocumentPrivate::slotTimedMemoryCheck() cleanupPixmapMemory(); } -void DocumentPrivate::sendGeneratorRequest() +void DocumentPrivate::sendGeneratorPixmapRequest() { /* If the pixmap cache will have to be cleaned in order to make room for the * next request, get the distance from the current viewport of the page @@ -1059,7 +1059,7 @@ void DocumentPrivate::sendGeneratorRequest() { m_pixmapRequestsMutex.unlock(); // pino (7/4/2006): set the polling interval from 10 to 30 - QTimer::singleShot( 30, m_parent, SLOT(sendGeneratorRequest()) ); + QTimer::singleShot( 30, m_parent, SLOT(sendGeneratorPixmapRequest()) ); } } @@ -2393,9 +2393,9 @@ void Document::requestPixmaps( const QLinkedList< PixmapRequest * > & requests, // 3. [START FIRST GENERATION] if generator is ready, start a new generation, // or else (if gen is running) it will be started when the new contents will //come from generator (in requestDone()) - // all handling of requests put into sendGeneratorRequest + // all handling of requests put into sendGeneratorPixmapRequest // if ( generator->canRequestPixmap() ) - d->sendGeneratorRequest(); + d->sendGeneratorPixmapRequest(); } void Document::requestTextPage( uint page ) @@ -3851,7 +3851,7 @@ void DocumentPrivate::requestDone( PixmapRequest * req ) bool hasPixmaps = !m_pixmapRequestsStack.isEmpty(); m_pixmapRequestsMutex.unlock(); if ( hasPixmaps ) - sendGeneratorRequest(); + sendGeneratorPixmapRequest(); } void DocumentPrivate::setPageBoundingBox( int page, const NormalizedRect& boundingBox ) diff --git a/core/document.h b/core/document.h index 7ddfa9766..d47acec8a 100644 --- a/core/document.h +++ b/core/document.h @@ -811,7 +811,7 @@ class OKULAR_EXPORT Document : public QObject Q_PRIVATE_SLOT( d, void saveDocumentInfo() const ) Q_PRIVATE_SLOT( d, void slotTimedMemoryCheck() ) - Q_PRIVATE_SLOT( d, void sendGeneratorRequest() ) + Q_PRIVATE_SLOT( d, void sendGeneratorPixmapRequest() ) Q_PRIVATE_SLOT( d, void rotationFinished( int page, Okular::Page *okularPage ) ) Q_PRIVATE_SLOT( d, void fontReadingProgress( int page ) ) Q_PRIVATE_SLOT( d, void fontReadingGotFont( const Okular::FontInfo& font ) ) diff --git a/core/document_p.h b/core/document_p.h index 2c4f4d10f..91a557746 100644 --- a/core/document_p.h +++ b/core/document_p.h @@ -143,7 +143,7 @@ class DocumentPrivate // private slots void saveDocumentInfo() const; void slotTimedMemoryCheck(); - void sendGeneratorRequest(); + void sendGeneratorPixmapRequest(); void rotationFinished( int page, Okular::Page *okularPage ); void fontReadingProgress( int page ); void fontReadingGotFont( const Okular::FontInfo& font ); From 585223a2ab49712cf3f6a5f87bb97c2758bd49c5 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Tue, 25 Sep 2012 11:58:48 +0200 Subject: [PATCH 148/155] This should be previousPage and not m_frameIndex, right? CCMAIL: tokoe@kdab.com --- ui/presentationwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/presentationwidget.cpp b/ui/presentationwidget.cpp index b15ad71bb..96b555fa6 100644 --- a/ui/presentationwidget.cpp +++ b/ui/presentationwidget.cpp @@ -381,7 +381,7 @@ void PresentationWidget::notifyCurrentPageChanged( int previousPage, int current m_document->processAction( m_document->page( previousPage )->pageAction( Okular::Page::Closing ) ); // perform the additional actions of the page's annotations, if any - Q_FOREACH ( const Okular::Annotation *annotation, m_document->page( m_frameIndex )->annotations() ) + Q_FOREACH ( const Okular::Annotation *annotation, m_document->page( previousPage )->annotations() ) { Okular::Action *action = 0; From 385933205a26c8dc0d109d9159a26ac6e485aa2d Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Tue, 25 Sep 2012 12:53:35 +0200 Subject: [PATCH 149/155] Change code so there is no a return inside three ifs --- core/document.cpp | 65 +++++++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index 467b41e85..4803f5276 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -1186,13 +1186,14 @@ void DocumentPrivate::doContinueDirectionMatchSearch(void *doContinueDirectionMa return; } + bool doContinue = false; // if no match found, loop through the whole doc, starting from currentPage if ( !searchStruct->match ) { const int pageCount = m_pagesVector.count(); if (searchStruct->pagesDone < pageCount) { - bool doContinue = true; + doContinue = true; if ( searchStruct->currentPage >= pageCount || searchStruct->currentPage < 0 ) { const QString question = searchStruct->forward ? i18n("End of document reached.\nContinue from the beginning?") : i18n("Beginning of document reached.\nContinue from the bottom?"); @@ -1201,35 +1202,45 @@ void DocumentPrivate::doContinueDirectionMatchSearch(void *doContinueDirectionMa else doContinue = false; } - if (doContinue) - { - // get page - Page * page = m_pagesVector[ searchStruct->currentPage ]; - // request search page if needed - if ( !page->hasTextPage() ) - m_parent->requestTextPage( page->number() ); - // if found a match on the current page, end the loop - searchStruct->match = page->findText( searchStruct->searchID, searchStruct->text, searchStruct->forward ? FromTop : FromBottom, searchStruct->caseSensitivity ); - - if ( !searchStruct->match ) - { - if (searchStruct->forward) searchStruct->currentPage++; - else searchStruct->currentPage--; - searchStruct->pagesDone++; - } - else - { - searchStruct->pagesDone = 1; - } - - QMetaObject::invokeMethod(m_parent, "doContinueDirectionMatchSearch", Qt::QueuedConnection, Q_ARG(void *, searchStruct)); - return; - } } } - doProcessSearchMatch( searchStruct->match, search, searchStruct->pagesToNotify, searchStruct->currentPage, searchStruct->searchID, searchStruct->moveViewport, searchStruct->color ); - delete searchStruct; + if (doContinue) + { + // get page + Page * page = m_pagesVector[ searchStruct->currentPage ]; + // request search page if needed + if ( !page->hasTextPage() ) + { + m_parent->requestTextPage( page->number() ); + + // TODO wait for page text to be generated and call doContinueDirectionMatchSearch + } + else + { + // if found a match on the current page, end the loop + searchStruct->match = page->findText( searchStruct->searchID, searchStruct->text, searchStruct->forward ? FromTop : FromBottom, searchStruct->caseSensitivity ); + + if ( !searchStruct->match ) + { + if (searchStruct->forward) searchStruct->currentPage++; + else searchStruct->currentPage--; + searchStruct->pagesDone++; + } + else + { + searchStruct->pagesDone = 1; + } + + // Both of the previous if branches need to call doContinueDirectionMatchSearch + QMetaObject::invokeMethod(m_parent, "doContinueDirectionMatchSearch", Qt::QueuedConnection, Q_ARG(void *, searchStruct)); + } + } + else + { + doProcessSearchMatch( searchStruct->match, search, searchStruct->pagesToNotify, searchStruct->currentPage, searchStruct->searchID, searchStruct->moveViewport, searchStruct->color ); + delete searchStruct; + } } void DocumentPrivate::doProcessSearchMatch( RegularAreaRect *match, RunningSearch *search, QSet< int > *pagesToNotify, int currentPage, int searchID, bool moveViewport, const QColor & color ) From 83167d76880ec98421da8fe5260816909318d1d7 Mon Sep 17 00:00:00 2001 From: Tobias Koenig Date: Tue, 25 Sep 2012 14:18:36 +0200 Subject: [PATCH 150/155] Fix a crash when loading documents with Screen/MediaRendition annotations. To fix this issue the right way we need some more extensions to poppler and Okular, so disable the code for the moment until this work is done. --- generators/poppler/generator_pdf.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index 946219528..fcc8dc453 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -1396,6 +1396,10 @@ void PDFGenerator::addAnnotations( Poppler::Page * popplerPage, Okular::Page * p #ifdef HAVE_POPPLER_0_22 if ( a->subType() == Poppler::Annotation::AScreen ) { +/* + // TODO: (tokoe) This has been disabled for the moment, since we return MovieAnnotation objects + // for AScreen annotations, which will lead to a crash down here. + Poppler::ScreenAnnotation *annotScreen = static_cast( a ); Okular::ScreenAnnotation *screenAnnotation = static_cast( newann ); @@ -1406,6 +1410,7 @@ void PDFGenerator::addAnnotations( Poppler::Page * popplerPage, Okular::Page * p const Poppler::Link *pageClosingLink = annotScreen->additionalAction( Poppler::Annotation::PageClosingAction ); if ( pageClosingLink ) screenAnnotation->setAdditionalAction( Okular::Annotation::PageClosing, createLinkFromPopplerLink( pageClosingLink ) ); +*/ } if ( a->subType() == Poppler::Annotation::AWidget ) From ed02ecfb6006dfeb425207d29cd23d22afa658a5 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Tue, 25 Sep 2012 21:05:18 +0200 Subject: [PATCH 151/155] Remove the disable threading option It was added ages ago when our threading code was not perfect, but should be top notch now so this makes not any sense --- conf/dlgperformancebase.ui | 7 ------- conf/okular.kcfg | 3 --- core/document.cpp | 4 ---- doc/index.docbook | 8 -------- ui/pageview.cpp | 3 +-- ui/presentationwidget.cpp | 2 +- 6 files changed, 2 insertions(+), 25 deletions(-) diff --git a/conf/dlgperformancebase.ui b/conf/dlgperformancebase.ui index 8d58c9418..3a9f9aac4 100644 --- a/conf/dlgperformancebase.ui +++ b/conf/dlgperformancebase.ui @@ -52,13 +52,6 @@ - - - - Enable &background generation - - - diff --git a/conf/okular.kcfg b/conf/okular.kcfg index 22783c7c7..91747337b 100644 --- a/conf/okular.kcfg +++ b/conf/okular.kcfg @@ -65,9 +65,6 @@ true - - true - Enabled diff --git a/core/document.cpp b/core/document.cpp index 4803f5276..7f006e664 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -2363,7 +2363,6 @@ void Document::requestPixmaps( const QLinkedList< PixmapRequest * > & requests, } // 2. [ADD TO STACK] add requests to stack - bool threadingDisabled = !Settings::enableThreading(); QLinkedList< PixmapRequest * >::const_iterator rIt = requests.constBegin(), rEnd = requests.constEnd(); for ( ; rIt != rEnd; ++rIt ) { @@ -2382,9 +2381,6 @@ void Document::requestPixmaps( const QLinkedList< PixmapRequest * > & requests, if ( !request->asynchronous() ) request->d->mPriority = 0; - if ( request->asynchronous() && threadingDisabled ) - request->d->mAsynchronous = false; - // add request to the 'stack' at the right place if ( !request->priority() ) // add priority zero requests to the top of the stack diff --git a/doc/index.docbook b/doc/index.docbook index 06c3247fb..90fba8360 100644 --- a/doc/index.docbook +++ b/doc/index.docbook @@ -1580,14 +1580,6 @@ Add a 'Find Previous' entry outline or opaque fill styles and increase speed on selections. - - Enable background generation - - Use a background thread to generate the pages. By disabling - this option the user interface will become less reactive (will be blocked - if necessary), but pages will be displayed a bit faster. - - Memory Usage diff --git a/ui/pageview.cpp b/ui/pageview.cpp index 205a9fa9f..496abdc07 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -4001,8 +4001,7 @@ void PageView::slotRequestVisiblePixmaps( int newValue ) // if preloading is enabled, add the pages before and after in preloading if ( !d->visibleItems.isEmpty() && - Okular::Settings::memoryLevel() != Okular::Settings::EnumMemoryLevel::Low && - Okular::Settings::enableThreading() ) + Okular::Settings::memoryLevel() != Okular::Settings::EnumMemoryLevel::Low ) { // as the requests are done in the order as they appear in the list, // request first the next page and then the previous diff --git a/ui/presentationwidget.cpp b/ui/presentationwidget.cpp index 96b555fa6..9ba942b2b 100644 --- a/ui/presentationwidget.cpp +++ b/ui/presentationwidget.cpp @@ -1227,7 +1227,7 @@ void PresentationWidget::requestPixmaps() // restore cursor QApplication::restoreOverrideCursor(); // ask for next and previous page if not in low memory usage setting - if ( Okular::Settings::memoryLevel() != Okular::Settings::EnumMemoryLevel::Low && Okular::Settings::enableThreading() ) + if ( Okular::Settings::memoryLevel() != Okular::Settings::EnumMemoryLevel::Low ) { int pagesToPreload = 1; From b1152329661d841219250a2165347b0d224f57ab Mon Sep 17 00:00:00 2001 From: Jaydeep Solanki Date: Tue, 25 Sep 2012 21:26:44 +0200 Subject: [PATCH 152/155] D-Bus access to non-first Okular::Part REVIEW: 106531 BUGS: 306313 FIXED-IN: 4.10.0 --- part.cpp | 11 +++++++++-- part.h | 2 ++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/part.cpp b/part.cpp index fe11189b8..2ef39d8ed 100644 --- a/part.cpp +++ b/part.cpp @@ -277,6 +277,8 @@ static bool keepFileOpen() } #endif +int Okular::Part::numberOfParts = 0; + namespace Okular { @@ -302,8 +304,13 @@ m_cliPresentation(false), m_embedMode(detectEmbedMode(parentWidget, parent, args } } Okular::Settings::instance( configFileName ); - - QDBusConnection::sessionBus().registerObject("/okular", this, QDBusConnection::ExportScriptableSlots); + + numberOfParts++; + if (numberOfParts == 1) { + QDBusConnection::sessionBus().registerObject("/okular", this, QDBusConnection::ExportScriptableSlots); + } else { + QDBusConnection::sessionBus().registerObject(QString("/okular%1").arg(numberOfParts), this, QDBusConnection::ExportScriptableSlots); + } // connect the started signal to tell the job the mimetypes we like, // and get some more information from it diff --git a/part.h b/part.h index 49607beb8..adac19afc 100644 --- a/part.h +++ b/part.h @@ -231,6 +231,8 @@ class Part : public KParts::ReadWritePart, public Okular::DocumentObserver, publ void updateAboutBackendAction(); void unsetDummyMode(); void slotRenameBookmark( const DocumentViewport &viewport ); + + static int numberOfParts; KTemporaryFile *m_tempfile; From ea08b463081418d348390c500376de9f4c0c40f7 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 26 Sep 2012 23:28:58 +0200 Subject: [PATCH 153/155] Remove code i did not want to commit The part with the todo wasn't meant to be commited yet --- core/document.cpp | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/core/document.cpp b/core/document.cpp index 7f006e664..143d59827 100644 --- a/core/document.cpp +++ b/core/document.cpp @@ -1211,30 +1211,24 @@ void DocumentPrivate::doContinueDirectionMatchSearch(void *doContinueDirectionMa Page * page = m_pagesVector[ searchStruct->currentPage ]; // request search page if needed if ( !page->hasTextPage() ) - { m_parent->requestTextPage( page->number() ); - - // TODO wait for page text to be generated and call doContinueDirectionMatchSearch + + // if found a match on the current page, end the loop + searchStruct->match = page->findText( searchStruct->searchID, searchStruct->text, searchStruct->forward ? FromTop : FromBottom, searchStruct->caseSensitivity ); + + if ( !searchStruct->match ) + { + if (searchStruct->forward) searchStruct->currentPage++; + else searchStruct->currentPage--; + searchStruct->pagesDone++; } else { - // if found a match on the current page, end the loop - searchStruct->match = page->findText( searchStruct->searchID, searchStruct->text, searchStruct->forward ? FromTop : FromBottom, searchStruct->caseSensitivity ); - - if ( !searchStruct->match ) - { - if (searchStruct->forward) searchStruct->currentPage++; - else searchStruct->currentPage--; - searchStruct->pagesDone++; - } - else - { - searchStruct->pagesDone = 1; - } - - // Both of the previous if branches need to call doContinueDirectionMatchSearch - QMetaObject::invokeMethod(m_parent, "doContinueDirectionMatchSearch", Qt::QueuedConnection, Q_ARG(void *, searchStruct)); + searchStruct->pagesDone = 1; } + + // Both of the previous if branches need to call doContinueDirectionMatchSearch + QMetaObject::invokeMethod(m_parent, "doContinueDirectionMatchSearch", Qt::QueuedConnection, Q_ARG(void *, searchStruct)); } else { From 906b7d59312f203e6474a6eb23034a82bf673e73 Mon Sep 17 00:00:00 2001 From: Tobias Koenig Date: Fri, 28 Sep 2012 10:11:13 +0200 Subject: [PATCH 154/155] Fix behaviour of VideoWidget and SnapshotTaker Stop video player when leaving a page and before deleting the video widget. Do not leak the video player inside the SnapshotTaker. --- ui/snapshottaker.cpp | 6 ++++++ ui/snapshottaker.h | 1 + ui/videowidget.cpp | 9 ++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/ui/snapshottaker.cpp b/ui/snapshottaker.cpp index 5e4058de0..362d2497a 100644 --- a/ui/snapshottaker.cpp +++ b/ui/snapshottaker.cpp @@ -27,6 +27,12 @@ SnapshotTaker::SnapshotTaker( const QString &url, QObject *parent ) m_player->play(); } +SnapshotTaker::~SnapshotTaker() +{ + m_player->stop(); + delete m_player; +} + void SnapshotTaker::stateChanged(Phonon::State newState, Phonon::State) { if (newState == Phonon::PlayingState) { diff --git a/ui/snapshottaker.h b/ui/snapshottaker.h index f9b09c0b2..e34c3e0be 100644 --- a/ui/snapshottaker.h +++ b/ui/snapshottaker.h @@ -22,6 +22,7 @@ class SnapshotTaker : public QObject public: SnapshotTaker( const QString &url, QObject *parent = 0 ); + ~SnapshotTaker(); Q_SIGNALS: void finished( const QImage &image ); diff --git a/ui/videowidget.cpp b/ui/videowidget.cpp index 3d7ebab29..592ec7940 100644 --- a/ui/videowidget.cpp +++ b/ui/videowidget.cpp @@ -59,10 +59,16 @@ class VideoWidget::Private { public: Private( Okular::MovieAnnotation *ma, Okular::Document *doc, VideoWidget *qq ) - : q( qq ), anno( ma ), document( doc ), loaded( false ) + : q( qq ), anno( ma ), document( doc ), player( 0 ), loaded( false ) { } + ~Private() + { + if ( player ) + player->stop(); + } + enum PlayPauseMode { PlayMode, PauseMode }; void load(); @@ -344,6 +350,7 @@ void VideoWidget::pageEntered() void VideoWidget::pageLeft() { + d->player->stop(); d->videoStopped(); hide(); From ec7b2e763d80a452947ac97dc5a0977013ee53ad Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Fri, 28 Sep 2012 17:57:03 +0200 Subject: [PATCH 155/155] Make document scroll as necessary when in text selection mode BUGS: 165744 FIXED-IN: 4.10.0 REVIEW: 106579 --- ui/pageview.cpp | 74 ++++++++++++++++++++++++++----------------------- ui/pageview.h | 5 +++- 2 files changed, 44 insertions(+), 35 deletions(-) diff --git a/ui/pageview.cpp b/ui/pageview.cpp index 496abdc07..2ef10a1e2 100644 --- a/ui/pageview.cpp +++ b/ui/pageview.cpp @@ -1853,7 +1853,7 @@ void PageView::mouseMoveEvent( QMouseEvent * e ) d->aMouseSelect->trigger(); QPoint newPos = eventPos + QPoint( deltaX, deltaY ); selectionStart( newPos, palette().color( QPalette::Active, QPalette::Highlight ).light( 120 ), false ); - selectionEndPoint( eventPos ); + updateSelection( eventPos ); break; } } @@ -1869,7 +1869,7 @@ void PageView::mouseMoveEvent( QMouseEvent * e ) case Okular::Settings::EnumMouseMode::TableSelect: // set second corner of selection if ( d->mouseSelecting ) - selectionEndPoint( eventPos ); + updateSelection( eventPos ); break; case Okular::Settings::EnumMouseMode::TextSelect: // if mouse moves 5 px away from the press point and the document soupports text extraction, do 'textselection' @@ -1877,27 +1877,7 @@ void PageView::mouseMoveEvent( QMouseEvent * e ) { d->mouseTextSelecting = true; } - if ( d->mouseTextSelecting ) - { - int first = -1; - QList< Okular::RegularAreaRect * > selections = textSelections( eventPos, d->mouseSelectPos, first ); - QSet< int > pagesWithSelectionSet; - for ( int i = 0; i < selections.count(); ++i ) - pagesWithSelectionSet.insert( i + first ); - - QSet< int > noMoreSelectedPages = d->pagesWithTextSelection - pagesWithSelectionSet; - // clear the selection from pages not selected anymore - foreach( int p, noMoreSelectedPages ) - { - d->document->setPageTextSelection( p, 0, QColor() ); - } - // set the new selection for the selected pages - foreach( int p, pagesWithSelectionSet ) - { - d->document->setPageTextSelection( p, selections[ p - first ], palette().color( QPalette::Active, QPalette::Highlight ) ); - } - d->pagesWithTextSelection = pagesWithSelectionSet; - } + updateSelection( eventPos ); updateCursor( contentAreaPosition() + viewport()->mapFromGlobal( QCursor::pos() ) ); break; } @@ -3296,11 +3276,8 @@ void PageView::selectionStart( const QPoint & pos, const QColor & color, bool /* } } -void PageView::selectionEndPoint( const QPoint & pos ) +void PageView::scrollPosIntoView( const QPoint & pos ) { - if ( !d->mouseSelecting ) - return; - if (pos.x() < horizontalScrollBar()->value()) d->dragScrollVector.setX(pos.x() - horizontalScrollBar()->value()); else if (horizontalScrollBar()->value() + viewport()->width() < pos.x()) d->dragScrollVector.setX(pos.x() - horizontalScrollBar()->value() - viewport()->width()); else d->dragScrollVector.setX(0); @@ -3314,13 +3291,42 @@ void PageView::selectionEndPoint( const QPoint & pos ) if (!d->dragScrollTimer.isActive()) d->dragScrollTimer.start(100); } else d->dragScrollTimer.stop(); +} - // update the selection rect - QRect updateRect = d->mouseSelectionRect; - d->mouseSelectionRect.setBottomLeft( pos ); - updateRect |= d->mouseSelectionRect; - updateRect.translate( -contentAreaPosition() ); - viewport()->update( updateRect.adjusted( -1, -1, 1, 1 ) ); +void PageView::updateSelection( const QPoint & pos ) +{ + if ( d->mouseSelecting ) + { + scrollPosIntoView( pos ); + // update the selection rect + QRect updateRect = d->mouseSelectionRect; + d->mouseSelectionRect.setBottomLeft( pos ); + updateRect |= d->mouseSelectionRect; + updateRect.translate( -contentAreaPosition() ); + viewport()->update( updateRect.adjusted( -1, -1, 1, 1 ) ); + } + else if ( d->mouseTextSelecting) + { + scrollPosIntoView( pos ); + int first = -1; + const QList< Okular::RegularAreaRect * > selections = textSelections( pos, d->mouseSelectPos, first ); + QSet< int > pagesWithSelectionSet; + for ( int i = 0; i < selections.count(); ++i ) + pagesWithSelectionSet.insert( i + first ); + + const QSet< int > noMoreSelectedPages = d->pagesWithTextSelection - pagesWithSelectionSet; + // clear the selection from pages not selected anymore + foreach( int p, noMoreSelectedPages ) + { + d->document->setPageTextSelection( p, 0, QColor() ); + } + // set the new selection for the selected pages + foreach( int p, pagesWithSelectionSet ) + { + d->document->setPageTextSelection( p, selections[ p - first ], palette().color( QPalette::Active, QPalette::Highlight ) ); + } + d->pagesWithTextSelection = pagesWithSelectionSet; + } } static Okular::NormalizedPoint rotateInNormRect( const QPoint &rotated, const QRect &rect, Okular::Rotation rotation ) @@ -4118,7 +4124,7 @@ void PageView::slotDragScroll() horizontalScrollBar()->setValue(horizontalScrollBar()->value() + d->dragScrollVector.x()); verticalScrollBar()->setValue(verticalScrollBar()->value() + d->dragScrollVector.y()); QPoint p = contentAreaPosition() + viewport()->mapFromGlobal( QCursor::pos() ); - selectionEndPoint( p ); + updateSelection( p ); } void PageView::slotShowWelcome() diff --git a/ui/pageview.h b/ui/pageview.h index 9f566201c..c1b36f4be 100644 --- a/ui/pageview.h +++ b/ui/pageview.h @@ -169,10 +169,11 @@ Q_OBJECT PageViewItem * pickItemOnPoint( int x, int y ); // start / modify / clear selection rectangle void selectionStart( const QPoint & pos, const QColor & color, bool aboveAll = false ); - void selectionEndPoint( const QPoint & pos ); void selectionClear( const ClearMode mode = ClearAllSelection ); void drawTableDividers(QPainter * screenPainter); void guessTableDividers(); + // update either text or rectangle selection + void updateSelection( const QPoint & pos ); // update internal zoom values and end in a slotRelayoutPages(); void updateZoom( ZoomMode newZm ); // update the text on the label using global zoom value or current page's one @@ -191,6 +192,8 @@ Q_OBJECT void updatePageStep(); void addWebShortcutsMenu( KMenu * menu, const QString & text ); + // used when selecting stuff, makes the view scroll as necessary to keep the mouse inside the view + void scrollPosIntoView( const QPoint & pos ); // don't want to expose classes in here class PageViewPrivate * d;