From 96c8dcbeb41aac58440f46e6f0ad0226aef172cb Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 10 Nov 2009 20:22:38 -0700 Subject: [PATCH 1/3] don't show WelcomeScreen when importing/loading WelcomeScreen was incorrectly shown when lmms loaded or imported a project (for example via command line). Fixed. --- include/MainWindow.h | 4 ++-- include/WelcomeScreen.h | 2 +- src/core/main.cpp | 13 ++++++++++--- src/gui/MainWindow.cpp | 24 ++++++++++++------------ src/gui/WelcomeScreen.cpp | 10 +++++----- 5 files changed, 30 insertions(+), 23 deletions(-) diff --git a/include/MainWindow.h b/include/MainWindow.h index 69090d855..5916893fc 100644 --- a/include/MainWindow.h +++ b/include/MainWindow.h @@ -69,8 +69,6 @@ public: return m_toolBar; } - // show MainWidget or WelcomeScreen - void setMainWidgetVisible( bool _visible ); //int addWidgetToToolBar( QWidget * _w, int _row = -1, int _col = -1 ); //void addSpacingToToolBar( int _size ); @@ -109,6 +107,7 @@ public: void setPlaybackMode( ProjectPlaybackMode _playbackMode ); + void showWelcomeScreen(bool _visible = true); public slots: void resetWindowTitle(); @@ -145,6 +144,7 @@ public slots: protected: virtual void closeEvent( QCloseEvent * _ce ); + virtual void showEvent( QShowEvent * _se ); virtual void focusOutEvent( QFocusEvent * _fe ); virtual void keyPressEvent( QKeyEvent * _ke ); virtual void keyReleaseEvent( QKeyEvent * _ke ); diff --git a/include/WelcomeScreen.h b/include/WelcomeScreen.h index 9f73476b7..d1e38b48a 100644 --- a/include/WelcomeScreen.h +++ b/include/WelcomeScreen.h @@ -53,7 +53,7 @@ private slots: private: - void switchView(); + void hideWelcomeScreen(); Ui::WelcomeScreen * ui; RecentResourceListModel * m_recentProjectsModel; diff --git a/src/core/main.cpp b/src/core/main.cpp index b91c15653..41227025f 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -458,6 +458,9 @@ int main( int argc, char * * argv ) engine::mainWindow()->showMaximized(); } engine::getSong()->loadProject( file_to_load ); + + // don't show welcome screen + engine::mainWindow()->showWelcomeScreen( false ); } else if( !file_to_import.isEmpty() ) { @@ -472,6 +475,9 @@ int main( int argc, char * * argv ) { engine::mainWindow()->showMaximized(); } + + // don't show welcome screen + engine::mainWindow()->showWelcomeScreen( false ); } else { @@ -484,6 +490,9 @@ int main( int argc, char * * argv ) { engine::mainWindow()->showMaximized(); } + + // show welcome screen + engine::mainWindow()->showWelcomeScreen(); } } else @@ -519,9 +528,7 @@ int main( int argc, char * * argv ) } } - const int ret = app->exec(); - delete app; - return( ret ); + return app->exec(); } diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 8dc2874f5..dfb101be6 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -92,7 +92,6 @@ MainWindow::MainWindow() : vbox->setSpacing( 0 ); vbox->setMargin( 0 ); - QWidget * w = new QWidget( m_mainWidget ); QHBoxLayout * hbox = new QHBoxLayout( w ); hbox->setSpacing( 0 ); @@ -152,17 +151,14 @@ MainWindow::MainWindow() : vbox->addWidget( m_toolBar ); vbox->addWidget( w ); + m_updateTimer.start( 1000 / 20, this ); // 20 fps m_welcomeScreen = new WelcomeScreen( this ); - - setCentralWidget( m_welcomeScreen ); - - m_updateTimer.start( 1000 / 20, this ); // 20 fps + m_welcomeScreen->setVisible( false ); } - MainWindow::~MainWindow() { for( QList::Iterator it = m_tools.begin(); @@ -182,15 +178,14 @@ MainWindow::~MainWindow() - -void MainWindow::setMainWidgetVisible( bool _visible ) +void MainWindow::showWelcomeScreen(bool _visible) { - setCentralWidget( _visible ? m_mainWidget : m_welcomeScreen ); + m_welcomeScreen->setVisible( _visible ); + setCentralWidget( _visible ? m_welcomeScreen : m_mainWidget ); } - void MainWindow::finalize() { resetWindowTitle(); @@ -312,8 +307,7 @@ void MainWindow::finalize() // create the grid layout for the first buttons area QWidget * gridButtons_w = new QWidget( m_toolBar ); - QGridLayout * gridButtons_layout = new QGridLayout( gridButtons_w/*, 2, 1*/ ); - + QGridLayout * gridButtons_layout = new QGridLayout( gridButtons_w ); // create tool-buttons toolButton * project_new = new toolButton( @@ -1197,6 +1191,12 @@ void MainWindow::closeEvent( QCloseEvent * _ce ) } +void MainWindow::showEvent( QShowEvent * _se ) +{ + //showWelcomeScreen( false ); // must explicitly ask for welcome screen + _se->accept(); +} + void MainWindow::focusOutEvent( QFocusEvent * _fe ) diff --git a/src/gui/WelcomeScreen.cpp b/src/gui/WelcomeScreen.cpp index 964988aeb..3b33ed976 100644 --- a/src/gui/WelcomeScreen.cpp +++ b/src/gui/WelcomeScreen.cpp @@ -112,7 +112,7 @@ WelcomeScreen::~WelcomeScreen() void WelcomeScreen::createNewProject() { - switchView(); + hideWelcomeScreen(); } @@ -141,7 +141,7 @@ void WelcomeScreen::instantMidiAction() void WelcomeScreen::openRecentProject( const QModelIndex & _idx ) { - switchView(); + hideWelcomeScreen(); ResourceAction( m_recentProjectsModel->item( _idx ) ).loadProject(); } @@ -156,7 +156,7 @@ void WelcomeScreen::openCommunityResource( const QModelIndex & _idx ) switch( item->type() ) { case ResourceItem::TypeProject: - switchView(); + hideWelcomeScreen(); action.loadProject(); break; default: @@ -177,9 +177,9 @@ void WelcomeScreen::openOnlineResource( QListWidgetItem * _item ) -void WelcomeScreen::switchView() +void WelcomeScreen::hideWelcomeScreen() { - engine::mainWindow()->setMainWidgetVisible( true ); + engine::mainWindow()->showWelcomeScreen( false ); } From f73ccadc17b03de3125854301207ffd2002d0b9d Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 10 Nov 2009 21:41:45 -0700 Subject: [PATCH 2/3] auto-saves every minute and recovers upon crash auto-save time is not configurable yet. saves "recover.mmp" to WORKING_DIR every 60 seconds. Deletes recover.mmp on successful close of LMMS. If recover.mmp is found upon start, it loads that project. --- include/MainWindow.h | 4 ++++ src/core/main.cpp | 8 ++++++++ src/gui/MainWindow.cpp | 19 +++++++++++++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/include/MainWindow.h b/include/MainWindow.h index 5916893fc..3a7a770ed 100644 --- a/include/MainWindow.h +++ b/include/MainWindow.h @@ -26,6 +26,7 @@ #define _MAIN_WINDOW_H #include +#include #include #include #include @@ -207,6 +208,7 @@ private: QList m_tools; QBasicTimer m_updateTimer; + QTimer m_autoSaveTimer; ResourceBrowser * m_resourceBrowser; @@ -243,6 +245,8 @@ private slots: void playAndRecord(); void stop(); + void autoSave(); + signals: void periodicUpdate(); diff --git a/src/core/main.cpp b/src/core/main.cpp index 41227025f..cb05bbecb 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -23,6 +23,7 @@ */ +#include #include #include #include @@ -449,6 +450,13 @@ int main( int argc, char * * argv ) // srandom() calls in their init procedure srand( getpid() + time( 0 ) ); + // recover a file? + QString recoveryFile = QDir(configManager::inst()->workingDir()).absoluteFilePath("recover.mmp"); + if( QFileInfo(recoveryFile).exists() ) + { + file_to_load = recoveryFile; + } + // we try to load given file if( !file_to_load.isEmpty() ) { diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index dfb101be6..6d92b5ae7 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -83,7 +83,8 @@ MainWindow::MainWindow() : m_workspace( NULL ), m_templatesMenu( NULL ), m_recentlyOpenedProjectsMenu( NULL ), - m_toolsMenu( NULL ) + m_toolsMenu( NULL ), + m_autoSaveTimer( this ) { setAttribute( Qt::WA_DeleteOnClose ); @@ -153,6 +154,10 @@ MainWindow::MainWindow() : m_updateTimer.start( 1000 / 20, this ); // 20 fps + // connect auto save + connect(&m_autoSaveTimer, SIGNAL(timeout()), this, SLOT(autoSave())); + m_autoSaveTimer.start(1000 * 60); // 1 minute + m_welcomeScreen = new WelcomeScreen( this ); m_welcomeScreen->setVisible( false ); } @@ -1182,6 +1187,9 @@ void MainWindow::closeEvent( QCloseEvent * _ce ) { if( mayChangeProject() ) { + // delete recovery file + QDir working(configManager::inst()->workingDir()); + working.remove("recover.mmp"); _ce->accept(); } else @@ -1387,7 +1395,7 @@ void MainWindow::keyReleaseEvent( QKeyEvent * _ke ) -void MainWindow::timerEvent( QTimerEvent * ) +void MainWindow::timerEvent( QTimerEvent * _te) { emit periodicUpdate(); } @@ -1557,6 +1565,13 @@ void MainWindow::toggleRecordAutomation( bool _recording ) +void MainWindow::autoSave() +{ + QDir work(configManager::inst()->workingDir()); + engine::getSong()->saveProjectAs(work.absoluteFilePath("recover.mmp")); +} + + #include "moc_MainWindow.cxx" /* vim: set tw=0 noexpandtab: */ From 953522f34a7fb751d487abe0b3c05afe8603c36d Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 13 Nov 2009 18:43:08 -0700 Subject: [PATCH 3/3] don't change the current project when auto-saving every time auto-save ran, it would change the current project to "recover.mmp". Now it doesn't do this because Song has guiSaveProject(), guiSaveProjectAs(), and saveProjectFile(). (the latter is used for auto-save) --- include/song.h | 7 ++++--- src/core/main.cpp | 2 +- src/core/song.cpp | 22 ++++++++++++++-------- src/gui/MainWindow.cpp | 6 +++--- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/include/song.h b/include/song.h index 858f577f5..7406bdc22 100644 --- a/include/song.h +++ b/include/song.h @@ -151,9 +151,10 @@ public: // file management void createNewProject(); void createNewProjectFromTemplate( const QString & _template ); - void loadProject( const QString & _file_name ); - bool saveProject(); - bool saveProjectAs( const QString & _file_name ); + void loadProject( const QString & _filename ); + bool guiSaveProject(); + bool guiSaveProjectAs( const QString & _filename ); + bool saveProjectFile( const QString & _filename ); inline const QString & projectFileName() const { return m_fileName; diff --git a/src/core/main.cpp b/src/core/main.cpp index cb05bbecb..96019ce37 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -531,7 +531,7 @@ int main( int argc, char * * argv ) } else { - engine::getSong()->saveProjectAs( file_to_save ); + engine::getSong()->saveProjectFile( file_to_save ); return( 0 ); } } diff --git a/src/core/song.cpp b/src/core/song.cpp index 11392cda8..97c388c41 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -994,10 +994,8 @@ void song::loadProject( const QString & _file_name ) } - - -// save current song -bool song::saveProject() +// only save current song as _filename and do nothing else +bool song::saveProjectFile( const QString & _filename ) { multimediaProject mmp( multimediaProject::SongProject ); @@ -1006,7 +1004,6 @@ bool song::saveProject() m_masterVolumeModel.saveSettings( mmp, mmp.head(), "mastervol" ); m_masterPitchModel.saveSettings( mmp, mmp.head(), "masterpitch" ); - saveState( mmp, mmp.content() ); m_globalAutomationTrack->saveState( mmp, mmp.content() ); @@ -1024,8 +1021,17 @@ bool song::saveProject() saveControllerStates( mmp, mmp.content() ); + return mmp.writeFile( _filename ); +} + + + +// save current song and update the gui +bool song::guiSaveProject() +{ + multimediaProject mmp( multimediaProject::SongProject ); m_fileName = mmp.nameWithExtension( m_fileName ); - if( mmp.writeFile( m_fileName ) == true && engine::hasGUI() ) + if( saveProjectFile( m_fileName ) && engine::hasGUI() ) { textFloat::displayMessage( tr( "Project saved" ), tr( "The project %1 is now saved." @@ -1052,12 +1058,12 @@ bool song::saveProject() // save current song in given filename -bool song::saveProjectAs( const QString & _file_name ) +bool song::guiSaveProjectAs( const QString & _file_name ) { QString o = m_oldFileName; m_oldFileName = m_fileName; m_fileName = _file_name; - if( saveProject() == false ) + if( guiSaveProject() == false ) { m_fileName = m_oldFileName; m_oldFileName = o; diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 6d92b5ae7..afbb6eb2d 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -1007,7 +1007,7 @@ bool MainWindow::saveProject() } else { - engine::getSong()->saveProject(); + engine::getSong()->guiSaveProject(); } return true; } @@ -1036,7 +1036,7 @@ bool MainWindow::saveProjectAs() if( sfd.exec () == QFileDialog::Accepted && !sfd.selectedFiles().isEmpty() && sfd.selectedFiles()[0] != "" ) { - engine::getSong()->saveProjectAs( + engine::getSong()->guiSaveProjectAs( sfd.selectedFiles()[0] ); return true; } @@ -1568,7 +1568,7 @@ void MainWindow::toggleRecordAutomation( bool _recording ) void MainWindow::autoSave() { QDir work(configManager::inst()->workingDir()); - engine::getSong()->saveProjectAs(work.absoluteFilePath("recover.mmp")); + engine::getSong()->saveProjectFile(work.absoluteFilePath("recover.mmp")); }