1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2015 The Qt Company Ltd. 4 ** Contact: http://www.qt.io/licensing/ 5 ** 6 ** This file is part of the demonstration applications of the Qt Toolkit. 7 ** 8 ** $QT_BEGIN_LICENSE:LGPL21$ 9 ** Commercial License Usage 10 ** Licensees holding valid commercial Qt licenses may use this file in 11 ** accordance with the commercial license agreement provided with the 12 ** Software or, alternatively, in accordance with the terms contained in 13 ** a written agreement between you and The Qt Company. For licensing terms 14 ** and conditions see http://www.qt.io/terms-conditions. For further 15 ** information use the contact form at http://www.qt.io/contact-us. 16 ** 17 ** GNU Lesser General Public License Usage 18 ** Alternatively, this file may be used under the terms of the GNU Lesser 19 ** General Public License version 2.1 or version 3 as published by the Free 20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and 21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the 22 ** following information to ensure the GNU Lesser General Public License 23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and 24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. 25 ** 26 ** As a special exception, The Qt Company gives you certain additional 27 ** rights. These rights are described in The Qt Company LGPL Exception 28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. 29 ** 30 ** $QT_END_LICENSE$ 31 ** 32 ****************************************************************************/ 33 34 #include "autosaver.h" 35 36 #include <QtCore/QDir> 37 #include <QtCore/QCoreApplication> 38 #include <QtCore/QMetaObject> 39 #include <QtDebug> 40 41 #define AUTOSAVE_IN 1000 * 3 // seconds 42 #define MAXWAIT 1000 * 15 // seconds 43 AutoSaver(QObject * parent)44AutoSaver::AutoSaver(QObject *parent) : QObject(parent) 45 { 46 Q_ASSERT(parent); 47 } 48 ~AutoSaver()49AutoSaver::~AutoSaver() 50 { 51 if (m_timer.isActive()) 52 qWarning() << "AutoSaver: still active when destroyed, changes not saved."; 53 } 54 changeOccurred()55void AutoSaver::changeOccurred() 56 { 57 if (m_firstChange.isNull()) 58 m_firstChange.start(); 59 60 if (m_firstChange.elapsed() > MAXWAIT) { 61 saveIfNeccessary(); 62 } else { 63 m_timer.start(AUTOSAVE_IN, this); 64 } 65 } 66 timerEvent(QTimerEvent * event)67void AutoSaver::timerEvent(QTimerEvent *event) 68 { 69 if (event->timerId() == m_timer.timerId()) { 70 saveIfNeccessary(); 71 } else { 72 QObject::timerEvent(event); 73 } 74 } 75 saveIfNeccessary()76void AutoSaver::saveIfNeccessary() 77 { 78 if (!m_timer.isActive()) 79 return; 80 m_timer.stop(); 81 m_firstChange = QTime(); 82 if (!QMetaObject::invokeMethod(parent(), "save", Qt::DirectConnection)) { 83 qWarning() << "AutoSaver: error invoking slot save() on parent"; 84 } 85 } 86 87