summaryrefslogtreecommitdiff
path: root/muse2/muse
diff options
context:
space:
mode:
authorFlorian Jung <flo@windfisch.org>2011-09-14 19:33:40 +0000
committerFlorian Jung <flo@windfisch.org>2011-09-14 19:33:40 +0000
commit58033553a3e7d529a27a2b3d9ccc721d1e2dcc17 (patch)
tree160bd9993bca91b68475d4ad4249cc07b89692dd /muse2/muse
parent42269af2e0cc7a8c7b70d89ffa270184acde3dec (diff)
parent2529ef06d1227b457af051a494ddb579ef590fe3 (diff)
merged experimental into trunk
new features: - MDI user interface - improved pasting (dialogs etc) - some fixes
Diffstat (limited to 'muse2/muse')
-rw-r--r--muse2/muse/CMakeLists.txt1
-rw-r--r--muse2/muse/app.cpp1492
-rw-r--r--muse2/muse/app.h146
-rw-r--r--muse2/muse/appearance.cpp8
-rw-r--r--muse2/muse/arranger/CMakeLists.txt2
-rw-r--r--muse2/muse/arranger/arranger.cpp22
-rw-r--r--muse2/muse/arranger/arranger.h10
-rw-r--r--muse2/muse/arranger/arrangerview.cpp726
-rw-r--r--muse2/muse/arranger/arrangerview.h156
-rw-r--r--muse2/muse/arranger/pcanvas.cpp354
-rw-r--r--muse2/muse/arranger/pcanvas.h14
-rw-r--r--muse2/muse/arranger/tlist.cpp171
-rw-r--r--muse2/muse/cliplist/cliplist.cpp65
-rw-r--r--muse2/muse/cliplist/cliplist.h4
-rw-r--r--muse2/muse/cobject.cpp557
-rw-r--r--muse2/muse/cobject.h109
-rw-r--r--muse2/muse/conf.cpp34
-rw-r--r--muse2/muse/confmport.cpp3
-rw-r--r--muse2/muse/dialogs.cpp147
-rw-r--r--muse2/muse/dialogs.h62
-rw-r--r--muse2/muse/functions.cpp605
-rw-r--r--muse2/muse/functions.h48
-rw-r--r--muse2/muse/gconfig.cpp1
-rw-r--r--muse2/muse/gconfig.h1
-rw-r--r--muse2/muse/helper.cpp253
-rw-r--r--muse2/muse/helper.h17
-rw-r--r--muse2/muse/importmidi.cpp4
-rw-r--r--muse2/muse/keyevent.cpp1
-rw-r--r--muse2/muse/liste/listedit.cpp73
-rw-r--r--muse2/muse/liste/listedit.h4
-rw-r--r--muse2/muse/main.cpp25
-rw-r--r--muse2/muse/marker/markerview.cpp75
-rw-r--r--muse2/muse/marker/markerview.h4
-rw-r--r--muse2/muse/master/lmaster.cpp66
-rw-r--r--muse2/muse/master/lmaster.h19
-rw-r--r--muse2/muse/master/masteredit.cpp89
-rw-r--r--muse2/muse/master/masteredit.h8
-rw-r--r--muse2/muse/midiedit/dcanvas.cpp2
-rw-r--r--muse2/muse/midiedit/dcanvas.h2
-rw-r--r--muse2/muse/midiedit/dlist.cpp5
-rw-r--r--muse2/muse/midiedit/drumedit.cpp86
-rw-r--r--muse2/muse/midiedit/drumedit.h10
-rw-r--r--muse2/muse/midiedit/ecanvas.cpp6
-rw-r--r--muse2/muse/midiedit/pianoroll.cpp155
-rw-r--r--muse2/muse/midiedit/pianoroll.h10
-rw-r--r--muse2/muse/midiedit/prcanvas.cpp2
-rw-r--r--muse2/muse/midiedit/prcanvas.h2
-rw-r--r--muse2/muse/midiedit/scoreedit.cpp361
-rw-r--r--muse2/muse/midiedit/scoreedit.h16
-rw-r--r--muse2/muse/midieditor.cpp32
-rw-r--r--muse2/muse/midieditor.h11
-rw-r--r--muse2/muse/miditransform.cpp8
-rw-r--r--muse2/muse/mixer/amixer.cpp14
-rw-r--r--muse2/muse/mixer/amixer.h1
-rw-r--r--muse2/muse/mpevent.cpp2
-rw-r--r--muse2/muse/mplugins/midiitransform.cpp8
-rw-r--r--muse2/muse/muse.log1875
-rw-r--r--muse2/muse/muse.pro370
-rw-r--r--muse2/muse/part.cpp7
-rw-r--r--muse2/muse/remote/pyapi.cpp2
-rw-r--r--muse2/muse/shortcuts.cpp12
-rw-r--r--muse2/muse/shortcuts.h10
-rw-r--r--muse2/muse/song.cpp99
-rw-r--r--muse2/muse/song.h13
-rw-r--r--muse2/muse/songfile.cpp33
-rw-r--r--muse2/muse/structure.cpp112
-rw-r--r--muse2/muse/structure.h34
-rw-r--r--muse2/muse/synth.cpp17
-rw-r--r--muse2/muse/wave.cpp4
-rw-r--r--muse2/muse/waveedit/waveedit.cpp68
-rw-r--r--muse2/muse/waveedit/waveedit.h7
-rw-r--r--muse2/muse/widgets/CMakeLists.txt9
-rw-r--r--muse2/muse/widgets/function_dialogs/crescendobase.ui15
-rw-r--r--muse2/muse/widgets/function_dialogs/deloverlapsbase.ui15
-rw-r--r--muse2/muse/widgets/function_dialogs/gatetimebase.ui15
-rw-r--r--muse2/muse/widgets/function_dialogs/legatobase.ui15
-rw-r--r--muse2/muse/widgets/function_dialogs/movebase.ui15
-rw-r--r--muse2/muse/widgets/function_dialogs/quantbase.ui24
-rw-r--r--muse2/muse/widgets/function_dialogs/removebase.ui21
-rw-r--r--muse2/muse/widgets/function_dialogs/setlenbase.ui15
-rw-r--r--muse2/muse/widgets/function_dialogs/transposebase.ui15
-rw-r--r--muse2/muse/widgets/function_dialogs/velocitybase.ui15
-rw-r--r--muse2/muse/widgets/genset.cpp129
-rw-r--r--muse2/muse/widgets/genset.h12
-rw-r--r--muse2/muse/widgets/gensetbase.ui93
-rw-r--r--muse2/muse/widgets/mdisettings.cpp59
-rw-r--r--muse2/muse/widgets/mdisettings.h49
-rw-r--r--muse2/muse/widgets/mdisettings_base.ui60
-rw-r--r--muse2/muse/widgets/midisyncimpl.cpp2
-rw-r--r--muse2/muse/widgets/midisyncimpl.h3
-rw-r--r--muse2/muse/widgets/pastedialog.cpp153
-rw-r--r--muse2/muse/widgets/pastedialog.h67
-rw-r--r--muse2/muse/widgets/pastedialogbase.ui291
-rw-r--r--muse2/muse/widgets/pasteeventsdialog.cpp175
-rw-r--r--muse2/muse/widgets/pasteeventsdialog.h69
-rw-r--r--muse2/muse/widgets/pasteeventsdialogbase.ui383
-rw-r--r--muse2/muse/widgets/pitchedit.cpp2
-rw-r--r--muse2/muse/widgets/pitchedit.h2
-rw-r--r--muse2/muse/widgets/pitchlabel.cpp2
99 files changed, 6122 insertions, 4375 deletions
diff --git a/muse2/muse/CMakeLists.txt b/muse2/muse/CMakeLists.txt
index 71baed5d..b26100f9 100644
--- a/muse2/muse/CMakeLists.txt
+++ b/muse2/muse/CMakeLists.txt
@@ -88,6 +88,7 @@ file (GLOB core_source_files
confmport.cpp
controlfifo.cpp
ctrl.cpp
+ dialogs.cpp
dssihost.cpp
event.cpp
eventlist.cpp
diff --git a/muse2/muse/app.cpp b/muse2/muse/app.cpp
index aab80a2c..773e550f 100644
--- a/muse2/muse/app.cpp
+++ b/muse2/muse/app.cpp
@@ -21,6 +21,8 @@
//
//=========================================================
+#include <typeinfo>
+
#include <QClipboard>
#include <QMessageBox>
#include <QShortcut>
@@ -29,6 +31,8 @@
#include <QWhatsThis>
#include <QSettings>
#include <QProgressDialog>
+#include <QMdiArea>
+#include <QMdiSubWindow>
#include <iostream>
@@ -38,6 +42,7 @@
#include "amixer.h"
#include "appearance.h"
#include "arranger.h"
+#include "arrangerview.h"
#include "audio.h"
#include "audiodev.h"
#include "audioprefetch.h"
@@ -69,17 +74,9 @@
#include "widgets/projectcreateimpl.h"
#include "widgets/menutitleitem.h"
#include "tools.h"
-#include "visibletracks.h"
#include "widgets/unusedwavefiles.h"
#include "functions.h"
-#ifdef DSSI_SUPPORT
-#include "dssihost.h"
-#endif
-
-#ifdef VST_SUPPORT
-#include "vst.h"
-#endif
namespace MusEApp {
@@ -127,17 +124,6 @@ pthread_t splashThread;
-void MusE::clearScoreMenuMappers()
-{
- delete scoreOneStaffPerTrackMapper;
- delete scoreAllInOneMapper;
-
- scoreOneStaffPerTrackMapper = new QSignalMapper(this);
- scoreAllInOneMapper = new QSignalMapper(this);
-
- connect(scoreOneStaffPerTrackMapper, SIGNAL(mapped(QWidget*)), this, SLOT(openInScoreEdit_oneStaffPerTrack(QWidget*)));
- connect(scoreAllInOneMapper, SIGNAL(mapped(QWidget*)), this, SLOT(openInScoreEdit_allInOne(QWidget*)));
-}
//---------------------------------------------------------
@@ -324,235 +310,6 @@ void addProject(const QString& name)
}
//---------------------------------------------------------
-// populateAddSynth
-//---------------------------------------------------------
-
-// ORCAN - CHECK
-QMenu* populateAddSynth(QWidget* parent)
-{
- QMenu* synp = new QMenu(parent);
-
- //typedef std::multimap<std::string, int, addSynth_cmp_str > asmap;
- typedef std::multimap<std::string, int > asmap;
-
- //typedef std::multimap<std::string, int, addSynth_cmp_str >::iterator imap;
- typedef std::multimap<std::string, int >::iterator imap;
-
- MessSynth* synMESS = 0;
- QMenu* synpMESS = 0;
- asmap mapMESS;
-
- #ifdef DSSI_SUPPORT
- DssiSynth* synDSSI = 0;
- QMenu* synpDSSI = 0;
- asmap mapDSSI;
- #endif
-
- #ifdef VST_SUPPORT
- VstSynth* synVST = 0;
- QMenu* synpVST = 0;
- asmap mapVST;
- #endif
-
- // Not necessary, but what the heck.
- QMenu* synpOther = 0;
- asmap mapOther;
-
- //const int synth_base_id = 0x1000;
- int ii = 0;
- for(std::vector<Synth*>::iterator i = synthis.begin(); i != synthis.end(); ++i)
- {
- synMESS = dynamic_cast<MessSynth*>(*i);
- if(synMESS)
- {
- mapMESS.insert( std::pair<std::string, int> (std::string(synMESS->description().toLower().toLatin1().constData()), ii) );
- }
- else
- {
-
- #ifdef DSSI_SUPPORT
- synDSSI = dynamic_cast<DssiSynth*>(*i);
- if(synDSSI)
- {
- mapDSSI.insert( std::pair<std::string, int> (std::string(synDSSI->description().toLower().toLatin1().constData()), ii) );
- }
- else
- #endif
-
- {
- #ifdef VST_SUPPORT
- synVST = dynamic_cast<VstSynth*>(*i);
- if(synVST)
- {
- mapVST.insert( std::pair<std::string, int> (std::string(synVST->description().toLower().toLatin1().constData()), ii) );
- }
- else
- #endif
-
- {
- mapOther.insert( std::pair<std::string, int> (std::string((*i)->description().toLower().toLatin1().constData()), ii) );
- }
- }
- }
-
- ++ii;
- }
-
- int sz = synthis.size();
- for(imap i = mapMESS.begin(); i != mapMESS.end(); ++i)
- {
- int idx = i->second;
- if(idx > sz) // Sanity check
- continue;
- Synth* s = synthis[idx];
- if(s)
- {
- // No MESS sub-menu yet? Create it now.
- if(!synpMESS)
- synpMESS = new QMenu(parent);
- QAction* sM = synpMESS->addAction(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">");
- sM->setData(MENU_ADD_SYNTH_ID_BASE + idx);
- }
- }
-
- #ifdef DSSI_SUPPORT
- for(imap i = mapDSSI.begin(); i != mapDSSI.end(); ++i)
- {
- int idx = i->second;
- if(idx > sz)
- continue;
- Synth* s = synthis[idx];
- if(s)
- {
- // No DSSI sub-menu yet? Create it now.
- if(!synpDSSI)
- synpDSSI = new QMenu(parent);
- //synpDSSI->insertItem(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">", MENU_ADD_SYNTH_ID_BASE + idx);
- QAction* sD = synpDSSI->addAction(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">");
- sD->setData(MENU_ADD_SYNTH_ID_BASE + idx);
- }
- }
- #endif
-
- #ifdef VST_SUPPORT
- for(imap i = mapVST.begin(); i != mapVST.end(); ++i)
- {
- int idx = i->second;
- if(idx > sz)
- continue;
- Synth* s = synthis[idx];
- if(s)
- {
- // No VST sub-menu yet? Create it now.
- if(!synpVST)
- synpVST = new QMenu(parent);
- QAction* sV = synpVST->addAction(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">");
- sV->setData(MENU_ADD_SYNTH_ID_BASE + idx);
- }
- }
- #endif
-
- for(imap i = mapOther.begin(); i != mapOther.end(); ++i)
- {
- int idx = i->second;
- if(idx > sz)
- continue;
- Synth* s = synthis[idx];
- // No Other sub-menu yet? Create it now.
- if(!synpOther)
- synpOther = new QMenu(parent);
- //synpOther->insertItem(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">", MENU_ADD_SYNTH_ID_BASE + idx);
- QAction* sO = synpOther->addAction(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">");
- sO->setData(MENU_ADD_SYNTH_ID_BASE + idx);
- }
-
- if(synpMESS)
- {
- synpMESS->setIcon(*synthIcon);
- synpMESS->setTitle(QT_TRANSLATE_NOOP("@default", "MESS"));
- synp->addMenu(synpMESS);
- }
-
- #ifdef DSSI_SUPPORT
- if(synpDSSI)
- {
- synpDSSI->setIcon(*synthIcon);
- synpDSSI->setTitle(QT_TRANSLATE_NOOP("@default", "DSSI"));
- synp->addMenu(synpDSSI);
- }
- #endif
-
- #ifdef VST_SUPPORT
- if(synpVST)
- {
- synpVST->setIcon(*synthIcon);
- synpVST->setTitle(QT_TRANSLATE_NOOP("@default", "FST"));
- synp->addMenu(synpVST);
- }
- #endif
-
- if(synpOther)
- {
- synpOther->setIcon(*synthIcon);
- synpOther->setTitle(QObject::tr("Other"));
- synp->addMenu(synpOther);
- }
-
- return synp;
-}
-
-//---------------------------------------------------------
-// populateAddTrack
-// this is also used in "mixer"
-//---------------------------------------------------------
-
-QActionGroup* populateAddTrack(QMenu* addTrack)
- {
- QActionGroup* grp = new QActionGroup(addTrack);
-
- QAction* midi = addTrack->addAction(QIcon(*addtrack_addmiditrackIcon),
- QT_TRANSLATE_NOOP("@default", "Add Midi Track"));
- midi->setData(Track::MIDI);
- grp->addAction(midi);
- QAction* drum = addTrack->addAction(QIcon(*addtrack_drumtrackIcon),
- QT_TRANSLATE_NOOP("@default", "Add Drum Track"));
- drum->setData(Track::DRUM);
- grp->addAction(drum);
- QAction* wave = addTrack->addAction(QIcon(*addtrack_wavetrackIcon),
- QT_TRANSLATE_NOOP("@default", "Add Wave Track"));
- wave->setData(Track::WAVE);
- grp->addAction(wave);
- QAction* aoutput = addTrack->addAction(QIcon(*addtrack_audiooutputIcon),
- QT_TRANSLATE_NOOP("@default", "Add Audio Output"));
- aoutput->setData(Track::AUDIO_OUTPUT);
- grp->addAction(aoutput);
- QAction* agroup = addTrack->addAction(QIcon(*addtrack_audiogroupIcon),
- QT_TRANSLATE_NOOP("@default", "Add Audio Group"));
- agroup->setData(Track::AUDIO_GROUP);
- grp->addAction(agroup);
- QAction* ainput = addTrack->addAction(QIcon(*addtrack_audioinputIcon),
- QT_TRANSLATE_NOOP("@default", "Add Audio Input"));
- ainput->setData(Track::AUDIO_INPUT);
- grp->addAction(ainput);
- QAction* aaux = addTrack->addAction(QIcon(*addtrack_auxsendIcon),
- QT_TRANSLATE_NOOP("@default", "Add Aux Send"));
- aaux->setData(Track::AUDIO_AUX);
- grp->addAction(aaux);
-
- // Create a sub-menu and fill it with found synth types. Make addTrack the owner.
- QMenu* synp = populateAddSynth(addTrack);
- synp->setIcon(*synthIcon);
- synp->setTitle(QT_TRANSLATE_NOOP("@default", "Add Synth"));
-
- // Add the sub-menu to the given menu.
- addTrack->addMenu(synp);
-
- QObject::connect(addTrack, SIGNAL(triggered(QAction *)), song, SLOT(addNewTrack(QAction *)));
-
- return grp;
- }
-
-//---------------------------------------------------------
// MusE
//---------------------------------------------------------
@@ -561,7 +318,6 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
{
// By T356. For LADSPA plugins in plugin.cpp
// QWidgetFactory::addWidgetFactory( new PluginWidgetFactory ); ddskrjo
-
setIconSize(ICON_SIZE);
setFocusPolicy(Qt::WheelFocus);
//setFocusPolicy(Qt::NoFocus);
@@ -578,6 +334,7 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
midiRhythmGenerator = 0;
globalSettingsConfig = 0;
markerView = 0;
+ arrangerView = 0;
softSynthesizerConfig = 0;
midiTransformerDialog = 0;
shortcutConfig = 0;
@@ -589,21 +346,25 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
editInstrument = 0;
routingPopupMenu = 0;
progress = 0;
+ activeTopWin = NULL;
+ currentMenuSharingTopwin = NULL;
appName = QString("MusE");
setWindowTitle(appName);
- editSignalMapper = new QSignalMapper(this);
midiPluginSignalMapper = new QSignalMapper(this);
followSignalMapper = new QSignalMapper(this);
- scoreOneStaffPerTrackMapper = new QSignalMapper(this);
- scoreAllInOneMapper = new QSignalMapper(this);
+ windowsMapper = new QSignalMapper(this);
+ connect(windowsMapper, SIGNAL(mapped(QWidget*)), SLOT(bringToFront(QWidget*)));
song = new Song("song");
song->blockSignals(true);
MusEGlobal::heartBeatTimer = new QTimer(this);
MusEGlobal::heartBeatTimer->setObjectName("timer");
connect(MusEGlobal::heartBeatTimer, SIGNAL(timeout()), song, SLOT(beat()));
-
+
+
+ connect(this, SIGNAL(activeTopWinChanged(TopWin*)), SLOT(activeTopWinChangedSlot(TopWin*)));
+
#ifdef ENABLE_PYTHON
//---------------------------------------------------
// Python bridge
@@ -748,61 +509,6 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
quitAction = new QAction(tr("&Quit"), this);
- //-------- Edit Actions
- editCutAction = new QAction(QIcon(*editcutIconSet), tr("C&ut"), this);
- editCopyAction = new QAction(QIcon(*editcopyIconSet), tr("&Copy"), this);
- editPasteAction = new QAction(QIcon(*editpasteIconSet), tr("&Paste"), this);
- editInsertAction = new QAction(QIcon(*editpasteIconSet), tr("&Insert"), this);
- editInsertEMAction = new QAction(QIcon(*editpasteIconSet), tr("&Insert Empty Measure"), this);
- editPasteCloneAction = new QAction(QIcon(*editpasteCloneIconSet), tr("Paste c&lone"), this);
- editPaste2TrackAction = new QAction(QIcon(*editpaste2TrackIconSet), tr("Paste to &track"), this);
- editPasteC2TAction = new QAction(QIcon(*editpasteClone2TrackIconSet), tr("Paste clone to trac&k"), this);
- editDeleteSelectedAction = new QAction(QIcon(*edit_track_delIcon), tr("Delete Selected Tracks"), this);
-
- editShrinkPartsAction = new QAction(tr("Shrink selected parts"), this); //FINDMICH TODO tooltips!
- editExpandPartsAction = new QAction(tr("Expand selected parts"), this);
- editCleanPartsAction = new QAction(tr("Clean selected parts"), this);
-
-
- addTrack = new QMenu(tr("Add Track"), this);
- addTrack->setIcon(QIcon(*edit_track_addIcon));
- select = new QMenu(tr("Select"), this);
- select->setIcon(QIcon(*selectIcon));
-
- editSelectAllAction = new QAction(QIcon(*select_allIcon), tr("Select &All"), this);
- editDeselectAllAction = new QAction(QIcon(*select_deselect_allIcon), tr("&Deselect All"), this);
- editInvertSelectionAction = new QAction(QIcon(*select_invert_selectionIcon), tr("Invert &Selection"), this);
- editInsideLoopAction = new QAction(QIcon(*select_inside_loopIcon), tr("&Inside Loop"), this);
- editOutsideLoopAction = new QAction(QIcon(*select_outside_loopIcon), tr("&Outside Loop"), this);
- editAllPartsAction = new QAction( QIcon(*select_all_parts_on_trackIcon), tr("All &Parts on Track"), this);
-
-
- scoreSubmenu = new QMenu(tr("Score"), this);
- scoreSubmenu->setIcon(QIcon(*scoreIconSet));
-
- scoreAllInOneSubsubmenu = new QMenu(tr("all parts in one staff"), this);
- scoreOneStaffPerTrackSubsubmenu = new QMenu(tr("one staff per part"), this);
-
- scoreSubmenu->addMenu(scoreAllInOneSubsubmenu);
- scoreSubmenu->addMenu(scoreOneStaffPerTrackSubsubmenu);
- updateScoreMenus();
-
- startScoreEditAction = new QAction(*scoreIconSet, tr("New score window"), this);
- startPianoEditAction = new QAction(*pianoIconSet, tr("Pianoroll"), this);
- startDrumEditAction = new QAction(QIcon(*edit_drummsIcon), tr("Drums"), this);
- startListEditAction = new QAction(QIcon(*edit_listIcon), tr("List"), this);
- startWaveEditAction = new QAction(QIcon(*edit_waveIcon), tr("Wave"), this);
-
- master = new QMenu(tr("Mastertrack"), this);
- master->setIcon(QIcon(*edit_mastertrackIcon));
- masterGraphicAction = new QAction(QIcon(*mastertrack_graphicIcon),tr("Graphic"), this);
- masterListAction = new QAction(QIcon(*mastertrack_listIcon),tr("List"), this);
-
- midiEdit = new QMenu(tr("Midi"), this);
- midiEdit->setIcon(QIcon(*edit_midiIcon));
-
- midiTransformerAction = new QAction(QIcon(*midi_transformIcon), tr("Midi &Transform"), this);
-
editSongInfoAction = new QAction(QIcon(*edit_listIcon), tr("Song Info"), this);
//-------- View Actions
@@ -818,15 +524,11 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
viewCliplistAction->setCheckable(true);
viewMarkerAction = new QAction(QIcon(*view_markerIcon), tr("Marker View"), this);
viewMarkerAction->setCheckable(true);
-
- //-------- Structure Actions
- strGlobalCutAction = new QAction(tr("Global Cut"), this);
- strGlobalInsertAction = new QAction(tr("Global Insert"), this);
- strGlobalSplitAction = new QAction(tr("Global Split"), this);
- strCopyRangeAction = new QAction(tr("Copy Range"), this);
- strCopyRangeAction->setEnabled(false);
- strCutEventsAction = new QAction(tr("Cut Events"), this);
- strCutEventsAction->setEnabled(false);
+ viewArrangerAction = new QAction(tr("Arranger View"), this);
+ viewArrangerAction->setCheckable(true);
+ fullscreenAction=new QAction(tr("Fullscreen"), this);
+ fullscreenAction->setCheckable(true);
+ fullscreenAction->setChecked(false);
//-------- Midi Actions
menuScriptPlugins = new QMenu(tr("&Plugins"), this);
@@ -855,8 +557,15 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
autoSnapshotAction = new QAction(QIcon(*automation_take_snapshotIcon), tr("Take Snapshot"), this);
autoClearAction = new QAction(QIcon(*automation_clear_dataIcon), tr("Clear Automation Data"), this);
autoClearAction->setEnabled(false);
+
-
+ //-------- Windows Actions
+ windowsCascadeAction = new QAction(tr("Cascade"), this);
+ windowsTileAction = new QAction(tr("Tile"), this);
+ windowsRowsAction = new QAction(tr("In rows"), this);
+ windowsColumnsAction = new QAction(tr("In columns"), this);
+
+
//-------- Settings Actions
settingsGlobalAction = new QAction(QIcon(*settings_globalsettingsIcon), tr("Global Settings"), this);
settingsShortcutsAction = new QAction(QIcon(*settings_configureshortcutsIcon), tr("Configure Shortcuts"), this);
@@ -901,63 +610,6 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
connect(fileMoveWaveFiles, SIGNAL(activated()), SLOT(findUnusedWaveFiles()));
connect(quitAction, SIGNAL(activated()), SLOT(quitDoc()));
- //-------- Edit connections
- connect(editCutAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
- connect(editCopyAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
- connect(editPasteAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
- connect(editInsertAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
- connect(editInsertEMAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
- connect(editPasteCloneAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
- connect(editPaste2TrackAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
- connect(editPasteC2TAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
- connect(editDeleteSelectedAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
-
- connect(editShrinkPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
- connect(editExpandPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
- connect(editCleanPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
-
- connect(editSelectAllAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
- connect(editDeselectAllAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
- connect(editInvertSelectionAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
- connect(editInsideLoopAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
- connect(editOutsideLoopAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
- connect(editAllPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
-
- editSignalMapper->setMapping(editCutAction, CMD_CUT);
- editSignalMapper->setMapping(editCopyAction, CMD_COPY);
- editSignalMapper->setMapping(editPasteAction, CMD_PASTE);
- editSignalMapper->setMapping(editInsertAction, CMD_INSERT);
- editSignalMapper->setMapping(editPasteCloneAction, CMD_PASTE_CLONE);
- editSignalMapper->setMapping(editPaste2TrackAction, CMD_PASTE_TO_TRACK);
- editSignalMapper->setMapping(editPasteC2TAction, CMD_PASTE_CLONE_TO_TRACK);
- editSignalMapper->setMapping(editInsertEMAction, CMD_INSERTMEAS);
- editSignalMapper->setMapping(editDeleteSelectedAction, CMD_DELETE_TRACK);
- editSignalMapper->setMapping(editShrinkPartsAction, CMD_SHRINK_PART);
- editSignalMapper->setMapping(editExpandPartsAction, CMD_EXPAND_PART);
- editSignalMapper->setMapping(editCleanPartsAction, CMD_CLEAN_PART);
- editSignalMapper->setMapping(editSelectAllAction, CMD_SELECT_ALL);
- editSignalMapper->setMapping(editDeselectAllAction, CMD_SELECT_NONE);
- editSignalMapper->setMapping(editInvertSelectionAction, CMD_SELECT_INVERT);
- editSignalMapper->setMapping(editInsideLoopAction, CMD_SELECT_ILOOP);
- editSignalMapper->setMapping(editOutsideLoopAction, CMD_SELECT_OLOOP);
- editSignalMapper->setMapping(editAllPartsAction, CMD_SELECT_PARTS);
-
- connect(editSignalMapper, SIGNAL(mapped(int)), this, SLOT(cmd(int)));
-
- connect(startPianoEditAction, SIGNAL(activated()), SLOT(startPianoroll()));
- connect(startScoreEditAction, SIGNAL(activated()), SLOT(startScoreQuickly()));
- connect(startDrumEditAction, SIGNAL(activated()), SLOT(startDrumEditor()));
- connect(startListEditAction, SIGNAL(activated()), SLOT(startListEditor()));
- connect(startWaveEditAction, SIGNAL(activated()), SLOT(startWaveEditor()));
- connect(scoreOneStaffPerTrackMapper, SIGNAL(mapped(QWidget*)), this, SLOT(openInScoreEdit_oneStaffPerTrack(QWidget*)));
- connect(scoreAllInOneMapper, SIGNAL(mapped(QWidget*)), this, SLOT(openInScoreEdit_allInOne(QWidget*)));
-
-
- connect(masterGraphicAction, SIGNAL(activated()), SLOT(startMasterEditor()));
- connect(masterListAction, SIGNAL(activated()), SLOT(startLMasterEditor()));
-
- connect(midiTransformerAction, SIGNAL(activated()), SLOT(startMidiTransformer()));
-
connect(editSongInfoAction, SIGNAL(activated()), SLOT(startSongInfo()));
//-------- View connections
@@ -967,13 +619,8 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
connect(viewMixerBAction, SIGNAL(toggled(bool)), SLOT(toggleMixer2(bool)));
connect(viewCliplistAction, SIGNAL(toggled(bool)), SLOT(startClipList(bool)));
connect(viewMarkerAction, SIGNAL(toggled(bool)), SLOT(toggleMarker(bool)));
-
- //-------- Structure connections
- connect(strGlobalCutAction, SIGNAL(activated()), SLOT(globalCut()));
- connect(strGlobalInsertAction, SIGNAL(activated()), SLOT(globalInsert()));
- connect(strGlobalSplitAction, SIGNAL(activated()), SLOT(globalSplit()));
- connect(strCopyRangeAction, SIGNAL(activated()), SLOT(copyRange()));
- connect(strCutEventsAction, SIGNAL(activated()), SLOT(cutEvents()));
+ connect(viewArrangerAction, SIGNAL(toggled(bool)), SLOT(toggleArranger(bool)));
+ connect(fullscreenAction, SIGNAL(toggled(bool)), SLOT(setFullscreen(bool)));
//-------- Midi connections
connect(midiEditInstAction, SIGNAL(activated()), SLOT(startEditInstrument()));
@@ -1034,47 +681,35 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
connect(helpAboutAction, SIGNAL(activated()), SLOT(about()));
//--------------------------------------------------
- // Miscellaneous shortcuts
- //--------------------------------------------------
-
- QShortcut* sc = new QShortcut(shortcuts[SHRT_DELETE].key, this);
- sc->setContext(Qt::WindowShortcut);
- connect(sc, SIGNAL(activated()), editSignalMapper, SLOT(map()));
- editSignalMapper->setMapping(sc, CMD_DELETE);
-
- //--------------------------------------------------
// Toolbar
//--------------------------------------------------
+ // when adding a toolbar to the main window, remember adding it to
+ // either the requiredToolbars or optionalToolbars list!
+
tools = addToolBar(tr("File Buttons"));
tools->setObjectName("File Buttons");
tools->addAction(fileNewAction);
tools->addAction(fileOpenAction);
tools->addAction(fileSaveAction);
-
-
- //
- // Whats This
- //
tools->addAction(QWhatsThis::createAction(this));
- tools->addSeparator();
- tools->addActions(MusEGlobal::undoRedo->actions());
-
- tools1 = new MusEWidget::EditToolBar(this, MusEWidget::arrangerTools);
- addToolBar(tools1);
- tools1->setObjectName("arrangerTools");
+ QToolBar* undoToolbar = addToolBar(tr("Undo/Redo"));
+ undoToolbar->setObjectName("Undo/Redo (global)");
+ undoToolbar->addActions(MusEGlobal::undoRedo->actions());
QToolBar* transportToolbar = addToolBar(tr("Transport"));
- transportToolbar->setObjectName("Transport");
+ transportToolbar->setObjectName("Transport (global)");
transportToolbar->addActions(MusEGlobal::transportAction->actions());
QToolBar* panicToolbar = addToolBar(tr("Panic"));
- panicToolbar->setObjectName("Panic");
+ panicToolbar->setObjectName("Panic (global)");
panicToolbar->addAction(MusEGlobal::panicAction);
- visTracks = new MusEWidget::VisibleTracks(this);
- addToolBar(visTracks);
+ requiredToolbars.push_back(tools);
+ optionalToolbars.push_back(undoToolbar);
+ optionalToolbars.push_back(transportToolbar);
+ optionalToolbars.push_back(panicToolbar);
//rlimit lim;
@@ -1107,11 +742,20 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
//---------------------------------------------------
+ // when adding a menu to the main window, remember adding it to
+ // either the leadingMenus or trailingMenus list!
+ // also do NOT use menuBar()->addMenu(QString&), but ALWAYS
+ // create the menu with new QMenu and add it afterwards.
+ // the menu's owner must be this and not this->menuBar()!
+
+
//-------------------------------------------------------------
// popup File
//-------------------------------------------------------------
- menu_file = menuBar()->addMenu(tr("&File"));
+ menu_file = new QMenu(tr("&File"), this);
+ menuBar()->addMenu(menu_file);
+ leadingMenus.push_back(menu_file);
menu_file->addAction(fileNewAction);
menu_file->addAction(fileOpenAction);
menu_file->addMenu(openRecent);
@@ -1119,6 +763,8 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
menu_file->addAction(fileSaveAction);
menu_file->addAction(fileSaveAsAction);
menu_file->addSeparator();
+ menu_file->addAction(editSongInfoAction);
+ menu_file->addSeparator();
menu_file->addAction(fileImportMidiAction);
menu_file->addAction(fileExportMidiAction);
menu_file->addAction(fileImportPartAction);
@@ -1130,72 +776,15 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
menu_file->addAction(quitAction);
menu_file->addSeparator();
- //-------------------------------------------------------------
- // popup Edit
- //-------------------------------------------------------------
- menuEdit = menuBar()->addMenu(tr("&Edit"));
- menuEdit->addActions(MusEGlobal::undoRedo->actions());
- menuEdit->addSeparator();
-
- menuEdit->addAction(editCutAction);
- menuEdit->addAction(editCopyAction);
- menuEdit->addAction(editPasteAction);
- menuEdit->addAction(editInsertAction);
- menuEdit->addAction(editInsertEMAction);
- menuEdit->addAction(editPasteCloneAction);
- menuEdit->addAction(editPaste2TrackAction);
- menuEdit->addAction(editPasteC2TAction);
- menuEdit->addSeparator();
- menuEdit->addAction(editShrinkPartsAction);
- menuEdit->addAction(editExpandPartsAction);
- menuEdit->addAction(editCleanPartsAction);
- menuEdit->addSeparator();
- menuEdit->addAction(editDeleteSelectedAction);
-
- // Moved below. Have to wait until synths are available...
- //populateAddTrack(addTrack);
- menuEdit->addMenu(addTrack);
- menuEdit->addMenu(select);
- select->addAction(editSelectAllAction);
- select->addAction(editDeselectAllAction);
- select->addAction(editInvertSelectionAction);
- select->addAction(editInsideLoopAction);
- select->addAction(editOutsideLoopAction);
- select->addAction(editAllPartsAction);
- menuEdit->addSeparator();
-
- menuEdit->addAction(startPianoEditAction);
- menuEdit->addMenu(scoreSubmenu);
- menuEdit->addAction(startScoreEditAction);
- menuEdit->addAction(startDrumEditAction);
- menuEdit->addAction(startListEditAction);
- menuEdit->addAction(startWaveEditAction);
-
- menuEdit->addMenu(master);
- master->addAction(masterGraphicAction);
- master->addAction(masterListAction);
- menuEdit->addSeparator();
-
-
- menuEdit->addMenu(midiEdit);
-/* commented out by flo: these are not implemented,
- but maybe will be in future (state: revision 988)
- midiEdit->insertItem(tr("Copy Measure"), this, SLOT(copyMeasure()));
- midiEdit->insertItem(tr("Erase Measure"), this, SLOT(eraseMeasure()));
- midiEdit->insertItem(tr("Delete Measure"), this, SLOT(deleteMeasure()));
- midiEdit->insertItem(tr("Create Measure"), this, SLOT(createMeasure()));
- midiEdit->insertItem(tr("Mix Track"), this, SLOT(mixTrack()));
-*/
- midiEdit->addAction(midiTransformerAction);
-
- menuEdit->addAction(editSongInfoAction);
//-------------------------------------------------------------
// popup View
//-------------------------------------------------------------
- menuView = menuBar()->addMenu(tr("&View"));
+ menuView = new QMenu(tr("&View"), this);
+ menuBar()->addMenu(menuView);
+ trailingMenus.push_back(menuView);
menuView->addAction(viewTransportAction);
menuView->addAction(viewBigtimeAction);
@@ -1203,25 +792,19 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
menuView->addAction(viewMixerBAction);
menuView->addAction(viewCliplistAction);
menuView->addAction(viewMarkerAction);
+ menuView->addAction(viewArrangerAction);
+ menuView->addSeparator();
+ menuView->addAction(fullscreenAction);
//-------------------------------------------------------------
- // popup Structure
- //-------------------------------------------------------------
-
- menuStructure = menuBar()->addMenu(tr("&Structure"));
- menuStructure->addAction(strGlobalCutAction);
- menuStructure->addAction(strGlobalInsertAction);
- menuStructure->addAction(strGlobalSplitAction);
- menuStructure->addAction(strCopyRangeAction);
- menuStructure->addSeparator();
- menuStructure->addAction(strCutEventsAction);
-
- //-------------------------------------------------------------
// popup Midi
//-------------------------------------------------------------
- menu_functions = menuBar()->addMenu(tr("&Midi"));
+ menu_functions = new QMenu(tr("&Midi"), this);
+ menuBar()->addMenu(menu_functions);
+ trailingMenus.push_back(menu_functions);
+
song->populateScriptMenu(menuScriptPlugins, this);
menu_functions->addMenu(menuScriptPlugins);
menu_functions->addAction(midiEditInstAction);
@@ -1247,7 +830,10 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
// popup Audio
//-------------------------------------------------------------
- menu_audio = menuBar()->addMenu(tr("&Audio"));
+ menu_audio = new QMenu(tr("&Audio"), this);
+ menuBar()->addMenu(menu_audio);
+ trailingMenus.push_back(menu_audio);
+
menu_audio->addAction(audioBounce2TrackAction);
menu_audio->addAction(audioBounce2FileAction);
menu_audio->addSeparator();
@@ -1258,17 +844,36 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
// popup Automation
//-------------------------------------------------------------
- menuAutomation = menuBar()->addMenu(tr("A&utomation"));
+ menuAutomation = new QMenu(tr("A&utomation"), this);
+ menuBar()->addMenu(menuAutomation);
+ trailingMenus.push_back(menuAutomation);
+
menuAutomation->addAction(autoMixerAction);
menuAutomation->addSeparator();
menuAutomation->addAction(autoSnapshotAction);
menuAutomation->addAction(autoClearAction);
//-------------------------------------------------------------
+ // popup Windows
+ //-------------------------------------------------------------
+
+ menuWindows = new QMenu(tr("&Windows"), this);
+ menuBar()->addMenu(menuWindows);
+ trailingMenus.push_back(menuWindows);
+
+ menuWindows->addAction(windowsCascadeAction);
+ menuWindows->addAction(windowsTileAction);
+ menuWindows->addAction(windowsRowsAction);
+ menuWindows->addAction(windowsColumnsAction);
+
+ //-------------------------------------------------------------
// popup Settings
//-------------------------------------------------------------
- menuSettings = menuBar()->addMenu(tr("Se&ttings"));
+ menuSettings = new QMenu(tr("MusE Se&ttings"), this);
+ menuBar()->addMenu(menuSettings);
+ trailingMenus.push_back(menuSettings);
+
menuSettings->addAction(settingsGlobalAction);
menuSettings->addAction(settingsShortcutsAction);
menuSettings->addMenu(follow);
@@ -1288,7 +893,10 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
// popup Help
//---------------------------------------------------
- menu_help = menuBar()->addMenu(tr("&Help"));
+ menu_help = new QMenu(tr("&Help"), this);
+ menuBar()->addMenu(menu_help);
+ trailingMenus.push_back(menu_help);
+
menu_help->addAction(helpManualAction);
menu_help->addAction(helpHomepageAction);
menu_help->addSeparator();
@@ -1300,24 +908,33 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
//menu_help->addSeparator();
//menu_ids[CMD_START_WHATSTHIS] = menu_help->insertItem(tr("What's &This?"), this, SLOT(whatsThis()), 0);
+
//---------------------------------------------------
// Central Widget
//---------------------------------------------------
- arranger = new Arranger(this, "arranger");
- setCentralWidget(arranger);
- connect(tools1, SIGNAL(toolChanged(int)), arranger, SLOT(setTool(int)));
- connect(visTracks, SIGNAL(visibilityChanged()), song, SLOT(update()) );
- connect(arranger, SIGNAL(editPart(Track*)), SLOT(startEditor(Track*)));
- connect(arranger, SIGNAL(dropSongFile(const QString&)), SLOT(loadProjectFile(const QString&)));
- connect(arranger, SIGNAL(dropMidiFile(const QString&)), SLOT(importMidi(const QString&)));
- connect(arranger, SIGNAL(startEditor(PartList*,int)), SLOT(startEditor(PartList*,int)));
- connect(arranger, SIGNAL(toolChanged(int)), tools1, SLOT(set(int)));
- connect(this, SIGNAL(configChanged()), arranger, SLOT(configChanged()));
+ mdiArea=new QMdiArea(this);
+ mdiArea->setOption(QMdiArea::DontMaximizeSubWindowOnActivation);
+ mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ setCentralWidget(mdiArea);
+ connect(windowsTileAction, SIGNAL(activated()), this, SLOT(tileSubWindows()));
+ connect(windowsRowsAction, SIGNAL(activated()), this, SLOT(arrangeSubWindowsRows()));
+ connect(windowsColumnsAction, SIGNAL(activated()), this, SLOT(arrangeSubWindowsColumns()));
+ connect(windowsCascadeAction, SIGNAL(activated()), mdiArea, SLOT(cascadeSubWindows()));
- connect(arranger, SIGNAL(setUsedTool(int)), SLOT(setUsedTool(int)));
+ arrangerView = new ArrangerView(this);
+ arrangerView->shareToolsAndMenu(true);
+ connect(arrangerView, SIGNAL(closed()), SLOT(arrangerClosed()));
+ toplevels.push_back(arrangerView);
+ arrangerView->hide();
+ _arranger=arrangerView->getArranger();
+
+ arrangerView->setIsMdiWin(true);
+
+
//---------------------------------------------------
// read list of "Recent Projects"
//---------------------------------------------------
@@ -1347,24 +964,12 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
initMidiSynth();
- QActionGroup *grp = populateAddTrack(addTrack);
-
- trackMidiAction = grp->actions()[0];
- trackDrumAction = grp->actions()[1];
- trackWaveAction = grp->actions()[2];
- trackAOutputAction = grp->actions()[3];
- trackAGroupAction = grp->actions()[4];
- trackAInputAction = grp->actions()[5];
- trackAAuxAction = grp->actions()[6];
+ arrangerView->populateAddTrack();
+ arrangerView->updateShortcuts();
transport = new Transport(this, "transport");
bigtime = 0;
- QClipboard* cb = QApplication::clipboard();
- connect(cb, SIGNAL(dataChanged()), SLOT(clipboardChanged()));
- connect(cb, SIGNAL(selectionChanged()), SLOT(clipboardChanged()));
- connect(arranger, SIGNAL(selectionChanged()), SLOT(selectionChanged()));
-
//---------------------------------------------------
// load project
// if no songname entered on command line:
@@ -1398,10 +1003,12 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
changeConfig(false);
QSettings settings("MusE", "MusE-qt");
- //restoreGeometry(settings.value("MusE/geometry").toByteArray());
- restoreState(settings.value("MusE/windowState").toByteArray());
+ restoreGeometry(settings.value("MusE/geometry").toByteArray());
+ //restoreState(settings.value("MusE/windowState").toByteArray());
song->update();
+
+ updateWindowMenu();
}
MusE::~MusE()
@@ -1515,7 +1122,7 @@ void MusE::loadProjectFile(const QString& name, bool songTemplate, bool loadAll)
if (restartSequencer)
seqStart();
- visTracks->updateVisibleTracksButtons();
+ arrangerView->updateVisibleTracksButtons();
progress->setValue(100);
delete progress;
progress=0;
@@ -1544,7 +1151,7 @@ void MusE::loadProjectFile1(const QString& name, bool songTemplate, bool loadAll
mixer1->clear();
if (mixer2)
mixer2->clear();
- arranger->clear(); // clear track info
+ _arranger->clear(); // clear track info
//if (clearSong())
if (clearSong(loadAll)) // Allow not touching things like midi ports. p4.0.17 TESTING: Maybe some problems...
return;
@@ -1624,6 +1231,7 @@ void MusE::loadProjectFile1(const QString& name, bool songTemplate, bool loadAll
viewTransportAction->setChecked(MusEConfig::config.transportVisible);
viewBigtimeAction->setChecked(MusEConfig::config.bigTimeVisible);
viewMarkerAction->setChecked(MusEConfig::config.markerVisible);
+ viewArrangerAction->setChecked(MusEConfig::config.arrangerVisible);
autoMixerAction->setChecked(MusEGlobal::automation);
@@ -1669,9 +1277,9 @@ void MusE::loadProjectFile1(const QString& name, bool songTemplate, bool loadAll
MusEGlobal::loopAction->setChecked(song->loop());
song->update();
song->updatePos();
- clipboardChanged(); // enable/disable "Paste"
- selectionChanged(); // enable/disable "Copy" & "Paste"
- scoreNamingChanged(); // inform the score menus about the new scores and their names
+ arrangerView->clipboardChanged(); // enable/disable "Paste"
+ arrangerView->selectionChanged(); // enable/disable "Copy" & "Paste"
+ arrangerView->scoreNamingChanged(); // inform the score menus about the new scores and their names
progress->setValue(50);
// p3.3.53 Try this AFTER the song update above which does a mixer update... Tested OK - mixers resize properly now.
@@ -1707,6 +1315,27 @@ void MusE::loadProjectFile1(const QString& name, bool songTemplate, bool loadAll
showMarker(MusEConfig::config.markerVisible);
}
+ if (songTemplate)
+ {
+ // maximize the arranger in traditional SDI mode
+ if (TopWin::_defaultSubwin[TopWin::ARRANGER])
+ {
+ bool maximizeArranger=true;
+ for (int i=0; i<TopWin::TOPLEVELTYPE_LAST_ENTRY; i++)
+ if ((i!=TopWin::ARRANGER) && TopWin::_defaultSubwin[i])
+ {
+ maximizeArranger=false;
+ break;
+ }
+
+ if (maximizeArranger)
+ {
+ arrangerView->showMaximized();
+ bringToFront(arrangerView);
+ }
+ }
+ }
+
}
//---------------------------------------------------------
@@ -1896,8 +1525,10 @@ void MusE::closeEvent(QCloseEvent* event)
}
QSettings settings("MusE", "MusE-qt");
- //settings.setValue("MusE/geometry", saveGeometry());
- settings.setValue("MusE/windowState", saveState());
+ settings.setValue("MusE/geometry", saveGeometry());
+ //settings.setValue("MusE/windowState", saveState());
+
+ writeGlobalConfiguration();
// save "Open Recent" list
QString prjPath(MusEGlobal::configPath);
@@ -1995,16 +1626,17 @@ void MusE::showMarker(bool flag)
if (markerView == 0) {
markerView = new MarkerView(this);
- // Removed p3.3.43
- // Song::addMarker() already emits a 'markerChanged'.
- //connect(arranger, SIGNAL(addMarker(int)), markerView, SLOT(addMarker(int)));
-
connect(markerView, SIGNAL(closed()), SLOT(markerClosed()));
- toplevels.push_back(Toplevel(Toplevel::MARKER, (unsigned long)(markerView), markerView));
+ toplevels.push_back(markerView);
markerView->show();
}
markerView->setVisible(flag);
viewMarkerAction->setChecked(flag);
+ if (!flag)
+ if (currentMenuSharingTopwin == markerView)
+ setCurrentMenuSharingTopwin(NULL);
+
+ updateWindowMenu();
}
//---------------------------------------------------------
@@ -2014,6 +1646,43 @@ void MusE::showMarker(bool flag)
void MusE::markerClosed()
{
viewMarkerAction->setChecked(false);
+ if (currentMenuSharingTopwin == markerView)
+ setCurrentMenuSharingTopwin(NULL);
+
+ updateWindowMenu();
+ }
+
+//---------------------------------------------------------
+// toggleArranger
+//---------------------------------------------------------
+
+void MusE::toggleArranger(bool checked)
+ {
+ showArranger(checked);
+ }
+
+//---------------------------------------------------------
+// showArranger
+//---------------------------------------------------------
+
+void MusE::showArranger(bool flag)
+ {
+ arrangerView->setVisible(flag);
+ viewArrangerAction->setChecked(flag);
+ if (!flag)
+ if (currentMenuSharingTopwin == arrangerView)
+ setCurrentMenuSharingTopwin(NULL);
+ updateWindowMenu();
+ }
+
+//---------------------------------------------------------
+// arrangerClosed
+//---------------------------------------------------------
+
+void MusE::arrangerClosed()
+ {
+ viewArrangerAction->setChecked(false);
+ updateWindowMenu();
}
//---------------------------------------------------------
@@ -2141,48 +1810,6 @@ PartList* MusE::getMidiPartsToEdit()
return pl;
}
-void MusE::scoreNamingChanged()
-{
- updateScoreMenus();
-}
-
-void MusE::updateScoreMenus()
-{
- QAction* action;
-
-
- scoreOneStaffPerTrackSubsubmenu->clear();
- scoreAllInOneSubsubmenu->clear();
-
-
- action=new QAction(tr("New"), this);
- connect(action, SIGNAL(activated()), scoreOneStaffPerTrackMapper, SLOT(map()));
- scoreOneStaffPerTrackMapper->setMapping(action, (QWidget*)NULL);
- scoreOneStaffPerTrackSubsubmenu->addAction(action);
-
-
- action=new QAction(tr("New"), this); //the above action may NOT be reused!
- connect(action, SIGNAL(activated()), scoreAllInOneMapper, SLOT(map()));
- scoreAllInOneMapper->setMapping(action, (QWidget*)NULL);
- scoreAllInOneSubsubmenu->addAction(action);
-
- for (ToplevelList::iterator it=toplevels.begin(); it!=toplevels.end(); it++)
- if (it->type()==Toplevel::SCORE)
- {
- ScoreEdit* score = (ScoreEdit*) it->cobject();
-
- action=new QAction(score->get_name(), this);
- connect(action, SIGNAL(activated()), scoreOneStaffPerTrackMapper, SLOT(map()));
- scoreOneStaffPerTrackMapper->setMapping(action, (QWidget*)score);
- scoreOneStaffPerTrackSubsubmenu->addAction(action);
-
-
- action=new QAction(score->get_name(), this); //the above action may NOT be reused!
- connect(action, SIGNAL(activated()), scoreAllInOneMapper, SLOT(map()));
- scoreAllInOneMapper->setMapping(action, (QWidget*)score);
- scoreAllInOneSubsubmenu->addAction(action);
- }
-}
//---------------------------------------------------------
// startScoreEdit
@@ -2210,16 +1837,17 @@ void MusE::openInScoreEdit(ScoreEdit* destination, PartList* pl, bool allInOne)
{
if (destination==NULL) // if no destination given, create a new one
{
- destination = new ScoreEdit(this, 0, arranger->cursorValue());
+ destination = new ScoreEdit(this, 0, _arranger->cursorValue());
destination->show();
- toplevels.push_back(Toplevel(Toplevel::SCORE, (unsigned long)(destination), destination));
- connect(destination, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long)));
- connect(destination, SIGNAL(name_changed()), SLOT(scoreNamingChanged()));
+ toplevels.push_back(destination);
+ connect(destination, SIGNAL(deleted(TopWin*)), SLOT(toplevelDeleted(TopWin*)));
+ connect(destination, SIGNAL(name_changed()), arrangerView, SLOT(scoreNamingChanged()));
//connect(muse, SIGNAL(configChanged()), destination, SLOT(config_changed()));
//commented out by flo, because the ScoreEditor connects to all
//relevant signals on his own
- updateScoreMenus();
+ arrangerView->updateScoreMenus();
+ updateWindowMenu();
}
destination->add_parts(pl, allInOne);
@@ -2245,13 +1873,14 @@ void MusE::startPianoroll()
void MusE::startPianoroll(PartList* pl, bool showDefaultCtrls)
{
- PianoRoll* pianoroll = new PianoRoll(pl, this, 0, arranger->cursorValue());
+ PianoRoll* pianoroll = new PianoRoll(pl, this, 0, _arranger->cursorValue());
if(showDefaultCtrls) // p4.0.12
pianoroll->addCtrl();
pianoroll->show();
- toplevels.push_back(Toplevel(Toplevel::PIANO_ROLL, (unsigned long)(pianoroll), pianoroll));
- connect(pianoroll, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long)));
+ toplevels.push_back(pianoroll);
+ connect(pianoroll, SIGNAL(deleted(TopWin*)), SLOT(toplevelDeleted(TopWin*)));
connect(MusEGlobal::muse, SIGNAL(configChanged()), pianoroll, SLOT(configChanged()));
+ updateWindowMenu();
}
//---------------------------------------------------------
@@ -2270,9 +1899,10 @@ void MusE::startListEditor(PartList* pl)
{
ListEdit* listEditor = new ListEdit(pl);
listEditor->show();
- toplevels.push_back(Toplevel(Toplevel::LISTE, (unsigned long)(listEditor), listEditor));
- connect(listEditor, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long)));
+ toplevels.push_back(listEditor);
+ connect(listEditor, SIGNAL(deleted(TopWin*)), SLOT(toplevelDeleted(TopWin*)));
connect(MusEGlobal::muse,SIGNAL(configChanged()), listEditor, SLOT(configChanged()));
+ updateWindowMenu();
}
//---------------------------------------------------------
@@ -2283,8 +1913,9 @@ void MusE::startMasterEditor()
{
MasterEdit* masterEditor = new MasterEdit();
masterEditor->show();
- toplevels.push_back(Toplevel(Toplevel::MASTER, (unsigned long)(masterEditor), masterEditor));
- connect(masterEditor, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long)));
+ toplevels.push_back(masterEditor);
+ connect(masterEditor, SIGNAL(deleted(TopWin*)), SLOT(toplevelDeleted(TopWin*)));
+ updateWindowMenu();
}
//---------------------------------------------------------
@@ -2295,9 +1926,10 @@ void MusE::startLMasterEditor()
{
LMaster* lmaster = new LMaster();
lmaster->show();
- toplevels.push_back(Toplevel(Toplevel::LMASTER, (unsigned long)(lmaster), lmaster));
- connect(lmaster, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long)));
+ toplevels.push_back(lmaster);
+ connect(lmaster, SIGNAL(deleted(TopWin*)), SLOT(toplevelDeleted(TopWin*)));
connect(MusEGlobal::muse, SIGNAL(configChanged()), lmaster, SLOT(configChanged()));
+ updateWindowMenu();
}
//---------------------------------------------------------
@@ -2315,13 +1947,14 @@ void MusE::startDrumEditor()
void MusE::startDrumEditor(PartList* pl, bool showDefaultCtrls)
{
- DrumEdit* drumEditor = new DrumEdit(pl, this, 0, arranger->cursorValue());
+ DrumEdit* drumEditor = new DrumEdit(pl, this, 0, _arranger->cursorValue());
if(showDefaultCtrls) // p4.0.12
drumEditor->addCtrl();
drumEditor->show();
- toplevels.push_back(Toplevel(Toplevel::DRUM, (unsigned long)(drumEditor), drumEditor));
- connect(drumEditor, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long)));
+ toplevels.push_back(drumEditor);
+ connect(drumEditor, SIGNAL(deleted(TopWin*)), SLOT(toplevelDeleted(TopWin*)));
connect(MusEGlobal::muse, SIGNAL(configChanged()), drumEditor, SLOT(configChanged()));
+ updateWindowMenu();
}
//---------------------------------------------------------
@@ -2343,8 +1976,9 @@ void MusE::startWaveEditor(PartList* pl)
WaveEdit* waveEditor = new WaveEdit(pl);
waveEditor->show();
connect(MusEGlobal::muse, SIGNAL(configChanged()), waveEditor, SLOT(configChanged()));
- toplevels.push_back(Toplevel(Toplevel::WAVE, (unsigned long)(waveEditor), waveEditor));
- connect(waveEditor, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long)));
+ toplevels.push_back(waveEditor);
+ connect(waveEditor, SIGNAL(deleted(TopWin*)), SLOT(toplevelDeleted(TopWin*)));
+ updateWindowMenu();
}
@@ -2400,11 +2034,12 @@ void MusE::startClipList(bool checked)
if (clipListEdit == 0) {
//clipListEdit = new ClipListEdit();
clipListEdit = new ClipListEdit(this);
- toplevels.push_back(Toplevel(Toplevel::CLIPLIST, (unsigned long)(clipListEdit), clipListEdit));
- connect(clipListEdit, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long)));
+ toplevels.push_back(clipListEdit);
+ connect(clipListEdit, SIGNAL(deleted(TopWin*)), SLOT(toplevelDeleted(TopWin*)));
}
clipListEdit->show();
viewCliplistAction->setChecked(checked);
+ updateWindowMenu();
}
//---------------------------------------------------------
@@ -2449,63 +2084,57 @@ void MusE::selectProject(QAction* act)
// toplevelDeleted
//---------------------------------------------------------
-void MusE::toplevelDeleted(unsigned long tl)
+void MusE::toplevelDeleted(TopWin* tl)
{
for (iToplevel i = toplevels.begin(); i != toplevels.end(); ++i) {
- if (i->object() == tl) {
+ if (*i == tl) {
+
+ if (tl == currentMenuSharingTopwin)
+ setCurrentMenuSharingTopwin(NULL);
+
+
bool mustUpdateScoreMenus=false;
- switch(i->type()) {
- case Toplevel::MARKER:
+ switch(tl->type()) {
+ case TopWin::MARKER:
+ case TopWin::ARRANGER:
break;
- case Toplevel::CLIPLIST:
+ case TopWin::CLIPLIST:
// ORCAN: This needs to be verified. aid2 used to correspond to Cliplist:
//menu_audio->setItemChecked(aid2, false);
- viewCliplistAction->setChecked(false);
+ viewCliplistAction->setChecked(false);
+ if (currentMenuSharingTopwin == clipListEdit)
+ setCurrentMenuSharingTopwin(NULL);
+ updateWindowMenu();
return;
//break;
- // the followin editors can exist in more than
+
+ // the following editors can exist in more than
// one instantiation:
- case Toplevel::PIANO_ROLL:
- case Toplevel::LISTE:
- case Toplevel::DRUM:
- case Toplevel::MASTER:
- case Toplevel::WAVE:
- case Toplevel::LMASTER:
+ case TopWin::PIANO_ROLL:
+ case TopWin::LISTE:
+ case TopWin::DRUM:
+ case TopWin::MASTER:
+ case TopWin::WAVE:
+ case TopWin::LMASTER:
break;
- case Toplevel::SCORE:
+ case TopWin::SCORE:
mustUpdateScoreMenus=true;
+
+ case TopWin::TOPLEVELTYPE_LAST_ENTRY: //to avoid a warning
+ break;
}
toplevels.erase(i);
if (mustUpdateScoreMenus)
- updateScoreMenus();
+ arrangerView->updateScoreMenus();
+ updateWindowMenu();
return;
}
}
- printf("topLevelDeleted: top level %lx not found\n", tl);
+ printf("topLevelDeleted: top level %p not found\n", tl);
//assert(false);
}
-//---------------------------------------------------------
-// ctrlChanged
-// midi ctrl value changed
-//---------------------------------------------------------
-#if 0
-void MusE::ctrlChanged()
- {
- arranger->updateInspector();
- }
-#endif
-
-//---------------------------------------------------------
-// keyPressEvent
-//---------------------------------------------------------
-
-void MusE::keyPressEvent(QKeyEvent* event)
- {
- // Pass it on to arranger part canvas.
- arranger->getCanvas()->redirKeypress(event);
- }
//---------------------------------------------------------
// kbAccel
@@ -2653,37 +2282,6 @@ static void catchSignal(int sig)
}
#endif
-#if 0
-//---------------------------------------------------------
-// configPart
-//---------------------------------------------------------
-
-void MusE::configPart(int id)
- {
- if (id < 3) {
- partConfig->setItemChecked(0, id == 0);
- partConfig->setItemChecked(1, id == 1);
- partConfig->setItemChecked(2, id == 2);
- arranger->setShowPartType(id);
- for (int i = 3; i < 10; ++i) {
- partConfig->setItemEnabled(i, id == 2);
- }
- }
- else {
- bool flag = !partConfig->isItemChecked(id);
- partConfig->setItemChecked(id, flag);
- int val = arranger->showPartEvent();
- if (flag) {
- val |= 1 << (id-3);
- }
- else {
- val &= ~(1 << (id-3));
- }
- arranger->setShowPartEvent(val);
- }
- }
-#endif
-
//---------------------------------------------------------
// cmd
// some cmd's from pulldown menu
@@ -2691,99 +2289,7 @@ void MusE::configPart(int id)
void MusE::cmd(int cmd)
{
- TrackList* tracks = song->tracks();
- int l = song->lpos();
- int r = song->rpos();
-
switch(cmd) {
- case CMD_CUT:
- arranger->cmd(Arranger::CMD_CUT_PART);
- break;
- case CMD_COPY:
- arranger->cmd(Arranger::CMD_COPY_PART);
- break;
- case CMD_PASTE:
- arranger->cmd(Arranger::CMD_PASTE_PART);
- break;
- case CMD_PASTE_CLONE:
- arranger->cmd(Arranger::CMD_PASTE_CLONE_PART);
- break;
- case CMD_PASTE_TO_TRACK:
- arranger->cmd(Arranger::CMD_PASTE_PART_TO_TRACK);
- break;
- case CMD_PASTE_CLONE_TO_TRACK:
- arranger->cmd(Arranger::CMD_PASTE_CLONE_PART_TO_TRACK);
- break;
- case CMD_INSERT:
- arranger->cmd(Arranger::CMD_INSERT_PART);
- break;
- case CMD_INSERTMEAS:
- arranger->cmd(Arranger::CMD_INSERT_EMPTYMEAS);
- break;
- case CMD_DELETE:
- if (!song->msgRemoveParts()) //automatically does undo if neccessary and returns true then
- {
- //msgRemoveParts() returned false -> no parts to remove?
- song->startUndo();
- audio->msgRemoveTracks(); //TODO FINDME this could still be speeded up!
- song->endUndo(SC_TRACK_REMOVED);
- }
- break;
- case CMD_DELETE_TRACK:
- song->startUndo();
- audio->msgRemoveTracks();
- song->endUndo(SC_TRACK_REMOVED);
- audio->msgUpdateSoloStates();
- break;
-
- case CMD_SELECT_ALL:
- case CMD_SELECT_NONE:
- case CMD_SELECT_INVERT:
- case CMD_SELECT_ILOOP:
- case CMD_SELECT_OLOOP:
- for (iTrack i = tracks->begin(); i != tracks->end(); ++i) {
- PartList* parts = (*i)->parts();
- for (iPart p = parts->begin(); p != parts->end(); ++p) {
- bool f = false;
- int t1 = p->second->tick();
- int t2 = t1 + p->second->lenTick();
- bool inside =
- ((t1 >= l) && (t1 < r))
- || ((t2 > l) && (t2 < r))
- || ((t1 <= l) && (t2 > r));
- switch(cmd) {
- case CMD_SELECT_INVERT:
- f = !p->second->selected();
- break;
- case CMD_SELECT_NONE:
- f = false;
- break;
- case CMD_SELECT_ALL:
- f = true;
- break;
- case CMD_SELECT_ILOOP:
- f = inside;
- break;
- case CMD_SELECT_OLOOP:
- f = !inside;
- break;
- }
- p->second->setSelected(f);
- }
- }
- song->update();
- break;
-
- case CMD_SELECT_PARTS:
- for (iTrack i = tracks->begin(); i != tracks->end(); ++i) {
- if (!(*i)->selected())
- continue;
- PartList* parts = (*i)->parts();
- for (iPart p = parts->begin(); p != parts->end(); ++p)
- p->second->setSelected(true);
- }
- song->update();
- break;
case CMD_FOLLOW_NO:
song->setFollow(Song::NO);
setFollow();
@@ -2796,43 +2302,10 @@ void MusE::cmd(int cmd)
song->setFollow(Song::CONTINUOUS);
setFollow();
break;
-
- case CMD_SHRINK_PART: shrink_parts(); break;
- case CMD_EXPAND_PART: expand_parts(); break;
- case CMD_CLEAN_PART: clean_parts(); break;
}
}
-//---------------------------------------------------------
-// clipboardChanged
-//---------------------------------------------------------
-void MusE::clipboardChanged()
- {
- bool flag = false;
- if(QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-midipartlist")) ||
- QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-wavepartlist")) ||
- QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-mixedpartlist")))
- flag = true;
-
- editPasteAction->setEnabled(flag);
- editInsertAction->setEnabled(flag);
- editPasteCloneAction->setEnabled(flag);
- editPaste2TrackAction->setEnabled(flag);
- editPasteC2TAction->setEnabled(flag);
- }
-
-//---------------------------------------------------------
-// selectionChanged
-//---------------------------------------------------------
-
-void MusE::selectionChanged()
- {
- //bool flag = arranger->isSingleSelection(); // -- Hmm, why only single?
- bool flag = arranger->selectionSize() > 0; // -- Test OK cut and copy. For muse2. Tim.
- editCutAction->setEnabled(flag);
- editCopyAction->setEnabled(flag);
- }
@@ -2843,7 +2316,7 @@ void MusE::selectionChanged()
void MusE::configAppearance()
{
if (!appearance)
- appearance = new Appearance(arranger);
+ appearance = new Appearance(_arranger);
appearance->resetValues();
if(appearance->isVisible()) {
appearance->raise();
@@ -3255,21 +2728,24 @@ bool MusE::clearSong(bool clear_all)
again:
for (iToplevel i = toplevels.begin(); i != toplevels.end(); ++i) {
- Toplevel tl = *i;
- unsigned long obj = tl.object();
- switch (tl.type()) {
- case Toplevel::CLIPLIST:
- case Toplevel::MARKER:
+ TopWin* tl = *i;
+ switch (tl->type()) {
+ case TopWin::CLIPLIST:
+ case TopWin::MARKER:
+ case TopWin::ARRANGER:
break;
- case Toplevel::PIANO_ROLL:
- case Toplevel::SCORE:
- case Toplevel::LISTE:
- case Toplevel::DRUM:
- case Toplevel::MASTER:
- case Toplevel::WAVE:
- case Toplevel::LMASTER:
- ((QWidget*)(obj))->close();
+ case TopWin::PIANO_ROLL:
+ case TopWin::SCORE:
+ case TopWin::LISTE:
+ case TopWin::DRUM:
+ case TopWin::MASTER:
+ case TopWin::WAVE:
+ case TopWin::LMASTER:
+ tl->close();
goto again;
+
+ case TopWin::TOPLEVELTYPE_LAST_ENTRY: //to avoid a warning
+ break;
}
}
microSleep(100000);
@@ -3366,41 +2842,7 @@ void MusE::updateConfiguration()
MusEGlobal::undoAction->setShortcut(shortcuts[SHRT_UNDO].key);
MusEGlobal::redoAction->setShortcut(shortcuts[SHRT_REDO].key);
- editCutAction->setShortcut(shortcuts[SHRT_CUT].key);
- editCopyAction->setShortcut(shortcuts[SHRT_COPY].key);
- editPasteAction->setShortcut(shortcuts[SHRT_PASTE].key);
- editInsertAction->setShortcut(shortcuts[SHRT_INSERT].key);
- editInsertEMAction->setShortcut(shortcuts[SHRT_INSERTMEAS].key);
- editPasteCloneAction->setShortcut(shortcuts[SHRT_PASTE_CLONE].key);
- editPaste2TrackAction->setShortcut(shortcuts[SHRT_PASTE_TO_TRACK].key);
- editPasteC2TAction->setShortcut(shortcuts[SHRT_PASTE_CLONE_TO_TRACK].key);
-
- //editDeleteSelectedAction has no acceleration
-
- trackMidiAction->setShortcut(shortcuts[SHRT_ADD_MIDI_TRACK].key);
- trackDrumAction->setShortcut(shortcuts[SHRT_ADD_DRUM_TRACK].key);
- trackWaveAction->setShortcut(shortcuts[SHRT_ADD_WAVE_TRACK].key);
- trackAOutputAction->setShortcut(shortcuts[SHRT_ADD_AUDIO_OUTPUT].key);
- trackAGroupAction->setShortcut(shortcuts[SHRT_ADD_AUDIO_GROUP].key);
- trackAInputAction->setShortcut(shortcuts[SHRT_ADD_AUDIO_INPUT].key);
- trackAAuxAction->setShortcut(shortcuts[SHRT_ADD_AUDIO_AUX].key);
-
- editSelectAllAction->setShortcut(shortcuts[SHRT_SELECT_ALL].key);
- editDeselectAllAction->setShortcut(shortcuts[SHRT_SELECT_NONE].key);
- editInvertSelectionAction->setShortcut(shortcuts[SHRT_SELECT_INVERT].key);
- editInsideLoopAction->setShortcut(shortcuts[SHRT_SELECT_OLOOP].key);
- editOutsideLoopAction->setShortcut(shortcuts[SHRT_SELECT_OLOOP].key);
- editAllPartsAction->setShortcut(shortcuts[SHRT_SELECT_PRTSTRACK].key);
-
- startPianoEditAction->setShortcut(shortcuts[SHRT_OPEN_PIANO].key);
- startDrumEditAction->setShortcut(shortcuts[SHRT_OPEN_DRUMS].key);
- startListEditAction->setShortcut(shortcuts[SHRT_OPEN_LIST].key);
- startWaveEditAction->setShortcut(shortcuts[SHRT_OPEN_WAVE].key);
-
- masterGraphicAction->setShortcut(shortcuts[SHRT_OPEN_GRAPHIC_MASTER].key);
- masterListAction->setShortcut(shortcuts[SHRT_OPEN_LIST_MASTER].key);
-
- midiTransformerAction->setShortcut(shortcuts[SHRT_OPEN_MIDI_TRANSFORM].key);
+
//editSongInfoAction has no acceleration
viewTransportAction->setShortcut(shortcuts[SHRT_OPEN_TRANSPORT].key);
@@ -3410,11 +2852,6 @@ void MusE::updateConfiguration()
//viewCliplistAction has no acceleration
viewMarkerAction->setShortcut(shortcuts[SHRT_OPEN_MARKER].key);
- strGlobalCutAction->setShortcut(shortcuts[SHRT_GLOBAL_CUT].key);
- strGlobalInsertAction->setShortcut(shortcuts[SHRT_GLOBAL_INSERT].key);
- strGlobalSplitAction->setShortcut(shortcuts[SHRT_GLOBAL_SPLIT].key);
- strCopyRangeAction->setShortcut(shortcuts[SHRT_COPY_RANGE].key);
- strCutEventsAction->setShortcut(shortcuts[SHRT_CUT_EVENTS].key);
// midiEditInstAction does not have acceleration
midiResetInstAction->setShortcut(shortcuts[SHRT_MIDI_RESET].key);
@@ -3450,11 +2887,14 @@ void MusE::updateConfiguration()
followCtsAction->setShortcut(shortcuts[SHRT_FOLLOW_CONTINUOUS].key);
helpManualAction->setShortcut(shortcuts[SHRT_OPEN_HELP].key);
+ fullscreenAction->setShortcut(shortcuts[SHRT_FULLSCREEN].key);
// Orcan: Old stuff, needs to be converted. These aren't used anywhere so I commented them out
//menuSettings->setAccel(shortcuts[SHRT_CONFIG_AUDIO_PORTS].key, menu_ids[CMD_CONFIG_AUDIO_PORTS]);
//menu_help->setAccel(menu_ids[CMD_START_WHATSTHIS], shortcuts[SHRT_START_WHATSTHIS].key);
+ //arrangerView->updateShortcuts(); //commented out by flo: is done via signal
+
}
//---------------------------------------------------------
@@ -3589,14 +3029,6 @@ void MusE::focusInEvent(QFocusEvent* ev)
QMainWindow::focusInEvent(ev);
}
-//---------------------------------------------------------
-// setUsedTool
-//---------------------------------------------------------
-
-void MusE::setUsedTool(int tool)
- {
- tools1->set(tool);
- }
//---------------------------------------------------------
@@ -3625,4 +3057,384 @@ void MusE::findUnusedWaveFiles()
unused.exec();
}
+void MusE::focusChanged(QWidget*, QWidget* now)
+{
+ QWidget* ptr=now;
+
+ if (activeTopWin)
+ activeTopWin->storeInitialState();
+
+ if (currentMenuSharingTopwin && (currentMenuSharingTopwin!=activeTopWin))
+ currentMenuSharingTopwin->storeInitialState();
+
+
+
+ while (ptr)
+ {
+ if ( (dynamic_cast<TopWin*>(ptr)!=0) || // *ptr is a TopWin or a derived class
+ (ptr==this) ) // the main window is selected
+ break;
+ ptr=dynamic_cast<QWidget*>(ptr->parent()); //in the unlikely case that ptr is a QObject, this returns NULL, which stops the loop
+ }
+
+ // ptr is either NULL, this or the pointer to a TopWin
+ if (ptr!=this) // if the main win is selected, don't treat that as "none", but also don't handle it
+ {
+ TopWin* win=dynamic_cast<TopWin*>(ptr);
+
+ // now 'win' is either NULL or the pointer to the active TopWin
+ if (win!=activeTopWin)
+ {
+ activeTopWin=win;
+ emit activeTopWinChanged(activeTopWin);
+ }
+ }
+}
+
+
+void MusE::activeTopWinChangedSlot(TopWin* win)
+{
+ if (MusEGlobal::debugMsg) printf("ACTIVE TOPWIN CHANGED to '%s' (%p)\n", win ? win->windowTitle().toAscii().data() : "<None>", win);
+
+ if ((win==NULL) || (win->isMdiWin()==false))
+ {
+ if (MusEGlobal::debugMsg) printf(" that's out of the MDI area\n");
+ menuBar()->setFocus(Qt::MenuBarFocusReason);
+ }
+
+ if (win && (win->sharesToolsAndMenu()))
+ setCurrentMenuSharingTopwin(win);
+}
+
+
+
+void MusE::setCurrentMenuSharingTopwin(TopWin* win)
+{
+ if (win && (win->sharesToolsAndMenu()==false))
+ {
+ printf("WARNING: THIS SHOULD NEVER HAPPEN: MusE::setCurrentMenuSharingTopwin() called with a win which does not share (%s)! ignoring...\n", win->windowTitle().toAscii().data());
+ return;
+ }
+
+ if (win!=currentMenuSharingTopwin)
+ {
+ TopWin* previousMenuSharingTopwin = currentMenuSharingTopwin;
+ currentMenuSharingTopwin = NULL;
+
+ if (MusEGlobal::debugMsg) printf("MENU SHARING TOPWIN CHANGED to '%s' (%p)\n", win ? win->windowTitle().toAscii().data() : "<None>", win);
+
+ // empty our toolbars
+ if (previousMenuSharingTopwin)
+ {
+ for (list<QToolBar*>::iterator it = foreignToolbars.begin(); it!=foreignToolbars.end(); it++)
+ if (*it)
+ {
+ if (MusEGlobal::debugMsg) printf(" removing sharer's toolbar '%s'\n", (*it)->windowTitle().toAscii().data());
+ removeToolBar(*it); // this does not delete *it, which is good
+ (*it)->setParent(NULL);
+ }
+
+ foreignToolbars.clear();
+ }
+ else
+ {
+ for (list<QToolBar*>::iterator it = optionalToolbars.begin(); it!=optionalToolbars.end(); it++)
+ if (*it)
+ {
+ if (MusEGlobal::debugMsg) printf(" removing optional toolbar '%s'\n", (*it)->windowTitle().toAscii().data());
+ removeToolBar(*it); // this does not delete *it, which is good
+ (*it)->setParent(NULL);
+ }
+ }
+
+ //empty our menu
+ menuBar()->clear();
+
+
+
+
+ for (list<QMenu*>::iterator it = leadingMenus.begin(); it!=leadingMenus.end(); it++)
+ menuBar()->addMenu(*it);
+
+ if (win)
+ {
+ const QList<QAction*>& actions=win->menuBar()->actions();
+ for (QList<QAction*>::const_iterator it=actions.begin(); it!=actions.end(); it++)
+ {
+ if (MusEGlobal::debugMsg) printf(" menu entry '%s'\n", (*it)->text().toAscii().data());
+
+ menuBar()->addAction(*it);
+ }
+
+
+
+ const list<QToolBar*>& toolbars=win->toolbars();
+ for (list<QToolBar*>::const_iterator it=toolbars.begin(); it!=toolbars.end(); it++)
+ if (*it)
+ {
+ if (MusEGlobal::debugMsg) printf(" toolbar '%s'\n", (*it)->windowTitle().toAscii().data());
+
+ addToolBar(*it);
+ foreignToolbars.push_back(*it);
+ (*it)->show();
+ }
+ else
+ {
+ if (MusEGlobal::debugMsg) printf(" toolbar break\n");
+
+ addToolBarBreak();
+ foreignToolbars.push_back(NULL);
+ }
+ }
+
+ for (list<QMenu*>::iterator it = trailingMenus.begin(); it!=trailingMenus.end(); it++)
+ menuBar()->addMenu(*it);
+
+
+ currentMenuSharingTopwin=win;
+
+ if (win)
+ win->restoreMainwinState(); //restore toolbar positions in main window
+ }
+}
+
+void MusE::addMdiSubWindow(QMdiSubWindow* win)
+{
+ mdiArea->addSubWindow(win);
+}
+
+void MusE::shareMenuAndToolbarChanged(TopWin* win, bool val)
+{
+ if (val)
+ {
+ if ((win == activeTopWin) && (win != currentMenuSharingTopwin))
+ setCurrentMenuSharingTopwin(win);
+ }
+ else
+ {
+ if (win == currentMenuSharingTopwin)
+ {
+ if (activeTopWin && (win != activeTopWin) && (activeTopWin->sharesToolsAndMenu()))
+ setCurrentMenuSharingTopwin(activeTopWin);
+ else
+ setCurrentMenuSharingTopwin(NULL);
+ }
+ }
+}
+
+void MusE::updateWindowMenu()
+{
+ bool sep;
+ bool there_are_subwins=false;
+
+ menuWindows->clear(); // frees memory automatically
+
+ menuWindows->addAction(windowsCascadeAction);
+ menuWindows->addAction(windowsTileAction);
+ menuWindows->addAction(windowsRowsAction);
+ menuWindows->addAction(windowsColumnsAction);
+
+ sep=false;
+ for (iToplevel it=toplevels.begin(); it!=toplevels.end(); it++)
+ if (((*it)->isVisible() || (*it)->isVisibleTo(this)) && (*it)->isMdiWin())
+ // the isVisibleTo check is neccessary because isVisible returns false if a
+ // MdiSubWin is actually visible, but the muse main window is hidden for some reason
+ {
+ if (!sep)
+ {
+ menuWindows->addSeparator();
+ sep=true;
+ }
+ QAction* temp=menuWindows->addAction((*it)->windowTitle());
+ connect(temp, SIGNAL(activated()), windowsMapper, SLOT(map()));
+ windowsMapper->setMapping(temp, static_cast<QWidget*>(*it));
+
+ there_are_subwins=true;
+ }
+
+ sep=false;
+ for (iToplevel it=toplevels.begin(); it!=toplevels.end(); it++)
+ if (((*it)->isVisible() || (*it)->isVisibleTo(this)) && !(*it)->isMdiWin())
+ {
+ if (!sep)
+ {
+ menuWindows->addSeparator();
+ sep=true;
+ }
+ QAction* temp=menuWindows->addAction((*it)->windowTitle());
+ connect(temp, SIGNAL(activated()), windowsMapper, SLOT(map()));
+ windowsMapper->setMapping(temp, static_cast<QWidget*>(*it));
+ }
+
+ windowsCascadeAction->setEnabled(there_are_subwins);
+ windowsTileAction->setEnabled(there_are_subwins);
+ windowsRowsAction->setEnabled(there_are_subwins);
+ windowsColumnsAction->setEnabled(there_are_subwins);
+}
+
+void MusE::bringToFront(QWidget* widget)
+{
+ TopWin* win=dynamic_cast<TopWin*>(widget);
+ if (win->isMdiWin())
+ {
+ win->show();
+ mdiArea->setActiveSubWindow(win->getMdiWin());
+ }
+ else
+ {
+ win->activateWindow();
+ win->raise();
+ }
+
+ activeTopWinChangedSlot(win);
+}
+
+void MusE::setFullscreen(bool val)
+{
+ if (val)
+ showFullScreen();
+ else
+ showNormal();
+}
+
+
+
+list<QMdiSubWindow*> get_all_visible_subwins(QMdiArea* mdiarea)
+{
+ QList<QMdiSubWindow*> wins = mdiarea->subWindowList();
+ list<QMdiSubWindow*> result;
+
+ // always put the arranger at the top of the list, if visible
+
+ for (QList<QMdiSubWindow*>::iterator it=wins.begin(); it!=wins.end(); it++)
+ if ((*it)->isVisible() && ((*it)->isMinimized()==false))
+ if (dynamic_cast<TopWin*>((*it)->widget())->type()==TopWin::ARRANGER)
+ result.push_back(*it);
+
+ for (QList<QMdiSubWindow*>::iterator it=wins.begin(); it!=wins.end(); it++)
+ if ((*it)->isVisible() && ((*it)->isMinimized()==false))
+ if (dynamic_cast<TopWin*>((*it)->widget())->type()!=TopWin::ARRANGER)
+ result.push_back(*it);
+
+ return result;
+}
+
+void MusE::arrangeSubWindowsColumns()
+{
+ list<QMdiSubWindow*> wins=get_all_visible_subwins(mdiArea);
+ int n=wins.size();
+
+ if (n==0)
+ return;
+ //else if (n==1)
+ // (*wins.begin())->showMaximized(); // commented out by flo. i like it better that way.
+ else
+ {
+ int width = mdiArea->width();
+ int height = mdiArea->height();
+ int x_add = (*wins.begin())->frameGeometry().width() - (*wins.begin())->geometry().width();
+ int y_add = (*wins.begin())->frameGeometry().height() - (*wins.begin())->geometry().height();
+ int width_per_win = width/n;
+
+ if (x_add >= width_per_win)
+ {
+ printf("ERROR: tried to arrange subwins in columns, but there's too few space.\n");
+ return;
+ }
+
+ int i=0;
+ for (list<QMdiSubWindow*>::iterator it=wins.begin(); it!=wins.end(); it++, i++)
+ {
+ int left = (float) width*i/n;
+ int right = (float) width*(i+1.0)/n;
+
+ (*it)->move(left,0);
+ (*it)->resize(right-left-x_add, height-y_add);
+ }
+ }
+}
+
+void MusE::arrangeSubWindowsRows()
+{
+ list<QMdiSubWindow*> wins=get_all_visible_subwins(mdiArea);
+ int n=wins.size();
+
+ if (n==0)
+ return;
+ //else if (n==1)
+ // (*wins.begin())->showMaximized(); // commented out by flo. i like it better that way.
+ else
+ {
+ int width = mdiArea->width();
+ int height = mdiArea->height();
+ int x_add = (*wins.begin())->frameGeometry().width() - (*wins.begin())->geometry().width();
+ int y_add = (*wins.begin())->frameGeometry().height() - (*wins.begin())->geometry().height();
+ int height_per_win = height/n;
+
+ if (y_add >= height_per_win)
+ {
+ printf("ERROR: tried to arrange subwins in rows, but there's too few space.\n");
+ return;
+ }
+
+ int i=0;
+ for (list<QMdiSubWindow*>::iterator it=wins.begin(); it!=wins.end(); it++, i++)
+ {
+ int top = (float) height*i/n;
+ int bottom = (float) height*(i+1.0)/n;
+
+ (*it)->move(0,top);
+ (*it)->resize(width-x_add, bottom-top-y_add);
+ }
+ }
+}
+
+void MusE::tileSubWindows()
+{
+ list<QMdiSubWindow*> wins=get_all_visible_subwins(mdiArea);
+ int n=wins.size();
+
+ if (n==0)
+ return;
+ //else if (n==1)
+ // (*wins.begin())->showMaximized(); // commented out by flo. i like it better that way.
+ else
+ {
+ int nx,ny;
+ nx=ceil(sqrt(n));
+ ny=ceil((double)n/nx);
+
+ int width = mdiArea->width();
+ int height = mdiArea->height();
+ int x_add = (*wins.begin())->frameGeometry().width() - (*wins.begin())->geometry().width();
+ int y_add = (*wins.begin())->frameGeometry().height() - (*wins.begin())->geometry().height();
+ int height_per_win = height/ny;
+ int width_per_win = height/nx;
+
+ if ((x_add >= width_per_win) || (y_add >= height_per_win))
+ {
+ printf("ERROR: tried to tile subwins, but there's too few space.\n");
+ return;
+ }
+
+ int i=0, j=0;
+ for (list<QMdiSubWindow*>::iterator it=wins.begin(); it!=wins.end(); it++, i++)
+ {
+ if (i>=nx)
+ {
+ i=0;
+ j++;
+ }
+
+ int top = (float) height*j/ny;
+ int bottom = (float) height*(j+1.0)/ny;
+ int left = (float) width*i/nx;
+ int right = (float) width*(i+1.0)/nx;
+
+ (*it)->move(left,top);
+ (*it)->resize(right-left-x_add, bottom-top-y_add);
+ }
+ }
+}
+
} //namespace MusEApp
diff --git a/muse2/muse/app.h b/muse2/muse/app.h
index 4b0d4195..3bde68e1 100644
--- a/muse2/muse/app.h
+++ b/muse2/muse/app.h
@@ -28,7 +28,9 @@
#include "cobject.h"
#include <QFileInfo>
+#include <list>
+class TopWin;
class QCloseEvent;
class QFocusEvent;
class QMainWindow;
@@ -41,6 +43,7 @@ class QString;
class QToolBar;
class QToolButton;
class QProgressDialog;
+class QMdiArea;
namespace MusEWidget {
class BigTime;
@@ -69,6 +72,8 @@ class AudioRecord;
class MidiFileConfig;
class MidiFilterConfig;
class MarkerView;
+class ArrangerView;
+class GlobalSettingsConfig;
class MidiControllerEditDialog;
class MidiInputTransformDialog;
class MidiTransformerDialog;
@@ -96,13 +101,7 @@ namespace MusEApp {
class MusE : public QMainWindow
{
Q_OBJECT
- enum {CMD_CUT, CMD_COPY, CMD_PASTE, CMD_INSERT, CMD_INSERTMEAS, CMD_PASTE_CLONE,
- CMD_PASTE_TO_TRACK, CMD_PASTE_CLONE_TO_TRACK, CMD_DELETE,
- CMD_SELECT_ALL, CMD_SELECT_NONE, CMD_SELECT_INVERT,
- CMD_SELECT_ILOOP, CMD_SELECT_OLOOP, CMD_SELECT_PARTS,
- CMD_FOLLOW_NO, CMD_FOLLOW_JUMP, CMD_FOLLOW_CONTINUOUS ,
- CMD_DELETE_TRACK, CMD_EXPAND_PART, CMD_SHRINK_PART, CMD_CLEAN_PART
- };
+ enum {CMD_FOLLOW_NO, CMD_FOLLOW_JUMP, CMD_FOLLOW_CONTINUOUS };
//File menu items:
enum { CMD_OPEN_RECENT=0, CMD_LOAD_TEMPLATE, CMD_SAVE_AS, CMD_IMPORT_MIDI,
@@ -122,26 +121,23 @@ class MusE : public QMainWindow
QAction *fileSaveAction, *fileOpenAction, *fileNewAction, *testAction;
QAction *fileSaveAsAction, *fileImportMidiAction, *fileExportMidiAction;
QAction *fileImportPartAction, *fileImportWaveAction, *fileMoveWaveFiles, *quitAction;
-
- // Edit Menu actions
- QAction *editCutAction, *editCopyAction, *editPasteAction, *editInsertAction, *editPasteCloneAction, *editPaste2TrackAction;
- QAction *editInsertEMAction, *editPasteC2TAction, *editDeleteSelectedAction, *editSelectAllAction, *editDeselectAllAction;
- QAction *editInvertSelectionAction, *editInsideLoopAction, *editOutsideLoopAction, *editAllPartsAction;
- QAction *trackMidiAction, *trackDrumAction, *trackWaveAction, *trackAOutputAction, *trackAGroupAction;
- QAction *trackAInputAction, *trackAAuxAction;
- QAction *masterGraphicAction, *masterListAction;
- QAction *midiTransformerAction;
QAction *editSongInfoAction;
- QAction *editCleanPartsAction, *editShrinkPartsAction, *editExpandPartsAction;
- public:
- QAction *startScoreEditAction, *startPianoEditAction, *startDrumEditAction, *startListEditAction, *startWaveEditAction;
- QMenu *scoreSubmenu, *scoreOneStaffPerTrackSubsubmenu, *scoreAllInOneSubsubmenu;
+
private:
+ QMdiArea* mdiArea;
+
+ TopWin* activeTopWin;
+ TopWin* currentMenuSharingTopwin;
+
+ std::list<QToolBar*> requiredToolbars; //always displayed
+ std::list<QToolBar*> optionalToolbars; //only displayed when no toolbar-sharing window is active
+ std::list<QToolBar*> foreignToolbars; //holds a temporary list of the toolbars of a toolbar-sharer
+ std::list<QMenu*> leadingMenus;
+ std::list<QMenu*> trailingMenus;
+
// View Menu actions
- QAction *viewTransportAction, *viewBigtimeAction, *viewMixerAAction, *viewMixerBAction, *viewCliplistAction, *viewMarkerAction;
-
- // Structure Menu actions
- QAction *strGlobalCutAction, *strGlobalInsertAction, *strGlobalSplitAction, *strCopyRangeAction, *strCutEventsAction;
+ QAction *viewTransportAction, *viewBigtimeAction, *viewMixerAAction, *viewMixerBAction, *viewCliplistAction, *viewMarkerAction, *viewArrangerAction;
+ QAction* fullscreenAction;
// Midi Menu Actions
QAction *midiEditInstAction, *midiResetInstAction, *midiInitInstActions, *midiLocalOffAction;
@@ -156,6 +152,12 @@ class MusE : public QMainWindow
// Automation Menu Actions
QAction *autoMixerAction, *autoSnapshotAction, *autoClearAction;
+ // Window Menu Actions
+ QAction* windowsCascadeAction;
+ QAction* windowsTileAction;
+ QAction* windowsRowsAction;
+ QAction* windowsColumnsAction;
+
// Settings Menu Actions
QAction *settingsGlobalAction, *settingsShortcutsAction, *settingsMetronomeAction, *settingsMidiSyncAction;
QAction *settingsMidiIOAction, *settingsAppearanceAction, *settingsMidiPortAction;
@@ -168,18 +170,18 @@ class MusE : public QMainWindow
QFileInfo project;
QToolBar *tools;
- MusEWidget::EditToolBar *tools1;
- MusEWidget::VisibleTracks *visTracks;
+ // when adding a toolbar to the main window, remember adding it to
+ // either the requiredToolbars or optionalToolbars list!
Transport* transport;
MusEWidget::BigTime* bigtime;
EditInstrument* editInstrument;
- QMenu *menu_file, *menuView, *menuSettings, *menu_help;
- QMenu *menuEdit, *menuStructure;
+ // when adding a menu to the main window, remember adding it to
+ // either the leadingMenus or trailingMenus list!
+ QMenu *menu_file, *menuView, *menuSettings, *menuWindows, *menu_help;
QMenu* menu_audio, *menuAutomation, *menuUtils;
QMenu* menu_functions, *menuScriptPlugins;
- QMenu* select, *master, *midiEdit, *addTrack;
// Special common menu for routes. Used (so far) by audio and midi strip, and midi trackinfo.
MusEWidget::RoutePopupMenu* routingPopupMenu;
@@ -203,9 +205,11 @@ class MusE : public QMainWindow
AudioMixerApp* mixer1;
AudioMixerApp* mixer2;
+ Arranger* _arranger;
ToplevelList toplevels;
ClipListEdit* clipListEdit;
MarkerView* markerView;
+ ArrangerView* arrangerView;
MidiTransformerDialog* midiTransformerDialog;
QMenu* openRecent;
@@ -235,16 +239,14 @@ class MusE : public QMainWindow
void updateConfiguration();
virtual void focusInEvent(QFocusEvent*);
- virtual void keyPressEvent(QKeyEvent*); // p4.0.10 Tim.
- QSignalMapper *editSignalMapper;
QSignalMapper *midiPluginSignalMapper;
QSignalMapper *followSignalMapper;
- QSignalMapper *scoreOneStaffPerTrackMapper;
- QSignalMapper *scoreAllInOneMapper;
+ QSignalMapper *windowsMapper;
signals:
void configChanged();
+ void activeTopWinChanged(TopWin*);
private slots:
void loadProject();
@@ -265,6 +267,7 @@ class MusE : public QMainWindow
void toggleTransport(bool);
void toggleMarker(bool);
+ void toggleArranger(bool);
void toggleBigTime(bool);
void toggleMixer1(bool);
void toggleMixer2(bool);
@@ -274,30 +277,9 @@ class MusE : public QMainWindow
void configShortCuts();
void configMetronome();
void configAppearance();
- void startEditor(PartList*, int);
- void startMasterEditor();
- void startLMasterEditor();
- void startListEditor();
- void startListEditor(PartList*);
- void startDrumEditor();
- void startDrumEditor(PartList* /*pl*/, bool /*showDefaultCtrls*/ = false);
- void startEditor(Track*);
- void openInScoreEdit(ScoreEdit* destination, PartList* pl, bool allInOne=false);
- void openInScoreEdit(ScoreEdit* destination, bool allInOne=false);
- void openInScoreEdit_allInOne(QWidget* destination);
- void openInScoreEdit_oneStaffPerTrack(QWidget* destination);
- void clearScoreMenuMappers();
- void updateScoreMenus();
- void scoreNamingChanged();
- void startScoreQuickly();
- void startPianoroll();
- void startPianoroll(PartList* /*pl*/, bool /*showDefaultCtrls*/ = false);
- void startWaveEditor();
- void startWaveEditor(PartList*);
void startSongInfo(bool editable=true);
- void startMidiTransformer();
void writeGlobalConfiguration() const;
//void startEditInstrument();
void startClipList(bool);
@@ -305,8 +287,6 @@ class MusE : public QMainWindow
void openRecentMenu();
void selectProject(QAction* act);
void cmd(int);
- void clipboardChanged();
- void selectionChanged();
/* void copyMeasure(); // commented out by flo: these are not implemented,
void eraseMeasure(); // but maybe will be in future (state: revision 988)
void deleteMeasure();
@@ -321,11 +301,6 @@ class MusE : public QMainWindow
#ifdef BUILD_EXPERIMENTAL
void hideMidiRhythmGenerator();
#endif
- void globalCut();
- void globalInsert();
- void globalSplit();
- void copyRange();
- void cutEvents();
void bounceToTrack();
void resetMidiDevices();
void initMidiDevices();
@@ -337,11 +312,20 @@ class MusE : public QMainWindow
void mixer1Closed();
void mixer2Closed();
void markerClosed();
+ void arrangerClosed();
void execDeliveredScript(int);
void execUserScript(int);
- private:
- void adjustGlobalLists(Undo& operations, int startPos, int diff);
+
+ void activeTopWinChangedSlot(TopWin*);
+ void setCurrentMenuSharingTopwin(TopWin*);
+
+ void bringToFront(QWidget* win);
+ void setFullscreen(bool);
+
+ void arrangeSubWindowsRows();
+ void arrangeSubWindowsColumns();
+ void tileSubWindows();
public slots:
bool saveAs();
@@ -349,7 +333,7 @@ class MusE : public QMainWindow
void closeEvent(QCloseEvent*e);
void loadProjectFile(const QString&);
void loadProjectFile(const QString&, bool songTemplate, bool loadAll);
- void toplevelDeleted(unsigned long tl);
+ void toplevelDeleted(TopWin* tl);
void loadTheme(const QString&);
void loadStyleSheetFile(const QString&);
bool seqRestart();
@@ -358,16 +342,42 @@ class MusE : public QMainWindow
void showMixer1(bool);
void showMixer2(bool);
void showMarker(bool);
+ void showArranger(bool);
void importMidi(const QString &file);
- void setUsedTool(int);
void showDidYouKnowDialog();
void startEditInstrument();
void configMidiPorts();
+ void startEditor(PartList*, int);
+ void startScoreQuickly();
+ void startPianoroll();
+ void startPianoroll(PartList* /*pl*/, bool /*showDefaultCtrls*/ = false);
+ void startWaveEditor();
+ void startWaveEditor(PartList*);
+ void openInScoreEdit(ScoreEdit* destination, PartList* pl, bool allInOne=false);
+ void openInScoreEdit(ScoreEdit* destination, bool allInOne=false);
+ void openInScoreEdit_allInOne(QWidget* destination);
+ void openInScoreEdit_oneStaffPerTrack(QWidget* destination);
+ void startMasterEditor();
+ void startLMasterEditor();
+ void startListEditor();
+ void startListEditor(PartList*);
+ void startDrumEditor();
+ void startDrumEditor(PartList* /*pl*/, bool /*showDefaultCtrls*/ = false);
+ void startEditor(Track*);
+ void startMidiTransformer();
+
+ void focusChanged(QWidget* old, QWidget* now);
+
+ void addMdiSubWindow(QMdiSubWindow*);
+ void shareMenuAndToolbarChanged(TopWin*, bool);
+
+ void updateWindowMenu();
+
public:
MusE(int argc, char** argv);
~MusE();
- Arranger* arranger;
+ Arranger* arranger() { return _arranger; }
QRect configGeometryMain;
QProgressDialog *progress;
bool importMidi(const QString name, bool merge);
@@ -387,6 +397,10 @@ class MusE : public QMainWindow
void showTransport(bool flag);
MusEWidget::RoutePopupMenu* getRoutingPopupMenu();
+ const ToplevelList* getToplevels() { return &toplevels; }
+
+ TopWin* getCurrentMenuSharingTopwin() { return currentMenuSharingTopwin; }
+
#ifdef HAVE_LASH
void lash_idle_cb ();
#endif
diff --git a/muse2/muse/appearance.cpp b/muse2/muse/appearance.cpp
index c26f9542..835ced81 100644
--- a/muse2/muse/appearance.cpp
+++ b/muse2/muse/appearance.cpp
@@ -550,7 +550,7 @@ void Appearance::bgSelectionChanged(QTreeWidgetItem* item)
removeBgButton->setEnabled(true);
lastSelectedBgItem = item;
- MusEGlobal::muse->arranger->getCanvas()->setBg(QPixmap(item->data(0, Qt::UserRole).toString()));
+ MusEGlobal::muse->arranger()->getCanvas()->setBg(QPixmap(item->data(0, Qt::UserRole).toString()));
}
//---------------------------------------------------------
@@ -741,7 +741,7 @@ void Appearance::ok()
void Appearance::cancel()
{
- MusEGlobal::muse->arranger->getCanvas()->setBg(QPixmap(config->canvasBgPixmap));
+ MusEGlobal::muse->arranger()->getCanvas()->setBg(QPixmap(config->canvasBgPixmap));
close();
}
@@ -752,7 +752,7 @@ void Appearance::cancel()
void Appearance::removeBackground()
{
QTreeWidgetItem* item = backgroundTree->currentItem();
- MusEGlobal::muse->arranger->getCanvas()->setBg(QPixmap());
+ MusEGlobal::muse->arranger()->getCanvas()->setBg(QPixmap());
user_bg->takeChild(user_bg->indexOfChild(item));
backgroundTree->setCurrentItem (0);
removeBgButton->setEnabled(false);
@@ -791,7 +791,7 @@ void Appearance::addBackground()
void Appearance::clearBackground()
{
- MusEGlobal::muse->arranger->getCanvas()->setBg(QPixmap());
+ MusEGlobal::muse->arranger()->getCanvas()->setBg(QPixmap());
backgroundTree->setCurrentItem (0);
removeBgButton->setEnabled(false);
}
diff --git a/muse2/muse/arranger/CMakeLists.txt b/muse2/muse/arranger/CMakeLists.txt
index af6a30b5..d81d92c6 100644
--- a/muse2/muse/arranger/CMakeLists.txt
+++ b/muse2/muse/arranger/CMakeLists.txt
@@ -27,6 +27,7 @@
QT4_WRAP_CPP (arranger_mocs
alayout.h
arranger.h
+ arrangerview.h
pcanvas.h
tlist.h
)
@@ -37,6 +38,7 @@ QT4_WRAP_CPP (arranger_mocs
file (GLOB arranger_source_files
alayout.cpp
arranger.cpp
+ arrangerview.cpp
pcanvas.cpp
tlist.cpp
)
diff --git a/muse2/muse/arranger/arranger.cpp b/muse2/muse/arranger/arranger.cpp
index 3052d7d4..09e67151 100644
--- a/muse2/muse/arranger/arranger.cpp
+++ b/muse2/muse/arranger/arranger.cpp
@@ -38,6 +38,7 @@
#include <QWheelEvent>
#include <QPainter>
//#include <QStackedWidget>
+#include "arrangerview.h"
#include "arranger.h"
#include "song.h"
@@ -111,7 +112,7 @@ void Arranger::setHeaderWhatsThis()
// is the central widget in app
//---------------------------------------------------------
-Arranger::Arranger(QMainWindow* parent, const char* name)
+Arranger::Arranger(ArrangerView* parent, const char* name)
: QWidget(parent)
{
setObjectName(name);
@@ -122,11 +123,12 @@ Arranger::Arranger(QMainWindow* parent, const char* name)
///program = CTRL_VAL_UNKNOWN;
///pan = -65;
///volume = -1;
- setMinimumSize(600, 50);
showTrackinfoFlag = true;
cursVal = MAXINT;
+ parentWin=parent;
+
//setFocusPolicy(Qt::StrongFocus);
//---------------------------------------------------
@@ -396,7 +398,7 @@ Arranger::Arranger(QMainWindow* parent, const char* name)
canvas->setCanvasTools(MusEWidget::arrangerTools);
canvas->setOrigin(-offset, 0);
canvas->setFocus();
- //parent->setFocusProxy(canvas); // Tim.
+ setFocusProxy(canvas); // once removed by Tim (r735), added by flo again
connect(canvas, SIGNAL(setUsedTool(int)), this, SIGNAL(setUsedTool(int)));
connect(canvas, SIGNAL(trackChanged(Track*)), list, SLOT(selectTrack(Track*)));
@@ -761,20 +763,20 @@ void Arranger::cmd(int cmd)
case CMD_COPY_PART:
ncmd = PartCanvas::CMD_COPY_PART;
break;
+ case CMD_COPY_PART_IN_RANGE:
+ ncmd = PartCanvas::CMD_COPY_PART_IN_RANGE;
+ break;
case CMD_PASTE_PART:
ncmd = PartCanvas::CMD_PASTE_PART;
break;
case CMD_PASTE_CLONE_PART:
ncmd = PartCanvas::CMD_PASTE_CLONE_PART;
break;
- case CMD_PASTE_PART_TO_TRACK:
- ncmd = PartCanvas::CMD_PASTE_PART_TO_TRACK;
- break;
- case CMD_PASTE_CLONE_PART_TO_TRACK:
- ncmd = PartCanvas::CMD_PASTE_CLONE_PART_TO_TRACK;
+ case CMD_PASTE_DIALOG:
+ ncmd = PartCanvas::CMD_PASTE_DIALOG;
break;
- case CMD_INSERT_PART:
- ncmd = PartCanvas::CMD_INSERT_PART;
+ case CMD_PASTE_CLONE_DIALOG:
+ ncmd = PartCanvas::CMD_PASTE_CLONE_DIALOG;
break;
case CMD_INSERT_EMPTYMEAS:
ncmd = PartCanvas::CMD_INSERT_EMPTYMEAS;
diff --git a/muse2/muse/arranger/arranger.h b/muse2/muse/arranger/arranger.h
index 77299ef6..1e3943be 100644
--- a/muse2/muse/arranger/arranger.h
+++ b/muse2/muse/arranger/arranger.h
@@ -57,6 +57,8 @@ class Splitter;
class SpinBox;
}
+class ArrangerView;
+
//---------------------------------------------------------
// WidgetStack
//---------------------------------------------------------
@@ -167,10 +169,10 @@ class Arranger : public QWidget {
void controllerChanged(Track *t);
public:
- enum { CMD_CUT_PART, CMD_COPY_PART, CMD_PASTE_PART, CMD_PASTE_CLONE_PART, CMD_PASTE_PART_TO_TRACK, CMD_PASTE_CLONE_PART_TO_TRACK,
- CMD_INSERT_PART, CMD_INSERT_EMPTYMEAS };
+ enum { CMD_CUT_PART, CMD_COPY_PART, CMD_COPY_PART_IN_RANGE, CMD_PASTE_PART, CMD_PASTE_CLONE_PART,
+ CMD_PASTE_DIALOG, CMD_PASTE_CLONE_DIALOG, CMD_INSERT_EMPTYMEAS };
- Arranger(QMainWindow* parent, const char* name = 0);
+ Arranger(ArrangerView* parent, const char* name = 0);
PartCanvas* getCanvas() { return canvas; }
void setMode(int);
@@ -187,6 +189,8 @@ class Arranger : public QWidget {
void clear();
unsigned cursorValue() { return cursVal; }
+
+ ArrangerView* parentWin;
};
#endif
diff --git a/muse2/muse/arranger/arrangerview.cpp b/muse2/muse/arranger/arrangerview.cpp
new file mode 100644
index 00000000..0cc75db9
--- /dev/null
+++ b/muse2/muse/arranger/arrangerview.cpp
@@ -0,0 +1,726 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// arrangerview.cpp
+// (C) Copyright 2011 Florian Jung (flo93@users.sourceforge.net)
+//
+// 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; 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 <QApplication>
+#include <QClipboard>
+#include <QCloseEvent>
+#include <QDir>
+#include <QGridLayout>
+#include <QImage>
+#include <QInputDialog>
+#include <QKeyEvent>
+#include <QKeySequence>
+#include <QLabel>
+#include <QLayout>
+#include <QMenu>
+#include <QMenuBar>
+#include <QMessageBox>
+#include <QMimeData>
+#include <QPushButton>
+#include <QResizeEvent>
+#include <QScrollArea>
+#include <QScrollBar>
+#include <QSettings>
+#include <QShortcut>
+#include <QSignalMapper>
+#include <QSizeGrip>
+#include <QToolButton>
+#include <QToolTip>
+
+#include "al/sig.h"
+#include "app.h"
+#include "arrangerview.h"
+#include "audio.h"
+#include "functions.h"
+#include "gconfig.h"
+#include "globals.h"
+#include "helper.h"
+#include "icons.h"
+#include "mtscale.h"
+#include "scoreedit.h"
+#include "shortcuts.h"
+#include "sig.h"
+#include "song.h"
+#include "structure.h"
+#include "tb1.h"
+#include "tools.h"
+#include "ttoolbar.h"
+#include "visibletracks.h"
+#include "xml.h"
+
+
+//---------------------------------------------------------
+// ArrangerView
+//---------------------------------------------------------
+
+ArrangerView::ArrangerView(QWidget* parent)
+ : TopWin(TopWin::ARRANGER, parent, "arrangerview", Qt::Window)
+{
+ using MusEGlobal::muse;
+
+ //setAttribute(Qt::WA_DeleteOnClose);
+ setWindowTitle(tr("MusE: Arranger"));
+ setFocusPolicy(Qt::StrongFocus);
+
+ arranger = new Arranger(this, "arranger");
+ setCentralWidget(arranger);
+ setFocusProxy(arranger);
+
+ scoreOneStaffPerTrackMapper = new QSignalMapper(this);
+ scoreAllInOneMapper = new QSignalMapper(this);
+
+ editSignalMapper = new QSignalMapper(this);
+ QShortcut* sc = new QShortcut(shortcuts[SHRT_DELETE].key, this);
+ sc->setContext(Qt::WindowShortcut);
+ connect(sc, SIGNAL(activated()), editSignalMapper, SLOT(map()));
+ editSignalMapper->setMapping(sc, CMD_DELETE);
+
+ // Toolbars ---------------------------------------------------------
+ QToolBar* undo_tools=addToolBar(tr("Undo/Redo tools"));
+ undo_tools->setObjectName("Undo/Redo tools");
+ undo_tools->addActions(MusEGlobal::undoRedo->actions());
+
+
+ QToolBar* panic_toolbar = addToolBar(tr("panic"));
+ panic_toolbar->setObjectName("panic");
+ panic_toolbar->addAction(MusEGlobal::panicAction);
+
+ QToolBar* transport_toolbar = addToolBar(tr("transport"));
+ transport_toolbar->setObjectName("transport");
+ transport_toolbar->addActions(MusEGlobal::transportAction->actions());
+
+ editTools = new MusEWidget::EditToolBar(this, MusEWidget::arrangerTools);
+ addToolBar(editTools);
+ editTools->setObjectName("arrangerTools");
+
+ visTracks = new MusEWidget::VisibleTracks(this);
+ addToolBar(visTracks);
+
+
+
+ connect(editTools, SIGNAL(toolChanged(int)), arranger, SLOT(setTool(int)));
+ connect(visTracks, SIGNAL(visibilityChanged()), song, SLOT(update()) );
+ connect(arranger, SIGNAL(editPart(Track*)), muse, SLOT(startEditor(Track*)));
+ connect(arranger, SIGNAL(dropSongFile(const QString&)), muse, SLOT(loadProjectFile(const QString&)));
+ connect(arranger, SIGNAL(dropMidiFile(const QString&)), muse, SLOT(importMidi(const QString&)));
+ connect(arranger, SIGNAL(startEditor(PartList*,int)), muse, SLOT(startEditor(PartList*,int)));
+ connect(arranger, SIGNAL(toolChanged(int)), editTools, SLOT(set(int)));
+ connect(muse, SIGNAL(configChanged()), arranger, SLOT(configChanged()));
+ connect(arranger, SIGNAL(setUsedTool(int)), editTools, SLOT(set(int)));
+ connect(arranger, SIGNAL(selectionChanged()), SLOT(selectionChanged()));
+
+
+
+
+
+
+ //-------- Edit Actions
+ editCutAction = new QAction(QIcon(*editcutIconSet), tr("C&ut"), this);
+ editCopyAction = new QAction(QIcon(*editcopyIconSet), tr("&Copy"), this);
+ editCopyRangeAction = new QAction(QIcon(*editcopyIconSet), tr("&Copy in range"), this);
+ editPasteAction = new QAction(QIcon(*editpasteIconSet), tr("&Paste"), this);
+ editPasteDialogAction = new QAction(QIcon(*editpasteIconSet), tr("Paste (show dialog)"), this);
+ editPasteCloneAction = new QAction(QIcon(*editpasteCloneIconSet), tr("Paste c&lone"), this);
+ editPasteCloneDialogAction = new QAction(QIcon(*editpasteCloneIconSet), tr("Paste clone (show dialog)"), this);
+ editInsertEMAction = new QAction(QIcon(*editpasteIconSet), tr("&Insert Empty Measure"), this);
+ editDeleteSelectedAction = new QAction(QIcon(*edit_track_delIcon), tr("Delete Selected Tracks"), this);
+
+ editShrinkPartsAction = new QAction(tr("Shrink selected parts"), this); //FINDMICH TODO tooltips!
+ editExpandPartsAction = new QAction(tr("Expand selected parts"), this);
+ editCleanPartsAction = new QAction(tr("Clean selected parts"), this);
+
+
+ addTrack = new QMenu(tr("Add Track"), this);
+ addTrack->setIcon(QIcon(*edit_track_addIcon));
+ select = new QMenu(tr("Select"), this);
+ select->setIcon(QIcon(*selectIcon));
+
+ editSelectAllAction = new QAction(QIcon(*select_allIcon), tr("Select &All"), this);
+ editDeselectAllAction = new QAction(QIcon(*select_deselect_allIcon), tr("&Deselect All"), this);
+ editInvertSelectionAction = new QAction(QIcon(*select_invert_selectionIcon), tr("Invert &Selection"), this);
+ editInsideLoopAction = new QAction(QIcon(*select_inside_loopIcon), tr("&Inside Loop"), this);
+ editOutsideLoopAction = new QAction(QIcon(*select_outside_loopIcon), tr("&Outside Loop"), this);
+ editAllPartsAction = new QAction( QIcon(*select_all_parts_on_trackIcon), tr("All &Parts on Track"), this);
+
+
+ scoreSubmenu = new QMenu(tr("Score"), this);
+ scoreSubmenu->setIcon(QIcon(*scoreIconSet));
+
+ scoreAllInOneSubsubmenu = new QMenu(tr("all parts in one staff"), this);
+ scoreOneStaffPerTrackSubsubmenu = new QMenu(tr("one staff per part"), this);
+
+ scoreSubmenu->addMenu(scoreAllInOneSubsubmenu);
+ scoreSubmenu->addMenu(scoreOneStaffPerTrackSubsubmenu);
+ updateScoreMenus();
+
+ startScoreEditAction = new QAction(*scoreIconSet, tr("New score window"), this);
+ startPianoEditAction = new QAction(*pianoIconSet, tr("Pianoroll"), this);
+ startDrumEditAction = new QAction(QIcon(*edit_drummsIcon), tr("Drums"), this);
+ startListEditAction = new QAction(QIcon(*edit_listIcon), tr("List"), this);
+ startWaveEditAction = new QAction(QIcon(*edit_waveIcon), tr("Wave"), this);
+
+ master = new QMenu(tr("Mastertrack"), this);
+ master->setIcon(QIcon(*edit_mastertrackIcon));
+ masterGraphicAction = new QAction(QIcon(*mastertrack_graphicIcon),tr("Graphic"), this);
+ masterListAction = new QAction(QIcon(*mastertrack_listIcon),tr("List"), this);
+
+ midiTransformerAction = new QAction(QIcon(*midi_transformIcon), tr("Midi &Transform"), this);
+
+
+ //-------- Structure Actions
+ strGlobalCutAction = new QAction(tr("Global Cut"), this);
+ strGlobalInsertAction = new QAction(tr("Global Insert"), this);
+ strGlobalSplitAction = new QAction(tr("Global Split"), this);
+
+
+
+ //-------------------------------------------------------------
+ // popup Edit
+ //-------------------------------------------------------------
+
+ QMenu* menuEdit = menuBar()->addMenu(tr("&Edit"));
+ menuEdit->addActions(MusEGlobal::undoRedo->actions());
+ menuEdit->addSeparator();
+
+ menuEdit->addAction(editCutAction);
+ menuEdit->addAction(editCopyAction);
+ menuEdit->addAction(editCopyRangeAction);
+ menuEdit->addAction(editPasteAction);
+ menuEdit->addAction(editPasteDialogAction);
+ menuEdit->addAction(editPasteCloneAction);
+ menuEdit->addAction(editPasteCloneDialogAction);
+ menuEdit->addAction(editInsertEMAction);
+ menuEdit->addSeparator();
+ menuEdit->addAction(editShrinkPartsAction);
+ menuEdit->addAction(editExpandPartsAction);
+ menuEdit->addAction(editCleanPartsAction);
+ menuEdit->addSeparator();
+ menuEdit->addAction(editDeleteSelectedAction);
+
+ menuEdit->addMenu(addTrack);
+ menuEdit->addMenu(select);
+ select->addAction(editSelectAllAction);
+ select->addAction(editDeselectAllAction);
+ select->addAction(editInvertSelectionAction);
+ select->addAction(editInsideLoopAction);
+ select->addAction(editOutsideLoopAction);
+ select->addAction(editAllPartsAction);
+ menuEdit->addSeparator();
+
+ menuEdit->addAction(startPianoEditAction);
+ menuEdit->addMenu(scoreSubmenu);
+ menuEdit->addAction(startScoreEditAction);
+ menuEdit->addAction(startDrumEditAction);
+ menuEdit->addAction(startListEditAction);
+ menuEdit->addAction(startWaveEditAction);
+
+ menuEdit->addMenu(master);
+ master->addAction(masterGraphicAction);
+ master->addAction(masterListAction);
+ menuEdit->addSeparator();
+
+ menuEdit->addAction(midiTransformerAction);
+
+ QMenu* menuStructure = menuEdit->addMenu(tr("&Structure"));
+ menuStructure->addAction(strGlobalCutAction);
+ menuStructure->addAction(strGlobalInsertAction);
+ menuStructure->addAction(strGlobalSplitAction);
+
+
+
+ QMenu* functions_menu = menuBar()->addMenu(tr("Functions"));
+ QAction* func_quantize_action = functions_menu->addAction(tr("&Quantize Notes"), editSignalMapper, SLOT(map()));
+ QAction* func_notelen_action = functions_menu->addAction(tr("Change note &length"), editSignalMapper, SLOT(map()));
+ QAction* func_velocity_action = functions_menu->addAction(tr("Change note &velocity"), editSignalMapper, SLOT(map()));
+ QAction* func_cresc_action = functions_menu->addAction(tr("Crescendo/Decrescendo"), editSignalMapper, SLOT(map()));
+ QAction* func_transpose_action = functions_menu->addAction(tr("Transpose"), editSignalMapper, SLOT(map()));
+ QAction* func_erase_action = functions_menu->addAction(tr("Erase Events (Not Parts)"), editSignalMapper, SLOT(map()));
+ QAction* func_move_action = functions_menu->addAction(tr("Move Events (Not Parts)"), editSignalMapper, SLOT(map()));
+ QAction* func_fixed_len_action = functions_menu->addAction(tr("Set Fixed Note Length"), editSignalMapper, SLOT(map()));
+ QAction* func_del_overlaps_action = functions_menu->addAction(tr("Delete Overlapping Notes"), editSignalMapper, SLOT(map()));
+ QAction* func_legato_action = functions_menu->addAction(tr("Legato"), editSignalMapper, SLOT(map()));
+ editSignalMapper->setMapping(func_quantize_action, CMD_QUANTIZE);
+ editSignalMapper->setMapping(func_notelen_action, CMD_NOTELEN);
+ editSignalMapper->setMapping(func_velocity_action, CMD_VELOCITY);
+ editSignalMapper->setMapping(func_cresc_action, CMD_CRESCENDO);
+ editSignalMapper->setMapping(func_transpose_action, CMD_TRANSPOSE);
+ editSignalMapper->setMapping(func_erase_action, CMD_ERASE);
+ editSignalMapper->setMapping(func_move_action, CMD_MOVE);
+ editSignalMapper->setMapping(func_fixed_len_action, CMD_FIXED_LEN);
+ editSignalMapper->setMapping(func_del_overlaps_action, CMD_DELETE_OVERLAPS);
+ editSignalMapper->setMapping(func_legato_action, CMD_LEGATO);
+
+
+
+ QMenu* menuSettings = menuBar()->addMenu(tr("Window &Config"));
+ menuSettings->addAction(subwinAction);
+ menuSettings->addAction(shareAction);
+ menuSettings->addAction(fullscreenAction);
+
+
+ //-------- Edit connections
+ connect(editCutAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+ connect(editCopyAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+ connect(editCopyRangeAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+ connect(editPasteAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+ connect(editPasteCloneAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+ connect(editPasteDialogAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+ connect(editPasteCloneDialogAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+ connect(editInsertEMAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+ connect(editDeleteSelectedAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+
+ connect(editShrinkPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+ connect(editExpandPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+ connect(editCleanPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+
+ connect(editSelectAllAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+ connect(editDeselectAllAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+ connect(editInvertSelectionAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+ connect(editInsideLoopAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+ connect(editOutsideLoopAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+ connect(editAllPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map()));
+
+ editSignalMapper->setMapping(editCutAction, CMD_CUT);
+ editSignalMapper->setMapping(editCopyAction, CMD_COPY);
+ editSignalMapper->setMapping(editCopyRangeAction, CMD_COPY_RANGE);
+ editSignalMapper->setMapping(editPasteAction, CMD_PASTE);
+ editSignalMapper->setMapping(editPasteCloneAction, CMD_PASTE_CLONE);
+ editSignalMapper->setMapping(editPasteDialogAction, CMD_PASTE_DIALOG);
+ editSignalMapper->setMapping(editPasteCloneDialogAction, CMD_PASTE_CLONE_DIALOG);
+ editSignalMapper->setMapping(editInsertEMAction, CMD_INSERTMEAS);
+ editSignalMapper->setMapping(editDeleteSelectedAction, CMD_DELETE_TRACK);
+ editSignalMapper->setMapping(editShrinkPartsAction, CMD_SHRINK_PART);
+ editSignalMapper->setMapping(editExpandPartsAction, CMD_EXPAND_PART);
+ editSignalMapper->setMapping(editCleanPartsAction, CMD_CLEAN_PART);
+ editSignalMapper->setMapping(editSelectAllAction, CMD_SELECT_ALL);
+ editSignalMapper->setMapping(editDeselectAllAction, CMD_SELECT_NONE);
+ editSignalMapper->setMapping(editInvertSelectionAction, CMD_SELECT_INVERT);
+ editSignalMapper->setMapping(editInsideLoopAction, CMD_SELECT_ILOOP);
+ editSignalMapper->setMapping(editOutsideLoopAction, CMD_SELECT_OLOOP);
+ editSignalMapper->setMapping(editAllPartsAction, CMD_SELECT_PARTS);
+
+ connect(editSignalMapper, SIGNAL(mapped(int)), this, SLOT(cmd(int)));
+
+ connect(startPianoEditAction, SIGNAL(activated()), muse, SLOT(startPianoroll()));
+ connect(startScoreEditAction, SIGNAL(activated()), muse, SLOT(startScoreQuickly()));
+ connect(startDrumEditAction, SIGNAL(activated()), muse, SLOT(startDrumEditor()));
+ connect(startListEditAction, SIGNAL(activated()), muse, SLOT(startListEditor()));
+ connect(startWaveEditAction, SIGNAL(activated()), muse, SLOT(startWaveEditor()));
+ connect(scoreOneStaffPerTrackMapper, SIGNAL(mapped(QWidget*)), muse, SLOT(openInScoreEdit_oneStaffPerTrack(QWidget*)));
+ connect(scoreAllInOneMapper, SIGNAL(mapped(QWidget*)), muse, SLOT(openInScoreEdit_allInOne(QWidget*)));
+
+
+ connect(masterGraphicAction, SIGNAL(activated()), muse, SLOT(startMasterEditor()));
+ connect(masterListAction, SIGNAL(activated()), muse, SLOT(startLMasterEditor()));
+
+ connect(midiTransformerAction, SIGNAL(activated()), muse, SLOT(startMidiTransformer()));
+
+
+ //-------- Structure connections
+ connect(strGlobalCutAction, SIGNAL(activated()), SLOT(globalCut()));
+ connect(strGlobalInsertAction, SIGNAL(activated()), SLOT(globalInsert()));
+ connect(strGlobalSplitAction, SIGNAL(activated()), SLOT(globalSplit()));
+
+
+
+ connect(muse, SIGNAL(configChanged()), SLOT(updateShortcuts()));
+
+
+ QClipboard* cb = QApplication::clipboard();
+ connect(cb, SIGNAL(dataChanged()), SLOT(clipboardChanged()));
+ connect(cb, SIGNAL(selectionChanged()), SLOT(clipboardChanged()));
+
+
+
+ // work around for probable QT/WM interaction bug.
+ // for certain window managers, e.g xfce, this window is
+ // is displayed although not specifically set to show();
+ // bug: 2811156 Softsynth GUI unclosable with XFCE4 (and a few others)
+ show();
+ hide();
+}
+
+ArrangerView::~ArrangerView()
+{
+
+}
+
+void ArrangerView::closeEvent(QCloseEvent* e)
+{
+ emit deleted(static_cast<TopWin*>(this));
+ emit closed();
+ e->accept();
+}
+
+
+
+void ArrangerView::writeStatus(int level, Xml& xml) const
+{
+ xml.tag(level++, "arrangerview");
+ TopWin::writeStatus(level, xml);
+ xml.intTag(level, "tool", editTools->curTool());
+ xml.tag(level, "/arrangerview");
+}
+
+void ArrangerView::readStatus(Xml& xml)
+{
+ for (;;)
+ {
+ Xml::Token token = xml.parse();
+ if (token == Xml::Error || token == Xml::End)
+ break;
+
+ const QString& tag = xml.s1();
+ switch (token)
+ {
+ case Xml::TagStart:
+ if (tag == "tool")
+ editTools->set(xml.parseInt());
+ else if (tag == "topwin")
+ TopWin::readStatus(xml);
+ else
+ xml.unknown("ArrangerView");
+ break;
+
+ case Xml::TagEnd:
+ if (tag == "arrangerview")
+ return;
+
+ default:
+ break;
+ }
+ }
+}
+
+//---------------------------------------------------------
+// readConfiguration
+//---------------------------------------------------------
+
+void ArrangerView::readConfiguration(Xml& xml)
+ {
+ for (;;) {
+ Xml::Token token = xml.parse();
+ const QString& tag = xml.s1();
+ switch (token) {
+ case Xml::Error:
+ case Xml::End:
+ return;
+ case Xml::TagStart:
+ if (tag == "topwin")
+ TopWin::readConfiguration(ARRANGER, xml);
+ else
+ xml.unknown("ArrangerView");
+ break;
+ case Xml::TagEnd:
+ if (tag == "arrangerview")
+ return;
+ default:
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// writeConfiguration
+//---------------------------------------------------------
+
+void ArrangerView::writeConfiguration(int level, Xml& xml)
+ {
+ xml.tag(level++, "arrangerview");
+ TopWin::writeConfiguration(ARRANGER, level, xml);
+ xml.tag(level, "/arrangerview");
+ }
+
+
+void ArrangerView::cmd(int cmd)
+ {
+ TrackList* tracks = song->tracks();
+ int l = song->lpos();
+ int r = song->rpos();
+
+ switch(cmd) {
+ case CMD_CUT:
+ arranger->cmd(Arranger::CMD_CUT_PART);
+ break;
+ case CMD_COPY:
+ arranger->cmd(Arranger::CMD_COPY_PART);
+ break;
+ case CMD_COPY_RANGE:
+ arranger->cmd(Arranger::CMD_COPY_PART_IN_RANGE);
+ break;
+ case CMD_PASTE:
+ arranger->cmd(Arranger::CMD_PASTE_PART);
+ break;
+ case CMD_PASTE_CLONE:
+ arranger->cmd(Arranger::CMD_PASTE_CLONE_PART);
+ break;
+ case CMD_PASTE_DIALOG:
+ arranger->cmd(Arranger::CMD_PASTE_DIALOG);
+ break;
+ case CMD_PASTE_CLONE_DIALOG:
+ arranger->cmd(Arranger::CMD_PASTE_CLONE_DIALOG);
+ break;
+ case CMD_INSERTMEAS:
+ arranger->cmd(Arranger::CMD_INSERT_EMPTYMEAS);
+ break;
+ case CMD_DELETE:
+ if (!song->msgRemoveParts()) //automatically does undo if neccessary and returns true then
+ {
+ //msgRemoveParts() returned false -> no parts to remove?
+ song->startUndo();
+ audio->msgRemoveTracks(); //TODO FINDME this could still be speeded up!
+ song->endUndo(SC_TRACK_REMOVED);
+ }
+ break;
+ case CMD_DELETE_TRACK:
+ song->startUndo();
+ audio->msgRemoveTracks();
+ song->endUndo(SC_TRACK_REMOVED);
+ audio->msgUpdateSoloStates();
+ break;
+
+ case CMD_SELECT_ALL:
+ case CMD_SELECT_NONE:
+ case CMD_SELECT_INVERT:
+ case CMD_SELECT_ILOOP:
+ case CMD_SELECT_OLOOP:
+ for (iTrack i = tracks->begin(); i != tracks->end(); ++i) {
+ PartList* parts = (*i)->parts();
+ for (iPart p = parts->begin(); p != parts->end(); ++p) {
+ bool f = false;
+ int t1 = p->second->tick();
+ int t2 = t1 + p->second->lenTick();
+ bool inside =
+ ((t1 >= l) && (t1 < r))
+ || ((t2 > l) && (t2 < r))
+ || ((t1 <= l) && (t2 > r));
+ switch(cmd) {
+ case CMD_SELECT_INVERT:
+ f = !p->second->selected();
+ break;
+ case CMD_SELECT_NONE:
+ f = false;
+ break;
+ case CMD_SELECT_ALL:
+ f = true;
+ break;
+ case CMD_SELECT_ILOOP:
+ f = inside;
+ break;
+ case CMD_SELECT_OLOOP:
+ f = !inside;
+ break;
+ }
+ p->second->setSelected(f);
+ }
+ }
+ song->update();
+ break;
+
+ case CMD_SELECT_PARTS:
+ for (iTrack i = tracks->begin(); i != tracks->end(); ++i) {
+ if (!(*i)->selected())
+ continue;
+ PartList* parts = (*i)->parts();
+ for (iPart p = parts->begin(); p != parts->end(); ++p)
+ p->second->setSelected(true);
+ }
+ song->update();
+ break;
+
+ case CMD_SHRINK_PART: shrink_parts(); break;
+ case CMD_EXPAND_PART: expand_parts(); break;
+ case CMD_CLEAN_PART: clean_parts(); break;
+
+ case CMD_QUANTIZE: quantize_notes(); break;
+ case CMD_VELOCITY: modify_velocity(); break;
+ case CMD_CRESCENDO: crescendo(); break;
+ case CMD_NOTELEN: modify_notelen(); break;
+ case CMD_TRANSPOSE: transpose_notes(); break;
+ case CMD_ERASE: erase_notes(); break;
+ case CMD_MOVE: move_notes(); break;
+ case CMD_FIXED_LEN: set_notelen(); break;
+ case CMD_DELETE_OVERLAPS: delete_overlaps(); break;
+ case CMD_LEGATO: legato(); break;
+
+ }
+ }
+
+void ArrangerView::scoreNamingChanged()
+{
+ updateScoreMenus();
+}
+
+void ArrangerView::updateScoreMenus()
+{
+ QAction* action;
+
+
+ scoreOneStaffPerTrackSubsubmenu->clear();
+ scoreAllInOneSubsubmenu->clear();
+
+
+ action=new QAction(tr("New"), this);
+ connect(action, SIGNAL(activated()), scoreOneStaffPerTrackMapper, SLOT(map()));
+ scoreOneStaffPerTrackMapper->setMapping(action, (QWidget*)NULL);
+ scoreOneStaffPerTrackSubsubmenu->addAction(action);
+
+
+ action=new QAction(tr("New"), this); //the above action may NOT be reused!
+ connect(action, SIGNAL(activated()), scoreAllInOneMapper, SLOT(map()));
+ scoreAllInOneMapper->setMapping(action, (QWidget*)NULL);
+ scoreAllInOneSubsubmenu->addAction(action);
+
+ const ToplevelList* toplevels=MusEGlobal::muse->getToplevels();
+
+ for (ToplevelList::const_iterator it=toplevels->begin(); it!=toplevels->end(); it++)
+ if ((*it)->type()==TopWin::SCORE)
+ {
+ ScoreEdit* score = dynamic_cast<ScoreEdit*>(*it);
+
+ action=new QAction(score->get_name(), this);
+ connect(action, SIGNAL(activated()), scoreOneStaffPerTrackMapper, SLOT(map()));
+ scoreOneStaffPerTrackMapper->setMapping(action, (QWidget*)score);
+ scoreOneStaffPerTrackSubsubmenu->addAction(action);
+
+
+ action=new QAction(score->get_name(), this); //the above action may NOT be reused!
+ connect(action, SIGNAL(activated()), scoreAllInOneMapper, SLOT(map()));
+ scoreAllInOneMapper->setMapping(action, (QWidget*)score);
+ scoreAllInOneSubsubmenu->addAction(action);
+ }
+}
+
+void ArrangerView::clearScoreMenuMappers()
+{
+ delete scoreOneStaffPerTrackMapper;
+ delete scoreAllInOneMapper;
+
+ scoreOneStaffPerTrackMapper = new QSignalMapper(this);
+ scoreAllInOneMapper = new QSignalMapper(this);
+
+ connect(scoreOneStaffPerTrackMapper, SIGNAL(mapped(QWidget*)), this, SLOT(openInScoreEdit_oneStaffPerTrack(QWidget*)));
+ connect(scoreAllInOneMapper, SIGNAL(mapped(QWidget*)), this, SLOT(openInScoreEdit_allInOne(QWidget*)));
+}
+
+void ArrangerView::populateAddTrack()
+{
+ QActionGroup *grp = MusEUtil::populateAddTrack(addTrack);
+ connect(addTrack, SIGNAL(triggered(QAction *)), SLOT(addNewTrack(QAction *)));
+
+ trackMidiAction = grp->actions()[0];
+ trackDrumAction = grp->actions()[1];
+ trackWaveAction = grp->actions()[2];
+ trackAOutputAction = grp->actions()[3];
+ trackAGroupAction = grp->actions()[4];
+ trackAInputAction = grp->actions()[5];
+ trackAAuxAction = grp->actions()[6];
+}
+
+void ArrangerView::addNewTrack(QAction* action)
+{
+ song->addNewTrack(action, MusEGlobal::muse->arranger()->curTrack()); // Insert at current selected track.
+ //song->addNewTrack(action); // Add at end.
+}
+
+void ArrangerView::updateShortcuts()
+{
+ editCutAction->setShortcut(shortcuts[SHRT_CUT].key);
+ editCopyAction->setShortcut(shortcuts[SHRT_COPY].key);
+ editCopyRangeAction->setShortcut(shortcuts[SHRT_COPY_RANGE].key);
+ editPasteAction->setShortcut(shortcuts[SHRT_PASTE].key);
+ editPasteCloneAction->setShortcut(shortcuts[SHRT_PASTE_CLONE].key);
+ editPasteDialogAction->setShortcut(shortcuts[SHRT_PASTE_DIALOG].key);
+ editPasteCloneDialogAction->setShortcut(shortcuts[SHRT_PASTE_CLONE_DIALOG].key);
+ editInsertEMAction->setShortcut(shortcuts[SHRT_INSERTMEAS].key);
+
+ //editDeleteSelectedAction has no acceleration
+
+ trackMidiAction->setShortcut(shortcuts[SHRT_ADD_MIDI_TRACK].key);
+ trackDrumAction->setShortcut(shortcuts[SHRT_ADD_DRUM_TRACK].key);
+ trackWaveAction->setShortcut(shortcuts[SHRT_ADD_WAVE_TRACK].key);
+ trackAOutputAction->setShortcut(shortcuts[SHRT_ADD_AUDIO_OUTPUT].key);
+ trackAGroupAction->setShortcut(shortcuts[SHRT_ADD_AUDIO_GROUP].key);
+ trackAInputAction->setShortcut(shortcuts[SHRT_ADD_AUDIO_INPUT].key);
+ trackAAuxAction->setShortcut(shortcuts[SHRT_ADD_AUDIO_AUX].key);
+
+ editSelectAllAction->setShortcut(shortcuts[SHRT_SELECT_ALL].key);
+ editDeselectAllAction->setShortcut(shortcuts[SHRT_SELECT_NONE].key);
+ editInvertSelectionAction->setShortcut(shortcuts[SHRT_SELECT_INVERT].key);
+ editInsideLoopAction->setShortcut(shortcuts[SHRT_SELECT_OLOOP].key);
+ editOutsideLoopAction->setShortcut(shortcuts[SHRT_SELECT_OLOOP].key);
+ editAllPartsAction->setShortcut(shortcuts[SHRT_SELECT_PRTSTRACK].key);
+
+ startPianoEditAction->setShortcut(shortcuts[SHRT_OPEN_PIANO].key);
+ startDrumEditAction->setShortcut(shortcuts[SHRT_OPEN_DRUMS].key);
+ startListEditAction->setShortcut(shortcuts[SHRT_OPEN_LIST].key);
+ startWaveEditAction->setShortcut(shortcuts[SHRT_OPEN_WAVE].key);
+
+ masterGraphicAction->setShortcut(shortcuts[SHRT_OPEN_GRAPHIC_MASTER].key);
+ masterListAction->setShortcut(shortcuts[SHRT_OPEN_LIST_MASTER].key);
+
+ midiTransformerAction->setShortcut(shortcuts[SHRT_OPEN_MIDI_TRANSFORM].key);
+ strGlobalCutAction->setShortcut(shortcuts[SHRT_GLOBAL_CUT].key);
+ strGlobalInsertAction->setShortcut(shortcuts[SHRT_GLOBAL_INSERT].key);
+ strGlobalSplitAction->setShortcut(shortcuts[SHRT_GLOBAL_SPLIT].key);
+}
+
+//---------------------------------------------------------
+// clipboardChanged
+//---------------------------------------------------------
+
+void ArrangerView::clipboardChanged()
+ {
+ bool flag = false;
+ if(QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-midipartlist")) ||
+ QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-wavepartlist")) ||
+ QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-mixedpartlist")))
+ flag = true;
+
+ editPasteAction->setEnabled(flag);
+ editPasteCloneAction->setEnabled(flag);
+ editPasteDialogAction->setEnabled(flag);
+ editPasteCloneDialogAction->setEnabled(flag);
+ }
+
+//---------------------------------------------------------
+// selectionChanged
+//---------------------------------------------------------
+
+void ArrangerView::selectionChanged()
+ {
+ //bool flag = arranger->isSingleSelection(); // -- Hmm, why only single?
+ bool flag = arranger->selectionSize() > 0; // -- Test OK cut and copy. For muse2. Tim.
+ editCutAction->setEnabled(flag);
+ editCopyAction->setEnabled(flag);
+ }
+
+
+void ArrangerView::updateVisibleTracksButtons()
+{
+ visTracks->updateVisibleTracksButtons();
+}
+
+void ArrangerView::globalCut() { ::globalCut(); }
+void ArrangerView::globalInsert() { ::globalInsert(); }
+void ArrangerView::globalSplit() { ::globalSplit(); }
diff --git a/muse2/muse/arranger/arrangerview.h b/muse2/muse/arranger/arrangerview.h
new file mode 100644
index 00000000..bdb450ae
--- /dev/null
+++ b/muse2/muse/arranger/arrangerview.h
@@ -0,0 +1,156 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// arrangerview.h
+// (C) Copyright 2011 Florian Jung (flo93@users.sourceforge.net)
+//
+// 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; 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 __ARRANGERVIEW_H__
+#define __ARRANGERVIEW_H__
+
+#include <QCloseEvent>
+#include <QResizeEvent>
+#include <QLabel>
+#include <QKeyEvent>
+#include <QPainter>
+#include <QPixmap>
+#include <QTimer>
+#include <QScrollBar>
+#include <QComboBox>
+#include <QSignalMapper>
+#include <QAction>
+#include <QActionGroup>
+#include <QGridLayout>
+#include <QByteArray>
+#include <QToolButton>
+
+#include <values.h>
+#include "noteinfo.h"
+#include "cobject.h"
+#include "event.h"
+#include "view.h"
+#include "gconfig.h"
+#include "part.h"
+#include "keyevent.h"
+#include "mtscale_flo.h"
+#include "steprec.h"
+#include "cleftypes.h"
+#include "helper.h"
+#include "arranger.h"
+
+namespace MusEWidget { class VisibleTracks; }
+
+
+class ArrangerView : public TopWin
+{
+ Q_OBJECT
+
+ private:
+
+ enum cmd_enum
+ {CMD_CUT, CMD_COPY, CMD_COPY_RANGE, CMD_PASTE, CMD_INSERTMEAS, CMD_PASTE_CLONE,
+ CMD_PASTE_DIALOG, CMD_PASTE_CLONE_DIALOG, CMD_DELETE,
+ CMD_SELECT_ALL, CMD_SELECT_NONE, CMD_SELECT_INVERT,
+ CMD_SELECT_ILOOP, CMD_SELECT_OLOOP, CMD_SELECT_PARTS,
+ CMD_DELETE_TRACK, CMD_EXPAND_PART, CMD_SHRINK_PART, CMD_CLEAN_PART,
+ CMD_QUANTIZE, CMD_VELOCITY, CMD_CRESCENDO, CMD_NOTELEN, CMD_TRANSPOSE,
+ CMD_ERASE, CMD_MOVE, CMD_FIXED_LEN, CMD_DELETE_OVERLAPS, CMD_LEGATO };
+
+ virtual void closeEvent(QCloseEvent*);
+
+ QGridLayout* mainGrid;
+ QWidget* mainw;
+
+ MusEWidget::EditToolBar* editTools;
+ MusEWidget::VisibleTracks* visTracks;
+
+ Arranger* arranger;
+
+ // Edit Menu actions
+ QMenu* select;
+ QMenu* addTrack;
+ QMenu* master;
+
+ QAction *strGlobalCutAction, *strGlobalInsertAction, *strGlobalSplitAction;
+ QAction *trackMidiAction, *trackDrumAction, *trackWaveAction, *trackAOutputAction, *trackAGroupAction;
+ QAction *trackAInputAction, *trackAAuxAction;
+ QAction *editCutAction, *editCopyAction, *editCopyRangeAction;
+ QAction *editPasteAction, *editPasteCloneAction, *editPasteDialogAction, *editPasteCloneDialogAction;
+ QAction *editInsertEMAction, *editPasteC2TAction, *editDeleteSelectedAction, *editSelectAllAction, *editDeselectAllAction;
+ QAction *editInvertSelectionAction, *editInsideLoopAction, *editOutsideLoopAction, *editAllPartsAction;
+ QAction *masterGraphicAction, *masterListAction;
+ QAction *midiTransformerAction;
+ QAction *editCleanPartsAction, *editShrinkPartsAction, *editExpandPartsAction;
+
+ QAction* func_quantize_action;
+ QAction* func_notelen_action;
+ QAction* func_velocity_action;
+ QAction* func_cresc_action;
+ QAction* func_transpose_action;
+ QAction* func_erase_action;
+ QAction* func_move_action;
+ QAction* func_fixed_len_action;
+ QAction* func_del_overlaps_action;
+ QAction* func_legato_action;
+
+ QSignalMapper *editSignalMapper;
+ QSignalMapper *scoreOneStaffPerTrackMapper;
+ QSignalMapper *scoreAllInOneMapper;
+
+ private slots:
+ void clearScoreMenuMappers();
+ void globalCut();
+ void globalInsert();
+ void globalSplit();
+ void cmd(int);
+ void addNewTrack(QAction* action);
+
+ signals:
+ void deleted(TopWin*);
+ void closed();
+
+ public slots:
+ void scoreNamingChanged();
+ void updateScoreMenus();
+ void clipboardChanged();
+ void selectionChanged();
+ void updateShortcuts();
+ void updateVisibleTracksButtons();
+
+ public:
+ ArrangerView(QWidget* parent = 0);
+ ~ArrangerView();
+
+ QAction *startScoreEditAction, *startPianoEditAction, *startDrumEditAction, *startListEditAction, *startWaveEditAction;
+ QMenu *scoreSubmenu, *scoreOneStaffPerTrackSubsubmenu, *scoreAllInOneSubsubmenu;
+
+ void populateAddTrack();
+
+ Arranger* getArranger() {return arranger;}
+
+ void writeStatus(int level, Xml& xml) const;
+ void readStatus(Xml& xml);
+ static void readConfiguration(Xml&);
+ static void writeConfiguration(int, Xml&);
+};
+
+
+
+
+#endif
+
diff --git a/muse2/muse/arranger/pcanvas.cpp b/muse2/muse/arranger/pcanvas.cpp
index 0d73ace6..056dcce7 100644
--- a/muse2/muse/arranger/pcanvas.cpp
+++ b/muse2/muse/arranger/pcanvas.cpp
@@ -40,6 +40,9 @@
#include "fastlog.h"
#include "widgets/tools.h"
+#include "arranger.h"
+#include "arrangerview.h"
+#include "structure.h"
#include "pcanvas.h"
#include "midieditor.h"
#include "globals.h"
@@ -58,11 +61,17 @@
#include "midi.h"
#include "midictrl.h"
#include "utils.h"
+#include "dialogs.h"
+#include "widgets/pastedialog.h"
//#define ABS(x) ((x) < 0) ? -(x) : (x))
//#define ABS(x) (x>=0?x:-x)
#define ABS(x) (abs(x))
+using std::set;
+
+int get_paste_len();
+
//---------------------------------------------------------
// colorRect
// paints a rectangular icon with a given color
@@ -172,15 +181,19 @@ void PartCanvas::leaveEvent(QEvent*)
void PartCanvas::returnPressed()
{
lineEditor->hide();
- Part* oldPart = editPart->part();
- Part* newPart = oldPart->clone();
- //printf("PartCanvas::returnPressed before msgChangePart oldPart refs:%d Arefs:%d newPart refs:%d Arefs:%d\n", oldPart->events()->refCount(), oldPart->events()->arefCount(), newPart->events()->refCount(), newPart->events()->arefCount());
-
- newPart->setName(lineEditor->text());
- // Indicate do undo, and do port controller values but not clone parts.
- audio->msgChangePart(oldPart, newPart, true, true, false);
-
- editMode = false;
+ if (editMode) {
+ //this check is neccessary, because it returnPressed may be called
+ //twice. the second call would cause a crash, however!
+ Part* oldPart = editPart->part();
+ Part* newPart = oldPart->clone();
+ //printf("PartCanvas::returnPressed before msgChangePart oldPart refs:%d Arefs:%d newPart refs:%d Arefs:%d\n", oldPart->events()->refCount(), oldPart->events()->arefCount(), newPart->events()->refCount(), newPart->events()->arefCount());
+
+ newPart->setName(lineEditor->text());
+ // Indicate do undo, and do port controller values but not clone parts.
+ audio->msgChangePart(oldPart, newPart, true, true, false);
+
+ editMode = false;
+ }
}
//---------------------------------------------------------
@@ -203,6 +216,7 @@ void PartCanvas::viewMouseDoubleClickEvent(QMouseEvent* event)
if (lineEditor == 0) {
lineEditor = new QLineEdit(this);
lineEditor->setFrame(true);
+ connect(lineEditor, SIGNAL(editingFinished()),SLOT(returnPressed()));
}
editMode = true;
lineEditor->setGeometry(r);
@@ -335,7 +349,7 @@ UndoOp PartCanvas::moveItem(MusEWidget::CItem* item, const QPoint& newpos, DragT
ntrack = tracks->size();
if (MusEGlobal::debugMsg)
printf("PartCanvas::moveItem - add new track\n");
- Track* newTrack = song->addTrack(int(type));
+ Track* newTrack = song->addTrack(type, false); // Add at end of list.
if (type == Track::WAVE) {
WaveTrack* st = (WaveTrack*) track;
WaveTrack* dt = (WaveTrack*) newTrack;
@@ -648,17 +662,17 @@ QMenu* PartCanvas::genItemPopup(MusEWidget::CItem* item)
partPopup->addSeparator();
switch(trackType) {
case Track::MIDI: {
- partPopup->addAction(MusEGlobal::muse->startPianoEditAction);
- partPopup->addMenu(MusEGlobal::muse->scoreSubmenu);
- partPopup->addAction(MusEGlobal::muse->startScoreEditAction);
- partPopup->addAction(MusEGlobal::muse->startListEditAction);
+ partPopup->addAction(MusEGlobal::muse->arranger()->parentWin->startPianoEditAction);
+ partPopup->addMenu(MusEGlobal::muse->arranger()->parentWin->scoreSubmenu);
+ partPopup->addAction(MusEGlobal::muse->arranger()->parentWin->startScoreEditAction);
+ partPopup->addAction(MusEGlobal::muse->arranger()->parentWin->startListEditAction);
QAction *act_mexport = partPopup->addAction(tr("save part to disk"));
act_mexport->setData(16);
}
break;
case Track::DRUM: {
- partPopup->addAction(MusEGlobal::muse->startDrumEditAction);
- partPopup->addAction(MusEGlobal::muse->startListEditAction);
+ partPopup->addAction(MusEGlobal::muse->arranger()->parentWin->startDrumEditAction);
+ partPopup->addAction(MusEGlobal::muse->arranger()->parentWin->startListEditAction);
QAction *act_dexport = partPopup->addAction(tr("save part to disk"));
act_dexport->setData(16);
}
@@ -705,6 +719,7 @@ void PartCanvas::itemPopup(MusEWidget::CItem* item, int n, const QPoint& pt)
if (lineEditor == 0) {
lineEditor = new QLineEdit(this);
lineEditor->setFrame(true);
+ connect(lineEditor, SIGNAL(editingFinished()),SLOT(returnPressed()));
}
lineEditor->setText(editPart->name());
lineEditor->setFocus();
@@ -846,25 +861,32 @@ void PartCanvas::mousePress(QMouseEvent* event)
}
QPoint pt = event->pos();
MusEWidget::CItem* item = items.find(pt);
- if (item == 0 && _tool!=MusEWidget::AutomationTool)
- return;
+
+ //if (item == 0 && _tool!=MusEWidget::AutomationTool) // FINDMICHJETZT. neccessary? (flo93)
+ // return;
+
switch (_tool) {
default:
- emit trackChanged(item->part()->track());
+ if (item)
+ emit trackChanged(item->part()->track());
+ else
+ emit trackChanged(NULL);
break;
case MusEWidget::CutTool:
- splitItem(item, pt);
+ if (item) splitItem(item, pt);
break;
case MusEWidget::GlueTool:
- glueItem(item);
+ if (item) glueItem(item);
break;
case MusEWidget::MuteTool:
{
- NPart* np = (NPart*) item;
- Part* p = np->part();
- p->setMute(!p->mute());
- redraw();
- break;
+ if (item) {
+ NPart* np = (NPart*) item;
+ Part* p = np->part();
+ p->setMute(!p->mute());
+ redraw();
+ break;
+ }
}
case MusEWidget::AutomationTool:
if (automation.controllerState != doNothing)
@@ -943,7 +965,7 @@ void PartCanvas::keyPress(QKeyEvent* event)
{
if ( key == Qt::Key_Return || key == Qt::Key_Enter )
{
- returnPressed();
+ //returnPressed(); commented out by flo
return;
}
else if ( key == Qt::Key_Escape )
@@ -2588,21 +2610,39 @@ void PartCanvas::cmd(int cmd)
case CMD_COPY_PART:
copy(&pl);
break;
- case CMD_PASTE_PART:
- paste(false, false);
- break;
- case CMD_PASTE_CLONE_PART:
- paste(true, false);
+ case CMD_COPY_PART_IN_RANGE:
+ copy_in_range(&pl);
break;
- case CMD_PASTE_PART_TO_TRACK:
+ case CMD_PASTE_PART:
paste();
break;
- case CMD_PASTE_CLONE_PART_TO_TRACK:
+ case CMD_PASTE_CLONE_PART:
paste(true);
break;
- case CMD_INSERT_PART:
- paste(false, false, true);
+ case CMD_PASTE_DIALOG:
+ case CMD_PASTE_CLONE_DIALOG:
+ {
+ unsigned temp_begin = AL::sigmap.raster1(song->vcpos(),0);
+ unsigned temp_end = AL::sigmap.raster2(temp_begin + get_paste_len(), 0);
+ paste_dialog->raster = temp_end - temp_begin;
+ paste_dialog->clone = (cmd == CMD_PASTE_CLONE_DIALOG);
+
+ if (paste_dialog->exec())
+ {
+ paste_mode_t paste_mode;
+ switch (paste_dialog->insert_method)
+ {
+ case 0: paste_mode=PASTEMODE_MIX; break;
+ case 1: paste_mode=PASTEMODE_MOVEALL; break;
+ case 2: paste_mode=PASTEMODE_MOVESOME; break;
+ }
+
+ paste(paste_dialog->clone, paste_mode, paste_dialog->all_in_one_track,
+ paste_dialog->number, paste_dialog->raster);
+ }
+
break;
+ }
case CMD_INSERT_EMPTYMEAS:
int startPos=song->vcpos();
int oneMeas=AL::sigmap.ticksMeasure(startPos);
@@ -2617,6 +2657,70 @@ void PartCanvas::cmd(int cmd)
// cut copy paste
//---------------------------------------------------------
+void PartCanvas::copy_in_range(PartList* pl_)
+{
+ PartList pl;
+ PartList result_pl;
+ unsigned int lpos = song->lpos();
+ unsigned int rpos = song->rpos();
+
+ if (pl_->empty())
+ {
+ for (MusEWidget::iCItem i = items.begin(); i != items.end(); ++i)
+ {
+ Part* part=static_cast<NPart*>(i->second)->part();
+ if ( (part->track()->isMidiTrack()) || (part->track()->type() == Track::WAVE) )
+ pl.add(part);
+ }
+ }
+ else
+ {
+ for(ciPart p = pl_->begin(); p != pl_->end(); ++p)
+ if ( (p->second->track()->isMidiTrack()) || (p->second->track()->type() == Track::WAVE) )
+ pl.add(p->second);
+ }
+
+ if (!pl.empty() && (rpos>lpos))
+ {
+ for(ciPart p = pl.begin(); p != pl.end(); ++p)
+ {
+ Part* part=p->second;
+ Track* track=part->track();
+
+ if ((part->tick() < rpos) && (part->endTick() > lpos)) //is the part in the range?
+ {
+ if ((lpos > part->tick()) && (lpos < part->endTick()))
+ {
+ Part* p1;
+ Part* p2;
+
+ track->splitPart(part, lpos, p1, p2);
+ p1->events()->incARef(-1);
+ p2->events()->incARef(-1);
+
+ part=p2;
+ }
+
+ if ((rpos > part->tick()) && (rpos < part->endTick()))
+ {
+ Part* p1;
+ Part* p2;
+
+ track->splitPart(part, rpos, p1, p2);
+ p1->events()->incARef(-1);
+ p2->events()->incARef(-1);
+
+ part=p1;
+ }
+
+ result_pl.add(part);
+ }
+ }
+
+ copy(&result_pl);
+ }
+}
+
void PartCanvas::copy(PartList* pl)
{
if (pl->empty())
@@ -2700,11 +2804,88 @@ void PartCanvas::copy(PartList* pl)
fclose(tmp);
}
-//---------------------------------------------------------
-// pasteAt
-//---------------------------------------------------------
-Undo PartCanvas::pasteAt(const QString& pt, Track* track, unsigned int pos, bool clone, bool toTrack, int* finalPosPtr)
+
+int get_paste_len()
+{
+ QClipboard* cb = QApplication::clipboard();
+ const QMimeData* md = cb->mimeData(QClipboard::Clipboard);
+
+ QString pfx("text/");
+ QString mdpl("x-muse-midipartlist");
+ QString wvpl("x-muse-wavepartlist");
+ QString mxpl("x-muse-mixedpartlist");
+ QString txt;
+
+ if(md->hasFormat(pfx + mdpl))
+ txt = cb->text(mdpl, QClipboard::Clipboard);
+ else if(md->hasFormat(pfx + wvpl))
+ txt = cb->text(wvpl, QClipboard::Clipboard);
+ else if(md->hasFormat(pfx + mxpl))
+ txt = cb->text(mxpl, QClipboard::Clipboard);
+ else
+ return 0;
+
+
+ QByteArray ba = txt.toLatin1();
+ const char* ptxt = ba.constData();
+ Xml xml(ptxt);
+ bool end = false;
+
+ unsigned begin_tick=-1; //this uses the greatest possible begin_tick
+ unsigned end_tick=0;
+
+ for (;;)
+ {
+ Xml::Token token = xml.parse();
+ const QString& tag = xml.s1();
+ switch (token)
+ {
+ case Xml::Error:
+ case Xml::End:
+ end = true;
+ break;
+
+ case Xml::TagStart:
+ if (tag == "part")
+ {
+ Part* p = 0;
+ p = readXmlPart(xml, NULL, false, false);
+
+ if (p)
+ {
+ if (p->tick() < begin_tick)
+ begin_tick=p->tick();
+
+ if (p->endTick() > end_tick)
+ end_tick=p->endTick();
+
+ delete p;
+ }
+ }
+ else
+ xml.unknown("PartCanvas::get_paste_len");
+ break;
+
+ case Xml::TagEnd:
+ break;
+
+ default:
+ end = true;
+ break;
+ }
+ if(end)
+ break;
+ }
+
+ if (begin_tick > end_tick)
+ return 0;
+ else
+ return end_tick - begin_tick;
+}
+
+
+Undo PartCanvas::pasteAt(const QString& pt, Track* track, unsigned int pos, bool clone, bool toTrack, int* finalPosPtr, set<Track*>* affected_tracks)
{
Undo operations;
@@ -2754,7 +2935,10 @@ Undo PartCanvas::pasteAt(const QString& pt, Track* track, unsigned int pos, bool
if (p->tick()+p->lenTick()>finalPos) {
finalPos=p->tick()+p->lenTick();
}
+ p->setSelected(true);
operations.push_back(UndoOp(UndoOp::AddPart,p));
+ if (affected_tracks)
+ affected_tracks->insert(p->track());
}
else
xml.unknown("PartCanvas::pasteAt");
@@ -2789,16 +2973,12 @@ Undo PartCanvas::pasteAt(const QString& pt, Track* track, unsigned int pos, bool
// paste part to current selected track at cpos
//---------------------------------------------------------
-void PartCanvas::paste(bool clone, bool toTrack, bool doInsert)
+void PartCanvas::paste(bool clone, paste_mode_t paste_mode, bool to_single_track, int amount, int raster)
{
Track* track = 0;
-
- if (doInsert) // logic depends on keeping track of newly selected tracks
- deselectAll();
-
-
+
// If we want to paste to a selected track...
- if(toTrack)
+ if (to_single_track)
{
TrackList* tl = song->tracks();
for (iTrack i = tl->begin(); i != tl->end(); ++i) {
@@ -2831,7 +3011,7 @@ void PartCanvas::paste(bool clone, bool toTrack, bool doInsert)
if(md->hasFormat(pfx + mdpl))
{
// If we want to paste to a selected track...
- if(toTrack && !track->isMidiTrack())
+ if(to_single_track && !track->isMidiTrack())
{
QMessageBox::critical(this, QString("MusE"),
tr("Can only paste to midi/drum track"));
@@ -2839,11 +3019,10 @@ void PartCanvas::paste(bool clone, bool toTrack, bool doInsert)
}
txt = cb->text(mdpl, QClipboard::Clipboard);
}
- else
- if(md->hasFormat(pfx + wvpl))
+ else if(md->hasFormat(pfx + wvpl))
{
// If we want to paste to a selected track...
- if(toTrack && track->type() != Track::WAVE)
+ if(to_single_track && track->type() != Track::WAVE)
{
QMessageBox::critical(this, QString("MusE"),
tr("Can only paste to wave track"));
@@ -2851,11 +3030,10 @@ void PartCanvas::paste(bool clone, bool toTrack, bool doInsert)
}
txt = cb->text(wvpl, QClipboard::Clipboard);
}
- else
- if(md->hasFormat(pfx + mxpl))
+ else if(md->hasFormat(pfx + mxpl))
{
// If we want to paste to a selected track...
- if(toTrack && !track->isMidiTrack() && track->type() != Track::WAVE)
+ if(to_single_track && !track->isMidiTrack() && track->type() != Track::WAVE)
{
QMessageBox::critical(this, QString("MusE"),
tr("Can only paste to midi or wave track"));
@@ -2874,54 +3052,41 @@ void PartCanvas::paste(bool clone, bool toTrack, bool doInsert)
{
int endPos=0;
unsigned int startPos=song->vcpos();
- Undo operations=pasteAt(txt, track, startPos, clone, toTrack, &endPos);
+ set<Track*> affected_tracks;
+
+ deselectAll();
+
+ Undo operations;
+ for (int i=0;i<amount;i++)
+ {
+ Undo temp = pasteAt(txt, track, startPos + i*raster, clone, to_single_track, &endPos, &affected_tracks);
+ operations.insert(operations.end(), temp.begin(), temp.end());
+ }
+
Pos p(endPos, true);
song->setPos(0, p);
- if (doInsert) {
- int offset = endPos-startPos;
- Undo temp=movePartsTotheRight(startPos, offset);
+
+ if (paste_mode != PASTEMODE_MIX)
+ {
+ int offset;
+ if (amount==1) offset = endPos-startPos;
+ else offset = amount*raster;
+
+ Undo temp;
+ if (paste_mode==PASTEMODE_MOVESOME)
+ temp=movePartsTotheRight(startPos, offset, false, &affected_tracks);
+ else
+ temp=movePartsTotheRight(startPos, offset);
+
operations.insert(operations.end(), temp.begin(), temp.end());
}
+
song->applyOperationGroup(operations);
}
}
//---------------------------------------------------------
-// movePartsToTheRight
-//---------------------------------------------------------
-Undo PartCanvas::movePartsTotheRight(unsigned int startTicks, int length)
-{
- Undo operations;
-
- // all parts that start after the pasted parts will be moved the entire length of the pasted parts
- for (MusEWidget::iCItem i = items.begin(); i != items.end(); ++i) {
- if (!i->second->isSelected()) {
- Part* part = i->second->part();
- if (part->tick() >= startTicks) {
- Part *newPart = part->clone();
- newPart->setTick(newPart->tick()+length);
-
- operations.push_back(UndoOp(UndoOp::ModifyPart,part,newPart,false,false));
- }
- }
- }
- // perhaps ask if markers should be moved?
- MarkerList *markerlist = song->marker();
- for(iMarker i = markerlist->begin(); i != markerlist->end(); ++i)
- {
- Marker* m = &i->second;
- if (m->tick() >= startTicks) {
- Marker *oldMarker = new Marker();
- *oldMarker = *m;
- m->setTick(m->tick()+length);
- operations.push_back(UndoOp(UndoOp::ModifyMarker,oldMarker, m));
- }
- }
-
- return operations;
-}
-//---------------------------------------------------------
// startDrag
//---------------------------------------------------------
@@ -3044,6 +3209,7 @@ void PartCanvas::viewDropEvent(QDropEvent* event)
track = tracks->index(trackNo);
if (track)
{
+ deselectAll();
Undo temp=pasteAt(text, track, x);
song->applyOperationGroup(temp);
}
@@ -3070,9 +3236,9 @@ void PartCanvas::viewDropEvent(QDropEvent* event)
if (!track) { // we need to create a track for this drop
if (text.endsWith(".mpt", Qt::CaseInsensitive)) {
- track = song->addTrack((Track::MIDI));
+ track = song->addTrack(Track::MIDI, false); // Add at end of list.
} else {
- track = song->addTrack((Track::WAVE));
+ track = song->addTrack(Track::WAVE, false); // Add at end of list.
}
}
if (track->type() == Track::WAVE &&
diff --git a/muse2/muse/arranger/pcanvas.h b/muse2/muse/arranger/pcanvas.h
index 927a64e1..2bce9035 100644
--- a/muse2/muse/arranger/pcanvas.h
+++ b/muse2/muse/arranger/pcanvas.h
@@ -25,6 +25,7 @@
#define __PCANVAS_H__
#include <QVector>
+#include <set>
#include "song.h"
#include "canvas.h"
@@ -124,9 +125,10 @@ class PartCanvas : public MusEWidget::Canvas {
void splitItem(MusEWidget::CItem* item, const QPoint&);
void copy(PartList*);
- void paste(bool clone = false, bool toTrack = true, bool doInsert=false);
- Undo pasteAt(const QString&, Track*, unsigned int, bool clone = false, bool toTrack = true, int* finalPosPtr = NULL);
- Undo movePartsTotheRight(unsigned int startTick, int length);
+ void copy_in_range(PartList*);
+ enum paste_mode_t { PASTEMODE_MIX, PASTEMODE_MOVEALL, PASTEMODE_MOVESOME };
+ void paste(bool clone = false, paste_mode_t paste_mode = PASTEMODE_MIX, bool to_single_track=false, int amount=1, int raster=1536);
+ Undo pasteAt(const QString&, Track*, unsigned int, bool clone = false, bool toTrack = true, int* finalPosPtr = NULL, std::set<Track*>* affected_tracks = NULL);
//Part* readClone(Xml&, Track*, bool toTrack = true);
void drawWavePart(QPainter&, const QRect&, WavePart*, const QRect&);
//void drawMidiPart(QPainter&, const QRect& rect, EventList* events, MidiTrack*mt, const QRect& r, int pTick, int from, int to);
@@ -141,8 +143,6 @@ class PartCanvas : public MusEWidget::Canvas {
double dbToVal(double inDb);
double valToDb(double inV);
-
-
protected:
virtual void drawCanvas(QPainter&, const QRect&);
virtual void endMoveItems(const QPoint&, DragType, int dir);
@@ -165,8 +165,8 @@ class PartCanvas : public MusEWidget::Canvas {
void returnPressed();
public:
- enum { CMD_CUT_PART, CMD_COPY_PART, CMD_PASTE_PART, CMD_PASTE_CLONE_PART, CMD_PASTE_PART_TO_TRACK, CMD_PASTE_CLONE_PART_TO_TRACK,
- CMD_INSERT_PART, CMD_INSERT_EMPTYMEAS };
+ enum { CMD_CUT_PART, CMD_COPY_PART, CMD_COPY_PART_IN_RANGE, CMD_PASTE_PART, CMD_PASTE_CLONE_PART,
+ CMD_PASTE_DIALOG, CMD_PASTE_CLONE_DIALOG, CMD_INSERT_EMPTYMEAS };
PartCanvas(int* raster, QWidget* parent, int, int);
void partsChanged();
diff --git a/muse2/muse/arranger/tlist.cpp b/muse2/muse/arranger/tlist.cpp
index 87f5acde..28b12fdc 100644
--- a/muse2/muse/arranger/tlist.cpp
+++ b/muse2/muse/arranger/tlist.cpp
@@ -55,6 +55,7 @@
#include "audio.h"
#include "instruments/minstrument.h"
#include "app.h"
+#include "helper.h"
#include "gconfig.h"
#include "event.h"
#include "midiedit/drummap.h"
@@ -66,10 +67,6 @@
#include "dssihost.h"
#endif
-namespace MusEApp {
-extern QMenu* populateAddSynth(QWidget* parent);
-}
-
static const int MIN_TRACKHEIGHT = 20;
static const int WHEEL_DELTA = 120;
QColor collist[] = { Qt::red, Qt::yellow, Qt::blue , Qt::black, Qt::white, Qt::green };
@@ -993,105 +990,44 @@ void TList::mousePressEvent(QMouseEvent* ev)
Track* t = y2Track(y + ypos);
+ // FIXME Observed: Ancient bug: Track Info doesn't change if selecting multiple tracks in reverse order.
+ // Will need to be fixed if/when adding 'multiple track global editing'.
+
TrackColumn col = TrackColumn(header->logicalIndexAt(x));
if (t == 0) {
if (button == Qt::RightButton) {
QMenu* p = new QMenu;
- //p->clear();
- QAction* midi = p->addAction(*addtrack_addmiditrackIcon,
- tr("Add Midi Track"));
- midi->setData(Track::MIDI);
- QAction* drum = p->addAction(*addtrack_drumtrackIcon,
- tr("Add Drum Track"));
- drum->setData(Track::DRUM);
- QAction* wave = p->addAction(*addtrack_wavetrackIcon,
- tr("Add Wave Track"));
- wave->setData(Track::WAVE);
- QAction* aoutput = p->addAction(*addtrack_audiooutputIcon,
- tr("Add Output"));
- aoutput->setData(Track::AUDIO_OUTPUT);
- QAction* agroup = p->addAction(*addtrack_audiogroupIcon,
- tr("Add Group"));
- agroup->setData(Track::AUDIO_GROUP);
- QAction* ainput = p->addAction(*addtrack_audioinputIcon,
- tr("Add Input"));
- ainput->setData(Track::AUDIO_INPUT);
- QAction* aaux = p->addAction(*addtrack_auxsendIcon,
- tr("Add Aux Send"));
- aaux->setData(Track::AUDIO_AUX);
+ MusEUtil::populateAddTrack(p);
- // Create a sub-menu and fill it with found synth types. Make p the owner.
- QMenu* synp = MusEApp::populateAddSynth(p);
- synp->setIcon(*synthIcon);
- synp->setTitle(QT_TRANSLATE_NOOP("@default", "Add Synth"));
-
- // Add the 'Add Synth' sub-menu to the menu.
- p->addMenu(synp);
-
// Show the menu
QAction* act = p->exec(ev->globalPos(), 0);
// Valid click?
if(act)
{
- int n = act->data().toInt();
- // Valid item?
- if((n >= 0) && ((Track::TrackType)n != Track::AUDIO_SOFTSYNTH))
+ t = song->addNewTrack(act); // Add at end of list.
+ if(t)
{
- // Synth sub-menu id?
- if(n >= MENU_ADD_SYNTH_ID_BASE)
- {
- n -= MENU_ADD_SYNTH_ID_BASE;
- //if(n < synthis.size())
- // t = song->createSynthI(synthis[n]->baseName());
- //if((n - MENU_ADD_SYNTH_ID_BASE) < (int)synthis.size())
- if(n < (int)synthis.size())
- {
- //t = song->createSynthI(synp->text(n));
- //t = song->createSynthI(synthis[n]->name());
- t = song->createSynthI(synthis[n]->baseName(), synthis[n]->name());
-
- if(t)
- {
- // Add instance last in midi device list.
- for (int i = 0; i < MIDI_PORTS; ++i)
- {
- MidiPort* port = &midiPorts[i];
- MidiDevice* dev = port->device();
- if (dev==0)
- {
- midiSeq->msgSetMidiDevice(port, (SynthI*)t);
- MusEGlobal::muse->changeConfig(true); // save configuration file
- song->update();
- break;
- }
- }
- }
- }
- }
- // Normal track.
- else
- t = song->addTrack((Track::TrackType)n);
-
- if(t)
- {
- song->deselectTracks();
- t->setSelected(true);
-
- ///emit selectionChanged();
- emit selectionChanged(t);
- adjustScrollbar();
- }
- }
+ song->deselectTracks();
+ t->setSelected(true);
+
+ ///emit selectionChanged();
+ emit selectionChanged(t);
+ adjustScrollbar();
+ }
}
// Just delete p, and all its children will go too, right?
//delete synp;
delete p;
- }
+ }
else if (button == Qt::LeftButton) {
- if (!ctrl) song->deselectTracks();
- }
+ if (!ctrl)
+ {
+ song->deselectTracks();
+ emit selectionChanged(0);
+ }
+ }
return;
}
@@ -1297,18 +1233,28 @@ void TList::mousePressEvent(QMouseEvent* ev)
mode = NORMAL;
QMenu* p = new QMenu;
//p->clear();
- p->addAction(QIcon(*automation_clear_dataIcon), tr("Delete Track"))->setData(0);
- p->addAction(QIcon(*track_commentIcon), tr("Track Comment"))->setData(1);
+ // Leave room for normal track IDs - base these at AUDIO_SOFTSYNTH.
+ p->addAction(QIcon(*automation_clear_dataIcon), tr("Delete Track"))->setData(Track::AUDIO_SOFTSYNTH + 1);
+ p->addAction(QIcon(*track_commentIcon), tr("Track Comment"))->setData(Track::AUDIO_SOFTSYNTH + 2);
+ p->addSeparator();
+ QMenu* pnew = new QMenu(p);
+ pnew->setTitle(tr("Insert Track"));
+ pnew->setIcon(QIcon(*edit_track_addIcon));
+ MusEUtil::populateAddTrack(pnew);
+ p->addMenu(pnew);
QAction* act = p->exec(ev->globalPos(), 0);
if (act) {
int n = act->data().toInt();
- switch (n) {
- case 0: // delete track
+ if(n >= Track::AUDIO_SOFTSYNTH && n < MENU_ADD_SYNTH_ID_BASE)
+ {
+ n -= Track::AUDIO_SOFTSYNTH;
+ switch (n) {
+ case 1: // delete track
song->removeTrack0(t);
audio->msgUpdateSoloStates();
break;
- case 1: // show track comment
+ case 2: // show track comment
{
MusEWidget::TrackComment* tc = new MusEWidget::TrackComment(t, 0);
tc->show();
@@ -1320,8 +1266,19 @@ void TList::mousePressEvent(QMouseEvent* ev)
printf("action %d\n", n);
break;
}
-
}
+ else
+ {
+ t = song->addNewTrack(act, t); // Let addNewTrack handle it. Insert before clicked-on track 't'.
+ if(t)
+ {
+ song->deselectTracks();
+ t->setSelected(true);
+ emit selectionChanged(t);
+ adjustScrollbar();
+ }
+ }
+ }
delete p;
}
break;
@@ -1405,24 +1362,24 @@ void TList::mousePressEvent(QMouseEvent* ev)
// selectTrack
//---------------------------------------------------------
void TList::selectTrack(Track* tr)
- {
- song->deselectTracks();
- tr->setSelected(true);
-
+{
+ song->deselectTracks();
- // rec enable track if expected
- TrackList recd = getRecEnabledTracks();
- if (recd.size() == 1 && MusEConfig::config.moveArmedCheckBox) { // one rec enabled track, move rec enabled with selection
- song->setRecordFlag((Track*)recd.front(),false);
- song->setRecordFlag(tr,true);
- }
+ if (tr) {
+ tr->setSelected(true);
- // By T356. Force a redraw for wave tracks, since it does not seem to happen.
- //if(!tr->isMidiTrack())
- redraw();
- ///emit selectionChanged();
- emit selectionChanged(tr);
- }
+
+ // rec enable track if expected
+ TrackList recd = getRecEnabledTracks();
+ if (recd.size() == 1 && MusEConfig::config.moveArmedCheckBox) { // one rec enabled track, move rec enabled with selection
+ song->setRecordFlag((Track*)recd.front(),false);
+ song->setRecordFlag(tr,true);
+ }
+ }
+
+ redraw();
+ emit selectionChanged(tr);
+}
//---------------------------------------------------------
// selectTrackAbove
diff --git a/muse2/muse/cliplist/cliplist.cpp b/muse2/muse/cliplist/cliplist.cpp
index 4e957db2..95f58f80 100644
--- a/muse2/muse/cliplist/cliplist.cpp
+++ b/muse2/muse/cliplist/cliplist.cpp
@@ -22,6 +22,9 @@
//=========================================================
#include <QCloseEvent>
+#include <QMenuBar>
+#include <QMenu>
+#include <QToolBar>
#include "cliplist.h"
#include "song.h"
@@ -118,7 +121,7 @@ QString ClipItem::text(int col) const
//---------------------------------------------------------
ClipListEdit::ClipListEdit(QWidget* parent)
- : TopWin(parent, "cliplist", Qt::Window)
+ : TopWin(TopWin::CLIPLIST, parent, "cliplist", Qt::Window)
{
//setAttribute(Qt::WA_DeleteOnClose);
setWindowTitle(tr("MusE: Clip List Editor"));
@@ -128,6 +131,25 @@ ClipListEdit::ClipListEdit(QWidget* parent)
//editor->view->setColumnAlignment(COL_REFS, Qt::AlignRight);
+ // Toolbars ---------------------------------------------------------
+ QToolBar* undo_tools=addToolBar(tr("Undo/Redo tools"));
+ undo_tools->setObjectName("Undo/Redo tools");
+ undo_tools->addActions(MusEGlobal::undoRedo->actions());
+
+
+ QToolBar* panic_toolbar = addToolBar(tr("panic"));
+ panic_toolbar->setObjectName("panic");
+ panic_toolbar->addAction(MusEGlobal::panicAction);
+
+ QToolBar* transport_toolbar = addToolBar(tr("transport"));
+ transport_toolbar->setObjectName("transport");
+ transport_toolbar->addActions(MusEGlobal::transportAction->actions());
+
+ QMenu* settingsMenu = menuBar()->addMenu(tr("Window &Config"));
+ settingsMenu->addAction(subwinAction);
+ settingsMenu->addAction(shareAction);
+ settingsMenu->addAction(fullscreenAction);
+
QFontMetrics fm(editor->view->font());
int fw = style()->pixelMetric(QStyle::PM_DefaultFrameWidth,0, this); // ddskrjo 0
int w = 2 + fm.width('9') * 9 + fm.width(':') * 3 + fw * 4;
@@ -170,7 +192,7 @@ void ClipListEdit::updateList()
void ClipListEdit::closeEvent(QCloseEvent* e)
{
- emit deleted((unsigned long)this);
+ emit deleted(static_cast<TopWin*>(this));
e->accept();
}
@@ -226,6 +248,45 @@ void ClipListEdit::writeStatus(int level, Xml& xml) const
}
//---------------------------------------------------------
+// readConfiguration
+//---------------------------------------------------------
+
+void ClipListEdit::readConfiguration(Xml& xml)
+ {
+ for (;;) {
+ Xml::Token token = xml.parse();
+ const QString& tag = xml.s1();
+ switch (token) {
+ case Xml::Error:
+ case Xml::End:
+ return;
+ case Xml::TagStart:
+ if (tag == "topwin")
+ TopWin::readConfiguration(CLIPLIST, xml);
+ else
+ xml.unknown("ClipListEdit");
+ break;
+ case Xml::TagEnd:
+ if (tag == "cliplistedit")
+ return;
+ default:
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// writeConfiguration
+//---------------------------------------------------------
+
+void ClipListEdit::writeConfiguration(int level, Xml& xml)
+ {
+ xml.tag(level++, "cliplistedit");
+ TopWin::writeConfiguration(CLIPLIST, level, xml);
+ xml.tag(level, "/cliplistedit");
+ }
+
+//---------------------------------------------------------
// startChanged
//---------------------------------------------------------
diff --git a/muse2/muse/cliplist/cliplist.h b/muse2/muse/cliplist/cliplist.h
index 39ff9f5a..e4c8503b 100644
--- a/muse2/muse/cliplist/cliplist.h
+++ b/muse2/muse/cliplist/cliplist.h
@@ -69,13 +69,15 @@ class ClipListEdit : public TopWin {
void clicked(QTreeWidgetItem*, int);
signals:
- void deleted(unsigned long);
+ void deleted(TopWin*);
public:
ClipListEdit(QWidget* parent);
~ClipListEdit();
virtual void readStatus(Xml&);
virtual void writeStatus(int, Xml&) const;
+ static void readConfiguration(Xml&);
+ static void writeConfiguration(int, Xml&);
};
#endif
diff --git a/muse2/muse/cobject.cpp b/muse2/muse/cobject.cpp
index 2ce39075..8940bb3b 100644
--- a/muse2/muse/cobject.cpp
+++ b/muse2/muse/cobject.cpp
@@ -1,9 +1,24 @@
//=========================================================
-// MusE
-// Linux Music Editor
-// $Id: cobject.cpp,v 1.4 2004/02/02 12:10:09 wschweer Exp $
+// MusE
+// Linux Music Editor
+// $Id: cobject.cpp,v 1.4 2004/02/02 12:10:09 wschweer Exp $
+//
+// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
+//
+// 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; 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.
//
-// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -24,67 +39,495 @@
#include "cobject.h"
#include "xml.h"
#include "gui.h"
+#include "globals.h"
+#include "app.h"
+#include "shortcuts.h"
+
+#include <QMdiSubWindow>
+#include <QToolBar>
+#include <QMenuBar>
+#include <QAction>
+
+using std::list;
+using MusEGlobal::muse;
+
+int TopWin::_widthInit[TOPLEVELTYPE_LAST_ENTRY];
+int TopWin::_heightInit[TOPLEVELTYPE_LAST_ENTRY];
+QByteArray TopWin::_toolbarSharedInit[TOPLEVELTYPE_LAST_ENTRY];
+QByteArray TopWin::_toolbarNonsharedInit[TOPLEVELTYPE_LAST_ENTRY];
+bool TopWin::_sharesWhenFree[TOPLEVELTYPE_LAST_ENTRY];
+bool TopWin::_sharesWhenSubwin[TOPLEVELTYPE_LAST_ENTRY];
+bool TopWin::_defaultSubwin[TOPLEVELTYPE_LAST_ENTRY];
+bool TopWin::initInited=false;
+
+TopWin::TopWin(ToplevelType t, QWidget* parent, const char* name, Qt::WindowFlags f)
+ : QMainWindow(parent, f)
+{
+ if (initInited==false)
+ initConfiguration();
+
+ _type=t;
+
+ setObjectName(QString(name));
+ // Allow multiple rows. Tim.
+ //setDockNestingEnabled(true);
+ setIconSize(ICON_SIZE);
+
+ subwinAction=new QAction(tr("As subwindow"), this);
+ subwinAction->setCheckable(true);
+ connect(subwinAction, SIGNAL(toggled(bool)), SLOT(setIsMdiWin(bool)));
+
+ shareAction=new QAction(tr("Shares tools and menu"), this);
+ shareAction->setCheckable(true);
+ connect(shareAction, SIGNAL(toggled(bool)), SLOT(shareToolsAndMenu(bool)));
+
+ fullscreenAction=new QAction(tr("Fullscreen"), this);
+ fullscreenAction->setCheckable(true);
+ fullscreenAction->setChecked(false);
+ fullscreenAction->setShortcut(shortcuts[SHRT_FULLSCREEN].key);
+ connect(fullscreenAction, SIGNAL(toggled(bool)), SLOT(setFullscreen(bool)));
+
+ mdisubwin=NULL;
+ _sharesToolsAndMenu=_defaultSubwin[_type] ? _sharesWhenSubwin[_type] : _sharesWhenFree[_type];
+ if (_defaultSubwin[_type])
+ setIsMdiWin(true);
+
+ if (_sharesToolsAndMenu)
+ menuBar()->hide();
+
+ subwinAction->setChecked(isMdiWin());
+ shareAction->setChecked(_sharesToolsAndMenu);
+ fullscreenAction->setEnabled(!isMdiWin());
+
+ resize(_widthInit[_type], _heightInit[_type]);
+}
+
//---------------------------------------------------------
-// readStatus
+// readStatus
//---------------------------------------------------------
void TopWin::readStatus(Xml& xml)
- {
- for (;;) {
- Xml::Token token = xml.parse();
- if (token == Xml::Error || token == Xml::End)
- break;
- QString tag = xml.s1();
- switch (token) {
- case Xml::TagStart:
- if (tag == "geometry") {
- QRect r(readGeometry(xml, tag));
- resize(r.size());
- move(r.topLeft());
- }
- else if (tag == "toolbars") {
- if (!restoreState(QByteArray::fromHex(xml.parse1().toAscii())))
- fprintf(stderr,"ERROR: couldn't restore toolbars. however, this is not really a problem.\n");
- }
- else
- xml.unknown("TopWin");
- break;
- case Xml::TagEnd:
- if (tag == "topwin")
- return;
- default:
- break;
- }
- }
- }
+{
+ for (;;)
+ {
+ Xml::Token token = xml.parse();
+ if (token == Xml::Error || token == Xml::End)
+ break;
+
+ QString tag = xml.s1();
+ switch (token)
+ {
+ case Xml::TagStart:
+ if (tag == "geometry_state")
+ {
+ if (!restoreGeometry(QByteArray::fromHex(xml.parse1().toAscii())))
+ fprintf(stderr,"ERROR: couldn't restore geometry. however, this is probably not really a problem.\n");
+ }
+ else if (tag == "toolbars")
+ {
+ if (!sharesToolsAndMenu())
+ {
+ if (!restoreState(QByteArray::fromHex(xml.parse1().toAscii())))
+ fprintf(stderr,"ERROR: couldn't restore toolbars. however, this is not really a problem.\n");
+ }
+ else
+ {
+ _savedToolbarState=QByteArray::fromHex(xml.parse1().toAscii());
+ if (_savedToolbarState.isEmpty())
+ _savedToolbarState=_toolbarNonsharedInit[_type];
+ }
+ }
+ else if (tag == "shares_menu")
+ {
+ shareToolsAndMenu(xml.parseInt());
+ }
+ else if (tag == "is_subwin")
+ {
+ setIsMdiWin(xml.parseInt());
+ }
+ else
+ xml.unknown("TopWin");
+ break;
+
+ case Xml::TagEnd:
+ if (tag == "topwin")
+ return;
+
+ default:
+ break;
+ }
+ }
+}
//---------------------------------------------------------
-// writeStatus
+// writeStatus
//---------------------------------------------------------
void TopWin::writeStatus(int level, Xml& xml) const
- {
- xml.tag(level++, "topwin");
- xml.tag(level++, "geometry x=\"%d\" y=\"%d\" w=\"%d\" h=\"%d\"",
- geometry().x(),
- geometry().y(),
- geometry().width(),
- geometry().height());
- xml.tag(level--, "/geometry");
-
- xml.strTag(level, "toolbars", saveState().toHex().data());
-
- xml.tag(level, "/topwin");
- }
-
-TopWin::TopWin(QWidget* parent, const char* name,
- Qt::WindowFlags f) : QMainWindow(parent, f)
- {
- setObjectName(QString(name));
- //setAttribute(Qt::WA_DeleteOnClose);
- // Allow multiple rows. Tim.
- //setDockNestingEnabled(true);
- setIconSize(ICON_SIZE);
- }
+{
+ xml.tag(level++, "topwin");
+
+ // the order of these tags has a certain sense
+ // changing it won't break muse, but it may break proper
+ // restoring of the positions
+ xml.intTag(level, "is_subwin", isMdiWin());
+ xml.strTag(level, "geometry_state", saveGeometry().toHex().data());
+ xml.intTag(level, "shares_menu", sharesToolsAndMenu());
+
+ if (!sharesToolsAndMenu())
+ xml.strTag(level, "toolbars", saveState().toHex().data());
+ else
+ xml.strTag(level, "toolbars", _savedToolbarState.toHex().data());
+
+ xml.tag(level, "/topwin");
+}
+
+void TopWin::hide()
+{
+ if (mdisubwin)
+ mdisubwin->close();
+
+ QMainWindow::hide();
+}
+
+void TopWin::show()
+{
+ if (mdisubwin)
+ mdisubwin->show();
+
+ QMainWindow::show();
+}
+
+void TopWin::setVisible(bool param)
+{
+ if (mdisubwin)
+ {
+ if (param)
+ mdisubwin->show();
+ else
+ mdisubwin->close();
+ }
+ QMainWindow::setVisible(param);
+}
+
+QMdiSubWindow* TopWin::createMdiWrapper()
+{
+ if (mdisubwin==NULL)
+ {
+ mdisubwin = new QMdiSubWindow();
+ mdisubwin->setWidget(this);
+ }
+
+ return mdisubwin;
+}
+
+void TopWin::setIsMdiWin(bool val)
+{
+ if (val)
+ {
+ if (!isMdiWin())
+ {
+ _savedToolbarState = saveState();
+ int width_temp=width();
+ int height_temp=height();
+ bool vis=isVisible();
+
+ QMdiSubWindow* subwin = createMdiWrapper();
+ muse->addMdiSubWindow(subwin);
+ subwin->resize(width_temp, height_temp);
+ subwin->move(0,0);
+ subwin->setVisible(vis);
+ this->QMainWindow::show(); //bypass the delegation to the subwin
+
+ if (_sharesToolsAndMenu == _sharesWhenFree[_type])
+ shareToolsAndMenu(_sharesWhenSubwin[_type]);
+
+ fullscreenAction->setEnabled(false);
+ fullscreenAction->setChecked(false);
+ subwinAction->setChecked(true);
+ muse->updateWindowMenu();
+ }
+ else
+ {
+ if (MusEGlobal::debugMsg) printf("TopWin::setIsMdiWin(true) called, but window is already a MDI win\n");
+ }
+ }
+ else
+ {
+ if (isMdiWin())
+ {
+ int width_temp=width();
+ int height_temp=height();
+ bool vis=isVisible();
+
+ QMdiSubWindow* mdisubwin_temp=mdisubwin;
+ mdisubwin=NULL;
+ setParent(NULL);
+ mdisubwin_temp->hide();
+ delete mdisubwin_temp;
+
+ resize(width_temp, height_temp);
+ setVisible(vis);
+
+ if (_sharesToolsAndMenu == _sharesWhenSubwin[_type])
+ shareToolsAndMenu(_sharesWhenFree[_type]);
+
+ fullscreenAction->setEnabled(true);
+ subwinAction->setChecked(false);
+ muse->updateWindowMenu();
+ }
+ else
+ {
+ if (MusEGlobal::debugMsg) printf("TopWin::setIsMdiWin(false) called, but window is not a MDI win\n");
+ }
+ }
+}
+
+bool TopWin::isMdiWin() const
+{
+ return (mdisubwin!=NULL);
+}
+
+void TopWin::insertToolBar(QToolBar*, QToolBar*) { printf("ERROR: THIS SHOULD NEVER HAPPEN: TopWin::insertToolBar called, but it's not implemented! ignoring it\n"); }
+void TopWin::insertToolBarBreak(QToolBar*) { printf("ERROR: THIS SHOULD NEVER HAPPEN: TopWin::insertToolBarBreak called, but it's not implemented! ignoring it\n"); }
+void TopWin::removeToolBar(QToolBar*) { printf("ERROR: THIS SHOULD NEVER HAPPEN: TopWin::removeToolBar called, but it's not implemented! ignoring it\n"); }
+void TopWin::removeToolBarBreak(QToolBar*) { printf("ERROR: THIS SHOULD NEVER HAPPEN: TopWin::removeToolBarBreak called, but it's not implemented! ignoring it\n"); }
+void TopWin::addToolBar(Qt::ToolBarArea, QToolBar* tb) { printf("ERROR: THIS SHOULD NEVER HAPPEN: TopWin::addToolBar(Qt::ToolBarArea, QToolBar*) called, but it's not implemented!\nusing addToolBar(QToolBar*) instead\n"); addToolBar(tb);}
+
+void TopWin::addToolBar(QToolBar* toolbar)
+{
+ _toolbars.push_back(toolbar);
+
+ if (!_sharesToolsAndMenu)
+ QMainWindow::addToolBar(toolbar);
+ else
+ toolbar->hide();
+
+ toolbar->setIconSize(ICON_SIZE);
+}
+
+QToolBar* TopWin::addToolBar(const QString& title)
+{
+ QToolBar* toolbar = new QToolBar(title, this);
+ addToolBar(toolbar);
+ return toolbar;
+}
+
+
+void TopWin::shareToolsAndMenu(bool val)
+{
+ if (_sharesToolsAndMenu == val)
+ {
+ if (MusEGlobal::debugMsg) printf("TopWin::shareToolsAndMenu() called but has no effect\n");
+ return;
+ }
+
+
+ _sharesToolsAndMenu = val;
+
+ if (!val)
+ {
+ muse->shareMenuAndToolbarChanged(this, false);
+
+ for (list<QToolBar*>::iterator it=_toolbars.begin(); it!=_toolbars.end(); it++)
+ if (*it != NULL)
+ {
+ QMainWindow::addToolBar(*it);
+ (*it)->show();
+ }
+ else
+ QMainWindow::addToolBarBreak();
+
+ restoreState(_savedToolbarState);
+ _savedToolbarState.clear();
+
+ menuBar()->show();
+ }
+ else
+ {
+ if (_savedToolbarState.isEmpty()) // this check avoids overwriting a previously saved state
+ _savedToolbarState = saveState(); // (by setIsMdiWin) with a now incorrect (empty) state
+
+ for (list<QToolBar*>::iterator it=_toolbars.begin(); it!=_toolbars.end(); it++)
+ if (*it != NULL)
+ {
+ QMainWindow::removeToolBar(*it); // this does NOT delete the toolbar, which is good
+ (*it)->setParent(NULL);
+ }
+
+ menuBar()->hide();
+
+ muse->shareMenuAndToolbarChanged(this, true);
+ }
+
+ shareAction->setChecked(val);
+}
+
+
+
+//---------------------------------------------------------
+// storeInitialState
+//---------------------------------------------------------
+
+void TopWin::storeInitialState() const
+{
+ _widthInit[_type] = width();
+ _heightInit[_type] = height();
+ if (sharesToolsAndMenu())
+ {
+ if (muse->getCurrentMenuSharingTopwin() == this)
+ _toolbarSharedInit[_type] = muse->saveState();
+ }
+ else
+ _toolbarNonsharedInit[_type] = saveState();
+}
+
+
+
+//initConfiguration() restores default "traditional muse" configuration
+void TopWin::initConfiguration()
+{
+ if (initInited==false)
+ {
+ for (int i=0;i<TOPLEVELTYPE_LAST_ENTRY;i++)
+ {
+ _widthInit[i]=800;
+ _heightInit[i]=600;
+ _sharesWhenFree[i]=false;
+ _sharesWhenSubwin[i]=true;
+ _defaultSubwin[i]=false;
+ }
+
+ _defaultSubwin[ARRANGER]=true;
+
+ initInited=true;
+ }
+}
+
+//---------------------------------------------------------
+// readConfiguration
+//---------------------------------------------------------
+
+void TopWin::readConfiguration(ToplevelType t, Xml& xml)
+{
+if (initInited==false)
+ initConfiguration();
+
+ for (;;)
+ {
+ Xml::Token token = xml.parse();
+ if (token == Xml::Error || token == Xml::End)
+ break;
+
+ const QString& tag = xml.s1();
+ switch (token)
+ {
+ case Xml::TagStart:
+ if (tag == "width")
+ _widthInit[t] = xml.parseInt();
+ else if (tag == "height")
+ _heightInit[t] = xml.parseInt();
+ else if (tag == "nonshared_toolbars")
+ _toolbarNonsharedInit[t] = QByteArray::fromHex(xml.parse1().toAscii());
+ else if (tag == "shared_toolbars")
+ _toolbarSharedInit[t] = QByteArray::fromHex(xml.parse1().toAscii());
+ else if (tag == "shares_when_free")
+ _sharesWhenFree[t] = xml.parseInt();
+ else if (tag == "shares_when_subwin")
+ _sharesWhenSubwin[t] = xml.parseInt();
+ else if (tag == "default_subwin")
+ _defaultSubwin[t] = xml.parseInt();
+ else
+ xml.unknown("TopWin");
+ break;
+
+ case Xml::TagEnd:
+ if (tag == "topwin")
+ return;
+
+ default:
+ break;
+ }
+ }
+}
+
+
+//---------------------------------------------------------
+// writeConfiguration
+//---------------------------------------------------------
+
+void TopWin::writeConfiguration(ToplevelType t, int level, Xml& xml)
+{
+ if (!initInited)
+ {
+ printf ("WARNING: TopWin::writeConfiguration() called although the config hasn't been\n"
+ " initalized! writing default configuration\n");
+ initConfiguration();
+ }
+ xml.tag(level++, "topwin");
+ xml.intTag(level, "width", _widthInit[t]);
+ xml.intTag(level, "height", _heightInit[t]);
+ xml.strTag(level, "nonshared_toolbars", _toolbarNonsharedInit[t].toHex().data());
+ xml.strTag(level, "shared_toolbars", _toolbarSharedInit[t].toHex().data());
+ xml.intTag(level, "shares_when_free", _sharesWhenFree[t]);
+ xml.intTag(level, "shares_when_subwin", _sharesWhenSubwin[t]);
+ xml.intTag(level, "default_subwin", _defaultSubwin[t]);
+ xml.etag(level, "topwin");
+}
+
+void TopWin::initTopwinState()
+{
+ if (sharesToolsAndMenu())
+ {
+ if (this == muse->getCurrentMenuSharingTopwin())
+ muse->restoreState(_toolbarSharedInit[_type]);
+ }
+ else
+ restoreState(_toolbarNonsharedInit[_type]);
+}
+
+void TopWin::restoreMainwinState()
+{
+ if (sharesToolsAndMenu())
+ initTopwinState();
+}
+
+QString TopWin::typeName(ToplevelType t)
+{
+ switch (t)
+ {
+ case PIANO_ROLL: return tr("Piano roll");
+ case LISTE: return tr("List editor");
+ case DRUM: return tr("Drum editor");
+ case MASTER: return tr("Master track editor");
+ case LMASTER: return tr("Master track list editor");
+ case WAVE: return tr("Wave editor");
+ case CLIPLIST: return tr("Clip list");
+ case MARKER: return tr("Marker view");
+ case SCORE: return tr("Score editor");
+ case ARRANGER: return tr("Arranger");
+ default: return tr("<unknown toplevel type>");
+ }
+}
+
+void TopWin::setFullscreen(bool val)
+{
+ if (val)
+ showFullScreen();
+ else
+ showNormal();
+}
+
+void TopWin::resize(int w, int h)
+{
+ QMainWindow::resize(w,h);
+
+ if (isMdiWin())
+ mdisubwin->resize(w,h);
+}
+void TopWin::resize(const QSize& s)
+{
+ resize(s.width(), s.height());
+}
diff --git a/muse2/muse/cobject.h b/muse2/muse/cobject.h
index 4b7b6e3c..1ee2b581 100644
--- a/muse2/muse/cobject.h
+++ b/muse2/muse/cobject.h
@@ -28,8 +28,14 @@
#include <QMainWindow>
#include <list>
+#include <QByteArray>
+#include <QString>
+class QMdiSubWindow;
+class QFocusEvent;
+class QToolBar;
class Xml;
+class QAction;
//---------------------------------------------------------
// TopWin
@@ -40,40 +46,91 @@ class TopWin : public QMainWindow
Q_OBJECT
public:
- virtual void readStatus(Xml&);
- virtual void writeStatus(int, Xml&) const;
- TopWin(QWidget* parent=0, const char* name=0,
- Qt::WindowFlags f = Qt::Window);
- };
-
-//---------------------------------------------------------
-// Toplevel
-//---------------------------------------------------------
-
-class Toplevel {
- public:
- enum ToplevelType { PIANO_ROLL, LISTE, DRUM, MASTER, WAVE,
- LMASTER, CLIPLIST, MARKER, SCORE
+ enum ToplevelType { PIANO_ROLL=0, LISTE, DRUM, MASTER, WAVE, //there shall be no
+ LMASTER, CLIPLIST, MARKER, SCORE, ARRANGER, //gaps in the enum!
#ifdef PATCHBAY
- , M_PATCHBAY
+ M_PATCHBAY,
#endif /* PATCHBAY */
+ TOPLEVELTYPE_LAST_ENTRY //this has to be always the last entry
};
- Toplevel(ToplevelType t, unsigned long obj, TopWin* cobj) {
- _type = t;
- _object = obj;
- _cobject = cobj;
- }
+
ToplevelType type() const { return _type; }
- unsigned long object() const { return _object; }
- TopWin* cobject() const { return _cobject; }
+ static QString typeName(ToplevelType t);
+
+
+ virtual void readStatus(Xml&);
+ virtual void writeStatus(int, Xml&) const;
+
+ static void readConfiguration(ToplevelType, Xml&);
+ static void writeConfiguration(ToplevelType, int, Xml&);
+
+
+ bool isMdiWin() const;
+ QMdiSubWindow* getMdiWin() const { return mdisubwin; }
+
+ TopWin(ToplevelType t, QWidget* parent=0, const char* name=0, Qt::WindowFlags f = Qt::Window);
+
+ bool sharesToolsAndMenu() const { return _sharesToolsAndMenu; }
+ const std::list<QToolBar*>& toolbars() { return _toolbars; }
+
+ void addToolBar(QToolBar* toolbar);
+ QToolBar* addToolBar(const QString& title);
+
+ void resize(int w, int h);
+ void resize(const QSize&);
+
+ static bool _sharesWhenFree[TOPLEVELTYPE_LAST_ENTRY];
+ static bool _sharesWhenSubwin[TOPLEVELTYPE_LAST_ENTRY];
+ static bool _defaultSubwin[TOPLEVELTYPE_LAST_ENTRY];
+
+ private:
+ QMdiSubWindow* mdisubwin;
+ bool _sharesToolsAndMenu;
+ std::list<QToolBar*> _toolbars;
+
+ void insertToolBar(QToolBar*, QToolBar*);
+ void insertToolBarBreak(QToolBar*);
+ void removeToolBar(QToolBar*);
+ void removeToolBarBreak(QToolBar*);
+ void addToolBar(Qt::ToolBarArea, QToolBar*);
+
+ virtual QMdiSubWindow* createMdiWrapper();
+
+ static void initConfiguration();
+
+ protected:
+ QAction* subwinAction;
+ QAction* shareAction;
+ QAction* fullscreenAction;
- private:
ToplevelType _type;
- unsigned long _object;
- TopWin* _cobject;
+
+ static int _widthInit[TOPLEVELTYPE_LAST_ENTRY];
+ static int _heightInit[TOPLEVELTYPE_LAST_ENTRY];
+ static QByteArray _toolbarNonsharedInit[TOPLEVELTYPE_LAST_ENTRY];
+ static QByteArray _toolbarSharedInit[TOPLEVELTYPE_LAST_ENTRY];
+ static bool initInited;
+
+ QByteArray _savedToolbarState;
+
+ void initTopwinState();
+
+ private slots:
+ void setFullscreen(bool);
+
+ public slots:
+ virtual void hide();
+ virtual void show();
+ virtual void setVisible(bool);
+ void setIsMdiWin(bool);
+ void shareToolsAndMenu(bool);
+ void restoreMainwinState();
+ void storeInitialState() const;
+
};
-typedef std::list <Toplevel> ToplevelList;
+
+typedef std::list <TopWin*> ToplevelList;
typedef ToplevelList::iterator iToplevel;
typedef ToplevelList::const_iterator ciToplevel;
diff --git a/muse2/muse/conf.cpp b/muse2/muse/conf.cpp
index 35829657..6ba4d47d 100644
--- a/muse2/muse/conf.cpp
+++ b/muse2/muse/conf.cpp
@@ -34,6 +34,11 @@
#include "pianoroll.h"
#include "scoreedit.h"
#include "master/masteredit.h"
+#include "listedit.h"
+#include "cliplist/cliplist.h"
+#include "arrangerview.h"
+#include "marker/markerview.h"
+#include "master/lmaster.h"
///#include "transport.h"
#include "bigtime.h"
#include "arranger.h"
@@ -893,12 +898,6 @@ void readConfiguration(Xml& xml, bool readOnlySequencer)
}
//else if (tag == "midiSyncInfo")
// readConfigMidiSyncInfo(xml);
- else if (tag == "arranger") {
- if (MusEGlobal::muse && MusEGlobal::muse->arranger)
- MusEGlobal::muse->arranger->readStatus(xml);
- else
- xml.skip(tag);
- }
else if (tag == "drumedit")
DrumEdit::readConfiguration(xml);
else if (tag == "pianoroll")
@@ -909,6 +908,22 @@ void readConfiguration(Xml& xml, bool readOnlySequencer)
MasterEdit::readConfiguration(xml);
else if (tag == "waveedit")
WaveEdit::readConfiguration(xml);
+ else if (tag == "listedit")
+ ListEdit::readConfiguration(xml);
+ else if (tag == "cliplistedit")
+ ClipListEdit::readConfiguration(xml);
+ else if (tag == "lmaster")
+ LMaster::readConfiguration(xml);
+ else if (tag == "marker")
+ MarkerView::readConfiguration(xml);
+ else if (tag == "arrangerview")
+ ArrangerView::readConfiguration(xml);
+ else if (tag == "arranger") {
+ if (MusEGlobal::muse && MusEGlobal::muse->arranger())
+ MusEGlobal::muse->arranger()->readStatus(xml);
+ else
+ xml.skip(tag);
+ }
else if (tag == "dialogs")
read_function_dialog_config(xml);
else if (tag == "shortcuts")
@@ -1354,6 +1369,11 @@ void MusE::writeGlobalConfiguration(int level, Xml& xml) const
ScoreEdit::write_configuration(level, xml);
MasterEdit::writeConfiguration(level, xml);
WaveEdit::writeConfiguration(level, xml);
+ ListEdit::writeConfiguration(level, xml);
+ ClipListEdit::writeConfiguration(level, xml);
+ LMaster::writeConfiguration(level, xml);
+ MarkerView::writeConfiguration(level, xml);
+ ArrangerView::writeConfiguration(level, xml);
write_function_dialog_config(level, xml);
@@ -1463,7 +1483,7 @@ void MusE::writeConfiguration(int level, Xml& xml) const
//mixer2->write(level, xml, "mixer2");
mixer2->write(level, xml);
- arranger->writeStatus(level, xml);
+ _arranger->writeStatus(level, xml);
writeSeqConfiguration(level, xml, true);
DrumEdit::writeConfiguration(level, xml);
diff --git a/muse2/muse/confmport.cpp b/muse2/muse/confmport.cpp
index ce59b673..6e371d0e 100644
--- a/muse2/muse/confmport.cpp
+++ b/muse2/muse/confmport.cpp
@@ -1341,8 +1341,7 @@ void MPConfig::addInstanceClicked()
QTreeWidgetItem* item = synthList->currentItem();
if (item == 0)
return;
- //SynthI *si = song->createSynthI(item->text(2));
- SynthI *si = song->createSynthI(item->text(0), item->text(2));
+ SynthI *si = song->createSynthI(item->text(0), item->text(2), false); // Add at end of list.
if(!si)
return;
diff --git a/muse2/muse/dialogs.cpp b/muse2/muse/dialogs.cpp
new file mode 100644
index 00000000..b63d86d3
--- /dev/null
+++ b/muse2/muse/dialogs.cpp
@@ -0,0 +1,147 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: functions.cpp,v 1.20.2.19 2011/05/05 20:10 flo93 Exp $
+// (C) Copyright 2011 Florian Jung (flo93@sourceforge.net)
+//
+// 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; 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 "dialogs.h"
+#include "widgets/function_dialogs/velocity.h"
+#include "widgets/function_dialogs/quantize.h"
+#include "widgets/function_dialogs/crescendo.h"
+#include "widgets/function_dialogs/gatetime.h"
+#include "widgets/function_dialogs/remove.h"
+#include "widgets/function_dialogs/transpose.h"
+#include "widgets/function_dialogs/setlen.h"
+#include "widgets/function_dialogs/move.h"
+#include "widgets/function_dialogs/deloverlaps.h"
+#include "widgets/function_dialogs/legato.h"
+#include "widgets/pastedialog.h"
+#include "widgets/pasteeventsdialog.h"
+
+#include "xml.h"
+
+#include <iostream>
+
+using namespace std;
+
+MusEDialog::GateTime* gatetime_dialog=NULL;
+MusEDialog::Velocity* velocity_dialog=NULL;
+MusEDialog::Quantize* quantize_dialog=NULL;
+MusEDialog::Remove* erase_dialog=NULL;
+MusEDialog::DelOverlaps* del_overlaps_dialog=NULL;
+MusEDialog::Setlen* set_notelen_dialog=NULL;
+MusEDialog::Move* move_notes_dialog=NULL;
+MusEDialog::Transpose* transpose_dialog=NULL;
+MusEDialog::Crescendo* crescendo_dialog=NULL;
+MusEDialog::Legato* legato_dialog=NULL;
+MusEDialog::PasteDialog* paste_dialog=NULL;
+MusEDialog::PasteEventsDialog* paste_events_dialog=NULL;
+
+void init_function_dialogs(QWidget* parent)
+{
+ gatetime_dialog = new MusEDialog::GateTime(parent);
+ velocity_dialog = new MusEDialog::Velocity(parent);
+ quantize_dialog = new MusEDialog::Quantize(parent);
+ erase_dialog = new MusEDialog::Remove(parent);
+ del_overlaps_dialog = new MusEDialog::DelOverlaps(parent);
+ set_notelen_dialog = new MusEDialog::Setlen(parent);
+ move_notes_dialog = new MusEDialog::Move(parent);
+ transpose_dialog = new MusEDialog::Transpose(parent);
+ crescendo_dialog = new MusEDialog::Crescendo(parent);
+ legato_dialog = new MusEDialog::Legato(parent);
+ paste_dialog = new MusEDialog::PasteDialog(parent);
+ paste_events_dialog = new MusEDialog::PasteEventsDialog(parent);
+}
+
+void read_function_dialog_config(Xml& xml)
+{
+ if (erase_dialog==NULL)
+ {
+ cout << "ERROR: THIS SHOULD NEVER HAPPEN: read_function_dialog_config() called, but\n"
+ " dialogs are still uninitalized (NULL)!"<<endl;
+ return;
+ }
+
+ for (;;)
+ {
+ Xml::Token token = xml.parse();
+ if (token == Xml::Error || token == Xml::End)
+ break;
+
+ const QString& tag = xml.s1();
+ switch (token)
+ {
+ case Xml::TagStart:
+ if (tag == "mod_len")
+ gatetime_dialog->read_configuration(xml);
+ else if (tag == "mod_velo")
+ velocity_dialog->read_configuration(xml);
+ else if (tag == "quantize")
+ quantize_dialog->read_configuration(xml);
+ else if (tag == "erase")
+ erase_dialog->read_configuration(xml);
+ else if (tag == "del_overlaps")
+ del_overlaps_dialog->read_configuration(xml);
+ else if (tag == "setlen")
+ set_notelen_dialog->read_configuration(xml);
+ else if (tag == "move")
+ move_notes_dialog->read_configuration(xml);
+ else if (tag == "transpose")
+ transpose_dialog->read_configuration(xml);
+ else if (tag == "crescendo")
+ crescendo_dialog->read_configuration(xml);
+ else if (tag == "legato")
+ legato_dialog->read_configuration(xml);
+ else if (tag == "pastedialog")
+ paste_dialog->read_configuration(xml);
+ else if (tag == "pasteeventsdialog")
+ paste_events_dialog->read_configuration(xml);
+ else
+ xml.unknown("dialogs");
+ break;
+
+ case Xml::TagEnd:
+ if (tag == "dialogs")
+ return;
+
+ default:
+ break;
+ }
+ }
+}
+
+void write_function_dialog_config(int level, Xml& xml)
+{
+ xml.tag(level++, "dialogs");
+
+ gatetime_dialog->write_configuration(level, xml);
+ velocity_dialog->write_configuration(level, xml);
+ quantize_dialog->write_configuration(level, xml);
+ erase_dialog->write_configuration(level, xml);
+ del_overlaps_dialog->write_configuration(level, xml);
+ set_notelen_dialog->write_configuration(level, xml);
+ move_notes_dialog->write_configuration(level, xml);
+ transpose_dialog->write_configuration(level, xml);
+ crescendo_dialog->write_configuration(level, xml);
+ legato_dialog->write_configuration(level, xml);
+ paste_dialog->write_configuration(level, xml);
+ paste_events_dialog->write_configuration(level, xml);
+
+ xml.tag(level, "/dialogs");
+}
diff --git a/muse2/muse/dialogs.h b/muse2/muse/dialogs.h
new file mode 100644
index 00000000..0cb5107a
--- /dev/null
+++ b/muse2/muse/dialogs.h
@@ -0,0 +1,62 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: dialogs.h,v 1.20.2.19 2011/05/05 20:10 flo93 Exp $
+// (C) Copyright 2011 Florian Jung (flo93@sourceforge.net)
+//
+// 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; 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 __DIALOGS_H__
+#define __DIALOGS_H__
+
+class QWidget;
+namespace MusEDialog
+{
+ class GateTime;
+ class Velocity;
+ class Quantize;
+ class Remove;
+ class DelOverlaps;
+ class Setlen;
+ class Move;
+ class Transpose;
+ class Crescendo;
+ class Legato;
+ class PasteDialog;
+ class PasteEventsDialog;
+}
+
+class Xml;
+
+extern MusEDialog::GateTime* gatetime_dialog;
+extern MusEDialog::Velocity* velocity_dialog;
+extern MusEDialog::Quantize* quantize_dialog;
+extern MusEDialog::Remove* erase_dialog;
+extern MusEDialog::DelOverlaps* del_overlaps_dialog;
+extern MusEDialog::Setlen* set_notelen_dialog;
+extern MusEDialog::Move* move_notes_dialog;
+extern MusEDialog::Transpose* transpose_dialog;
+extern MusEDialog::Crescendo* crescendo_dialog;
+extern MusEDialog::Legato* legato_dialog;
+extern MusEDialog::PasteDialog* paste_dialog;
+extern MusEDialog::PasteEventsDialog* paste_events_dialog;
+
+void init_function_dialogs(QWidget* parent);
+void read_function_dialog_config(Xml& xml);
+void write_function_dialog_config(int level, Xml& xml);
+
+#endif
diff --git a/muse2/muse/functions.cpp b/muse2/muse/functions.cpp
index b178bcb6..8e9a7cd5 100644
--- a/muse2/muse/functions.cpp
+++ b/muse2/muse/functions.cpp
@@ -23,11 +23,24 @@
#include "functions.h"
#include "song.h"
#include "undo.h"
+#include "helper.h"
#include "event.h"
#include "audio.h"
#include "gconfig.h"
+#include "widgets/function_dialogs/velocity.h"
+#include "widgets/function_dialogs/quantize.h"
+#include "widgets/function_dialogs/crescendo.h"
+#include "widgets/function_dialogs/gatetime.h"
+#include "widgets/function_dialogs/remove.h"
+#include "widgets/function_dialogs/transpose.h"
+#include "widgets/function_dialogs/setlen.h"
+#include "widgets/function_dialogs/move.h"
+#include "widgets/function_dialogs/deloverlaps.h"
+#include "widgets/function_dialogs/legato.h"
+#include "widgets/pasteeventsdialog.h"
+
#include <values.h>
#include <iostream>
#include <errno.h>
@@ -43,32 +56,20 @@
#include <QMessageBox>
#include <QClipboard>
+
+
using namespace std;
-MusEDialog::GateTime* gatetime_dialog=NULL;
-MusEDialog::Velocity* velocity_dialog=NULL;
-MusEDialog::Quantize* quantize_dialog=NULL;
-MusEDialog::Remove* erase_dialog=NULL;
-MusEDialog::DelOverlaps* del_overlaps_dialog=NULL;
-MusEDialog::Setlen* set_notelen_dialog=NULL;
-MusEDialog::Move* move_notes_dialog=NULL;
-MusEDialog::Transpose* transpose_dialog=NULL;
-MusEDialog::Crescendo* crescendo_dialog=NULL;
-MusEDialog::Legato* legato_dialog=NULL;
-
-void init_function_dialogs(QWidget* parent)
-{
- gatetime_dialog = new MusEDialog::GateTime(parent);
- velocity_dialog = new MusEDialog::Velocity(parent);
- quantize_dialog = new MusEDialog::Quantize(parent);
- erase_dialog = new MusEDialog::Remove(parent);
- del_overlaps_dialog = new MusEDialog::DelOverlaps(parent);
- set_notelen_dialog = new MusEDialog::Setlen(parent);
- move_notes_dialog = new MusEDialog::Move(parent);
- transpose_dialog = new MusEDialog::Transpose(parent);
- crescendo_dialog = new MusEDialog::Crescendo(parent);
- legato_dialog = new MusEDialog::Legato(parent);
-}
+using MusEConfig::config;
+
+
+// unit private functions:
+
+bool read_eventlist_and_part(Xml& xml, EventList* el, int* part_id);
+
+// -----------------------
+
+
set<Part*> partlist_to_set(PartList* pl)
{
@@ -87,6 +88,37 @@ set<Part*> part_to_set(Part* p)
return result;
}
+set<Part*> get_all_parts()
+{
+ set<Part*> result;
+
+ TrackList* tracks=song->tracks();
+ for (TrackList::const_iterator t_it=tracks->begin(); t_it!=tracks->end(); t_it++)
+ {
+ const PartList* parts=(*t_it)->cparts();
+ for (ciPart p_it=parts->begin(); p_it!=parts->end(); p_it++)
+ result.insert(p_it->second);
+ }
+
+ return result;
+}
+
+set<Part*> get_all_selected_parts()
+{
+ set<Part*> result;
+
+ TrackList* tracks=song->tracks();
+ for (TrackList::const_iterator t_it=tracks->begin(); t_it!=tracks->end(); t_it++)
+ {
+ const PartList* parts=(*t_it)->cparts();
+ for (ciPart p_it=parts->begin(); p_it!=parts->end(); p_it++)
+ if (p_it->second->selected())
+ result.insert(p_it->second);
+ }
+
+ return result;
+}
+
bool is_relevant(const Event& event, const Part* part, int range)
{
unsigned tick;
@@ -118,6 +150,8 @@ map<Event*, Part*> get_events(const set<Part*>& parts, int range)
}
+
+
bool modify_notelen(const set<Part*>& parts)
{
if (!gatetime_dialog->exec())
@@ -229,6 +263,180 @@ bool legato(const set<Part*>& parts)
+bool modify_notelen()
+{
+ if (!gatetime_dialog->exec())
+ return false;
+
+ set<Part*> parts;
+ if (gatetime_dialog->range & FUNCTION_RANGE_ONLY_SELECTED)
+ parts=get_all_selected_parts();
+ else
+ parts=get_all_parts();
+
+ modify_notelen(parts,gatetime_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS, gatetime_dialog->rateVal,gatetime_dialog->offsetVal);
+
+ return true;
+}
+
+bool modify_velocity()
+{
+ if (!velocity_dialog->exec())
+ return false;
+
+ set<Part*> parts;
+ if (velocity_dialog->range & FUNCTION_RANGE_ONLY_SELECTED)
+ parts=get_all_selected_parts();
+ else
+ parts=get_all_parts();
+
+ modify_velocity(parts,velocity_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS,velocity_dialog->rateVal,velocity_dialog->offsetVal);
+
+ return true;
+}
+
+bool quantize_notes()
+{
+ if (!quantize_dialog->exec())
+ return false;
+
+ set<Part*> parts;
+ if (quantize_dialog->range & FUNCTION_RANGE_ONLY_SELECTED)
+ parts=get_all_selected_parts();
+ else
+ parts=get_all_parts();
+
+ quantize_notes(parts, quantize_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS, (config.division*4)/(1<<quantize_dialog->raster_power2),
+ quantize_dialog->quant_len, quantize_dialog->strength, quantize_dialog->swing,
+ quantize_dialog->threshold);
+
+ return true;
+}
+
+bool erase_notes()
+{
+ if (!erase_dialog->exec())
+ return false;
+
+ set<Part*> parts;
+ if (erase_dialog->range & FUNCTION_RANGE_ONLY_SELECTED)
+ parts=get_all_selected_parts();
+ else
+ parts=get_all_parts();
+
+ erase_notes(parts,erase_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS, erase_dialog->velo_threshold, erase_dialog->velo_thres_used,
+ erase_dialog->len_threshold, erase_dialog->len_thres_used );
+
+ return true;
+}
+
+bool delete_overlaps()
+{
+ if (!del_overlaps_dialog->exec())
+ return false;
+
+ set<Part*> parts;
+ if (del_overlaps_dialog->range & FUNCTION_RANGE_ONLY_SELECTED)
+ parts=get_all_selected_parts();
+ else
+ parts=get_all_parts();
+
+ delete_overlaps(parts,erase_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS);
+
+ return true;
+}
+
+bool set_notelen()
+{
+ if (!set_notelen_dialog->exec())
+ return false;
+
+ set<Part*> parts;
+ if (set_notelen_dialog->range & FUNCTION_RANGE_ONLY_SELECTED)
+ parts=get_all_selected_parts();
+ else
+ parts=get_all_parts();
+
+ set_notelen(parts,set_notelen_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS, set_notelen_dialog->len);
+
+ return true;
+}
+
+bool move_notes()
+{
+ if (!move_notes_dialog->exec())
+ return false;
+
+ set<Part*> parts;
+ if (move_notes_dialog->range & FUNCTION_RANGE_ONLY_SELECTED)
+ parts=get_all_selected_parts();
+ else
+ parts=get_all_parts();
+
+ move_notes(parts,move_notes_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS, move_notes_dialog->amount);
+
+ return true;
+}
+
+bool transpose_notes()
+{
+ if (!transpose_dialog->exec())
+ return false;
+
+ set<Part*> parts;
+ if (transpose_dialog->range & FUNCTION_RANGE_ONLY_SELECTED)
+ parts=get_all_selected_parts();
+ else
+ parts=get_all_parts();
+
+ transpose_notes(parts,transpose_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS, transpose_dialog->amount);
+
+ return true;
+}
+
+bool crescendo()
+{
+ if (song->rpos() <= song->lpos())
+ {
+ QMessageBox::warning(NULL, QObject::tr("Error"), QObject::tr("Please first select the range for crescendo with the loop markers."));
+ return false;
+ }
+
+ if (!crescendo_dialog->exec())
+ return false;
+
+ set<Part*> parts;
+ if (crescendo_dialog->range & FUNCTION_RANGE_ONLY_SELECTED)
+ parts=get_all_selected_parts();
+ else
+ parts=get_all_parts();
+
+ crescendo(parts,crescendo_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS, crescendo_dialog->start_val,crescendo_dialog->end_val,crescendo_dialog->absolute);
+
+ return true;
+}
+
+bool legato()
+{
+ if (!legato_dialog->exec())
+ return false;
+
+ set<Part*> parts;
+ if (legato_dialog->range & FUNCTION_RANGE_ONLY_SELECTED)
+ parts=get_all_selected_parts();
+ else
+ parts=get_all_parts();
+
+ legato(parts,legato_dialog->range & FUNCTION_RANGE_ONLY_BETWEEN_MARKERS, legato_dialog->min_len, !legato_dialog->allow_shortening);
+
+ return true;
+}
+
+
+
+
+
+
bool modify_velocity(const set<Part*>& parts, int range, int rate, int offset)
{
map<Event*, Part*> events = get_events(parts, range);
@@ -667,34 +875,93 @@ void copy_notes(const set<Part*>& parts, int range)
QApplication::clipboard()->setMimeData(drag, QClipboard::Clipboard);
}
-void paste_notes(Part* dest_part)
+unsigned get_groupedevents_len(const QString& pt)
{
- QString tmp="x-muse-eventlist"; // QClipboard::text() expects a QString&, not a QString :(
- QString s = QApplication::clipboard()->text(tmp, QClipboard::Clipboard); // TODO CHECK Tim.
- paste_at(dest_part, s, song->cpos());
+ unsigned maxlen=0;
+
+ Xml xml(pt.toLatin1().constData());
+ for (;;)
+ {
+ Xml::Token token = xml.parse();
+ const QString& tag = xml.s1();
+ switch (token)
+ {
+ case Xml::Error:
+ case Xml::End:
+ return maxlen;
+
+ case Xml::TagStart:
+ if (tag == "eventlist")
+ {
+ EventList el;
+ int part_id;
+ if (read_eventlist_and_part(xml, &el, &part_id))
+ {
+ unsigned len = el.rbegin()->first;
+ if (len > maxlen) maxlen=len;
+ }
+ }
+ else
+ xml.unknown("get_clipboard_len");
+ break;
+
+ case Xml::Attribut:
+ case Xml::TagEnd:
+ default:
+ break;
+ }
+ }
+
+ return maxlen; // see also the return statement above!
}
-QMimeData* selected_events_to_mime(const set<Part*>& parts, int range)
+unsigned get_clipboard_len()
{
- map<Event*, Part*> events=get_events(parts,range);
+ QString tmp="x-muse-groupedeventlists"; // QClipboard::text() expects a QString&, not a QString :(
+ QString s = QApplication::clipboard()->text(tmp, QClipboard::Clipboard); // TODO CHECK Tim.
+
+ return get_groupedevents_len(s);
+}
- //---------------------------------------------------
- // generate event list from selected events
- //---------------------------------------------------
+bool paste_notes(Part* paste_into_part)
+{
+ unsigned temp_begin = AL::sigmap.raster1(song->cpos(),0);
+ unsigned temp_end = AL::sigmap.raster2(temp_begin + get_clipboard_len(), 0);
+ paste_events_dialog->raster = temp_end - temp_begin;
+ paste_events_dialog->into_single_part_allowed = (paste_into_part!=NULL);
+
+ if (!paste_events_dialog->exec())
+ return false;
+
+ paste_notes(paste_events_dialog->max_distance, paste_events_dialog->always_new_part,
+ paste_events_dialog->never_new_part, paste_events_dialog->into_single_part ? paste_into_part : NULL,
+ paste_events_dialog->number, paste_events_dialog->raster);
+
+ return true;
+}
- EventList el;
- unsigned startTick = MAXINT; //will be the tick of the first event or MAXINT if no events are there
+void paste_notes(int max_distance, bool always_new_part, bool never_new_part, Part* paste_into_part, int amount, int raster)
+{
+ QString tmp="x-muse-groupedeventlists"; // QClipboard::text() expects a QString&, not a QString :(
+ QString s = QApplication::clipboard()->text(tmp, QClipboard::Clipboard); // TODO CHECK Tim.
+ paste_at(s, song->cpos(), max_distance, always_new_part, never_new_part, paste_into_part, amount, raster);
+}
- for (map<Event*, Part*>::iterator it=events.begin(); it!=events.end(); it++)
- {
- Event& e = *it->first;
-
- if (e.tick() < startTick)
- startTick = e.tick();
-
- el.add(e);
- }
+// if nothing is selected/relevant, this function returns NULL
+QMimeData* selected_events_to_mime(const set<Part*>& parts, int range)
+{
+ unsigned start_tick = MAXINT; //will be the tick of the first event or MAXINT if no events are there
+
+ for (set<Part*>::iterator part=parts.begin(); part!=parts.end(); part++)
+ for (iEvent ev=(*part)->events()->begin(); ev!=(*part)->events()->end(); ev++)
+ if (is_relevant(ev->second, *part, range))
+ if (ev->second.tick() < start_tick)
+ start_tick=ev->second.tick();
+
+ if (start_tick == MAXINT)
+ return NULL;
+
//---------------------------------------------------
// write events as XML into tmp file
//---------------------------------------------------
@@ -709,10 +976,14 @@ QMimeData* selected_events_to_mime(const set<Part*>& parts, int range)
Xml xml(tmp);
int level = 0;
- xml.tag(level++, "eventlist");
- for (ciEvent e = el.begin(); e != el.end(); ++e)
- e->second.write(level, xml, -startTick);
- xml.etag(--level, "eventlist");
+ for (set<Part*>::iterator part=parts.begin(); part!=parts.end(); part++)
+ {
+ xml.tag(level++, "eventlist part_id=\"%d\"", (*part)->sn());
+ for (iEvent ev=(*part)->events()->begin(); ev!=(*part)->events()->end(); ev++)
+ if (is_relevant(ev->second, *part, range))
+ ev->second.write(level, xml, -start_tick);
+ xml.etag(--level, "eventlist");
+ }
//---------------------------------------------------
// read tmp file into drag Object
@@ -722,7 +993,7 @@ QMimeData* selected_events_to_mime(const set<Part*>& parts, int range)
struct stat f_stat;
if (fstat(fileno(tmp), &f_stat) == -1)
{
- fprintf(stderr, "PianoCanvas::copy() fstat failed:<%s>\n",
+ fprintf(stderr, "copy_notes() fstat failed:<%s>\n",
strerror(errno));
fclose(tmp);
return 0;
@@ -735,7 +1006,7 @@ QMimeData* selected_events_to_mime(const set<Part*>& parts, int range)
QByteArray data(fbuf);
QMimeData* md = new QMimeData();
- md->setData("text/x-muse-eventlist", data);
+ md->setData("text/x-muse-groupedeventlists", data);
munmap(fbuf, n);
fclose(tmp);
@@ -743,10 +1014,53 @@ QMimeData* selected_events_to_mime(const set<Part*>& parts, int range)
return md;
}
-void paste_at(Part* dest_part, const QString& pt, int pos)
+bool read_eventlist_and_part(Xml& xml, EventList* el, int* part_id) // true on success, false on failure
+{
+ *part_id = -1;
+
+ for (;;)
+ {
+ Xml::Token token = xml.parse();
+ const QString& tag = xml.s1();
+ switch (token)
+ {
+ case Xml::Error:
+ case Xml::End:
+ return false;
+
+ case Xml::Attribut:
+ if (tag == "part_id")
+ *part_id = xml.s2().toInt();
+ else
+ printf("unknown attribute '%s' in read_eventlist_and_part(), ignoring it...\n", tag.toAscii().data());
+ break;
+
+ case Xml::TagStart:
+ if (tag == "event")
+ {
+ Event e(Note);
+ e.read(xml);
+ el->add(e);
+ }
+ else
+ xml.unknown("read_eventlist_and_part");
+ break;
+
+ case Xml::TagEnd:
+ if (tag == "eventlist")
+ return true;
+
+ default:
+ break;
+ }
+ }
+}
+
+void paste_at(const QString& pt, int pos, int max_distance, bool always_new_part, bool never_new_part, Part* paste_into_part, int amount, int raster)
{
Undo operations;
- unsigned newpartlen=dest_part->lenTick();
+ map<Part*, unsigned> expand_map;
+ map<Part*, set<Part*> > new_part_map;
Xml xml(pt.toLatin1().constData());
for (;;)
@@ -757,53 +1071,95 @@ void paste_at(Part* dest_part, const QString& pt, int pos)
{
case Xml::Error:
case Xml::End:
- goto end_of_paste_at;
+ goto out_of_paste_at_for;
case Xml::TagStart:
if (tag == "eventlist")
{
EventList el;
- el.read(xml, "eventlist", true);
- for (iEvent i = el.begin(); i != el.end(); ++i)
+ int part_id;
+
+ if (read_eventlist_and_part(xml, &el, &part_id))
{
- Event e = i->second;
- int tick = e.tick() + pos - dest_part->tick();
- if (tick<0)
+ Part* dest_part;
+ Track* dest_track;
+ Part* old_dest_part;
+
+ if (paste_into_part == NULL)
+ dest_part = MusEUtil::partFromSerialNumber(part_id);
+ else
+ dest_part=paste_into_part;
+
+ if (dest_part == NULL)
{
- printf("ERROR: trying to add event before current part!\n");
- goto end_of_paste_at;
+ printf("ERROR: destination part wasn't found. ignoring these events\n");
}
-
- e.setTick(tick);
- e.setSelected(true);
-
- if (e.endTick() > dest_part->lenTick()) // event exceeds part?
+ else
{
- if (dest_part->hasHiddenEvents()) // auto-expanding is forbidden?
- {
- if (e.tick() < dest_part->lenTick())
- e.setLenTick(dest_part->lenTick() - e.tick()); // clip
- else
- e.setLenTick(0); // don't insert that note at all
- }
- else
+ dest_track=dest_part->track();
+ old_dest_part=dest_part;
+ unsigned first_paste_tick = el.begin()->first + pos;
+ bool create_new_part = ( (dest_part->tick() > first_paste_tick) || // dest_part begins too late
+ ( ( (dest_part->endTick() + max_distance < first_paste_tick) || // dest_part is too far away
+ always_new_part ) && !never_new_part ) ); // respect function arguments
+
+ for (int i=0;i<amount;i++)
{
- if (e.endTick() > newpartlen)
- newpartlen=e.endTick();
+ unsigned curr_pos = pos + i*raster;
+ first_paste_tick = el.begin()->first + curr_pos;
+
+ if (create_new_part)
+ {
+ dest_part = dest_track->newPart();
+ dest_part->events()->incARef(-1); // the later song->applyOperationGroup() will increment it
+ // so we must decrement it first :/
+ dest_part->setTick(AL::sigmap.raster1(first_paste_tick, config.division));
+
+ new_part_map[old_dest_part].insert(dest_part);
+ operations.push_back(UndoOp(UndoOp::AddPart, dest_part));
+ }
+
+ for (iEvent i = el.begin(); i != el.end(); ++i)
+ {
+ Event e = i->second.clone();
+ int tick = e.tick() + curr_pos - dest_part->tick();
+ if (tick<0)
+ {
+ printf("ERROR: trying to add event before current part! ignoring this event\n");
+ continue;
+ }
+
+ e.setTick(tick);
+ e.setSelected(true);
+
+ if (e.endTick() > dest_part->lenTick()) // event exceeds part?
+ {
+ if (dest_part->hasHiddenEvents()) // auto-expanding is forbidden?
+ {
+ if (e.tick() < dest_part->lenTick())
+ e.setLenTick(dest_part->lenTick() - e.tick()); // clip
+ else
+ e.setLenTick(0); // don't insert that note at all
+ }
+ else
+ {
+ if (e.endTick() > expand_map[dest_part])
+ expand_map[dest_part]=e.endTick();
+ }
+ }
+
+ if (e.lenTick() != 0) operations.push_back(UndoOp(UndoOp::AddEvent,e, dest_part, false, false));
+ }
}
}
-
- if (e.lenTick() != 0) operations.push_back(UndoOp(UndoOp::AddEvent,e, dest_part, false, false));
}
-
- if (newpartlen != dest_part->lenTick())
- schedule_resize_all_same_len_clone_parts(dest_part, newpartlen, operations);
-
- song->applyOperationGroup(operations);
- goto end_of_paste_at;
+ else
+ {
+ printf("ERROR: reading eventlist from clipboard failed. ignoring this one...\n");
+ }
}
else
- xml.unknown("paste_at");
+ xml.unknown("paste_at");
break;
case Xml::Attribut:
@@ -813,7 +1169,15 @@ void paste_at(Part* dest_part, const QString& pt, int pos)
}
}
- end_of_paste_at:
+ out_of_paste_at_for:
+
+ for (map<Part*, unsigned>::iterator it = expand_map.begin(); it!=expand_map.end(); it++)
+ if (it->second != it->first->lenTick())
+ schedule_resize_all_same_len_clone_parts(it->first, it->second, operations);
+
+ song->informAboutNewParts(new_part_map); // must be called before apply. otherwise
+ // pointer changes (by resize) screw it up
+ song->applyOperationGroup(operations);
song->update(SC_SELECTION);
}
@@ -1026,74 +1390,3 @@ void clean_parts()
song->applyOperationGroup(operations);
}
-
-void read_function_dialog_config(Xml& xml)
-{
- if (erase_dialog==NULL)
- {
- cout << "ERROR: THIS SHOULD NEVER HAPPEN: read_function_dialog_config() called, but\n"
- " dialogs are still uninitalized (NULL)!"<<endl;
- return;
- }
-
- for (;;)
- {
- Xml::Token token = xml.parse();
- if (token == Xml::Error || token == Xml::End)
- break;
-
- const QString& tag = xml.s1();
- switch (token)
- {
- case Xml::TagStart:
- if (tag == "mod_len")
- gatetime_dialog->read_configuration(xml);
- else if (tag == "mod_velo")
- velocity_dialog->read_configuration(xml);
- else if (tag == "quantize")
- quantize_dialog->read_configuration(xml);
- else if (tag == "erase")
- erase_dialog->read_configuration(xml);
- else if (tag == "del_overlaps")
- del_overlaps_dialog->read_configuration(xml);
- else if (tag == "setlen")
- set_notelen_dialog->read_configuration(xml);
- else if (tag == "move")
- move_notes_dialog->read_configuration(xml);
- else if (tag == "transpose")
- transpose_dialog->read_configuration(xml);
- else if (tag == "crescendo")
- crescendo_dialog->read_configuration(xml);
- else if (tag == "legato")
- legato_dialog->read_configuration(xml);
- else
- xml.unknown("function_dialogs");
- break;
-
- case Xml::TagEnd:
- if (tag == "dialogs")
- return;
-
- default:
- break;
- }
- }
-}
-
-void write_function_dialog_config(int level, Xml& xml)
-{
- xml.tag(level++, "dialogs");
-
- gatetime_dialog->write_configuration(level, xml);
- velocity_dialog->write_configuration(level, xml);
- quantize_dialog->write_configuration(level, xml);
- erase_dialog->write_configuration(level, xml);
- del_overlaps_dialog->write_configuration(level, xml);
- set_notelen_dialog->write_configuration(level, xml);
- move_notes_dialog->write_configuration(level, xml);
- transpose_dialog->write_configuration(level, xml);
- crescendo_dialog->write_configuration(level, xml);
- legato_dialog->write_configuration(level, xml);
-
- xml.tag(level, "/dialogs");
-}
diff --git a/muse2/muse/functions.h b/muse2/muse/functions.h
index 6a74b21d..77777f04 100644
--- a/muse2/muse/functions.h
+++ b/muse2/muse/functions.h
@@ -23,37 +23,19 @@
#ifndef __FUNCTIONS_H__
#define __FUNCTIONS_H__
-#include "widgets/function_dialogs/velocity.h"
-#include "widgets/function_dialogs/quantize.h"
-#include "widgets/function_dialogs/crescendo.h"
-#include "widgets/function_dialogs/gatetime.h"
-#include "widgets/function_dialogs/remove.h"
-#include "widgets/function_dialogs/transpose.h"
-#include "widgets/function_dialogs/setlen.h"
-#include "widgets/function_dialogs/move.h"
-#include "widgets/function_dialogs/deloverlaps.h"
-#include "widgets/function_dialogs/legato.h"
-
#include <set>
#include "part.h"
+#include "dialogs.h"
+#include <QWidget>
class QString;
class QMimeData;
class Undo;
-extern MusEDialog::GateTime* gatetime_dialog;
-extern MusEDialog::Velocity* velocity_dialog;
-extern MusEDialog::Quantize* quantize_dialog;
-extern MusEDialog::Remove* erase_dialog;
-extern MusEDialog::DelOverlaps* del_overlaps_dialog;
-extern MusEDialog::Setlen* set_notelen_dialog;
-extern MusEDialog::Move* move_notes_dialog;
-extern MusEDialog::Transpose* transpose_dialog;
-extern MusEDialog::Crescendo* crescendo_dialog;
-extern MusEDialog::Legato* legato_dialog;
+#define FUNCTION_RANGE_ONLY_SELECTED 1
+#define FUNCTION_RANGE_ONLY_BETWEEN_MARKERS 2
-void init_function_dialogs(QWidget* parent);
std::set<Part*> partlist_to_set(PartList* pl);
@@ -87,12 +69,25 @@ bool erase_notes(const std::set<Part*>& parts);
bool delete_overlaps(const std::set<Part*>& parts);
bool legato(const std::set<Part*>& parts);
+//the below functions operate on selected parts
+bool modify_velocity();
+bool modify_notelen();
+bool quantize_notes();
+bool set_notelen();
+bool move_notes();
+bool transpose_notes();
+bool crescendo();
+bool erase_notes();
+bool delete_overlaps();
+bool legato();
+
//functions for copy'n'paste
void copy_notes(const std::set<Part*>& parts, int range);
-void paste_notes(Part* dest_part);
+bool paste_notes(Part* paste_into_part=NULL); // shows a dialog
+void paste_notes(int max_distance=3072, bool always_new_part=false, bool never_new_part=false, Part* paste_into_part=NULL, int amount=1, int raster=3072);
QMimeData* selected_events_to_mime(const std::set<Part*>& parts, int range);
-void paste_at(Part* dest_part, const QString& pt, int pos);
+void paste_at(const QString& pt, int pos, int max_distance=3072, bool always_new_part=false, bool never_new_part=false, Part* paste_into_part=NULL, int amount=1, int raster=3072);
//functions for selections
void select_all(const std::set<Part*>& parts);
@@ -107,9 +102,4 @@ void expand_parts(int raster=-1);
void schedule_resize_all_same_len_clone_parts(Part* part, unsigned new_len, Undo& operations);
void clean_parts();
-//functions for reading and writing default values
-class Xml;
-void read_function_dialog_config(Xml& xml);
-void write_function_dialog_config(int level, Xml& xml);
-
#endif
diff --git a/muse2/muse/gconfig.cpp b/muse2/muse/gconfig.cpp
index b47a4773..deed36b3 100644
--- a/muse2/muse/gconfig.cpp
+++ b/muse2/muse/gconfig.cpp
@@ -165,6 +165,7 @@ GlobalConfigValues config = {
false, // mixer2Visible;
false, // markerVisible;
+ true, // arrangerVisible;
true, // showSplashScreen
1, // canvasShowPartType 1 - names, 2 events
5, // canvasShowPartEvent
diff --git a/muse2/muse/gconfig.h b/muse2/muse/gconfig.h
index 9b4099a6..1801df5f 100644
--- a/muse2/muse/gconfig.h
+++ b/muse2/muse/gconfig.h
@@ -137,6 +137,7 @@ struct GlobalConfigValues {
bool mixer1Visible;
bool mixer2Visible;
bool markerVisible;
+ bool arrangerVisible;
bool showSplashScreen;
int canvasShowPartType; // 1 - names, 2 events
diff --git a/muse2/muse/helper.cpp b/muse2/muse/helper.cpp
index fad9959f..1a223bb3 100644
--- a/muse2/muse/helper.cpp
+++ b/muse2/muse/helper.cpp
@@ -24,11 +24,27 @@
#include "part.h"
#include "track.h"
#include "song.h"
+#include "app.h"
+#include "icons.h"
+#include "synth.h"
+#include "functions.h"
+
+#ifdef DSSI_SUPPORT
+#include "dssihost.h"
+#endif
+
+#ifdef VST_SUPPORT
+#include "vst.h"
+#endif
+
+using std::set;
namespace MusEGlobal {
extern bool hIsB;
}
+namespace MusEUtil {
+
static const char* vall[] = {
"c","c#","d","d#","e","f","f#","g","g#","a","a#","h"
};
@@ -76,3 +92,240 @@ Part* partFromSerialNumber(int serial)
printf("ERROR: partFromSerialNumber(%i) wasn't able to find an appropriate part!\n",serial);
return NULL;
}
+
+
+//---------------------------------------------------------
+// populateAddSynth
+//---------------------------------------------------------
+
+QMenu* populateAddSynth(QWidget* parent)
+{
+ QMenu* synp = new QMenu(parent);
+
+ //typedef std::multimap<std::string, int, addSynth_cmp_str > asmap;
+ typedef std::multimap<std::string, int > asmap;
+
+ //typedef std::multimap<std::string, int, addSynth_cmp_str >::iterator imap;
+ typedef std::multimap<std::string, int >::iterator imap;
+
+ MessSynth* synMESS = 0;
+ QMenu* synpMESS = 0;
+ asmap mapMESS;
+
+ #ifdef DSSI_SUPPORT
+ DssiSynth* synDSSI = 0;
+ QMenu* synpDSSI = 0;
+ asmap mapDSSI;
+ #endif
+
+ #ifdef VST_SUPPORT
+ VstSynth* synVST = 0;
+ QMenu* synpVST = 0;
+ asmap mapVST;
+ #endif
+
+ // Not necessary, but what the heck.
+ QMenu* synpOther = 0;
+ asmap mapOther;
+
+ //const int synth_base_id = 0x1000;
+ int ii = 0;
+ for(std::vector<Synth*>::iterator i = synthis.begin(); i != synthis.end(); ++i)
+ {
+ synMESS = dynamic_cast<MessSynth*>(*i);
+ if(synMESS)
+ {
+ mapMESS.insert( std::pair<std::string, int> (std::string(synMESS->description().toLower().toLatin1().constData()), ii) );
+ }
+ else
+ {
+
+ #ifdef DSSI_SUPPORT
+ synDSSI = dynamic_cast<DssiSynth*>(*i);
+ if(synDSSI)
+ {
+ mapDSSI.insert( std::pair<std::string, int> (std::string(synDSSI->description().toLower().toLatin1().constData()), ii) );
+ }
+ else
+ #endif
+
+ {
+ #ifdef VST_SUPPORT
+ synVST = dynamic_cast<VstSynth*>(*i);
+ if(synVST)
+ {
+ mapVST.insert( std::pair<std::string, int> (std::string(synVST->description().toLower().toLatin1().constData()), ii) );
+ }
+ else
+ #endif
+
+ {
+ mapOther.insert( std::pair<std::string, int> (std::string((*i)->description().toLower().toLatin1().constData()), ii) );
+ }
+ }
+ }
+
+ ++ii;
+ }
+
+ int sz = synthis.size();
+ for(imap i = mapMESS.begin(); i != mapMESS.end(); ++i)
+ {
+ int idx = i->second;
+ if(idx > sz) // Sanity check
+ continue;
+ Synth* s = synthis[idx];
+ if(s)
+ {
+ // No MESS sub-menu yet? Create it now.
+ if(!synpMESS)
+ synpMESS = new QMenu(parent);
+ QAction* sM = synpMESS->addAction(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">");
+ sM->setData(MENU_ADD_SYNTH_ID_BASE + idx);
+ }
+ }
+
+ #ifdef DSSI_SUPPORT
+ for(imap i = mapDSSI.begin(); i != mapDSSI.end(); ++i)
+ {
+ int idx = i->second;
+ if(idx > sz)
+ continue;
+ Synth* s = synthis[idx];
+ if(s)
+ {
+ // No DSSI sub-menu yet? Create it now.
+ if(!synpDSSI)
+ synpDSSI = new QMenu(parent);
+ //synpDSSI->insertItem(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">", MENU_ADD_SYNTH_ID_BASE + idx);
+ QAction* sD = synpDSSI->addAction(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">");
+ sD->setData(MENU_ADD_SYNTH_ID_BASE + idx);
+ }
+ }
+ #endif
+
+ #ifdef VST_SUPPORT
+ for(imap i = mapVST.begin(); i != mapVST.end(); ++i)
+ {
+ int idx = i->second;
+ if(idx > sz)
+ continue;
+ Synth* s = synthis[idx];
+ if(s)
+ {
+ // No VST sub-menu yet? Create it now.
+ if(!synpVST)
+ synpVST = new QMenu(parent);
+ QAction* sV = synpVST->addAction(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">");
+ sV->setData(MENU_ADD_SYNTH_ID_BASE + idx);
+ }
+ }
+ #endif
+
+ for(imap i = mapOther.begin(); i != mapOther.end(); ++i)
+ {
+ int idx = i->second;
+ if(idx > sz)
+ continue;
+ Synth* s = synthis[idx];
+ // No Other sub-menu yet? Create it now.
+ if(!synpOther)
+ synpOther = new QMenu(parent);
+ //synpOther->insertItem(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">", MENU_ADD_SYNTH_ID_BASE + idx);
+ QAction* sO = synpOther->addAction(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">");
+ sO->setData(MENU_ADD_SYNTH_ID_BASE + idx);
+ }
+
+ if(synpMESS)
+ {
+ synpMESS->setIcon(*synthIcon);
+ synpMESS->setTitle(QT_TRANSLATE_NOOP("@default", "MESS"));
+ synp->addMenu(synpMESS);
+ }
+
+ #ifdef DSSI_SUPPORT
+ if(synpDSSI)
+ {
+ synpDSSI->setIcon(*synthIcon);
+ synpDSSI->setTitle(QT_TRANSLATE_NOOP("@default", "DSSI"));
+ synp->addMenu(synpDSSI);
+ }
+ #endif
+
+ #ifdef VST_SUPPORT
+ if(synpVST)
+ {
+ synpVST->setIcon(*synthIcon);
+ synpVST->setTitle(QT_TRANSLATE_NOOP("@default", "FST"));
+ synp->addMenu(synpVST);
+ }
+ #endif
+
+ if(synpOther)
+ {
+ synpOther->setIcon(*synthIcon);
+ synpOther->setTitle(QObject::tr("Other"));
+ synp->addMenu(synpOther);
+ }
+
+ return synp;
+}
+
+
+//---------------------------------------------------------
+// populateAddTrack
+// this is also used in "mixer"
+//---------------------------------------------------------
+
+QActionGroup* populateAddTrack(QMenu* addTrack)
+ {
+ QActionGroup* grp = new QActionGroup(addTrack);
+
+ QAction* midi = addTrack->addAction(QIcon(*addtrack_addmiditrackIcon),
+ QT_TRANSLATE_NOOP("@default", "Add Midi Track"));
+ midi->setData(Track::MIDI);
+ grp->addAction(midi);
+ QAction* drum = addTrack->addAction(QIcon(*addtrack_drumtrackIcon),
+ QT_TRANSLATE_NOOP("@default", "Add Drum Track"));
+ drum->setData(Track::DRUM);
+ grp->addAction(drum);
+ QAction* wave = addTrack->addAction(QIcon(*addtrack_wavetrackIcon),
+ QT_TRANSLATE_NOOP("@default", "Add Wave Track"));
+ wave->setData(Track::WAVE);
+ grp->addAction(wave);
+ QAction* aoutput = addTrack->addAction(QIcon(*addtrack_audiooutputIcon),
+ QT_TRANSLATE_NOOP("@default", "Add Audio Output"));
+ aoutput->setData(Track::AUDIO_OUTPUT);
+ grp->addAction(aoutput);
+ QAction* agroup = addTrack->addAction(QIcon(*addtrack_audiogroupIcon),
+ QT_TRANSLATE_NOOP("@default", "Add Audio Group"));
+ agroup->setData(Track::AUDIO_GROUP);
+ grp->addAction(agroup);
+ QAction* ainput = addTrack->addAction(QIcon(*addtrack_audioinputIcon),
+ QT_TRANSLATE_NOOP("@default", "Add Audio Input"));
+ ainput->setData(Track::AUDIO_INPUT);
+ grp->addAction(ainput);
+ QAction* aaux = addTrack->addAction(QIcon(*addtrack_auxsendIcon),
+ QT_TRANSLATE_NOOP("@default", "Add Aux Send"));
+ aaux->setData(Track::AUDIO_AUX);
+ grp->addAction(aaux);
+
+ // Create a sub-menu and fill it with found synth types. Make addTrack the owner.
+ QMenu* synp = populateAddSynth(addTrack);
+ synp->setIcon(*synthIcon);
+ synp->setTitle(QT_TRANSLATE_NOOP("@default", "Add Synth"));
+
+ // Add the sub-menu to the given menu.
+ addTrack->addMenu(synp);
+
+ //QObject::connect(addTrack, SIGNAL(triggered(QAction *)), song, SLOT(addNewTrack(QAction *)));
+
+ return grp;
+ }
+
+bool any_event_selected(const set<Part*>& parts, bool in_range)
+{
+ return !get_events(parts, in_range ? 3 : 1).empty();
+}
+
+} // namespace MusEUtil
diff --git a/muse2/muse/helper.h b/muse2/muse/helper.h
index fe4d018f..e86a8949 100644
--- a/muse2/muse/helper.h
+++ b/muse2/muse/helper.h
@@ -23,13 +23,26 @@
#ifndef __HELPER_H__
#define __HELPER_H__
-#include <QString>
+#include <set>
+
+class QActionGroup;
+class QString;
+class QMenu;
+class QWidget;
class Part;
-extern QString pitch2string(int v);
+namespace MusEUtil {
+
+QString pitch2string(int v);
Part* partFromSerialNumber(int serial);
+bool any_event_selected(const std::set<Part*>&, bool in_range=false);
+
+QMenu* populateAddSynth(QWidget* parent);
+QActionGroup* populateAddTrack(QMenu* addTrack);
+
+}
#endif
diff --git a/muse2/muse/importmidi.cpp b/muse2/muse/importmidi.cpp
index c7c02253..fd690671 100644
--- a/muse2/muse/importmidi.cpp
+++ b/muse2/muse/importmidi.cpp
@@ -268,8 +268,8 @@ bool MusE::importMidi(const QString name, bool merge)
song->updatePos();
- arranger->reset();
- ///arranger->setMode(int(song->mtype())); // p4.0.7 Tim
+ _arranger->reset();
+ ///_arranger->setMode(int(song->mtype())); // p4.0.7 Tim
}
else {
song->initLen();
diff --git a/muse2/muse/keyevent.cpp b/muse2/muse/keyevent.cpp
index 63bcdbe8..1dfe09dc 100644
--- a/muse2/muse/keyevent.cpp
+++ b/muse2/muse/keyevent.cpp
@@ -167,6 +167,7 @@ void KeyList::delKey(unsigned tick)
void KeyList::write(int level, Xml& xml) const
{
+ xml.tag(level, "keylist");
for (ciKeyEvent i = begin(); i != end(); ++i)
i->second.write(level, xml, i->first);
xml.tag(level, "/keylist");
diff --git a/muse2/muse/liste/listedit.cpp b/muse2/muse/liste/listedit.cpp
index 37989ca9..9766ba71 100644
--- a/muse2/muse/liste/listedit.cpp
+++ b/muse2/muse/liste/listedit.cpp
@@ -33,6 +33,7 @@
#include "listedit.h"
#include "mtscale.h"
#include "globals.h"
+#include "helper.h"
#include "icons.h"
#include "editevent.h"
#include "xml.h"
@@ -180,7 +181,7 @@ static QString midiMetaComment(const Event& ev)
void ListEdit::closeEvent(QCloseEvent* e)
{
- emit deleted((unsigned long)this);
+ emit deleted(static_cast<TopWin*>(this));
e->accept();
}
@@ -381,7 +382,7 @@ QString EventListItem::text(int col) const
break;
case 4:
if (event.isNote() || event.type() == PAfter)
- s = pitch2string(event.dataA());
+ s = MusEUtil::pitch2string(event.dataA());
else if (event.type() == Controller)
s.setNum(event.dataA() & 0xffff); // mask off type bits
else
@@ -460,7 +461,7 @@ QString EventListItem::text(int col) const
//---------------------------------------------------------
ListEdit::ListEdit(PartList* pl)
- : MidiEditor(0, pl)
+ : MidiEditor(TopWin::LISTE, 0, pl)
{
insertItems = new QActionGroup(this);
insertItems->setExclusive(false);
@@ -511,14 +512,29 @@ ListEdit::ListEdit(PartList* pl)
connect(editSignalMapper, SIGNAL(mapped(int)), SLOT(cmd(int)));
- //---------ToolBar----------------------------------
-
- listTools = addToolBar(tr("List tools"));
- listTools->addActions(MusEGlobal::undoRedo->actions());
-
+ QMenu* settingsMenu = menuBar()->addMenu(tr("Window &Config"));
+ settingsMenu->addAction(subwinAction);
+ settingsMenu->addAction(shareAction);
+ settingsMenu->addAction(fullscreenAction);
+
+
+ // Toolbars ---------------------------------------------------------
+ QToolBar* undo_tools=addToolBar(tr("Undo/Redo tools"));
+ undo_tools->setObjectName("Undo/Redo tools");
+ undo_tools->addActions(MusEGlobal::undoRedo->actions());
+
QToolBar* insertTools = addToolBar(tr("Insert tools"));
+ insertTools->setObjectName("list insert tools");
insertTools->addActions(insertItems->actions());
+ QToolBar* panic_toolbar = addToolBar(tr("panic"));
+ panic_toolbar->setObjectName("panic");
+ panic_toolbar->addAction(MusEGlobal::panicAction);
+
+ QToolBar* transport_toolbar = addToolBar(tr("transport"));
+ transport_toolbar->setObjectName("transport");
+ transport_toolbar->addActions(MusEGlobal::transportAction->actions());
+
//
//---------------------------------------------------
// liste
@@ -589,6 +605,8 @@ ListEdit::ListEdit(PartList* pl)
}
initShortcuts();
+
+ setWindowTitle("MusE: List Editor");
}
//---------------------------------------------------------
@@ -828,6 +846,45 @@ void ListEdit::writeStatus(int level, Xml& xml) const
}
//---------------------------------------------------------
+// readConfiguration
+//---------------------------------------------------------
+
+void ListEdit::readConfiguration(Xml& xml)
+ {
+ for (;;) {
+ Xml::Token token = xml.parse();
+ const QString& tag = xml.s1();
+ switch (token) {
+ case Xml::Error:
+ case Xml::End:
+ return;
+ case Xml::TagStart:
+ if (tag == "topwin")
+ TopWin::readConfiguration(LISTE, xml);
+ else
+ xml.unknown("ListEdit");
+ break;
+ case Xml::TagEnd:
+ if (tag == "listedit")
+ return;
+ default:
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// writeConfiguration
+//---------------------------------------------------------
+
+void ListEdit::writeConfiguration(int level, Xml& xml)
+ {
+ xml.tag(level++, "listedit");
+ TopWin::writeConfiguration(LISTE, level, xml);
+ xml.tag(level, "/listedit");
+ }
+
+//---------------------------------------------------------
// selectionChanged
//---------------------------------------------------------
diff --git a/muse2/muse/liste/listedit.h b/muse2/muse/liste/listedit.h
index 5d522812..ba26b6b6 100644
--- a/muse2/muse/liste/listedit.h
+++ b/muse2/muse/liste/listedit.h
@@ -83,13 +83,15 @@ class ListEdit : public MidiEditor {
void songChanged(int);
signals:
- void deleted(unsigned long);
+ void deleted(TopWin*);
public:
ListEdit(PartList*);
~ListEdit();
virtual void readStatus(Xml&);
virtual void writeStatus(int, Xml&) const;
+ static void readConfiguration(Xml&);
+ static void writeConfiguration(int, Xml&);
};
#endif
diff --git a/muse2/muse/main.cpp b/muse2/muse/main.cpp
index b30c3ef5..11644e2f 100644
--- a/muse2/muse/main.cpp
+++ b/muse2/muse/main.cpp
@@ -23,6 +23,7 @@
#include <QApplication>
#include <QDir>
+#include <QFile>
#include <QKeyEvent>
#include <QMessageBox>
#include <QLocale>
@@ -118,6 +119,8 @@ class MuseApplication : public QApplication {
void setMuse(MusEApp::MusE* m) {
muse = m;
+
+ connect(this,SIGNAL(focusChanged(QWidget*,QWidget*)),muse,SLOT(focusChanged(QWidget*,QWidget*)));
#ifdef HAVE_LASH
if(MusEGlobal::useLASH)
startTimer (300);
@@ -258,6 +261,28 @@ int main(int argc, char* argv[])
QDir cPath = QDir(MusEGlobal::configPath);
if (! cPath.exists())
cPath.mkpath(".");
+
+ QFile cConf (MusEGlobal::configName);
+ QFile cConfTempl (MusEGlobal::museGlobalShare + QString("/templates/MusE.cfg"));
+ if (! cConf.exists())
+ {
+ printf ("creating new config...\n");
+ if (cConfTempl.copy(MusEGlobal::configName))
+ printf (" success.\n");
+ else
+ printf (" FAILED!\n");
+ }
+
+ QFile cConfQt (MusEGlobal::configPath + QString("/MusE-qt.conf"));
+ QFile cConfTemplQt (MusEGlobal::museGlobalShare + QString("/templates/MusE-qt.conf"));
+ if (! cConfQt.exists())
+ {
+ printf ("creating new qt config...\n");
+ if (cConfTemplQt.copy(cConfQt.fileName()))
+ printf (" success.\n");
+ else
+ printf (" FAILED!\n");
+ }
#ifdef HAVE_LASH
lash_args_t * lash_args = 0;
diff --git a/muse2/muse/marker/markerview.cpp b/muse2/muse/marker/markerview.cpp
index 9e0b5b27..3aa1908c 100644
--- a/muse2/muse/marker/markerview.cpp
+++ b/muse2/muse/marker/markerview.cpp
@@ -156,7 +156,7 @@ void MarkerItem::setTick(unsigned v)
void MarkerView::closeEvent(QCloseEvent* e)
{
- emit deleted((unsigned long)this);
+ emit deleted(static_cast<TopWin*>(this));
emit closed();
e->accept();
}
@@ -166,7 +166,7 @@ void MarkerView::closeEvent(QCloseEvent* e)
//---------------------------------------------------------
MarkerView::MarkerView(QWidget* parent)
- : TopWin(parent, "markerview", Qt::Window /*| WDestructiveClose*/)
+ : TopWin(TopWin::MARKER, parent, "markerview", Qt::Window /*| WDestructiveClose*/)
{
//setAttribute(Qt::WA_DeleteOnClose);
@@ -187,15 +187,32 @@ MarkerView::MarkerView(QWidget* parent)
editMenu->addAction(markerAdd);
editMenu->addAction(markerDelete);
-
- //---------ToolBar----------------------------------
- tools = addToolBar(tr("marker-tools"));
- tools->addActions(MusEGlobal::undoRedo->actions());
+
+
+ QMenu* settingsMenu = menuBar()->addMenu(tr("Window &Config"));
+ settingsMenu->addAction(subwinAction);
+ settingsMenu->addAction(shareAction);
+ settingsMenu->addAction(fullscreenAction);
+
+
+ // Toolbars ---------------------------------------------------------
+ QToolBar* undo_tools=addToolBar(tr("Undo/Redo tools"));
+ undo_tools->setObjectName("Undo/Redo tools");
+ undo_tools->addActions(MusEGlobal::undoRedo->actions());
QToolBar* edit = addToolBar(tr("edit tools"));
+ edit->setObjectName("marker edit tools");
edit->addAction(markerAdd);
edit->addAction(markerDelete);
+ QToolBar* panic_toolbar = addToolBar(tr("panic"));
+ panic_toolbar->setObjectName("panic");
+ panic_toolbar->addAction(MusEGlobal::panicAction);
+
+ QToolBar* transport_toolbar = addToolBar(tr("transport"));
+ transport_toolbar->setObjectName("transport");
+ transport_toolbar->addActions(MusEGlobal::transportAction->actions());
+
//---------------------------------------------------
// master
//---------------------------------------------------
@@ -284,7 +301,6 @@ MarkerView::MarkerView(QWidget* parent)
// bug: 2811156 Softsynth GUI unclosable with XFCE4 (and a few others)
show();
hide();
-
}
//---------------------------------------------------------
@@ -311,7 +327,10 @@ void MarkerView::readStatus(Xml& xml)
break;
switch (token) {
case Xml::TagStart:
- xml.unknown("Marker");
+ if (tag=="topwin")
+ TopWin::readStatus(xml);
+ else
+ xml.unknown("Marker");
break;
case Xml::TagEnd:
if (tag == "marker")
@@ -329,6 +348,46 @@ void MarkerView::readStatus(Xml& xml)
void MarkerView::writeStatus(int level, Xml& xml) const
{
xml.tag(level++, "marker");
+ TopWin::writeStatus(level, xml);
+ xml.tag(level, "/marker");
+ }
+
+//---------------------------------------------------------
+// readConfiguration
+//---------------------------------------------------------
+
+void MarkerView::readConfiguration(Xml& xml)
+ {
+ for (;;) {
+ Xml::Token token = xml.parse();
+ const QString& tag = xml.s1();
+ switch (token) {
+ case Xml::Error:
+ case Xml::End:
+ return;
+ case Xml::TagStart:
+ if (tag == "topwin")
+ TopWin::readConfiguration(MARKER, xml);
+ else
+ xml.unknown("MarkerView");
+ break;
+ case Xml::TagEnd:
+ if (tag == "marker")
+ return;
+ default:
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// writeConfiguration
+//---------------------------------------------------------
+
+void MarkerView::writeConfiguration(int level, Xml& xml)
+ {
+ xml.tag(level++, "marker");
+ TopWin::writeConfiguration(MARKER, level, xml);
xml.tag(level, "/marker");
}
diff --git a/muse2/muse/marker/markerview.h b/muse2/muse/marker/markerview.h
index f904a2c7..48d4901a 100644
--- a/muse2/muse/marker/markerview.h
+++ b/muse2/muse/marker/markerview.h
@@ -92,7 +92,7 @@ class MarkerView : public TopWin {
void songChanged(int);
signals:
- void deleted(unsigned long);
+ void deleted(TopWin*);
void closed();
public:
@@ -100,6 +100,8 @@ class MarkerView : public TopWin {
~MarkerView();
virtual void readStatus(Xml&);
virtual void writeStatus(int, Xml&) const;
+ static void readConfiguration(Xml&);
+ static void writeConfiguration(int, Xml&);
void nextMarker();
void prevMarker();
};
diff --git a/muse2/muse/master/lmaster.cpp b/muse2/muse/master/lmaster.cpp
index 46d1d446..a2cc8538 100644
--- a/muse2/muse/master/lmaster.cpp
+++ b/muse2/muse/master/lmaster.cpp
@@ -55,6 +55,7 @@
#define LMASTER_MSGBOX_STRING "MusE: List Editor"
+
//don't remove or insert new elements in keyStrs.
//only renaming (keeping the semantic sense) is allowed! (flo)
QStringList keyStrs = QStringList()
@@ -116,7 +117,7 @@ QString keyToString(key_enum key)
void LMaster::closeEvent(QCloseEvent* e)
{
- emit deleted((unsigned long)this);
+ emit deleted(static_cast<TopWin*>(this));
e->accept();
}
@@ -135,7 +136,7 @@ void LMaster::songChanged(int type)
//---------------------------------------------------------
LMaster::LMaster()
- : MidiEditor(0, 0, 0)
+ : MidiEditor(TopWin::LMASTER, 0, 0, 0)
{
pos_editor = 0;
tempo_editor = 0;
@@ -168,6 +169,12 @@ LMaster::LMaster()
delAction = menuEdit->addAction(tr("Delete Event"));
delAction->setShortcut(Qt::Key_Delete);
+ QMenu* settingsMenu = menuBar()->addMenu(tr("Window &Config"));
+ settingsMenu->addAction(subwinAction);
+ settingsMenu->addAction(shareAction);
+ settingsMenu->addAction(fullscreenAction);
+
+
connect(tempoAction, SIGNAL(triggered()), signalMapper, SLOT(map()));
connect(signAction, SIGNAL(triggered()), signalMapper, SLOT(map()));
connect(keyAction, SIGNAL(triggered()), signalMapper, SLOT(map()));
@@ -184,11 +191,13 @@ LMaster::LMaster()
connect(signalMapper, SIGNAL(mapped(int)), SLOT(cmd(int)));
- //---------ToolBar----------------------------------
- tools = addToolBar(tr("Master tools"));
- tools->addActions(MusEGlobal::undoRedo->actions());
+ // Toolbars ---------------------------------------------------------
+ QToolBar* undo_tools=addToolBar(tr("Undo/Redo tools"));
+ undo_tools->setObjectName("Undo/Redo tools");
+ undo_tools->addActions(MusEGlobal::undoRedo->actions());
QToolBar* edit = addToolBar(tr("Edit tools"));
+ edit->setObjectName("Master List Edit Tools");
QToolButton* tempoButton = new QToolButton();
QToolButton* timeSigButton = new QToolButton();
QToolButton* keyButton = new QToolButton();
@@ -202,6 +211,14 @@ LMaster::LMaster()
edit->addWidget(timeSigButton);
edit->addWidget(keyButton);
+ QToolBar* panic_toolbar = addToolBar(tr("panic"));
+ panic_toolbar->setObjectName("panic");
+ panic_toolbar->addAction(MusEGlobal::panicAction);
+
+ QToolBar* transport_toolbar = addToolBar(tr("transport"));
+ transport_toolbar->setObjectName("transport");
+ transport_toolbar->addActions(MusEGlobal::transportAction->actions());
+
///Q3Accel* qa = new Q3Accel(this);
///qa->connectItem(qa->insertItem(Qt::CTRL+Qt::Key_Z), song, SLOT(undo()));
///qa->connectItem(qa->insertItem(Qt::CTRL+Qt::Key_Y), song, SLOT(redo()));
@@ -420,6 +437,45 @@ void LMaster::writeStatus(int level, Xml& xml) const
}
//---------------------------------------------------------
+// readConfiguration
+//---------------------------------------------------------
+
+void LMaster::readConfiguration(Xml& xml)
+ {
+ for (;;) {
+ Xml::Token token = xml.parse();
+ const QString& tag = xml.s1();
+ switch (token) {
+ case Xml::Error:
+ case Xml::End:
+ return;
+ case Xml::TagStart:
+ if (tag == "topwin")
+ TopWin::readConfiguration(LMASTER, xml);
+ else
+ xml.unknown("LMaster");
+ break;
+ case Xml::TagEnd:
+ if (tag == "lmaster")
+ return;
+ default:
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// writeConfiguration
+//---------------------------------------------------------
+
+void LMaster::writeConfiguration(int level, Xml& xml)
+ {
+ xml.tag(level++, "lmaster");
+ TopWin::writeConfiguration(LMASTER, level, xml);
+ xml.tag(level, "/lmaster");
+ }
+
+//---------------------------------------------------------
// select
//---------------------------------------------------------
diff --git a/muse2/muse/master/lmaster.h b/muse2/muse/master/lmaster.h
index 54ec0281..4d2c03e9 100644
--- a/muse2/muse/master/lmaster.h
+++ b/muse2/muse/master/lmaster.h
@@ -29,15 +29,10 @@
#include "tempo.h"
#include "keyevent.h"
///#include "sig.h"
-//#include "al/sig.h"
+#include "al/sig.h"
#include <QTreeWidgetItem>
-namespace AL {
- class SigEvent;
- };
-using AL::SigEvent;
-
namespace Awl {
class PosEdit;
class SigEdit;
@@ -112,12 +107,12 @@ class LMasterKeyEventItem : public LMasterLViewItem {
class LMasterSigEventItem : public LMasterLViewItem {
private:
- const SigEvent* sigEvent;
+ const AL::SigEvent* sigEvent;
public:
- LMasterSigEventItem(QTreeWidget* parent, const SigEvent* s);
+ LMasterSigEventItem(QTreeWidget* parent, const AL::SigEvent* s);
virtual LMASTER_LVTYPE getType() { return LMASTER_SIGEVENT; }
- const SigEvent* getEvent() { return sigEvent; }
+ const AL::SigEvent* getEvent() { return sigEvent; }
virtual unsigned tick() { return sigEvent->tick; }
int z() { return sigEvent->sig.z; }
int n() { return sigEvent->sig.n; }
@@ -142,7 +137,7 @@ class LMaster : public MidiEditor {
virtual void closeEvent(QCloseEvent*);
void updateList();
void insertTempo(const TEvent*);
- void insertSig(const SigEvent*);
+ void insertSig(const AL::SigEvent*);
void insertKey(const KeyEvent&);
LMasterLViewItem* getItemAtPos(unsigned tick, LMASTER_LVTYPE t);
void initShortcuts();
@@ -173,7 +168,7 @@ class LMaster : public MidiEditor {
void configChanged();
signals:
- void deleted(unsigned long);
+ void deleted(TopWin*);
void seekTo(int tick);
public:
@@ -181,6 +176,8 @@ class LMaster : public MidiEditor {
~LMaster();
virtual void readStatus(Xml&);
virtual void writeStatus(int, Xml&) const;
+ static void readConfiguration(Xml&);
+ static void writeConfiguration(int, Xml&);
LMasterLViewItem* getLastOfType(LMASTER_LVTYPE t);
};
diff --git a/muse2/muse/master/masteredit.cpp b/muse2/muse/master/masteredit.cpp
index 1a737476..c3fde313 100644
--- a/muse2/muse/master/masteredit.cpp
+++ b/muse2/muse/master/masteredit.cpp
@@ -46,12 +46,10 @@
#include <QLabel>
#include <QToolBar>
#include <QToolButton>
-#include <QSettings>
+#include <QMenuBar>
+#include <QMenu>
int MasterEdit::_rasterInit = 0;
-int MasterEdit::_widthInit = 600;
-int MasterEdit::_heightInit = 400;
-QByteArray MasterEdit::_toolbarInit;
//---------------------------------------------------------
// closeEvent
@@ -59,11 +57,7 @@ QByteArray MasterEdit::_toolbarInit;
void MasterEdit::closeEvent(QCloseEvent* e)
{
- QSettings settings("MusE", "MusE-qt");
- //settings.setValue("MasterEdit/geometry", saveGeometry());
- settings.setValue("MasterEdit/windowState", saveState());
-
- emit deleted((unsigned long)this);
+ emit deleted(static_cast<TopWin*>(this));
e->accept();
}
@@ -100,22 +94,33 @@ void MasterEdit::songChanged(int type)
//---------------------------------------------------------
MasterEdit::MasterEdit()
- : MidiEditor(_rasterInit, 0)
+ : MidiEditor(TopWin::MASTER, _rasterInit, 0)
{
setWindowTitle(tr("MusE: Mastertrack"));
_raster = 0; // measure
- setMinimumSize(400, 300);
- resize(_widthInit, _heightInit);
//---------Pulldown Menu----------------------------
// QPopupMenu* file = new QPopupMenu(this);
// menuBar()->insertItem("&File", file);
- //---------ToolBar----------------------------------
-
- tools = addToolBar(tr("Master tools"));
- tools->setObjectName("Master tools");
- tools->addActions(MusEGlobal::undoRedo->actions());
+ QMenu* settingsMenu = menuBar()->addMenu(tr("Window &Config"));
+ settingsMenu->addAction(subwinAction);
+ settingsMenu->addAction(shareAction);
+ settingsMenu->addAction(fullscreenAction);
+
+ // Toolbars ---------------------------------------------------------
+ QToolBar* undo_tools=addToolBar(tr("Undo/Redo tools"));
+ undo_tools->setObjectName("Undo/Redo tools");
+ undo_tools->addActions(MusEGlobal::undoRedo->actions());
+
+
+ QToolBar* panic_toolbar = addToolBar(tr("panic"));
+ panic_toolbar->setObjectName("panic");
+ panic_toolbar->addAction(MusEGlobal::panicAction);
+
+ QToolBar* transport_toolbar = addToolBar(tr("transport"));
+ transport_toolbar->setObjectName("transport");
+ transport_toolbar->addActions(MusEGlobal::transportAction->actions());
MusEWidget::EditToolBar* tools2 = new MusEWidget::EditToolBar(this, MusEWidget::PointerTool | MusEWidget::PencilTool | MusEWidget::RubberTool);
addToolBar(tools2);
@@ -256,12 +261,7 @@ MasterEdit::MasterEdit()
connect(canvas, SIGNAL(followEvent(int)), hscroll, SLOT(setOffset(int)));
connect(canvas, SIGNAL(timeChanged(unsigned)), SLOT(setTime(unsigned)));
- if (!_toolbarInit.isEmpty())
- restoreState(_toolbarInit);
-
- QSettings settings("MusE", "MusE-qt");
- //restoreGeometry(settings.value("MasterEdit/geometry").toByteArray());
- restoreState(settings.value("MasterEdit/windowState").toByteArray());
+ initTopwinState();
}
//---------------------------------------------------------
@@ -350,12 +350,8 @@ void MasterEdit::readConfiguration(Xml& xml)
case Xml::TagStart:
if (tag == "raster")
_rasterInit = xml.parseInt();
- else if (tag == "width")
- _widthInit = xml.parseInt();
- else if (tag == "height")
- _heightInit = xml.parseInt();
- else if (tag == "toolbars")
- _toolbarInit = QByteArray::fromHex(xml.parse1().toAscii());
+ else if (tag == "topwin")
+ TopWin::readConfiguration(MASTER, xml);
else
xml.unknown("MasterEdit");
break;
@@ -376,9 +372,7 @@ void MasterEdit::writeConfiguration(int level, Xml& xml)
{
xml.tag(level++, "masteredit");
xml.intTag(level, "raster", _rasterInit);
- xml.intTag(level, "width", _widthInit);
- xml.intTag(level, "height", _heightInit);
- xml.strTag(level, "toolbars", _toolbarInit.toHex().data());
+ TopWin::writeConfiguration(MASTER, level, xml);
xml.tag(level, "/masteredit");
}
@@ -447,34 +441,3 @@ void MasterEdit::setTempo(int val)
}
-//---------------------------------------------------------
-// resizeEvent
-//---------------------------------------------------------
-
-void MasterEdit::resizeEvent(QResizeEvent* ev)
- {
- QWidget::resizeEvent(ev);
- storeInitialState();
- }
-
-//---------------------------------------------------------
-// focusOutEvent
-//---------------------------------------------------------
-
-void MasterEdit::focusOutEvent(QFocusEvent* ev)
- {
- QWidget::focusOutEvent(ev);
- storeInitialState();
- }
-
-
-//---------------------------------------------------------
-// storeInitialState
-//---------------------------------------------------------
-
-void MasterEdit::storeInitialState()
- {
- _widthInit = width();
- _heightInit = height();
- _toolbarInit=saveState();
- }
diff --git a/muse2/muse/master/masteredit.h b/muse2/muse/master/masteredit.h
index c4846f78..4f188813 100644
--- a/muse2/muse/master/masteredit.h
+++ b/muse2/muse/master/masteredit.h
@@ -79,14 +79,8 @@ class MasterEdit : public MidiEditor {
QToolButton* enableButton;
static int _rasterInit;
- static int _widthInit, _heightInit;
- static QByteArray _toolbarInit;
-
virtual void closeEvent(QCloseEvent*);
- virtual void resizeEvent(QResizeEvent*);
- virtual void focusOutEvent(QFocusEvent*);
- void storeInitialState();
private slots:
void _setRaster(int);
@@ -99,7 +93,7 @@ class MasterEdit : public MidiEditor {
// void tempoChanged(double);
signals:
- void deleted(unsigned long);
+ void deleted(TopWin*);
public:
MasterEdit();
diff --git a/muse2/muse/midiedit/dcanvas.cpp b/muse2/muse/midiedit/dcanvas.cpp
index 11d8958e..783a72f5 100644
--- a/muse2/muse/midiedit/dcanvas.cpp
+++ b/muse2/muse/midiedit/dcanvas.cpp
@@ -173,8 +173,6 @@ Undo DrumCanvas::moveCanvasItems(MusEWidget::CItemList& items, int dp, int dx, D
for(iPartToChange ip2c = parts2change.begin(); ip2c != parts2change.end(); ++ip2c)
{
Part* opart = ip2c->first;
- //int diff = ip2c->second.xdiff;
-
if (opart->hasHiddenEvents())
{
forbidden=true;
diff --git a/muse2/muse/midiedit/dcanvas.h b/muse2/muse/midiedit/dcanvas.h
index 0256de01..c25f71ca 100644
--- a/muse2/muse/midiedit/dcanvas.h
+++ b/muse2/muse/midiedit/dcanvas.h
@@ -106,7 +106,7 @@ class DrumCanvas : public EventCanvas {
public:
enum {
- CMD_CUT, CMD_COPY, CMD_PASTE, CMD_SAVE, CMD_LOAD, CMD_RESET,
+ CMD_CUT, CMD_COPY, CMD_COPY_RANGE, CMD_PASTE, CMD_PASTE_DIALOG, CMD_SAVE, CMD_LOAD, CMD_RESET,
CMD_SELECT_ALL, CMD_SELECT_NONE, CMD_SELECT_INVERT,
CMD_SELECT_ILOOP, CMD_SELECT_OLOOP, CMD_SELECT_PREV_PART, CMD_SELECT_NEXT_PART,
CMD_DEL, CMD_FIXED_LEN, CMD_RIGHT, CMD_LEFT, CMD_RIGHT_NOSNAP, CMD_LEFT_NOSNAP, CMD_MODIFY_VELOCITY, CMD_CRESCENDO,
diff --git a/muse2/muse/midiedit/dlist.cpp b/muse2/muse/midiedit/dlist.cpp
index 165bb4cb..8e9633c0 100644
--- a/muse2/muse/midiedit/dlist.cpp
+++ b/muse2/muse/midiedit/dlist.cpp
@@ -33,6 +33,7 @@
#include "pitchedit.h"
#include "midiport.h"
#include "drummap.h"
+#include "helper.h"
#include "icons.h"
#include "dlist.h"
#include "song.h"
@@ -90,10 +91,10 @@ void DList::draw(QPainter& p, const QRect& rect)
s.setNum(dm->len);
break;
case COL_ANOTE:
- s = pitch2string(dm->anote);
+ s = MusEUtil::pitch2string(dm->anote);
break;
case COL_ENOTE:
- s = pitch2string(dm->enote);
+ s = MusEUtil::pitch2string(dm->enote);
break;
case COL_LV1:
s.setNum(dm->lv1);
diff --git a/muse2/muse/midiedit/drumedit.cpp b/muse2/muse/midiedit/drumedit.cpp
index 592df7fb..8821d0d8 100644
--- a/muse2/muse/midiedit/drumedit.cpp
+++ b/muse2/muse/midiedit/drumedit.cpp
@@ -59,6 +59,8 @@
#include "audio.h"
#include "gconfig.h"
#include "functions.h"
+#include "helper.h"
+#include "widgets/function_dialogs/quantize.h"
/*
static const char* map_file_pattern[] = {
@@ -76,11 +78,8 @@ static const char* map_file_save_pattern[] = {
*/
int DrumEdit::_rasterInit = 96;
-int DrumEdit::_widthInit = 600;
-int DrumEdit::_heightInit = 400;
int DrumEdit::_dlistWidthInit = 50;
int DrumEdit::_dcanvasWidthInit = 300;
-QByteArray DrumEdit::_toolbarInit;
static const int xscale = -10;
static const int yscale = 1;
@@ -161,7 +160,7 @@ void DrumEdit::closeEvent(QCloseEvent* e)
_dlistWidthInit = *it; //There are only 2 values stored in the sizelist, size of dlist widget and dcanvas widget
it++;
_dcanvasWidthInit = *it;
- emit deleted((unsigned long)this);
+ emit deleted(static_cast<TopWin*>(this));
e->accept();
}
@@ -170,11 +169,11 @@ void DrumEdit::closeEvent(QCloseEvent* e)
//---------------------------------------------------------
DrumEdit::DrumEdit(PartList* pl, QWidget* parent, const char* name, unsigned initPos)
- : MidiEditor(_rasterInit, pl, parent, name)
+ : MidiEditor(TopWin::DRUM, _rasterInit, pl, parent, name)
{
setFocusPolicy(Qt::StrongFocus);
+
split1w1 = 0;
- resize(_widthInit, _heightInit);
selPart = 0;
QSignalMapper *signalMapper = new QSignalMapper(this);
@@ -199,18 +198,24 @@ DrumEdit::DrumEdit(PartList* pl, QWidget* parent, const char* name, unsigned ini
menuEdit->addSeparator();
cutAction = menuEdit->addAction(QIcon(*editcutIconSet), tr("Cut"));
copyAction = menuEdit->addAction(QIcon(*editcopyIconSet), tr("Copy"));
+ copyRangeAction = menuEdit->addAction(QIcon(*editcopyIconSet), tr("Copy events in range"));
pasteAction = menuEdit->addAction(QIcon(*editpasteIconSet), tr("Paste"));
+ pasteDialogAction = menuEdit->addAction(QIcon(*editpasteIconSet), tr("Paste (with Dialog)"));
menuEdit->addSeparator();
deleteAction = menuEdit->addAction(tr("Delete Events"));
connect(cutAction, SIGNAL(triggered()), signalMapper, SLOT(map()));
connect(copyAction, SIGNAL(triggered()), signalMapper, SLOT(map()));
+ connect(copyRangeAction, SIGNAL(triggered()), signalMapper, SLOT(map()));
connect(pasteAction, SIGNAL(triggered()), signalMapper, SLOT(map()));
+ connect(pasteDialogAction, SIGNAL(triggered()), signalMapper, SLOT(map()));
connect(deleteAction, SIGNAL(triggered()), signalMapper, SLOT(map()));
signalMapper->setMapping(cutAction, DrumCanvas::CMD_CUT);
signalMapper->setMapping(copyAction, DrumCanvas::CMD_COPY);
+ signalMapper->setMapping(copyRangeAction, DrumCanvas::CMD_COPY_RANGE);
signalMapper->setMapping(pasteAction, DrumCanvas::CMD_PASTE);
+ signalMapper->setMapping(pasteDialogAction, DrumCanvas::CMD_PASTE_DIALOG);
signalMapper->setMapping(deleteAction, DrumCanvas::CMD_DEL);
menuSelect = menuEdit->addMenu(QIcon(*selectIcon), tr("&Select"));
@@ -278,6 +283,11 @@ DrumEdit::DrumEdit(PartList* pl, QWidget* parent, const char* name, unsigned ini
QMenu* menuScriptPlugins = menuBar()->addMenu(tr("&Plugins"));
song->populateScriptMenu(menuScriptPlugins, this);
+
+ QMenu* settingsMenu = menuBar()->addMenu(tr("Window &Config"));
+ settingsMenu->addAction(subwinAction);
+ settingsMenu->addAction(shareAction);
+ settingsMenu->addAction(fullscreenAction);
connect(signalMapper, SIGNAL(mapped(int)), SLOT(cmd(int)));
@@ -496,9 +506,6 @@ DrumEdit::DrumEdit(PartList* pl, QWidget* parent, const char* name, unsigned ini
connect(ctrl, SIGNAL(clicked()), SLOT(addCtrl()));
- if (!_toolbarInit.isEmpty())
- restoreState(_toolbarInit);
-
QClipboard* cb = QApplication::clipboard();
connect(cb, SIGNAL(dataChanged()), SLOT(clipboardChanged()));
@@ -521,10 +528,9 @@ DrumEdit::DrumEdit(PartList* pl, QWidget* parent, const char* name, unsigned ini
if(canvas->track())
toolbar->setSolo(canvas->track()->solo());
-
- QSettings settings("MusE", "MusE-qt");
- //restoreGeometry(settings.value("Drumedit/geometry").toByteArray());
- restoreState(settings.value("Drumedit/windowState").toByteArray());
+
+
+ initTopwinState();
}
//---------------------------------------------------------
@@ -775,16 +781,12 @@ void DrumEdit::readConfiguration(Xml& xml)
case Xml::TagStart:
if (tag == "raster")
_rasterInit = xml.parseInt();
- else if (tag == "width")
- _widthInit = xml.parseInt();
- else if (tag == "height")
- _heightInit = xml.parseInt();
else if (tag == "dcanvaswidth")
_dcanvasWidthInit = xml.parseInt();
else if (tag == "dlistwidth")
_dlistWidthInit = xml.parseInt();
- else if (tag == "toolbars")
- _toolbarInit = QByteArray::fromHex(xml.parse1().toAscii());
+ else if (tag == "topwin")
+ TopWin::readConfiguration(DRUM, xml);
else
xml.unknown("DrumEdit");
break;
@@ -806,11 +808,9 @@ void DrumEdit::writeConfiguration(int level, Xml& xml)
{
xml.tag(level++, "drumedit");
xml.intTag(level, "raster", _rasterInit);
- xml.intTag(level, "width", _widthInit);
- xml.intTag(level, "height", _heightInit);
xml.intTag(level, "dlistwidth", _dlistWidthInit);
xml.intTag(level, "dcanvaswidth", _dcanvasWidthInit);
- xml.strTag(level, "toolbars", _toolbarInit.toHex().data());
+ TopWin::writeConfiguration(DRUM, level,xml);
xml.tag(level, "/drumedit");
}
@@ -923,9 +923,14 @@ void DrumEdit::cmd(int cmd)
erase_notes(partlist_to_set(parts()), 1);
break;
case DrumCanvas::CMD_COPY: copy_notes(partlist_to_set(parts()), 1); break;
+ case DrumCanvas::CMD_COPY_RANGE: copy_notes(partlist_to_set(parts()), MusEUtil::any_event_selected(partlist_to_set(parts())) ? 3 : 2); break;
case DrumCanvas::CMD_PASTE:
((DrumCanvas*)canvas)->cmd(DrumCanvas::CMD_SELECT_NONE);
- paste_notes(canvas->part());
+ paste_notes(3072);
+ break;
+ case DrumCanvas::CMD_PASTE_DIALOG:
+ ((DrumCanvas*)canvas)->cmd(DrumCanvas::CMD_SELECT_NONE);
+ paste_notes((canvas->part()));
break;
case DrumCanvas::CMD_LOAD: load(); break;
case DrumCanvas::CMD_SAVE: save(); break;
@@ -957,7 +962,8 @@ void DrumEdit::cmd(int cmd)
void DrumEdit::clipboardChanged()
{
- pasteAction->setEnabled(QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-eventlist")));
+ pasteAction->setEnabled(QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-groupedeventlists")));
+ pasteDialogAction->setEnabled(QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-groupedeventlists")));
}
//---------------------------------------------------------
@@ -1059,37 +1065,7 @@ void DrumEdit::newCanvasWidth(int w)
updateHScrollRange();
}
-//---------------------------------------------------------
-// resizeEvent
-//---------------------------------------------------------
-
-void DrumEdit::resizeEvent(QResizeEvent* ev)
- {
- QWidget::resizeEvent(ev);
- storeInitialState();
//TODO: Make the dlist not expand/shrink, but the canvas instead
- }
-
-//---------------------------------------------------------
-// focusOutEvent
-//---------------------------------------------------------
-
-void DrumEdit::focusOutEvent(QFocusEvent* ev)
- {
- QWidget::focusOutEvent(ev);
- storeInitialState();
- }
-
-//---------------------------------------------------------
-// storeInitialState
-//---------------------------------------------------------
-
-void DrumEdit::storeInitialState()
- {
- _widthInit = width();
- _heightInit = height();
- _toolbarInit=saveState();
- }
//---------------------------------------------------------
@@ -1303,7 +1279,9 @@ void DrumEdit::initShortcuts()
cutAction->setShortcut(shortcuts[SHRT_CUT].key);
copyAction->setShortcut(shortcuts[SHRT_COPY].key);
+ copyRangeAction->setShortcut(shortcuts[SHRT_COPY_RANGE].key);
pasteAction->setShortcut(shortcuts[SHRT_PASTE].key);
+ pasteDialogAction->setShortcut(shortcuts[SHRT_PASTE_DIALOG].key);
deleteAction->setShortcut(shortcuts[SHRT_DELETE].key);
fixedAction->setShortcut(shortcuts[SHRT_FIXED_LEN].key);
diff --git a/muse2/muse/midiedit/drumedit.h b/muse2/muse/midiedit/drumedit.h
index d9812ebc..06f7e131 100644
--- a/muse2/muse/midiedit/drumedit.h
+++ b/muse2/muse/midiedit/drumedit.h
@@ -88,12 +88,10 @@ class DrumEdit : public MidiEditor {
QComboBox *stepLenWidget;
static int _rasterInit;
- static int _widthInit, _heightInit;
static int _dlistWidthInit, _dcanvasWidthInit;
- static QByteArray _toolbarInit;
QAction *loadAction, *saveAction, *resetAction;
- QAction *cutAction, *copyAction, *pasteAction, *deleteAction;
+ QAction *cutAction, *copyAction, *copyRangeAction, *pasteAction, *pasteDialogAction, *deleteAction;
QAction *fixedAction, *veloAction, *crescAction, *quantizeAction;
QAction *sallAction, *snoneAction, *invAction, *inAction , *outAction;
QAction *prevAction, *nextAction;
@@ -105,10 +103,6 @@ class DrumEdit : public MidiEditor {
QWidget* genToolbar(QWidget* parent);
virtual void keyPressEvent(QKeyEvent*);
- virtual void resizeEvent(QResizeEvent*);
- virtual void focusOutEvent(QFocusEvent*);
- void storeInitialState();
-
void setHeaderToolTips();
void setHeaderWhatsThis();
@@ -139,7 +133,7 @@ class DrumEdit : public MidiEditor {
virtual void updateHScrollRange();
signals:
- void deleted(unsigned long);
+ void deleted(TopWin*);
public:
DrumEdit(PartList*, QWidget* parent = 0, const char* name = 0, unsigned initPos = MAXINT);
diff --git a/muse2/muse/midiedit/ecanvas.cpp b/muse2/muse/midiedit/ecanvas.cpp
index e15256ac..cb96118f 100644
--- a/muse2/muse/midiedit/ecanvas.cpp
+++ b/muse2/muse/midiedit/ecanvas.cpp
@@ -394,13 +394,13 @@ void EventCanvas::viewDropEvent(QDropEvent* event)
//event->ignore(); // TODO CHECK Tim.
return;
}
- if (event->mimeData()->hasFormat("text/x-muse-eventlist")) {
- text = QString(event->mimeData()->data("text/x-muse-eventlist"));
+ if (event->mimeData()->hasFormat("text/x-muse-groupedeventlists")) {
+ text = QString(event->mimeData()->data("text/x-muse-groupedeventlists"));
int x = editor->rasterVal(event->pos().x());
if (x < 0)
x = 0;
- paste_at(curPart, text, x);
+ paste_at(text,x,3072,false,false,curPart);
//event->accept(); // TODO
}
else {
diff --git a/muse2/muse/midiedit/pianoroll.cpp b/muse2/muse/midiedit/pianoroll.cpp
index e07d95bb..178b5c46 100644
--- a/muse2/muse/midiedit/pianoroll.cpp
+++ b/muse2/muse/midiedit/pianoroll.cpp
@@ -60,6 +60,7 @@
#include "icons.h"
#include "audio.h"
#include "functions.h"
+#include "helper.h"
#include "cmd.h"
@@ -68,10 +69,7 @@
#include "mtrackinfo.h"
int PianoRoll::_rasterInit = 96;
-int PianoRoll::_widthInit = 600;
-int PianoRoll::_heightInit = 400;
int PianoRoll::colorModeInit = 0;
-QByteArray PianoRoll::_toolbarInit;
static const int xscale = -10;
static const int yscale = 1;
@@ -84,10 +82,9 @@ static int pianorollTools = MusEWidget::PointerTool | MusEWidget::PencilTool | M
//---------------------------------------------------------
PianoRoll::PianoRoll(PartList* pl, QWidget* parent, const char* name, unsigned initPos)
- : MidiEditor(_rasterInit, pl, parent, name)
+ : MidiEditor(TopWin::PIANO_ROLL, _rasterInit, pl, parent, name)
{
deltaMode = false;
- resize(_widthInit, _heightInit);
selPart = 0;
_playEvents = false;
colorMode = colorModeInit;
@@ -111,10 +108,18 @@ PianoRoll::PianoRoll(PartList* pl, QWidget* parent, const char* name, unsigned i
mapper->setMapping(editCopyAction, PianoCanvas::CMD_COPY);
connect(editCopyAction, SIGNAL(triggered()), mapper, SLOT(map()));
+ editCopyRangeAction = menuEdit->addAction(QIcon(*editcopyIconSet), tr("Copy events in range"));
+ mapper->setMapping(editCopyRangeAction, PianoCanvas::CMD_COPY_RANGE);
+ connect(editCopyRangeAction, SIGNAL(triggered()), mapper, SLOT(map()));
+
editPasteAction = menuEdit->addAction(QIcon(*editpasteIconSet), tr("&Paste"));
mapper->setMapping(editPasteAction, PianoCanvas::CMD_PASTE);
connect(editPasteAction, SIGNAL(triggered()), mapper, SLOT(map()));
+ editPasteDialogAction = menuEdit->addAction(QIcon(*editpasteIconSet), tr("&Paste (with dialog)"));
+ mapper->setMapping(editPasteDialogAction, PianoCanvas::CMD_PASTE_DIALOG);
+ connect(editPasteDialogAction, SIGNAL(triggered()), mapper, SLOT(map()));
+
menuEdit->addSeparator();
editDelEventsAction = menuEdit->addAction(tr("Delete &Events"));
@@ -159,36 +164,10 @@ PianoRoll::PianoRoll(PartList* pl, QWidget* parent, const char* name, unsigned i
mapper->setMapping(selectNextPartAction, PianoCanvas::CMD_SELECT_NEXT_PART);
connect(selectNextPartAction, SIGNAL(triggered()), mapper, SLOT(map()));
- menuConfig = menuBar()->addMenu(tr("&Config"));
-
- eventColor = menuConfig->addMenu(tr("&Event Color"));
-
- QActionGroup* actgrp = new QActionGroup(this);
- actgrp->setExclusive(true);
-
- //evColorBlueAction = eventColor->addAction(tr("&Blue"));
- evColorBlueAction = actgrp->addAction(tr("&Blue"));
- evColorBlueAction->setCheckable(true);
- colorMapper->setMapping(evColorBlueAction, 0);
-
- //evColorPitchAction = eventColor->addAction(tr("&Pitch colors"));
- evColorPitchAction = actgrp->addAction(tr("&Pitch colors"));
- evColorPitchAction->setCheckable(true);
- colorMapper->setMapping(evColorPitchAction, 1);
-
- //evColorVelAction = eventColor->addAction(tr("&Velocity colors"));
- evColorVelAction = actgrp->addAction(tr("&Velocity colors"));
- evColorVelAction->setCheckable(true);
- colorMapper->setMapping(evColorVelAction, 2);
-
- connect(evColorBlueAction, SIGNAL(triggered()), colorMapper, SLOT(map()));
- connect(evColorPitchAction, SIGNAL(triggered()), colorMapper, SLOT(map()));
- connect(evColorVelAction, SIGNAL(triggered()), colorMapper, SLOT(map()));
-
- eventColor->addActions(actgrp->actions());
-
- connect(colorMapper, SIGNAL(mapped(int)), this, SLOT(eventColorModeChanged(int)));
-
+
+
+
+
menuFunctions = menuBar()->addMenu(tr("Fu&nctions"));
menuFunctions->setTearOffEnabled(true);
@@ -239,6 +218,46 @@ PianoRoll::PianoRoll(PartList* pl, QWidget* parent, const char* name, unsigned i
connect(mapper, SIGNAL(mapped(int)), this, SLOT(cmd(int)));
+
+
+
+
+ menuConfig = menuBar()->addMenu(tr("Window &Config"));
+
+ eventColor = menuConfig->addMenu(tr("&Event Color"));
+
+ QActionGroup* actgrp = new QActionGroup(this);
+ actgrp->setExclusive(true);
+
+ //evColorBlueAction = eventColor->addAction(tr("&Blue"));
+ evColorBlueAction = actgrp->addAction(tr("&Blue"));
+ evColorBlueAction->setCheckable(true);
+ colorMapper->setMapping(evColorBlueAction, 0);
+
+ //evColorPitchAction = eventColor->addAction(tr("&Pitch colors"));
+ evColorPitchAction = actgrp->addAction(tr("&Pitch colors"));
+ evColorPitchAction->setCheckable(true);
+ colorMapper->setMapping(evColorPitchAction, 1);
+
+ //evColorVelAction = eventColor->addAction(tr("&Velocity colors"));
+ evColorVelAction = actgrp->addAction(tr("&Velocity colors"));
+ evColorVelAction->setCheckable(true);
+ colorMapper->setMapping(evColorVelAction, 2);
+
+ connect(evColorBlueAction, SIGNAL(triggered()), colorMapper, SLOT(map()));
+ connect(evColorPitchAction, SIGNAL(triggered()), colorMapper, SLOT(map()));
+ connect(evColorVelAction, SIGNAL(triggered()), colorMapper, SLOT(map()));
+
+ eventColor->addActions(actgrp->actions());
+
+ connect(colorMapper, SIGNAL(mapped(int)), this, SLOT(eventColorModeChanged(int)));
+
+ menuConfig->addSeparator();
+ menuConfig->addAction(subwinAction);
+ menuConfig->addAction(shareAction);
+ menuConfig->addAction(fullscreenAction);
+
+
//---------ToolBar----------------------------------
tools = addToolBar(tr("Pianoroll tools"));
tools->setObjectName("Pianoroll tools");
@@ -483,9 +502,6 @@ PianoRoll::PianoRoll(PartList* pl, QWidget* parent, const char* name, unsigned i
setFocusPolicy(Qt::StrongFocus);
setEventColorMode(colorMode);
- if (!_toolbarInit.isEmpty())
- restoreState(_toolbarInit);
-
QClipboard* cb = QApplication::clipboard();
connect(cb, SIGNAL(dataChanged()), SLOT(clipboardChanged()));
@@ -513,10 +529,7 @@ PianoRoll::PianoRoll(PartList* pl, QWidget* parent, const char* name, unsigned i
toolbar->setSolo(canvas->track()->solo());
}
- QSettings settings("MusE", "MusE-qt");
- //restoreGeometry(settings.value("Pianoroll/geometry").toByteArray());
- restoreState(settings.value("Pianoroll/windowState").toByteArray());
-
+ initTopwinState();
}
//---------------------------------------------------------
@@ -625,9 +638,14 @@ void PianoRoll::cmd(int cmd)
erase_notes(partlist_to_set(parts()), 1);
break;
case PianoCanvas::CMD_COPY: copy_notes(partlist_to_set(parts()), 1); break;
+ case PianoCanvas::CMD_COPY_RANGE: copy_notes(partlist_to_set(parts()), MusEUtil::any_event_selected(partlist_to_set(parts())) ? 3 : 2); break;
case PianoCanvas::CMD_PASTE:
((PianoCanvas*)canvas)->cmd(PianoCanvas::CMD_SELECT_NONE);
- paste_notes(canvas->part());
+ paste_notes(3072);
+ break;
+ case PianoCanvas::CMD_PASTE_DIALOG:
+ ((PianoCanvas*)canvas)->cmd(PianoCanvas::CMD_SELECT_NONE);
+ paste_notes((canvas->part()));
break;
case PianoCanvas::CMD_MODIFY_GATE_TIME: modify_notelen(partlist_to_set(parts())); break;
case PianoCanvas::CMD_MODIFY_VELOCITY: modify_velocity(partlist_to_set(parts())); break;
@@ -803,7 +821,7 @@ void PianoRoll::closeEvent(QCloseEvent* e)
//settings.setValue("Pianoroll/geometry", saveGeometry());
settings.setValue("Pianoroll/windowState", saveState());
- emit deleted((unsigned long)this);
+ emit deleted(static_cast<TopWin*>(this));
e->accept();
}
@@ -824,12 +842,8 @@ void PianoRoll::readConfiguration(Xml& xml)
_rasterInit = xml.parseInt();
else if (tag == "colormode")
colorModeInit = xml.parseInt();
- else if (tag == "width")
- _widthInit = xml.parseInt();
- else if (tag == "height")
- _heightInit = xml.parseInt();
- else if (tag == "toolbars")
- _toolbarInit = QByteArray::fromHex(xml.parse1().toAscii());
+ else if (tag == "topwin")
+ TopWin::readConfiguration(PIANO_ROLL,xml);
else
xml.unknown("PianoRoll");
break;
@@ -850,10 +864,8 @@ void PianoRoll::writeConfiguration(int level, Xml& xml)
{
xml.tag(level++, "pianoroll");
xml.intTag(level, "raster", _rasterInit);
- xml.intTag(level, "width", _widthInit);
- xml.intTag(level, "height", _heightInit);
xml.intTag(level, "colormode", colorModeInit);
- xml.strTag(level, "toolbars", _toolbarInit.toHex().data());
+ TopWin::writeConfiguration(PIANO_ROLL, level, xml);
xml.etag(level, "pianoroll");
}
@@ -1196,7 +1208,8 @@ void PianoRoll::setEventColorMode(int mode)
void PianoRoll::clipboardChanged()
{
- editPasteAction->setEnabled(QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-eventlist")));
+ editPasteAction->setEnabled(QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-groupedeventlists")));
+ editPasteDialogAction->setEnabled(QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-groupedeventlists")));
}
//---------------------------------------------------------
@@ -1221,38 +1234,6 @@ void PianoRoll::setSpeaker(bool val)
canvas->playEvents(_playEvents);
}
-//---------------------------------------------------------
-// resizeEvent
-//---------------------------------------------------------
-
-void PianoRoll::resizeEvent(QResizeEvent* ev)
- {
- QWidget::resizeEvent(ev);
- storeInitialState();
- }
-
-
-//---------------------------------------------------------
-// focusOutEvent
-//---------------------------------------------------------
-
-void PianoRoll::focusOutEvent(QFocusEvent* ev)
- {
- QWidget::focusOutEvent(ev);
- storeInitialState();
- }
-
-
-//---------------------------------------------------------
-// storeInitialState
-//---------------------------------------------------------
-
-void PianoRoll::storeInitialState()
- {
- _widthInit = width();
- _heightInit = height();
- _toolbarInit=saveState();
- }
/*
@@ -1275,7 +1256,9 @@ void PianoRoll::initShortcuts()
{
editCutAction->setShortcut(shortcuts[SHRT_CUT].key);
editCopyAction->setShortcut(shortcuts[SHRT_COPY].key);
+ editCopyRangeAction->setShortcut(shortcuts[SHRT_COPY_RANGE].key);
editPasteAction->setShortcut(shortcuts[SHRT_PASTE].key);
+ editPasteDialogAction->setShortcut(shortcuts[SHRT_PASTE_DIALOG].key);
editDelEventsAction->setShortcut(shortcuts[SHRT_DELETE].key);
selectAllAction->setShortcut(shortcuts[SHRT_SELECT_ALL].key);
diff --git a/muse2/muse/midiedit/pianoroll.h b/muse2/muse/midiedit/pianoroll.h
index 9a6eb655..1a87d407 100644
--- a/muse2/muse/midiedit/pianoroll.h
+++ b/muse2/muse/midiedit/pianoroll.h
@@ -27,7 +27,6 @@
#include <QResizeEvent>
#include <QLabel>
#include <QKeyEvent>
-#include <QByteArray>
#include <values.h>
#include "noteinfo.h"
@@ -86,7 +85,9 @@ class PianoRoll : public MidiEditor {
QAction* editCutAction;
QAction* editCopyAction;
+ QAction* editCopyRangeAction;
QAction* editPasteAction;
+ QAction* editPasteDialogAction;
QAction* editDelEventsAction;
QAction* selectAllAction;
@@ -135,8 +136,6 @@ class PianoRoll : public MidiEditor {
int colorMode;
static int _rasterInit;
- static int _widthInit, _heightInit;
- static QByteArray _toolbarInit;
static int colorModeInit;
@@ -151,9 +150,6 @@ class PianoRoll : public MidiEditor {
QWidget* genToolbar(QWidget* parent);
virtual void closeEvent(QCloseEvent*);
virtual void keyPressEvent(QKeyEvent*);
- virtual void resizeEvent(QResizeEvent*);
- virtual void focusOutEvent(QFocusEvent*);
- void storeInitialState();
private slots:
void setSelection(int, Event&, Part*);
@@ -178,7 +174,7 @@ class PianoRoll : public MidiEditor {
void updateTrackInfo();
signals:
- void deleted(unsigned long);
+ void deleted(TopWin*);
public slots:
virtual void updateHScrollRange();
diff --git a/muse2/muse/midiedit/prcanvas.cpp b/muse2/muse/midiedit/prcanvas.cpp
index 55d51ad0..b96cb47f 100644
--- a/muse2/muse/midiedit/prcanvas.cpp
+++ b/muse2/muse/midiedit/prcanvas.cpp
@@ -384,8 +384,6 @@ Undo PianoCanvas::moveCanvasItems(MusEWidget::CItemList& items, int dp, int dx,
for(iPartToChange ip2c = parts2change.begin(); ip2c != parts2change.end(); ++ip2c)
{
Part* opart = ip2c->first;
- //int diff = ip2c->second.xdiff;
-
if (opart->hasHiddenEvents())
{
forbidden=true;
diff --git a/muse2/muse/midiedit/prcanvas.h b/muse2/muse/midiedit/prcanvas.h
index d239994e..a44a9a4a 100644
--- a/muse2/muse/midiedit/prcanvas.h
+++ b/muse2/muse/midiedit/prcanvas.h
@@ -105,7 +105,7 @@ class PianoCanvas : public EventCanvas {
public:
enum {
- CMD_CUT, CMD_COPY, CMD_PASTE, CMD_DEL,
+ CMD_CUT, CMD_COPY, CMD_COPY_RANGE, CMD_PASTE, CMD_PASTE_DIALOG, CMD_DEL,
CMD_QUANTIZE,
CMD_SELECT_ALL, CMD_SELECT_NONE, CMD_SELECT_INVERT,
CMD_SELECT_ILOOP, CMD_SELECT_OLOOP, CMD_SELECT_PREV_PART, CMD_SELECT_NEXT_PART,
diff --git a/muse2/muse/midiedit/scoreedit.cpp b/muse2/muse/midiedit/scoreedit.cpp
index 8847c105..ad55b33f 100644
--- a/muse2/muse/midiedit/scoreedit.cpp
+++ b/muse2/muse/midiedit/scoreedit.cpp
@@ -45,6 +45,7 @@
#include <QImage>
#include <QInputDialog>
#include <QMessageBox>
+#include <QSpinBox>
#include <stdio.h>
#include <math.h>
@@ -74,6 +75,9 @@ using namespace std;
//#include "../ctrl/ctrledit.h"
+using MusEGlobal::debugMsg;
+using MusEGlobal::heavyDebugMsg;
+
string IntToStr(int i);
QString IntToQStr(int i);
@@ -161,9 +165,6 @@ QColor* mycolors; // array [NUM_MYCOLORS]
set<QString> ScoreEdit::names;
-int ScoreEdit::width_init = 600;
-int ScoreEdit::height_init = 400;
-QByteArray ScoreEdit::default_toolbar_state;
//---------------------------------------------------------
@@ -171,13 +172,11 @@ QByteArray ScoreEdit::default_toolbar_state;
//---------------------------------------------------------
ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
- : TopWin(parent, name)
+ : TopWin(TopWin::SCORE, parent, name)
{
setAttribute(Qt::WA_DeleteOnClose);
setFocusPolicy(Qt::StrongFocus);
- resize(width_init, height_init);
-
mainw = new QWidget(this);
mainGrid = new QGridLayout();
@@ -367,10 +366,18 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
menu_mapper->setMapping(copy_action, CMD_COPY);
connect(copy_action, SIGNAL(triggered()), menu_mapper, SLOT(map()));
+ copy_range_action = edit_menu->addAction(QIcon(*editcopyIconSet), tr("Copy events in range"));
+ menu_mapper->setMapping(copy_range_action, CMD_COPY_RANGE);
+ connect(copy_range_action, SIGNAL(triggered()), menu_mapper, SLOT(map()));
+
paste_action = edit_menu->addAction(QIcon(*editpasteIconSet), tr("&Paste"));
menu_mapper->setMapping(paste_action, CMD_PASTE);
connect(paste_action, SIGNAL(triggered()), menu_mapper, SLOT(map()));
+ paste_dialog_action = edit_menu->addAction(QIcon(*editpasteIconSet), tr("Paste (with dialog)"));
+ menu_mapper->setMapping(paste_dialog_action, CMD_PASTE_DIALOG);
+ connect(paste_dialog_action, SIGNAL(triggered()), menu_mapper, SLOT(map()));
+
edit_menu->addSeparator();
del_action = edit_menu->addAction(tr("Delete &Events"));
@@ -404,7 +411,31 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
connect(select_oloop_action, SIGNAL(triggered()), menu_mapper, SLOT(map()));
- QMenu* settings_menu = menuBar()->addMenu(tr("&Settings"));
+ QMenu* functions_menu = menuBar()->addMenu(tr("Fu&nctions"));
+
+ func_quantize_action = functions_menu->addAction(tr("&Quantize"), menu_mapper, SLOT(map()));
+ func_notelen_action = functions_menu->addAction(tr("Change note &length"), menu_mapper, SLOT(map()));
+ func_velocity_action = functions_menu->addAction(tr("Change note &velocity"), menu_mapper, SLOT(map()));
+ func_cresc_action = functions_menu->addAction(tr("Crescendo/Decrescendo"), menu_mapper, SLOT(map()));
+ func_transpose_action = functions_menu->addAction(tr("Transpose"), menu_mapper, SLOT(map()));
+ func_erase_action = functions_menu->addAction(tr("Erase Events"), menu_mapper, SLOT(map()));
+ func_move_action = functions_menu->addAction(tr("Move Notes"), menu_mapper, SLOT(map()));
+ func_fixed_len_action = functions_menu->addAction(tr("Set Fixed Length"), menu_mapper, SLOT(map()));
+ func_del_overlaps_action = functions_menu->addAction(tr("Delete Overlaps"), menu_mapper, SLOT(map()));
+ func_legato_action = functions_menu->addAction(tr("Legato"), menu_mapper, SLOT(map()));
+ menu_mapper->setMapping(func_quantize_action, CMD_QUANTIZE);
+ menu_mapper->setMapping(func_notelen_action, CMD_NOTELEN);
+ menu_mapper->setMapping(func_velocity_action, CMD_VELOCITY);
+ menu_mapper->setMapping(func_cresc_action, CMD_CRESCENDO);
+ menu_mapper->setMapping(func_transpose_action, CMD_TRANSPOSE);
+ menu_mapper->setMapping(func_erase_action, CMD_ERASE);
+ menu_mapper->setMapping(func_move_action, CMD_MOVE);
+ menu_mapper->setMapping(func_fixed_len_action, CMD_FIXED_LEN);
+ menu_mapper->setMapping(func_del_overlaps_action, CMD_DELETE_OVERLAPS);
+ menu_mapper->setMapping(func_legato_action, CMD_LEGATO);
+
+
+ QMenu* settings_menu = menuBar()->addMenu(tr("Window &Config"));
color_menu = settings_menu->addMenu(tr("Note head &colors"));
color_actions = new QActionGroup(this);
@@ -423,7 +454,7 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
color_black_action->setChecked(true);
menu_command(CMD_COLOR_BLACK);
-
+
QMenu* preamble_menu = settings_menu->addMenu(tr("Set up &preamble"));
preamble_keysig_action = preamble_menu->addAction(tr("Display &key signature"));
preamble_timesig_action = preamble_menu->addAction(tr("Display &time signature"));
@@ -438,31 +469,13 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
QAction* set_name_action = settings_menu->addAction(tr("Set Score &name"), menu_mapper, SLOT(map()));
menu_mapper->setMapping(set_name_action, CMD_SET_NAME);
+
+ settings_menu->addSeparator();
+ settings_menu->addAction(subwinAction);
+ settings_menu->addAction(shareAction);
+ settings_menu->addAction(fullscreenAction);
- QMenu* functions_menu = menuBar()->addMenu(tr("Fu&nctions"));
-
- func_quantize_action = functions_menu->addAction(tr("&Quantize"), menu_mapper, SLOT(map()));
- func_notelen_action = functions_menu->addAction(tr("Change note &length"), menu_mapper, SLOT(map()));
- func_velocity_action = functions_menu->addAction(tr("Change note &velocity"), menu_mapper, SLOT(map()));
- func_cresc_action = functions_menu->addAction(tr("Crescendo/Decrescendo"), menu_mapper, SLOT(map()));
- func_transpose_action = functions_menu->addAction(tr("Transpose"), menu_mapper, SLOT(map()));
- func_erase_action = functions_menu->addAction(tr("Erase Events"), menu_mapper, SLOT(map()));
- func_move_action = functions_menu->addAction(tr("Move Notes"), menu_mapper, SLOT(map()));
- func_fixed_len_action = functions_menu->addAction(tr("Set Fixed Length"), menu_mapper, SLOT(map()));
- func_del_overlaps_action = functions_menu->addAction(tr("Delete Overlaps"), menu_mapper, SLOT(map()));
- func_legato_action = functions_menu->addAction(tr("Legato"), menu_mapper, SLOT(map()));
- menu_mapper->setMapping(func_quantize_action, CMD_QUANTIZE);
- menu_mapper->setMapping(func_notelen_action, CMD_NOTELEN);
- menu_mapper->setMapping(func_velocity_action, CMD_VELOCITY);
- menu_mapper->setMapping(func_cresc_action, CMD_CRESCENDO);
- menu_mapper->setMapping(func_transpose_action, CMD_TRANSPOSE);
- menu_mapper->setMapping(func_erase_action, CMD_ERASE);
- menu_mapper->setMapping(func_move_action, CMD_MOVE);
- menu_mapper->setMapping(func_fixed_len_action, CMD_FIXED_LEN);
- menu_mapper->setMapping(func_del_overlaps_action, CMD_DELETE_OVERLAPS);
- menu_mapper->setMapping(func_legato_action, CMD_LEGATO);
-
init_shortcuts();
connect(MusEGlobal::muse, SIGNAL(configChanged()), SLOT(init_shortcuts()));
@@ -473,10 +486,8 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
clipboard_changed();
selection_changed();
- if (!default_toolbar_state.isEmpty())
- restoreState(default_toolbar_state);
-
connect(song, SIGNAL(songChanged(int)), SLOT(song_changed(int)));
+ connect(song, SIGNAL(newPartsCreated(const std::map< Part*, std::set<Part*> >&)), score_canvas, SLOT(add_new_parts(const std::map< Part*, std::set<Part*> >&)));
score_canvas->fully_recalculate();
score_canvas->goto_tick(initPos,true);
@@ -488,13 +499,17 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
apply_velo=true;
+
+ initTopwinState();
}
void ScoreEdit::init_shortcuts()
{
cut_action->setShortcut(shortcuts[SHRT_CUT].key);
copy_action->setShortcut(shortcuts[SHRT_COPY].key);
+ copy_range_action->setShortcut(shortcuts[SHRT_COPY_RANGE].key);
paste_action->setShortcut(shortcuts[SHRT_PASTE].key);
+ paste_dialog_action->setShortcut(shortcuts[SHRT_PASTE_DIALOG].key);
del_action->setShortcut(shortcuts[SHRT_DELETE].key);
select_all_action->setShortcut(shortcuts[SHRT_SELECT_ALL].key);
@@ -656,30 +671,10 @@ void ScoreEdit::closeEvent(QCloseEvent* e)
//settings.setValue("ScoreEdit/geometry", saveGeometry());
settings.setValue("ScoreEdit/windowState", saveState());
- emit deleted((unsigned long)this);
+ emit deleted(static_cast<TopWin*>(this));
e->accept();
}
-void ScoreEdit::resizeEvent(QResizeEvent* ev)
-{
- QWidget::resizeEvent(ev);
-
- store_initial_state();
-}
-
-void ScoreEdit::focusOutEvent(QFocusEvent* ev)
-{
- QMainWindow::focusOutEvent(ev);
-
- store_initial_state();
-}
-
-void ScoreEdit::store_initial_state()
-{
- width_init=width();
- height_init=height();
- default_toolbar_state=saveState();
-}
void ScoreEdit::menu_command(int cmd)
{
@@ -710,8 +705,13 @@ void ScoreEdit::menu_command(int cmd)
erase_notes(score_canvas->get_all_parts(), 1);
break;
case CMD_COPY: copy_notes(score_canvas->get_all_parts(), 1); break;
+ case CMD_COPY_RANGE: copy_notes(score_canvas->get_all_parts(), MusEUtil::any_event_selected(score_canvas->get_all_parts()) ? 3 : 2); break;
case CMD_PASTE:
menu_command(CMD_SELECT_NONE);
+ paste_notes(3072);
+ break;
+ case CMD_PASTE_DIALOG:
+ menu_command(CMD_SELECT_NONE);
paste_notes(score_canvas->get_selected_part());
break;
case CMD_QUANTIZE: quantize_notes(score_canvas->get_all_parts()); break;
@@ -733,7 +733,8 @@ void ScoreEdit::menu_command(int cmd)
void ScoreEdit::clipboard_changed()
{
- paste_action->setEnabled(QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-eventlist")));
+ paste_action->setEnabled(QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-groupedeventlists")));
+ paste_dialog_action->setEnabled(QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-groupedeventlists")));
}
void ScoreEdit::selection_changed()
@@ -770,11 +771,11 @@ Part* read_part(Xml& xml, QString tag_name="part")
else
{
sscanf(tag.toLatin1().constData(), "%d:%d", &trackIdx, &partIdx);
- if (MusEGlobal::debugMsg) cout << "read_part: trackIdx="<<trackIdx<<", partIdx="<<partIdx;
+ if (debugMsg) cout << "read_part: trackIdx="<<trackIdx<<", partIdx="<<partIdx;
Track* track = song->tracks()->index(trackIdx);
if (track)
part = track->parts()->find(partIdx);
- if (MusEGlobal::debugMsg) cout << ", track="<<track<<", part="<<part<<endl;
+ if (debugMsg) cout << ", track="<<track<<", part="<<part<<endl;
}
}
break;
@@ -1050,12 +1051,8 @@ void ScoreEdit::read_configuration(Xml& xml)
switch (token)
{
case Xml::TagStart:
- if (tag == "height")
- height_init = xml.parseInt();
- else if (tag == "width")
- width_init = xml.parseInt();
- else if (tag == "toolbars")
- default_toolbar_state = QByteArray::fromHex(xml.parse1().toAscii());
+ if (tag == "topwin")
+ TopWin::readConfiguration(SCORE, xml);
else
xml.unknown("ScoreEdit");
break;
@@ -1074,9 +1071,7 @@ void ScoreEdit::read_configuration(Xml& xml)
void ScoreEdit::write_configuration(int level, Xml& xml)
{
xml.tag(level++, "scoreedit");
- xml.intTag(level, "width", width_init);
- xml.intTag(level, "height", height_init);
- xml.strTag(level, "toolbars", default_toolbar_state.toHex().data());
+ TopWin::writeConfiguration(SCORE, level, xml);
xml.etag(level, "scoreedit");
}
@@ -1558,7 +1553,7 @@ void ScoreCanvas::init_pixmaps()
{
if (!pixmaps_initalized)
{
- if (MusEGlobal::debugMsg) cout << "initalizing colors..." << endl;
+ if (debugMsg) cout << "initalizing colors..." << endl;
mycolors=new QColor[NUM_MYCOLORS];
@@ -1575,7 +1570,7 @@ void ScoreCanvas::init_pixmaps()
mycolors[i+VELO_PIXMAP_BEGIN]=QColor(0xff,0,(127-i)*4);
- if (MusEGlobal::debugMsg) cout << "loading pixmaps..." << endl;
+ if (debugMsg) cout << "loading pixmaps..." << endl;
pix_whole=new QPixmap[NUM_MYCOLORS];
pix_half=new QPixmap[NUM_MYCOLORS];
@@ -1633,7 +1628,7 @@ void ScoreCanvas::init_pixmaps()
pixmaps_initalized=true;
- if (MusEGlobal::debugMsg) cout << "done" << endl;
+ if (debugMsg) cout << "done" << endl;
}
}
@@ -1715,11 +1710,11 @@ void staff_t::create_appropriate_eventlist()
end=flo_quantize(event.endTick()+part->tick(), parent->quant_ticks());
if (end==begin)
{
- if (MusEGlobal::heavyDebugMsg) cout << "note len would be quantized to zero. using minimal possible length" << endl;
+ if (heavyDebugMsg) cout << "note len would be quantized to zero. using minimal possible length" << endl;
end=begin+parent->quant_ticks();
}
- if (MusEGlobal::heavyDebugMsg) cout << "inserting note on at "<<begin<<" with pitch="<<event.pitch()<<" and len="<<end-begin<<endl;
+ if (heavyDebugMsg) cout << "inserting note on at "<<begin<<" with pitch="<<event.pitch()<<" and len="<<end-begin<<endl;
eventlist.insert(pair<unsigned, FloEvent>(begin, FloEvent(begin,event.pitch(), event.velo(),end-begin,FloEvent::NOTE_ON,part,&it->second)));
}
//else ignore it
@@ -1736,7 +1731,7 @@ void staff_t::create_appropriate_eventlist()
if (to > unsigned(SONG_LENGTH))
to=SONG_LENGTH;
- if (MusEGlobal::heavyDebugMsg) cout << "new signature from tick "<<from<<" to " << to << ": "<<it->second->sig.z<<"/"<<it->second->sig.n<<"; ticks per measure = "<<ticks_per_measure<<endl;
+ if (heavyDebugMsg) cout << "new signature from tick "<<from<<" to " << to << ": "<<it->second->sig.z<<"/"<<it->second->sig.n<<"; ticks per measure = "<<ticks_per_measure<<endl;
eventlist.insert(pair<unsigned, FloEvent>(from, FloEvent(from, FloEvent::TIME_SIG, it->second->sig.z, it->second->sig.n) ) );
for (unsigned t=from; t<to; t+=ticks_per_measure)
eventlist.insert(pair<unsigned, FloEvent>(t, FloEvent(t,0,0,ticks_per_measure,FloEvent::BAR) ) );
@@ -1913,7 +1908,7 @@ int calc_measure_len(const list<int>& nums, int denom)
vector<int> create_emphasize_list(const list<int>& nums, int denom)
{
- if (MusEGlobal::heavyDebugMsg)
+ if (heavyDebugMsg)
{
cout << "creating emphasize list for ";
for (list<int>::const_iterator it=nums.begin(); it!=nums.end(); it++)
@@ -1941,7 +1936,7 @@ vector<int> create_emphasize_list(const list<int>& nums, int denom)
result[0]=0;
- if (MusEGlobal::heavyDebugMsg)
+ if (heavyDebugMsg)
{
for (int i=0;i<len;i++)
{
@@ -2023,7 +2018,7 @@ list<note_len_t> parse_note_len(int len_ticks, int begin_tick, vector<int>& foo,
len_now=len_now*TICKS_PER_WHOLE/64;
- if (MusEGlobal::heavyDebugMsg) cout << "add " << len_now << " ticks" << endl;
+ if (heavyDebugMsg) cout << "add " << len_now << " ticks" << endl;
if (allow_dots)
{
for (int i=0;i<=MAX_QUANT_POWER;i++)
@@ -2166,7 +2161,7 @@ void staff_t::create_itemlist()
note_pos_t notepos=note_pos(pitch,tmp_key,clef);
- if (MusEGlobal::heavyDebugMsg)
+ if (heavyDebugMsg)
{
printf("FLO: t=%i\ttype=%i\tpitch=%i\tvel=%i\tlen=%i\n",it->first, it->second.type, it->second.pitch, it->second.vel, it->second.len);
cout << "\tline="<<notepos.height<<"\tvorzeichen="<<notepos.vorzeichen << endl;
@@ -2179,7 +2174,7 @@ void staff_t::create_itemlist()
if (lastevent==last_measure) //there was no note?
{
unsigned tmppos=(last_measure+t-parent->quant_ticks())/2;
- if (MusEGlobal::heavyDebugMsg) cout << "\tend-of-measure: this was an empty measure. inserting rest in between at t="<<tmppos << endl;
+ if (heavyDebugMsg) cout << "\tend-of-measure: this was an empty measure. inserting rest in between at t="<<tmppos << endl;
itemlist[tmppos].insert( FloItem(FloItem::REST,notepos,0,0) );
itemlist[t].insert( FloItem(FloItem::REST_END,notepos,0,0) );
}
@@ -2189,13 +2184,13 @@ void staff_t::create_itemlist()
int rest=t-lastevent;
if (rest)
{
- if (MusEGlobal::heavyDebugMsg) printf("\tend-of-measure: set rest at %i with len %i\n",lastevent,rest);
+ if (heavyDebugMsg) printf("\tend-of-measure: set rest at %i with len %i\n",lastevent,rest);
list<note_len_t> lens=parse_note_len(rest,lastevent-last_measure,emphasize_list,DOTTED_RESTS,UNSPLIT_RESTS);
unsigned tmppos=lastevent;
for (list<note_len_t>::iterator x=lens.begin(); x!=lens.end(); x++)
{
- if (MusEGlobal::heavyDebugMsg) cout << "\t\tpartial rest with len="<<x->len<<", dots="<<x->dots<<endl;
+ if (heavyDebugMsg) cout << "\t\tpartial rest with len="<<x->len<<", dots="<<x->dots<<endl;
itemlist[tmppos].insert( FloItem(FloItem::REST,notepos,x->len,x->dots) );
tmppos+=calc_len(x->len,x->dots);
itemlist[tmppos].insert( FloItem(FloItem::REST_END,notepos,0,0) );
@@ -2215,7 +2210,7 @@ void staff_t::create_itemlist()
int rest=t-lastevent;
if (rest)
{
- if (MusEGlobal::heavyDebugMsg) printf("\tset rest at %i with len %i\n",lastevent,rest);
+ if (heavyDebugMsg) printf("\tset rest at %i with len %i\n",lastevent,rest);
// no need to check if the rest crosses measure boundaries;
// it can't.
@@ -2223,7 +2218,7 @@ void staff_t::create_itemlist()
unsigned tmppos=lastevent;
for (list<note_len_t>::iterator x=lens.begin(); x!=lens.end(); x++)
{
- if (MusEGlobal::heavyDebugMsg) cout << "\t\tpartial rest with len="<<x->len<<", dots="<<x->dots<<endl;
+ if (heavyDebugMsg) cout << "\t\tpartial rest with len="<<x->len<<", dots="<<x->dots<<endl;
itemlist[tmppos].insert( FloItem(FloItem::REST,notepos,x->len,x->dots) );
tmppos+=calc_len(x->len,x->dots);
itemlist[tmppos].insert( FloItem(FloItem::REST_END,notepos,0,0) );
@@ -2232,7 +2227,7 @@ void staff_t::create_itemlist()
- if (MusEGlobal::heavyDebugMsg) printf("\tset note at %i with len=%i\n", t, len);
+ if (heavyDebugMsg) printf("\tset note at %i with len=%i\n", t, len);
int tmplen;
bool tied_note;
@@ -2249,14 +2244,14 @@ void staff_t::create_itemlist()
eventlist.insert(pair<unsigned, FloEvent>(next_measure, FloEvent(actual_tick,pitch, velo,0,FloEvent::NOTE_OFF, it->second.source_part, it->second.source_event)));
eventlist.insert(pair<unsigned, FloEvent>(next_measure, FloEvent(actual_tick,pitch, velo,newlen,FloEvent::NOTE_ON, it->second.source_part, it->second.source_event)));
- if (MusEGlobal::heavyDebugMsg) cout << "\t\tnote was split to length "<<tmplen<<" + " << newlen<<endl;
+ if (heavyDebugMsg) cout << "\t\tnote was split to length "<<tmplen<<" + " << newlen<<endl;
}
else
{
tmplen=len;
tied_note=false;
- if (MusEGlobal::heavyDebugMsg) cout << "\t\tinserting NOTE OFF at "<<t+len<<endl;
+ if (heavyDebugMsg) cout << "\t\tinserting NOTE OFF at "<<t+len<<endl;
eventlist.insert(pair<unsigned, FloEvent>(t+len, FloEvent(t+len,pitch, velo,0,FloEvent::NOTE_OFF,it->second.source_part, it->second.source_event)));
}
@@ -2266,7 +2261,7 @@ void staff_t::create_itemlist()
int count=0;
for (list<note_len_t>::iterator x=lens.begin(); x!=lens.end(); x++)
{
- if (MusEGlobal::heavyDebugMsg) cout << "\t\tpartial note with len="<<x->len<<", dots="<<x->dots<<endl;
+ if (heavyDebugMsg) cout << "\t\tpartial note with len="<<x->len<<", dots="<<x->dots<<endl;
count++;
bool tie;
@@ -2287,14 +2282,14 @@ void staff_t::create_itemlist()
}
else if (type==FloEvent::TIME_SIG)
{
- if (MusEGlobal::heavyDebugMsg) cout << "inserting TIME SIGNATURE "<<it->second.num<<"/"<<it->second.denom<<" at "<<t<<endl;
+ if (heavyDebugMsg) cout << "inserting TIME SIGNATURE "<<it->second.num<<"/"<<it->second.denom<<" at "<<t<<endl;
itemlist[t].insert( FloItem(FloItem::TIME_SIG, it->second.num, it->second.denom) );
emphasize_list=create_emphasize_list(it->second.num, it->second.denom);
}
else if (type==FloEvent::KEY_CHANGE)
{
- if (MusEGlobal::heavyDebugMsg) cout << "inserting KEY CHANGE ("<<it->second.key<<") at "<<t<<endl;
+ if (heavyDebugMsg) cout << "inserting KEY CHANGE ("<<it->second.key<<") at "<<t<<endl;
itemlist[t].insert( FloItem(FloItem::KEY_CHANGE, it->second.key) );
tmp_key=it->second.key;
}
@@ -2312,7 +2307,7 @@ void staff_t::process_itemlist()
{
set<FloItem, floComp>& curr_items=it2->second;
- if (MusEGlobal::heavyDebugMsg) cout << "at t="<<it2->first<<endl;
+ if (heavyDebugMsg) cout << "at t="<<it2->first<<endl;
// phase 0: keep track of active notes, rests -------------------
// (and occupied lines) and the last measure
@@ -2329,7 +2324,7 @@ void staff_t::process_itemlist()
emphasize_list=create_emphasize_list(it->num, it->denom);
}
- if (MusEGlobal::heavyDebugMsg)
+ if (heavyDebugMsg)
{
cout << "occupied: ";
for (map<int,int>::iterator i=occupied.begin(); i!=occupied.end(); i++)
@@ -2355,7 +2350,7 @@ void staff_t::process_itemlist()
//(can be seen on already_grouped)
if ((it->type==FloItem::REST) && (it->already_grouped==false))
{
- if (MusEGlobal::heavyDebugMsg) cout << "trying to group" << endl;
+ if (heavyDebugMsg) cout << "trying to group" << endl;
int lastheight;
int height_cumulative=0;
@@ -2366,12 +2361,12 @@ void staff_t::process_itemlist()
set<FloItem, floComp>::iterator tmp;
for (tmp=it; tmp!=curr_items.end();)
{
- if (MusEGlobal::heavyDebugMsg) cout << "checking if we can proceed with an item at height="<<tmp->pos.height<<endl;
+ if (heavyDebugMsg) cout << "checking if we can proceed with an item at height="<<tmp->pos.height<<endl;
for (int i=lastheight+1; i<=tmp->pos.height-1; i++)
if (occupied[i]!=0)
{
- if (MusEGlobal::heavyDebugMsg) cout << "we can NOT, because occ["<<i<<"] != 0" << endl;
+ if (heavyDebugMsg) cout << "we can NOT, because occ["<<i<<"] != 0" << endl;
//stop grouping that rest
goto get_out_here;
}
@@ -2383,7 +2378,7 @@ void staff_t::process_itemlist()
{
// füge diese pause zur gruppe dazu und entferne sie von diesem set hier
// entfernen aber nur, wenn sie nicht it, also die erste pause ist, die brauchen wir noch!
- if (MusEGlobal::heavyDebugMsg) cout << "\tgrouping rest at height="<<tmp->pos.height<<endl;
+ if (heavyDebugMsg) cout << "\tgrouping rest at height="<<tmp->pos.height<<endl;
height_cumulative+=tmp->pos.height;
counter++;
if (tmp!=it)
@@ -2393,12 +2388,12 @@ void staff_t::process_itemlist()
}
else //it's something else? well, we can stop grouping that rest then
{
- if (MusEGlobal::heavyDebugMsg) cout << "we can NOT, because that item is not a rest" << endl;
+ if (heavyDebugMsg) cout << "we can NOT, because that item is not a rest" << endl;
//stop grouping that rest
goto get_out_here;
}
}
- if (MusEGlobal::heavyDebugMsg) cout << "no items to proceed on left, continuing" << endl;
+ if (heavyDebugMsg) cout << "no items to proceed on left, continuing" << endl;
get_out_here:
n_groups++;
@@ -2413,7 +2408,7 @@ void staff_t::process_itemlist()
// have we grouped all available rests into one single?
if ( (n_groups==1) && (tmp==curr_items.end()) && !dont_group)
{
- if (MusEGlobal::heavyDebugMsg) cout << "wow, we were able to group all rests into one single" << endl;
+ if (heavyDebugMsg) cout << "wow, we were able to group all rests into one single" << endl;
if (temp.len==0) //the whole rest is shifted one line (one space and one line)
temp.pos.height=DEFAULT_REST_HEIGHT+2;
else
@@ -2421,7 +2416,7 @@ void staff_t::process_itemlist()
}
else
{
- if (MusEGlobal::heavyDebugMsg) cout << "creating group #"<<n_groups<<endl;
+ if (heavyDebugMsg) cout << "creating group #"<<n_groups<<endl;
temp.pos.height=nearbyint((float)height_cumulative/counter);
}
@@ -2432,7 +2427,7 @@ void staff_t::process_itemlist()
// the item. effect: you don't have the rest at all
curr_items.erase(it++);
- if (MusEGlobal::heavyDebugMsg) cout << "replacing all grouped rests with a rest at height="<<temp.pos.height<<endl;
+ if (heavyDebugMsg) cout << "replacing all grouped rests with a rest at height="<<temp.pos.height<<endl;
curr_items.insert(temp);
}
@@ -2523,7 +2518,7 @@ group_them_again:
if (it->type==FloItem::NOTE)
lengths[it->len].add(it->pos.height);
- if (MusEGlobal::heavyDebugMsg)
+ if (heavyDebugMsg)
{
cout << "note lengths at that time are:";
for (map<int, cumulative_t>::iterator it=lengths.begin(); it!=lengths.end(); it++)
@@ -2536,14 +2531,14 @@ group_them_again:
if (lengths.size()==0)
{
- if (MusEGlobal::heavyDebugMsg) cout << "no notes other than wholes, or no notes at all. we can relax" << endl;
+ if (heavyDebugMsg) cout << "no notes other than wholes, or no notes at all. we can relax" << endl;
}
else if (lengths.size()==1)
{
pair<const int, cumulative_t>& group=*(lengths.begin());
stem_t stem;
int shift=0;
- if (MusEGlobal::heavyDebugMsg) cout << "only one non-whole note group (len="<<group.first<<") at height="<<group.second.mean()<< endl;
+ if (heavyDebugMsg) cout << "only one non-whole note group (len="<<group.first<<") at height="<<group.second.mean()<< endl;
if (group.second.mean()>=6)
{
@@ -2574,7 +2569,7 @@ group_them_again:
pair<const int, cumulative_t>& group2=*it;
stem_t stem1, stem2;
int shift1=0, shift2=0;
- if (MusEGlobal::heavyDebugMsg) cout << "two non-whole note group: len="<<group1.first<<" at height="<<group1.second.mean()<<" and len="<<group2.first<<" at height="<<group2.second.mean()<< endl;
+ if (heavyDebugMsg) cout << "two non-whole note group: len="<<group1.first<<" at height="<<group1.second.mean()<<" and len="<<group2.first<<" at height="<<group2.second.mean()<< endl;
if (group1.second.mean()<group2.second.mean())
{
@@ -2632,17 +2627,17 @@ group_them_again:
group1_len_ticks=calc_len(group1_len,0);
group2_len_ticks=calc_len(group2_len,0);
- if (MusEGlobal::heavyDebugMsg) cout << "we have "<<lengths.size()<<" groups. putting the "<<group1_n<<" longest and the "<<group2_n<<"shortest groups together"<<endl <<
+ if (heavyDebugMsg) cout << "we have "<<lengths.size()<<" groups. putting the "<<group1_n<<" longest and the "<<group2_n<<"shortest groups together"<<endl <<
"\tgroup1 will have len="<<group1_len<<" ("<<group1_len_ticks<<" ticks), group2 will have len="<<group2_len<<" ("<<group2_len_ticks<<" ticks)"<<endl;
for (set<FloItem, floComp>::iterator it=curr_items.begin(); it!=curr_items.end();)
if (it->type==FloItem::NOTE)
{
//if *it belongs to group1 and has not already its destination length
- if (MusEGlobal::heavyDebugMsg) cout << "\tprocessing note-item with len="<<it->len<<endl;
+ if (heavyDebugMsg) cout << "\tprocessing note-item with len="<<it->len<<endl;
if (it->len<group1_len)
{
- if (MusEGlobal::heavyDebugMsg) cout << "\t\thas to be changed to fit into group 1" << endl;
+ if (heavyDebugMsg) cout << "\t\thas to be changed to fit into group 1" << endl;
FloItem tmp=*it;
curr_items.erase(it++);
@@ -2667,7 +2662,7 @@ group_them_again:
int count=0;
for (list<note_len_t>::iterator x=lens.begin(); x!=lens.end(); x++)
{
- if (MusEGlobal::heavyDebugMsg) cout << "\t\twhile regrouping: partial note with len="<<x->len<<", dots="<<x->dots<<endl;
+ if (heavyDebugMsg) cout << "\t\twhile regrouping: partial note with len="<<x->len<<", dots="<<x->dots<<endl;
count++;
bool tie;
@@ -2686,7 +2681,7 @@ group_them_again:
//else if *it belongs to group2 and has not already its destination length
else if ((it->len<group2_len) && (it->len>group1_len))
{
- if (MusEGlobal::heavyDebugMsg) cout << "\t\thas to be changed to fit into group 2" << endl;
+ if (heavyDebugMsg) cout << "\t\thas to be changed to fit into group 2" << endl;
FloItem tmp=*it;
curr_items.erase(it++);
@@ -2712,7 +2707,7 @@ group_them_again:
int count=0;
for (list<note_len_t>::iterator x=lens.begin(); x!=lens.end(); x++)
{
- if (MusEGlobal::heavyDebugMsg) cout << "\t\twhile regrouping: partial note with len="<<x->len<<", dots="<<x->dots<<endl;
+ if (heavyDebugMsg) cout << "\t\twhile regrouping: partial note with len="<<x->len<<", dots="<<x->dots<<endl;
count++;
bool tie;
@@ -2730,7 +2725,7 @@ group_them_again:
}
else //nothing to do?
{
- if (MusEGlobal::heavyDebugMsg) cout << "\t\tnothing to do" << endl;
+ if (heavyDebugMsg) cout << "\t\tnothing to do" << endl;
it++;
}
}
@@ -2746,7 +2741,7 @@ group_them_again:
//draw a pixmap centered
void ScoreCanvas::draw_pixmap(QPainter& p, int x, int y, const QPixmap& pm)
{
- if (MusEGlobal::heavyDebugMsg) cout << "drawing pixmap with size="<<pm.width()<<"/"<<pm.height()<<" at "<<x<<"/"<<y<<endl;
+ if (heavyDebugMsg) cout << "drawing pixmap with size="<<pm.width()<<"/"<<pm.height()<<" at "<<x<<"/"<<y<<endl;
p.drawPixmap(x-pm.width()/2,y-pm.height()/2,pm);
}
@@ -2963,7 +2958,7 @@ void ScoreCanvas::draw_items(QPainter& p, int y_offset, staff_t& staff, ScoreIte
for (ScoreItemList::iterator it2=from_it; it2!=to_it; it2++)
{
- if (MusEGlobal::heavyDebugMsg) cout << "at t="<<it2->first << endl;
+ if (heavyDebugMsg) cout << "at t="<<it2->first << endl;
int upstem_y1 = -1, upstem_y2=-1, upstem_x=-1, upflag=-1;
int downstem_y1 = -1, downstem_y2=-1, downstem_x=-1, downflag=-1;
@@ -2972,7 +2967,7 @@ void ScoreCanvas::draw_items(QPainter& p, int y_offset, staff_t& staff, ScoreIte
{
if (it->type==FloItem::NOTE)
{
- if (MusEGlobal::heavyDebugMsg)
+ if (heavyDebugMsg)
{
cout << "\tNOTE at line"<<it->pos.height<<" with acc.="<<it->pos.vorzeichen<<", len="<<pow(2,it->len);
for (int i=0;i<it->dots;i++) cout << ".";
@@ -3106,7 +3101,7 @@ void ScoreCanvas::draw_items(QPainter& p, int y_offset, staff_t& staff, ScoreIte
//if needed, draw tie
if (it->is_tie_dest)
{
- if (MusEGlobal::heavyDebugMsg) cout << "drawing tie" << endl;
+ if (heavyDebugMsg) cout << "drawing tie" << endl;
draw_tie(p,it->tie_from_x-x_pos+x_left,it->x -x_pos+x_left,y_offset + it->y, (it->len==0) ? true : (it->stem==DOWNWARDS) , mycolors[color_index]);
// in english: "if it's a whole note, tie is upwards (true). if not, tie is upwards if
// stem is downwards and vice versa"
@@ -3114,7 +3109,7 @@ void ScoreCanvas::draw_items(QPainter& p, int y_offset, staff_t& staff, ScoreIte
}
else if (it->type==FloItem::REST)
{
- if (MusEGlobal::heavyDebugMsg)
+ if (heavyDebugMsg)
{
cout << "\tREST at line"<<it->pos.height<<" with len="<<pow(2,it->len);
for (int i=0;i<it->dots;i++) cout << ".";
@@ -3144,7 +3139,7 @@ void ScoreCanvas::draw_items(QPainter& p, int y_offset, staff_t& staff, ScoreIte
}
else if (it->type==FloItem::BAR)
{
- if (MusEGlobal::heavyDebugMsg) cout << "\tBAR" << endl;
+ if (heavyDebugMsg) cout << "\tBAR" << endl;
p.setPen(Qt::black);
p.drawLine(it->x -x_pos+x_left,y_offset -2*YLEN,it->x -x_pos+x_left,y_offset +2*YLEN);
@@ -3154,14 +3149,14 @@ void ScoreCanvas::draw_items(QPainter& p, int y_offset, staff_t& staff, ScoreIte
}
else if (it->type==FloItem::TIME_SIG)
{
- if (MusEGlobal::heavyDebugMsg) cout << "\tTIME SIGNATURE: "<<it->num<<"/"<<it->denom<<endl;
+ if (heavyDebugMsg) cout << "\tTIME SIGNATURE: "<<it->num<<"/"<<it->denom<<endl;
draw_timesig(p, it->x - x_pos+x_left, y_offset, it->num, it->denom);
}
else if (it->type==FloItem::KEY_CHANGE)
{
key_enum new_key=it->key;
- if (MusEGlobal::heavyDebugMsg) cout << "\tKEY CHANGE: from "<<curr_key<<" to "<<new_key<<endl;
+ if (heavyDebugMsg) cout << "\tKEY CHANGE: from "<<curr_key<<" to "<<new_key<<endl;
list<int> aufloes_list=calc_accidentials(curr_key, staff.clef, new_key);
list<int> new_acc_list=calc_accidentials(new_key, staff.clef);
@@ -3372,7 +3367,7 @@ void ScoreCanvas::draw_number(QPainter& p, int x, int y, int n)
void ScoreCanvas::draw(QPainter& p, const QRect&)
{
- if (MusEGlobal::debugMsg) cout <<"now in ScoreCanvas::draw"<<endl;
+ if (debugMsg) cout <<"now in ScoreCanvas::draw"<<endl;
@@ -3395,7 +3390,7 @@ void ScoreCanvas::draw(QPainter& p, const QRect&)
p.drawRect(lasso);
}
- if (MusEGlobal::debugMsg) cout << "drawing done." << endl;
+ if (debugMsg) cout << "drawing done." << endl;
}
@@ -3578,7 +3573,7 @@ void ScoreCanvas::mousePressEvent (QMouseEvent* event)
{
ScoreItemList& itemlist=staff_it->itemlist;
- if (MusEGlobal::debugMsg) cout << "mousePressEvent at "<<x<<"/"<<y<<"; tick="<<tick<<endl;
+ if (debugMsg) cout << "mousePressEvent at "<<x<<"/"<<y<<"; tick="<<tick<<endl;
set<FloItem, floComp>::iterator set_it;
for (set_it=itemlist[tick].begin(); set_it!=itemlist[tick].end(); set_it++)
if (set_it->type==FloItem::NOTE)
@@ -3634,7 +3629,7 @@ void ScoreCanvas::mousePressEvent (QMouseEvent* event)
mouse_x_drag_operation=NO_OP;
}
- if (MusEGlobal::debugMsg)
+ if (debugMsg)
cout << "you clicked at a note with begin at "<<set_it->begin_tick<<" and end at "<<t<<endl
<< "x-drag-operation will be "<<mouse_x_drag_operation<<endl
<< "pointer to part is "<<set_it->source_part << endl;
@@ -3702,13 +3697,13 @@ void ScoreCanvas::mousePressEvent (QMouseEvent* event)
if (flo_quantize(newevent.lenTick(), quant_ticks()) <= 0)
{
newevent.setLenTick(quant_ticks());
- if (MusEGlobal::debugMsg) cout << "inserted note's length would be invisible after quantisation (too short)." << endl <<
+ if (debugMsg) cout << "inserted note's length would be invisible after quantisation (too short)." << endl <<
" setting it to " << newevent.lenTick() << endl;
}
if (newevent.endTick() > curr_part->lenTick())
{
- if (MusEGlobal::debugMsg) cout << "clipping inserted note from len="<<newevent.endTick()<<" to len="<<(curr_part->lenTick() - newevent.tick())<<endl;
+ if (debugMsg) cout << "clipping inserted note from len="<<newevent.endTick()<<" to len="<<(curr_part->lenTick() - newevent.tick())<<endl;
newevent.setLenTick(curr_part->lenTick() - newevent.tick());
}
@@ -3757,7 +3752,7 @@ void ScoreCanvas::mouseReleaseEvent (QMouseEvent* event)
{
if (flo_quantize(dragged_event.lenTick(), quant_ticks()) <= 0)
{
- if (MusEGlobal::debugMsg) cout << "new length <= 0, erasing item" << endl;
+ if (debugMsg) cout << "new length <= 0, erasing item" << endl;
if (undo_started) song->undo();
audio->msgDeleteEvent(dragged_event, dragged_event_part, true, false, false);
}
@@ -3857,13 +3852,13 @@ void ScoreCanvas::mouseMoveEvent (QMouseEvent* event)
{
if ((abs(dx)>DRAG_INIT_DISTANCE) && (mouse_x_drag_operation!=NO_OP))
{
- if (MusEGlobal::debugMsg) cout << "mouse-operation is now "<<mouse_x_drag_operation<<endl;
+ if (debugMsg) cout << "mouse-operation is now "<<mouse_x_drag_operation<<endl;
mouse_operation=mouse_x_drag_operation;
setCursor(Qt::SizeHorCursor);
}
else if (abs(dy)>DRAG_INIT_DISTANCE)
{
- if (MusEGlobal::debugMsg) cout << "mouse-operation is now PITCH" << endl;
+ if (debugMsg) cout << "mouse-operation is now PITCH" << endl;
mouse_operation=PITCH;
setCursor(Qt::SizeVerCursor);
}
@@ -3894,7 +3889,7 @@ void ScoreCanvas::mouseMoveEvent (QMouseEvent* event)
break;
case PITCH:
- if (MusEGlobal::heavyDebugMsg) cout << "trying to change pitch, delta="<<-nearbyint((float)dy/PITCH_DELTA)<<endl;
+ if (heavyDebugMsg) cout << "trying to change pitch, delta="<<-nearbyint((float)dy/PITCH_DELTA)<<endl;
new_pitch=original_dragged_event.pitch() - nearbyint((float)dy/PITCH_DELTA);
if (new_pitch < 0) new_pitch=0;
@@ -3902,7 +3897,7 @@ void ScoreCanvas::mouseMoveEvent (QMouseEvent* event)
if (new_pitch != old_pitch)
{
- if (MusEGlobal::debugMsg) cout << "changing pitch, delta="<<new_pitch-original_dragged_event.pitch()<<endl;
+ if (debugMsg) cout << "changing pitch, delta="<<new_pitch-original_dragged_event.pitch()<<endl;
if (undo_started) song->undo();
undo_started=transpose_notes(part_to_set(dragged_event_part),1, new_pitch-original_dragged_event.pitch());
old_pitch=new_pitch;
@@ -3920,7 +3915,7 @@ void ScoreCanvas::mouseMoveEvent (QMouseEvent* event)
else
{
dest_tick=0;
- if (MusEGlobal::debugMsg) cout << "not moving note before begin of part; setting it directly to the begin" << endl;
+ if (debugMsg) cout << "not moving note before begin of part; setting it directly to the begin" << endl;
}
if (dest_tick != old_dest_tick)
@@ -3946,21 +3941,21 @@ void ScoreCanvas::mouseMoveEvent (QMouseEvent* event)
else
{
tmp.setLenTick(0);
- if (MusEGlobal::debugMsg) cout << "not setting len to a negative value. using 0 instead" << endl;
+ if (debugMsg) cout << "not setting len to a negative value. using 0 instead" << endl;
}
unsigned newpartlen=dragged_event_part->lenTick();
if (tmp.endTick() > dragged_event_part->lenTick())
{
- if (dragged_event_part->hasHiddenEvents()) // do not allow autoexpand
+ if (dragged_event_part->hasHiddenEvents()) // do not allow autoexpand
{
tmp.setLenTick(dragged_event_part->lenTick() - tmp.tick());
- if (MusEGlobal::debugMsg) cout << "resized note would exceed its part; limiting length to " << tmp.lenTick() << endl;
+ if (debugMsg) cout << "resized note would exceed its part; limiting length to " << tmp.lenTick() << endl;
}
else
{
newpartlen=tmp.endTick();
- if (MusEGlobal::debugMsg) cout << "resized note would exceeds its part; expanding the part..." << endl;
+ if (debugMsg) cout << "resized note would exceeds its part; expanding the part..." << endl;
}
}
@@ -4067,14 +4062,14 @@ void ScoreCanvas::heartbeat_timer_event()
void ScoreCanvas::x_scroll_event(int x)
{
- if (MusEGlobal::debugMsg) cout << "SCROLL EVENT: x="<<x<<endl;
+ if (debugMsg) cout << "SCROLL EVENT: x="<<x<<endl;
x_pos=x;
redraw();
}
void ScoreCanvas::y_scroll_event(int y)
{
- if (MusEGlobal::debugMsg) cout << "SCROLL EVENT: y="<<y<<endl;
+ if (debugMsg) cout << "SCROLL EVENT: y="<<y<<endl;
y_pos=y;
redraw();
}
@@ -4278,7 +4273,7 @@ void ScoreCanvas::set_quant(int val)
void ScoreCanvas::set_pixels_per_whole(int val)
{
- if (MusEGlobal::debugMsg) cout << "setting px per whole to " << val << endl;
+ if (debugMsg) cout << "setting px per whole to " << val << endl;
int tick;
int old_xpos=x_pos;
@@ -4300,7 +4295,7 @@ void ScoreCanvas::set_pixels_per_whole(int val)
if (old_xpos!=0)
{
x_pos=tick_to_x(tick);
- if (MusEGlobal::debugMsg) cout << "x_pos was not zero, readjusting to " << x_pos << endl;
+ if (debugMsg) cout << "x_pos was not zero, readjusting to " << x_pos << endl;
emit xscroll_changed(x_pos);
}
@@ -4438,10 +4433,10 @@ void ScoreCanvas::midi_note(int pitch, int velo)
void ScoreCanvas::update_parts()
{
if (selected_part!=NULL) //if it's null, let it be null
- selected_part=partFromSerialNumber(selected_part_index);
+ selected_part=MusEUtil::partFromSerialNumber(selected_part_index);
if (dragged_event_part!=NULL) //same thing here
- dragged_event_part=partFromSerialNumber(dragged_event_part_index);
+ dragged_event_part=MusEUtil::partFromSerialNumber(dragged_event_part_index);
for (list<staff_t>::iterator it=staves.begin(); it!=staves.end(); it++)
it->update_parts();
@@ -4452,7 +4447,7 @@ void staff_t::update_parts()
parts.clear();
for (set<int>::iterator it=part_indices.begin(); it!=part_indices.end(); it++)
- parts.insert(partFromSerialNumber(*it));
+ parts.insert(MusEUtil::partFromSerialNumber(*it));
}
void staff_t::update_part_indices()
@@ -4463,6 +4458,55 @@ void staff_t::update_part_indices()
part_indices.insert((*it)->sn());
}
+
+void ScoreEdit::keyPressEvent(QKeyEvent* event)
+{
+ int key = event->key();
+
+ if (key == Qt::Key_Escape)
+ {
+ close();
+ return;
+ }
+ else if (key == shortcuts[SHRT_TOOL_POINTER].key)
+ {
+ edit_tools->set(MusEWidget::PointerTool);
+ return;
+ }
+ else if (key == shortcuts[SHRT_TOOL_PENCIL].key)
+ {
+ edit_tools->set(MusEWidget::PencilTool);
+ return;
+ }
+ else if (key == shortcuts[SHRT_TOOL_RUBBER].key)
+ {
+ edit_tools->set(MusEWidget::RubberTool);
+ return;
+ }
+ else //Default:
+ {
+ event->ignore();
+ return;
+ }
+}
+
+
+void ScoreCanvas::add_new_parts(const std::map< Part*, std::set<Part*> >& param)
+{
+ for (list<staff_t>::iterator staff=staves.begin(); staff!=staves.end(); staff++)
+ {
+ for (std::map< Part*, set<Part*> >::const_iterator it = param.begin(); it!=param.end(); it++)
+ if (staff->parts.find(it->first)!=staff->parts.end())
+ staff->parts.insert(it->second.begin(), it->second.end());
+
+ //staff->cleanup_parts(); // don't cleanup here, because at this point, the parts may only exist
+ // in the operation group. cleanup could remove them immediately
+ staff->update_part_indices();
+ }
+
+ fully_recalculate();
+}
+
//the following assertions are made:
// pix_quarter.width() == pix_half.width()
@@ -4488,33 +4532,39 @@ void staff_t::update_part_indices()
* and both A and B get scheduled to be expanded (because we
* have one event from A and one event from B), this causes a bug,
* because after A (and B) got resized, the B-resize is invalid!
+ * o when changing toolbarstate when sharing and immediately after that
+ * changing "share" status, the changed state isn't stored
+ * ? pasting in editors sometimes fails oO? ( ERROR: reading eventlist
+ * from clipboard failed. ignoring this one... ) [ not reproducible ]
*
* CURRENT TODO
+ * ! o fix sigedit boxes (see also "important todo")
+ * o ticks-to-quarter spinboxes
+ * o newly created windows have to be focussed!
+ * o mirror most menus to an additional right-click context menu to avoid the long mouse pointer
+ * journey to the menu bar. try to find a way which does not involve duplicate code!
+ * o implement borland-style maximize: free windows do not cover the main menu, even when maximized
+ * o smart range selection: if range markers have been used recently (that is, a dialog with
+ * "range" setting, or they've been modified), default to "in range" or "selected in range"
+ *
+ * IMPORTANT TODO
+ * ! o fix sigedit boxes (see also "current todo")
+ * o add "dotted quarter" quantize option (for 6/8 beat)
+ *
+ * o rename stuff with F2 key
* o redo transport menu: offer "one beat" and "one bar" steps
* maybe also offer scrollbar
* o quick "set left/right marker", "select between markers"
* or even "set marker and select between immediately"
* o support partially selected parts. when moving, automatically split
*
- * o speed up structural operations
- * o maybe remove "insert empty measure"?
- * o structural OPs: don't erase note which begins at "end of cut"
- * o add "move other notes" or "overwrite notes" or "mix with notes" to paste
- *
- * IMPORTANT TODO
- * o add "dotted quarter" quantize option (for 6/8 beat)
- * o draw the edge of parts hiding notes "jagged" (hasHiddenEvents() is interesting for this) - Done. Tim.
* o shrink a part from its beginning as well! watch out for clones!
- * o insert empty measure should also work inside parts, that is,
- * move notes _within_ parts
*
* o canvas editor: create clone via "alt+drag" moves window instead
* o investigate with valgrind
* o controller view in score editor
- * o fix sigedit boxes
* o solo button
* o grand staff brace
- * o mastertrack editor: key-combobox is buggy
* o drum editor: channel-stuff
* o do partial recalculating; recalculating can take pretty long
* (0,5 sec) when displaying a whole song in scores
@@ -4537,7 +4587,6 @@ void staff_t::update_part_indices()
* keeping its own pos_add variable (which is only an optimisation)
* o support edge-scrolling when opening a lasso
* o save more configuration stuff (quant, color)
- * o drum list: scroll while dragging (not important due to "reorder list")
*
* really unimportant nice-to-haves
* o support in-song clef-changes
@@ -4545,7 +4594,7 @@ void staff_t::update_part_indices()
* o use timesig_t in all timesig-stuff
* o refuse to resize so that width gets smaller or equal than x_left
* o draw a margin around notes which are in a bright color
- * o support drum tracks (x-note-heads etc.)
+ * o support drum tracks in the score editor (x-note-heads etc.)
* o drum list: scroll while dragging: probably unneccessary with the "reorder list" function
*
*
@@ -4556,8 +4605,6 @@ void staff_t::update_part_indices()
*
* o process accurate timesignatures from muse's list (has to be implemented first in muse)
* ( (2+2+3)/4 or (3+2+2)/4 instead of 7/4 )
- * o maybe do expanding parts inside the msgChangeEvent or
- * msgNewEvent functions (see my e-mail)
*/
diff --git a/muse2/muse/midiedit/scoreedit.h b/muse2/muse/midiedit/scoreedit.h
index 4d553e82..709a26ee 100644
--- a/muse2/muse/midiedit/scoreedit.h
+++ b/muse2/muse/midiedit/scoreedit.h
@@ -79,7 +79,7 @@ enum {CMD_COLOR_BLACK, CMD_COLOR_VELO, CMD_COLOR_PART,
CMD_QUANTIZE, CMD_VELOCITY, CMD_CRESCENDO, CMD_NOTELEN, CMD_TRANSPOSE,
CMD_ERASE, CMD_MOVE, CMD_FIXED_LEN, CMD_DELETE_OVERLAPS, CMD_LEGATO,
- CMD_CUT, CMD_COPY, CMD_PASTE, CMD_DEL,
+ CMD_CUT, CMD_COPY, CMD_COPY_RANGE, CMD_PASTE, CMD_PASTE_DIALOG, CMD_DEL,
CMD_SELECT_ALL, CMD_SELECT_NONE, CMD_SELECT_INVERT,
CMD_SELECT_ILOOP, CMD_SELECT_OLOOP};
@@ -99,10 +99,6 @@ class ScoreEdit : public TopWin
Q_OBJECT
private:
virtual void closeEvent(QCloseEvent*);
- virtual void resizeEvent(QResizeEvent*);
- virtual void focusOutEvent(QFocusEvent*);
-
- void store_initial_state();
void init_name();
@@ -137,7 +133,9 @@ class ScoreEdit : public TopWin
QAction* cut_action;
QAction* copy_action;
+ QAction* copy_range_action;
QAction* paste_action;
+ QAction* paste_dialog_action;
QAction* del_action;
QAction* select_all_action;
@@ -168,14 +166,14 @@ class ScoreEdit : public TopWin
bool apply_velo;
static set<QString> names;
- static int width_init, height_init;
- static QByteArray default_toolbar_state;
QString name;
QSignalMapper* menu_mapper;
bool set_name(QString newname, bool emit_signal=true, bool emergency_name=false);
+
+ virtual void keyPressEvent(QKeyEvent*);
private slots:
void menu_command(int);
@@ -186,7 +184,7 @@ class ScoreEdit : public TopWin
void clipboard_changed();
signals:
- void deleted(unsigned long);
+ void deleted(TopWin*);
void name_changed();
void velo_changed(int);
void velo_off_changed(int);
@@ -765,6 +763,8 @@ class ScoreCanvas : public MusEWidget::View
void deselect_all();
void midi_note(int pitch, int velo);
+
+ void add_new_parts(const std::map< Part*, std::set<Part*> >&);
public slots:
void x_scroll_event(int);
diff --git a/muse2/muse/midieditor.cpp b/muse2/muse/midieditor.cpp
index 71d8e97f..d4a16eda 100644
--- a/muse2/muse/midieditor.cpp
+++ b/muse2/muse/midieditor.cpp
@@ -38,14 +38,14 @@
// MidiEditor
//---------------------------------------------------------
-MidiEditor::MidiEditor(int r, PartList* pl,
- QWidget* parent, const char* name) : TopWin(parent, name)
+MidiEditor::MidiEditor(ToplevelType t, int r, PartList* pl,
+ QWidget* parent, const char* name) : TopWin(t, parent, name)
{
setAttribute(Qt::WA_DeleteOnClose);
_pl = pl;
if (_pl)
for (iPart i = _pl->begin(); i != _pl->end(); ++i)
- _parts.push_back(i->second->sn());
+ _parts.insert(i->second->sn());
_raster = r;
canvas = 0;
wview = 0;
@@ -59,6 +59,8 @@ MidiEditor::MidiEditor(int r, PartList* pl,
mainGrid->setContentsMargins(0, 0, 0, 0);
mainGrid->setSpacing(0);
setCentralWidget(mainw);
+
+ connect(song, SIGNAL(newPartsCreated(const std::map< Part*, std::set<Part*> >&)), SLOT(addNewParts(const std::map< Part*, std::set<Part*> >&)));
}
//---------------------------------------------------------
@@ -68,7 +70,7 @@ MidiEditor::MidiEditor(int r, PartList* pl,
void MidiEditor::genPartlist()
{
_pl->clear();
- for (std::list<int>::iterator i = _parts.begin(); i != _parts.end(); ++i) {
+ for (std::set<int>::iterator i = _parts.begin(); i != _parts.end(); ++i) {
TrackList* tl = song->tracks();
for (iTrack it = tl->begin(); it != tl->end(); ++it) {
PartList* pl = (*it)->parts();
@@ -86,6 +88,17 @@ void MidiEditor::genPartlist()
}
//---------------------------------------------------------
+// addPart
+//---------------------------------------------------------
+
+void MidiEditor::addPart(Part* p)
+{
+ _pl->add(p);
+ _parts.insert(p->sn());
+}
+
+
+//---------------------------------------------------------
// MidiEditor
//---------------------------------------------------------
@@ -266,3 +279,14 @@ void MidiEditor::horizontalZoomOut()
hscroll->setMag(newmag);
}
+
+void MidiEditor::addNewParts(const std::map< Part*, std::set<Part*> >& param)
+{
+ using std::map;
+ using std::set;
+
+ for (map< Part*, set<Part*> >::const_iterator it = param.begin(); it!=param.end(); it++)
+ if (_pl->index(it->first) != -1)
+ for (set<Part*>::const_iterator it2=it->second.begin(); it2!=it->second.end(); it2++)
+ addPart(*it2);
+}
diff --git a/muse2/muse/midieditor.h b/muse2/muse/midieditor.h
index abfe8e8d..84597cd3 100644
--- a/muse2/muse/midieditor.h
+++ b/muse2/muse/midieditor.h
@@ -27,6 +27,9 @@
#include "al/sig.h"
#include "cobject.h"
+
+#include <set>
+
class QGridLayout;
class QWidget;
@@ -51,7 +54,7 @@ class MidiEditor : public TopWin {
Q_OBJECT
PartList* _pl;
- std::list<int> _parts;
+ std::set<int> _parts;
int _curDrumInstrument; // currently selected instrument if drum
// editor
protected:
@@ -70,6 +73,9 @@ class MidiEditor : public TopWin {
void writePartList(int, Xml&) const;
void genPartlist();
+ private slots:
+ void addNewParts(const std::map< Part*, std::set<Part*> >&);
+
public slots:
void songChanged(int type);
void setCurDrumInstrument(int instr);
@@ -81,7 +87,7 @@ class MidiEditor : public TopWin {
void curDrumInstrumentChanged(int);
public:
- MidiEditor(int, PartList*,
+ MidiEditor(ToplevelType t, int, PartList*,
QWidget* parent = 0, const char* name = 0);
~MidiEditor();
@@ -100,6 +106,7 @@ class MidiEditor : public TopWin {
Part* curCanvasPart();
WavePart* curWavePart();
void setCurCanvasPart(Part*);
+ void addPart(Part*);
};
#endif
diff --git a/muse2/muse/miditransform.cpp b/muse2/muse/miditransform.cpp
index 76a39306..8d25fdfc 100644
--- a/muse2/muse/miditransform.cpp
+++ b/muse2/muse/miditransform.cpp
@@ -1502,7 +1502,7 @@ void MidiTransformerDialog::selVal1aChanged(int val)
data->cmt->selVal1a = val;
if ((data->cmt->selEventOp != All)
&& (data->cmt->selType == Note)) {
- selVal1a->setSuffix(" - " + pitch2string(val));
+ selVal1a->setSuffix(" - " + MusEUtil::pitch2string(val));
}
else
{
@@ -1520,7 +1520,7 @@ void MidiTransformerDialog::selVal1bChanged(int val)
data->cmt->selVal1b = val;
if ((data->cmt->selEventOp != All)
&& (data->cmt->selType == Note)) {
- selVal1b->setSuffix(" - " + pitch2string(val));
+ selVal1b->setSuffix(" - " + MusEUtil::pitch2string(val));
}
else
{
@@ -1595,7 +1595,7 @@ void MidiTransformerDialog::procVal1aChanged(int val)
(data->cmt->procVal1 == Fix || data->cmt->procVal1 == ScaleMap || data->cmt->procVal1 == Dynamic ||
data->cmt->procVal1 == Random || data->cmt->procVal1 == Flip))
{
- procVal1a->setSuffix(" - " + pitch2string(val));
+ procVal1a->setSuffix(" - " + MusEUtil::pitch2string(val));
}
else
{
@@ -1617,7 +1617,7 @@ void MidiTransformerDialog::procVal1bChanged(int val)
(data->cmt->procVal1 == Fix || data->cmt->procVal1 == ScaleMap || data->cmt->procVal1 == Dynamic ||
data->cmt->procVal1 == Random || data->cmt->procVal1 == Flip))
{
- procVal1b->setSuffix(" - " + pitch2string(val));
+ procVal1b->setSuffix(" - " + MusEUtil::pitch2string(val));
}
else
{
diff --git a/muse2/muse/mixer/amixer.cpp b/muse2/muse/mixer/amixer.cpp
index 0aa246a2..e30524ae 100644
--- a/muse2/muse/mixer/amixer.cpp
+++ b/muse2/muse/mixer/amixer.cpp
@@ -35,6 +35,7 @@
#include <QAction>
#include "app.h"
+#include "helper.h"
#include "icons.h"
#include "amixer.h"
#include "song.h"
@@ -45,10 +46,6 @@
#include "gconfig.h"
#include "xml.h"
-namespace MusEApp {
-extern QActionGroup* populateAddTrack(QMenu* addTrack);
-}
-
#define __WIDTH_COMPENSATION 4
//typedef std::list<Strip*> StripList;
@@ -171,7 +168,8 @@ AudioMixerApp::AudioMixerApp(QWidget* parent, MusEConfig::MixerConfig* c)
setWindowIcon(*museIcon);
QMenu* menuConfig = menuBar()->addMenu(tr("&Create"));
- MusEApp::populateAddTrack(menuConfig);
+ MusEUtil::populateAddTrack(menuConfig);
+ connect(menuConfig, SIGNAL(triggered(QAction *)), song, SLOT(addNewTrack(QAction *)));
QMenu* menuView = menuBar()->addMenu(tr("&View"));
routingId = menuView->addAction(tr("Routing"), this, SLOT(toggleRouteDialog()));
@@ -255,6 +253,12 @@ bool AudioMixerApp::event(QEvent* event)
}
*/
+//void AudioMixerApp::addNewTrack(QAction* action)
+//{
+ //song->addNewTrack(action, MusEGlobal::muse->arranger()->curTrack()); // Insert at current selected track.
+// song->addNewTrack(action); // Add at end.
+//}
+
void AudioMixerApp::setSizing()
{
int w = 0;
diff --git a/muse2/muse/mixer/amixer.h b/muse2/muse/mixer/amixer.h
index 1726ba7b..41f1e5e1 100644
--- a/muse2/muse/mixer/amixer.h
+++ b/muse2/muse/mixer/amixer.h
@@ -122,6 +122,7 @@ class AudioMixerApp : public QMainWindow {
void songChanged(int);
//void configChanged() { songChanged(-1); }
void configChanged();
+ //void addNewTrack(QAction*);
void setSizing();
void toggleRouteDialog();
void routingDialogClosed();
diff --git a/muse2/muse/mpevent.cpp b/muse2/muse/mpevent.cpp
index 11c85704..67ba968c 100644
--- a/muse2/muse/mpevent.cpp
+++ b/muse2/muse/mpevent.cpp
@@ -88,7 +88,7 @@ void MEvent::dump() const
{
printf("time:%d port:%d chan:%d ", _time, _port, _channel+1);
if (_type == 0x90) { // NoteOn
- QString s = pitch2string(_a);
+ QString s = MusEUtil::pitch2string(_a);
printf("NoteOn %s(0x%x) %d\n", s.toLatin1().constData(), _a, _b);
}
else if (_type == 0xf0) {
diff --git a/muse2/muse/mplugins/midiitransform.cpp b/muse2/muse/mplugins/midiitransform.cpp
index 8cc881ff..b5b4d3c8 100644
--- a/muse2/muse/mplugins/midiitransform.cpp
+++ b/muse2/muse/mplugins/midiitransform.cpp
@@ -1273,7 +1273,7 @@ void MidiInputTransformDialog::selVal1aChanged(int val)
cmt->selVal1a = val;
if ((cmt->selEventOp != All)
&& (cmt->selType == MIDITRANSFORM_NOTE)) {
- selVal1a->setSuffix(" - " + pitch2string(val));
+ selVal1a->setSuffix(" - " + MusEUtil::pitch2string(val));
}
else
{
@@ -1291,7 +1291,7 @@ void MidiInputTransformDialog::selVal1bChanged(int val)
cmt->selVal1b = val;
if ((cmt->selEventOp != All)
&& (cmt->selType == MIDITRANSFORM_NOTE)) {
- selVal1b->setSuffix(" - " + pitch2string(val));
+ selVal1b->setSuffix(" - " + MusEUtil::pitch2string(val));
}
else
{
@@ -1330,7 +1330,7 @@ void MidiInputTransformDialog::procVal1aChanged(int val)
(cmt->procVal1 == Fix || cmt->procVal1 == ScaleMap || cmt->procVal1 == Dynamic ||
cmt->procVal1 == Random || cmt->procVal1 == Flip))
{
- procVal1a->setSuffix(" - " + pitch2string(val));
+ procVal1a->setSuffix(" - " + MusEUtil::pitch2string(val));
}
else
{
@@ -1351,7 +1351,7 @@ void MidiInputTransformDialog::procVal1bChanged(int val)
(cmt->procVal1 == Fix || cmt->procVal1 == ScaleMap || cmt->procVal1 == Dynamic ||
cmt->procVal1 == Random || cmt->procVal1 == Flip))
{
- procVal1b->setSuffix(" - " + pitch2string(val));
+ procVal1b->setSuffix(" - " + MusEUtil::pitch2string(val));
}
else
{
diff --git a/muse2/muse/muse.log b/muse2/muse/muse.log
deleted file mode 100644
index 887f40d5..00000000
--- a/muse2/muse/muse.log
+++ /dev/null
@@ -1,1875 +0,0 @@
-
-*** Beginning merge of project muse
-
-User: ws
-Date: Mon, 11 Aug 2003 15:03:52 +0200
-Common version: 0.2
-Selected version: 0.4
-Working version: 0.2(w)
-
-*** Action on file `m4/alsa.m4'
-No prompt for file `m4/alsa.m4'
-
-*** Action on file `m4/docbook.m4'
-No prompt for file `m4/docbook.m4'
-
-*** Action on file `m4/Makefile.am'
-No prompt for file `m4/Makefile.am'
-
-*** Action on file `m4/aclocal-include.m4'
-No prompt for file `m4/aclocal-include.m4'
-
-*** Action on file `m4/qt.m4'
-No prompt for file `m4/qt.m4'
-
-*** Action on file [symlink:COPYING]
-No prompt for file [symlink:COPYING]
-
-*** Action on file [symlink:INSTALL]
-No prompt for file [symlink:INSTALL]
-
-*** Action on file [symlink:depcomp]
-No prompt for file [symlink:depcomp]
-
-*** Action on file [symlink:mkinstalldirs]
-No prompt for file [symlink:mkinstalldirs]
-
-*** Action on file [symlink:missing]
-No prompt for file [symlink:missing]
-
-*** Action on file [symlink:config.sub]
-No prompt for file [symlink:config.sub]
-
-*** Action on file [symlink:install-sh]
-No prompt for file [symlink:install-sh]
-
-*** Action on file [symlink:config.guess]
-No prompt for file [symlink:config.guess]
-
-*** Action on file [symlink:ltmain.sh]
-No prompt for file [symlink:ltmain.sh]
-
-*** Action on file `configure.ac'
-No prompt for file `configure.ac'
-
-*** Action on file `Doxyfile.in'
-No prompt for file `Doxyfile.in'
-
-*** Action on file `common.am'
-No prompt for file `common.am'
-
-*** Action on file `aclocal.m4'
-No prompt for file `aclocal.m4'
-
-*** Action on file `ChangeLog'
-No prompt for file `ChangeLog'
-
-*** Action on file `README.ladspaguis'
-No prompt for file `README.ladspaguis'
-
-*** Action on file `README.instruments'
-No prompt for file `README.instruments'
-
-*** Action on file `README.translate'
-No prompt for file `README.translate'
-
-*** Action on file `README'
-No prompt for file `README'
-
-*** Action on file `README.de'
-No prompt for file `README.de'
-
-*** Action on file `AUTHORS'
-No prompt for file `AUTHORS'
-
-*** Action on file `README.shortcuts'
-No prompt for file `README.shortcuts'
-
-*** Action on file `README.CVS'
-No prompt for file `README.CVS'
-
-*** Action on file `NEWS'
-No prompt for file `NEWS'
-
-*** Action on file `README.softsynth'
-No prompt for file `README.softsynth'
-
-*** Action on file `SECURITY'
-No prompt for file `SECURITY'
-
-*** Action on file `.cvsignore'
-No prompt for file `.cvsignore'
-
-*** Action on file `Makefile.am'
-No prompt for file `Makefile.am'
-
-*** Action on file `pos.h'
-No prompt for file `pos.h'
-
-*** Action on file `mtc.h'
-No prompt for file `mtc.h'
-
-*** Action on file `cfprint.cpp'
-No prompt for file `cfprint.cpp'
-
-*** Action on file `key.h'
-No prompt for file `key.h'
-
-*** Action on file `app.h'
-No prompt for file `app.h'
-
-*** Action on file `song.cpp'
-No prompt for file `song.cpp'
-
-*** Action on file `key.cpp'
-No prompt for file `key.cpp'
-
-*** Action on file `memory.cpp'
-No prompt for file `memory.cpp'
-
-*** Action on file `midiport.h'
-No prompt for file `midiport.h'
-
-*** Action on file `xml.cpp'
-No prompt for file `xml.cpp'
-
-*** Action on file `undo.cpp'
-No prompt for file `undo.cpp'
-
-*** Action on file `debug.h'
-No prompt for file `debug.h'
-
-*** Action on file `app.cpp'
-No prompt for file `app.cpp'
-
-*** Action on file `thread.h'
-No prompt for file `thread.h'
-
-*** Action on file `icons.h'
-No prompt for file `icons.h'
-
-*** Action on file `midithread.cpp'
-Copied working file `midithread.cpp' to `obsolete/midithread.cpp.v0'
-Merge file `midithread.cpp' by rule 2
-
-*** Action on file `device.h'
-No prompt for file `device.h'
-
-*** Action on file `icons.cpp'
-No prompt for file `icons.cpp'
-
-*** Action on file `wave.h'
-No prompt for file `wave.h'
-
-*** Action on file `ladspa.h'
-No prompt for file `ladspa.h'
-
-*** Action on file `undo.h'
-No prompt for file `undo.h'
-
-*** Action on file `sync.h'
-No prompt for file `sync.h'
-
-*** Action on file `song.h'
-No prompt for file `song.h'
-
-*** Action on file `value.cpp'
-No prompt for file `value.cpp'
-
-*** Action on file `midiport.cpp'
-No prompt for file `midiport.cpp'
-
-*** Action on file `givertcap.c'
-No prompt for file `givertcap.c'
-
-*** Action on file `value.h'
-No prompt for file `value.h'
-
-*** Action on file `part.h'
-No prompt for file `part.h'
-
-*** Action on file `node.h'
-No prompt for file `node.h'
-
-*** Action on file `cobject.cpp'
-No prompt for file `cobject.cpp'
-
-*** Action on file `midithread.h'
-No prompt for file `midithread.h'
-
-*** Action on file `tempo.cpp'
-No prompt for file `tempo.cpp'
-
-*** Action on file `memory.h'
-Copied working file `memory.h' to `obsolete/memory.h.v0'
-Merge file `memory.h' by rule 2, conflicts created
-
-*** Action on file `help.cpp'
-No prompt for file `help.cpp'
-
-*** Action on file `audiomix.h'
-No prompt for file `audiomix.h'
-
-*** Action on file `thread.cpp'
-No prompt for file `thread.cpp'
-
-*** Action on file `mrecord.cpp'
-No prompt for file `mrecord.cpp'
-
-*** Action on file `globals.cpp'
-No prompt for file `globals.cpp'
-
-*** Action on file `pos.cpp'
-No prompt for file `pos.cpp'
-
-*** Action on file `track.cpp'
-No prompt for file `track.cpp'
-
-*** Action on file `midictrl.h'
-No prompt for file `midictrl.h'
-
-*** Action on file `node.cpp'
-No prompt for file `node.cpp'
-
-*** Action on file `audiomix.cpp'
-No prompt for file `audiomix.cpp'
-
-*** Action on file `transport.h'
-No prompt for file `transport.h'
-
-*** Action on file `transpose.h'
-No prompt for file `transpose.h'
-
-*** Action on file `seqmsg.cpp'
-No prompt for file `seqmsg.cpp'
-
-*** Action on file `audionode.h'
-No prompt for file `audionode.h'
-
-*** Action on file `audio.h'
-No prompt for file `audio.h'
-
-*** Action on file `grepmidi.cpp'
-No prompt for file `grepmidi.cpp'
-
-*** Action on file `globals.h'
-No prompt for file `globals.h'
-
-*** Action on file `midieditor.cpp'
-No prompt for file `midieditor.cpp'
-
-*** Action on file `wave.cpp'
-No prompt for file `wave.cpp'
-
-*** Action on file `midi.h'
-No prompt for file `midi.h'
-
-*** Action on file `mess.h'
-No prompt for file `mess.h'
-
-*** Action on file `sync.cpp'
-No prompt for file `sync.cpp'
-
-*** Action on file `config.h.in'
-No prompt for file `config.h.in'
-
-*** Action on file `track.h'
-No prompt for file `track.h'
-
-*** Action on file `mtc.cpp'
-No prompt for file `mtc.cpp'
-
-*** Action on file `minstrument.h'
-No prompt for file `minstrument.h'
-
-*** Action on file `cobject.h'
-No prompt for file `cobject.h'
-
-*** Action on file `synth.h'
-No prompt for file `synth.h'
-
-*** Action on file `songfile.cpp'
-No prompt for file `songfile.cpp'
-
-*** Action on file `midictrl.cpp'
-No prompt for file `midictrl.cpp'
-
-*** Action on file `mpevent.h'
-No prompt for file `mpevent.h'
-
-*** Action on file `font.h'
-No prompt for file `font.h'
-
-*** Action on file `conf.cpp'
-No prompt for file `conf.cpp'
-
-*** Action on file `conf.h'
-No prompt for file `conf.h'
-
-*** Action on file `event.cpp'
-No prompt for file `event.cpp'
-
-*** Action on file `midi.cpp'
-No prompt for file `midi.cpp'
-
-*** Action on file `event.h'
-No prompt for file `event.h'
-
-*** Action on file `audioprefetch.h'
-No prompt for file `audioprefetch.h'
-
-*** Action on file `mpevent.cpp'
-No prompt for file `mpevent.cpp'
-
-*** Action on file `appearance.cpp'
-No prompt for file `appearance.cpp'
-
-*** Action on file `autogen.sh'
-No prompt for file `autogen.sh'
-
-*** Action on file `tempo.h'
-No prompt for file `tempo.h'
-
-*** Action on file `muse.pro'
-No prompt for file `muse.pro'
-
-*** Action on file `part.cpp'
-No prompt for file `part.cpp'
-
-*** Action on file `make.inc'
-No prompt for file `make.inc'
-
-*** Action on file `confmport.h'
-No prompt for file `confmport.h'
-
-*** Action on file `audio.cpp'
-No prompt for file `audio.cpp'
-
-*** Action on file `confmport.cpp'
-No prompt for file `confmport.cpp'
-
-*** Action on file `cfprint.h'
-No prompt for file `cfprint.h'
-
-*** Action on file `sig.cpp'
-No prompt for file `sig.cpp'
-
-*** Action on file `font.cpp'
-No prompt for file `font.cpp'
-
-*** Action on file `midieditor.h'
-No prompt for file `midieditor.h'
-
-*** Action on file `appearance.h'
-No prompt for file `appearance.h'
-
-*** Action on file `globaldefs.h'
-No prompt for file `globaldefs.h'
-
-*** Action on file `seq.cpp'
-No prompt for file `seq.cpp'
-
-*** Action on file `miditransform.cpp'
-No prompt for file `miditransform.cpp'
-
-*** Action on file `miditransform.h'
-No prompt for file `miditransform.h'
-
-*** Action on file `minstrument.cpp'
-Copied working file `minstrument.cpp' to `obsolete/minstrument.cpp.v0'
-Merge file `minstrument.cpp' by rule 2
-
-*** Action on file `audioprefetch.cpp'
-No prompt for file `audioprefetch.cpp'
-
-*** Action on file `transport.cpp'
-No prompt for file `transport.cpp'
-
-*** Action on file `transpose.cpp'
-No prompt for file `transpose.cpp'
-
-*** Action on file `xml.h'
-No prompt for file `xml.h'
-
-*** Action on file `sig.h'
-No prompt for file `sig.h'
-
-*** Action on file `seq.h'
-No prompt for file `seq.h'
-
-*** Action on file `demos/Makefile.am'
-No prompt for file `demos/Makefile.am'
-
-*** Action on file `demos/rasen.med'
-No prompt for file `demos/rasen.med'
-
-*** Action on file `widgets/.cvsignore'
-No prompt for file `widgets/.cvsignore'
-
-*** Action on file `widgets/mmath.cpp'
-No prompt for file `widgets/mmath.cpp'
-
-*** Action on file `widgets/dimap.cpp'
-No prompt for file `widgets/dimap.cpp'
-
-*** Action on file `widgets/utils.cpp'
-No prompt for file `widgets/utils.cpp'
-
-*** Action on file `widgets/sclif.cpp'
-No prompt for file `widgets/sclif.cpp'
-
-*** Action on file `widgets/filedialog.cpp'
-No prompt for file `widgets/filedialog.cpp'
-
-*** Action on file `widgets/citem.h'
-No prompt for file `widgets/citem.h'
-
-*** Action on file `widgets/bigtime.cpp'
-No prompt for file `widgets/bigtime.cpp'
-
-*** Action on file `widgets/view.cpp'
-No prompt for file `widgets/view.cpp'
-
-*** Action on file `widgets/scldraw.h'
-No prompt for file `widgets/scldraw.h'
-
-*** Action on file `widgets/sliderbase.h'
-No prompt for file `widgets/sliderbase.h'
-
-*** Action on file `widgets/hitscale.cpp'
-No prompt for file `widgets/hitscale.cpp'
-
-*** Action on file `widgets/itransformbase.ui'
-No prompt for file `widgets/itransformbase.ui'
-
-*** Action on file `widgets/header.cpp'
-No prompt for file `widgets/header.cpp'
-
-*** Action on file `widgets/tempolabel.h'
-No prompt for file `widgets/tempolabel.h'
-
-*** Action on file `widgets/velocity.cpp'
-No prompt for file `widgets/velocity.cpp'
-
-*** Action on file `widgets/midirawbase.ui'
-No prompt for file `widgets/midirawbase.ui'
-
-*** Action on file `widgets/drange.cpp'
-No prompt for file `widgets/drange.cpp'
-
-*** Action on file `widgets/header.h'
-No prompt for file `widgets/header.h'
-
-*** Action on file `widgets/mlabel.h'
-No prompt for file `widgets/mlabel.h'
-
-*** Action on file `widgets/spinboxFP.cpp'
-No prompt for file `widgets/spinboxFP.cpp'
-
-*** Action on file `widgets/mlabel.cpp'
-No prompt for file `widgets/mlabel.cpp'
-
-*** Action on file `widgets/metronome.cpp'
-No prompt for file `widgets/metronome.cpp'
-
-*** Action on file `widgets/ctrlcombo.cw'
-No prompt for file `widgets/ctrlcombo.cw'
-
-*** Action on file `widgets/sigedit.h'
-No prompt for file `widgets/sigedit.h'
-
-*** Action on file `widgets/intlabel.h'
-No prompt for file `widgets/intlabel.h'
-
-*** Action on file `widgets/comment.cpp'
-No prompt for file `widgets/comment.cpp'
-
-*** Action on file `widgets/ctrlcombo.cpp'
-No prompt for file `widgets/ctrlcombo.cpp'
-
-*** Action on file `widgets/mixdowndialog.cpp'
-No prompt for file `widgets/mixdowndialog.cpp'
-
-*** Action on file `widgets/fontsel.cpp'
-No prompt for file `widgets/fontsel.cpp'
-
-*** Action on file `widgets/hitscale.h'
-No prompt for file `widgets/hitscale.h'
-
-*** Action on file `widgets/posedit.cpp'
-No prompt for file `widgets/posedit.cpp'
-
-*** Action on file `widgets/audioconfbase.ui'
-No prompt for file `widgets/audioconfbase.ui'
-
-*** Action on file `widgets/utils.h'
-No prompt for file `widgets/utils.h'
-
-*** Action on file `widgets/splitter.cpp'
-No prompt for file `widgets/splitter.cpp'
-
-*** Action on file `widgets/editctrl7dialogbase.ui'
-No prompt for file `widgets/editctrl7dialogbase.ui'
-
-*** Action on file `widgets/doublelabel.h'
-No prompt for file `widgets/doublelabel.h'
-
-*** Action on file `widgets/noteinfo.h'
-No prompt for file `widgets/noteinfo.h'
-
-*** Action on file `widgets/sigscale.h'
-No prompt for file `widgets/sigscale.h'
-
-*** Action on file `widgets/canvas.cpp'
-No prompt for file `widgets/canvas.cpp'
-
-*** Action on file `widgets/view.h'
-No prompt for file `widgets/view.h'
-
-*** Action on file `widgets/audioconf.h'
-No prompt for file `widgets/audioconf.h'
-
-*** Action on file `widgets/ccontrolbase.ui'
-No prompt for file `widgets/ccontrolbase.ui'
-
-*** Action on file `widgets/transposebase.ui'
-No prompt for file `widgets/transposebase.ui'
-
-*** Action on file `widgets/spinboxFP.h'
-No prompt for file `widgets/spinboxFP.h'
-
-*** Action on file `widgets/mtscale.h'
-No prompt for file `widgets/mtscale.h'
-
-*** Action on file `widgets/nentry.cpp'
-No prompt for file `widgets/nentry.cpp'
-
-*** Action on file `widgets/siglabel.h'
-No prompt for file `widgets/siglabel.h'
-
-*** Action on file `widgets/transformbase.ui'
-No prompt for file `widgets/transformbase.ui'
-
-*** Action on file `widgets/mittransposebase.ui'
-No prompt for file `widgets/mittransposebase.ui'
-
-*** Action on file `widgets/dentry.h'
-No prompt for file `widgets/dentry.h'
-
-*** Action on file `widgets/slider.h'
-No prompt for file `widgets/slider.h'
-
-*** Action on file `widgets/wtscale.cpp'
-No prompt for file `widgets/wtscale.cpp'
-
-*** Action on file `widgets/action.h'
-No prompt for file `widgets/action.h'
-
-*** Action on file `widgets/nentry.h'
-No prompt for file `widgets/nentry.h'
-
-*** Action on file `widgets/ttoolbar.h'
-No prompt for file `widgets/ttoolbar.h'
-
-*** Action on file `widgets/comboQuant.cpp'
-No prompt for file `widgets/comboQuant.cpp'
-
-*** Action on file `widgets/midisyncimpl.h'
-No prompt for file `widgets/midisyncimpl.h'
-
-*** Action on file `widgets/sliderbase.cpp'
-No prompt for file `widgets/sliderbase.cpp'
-
-*** Action on file `widgets/genset.cpp'
-No prompt for file `widgets/genset.cpp'
-
-*** Action on file `widgets/velocity.h'
-No prompt for file `widgets/velocity.h'
-
-*** Action on file `widgets/poslabel.h'
-No prompt for file `widgets/poslabel.h'
-
-*** Action on file `widgets/knob.h'
-No prompt for file `widgets/knob.h'
-
-*** Action on file `widgets/cliplisteditorbase.ui'
-No prompt for file `widgets/cliplisteditorbase.ui'
-
-*** Action on file `widgets/splitter.h'
-No prompt for file `widgets/splitter.h'
-
-*** Action on file `widgets/sigedit.cpp'
-No prompt for file `widgets/sigedit.cpp'
-
-*** Action on file `widgets/audioconf.cpp'
-No prompt for file `widgets/audioconf.cpp'
-
-*** Action on file `widgets/swidget.h'
-No prompt for file `widgets/swidget.h'
-
-*** Action on file `widgets/tools.h'
-No prompt for file `widgets/tools.h'
-
-*** Action on file `widgets/pitchlabel.h'
-No prompt for file `widgets/pitchlabel.h'
-
-*** Action on file `widgets/Makefile.am'
-No prompt for file `widgets/Makefile.am'
-
-*** Action on file `widgets/moc_ttoolbar.cpp'
-No prompt for file `widgets/moc_ttoolbar.cpp'
-
-*** Action on file `widgets/intlabel.cpp'
-No prompt for file `widgets/intlabel.cpp'
-
-*** Action on file `widgets/citem.cpp'
-No prompt for file `widgets/citem.cpp'
-
-*** Action on file `widgets/canvas.h'
-No prompt for file `widgets/canvas.h'
-
-*** Action on file `widgets/doublelabel.cpp'
-No prompt for file `widgets/doublelabel.cpp'
-
-*** Action on file `widgets/slider.cpp'
-No prompt for file `widgets/slider.cpp'
-
-*** Action on file `widgets/mmath.h'
-No prompt for file `widgets/mmath.h'
-
-*** Action on file `widgets/wtscale.h'
-No prompt for file `widgets/wtscale.h'
-
-*** Action on file `widgets/genset.h'
-No prompt for file `widgets/genset.h'
-
-*** Action on file `widgets/posedit.h'
-No prompt for file `widgets/posedit.h'
-
-*** Action on file `widgets/velocitybase.ui'
-No prompt for file `widgets/velocitybase.ui'
-
-*** Action on file `widgets/ttoolbar.cpp'
-No prompt for file `widgets/ttoolbar.cpp'
-
-*** Action on file `widgets/scrollscale.cpp'
-No prompt for file `widgets/scrollscale.cpp'
-
-*** Action on file `widgets/mtscale.cpp'
-No prompt for file `widgets/mtscale.cpp'
-
-*** Action on file `widgets/noteinfo.cpp'
-No prompt for file `widgets/noteinfo.cpp'
-
-*** Action on file `widgets/lcombo.cpp'
-No prompt for file `widgets/lcombo.cpp'
-
-*** Action on file `widgets/appearancebase.ui'
-No prompt for file `widgets/appearancebase.ui'
-
-*** Action on file `widgets/vscale.h'
-No prompt for file `widgets/vscale.h'
-
-*** Action on file `widgets/scldiv.h'
-No prompt for file `widgets/scldiv.h'
-
-*** Action on file `widgets/drange.h'
-No prompt for file `widgets/drange.h'
-
-*** Action on file `widgets/midisync.ui'
-No prompt for file `widgets/midisync.ui'
-
-*** Action on file `widgets/wtrackinfobase.ui'
-No prompt for file `widgets/wtrackinfobase.ui'
-
-*** Action on file `widgets/vscale.cpp'
-No prompt for file `widgets/vscale.cpp'
-
-*** Action on file `widgets/editsysexdialogbase.ui'
-No prompt for file `widgets/editsysexdialogbase.ui'
-
-*** Action on file `widgets/gatetimebase.ui'
-No prompt for file `widgets/gatetimebase.ui'
-
-*** Action on file `widgets/editmetadialogbase.ui'
-No prompt for file `widgets/editmetadialogbase.ui'
-
-*** Action on file `widgets/sigscale.cpp'
-No prompt for file `widgets/sigscale.cpp'
-
-*** Action on file `widgets/mtrackinfobase.ui'
-No prompt for file `widgets/mtrackinfobase.ui'
-
-*** Action on file `widgets/metronome.h'
-No prompt for file `widgets/metronome.h'
-
-*** Action on file `widgets/gatetime.cpp'
-No prompt for file `widgets/gatetime.cpp'
-
-*** Action on file `widgets/tb1.cpp'
-No prompt for file `widgets/tb1.cpp'
-
-*** Action on file `widgets/gensetbase.ui'
-No prompt for file `widgets/gensetbase.ui'
-
-*** Action on file `widgets/scldraw.cpp'
-No prompt for file `widgets/scldraw.cpp'
-
-*** Action on file `widgets/bigtime.h'
-No prompt for file `widgets/bigtime.h'
-
-*** Action on file `widgets/poslabel.cpp'
-No prompt for file `widgets/poslabel.cpp'
-
-*** Action on file `widgets/metronomebase.ui'
-No prompt for file `widgets/metronomebase.ui'
-
-*** Action on file `widgets/scrollscale.h'
-No prompt for file `widgets/scrollscale.h'
-
-*** Action on file `widgets/fdialogbuttons.ui'
-No prompt for file `widgets/fdialogbuttons.ui'
-
-*** Action on file `widgets/sclif.h'
-No prompt for file `widgets/sclif.h'
-
-*** Action on file `widgets/tools.cpp'
-No prompt for file `widgets/tools.cpp'
-
-*** Action on file `widgets/filedialog.h'
-No prompt for file `widgets/filedialog.h'
-
-*** Action on file `widgets/pitchlabel.cpp'
-No prompt for file `widgets/pitchlabel.cpp'
-
-*** Action on file `widgets/scldiv.cpp'
-No prompt for file `widgets/scldiv.cpp'
-
-*** Action on file `widgets/musewidgetsplug.cpp'
-No prompt for file `widgets/musewidgetsplug.cpp'
-
-*** Action on file `widgets/midisyncimpl.cpp'
-No prompt for file `widgets/midisyncimpl.cpp'
-
-*** Action on file `widgets/commentbase.ui'
-No prompt for file `widgets/commentbase.ui'
-
-*** Action on file `widgets/dentry.cpp'
-No prompt for file `widgets/dentry.cpp'
-
-*** Action on file `widgets/comment.h'
-No prompt for file `widgets/comment.h'
-
-*** Action on file `widgets/ctrlcombo.h'
-No prompt for file `widgets/ctrlcombo.h'
-
-*** Action on file `widgets/comboQuant.h'
-No prompt for file `widgets/comboQuant.h'
-
-*** Action on file `widgets/gatetime.h'
-No prompt for file `widgets/gatetime.h'
-
-*** Action on file `widgets/tb1.h'
-No prompt for file `widgets/tb1.h'
-
-*** Action on file `widgets/editnotedialogbase.ui'
-No prompt for file `widgets/editnotedialogbase.ui'
-
-*** Action on file `widgets/pitchedit.h'
-No prompt for file `widgets/pitchedit.h'
-
-*** Action on file `widgets/lcombo.h'
-No prompt for file `widgets/lcombo.h'
-
-*** Action on file `widgets/fontsel.h'
-No prompt for file `widgets/fontsel.h'
-
-*** Action on file `widgets/tempolabel.cpp'
-No prompt for file `widgets/tempolabel.cpp'
-
-*** Action on file `widgets/knob.cpp'
-No prompt for file `widgets/knob.cpp'
-
-*** Action on file `widgets/dimap.h'
-No prompt for file `widgets/dimap.h'
-
-*** Action on file `widgets/pitchedit.cpp'
-No prompt for file `widgets/pitchedit.cpp'
-
-*** Action on file `widgets/siglabel.cpp'
-No prompt for file `widgets/siglabel.cpp'
-
-*** Action on file `widgets/mixdowndialog.h'
-No prompt for file `widgets/mixdowndialog.h'
-
-*** Action on file `widgets/mixdowndialogbase.ui'
-No prompt for file `widgets/mixdowndialogbase.ui'
-
-*** Action on file `widgets/synthconfigbase.ui'
-No prompt for file `widgets/synthconfigbase.ui'
-
-*** Action on file `widgets/swidget.cpp'
-No prompt for file `widgets/swidget.cpp'
-
-*** Action on file `widgets/section.h'
-No prompt for file `widgets/section.h'
-
-*** Action on file `arranger/pcanvas.h'
-No prompt for file `arranger/pcanvas.h'
-
-*** Action on file `arranger/alayout.h'
-No prompt for file `arranger/alayout.h'
-
-*** Action on file `arranger/tlist.cpp'
-No prompt for file `arranger/tlist.cpp'
-
-*** Action on file `arranger/arranger.h'
-No prompt for file `arranger/arranger.h'
-
-*** Action on file `arranger/alayout.cpp'
-No prompt for file `arranger/alayout.cpp'
-
-*** Action on file `arranger/Makefile.am'
-No prompt for file `arranger/Makefile.am'
-
-*** Action on file `arranger/tlist.h'
-No prompt for file `arranger/tlist.h'
-
-*** Action on file `arranger/pcanvas.cpp'
-No prompt for file `arranger/pcanvas.cpp'
-
-*** Action on file `arranger/arranger.cpp'
-No prompt for file `arranger/arranger.cpp'
-
-*** Action on file `mplugins/Makefile.am'
-No prompt for file `mplugins/Makefile.am'
-
-*** Action on file `mplugins/.cvsignore'
-No prompt for file `mplugins/.cvsignore'
-
-*** Action on file `mplugins/midifilterimpl.cpp'
-No prompt for file `mplugins/midifilterimpl.cpp'
-
-*** Action on file `mplugins/rhythm.cpp'
-No prompt for file `mplugins/rhythm.cpp'
-
-*** Action on file `mplugins/rhythmbase.ui'
-No prompt for file `mplugins/rhythmbase.ui'
-
-*** Action on file `mplugins/midifilter.ui'
-No prompt for file `mplugins/midifilter.ui'
-
-*** Action on file `mplugins/mitplugin.h'
-No prompt for file `mplugins/mitplugin.h'
-
-*** Action on file `mplugins/rhythm.h'
-No prompt for file `mplugins/rhythm.h'
-
-*** Action on file `mplugins/midiitransform.h'
-No prompt for file `mplugins/midiitransform.h'
-
-*** Action on file `mplugins/mittranspose.cpp'
-No prompt for file `mplugins/mittranspose.cpp'
-
-*** Action on file `mplugins/mrconfigbase.ui'
-No prompt for file `mplugins/mrconfigbase.ui'
-
-*** Action on file `mplugins/mrconfig.cpp'
-No prompt for file `mplugins/mrconfig.cpp'
-
-*** Action on file `mplugins/mrconfig.h'
-No prompt for file `mplugins/mrconfig.h'
-
-*** Action on file `mplugins/random.h'
-No prompt for file `mplugins/random.h'
-
-*** Action on file `mplugins/midiitransform.cpp'
-No prompt for file `mplugins/midiitransform.cpp'
-
-*** Action on file `mplugins/mittranspose.h'
-No prompt for file `mplugins/mittranspose.h'
-
-*** Action on file `mplugins/mitplugin.cpp'
-No prompt for file `mplugins/mitplugin.cpp'
-
-*** Action on file `mplugins/midifilterimpl.h'
-No prompt for file `mplugins/midifilterimpl.h'
-
-*** Action on file `mplugins/random.cpp'
-No prompt for file `mplugins/random.cpp'
-
-*** Action on file `waveedit/Makefile.am'
-No prompt for file `waveedit/Makefile.am'
-
-*** Action on file `waveedit/waveview.h'
-No prompt for file `waveedit/waveview.h'
-
-*** Action on file `waveedit/waveedit.cpp'
-No prompt for file `waveedit/waveedit.cpp'
-
-*** Action on file `waveedit/waveedit.h'
-No prompt for file `waveedit/waveedit.h'
-
-*** Action on file `waveedit/waveview.cpp'
-No prompt for file `waveedit/waveview.cpp'
-
-*** Action on file `master/masteredit.cpp'
-No prompt for file `master/masteredit.cpp'
-
-*** Action on file `master/lmaster.cpp'
-No prompt for file `master/lmaster.cpp'
-
-*** Action on file `master/tscale.cpp'
-No prompt for file `master/tscale.cpp'
-
-*** Action on file `master/Makefile.am'
-No prompt for file `master/Makefile.am'
-
-*** Action on file `master/master.h'
-No prompt for file `master/master.h'
-
-*** Action on file `master/masteredit.h'
-No prompt for file `master/masteredit.h'
-
-*** Action on file `master/lmaster.h'
-No prompt for file `master/lmaster.h'
-
-*** Action on file `master/tscale.h'
-No prompt for file `master/tscale.h'
-
-*** Action on file `master/master.cpp'
-No prompt for file `master/master.cpp'
-
-*** Action on file `marker/Makefile.am'
-No prompt for file `marker/Makefile.am'
-
-*** Action on file `marker/marker.h'
-No prompt for file `marker/marker.h'
-
-*** Action on file `marker/markerview.cpp'
-No prompt for file `marker/markerview.cpp'
-
-*** Action on file `marker/markerview.h'
-No prompt for file `marker/markerview.h'
-
-*** Action on file `marker/marker.cpp'
-No prompt for file `marker/marker.cpp'
-
-*** Action on file `driver/audiodev.h'
-No prompt for file `driver/audiodev.h'
-
-*** Action on file `driver/midiserial.h'
-No prompt for file `driver/midiserial.h'
-
-*** Action on file `driver/mididev.h'
-No prompt for file `driver/mididev.h'
-
-*** Action on file `driver/mididev.cpp'
-No prompt for file `driver/mididev.cpp'
-
-*** Action on file `driver/midirawin.h'
-No prompt for file `driver/midirawin.h'
-
-*** Action on file `driver/midirawdev.h'
-No prompt for file `driver/midirawdev.h'
-
-*** Action on file `driver/alsamidi.cpp'
-No prompt for file `driver/alsamidi.cpp'
-
-*** Action on file `driver/alsamidi.h'
-No prompt for file `driver/alsamidi.h'
-
-*** Action on file `driver/Makefile.am'
-No prompt for file `driver/Makefile.am'
-
-*** Action on file `driver/jack.cpp'
-No prompt for file `driver/jack.cpp'
-
-*** Action on file `driver/midirawin.cpp'
-No prompt for file `driver/midirawin.cpp'
-
-*** Action on file `driver/alsaaudio.h'
-No prompt for file `driver/alsaaudio.h'
-
-*** Action on file `driver/midiserial.cpp'
-No prompt for file `driver/midiserial.cpp'
-
-*** Action on file `driver/alsaaudio.cpp'
-No prompt for file `driver/alsaaudio.cpp'
-
-*** Action on file `driver/midirawdev.cpp'
-No prompt for file `driver/midirawdev.cpp'
-
-*** Action on file `driver/jackaudio.h'
-No prompt for file `driver/jackaudio.h'
-
-*** Action on file `driver/mess.cpp'
-No prompt for file `driver/mess.cpp'
-
-*** Action on file `midiedit/drummap.cpp'
-No prompt for file `midiedit/drummap.cpp'
-
-*** Action on file `midiedit/dcanvas.h'
-No prompt for file `midiedit/dcanvas.h'
-
-*** Action on file `midiedit/piano.h'
-No prompt for file `midiedit/piano.h'
-
-*** Action on file `midiedit/drummap.h'
-No prompt for file `midiedit/drummap.h'
-
-*** Action on file `midiedit/drumedit.h'
-No prompt for file `midiedit/drumedit.h'
-
-*** Action on file `midiedit/prcanvas.cpp'
-No prompt for file `midiedit/prcanvas.cpp'
-
-*** Action on file `midiedit/dcanvas.cpp'
-No prompt for file `midiedit/dcanvas.cpp'
-
-*** Action on file `midiedit/Makefile.am'
-No prompt for file `midiedit/Makefile.am'
-
-*** Action on file `midiedit/dlist.cpp'
-No prompt for file `midiedit/dlist.cpp'
-
-*** Action on file `midiedit/pianoroll.cpp'
-No prompt for file `midiedit/pianoroll.cpp'
-
-*** Action on file `midiedit/ecanvas.h'
-No prompt for file `midiedit/ecanvas.h'
-
-*** Action on file `midiedit/quantconfig.h'
-No prompt for file `midiedit/quantconfig.h'
-
-*** Action on file `midiedit/quantconfig.cpp'
-No prompt for file `midiedit/quantconfig.cpp'
-
-*** Action on file `midiedit/ecanvas.cpp'
-No prompt for file `midiedit/ecanvas.cpp'
-
-*** Action on file `midiedit/piano.cpp'
-No prompt for file `midiedit/piano.cpp'
-
-*** Action on file `midiedit/prcanvas.h'
-No prompt for file `midiedit/prcanvas.h'
-
-*** Action on file `midiedit/drumedit.cpp'
-No prompt for file `midiedit/drumedit.cpp'
-
-*** Action on file `midiedit/dlist.h'
-No prompt for file `midiedit/dlist.h'
-
-*** Action on file `midiedit/cmd.h'
-No prompt for file `midiedit/cmd.h'
-
-*** Action on file `midiedit/pianoroll.h'
-No prompt for file `midiedit/pianoroll.h'
-
-*** Action on file `patchbay/Makefile.am'
-No prompt for file `patchbay/Makefile.am'
-
-*** Action on file `patchbay/patchbay.cpp'
-No prompt for file `patchbay/patchbay.cpp'
-
-*** Action on file `patchbay/patchbaybase.ui'
-No prompt for file `patchbay/patchbaybase.ui'
-
-*** Action on file `patchbay/patchbay.h'
-No prompt for file `patchbay/patchbay.h'
-
-*** Action on file `synti/synth.cpp'
-No prompt for file `synti/synth.cpp'
-
-*** Action on file `synti/synthconfig.h'
-No prompt for file `synti/synthconfig.h'
-
-*** Action on file `synti/Makefile.am'
-No prompt for file `synti/Makefile.am'
-
-*** Action on file `synti/synti-install.am'
-No prompt for file `synti/synti-install.am'
-
-*** Action on file `synti/synthconfig.cpp'
-No prompt for file `synti/synthconfig.cpp'
-
-*** Action on file `synti/organ/.cvsignore'
-No prompt for file `synti/organ/.cvsignore'
-
-*** Action on file `synti/organ/organ.cpp'
-No prompt for file `synti/organ/organ.cpp'
-
-*** Action on file `synti/organ/organ.h'
-No prompt for file `synti/organ/organ.h'
-
-*** Action on file `synti/organ/organguibase.ui'
-No prompt for file `synti/organ/organguibase.ui'
-
-*** Action on file `synti/organ/Makefile.am'
-No prompt for file `synti/organ/Makefile.am'
-
-*** Action on file `synti/organ/organgui.h'
-No prompt for file `synti/organ/organgui.h'
-
-*** Action on file `synti/organ/fdialogbuttons.ui'
-No prompt for file `synti/organ/fdialogbuttons.ui'
-
-*** Action on file `synti/organ/organgui.cpp'
-No prompt for file `synti/organ/organgui.cpp'
-
-*** Action on file `synti/fluid/fluidgui.cpp'
-No prompt for file `synti/fluid/fluidgui.cpp'
-
-*** Action on file `synti/fluid/fluidguibase.ui'
-No prompt for file `synti/fluid/fluidguibase.ui'
-
-*** Action on file `synti/fluid/synth.cpp'
-No prompt for file `synti/fluid/synth.cpp'
-
-*** Action on file `synti/fluid/Makefile.am'
-No prompt for file `synti/fluid/Makefile.am'
-
-*** Action on file `synti/fluid/synth.h'
-No prompt for file `synti/fluid/synth.h'
-
-*** Action on file `synti/fluid/fluid.cpp'
-No prompt for file `synti/fluid/fluid.cpp'
-
-*** Action on file `synti/fluid/fluidgui.h'
-No prompt for file `synti/fluid/fluidgui.h'
-
-*** Action on file `synti/fluidsynth/fluidsynthgui.h'
-No prompt for file `synti/fluidsynth/fluidsynthgui.h'
-
-*** Action on file `synti/fluidsynth/fluidsynti.h'
-No prompt for file `synti/fluidsynth/fluidsynti.h'
-
-*** Action on file `synti/fluidsynth/fluidsynti.cpp'
-No prompt for file `synti/fluidsynth/fluidsynti.cpp'
-
-*** Action on file `synti/fluidsynth/fluidsynthguibase.ui'
-No prompt for file `synti/fluidsynth/fluidsynthguibase.ui'
-
-*** Action on file `synti/fluidsynth/Makefile.am'
-No prompt for file `synti/fluidsynth/Makefile.am'
-
-*** Action on file `synti/fluidsynth/fluidsynthgui.cpp'
-No prompt for file `synti/fluidsynth/fluidsynthgui.cpp'
-
-*** Action on file `synti/fluidsynth/TODO'
-No prompt for file `synti/fluidsynth/TODO'
-
-*** Action on file `synti/vam/vamgui.cpp'
-No prompt for file `synti/vam/vamgui.cpp'
-
-*** Action on file `synti/vam/COPYING'
-No prompt for file `synti/vam/COPYING'
-
-*** Action on file `synti/vam/ChangeLog'
-No prompt for file `synti/vam/ChangeLog'
-
-*** Action on file `synti/vam/vamgui.h'
-No prompt for file `synti/vam/vamgui.h'
-
-*** Action on file `synti/vam/vam.cpp'
-No prompt for file `synti/vam/vam.cpp'
-
-*** Action on file `synti/vam/Makefile.am'
-No prompt for file `synti/vam/Makefile.am'
-
-*** Action on file `synti/vam/fdialogbuttons.ui'
-No prompt for file `synti/vam/fdialogbuttons.ui'
-
-*** Action on file `synti/vam/README'
-No prompt for file `synti/vam/README'
-
-*** Action on file `synti/vam/vam.h'
-No prompt for file `synti/vam/vam.h'
-
-*** Action on file `synti/vam/vamguibase.ui'
-No prompt for file `synti/vam/vamguibase.ui'
-
-*** Action on file `synti/vam/TODO'
-No prompt for file `synti/vam/TODO'
-
-*** Action on file `synti/s1/s1.cpp'
-No prompt for file `synti/s1/s1.cpp'
-
-*** Action on file `synti/s1/Makefile.am'
-No prompt for file `synti/s1/Makefile.am'
-
-*** Action on file `share/Makefile.am'
-No prompt for file `share/Makefile.am'
-
-*** Action on file `share/plugins/1050.ui'
-No prompt for file `share/plugins/1050.ui'
-
-*** Action on file `share/plugins/Makefile.am'
-No prompt for file `share/plugins/Makefile.am'
-
-*** Action on file `share/instruments/Yamaha-P50m.idf'
-No prompt for file `share/instruments/Yamaha-P50m.idf'
-
-*** Action on file `share/instruments/ns5r.idf'
-No prompt for file `share/instruments/ns5r.idf'
-
-*** Action on file `share/instruments/Roland-XP30.idf'
-No prompt for file `share/instruments/Roland-XP30.idf'
-
-*** Action on file `share/instruments/MC303.idf'
-No prompt for file `share/instruments/MC303.idf'
-
-*** Action on file `share/instruments/Makefile.am'
-No prompt for file `share/instruments/Makefile.am'
-
-*** Action on file `share/instruments/gm.idf'
-No prompt for file `share/instruments/gm.idf'
-
-*** Action on file `share/instruments/Yamaha-S90.idf'
-No prompt for file `share/instruments/Yamaha-S90.idf'
-
-*** Action on file `share/instruments/AlesisQS6.idf'
-No prompt for file `share/instruments/AlesisQS6.idf'
-
-*** Action on file `share/drummaps/Makefile.am'
-No prompt for file `share/drummaps/Makefile.am'
-
-*** Action on file `share/drummaps/sc88-pc1.map'
-No prompt for file `share/drummaps/sc88-pc1.map'
-
-*** Action on file `share/locale/Makefile.am'
-No prompt for file `share/locale/Makefile.am'
-
-*** Action on file `share/locale/muse_sv_SE.ts'
-No prompt for file `share/locale/muse_sv_SE.ts'
-
-*** Action on file `share/locale/muse_ru.ts'
-No prompt for file `share/locale/muse_ru.ts'
-
-*** Action on file `share/locale/muse_fr.ts'
-No prompt for file `share/locale/muse_fr.ts'
-
-*** Action on file `share/locale/muse_es.ts'
-No prompt for file `share/locale/muse_es.ts'
-
-*** Action on file `share/locale/muse_de.ts'
-No prompt for file `share/locale/muse_de.ts'
-
-*** Action on file `share/locale/muse_sv_SE.qm'
-No prompt for file `share/locale/muse_sv_SE.qm'
-
-*** Action on file `share/locale/muse_ru.qm'
-No prompt for file `share/locale/muse_ru.qm'
-
-*** Action on file `share/locale/muse_fr.qm'
-No prompt for file `share/locale/muse_fr.qm'
-
-*** Action on file `share/locale/muse_es.qm'
-No prompt for file `share/locale/muse_es.qm'
-
-*** Action on file `share/locale/muse_de.qm'
-No prompt for file `share/locale/muse_de.qm'
-
-*** Action on file `share/wallpapers/paper1.jpg'
-No prompt for file `share/wallpapers/paper1.jpg'
-
-*** Action on file `share/wallpapers/Makefile.am'
-No prompt for file `share/wallpapers/Makefile.am'
-
-*** Action on file `share/wallpapers/gray_rock.gif'
-No prompt for file `share/wallpapers/gray_rock.gif'
-
-*** Action on file `share/wallpapers/gray.gif'
-No prompt for file `share/wallpapers/gray.gif'
-
-*** Action on file `share/wallpapers/gray_stucco.gif'
-No prompt for file `share/wallpapers/gray_stucco.gif'
-
-*** Action on file `share/wallpapers/stone1.gif'
-No prompt for file `share/wallpapers/stone1.gif'
-
-*** Action on file `share/html/invocation.html'
-No prompt for file `share/html/invocation.html'
-
-*** Action on file `share/html/left_pane.jpg'
-No prompt for file `share/html/left_pane.jpg'
-
-*** Action on file `share/html/styles.css'
-No prompt for file `share/html/styles.css'
-
-*** Action on file `share/html/button_bar.jpg'
-No prompt for file `share/html/button_bar.jpg'
-
-*** Action on file `share/html/COPYING.html'
-No prompt for file `share/html/COPYING.html'
-
-*** Action on file `share/html/main_window.jpg'
-No prompt for file `share/html/main_window.jpg'
-
-*** Action on file `share/html/toc_.txt'
-No prompt for file `share/html/toc_.txt'
-
-*** Action on file `share/html/Makefile.am'
-No prompt for file `share/html/Makefile.am'
-
-*** Action on file `share/html/track_info.jpg'
-No prompt for file `share/html/track_info.jpg'
-
-*** Action on file `share/html/getting_started.html'
-No prompt for file `share/html/getting_started.html'
-
-*** Action on file `share/html/index.html'
-No prompt for file `share/html/index.html'
-
-*** Action on file `share/html/window_ref.html'
-No prompt for file `share/html/window_ref.html'
-
-*** Action on file `share/html/installation.html'
-No prompt for file `share/html/installation.html'
-
-*** Action on file `share/html/main_window_track_info.jpg'
-No prompt for file `share/html/main_window_track_info.jpg'
-
-*** Action on file `share/html/right_pane.jpg'
-No prompt for file `share/html/right_pane.jpg'
-
-*** Action on file `score/Makefile.am'
-No prompt for file `score/Makefile.am'
-
-*** Action on file `score/ncanvas.cpp'
-No prompt for file `score/ncanvas.cpp'
-
-*** Action on file `score/print.cpp'
-No prompt for file `score/print.cpp'
-
-*** Action on file `score/print.h'
-No prompt for file `score/print.h'
-
-*** Action on file `score/layout.h'
-No prompt for file `score/layout.h'
-
-*** Action on file `score/items.h'
-No prompt for file `score/items.h'
-
-*** Action on file `score/papersize.cpp'
-No prompt for file `score/papersize.cpp'
-
-*** Action on file `score/symbols.cpp'
-No prompt for file `score/symbols.cpp'
-
-*** Action on file `score/layout.cpp'
-No prompt for file `score/layout.cpp'
-
-*** Action on file `score/glyphs.cpp'
-No prompt for file `score/glyphs.cpp'
-
-*** Action on file `score/papersize.h'
-No prompt for file `score/papersize.h'
-
-*** Action on file `score/palettes.h'
-No prompt for file `score/palettes.h'
-
-*** Action on file `score/glyphs.h'
-No prompt for file `score/glyphs.h'
-
-*** Action on file `score/ncanvas.h'
-No prompt for file `score/ncanvas.h'
-
-*** Action on file `score/score.doc'
-No prompt for file `score/score.doc'
-
-*** Action on file `score/score.cpp'
-No prompt for file `score/score.cpp'
-
-*** Action on file `score/items.cpp'
-No prompt for file `score/items.cpp'
-
-*** Action on file `score/sconfig.h'
-No prompt for file `score/sconfig.h'
-
-*** Action on file `score/symbols.h'
-No prompt for file `score/symbols.h'
-
-*** Action on file `score/font.cpp'
-No prompt for file `score/font.cpp'
-
-*** Action on file `score/sconfig.cpp'
-No prompt for file `score/sconfig.cpp'
-
-*** Action on file `score/score.h'
-No prompt for file `score/score.h'
-
-*** Action on file `score/palettes.cpp'
-No prompt for file `score/palettes.cpp'
-
-*** Action on file `score/quant.cpp'
-No prompt for file `score/quant.cpp'
-
-*** Action on file `score/quant.h'
-No prompt for file `score/quant.h'
-
-*** Action on file `score/note.cpp'
-No prompt for file `score/note.cpp'
-
-*** Action on file `mixer/Makefile.am'
-No prompt for file `mixer/Makefile.am'
-
-*** Action on file `mixer/amixer.h'
-No prompt for file `mixer/amixer.h'
-
-*** Action on file `mixer/meter.cpp'
-No prompt for file `mixer/meter.cpp'
-
-*** Action on file `mixer/mixer.cpp'
-No prompt for file `mixer/mixer.cpp'
-
-*** Action on file `mixer/routecombo.cpp'
-No prompt for file `mixer/routecombo.cpp'
-
-*** Action on file `mixer/volslider.h'
-No prompt for file `mixer/volslider.h'
-
-*** Action on file `mixer/rack.h'
-No prompt for file `mixer/rack.h'
-
-*** Action on file `mixer/mixer.h'
-No prompt for file `mixer/mixer.h'
-
-*** Action on file `mixer/panknob.h'
-No prompt for file `mixer/panknob.h'
-
-*** Action on file `mixer/panknob.cpp'
-No prompt for file `mixer/panknob.cpp'
-
-*** Action on file `mixer/amixer.cpp'
-No prompt for file `mixer/amixer.cpp'
-
-*** Action on file `mixer/meter.h'
-No prompt for file `mixer/meter.h'
-
-*** Action on file `mixer/rack.cpp'
-No prompt for file `mixer/rack.cpp'
-
-*** Action on file `mixer/routecombo.h'
-No prompt for file `mixer/routecombo.h'
-
-*** Action on file `mixer/audionodebutton.h'
-No prompt for file `mixer/audionodebutton.h'
-
-*** Action on file `mixer/dot.xpm'
-No prompt for file `mixer/dot.xpm'
-
-*** Action on file `mixer/volslider.cpp'
-No prompt for file `mixer/volslider.cpp'
-
-*** Action on file `mixer/audionodebutton.cpp'
-No prompt for file `mixer/audionodebutton.cpp'
-
-*** Action on file `liste/editevent.cpp'
-No prompt for file `liste/editevent.cpp'
-
-*** Action on file `liste/editevent.h'
-No prompt for file `liste/editevent.h'
-
-*** Action on file `liste/Makefile.am'
-No prompt for file `liste/Makefile.am'
-
-*** Action on file `liste/listedit.h'
-No prompt for file `liste/listedit.h'
-
-*** Action on file `liste/listedit.cpp'
-No prompt for file `liste/listedit.cpp'
-
-*** Action on file `ctrl/Makefile.am'
-No prompt for file `ctrl/Makefile.am'
-
-*** Action on file `ctrl/ctrlcanvas.cpp'
-No prompt for file `ctrl/ctrlcanvas.cpp'
-
-*** Action on file `ctrl/ctrlpanel.h'
-No prompt for file `ctrl/ctrlpanel.h'
-
-*** Action on file `ctrl/ctrlcanvas.h'
-No prompt for file `ctrl/ctrlcanvas.h'
-
-*** Action on file `ctrl/ctrledit.h'
-No prompt for file `ctrl/ctrledit.h'
-
-*** Action on file `ctrl/ctrledit.cpp'
-No prompt for file `ctrl/ctrledit.cpp'
-
-*** Action on file `ctrl/ctrlpanel.cpp'
-No prompt for file `ctrl/ctrlpanel.cpp'
-
-*** Action on file `xpm/darkreddot.xpm'
-No prompt for file `xpm/darkreddot.xpm'
-
-*** Action on file `xpm/editmuteS.xpm'
-No prompt for file `xpm/editmuteS.xpm'
-
-*** Action on file `xpm/midiin.xpm'
-No prompt for file `xpm/midiin.xpm'
-
-*** Action on file `xpm/editpasteS.xpm'
-No prompt for file `xpm/editpasteS.xpm'
-
-*** Action on file `xpm/pitch.xpm'
-No prompt for file `xpm/pitch.xpm'
-
-*** Action on file `xpm/italic.xpm'
-No prompt for file `xpm/italic.xpm'
-
-*** Action on file `xpm/redo.xpm'
-No prompt for file `xpm/redo.xpm'
-
-*** Action on file `xpm/filesaveS.xpm'
-No prompt for file `xpm/filesaveS.xpm'
-
-*** Action on file `xpm/scoreS.xpm'
-No prompt for file `xpm/scoreS.xpm'
-
-*** Action on file `xpm/exit.xpm'
-No prompt for file `xpm/exit.xpm'
-
-*** Action on file `xpm/rmark.xpm'
-No prompt for file `xpm/rmark.xpm'
-
-*** Action on file `xpm/frewind.xpm'
-No prompt for file `xpm/frewind.xpm'
-
-*** Action on file `xpm/stop.xpm'
-No prompt for file `xpm/stop.xpm'
-
-*** Action on file `xpm/graydot.xpm'
-No prompt for file `xpm/graydot.xpm'
-
-*** Action on file `xpm/loop.xpm'
-No prompt for file `xpm/loop.xpm'
-
-*** Action on file `xpm/steprec.xpm'
-No prompt for file `xpm/steprec.xpm'
-
-*** Action on file `xpm/recordoffbutton.xpm'
-No prompt for file `xpm/recordoffbutton.xpm'
-
-*** Action on file `xpm/filenewS.xpm'
-No prompt for file `xpm/filenewS.xpm'
-
-*** Action on file `xpm/bold.xpm'
-No prompt for file `xpm/bold.xpm'
-
-*** Action on file `xpm/fileopen.xpm'
-No prompt for file `xpm/fileopen.xpm'
-
-*** Action on file `xpm/editpaste.xpm'
-No prompt for file `xpm/editpaste.xpm'
-
-*** Action on file `xpm/speaker.xpm'
-No prompt for file `xpm/speaker.xpm'
-
-*** Action on file `xpm/delete.xpm'
-No prompt for file `xpm/delete.xpm'
-
-*** Action on file `xpm/pianoS.xpm'
-No prompt for file `xpm/pianoS.xpm'
-
-*** Action on file `xpm/start.xpm'
-No prompt for file `xpm/start.xpm'
-
-*** Action on file `xpm/punchin.xpm'
-No prompt for file `xpm/punchin.xpm'
-
-*** Action on file `xpm/fileprint.xpm'
-No prompt for file `xpm/fileprint.xpm'
-
-*** Action on file `xpm/editcopy.xpm'
-No prompt for file `xpm/editcopy.xpm'
-
-*** Action on file `xpm/play.xpm'
-No prompt for file `xpm/play.xpm'
-
-*** Action on file `xpm/filesaveasS.xpm'
-No prompt for file `xpm/filesaveasS.xpm'
-
-*** Action on file `xpm/stick.xpm'
-No prompt for file `xpm/stick.xpm'
-
-*** Action on file `xpm/fforward.xpm'
-No prompt for file `xpm/fforward.xpm'
-
-*** Action on file `xpm/lock.xpm'
-No prompt for file `xpm/lock.xpm'
-
-*** Action on file `xpm/back.xpm'
-No prompt for file `xpm/back.xpm'
-
-*** Action on file `xpm/up.xpm'
-No prompt for file `xpm/up.xpm'
-
-*** Action on file `xpm/cafter.xpm'
-No prompt for file `xpm/cafter.xpm'
-
-*** Action on file `xpm/recordonbutton.xpm'
-No prompt for file `xpm/recordonbutton.xpm'
-
-*** Action on file `xpm/flag.xpm'
-No prompt for file `xpm/flag.xpm'
-
-*** Action on file `xpm/off.xpm'
-No prompt for file `xpm/off.xpm'
-
-*** Action on file `xpm/editcutS.xpm'
-No prompt for file `xpm/editcutS.xpm'
-
-*** Action on file `xpm/editmute.xpm'
-No prompt for file `xpm/editmute.xpm'
-
-*** Action on file `xpm/pencil.xpm'
-No prompt for file `xpm/pencil.xpm'
-
-*** Action on file `xpm/pointer.xpm'
-No prompt for file `xpm/pointer.xpm'
-
-*** Action on file `xpm/wave.xpm'
-No prompt for file `xpm/wave.xpm'
-
-*** Action on file `xpm/undoS.xpm'
-No prompt for file `xpm/undoS.xpm'
-
-*** Action on file `xpm/loop1.xpm'
-No prompt for file `xpm/loop1.xpm'
-
-*** Action on file `xpm/score.xpm'
-No prompt for file `xpm/score.xpm'
-
-*** Action on file `xpm/glue.xpm'
-No prompt for file `xpm/glue.xpm'
-
-*** Action on file `xpm/Makefile.am'
-No prompt for file `xpm/Makefile.am'
-
-*** Action on file `xpm/gv.xpm'
-No prompt for file `xpm/gv.xpm'
-
-*** Action on file `xpm/redoS.xpm'
-No prompt for file `xpm/redoS.xpm'
-
-*** Action on file `xpm/toc.xpm'
-No prompt for file `xpm/toc.xpm'
-
-*** Action on file `xpm/greendot.xpm'
-No prompt for file `xpm/greendot.xpm'
-
-*** Action on file `xpm/configure.xpm'
-No prompt for file `xpm/configure.xpm'
-
-*** Action on file `xpm/forward.xpm'
-No prompt for file `xpm/forward.xpm'
-
-*** Action on file `xpm/underlined.xpm'
-No prompt for file `xpm/underlined.xpm'
-
-*** Action on file `xpm/home.xpm'
-No prompt for file `xpm/home.xpm'
-
-*** Action on file `xpm/record1.xpm'
-No prompt for file `xpm/record1.xpm'
-
-*** Action on file `xpm/lmark.xpm'
-No prompt for file `xpm/lmark.xpm'
-
-*** Action on file `xpm/record.xpm'
-No prompt for file `xpm/record.xpm'
-
-*** Action on file `xpm/mute.xpm'
-No prompt for file `xpm/mute.xpm'
-
-*** Action on file `xpm/darkgreendot.xpm'
-No prompt for file `xpm/darkgreendot.xpm'
-
-*** Action on file `xpm/find.xpm'
-No prompt for file `xpm/find.xpm'
-
-*** Action on file `xpm/reddot.xpm'
-No prompt for file `xpm/reddot.xpm'
-
-*** Action on file `xpm/punchout.xpm'
-No prompt for file `xpm/punchout.xpm'
-
-*** Action on file `xpm/panic.xpm'
-No prompt for file `xpm/panic.xpm'
-
-*** Action on file `xpm/fileprintS.xpm'
-No prompt for file `xpm/fileprintS.xpm'
-
-*** Action on file `xpm/draw.xpm'
-No prompt for file `xpm/draw.xpm'
-
-*** Action on file `xpm/filesave.xpm'
-No prompt for file `xpm/filesave.xpm'
-
-*** Action on file `xpm/filenew.xpm'
-No prompt for file `xpm/filenew.xpm'
-
-*** Action on file `xpm/piano.xpm'
-No prompt for file `xpm/piano.xpm'
-
-*** Action on file `xpm/solobutton.xpm'
-No prompt for file `xpm/solobutton.xpm'
-
-*** Action on file `xpm/punchin1.xpm'
-No prompt for file `xpm/punchin1.xpm'
-
-*** Action on file `xpm/idea.xpm'
-No prompt for file `xpm/idea.xpm'
-
-*** Action on file `xpm/editcut.xpm'
-No prompt for file `xpm/editcut.xpm'
-
-*** Action on file `xpm/editcopyS.xpm'
-No prompt for file `xpm/editcopyS.xpm'
-
-*** Action on file `xpm/cmark.xpm'
-No prompt for file `xpm/cmark.xpm'
-
-*** Action on file `xpm/fileopenS.xpm'
-No prompt for file `xpm/fileopenS.xpm'
-
-*** Action on file `xpm/ctrl.xpm'
-No prompt for file `xpm/ctrl.xpm'
-
-*** Action on file `xpm/note1.xpm'
-No prompt for file `xpm/note1.xpm'
-
-*** Action on file `xpm/context_help.xpm'
-No prompt for file `xpm/context_help.xpm'
-
-*** Action on file `xpm/exitS.xpm'
-No prompt for file `xpm/exitS.xpm'
-
-*** Action on file `xpm/flagS.xpm'
-No prompt for file `xpm/flagS.xpm'
-
-*** Action on file `xpm/iiwusynth.xpm'
-No prompt for file `xpm/iiwusynth.xpm'
-
-*** Action on file `xpm/sysex.xpm'
-No prompt for file `xpm/sysex.xpm'
-
-*** Action on file `xpm/down.xpm'
-No prompt for file `xpm/down.xpm'
-
-*** Action on file `xpm/dot.xpm'
-No prompt for file `xpm/dot.xpm'
-
-*** Action on file `xpm/quant.xpm'
-No prompt for file `xpm/quant.xpm'
-
-*** Action on file `xpm/doth.xpm'
-No prompt for file `xpm/doth.xpm'
-
-*** Action on file `xpm/punchout1.xpm'
-No prompt for file `xpm/punchout1.xpm'
-
-*** Action on file `xpm/cut.xpm'
-No prompt for file `xpm/cut.xpm'
-
-*** Action on file `xpm/note.xpm'
-No prompt for file `xpm/note.xpm'
-
-*** Action on file `xpm/buttondown.xpm'
-No prompt for file `xpm/buttondown.xpm'
-
-*** Action on file `xpm/dot1.xpm'
-No prompt for file `xpm/dot1.xpm'
-
-*** Action on file `xpm/meta.xpm'
-No prompt for file `xpm/meta.xpm'
-
-*** Action on file `xpm/undo.xpm'
-No prompt for file `xpm/undo.xpm'
-
-*** Action on file `xpm/master.xpm'
-No prompt for file `xpm/master.xpm'
-
-*** Action on file `xpm/bluedot.xpm'
-No prompt for file `xpm/bluedot.xpm'
-
-*** Action on file `xpm/newmutebutton.xpm'
-No prompt for file `xpm/newmutebutton.xpm'
-
-*** Action on file `xpm/pafter.xpm'
-No prompt for file `xpm/pafter.xpm'
-
-*** Action on file `lib/plugins/Makefile.am'
-No prompt for file `lib/plugins/Makefile.am'
-
-*** Action on file `lib/synthi/Makefile.am'
-No prompt for file `lib/synthi/Makefile.am'
-
-*** Action on file `lib/Makefile.am'
-No prompt for file `lib/Makefile.am'
-
-*** Action on file `cliplist/cliplist.cpp'
-No prompt for file `cliplist/cliplist.cpp'
-
-*** Action on file `cliplist/Makefile.am'
-No prompt for file `cliplist/Makefile.am'
-
-*** Action on file `cliplist/cliplist.h'
-No prompt for file `cliplist/cliplist.h'
-
-*** Action on file `doc/midieditfunctions.png'
-No prompt for file `doc/midieditfunctions.png'
-
-*** Action on file `doc/Makefile.am'
-No prompt for file `doc/Makefile.am'
-
-*** Action on file `doc/muse.sgm'
-No prompt for file `doc/muse.sgm'
-
-*** Action on file `plugins/Makefile.am'
-No prompt for file `plugins/Makefile.am'
-
-*** Action on file `plugins/plugin.h'
-No prompt for file `plugins/plugin.h'
-
-*** Action on file `plugins/plugin.cpp'
-No prompt for file `plugins/plugin.cpp'
-
-*** Action on file `plugins/plugins-install.am'
-No prompt for file `plugins/plugins-install.am'
-
-*** Action on file `plugins/freeverb/denormals.h'
-No prompt for file `plugins/freeverb/denormals.h'
-
-*** Action on file `plugins/freeverb/tuning.h'
-No prompt for file `plugins/freeverb/tuning.h'
-
-*** Action on file `plugins/freeverb/readme.txt'
-No prompt for file `plugins/freeverb/readme.txt'
-
-*** Action on file `plugins/freeverb/revmodel.h'
-No prompt for file `plugins/freeverb/revmodel.h'
-
-*** Action on file `plugins/freeverb/Makefile.am'
-No prompt for file `plugins/freeverb/Makefile.am'
-
-*** Action on file `plugins/freeverb/comb.h'
-No prompt for file `plugins/freeverb/comb.h'
-
-*** Action on file `plugins/freeverb/freeverb.cpp'
-No prompt for file `plugins/freeverb/freeverb.cpp'
-
-*** Action on file `plugins/freeverb/allpass.h'
-No prompt for file `plugins/freeverb/allpass.h'
-
-*** Action on file `plugins/freeverb/revmodel.cpp'
-No prompt for file `plugins/freeverb/revmodel.cpp'
-
-*** Action on file `midictrledit.h'
-No prompt for file `midictrledit.h'
-
-
-*** Merge complete
-
diff --git a/muse2/muse/muse.pro b/muse2/muse/muse.pro
deleted file mode 100644
index 2931e82d..00000000
--- a/muse2/muse/muse.pro
+++ /dev/null
@@ -1,370 +0,0 @@
-HEADERS = \
- ./ctrl/ctrledit.h \
- ./ctrl/ctrlcanvas.h \
- ./ctrl/ctrlpanel.h \
- ./debug.h \
- ./midiport.h \
- ./app.h \
- ./eventbase.h \
- ./key.h \
- ./liste/listedit.h \
- ./liste/editevent.h \
- ./mixer/mstrip.h \
- ./mixer/auxknob.h \
- ./mixer/meter.h \
- ./mixer/panknob.h \
- ./mixer/strip.h \
- ./mixer/rack.h \
- ./mixer/routedialog.h \
- ./mixer/amixer.h \
- ./mixer/astrip.h \
- ./mtc.h \
- ./pos.h \
- ./sig.h \
- ./xml.h \
- ./miditransform.h \
- ./route.h \
- ./globaldefs.h \
- ./appearance.h \
- ./midievent.h \
- ./midieditor.h \
- ./confmport.h \
- ./patchbay/patchbay.h \
- ./tempo.h \
- ./audioprefetch.h \
- ./event.h \
- ./waveevent.h \
- ./midiedit/pianoroll.h \
- ./midiedit/cmd.h \
- ./midiedit/dlist.h \
- ./midiedit/prcanvas.h \
- ./midiedit/quantconfig.h \
- ./midiedit/ecanvas.h \
- ./midiedit/drumedit.h \
- ./midiedit/drummap.h \
- ./midiedit/piano.h \
- ./midiedit/dcanvas.h \
- ./conf.h \
- ./ctrl.h \
- ./driver/jackaudio.h \
- ./driver/alsamidi.h \
- ./driver/audiodev.h \
- ./fastlog.h \
- ./mpevent.h \
- ./synth.h \
- ./cobject.h \
- ./track.h \
- ./evdata.h \
- ./marker/markerview.h \
- ./marker/marker.h \
- ./master/tscale.h \
- ./master/lmaster.h \
- ./master/masteredit.h \
- ./master/master.h \
- ./gconfig.h \
- ./midi.h \
- ./waveedit/waveedit.h \
- ./waveedit/waveview.h \
- ./mplugins/midifilterimpl.h \
- ./mplugins/mittranspose.h \
- ./mplugins/random.h \
- ./mplugins/mrconfig.h \
- ./mplugins/midiitransform.h \
- ./mplugins/rhythm.h \
- ./mplugins/mitplugin.h \
- ./node.h \
- ./part.h \
- ./value.h \
- ./song.h \
- ./sync.h \
- ./undo.h \
- ./ladspa.h \
- ./wave.h \
- ./device.h \
- ./instruments/midictrledit.h \
- ./instruments/minstrument.h \
- ./instruments/editinstrument.h \
- ./icons.h \
- ./thread.h \
- ./arranger/tlist.h \
- ./arranger/arranger.h \
- ./arranger/alayout.h \
- ./arranger/pcanvas.h \
- ./globals.h \
- ./audio.h \
- ./transpose.h \
- ./transport.h \
- ./widgets/section.h \
- ./widgets/mixdowndialog.h \
- ./widgets/dimap.h \
- ./widgets/fontsel.h \
- ./widgets/lcombo.h \
- ./widgets/pitchedit.h \
- ./widgets/tb1.h \
- ./widgets/gatetime.h \
- ./widgets/comboQuant.h \
- ./widgets/ctrlcombo.h \
- ./widgets/comment.h \
- ./widgets/filedialog.h \
- ./widgets/sclif.h \
- ./widgets/scrollscale.h \
- ./widgets/bigtime.h \
- ./widgets/metronome.h \
- ./widgets/combobox.h \
- ./widgets/ttoolbutton.h \
- ./widgets/drange.h \
- ./widgets/scldiv.h \
- ./widgets/vscale.h \
- ./widgets/posedit.h \
- ./widgets/genset.h \
- ./widgets/shortcutcapturedialog.h \
- ./widgets/wtscale.h \
- ./widgets/mmath.h \
- ./widgets/canvas.h \
- ./widgets/shortcutconfig.h \
- ./widgets/pitchlabel.h \
- ./widgets/tools.h \
- ./widgets/swidget.h \
- ./widgets/splitter.h \
- ./widgets/knob.h \
- ./widgets/poslabel.h \
- ./widgets/velocity.h \
- ./widgets/midisyncimpl.h \
- ./widgets/ttoolbar.h \
- ./widgets/nentry.h \
- ./widgets/action.h \
- ./widgets/slider.h \
- ./widgets/dentry.h \
- ./widgets/siglabel.h \
- ./widgets/checkbox.h \
- ./widgets/mtscale.h \
- ./widgets/spinboxFP.h \
- ./widgets/view.h \
- ./widgets/sigscale.h \
- ./widgets/noteinfo.h \
- ./widgets/doublelabel.h \
- ./widgets/utils.h \
- ./widgets/hitscale.h \
- ./widgets/intlabel.h \
- ./widgets/sigedit.h \
- ./widgets/mlabel.h \
- ./widgets/header.h \
- ./widgets/tempolabel.h \
- ./widgets/sliderbase.h \
- ./widgets/scldraw.h \
- ./widgets/citem.h \
- ./widgets/songinfo.h \
- ./mididev.h \
- ./midictrl.h \
- ./midiseq.h \
- ./midifile.h \
- ./shortcuts.h \
- ./memory.h \
- ./helper.h \
- ./plugin.h
-
-SOURCES = \
- ./ctrl/ctrlpanel.cpp \
- ./ctrl/ctrledit.cpp \
- ./ctrl/ctrlcanvas.cpp \
- ./route.cpp \
- ./undo.cpp \
- ./midievent.cpp \
- ./xml.cpp \
- ./memory.cpp \
- ./key.cpp \
- ./midiseq.cpp \
- ./song.cpp \
- ./liste/listedit.cpp \
- ./liste/editevent.cpp \
- ./mixer/strip.cpp \
- ./mixer/auxknob.cpp \
- ./mixer/rack.cpp \
- ./mixer/amixer.cpp \
- ./mixer/routedialog.cpp \
- ./mixer/panknob.cpp \
- ./mixer/mstrip.cpp \
- ./mixer/astrip.cpp \
- ./mixer/meter.cpp \
- ./transpose.cpp \
- ./eventlist.cpp \
- ./transport.cpp \
- ./wavetrack.cpp \
- ./audioprefetch.cpp \
- ./helper.cpp \
- ./miditransform.cpp \
- ./ctrl.cpp \
- ./sig.cpp \
- ./confmport.cpp \
- ./shortcuts.cpp \
- ./audio.cpp \
- ./part.cpp \
- ./patchbay/patchbay.cpp \
- ./appearance.cpp \
- ./mpevent.cpp \
- ./midi.cpp \
- ./event.cpp \
- ./midiedit/drumedit.cpp \
- ./midiedit/piano.cpp \
- ./midiedit/ecanvas.cpp \
- ./midiedit/quantconfig.cpp \
- ./midiedit/pianoroll.cpp \
- ./midiedit/dlist.cpp \
- ./midiedit/dcanvas.cpp \
- ./midiedit/prcanvas.cpp \
- ./midiedit/drummap.cpp \
- ./plugin.cpp \
- ./conf.cpp \
- ./driver/jack.cpp \
- ./driver/alsamidi.cpp \
- ./driver/dummyaudio.cpp \
- ./midictrl.cpp \
- ./songfile.cpp \
- ./gconfig.cpp \
- ./mtc.cpp \
- ./marker/marker.cpp \
- ./marker/markerview.cpp \
- ./master/master.cpp \
- ./master/tscale.cpp \
- ./master/lmaster.cpp \
- ./master/masteredit.cpp \
- ./sync.cpp \
- ./wave.cpp \
- ./midieditor.cpp \
- ./waveedit/waveview.cpp \
- ./waveedit/waveedit.cpp \
- ./mplugins/mitplugin.cpp \
- ./mplugins/midiitransform.cpp \
- ./mplugins/mrconfig.cpp \
- ./mplugins/mittranspose.cpp \
- ./mplugins/midifilterimpl.cpp \
- ./cobject.cpp \
- ./midifile.cpp \
- ./midiport.cpp \
- ./exportmidi.cpp \
- ./value.cpp \
- ./synth.cpp \
- ./waveevent.cpp \
- ./icons.cpp \
- ./instruments/minstrument.cpp \
- ./instruments/editinstrument.cpp \
- ./instruments/midictrledit.cpp \
- ./app.cpp \
- ./arranger/arranger.cpp \
- ./arranger/trackinfo.cpp \
- ./arranger/pcanvas.cpp \
- ./arranger/alayout.cpp \
- ./arranger/tlist.cpp \
- ./audiotrack.cpp \
- ./seqmsg.cpp \
- ./widgets/swidget.cpp \
- ./widgets/ttoolbutton.cpp \
- ./widgets/siglabel.cpp \
- ./widgets/pitchedit.cpp \
- ./widgets/knob.cpp \
- ./widgets/tempolabel.cpp \
- ./widgets/dentry.cpp \
- ./widgets/midisyncimpl.cpp \
- ./widgets/musewidgetsplug.cpp \
- ./widgets/scldiv.cpp \
- ./widgets/pitchlabel.cpp \
- ./widgets/tools.cpp \
- ./widgets/poslabel.cpp \
- ./widgets/scldraw.cpp \
- ./widgets/tb1.cpp \
- ./widgets/gatetime.cpp \
- ./widgets/sigscale.cpp \
- ./widgets/vscale.cpp \
- ./widgets/lcombo.cpp \
- ./widgets/noteinfo.cpp \
- ./widgets/mtscale.cpp \
- ./widgets/scrollscale.cpp \
- ./widgets/ttoolbar.cpp \
- ./widgets/slider.cpp \
- ./widgets/doublelabel.cpp \
- ./widgets/citem.cpp \
- ./widgets/intlabel.cpp \
- ./widgets/sigedit.cpp \
- ./widgets/combobox.cpp \
- ./widgets/genset.cpp \
- ./widgets/checkbox.cpp \
- ./widgets/sliderbase.cpp \
- ./widgets/comboQuant.cpp \
- ./widgets/wtscale.cpp \
- ./widgets/nentry.cpp \
- ./widgets/canvas.cpp \
- ./widgets/splitter.cpp \
- ./widgets/posedit.cpp \
- ./widgets/fontsel.cpp \
- ./widgets/mixdowndialog.cpp \
- ./widgets/ctrlcombo.cpp \
- ./widgets/comment.cpp \
- ./widgets/metronome.cpp \
- ./widgets/mlabel.cpp \
- ./widgets/spinboxFP.cpp \
- ./widgets/drange.cpp \
- ./widgets/velocity.cpp \
- ./widgets/shortcutconfig.cpp \
- ./widgets/header.cpp \
- ./widgets/hitscale.cpp \
- ./widgets/view.cpp \
- ./widgets/bigtime.cpp \
- ./widgets/filedialog.cpp \
- ./widgets/sclif.cpp \
- ./widgets/utils.cpp \
- ./widgets/dimap.cpp \
- ./widgets/mmath.cpp \
- ./mididev.cpp \
- ./node.cpp \
- ./track.cpp \
- ./pos.cpp \
- ./globals.cpp \
- ./importmidi.cpp \
- ./thread.cpp \
- ./help.cpp \
- ./tempo.cpp
-
-FORMS = \
- ./liste/editctrlbase.ui \
- ./mixer/midiportroutebase.ui \
- ./mixer/routedialogbase.ui \
- ./patchbay/patchbaybase.ui \
- ./mplugins/mrconfigbase.ui \
- ./mplugins/midifilter.ui \
- ./mplugins/rhythmbase.ui \
- ./instruments/editinstrumentbase.ui \
- ./instruments/ccontrolbase.ui \
- ./widgets/synthconfigbase.ui \
- ./widgets/mixdowndialogbase.ui \
- ./widgets/aboutbox.ui \
- ./widgets/editnotedialogbase.ui \
- ./widgets/commentbase.ui \
- ./widgets/fdialogbuttons.ui \
- ./widgets/metronomebase.ui \
- ./widgets/gensetbase.ui \
- ./widgets/shortcutcapturedialogbase.ui \
- ./widgets/mtrackinfobase.ui \
- ./widgets/editmetadialogbase.ui \
- ./widgets/gatetimebase.ui \
- ./widgets/configmidifilebase.ui \
- ./widgets/editsysexdialogbase.ui \
- ./widgets/wtrackinfobase.ui \
- ./widgets/midisync.ui \
- ./widgets/appearancebase.ui \
- ./widgets/velocitybase.ui \
- ./widgets/cliplisteditorbase.ui \
- ./widgets/mittransposebase.ui \
- ./widgets/transformbase.ui \
- ./widgets/transposebase.ui \
- ./widgets/editctrl7dialogbase.ui \
- ./widgets/shortcutconfigbase.ui \
- ./widgets/itransformbase.ui
-
-TRANSLATIONS = \
- ../share/locale/muse_de.ts \
- ../share/locale/muse_fr.ts \
- ../share/locale/muse_sv_SE.ts \
- ../share/locale/muse_es.ts \
- ../share/locale/muse_ru.ts \
- ../share/locale/muse_pl.ts
-
diff --git a/muse2/muse/part.cpp b/muse2/muse/part.cpp
index 51478928..6d273c82 100644
--- a/muse2/muse/part.cpp
+++ b/muse2/muse/part.cpp
@@ -648,8 +648,8 @@ int PartList::index(Part* part)
}
if(MusEGlobal::debugMsg)
printf("PartList::index(): not found!\n");
- //return 0;
- return -1;
+ //return 0; // don't comment this in again
+ return -1; // don't change that value. at least MidiEditor::addNewParts relies on this
}
//---------------------------------------------------------
@@ -1044,6 +1044,9 @@ void Song::cmdSplitPart(Track* track, Part* part, int tick)
Part* p1;
Part* p2;
track->splitPart(part, tick, p1, p2);
+
+ //song->informAboutNewParts(part, p1); // is unneccessary because of ChangePart below
+ song->informAboutNewParts(part, p2);
startUndo();
// Indicate no undo, and do port controller values but not clone parts.
diff --git a/muse2/muse/remote/pyapi.cpp b/muse2/muse/remote/pyapi.cpp
index 2143faf0..c9f9470f 100644
--- a/muse2/muse/remote/pyapi.cpp
+++ b/muse2/muse/remote/pyapi.cpp
@@ -1127,7 +1127,7 @@ bool Song::event(QEvent* _e)
break;
}
case QPybridgeEvent::SONG_ADD_TRACK:
- song->addTrack(e->getP1());
+ song->addTrack((Track::TrackType)e->getP1(), false); // Add at end of list.
break;
case QPybridgeEvent::SONG_CHANGE_TRACKNAME: {
Track* t = this->findTrack(e->getS1());
diff --git a/muse2/muse/shortcuts.cpp b/muse2/muse/shortcuts.cpp
index 24861c92..2270befa 100644
--- a/muse2/muse/shortcuts.cpp
+++ b/muse2/muse/shortcuts.cpp
@@ -60,12 +60,15 @@ void initShortCuts()
defShrt(SHRT_TOGGLE_LOOP, Qt::Key_Slash, "Transport: Toggle Loop section", GLOBAL_SHRT, "toggle_loop");
defShrt(SHRT_START_REC, Qt::Key_Asterisk, "Transport: Toggle Record", GLOBAL_SHRT, "toggle_rec");
defShrt(SHRT_REC_CLEAR, Qt::Key_Backspace, "Transport: Clear all rec enabled tracks", GLOBAL_SHRT, "rec_clear");
-
+ defShrt(SHRT_FULLSCREEN, Qt::CTRL + Qt::Key_F, "Toggle fullscreen", GLOBAL_SHRT, "fullscreen");
+
defShrt(SHRT_COPY, Qt::CTRL + Qt::Key_C, "Edit: Copy", INVIS_SHRT, "copy");
+ defShrt(SHRT_COPY_RANGE, Qt::CTRL + Qt::SHIFT + Qt::Key_C, "Edit: Copy in range", GLOBAL_SHRT, "copy_range");
defShrt(SHRT_UNDO, Qt::CTRL + Qt::Key_Z, "Edit: Undo", INVIS_SHRT, "undo");
defShrt(SHRT_REDO, Qt::CTRL + Qt::Key_Y, "Edit: Redo", INVIS_SHRT, "redo");
defShrt(SHRT_CUT, Qt::CTRL + Qt::Key_X, "Edit: Cut", INVIS_SHRT, "cut");
defShrt(SHRT_PASTE, Qt::CTRL + Qt::Key_V, "Edit: Paste", INVIS_SHRT, "paste");
+ defShrt(SHRT_PASTE_DIALOG, Qt::CTRL + Qt::SHIFT + Qt::Key_V, "Edit: Paste (with dialog)", GLOBAL_SHRT, "paste_dialog");
defShrt(SHRT_DELETE, Qt::Key_Delete, "Edit: Delete", INVIS_SHRT, "delete");
//-----------------------------------------------------------
@@ -103,7 +106,6 @@ void initShortCuts()
defShrt(SHRT_GLOBAL_CUT, 0, "Structure: Global cut", ARRANG_SHRT, "global_cut");
defShrt(SHRT_GLOBAL_INSERT, 0, "Structure: Global insert", ARRANG_SHRT, "global_insert");
defShrt(SHRT_GLOBAL_SPLIT, 0, "Structure: Global split", ARRANG_SHRT, "global_split");
- defShrt(SHRT_COPY_RANGE, 0, "Structure: Copy range", ARRANG_SHRT, "copy_range");
defShrt(SHRT_CUT_EVENTS, 0, "Structure: Cut events", ARRANG_SHRT, "cut_events");
//defShrt(SHRT_OPEN_MIXER, Qt::Key_F10, "View: Open mixer window", ARRANG_SHRT, "toggle_mixer");
defShrt(SHRT_OPEN_MIXER, Qt::Key_F10, "View: Open mixer #1 window", ARRANG_SHRT, "toggle_mixer");
@@ -156,12 +158,10 @@ void initShortCuts()
defShrt(SHRT_SEL_BELOW, Qt::Key_Down, "Edit: Select nearest part on track below", ARRANG_SHRT, "sel_part_below");
defShrt(SHRT_SEL_BELOW_ADD, Qt::SHIFT + Qt::Key_Down, "Edit: Add nearest part on track below", ARRANG_SHRT, "sel_part_below_add");
- defShrt(SHRT_INSERT, Qt::CTRL+Qt::SHIFT+ Qt::Key_I, "Edit: Insert parts, moving time", ARRANG_SHRT, "insert_parts");
defShrt(SHRT_INSERTMEAS, Qt::CTRL+Qt::SHIFT+ Qt::Key_O, "Edit: Insert empty measure", ARRANG_SHRT, "insert_measure");
- defShrt(SHRT_PASTE_CLONE, Qt::CTRL+Qt::SHIFT+Qt::Key_V, "Edit: Paste clone", ARRANG_SHRT, "paste_clone");
- defShrt(SHRT_PASTE_TO_TRACK, Qt::CTRL+Qt::Key_B, "Edit: Paste to track", ARRANG_SHRT, "paste_to_track");
- defShrt(SHRT_PASTE_CLONE_TO_TRACK, Qt::CTRL+Qt::SHIFT+Qt::Key_B, "Edit: Paste clone to track", ARRANG_SHRT, "paste_clone_to_track");
+ defShrt(SHRT_PASTE_CLONE, Qt::CTRL+Qt::Key_B, "Edit: Paste as clones", ARRANG_SHRT, "paste_as_clone"); // i changed "paste_clone" to "paste_as_clone" intendedly. otherwise muse would keep its old, conflicting definition (ctrl+shift+v instead of ctrl+b) (flo)
+ defShrt(SHRT_PASTE_CLONE_DIALOG, Qt::CTRL+Qt::SHIFT+Qt::Key_B, "Edit: Paste as clones (with dialog)", ARRANG_SHRT, "paste_as_clone_dialog");
defShrt(SHRT_SEL_TRACK_ABOVE, Qt::CTRL + Qt::Key_Up, "Select track above", ARRANG_SHRT, "sel_track_above");
defShrt(SHRT_SEL_TRACK_BELOW, Qt::CTRL + Qt::Key_Down, "Select track below", ARRANG_SHRT, "sel_track_below");
diff --git a/muse2/muse/shortcuts.h b/muse2/muse/shortcuts.h
index 159a6084..451c4ec3 100644
--- a/muse2/muse/shortcuts.h
+++ b/muse2/muse/shortcuts.h
@@ -86,6 +86,7 @@ enum {
SHRT_TOGGLE_METRO, // C
SHRT_START_REC, // *(keypad)
SHRT_REC_CLEAR, // *(keypad)
+ SHRT_FULLSCREEN,
//Main + Drumeditor
SHRT_NEW, //Ctrl+N
@@ -96,8 +97,10 @@ enum {
SHRT_UNDO, //Ctrl+Z
SHRT_REDO, //Ctrl+Y
SHRT_COPY, //Ctrl+C
+ SHRT_COPY_RANGE, //Ctrl+Shift+C
SHRT_CUT, //Ctrl+X
SHRT_PASTE, //Ctrl+V
+ SHRT_PASTE_DIALOG, //Ctrl+Shift+V
SHRT_DELETE,//Delete
@@ -126,7 +129,6 @@ enum {
SHRT_GLOBAL_CUT, //Default: undefined
SHRT_GLOBAL_INSERT, //Default: undefined
SHRT_GLOBAL_SPLIT, //Default: undefined
- SHRT_COPY_RANGE, //Default: undefined
SHRT_CUT_EVENTS, //Default: undefined
SHRT_OPEN_TRANSPORT, //F11
@@ -187,12 +189,10 @@ enum {
SHRT_SEL_BELOW, //Down
SHRT_SEL_BELOW_ADD, //move down and add to selection
- SHRT_INSERT, //Ctrl+Shift+I - insert parts instead of pasting
SHRT_INSERTMEAS, //Ctrl+Shift+M - insert measures
- SHRT_PASTE_CLONE, //CTRL+SHIFT+Key_V
- SHRT_PASTE_TO_TRACK, //CTRL+Key_B
- SHRT_PASTE_CLONE_TO_TRACK, //CTRL+SHIFT+Key_B
+ SHRT_PASTE_CLONE, //CTRL+B
+ SHRT_PASTE_CLONE_DIALOG, //CTRL+SHIFT+B
//Arranger tracks
SHRT_SEL_TRACK_BELOW,
diff --git a/muse2/muse/song.cpp b/muse2/muse/song.cpp
index e5381884..7adc37f3 100644
--- a/muse2/muse/song.cpp
+++ b/muse2/muse/song.cpp
@@ -162,12 +162,13 @@ void Song::setSig(const AL::TimeSignature& sig)
//---------------------------------------------------------
// addNewTrack
// Called from GUI context
+// If insertAt is valid, inserts before insertAt. Else at the end after all tracks.
// Besides normal track types, n includes synth menu ids from populateAddTrack()
//---------------------------------------------------------
-Track* Song::addNewTrack(QAction* action)
+Track* Song::addNewTrack(QAction* action, Track* insertAt)
{
- int n = action->data().toInt();
+ int n = action->data().toInt();
// Ignore negative numbers since this slot could be called by a menu or list etc. passing -1.
if(n < 0)
return 0;
@@ -176,45 +177,42 @@ Track* Song::addNewTrack(QAction* action)
if(n >= MENU_ADD_SYNTH_ID_BASE)
{
n -= MENU_ADD_SYNTH_ID_BASE;
- if(n < (int)synthis.size())
- {
- //SynthI* si = createSynthI(synthis[n]->baseName());
- //SynthI* si = createSynthI(synthis[n]->name());
- SynthI* si = createSynthI(synthis[n]->baseName(), synthis[n]->name());
- if(!si)
- return 0;
+ if(n >= (int)synthis.size())
+ return 0;
- // Add instance last in midi device list.
- for (int i = 0; i < MIDI_PORTS; ++i)
+ SynthI* si = createSynthI(synthis[n]->baseName(), synthis[n]->name(), insertAt);
+ if(!si)
+ return 0;
+
+ // Add instance last in midi device list.
+ for (int i = 0; i < MIDI_PORTS; ++i)
+ {
+ MidiPort* port = &midiPorts[i];
+ MidiDevice* dev = port->device();
+ if (dev==0)
{
- MidiPort* port = &midiPorts[i];
- MidiDevice* dev = port->device();
- if (dev==0)
- {
- midiSeq->msgSetMidiDevice(port, si);
- MusEGlobal::muse->changeConfig(true); // save configuration file
- deselectTracks();
- si->setSelected(true);
- update();
- return si;
- }
+ midiSeq->msgSetMidiDevice(port, si);
+ MusEGlobal::muse->changeConfig(true); // save configuration file
+ deselectTracks();
+ si->setSelected(true);
+ update();
+ return si;
}
- deselectTracks();
- si->setSelected(true);
- update(SC_SELECTION);
- return si;
- }
- else
- return 0;
+ }
+ deselectTracks();
+ si->setSelected(true);
+ update(SC_SELECTION);
+ return si;
}
// Normal track.
else
{
- // Ignore AUDIO_SOFTSYNTH, now that we have it as the synth menu id, since addTrack doesn't like it.
- if((Track::TrackType)n == Track::AUDIO_SOFTSYNTH)
+ // Ignore AUDIO_SOFTSYNTH (or anything greater, to allow for other entries in some menu),
+ // now that we have it as the synth menu id, since addTrack doesn't like it.
+ if((Track::TrackType)n >= Track::AUDIO_SOFTSYNTH)
return 0;
- Track* t = addTrack((Track::TrackType)n);
+ Track* t = addTrack((Track::TrackType)n, insertAt);
deselectTracks();
t->setSelected(true);
update(SC_SELECTION);
@@ -226,11 +224,12 @@ Track* Song::addNewTrack(QAction* action)
//---------------------------------------------------------
// addTrack
// called from GUI context
+// type is track type
+// If insertAt is valid, inserts before insertAt. Else at the end after all tracks.
//---------------------------------------------------------
-Track* Song::addTrack(int t)
+Track* Song::addTrack(Track::TrackType type, Track* insertAt)
{
- Track::TrackType type = (Track::TrackType) t;
Track* track = 0;
int lastAuxIdx = _auxs.size();
switch(type) {
@@ -270,9 +269,12 @@ Track* Song::addTrack(int t)
abort();
}
track->setDefaultName();
- insertTrack1(track, -1);
- msgInsertTrack(track, -1, true);
- insertTrack3(track, -1);
+
+ int idx = insertAt ? _tracks.index(insertAt) : -1;
+
+ insertTrack1(track, idx);
+ msgInsertTrack(track, idx, true);
+ insertTrack3(track, idx);
// Add default track <-> midiport routes.
if(track->isMidiTrack())
@@ -3927,3 +3929,26 @@ QString Song::getScriptPath(int id, bool isdelivered)
return path;
}
+void Song::informAboutNewParts(const std::map< Part*, std::set<Part*> >& param)
+{
+ emit newPartsCreated(param);
+}
+
+void Song::informAboutNewParts(Part* orig, Part* p1, Part* p2, Part* p3, Part* p4, Part* p5, Part* p6, Part* p7, Part* p8, Part* p9)
+{
+ std::map< Part*, std::set<Part*> > temp;
+
+ temp[orig].insert(p1);
+ temp[orig].insert(p2);
+ temp[orig].insert(p3);
+ temp[orig].insert(p4);
+ temp[orig].insert(p5);
+ temp[orig].insert(p6);
+ temp[orig].insert(p7);
+ temp[orig].insert(p8);
+ temp[orig].insert(p9);
+ temp[orig].erase(static_cast<Part*>(NULL));
+ temp[orig].erase(orig);
+
+ informAboutNewParts(temp);
+}
diff --git a/muse2/muse/song.h b/muse2/muse/song.h
index 872993e5..79e5521f 100644
--- a/muse2/muse/song.h
+++ b/muse2/muse/song.h
@@ -27,6 +27,9 @@
#include <QObject>
#include <QStringList>
+#include <map>
+#include <set>
+
#include "pos.h"
#include "globaldefs.h"
#include "tempo.h"
@@ -163,6 +166,8 @@ class Song : public QObject {
~Song();
bool applyOperationGroup(Undo& group, bool doUndo=true);
+ void informAboutNewParts(const std::map< Part*, std::set<Part*> >&);
+ void informAboutNewParts(Part* orig, Part* p1, Part* p2=NULL, Part* p3=NULL, Part* p4=NULL, Part* p5=NULL, Part* p6=NULL, Part* p7=NULL, Part* p8=NULL, Part* p9=NULL);
void putEvent(int pv);
void endMsgCmd();
@@ -353,8 +358,7 @@ class Song : public QObject {
// Configuration
//-----------------------------------------
- //SynthI* createSynthI(const QString& sclass);
- SynthI* createSynthI(const QString& sclass, const QString& label = QString());
+ SynthI* createSynthI(const QString& sclass, const QString& label = QString(), Track* insertAt = 0);
void rescanAlsaPorts();
@@ -402,8 +406,8 @@ class Song : public QObject {
void setQuantize(bool val);
void panic();
void seqSignal(int fd);
- Track* addTrack(int);
- Track* addNewTrack(QAction* action);
+ Track* addTrack(Track::TrackType type, Track* insertAt = 0);
+ Track* addNewTrack(QAction* action, Track* insertAt = 0);
QString getScriptPath(int id, bool delivered);
void populateScriptMenu(QMenu* menuPlugins, QObject* receiver);
@@ -421,6 +425,7 @@ class Song : public QObject {
void midiPortsChanged();
void midiNote(int pitch, int velo);
void controllerChanged(Track* t);
+ void newPartsCreated(const std::map< Part*, std::set<Part*> >&);
};
extern Song* song;
diff --git a/muse2/muse/songfile.cpp b/muse2/muse/songfile.cpp
index 9678b99b..2763f1b6 100644
--- a/muse2/muse/songfile.cpp
+++ b/muse2/muse/songfile.cpp
@@ -1028,15 +1028,15 @@ void MusE::readToplevels(Xml& xml)
if(!pl->empty())
{
startPianoroll(pl);
- toplevels.back().cobject()->readStatus(xml);
+ toplevels.back()->readStatus(xml);
pl = new PartList;
}
}
else if (tag == "scoreedit") {
- ScoreEdit* score = new ScoreEdit(this, 0, arranger->cursorValue());
+ ScoreEdit* score = new ScoreEdit(this, 0, _arranger->cursorValue());
score->show();
- toplevels.push_back(Toplevel(Toplevel::SCORE, (unsigned long)(score), score));
- connect(score, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long)));
+ toplevels.push_back(score);
+ connect(score, SIGNAL(deleted(TopWin*)), SLOT(toplevelDeleted(TopWin*)));
connect(score, SIGNAL(name_changed()), SLOT(scoreNamingChanged()));
score->readStatus(xml);
}
@@ -1044,7 +1044,7 @@ void MusE::readToplevels(Xml& xml)
if(!pl->empty())
{
startDrumEditor(pl);
- toplevels.back().cobject()->readStatus(xml);
+ toplevels.back()->readStatus(xml);
pl = new PartList;
}
}
@@ -1052,33 +1052,40 @@ void MusE::readToplevels(Xml& xml)
if(!pl->empty())
{
startListEditor(pl);
- toplevels.back().cobject()->readStatus(xml);
+ toplevels.back()->readStatus(xml);
pl = new PartList;
}
}
else if (tag == "master") {
startMasterEditor();
- toplevels.back().cobject()->readStatus(xml);
+ toplevels.back()->readStatus(xml);
}
else if (tag == "lmaster") {
startLMasterEditor();
- toplevels.back().cobject()->readStatus(xml);
+ toplevels.back()->readStatus(xml);
}
else if (tag == "marker") {
showMarker(true);
- toplevels.back().cobject()->readStatus(xml);
+ if (toplevels.back()->type()==TopWin::MARKER)
+ toplevels.back()->readStatus(xml);
+ }
+ else if (tag == "arrangerview") {
+ showArranger(true);
+ if (toplevels.back()->type()==TopWin::ARRANGER)
+ toplevels.back()->readStatus(xml);
}
else if (tag == "waveedit") {
if(!pl->empty())
{
startWaveEditor(pl);
- toplevels.back().cobject()->readStatus(xml);
+ toplevels.back()->readStatus(xml);
pl = new PartList;
}
}
else if (tag == "cliplist") {
startClipList(true);
- toplevels.back().cobject()->readStatus(xml);
+ if (toplevels.back()->type()==TopWin::CLIPLIST)
+ toplevels.back()->readStatus(xml);
}
else
xml.unknown("MusE");
@@ -1299,8 +1306,8 @@ void MusE::write(Xml& xml) const
if (!toplevels.empty()) {
xml.tag(level++, "toplevels");
for (ciToplevel i = toplevels.begin(); i != toplevels.end(); ++i) {
- if (i->cobject()->isVisible())
- i->cobject()->writeStatus(level, xml);
+ if ((*i)->isVisible())
+ (*i)->writeStatus(level, xml);
}
xml.tag(level--, "/toplevels");
}
diff --git a/muse2/muse/structure.cpp b/muse2/muse/structure.cpp
index 665dac68..6c9d25dd 100644
--- a/muse2/muse/structure.cpp
+++ b/muse2/muse/structure.cpp
@@ -1,7 +1,7 @@
//=========================================================
// MusE
// Linux Music Editor
-// $Id: app.cpp,v 1.113.2.68 2009/12/21 14:51:51 spamatica Exp $
+// $Id: structure.cpp,v 1.113.2.68 2009/12/21 14:51:51 spamatica Exp $
//
// (C) Copyright 1999-2004 Werner Schweer (ws@seh.de)
// (C) Copyright 2011 Robert Jonsson (rj@spamatica.se)
@@ -31,8 +31,11 @@
#include "keyevent.h"
#include "audio.h"
#include "marker/marker.h"
+#include "structure.h"
+#include "globals.h"
-namespace MusEApp {
+#include <set>
+using std::set;
//---------------------------------------------------------
// adjustGlobalLists
@@ -41,7 +44,7 @@ namespace MusEApp {
// 'diff' number of ticks.
//---------------------------------------------------------
-void MusE::adjustGlobalLists(Undo& operations, int startPos, int diff)
+void adjustGlobalLists(Undo& operations, int startPos, int diff)
{
const TempoList* t = &tempomap;
const AL::SigList* s = &AL::sigmap;
@@ -132,7 +135,7 @@ void MusE::adjustGlobalLists(Undo& operations, int startPos, int diff)
// - cut master track
//---------------------------------------------------------
-void MusE::globalCut()
+void globalCut()
{
int lpos = song->lpos();
int rpos = song->rpos();
@@ -141,10 +144,17 @@ void MusE::globalCut()
Undo operations;
TrackList* tracks = song->tracks();
+ bool at_least_one_selected=false;
+
+ for (iTrack it = tracks->begin(); it != tracks->end(); ++it)
+ if ( (*it)->selected() ) {
+ at_least_one_selected=true;
+ break;
+ }
for (iTrack it = tracks->begin(); it != tracks->end(); ++it) {
MidiTrack* track = dynamic_cast<MidiTrack*>(*it);
- if (track == 0 || track->mute())
+ if (track == 0 || (at_least_one_selected && !track->selected()))
continue;
PartList* pl = track->parts();
for (iPart p = pl->begin(); p != pl->end(); ++p) {
@@ -234,55 +244,69 @@ void MusE::globalCut()
// - insert in master track
//---------------------------------------------------------
-void MusE::globalInsert()
+void globalInsert()
{
- unsigned lpos = song->lpos();
- unsigned rpos = song->rpos();
- if (lpos >= rpos)
- return;
+ Undo operations=movePartsTotheRight(song->lpos(), song->rpos()-song->lpos(), true);
+ song->applyOperationGroup(operations);
+ }
+
+
+Undo movePartsTotheRight(unsigned int startTicks, int moveTicks, bool only_selected, set<Track*>* tracklist)
+ {
+ if (moveTicks<=0)
+ return Undo();
Undo operations;
TrackList* tracks = song->tracks();
+ bool at_least_one_selected=false;
+
+ for (iTrack it = tracks->begin(); it != tracks->end(); ++it)
+ if ( (*it)->selected() ) {
+ at_least_one_selected=true;
+ break;
+ }
+
for (iTrack it = tracks->begin(); it != tracks->end(); ++it) {
MidiTrack* track = dynamic_cast<MidiTrack*>(*it);
- if (track == 0 || track->mute())
+ if ( (track == 0) ||
+ (only_selected && at_least_one_selected && !track->selected()) ||
+ (tracklist && tracklist->find(track)==tracklist->end()) )
continue;
PartList* pl = track->parts();
for (riPart p = pl->rbegin(); p != pl->rend(); ++p) {
Part* part = p->second;
unsigned t = part->tick();
int l = part->lenTick();
- if (t + l <= lpos)
+ if (t + l <= startTicks)
continue;
- if (lpos >= t && lpos < (t+l)) {
+ if (startTicks > t && startTicks < (t+l)) {
MidiPart* nPart = new MidiPart(*(MidiPart*)part);
- nPart->setLenTick(l + (rpos-lpos));
+ nPart->setLenTick(l + moveTicks);
EventList* el = nPart->events();
for (riEvent i = el->rbegin(); i!=el->rend(); ++i)
{
- if (i->first < lpos-t)
+ if (i->first < startTicks-t)
break;
Event event = i->second;
Event nEvent = i->second.clone();
- nEvent.setTick(nEvent.tick() + (rpos-lpos));
+ nEvent.setTick(nEvent.tick() + moveTicks);
operations.push_back(UndoOp(UndoOp::ModifyEvent, nEvent, event, nPart, false, false));
}
operations.push_back(UndoOp(UndoOp::ModifyPart, part, nPart, true, true));
}
- else if (t > lpos) {
+ else if (t >= startTicks) {
MidiPart* nPart = new MidiPart(*(MidiPart*)part);
- nPart->setTick(t + (rpos -lpos));
+ nPart->setTick(t + moveTicks);
operations.push_back(UndoOp(UndoOp::ModifyPart, part, nPart, true, false));
}
}
}
- int diff = rpos - lpos;
- adjustGlobalLists(operations, lpos, diff);
+ adjustGlobalLists(operations, startTicks, moveTicks);
- song->applyOperationGroup(operations);
+ return operations;
}
@@ -291,15 +315,23 @@ void MusE::globalInsert()
// - split all parts at the song position pointer
//---------------------------------------------------------
-void MusE::globalSplit()
+void globalSplit()
{
int pos = song->cpos();
Undo operations;
TrackList* tracks = song->tracks();
+ bool at_least_one_selected=false;
+
+ for (iTrack it = tracks->begin(); it != tracks->end(); ++it)
+ if ( (*it)->selected() ) {
+ at_least_one_selected=true;
+ break;
+ }
+
for (iTrack it = tracks->begin(); it != tracks->end(); ++it) {
Track* track = *it;
- if (track == 0 || track->mute())
+ if (track == 0 || (at_least_one_selected && !track->selected()))
continue;
PartList* pl = track->parts();
@@ -315,6 +347,8 @@ void MusE::globalSplit()
p1->events()->incARef(-1); // the later song->applyOperationGroup() will increment it
p2->events()->incARef(-1); // so we must decrement it first :/
+ //song->informAboutNewParts(part, p1); // is unneccessary because of ModifyPart
+ song->informAboutNewParts(part, p2);
operations.push_back(UndoOp(UndoOp::ModifyPart,part, p1, true, false));
operations.push_back(UndoOp(UndoOp::AddPart,p2));
break;
@@ -324,35 +358,3 @@ void MusE::globalSplit()
song->applyOperationGroup(operations);
}
-//---------------------------------------------------------
-// copyRange
-// - copy space between left and right locator position
-// to song position pointer
-// - dont process muted tracks
-// - create a new part for every track containing the
-// copied events
-//---------------------------------------------------------
-
-void MusE::copyRange()
- {
- QMessageBox::critical(this,
- tr("MusE: Copy Range"),
- tr("not implemented")
- );
- }
-
-//---------------------------------------------------------
-// cutEvents
-// - make sure that all events in a part end where the
-// part ends
-// - process only marked parts
-//---------------------------------------------------------
-
-void MusE::cutEvents()
- {
- QMessageBox::critical(this,
- tr("MusE: Cut Events"),
- tr("not implemented")
- );
- }
-} // namespace MusEApp
diff --git a/muse2/muse/structure.h b/muse2/muse/structure.h
new file mode 100644
index 00000000..38be034b
--- /dev/null
+++ b/muse2/muse/structure.h
@@ -0,0 +1,34 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// structure.h
+// (C) Copyright 2011 Florian Jung (flo93@users.sourceforge.net)
+//
+// 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; 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 __STRUCTURE_H__
+#define __STRUCTURE_H__
+
+#include "undo.h"
+#include <set>
+
+Undo movePartsTotheRight(unsigned int startTick, int moveTick, bool only_selected=false, std::set<Track*>* tracklist=NULL);
+void adjustGlobalLists(Undo& operations, int startPos, int diff);
+void globalCut();
+void globalInsert();
+void globalSplit();
+#endif
diff --git a/muse2/muse/synth.cpp b/muse2/muse/synth.cpp
index ae54cd15..62da5e1d 100644
--- a/muse2/muse/synth.cpp
+++ b/muse2/muse/synth.cpp
@@ -35,13 +35,13 @@
//#include <QMenu>
#include "app.h"
+#include "arranger.h"
#include "synth.h"
#include "xml.h"
#include "midi.h"
#include "midiport.h"
#include "mididev.h"
-//#include "libsynti/mess.h"
-#include "synti/libsynti/mess.h" // p4.0.2
+#include "synti/libsynti/mess.h"
#include "song.h"
#include "audio.h"
#include "event.h"
@@ -162,7 +162,6 @@ static Synth* findSynth(const QString& sclass, const QString& label)
// create a synthesizer instance of class "label"
//---------------------------------------------------------
-//static SynthI* createSynthI(const QString& sclass)
static SynthI* createSynthInstance(const QString& sclass, const QString& label)
{
//Synth* s = findSynth(sclass);
@@ -648,10 +647,10 @@ void initMidiSynth()
//---------------------------------------------------------
// createSynthI
// create a synthesizer instance of class "label"
+// If insertAt is valid, inserts before insertAt. Else at the end after all tracks.
//---------------------------------------------------------
-//SynthI* Song::createSynthI(const QString& sclass)
-SynthI* Song::createSynthI(const QString& sclass, const QString& label)
+SynthI* Song::createSynthI(const QString& sclass, const QString& label, Track* insertAt)
{
//printf("Song::createSynthI calling ::createSynthI class:%s\n", sclass.toLatin1().constData());
@@ -662,13 +661,15 @@ SynthI* Song::createSynthI(const QString& sclass, const QString& label)
return 0;
//printf("Song::createSynthI created SynthI. Before insertTrack1...\n");
- insertTrack1(si, -1);
+ int idx = insertAt ? _tracks.index(insertAt) : -1;
+
+ insertTrack1(si, idx);
//printf("Song::createSynthI after insertTrack1. Before msgInsertTrack...\n");
- msgInsertTrack(si, -1, true); // add to instance list
+ msgInsertTrack(si, idx, true); // add to instance list
//printf("Song::createSynthI after msgInsertTrack. Before insertTrack3...\n");
- insertTrack3(si, -1);
+ insertTrack3(si, idx);
//printf("Song::createSynthI after insertTrack3. Adding default routes...\n");
diff --git a/muse2/muse/wave.cpp b/muse2/muse/wave.cpp
index 6f97a3f0..731606d3 100644
--- a/muse2/muse/wave.cpp
+++ b/muse2/muse/wave.cpp
@@ -815,7 +815,7 @@ namespace MusEApp {
void MusE::importWave()
{
- Track* track = arranger->curTrack();
+ Track* track = _arranger->curTrack();
if (track == 0 || track->type() != Track::WAVE) {
QMessageBox::critical(this, QString("MusE"),
tr("to import an audio file you have first to select"
@@ -838,7 +838,7 @@ void MusE::importWave()
bool MusE::importWaveToTrack(QString& name, unsigned tick, Track* track)
{
if (track==NULL)
- track = (WaveTrack*)(arranger->curTrack());
+ track = (WaveTrack*)(_arranger->curTrack());
SndFile* f = getWave(name, true);
diff --git a/muse2/muse/waveedit/waveedit.cpp b/muse2/muse/waveedit/waveedit.cpp
index 00c68cef..a2167a50 100644
--- a/muse2/muse/waveedit/waveedit.cpp
+++ b/muse2/muse/waveedit/waveedit.cpp
@@ -55,10 +55,6 @@
extern QColor readColor(Xml& xml);
-int WaveEdit::_widthInit = 600;
-int WaveEdit::_heightInit = 400;
-QByteArray WaveEdit::_toolbarInit;
-
//---------------------------------------------------------
// closeEvent
//---------------------------------------------------------
@@ -68,7 +64,7 @@ void WaveEdit::closeEvent(QCloseEvent* e)
QSettings settings("MusE", "MusE-qt");
//settings.setValue("Waveedit/geometry", saveGeometry());
settings.setValue("Waveedit/windowState", saveState());
- emit deleted((unsigned long)this);
+ emit deleted(static_cast<TopWin*>(this));
e->accept();
}
@@ -77,9 +73,8 @@ void WaveEdit::closeEvent(QCloseEvent* e)
//---------------------------------------------------------
WaveEdit::WaveEdit(PartList* pl)
- : MidiEditor(1, pl)
+ : MidiEditor(TopWin::WAVE, 1, pl)
{
- resize(_widthInit, _heightInit);
setFocusPolicy(Qt::StrongFocus);
QSignalMapper* mapper = new QSignalMapper(this);
@@ -169,6 +164,12 @@ WaveEdit::WaveEdit(PartList* pl)
mapper->setMapping(selectNoneAction, CMD_SELECT_NONE);
connect(selectNoneAction, SIGNAL(triggered()), mapper, SLOT(map()));
+
+ QMenu* settingsMenu = menuBar()->addMenu(tr("Window &Config"));
+ settingsMenu->addAction(subwinAction);
+ settingsMenu->addAction(shareAction);
+ settingsMenu->addAction(fullscreenAction);
+
//---------ToolBar----------------------------------
tools = addToolBar(tr("Wave edit tools"));
tools->setObjectName("Wave edit tools");
@@ -218,7 +219,7 @@ WaveEdit::WaveEdit(PartList* pl)
if (!parts()->empty()) { // Roughly match total size of part
Part* firstPart = parts()->begin()->second;
- xscale = 0 - firstPart->lenFrame()/_widthInit;
+ xscale = 0 - firstPart->lenFrame()/_widthInit[_type];
}
else {
xscale = -8000;
@@ -271,9 +272,6 @@ WaveEdit::WaveEdit(PartList* pl)
connect(hscroll, SIGNAL(scaleChanged(int)), SLOT(updateHScrollRange()));
connect(song, SIGNAL(songChanged(int)), SLOT(songChanged1(int)));
- if (!_toolbarInit.isEmpty())
- restoreState(_toolbarInit);
-
initShortcuts();
updateHScrollRange();
@@ -284,10 +282,8 @@ WaveEdit::WaveEdit(PartList* pl)
WavePart* part = (WavePart*)(parts()->begin()->second);
solo->setChecked(part->track()->solo());
}
- QSettings settings("MusE", "MusE-qt");
- //restoreGeometry(settings.value("Waveedit/geometry").toByteArray());
- restoreState(settings.value("Waveedit/windowState").toByteArray());
+ initTopwinState();
}
void WaveEdit::initShortcuts()
@@ -374,12 +370,8 @@ void WaveEdit::readConfiguration(Xml& xml)
case Xml::TagStart:
if (tag == "bgcolor")
MusEConfig::config.waveEditBackgroundColor = readColor(xml);
- else if (tag == "width")
- _widthInit = xml.parseInt();
- else if (tag == "height")
- _heightInit = xml.parseInt();
- else if (tag == "toolbars")
- _toolbarInit = QByteArray::fromHex(xml.parse1().toAscii());
+ else if (tag == "topwin")
+ TopWin::readConfiguration(WAVE, xml);
else
xml.unknown("WaveEdit");
break;
@@ -403,9 +395,7 @@ void WaveEdit::writeConfiguration(int level, Xml& xml)
{
xml.tag(level++, "waveedit");
xml.colorTag(level, "bgcolor", MusEConfig::config.waveEditBackgroundColor);
- xml.intTag(level, "width", _widthInit);
- xml.intTag(level, "height", _heightInit);
- xml.strTag(level, "toolbars", _toolbarInit.toHex().data());
+ TopWin::writeConfiguration(WAVE, level,xml);
xml.tag(level, "/waveedit");
}
@@ -457,38 +447,6 @@ void WaveEdit::readStatus(Xml& xml)
}
}
-//---------------------------------------------------------
-// resizeEvent
-//---------------------------------------------------------
-
-void WaveEdit::resizeEvent(QResizeEvent* ev)
- {
- QWidget::resizeEvent(ev);
- storeInitialState();
- }
-
-//---------------------------------------------------------
-// focusOutEvent
-//---------------------------------------------------------
-
-void WaveEdit::focusOutEvent(QFocusEvent* ev)
- {
- QWidget::focusOutEvent(ev);
- storeInitialState();
- }
-
-
-//---------------------------------------------------------
-// storeInitialState
-//---------------------------------------------------------
-
-void WaveEdit::storeInitialState()
- {
- _widthInit = width();
- _heightInit = height();
- _toolbarInit=saveState();
- }
-
//---------------------------------------------------------
// songChanged1
diff --git a/muse2/muse/waveedit/waveedit.h b/muse2/muse/waveedit/waveedit.h
index 3e5a5a61..64929555 100644
--- a/muse2/muse/waveedit/waveedit.h
+++ b/muse2/muse/waveedit/waveedit.h
@@ -66,15 +66,10 @@ class WaveEdit : public MidiEditor {
QAction* copyAction;
QAction* pasteAction;
- static int _widthInit, _heightInit;
- static QByteArray _toolbarInit;
virtual void closeEvent(QCloseEvent*);
virtual void keyPressEvent(QKeyEvent*);
- virtual void resizeEvent(QResizeEvent* ev);
- virtual void focusOutEvent(QFocusEvent*);
- void storeInitialState();
QMenu* menuFunctions, *select, *menuGain;
@@ -96,7 +91,7 @@ class WaveEdit : public MidiEditor {
signals:
- void deleted(unsigned long);
+ void deleted(TopWin*);
public:
WaveEdit(PartList*);
diff --git a/muse2/muse/widgets/CMakeLists.txt b/muse2/muse/widgets/CMakeLists.txt
index 48299f4a..e5353465 100644
--- a/muse2/muse/widgets/CMakeLists.txt
+++ b/muse2/muse/widgets/CMakeLists.txt
@@ -45,6 +45,7 @@ QT4_WRAP_CPP (widget_mocs
doublelabel.h
filedialog.h
genset.h
+ mdisettings.h
header.h
hitscale.h
intlabel.h
@@ -61,6 +62,8 @@ QT4_WRAP_CPP (widget_mocs
mtrackinfo.h
nentry.h
noteinfo.h
+ pastedialog.h
+ pasteeventsdialog.h
pitchedit.h
pitchlabel.h
popupmenu.h
@@ -107,12 +110,15 @@ file (GLOB widgets_ui_files
editsysexdialogbase.ui
fdialogbuttons.ui
gensetbase.ui
+ mdisettings_base.ui
itransformbase.ui
metronomebase.ui
midisync.ui
mittransposebase.ui
mixdowndialogbase.ui
mtrackinfobase.ui
+ pastedialogbase.ui
+ pasteeventsdialogbase.ui
projectcreate.ui
shortcutcapturedialogbase.ui
shortcutconfigbase.ui
@@ -142,6 +148,7 @@ file (GLOB widgets_source_files
drange.cpp
filedialog.cpp
genset.cpp
+ mdisettings.cpp
header.cpp
hitscale.cpp
intlabel.cpp
@@ -159,6 +166,8 @@ file (GLOB widgets_source_files
mtscale_flo.cpp
nentry.cpp
noteinfo.cpp
+ pastedialog.cpp
+ pasteeventsdialog.cpp
pitchedit.cpp
pitchlabel.cpp
popupmenu.cpp
diff --git a/muse2/muse/widgets/function_dialogs/crescendobase.ui b/muse2/muse/widgets/function_dialogs/crescendobase.ui
index 5f4ec1f4..e98b7bc3 100644
--- a/muse2/muse/widgets/function_dialogs/crescendobase.ui
+++ b/muse2/muse/widgets/function_dialogs/crescendobase.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>275</width>
- <height>293</height>
+ <height>299</height>
</rect>
</property>
<property name="windowTitle">
@@ -140,6 +140,19 @@
</widget>
</item>
<item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>6</number>
diff --git a/muse2/muse/widgets/function_dialogs/deloverlapsbase.ui b/muse2/muse/widgets/function_dialogs/deloverlapsbase.ui
index 7484bf97..7f94f83b 100644
--- a/muse2/muse/widgets/function_dialogs/deloverlapsbase.ui
+++ b/muse2/muse/widgets/function_dialogs/deloverlapsbase.ui
@@ -10,7 +10,7 @@
<x>0</x>
<y>0</y>
<width>275</width>
- <height>195</height>
+ <height>201</height>
</rect>
</property>
<property name="windowTitle">
@@ -70,6 +70,19 @@
</widget>
</item>
<item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>6</number>
diff --git a/muse2/muse/widgets/function_dialogs/gatetimebase.ui b/muse2/muse/widgets/function_dialogs/gatetimebase.ui
index e804de17..3f7ede4b 100644
--- a/muse2/muse/widgets/function_dialogs/gatetimebase.ui
+++ b/muse2/muse/widgets/function_dialogs/gatetimebase.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>275</width>
- <height>316</height>
+ <height>320</height>
</rect>
</property>
<property name="windowTitle">
@@ -135,6 +135,19 @@
</widget>
</item>
<item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
<layout class="QHBoxLayout">
<property name="spacing">
<number>6</number>
diff --git a/muse2/muse/widgets/function_dialogs/legatobase.ui b/muse2/muse/widgets/function_dialogs/legatobase.ui
index 7bc406df..2593f3f5 100644
--- a/muse2/muse/widgets/function_dialogs/legatobase.ui
+++ b/muse2/muse/widgets/function_dialogs/legatobase.ui
@@ -10,7 +10,7 @@
<x>0</x>
<y>0</y>
<width>275</width>
- <height>289</height>
+ <height>295</height>
</rect>
</property>
<property name="windowTitle">
@@ -150,6 +150,19 @@
</widget>
</item>
<item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>6</number>
diff --git a/muse2/muse/widgets/function_dialogs/movebase.ui b/muse2/muse/widgets/function_dialogs/movebase.ui
index a8825dd5..17a3aff6 100644
--- a/muse2/muse/widgets/function_dialogs/movebase.ui
+++ b/muse2/muse/widgets/function_dialogs/movebase.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>275</width>
- <height>264</height>
+ <height>270</height>
</rect>
</property>
<property name="windowTitle">
@@ -120,6 +120,19 @@
</widget>
</item>
<item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>6</number>
diff --git a/muse2/muse/widgets/function_dialogs/quantbase.ui b/muse2/muse/widgets/function_dialogs/quantbase.ui
index 6a88c86f..973be7b8 100644
--- a/muse2/muse/widgets/function_dialogs/quantbase.ui
+++ b/muse2/muse/widgets/function_dialogs/quantbase.ui
@@ -10,7 +10,7 @@
<x>0</x>
<y>0</y>
<width>279</width>
- <height>486</height>
+ <height>475</height>
</rect>
</property>
<property name="windowTitle">
@@ -210,11 +210,18 @@
</item>
<item row="5" column="0" colspan="2">
<widget class="QLabel" name="label_4">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="text">
<string>If the proposed change in tick or length is smaller than threshold, nothing is done.
If swing=0, this is normal
If swing is 33, you get a 2:1-rhythm.
-If swing is -33, you get a 1:2-rhythm.</string>
+If swing is -33, you get a 1:2-rhythm.
+</string>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -225,6 +232,19 @@ If swing is -33, you get a 1:2-rhythm.</string>
</widget>
</item>
<item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>6</number>
diff --git a/muse2/muse/widgets/function_dialogs/removebase.ui b/muse2/muse/widgets/function_dialogs/removebase.ui
index 79d541cc..a01f0c8b 100644
--- a/muse2/muse/widgets/function_dialogs/removebase.ui
+++ b/muse2/muse/widgets/function_dialogs/removebase.ui
@@ -10,7 +10,7 @@
<x>0</x>
<y>0</y>
<width>275</width>
- <height>443</height>
+ <height>424</height>
</rect>
</property>
<property name="windowTitle">
@@ -144,6 +144,12 @@
</item>
<item row="2" column="0" colspan="2">
<widget class="QLabel" name="label">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="text">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
@@ -165,6 +171,19 @@ p, li { white-space: pre-wrap; }
</widget>
</item>
<item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>6</number>
diff --git a/muse2/muse/widgets/function_dialogs/setlenbase.ui b/muse2/muse/widgets/function_dialogs/setlenbase.ui
index 7d929716..39a87789 100644
--- a/muse2/muse/widgets/function_dialogs/setlenbase.ui
+++ b/muse2/muse/widgets/function_dialogs/setlenbase.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>275</width>
- <height>264</height>
+ <height>270</height>
</rect>
</property>
<property name="windowTitle">
@@ -114,6 +114,19 @@
</widget>
</item>
<item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>6</number>
diff --git a/muse2/muse/widgets/function_dialogs/transposebase.ui b/muse2/muse/widgets/function_dialogs/transposebase.ui
index c26f2ef9..e1447690 100644
--- a/muse2/muse/widgets/function_dialogs/transposebase.ui
+++ b/muse2/muse/widgets/function_dialogs/transposebase.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>275</width>
- <height>264</height>
+ <height>270</height>
</rect>
</property>
<property name="windowTitle">
@@ -120,6 +120,19 @@
</widget>
</item>
<item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>6</number>
diff --git a/muse2/muse/widgets/function_dialogs/velocitybase.ui b/muse2/muse/widgets/function_dialogs/velocitybase.ui
index 40fe625f..70e838f5 100644
--- a/muse2/muse/widgets/function_dialogs/velocitybase.ui
+++ b/muse2/muse/widgets/function_dialogs/velocitybase.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>275</width>
- <height>316</height>
+ <height>320</height>
</rect>
</property>
<property name="windowTitle">
@@ -138,6 +138,19 @@
</widget>
</item>
<item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>6</number>
diff --git a/muse2/muse/widgets/genset.cpp b/muse2/muse/widgets/genset.cpp
index b8a93089..c6761a07 100644
--- a/muse2/muse/widgets/genset.cpp
+++ b/muse2/muse/widgets/genset.cpp
@@ -129,10 +129,10 @@ Shorter periods are desirable.</string>
showMixer->setChecked(MusEConfig::config.mixer1Visible);
showMixer2->setChecked(MusEConfig::config.mixer2Visible);
- arrangerX->setValue(MusEConfig::config.geometryMain.x());
- arrangerY->setValue(MusEConfig::config.geometryMain.y());
- arrangerW->setValue(MusEConfig::config.geometryMain.width());
- arrangerH->setValue(MusEConfig::config.geometryMain.height());
+ mainX->setValue(MusEConfig::config.geometryMain.x());
+ mainY->setValue(MusEConfig::config.geometryMain.y());
+ mainW->setValue(MusEConfig::config.geometryMain.width());
+ mainH->setValue(MusEConfig::config.geometryMain.height());
transportX->setValue(MusEConfig::config.geometryTransport.x());
transportY->setValue(MusEConfig::config.geometryTransport.y());
@@ -178,10 +178,33 @@ Shorter periods are desirable.</string>
connect(setMixerCurrent, SIGNAL(clicked()), SLOT(mixerCurrent()));
connect(setMixer2Current, SIGNAL(clicked()), SLOT(mixer2Current()));
connect(setBigtimeCurrent, SIGNAL(clicked()), SLOT(bigtimeCurrent()));
- connect(setArrangerCurrent, SIGNAL(clicked()), SLOT(arrangerCurrent()));
+ connect(setMainCurrent, SIGNAL(clicked()), SLOT(mainCurrent()));
connect(setTransportCurrent, SIGNAL(clicked()), SLOT(transportCurrent()));
+
+ connect(buttonTraditionalPreset, SIGNAL(clicked()), SLOT(traditionalPreset()));
+ connect(buttonMDIPreset, SIGNAL(clicked()), SLOT(mdiPreset()));
+ connect(buttonBorlandPreset, SIGNAL(clicked()), SLOT(borlandPreset()));
+
+ addMdiSettings(TopWin::ARRANGER);
+ addMdiSettings(TopWin::SCORE);
+ addMdiSettings(TopWin::PIANO_ROLL);
+ addMdiSettings(TopWin::DRUM);
+ addMdiSettings(TopWin::LISTE);
+ addMdiSettings(TopWin::WAVE);
+ addMdiSettings(TopWin::MASTER);
+ addMdiSettings(TopWin::LMASTER);
+ addMdiSettings(TopWin::CLIPLIST);
+ addMdiSettings(TopWin::MARKER);
+
}
+void GlobalSettingsConfig::addMdiSettings(TopWin::ToplevelType t)
+{
+ MdiSettings* temp = new MdiSettings(t, this);
+ layoutMdiSettings->addWidget(temp);
+ mdisettings.push_back(temp);
+}
+
//---------------------------------------------------------
// updateSettings
//---------------------------------------------------------
@@ -242,10 +265,10 @@ void GlobalSettingsConfig::updateSettings()
showMixer->setChecked(MusEConfig::config.mixer1Visible);
showMixer2->setChecked(MusEConfig::config.mixer2Visible);
- arrangerX->setValue(MusEConfig::config.geometryMain.x());
- arrangerY->setValue(MusEConfig::config.geometryMain.y());
- arrangerW->setValue(MusEConfig::config.geometryMain.width());
- arrangerH->setValue(MusEConfig::config.geometryMain.height());
+ mainX->setValue(MusEConfig::config.geometryMain.x());
+ mainY->setValue(MusEConfig::config.geometryMain.y());
+ mainW->setValue(MusEConfig::config.geometryMain.width());
+ mainH->setValue(MusEConfig::config.geometryMain.height());
transportX->setValue(MusEConfig::config.geometryTransport.x());
transportY->setValue(MusEConfig::config.geometryTransport.y());
@@ -282,6 +305,20 @@ void GlobalSettingsConfig::updateSettings()
moveArmedCheckBox->setChecked(MusEConfig::config.moveArmedCheckBox);
projectSaveCheckBox->setChecked(MusEConfig::config.useProjectSaveDialog);
popsDefStayOpenCheckBox->setChecked(MusEConfig::config.popupsDefaultStayOpen);
+
+ updateMdiSettings();
+}
+
+void GlobalSettingsConfig::updateMdiSettings()
+{
+ for (std::list<MdiSettings*>::iterator it = mdisettings.begin(); it!=mdisettings.end(); it++)
+ (*it)->update_settings();
+}
+
+void GlobalSettingsConfig::applyMdiSettings()
+{
+ for (std::list<MdiSettings*>::iterator it = mdisettings.begin(); it!=mdisettings.end(); it++)
+ (*it)->apply_settings();
}
//---------------------------------------------------------
@@ -329,10 +366,10 @@ void GlobalSettingsConfig::apply()
MusEConfig::config.mixer1Visible = showMixer->isChecked();
MusEConfig::config.mixer2Visible = showMixer2->isChecked();
- MusEConfig::config.geometryMain.setX(arrangerX->value());
- MusEConfig::config.geometryMain.setY(arrangerY->value());
- MusEConfig::config.geometryMain.setWidth(arrangerW->value());
- MusEConfig::config.geometryMain.setHeight(arrangerH->value());
+ MusEConfig::config.geometryMain.setX(mainX->value());
+ MusEConfig::config.geometryMain.setY(mainY->value());
+ MusEConfig::config.geometryMain.setWidth(mainW->value());
+ MusEConfig::config.geometryMain.setHeight(mainH->value());
MusEConfig::config.geometryTransport.setX(transportX->value());
MusEConfig::config.geometryTransport.setY(transportY->value());
@@ -403,6 +440,9 @@ void GlobalSettingsConfig::apply()
MusEGlobal::muse->setHeartBeat(); // set guiRefresh
midiSeq->msgSetRtc(); // set midi tick rate
+
+ applyMdiSettings();
+
MusEGlobal::muse->changeConfig(true); // save settings
}
@@ -437,8 +477,8 @@ void GlobalSettingsConfig::mixerCurrent()
QRect r(w->frameGeometry());
mixerX->setValue(r.x());
mixerY->setValue(r.y());
- mixerW->setValue(r.width());
- mixerH->setValue(r.height());
+ mixerW->setValue(w->width());
+ mixerH->setValue(w->height());
}
//---------------------------------------------------------
@@ -453,8 +493,8 @@ void GlobalSettingsConfig::mixer2Current()
QRect r(w->frameGeometry());
mixer2X->setValue(r.x());
mixer2Y->setValue(r.y());
- mixer2W->setValue(r.width());
- mixer2H->setValue(r.height());
+ mixer2W->setValue(w->width());
+ mixer2H->setValue(w->height());
}
//---------------------------------------------------------
@@ -469,21 +509,21 @@ void GlobalSettingsConfig::bigtimeCurrent()
QRect r(w->frameGeometry());
bigtimeX->setValue(r.x());
bigtimeY->setValue(r.y());
- bigtimeW->setValue(r.width());
- bigtimeH->setValue(r.height());
+ bigtimeW->setValue(w->width());
+ bigtimeH->setValue(w->height());
}
//---------------------------------------------------------
-// arrangerCurrent
+// mainCurrent
//---------------------------------------------------------
-void GlobalSettingsConfig::arrangerCurrent()
+void GlobalSettingsConfig::mainCurrent()
{
QRect r(MusEGlobal::muse->frameGeometry());
- arrangerX->setValue(r.x());
- arrangerY->setValue(r.y());
- arrangerW->setValue(r.width());
- arrangerH->setValue(r.height());
+ mainX->setValue(r.x());
+ mainY->setValue(r.y());
+ mainW->setValue(MusEGlobal::muse->width()); //this is intendedly not the frameGeometry, but
+ mainH->setValue(MusEGlobal::muse->height()); //the "non-frame-geom." to avoid a sizing bug
}
//---------------------------------------------------------
@@ -514,4 +554,43 @@ void GlobalSettingsConfig::defaultInstrumentsPath()
userInstrumentsPath->setText(dir);
}
+
+void GlobalSettingsConfig::traditionalPreset()
+{
+ for (std::list<MdiSettings*>::iterator it = mdisettings.begin(); it!=mdisettings.end(); it++)
+ {
+ TopWin::ToplevelType type = (*it)->type();
+ TopWin::_sharesWhenFree[type]=false;
+ TopWin::_defaultSubwin[type]=false;
+ }
+ TopWin::_defaultSubwin[TopWin::ARRANGER]=true;
+
+ updateMdiSettings();
+}
+
+void GlobalSettingsConfig::mdiPreset()
+{
+ for (std::list<MdiSettings*>::iterator it = mdisettings.begin(); it!=mdisettings.end(); it++)
+ {
+ TopWin::ToplevelType type = (*it)->type();
+ TopWin::_sharesWhenSubwin[type]=true;
+ TopWin::_defaultSubwin[type]=true;
+ }
+
+ updateMdiSettings();
+}
+
+void GlobalSettingsConfig::borlandPreset()
+{
+ for (std::list<MdiSettings*>::iterator it = mdisettings.begin(); it!=mdisettings.end(); it++)
+ {
+ TopWin::ToplevelType type = (*it)->type();
+ TopWin::_sharesWhenFree[type]=true;
+ TopWin::_defaultSubwin[type]=false;
+ }
+
+ updateMdiSettings();
+}
+
} // namespace MusEWidget
+
diff --git a/muse2/muse/widgets/genset.h b/muse2/muse/widgets/genset.h
index 3a2c6354..6068c429 100644
--- a/muse2/muse/widgets/genset.h
+++ b/muse2/muse/widgets/genset.h
@@ -25,8 +25,11 @@
#define __GENSET_H__
#include "ui_gensetbase.h"
+#include "cobject.h"
+#include "mdisettings.h"
#include <QShowEvent>
+#include <list>
namespace MusEWidget {
@@ -39,20 +42,27 @@ class GlobalSettingsConfig : public QDialog, public Ui::GlobalSettingsDialogBase
private slots:
void updateSettings();
+ void updateMdiSettings();
+ void addMdiSettings(TopWin::ToplevelType t);
+ void applyMdiSettings();
void apply();
void ok();
void cancel();
void mixerCurrent();
void mixer2Current();
void bigtimeCurrent();
- void arrangerCurrent();
+ void mainCurrent();
void transportCurrent();
void selectInstrumentsPath();
void defaultInstrumentsPath();
+ void traditionalPreset();
+ void mdiPreset();
+ void borlandPreset();
protected:
void showEvent(QShowEvent*);
QButtonGroup *startSongGroup;
+ std::list<MdiSettings*> mdisettings;
public:
GlobalSettingsConfig(QWidget* parent=0);
diff --git a/muse2/muse/widgets/gensetbase.ui b/muse2/muse/widgets/gensetbase.ui
index 68f3ebb5..b5fb56b6 100644
--- a/muse2/muse/widgets/gensetbase.ui
+++ b/muse2/muse/widgets/gensetbase.ui
@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
- <width>526</width>
+ <width>556</width>
<height>506</height>
</rect>
</property>
@@ -70,7 +70,7 @@
</widget>
</item>
<item row="0" column="5">
- <widget class="QSpinBox" name="arrangerH">
+ <widget class="QSpinBox" name="mainH">
<property name="toolTip">
<string>height</string>
</property>
@@ -80,7 +80,7 @@
</widget>
</item>
<item row="0" column="4">
- <widget class="QSpinBox" name="arrangerW">
+ <widget class="QSpinBox" name="mainW">
<property name="toolTip">
<string>width</string>
</property>
@@ -90,7 +90,7 @@
</widget>
</item>
<item row="0" column="3">
- <widget class="QSpinBox" name="arrangerY">
+ <widget class="QSpinBox" name="mainY">
<property name="toolTip">
<string>y-pos</string>
</property>
@@ -100,7 +100,7 @@
</widget>
</item>
<item row="0" column="2">
- <widget class="QSpinBox" name="arrangerX">
+ <widget class="QSpinBox" name="mainX">
<property name="toolTip">
<string>x-pos</string>
</property>
@@ -227,7 +227,7 @@
</sizepolicy>
</property>
<property name="text">
- <string>Arranger</string>
+ <string>Main Window</string>
</property>
<property name="wordWrap">
<bool>false</bool>
@@ -379,7 +379,7 @@
</widget>
</item>
<item row="0" column="6">
- <widget class="QPushButton" name="setArrangerCurrent">
+ <widget class="QPushButton" name="setMainCurrent">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
@@ -1333,19 +1333,6 @@ Adjusts responsiveness of audio controls and
</property>
</widget>
</item>
- <item row="5" column="0">
- <spacer name="verticalSpacer_2">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
<item row="4" column="0">
<widget class="QLabel" name="TextLabel1_3">
<property name="toolTip">
@@ -1370,6 +1357,72 @@ Otherwise, hold Ctrl to keep them open.</string>
</layout>
</widget>
</item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string>MDI-subwindowness and sharing menus</string>
+ </property>
+ <property name="checkable">
+ <bool>false</bool>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_9">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Presets:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonTraditionalPreset">
+ <property name="text">
+ <string>traditional MusE SDI</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonMDIPreset">
+ <property name="text">
+ <string>Cakewalk-like MDI</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buttonBorlandPreset">
+ <property name="text">
+ <string>Borland-/Mac-like MDI</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QScrollArea" name="scrollArea">
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents_2">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>482</width>
+ <height>168</height>
+ </rect>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <layout class="QVBoxLayout" name="layoutMdiSettings"/>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
</layout>
</widget>
</widget>
diff --git a/muse2/muse/widgets/mdisettings.cpp b/muse2/muse/widgets/mdisettings.cpp
new file mode 100644
index 00000000..24bf7c7c
--- /dev/null
+++ b/muse2/muse/widgets/mdisettings.cpp
@@ -0,0 +1,59 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: genset.cpp,v 1.7.2.8 2009/12/01 03:52:40 terminator356 Exp $
+//
+// (C) Copyright 2001-2004 Werner Schweer (ws@seh.de)
+//
+// 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; 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 <stdio.h>
+
+#include <QFileDialog>
+#include <QRect>
+#include <QShowEvent>
+
+#include "mdisettings.h"
+#include "app.h"
+#include "gconfig.h"
+#include "midiseq.h"
+#include "globals.h"
+#include "icons.h"
+
+MdiSettings::MdiSettings(TopWin::ToplevelType t, QWidget* parent) : QWidget(parent)
+{
+ _type=t;
+ setupUi(this);
+
+ groupBox->setTitle(TopWin::typeName(t));
+ update_settings();
+}
+
+
+void MdiSettings::update_settings()
+{
+ isSubwinCheckbox->setChecked(TopWin::_defaultSubwin[_type]);
+ shareSubwinCheckbox->setChecked(TopWin::_sharesWhenSubwin[_type]);
+ shareFreeCheckbox->setChecked(TopWin::_sharesWhenFree[_type]);
+}
+
+void MdiSettings::apply_settings()
+{
+ TopWin::_defaultSubwin[_type] = isSubwinCheckbox->isChecked();
+ TopWin::_sharesWhenSubwin[_type] = shareSubwinCheckbox->isChecked();
+ TopWin::_sharesWhenFree[_type] = shareFreeCheckbox->isChecked();
+}
diff --git a/muse2/muse/widgets/mdisettings.h b/muse2/muse/widgets/mdisettings.h
new file mode 100644
index 00000000..482f9f49
--- /dev/null
+++ b/muse2/muse/widgets/mdisettings.h
@@ -0,0 +1,49 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: genset.h,v 1.3 2004/01/25 09:55:17 wschweer Exp $
+//
+// (C) Copyright 2001 Werner Schweer (ws@seh.de)
+//
+// 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; 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 __MDISETTINGS_H__
+#define __MDISETTINGS_H__
+
+#include <QWidget>
+#include "ui_mdisettings_base.h"
+#include "cobject.h"
+
+//---------------------------------------------------------
+// GlobalSettingsConfig
+//---------------------------------------------------------
+
+class MdiSettings : public QWidget, private Ui::MdiSettingsBase
+{
+ Q_OBJECT
+
+ private:
+ TopWin::ToplevelType _type;
+
+ public:
+ MdiSettings(TopWin::ToplevelType t, QWidget* parent=0);
+ void update_settings();
+ void apply_settings();
+ TopWin::ToplevelType type() { return _type; }
+};
+
+#endif
diff --git a/muse2/muse/widgets/mdisettings_base.ui b/muse2/muse/widgets/mdisettings_base.ui
new file mode 100644
index 00000000..af32f174
--- /dev/null
+++ b/muse2/muse/widgets/mdisettings_base.ui
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MdiSettingsBase</class>
+ <widget class="QWidget" name="MdiSettingsBase">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>338</width>
+ <height>100</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>GroupBox</string>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="2" column="0">
+ <widget class="QCheckBox" name="isSubwinCheckbox">
+ <property name="text">
+ <string>MDI subwin</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QCheckBox" name="shareSubwinCheckbox">
+ <property name="text">
+ <string>Shares menu when subwin</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QCheckBox" name="shareFreeCheckbox">
+ <property name="text">
+ <string>Shares menu when free</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse2/muse/widgets/midisyncimpl.cpp b/muse2/muse/widgets/midisyncimpl.cpp
index 89075af9..3829ca43 100644
--- a/muse2/muse/widgets/midisyncimpl.cpp
+++ b/muse2/muse/widgets/midisyncimpl.cpp
@@ -690,8 +690,6 @@ void MidiSyncConfig::closeEvent(QCloseEvent* e)
apply();
}
- //emit deleted((unsigned long)this);
-
disconnect(MusEGlobal::heartBeatTimer, SIGNAL(timeout()), this, SLOT(heartBeat()));
disconnect(song, SIGNAL(songChanged(int)), this, SLOT(songChanged(int)));
diff --git a/muse2/muse/widgets/midisyncimpl.h b/muse2/muse/widgets/midisyncimpl.h
index ddccf7c9..50df186e 100644
--- a/muse2/muse/widgets/midisyncimpl.h
+++ b/muse2/muse/widgets/midisyncimpl.h
@@ -121,9 +121,6 @@ class MidiSyncConfig : public QDialog, public Ui::MidiSyncConfigBase {
//void renameOk(QListViewItem*, int, const QString&);
void songChanged(int);
- //signals:
- // void deleted(unsigned long);
-
public:
MidiSyncConfig(QWidget* parent=0);
//MidiSyncConfig();
diff --git a/muse2/muse/widgets/pastedialog.cpp b/muse2/muse/widgets/pastedialog.cpp
new file mode 100644
index 00000000..7c9c2248
--- /dev/null
+++ b/muse2/muse/widgets/pastedialog.cpp
@@ -0,0 +1,153 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: pastedialog.cpp,v 1.1.1.1 2011/05/05 18:51:04 flo93 Exp $
+// (C) Copyright 2011 Florian Jung (flo93@sourceforge.net)
+//
+// 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; 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 <QButtonGroup>
+#include "pastedialog.h"
+#include "xml.h"
+#include "gconfig.h"
+
+using MusEConfig::config;
+
+namespace MusEDialog {
+
+PasteDialog::PasteDialog(QWidget* parent)
+ : QDialog(parent)
+{
+ setupUi(this);
+ button_group = new QButtonGroup;
+ button_group->addButton(merge_button,0);
+ button_group->addButton(move_all_button,1);
+ button_group->addButton(move_some_button,2);
+
+ raster_spinbox->setSingleStep(config.division);
+
+ connect(raster_spinbox, SIGNAL(valueChanged(int)), this, SLOT(raster_changed(int)));
+ connect(n_spinbox, SIGNAL(valueChanged(int)), this, SLOT(number_changed(int)));
+
+ pull_values();
+}
+
+void PasteDialog::pull_values()
+{
+ insert_method = button_group->checkedId();
+ number = n_spinbox->value();
+ raster = raster_spinbox->value();
+ all_in_one_track = all_in_one_track_checkbox->isChecked();
+ clone = clone_checkbox->isChecked();
+}
+
+void PasteDialog::accept()
+{
+ pull_values();
+ QDialog::accept();
+}
+
+int PasteDialog::exec()
+{
+ if ((insert_method < 0) || (insert_method > 2)) insert_method=0;
+
+ button_group->button(insert_method)->setChecked(true);
+ n_spinbox->setValue(number);
+ raster_spinbox->setValue(raster);
+ all_in_one_track_checkbox->setChecked(all_in_one_track);
+ clone_checkbox->setChecked(clone);
+
+ return QDialog::exec();
+}
+
+QString PasteDialog::ticks_to_quarter_string(int ticks)
+{
+ if (ticks % config.division == 0)
+ {
+ return tr("%n quarter(s)", "", ticks/config.division);
+ }
+ else
+ {
+ double quarters = (double) ticks/config.division;
+ bool one = ( quarters > 0.995 && quarters < 1.005 );
+ if (one)
+ return QString::number(quarters, 'f', 2) + " " + tr("quarter");
+ else
+ return QString::number(quarters, 'f', 2) + " " + tr("quarters");
+ }
+}
+
+void PasteDialog::raster_changed(int r)
+{
+ raster_quarters->setText(ticks_to_quarter_string(r));
+ insert_quarters->setText(ticks_to_quarter_string(r*n_spinbox->value()));
+}
+
+void PasteDialog::number_changed(int n)
+{
+ insert_quarters->setText(ticks_to_quarter_string(n*raster_spinbox->value()));
+}
+
+
+void PasteDialog::read_configuration(Xml& xml)
+{
+ for (;;)
+ {
+ Xml::Token token = xml.parse();
+ if (token == Xml::Error || token == Xml::End)
+ break;
+
+ const QString& tag = xml.s1();
+ switch (token)
+ {
+ case Xml::TagStart:
+ if (tag == "insert_method")
+ insert_method=xml.parseInt();
+ else if (tag == "number")
+ number=xml.parseInt();
+ else if (tag == "raster")
+ raster=xml.parseInt();
+ else if (tag == "clone")
+ clone=xml.parseInt();
+ else if (tag == "all_in_one_track")
+ all_in_one_track=xml.parseInt();
+ else
+ xml.unknown("PasteDialog");
+ break;
+
+ case Xml::TagEnd:
+ if (tag == "pastedialog")
+ return;
+
+ default:
+ break;
+ }
+ }
+}
+
+void PasteDialog::write_configuration(int level, Xml& xml)
+{
+ xml.tag(level++, "pastedialog");
+ xml.intTag(level, "insert_method", insert_method);
+ xml.intTag(level, "number", number);
+ xml.intTag(level, "raster", raster);
+ xml.intTag(level, "clone", clone);
+ xml.intTag(level, "all_in_one_track", all_in_one_track);
+ xml.tag(level, "/pastedialog");
+}
+
+} // namespace MusEDialog
diff --git a/muse2/muse/widgets/pastedialog.h b/muse2/muse/widgets/pastedialog.h
new file mode 100644
index 00000000..39121964
--- /dev/null
+++ b/muse2/muse/widgets/pastedialog.h
@@ -0,0 +1,67 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: pastedialog.h,v 1.1.1.1 2011/05/05 18:51:04 flo93 Exp $
+// (C) Copyright 2011 Florian Jung (flo93@sourceforge.net)
+//
+// 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; 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 __PASTEDIALOG_H__
+#define __PASTEDIALOG_H__
+
+#include "ui_pastedialogbase.h"
+#include <QString>
+
+class Xml;
+
+namespace MusEDialog {
+
+class PasteDialog : public QDialog, public Ui::PasteDialogBase
+{
+ Q_OBJECT
+ protected:
+ QButtonGroup* button_group;
+ QString ticks_to_quarter_string(int ticks);
+
+ protected slots:
+ void accept();
+ void pull_values();
+
+ void raster_changed(int);
+ void number_changed(int);
+
+ public:
+ PasteDialog(QWidget* parent = 0);
+
+ int insert_method;
+ int number;
+ int raster;
+ bool all_in_one_track;
+ bool clone;
+
+ void read_configuration(Xml& xml);
+ void write_configuration(int level, Xml& xml);
+
+
+ public slots:
+ int exec();
+};
+
+} // namespace MusEDialog
+
+#endif
+
diff --git a/muse2/muse/widgets/pastedialogbase.ui b/muse2/muse/widgets/pastedialogbase.ui
new file mode 100644
index 00000000..e47f5d2b
--- /dev/null
+++ b/muse2/muse/widgets/pastedialogbase.ui
@@ -0,0 +1,291 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PasteDialogBase</class>
+ <widget class="QDialog" name="PasteDialogBase">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>307</width>
+ <height>349</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>MusE: Paste Parts</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="rangeBox">
+ <property name="title">
+ <string>Number and raster</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>insert</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QSpinBox" name="n_spinbox">
+ <property name="suffix">
+ <string> times</string>
+ </property>
+ <property name="prefix">
+ <string/>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>raster</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QSpinBox" name="raster_spinbox">
+ <property name="suffix">
+ <string> ticks</string>
+ </property>
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>999999</number>
+ </property>
+ <property name="singleStep">
+ <number>384</number>
+ </property>
+ <property name="value">
+ <number>384</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QLabel" name="insert_quarters">
+ <property name="text">
+ <string notr="true">1 quarter</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QLabel" name="raster_quarters">
+ <property name="text">
+ <string notr="true">1 quarter</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="2">
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string>Move, Merge, Clone</string>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ <property name="checkable">
+ <bool>false</bool>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <item row="2" column="0">
+ <widget class="QRadioButton" name="move_all_button">
+ <property name="text">
+ <string>Move everything to the right</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QRadioButton" name="move_some_button">
+ <property name="text">
+ <string>Move only affected parts to the right</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="6" column="0">
+ <widget class="QCheckBox" name="all_in_one_track_checkbox">
+ <property name="text">
+ <string>Put everything into a single track</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QRadioButton" name="merge_button">
+ <property name="text">
+ <string>Merge with existing parts</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="0">
+ <widget class="QCheckBox" name="clone_checkbox">
+ <property name="text">
+ <string>Insert as clones (where possible)</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <item>
+ <spacer name="Spacer1">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="okButton">
+ <property name="text">
+ <string>OK</string>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton">
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>PasteDialogBase</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>PasteDialogBase</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/muse2/muse/widgets/pasteeventsdialog.cpp b/muse2/muse/widgets/pasteeventsdialog.cpp
new file mode 100644
index 00000000..04b7cbd7
--- /dev/null
+++ b/muse2/muse/widgets/pasteeventsdialog.cpp
@@ -0,0 +1,175 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: pasteeventsdialog.cpp,v 1.1.1.1 2011/05/05 18:51:04 flo93 Exp $
+// (C) Copyright 2011 Florian Jung (flo93@sourceforge.net)
+//
+// 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; 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 <QButtonGroup>
+#include "pasteeventsdialog.h"
+#include "xml.h"
+#include "gconfig.h"
+
+using MusEConfig::config;
+
+namespace MusEDialog {
+
+PasteEventsDialog::PasteEventsDialog(QWidget* parent)
+ : QDialog(parent)
+{
+ setupUi(this);
+
+ raster_spinbox->setSingleStep(config.division);
+
+ connect(raster_spinbox, SIGNAL(valueChanged(int)), this, SLOT(raster_changed(int)));
+ connect(n_spinbox, SIGNAL(valueChanged(int)), this, SLOT(number_changed(int)));
+ connect(max_distance_spinbox, SIGNAL(valueChanged(int)), this, SLOT(max_distance_changed(int)));
+
+ into_single_part_allowed=true;
+
+ pull_values();
+}
+
+void PasteEventsDialog::pull_values()
+{
+ into_single_part = all_into_selected_part_checkbox->isChecked();
+ always_new_part = always_new_button->isChecked();
+ never_new_part = never_new_button->isChecked();
+
+ int temp = max_distance_spinbox->value();
+ if (temp < 0)
+ max_distance = 0;
+ else
+ max_distance = unsigned(temp);
+
+ number = n_spinbox->value();
+ raster = raster_spinbox->value();
+}
+
+void PasteEventsDialog::accept()
+{
+ pull_values();
+ QDialog::accept();
+}
+
+int PasteEventsDialog::exec()
+{
+ all_into_selected_part_checkbox->setChecked(into_single_part && into_single_part_allowed);
+ all_into_selected_part_checkbox->setEnabled(into_single_part_allowed);
+ into_single_part_allowed=true;
+
+ if (always_new_part)
+ always_new_button->setChecked(true);
+ else if (never_new_part)
+ never_new_button->setChecked(true);
+ else
+ sometimes_into_new_button->setChecked(true);
+
+ max_distance_spinbox->setValue(max_distance);
+
+ n_spinbox->setValue(number);
+ raster_spinbox->setValue(raster);
+
+ return QDialog::exec();
+}
+
+QString PasteEventsDialog::ticks_to_quarter_string(int ticks)
+{
+ if (ticks % config.division == 0)
+ {
+ return tr("%n quarter(s)", "", ticks/config.division);
+ }
+ else
+ {
+ double quarters = (double) ticks/config.division;
+ bool one = ( quarters > 0.995 && quarters < 1.005 );
+ if (one)
+ return QString::number(quarters, 'f', 2) + " " + tr("quarter");
+ else
+ return QString::number(quarters, 'f', 2) + " " + tr("quarters");
+ }
+}
+
+void PasteEventsDialog::max_distance_changed(int d)
+{
+ max_distance_quarters->setText(ticks_to_quarter_string(d));
+}
+
+void PasteEventsDialog::raster_changed(int r)
+{
+ raster_quarters->setText(ticks_to_quarter_string(r));
+ insert_quarters->setText(ticks_to_quarter_string(r*n_spinbox->value()));
+}
+
+void PasteEventsDialog::number_changed(int n)
+{
+ insert_quarters->setText(ticks_to_quarter_string(n*raster_spinbox->value()));
+}
+
+
+void PasteEventsDialog::read_configuration(Xml& xml)
+{
+ for (;;)
+ {
+ Xml::Token token = xml.parse();
+ if (token == Xml::Error || token == Xml::End)
+ break;
+
+ const QString& tag = xml.s1();
+ switch (token)
+ {
+ case Xml::TagStart:
+ if (tag == "number")
+ number=xml.parseInt();
+ else if (tag == "raster")
+ raster=xml.parseInt();
+ else if (tag == "always_new_part")
+ always_new_part=xml.parseInt();
+ else if (tag == "never_new_part")
+ never_new_part=xml.parseInt();
+ else if (tag == "max_distance")
+ max_distance=xml.parseInt();
+ else if (tag == "into_single_part")
+ into_single_part=xml.parseInt();
+ else
+ xml.unknown("PasteEventsDialog");
+ break;
+
+ case Xml::TagEnd:
+ if (tag == "pasteeventsdialog")
+ return;
+
+ default:
+ break;
+ }
+ }
+}
+
+void PasteEventsDialog::write_configuration(int level, Xml& xml)
+{
+ xml.tag(level++, "pasteeventsdialog");
+ xml.intTag(level, "number", number);
+ xml.intTag(level, "raster", raster);
+ xml.intTag(level, "always_new_part", always_new_part);
+ xml.intTag(level, "never_new_part", never_new_part);
+ xml.intTag(level, "max_distance", max_distance);
+ xml.intTag(level, "into_single_part", into_single_part);
+ xml.tag(level, "/pasteeventsdialog");
+}
+
+} // namespace MusEDialog
diff --git a/muse2/muse/widgets/pasteeventsdialog.h b/muse2/muse/widgets/pasteeventsdialog.h
new file mode 100644
index 00000000..59e6f52b
--- /dev/null
+++ b/muse2/muse/widgets/pasteeventsdialog.h
@@ -0,0 +1,69 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: pasteeventsdialog.h,v 1.1.1.1 2011/05/05 18:51:04 flo93 Exp $
+// (C) Copyright 2011 Florian Jung (flo93@sourceforge.net)
+//
+// 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; 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 __PASTEEVENTSDIALOG_H__
+#define __PASTEEVENTSDIALOG_H__
+
+#include "ui_pasteeventsdialogbase.h"
+#include <QString>
+
+class Xml;
+
+namespace MusEDialog {
+
+class PasteEventsDialog : public QDialog, public Ui::PasteEventsDialogBase
+{
+ Q_OBJECT
+ protected:
+ QString ticks_to_quarter_string(int ticks);
+
+ protected slots:
+ void accept();
+ void pull_values();
+
+ void max_distance_changed(int);
+ void raster_changed(int);
+ void number_changed(int);
+
+ public:
+ PasteEventsDialog(QWidget* parent = 0);
+
+ int number;
+ int raster;
+ bool always_new_part;
+ bool never_new_part;
+ unsigned max_distance;
+ bool into_single_part;
+ bool into_single_part_allowed;
+
+ void read_configuration(Xml& xml);
+ void write_configuration(int level, Xml& xml);
+
+
+ public slots:
+ int exec();
+};
+
+} // namespace MusEDialog
+
+#endif
+
diff --git a/muse2/muse/widgets/pasteeventsdialogbase.ui b/muse2/muse/widgets/pasteeventsdialogbase.ui
new file mode 100644
index 00000000..d1436ded
--- /dev/null
+++ b/muse2/muse/widgets/pasteeventsdialogbase.ui
@@ -0,0 +1,383 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PasteEventsDialogBase</class>
+ <widget class="QDialog" name="PasteEventsDialogBase">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>315</width>
+ <height>360</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>MusE: Paste Events</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="rangeBox">
+ <property name="title">
+ <string>Number and raster</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>insert</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QSpinBox" name="n_spinbox">
+ <property name="suffix">
+ <string> times</string>
+ </property>
+ <property name="prefix">
+ <string/>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>raster</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QSpinBox" name="raster_spinbox">
+ <property name="suffix">
+ <string> ticks</string>
+ </property>
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>999999</number>
+ </property>
+ <property name="singleStep">
+ <number>384</number>
+ </property>
+ <property name="value">
+ <number>384</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QLabel" name="insert_quarters">
+ <property name="text">
+ <string notr="true">1 quarter</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QLabel" name="raster_quarters">
+ <property name="text">
+ <string notr="true">1 quarter</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="2">
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string>Paste options</string>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ <property name="checkable">
+ <bool>false</bool>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QRadioButton" name="never_new_button">
+ <property name="text">
+ <string>Always into existing parts</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="always_new_button">
+ <property name="text">
+ <string>Never into existing parts</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QRadioButton" name="sometimes_into_new_button">
+ <property name="text">
+ <string>Into existing parts if part has not
+to be expanded by more than </string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <spacer name="horizontalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="max_distance_spinbox">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="suffix">
+ <string> ticks</string>
+ </property>
+ <property name="maximum">
+ <number>999999</number>
+ </property>
+ <property name="singleStep">
+ <number>384</number>
+ </property>
+ <property name="value">
+ <number>3072</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_5">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="max_distance_quarters">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string notr="true"> 1 quarter</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="all_into_selected_part_checkbox">
+ <property name="text">
+ <string>Put everything into the (selected) part</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <item>
+ <spacer name="Spacer1">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="okButton">
+ <property name="text">
+ <string>OK</string>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton">
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>PasteEventsDialogBase</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>PasteEventsDialogBase</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>sometimes_into_new_button</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>max_distance_quarters</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>161</x>
+ <y>201</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>260</x>
+ <y>231</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>sometimes_into_new_button</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>max_distance_spinbox</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>161</x>
+ <y>201</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>107</x>
+ <y>231</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/muse2/muse/widgets/pitchedit.cpp b/muse2/muse/widgets/pitchedit.cpp
index 7d637d01..4b937237 100644
--- a/muse2/muse/widgets/pitchedit.cpp
+++ b/muse2/muse/widgets/pitchedit.cpp
@@ -51,7 +51,7 @@ QString PitchEdit::mapValueToText(int v)
return s;
}
else
- return pitch2string(v);
+ return MusEUtil::pitch2string(v);
}
//---------------------------------------------------------
diff --git a/muse2/muse/widgets/pitchedit.h b/muse2/muse/widgets/pitchedit.h
index 0c334d22..d5bb7654 100644
--- a/muse2/muse/widgets/pitchedit.h
+++ b/muse2/muse/widgets/pitchedit.h
@@ -25,8 +25,6 @@
#include <QSpinBox>
-extern QString pitch2string(int v);
-
namespace MusEWidget {
//---------------------------------------------------------
diff --git a/muse2/muse/widgets/pitchlabel.cpp b/muse2/muse/widgets/pitchlabel.cpp
index b1f062a8..b1b9c1f1 100644
--- a/muse2/muse/widgets/pitchlabel.cpp
+++ b/muse2/muse/widgets/pitchlabel.cpp
@@ -83,7 +83,7 @@ void PitchLabel::setValue(int val)
_value = val;
QString s;
if (_pitchMode)
- s = pitch2string(_value);
+ s = MusEUtil::pitch2string(_value);
else
s.sprintf("%d", _value);
setText(s);