[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdepim/akregator/src
From:       Frank Osterfeld <frank.osterfeld () kdemail ! net>
Date:       2010-02-16 22:27:55
Message-ID: 1266359275.923695.10744.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1091469 by osterfeld:

Restore open tabs after crash
Patch by Steffen Hanikel
BUG:179931

 M  +87 -0     akregator_part.cpp  
 M  +32 -0     akregator_part.h  
 M  +10 -0     mainwidget.cpp  
 M  +2 -0      mainwidget.h  
 M  +0 -28     mainwindow.cpp  
 M  +0 -11     mainwindow.h  


--- trunk/KDE/kdepim/akregator/src/akregator_part.cpp #1091468:1091469
@@ -164,6 +164,7 @@
     : inherited(parent)
     , m_standardListLoaded(false)
     , m_shuttingDown(false)
+    , m_doCrashSave(true)
     , m_backedUpList(false)
     , m_mainWidget(0)
     , m_storage(0)
@@ -253,6 +254,9 @@
     Syndication::FileRetriever::setUserAgent( useragent );
 
     loadPlugins( QLatin1String("extension") ); // FIXME: also unload them!
+
+    if (!readCrashProperties())
+            autoReadProperties();
 }
 
 void Part::loadPlugins( const QString& type )
@@ -275,6 +279,7 @@
 
 void Part::slotOnShutdown()
 {
+    autoSaveProperties();
     m_shuttingDown = true;
     m_autosaveTimer->stop();
     saveSettings();
@@ -691,6 +696,88 @@
     return true;
 }
 
+void Part::clearCrashProperties()
+{
+    if (!m_doCrashSave)
+        return;
+    KConfig config("crashed", KConfig::SimpleConfig,
+        "appdata");
+    KConfigGroup configGroup(&config, "Part");
+    configGroup.writeEntry("crashed", false);
+}
+
+
+void Part::saveCrashProperties()
+{
+    if (!m_doCrashSave)
+        return;
+    KConfig config("crashed", KConfig::SimpleConfig,
+        "appdata");
+    KConfigGroup configGroup(&config, "Part");
+    configGroup.deleteGroup();
+
+    configGroup.writeEntry("crashed", true);
+
+    saveProperties(configGroup);
+}
+
+bool Part::readCrashProperties()
+{
+    KConfig config("crashed", KConfig::SimpleConfig,
+        "appdata");
+    KConfigGroup configGroup(&config, "Part");
+
+    if (!configGroup.readEntry("crashed", false))
+        return false;
+
+    const int choice = KMessageBox::questionYesNoCancel( m_mainWidget,
+            i18n("Akregator did not close correctly. Would you like to restore the \
previous session?"), +            i18n("Restore Session?"),
+            KGuiItem(i18n("Restore Session"), "window-new"),
+            KGuiItem(i18n("Do Not Restore"), "dialog-close"),
+            KGuiItem(i18n("Ask Me Later"), "chronometer"),
+            "Restore session when akregator didn't close correctly" );
+    switch ( choice ) { 
+    case KMessageBox::Yes:
+        readProperties(configGroup);
+        return true;
+    case KMessageBox::No:
+        clearCrashProperties();
+        return false;
+    default:
+        break;
+    }
+    m_doCrashSave = false;
+    return false;
+}
+
+void Part::slotAutoSave()
+{
+    saveCrashProperties();
+}
+
+void Part::autoSaveProperties()
+{
+    KConfig config("autosaved", KConfig::SimpleConfig, "appdata");
+    KConfigGroup configGroup(&config, "Part");
+    configGroup.deleteGroup();
+
+    saveProperties(configGroup);
+
+    clearCrashProperties();
+}
+
+void Part::autoReadProperties()
+{
+    if(kapp->isSessionRestored())
+        return;
+
+    KConfig config("autosaved", KConfig::SimpleConfig, "appdata");
+    KConfigGroup configGroup(&config, "Part");
+
+    readProperties(configGroup);
+}
+
 } // namespace Akregator
 
 #include "akregator_part.moc"
--- trunk/KDE/kdepim/akregator/src/akregator_part.h #1091468:1091469
@@ -140,6 +140,9 @@
         void showOptions();
         void showNotificationOptions();
 
+        /** Call to auto save */
+        void slotAutoSave();
+
     signals:
         void signalSettingsChanged();
 
@@ -180,6 +183,34 @@
         bool writeToTextFile( const QString& data, const QString& fname ) const;
 
 
+        /**
+         * This function ist called by the MainWindow upon restore
+         */
+        void autoReadProperties();
+
+        /**
+         * This is called when exiting akregator in order to be able to restore
+         * its state next time it starts.
+         */
+        void autoSaveProperties();
+
+        /**
+         * Saves the session in a special file, so akregator can restore the session \
in +         * case of a crash.
+         */
+        void saveCrashProperties();
+
+        /**
+         * Tries to restore the session, if akregator crashed.
+         */
+        bool readCrashProperties();
+
+        /**
+         * Clears the crash data.
+         */
+        void clearCrashProperties();
+
+
     private: // attributes
 
         class ApplyFiltersInterceptor;
