[vlmc-devel] [PATCH] Refined the flow of the construction of Core.

Yikai Lu luyikei.qmltu at gmail.com
Sun Mar 6 06:37:39 CET 2016


1, remove AutomaticBackup
2, make Workspace, RecentProjects, and Project independent of Settings.
(if you want to pass Settings to them, just *add* constructor.)
3, fix signal/slots problem.
4, make SettingsValue emit a slgnal, change(), when it is created.
5, add
        QString         projectName() const;
        QString         projectPath() const;
to Project.
6, Keep QTimer from running with an interval of 0 by using qMax.
---
 src/Main/Core.cpp               | 38 ++++++++++++-------
 src/Project/AutomaticBackup.cpp | 84 -----------------------------------------
 src/Project/AutomaticBackup.h   | 52 -------------------------
 src/Project/Project.cpp         | 57 +++++++++++++++++++++++-----
 src/Project/Project.h           | 18 ++++++---
 src/Project/RecentProjects.cpp  | 18 +--------
 src/Project/RecentProjects.h    |  3 +-
 src/Project/Workspace.cpp       |  6 +--
 src/Project/Workspace.h         |  2 +-
 src/Settings/SettingValue.cpp   |  1 +
 10 files changed, 90 insertions(+), 189 deletions(-)
 delete mode 100644 src/Project/AutomaticBackup.cpp
 delete mode 100644 src/Project/AutomaticBackup.h

diff --git a/src/Main/Core.cpp b/src/Main/Core.cpp
index d1fac98..bcd576d 100644
--- a/src/Main/Core.cpp
+++ b/src/Main/Core.cpp
@@ -36,7 +36,6 @@
 #include <Backend/IBackend.h>
 #include <EffectsEngine/EffectsEngine.h>
 #include "Library/Library.h"
-#include "Project/AutomaticBackup.h"
 #include "Project/RecentProjects.h"
 #include "Project/Workspace.h"
 #include "Renderer/WorkflowRenderer.h"
@@ -52,22 +51,28 @@ Core::Core()
     m_logger = new VlmcLogger;
 
     createSettings();
-    m_recentProjects = new RecentProjects( m_settings );
-    m_automaticBackup = new AutomaticBackup( m_settings );
-    m_workspace = new Workspace( m_settings );
+    m_workspace = new Workspace;
     m_workflow = new MainWorkflow;
     m_workflowRenderer = new WorkflowRenderer( Backend::getBackend(), m_workflow );
     m_undoStack = new QUndoStack;
     m_library = new Library( m_workspace );
     m_currentProject = new Project;
+    m_recentProjects = new RecentProjects;
 
     connect( m_undoStack, SIGNAL( cleanChanged( bool ) ), m_currentProject, SLOT( cleanChanged( bool ) ) );
     connect( m_currentProject, SIGNAL( projectSaved() ), m_undoStack, SLOT( setClean() ) );
     connect( m_library, SIGNAL( cleanStateChanged( bool ) ), m_currentProject, SLOT( libraryCleanChanged( bool ) ) );
+    connect( m_currentProject, SIGNAL( projectLoaded( QString, QString ) ),
+             m_recentProjects, SLOT( projectLoaded( QString, QString ) ) );
 
-    //FIXME: Pass the project through the constructor since it doesn't change anymore
-    m_automaticBackup->setProject( m_currentProject );
-    m_recentProjects->setProject( m_currentProject );
+    connect( m_settings->value( "vlmc/AutomaticBackup" ), SIGNAL( changed( QVariant ) ),
+             m_currentProject, SLOT( autoSaveEnabledChanged( QVariant ) ) );
+    connect( m_settings->value( "vlmc/AutomaticBackupInterval" ), SIGNAL( changed( QVariant ) ), m_currentProject,
+             SLOT( autoSaveIntervalChanged( QVariant ) ) );
+    connect( m_settings->value( "private/RecentsProjects" ), SIGNAL( changed( QVariant ) ),
+              m_recentProjects, SLOT( loadRecentProjects( QVariant ) ) );
+    connect( m_settings->value( "vlmc/Workspace" ), SIGNAL( changed( QVariant ) ),
+             m_workspace, SLOT( workspaceChanged( QVariant ) ) );
 }
 
 Core::~Core()
@@ -79,7 +84,6 @@ Core::~Core()
     delete m_workflow;
     delete m_currentProject;
     delete m_workspace;
