diff --git a/include/MainWindow.h b/include/MainWindow.h index 31089f9ed..8a93739ff 100644 --- a/include/MainWindow.h +++ b/include/MainWindow.h @@ -30,6 +30,7 @@ #include #include +#include "ConfigManager.h" #include "SubWindow.h" class QAction; @@ -81,11 +82,31 @@ public: /// bool mayChangeProject(bool stopPlayback); - void autoSaveTimerStart() + // Auto save timer intervals. The slider in SetupDialog.cpp wants + // minutes and the rest milliseconds. + static const int DEFAULT_SAVE_INTERVAL_MINUTES = 2; + static const int DEFAULT_AUTO_SAVE_INTERVAL = DEFAULT_SAVE_INTERVAL_MINUTES * 60 * 1000; + + static const int m_autoSaveShortTime = 10 * 1000; // 10s short loop + + void autoSaveTimerReset( int msec = ConfigManager::inst()-> + value( "ui", "saveinterval" ).toInt() + * 60 * 1000 ) { - m_autoSaveTimer.start( 1000 * 60 ); // 1 minute + if( msec < m_autoSaveShortTime ) // No 'saveinterval' in .lmmsrc.xml + { + msec = DEFAULT_AUTO_SAVE_INTERVAL; + } + m_autoSaveTimer.start( msec ); } + int getAutoSaveTimerInterval() + { + return m_autoSaveTimer.interval(); + } + + void runAutoSave(); + enum SessionState { Normal, @@ -155,7 +176,6 @@ public slots: void redo(); void autoSave(); - void runAutoSave(); protected: virtual void closeEvent( QCloseEvent * _ce ); @@ -204,6 +224,7 @@ private: QBasicTimer m_updateTimer; QTimer m_autoSaveTimer; + int m_autoSaveInterval; friend class GuiApplication; diff --git a/include/SetupDialog.h b/include/SetupDialog.h index 8b5923724..3c27d3a67 100644 --- a/include/SetupDialog.h +++ b/include/SetupDialog.h @@ -44,7 +44,6 @@ class QSlider; class TabBar; - class SetupDialog : public QDialog { Q_OBJECT @@ -84,6 +83,11 @@ private slots: void setDefaultSoundfont( const QString & _sf ); void setBackgroundArtwork( const QString & _ba ); + // performance settings widget + void setAutoSaveInterval( int time ); + void resetAutoSaveInterval(); + void displaySaveIntervalHelp(); + // audio settings widget void audioInterfaceChanged( const QString & _driver ); void displayAudioHelp(); @@ -175,6 +179,10 @@ private: bool m_smoothScroll; bool m_enableAutoSave; + int m_saveInterval; + QSlider * m_saveIntervalSlider; + QLabel * m_saveIntervalLbl; + bool m_oneInstrumentTrackWindow; bool m_compactTrackButtons; bool m_syncVSTPlugins; diff --git a/src/core/main.cpp b/src/core/main.cpp index d8b1536c7..3faa80584 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -799,8 +799,8 @@ int main( int argc, char * * argv ) if( autoSaveEnabled && gui->mainWindow()->getSession() != MainWindow::SessionState::Limited ) { - gui->mainWindow()->runAutoSave(); - gui->mainWindow()->autoSaveTimerStart(); + gui->mainWindow()->autoSaveTimerReset(); + gui->mainWindow()->autoSave(); } } diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 41cf2112a..3a95a2df6 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -203,10 +203,16 @@ MainWindow::MainWindow() : { // connect auto save connect(&m_autoSaveTimer, SIGNAL(timeout()), this, SLOT(autoSave())); + m_autoSaveInterval = ConfigManager::inst()->value( + "ui", "saveinterval" ).toInt() < 1 ? + DEFAULT_AUTO_SAVE_INTERVAL : + ConfigManager::inst()->value( + "ui", "saveinterval" ).toInt(); + // The auto save function mustn't run until there is a project // to save or it will run over recover.mmp if you hesitate at the // recover messagebox for a minute. It is now started in main. - // See autoSaveTimerStart() in MainWindow.h + // See autoSaveTimerReset() in MainWindow.h } connect( Engine::getSong(), SIGNAL( playbackStateChanged() ), @@ -1507,14 +1513,19 @@ void MainWindow::browseHelp() void MainWindow::autoSave() { if( !( Engine::getSong()->isPlaying() || - Engine::getSong()->isExporting() ) ) + Engine::getSong()->isExporting() || + QApplication::mouseButtons() ) ) { Engine::getSong()->saveProjectFile(ConfigManager::inst()->recoveryFile()); + autoSaveTimerReset(); // Reset timer } else { // try again in 10 seconds - QTimer::singleShot( 10*1000, this, SLOT( autoSave() ) ); + if( getAutoSaveTimerInterval() != m_autoSaveShortTime ) + { + autoSaveTimerReset( m_autoSaveShortTime ); + } } } @@ -1527,5 +1538,6 @@ void MainWindow::runAutoSave() getSession() != Limited ) { autoSave(); + autoSaveTimerReset(); // Reset timer } } diff --git a/src/gui/SetupDialog.cpp b/src/gui/SetupDialog.cpp index 4c64fac11..ce1fb89c4 100644 --- a/src/gui/SetupDialog.cpp +++ b/src/gui/SetupDialog.cpp @@ -38,6 +38,7 @@ #include "TabWidget.h" #include "gui_templates.h" #include "Mixer.h" +#include "MainWindow.h" #include "ProjectJournal.h" #include "ConfigManager.h" #include "embed.h" @@ -121,7 +122,10 @@ SetupDialog::SetupDialog( ConfigTabs _tab_to_open ) : #endif m_backgroundArtwork( QDir::toNativeSeparators( ConfigManager::inst()->backgroundArtwork() ) ), m_smoothScroll( ConfigManager::inst()->value( "ui", "smoothscroll" ).toInt() ), - m_enableAutoSave( ConfigManager::inst()->value( "ui", "enableautosave" ).toInt() ), + m_enableAutoSave( ConfigManager::inst()->value( "ui", "enableautosave" ).toInt() ), + m_saveInterval( ConfigManager::inst()->value( "ui", "saveinterval" ).toInt() < 1 ? + MainWindow::DEFAULT_SAVE_INTERVAL_MINUTES : + ConfigManager::inst()->value( "ui", "saveinterval" ).toInt() ), m_oneInstrumentTrackWindow( ConfigManager::inst()->value( "ui", "oneinstrumenttrackwindow" ).toInt() ), m_compactTrackButtons( ConfigManager::inst()->value( "ui", @@ -654,16 +658,61 @@ SetupDialog::SetupDialog( ConfigTabs _tab_to_open ) : QWidget * performance = new QWidget( ws ); - performance->setFixedSize( 360, 240 ); + performance->setFixedSize( 360, 200 ); QVBoxLayout * perf_layout = new QVBoxLayout( performance ); perf_layout->setSpacing( 0 ); perf_layout->setMargin( 0 ); labelWidget( performance, tr( "Performance settings" ) ); + + TabWidget * auto_save_tw = new TabWidget( + tr( "Auto save" ).toUpper(), performance ); + auto_save_tw->setFixedHeight( 100 ); + + m_saveIntervalSlider = new QSlider( Qt::Horizontal, auto_save_tw ); + m_saveIntervalSlider->setRange( 1, 20 ); + m_saveIntervalSlider->setTickPosition( QSlider::TicksBelow ); + m_saveIntervalSlider->setPageStep( 1 ); + m_saveIntervalSlider->setTickInterval( 1 ); + m_saveIntervalSlider->setGeometry( 10, 16, 340, 18 ); + m_saveIntervalSlider->setValue( m_saveInterval ); + + connect( m_saveIntervalSlider, SIGNAL( valueChanged( int ) ), this, + SLOT( setAutoSaveInterval( int ) ) ); + + m_saveIntervalLbl = new QLabel( auto_save_tw ); + m_saveIntervalLbl->setGeometry( 10, 40, 200, 24 ); + setAutoSaveInterval( m_saveIntervalSlider->value() ); + + LedCheckBox * autoSave = new LedCheckBox( + tr( "Enable auto save feature" ), auto_save_tw ); + autoSave->move( 10, 70 ); + autoSave->setChecked( m_enableAutoSave ); + connect( autoSave, SIGNAL( toggled( bool ) ), + this, SLOT( toggleAutoSave( bool ) ) ); + if( ! m_enableAutoSave ){ m_saveIntervalSlider->setEnabled( false ); } + + QPushButton * saveIntervalResetBtn = new QPushButton( + embed::getIconPixmap( "reload" ), "", auto_save_tw ); + saveIntervalResetBtn->setGeometry( 290, 50, 28, 28 ); + connect( saveIntervalResetBtn, SIGNAL( clicked() ), this, + SLOT( resetAutoSaveInterval() ) ); + ToolTip::add( bufsize_reset_btn, tr( "Reset to default-value" ) ); + + QPushButton * saventervalBtn = new QPushButton( + embed::getIconPixmap( "help" ), "", auto_save_tw ); + saventervalBtn->setGeometry( 320, 50, 28, 28 ); + connect( saventervalBtn, SIGNAL( clicked() ), this, + SLOT( displaySaveIntervalHelp() ) ); + + perf_layout->addWidget( auto_save_tw ); + perf_layout->addSpacing( 10 ); + + TabWidget * ui_fx_tw = new TabWidget( tr( "UI effects vs. " "performance" ).toUpper(), performance ); - ui_fx_tw->setFixedHeight( 80 ); + ui_fx_tw->setFixedHeight( 70 ); LedCheckBox * smoothScroll = new LedCheckBox( tr( "Smooth scroll in Song Editor" ), ui_fx_tw ); @@ -672,19 +721,10 @@ SetupDialog::SetupDialog( ConfigTabs _tab_to_open ) : connect( smoothScroll, SIGNAL( toggled( bool ) ), this, SLOT( toggleSmoothScroll( bool ) ) ); - - LedCheckBox * autoSave = new LedCheckBox( - tr( "Enable auto save feature" ), ui_fx_tw ); - autoSave->move( 10, 40 ); - autoSave->setChecked( m_enableAutoSave ); - connect( autoSave, SIGNAL( toggled( bool ) ), - this, SLOT( toggleAutoSave( bool ) ) ); - - LedCheckBox * animAFP = new LedCheckBox( tr( "Show playback cursor in AudioFileProcessor" ), ui_fx_tw ); - animAFP->move( 10, 60 ); + animAFP->move( 10, 40 ); animAFP->setChecked( m_animateAFP ); connect( animAFP, SIGNAL( toggled( bool ) ), this, SLOT( toggleAnimateAFP( bool ) ) ); @@ -986,6 +1026,8 @@ void SetupDialog::accept() QString::number( m_smoothScroll ) ); ConfigManager::inst()->setValue( "ui", "enableautosave", QString::number( m_enableAutoSave ) ); + ConfigManager::inst()->setValue( "ui", "saveinterval", + QString::number( m_saveInterval ) ); ConfigManager::inst()->setValue( "ui", "oneinstrumenttrackwindow", QString::number( m_oneInstrumentTrackWindow ) ); ConfigManager::inst()->setValue( "ui", "compacttrackbuttons", @@ -1169,6 +1211,7 @@ void SetupDialog::toggleSmoothScroll( bool _enabled ) void SetupDialog::toggleAutoSave( bool _enabled ) { m_enableAutoSave = _enabled; + m_saveIntervalSlider->setEnabled( _enabled ); } @@ -1471,6 +1514,41 @@ void SetupDialog::setBackgroundArtwork( const QString & _ba ) +void SetupDialog::setAutoSaveInterval( int value ) +{ + m_saveInterval = value; + m_saveIntervalSlider->setValue( m_saveInterval ); + QString minutes = m_saveInterval > 1 ? tr( "minutes" ) : tr( "minute" ); + m_saveIntervalLbl->setText( tr( "Auto save interval: %1 %2" ).arg( + QString::number( m_saveInterval ), minutes ) ); +} + + + + +void SetupDialog::resetAutoSaveInterval() +{ + if( m_enableAutoSave ) + { + setAutoSaveInterval( MainWindow::DEFAULT_SAVE_INTERVAL_MINUTES ); + } + +} + + + + +void SetupDialog::displaySaveIntervalHelp() +{ + QWhatsThis::showText( QCursor::pos(), + tr( "Set the time between automatic backup to %1.\n" + "Remember to also save your project manually." ).arg( + ConfigManager::inst()->recoveryFile() ) ); +} + + + + void SetupDialog::audioInterfaceChanged( const QString & _iface ) { for( AswMap::iterator it = m_audioIfaceSetupWidgets.begin();