summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--muse2/ChangeLog3
-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
55 files changed, 3589 insertions, 1581 deletions
diff --git a/muse2/ChangeLog b/muse2/ChangeLog
index 2505f901..18ef6e8b 100644
--- a/muse2/ChangeLog
+++ b/muse2/ChangeLog
@@ -1,4 +1,5 @@
29.08.2011:
+ - Fixed Robert's fixes (flo93)
- Fixed audio automation graph editing. And now 'snaps' to discrete integer or bool types. (Tim p4.0.32)
All control movements should update display now. Also slightly changed behaviour of Ctrl class.
TODO: Fix some painting corruption, improve discrete display, add transparency etc. etc.
@@ -8,6 +9,8 @@
something fishy with moving columns (rj)
27.08.2011:
- Changed mousewheel behaviour, vertical scrolling is default and horizontal scrolling (shift) is reversed (rj)
+ - Added fullscreen shortcut to all editors which have full screen action (rj)
+ - Part text editor now closes when focus is lost (rj)
17.08.2011:
- Convert some Qt3 style coding in ComboBox to Qt4 in terms of menu entry handling. (Orcan)
- Add mouse wheel support to ComboBox. (Orcan)
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();