@@ -187,6 +218,7 @@
         QString m_standardFeedList;
         bool m_standardListLoaded;
         bool m_shuttingDown;
+        bool m_doCrashSave;
 
         KParts::BrowserExtension *m_extension;
 
--- trunk/KDE/kdepim/akregator/src/mainwidget.cpp #1091468:1091469
@@ -171,6 +171,11 @@
     connect( Kernel::self()->frameManager(), SIGNAL(signalRequestNewFrame(int&)),
              this, SLOT( slotRequestNewFrame(int&) ) );
 
+    connect( Kernel::self()->frameManager(), \
SIGNAL(signalFrameAdded(Akregator::Frame*)), +             this, \
SLOT(slotFramesChanged())); +    connect( Kernel::self()->frameManager(), \
SIGNAL(signalFrameRemoved(int)), +             this, SLOT(slotFramesChanged()));
+
     m_tabWidget->setWhatsThis( i18n("You can view multiple articles in several open \
tabs."));  
     m_mainTab = new QWidget(this);
@@ -996,6 +1001,11 @@
         selected->setNotificationMode( true );
 }
 
+void Akregator::MainWidget::slotFramesChanged()
+{
+    // We need to wait till the frame is fully loaded
+    QMetaObject::invokeMethod( m_part, "slotAutoSave", Qt::QueuedConnection );
+}
 
 void Akregator::MainWidget::slotArticleToggleKeepFlag( bool )
 {
--- trunk/KDE/kdepim/akregator/src/mainwidget.h #1091468:1091469
@@ -230,6 +230,8 @@
         void slotFetchingStarted();
         void slotFetchingStopped();
 
+        void slotFramesChanged();
+
     private:
         void deleteExpiredArticles( const boost::shared_ptr<FeedList>& feedList );
 
--- trunk/KDE/kdepim/akregator/src/mainwindow.cpp #1091468:1091469
@@ -86,7 +86,6 @@
     KStandardAction::showMenubar( menuBar(), SLOT(setVisible(bool)), \
actionCollection());  setStandardToolBarMenuEnabled(true);
     createStandardStatusBarAction();
-    autoReadProperties();
 
     connect( KPIM::BroadcastStatus::instance(), SIGNAL( statusMsg( const QString& ) \
),  this, SLOT( slotSetStatusBarText(const QString&) ) );
@@ -192,7 +191,6 @@
 {
     if ( !kapp->sessionSaving() )
     {
-        autoSaveProperties();
         delete m_part; // delete that here instead of dtor to ensure nested \
khtmlparts are deleted before singleton objects like KHTMLPageCache  }
     return KMainWindow::queryExit();
@@ -202,7 +200,6 @@
 {
     if (TrayIcon::getInstance())
         TrayIcon::getInstance()->hide();
-    autoSaveProperties();
     kapp->quit();
 }
 
@@ -211,10 +208,7 @@
     if (kapp->sessionSaving())
         return true;
     else if (TrayIcon::getInstance() == 0 || !TrayIcon::getInstance()->isVisible() )
-    {
-        autoSaveProperties();
         return true;
-    }
 
     const QPixmap shot = TrayIcon::getInstance()->takeScreenshot();
     KTemporaryFile tmp;
@@ -244,26 +238,4 @@
     m_statusLabel->setText(text);
 }
 
-void MainWindow::autoSaveProperties()
-{
-    KConfig config("autosaved", KConfig::SimpleConfig,
-        "appdata");
-    KConfigGroup configGroup(&config, "MainWindow");
-    configGroup.deleteGroup();
-
-    saveProperties(configGroup);
-}
-
-void MainWindow::autoReadProperties()
-{
-    if(kapp->isSessionRestored())
-        return;
-
-    KConfig config("autosaved", KConfig::SimpleConfig,
-        "appdata");
-    KConfigGroup configGroup(&config, "MainWindow");
-
-    readProperties(configGroup);
-}
-
 #include "mainwindow.moc"
--- trunk/KDE/kdepim/akregator/src/mainwindow.h #1091468:1091469
@@ -103,17 +103,6 @@
     void readProperties(const KConfigGroup &);
 
     /**
-     * This is called when exiting akregator in order to be able to restore
-     * its state next time it starts.
-     */
-    void autoSaveProperties();
-
-    /**
-     * This function is called when starting akregator and it will restore
-     * the state akregator the last time it was closed if possible.
-     */
-    void autoReadProperties();
-    /**
      *  Reimplemented to save settings
      */
     bool queryExit();


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic