From 84fdf802caa8a37cbbc3e8d2a4b33e7e89251604 Mon Sep 17 00:00:00 2001 From: Florian Jung Date: Fri, 15 Apr 2011 16:37:42 +0000 Subject: added menus for adding new staves to score windows introduced Toplevel::SCORE cleaned up the code a bit still TODO: support and display score-names possible bugs: ScoreEdit::parts() isn't kept --- muse2/muse/app.cpp | 126 ++++++++++++++++++++++++++++++++------ muse2/muse/app.h | 16 +++-- muse2/muse/cobject.h | 2 +- muse2/muse/midiedit/scoreedit.cpp | 108 ++++++++++++++++++++------------ muse2/muse/midiedit/scoreedit.h | 38 +++--------- 5 files changed, 199 insertions(+), 91 deletions(-) diff --git a/muse2/muse/app.cpp b/muse2/muse/app.cpp index 58de4584..c4ed06dc 100644 --- a/muse2/muse/app.cpp +++ b/muse2/muse/app.cpp @@ -114,6 +114,20 @@ pthread_t splashThread; // // pyscript->runPythonScript(script); // } + +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*))); +} + + //--------------------------------------------------------- // sleep function //--------------------------------------------------------- @@ -803,6 +817,8 @@ MusE::MusE(int argc, char** argv) : QMainWindow() editSignalMapper = new QSignalMapper(this); midiPluginSignalMapper = new QSignalMapper(this); followSignalMapper = new QSignalMapper(this); + scoreOneStaffPerTrackMapper = new QSignalMapper(this); + scoreAllInOneMapper = new QSignalMapper(this); song = new Song("song"); song->blockSignals(true); @@ -977,7 +993,15 @@ MusE::MusE(int argc, char** argv) : QMainWindow() 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); - startScoreEditAction = new QAction(*scoreIconSet, tr("Score"), 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); + + updateScoreMenus(); + 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); @@ -1127,10 +1151,12 @@ MusE::MusE(int argc, char** argv) : QMainWindow() connect(editSignalMapper, SIGNAL(mapped(int)), this, SLOT(cmd(int))); connect(startPianoEditAction, SIGNAL(activated()), SLOT(startPianoroll())); - connect(startScoreEditAction, SIGNAL(activated()), SLOT(startScoreEdit())); 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())); @@ -1346,7 +1372,9 @@ MusE::MusE(int argc, char** argv) : QMainWindow() menuEdit->addSeparator(); menuEdit->addAction(startPianoEditAction); - menuEdit->addAction(startScoreEditAction); + menuEdit->addMenu(scoreSubmenu); + scoreSubmenu->addMenu(scoreAllInOneSubsubmenu); + scoreSubmenu->addMenu(scoreOneStaffPerTrackSubsubmenu); menuEdit->addAction(startDrumEditAction); menuEdit->addAction(startListEditAction); menuEdit->addAction(startWaveEditAction); @@ -3416,27 +3444,83 @@ PartList* MusE::getMidiPartsToEdit() return pl; } + + +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(tr("foo"), this); //TODO FLO: use proper name instead of "foo" + connect(action, SIGNAL(activated()), scoreOneStaffPerTrackMapper, SLOT(map())); + scoreOneStaffPerTrackMapper->setMapping(action, (QWidget*)score); + scoreOneStaffPerTrackSubsubmenu->addAction(action); + + + action=new QAction(tr("foo"), this); //the above action may NOT be reused! //TODO FLO: see above + connect(action, SIGNAL(activated()), scoreAllInOneMapper, SLOT(map())); + scoreAllInOneMapper->setMapping(action, (QWidget*)score); + scoreAllInOneSubsubmenu->addAction(action); + } +} + //--------------------------------------------------------- // startScoreEdit //--------------------------------------------------------- -void MusE::startScoreEdit() - { - PartList* pl = getMidiPartsToEdit(); - if (pl == 0) - return; - startScoreEdit(pl, true); - } +void MusE::openInScoreEdit_oneStaffPerTrack(QWidget* dest) +{ + openInScoreEdit((ScoreEdit*)dest, false); +} -void MusE::startScoreEdit(PartList* pl, bool showDefaultCtrls) - { +void MusE::openInScoreEdit_allInOne(QWidget* dest) +{ + openInScoreEdit((ScoreEdit*)dest, true); +} - ScoreEdit* scoreedit = new ScoreEdit(pl, this, 0, arranger->cursorValue()); - scoreedit->show(); - toplevels.push_back(Toplevel(Toplevel::PIANO_ROLL, (unsigned long)(scoreedit), scoreedit)); - connect(scoreedit, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long))); - connect(muse, SIGNAL(configChanged()), scoreedit, SLOT(configChanged())); - } +void MusE::openInScoreEdit(ScoreEdit* destination, bool allInOne) +{ + PartList* pl = getMidiPartsToEdit(); + if (pl == 0) + return; + openInScoreEdit(destination, pl, allInOne); +} + +void MusE::openInScoreEdit(ScoreEdit* destination, PartList* pl, bool allInOne) +{ + if (destination==NULL) // if no destination given, create a new one + { + destination = new ScoreEdit(pl, 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(muse, SIGNAL(configChanged()), destination, SLOT(configChanged())); + + updateScoreMenus(); + } + + destination->add_parts(pl, allInOne); +} //--------------------------------------------------------- // startPianoroll @@ -3657,6 +3741,7 @@ void MusE::toplevelDeleted(unsigned long tl) { for (iToplevel i = toplevels.begin(); i != toplevels.end(); ++i) { if (i->object() == tl) { + bool mustUpdateScoreMenus=false; switch(i->type()) { case Toplevel::MARKER: break; @@ -3675,8 +3760,12 @@ void MusE::toplevelDeleted(unsigned long tl) case Toplevel::WAVE: case Toplevel::LMASTER: break; + case Toplevel::SCORE: + mustUpdateScoreMenus=true; } toplevels.erase(i); + if (mustUpdateScoreMenus) + updateScoreMenus(); return; } } @@ -4829,6 +4918,7 @@ again: case Toplevel::MARKER: break; case Toplevel::PIANO_ROLL: + case Toplevel::SCORE: case Toplevel::LISTE: case Toplevel::DRUM: case Toplevel::MASTER: diff --git a/muse2/muse/app.h b/muse2/muse/app.h index 168602d3..3555ce87 100644 --- a/muse2/muse/app.h +++ b/muse2/muse/app.h @@ -65,6 +65,7 @@ class Appearance; class WaveTrack; class AudioOutput; class EditInstrument; +class ScoreEdit; #define MENU_ADD_SYNTH_ID_BASE 0x1000 @@ -109,7 +110,7 @@ class MusE : public QMainWindow QAction *editInvertSelectionAction, *editInsideLoopAction, *editOutsideLoopAction, *editAllPartsAction; QAction *trackMidiAction, *trackDrumAction, *trackWaveAction, *trackAOutputAction, *trackAGroupAction; QAction *trackAInputAction, *trackAAuxAction; - QAction *startPianoEditAction, *startDrumEditAction, *startListEditAction, *startWaveEditAction, *startScoreEditAction; + QAction *startPianoEditAction, *startDrumEditAction, *startListEditAction, *startWaveEditAction; QAction *masterGraphicAction, *masterListAction; QAction *midiTransposeAction; QAction *midiTransformerAction; @@ -158,6 +159,7 @@ class MusE : public QMainWindow QMenu* menu_audio, *menuAutomation; QMenu* menu_functions, *menuScriptPlugins; QMenu* select, *master, *midiEdit, *addTrack; + QMenu *scoreSubmenu, *scoreOneStaffPerTrackSubsubmenu, *scoreAllInOneSubsubmenu; // Special 'stay-open' menu for routes. PopupMenu* routingPopupMenu; @@ -220,6 +222,8 @@ class MusE : public QMainWindow QSignalMapper *editSignalMapper; QSignalMapper *midiPluginSignalMapper; QSignalMapper *followSignalMapper; + QSignalMapper *scoreOneStaffPerTrackMapper; + QSignalMapper *scoreAllInOneMapper; signals: void configChanged(); @@ -261,8 +265,12 @@ class MusE : public QMainWindow void startDrumEditor(); void startDrumEditor(PartList* /*pl*/, bool /*showDefaultCtrls*/ = false); void startEditor(Track*); - void startScoreEdit(); - void startScoreEdit(PartList* /*pl*/, bool /*showDefaultCtrls*/ = false); + 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 updateScoreMenus(); + void clearScoreMenuMappers(); void startPianoroll(); void startPianoroll(PartList* /*pl*/, bool /*showDefaultCtrls*/ = false); void startWaveEditor(); @@ -320,7 +328,7 @@ class MusE : public QMainWindow void execDeliveredScript(int); void execUserScript(int); - + public slots: bool saveAs(); void bounceToFile(AudioOutput* ao = 0); diff --git a/muse2/muse/cobject.h b/muse2/muse/cobject.h index 8e21eaf0..9a80b2b1 100644 --- a/muse2/muse/cobject.h +++ b/muse2/muse/cobject.h @@ -38,7 +38,7 @@ class TopWin : public QMainWindow class Toplevel { public: enum ToplevelType { PIANO_ROLL, LISTE, DRUM, MASTER, WAVE, - LMASTER, CLIPLIST, MARKER + LMASTER, CLIPLIST, MARKER, SCORE #ifdef PATCHBAY , M_PATCHBAY #endif /* PATCHBAY */ diff --git a/muse2/muse/midiedit/scoreedit.cpp b/muse2/muse/midiedit/scoreedit.cpp index 2077b202..0e164a2a 100644 --- a/muse2/muse/midiedit/scoreedit.cpp +++ b/muse2/muse/midiedit/scoreedit.cpp @@ -159,24 +159,30 @@ bool pixmaps_loaded=false; ScoreEdit::ScoreEdit(PartList* pl, QWidget* parent, const char* name, unsigned initPos) : MidiEditor(0, 0, pl, parent, name) { - ScoreCanvas* test=new ScoreCanvas(this, mainw, 1, 1); + score_canvas=new ScoreCanvas(this, mainw, 1, 1); hscroll = new QScrollBar(Qt::Horizontal, mainw); + connect(hscroll, SIGNAL(valueChanged(int)), score_canvas, SLOT(scroll_event(int))); + connect(score_canvas, SIGNAL(xpos_changed(int)), hscroll, SLOT(setValue(int))); + connect(score_canvas, SIGNAL(canvas_width_changed(int)), SLOT(canvas_width_changed(int))); + connect(score_canvas, SIGNAL(viewport_width_changed(int)), SLOT(viewport_width_changed(int))); + connect(song, SIGNAL(songChanged(int)), score_canvas, SLOT(song_changed(int))); -connect(hscroll, SIGNAL(valueChanged(int)), test, SLOT(scroll_event(int))); -connect(test, SIGNAL(xpos_changed(int)), hscroll, SLOT(setValue(int)));connect(song, SIGNAL(songChanged(int)), test, SLOT(song_changed(int))); -connect(test, SIGNAL(canvas_width_changed(int)), SLOT(canvas_width_changed(int))); -connect(test, SIGNAL(viewport_width_changed(int)), SLOT(viewport_width_changed(int))); + mainGrid->addWidget(score_canvas, 0, 0); + mainGrid->addWidget(hscroll,1,0); - mainGrid->addWidget(test, 0, 0); - mainGrid->addWidget(hscroll,1,0); + hscroll->setMinimum(0); -hscroll->setMinimum(0); -test->song_changed(0); -test->goto_tick(initPos,true); + score_canvas->song_changed(0); + score_canvas->goto_tick(initPos,true); } +void ScoreEdit::add_parts(PartList* pl, bool all_in_one) +{ + score_canvas->add_staves(pl, all_in_one); +} + //--------------------------------------------------------- // ~ScoreEdit //--------------------------------------------------------- @@ -208,7 +214,55 @@ void ScoreEdit::closeEvent(QCloseEvent* e) +void ScoreCanvas::add_staves(PartList* pl, bool all_in_one) +{ + staff_t staff; + + if (all_in_one) + { + staff.parts.clear(); + for (ciPart part_it=pl->begin(); part_it!=pl->end(); part_it++) + staff.parts.insert(part_it->second); + + staff.split_note=SPLIT_NOTE; + + staff.type=GRAND_TOP; //FINDMICH + staff.clef=VIOLIN; + staffs.push_back(staff); + + staff.type=GRAND_BOTTOM; + staff.clef=BASS; + staffs.push_back(staff); + } + else + { + set tracks; + + for (ciPart it=pl->begin(); it!=pl->end(); it++) + tracks.insert(it->second->track()); + + for (set::iterator it=tracks.begin(); it!=tracks.end(); it++) + { + staff.parts.clear(); + for (ciPart part_it=pl->begin(); part_it!=pl->end(); part_it++) + if (part_it->second->track() == *it) + staff.parts.insert(part_it->second); + + staff.split_note=SPLIT_NOTE; + + staff.type=GRAND_TOP; //FINDMICH + staff.clef=VIOLIN; + staffs.push_back(staff); + staff.type=GRAND_BOTTOM; + staff.clef=BASS; + staffs.push_back(staff); + } + } + + recalc_staff_pos(); + song_changed(0); +} ScoreCanvas::ScoreCanvas(MidiEditor* pr, QWidget* parent, @@ -228,39 +282,12 @@ ScoreCanvas::ScoreCanvas(MidiEditor* pr, QWidget* parent, mouse_erases_notes=false; mouse_inserts_notes=true; - curr_part=editor->parts()->begin()->second; + curr_part=editor->parts()->begin()->second; //TODO FINDMICH last_len=384; new_len=-1; dragging_staff=false; - - //each track gets its own staff - staff_t staff; - set tracks; - - for (ciPart it=editor->parts()->begin(); it!=editor->parts()->end(); it++) - tracks.insert(it->second->track()); - - for (set::iterator it=tracks.begin(); it!=tracks.end(); it++) - { - staff.parts.clear(); - for (ciPart part_it=editor->parts()->begin(); part_it!=editor->parts()->end(); part_it++) - if (part_it->second->track() == *it) - staff.parts.insert(part_it->second); - - staff.split_note=SPLIT_NOTE; - - staff.type=GRAND_TOP; - staff.clef=VIOLIN; - staffs.push_back(staff); - - staff.type=GRAND_BOTTOM; - staff.clef=BASS; - staffs.push_back(staff); - } - - recalc_staff_pos(); scroll_speed=0; @@ -2861,7 +2888,8 @@ list::iterator ScoreCanvas::staff_at_y(int y) * o when pressing "STOP", the active note isn't redrawn "normally" * * CURRENT TODO - * > o menu entries etc for creating new staves etc. + * o use correct names in score-menus + * o must add_parts() update the part-list? * * IMPORTANT TODO * o support adding staves to existing score window @@ -2891,6 +2919,8 @@ list::iterator ScoreCanvas::staff_at_y(int y) * o redraw is called too often * for example, when scroll is continuous, and note-hilighting has * changed, redraw() is called twice + * o song_changed() should distinguish between relevant and + * irrelevant changes. (for example controllers can be ignored) * o ties aren't always drawn correctly when the destination note * is out of view * o tied notes don't work properly when there's a key-change in diff --git a/muse2/muse/midiedit/scoreedit.h b/muse2/muse/midiedit/scoreedit.h index e78b4a8e..a199e49f 100644 --- a/muse2/muse/midiedit/scoreedit.h +++ b/muse2/muse/midiedit/scoreedit.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #include "noteinfo.h" @@ -37,38 +38,12 @@ using std::map; using std::list; using std::vector; -class MidiPart; -class TimeLabel; -class PitchLabel; -class QLabel; -class PianoCanvas; -class MTScale; -class Track; -class QToolButton; -class QToolBar; -class QPushButton; -class CtrlEdit; -class Splitter; -class Toolbar1; -class Xml; -class QuantConfig; -class ScrollScale; -class Part; -class SNode; -class QMenu; -class QAction; -class QWidget; -class QScrollBar; -class MidiTrackInfo; -class QScrollArea; - - - +class ScoreCanvas; //--------------------------------------------------------- // ScoreEdit @@ -82,6 +57,7 @@ class ScoreEdit : public MidiEditor virtual void closeEvent(QCloseEvent*); QScrollBar* hscroll; + ScoreCanvas* score_canvas; private slots: @@ -99,6 +75,8 @@ class ScoreEdit : public MidiEditor ~ScoreEdit(); static void readConfiguration(Xml&){}; //TODO does nothing static void writeConfiguration(int, Xml&){}; //TODO does nothing + + void add_parts(PartList* pl, bool all_in_one=false); }; @@ -478,7 +456,7 @@ struct staff_t staff_type_t type; clef_t clef; - unsigned split_note; + int split_note; void create_appropriate_eventlist(const set& parts); void create_itemlist(); @@ -491,7 +469,7 @@ struct staff_t clef=VIOLIN; } - staff_t (staff_type_t type_, clef_t clef_, set parts_, unsigned split_note_=0) + staff_t (staff_type_t type_, clef_t clef_, set parts_, int split_note_=0) { type=type_; clef=clef_; @@ -664,6 +642,8 @@ class ScoreCanvas : public View ScoreCanvas(MidiEditor*, QWidget*, int, int); ~ScoreCanvas(){}; + void add_staves(PartList* pl, bool all_in_one); + }; int calc_measure_len(const list& nums, int denom); -- cgit v1.2.3