-    delete m_automaticBackup;
     delete m_settings;
     delete m_logger;
     delete m_effectsEngine;
@@ -102,6 +106,18 @@ Core::createSettings()
                                     QT_TRANSLATE_NOOP( "Settings", "VLMC's workspace location" ),
                                     SettingValue::Nothing );
     m_settings->createVar( SettingValue::Bool, "private/FirstLaunchDone", false, "", "", SettingValue::Private );
+    m_settings->createVar( SettingValue::Bool, "vlmc/AutomaticBackup", false,
+                                     QT_TRANSLATE_NOOP( "PreferenceWidget", "Automatic save" ),
+                                     QT_TRANSLATE_NOOP( "PreferenceWidget", "When this option is activated,"
+                                                         "VLMC will automatically save your project "
+                                                         "at a specified interval" ), SettingValue::Nothing );
+    m_settings->createVar( SettingValue::Int, "vlmc/AutomaticBackupInterval", 5,
+                                    QT_TRANSLATE_NOOP( "PreferenceWidget", "Automatic save interval" ),
+                                    QT_TRANSLATE_NOOP( "PreferenceWidget", "This is the interval that VLMC will wait "
+                                                        "between two automatic save" ), SettingValue::Nothing );
+    m_settings->createVar( SettingValue::String, "private/RecentsProjects", "",
+                                                "", "", SettingValue::Private );
+    m_settings->createVar( SettingValue::String, "vlmc/Workspace", "", "", "", SettingValue::Private );
 }
 
 Backend::IBackend*
@@ -128,12 +144,6 @@ Core::recentProjects()
     return m_recentProjects;
 }
 
