diff options
author | Florian Jung <flo@windfisch.org> | 2011-04-17 17:14:32 +0000 |
---|---|---|
committer | Florian Jung <flo@windfisch.org> | 2011-04-17 17:14:32 +0000 |
commit | 8a42f6caea0c48276fa169aea4256b0361b3cb04 (patch) | |
tree | 0968c002602a723742ad7e41b86ae103c0f35372 | |
parent | 92ed9ab3c0b98a1f6ffe6caa812870821583a116 (diff) |
implemented y-scrolling
-rw-r--r-- | muse2/muse/midiedit/scoreedit.cpp | 165 | ||||
-rw-r--r-- | muse2/muse/midiedit/scoreedit.h | 30 |
2 files changed, 152 insertions, 43 deletions
diff --git a/muse2/muse/midiedit/scoreedit.cpp b/muse2/muse/midiedit/scoreedit.cpp index 7fa3f89c..c8e91153 100644 --- a/muse2/muse/midiedit/scoreedit.cpp +++ b/muse2/muse/midiedit/scoreedit.cpp @@ -138,18 +138,28 @@ ScoreEdit::ScoreEdit(PartList* pl, QWidget* parent, const char* name, unsigned i : MidiEditor(0, 0, pl, parent, name) { score_canvas=new ScoreCanvas(this, mainw, 1, 1); - hscroll = new QScrollBar(Qt::Horizontal, mainw); + xscroll = new QScrollBar(Qt::Horizontal, mainw); + yscroll = new QScrollBar(Qt::Vertical, mainw); + + connect(xscroll, SIGNAL(valueChanged(int)), score_canvas, SLOT(x_scroll_event(int))); + connect(score_canvas, SIGNAL(xscroll_changed(int)), xscroll, SLOT(setValue(int))); + + connect(yscroll, SIGNAL(valueChanged(int)), score_canvas, SLOT(y_scroll_event(int))); + connect(score_canvas, SIGNAL(yscroll_changed(int)), yscroll, SLOT(setValue(int))); - 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(score_canvas, SIGNAL(canvas_height_changed(int)), SLOT(canvas_height_changed(int))); + connect(score_canvas, SIGNAL(viewport_height_changed(int)), SLOT(viewport_height_changed(int))); + connect(song, SIGNAL(songChanged(int)), score_canvas, SLOT(song_changed(int))); mainGrid->addWidget(score_canvas, 0, 0); - mainGrid->addWidget(hscroll,1,0); + mainGrid->addWidget(xscroll,1,0); + mainGrid->addWidget(yscroll,0,1); - hscroll->setMinimum(0); + xscroll->setMinimum(0); + yscroll->setMinimum(0); score_canvas->song_changed(0); score_canvas->goto_tick(initPos,true); @@ -204,11 +214,36 @@ ScoreEdit::~ScoreEdit() void ScoreEdit::canvas_width_changed(int width) { - hscroll->setMaximum(width); + xscroll->setMaximum(width); } void ScoreEdit::viewport_width_changed(int width) { - hscroll->setPageStep(width * PAGESTEP); + xscroll->setPageStep(width * PAGESTEP); +} + +void ScoreEdit::canvas_height_changed(int height) +{ + int val=height - score_canvas->viewport_height(); + if (val<=0) val=0; + + yscroll->setMaximum(val); + + if (val==0) + yscroll->hide(); + else + yscroll->show(); +} +void ScoreEdit::viewport_height_changed(int height) +{ + int val=score_canvas->canvas_height() - height; + if (val<0) val=0; + yscroll->setPageStep(height * PAGESTEP); + yscroll->setMaximum(val); + + if (val==0) + yscroll->hide(); + else + yscroll->show(); } void ScoreEdit::closeEvent(QCloseEvent* e) @@ -287,6 +322,7 @@ ScoreCanvas::ScoreCanvas(MidiEditor* pr, QWidget* parent, x_pos=0; x_left=0; + y_pos=0; dragging=false; mouse_erases_notes=false; mouse_inserts_notes=true; @@ -299,8 +335,10 @@ ScoreCanvas::ScoreCanvas(MidiEditor* pr, QWidget* parent, dragging_staff=false; - scroll_speed=0; - scroll_pos=0; + x_scroll_speed=0; + x_scroll_pos=0; + y_scroll_speed=0; + y_scroll_pos=0; connect (heartBeatTimer, SIGNAL(timeout()), SLOT(heartbeat_timer_event())); connect(song, SIGNAL(posChanged(int, unsigned, bool)), SLOT(pos_changed(int,unsigned,bool))); @@ -477,11 +515,21 @@ int ScoreCanvas::canvas_width() return tick_to_x(SONG_LENGTH); } +int ScoreCanvas::canvas_height() +{ + return staffs.rbegin()->y_bottom; +} + int ScoreCanvas::viewport_width() { return (width() - x_left); } +int ScoreCanvas::viewport_height() +{ + return height(); +} + string IntToStr(int i) { ostringstream s; @@ -2299,10 +2347,11 @@ void ScoreCanvas::draw(QPainter& p, const QRect&) for (list<staff_t>::iterator it=staffs.begin(); it!=staffs.end(); it++) { - draw_note_lines(p,it->y_draw); - draw_preamble(p,it->y_draw, it->clef); + //TODO: maybe only draw visible staves? + draw_note_lines(p,it->y_draw - y_pos); + draw_preamble(p,it->y_draw - y_pos, it->clef); p.setClipRect(x_left+1,0,p.device()->width(),p.device()->height()); - draw_items(p,it->y_draw, *it); + draw_items(p,it->y_draw - y_pos, *it); p.setClipping(false); } } @@ -2452,9 +2501,9 @@ void ScoreCanvas::mousePressEvent (QMouseEvent* event) // denn der "bereich" eines schlags geht von schlag_begin bis nächsterschlag_begin-1 // noten werden aber genau in die mitte dieses bereiches gezeichnet - list<staff_t>::iterator it=staff_at_y(event->y()); + list<staff_t>::iterator it=staff_at_y(event->y() + y_pos); - int y=event->y() - it->y_draw; + int y=event->y() + y_pos - it->y_draw; int x=event->x()+x_pos-x_left; int tick=flo_quantize_floor(x_to_tick(x)); //TODO quantizing must (maybe?) be done with the proper functions @@ -2621,14 +2670,16 @@ void ScoreCanvas::mouseReleaseEvent (QMouseEvent* event) setMouseTracking(false); dragging=false; - scroll_speed=0; scroll_pos=0; + x_scroll_speed=0; x_scroll_pos=0; } } if (dragging_staff) { - merge_staves(staff_at_y(event->y()), current_staff); + merge_staves(staff_at_y(event->y()+y_pos), current_staff); dragging_staff=false; + + y_scroll_speed=0; y_scroll_pos=0; } } @@ -2719,56 +2770,101 @@ void ScoreCanvas::mouseMoveEvent (QMouseEvent* event) } - if ((mouse_operation==LENGTH) || (mouse_operation==BEGIN)) //scrolling enabled? + if ((mouse_operation==LENGTH) || (mouse_operation==BEGIN)) //x-scrolling enabled? { int win_x=event->x(); if (win_x < x_left + SCROLL_MARGIN) { - scroll_speed=(win_x - (x_left + SCROLL_MARGIN)) * SCROLL_SPEED; - if (scroll_speed < -SCROLL_SPEED_MAX) scroll_speed=-SCROLL_SPEED_MAX; + x_scroll_speed=(win_x - (x_left + SCROLL_MARGIN)) * SCROLL_SPEED; + if (x_scroll_speed < -SCROLL_SPEED_MAX) x_scroll_speed=-SCROLL_SPEED_MAX; } else if (win_x > width() - SCROLL_MARGIN) { - scroll_speed=(win_x - (width() - SCROLL_MARGIN)) * SCROLL_SPEED; - if (scroll_speed > SCROLL_SPEED_MAX) scroll_speed=SCROLL_SPEED_MAX; + x_scroll_speed=(win_x - (width() - SCROLL_MARGIN)) * SCROLL_SPEED; + if (x_scroll_speed > SCROLL_SPEED_MAX) x_scroll_speed=SCROLL_SPEED_MAX; } else - scroll_speed=0; + x_scroll_speed=0; } else { - scroll_speed=0; + x_scroll_speed=0; + } + } + + if (dragging_staff) //y-scrolling enabled? + { + int win_y=event->y(); + + if (win_y < SCROLL_MARGIN) + { + y_scroll_speed=(win_y - SCROLL_MARGIN) * SCROLL_SPEED; + if (y_scroll_speed < -SCROLL_SPEED_MAX) y_scroll_speed=-SCROLL_SPEED_MAX; + } + else if (win_y > height() - SCROLL_MARGIN) + { + y_scroll_speed=(win_y - (height() - SCROLL_MARGIN)) * SCROLL_SPEED; + if (y_scroll_speed > SCROLL_SPEED_MAX) y_scroll_speed=SCROLL_SPEED_MAX; } + else + y_scroll_speed=0; + } + else + { + y_scroll_speed=0; } } void ScoreCanvas::heartbeat_timer_event() { - if (scroll_speed) + if (x_scroll_speed) { int old_xpos=x_pos; - scroll_pos+=scroll_speed*heartBeatTimer->interval()/1000.0; - int tmp=int(scroll_pos); + x_scroll_pos+=x_scroll_speed*heartBeatTimer->interval()/1000.0; + int tmp=int(x_scroll_pos); if (tmp!=0) x_pos+=tmp; - scroll_pos-=tmp; + x_scroll_pos-=tmp; if (x_pos<0) x_pos=0; if (x_pos>canvas_width()) x_pos=canvas_width(); - if (old_xpos!=x_pos) emit xpos_changed(x_pos); + if (old_xpos!=x_pos) emit xscroll_changed(x_pos); + } + + if (y_scroll_speed) + { + int old_ypos=y_pos; + + y_scroll_pos+=y_scroll_speed*heartBeatTimer->interval()/1000.0; + int tmp=int(y_scroll_pos); + if (tmp!=0) + y_pos+=tmp; + y_scroll_pos-=tmp; + + if (y_pos<0) y_pos=0; + if (y_pos>canvas_height()) y_pos=canvas_height(); + + if (old_ypos!=y_pos) emit yscroll_changed(y_pos); } } -void ScoreCanvas::scroll_event(int x) +void ScoreCanvas::x_scroll_event(int x) { cout << "SCROLL EVENT: x="<<x<<endl; x_pos=x; redraw(); } +void ScoreCanvas::y_scroll_event(int y) +{ + cout << "SCROLL EVENT: y="<<y<<endl; + y_pos=y; + redraw(); +} + //if force is true, it will always happen something //if force is false, it will only happen something, if @@ -2784,7 +2880,7 @@ void ScoreCanvas::goto_tick(int tick, bool force) if (x_pos<0) x_pos=0; if (x_pos>canvas_width()) x_pos=canvas_width(); - emit xpos_changed(x_pos); + emit xscroll_changed(x_pos); } else if (tick > x_to_tick(x_pos+viewport_width()*PAGESTEP)) { @@ -2792,7 +2888,7 @@ void ScoreCanvas::goto_tick(int tick, bool force) if (x_pos<0) x_pos=0; if (x_pos>canvas_width()) x_pos=canvas_width(); - emit xpos_changed(x_pos); + emit xscroll_changed(x_pos); } } else @@ -2801,7 +2897,7 @@ void ScoreCanvas::goto_tick(int tick, bool force) if (x_pos<0) x_pos=0; if (x_pos>canvas_width()) x_pos=canvas_width(); - emit xpos_changed(x_pos); + emit xscroll_changed(x_pos); } } @@ -2814,6 +2910,7 @@ void ScoreCanvas::resizeEvent(QResizeEvent* ev) QWidget::resizeEvent(ev); //TODO is this really neccessary? emit viewport_width_changed( viewport_width() ); + emit viewport_height_changed( viewport_height() ); } void ScoreCanvas::pos_changed(int index, unsigned tick, bool scroll) @@ -2862,6 +2959,8 @@ void ScoreCanvas::recalc_staff_pos() } y=it->y_bottom; } + + emit canvas_height_changed( canvas_height() ); } list<staff_t>::iterator ScoreCanvas::staff_at_y(int y) @@ -2901,7 +3000,6 @@ list<staff_t>::iterator ScoreCanvas::staff_at_y(int y) * o when pressing "STOP", the active note isn't redrawn "normally" * * CURRENT TODO - * o y-scroll for staff window, with automatic margin-scrolling * o let the user edit the score's name * * IMPORTANT TODO @@ -2968,7 +3066,6 @@ list<staff_t>::iterator ScoreCanvas::staff_at_y(int y) * o offer a button for bool mouse_erases_notes and mouse_inserts_notes * o offer dropdown-boxes for lengths of the inserted note * (select between 16th, 8th, ... whole and "last used length") - * o offer a dropdown-box for the clef to use * o offer some way to setup the colorizing method to be used */ diff --git a/muse2/muse/midiedit/scoreedit.h b/muse2/muse/midiedit/scoreedit.h index cc1a06ec..4b72b69c 100644 --- a/muse2/muse/midiedit/scoreedit.h +++ b/muse2/muse/midiedit/scoreedit.h @@ -58,7 +58,8 @@ class ScoreEdit : public MidiEditor private: virtual void closeEvent(QCloseEvent*); - QScrollBar* hscroll; + QScrollBar* xscroll; + QScrollBar* yscroll; ScoreCanvas* score_canvas; static int serial; @@ -77,6 +78,8 @@ class ScoreEdit : public MidiEditor public slots: void canvas_width_changed(int); void viewport_width_changed(int); + void canvas_height_changed(int); + void viewport_height_changed(int); public: ScoreEdit(PartList*, QWidget* parent = 0, const char* name = 0, unsigned initPos = MAXINT); @@ -506,9 +509,6 @@ class ScoreCanvas : public View bool need_redraw_for_hilighting(ScoreItemList& itemlist); bool need_redraw_for_hilighting(); - int canvas_width(); - int viewport_width(); - void set_staffmode(list<staff_t>::iterator it, staff_mode_t mode); void remove_staff(list<staff_t>::iterator it); @@ -531,10 +531,14 @@ class ScoreCanvas : public View // preamble's length is the same for each system int x_pos; int x_left; + + int y_pos; //for mouse-scrolling - float scroll_speed; - float scroll_pos; + float x_scroll_speed; + float x_scroll_pos; + float y_scroll_speed; + float y_scroll_pos; Part* curr_part; int last_len; @@ -581,16 +585,20 @@ class ScoreCanvas : public View void remove_staff_slot(); public slots: - void scroll_event(int); + void x_scroll_event(int); + void y_scroll_event(int); void song_changed(int); void goto_tick(int,bool); void pos_changed(int i, unsigned u, bool b); void heartbeat_timer_event(); signals: - void xpos_changed(int); + void xscroll_changed(int); + void yscroll_changed(int); void viewport_width_changed(int); void canvas_width_changed(int); + void viewport_height_changed(int); + void canvas_height_changed(int); protected: virtual void draw(QPainter& p, const QRect& rect); @@ -606,7 +614,11 @@ class ScoreCanvas : public View ~ScoreCanvas(){}; void add_staves(PartList* pl, bool all_in_one); - + + int canvas_width(); + int canvas_height(); + int viewport_width(); + int viewport_height(); }; int calc_measure_len(const list<int>& nums, int denom); |