summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--muse2/ChangeLog7
-rw-r--r--muse2/muse/app.cpp52
-rw-r--r--muse2/muse/app.h5
-rw-r--r--muse2/muse/conf.cpp3
-rw-r--r--muse2/muse/gconfig.cpp3
-rw-r--r--muse2/muse/gconfig.h1
-rw-r--r--muse2/muse/song.h1
-rw-r--r--muse2/muse/undo.cpp6
-rw-r--r--muse2/muse/widgets/genset.cpp2
-rw-r--r--muse2/muse/widgets/gensetbase.ui305
10 files changed, 229 insertions, 156 deletions
diff --git a/muse2/ChangeLog b/muse2/ChangeLog
index 1990ff37..d5d44367 100644
--- a/muse2/ChangeLog
+++ b/muse2/ChangeLog
@@ -1,3 +1,10 @@
+05.04.2013:
+ - Change window title when there are unsaved changes (rj)
+ - Add auto-save feature, when enabled tries to save after 5 minutes
+ when there has been changes, unless transport is running (rj)
+04.04.2013:
+ - Added pitch control to SimpleDrums, first version (rj)
+ - Fixed Ctrl+arrows in the arranger so the track list is scrolled (rj)
29.03.2013:
- MusE 2.1.2 released! (rj)
28.03.2013:
diff --git a/muse2/muse/app.cpp b/muse2/muse/app.cpp
index ae0f19c4..fb93bef5 100644
--- a/muse2/muse/app.cpp
+++ b/muse2/muse/app.cpp
@@ -327,6 +327,7 @@ MusE::MusE() : QMainWindow()
editInstrument = 0;
//routingPopupMenu = 0;
progress = 0;
+ saveIncrement = 0;
activeTopWin = NULL;
currentMenuSharingTopwin = NULL;
waitingForTopwin = NULL;
@@ -345,7 +346,12 @@ MusE::MusE() : QMainWindow()
MusEGlobal::heartBeatTimer->setObjectName("timer");
connect(MusEGlobal::heartBeatTimer, SIGNAL(timeout()), MusEGlobal::song, SLOT(beat()));
connect(this, SIGNAL(activeTopWinChanged(MusEGui::TopWin*)), SLOT(activeTopWinChangedSlot(MusEGui::TopWin*)));
+ connect(MusEGlobal::song, SIGNAL(sigDirty()), this, SLOT(setDirty()));
new MusECore::TrackDrummapUpdater(this); // no need for keeping the reference, the thing autoconnects on its own.
+
+ saveTimer = new QTimer(this);
+ connect(saveTimer, SIGNAL(timeout()), this, SLOT(saveTimerSlot()));
+ saveTimer->start( 10 * 1000 ); // every minute
#ifdef ENABLE_PYTHON
//---------------------------------------------------
@@ -970,6 +976,16 @@ void MusE::setHeartBeat()
MusEGlobal::heartBeatTimer->start(1000/MusEGlobal::config.guiRefresh);
}
+//---------------------------------------------------------
+// setDirty
+//---------------------------------------------------------
+
+void MusE::setDirty()
+ {
+ MusEGlobal::song->dirty = true;
+ setWindowTitle(projectTitle(project.absoluteFilePath()) + " <unsaved changes>");
+ }
+
//---------------------------------------------------
// loadDefaultSong
// if no songname entered on command line:
@@ -1215,7 +1231,7 @@ void MusE::loadProjectFile1(const QString& name, bool songTemplate, bool doReadM
}
if (!songTemplate) {
addProject(project.absoluteFilePath());
- setWindowTitle(QString("MusE: Song: ") + MusEGui::projectTitleFromFilename(project.absoluteFilePath()));
+ setWindowTitle(projectTitle(project.absoluteFilePath()));
}
MusEGlobal::song->dirty = false;
progress->setValue(30);
@@ -1321,7 +1337,7 @@ void MusE::setUntitledProject()
MusEGlobal::museProject = MusEGlobal::museProjectInitPath;
QDir::setCurrent(QDir::homePath());
project.setFile(name);
- setWindowTitle(tr("MusE: Song: %1").arg(MusEGui::projectTitleFromFilename(name)));
+ setWindowTitle(projectTitle(name));
writeTopwinState=true;
}
@@ -1426,6 +1442,8 @@ bool MusE::save(const QString& name, bool overwriteWarn, bool writeTopwins)
else {
popenFlag? pclose(f) : fclose(f);
MusEGlobal::song->dirty = false;
+ setWindowTitle(projectTitle(project.absoluteFilePath()));
+ saveIncrement = 0;
return true;
}
}
@@ -1732,7 +1750,7 @@ bool MusE::saveAs()
ok = save(name, true, writeTopwinState);
if (ok) {
project.setFile(name);
- setWindowTitle(tr("MusE: Song: %1").arg(MusEGui::projectTitleFromFilename(name)));
+ setWindowTitle(projectTitle(project.absoluteFilePath()));
addProject(name);
}
else
@@ -3694,6 +3712,11 @@ void MusE::tileSubWindows()
}
}
+QString MusE::projectTitle(QString name)
+{
+ return tr("MusE: Song: ") + MusEGui::projectTitleFromFilename(name);
+}
+
QString MusE::projectTitle() const
{
return MusEGui::projectTitleFromFilename(project.fileName());
@@ -3709,4 +3732,27 @@ QString MusE::projectExtension() const
return MusEGui::projectExtensionFromFilename(project.fileName());
}
+void MusE::saveTimerSlot()
+{
+ if (MusEGlobal::config.autoSave == false ||
+ MusEGlobal::museProject == MusEGlobal::museProjectInitPath ||
+ MusEGlobal::song->dirty == false)
+ {
+ //printf("conditions not met, ignore %d %d\n", MusEGlobal::config.autoSave, MusEGlobal::song->dirty);
+ return;
+ }
+ saveIncrement++;
+ if (saveIncrement > 4) {
+ // printf("five minutes passed %d %d\n", MusEGlobal::config.autoSave, MusEGlobal::song->dirty);
+ // time to see if we are allowed to save, if so. Do
+ if (MusEGlobal::audio->isPlaying() == false) {
+ printf("Performing autosave\n");
+ save(project.filePath(), false, writeTopwinState);
+ } else
+ {
+ //printf("isPlaying, can't save\n");
+ }
+ }
+}
+
} //namespace MusEGui
diff --git a/muse2/muse/app.h b/muse2/muse/app.h
index 5cd15792..5d17f096 100644
--- a/muse2/muse/app.h
+++ b/muse2/muse/app.h
@@ -236,16 +236,20 @@ class MusE : public QMainWindow
void writeGlobalConfiguration(int level, MusECore::Xml&) const;
void writeConfiguration(int level, MusECore::Xml&) const;
void updateConfiguration();
+ QString projectTitle(QString name);
QSignalMapper *midiPluginSignalMapper;
QSignalMapper *followSignalMapper;
QSignalMapper *windowsMapper;
+ QTimer *saveTimer;
+ int saveIncrement;
signals:
void configChanged();
void activeTopWinChanged(MusEGui::TopWin*);
private slots:
+ void saveTimerSlot();
void loadProject();
bool save();
void configGlobalSettings();
@@ -318,6 +322,7 @@ class MusE : public QMainWindow
void arrangeSubWindowsRows();
void arrangeSubWindowsColumns();
void tileSubWindows();
+ void setDirty();
public slots:
bool saveAs();
diff --git a/muse2/muse/conf.cpp b/muse2/muse/conf.cpp
index 3e7927bd..56d648ad 100644
--- a/muse2/muse/conf.cpp
+++ b/muse2/muse/conf.cpp
@@ -619,6 +619,8 @@ void readConfiguration(Xml& xml, bool doReadMidiPortConfig, bool doReadGlobalCon
else if (tag == "theme")
MusEGlobal::config.style = xml.parse1();
+ else if (tag == "autoSave")
+ MusEGlobal::config.autoSave = xml.parseInt();
else if (tag == "styleSheetFile")
MusEGlobal::config.styleSheetFile = xml.parse1();
else if (tag == "useOldStyleStopShortCut")
@@ -1338,6 +1340,7 @@ void MusE::writeGlobalConfiguration(int level, MusECore::Xml& xml) const
xml.intTag(level, "midiFilterCtrl4", MusEGlobal::midiFilterCtrl4);
xml.strTag(level, "theme", MusEGlobal::config.style);
+ xml.intTag(level, "autoSave", MusEGlobal::config.autoSave);
xml.strTag(level, "styleSheetFile", MusEGlobal::config.styleSheetFile);
xml.strTag(level, "externalWavEditor", MusEGlobal::config.externalWavEditor);
xml.intTag(level, "useOldStyleStopShortCut", MusEGlobal::config.useOldStyleStopShortCut);
diff --git a/muse2/muse/gconfig.cpp b/muse2/muse/gconfig.cpp
index 07c32561..4df94aeb 100644
--- a/muse2/muse/gconfig.cpp
+++ b/muse2/muse/gconfig.cpp
@@ -225,7 +225,8 @@ GlobalConfigValues config = {
MusEGlobal::PREFER_NEW, // drumTrackPreference
true, // smartFocus
20, // trackHeight
- true // borderlessMouse
+ true, // borderlessMouse
+ true // autoSave
};
} // namespace MusEGlobal
diff --git a/muse2/muse/gconfig.h b/muse2/muse/gconfig.h
index 08990f03..d1fd0ff4 100644
--- a/muse2/muse/gconfig.h
+++ b/muse2/muse/gconfig.h
@@ -231,6 +231,7 @@ struct GlobalConfigValues {
bool smartFocus;
int trackHeight;
bool borderlessMouse;
+ bool autoSave;
};
diff --git a/muse2/muse/song.h b/muse2/muse/song.h
index 63256af3..b9ab5dd5 100644
--- a/muse2/muse/song.h
+++ b/muse2/muse/song.h
@@ -431,6 +431,7 @@ class Song : public QObject {
void midiNote(int pitch, int velo);
void controllerChanged(MusECore::Track*, int);
void newPartsCreated(const std::map< MusECore::Part*, std::set<MusECore::Part*> >&);
+ void sigDirty();
};
} // namespace MusECore
diff --git a/muse2/muse/undo.cpp b/muse2/muse/undo.cpp
index 65ca04bf..fc6fc1d8 100644
--- a/muse2/muse/undo.cpp
+++ b/muse2/muse/undo.cpp
@@ -684,7 +684,7 @@ void Song::addUndo(UndoOp i)
return;
}
undoList->back().push_back(i);
- dirty = true;
+ emit sigDirty();
}
//---------------------------------------------------------
@@ -812,7 +812,7 @@ void Song::doUndo3()
}
redoList->push_back(u); // put item on redo list
undoList->pop_back();
- dirty = true;
+ emit sigDirty();
}
//---------------------------------------------------------
@@ -935,7 +935,7 @@ void Song::doRedo3()
}
undoList->push_back(u); // put item on undo list
redoList->pop_back();
- dirty = true;
+ emit sigDirty();
}
diff --git a/muse2/muse/widgets/genset.cpp b/muse2/muse/widgets/genset.cpp
index 52be3d8a..3641706c 100644
--- a/muse2/muse/widgets/genset.cpp
+++ b/muse2/muse/widgets/genset.cpp
@@ -153,6 +153,7 @@ void GlobalSettingsConfig::updateSettings()
}
}
+ autoSaveCheckBox->setChecked(MusEGlobal::config.autoSave);
warnIfBadTimingCheckBox->setChecked(MusEGlobal::config.warnIfBadTiming);
midiSendInit->setChecked(MusEGlobal::config.midiSendInit);
midiWarnInitPending->setChecked(MusEGlobal::config.warnInitPending);
@@ -331,6 +332,7 @@ void GlobalSettingsConfig::apply()
MusEGlobal::config.mixer2.geometry.setWidth(mixer2W->value());
MusEGlobal::config.mixer2.geometry.setHeight(mixer2H->value());
+ MusEGlobal::config.autoSave = autoSaveCheckBox->isChecked();
MusEGlobal::config.showSplashScreen = showSplash->isChecked();
MusEGlobal::config.showDidYouKnow = showDidYouKnow->isChecked();
MusEGlobal::config.externalWavEditor = externalWavEditorSelect->text();
diff --git a/muse2/muse/widgets/gensetbase.ui b/muse2/muse/widgets/gensetbase.ui
index 8b1cc28d..f6bcb0c4 100644
--- a/muse2/muse/widgets/gensetbase.ui
+++ b/muse2/muse/widgets/gensetbase.ui
@@ -30,39 +30,133 @@
<string>Application</string>
</attribute>
<layout class="QGridLayout">
- <item row="0" column="0">
- <widget class="QGroupBox" name="projDirGroupBox">
+ <item row="2" column="0">
+ <widget class="QGroupBox" name="groupBox3">
<property name="title">
- <string>Project directory</string>
+ <string>Start Muse</string>
</property>
- <layout class="QHBoxLayout" name="qhboxProjDir">
- <property name="spacing">
- <number>6</number>
- </property>
- <item>
- <widget class="QLabel" name="textLabel_ProjDir">
- <property name="text">
- <string>Projects:</string>
- </property>
- <property name="wordWrap">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLineEdit" name="projDirEntry"/>
- </item>
- <item>
- <widget class="QToolButton" name="projDirOpenToolButton">
- <property name="text">
- <string>...</string>
- </property>
- </widget>
+ <layout class="QGridLayout">
+ <item row="0" column="0">
+ <layout class="QGridLayout" name="gridLayout11">
+ <item row="3" column="0" colspan="2">
+ <layout class="QHBoxLayout" name="qhboxStartSong">
+ <item>
+ <widget class="QLineEdit" name="startSongEntry"/>
+ </item>
+ <item>
+ <widget class="QToolButton" name="startSongFileOpenToolButton">
+ <property name="toolTip">
+ <string>Choose start song or template</string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="startSongResetToolButton">
+ <property name="toolTip">
+ <string>Reset to default</string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="QGroupBox" name="startSongBox">
+ <property name="title">
+ <string>Start song</string>
+ </property>
+ <layout class="QHBoxLayout" name="hLayout_1">
+ <item>
+ <widget class="QRadioButton" name="startLastButton">
+ <property name="text">
+ <string>start with last song</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="startEmptyButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>start with template</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="startSongButton">
+ <property name="text">
+ <string>start with song</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="2">
+ <widget class="QGroupBox" name="startUpBox">
+ <property name="title">
+ <string>On Launch</string>
+ </property>
+ <layout class="QHBoxLayout" name="hLayout_2">
+ <item>
+ <widget class="QCheckBox" name="showSplash">
+ <property name="text">
+ <string>show splash screen</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="showDidYouKnow">
+ <property name="text">
+ <string>show &quot;Did you know?&quot; dialog</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="textLabel1_2">
+ <property name="text">
+ <string>Start template or song:</string>
+ </property>
+ <property name="wordWrap">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QCheckBox" name="readMidiConfigFromSongCheckBox">
+ <property name="toolTip">
+ <string>Read MIDI Ports configuration from file,
+ or else automatically configure</string>
+ </property>
+ <property name="text">
+ <string>Read MIDI Ports configuration</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
</layout>
</widget>
</item>
- <item row="2" column="0">
+ <item row="3" column="0">
<widget class="QGroupBox" name="groupBox4">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -445,132 +539,45 @@
</layout>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QGroupBox" name="groupBox3">
+ <item row="0" column="0">
+ <widget class="QGroupBox" name="projDirGroupBox">
<property name="title">
- <string>Start Muse</string>
+ <string>Project directory</string>
</property>
- <layout class="QGridLayout">
- <item row="0" column="0">
- <layout class="QGridLayout" name="gridLayout11">
- <item row="3" column="0" colspan="2">
- <layout class="QHBoxLayout" name="qhboxStartSong">
- <item>
- <widget class="QLineEdit" name="startSongEntry"/>
- </item>
- <item>
- <widget class="QToolButton" name="startSongFileOpenToolButton">
- <property name="toolTip">
- <string>Choose start song or template</string>
- </property>
- <property name="text">
- <string>...</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="startSongResetToolButton">
- <property name="toolTip">
- <string>Reset to default</string>
- </property>
- <property name="text">
- <string>...</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="1" column="0" colspan="2">
- <widget class="QGroupBox" name="startSongBox">
- <property name="title">
- <string>Start song</string>
- </property>
- <layout class="QHBoxLayout" name="hLayout_1">
- <item>
- <widget class="QRadioButton" name="startLastButton">
- <property name="text">
- <string>start with last song</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="startEmptyButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>start with template</string>
- </property>
- <property name="checked">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="startSongButton">
- <property name="text">
- <string>start with song</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="0" column="0" colspan="2">
- <widget class="QGroupBox" name="startUpBox">
- <property name="title">
- <string>On Launch</string>
- </property>
- <layout class="QHBoxLayout" name="hLayout_2">
- <item>
- <widget class="QCheckBox" name="showSplash">
- <property name="text">
- <string>show splash screen</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QCheckBox" name="showDidYouKnow">
- <property name="text">
- <string>show &quot;Did you know?&quot; dialog</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="textLabel1_2">
- <property name="text">
- <string>Start template or song:</string>
- </property>
- <property name="wordWrap">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QCheckBox" name="readMidiConfigFromSongCheckBox">
- <property name="toolTip">
- <string>Read MIDI Ports configuration from file,
- or else automatically configure</string>
- </property>
- <property name="text">
- <string>Read MIDI Ports configuration</string>
- </property>
- </widget>
- </item>
- </layout>
+ <layout class="QHBoxLayout" name="qhboxProjDir">
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="textLabel_ProjDir">
+ <property name="text">
+ <string>Projects:</string>
+ </property>
+ <property name="wordWrap">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="projDirEntry"/>
+ </item>
+ <item>
+ <widget class="QToolButton" name="projDirOpenToolButton">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
</item>
</layout>
</widget>
</item>
+ <item row="1" column="0">
+ <widget class="QCheckBox" name="autoSaveCheckBox">
+ <property name="text">
+ <string>Auto save (every 5 minutes if not playing/recording)</string>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
<widget class="QWidget" name="tab">
@@ -1754,8 +1761,8 @@ Disable to use an alternate standard
<rect>
<x>0</x>
<y>0</y>
- <width>96</width>
- <height>26</height>
+ <width>500</width>
+ <height>460</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">