summaryrefslogtreecommitdiff
path: root/muse2/muse
diff options
context:
space:
mode:
Diffstat (limited to 'muse2/muse')
-rw-r--r--muse2/muse/app.cpp1421
-rw-r--r--muse2/muse/app.h142
-rw-r--r--muse2/muse/arranger/CMakeLists.txt2
-rw-r--r--muse2/muse/arranger/arranger.cpp11
-rw-r--r--muse2/muse/arranger/arranger.h7
-rw-r--r--muse2/muse/arranger/arrangerview.cpp965
-rw-r--r--muse2/muse/arranger/arrangerview.h139
-rw-r--r--muse2/muse/arranger/pcanvas.cpp169
-rw-r--r--muse2/muse/arranger/pcanvas.h6
-rw-r--r--muse2/muse/arranger/tlist.cpp32
-rw-r--r--muse2/muse/cliplist/cliplist.cpp67
-rw-r--r--muse2/muse/cliplist/cliplist.h4
-rw-r--r--muse2/muse/cobject.cpp461
-rw-r--r--muse2/muse/cobject.h111
-rw-r--r--muse2/muse/conf.cpp26
-rw-r--r--muse2/muse/functions.cpp219
-rw-r--r--muse2/muse/functions.h40
-rw-r--r--muse2/muse/gconfig.cpp1
-rw-r--r--muse2/muse/gconfig.h1
-rw-r--r--muse2/muse/liste/listedit.cpp72
-rw-r--r--muse2/muse/liste/listedit.h4
-rw-r--r--muse2/muse/main.cpp2
-rw-r--r--muse2/muse/marker/markerview.cpp77
-rw-r--r--muse2/muse/marker/markerview.h4
-rw-r--r--muse2/muse/master/lmaster.cpp67
-rw-r--r--muse2/muse/master/lmaster.h19
-rw-r--r--muse2/muse/master/masteredit.cpp90
-rw-r--r--muse2/muse/master/masteredit.h8
-rw-r--r--muse2/muse/midiedit/dcanvas.cpp2
-rw-r--r--muse2/muse/midiedit/drumedit.cpp68
-rw-r--r--muse2/muse/midiedit/drumedit.h8
-rw-r--r--muse2/muse/midiedit/pianoroll.cpp135
-rw-r--r--muse2/muse/midiedit/pianoroll.h8
-rw-r--r--muse2/muse/midiedit/prcanvas.cpp2
-rw-r--r--muse2/muse/midiedit/scoreedit.cpp145
-rw-r--r--muse2/muse/midiedit/scoreedit.h8
-rw-r--r--muse2/muse/midieditor.cpp4
-rw-r--r--muse2/muse/midieditor.h2
-rw-r--r--muse2/muse/shortcuts.cpp5
-rw-r--r--muse2/muse/shortcuts.h3
-rw-r--r--muse2/muse/songfile.cpp31
-rw-r--r--muse2/muse/structure.cpp105
-rw-r--r--muse2/muse/structure.h18
-rw-r--r--muse2/muse/waveedit/waveedit.cpp69
-rw-r--r--muse2/muse/waveedit/waveedit.h7
-rw-r--r--muse2/muse/widgets/CMakeLists.txt3
-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.cpp44
-rw-r--r--muse2/muse/widgets/mdisettings.h34
-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
54 files changed, 3586 insertions, 1581 deletions
diff --git a/muse2/muse/app.cpp b/muse2/muse/app.cpp
index 2227e7b0..91dbaed8 100644
--- a/muse2/muse/app.cpp
+++ b/muse2/muse/app.cpp
@@ -6,6 +6,8 @@
// (C) Copyright 1999-2004 Werner Schweer (ws@seh.de)
//=========================================================
+#include <typeinfo>
+
#include <QClipboard>
#include <QMessageBox>
#include <QShortcut>
@@ -14,6 +16,8 @@
#include <QWhatsThis>
#include <QSettings>
#include <QProgressDialog>
+#include <QMdiArea>
+#include <QMdiSubWindow>
#include "app.h"
#include "master/lmaster.h"
@@ -21,6 +25,7 @@
#include "amixer.h"
#include "appearance.h"
#include "arranger.h"
+#include "arrangerview.h"
#include "audio.h"
#include "audiodev.h"
#include "audioprefetch.h"
@@ -52,17 +57,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
//extern void cacheJackRouteNames();
@@ -107,17 +104,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*)));
-}
//---------------------------------------------------------
@@ -304,235 +290,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
//---------------------------------------------------------
@@ -541,7 +298,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);
@@ -558,6 +314,7 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
midiRhythmGenerator = 0;
globalSettingsConfig = 0;
markerView = 0;
+ arrangerView = 0;
softSynthesizerConfig = 0;
midiTransformerDialog = 0;
shortcutConfig = 0;
@@ -569,21 +326,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);
heartBeatTimer = new QTimer(this);
heartBeatTimer->setObjectName("timer");
connect(heartBeatTimer, SIGNAL(timeout()), song, SLOT(beat()));
-
+
+
+ connect(this, SIGNAL(activeTopWinChanged(TopWin*)), SLOT(activeTopWinChangedSlot(TopWin*)));
+
#ifdef ENABLE_PYTHON
//---------------------------------------------------
// Python bridge
@@ -728,61 +489,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
@@ -798,15 +504,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);
@@ -835,8 +537,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);
@@ -881,63 +590,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
@@ -947,13 +599,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()));
@@ -1014,47 +661,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(undoRedo->actions());
-
- tools1 = new EditToolBar(this, arrangerTools);
- addToolBar(tools1);
- tools1->setObjectName("arrangerTools");
+ QToolBar* undoToolbar = addToolBar(tr("Undo/Redo"));
+ undoToolbar->setObjectName("Undo/Redo (global)");
+ undoToolbar->addActions(undoRedo->actions());
QToolBar* transportToolbar = addToolBar(tr("Transport"));
- transportToolbar->setObjectName("Transport");
+ transportToolbar->setObjectName("Transport (global)");
transportToolbar->addActions(transportAction->actions());
QToolBar* panicToolbar = addToolBar(tr("Panic"));
- panicToolbar->setObjectName("Panic");
+ panicToolbar->setObjectName("Panic (global)");
panicToolbar->addAction(panicAction);
- visTracks = new VisibleTracks(this);
- addToolBar(visTracks);
+ requiredToolbars.push_back(tools);
+ optionalToolbars.push_back(undoToolbar);
+ optionalToolbars.push_back(transportToolbar);
+ optionalToolbars.push_back(panicToolbar);
//rlimit lim;
@@ -1087,11 +722,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);
@@ -1099,6 +743,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);
@@ -1110,72 +756,15 @@ MusE::MusE(int argc, char** argv) : QMainWindow()
menu_file->addAction(quitAction);
menu_file->addSeparator();
- //-------------------------------------------------------------
- // popup Edit
- //-------------------------------------------------------------
- menuEdit = menuBar()->addMenu(tr("&Edit"));
- menuEdit->addActions(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);
@@ -1183,25 +772,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);
@@ -1227,7 +810,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();
@@ -1238,17 +824,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);
@@ -1268,7 +873,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();
@@ -1280,24 +888,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()), mdiArea, 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"
//---------------------------------------------------
@@ -1327,24 +944,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:
@@ -1378,10 +983,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()
@@ -1495,7 +1102,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;
@@ -1604,6 +1211,7 @@ void MusE::loadProjectFile1(const QString& name, bool songTemplate, bool loadAll
viewTransportAction->setChecked(config.transportVisible);
viewBigtimeAction->setChecked(config.bigTimeVisible);
viewMarkerAction->setChecked(config.markerVisible);
+ viewArrangerAction->setChecked(config.arrangerVisible);
autoMixerAction->setChecked(automation);
@@ -1649,9 +1257,9 @@ void MusE::loadProjectFile1(const QString& name, bool songTemplate, bool loadAll
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.
@@ -1687,6 +1295,24 @@ void MusE::loadProjectFile1(const QString& name, bool songTemplate, bool loadAll
showMarker(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();
+ }
+ }
+
}
//---------------------------------------------------------
@@ -1876,8 +1502,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(configPath);
@@ -1975,16 +1603,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();
}
//---------------------------------------------------------
@@ -1994,6 +1623,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();
}
//---------------------------------------------------------
@@ -2121,48 +1787,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
@@ -2192,14 +1816,15 @@ void MusE::openInScoreEdit(ScoreEdit* destination, PartList* pl, bool allInOne)
{
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);
@@ -2229,9 +1854,10 @@ void MusE::startPianoroll(PartList* pl, bool showDefaultCtrls)
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(muse, SIGNAL(configChanged()), pianoroll, SLOT(configChanged()));
+ updateWindowMenu();
}
//---------------------------------------------------------
@@ -2250,9 +1876,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(muse,SIGNAL(configChanged()), listEditor, SLOT(configChanged()));
+ updateWindowMenu();
}
//---------------------------------------------------------
@@ -2263,8 +1890,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();
}
//---------------------------------------------------------
@@ -2275,9 +1903,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(muse, SIGNAL(configChanged()), lmaster, SLOT(configChanged()));
+ updateWindowMenu();
}
//---------------------------------------------------------
@@ -2299,9 +1928,10 @@ void MusE::startDrumEditor(PartList* pl, bool showDefaultCtrls)
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(muse, SIGNAL(configChanged()), drumEditor, SLOT(configChanged()));
+ updateWindowMenu();
}
//---------------------------------------------------------
@@ -2323,8 +1953,9 @@ void MusE::startWaveEditor(PartList* pl)
WaveEdit* waveEditor = new WaveEdit(pl);
waveEditor->show();
connect(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();
}
@@ -2380,11 +2011,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();
}
//---------------------------------------------------------
@@ -2429,63 +2061,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
@@ -2633,37 +2259,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
@@ -2671,99 +2266,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();
@@ -2776,43 +2279,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);
- }
@@ -3235,21 +2705,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);
@@ -3346,41 +2819,7 @@ void MusE::updateConfiguration()
undoAction->setShortcut(shortcuts[SHRT_UNDO].key);
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);
@@ -3390,11 +2829,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);
@@ -3430,11 +2864,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
+
}
//---------------------------------------------------------
@@ -3569,14 +3006,6 @@ void MusE::focusInEvent(QFocusEvent* ev)
QMainWindow::focusInEvent(ev);
}
-//---------------------------------------------------------
-// setUsedTool
-//---------------------------------------------------------
-
-void MusE::setUsedTool(int tool)
- {
- tools1->set(tool);
- }
//---------------------------------------------------------
@@ -3604,3 +3033,325 @@ void MusE::findUnusedWaveFiles()
UnusedWaveFiles unused(muse);
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 (debugMsg) printf("ACTIVE TOPWIN CHANGED to '%s' (%p)\n", win ? win->windowTitle().toAscii().data() : "<None>", win);
+
+ if ((win==NULL) || (win->isMdiWin()==false))
+ {
+ if (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 (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 (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 (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 (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 (debugMsg) printf(" toolbar '%s'\n", (*it)->windowTitle().toAscii().data());
+
+ addToolBar(*it);
+ foreignToolbars.push_back(*it);
+ (*it)->show();
+ }
+ else
+ {
+ if (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();
+ }
+}
+
+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;
+
+ for (QList<QMdiSubWindow*>::iterator it=wins.begin(); it!=wins.end(); it++)
+ if ((*it)->isVisible() && ((*it)->isMinimized()==false))
+ 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();
+ 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();
+ 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);
+ }
+ }
+}
diff --git a/muse2/muse/app.h b/muse2/muse/app.h
index ccf3706b..83fb70ae 100644
--- a/muse2/muse/app.h
+++ b/muse2/muse/app.h
@@ -13,7 +13,9 @@
#include "cobject.h"
#include <QFileInfo>
+#include <list>
+class TopWin;
class QCloseEvent;
class QFocusEvent;
class QMainWindow;
@@ -26,8 +28,8 @@ class QString;
class QToolBar;
class QToolButton;
class QProgressDialog;
-class VisibleTracks;
class EditToolBar;
+class QMdiArea;
class Part;
class PartList;
@@ -49,6 +51,7 @@ class AudioRecord;
class MidiFileConfig;
class MidiFilterConfig;
class MarkerView;
+class ArrangerView;
class GlobalSettingsConfig;
class MidiControllerEditDialog;
class MidiInputTransformDialog;
@@ -75,13 +78,7 @@ class Undo;
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,
@@ -101,26 +98,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;
@@ -135,6 +129,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;
@@ -147,18 +147,18 @@ class MusE : public QMainWindow
QFileInfo project;
QToolBar *tools;
- EditToolBar *tools1;
- VisibleTracks *visTracks;
+ // when adding a toolbar to the main window, remember adding it to
+ // either the requiredToolbars or optionalToolbars list!
Transport* transport;
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.
RoutePopupMenu* routingPopupMenu;
@@ -185,6 +185,7 @@ class MusE : public QMainWindow
ToplevelList toplevels;
ClipListEdit* clipListEdit;
MarkerView* markerView;
+ ArrangerView* arrangerView;
MidiTransformerDialog* midiTransformerDialog;
QMenu* openRecent;
@@ -214,16 +215,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();
@@ -244,6 +243,7 @@ class MusE : public QMainWindow
void toggleTransport(bool);
void toggleMarker(bool);
+ void toggleArranger(bool);
void toggleBigTime(bool);
void toggleMixer1(bool);
void toggleMixer2(bool);
@@ -253,30 +253,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);
@@ -284,8 +263,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();
@@ -300,11 +277,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();
@@ -316,11 +288,19 @@ 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();
public slots:
bool saveAs();
@@ -328,7 +308,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();
@@ -337,12 +317,38 @@ 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();
@@ -366,6 +372,10 @@ class MusE : public QMainWindow
void showTransport(bool flag);
RoutePopupMenu* getRoutingPopupMenu();
+ const ToplevelList* getToplevels() { return &toplevels; }
+
+ TopWin* getCurrentMenuSharingTopwin() { return currentMenuSharingTopwin; }
+
#ifdef HAVE_LASH
void lash_idle_cb ();
#endif
diff --git a/muse2/muse/arranger/CMakeLists.txt b/muse2/muse/arranger/CMakeLists.txt
index c681245e..b679a37a 100644
--- a/muse2/muse/arranger/CMakeLists.txt
+++ b/muse2/muse/arranger/CMakeLists.txt
@@ -24,6 +24,7 @@
QT4_WRAP_CPP (arranger_mocs
alayout.h
arranger.h
+ arrangerview.h
pcanvas.h
tlist.h
)
@@ -34,6 +35,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 65a705e2..d9712427 100644
--- a/muse2/muse/arranger/arranger.cpp
+++ b/muse2/muse/arranger/arranger.cpp
@@ -23,6 +23,7 @@
#include <QWheelEvent>
#include <QPainter>
//#include <QStackedWidget>
+#include "arrangerview.h"
#include "arranger.h"
#include "song.h"
@@ -96,7 +97,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);
@@ -107,11 +108,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);
//---------------------------------------------------
@@ -381,7 +383,7 @@ Arranger::Arranger(QMainWindow* parent, const char* name)
canvas->setCanvasTools(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*)));
@@ -746,6 +748,9 @@ 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;
diff --git a/muse2/muse/arranger/arranger.h b/muse2/muse/arranger/arranger.h
index 262d7464..4e91272e 100644
--- a/muse2/muse/arranger/arranger.h
+++ b/muse2/muse/arranger/arranger.h
@@ -38,6 +38,7 @@ class TLLayout;
class WidgetStack;
class AudioStrip;
class SpinBox;
+class ArrangerView;
//---------------------------------------------------------
// WidgetStack
@@ -149,10 +150,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,
+ enum { CMD_CUT_PART, CMD_COPY_PART, CMD_COPY_PART_IN_RANGE, CMD_PASTE_PART, CMD_PASTE_CLONE_PART, CMD_PASTE_PART_TO_TRACK, CMD_PASTE_CLONE_PART_TO_TRACK,
CMD_INSERT_PART, CMD_INSERT_EMPTYMEAS };
- Arranger(QMainWindow* parent, const char* name = 0);
+ Arranger(ArrangerView* parent, const char* name = 0);
PartCanvas* getCanvas() { return canvas; }
void setMode(int);
@@ -169,6 +170,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..4e844f35
--- /dev/null
+++ b/muse2/muse/arranger/arrangerview.cpp
@@ -0,0 +1,965 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// arrangerview.cpp
+// (C) Copyright 2011 Florian Jung (flo93@users.sourceforge.net)
+//=========================================================
+
+
+#include <QLayout>
+#include <QSizeGrip>
+#include <QLabel>
+#include <QScrollBar>
+#include <QPushButton>
+#include <QToolButton>
+#include <QToolTip>
+#include <QMenu>
+#include <QSignalMapper>
+#include <QMenuBar>
+#include <QApplication>
+#include <QClipboard>
+#include <QDir>
+#include <QKeySequence>
+#include <QKeyEvent>
+#include <QGridLayout>
+#include <QResizeEvent>
+#include <QCloseEvent>
+#include <QMimeData>
+#include <QScrollArea>
+#include <QSettings>
+#include <QImage>
+#include <QInputDialog>
+#include <QMessageBox>
+#include <QShortcut>
+
+#include <stdio.h>
+#include <math.h>
+
+#include "arrangerview.h"
+#include "visibletracks.h"
+#include "structure.h"
+
+
+#include <iostream>
+#include <sstream>
+using namespace std;
+
+#include "app.h"
+#include "xml.h"
+#include "mtscale.h"
+#include "al/sig.h"
+#include "scoreedit.h"
+#include "tools.h"
+#include "ttoolbar.h"
+#include "tb1.h"
+#include "globals.h"
+#include "gconfig.h"
+#include "icons.h"
+#include "audio.h"
+#include "functions.h"
+#include "helper.h"
+#include "sig.h"
+#include "song.h"
+#include "shortcuts.h"
+#include "synth.h"
+
+#ifdef DSSI_SUPPORT
+#include "dssihost.h"
+#endif
+
+#ifdef VST_SUPPORT
+#include "vst.h"
+#endif
+
+
+//---------------------------------------------------------
+// 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;
+ }
+
+
+
+
+
+//---------------------------------------------------------
+// ArrangerView
+//---------------------------------------------------------
+
+ArrangerView::ArrangerView(QWidget* parent)
+ : TopWin(TopWin::ARRANGER, parent, "arrangerview", Qt::Window)
+{
+ //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(undoRedo->actions());
+
+
+ QToolBar* panic_toolbar = addToolBar(tr("panic"));
+ panic_toolbar->setObjectName("panic");
+ panic_toolbar->addAction(panicAction);
+
+ QToolBar* transport_toolbar = addToolBar(tr("transport"));
+ transport_toolbar->setObjectName("transport");
+ transport_toolbar->addActions(transportAction->actions());
+
+ editTools = new EditToolBar(this, arrangerTools);
+ addToolBar(editTools);
+ editTools->setObjectName("arrangerTools");
+
+ visTracks = new 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);
+ 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);
+
+ 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(undoRedo->actions());
+ menuEdit->addSeparator();
+
+ menuEdit->addAction(editCutAction);
+ menuEdit->addAction(editCopyAction);
+ menuEdit->addAction(editCopyRangeAction);
+ 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);
+
+ 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(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(editCopyRangeAction, CMD_COPY_RANGE);
+ 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()), 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();
+
+ initalizing=false;
+}
+
+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 == "arranger")
+ return;
+ default:
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// writeConfiguration
+//---------------------------------------------------------
+
+void ArrangerView::writeConfiguration(int level, Xml& xml)
+ {
+ xml.tag(level++, "arranger");
+ TopWin::writeConfiguration(ARRANGER, level, xml);
+ xml.tag(level, "/arranger");
+ }
+
+
+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_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_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=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 = ::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];
+}
+
+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);
+ 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);
+ 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);
+ editInsertAction->setEnabled(flag);
+ editPasteCloneAction->setEnabled(flag);
+ editPaste2TrackAction->setEnabled(flag);
+ editPasteC2TAction->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..580173f9
--- /dev/null
+++ b/muse2/muse/arranger/arrangerview.h
@@ -0,0 +1,139 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// arrangerview.h
+// (C) Copyright 2011 Florian Jung (flo93@users.sourceforge.net)
+//=========================================================
+
+#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"
+
+class VisibleTracks;
+
+
+class ArrangerView : public TopWin
+{
+ Q_OBJECT
+
+ private:
+
+ enum cmd_enum
+ {CMD_CUT, CMD_COPY, CMD_COPY_RANGE, 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_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;
+
+ EditToolBar *editTools;
+ 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, *editPasteAction, *editInsertAction, *editPasteCloneAction, *editPaste2TrackAction;
+ 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);
+
+ 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 ef45c9df..094cf68a 100644
--- a/muse2/muse/arranger/pcanvas.cpp
+++ b/muse2/muse/arranger/pcanvas.cpp
@@ -25,6 +25,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"
@@ -157,15 +160,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;
+ }
}
//---------------------------------------------------------
@@ -188,6 +195,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);
@@ -633,17 +641,17 @@ QMenu* PartCanvas::genItemPopup(CItem* item)
partPopup->addSeparator();
switch(trackType) {
case Track::MIDI: {
- partPopup->addAction(muse->startPianoEditAction);
- partPopup->addMenu(muse->scoreSubmenu);
- partPopup->addAction(muse->startScoreEditAction);
- partPopup->addAction(muse->startListEditAction);
+ partPopup->addAction(muse->arranger->parentWin->startPianoEditAction);
+ partPopup->addMenu(muse->arranger->parentWin->scoreSubmenu);
+ partPopup->addAction(muse->arranger->parentWin->startScoreEditAction);
+ partPopup->addAction(muse->arranger->parentWin->startListEditAction);
QAction *act_mexport = partPopup->addAction(tr("save part to disk"));
act_mexport->setData(16);
}
break;
case Track::DRUM: {
- partPopup->addAction(muse->startDrumEditAction);
- partPopup->addAction(muse->startListEditAction);
+ partPopup->addAction(muse->arranger->parentWin->startDrumEditAction);
+ partPopup->addAction(muse->arranger->parentWin->startListEditAction);
QAction *act_dexport = partPopup->addAction(tr("save part to disk"));
act_dexport->setData(16);
}
@@ -690,6 +698,7 @@ void PartCanvas::itemPopup(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();
@@ -831,25 +840,29 @@ void PartCanvas::mousePress(QMouseEvent* event)
}
QPoint pt = event->pos();
CItem* item = items.find(pt);
- if (item == 0 && _tool!=AutomationTool)
- return;
+
switch (_tool) {
default:
- emit trackChanged(item->part()->track());
+ if (item)
+ emit trackChanged(item->part()->track());
+ else
+ emit trackChanged(NULL);
break;
case CutTool:
- splitItem(item, pt);
+ if (item) splitItem(item, pt);
break;
case GlueTool:
- glueItem(item);
+ if (item) glueItem(item);
break;
case 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 AutomationTool:
if (automation.controllerState != doNothing)
@@ -928,7 +941,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 )
@@ -2573,6 +2586,9 @@ void PartCanvas::cmd(int cmd)
case CMD_COPY_PART:
copy(&pl);
break;
+ case CMD_COPY_PART_IN_RANGE:
+ copy_in_range(&pl);
+ break;
case CMD_PASTE_PART:
paste(false, false);
break;
@@ -2602,6 +2618,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 (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())
@@ -2739,6 +2819,7 @@ 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));
}
else
@@ -2859,6 +2940,7 @@ void PartCanvas::paste(bool clone, bool toTrack, bool doInsert)
{
int endPos=0;
unsigned int startPos=song->vcpos();
+ deselectAll();
Undo operations=pasteAt(txt, track, startPos, clone, toTrack, &endPos);
Pos p(endPos, true);
song->setPos(0, p);
@@ -2873,40 +2955,6 @@ void PartCanvas::paste(bool clone, bool toTrack, bool doInsert)
}
//---------------------------------------------------------
-// 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 (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
//---------------------------------------------------------
@@ -3029,6 +3077,7 @@ void PartCanvas::viewDropEvent(QDropEvent* event)
track = tracks->index(trackNo);
if (track)
{
+ deselectAll();
Undo temp=pasteAt(text, track, x);
song->applyOperationGroup(temp);
}
diff --git a/muse2/muse/arranger/pcanvas.h b/muse2/muse/arranger/pcanvas.h
index 210557dc..837d8c05 100644
--- a/muse2/muse/arranger/pcanvas.h
+++ b/muse2/muse/arranger/pcanvas.h
@@ -109,9 +109,9 @@ class PartCanvas : public Canvas {
void splitItem(CItem* item, const QPoint&);
void copy(PartList*);
+ void copy_in_range(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);
//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);
@@ -126,8 +126,6 @@ class PartCanvas : public Canvas {
double dbToVal(double inDb);
double valToDb(double inV);
-
-
protected:
virtual void drawCanvas(QPainter&, const QRect&);
virtual void endMoveItems(const QPoint&, DragType, int dir);
@@ -150,7 +148,7 @@ class PartCanvas : public 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,
+ enum { CMD_CUT_PART, CMD_COPY_PART, CMD_COPY_PART_IN_RANGE, CMD_PASTE_PART, CMD_PASTE_CLONE_PART, CMD_PASTE_PART_TO_TRACK, CMD_PASTE_CLONE_PART_TO_TRACK,
CMD_INSERT_PART, CMD_INSERT_EMPTYMEAS };
PartCanvas(int* raster, QWidget* parent, int, int);
diff --git a/muse2/muse/arranger/tlist.cpp b/muse2/muse/arranger/tlist.cpp
index 6fe2f31d..903c78ba 100644
--- a/muse2/muse/arranger/tlist.cpp
+++ b/muse2/muse/arranger/tlist.cpp
@@ -1384,24 +1384,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 && 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 && 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 5a5796aa..ada25af9 100644
--- a/muse2/muse/cliplist/cliplist.cpp
+++ b/muse2/muse/cliplist/cliplist.cpp
@@ -7,6 +7,9 @@
//=========================================================
#include <QCloseEvent>
+#include <QMenuBar>
+#include <QMenu>
+#include <QToolBar>
#include "cliplist.h"
#include "song.h"
@@ -103,7 +106,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"));
@@ -113,6 +116,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(undoRedo->actions());
+
+
+ QToolBar* panic_toolbar = addToolBar(tr("panic"));
+ panic_toolbar->setObjectName("panic");
+ panic_toolbar->addAction(panicAction);
+
+ QToolBar* transport_toolbar = addToolBar(tr("transport"));
+ transport_toolbar->setObjectName("transport");
+ transport_toolbar->addActions(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;
@@ -129,6 +151,8 @@ ClipListEdit::ClipListEdit(QWidget* parent)
connect(editor->len, SIGNAL(valueChanged(const Pos&)), SLOT(lenChanged(const Pos&)));
updateList();
+
+ initalizing=false;
}
ClipListEdit::~ClipListEdit()
@@ -155,7 +179,7 @@ void ClipListEdit::updateList()
void ClipListEdit::closeEvent(QCloseEvent* e)
{
- emit deleted((unsigned long)this);
+ emit deleted(static_cast<TopWin*>(this));
e->accept();
}
@@ -211,6 +235,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 d440aec3..1932e975 100644
--- a/muse2/muse/cliplist/cliplist.h
+++ b/muse2/muse/cliplist/cliplist.h
@@ -54,13 +54,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 22f675a3..1dabfe76 100644
--- a/muse2/muse/cobject.cpp
+++ b/muse2/muse/cobject.cpp
@@ -9,6 +9,72 @@
#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;
+
+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();
+
+ initalizing=true;
+
+ _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
@@ -23,14 +89,26 @@ void TopWin::readStatus(Xml& xml)
QString tag = xml.s1();
switch (token) {
case Xml::TagStart:
- if (tag == "geometry") {
- QRect r(readGeometry(xml, tag));
- resize(r.size());
- move(r.topLeft());
+ 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 (!restoreState(QByteArray::fromHex(xml.parse1().toAscii())))
- fprintf(stderr,"ERROR: couldn't restore toolbars. however, this is not really a problem.\n");
+ 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");
@@ -51,25 +129,368 @@ void TopWin::readStatus(Xml& xml)
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());
+ // 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");
}
-TopWin::TopWin(QWidget* parent, const char* name,
- Qt::WindowFlags f) : QMainWindow(parent, f)
+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 (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 (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 (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)
{
- setObjectName(QString(name));
- //setAttribute(Qt::WA_DeleteOnClose);
- // Allow multiple rows. Tim.
- //setDockNestingEnabled(true);
- setIconSize(ICON_SIZE);
+ 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
+ {
+ if (initalizing)
+ {
+ printf("THIS SHOULD NEVER HAPPEN: STORE INIT STATE CALLED WHILE INITING! please IMMEDIATELY report that to flo!\n");
+ exit(1);
+ }
+
+ _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 9a80b2b1..1282b259 100644
--- a/muse2/muse/cobject.h
+++ b/muse2/muse/cobject.h
@@ -13,8 +13,14 @@
#include <QMainWindow>
#include <list>
+#include <QByteArray>
+#include <QString>
+class QMdiSubWindow;
+class QFocusEvent;
+class QToolBar;
class Xml;
+class QAction;
//---------------------------------------------------------
// TopWin
@@ -25,40 +31,93 @@ 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();
+
+ bool initalizing; //if true, no state is saved
+
+ 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 89cdd04d..5fea91a5 100644
--- a/muse2/muse/conf.cpp
+++ b/muse2/muse/conf.cpp
@@ -19,6 +19,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"
@@ -878,12 +883,6 @@ void readConfiguration(Xml& xml, bool readOnlySequencer)
}
//else if (tag == "midiSyncInfo")
// readConfigMidiSyncInfo(xml);
- else if (tag == "arranger") {
- if (muse && muse->arranger)
- muse->arranger->readStatus(xml);
- else
- xml.skip(tag);
- }
else if (tag == "drumedit")
DrumEdit::readConfiguration(xml);
else if (tag == "pianoroll")
@@ -894,6 +893,16 @@ 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 == "arranger")
+ ArrangerView::readConfiguration(xml);
else if (tag == "dialogs")
read_function_dialog_config(xml);
else if (tag == "shortcuts")
@@ -1338,6 +1347,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);
diff --git a/muse2/muse/functions.cpp b/muse2/muse/functions.cpp
index 2568899a..025f6c63 100644
--- a/muse2/muse/functions.cpp
+++ b/muse2/muse/functions.cpp
@@ -28,6 +28,18 @@
#include <QMessageBox>
#include <QClipboard>
+#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"
+
+
using namespace std;
GateTime* gatetime_dialog=NULL;
@@ -72,6 +84,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;
@@ -103,6 +146,8 @@ map<Event*, Part*> get_events(const set<Part*>& parts, int range)
}
+
+
bool modify_notelen(const set<Part*>& parts)
{
if (!gatetime_dialog->exec())
@@ -214,6 +259,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);
diff --git a/muse2/muse/functions.h b/muse2/muse/functions.h
index 90fc64e9..4e2e7151 100644
--- a/muse2/muse/functions.h
+++ b/muse2/muse/functions.h
@@ -8,24 +8,25 @@
#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 <QWidget>
class QString;
class QMimeData;
class Undo;
+class GateTime;
+class Velocity;
+class Quantize;
+class Remove;
+class DelOverlaps;
+class Setlen;
+class Move;
+class Transpose;
+class Crescendo;
+class Legato;
+
extern GateTime* gatetime_dialog;
extern Velocity* velocity_dialog;
extern Quantize* quantize_dialog;
@@ -40,6 +41,11 @@ extern Legato* legato_dialog;
void init_function_dialogs(QWidget* parent);
+#define FUNCTION_RANGE_ONLY_SELECTED 1
+#define FUNCTION_RANGE_ONLY_BETWEEN_MARKERS 2
+
+
+
std::set<Part*> partlist_to_set(PartList* pl);
std::set<Part*> part_to_set(Part* p);
std::map<Event*, Part*> get_events(const std::set<Part*>& parts, int range);
@@ -71,6 +77,18 @@ 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);
diff --git a/muse2/muse/gconfig.cpp b/muse2/muse/gconfig.cpp
index 49a6d572..6583dae4 100644
--- a/muse2/muse/gconfig.cpp
+++ b/muse2/muse/gconfig.cpp
@@ -148,6 +148,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 acf39782..5b8e9585 100644
--- a/muse2/muse/gconfig.h
+++ b/muse2/muse/gconfig.h
@@ -120,6 +120,7 @@ struct GlobalConfigValues {
bool mixer1Visible;
bool mixer2Visible;
bool markerVisible;
+ bool arrangerVisible;
bool showSplashScreen;
int canvasShowPartType; // 1 - names, 2 events
diff --git a/muse2/muse/liste/listedit.cpp b/muse2/muse/liste/listedit.cpp
index 61bd8ee4..bc90433d 100644
--- a/muse2/muse/liste/listedit.cpp
+++ b/muse2/muse/liste/listedit.cpp
@@ -165,7 +165,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();
}
@@ -445,7 +445,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);
@@ -496,14 +496,29 @@ ListEdit::ListEdit(PartList* pl)
connect(editSignalMapper, SIGNAL(mapped(int)), SLOT(cmd(int)));
- //---------ToolBar----------------------------------
-
- listTools = addToolBar(tr("List tools"));
- listTools->addActions(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(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(panicAction);
+
+ QToolBar* transport_toolbar = addToolBar(tr("transport"));
+ transport_toolbar->setObjectName("transport");
+ transport_toolbar->addActions(transportAction->actions());
+
//
//---------------------------------------------------
// liste
@@ -574,6 +589,10 @@ ListEdit::ListEdit(PartList* pl)
}
initShortcuts();
+
+ setWindowTitle("MusE: List Editor");
+
+ initalizing=false;
}
//---------------------------------------------------------
@@ -813,6 +832,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 397a5e08..1b1a8ece 100644
--- a/muse2/muse/liste/listedit.h
+++ b/muse2/muse/liste/listedit.h
@@ -68,13 +68,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 192c0bd3..ebdf7b5d 100644
--- a/muse2/muse/main.cpp
+++ b/muse2/muse/main.cpp
@@ -101,6 +101,8 @@ class MuseApplication : public QApplication {
void setMuse(MusE* m) {
muse = m;
+
+ connect(this,SIGNAL(focusChanged(QWidget*,QWidget*)),muse,SLOT(focusChanged(QWidget*,QWidget*)));
#ifdef HAVE_LASH
if(useLASH)
startTimer (300);
diff --git a/muse2/muse/marker/markerview.cpp b/muse2/muse/marker/markerview.cpp
index d22807b6..fabb35fd 100644
--- a/muse2/muse/marker/markerview.cpp
+++ b/muse2/muse/marker/markerview.cpp
@@ -141,7 +141,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();
}
@@ -151,7 +151,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);
@@ -172,15 +172,32 @@ MarkerView::MarkerView(QWidget* parent)
editMenu->addAction(markerAdd);
editMenu->addAction(markerDelete);
-
- //---------ToolBar----------------------------------
- tools = addToolBar(tr("marker-tools"));
- tools->addActions(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(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(panicAction);
+
+ QToolBar* transport_toolbar = addToolBar(tr("transport"));
+ transport_toolbar->setObjectName("transport");
+ transport_toolbar->addActions(transportAction->actions());
+
//---------------------------------------------------
// master
//---------------------------------------------------
@@ -269,7 +286,8 @@ MarkerView::MarkerView(QWidget* parent)
// bug: 2811156 Softsynth GUI unclosable with XFCE4 (and a few others)
show();
hide();
-
+
+ initalizing=false;
}
//---------------------------------------------------------
@@ -296,7 +314,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")
@@ -314,6 +335,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 5ad4f4bd..bab0f6e3 100644
--- a/muse2/muse/marker/markerview.h
+++ b/muse2/muse/marker/markerview.h
@@ -77,7 +77,7 @@ class MarkerView : public TopWin {
void songChanged(int);
signals:
- void deleted(unsigned long);
+ void deleted(TopWin*);
void closed();
public:
@@ -85,6 +85,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 fd035355..5370a493 100644
--- a/muse2/muse/master/lmaster.cpp
+++ b/muse2/muse/master/lmaster.cpp
@@ -40,6 +40,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()
@@ -101,7 +102,7 @@ QString keyToString(key_enum key)
void LMaster::closeEvent(QCloseEvent* e)
{
- emit deleted((unsigned long)this);
+ emit deleted(static_cast<TopWin*>(this));
e->accept();
}
@@ -120,7 +121,7 @@ void LMaster::songChanged(int type)
//---------------------------------------------------------
LMaster::LMaster()
- : MidiEditor(0, 0, 0)
+ : MidiEditor(TopWin::LMASTER, 0, 0, 0)
{
pos_editor = 0;
tempo_editor = 0;
@@ -153,6 +154,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()));
@@ -169,11 +176,13 @@ LMaster::LMaster()
connect(signalMapper, SIGNAL(mapped(int)), SLOT(cmd(int)));
- //---------ToolBar----------------------------------
- tools = addToolBar(tr("Master tools"));
- tools->addActions(undoRedo->actions());
+ // Toolbars ---------------------------------------------------------
+ QToolBar* undo_tools=addToolBar(tr("Undo/Redo tools"));
+ undo_tools->setObjectName("Undo/Redo tools");
+ undo_tools->addActions(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();
@@ -187,6 +196,14 @@ LMaster::LMaster()
edit->addWidget(timeSigButton);
edit->addWidget(keyButton);
+ QToolBar* panic_toolbar = addToolBar(tr("panic"));
+ panic_toolbar->setObjectName("panic");
+ panic_toolbar->addAction(panicAction);
+
+ QToolBar* transport_toolbar = addToolBar(tr("transport"));
+ transport_toolbar->setObjectName("transport");
+ transport_toolbar->addActions(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()));
@@ -244,6 +261,7 @@ LMaster::LMaster()
connect(keyButton, SIGNAL(clicked()), SLOT(insertKey()));
initShortcuts();
+ initalizing=false;
}
//---------------------------------------------------------
@@ -405,6 +423,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 837d6d76..9372d1b2 100644
--- a/muse2/muse/master/lmaster.h
+++ b/muse2/muse/master/lmaster.h
@@ -14,15 +14,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;
@@ -97,12 +92,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; }
@@ -127,7 +122,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();
@@ -158,7 +153,7 @@ class LMaster : public MidiEditor {
void configChanged();
signals:
- void deleted(unsigned long);
+ void deleted(TopWin*);
void seekTo(int tick);
public:
@@ -166,6 +161,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 fafa3b4f..1eb2d071 100644
--- a/muse2/muse/master/masteredit.cpp
+++ b/muse2/muse/master/masteredit.cpp
@@ -31,12 +31,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
@@ -44,11 +42,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();
}
@@ -85,22 +79,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(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(undoRedo->actions());
+
+
+ QToolBar* panic_toolbar = addToolBar(tr("panic"));
+ panic_toolbar->setObjectName("panic");
+ panic_toolbar->addAction(panicAction);
+
+ QToolBar* transport_toolbar = addToolBar(tr("transport"));
+ transport_toolbar->setObjectName("transport");
+ transport_toolbar->addActions(transportAction->actions());
EditToolBar* tools2 = new EditToolBar(this, PointerTool | PencilTool | RubberTool);
addToolBar(tools2);
@@ -241,12 +246,8 @@ 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();
+ initalizing=false;
}
//---------------------------------------------------------
@@ -335,12 +336,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;
@@ -361,9 +358,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");
}
@@ -432,34 +427,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 b2b06291..4e66f70e 100644
--- a/muse2/muse/master/masteredit.h
+++ b/muse2/muse/master/masteredit.h
@@ -61,14 +61,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);
@@ -81,7 +75,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 fd046bc7..6abaaa51 100644
--- a/muse2/muse/midiedit/dcanvas.cpp
+++ b/muse2/muse/midiedit/dcanvas.cpp
@@ -158,8 +158,6 @@ Undo DrumCanvas::moveCanvasItems(CItemList& items, int dp, int dx, DragType dtyp
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/drumedit.cpp b/muse2/muse/midiedit/drumedit.cpp
index ee610683..14419e0f 100644
--- a/muse2/muse/midiedit/drumedit.cpp
+++ b/muse2/muse/midiedit/drumedit.cpp
@@ -44,6 +44,7 @@
#include "audio.h"
#include "gconfig.h"
#include "functions.h"
+#include "widgets/function_dialogs/quantize.h"
/*
static const char* map_file_pattern[] = {
@@ -61,11 +62,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;
@@ -146,7 +144,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();
}
@@ -155,11 +153,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);
@@ -263,6 +261,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)));
@@ -481,9 +484,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()));
@@ -506,10 +506,10 @@ 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();
+ initalizing=false;
}
//---------------------------------------------------------
@@ -760,16 +760,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;
@@ -791,11 +787,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");
}
@@ -1044,37 +1038,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();
- }
//---------------------------------------------------------
diff --git a/muse2/muse/midiedit/drumedit.h b/muse2/muse/midiedit/drumedit.h
index 64390cd9..a242eda8 100644
--- a/muse2/muse/midiedit/drumedit.h
+++ b/muse2/muse/midiedit/drumedit.h
@@ -71,9 +71,7 @@ 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;
@@ -88,10 +86,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();
@@ -122,7 +116,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/pianoroll.cpp b/muse2/muse/midiedit/pianoroll.cpp
index 9ab5e063..89f84062 100644
--- a/muse2/muse/midiedit/pianoroll.cpp
+++ b/muse2/muse/midiedit/pianoroll.cpp
@@ -53,10 +53,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;
@@ -69,10 +66,9 @@ static int pianorollTools = PointerTool | PencilTool | RubberTool | DrawTool;
//---------------------------------------------------------
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;
@@ -144,36 +140,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);
@@ -224,6 +194,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");
@@ -468,9 +478,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()));
@@ -498,10 +505,8 @@ 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();
+ initalizing=false;
}
//---------------------------------------------------------
@@ -788,7 +793,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();
}
@@ -809,12 +814,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;
@@ -835,10 +836,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");
}
@@ -1206,38 +1205,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();
- }
/*
diff --git a/muse2/muse/midiedit/pianoroll.h b/muse2/muse/midiedit/pianoroll.h
index 1f53254d..b55d7689 100644
--- a/muse2/muse/midiedit/pianoroll.h
+++ b/muse2/muse/midiedit/pianoroll.h
@@ -12,7 +12,6 @@
#include <QResizeEvent>
#include <QLabel>
#include <QKeyEvent>
-#include <QByteArray>
#include <values.h>
#include "noteinfo.h"
@@ -117,8 +116,6 @@ class PianoRoll : public MidiEditor {
int colorMode;
static int _rasterInit;
- static int _widthInit, _heightInit;
- static QByteArray _toolbarInit;
static int colorModeInit;
@@ -133,9 +130,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*);
@@ -160,7 +154,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 75171bf5..43edc7f5 100644
--- a/muse2/muse/midiedit/prcanvas.cpp
+++ b/muse2/muse/midiedit/prcanvas.cpp
@@ -369,8 +369,6 @@ Undo PianoCanvas::moveCanvasItems(CItemList& items, int dp, int dx, DragType dty
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/scoreedit.cpp b/muse2/muse/midiedit/scoreedit.cpp
index fcac6463..afcc3e37 100644
--- a/muse2/muse/midiedit/scoreedit.cpp
+++ b/muse2/muse/midiedit/scoreedit.cpp
@@ -30,6 +30,7 @@
#include <QImage>
#include <QInputDialog>
#include <QMessageBox>
+#include <QSpinBox>
#include <stdio.h>
#include <math.h>
@@ -146,9 +147,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;
//---------------------------------------------------------
@@ -156,13 +154,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();
@@ -389,7 +385,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);
@@ -408,7 +428,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"));
@@ -423,31 +443,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(muse, SIGNAL(configChanged()), SLOT(init_shortcuts()));
@@ -458,9 +460,6 @@ 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)));
score_canvas->fully_recalculate();
@@ -473,6 +472,9 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
apply_velo=true;
+
+ initTopwinState();
+ initalizing=false;
}
void ScoreEdit::init_shortcuts()
@@ -641,30 +643,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)
{
@@ -1035,12 +1017,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;
@@ -1059,9 +1037,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");
}
@@ -3937,7 +3913,7 @@ void ScoreCanvas::mouseMoveEvent (QMouseEvent* event)
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 (debugMsg) cout << "resized note would exceed its part; limiting length to " << tmp.lenTick() << endl;
@@ -4467,39 +4443,49 @@ void staff_t::update_part_indices()
/* BUGS and potential bugs
+ * o THIS SHOULD NEVER HAPPEN: could not split note (found by tim)
+ *
* o tied notes don't work properly when there's a key-change in
* between, for example, when a cis is tied to a des
* o schedule_all_same_len_parts: if there are two clones A and B,
* 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
*
* CURRENT TODO
+ * M o remove that ugly "bool initalizing" stuff. it's probably unneeded (watch out for the FINDMICH message)
+ * M o shortcuts for "pencil" in score editor etc.
+ * 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 replace "insert" and "paste" by a paste-dialog ("move other notes" or "overwrite notes" or "mix with notes")
+ * skip dialog when there is nothing to erase, move or merge with (i.e., at the end of the song)
+ * o remove movePartsTotheRight function
+ * o ctrl+v uses default settings, ctrl+shift+v shows a dialog (with a "this is default" button)
+ * o ctrl+b and ctrl+shift+b do the same, only that they paste as clones
+ *
+ * IMPORTANT TODO
+ * o add "dotted quarter" quantize option (for 6/8 beat)
+ * o insert spacer between settings and "Ok" buttons in function dialogs
+ * ! o fix sigedit boxes
+ *
+ * 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
@@ -4522,7 +4508,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
@@ -4530,7 +4515,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
*
*
@@ -4541,8 +4526,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 a2b25f7d..0265c11d 100644
--- a/muse2/muse/midiedit/scoreedit.h
+++ b/muse2/muse/midiedit/scoreedit.h
@@ -81,10 +81,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();
@@ -150,8 +146,6 @@ class ScoreEdit : public TopWin
bool apply_velo;
static set<QString> names;
- static int width_init, height_init;
- static QByteArray default_toolbar_state;
QString name;
@@ -168,7 +162,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);
diff --git a/muse2/muse/midieditor.cpp b/muse2/muse/midieditor.cpp
index ce6c52f8..19ecd93f 100644
--- a/muse2/muse/midieditor.cpp
+++ b/muse2/muse/midieditor.cpp
@@ -23,8 +23,8 @@
// 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;
diff --git a/muse2/muse/midieditor.h b/muse2/muse/midieditor.h
index 78873a6a..41967f9c 100644
--- a/muse2/muse/midieditor.h
+++ b/muse2/muse/midieditor.h
@@ -63,7 +63,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();
diff --git a/muse2/muse/shortcuts.cpp b/muse2/muse/shortcuts.cpp
index 86ab0dcd..d677c15c 100644
--- a/muse2/muse/shortcuts.cpp
+++ b/muse2/muse/shortcuts.cpp
@@ -37,7 +37,8 @@ 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_UNDO, Qt::CTRL + Qt::Key_Z, "Edit: Undo", INVIS_SHRT, "undo");
defShrt(SHRT_REDO, Qt::CTRL + Qt::Key_Y, "Edit: Redo", INVIS_SHRT, "redo");
@@ -80,7 +81,7 @@ 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_COPY_RANGE, 0, "Edit: Copy in 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");
diff --git a/muse2/muse/shortcuts.h b/muse2/muse/shortcuts.h
index b72e0207..5acde313 100644
--- a/muse2/muse/shortcuts.h
+++ b/muse2/muse/shortcuts.h
@@ -63,6 +63,7 @@ enum {
SHRT_TOGGLE_METRO, // C
SHRT_START_REC, // *(keypad)
SHRT_REC_CLEAR, // *(keypad)
+ SHRT_FULLSCREEN,
//Main + Drumeditor
SHRT_NEW, //Ctrl+N
@@ -103,7 +104,7 @@ enum {
SHRT_GLOBAL_CUT, //Default: undefined
SHRT_GLOBAL_INSERT, //Default: undefined
SHRT_GLOBAL_SPLIT, //Default: undefined
- SHRT_COPY_RANGE, //Default: undefined
+ SHRT_COPY_RANGE, //Default: Ctrl+Shift+C
SHRT_CUT_EVENTS, //Default: undefined
SHRT_OPEN_TRANSPORT, //F11
diff --git a/muse2/muse/songfile.cpp b/muse2/muse/songfile.cpp
index 72cacfaa..fb279e92 100644
--- a/muse2/muse/songfile.cpp
+++ b/muse2/muse/songfile.cpp
@@ -1011,15 +1011,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());
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);
}
@@ -1027,7 +1027,7 @@ void MusE::readToplevels(Xml& xml)
if(!pl->empty())
{
startDrumEditor(pl);
- toplevels.back().cobject()->readStatus(xml);
+ toplevels.back()->readStatus(xml);
pl = new PartList;
}
}
@@ -1035,33 +1035,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");
@@ -1531,8 +1538,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 f8d92497..1fb1668d 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)
@@ -16,7 +16,8 @@
#include "keyevent.h"
#include "audio.h"
#include "marker/marker.h"
-
+#include "structure.h"
+#include "globals.h"
//---------------------------------------------------------
// adjustGlobalLists
@@ -25,7 +26,7 @@
// '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;
@@ -116,7 +117,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();
@@ -125,10 +126,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) {
@@ -218,55 +226,67 @@ 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)
+ {
+ 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()))
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;
}
@@ -275,15 +295,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();
@@ -308,34 +336,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")
- );
- }
diff --git a/muse2/muse/structure.h b/muse2/muse/structure.h
new file mode 100644
index 00000000..d1de1192
--- /dev/null
+++ b/muse2/muse/structure.h
@@ -0,0 +1,18 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// structure.h
+// (C) Copyright 2011 Florian Jung (flo93@users.sourceforge.net)
+//=========================================================
+
+#ifndef __STRUCTURE_H__
+#define __STRUCTURE_H__
+
+#include "undo.h"
+
+Undo movePartsTotheRight(unsigned int startTick, int moveTick, bool only_selected=false);
+void adjustGlobalLists(Undo& operations, int startPos, int diff);
+void globalCut();
+void globalInsert();
+void globalSplit();
+#endif
diff --git a/muse2/muse/waveedit/waveedit.cpp b/muse2/muse/waveedit/waveedit.cpp
index 7a5ad815..e138769d 100644
--- a/muse2/muse/waveedit/waveedit.cpp
+++ b/muse2/muse/waveedit/waveedit.cpp
@@ -40,10 +40,6 @@
extern QColor readColor(Xml& xml);
-int WaveEdit::_widthInit = 600;
-int WaveEdit::_heightInit = 400;
-QByteArray WaveEdit::_toolbarInit;
-
//---------------------------------------------------------
// closeEvent
//---------------------------------------------------------
@@ -53,7 +49,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();
}
@@ -62,9 +58,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);
@@ -154,6 +149,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");
@@ -203,7 +204,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;
@@ -256,9 +257,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();
@@ -269,10 +267,9 @@ 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();
+ initalizing=false;
}
void WaveEdit::initShortcuts()
@@ -359,12 +356,8 @@ void WaveEdit::readConfiguration(Xml& xml)
case Xml::TagStart:
if (tag == "bgcolor")
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;
@@ -388,9 +381,7 @@ void WaveEdit::writeConfiguration(int level, Xml& xml)
{
xml.tag(level++, "waveedit");
xml.colorTag(level, "bgcolor", 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");
}
@@ -442,38 +433,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 1ff8a65b..4f040d6e 100644
--- a/muse2/muse/waveedit/waveedit.h
+++ b/muse2/muse/waveedit/waveedit.h
@@ -48,15 +48,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;
@@ -78,7 +73,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 a4da398f..b1eb888a 100644
--- a/muse2/muse/widgets/CMakeLists.txt
+++ b/muse2/muse/widgets/CMakeLists.txt
@@ -42,6 +42,7 @@ QT4_WRAP_CPP (widget_mocs
doublelabel.h
filedialog.h
genset.h
+ mdisettings.h
header.h
hitscale.h
intlabel.h
@@ -104,6 +105,7 @@ file (GLOB widgets_ui_files
editsysexdialogbase.ui
fdialogbuttons.ui
gensetbase.ui
+ mdisettings_base.ui
itransformbase.ui
metronomebase.ui
midisync.ui
@@ -139,6 +141,7 @@ file (GLOB widgets_source_files
drange.cpp
filedialog.cpp
genset.cpp
+ mdisettings.cpp
header.cpp
hitscale.cpp
intlabel.cpp
diff --git a/muse2/muse/widgets/genset.cpp b/muse2/muse/widgets/genset.cpp
index d8c76874..9510f580 100644
--- a/muse2/muse/widgets/genset.cpp
+++ b/muse2/muse/widgets/genset.cpp
@@ -112,10 +112,10 @@ Shorter periods are desirable.</string>
showMixer->setChecked(config.mixer1Visible);
showMixer2->setChecked(config.mixer2Visible);
- arrangerX->setValue(config.geometryMain.x());
- arrangerY->setValue(config.geometryMain.y());
- arrangerW->setValue(config.geometryMain.width());
- arrangerH->setValue(config.geometryMain.height());
+ mainX->setValue(config.geometryMain.x());
+ mainY->setValue(config.geometryMain.y());
+ mainW->setValue(config.geometryMain.width());
+ mainH->setValue(config.geometryMain.height());
transportX->setValue(config.geometryTransport.x());
transportY->setValue(config.geometryTransport.y());
@@ -161,10 +161,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
//---------------------------------------------------------
@@ -225,10 +248,10 @@ void GlobalSettingsConfig::updateSettings()
showMixer->setChecked(config.mixer1Visible);
showMixer2->setChecked(config.mixer2Visible);
- arrangerX->setValue(config.geometryMain.x());
- arrangerY->setValue(config.geometryMain.y());
- arrangerW->setValue(config.geometryMain.width());
- arrangerH->setValue(config.geometryMain.height());
+ mainX->setValue(config.geometryMain.x());
+ mainY->setValue(config.geometryMain.y());
+ mainW->setValue(config.geometryMain.width());
+ mainH->setValue(config.geometryMain.height());
transportX->setValue(config.geometryTransport.x());
transportY->setValue(config.geometryTransport.y());
@@ -265,6 +288,20 @@ void GlobalSettingsConfig::updateSettings()
moveArmedCheckBox->setChecked(config.moveArmedCheckBox);
projectSaveCheckBox->setChecked(config.useProjectSaveDialog);
popsDefStayOpenCheckBox->setChecked(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();
}
//---------------------------------------------------------
@@ -312,10 +349,10 @@ void GlobalSettingsConfig::apply()
config.mixer1Visible = showMixer->isChecked();
config.mixer2Visible = showMixer2->isChecked();
- config.geometryMain.setX(arrangerX->value());
- config.geometryMain.setY(arrangerY->value());
- config.geometryMain.setWidth(arrangerW->value());
- config.geometryMain.setHeight(arrangerH->value());
+ config.geometryMain.setX(mainX->value());
+ config.geometryMain.setY(mainY->value());
+ config.geometryMain.setWidth(mainW->value());
+ config.geometryMain.setHeight(mainH->value());
config.geometryTransport.setX(transportX->value());
config.geometryTransport.setY(transportY->value());
@@ -386,6 +423,9 @@ void GlobalSettingsConfig::apply()
muse->setHeartBeat(); // set guiRefresh
midiSeq->msgSetRtc(); // set midi tick rate
+
+ applyMdiSettings();
+
muse->changeConfig(true); // save settings
}
@@ -420,8 +460,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());
}
//---------------------------------------------------------
@@ -436,8 +476,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());
}
//---------------------------------------------------------
@@ -452,21 +492,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(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(muse->width()); //this is intendedly not the frameGeometry, but
+ mainH->setValue(muse->height()); //the "non-frame-geom." to avoid a sizing bug
}
//---------------------------------------------------------
@@ -496,3 +536,42 @@ void GlobalSettingsConfig::defaultInstrumentsPath()
QString dir = configPath + "/instruments";
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();
+}
+
diff --git a/muse2/muse/widgets/genset.h b/muse2/muse/widgets/genset.h
index ea094296..9c636c67 100644
--- a/muse2/muse/widgets/genset.h
+++ b/muse2/muse/widgets/genset.h
@@ -10,8 +10,11 @@
#define __GENSET_H__
#include "ui_gensetbase.h"
+#include "cobject.h"
+#include "mdisettings.h"
#include <QShowEvent>
+#include <list>
//---------------------------------------------------------
// GlobalSettingsConfig
@@ -22,20 +25,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..127aa5c1
--- /dev/null
+++ b/muse2/muse/widgets/mdisettings.cpp
@@ -0,0 +1,44 @@
+//=========================================================
+// 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)
+//=========================================================
+
+#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..2f1bdf55
--- /dev/null
+++ b/muse2/muse/widgets/mdisettings.h
@@ -0,0 +1,34 @@
+//=========================================================
+// 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)
+//=========================================================
+
+#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 c70cb79f..07527973 100644
--- a/muse2/muse/widgets/midisyncimpl.cpp
+++ b/muse2/muse/widgets/midisyncimpl.cpp
@@ -673,8 +673,6 @@ void MidiSyncConfig::closeEvent(QCloseEvent* e)
apply();
}
- //emit deleted((unsigned long)this);
-
disconnect(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 3eb33451..9b133af2 100644
--- a/muse2/muse/widgets/midisyncimpl.h
+++ b/muse2/muse/widgets/midisyncimpl.h
@@ -104,9 +104,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();