-AutomaticBackup*
-Core::automaticBackup()
-{
-    return m_automaticBackup;
-}
-
 bool
 Core::loadProject(const QString& fileName)
 {
diff --git a/src/Project/AutomaticBackup.cpp b/src/Project/AutomaticBackup.cpp
deleted file mode 100644
index 5018a91..0000000
--- a/src/Project/AutomaticBackup.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-/*****************************************************************************
- * AutomaticBackup.cpp: Handles the project automatic backup & associated settings
- *****************************************************************************
- * Copyright (C) 2008-2014 VideoLAN
- *
- * Authors: Hugo Beauzée-Luyssen <hugo at beauzee.fr>
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-#include <QTimer>
-
-#include "AutomaticBackup.h"
-#include "Project.h"
-#include "Settings/Settings.h"
-
-AutomaticBackup::AutomaticBackup( Settings* vlmcSettings, QObject *parent )
-    : QObject(parent)
-    , m_vlmcSettings( vlmcSettings )
-{
-    m_timer = new QTimer( this );
-	SettingValue* autoBackup = m_vlmcSettings->createVar( SettingValue::Bool, "vlmc/AutomaticBackup", false,
-									 QT_TRANSLATE_NOOP( "PreferenceWidget", "Automatic save" ),
-									 QT_TRANSLATE_NOOP( "PreferenceWidget", "When this option is activated,"
-														 "VLMC will automatically save your project "
-														 "at a specified interval" ), SettingValue::Nothing );
-	SettingValue* interval = m_vlmcSettings->createVar( SettingValue::Int, "vlmc/AutomaticBackupInterval", 5,
-									QT_TRANSLATE_NOOP( "PreferenceWidget", "Automatic save interval" ),
-									QT_TRANSLATE_NOOP( "PreferenceWidget", "This is the interval that VLMC will wait "
-														"between two automatic save" ), SettingValue::Nothing );
-
-	connect( autoBackup, SIGNAL( changed( QVariant ) ), this, SLOT( automaticSaveEnabledChanged( QVariant ) ) );
-	connect( interval, SIGNAL( changed( QVariant ) ), this, SLOT( automaticSaveIntervalChanged( QVariant ) ) );
-}
-
-AutomaticBackup::~AutomaticBackup()
-{
-    delete m_timer;
-}
-
-void
-AutomaticBackup::setProject( Project* projectManager )
-{
-    m_timer->disconnect();
-    connect( m_timer, SIGNAL( timeout() ), projectManager, SLOT(autoSaveRequired() ) );
-    connect( projectManager, SIGNAL( destroyed() ), m_timer, SLOT( stop() ) );
-    m_timer->start();
-}
-
-void
-AutomaticBackup::automaticSaveEnabledChanged( const QVariant& val )
-{
-    bool    enabled = val.toBool();
-
-    if ( enabled == true )
-    {
-        int interval = m_vlmcSettings->value( "vlmc/AutomaticBackupInterval" )->get().toInt();
-        m_timer->start( interval * 1000 * 60 );
-    }
-    else
-        m_timer->stop();
-}
-
-void
-AutomaticBackup::automaticSaveIntervalChanged( const QVariant& val )
-{
-    bool enabled = m_vlmcSettings->value( "vlmc/AutomaticBackup" )->get().toBool();
-
-    if ( enabled == false )
-        return ;
-    m_timer->start( val.toInt() * 1000 * 60 );
-}
diff --git a/src/Project/AutomaticBackup.h b/src/Project/AutomaticBackup.h
deleted file mode 100644
index bbfdc5b..0000000
--- a/src/Project/AutomaticBackup.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*****************************************************************************
- * AutomaticBackup.h: Handles the project automatic backup & associated settings
- *****************************************************************************
- * Copyright (C) 2008-2014 VideoLAN
- *
- * Authors: Hugo Beauzée-Luyssen <hugo at beauzee.fr>
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-#ifndef AUTOMATICBACKUP_H
-#define AUTOMATICBACKUP_H
-
-class QTimer;
-
-class Project;
-class Settings;
-
-#include <QObject>
-
-class AutomaticBackup : public QObject
-{
-    Q_OBJECT
-
-    public:
-        explicit AutomaticBackup( Settings* vlmcSettings, QObject *parent = 0 );
-        virtual ~AutomaticBackup();
-        void    setProject( Project* projectManager );
-
-    private:
-        Settings*   m_vlmcSettings;
-        QTimer*     m_timer;
-
-    private slots:
-        void            automaticSaveEnabledChanged( const QVariant& enabled );
-        void            automaticSaveIntervalChanged( const QVariant& interval );
-
-};
-
-#endif // AUTOMATICBACKUP_H
diff --git a/src/Project/Project.cpp b/src/Project/Project.cpp
index af3eeaf..e2202d9 100644
--- a/src/Project/Project.cpp
+++ b/src/Project/Project.cpp
@@ -25,8 +25,8 @@
 #include <QFile>
 #include <QFileInfo>
 #include <QDomDocument>
+#include <QTimer>
 
-#include "AutomaticBackup.h"
 #include "Backend/IBackend.h"
 #include "Project.h"
 #include "RecentProjects.h"
@@ -41,13 +41,15 @@
 
 const QString   Project::unNamedProject = Project::tr( "Untitled Project" );
 const QString   Project::backupSuffix = "~";
+const int       Project::minInterval = 5 * 1000 * 60;
 
 Project::Project()
     : m_projectFile( nullptr )
     , m_isClean( true )
     , m_libraryCleanState( true )
+    , m_timer( new QTimer( this ) )
+    , m_settings( new Settings( QString() ) )
 {
-    m_settings = new Settings( QString() );
     initSettings();
 }
 
@@ -55,6 +57,7 @@ Project::~Project()
 {
     delete m_projectFile;
     delete m_settings;
+    delete m_timer;
 }
 
 Settings*
@@ -116,8 +119,7 @@ Project::load( const QString& path )
     }
 
     m_settings->load( doc );
-    auto projectName = m_settings->value( "vlmc/ProjectName" )->get().toString();
-    emit projectLoading( projectName );
+    emit projectLoading( projectName() );
     Core::getInstance()->library()->load( doc );
     Core::getInstance()->workflow()->load( doc );
     Core::getInstance()->workflowRenderer()->load( doc );
@@ -125,7 +127,7 @@ Project::load( const QString& path )
     emit cleanStateChanged( m_isClean );
     if ( autoBackupFound == false )
         m_projectFile->close();
-    emit projectLoaded( projectName );
+    emit projectLoaded( projectName(), projectPath() );
     if ( outdatedBackupFound == true )
         emit outdatedBackupFileFound();
     if ( autoBackupFound == true )
@@ -158,6 +160,18 @@ Project::newProject( const QString& projectName, const QString& projectPath )
     save();
 }
 
+QString
+Project::projectName() const
+{
+    return m_settings->value( "vlmc/ProjectName" )->get().toString();
+}
+
+QString
+Project::projectPath() const
+{
+    return m_projectFile->fileName();
+}
+
 void
 Project::initSettings()
 {
@@ -190,11 +204,14 @@ Project::initSettings()
                                                              QT_TRANSLATE_NOOP("PreferenceWidget", "Number of audio channels" ),
                                                              SettingValue::Clamped );
     audioChannel->setLimits( 2, 2 );
-	SettingValue* pName = m_settings->createVar( SettingValue::String, "vlmc/ProjectName", unNamedProject,
-									QT_TRANSLATE_NOOP( "PreferenceWidget", "Project name" ),
-									QT_TRANSLATE_NOOP( "PreferenceWidget", "The project name" ),
-									SettingValue::NotEmpty );
+    SettingValue* pName = m_settings->createVar( SettingValue::String, "vlmc/ProjectName", unNamedProject,
+                                    QT_TRANSLATE_NOOP( "PreferenceWidget", "Project name" ),
+                                    QT_TRANSLATE_NOOP( "PreferenceWidget", "The project name" ),
+                                    SettingValue::NotEmpty );
     connect( pName, SIGNAL( changed( QVariant ) ), this, SIGNAL( projectUpdated( QVariant ) ) );
+
+    connect( m_timer, SIGNAL( timeout() ), this, SLOT(autoSaveRequired() ) );
+    connect( this, SIGNAL( destroyed() ), m_timer, SLOT( stop() ) );
 }
 
 void
@@ -299,3 +316,25 @@ Project::autoSaveRequired()
         return ;
     saveProject( m_projectFile->fileName() + Project::backupSuffix );
 }
+
+void
+Project::autoSaveEnabledChanged(const QVariant &enabled)
+{
+    if ( enabled.toBool() == true )
+    {
+        int interval = Core::getInstance()->settings()->value( "vlmc/AutomaticBackupInterval" )->get().toInt();
+        m_timer->start( qMax( minInterval, interval * 1000 * 60 ) );
+    }
+    else
+        m_timer->stop();
+}
+
+void
+Project::autoSaveIntervalChanged(const QVariant &interval)
+{
+    bool enabled = Core::getInstance()->settings()->value( "vlmc/AutomaticBackup" )->get().toBool();
+
+    if ( enabled == false )
+        return ;
+    m_timer->start( qMax( minInterval, interval.toInt() * 1000 * 60 ) );
+}
diff --git a/src/Project/Project.h b/src/Project/Project.h
index 0c8b53a..9301681 100644
--- a/src/Project/Project.h
+++ b/src/Project/Project.h
@@ -33,12 +33,13 @@ class QDomDocument;
 class QFile;
 class QString;
 class QXmlStreamWriter;
+class QTimer;
 
-class AutomaticBackup;
 class Library;
 class MainWorkflow;
 class ProjectManager;
 class Settings;
+class SettingValue;
 
 class Project : public QObject
 {
@@ -46,9 +47,11 @@ class Project : public QObject
     public:
         static const QString            unNamedProject;
         static const QString            backupSuffix;
+        static const int                minInterval;
 
     public:
         Q_DISABLE_COPY( Project );
+
         Project();
 
         virtual ~Project();
@@ -56,6 +59,8 @@ class Project : public QObject
         void            save();
         void            saveAs(const QString& fileName);
         void            newProject( const QString& projectName, const QString& projectPath );
+        QString         projectName() const;
+        QString         projectPath() const;
         /**
          *  @brief          Check for a project backup file, and load the appropriate file,
          *                  according to the user input.
@@ -84,6 +89,8 @@ class Project : public QObject
         void                cleanChanged( bool val );
         void                libraryCleanChanged( bool val );
         void                autoSaveRequired();
+        void                autoSaveEnabledChanged( const QVariant& enabled );
+        void                autoSaveIntervalChanged( const QVariant& interval );
 
     signals:
         /**
@@ -91,7 +98,7 @@ class Project : public QObject
          *      - The project name has changed
          *      - The revision (if activated) has changed
          */
-        void                projectUpdated( const QString& projectName );
+        void                projectUpdated( const QVariant& projectName );
 
         /**
          *  \brief      Used to signal that the project has been saved.
@@ -108,25 +115,26 @@ class Project : public QObject
         void                cleanStateChanged( bool value );
 
         void                projectLoading( const QString& projectName );
-        void                projectLoaded( const QString& projectName );
+        void                projectLoaded(const QString& projectName, const QString& projectPath );
         void                projectClosed();
         void                backupProjectLoaded();
         void                outdatedBackupFileFound();
 
-private:
+    private:
         bool                loadWorkflow( const QDomDocument& root );
 
     private:
         QFile*              m_projectFile;
         bool                m_isClean;
         bool                m_libraryCleanState;
+        QTimer*             m_timer;
 
     ///////////////////////////////////
     // Dependent components part below:
     public:
         Settings*           settings();
 
-    private:
+private:
         Settings*           m_settings;
 };
 
diff --git a/src/Project/RecentProjects.cpp b/src/Project/RecentProjects.cpp
index 080950d..5efd97f 100644
--- a/src/Project/RecentProjects.cpp
+++ b/src/Project/RecentProjects.cpp
@@ -28,25 +28,9 @@
 #include "Settings/Settings.h"
 #include "Tools/VlmcDebug.h"
 
-RecentProjects::RecentProjects( Settings* vlmcSettings, QObject *parent )
+RecentProjects::RecentProjects( QObject *parent )
     : QObject(parent)
-    , m_settings( vlmcSettings )
-    , m_project( NULL )
 {
-	SettingValue* recentProjects = vlmcSettings->createVar( SettingValue::String, "private/RecentsProjects", "",
-                                                "", "", SettingValue::Private );
-
-	connect( recentProjects, SIGNAL( changed( QVariant ) ), this, SLOT( loadRecentProjects( QVariant ) ) );
-}
-
-void
-RecentProjects::setProject( Project* project )
-{
-    if ( m_project != NULL )
-        disconnect( m_project, SIGNAL( projectLoaded( QString, QString ) ) );
-    m_project = project;
-    connect( project, SIGNAL( projectLoaded( QString, QString ) ),
-             this, SLOT( projectLoaded( QString, QString ) ) );
 }
 
 void
diff --git a/src/Project/RecentProjects.h b/src/Project/RecentProjects.h
index 4bdf3e2..3be23a1 100644
--- a/src/Project/RecentProjects.h
+++ b/src/Project/RecentProjects.h
@@ -40,9 +40,8 @@ class RecentProjects : public QObject
         };
         typedef QList<RecentProject>      List;
 
-        explicit RecentProjects(Settings* vlmcSettings, QObject *parent = 0 );
+        explicit RecentProjects( QObject *parent = 0 );
 
-        void            setProject(Project* projectManager );
         void            remove( const QString& projectFile );
         const List&     list() const;
 
diff --git a/src/Project/Workspace.cpp b/src/Project/Workspace.cpp
index 0de8e67..b75e7c7 100644
--- a/src/Project/Workspace.cpp
+++ b/src/Project/Workspace.cpp
@@ -40,13 +40,9 @@
 
 const QString   Workspace::workspacePrefix = "workspace://";
 
-Workspace::Workspace(Settings *settings)
+Workspace::Workspace()
     : m_copyInProgress( false )
 {
-    settings->createVar( SettingValue::String, "vlmc/Workspace", "", "", "", SettingValue::Private );
-    SettingValue* workspaceDir = settings->value( "vlmc/Workspace" );
-    connect(workspaceDir, SIGNAL( changed( QVariant ) ),
-            this, SLOT( workspaceChanged( QVariant ) ) );
     // Wait for the SettingValue to be loaded.
     m_mediasToCopyMutex = new QMutex;
 #ifdef WITH_GUI
diff --git a/src/Project/Workspace.h b/src/Project/Workspace.h
index 5a8d695..2dde36a 100644
--- a/src/Project/Workspace.h
+++ b/src/Project/Workspace.h
@@ -42,7 +42,7 @@ class Workspace : public QObject, public ErrorHandler
     public:
         static const QString        workspacePrefix;
 
-        Workspace( Settings* settings );
+        Workspace();
         ~Workspace();
         bool                        isInWorkspace( const QString &path );
         bool                        isInWorkspace( const Media *media );
diff --git a/src/Settings/SettingValue.cpp b/src/Settings/SettingValue.cpp
index 7f35926..948c30c 100644
--- a/src/Settings/SettingValue.cpp
+++ b/src/Settings/SettingValue.cpp
@@ -32,6 +32,7 @@ SettingValue::SettingValue( const QString& key, SettingValue::Type type, const Q
         m_type( type ),
         m_flags( flags )
 {
+    emit changed( m_val );
 }
 
 void
-- 
1.9.1



More information about the Vlmc-devel mailing list