[kde-doc-english] [okular/frameworks] /: Merge remote-tracking branch 'origin/master' into frameworks

Montel Laurent montel at kde.org
Tue Mar 17 07:48:01 UTC 2015


Git commit d780d15ea9d78ea9ed3914382b844cf796af2f70 by Montel Laurent.
Committed on 17/03/2015 at 07:47.
Pushed by mlaurent into branch 'frameworks'.

Merge remote-tracking branch 'origin/master' into frameworks

Conflicts:
	autotests/mainshelltest.cpp
	part.cpp
	part.h
	shell/shell.cpp

R  +119  -1    autotests/mainshelltest.cpp
M  +1    -1    core/fileprinter.h
M  +10   -0    doc/index.docbook
M  +6    -20   part.cpp
M  +3    -2    part.h
M  +1    -1    shell/main.cpp
M  +38   -17   shell/shell.cpp
M  +11   -5    shell/shell.h
M  +55   -15   ui/pageview.cpp
M  +2    -0    ui/pageview.h
M  +9    -0    ui/sidebar.cpp
M  +2    -0    ui/sidebar.h

http://commits.kde.org/okular/d780d15ea9d78ea9ed3914382b844cf796af2f70

diff --cc autotests/mainshelltest.cpp
index 475bf23,a044895..f050d39
--- a/autotests/mainshelltest.cpp
+++ b/autotests/mainshelltest.cpp
@@@ -7,12 -7,11 +7,12 @@@
   *   (at your option) any later version.                                   *
   ***************************************************************************/
  
 -#include <qtest_kde.h>
 +#include <QtTest>
 +
  #include <qprintdialog.h>
  #include <qwidget.h>
- #include <kglobal.h>
 -#include <ktabwidget.h>
 +#include <qtabwidget.h>
+ #include <kconfiggroup.h>
  
  #include "../shell/okular_main.h"
  #include "../shell/shell.h"
@@@ -469,6 -484,108 +485,108 @@@ void MainShellTest::test2FilesError(
      QVERIFY(!s);
  }
  
+ void MainShellTest::testSessionRestore_data()
+ {
+     QTest::addColumn<QStringList>("paths");
+     QTest::addColumn<QString>("options");
+     QTest::addColumn<bool>("useTabsOpen");
+     QTest::addColumn<bool>("useTabsRestore");
+ 
+     QStringList oneDocPaths( KDESRCDIR "data/file1.pdf" );
+     QStringList twoDocPaths( oneDocPaths );
+     twoDocPaths << KDESRCDIR "data/formSamples.pdf";
+ 
+     const QString options = ShellUtils::serializeOptions(false, false, false, false, QString());
+ 
+     QTest::newRow("1 doc, 1 window, tabs")      << oneDocPaths << options << true  << true;
+     QTest::newRow("2 docs, 1 window, tabs")     << twoDocPaths << options << true  << true;
+     QTest::newRow("2 docs, 2 windows, tabs")    << twoDocPaths << options << false << true;
+     QTest::newRow("2 docs, 2 windows, no tabs") << twoDocPaths << options << false << false;
+     QTest::newRow("2 docs, 1 window, no tabs")  << twoDocPaths << options << true  << false;
+ }
+ 
+ void MainShellTest::testSessionRestore()
+ {
+     QFETCH( QStringList, paths );
+     QFETCH( QString, options );
+     QFETCH( bool, useTabsOpen );
+     QFETCH( bool, useTabsRestore );
+ 
+     Okular::Settings::self()->setShellOpenFileInTabs( useTabsOpen );
+ 
+     Okular::Status status = Okular::main( paths, options );
+     QCOMPARE( status, Okular::Success );
+ 
+     // Gather some information about the state
+     // Verify that the correct number of windows/tabs were opened
+     QList<Shell*> shells = getShells();
+     QVERIFY( !shells.isEmpty() );
+     int numDocs = 0;
+     foreach( Shell* shell, shells )
+     {
+         QTest::qWaitForWindowShown( shell );
+         numDocs += shell->m_tabs.size();
+     }
+ 
+     QCOMPARE( numDocs, paths.size() );
+     QCOMPARE( shells.size(), useTabsOpen ? 1 : paths.size() );
+     QTest::qWait( 100 );
+ 
+     // Simulate session shutdown. The actual shutdown path comes through
+     // QSessionManager XSMP handlers, then KApplication::commitData/saveState,
+     // then KMWSessionManager::commitData/saveState. Without simulating an X
+     // session manager, the best we can do here is to make a temporary Config
+     // and call KMainWindows save functions directly.
+     QTemporaryFile configFile;
+     QVERIFY( configFile.open() );
+ 
+     int numWindows = 0;
+     {   // Scope for config so that we can reconstruct from file
+         KConfig config( configFile.fileName(), KConfig::SimpleConfig );
+         foreach( Shell* shell, shells )
+         {
+             shell->savePropertiesInternal( &config, ++numWindows );
+             // Windows aren't necessarily closed on shutdown, but we'll use
+             // this as a way to trigger the destructor code, which is normally
+             // connected to the aboutToQuit signal
+             shell->close();
+         }
+     }
+ 
+     // Wait for shells to delete themselves. QTest::qWait doesn't do deferred
+     // deletions so we'll set up a full event loop to do that.
+     QEventLoop eventLoop;
+     QTimer::singleShot( 100, &eventLoop, SLOT(quit()) );
 -    eventLoop.exec( QEventLoop::AllEvents | QEventLoop::DeferredDeletion );
++    eventLoop.exec( QEventLoop::AllEvents );
+     shells = getShells();
+     QVERIFY( shells.isEmpty() );
+ 
+     Okular::Settings::self()->setShellOpenFileInTabs( useTabsRestore );
+ 
+     // Simulate session restore. We can't call KMainWindow::restore() directly
+     // because it asks for info from the session manager, which doesn't know
+     // about our temporary config. But the logic here mostly mirrors restore().
+     KConfig config( configFile.fileName(), KConfig::SimpleConfig );
+     for( int i = 1; i <= numWindows; ++i )
+     {
+         Shell* shell = new Shell;
+         shell->readPropertiesInternal( &config, i );
+         shell->show();
+     }
+ 
+     // Verify that the restore state is reasonable
+     shells = getShells();
+     QVERIFY( !shells.isEmpty() );
+     numDocs = 0;
+     foreach( Shell* shell, shells )
+     {
+         QTest::qWaitForWindowShown( shell );
+         numDocs += shell->m_tabs.size();
+     }
+ 
+     QCOMPARE( numDocs, paths.size() );
+     QCOMPARE( shells.size(), useTabsRestore ? numWindows : paths.size() );
+ }
  
 -QTEST_KDEMAIN( MainShellTest, GUI )
 +QTEST_MAIN( MainShellTest )
  #include "mainshelltest.moc"
diff --cc part.h
index 3abdbb5,9eebdb2..11642db
--- a/part.h
+++ b/part.h
@@@ -157,8 -157,9 +157,9 @@@ class OKULARPART_EXPORT Part : public K
          void openSourceReference(const QString& absFileName, int line, int column);
          void viewerMenuStateChange(bool enabled);
          void enableCloseAction(bool enable);
 -        void mimeTypeChanged(KMimeType::Ptr mimeType);
 -        void urlsDropped( const KUrl::List& urls );
 +        void mimeTypeChanged(QMimeType mimeType);
 +        void urlsDropped( const QList<QUrl>& urls );
+         void fitWindowToPage( const QSize& pageViewPortSize, const QSize& pageSize );
  
      protected:
          // reimplemented from KParts::ReadWritePart
@@@ -233,8 -232,10 +232,10 @@@
          void warningMessage( const QString &message, int duration = -1 );
          void noticeMessage( const QString &message, int duration = -1 );
  
+         void moveSplitter( const int sideWidgetSize );
+ 
      private:
 -        Document::OpenResult doOpenFile(const KMimeType::Ptr &mime, const QString &fileNameToOpen, bool *isCompressedFile);
 +        Document::OpenResult doOpenFile(const QMimeType &mime, const QString &fileNameToOpen, bool *isCompressedFile);
  
          void setupViewerActions();
          void setViewerShortcuts();
diff --cc shell/shell.cpp
index 7c8c164,7355968..6bb89c5
--- a/shell/shell.cpp
+++ b/shell/shell.cpp
@@@ -328,11 -338,19 +337,19 @@@ void Shell::saveProperties(KConfigGrou
  
  void Shell::readProperties(const KConfigGroup &group)
  {
-   // the 'config' object points to the session managed
-   // config file.  this function is automatically called whenever
-   // the app is being restored.  read in here whatever you wrote
-   // in 'saveProperties'
-     emit restoreDocument(group);
+     // Reopen documents based on saved settings
+     QStringList urls = group.readPathEntry( SESSION_URL_KEY, QStringList() );
+ 
+     while( !urls.isEmpty() )
+     {
 -        openUrl( urls.takeFirst() );
++        openUrl( QUrl(urls.takeFirst()) );
+     }
+ 
+     int desiredTab = group.readEntry<int>( SESSION_TAB_KEY, 0 );
+     if( desiredTab < m_tabs.size() )
+     {
+         setActiveTab( desiredTab );
+     }
  }
  
  QStringList Shell::fileFormats() const
@@@ -553,12 -565,12 +565,12 @@@ void Shell::applyOptionsToPart( QObject
  
  void Shell::connectPart( QObject* part )
  {
-     connect( this, SIGNAL(restoreDocument(KConfigGroup)), part, SLOT(restoreDocument(KConfigGroup)));
-     connect( this, SIGNAL(saveDocumentRestoreInfo(KConfigGroup&)), part, SLOT(saveDocumentRestoreInfo(KConfigGroup&)));
+     connect( this, SIGNAL(moveSplitter(int)), part, SLOT(moveSplitter(int)) );
      connect( part, SIGNAL(enablePrintAction(bool)), this, SLOT(setPrintEnabled(bool)));
      connect( part, SIGNAL(enableCloseAction(bool)), this, SLOT(setCloseEnabled(bool)));
 -    connect( part, SIGNAL(mimeTypeChanged(KMimeType::Ptr)), this, SLOT(setTabIcon(KMimeType::Ptr)));
 -    connect( part, SIGNAL(urlsDropped(KUrl::List)), this, SLOT(handleDroppedUrls(KUrl::List)) );
 +    connect( part, SIGNAL(mimeTypeChanged(QMimeType)), this, SLOT(setTabIcon(QMimeType)));
 +    connect( part, SIGNAL(urlsDropped(QList<QUrl>)), this, SLOT(handleDroppedUrls(QList<QUrl>)) );
+     connect( part, SIGNAL(fitWindowToPage(QSize,QSize)), this, SLOT(slotFitWindowToPage(QSize,QSize)) );
  }
  
  void Shell::print()
diff --cc shell/shell.h
index bc1a35d,fea80ac..f345cf3
--- a/shell/shell.h
+++ b/shell/shell.h
@@@ -70,10 -67,8 +70,8 @@@ public
    bool isValid() const;
  
  public slots:
-   void slotQuit();
-   
    Q_SCRIPTABLE Q_NOREPLY void tryRaise();
 -  Q_SCRIPTABLE bool openDocument( const QString& url, const QString &serializedOptions = QString() );
 +  Q_SCRIPTABLE bool openDocument(const QUrl &url, const QString &serializedOptions = QString() );
    Q_SCRIPTABLE bool canOpenDocs( int numDocs, int desktop );
  
  protected:
diff --cc ui/pageview.cpp
index 9951dac,49d6f8a..ff221c2
--- a/ui/pageview.cpp
+++ b/ui/pageview.cpp
@@@ -218,12 -209,13 +218,13 @@@ public
      KActionMenu * aViewMode;
      KToggleAction * aViewContinuous;
      QAction * aPrevAction;
 -    KAction * aToggleForms;
 -    KAction * aSpeakDoc;
 -    KAction * aSpeakPage;
 -    KAction * aSpeakStop;
 +    QAction * aToggleForms;
 +    QAction * aSpeakDoc;
 +    QAction * aSpeakPage;
 +    QAction * aSpeakStop;
      KActionCollection * actionCollection;
      QActionGroup * mouseModeActionGroup;
 -    KAction * aFitWindowToPage;
++    QAction * aFitWindowToPage;
  
      int setting_viewCols;
  
@@@ -507,8 -492,14 +508,14 @@@ void PageView::setupViewerActions( KAct
      ac->addAction("view_auto_fit", d->aZoomAutoFit );
      connect( d->aZoomAutoFit, SIGNAL(toggled(bool)), SLOT(slotAutoFitToggled(bool)) );
  
 -    d->aFitWindowToPage = new KAction(KIcon( "zoom-fit-width" ), i18n("Fit Wi&ndow to Page"), this);
++    d->aFitWindowToPage = new QAction(QIcon::fromTheme( "zoom-fit-width" ), i18n("Fit Wi&ndow to Page"), this);
+     d->aFitWindowToPage->setEnabled( Okular::Settings::viewMode() == (int)Okular::Settings::EnumViewMode::Single );
+     d->aFitWindowToPage->setShortcut( QKeySequence(Qt::CTRL + Qt::Key_J) );
+     ac->addAction( "fit_window_to_page", d->aFitWindowToPage );
+     connect( d->aFitWindowToPage, SIGNAL(triggered()), this, SLOT(slotFitWindowToPage()) );
+ 
      // View-Layout actions
 -    d->aViewMode = new KActionMenu( KIcon( "view-split-left-right" ), i18n( "&View Mode" ), this );
 +    d->aViewMode = new KActionMenu( QIcon::fromTheme( "view-split-left-right" ), i18n( "&View Mode" ), this );
      d->aViewMode->setDelayed( false );
  #define ADD_VIEWMODE_ACTION( text, name, id ) \
  do { \
@@@ -1100,9 -1082,10 +1107,11 @@@ void PageView::updateActionState( bool 
          d->aSpeakDoc->setEnabled( enablettsactions );
          d->aSpeakPage->setEnabled( enablettsactions );
      }
 +#endif
      if (d->aMouseMagnifier)
          d->aMouseMagnifier->setEnabled(d->document->supportsTiles());
+     if ( d->aFitWindowToPage )
+         d->aFitWindowToPage->setEnabled( haspages && !Okular::Settings::viewContinuous() );
  }
  
  bool PageView::areSourceLocationsShownGraphically() const
@@@ -5095,8 -5081,28 +5115,28 @@@ void PageView::slotToggleChangeColors(
      viewport()->update();
  }
  
+ void PageView::slotFitWindowToPage()
+ {
+     PageViewItem currentPageItem = NULL;
+     QSize viewportSize = viewport()->size();
+     foreach ( const PageViewItem * pageItem, d->items )
+     {
+         if ( pageItem->isVisible() )
+         {
+             currentPageItem = *pageItem;
+             break;
+         }
+     }
+     const QSize pageSize = QSize( currentPageItem.uncroppedWidth() + kcolWidthMargin, currentPageItem.uncroppedHeight() + krowHeightMargin );
+     if ( verticalScrollBar()->isVisible() )
+         viewportSize.setWidth( viewportSize.width() + verticalScrollBar()->width() );
+     if ( horizontalScrollBar()->isVisible() )
+         viewportSize.setHeight( viewportSize.height() + horizontalScrollBar()->height() );
+     emit fitWindowToPage( viewportSize, pageSize );
+ }
+ 
  //END private SLOTS
  
 -#include "pageview.moc"
 +#include "moc_pageview.cpp"
  
  /* kate: replace-tabs on; indent-width 4; */
diff --cc ui/sidebar.h
index 2c4bfbe,2630166..6b38fa3
--- a/ui/sidebar.h
+++ b/ui/sidebar.h
@@@ -41,8 -42,10 +41,10 @@@ class Sidebar : public QWidge
          void setCollapsed( bool collapsed );
          bool isCollapsed() const;
  
+ 	void moveSplitter( int sideWidgetSize );
+ 
      signals:
 -        void urlsDropped( const KUrl::List& urls );
 +        void urlsDropped( const QList<QUrl>& urls );
  
      protected:
          void dragEnterEvent( QDragEnterEvent* event );


More information about the kde-doc-english mailing list