diff options
author | Florian Jung <flo@windfisch.org> | 2011-09-14 19:33:40 +0000 |
---|---|---|
committer | Florian Jung <flo@windfisch.org> | 2011-09-14 19:33:40 +0000 |
commit | 58033553a3e7d529a27a2b3d9ccc721d1e2dcc17 (patch) | |
tree | 160bd9993bca91b68475d4ad4249cc07b89692dd /muse2/muse/app.cpp | |
parent | 42269af2e0cc7a8c7b70d89ffa270184acde3dec (diff) | |
parent | 2529ef06d1227b457af051a494ddb579ef590fe3 (diff) |
merged experimental into trunk
new features:
- MDI user interface
- improved pasting (dialogs etc)
- some fixes
Diffstat (limited to 'muse2/muse/app.cpp')
-rw-r--r-- | muse2/muse/app.cpp | 1492 |
1 files changed, 652 insertions, 840 deletions
diff --git a/muse2/muse/app.cpp b/muse2/muse/app.cpp index aab80a2c..773e550f 100644 --- a/muse2/muse/app.cpp +++ b/muse2/muse/app.cpp @@ -21,6 +21,8 @@ // //========================================================= +#include <typeinfo> + #include <QClipboard> #include <QMessageBox> #include <QShortcut> @@ -29,6 +31,8 @@ #include <QWhatsThis> #include <QSettings> #include <QProgressDialog> +#include <QMdiArea> +#include <QMdiSubWindow> #include <iostream> @@ -38,6 +42,7 @@ #include "amixer.h" #include "appearance.h" #include "arranger.h" +#include "arrangerview.h" #include "audio.h" #include "audiodev.h" #include "audioprefetch.h" @@ -69,17 +74,9 @@ #include "widgets/projectcreateimpl.h" #include "widgets/menutitleitem.h" #include "tools.h" -#include "visibletracks.h" #include "widgets/unusedwavefiles.h" #include "functions.h" -#ifdef DSSI_SUPPORT -#include "dssihost.h" -#endif - -#ifdef VST_SUPPORT -#include "vst.h" -#endif namespace MusEApp { @@ -127,17 +124,6 @@ pthread_t splashThread; -void MusE::clearScoreMenuMappers() -{ - delete scoreOneStaffPerTrackMapper; - delete scoreAllInOneMapper; - - scoreOneStaffPerTrackMapper = new QSignalMapper(this); - scoreAllInOneMapper = new QSignalMapper(this); - - connect(scoreOneStaffPerTrackMapper, SIGNAL(mapped(QWidget*)), this, SLOT(openInScoreEdit_oneStaffPerTrack(QWidget*))); - connect(scoreAllInOneMapper, SIGNAL(mapped(QWidget*)), this, SLOT(openInScoreEdit_allInOne(QWidget*))); -} //--------------------------------------------------------- @@ -324,235 +310,6 @@ void addProject(const QString& name) } //--------------------------------------------------------- -// populateAddSynth -//--------------------------------------------------------- - -// ORCAN - CHECK -QMenu* populateAddSynth(QWidget* parent) -{ - QMenu* synp = new QMenu(parent); - - //typedef std::multimap<std::string, int, addSynth_cmp_str > asmap; - typedef std::multimap<std::string, int > asmap; - - //typedef std::multimap<std::string, int, addSynth_cmp_str >::iterator imap; - typedef std::multimap<std::string, int >::iterator imap; - - MessSynth* synMESS = 0; - QMenu* synpMESS = 0; - asmap mapMESS; - - #ifdef DSSI_SUPPORT - DssiSynth* synDSSI = 0; - QMenu* synpDSSI = 0; - asmap mapDSSI; - #endif - - #ifdef VST_SUPPORT - VstSynth* synVST = 0; - QMenu* synpVST = 0; - asmap mapVST; - #endif - - // Not necessary, but what the heck. - QMenu* synpOther = 0; - asmap mapOther; - - //const int synth_base_id = 0x1000; - int ii = 0; - for(std::vector<Synth*>::iterator i = synthis.begin(); i != synthis.end(); ++i) - { - synMESS = dynamic_cast<MessSynth*>(*i); - if(synMESS) - { - mapMESS.insert( std::pair<std::string, int> (std::string(synMESS->description().toLower().toLatin1().constData()), ii) ); - } - else - { - - #ifdef DSSI_SUPPORT - synDSSI = dynamic_cast<DssiSynth*>(*i); - if(synDSSI) - { - mapDSSI.insert( std::pair<std::string, int> (std::string(synDSSI->description().toLower().toLatin1().constData()), ii) ); - } - else - #endif - - { - #ifdef VST_SUPPORT - synVST = dynamic_cast<VstSynth*>(*i); - if(synVST) - { - mapVST.insert( std::pair<std::string, int> (std::string(synVST->description().toLower().toLatin1().constData()), ii) ); - } - else - #endif - - { - mapOther.insert( std::pair<std::string, int> (std::string((*i)->description().toLower().toLatin1().constData()), ii) ); - } - } - } - - ++ii; - } - - int sz = synthis.size(); - for(imap i = mapMESS.begin(); i != mapMESS.end(); ++i) - { - int idx = i->second; - if(idx > sz) // Sanity check - continue; - Synth* s = synthis[idx]; - if(s) - { - // No MESS sub-menu yet? Create it now. - if(!synpMESS) - synpMESS = new QMenu(parent); - QAction* sM = synpMESS->addAction(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">"); - sM->setData(MENU_ADD_SYNTH_ID_BASE + idx); - } - } - - #ifdef DSSI_SUPPORT - for(imap i = mapDSSI.begin(); i != mapDSSI.end(); ++i) - { - int idx = i->second; - if(idx > sz) - continue; - Synth* s = synthis[idx]; - if(s) - { - // No DSSI sub-menu yet? Create it now. - if(!synpDSSI) - synpDSSI = new QMenu(parent); - //synpDSSI->insertItem(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">", MENU_ADD_SYNTH_ID_BASE + idx); - QAction* sD = synpDSSI->addAction(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">"); - sD->setData(MENU_ADD_SYNTH_ID_BASE + idx); - } - } - #endif - - #ifdef VST_SUPPORT - for(imap i = mapVST.begin(); i != mapVST.end(); ++i) - { - int idx = i->second; - if(idx > sz) - continue; - Synth* s = synthis[idx]; - if(s) - { - // No VST sub-menu yet? Create it now. - if(!synpVST) - synpVST = new QMenu(parent); - QAction* sV = synpVST->addAction(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">"); - sV->setData(MENU_ADD_SYNTH_ID_BASE + idx); - } - } - #endif - - for(imap i = mapOther.begin(); i != mapOther.end(); ++i) - { - int idx = i->second; - if(idx > sz) - continue; - Synth* s = synthis[idx]; - // No Other sub-menu yet? Create it now. - if(!synpOther) - synpOther = new QMenu(parent); - //synpOther->insertItem(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">", MENU_ADD_SYNTH_ID_BASE + idx); - QAction* sO = synpOther->addAction(QT_TRANSLATE_NOOP("@default", s->description()) + " <" + QT_TRANSLATE_NOOP("@default", s->name()) + ">"); - sO->setData(MENU_ADD_SYNTH_ID_BASE + idx); - } - - if(synpMESS) - { - synpMESS->setIcon(*synthIcon); - synpMESS->setTitle(QT_TRANSLATE_NOOP("@default", "MESS")); - synp->addMenu(synpMESS); - } - - #ifdef DSSI_SUPPORT - if(synpDSSI) - { - synpDSSI->setIcon(*synthIcon); - synpDSSI->setTitle(QT_TRANSLATE_NOOP("@default", "DSSI")); - synp->addMenu(synpDSSI); - } - #endif - - #ifdef VST_SUPPORT - if(synpVST) - { - synpVST->setIcon(*synthIcon); - synpVST->setTitle(QT_TRANSLATE_NOOP("@default", "FST")); - synp->addMenu(synpVST); - } - #endif - - if(synpOther) - { - synpOther->setIcon(*synthIcon); - synpOther->setTitle(QObject::tr("Other")); - synp->addMenu(synpOther); - } - - return synp; -} - -//--------------------------------------------------------- -// populateAddTrack -// this is also used in "mixer" -//--------------------------------------------------------- - -QActionGroup* populateAddTrack(QMenu* addTrack) - { - QActionGroup* grp = new QActionGroup(addTrack); - - QAction* midi = addTrack->addAction(QIcon(*addtrack_addmiditrackIcon), - QT_TRANSLATE_NOOP("@default", "Add Midi Track")); - midi->setData(Track::MIDI); - grp->addAction(midi); - QAction* drum = addTrack->addAction(QIcon(*addtrack_drumtrackIcon), - QT_TRANSLATE_NOOP("@default", "Add Drum Track")); - drum->setData(Track::DRUM); - grp->addAction(drum); - QAction* wave = addTrack->addAction(QIcon(*addtrack_wavetrackIcon), - QT_TRANSLATE_NOOP("@default", "Add Wave Track")); - wave->setData(Track::WAVE); - grp->addAction(wave); - QAction* aoutput = addTrack->addAction(QIcon(*addtrack_audiooutputIcon), - QT_TRANSLATE_NOOP("@default", "Add Audio Output")); - aoutput->setData(Track::AUDIO_OUTPUT); - grp->addAction(aoutput); - QAction* agroup = addTrack->addAction(QIcon(*addtrack_audiogroupIcon), - QT_TRANSLATE_NOOP("@default", "Add Audio Group")); - agroup->setData(Track::AUDIO_GROUP); - grp->addAction(agroup); - QAction* ainput = addTrack->addAction(QIcon(*addtrack_audioinputIcon), - QT_TRANSLATE_NOOP("@default", "Add Audio Input")); - ainput->setData(Track::AUDIO_INPUT); - grp->addAction(ainput); - QAction* aaux = addTrack->addAction(QIcon(*addtrack_auxsendIcon), - QT_TRANSLATE_NOOP("@default", "Add Aux Send")); - aaux->setData(Track::AUDIO_AUX); - grp->addAction(aaux); - - // Create a sub-menu and fill it with found synth types. Make addTrack the owner. - QMenu* synp = populateAddSynth(addTrack); - synp->setIcon(*synthIcon); - synp->setTitle(QT_TRANSLATE_NOOP("@default", "Add Synth")); - - // Add the sub-menu to the given menu. - addTrack->addMenu(synp); - - QObject::connect(addTrack, SIGNAL(triggered(QAction *)), song, SLOT(addNewTrack(QAction *))); - - return grp; - } - -//--------------------------------------------------------- // MusE //--------------------------------------------------------- @@ -561,7 +318,6 @@ MusE::MusE(int argc, char** argv) : QMainWindow() { // By T356. For LADSPA plugins in plugin.cpp // QWidgetFactory::addWidgetFactory( new PluginWidgetFactory ); ddskrjo - setIconSize(ICON_SIZE); setFocusPolicy(Qt::WheelFocus); //setFocusPolicy(Qt::NoFocus); @@ -578,6 +334,7 @@ MusE::MusE(int argc, char** argv) : QMainWindow() midiRhythmGenerator = 0; globalSettingsConfig = 0; markerView = 0; + arrangerView = 0; softSynthesizerConfig = 0; midiTransformerDialog = 0; shortcutConfig = 0; @@ -589,21 +346,25 @@ MusE::MusE(int argc, char** argv) : QMainWindow() editInstrument = 0; routingPopupMenu = 0; progress = 0; + activeTopWin = NULL; + currentMenuSharingTopwin = NULL; appName = QString("MusE"); setWindowTitle(appName); - editSignalMapper = new QSignalMapper(this); midiPluginSignalMapper = new QSignalMapper(this); followSignalMapper = new QSignalMapper(this); - scoreOneStaffPerTrackMapper = new QSignalMapper(this); - scoreAllInOneMapper = new QSignalMapper(this); + windowsMapper = new QSignalMapper(this); + connect(windowsMapper, SIGNAL(mapped(QWidget*)), SLOT(bringToFront(QWidget*))); song = new Song("song"); song->blockSignals(true); MusEGlobal::heartBeatTimer = new QTimer(this); MusEGlobal::heartBeatTimer->setObjectName("timer"); connect(MusEGlobal::heartBeatTimer, SIGNAL(timeout()), song, SLOT(beat())); - + + + connect(this, SIGNAL(activeTopWinChanged(TopWin*)), SLOT(activeTopWinChangedSlot(TopWin*))); + #ifdef ENABLE_PYTHON //--------------------------------------------------- // Python bridge @@ -748,61 +509,6 @@ MusE::MusE(int argc, char** argv) : QMainWindow() quitAction = new QAction(tr("&Quit"), this); - //-------- Edit Actions - editCutAction = new QAction(QIcon(*editcutIconSet), tr("C&ut"), this); - editCopyAction = new QAction(QIcon(*editcopyIconSet), tr("&Copy"), this); - editPasteAction = new QAction(QIcon(*editpasteIconSet), tr("&Paste"), this); - editInsertAction = new QAction(QIcon(*editpasteIconSet), tr("&Insert"), this); - editInsertEMAction = new QAction(QIcon(*editpasteIconSet), tr("&Insert Empty Measure"), this); - editPasteCloneAction = new QAction(QIcon(*editpasteCloneIconSet), tr("Paste c&lone"), this); - editPaste2TrackAction = new QAction(QIcon(*editpaste2TrackIconSet), tr("Paste to &track"), this); - editPasteC2TAction = new QAction(QIcon(*editpasteClone2TrackIconSet), tr("Paste clone to trac&k"), this); - editDeleteSelectedAction = new QAction(QIcon(*edit_track_delIcon), tr("Delete Selected Tracks"), this); - - editShrinkPartsAction = new QAction(tr("Shrink selected parts"), this); //FINDMICH TODO tooltips! - editExpandPartsAction = new QAction(tr("Expand selected parts"), this); - editCleanPartsAction = new QAction(tr("Clean selected parts"), this); - - - addTrack = new QMenu(tr("Add Track"), this); - addTrack->setIcon(QIcon(*edit_track_addIcon)); - select = new QMenu(tr("Select"), this); - select->setIcon(QIcon(*selectIcon)); - - editSelectAllAction = new QAction(QIcon(*select_allIcon), tr("Select &All"), this); - editDeselectAllAction = new QAction(QIcon(*select_deselect_allIcon), tr("&Deselect All"), this); - editInvertSelectionAction = new QAction(QIcon(*select_invert_selectionIcon), tr("Invert &Selection"), this); - editInsideLoopAction = new QAction(QIcon(*select_inside_loopIcon), tr("&Inside Loop"), this); - editOutsideLoopAction = new QAction(QIcon(*select_outside_loopIcon), tr("&Outside Loop"), this); - editAllPartsAction = new QAction( QIcon(*select_all_parts_on_trackIcon), tr("All &Parts on Track"), this); - - - scoreSubmenu = new QMenu(tr("Score"), this); - scoreSubmenu->setIcon(QIcon(*scoreIconSet)); - - scoreAllInOneSubsubmenu = new QMenu(tr("all parts in one staff"), this); - scoreOneStaffPerTrackSubsubmenu = new QMenu(tr("one staff per part"), this); - - scoreSubmenu->addMenu(scoreAllInOneSubsubmenu); - scoreSubmenu->addMenu(scoreOneStaffPerTrackSubsubmenu); - updateScoreMenus(); - - startScoreEditAction = new QAction(*scoreIconSet, tr("New score window"), this); - startPianoEditAction = new QAction(*pianoIconSet, tr("Pianoroll"), this); - startDrumEditAction = new QAction(QIcon(*edit_drummsIcon), tr("Drums"), this); - startListEditAction = new QAction(QIcon(*edit_listIcon), tr("List"), this); - startWaveEditAction = new QAction(QIcon(*edit_waveIcon), tr("Wave"), this); - - master = new QMenu(tr("Mastertrack"), this); - master->setIcon(QIcon(*edit_mastertrackIcon)); - masterGraphicAction = new QAction(QIcon(*mastertrack_graphicIcon),tr("Graphic"), this); - masterListAction = new QAction(QIcon(*mastertrack_listIcon),tr("List"), this); - - midiEdit = new QMenu(tr("Midi"), this); - midiEdit->setIcon(QIcon(*edit_midiIcon)); - - midiTransformerAction = new QAction(QIcon(*midi_transformIcon), tr("Midi &Transform"), this); - editSongInfoAction = new QAction(QIcon(*edit_listIcon), tr("Song Info"), this); //-------- View Actions @@ -818,15 +524,11 @@ MusE::MusE(int argc, char** argv) : QMainWindow() viewCliplistAction->setCheckable(true); viewMarkerAction = new QAction(QIcon(*view_markerIcon), tr("Marker View"), this); viewMarkerAction->setCheckable(true); - - //-------- Structure Actions - strGlobalCutAction = new QAction(tr("Global Cut"), this); - strGlobalInsertAction = new QAction(tr("Global Insert"), this); - strGlobalSplitAction = new QAction(tr("Global Split"), this); - strCopyRangeAction = new QAction(tr("Copy Range"), this); - strCopyRangeAction->setEnabled(false); - strCutEventsAction = new QAction(tr("Cut Events"), this); - strCutEventsAction->setEnabled(false); + viewArrangerAction = new QAction(tr("Arranger View"), this); + viewArrangerAction->setCheckable(true); + fullscreenAction=new QAction(tr("Fullscreen"), this); + fullscreenAction->setCheckable(true); + fullscreenAction->setChecked(false); //-------- Midi Actions menuScriptPlugins = new QMenu(tr("&Plugins"), this); @@ -855,8 +557,15 @@ MusE::MusE(int argc, char** argv) : QMainWindow() autoSnapshotAction = new QAction(QIcon(*automation_take_snapshotIcon), tr("Take Snapshot"), this); autoClearAction = new QAction(QIcon(*automation_clear_dataIcon), tr("Clear Automation Data"), this); autoClearAction->setEnabled(false); + - + //-------- Windows Actions + windowsCascadeAction = new QAction(tr("Cascade"), this); + windowsTileAction = new QAction(tr("Tile"), this); + windowsRowsAction = new QAction(tr("In rows"), this); + windowsColumnsAction = new QAction(tr("In columns"), this); + + //-------- Settings Actions settingsGlobalAction = new QAction(QIcon(*settings_globalsettingsIcon), tr("Global Settings"), this); settingsShortcutsAction = new QAction(QIcon(*settings_configureshortcutsIcon), tr("Configure Shortcuts"), this); @@ -901,63 +610,6 @@ MusE::MusE(int argc, char** argv) : QMainWindow() connect(fileMoveWaveFiles, SIGNAL(activated()), SLOT(findUnusedWaveFiles())); connect(quitAction, SIGNAL(activated()), SLOT(quitDoc())); - //-------- Edit connections - connect(editCutAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editCopyAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editPasteAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editInsertAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editInsertEMAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editPasteCloneAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editPaste2TrackAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editPasteC2TAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editDeleteSelectedAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - - connect(editShrinkPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editExpandPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editCleanPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - - connect(editSelectAllAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editDeselectAllAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editInvertSelectionAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editInsideLoopAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editOutsideLoopAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editAllPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - - editSignalMapper->setMapping(editCutAction, CMD_CUT); - editSignalMapper->setMapping(editCopyAction, CMD_COPY); - editSignalMapper->setMapping(editPasteAction, CMD_PASTE); - editSignalMapper->setMapping(editInsertAction, CMD_INSERT); - editSignalMapper->setMapping(editPasteCloneAction, CMD_PASTE_CLONE); - editSignalMapper->setMapping(editPaste2TrackAction, CMD_PASTE_TO_TRACK); - editSignalMapper->setMapping(editPasteC2TAction, CMD_PASTE_CLONE_TO_TRACK); - editSignalMapper->setMapping(editInsertEMAction, CMD_INSERTMEAS); - editSignalMapper->setMapping(editDeleteSelectedAction, CMD_DELETE_TRACK); - editSignalMapper->setMapping(editShrinkPartsAction, CMD_SHRINK_PART); - editSignalMapper->setMapping(editExpandPartsAction, CMD_EXPAND_PART); - editSignalMapper->setMapping(editCleanPartsAction, CMD_CLEAN_PART); - editSignalMapper->setMapping(editSelectAllAction, CMD_SELECT_ALL); - editSignalMapper->setMapping(editDeselectAllAction, CMD_SELECT_NONE); - editSignalMapper->setMapping(editInvertSelectionAction, CMD_SELECT_INVERT); - editSignalMapper->setMapping(editInsideLoopAction, CMD_SELECT_ILOOP); - editSignalMapper->setMapping(editOutsideLoopAction, CMD_SELECT_OLOOP); - editSignalMapper->setMapping(editAllPartsAction, CMD_SELECT_PARTS); - - connect(editSignalMapper, SIGNAL(mapped(int)), this, SLOT(cmd(int))); - - connect(startPianoEditAction, SIGNAL(activated()), SLOT(startPianoroll())); - connect(startScoreEditAction, SIGNAL(activated()), SLOT(startScoreQuickly())); - connect(startDrumEditAction, SIGNAL(activated()), SLOT(startDrumEditor())); - connect(startListEditAction, SIGNAL(activated()), SLOT(startListEditor())); - connect(startWaveEditAction, SIGNAL(activated()), SLOT(startWaveEditor())); - connect(scoreOneStaffPerTrackMapper, SIGNAL(mapped(QWidget*)), this, SLOT(openInScoreEdit_oneStaffPerTrack(QWidget*))); - connect(scoreAllInOneMapper, SIGNAL(mapped(QWidget*)), this, SLOT(openInScoreEdit_allInOne(QWidget*))); - - - connect(masterGraphicAction, SIGNAL(activated()), SLOT(startMasterEditor())); - connect(masterListAction, SIGNAL(activated()), SLOT(startLMasterEditor())); - - connect(midiTransformerAction, SIGNAL(activated()), SLOT(startMidiTransformer())); - connect(editSongInfoAction, SIGNAL(activated()), SLOT(startSongInfo())); //-------- View connections @@ -967,13 +619,8 @@ MusE::MusE(int argc, char** argv) : QMainWindow() connect(viewMixerBAction, SIGNAL(toggled(bool)), SLOT(toggleMixer2(bool))); connect(viewCliplistAction, SIGNAL(toggled(bool)), SLOT(startClipList(bool))); connect(viewMarkerAction, SIGNAL(toggled(bool)), SLOT(toggleMarker(bool))); - - //-------- Structure connections - connect(strGlobalCutAction, SIGNAL(activated()), SLOT(globalCut())); - connect(strGlobalInsertAction, SIGNAL(activated()), SLOT(globalInsert())); - connect(strGlobalSplitAction, SIGNAL(activated()), SLOT(globalSplit())); - connect(strCopyRangeAction, SIGNAL(activated()), SLOT(copyRange())); - connect(strCutEventsAction, SIGNAL(activated()), SLOT(cutEvents())); + connect(viewArrangerAction, SIGNAL(toggled(bool)), SLOT(toggleArranger(bool))); + connect(fullscreenAction, SIGNAL(toggled(bool)), SLOT(setFullscreen(bool))); //-------- Midi connections connect(midiEditInstAction, SIGNAL(activated()), SLOT(startEditInstrument())); @@ -1034,47 +681,35 @@ MusE::MusE(int argc, char** argv) : QMainWindow() connect(helpAboutAction, SIGNAL(activated()), SLOT(about())); //-------------------------------------------------- - // Miscellaneous shortcuts - //-------------------------------------------------- - - QShortcut* sc = new QShortcut(shortcuts[SHRT_DELETE].key, this); - sc->setContext(Qt::WindowShortcut); - connect(sc, SIGNAL(activated()), editSignalMapper, SLOT(map())); - editSignalMapper->setMapping(sc, CMD_DELETE); - - //-------------------------------------------------- // Toolbar //-------------------------------------------------- + // when adding a toolbar to the main window, remember adding it to + // either the requiredToolbars or optionalToolbars list! + tools = addToolBar(tr("File Buttons")); tools->setObjectName("File Buttons"); tools->addAction(fileNewAction); tools->addAction(fileOpenAction); tools->addAction(fileSaveAction); - - - // - // Whats This - // tools->addAction(QWhatsThis::createAction(this)); - tools->addSeparator(); - tools->addActions(MusEGlobal::undoRedo->actions()); - - tools1 = new MusEWidget::EditToolBar(this, MusEWidget::arrangerTools); - addToolBar(tools1); - tools1->setObjectName("arrangerTools"); + QToolBar* undoToolbar = addToolBar(tr("Undo/Redo")); + undoToolbar->setObjectName("Undo/Redo (global)"); + undoToolbar->addActions(MusEGlobal::undoRedo->actions()); QToolBar* transportToolbar = addToolBar(tr("Transport")); - transportToolbar->setObjectName("Transport"); + transportToolbar->setObjectName("Transport (global)"); transportToolbar->addActions(MusEGlobal::transportAction->actions()); QToolBar* panicToolbar = addToolBar(tr("Panic")); - panicToolbar->setObjectName("Panic"); + panicToolbar->setObjectName("Panic (global)"); panicToolbar->addAction(MusEGlobal::panicAction); - visTracks = new MusEWidget::VisibleTracks(this); - addToolBar(visTracks); + requiredToolbars.push_back(tools); + optionalToolbars.push_back(undoToolbar); + optionalToolbars.push_back(transportToolbar); + optionalToolbars.push_back(panicToolbar); //rlimit lim; @@ -1107,11 +742,20 @@ MusE::MusE(int argc, char** argv) : QMainWindow() //--------------------------------------------------- + // when adding a menu to the main window, remember adding it to + // either the leadingMenus or trailingMenus list! + // also do NOT use menuBar()->addMenu(QString&), but ALWAYS + // create the menu with new QMenu and add it afterwards. + // the menu's owner must be this and not this->menuBar()! + + //------------------------------------------------------------- // popup File //------------------------------------------------------------- - menu_file = menuBar()->addMenu(tr("&File")); + menu_file = new QMenu(tr("&File"), this); + menuBar()->addMenu(menu_file); + leadingMenus.push_back(menu_file); menu_file->addAction(fileNewAction); menu_file->addAction(fileOpenAction); menu_file->addMenu(openRecent); @@ -1119,6 +763,8 @@ MusE::MusE(int argc, char** argv) : QMainWindow() menu_file->addAction(fileSaveAction); menu_file->addAction(fileSaveAsAction); menu_file->addSeparator(); + menu_file->addAction(editSongInfoAction); + menu_file->addSeparator(); menu_file->addAction(fileImportMidiAction); menu_file->addAction(fileExportMidiAction); menu_file->addAction(fileImportPartAction); @@ -1130,72 +776,15 @@ MusE::MusE(int argc, char** argv) : QMainWindow() menu_file->addAction(quitAction); menu_file->addSeparator(); - //------------------------------------------------------------- - // popup Edit - //------------------------------------------------------------- - menuEdit = menuBar()->addMenu(tr("&Edit")); - menuEdit->addActions(MusEGlobal::undoRedo->actions()); - menuEdit->addSeparator(); - - menuEdit->addAction(editCutAction); - menuEdit->addAction(editCopyAction); - menuEdit->addAction(editPasteAction); - menuEdit->addAction(editInsertAction); - menuEdit->addAction(editInsertEMAction); - menuEdit->addAction(editPasteCloneAction); - menuEdit->addAction(editPaste2TrackAction); - menuEdit->addAction(editPasteC2TAction); - menuEdit->addSeparator(); - menuEdit->addAction(editShrinkPartsAction); - menuEdit->addAction(editExpandPartsAction); - menuEdit->addAction(editCleanPartsAction); - menuEdit->addSeparator(); - menuEdit->addAction(editDeleteSelectedAction); - - // Moved below. Have to wait until synths are available... - //populateAddTrack(addTrack); - menuEdit->addMenu(addTrack); - menuEdit->addMenu(select); - select->addAction(editSelectAllAction); - select->addAction(editDeselectAllAction); - select->addAction(editInvertSelectionAction); - select->addAction(editInsideLoopAction); - select->addAction(editOutsideLoopAction); - select->addAction(editAllPartsAction); - menuEdit->addSeparator(); - - menuEdit->addAction(startPianoEditAction); - menuEdit->addMenu(scoreSubmenu); - menuEdit->addAction(startScoreEditAction); - menuEdit->addAction(startDrumEditAction); - menuEdit->addAction(startListEditAction); - menuEdit->addAction(startWaveEditAction); - - menuEdit->addMenu(master); - master->addAction(masterGraphicAction); - master->addAction(masterListAction); - menuEdit->addSeparator(); - - - menuEdit->addMenu(midiEdit); -/* commented out by flo: these are not implemented, - but maybe will be in future (state: revision 988) - midiEdit->insertItem(tr("Copy Measure"), this, SLOT(copyMeasure())); - midiEdit->insertItem(tr("Erase Measure"), this, SLOT(eraseMeasure())); - midiEdit->insertItem(tr("Delete Measure"), this, SLOT(deleteMeasure())); - midiEdit->insertItem(tr("Create Measure"), this, SLOT(createMeasure())); - midiEdit->insertItem(tr("Mix Track"), this, SLOT(mixTrack())); -*/ - midiEdit->addAction(midiTransformerAction); - - menuEdit->addAction(editSongInfoAction); //------------------------------------------------------------- // popup View //------------------------------------------------------------- - menuView = menuBar()->addMenu(tr("&View")); + menuView = new QMenu(tr("&View"), this); + menuBar()->addMenu(menuView); + trailingMenus.push_back(menuView); menuView->addAction(viewTransportAction); menuView->addAction(viewBigtimeAction); @@ -1203,25 +792,19 @@ MusE::MusE(int argc, char** argv) : QMainWindow() menuView->addAction(viewMixerBAction); menuView->addAction(viewCliplistAction); menuView->addAction(viewMarkerAction); + menuView->addAction(viewArrangerAction); + menuView->addSeparator(); + menuView->addAction(fullscreenAction); //------------------------------------------------------------- - // popup Structure - //------------------------------------------------------------- - - menuStructure = menuBar()->addMenu(tr("&Structure")); - menuStructure->addAction(strGlobalCutAction); - menuStructure->addAction(strGlobalInsertAction); - menuStructure->addAction(strGlobalSplitAction); - menuStructure->addAction(strCopyRangeAction); - menuStructure->addSeparator(); - menuStructure->addAction(strCutEventsAction); - - //------------------------------------------------------------- // popup Midi //------------------------------------------------------------- - menu_functions = menuBar()->addMenu(tr("&Midi")); + menu_functions = new QMenu(tr("&Midi"), this); + menuBar()->addMenu(menu_functions); + trailingMenus.push_back(menu_functions); + song->populateScriptMenu(menuScriptPlugins, this); menu_functions->addMenu(menuScriptPlugins); menu_functions->addAction(midiEditInstAction); @@ -1247,7 +830,10 @@ MusE::MusE(int argc, char** argv) : QMainWindow() // popup Audio //------------------------------------------------------------- - menu_audio = menuBar()->addMenu(tr("&Audio")); + menu_audio = new QMenu(tr("&Audio"), this); + menuBar()->addMenu(menu_audio); + trailingMenus.push_back(menu_audio); + menu_audio->addAction(audioBounce2TrackAction); menu_audio->addAction(audioBounce2FileAction); menu_audio->addSeparator(); @@ -1258,17 +844,36 @@ MusE::MusE(int argc, char** argv) : QMainWindow() // popup Automation //------------------------------------------------------------- - menuAutomation = menuBar()->addMenu(tr("A&utomation")); + menuAutomation = new QMenu(tr("A&utomation"), this); + menuBar()->addMenu(menuAutomation); + trailingMenus.push_back(menuAutomation); + menuAutomation->addAction(autoMixerAction); menuAutomation->addSeparator(); menuAutomation->addAction(autoSnapshotAction); menuAutomation->addAction(autoClearAction); //------------------------------------------------------------- + // popup Windows + //------------------------------------------------------------- + + menuWindows = new QMenu(tr("&Windows"), this); + menuBar()->addMenu(menuWindows); + trailingMenus.push_back(menuWindows); + + menuWindows->addAction(windowsCascadeAction); + menuWindows->addAction(windowsTileAction); + menuWindows->addAction(windowsRowsAction); + menuWindows->addAction(windowsColumnsAction); + + //------------------------------------------------------------- // popup Settings //------------------------------------------------------------- - menuSettings = menuBar()->addMenu(tr("Se&ttings")); + menuSettings = new QMenu(tr("MusE Se&ttings"), this); + menuBar()->addMenu(menuSettings); + trailingMenus.push_back(menuSettings); + menuSettings->addAction(settingsGlobalAction); menuSettings->addAction(settingsShortcutsAction); menuSettings->addMenu(follow); @@ -1288,7 +893,10 @@ MusE::MusE(int argc, char** argv) : QMainWindow() // popup Help //--------------------------------------------------- - menu_help = menuBar()->addMenu(tr("&Help")); + menu_help = new QMenu(tr("&Help"), this); + menuBar()->addMenu(menu_help); + trailingMenus.push_back(menu_help); + menu_help->addAction(helpManualAction); menu_help->addAction(helpHomepageAction); menu_help->addSeparator(); @@ -1300,24 +908,33 @@ MusE::MusE(int argc, char** argv) : QMainWindow() //menu_help->addSeparator(); //menu_ids[CMD_START_WHATSTHIS] = menu_help->insertItem(tr("What's &This?"), this, SLOT(whatsThis()), 0); + //--------------------------------------------------- // Central Widget //--------------------------------------------------- - arranger = new Arranger(this, "arranger"); - setCentralWidget(arranger); - connect(tools1, SIGNAL(toolChanged(int)), arranger, SLOT(setTool(int))); - connect(visTracks, SIGNAL(visibilityChanged()), song, SLOT(update()) ); - connect(arranger, SIGNAL(editPart(Track*)), SLOT(startEditor(Track*))); - connect(arranger, SIGNAL(dropSongFile(const QString&)), SLOT(loadProjectFile(const QString&))); - connect(arranger, SIGNAL(dropMidiFile(const QString&)), SLOT(importMidi(const QString&))); - connect(arranger, SIGNAL(startEditor(PartList*,int)), SLOT(startEditor(PartList*,int))); - connect(arranger, SIGNAL(toolChanged(int)), tools1, SLOT(set(int))); - connect(this, SIGNAL(configChanged()), arranger, SLOT(configChanged())); + mdiArea=new QMdiArea(this); + mdiArea->setOption(QMdiArea::DontMaximizeSubWindowOnActivation); + mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setCentralWidget(mdiArea); + connect(windowsTileAction, SIGNAL(activated()), this, SLOT(tileSubWindows())); + connect(windowsRowsAction, SIGNAL(activated()), this, SLOT(arrangeSubWindowsRows())); + connect(windowsColumnsAction, SIGNAL(activated()), this, SLOT(arrangeSubWindowsColumns())); + connect(windowsCascadeAction, SIGNAL(activated()), mdiArea, SLOT(cascadeSubWindows())); - connect(arranger, SIGNAL(setUsedTool(int)), SLOT(setUsedTool(int))); + arrangerView = new ArrangerView(this); + arrangerView->shareToolsAndMenu(true); + connect(arrangerView, SIGNAL(closed()), SLOT(arrangerClosed())); + toplevels.push_back(arrangerView); + arrangerView->hide(); + _arranger=arrangerView->getArranger(); + + arrangerView->setIsMdiWin(true); + + //--------------------------------------------------- // read list of "Recent Projects" //--------------------------------------------------- @@ -1347,24 +964,12 @@ MusE::MusE(int argc, char** argv) : QMainWindow() initMidiSynth(); - QActionGroup *grp = populateAddTrack(addTrack); - - trackMidiAction = grp->actions()[0]; - trackDrumAction = grp->actions()[1]; - trackWaveAction = grp->actions()[2]; - trackAOutputAction = grp->actions()[3]; - trackAGroupAction = grp->actions()[4]; - trackAInputAction = grp->actions()[5]; - trackAAuxAction = grp->actions()[6]; + arrangerView->populateAddTrack(); + arrangerView->updateShortcuts(); transport = new Transport(this, "transport"); bigtime = 0; - QClipboard* cb = QApplication::clipboard(); - connect(cb, SIGNAL(dataChanged()), SLOT(clipboardChanged())); - connect(cb, SIGNAL(selectionChanged()), SLOT(clipboardChanged())); - connect(arranger, SIGNAL(selectionChanged()), SLOT(selectionChanged())); - //--------------------------------------------------- // load project // if no songname entered on command line: @@ -1398,10 +1003,12 @@ MusE::MusE(int argc, char** argv) : QMainWindow() changeConfig(false); QSettings settings("MusE", "MusE-qt"); - //restoreGeometry(settings.value("MusE/geometry").toByteArray()); - restoreState(settings.value("MusE/windowState").toByteArray()); + restoreGeometry(settings.value("MusE/geometry").toByteArray()); + //restoreState(settings.value("MusE/windowState").toByteArray()); song->update(); + + updateWindowMenu(); } MusE::~MusE() @@ -1515,7 +1122,7 @@ void MusE::loadProjectFile(const QString& name, bool songTemplate, bool loadAll) if (restartSequencer) seqStart(); - visTracks->updateVisibleTracksButtons(); + arrangerView->updateVisibleTracksButtons(); progress->setValue(100); delete progress; progress=0; @@ -1544,7 +1151,7 @@ void MusE::loadProjectFile1(const QString& name, bool songTemplate, bool loadAll mixer1->clear(); if (mixer2) mixer2->clear(); - arranger->clear(); // clear track info + _arranger->clear(); // clear track info //if (clearSong()) if (clearSong(loadAll)) // Allow not touching things like midi ports. p4.0.17 TESTING: Maybe some problems... return; @@ -1624,6 +1231,7 @@ void MusE::loadProjectFile1(const QString& name, bool songTemplate, bool loadAll viewTransportAction->setChecked(MusEConfig::config.transportVisible); viewBigtimeAction->setChecked(MusEConfig::config.bigTimeVisible); viewMarkerAction->setChecked(MusEConfig::config.markerVisible); + viewArrangerAction->setChecked(MusEConfig::config.arrangerVisible); autoMixerAction->setChecked(MusEGlobal::automation); @@ -1669,9 +1277,9 @@ void MusE::loadProjectFile1(const QString& name, bool songTemplate, bool loadAll MusEGlobal::loopAction->setChecked(song->loop()); song->update(); song->updatePos(); - clipboardChanged(); // enable/disable "Paste" - selectionChanged(); // enable/disable "Copy" & "Paste" - scoreNamingChanged(); // inform the score menus about the new scores and their names + arrangerView->clipboardChanged(); // enable/disable "Paste" + arrangerView->selectionChanged(); // enable/disable "Copy" & "Paste" + arrangerView->scoreNamingChanged(); // inform the score menus about the new scores and their names progress->setValue(50); // p3.3.53 Try this AFTER the song update above which does a mixer update... Tested OK - mixers resize properly now. @@ -1707,6 +1315,27 @@ void MusE::loadProjectFile1(const QString& name, bool songTemplate, bool loadAll showMarker(MusEConfig::config.markerVisible); } + if (songTemplate) + { + // maximize the arranger in traditional SDI mode + if (TopWin::_defaultSubwin[TopWin::ARRANGER]) + { + bool maximizeArranger=true; + for (int i=0; i<TopWin::TOPLEVELTYPE_LAST_ENTRY; i++) + if ((i!=TopWin::ARRANGER) && TopWin::_defaultSubwin[i]) + { + maximizeArranger=false; + break; + } + + if (maximizeArranger) + { + arrangerView->showMaximized(); + bringToFront(arrangerView); + } + } + } + } //--------------------------------------------------------- @@ -1896,8 +1525,10 @@ void MusE::closeEvent(QCloseEvent* event) } QSettings settings("MusE", "MusE-qt"); - //settings.setValue("MusE/geometry", saveGeometry()); - settings.setValue("MusE/windowState", saveState()); + settings.setValue("MusE/geometry", saveGeometry()); + //settings.setValue("MusE/windowState", saveState()); + + writeGlobalConfiguration(); // save "Open Recent" list QString prjPath(MusEGlobal::configPath); @@ -1995,16 +1626,17 @@ void MusE::showMarker(bool flag) if (markerView == 0) { markerView = new MarkerView(this); - // Removed p3.3.43 - // Song::addMarker() already emits a 'markerChanged'. - //connect(arranger, SIGNAL(addMarker(int)), markerView, SLOT(addMarker(int))); - connect(markerView, SIGNAL(closed()), SLOT(markerClosed())); - toplevels.push_back(Toplevel(Toplevel::MARKER, (unsigned long)(markerView), markerView)); + toplevels.push_back(markerView); markerView->show(); } markerView->setVisible(flag); viewMarkerAction->setChecked(flag); + if (!flag) + if (currentMenuSharingTopwin == markerView) + setCurrentMenuSharingTopwin(NULL); + + updateWindowMenu(); } //--------------------------------------------------------- @@ -2014,6 +1646,43 @@ void MusE::showMarker(bool flag) void MusE::markerClosed() { viewMarkerAction->setChecked(false); + if (currentMenuSharingTopwin == markerView) + setCurrentMenuSharingTopwin(NULL); + + updateWindowMenu(); + } + +//--------------------------------------------------------- +// toggleArranger +//--------------------------------------------------------- + +void MusE::toggleArranger(bool checked) + { + showArranger(checked); + } + +//--------------------------------------------------------- +// showArranger +//--------------------------------------------------------- + +void MusE::showArranger(bool flag) + { + arrangerView->setVisible(flag); + viewArrangerAction->setChecked(flag); + if (!flag) + if (currentMenuSharingTopwin == arrangerView) + setCurrentMenuSharingTopwin(NULL); + updateWindowMenu(); + } + +//--------------------------------------------------------- +// arrangerClosed +//--------------------------------------------------------- + +void MusE::arrangerClosed() + { + viewArrangerAction->setChecked(false); + updateWindowMenu(); } //--------------------------------------------------------- @@ -2141,48 +1810,6 @@ PartList* MusE::getMidiPartsToEdit() return pl; } -void MusE::scoreNamingChanged() -{ - updateScoreMenus(); -} - -void MusE::updateScoreMenus() -{ - QAction* action; - - - scoreOneStaffPerTrackSubsubmenu->clear(); - scoreAllInOneSubsubmenu->clear(); - - - action=new QAction(tr("New"), this); - connect(action, SIGNAL(activated()), scoreOneStaffPerTrackMapper, SLOT(map())); - scoreOneStaffPerTrackMapper->setMapping(action, (QWidget*)NULL); - scoreOneStaffPerTrackSubsubmenu->addAction(action); - - - action=new QAction(tr("New"), this); //the above action may NOT be reused! - connect(action, SIGNAL(activated()), scoreAllInOneMapper, SLOT(map())); - scoreAllInOneMapper->setMapping(action, (QWidget*)NULL); - scoreAllInOneSubsubmenu->addAction(action); - - for (ToplevelList::iterator it=toplevels.begin(); it!=toplevels.end(); it++) - if (it->type()==Toplevel::SCORE) - { - ScoreEdit* score = (ScoreEdit*) it->cobject(); - - action=new QAction(score->get_name(), this); - connect(action, SIGNAL(activated()), scoreOneStaffPerTrackMapper, SLOT(map())); - scoreOneStaffPerTrackMapper->setMapping(action, (QWidget*)score); - scoreOneStaffPerTrackSubsubmenu->addAction(action); - - - action=new QAction(score->get_name(), this); //the above action may NOT be reused! - connect(action, SIGNAL(activated()), scoreAllInOneMapper, SLOT(map())); - scoreAllInOneMapper->setMapping(action, (QWidget*)score); - scoreAllInOneSubsubmenu->addAction(action); - } -} //--------------------------------------------------------- // startScoreEdit @@ -2210,16 +1837,17 @@ void MusE::openInScoreEdit(ScoreEdit* destination, PartList* pl, bool allInOne) { if (destination==NULL) // if no destination given, create a new one { - destination = new ScoreEdit(this, 0, arranger->cursorValue()); + destination = new ScoreEdit(this, 0, _arranger->cursorValue()); destination->show(); - toplevels.push_back(Toplevel(Toplevel::SCORE, (unsigned long)(destination), destination)); - connect(destination, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long))); - connect(destination, SIGNAL(name_changed()), SLOT(scoreNamingChanged())); + toplevels.push_back(destination); + connect(destination, SIGNAL(deleted(TopWin*)), SLOT(toplevelDeleted(TopWin*))); + connect(destination, SIGNAL(name_changed()), arrangerView, SLOT(scoreNamingChanged())); //connect(muse, SIGNAL(configChanged()), destination, SLOT(config_changed())); //commented out by flo, because the ScoreEditor connects to all //relevant signals on his own - updateScoreMenus(); + arrangerView->updateScoreMenus(); + updateWindowMenu(); } destination->add_parts(pl, allInOne); @@ -2245,13 +1873,14 @@ void MusE::startPianoroll() void MusE::startPianoroll(PartList* pl, bool showDefaultCtrls) { - PianoRoll* pianoroll = new PianoRoll(pl, this, 0, arranger->cursorValue()); + PianoRoll* pianoroll = new PianoRoll(pl, this, 0, _arranger->cursorValue()); if(showDefaultCtrls) // p4.0.12 pianoroll->addCtrl(); pianoroll->show(); - toplevels.push_back(Toplevel(Toplevel::PIANO_ROLL, (unsigned long)(pianoroll), pianoroll)); - connect(pianoroll, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long))); + toplevels.push_back(pianoroll); + connect(pianoroll, SIGNAL(deleted(TopWin*)), SLOT(toplevelDeleted(TopWin*))); connect(MusEGlobal::muse, SIGNAL(configChanged()), pianoroll, SLOT(configChanged())); + updateWindowMenu(); } //--------------------------------------------------------- @@ -2270,9 +1899,10 @@ void MusE::startListEditor(PartList* pl) { ListEdit* listEditor = new ListEdit(pl); listEditor->show(); - toplevels.push_back(Toplevel(Toplevel::LISTE, (unsigned long)(listEditor), listEditor)); - connect(listEditor, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long))); + toplevels.push_back(listEditor); + connect(listEditor, SIGNAL(deleted(TopWin*)), SLOT(toplevelDeleted(TopWin*))); connect(MusEGlobal::muse,SIGNAL(configChanged()), listEditor, SLOT(configChanged())); + updateWindowMenu(); } //--------------------------------------------------------- @@ -2283,8 +1913,9 @@ void MusE::startMasterEditor() { MasterEdit* masterEditor = new MasterEdit(); masterEditor->show(); - toplevels.push_back(Toplevel(Toplevel::MASTER, (unsigned long)(masterEditor), masterEditor)); - connect(masterEditor, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long))); + toplevels.push_back(masterEditor); + connect(masterEditor, SIGNAL(deleted(TopWin*)), SLOT(toplevelDeleted(TopWin*))); + updateWindowMenu(); } //--------------------------------------------------------- @@ -2295,9 +1926,10 @@ void MusE::startLMasterEditor() { LMaster* lmaster = new LMaster(); lmaster->show(); - toplevels.push_back(Toplevel(Toplevel::LMASTER, (unsigned long)(lmaster), lmaster)); - connect(lmaster, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long))); + toplevels.push_back(lmaster); + connect(lmaster, SIGNAL(deleted(TopWin*)), SLOT(toplevelDeleted(TopWin*))); connect(MusEGlobal::muse, SIGNAL(configChanged()), lmaster, SLOT(configChanged())); + updateWindowMenu(); } //--------------------------------------------------------- @@ -2315,13 +1947,14 @@ void MusE::startDrumEditor() void MusE::startDrumEditor(PartList* pl, bool showDefaultCtrls) { - DrumEdit* drumEditor = new DrumEdit(pl, this, 0, arranger->cursorValue()); + DrumEdit* drumEditor = new DrumEdit(pl, this, 0, _arranger->cursorValue()); if(showDefaultCtrls) // p4.0.12 drumEditor->addCtrl(); drumEditor->show(); - toplevels.push_back(Toplevel(Toplevel::DRUM, (unsigned long)(drumEditor), drumEditor)); - connect(drumEditor, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long))); + toplevels.push_back(drumEditor); + connect(drumEditor, SIGNAL(deleted(TopWin*)), SLOT(toplevelDeleted(TopWin*))); connect(MusEGlobal::muse, SIGNAL(configChanged()), drumEditor, SLOT(configChanged())); + updateWindowMenu(); } //--------------------------------------------------------- @@ -2343,8 +1976,9 @@ void MusE::startWaveEditor(PartList* pl) WaveEdit* waveEditor = new WaveEdit(pl); waveEditor->show(); connect(MusEGlobal::muse, SIGNAL(configChanged()), waveEditor, SLOT(configChanged())); - toplevels.push_back(Toplevel(Toplevel::WAVE, (unsigned long)(waveEditor), waveEditor)); - connect(waveEditor, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long))); + toplevels.push_back(waveEditor); + connect(waveEditor, SIGNAL(deleted(TopWin*)), SLOT(toplevelDeleted(TopWin*))); + updateWindowMenu(); } @@ -2400,11 +2034,12 @@ void MusE::startClipList(bool checked) if (clipListEdit == 0) { //clipListEdit = new ClipListEdit(); clipListEdit = new ClipListEdit(this); - toplevels.push_back(Toplevel(Toplevel::CLIPLIST, (unsigned long)(clipListEdit), clipListEdit)); - connect(clipListEdit, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long))); + toplevels.push_back(clipListEdit); + connect(clipListEdit, SIGNAL(deleted(TopWin*)), SLOT(toplevelDeleted(TopWin*))); } clipListEdit->show(); viewCliplistAction->setChecked(checked); + updateWindowMenu(); } //--------------------------------------------------------- @@ -2449,63 +2084,57 @@ void MusE::selectProject(QAction* act) // toplevelDeleted //--------------------------------------------------------- -void MusE::toplevelDeleted(unsigned long tl) +void MusE::toplevelDeleted(TopWin* tl) { for (iToplevel i = toplevels.begin(); i != toplevels.end(); ++i) { - if (i->object() == tl) { + if (*i == tl) { + + if (tl == currentMenuSharingTopwin) + setCurrentMenuSharingTopwin(NULL); + + bool mustUpdateScoreMenus=false; - switch(i->type()) { - case Toplevel::MARKER: + switch(tl->type()) { + case TopWin::MARKER: + case TopWin::ARRANGER: break; - case Toplevel::CLIPLIST: + case TopWin::CLIPLIST: // ORCAN: This needs to be verified. aid2 used to correspond to Cliplist: //menu_audio->setItemChecked(aid2, false); - viewCliplistAction->setChecked(false); + viewCliplistAction->setChecked(false); + if (currentMenuSharingTopwin == clipListEdit) + setCurrentMenuSharingTopwin(NULL); + updateWindowMenu(); return; //break; - // the followin editors can exist in more than + + // the following editors can exist in more than // one instantiation: - case Toplevel::PIANO_ROLL: - case Toplevel::LISTE: - case Toplevel::DRUM: - case Toplevel::MASTER: - case Toplevel::WAVE: - case Toplevel::LMASTER: + case TopWin::PIANO_ROLL: + case TopWin::LISTE: + case TopWin::DRUM: + case TopWin::MASTER: + case TopWin::WAVE: + case TopWin::LMASTER: break; - case Toplevel::SCORE: + case TopWin::SCORE: mustUpdateScoreMenus=true; + + case TopWin::TOPLEVELTYPE_LAST_ENTRY: //to avoid a warning + break; } toplevels.erase(i); if (mustUpdateScoreMenus) - updateScoreMenus(); + arrangerView->updateScoreMenus(); + updateWindowMenu(); return; } } - printf("topLevelDeleted: top level %lx not found\n", tl); + printf("topLevelDeleted: top level %p not found\n", tl); //assert(false); } -//--------------------------------------------------------- -// ctrlChanged -// midi ctrl value changed -//--------------------------------------------------------- -#if 0 -void MusE::ctrlChanged() - { - arranger->updateInspector(); - } -#endif - -//--------------------------------------------------------- -// keyPressEvent -//--------------------------------------------------------- - -void MusE::keyPressEvent(QKeyEvent* event) - { - // Pass it on to arranger part canvas. - arranger->getCanvas()->redirKeypress(event); - } //--------------------------------------------------------- // kbAccel @@ -2653,37 +2282,6 @@ static void catchSignal(int sig) } #endif -#if 0 -//--------------------------------------------------------- -// configPart -//--------------------------------------------------------- - -void MusE::configPart(int id) - { - if (id < 3) { - partConfig->setItemChecked(0, id == 0); - partConfig->setItemChecked(1, id == 1); - partConfig->setItemChecked(2, id == 2); - arranger->setShowPartType(id); - for (int i = 3; i < 10; ++i) { - partConfig->setItemEnabled(i, id == 2); - } - } - else { - bool flag = !partConfig->isItemChecked(id); - partConfig->setItemChecked(id, flag); - int val = arranger->showPartEvent(); - if (flag) { - val |= 1 << (id-3); - } - else { - val &= ~(1 << (id-3)); - } - arranger->setShowPartEvent(val); - } - } -#endif - //--------------------------------------------------------- // cmd // some cmd's from pulldown menu @@ -2691,99 +2289,7 @@ void MusE::configPart(int id) void MusE::cmd(int cmd) { - TrackList* tracks = song->tracks(); - int l = song->lpos(); - int r = song->rpos(); - switch(cmd) { - case CMD_CUT: - arranger->cmd(Arranger::CMD_CUT_PART); - break; - case CMD_COPY: - arranger->cmd(Arranger::CMD_COPY_PART); - break; - case CMD_PASTE: - arranger->cmd(Arranger::CMD_PASTE_PART); - break; - case CMD_PASTE_CLONE: - arranger->cmd(Arranger::CMD_PASTE_CLONE_PART); - break; - case CMD_PASTE_TO_TRACK: - arranger->cmd(Arranger::CMD_PASTE_PART_TO_TRACK); - break; - case CMD_PASTE_CLONE_TO_TRACK: - arranger->cmd(Arranger::CMD_PASTE_CLONE_PART_TO_TRACK); - break; - case CMD_INSERT: - arranger->cmd(Arranger::CMD_INSERT_PART); - break; - case CMD_INSERTMEAS: - arranger->cmd(Arranger::CMD_INSERT_EMPTYMEAS); - break; - case CMD_DELETE: - if (!song->msgRemoveParts()) //automatically does undo if neccessary and returns true then - { - //msgRemoveParts() returned false -> no parts to remove? - song->startUndo(); - audio->msgRemoveTracks(); //TODO FINDME this could still be speeded up! - song->endUndo(SC_TRACK_REMOVED); - } - break; - case CMD_DELETE_TRACK: - song->startUndo(); - audio->msgRemoveTracks(); - song->endUndo(SC_TRACK_REMOVED); - audio->msgUpdateSoloStates(); - break; - - case CMD_SELECT_ALL: - case CMD_SELECT_NONE: - case CMD_SELECT_INVERT: - case CMD_SELECT_ILOOP: - case CMD_SELECT_OLOOP: - for (iTrack i = tracks->begin(); i != tracks->end(); ++i) { - PartList* parts = (*i)->parts(); - for (iPart p = parts->begin(); p != parts->end(); ++p) { - bool f = false; - int t1 = p->second->tick(); - int t2 = t1 + p->second->lenTick(); - bool inside = - ((t1 >= l) && (t1 < r)) - || ((t2 > l) && (t2 < r)) - || ((t1 <= l) && (t2 > r)); - switch(cmd) { - case CMD_SELECT_INVERT: - f = !p->second->selected(); - break; - case CMD_SELECT_NONE: - f = false; - break; - case CMD_SELECT_ALL: - f = true; - break; - case CMD_SELECT_ILOOP: - f = inside; - break; - case CMD_SELECT_OLOOP: - f = !inside; - break; - } - p->second->setSelected(f); - } - } - song->update(); - break; - - case CMD_SELECT_PARTS: - for (iTrack i = tracks->begin(); i != tracks->end(); ++i) { - if (!(*i)->selected()) - continue; - PartList* parts = (*i)->parts(); - for (iPart p = parts->begin(); p != parts->end(); ++p) - p->second->setSelected(true); - } - song->update(); - break; case CMD_FOLLOW_NO: song->setFollow(Song::NO); setFollow(); @@ -2796,43 +2302,10 @@ void MusE::cmd(int cmd) song->setFollow(Song::CONTINUOUS); setFollow(); break; - - case CMD_SHRINK_PART: shrink_parts(); break; - case CMD_EXPAND_PART: expand_parts(); break; - case CMD_CLEAN_PART: clean_parts(); break; } } -//--------------------------------------------------------- -// clipboardChanged -//--------------------------------------------------------- -void MusE::clipboardChanged() - { - bool flag = false; - if(QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-midipartlist")) || - QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-wavepartlist")) || - QApplication::clipboard()->mimeData()->hasFormat(QString("text/x-muse-mixedpartlist"))) - flag = true; - - editPasteAction->setEnabled(flag); - editInsertAction->setEnabled(flag); - editPasteCloneAction->setEnabled(flag); - editPaste2TrackAction->setEnabled(flag); - editPasteC2TAction->setEnabled(flag); - } - -//--------------------------------------------------------- -// selectionChanged -//--------------------------------------------------------- - -void MusE::selectionChanged() - { - //bool flag = arranger->isSingleSelection(); // -- Hmm, why only single? - bool flag = arranger->selectionSize() > 0; // -- Test OK cut and copy. For muse2. Tim. - editCutAction->setEnabled(flag); - editCopyAction->setEnabled(flag); - } @@ -2843,7 +2316,7 @@ void MusE::selectionChanged() void MusE::configAppearance() { if (!appearance) - appearance = new Appearance(arranger); + appearance = new Appearance(_arranger); appearance->resetValues(); if(appearance->isVisible()) { appearance->raise(); @@ -3255,21 +2728,24 @@ bool MusE::clearSong(bool clear_all) again: for (iToplevel i = toplevels.begin(); i != toplevels.end(); ++i) { - Toplevel tl = *i; - unsigned long obj = tl.object(); - switch (tl.type()) { - case Toplevel::CLIPLIST: - case Toplevel::MARKER: + TopWin* tl = *i; + switch (tl->type()) { + case TopWin::CLIPLIST: + case TopWin::MARKER: + case TopWin::ARRANGER: break; - case Toplevel::PIANO_ROLL: - case Toplevel::SCORE: - case Toplevel::LISTE: - case Toplevel::DRUM: - case Toplevel::MASTER: - case Toplevel::WAVE: - case Toplevel::LMASTER: - ((QWidget*)(obj))->close(); + case TopWin::PIANO_ROLL: + case TopWin::SCORE: + case TopWin::LISTE: + case TopWin::DRUM: + case TopWin::MASTER: + case TopWin::WAVE: + case TopWin::LMASTER: + tl->close(); goto again; + + case TopWin::TOPLEVELTYPE_LAST_ENTRY: //to avoid a warning + break; } } microSleep(100000); @@ -3366,41 +2842,7 @@ void MusE::updateConfiguration() MusEGlobal::undoAction->setShortcut(shortcuts[SHRT_UNDO].key); MusEGlobal::redoAction->setShortcut(shortcuts[SHRT_REDO].key); - editCutAction->setShortcut(shortcuts[SHRT_CUT].key); - editCopyAction->setShortcut(shortcuts[SHRT_COPY].key); - editPasteAction->setShortcut(shortcuts[SHRT_PASTE].key); - editInsertAction->setShortcut(shortcuts[SHRT_INSERT].key); - editInsertEMAction->setShortcut(shortcuts[SHRT_INSERTMEAS].key); - editPasteCloneAction->setShortcut(shortcuts[SHRT_PASTE_CLONE].key); - editPaste2TrackAction->setShortcut(shortcuts[SHRT_PASTE_TO_TRACK].key); - editPasteC2TAction->setShortcut(shortcuts[SHRT_PASTE_CLONE_TO_TRACK].key); - - //editDeleteSelectedAction has no acceleration - - trackMidiAction->setShortcut(shortcuts[SHRT_ADD_MIDI_TRACK].key); - trackDrumAction->setShortcut(shortcuts[SHRT_ADD_DRUM_TRACK].key); - trackWaveAction->setShortcut(shortcuts[SHRT_ADD_WAVE_TRACK].key); - trackAOutputAction->setShortcut(shortcuts[SHRT_ADD_AUDIO_OUTPUT].key); - trackAGroupAction->setShortcut(shortcuts[SHRT_ADD_AUDIO_GROUP].key); - trackAInputAction->setShortcut(shortcuts[SHRT_ADD_AUDIO_INPUT].key); - trackAAuxAction->setShortcut(shortcuts[SHRT_ADD_AUDIO_AUX].key); - - editSelectAllAction->setShortcut(shortcuts[SHRT_SELECT_ALL].key); - editDeselectAllAction->setShortcut(shortcuts[SHRT_SELECT_NONE].key); - editInvertSelectionAction->setShortcut(shortcuts[SHRT_SELECT_INVERT].key); - editInsideLoopAction->setShortcut(shortcuts[SHRT_SELECT_OLOOP].key); - editOutsideLoopAction->setShortcut(shortcuts[SHRT_SELECT_OLOOP].key); - editAllPartsAction->setShortcut(shortcuts[SHRT_SELECT_PRTSTRACK].key); - - startPianoEditAction->setShortcut(shortcuts[SHRT_OPEN_PIANO].key); - startDrumEditAction->setShortcut(shortcuts[SHRT_OPEN_DRUMS].key); - startListEditAction->setShortcut(shortcuts[SHRT_OPEN_LIST].key); - startWaveEditAction->setShortcut(shortcuts[SHRT_OPEN_WAVE].key); - - masterGraphicAction->setShortcut(shortcuts[SHRT_OPEN_GRAPHIC_MASTER].key); - masterListAction->setShortcut(shortcuts[SHRT_OPEN_LIST_MASTER].key); - - midiTransformerAction->setShortcut(shortcuts[SHRT_OPEN_MIDI_TRANSFORM].key); + //editSongInfoAction has no acceleration viewTransportAction->setShortcut(shortcuts[SHRT_OPEN_TRANSPORT].key); @@ -3410,11 +2852,6 @@ void MusE::updateConfiguration() //viewCliplistAction has no acceleration viewMarkerAction->setShortcut(shortcuts[SHRT_OPEN_MARKER].key); - strGlobalCutAction->setShortcut(shortcuts[SHRT_GLOBAL_CUT].key); - strGlobalInsertAction->setShortcut(shortcuts[SHRT_GLOBAL_INSERT].key); - strGlobalSplitAction->setShortcut(shortcuts[SHRT_GLOBAL_SPLIT].key); - strCopyRangeAction->setShortcut(shortcuts[SHRT_COPY_RANGE].key); - strCutEventsAction->setShortcut(shortcuts[SHRT_CUT_EVENTS].key); // midiEditInstAction does not have acceleration midiResetInstAction->setShortcut(shortcuts[SHRT_MIDI_RESET].key); @@ -3450,11 +2887,14 @@ void MusE::updateConfiguration() followCtsAction->setShortcut(shortcuts[SHRT_FOLLOW_CONTINUOUS].key); helpManualAction->setShortcut(shortcuts[SHRT_OPEN_HELP].key); + fullscreenAction->setShortcut(shortcuts[SHRT_FULLSCREEN].key); // Orcan: Old stuff, needs to be converted. These aren't used anywhere so I commented them out //menuSettings->setAccel(shortcuts[SHRT_CONFIG_AUDIO_PORTS].key, menu_ids[CMD_CONFIG_AUDIO_PORTS]); //menu_help->setAccel(menu_ids[CMD_START_WHATSTHIS], shortcuts[SHRT_START_WHATSTHIS].key); + //arrangerView->updateShortcuts(); //commented out by flo: is done via signal + } //--------------------------------------------------------- @@ -3589,14 +3029,6 @@ void MusE::focusInEvent(QFocusEvent* ev) QMainWindow::focusInEvent(ev); } -//--------------------------------------------------------- -// setUsedTool -//--------------------------------------------------------- - -void MusE::setUsedTool(int tool) - { - tools1->set(tool); - } //--------------------------------------------------------- @@ -3625,4 +3057,384 @@ void MusE::findUnusedWaveFiles() unused.exec(); } +void MusE::focusChanged(QWidget*, QWidget* now) +{ + QWidget* ptr=now; + + if (activeTopWin) + activeTopWin->storeInitialState(); + + if (currentMenuSharingTopwin && (currentMenuSharingTopwin!=activeTopWin)) + currentMenuSharingTopwin->storeInitialState(); + + + + while (ptr) + { + if ( (dynamic_cast<TopWin*>(ptr)!=0) || // *ptr is a TopWin or a derived class + (ptr==this) ) // the main window is selected + break; + ptr=dynamic_cast<QWidget*>(ptr->parent()); //in the unlikely case that ptr is a QObject, this returns NULL, which stops the loop + } + + // ptr is either NULL, this or the pointer to a TopWin + if (ptr!=this) // if the main win is selected, don't treat that as "none", but also don't handle it + { + TopWin* win=dynamic_cast<TopWin*>(ptr); + + // now 'win' is either NULL or the pointer to the active TopWin + if (win!=activeTopWin) + { + activeTopWin=win; + emit activeTopWinChanged(activeTopWin); + } + } +} + + +void MusE::activeTopWinChangedSlot(TopWin* win) +{ + if (MusEGlobal::debugMsg) printf("ACTIVE TOPWIN CHANGED to '%s' (%p)\n", win ? win->windowTitle().toAscii().data() : "<None>", win); + + if ((win==NULL) || (win->isMdiWin()==false)) + { + if (MusEGlobal::debugMsg) printf(" that's out of the MDI area\n"); + menuBar()->setFocus(Qt::MenuBarFocusReason); + } + + if (win && (win->sharesToolsAndMenu())) + setCurrentMenuSharingTopwin(win); +} + + + +void MusE::setCurrentMenuSharingTopwin(TopWin* win) +{ + if (win && (win->sharesToolsAndMenu()==false)) + { + printf("WARNING: THIS SHOULD NEVER HAPPEN: MusE::setCurrentMenuSharingTopwin() called with a win which does not share (%s)! ignoring...\n", win->windowTitle().toAscii().data()); + return; + } + + if (win!=currentMenuSharingTopwin) + { + TopWin* previousMenuSharingTopwin = currentMenuSharingTopwin; + currentMenuSharingTopwin = NULL; + + if (MusEGlobal::debugMsg) printf("MENU SHARING TOPWIN CHANGED to '%s' (%p)\n", win ? win->windowTitle().toAscii().data() : "<None>", win); + + // empty our toolbars + if (previousMenuSharingTopwin) + { + for (list<QToolBar*>::iterator it = foreignToolbars.begin(); it!=foreignToolbars.end(); it++) + if (*it) + { + if (MusEGlobal::debugMsg) printf(" removing sharer's toolbar '%s'\n", (*it)->windowTitle().toAscii().data()); + removeToolBar(*it); // this does not delete *it, which is good + (*it)->setParent(NULL); + } + + foreignToolbars.clear(); + } + else + { + for (list<QToolBar*>::iterator it = optionalToolbars.begin(); it!=optionalToolbars.end(); it++) + if (*it) + { + if (MusEGlobal::debugMsg) printf(" removing optional toolbar '%s'\n", (*it)->windowTitle().toAscii().data()); + removeToolBar(*it); // this does not delete *it, which is good + (*it)->setParent(NULL); + } + } + + //empty our menu + menuBar()->clear(); + + + + + for (list<QMenu*>::iterator it = leadingMenus.begin(); it!=leadingMenus.end(); it++) + menuBar()->addMenu(*it); + + if (win) + { + const QList<QAction*>& actions=win->menuBar()->actions(); + for (QList<QAction*>::const_iterator it=actions.begin(); it!=actions.end(); it++) + { + if (MusEGlobal::debugMsg) printf(" menu entry '%s'\n", (*it)->text().toAscii().data()); + + menuBar()->addAction(*it); + } + + + + const list<QToolBar*>& toolbars=win->toolbars(); + for (list<QToolBar*>::const_iterator it=toolbars.begin(); it!=toolbars.end(); it++) + if (*it) + { + if (MusEGlobal::debugMsg) printf(" toolbar '%s'\n", (*it)->windowTitle().toAscii().data()); + + addToolBar(*it); + foreignToolbars.push_back(*it); + (*it)->show(); + } + else + { + if (MusEGlobal::debugMsg) printf(" toolbar break\n"); + + addToolBarBreak(); + foreignToolbars.push_back(NULL); + } + } + + for (list<QMenu*>::iterator it = trailingMenus.begin(); it!=trailingMenus.end(); it++) + menuBar()->addMenu(*it); + + + currentMenuSharingTopwin=win; + + if (win) + win->restoreMainwinState(); //restore toolbar positions in main window + } +} + +void MusE::addMdiSubWindow(QMdiSubWindow* win) +{ + mdiArea->addSubWindow(win); +} + +void MusE::shareMenuAndToolbarChanged(TopWin* win, bool val) +{ + if (val) + { + if ((win == activeTopWin) && (win != currentMenuSharingTopwin)) + setCurrentMenuSharingTopwin(win); + } + else + { + if (win == currentMenuSharingTopwin) + { + if (activeTopWin && (win != activeTopWin) && (activeTopWin->sharesToolsAndMenu())) + setCurrentMenuSharingTopwin(activeTopWin); + else + setCurrentMenuSharingTopwin(NULL); + } + } +} + +void MusE::updateWindowMenu() +{ + bool sep; + bool there_are_subwins=false; + + menuWindows->clear(); // frees memory automatically + + menuWindows->addAction(windowsCascadeAction); + menuWindows->addAction(windowsTileAction); + menuWindows->addAction(windowsRowsAction); + menuWindows->addAction(windowsColumnsAction); + + sep=false; + for (iToplevel it=toplevels.begin(); it!=toplevels.end(); it++) + if (((*it)->isVisible() || (*it)->isVisibleTo(this)) && (*it)->isMdiWin()) + // the isVisibleTo check is neccessary because isVisible returns false if a + // MdiSubWin is actually visible, but the muse main window is hidden for some reason + { + if (!sep) + { + menuWindows->addSeparator(); + sep=true; + } + QAction* temp=menuWindows->addAction((*it)->windowTitle()); + connect(temp, SIGNAL(activated()), windowsMapper, SLOT(map())); + windowsMapper->setMapping(temp, static_cast<QWidget*>(*it)); + + there_are_subwins=true; + } + + sep=false; + for (iToplevel it=toplevels.begin(); it!=toplevels.end(); it++) + if (((*it)->isVisible() || (*it)->isVisibleTo(this)) && !(*it)->isMdiWin()) + { + if (!sep) + { + menuWindows->addSeparator(); + sep=true; + } + QAction* temp=menuWindows->addAction((*it)->windowTitle()); + connect(temp, SIGNAL(activated()), windowsMapper, SLOT(map())); + windowsMapper->setMapping(temp, static_cast<QWidget*>(*it)); + } + + windowsCascadeAction->setEnabled(there_are_subwins); + windowsTileAction->setEnabled(there_are_subwins); + windowsRowsAction->setEnabled(there_are_subwins); + windowsColumnsAction->setEnabled(there_are_subwins); +} + +void MusE::bringToFront(QWidget* widget) +{ + TopWin* win=dynamic_cast<TopWin*>(widget); + if (win->isMdiWin()) + { + win->show(); + mdiArea->setActiveSubWindow(win->getMdiWin()); + } + else + { + win->activateWindow(); + win->raise(); + } + + activeTopWinChangedSlot(win); +} + +void MusE::setFullscreen(bool val) +{ + if (val) + showFullScreen(); + else + showNormal(); +} + + + +list<QMdiSubWindow*> get_all_visible_subwins(QMdiArea* mdiarea) +{ + QList<QMdiSubWindow*> wins = mdiarea->subWindowList(); + list<QMdiSubWindow*> result; + + // always put the arranger at the top of the list, if visible + + for (QList<QMdiSubWindow*>::iterator it=wins.begin(); it!=wins.end(); it++) + if ((*it)->isVisible() && ((*it)->isMinimized()==false)) + if (dynamic_cast<TopWin*>((*it)->widget())->type()==TopWin::ARRANGER) + result.push_back(*it); + + for (QList<QMdiSubWindow*>::iterator it=wins.begin(); it!=wins.end(); it++) + if ((*it)->isVisible() && ((*it)->isMinimized()==false)) + if (dynamic_cast<TopWin*>((*it)->widget())->type()!=TopWin::ARRANGER) + result.push_back(*it); + + return result; +} + +void MusE::arrangeSubWindowsColumns() +{ + list<QMdiSubWindow*> wins=get_all_visible_subwins(mdiArea); + int n=wins.size(); + + if (n==0) + return; + //else if (n==1) + // (*wins.begin())->showMaximized(); // commented out by flo. i like it better that way. + else + { + int width = mdiArea->width(); + int height = mdiArea->height(); + int x_add = (*wins.begin())->frameGeometry().width() - (*wins.begin())->geometry().width(); + int y_add = (*wins.begin())->frameGeometry().height() - (*wins.begin())->geometry().height(); + int width_per_win = width/n; + + if (x_add >= width_per_win) + { + printf("ERROR: tried to arrange subwins in columns, but there's too few space.\n"); + return; + } + + int i=0; + for (list<QMdiSubWindow*>::iterator it=wins.begin(); it!=wins.end(); it++, i++) + { + int left = (float) width*i/n; + int right = (float) width*(i+1.0)/n; + + (*it)->move(left,0); + (*it)->resize(right-left-x_add, height-y_add); + } + } +} + +void MusE::arrangeSubWindowsRows() +{ + list<QMdiSubWindow*> wins=get_all_visible_subwins(mdiArea); + int n=wins.size(); + + if (n==0) + return; + //else if (n==1) + // (*wins.begin())->showMaximized(); // commented out by flo. i like it better that way. + else + { + int width = mdiArea->width(); + int height = mdiArea->height(); + int x_add = (*wins.begin())->frameGeometry().width() - (*wins.begin())->geometry().width(); + int y_add = (*wins.begin())->frameGeometry().height() - (*wins.begin())->geometry().height(); + int height_per_win = height/n; + + if (y_add >= height_per_win) + { + printf("ERROR: tried to arrange subwins in rows, but there's too few space.\n"); + return; + } + + int i=0; + for (list<QMdiSubWindow*>::iterator it=wins.begin(); it!=wins.end(); it++, i++) + { + int top = (float) height*i/n; + int bottom = (float) height*(i+1.0)/n; + + (*it)->move(0,top); + (*it)->resize(width-x_add, bottom-top-y_add); + } + } +} + +void MusE::tileSubWindows() +{ + list<QMdiSubWindow*> wins=get_all_visible_subwins(mdiArea); + int n=wins.size(); + + if (n==0) + return; + //else if (n==1) + // (*wins.begin())->showMaximized(); // commented out by flo. i like it better that way. + else + { + int nx,ny; + nx=ceil(sqrt(n)); + ny=ceil((double)n/nx); + + int width = mdiArea->width(); + int height = mdiArea->height(); + int x_add = (*wins.begin())->frameGeometry().width() - (*wins.begin())->geometry().width(); + int y_add = (*wins.begin())->frameGeometry().height() - (*wins.begin())->geometry().height(); + int height_per_win = height/ny; + int width_per_win = height/nx; + + if ((x_add >= width_per_win) || (y_add >= height_per_win)) + { + printf("ERROR: tried to tile subwins, but there's too few space.\n"); + return; + } + + int i=0, j=0; + for (list<QMdiSubWindow*>::iterator it=wins.begin(); it!=wins.end(); it++, i++) + { + if (i>=nx) + { + i=0; + j++; + } + + int top = (float) height*j/ny; + int bottom = (float) height*(j+1.0)/ny; + int left = (float) width*i/nx; + int right = (float) width*(i+1.0)/nx; + + (*it)->move(left,top); + (*it)->resize(right-left-x_add, bottom-top-y_add); + } + } +} + } //namespace MusEApp |