diff options
author | Florian Jung <flo@windfisch.org> | 2011-04-15 16:37:42 +0000 |
---|---|---|
committer | Florian Jung <flo@windfisch.org> | 2011-04-15 16:37:42 +0000 |
commit | 84fdf802caa8a37cbbc3e8d2a4b33e7e89251604 (patch) | |
tree | 026aae084138f12c6496d1a41871c0825a51be2f /muse2/muse/midiedit | |
parent | 96903c974522e2ff67df92e57eb2c2db8d64fcf1 (diff) |
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
Diffstat (limited to 'muse2/muse/midiedit')
-rw-r--r-- | muse2/muse/midiedit/scoreedit.cpp | 108 | ||||
-rw-r--r-- | muse2/muse/midiedit/scoreedit.h | 38 |
2 files changed, 78 insertions, 68 deletions
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<Track*> tracks; + + for (ciPart it=pl->begin(); it!=pl->end(); it++) + tracks.insert(it->second->track()); + + for (set<Track*>::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<Track*> tracks; - - for (ciPart it=editor->parts()->begin(); it!=editor->parts()->end(); it++) - tracks.insert(it->second->track()); - - for (set<Track*>::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<staff_t>::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<staff_t>::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 <QPainter> #include <QPixmap> #include <QTimer> +#include <QScrollBar> #include <values.h> #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<Part*>& parts); void create_itemlist(); @@ -491,7 +469,7 @@ struct staff_t clef=VIOLIN; } - staff_t (staff_type_t type_, clef_t clef_, set<Part*> parts_, unsigned split_note_=0) + staff_t (staff_type_t type_, clef_t clef_, set<Part*> 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<int>& nums, int denom); |