From 38988a37365c8772da11f3f41d49e5c1fd083084 Mon Sep 17 00:00:00 2001 From: Robert Jonsson Date: Sun, 15 May 2011 18:56:00 +0000 Subject: mouse wheel rework --- muse2/ChangeLog | 8 +++++++ muse2/muse/arranger/arranger.cpp | 46 +++++++++++++++++++++++------------- muse2/muse/arranger/arranger.h | 2 ++ muse2/muse/midiedit/drumedit.cpp | 2 ++ muse2/muse/midiedit/pianoroll.cpp | 2 ++ muse2/muse/midieditor.cpp | 27 +++++++++++++++++++++ muse2/muse/midieditor.h | 4 +++- muse2/muse/waveedit/waveedit.cpp | 31 +++++++++++++++++++++++++ muse2/muse/waveedit/waveedit.h | 3 +++ muse2/muse/waveedit/waveview.cpp | 49 +++++++++++++++++++++++++++++++++++---- muse2/muse/waveedit/waveview.h | 3 +++ muse2/muse/widgets/canvas.cpp | 44 +++++++++++++++++++++++++++++++---- muse2/muse/widgets/canvas.h | 2 ++ 13 files changed, 197 insertions(+), 26 deletions(-) (limited to 'muse2') diff --git a/muse2/ChangeLog b/muse2/ChangeLog index 9379bdf8..fce03eb0 100644 --- a/muse2/ChangeLog +++ b/muse2/ChangeLog @@ -1,3 +1,11 @@ +15.05.2011: + - Changed mouse wheel behaviour in graphical editors except the score editor (rj) + * wheel scrolls left-right + * shift+wheel scrolls up-down + * control+wheel zooms horizontally + TODO: + - score editor + - zoom to where the mouse is located 14.05.2011: - Fixed problem with project save dialog missing a forward slash '/'. (Tim) ~/.config was being polluted with wrong folders. Fixed ProjectCreateImpl::updateDirectoryPath(). diff --git a/muse2/muse/arranger/arranger.cpp b/muse2/muse/arranger/arranger.cpp index 495c4cb8..d74bed78 100644 --- a/muse2/muse/arranger/arranger.cpp +++ b/muse2/muse/arranger/arranger.cpp @@ -384,6 +384,8 @@ Arranger::Arranger(QMainWindow* parent, const char* name) connect(list, SIGNAL(keyPressExt(QKeyEvent*)), canvas, SLOT(redirKeypress(QKeyEvent*))); connect(canvas, SIGNAL(selectTrackAbove()), list, SLOT(selectTrackAbove())); connect(canvas, SIGNAL(selectTrackBelow()), list, SLOT(selectTrackBelow())); + connect(canvas, SIGNAL(horizontalZoomIn()), SLOT(horizontalZoomIn())); + connect(canvas, SIGNAL(horizontalZoomOut()), SLOT(horizontalZoomOut())); connect(this, SIGNAL(redirectWheelEvent(QWheelEvent*)), canvas, SLOT(redirectedWheelEvent(QWheelEvent*))); connect(list, SIGNAL(redirectWheelEvent(QWheelEvent*)), canvas, SLOT(redirectedWheelEvent(QWheelEvent*))); @@ -1078,27 +1080,39 @@ void Arranger::keyPressEvent(QKeyEvent* event) key+= Qt::CTRL; if (key == shortcuts[SHRT_ZOOM_IN].key) { - int mag = hscroll->mag(); - int zoomlvl = ScrollScale::getQuickZoomLevel(mag); - if (zoomlvl < 23) - zoomlvl++; - - int newmag = ScrollScale::convertQuickZoomLevelToMag(zoomlvl); - - hscroll->setMag(newmag); + horizontalZoomIn(); return; } else if (key == shortcuts[SHRT_ZOOM_OUT].key) { - int mag = hscroll->mag(); - int zoomlvl = ScrollScale::getQuickZoomLevel(mag); - if (zoomlvl > 1) - zoomlvl--; - - int newmag = ScrollScale::convertQuickZoomLevelToMag(zoomlvl); - - hscroll->setMag(newmag); + horizontalZoomOut(); return; } QWidget::keyPressEvent(event); } + +void Arranger::horizontalZoomIn() +{ + int mag = hscroll->mag(); + int zoomlvl = ScrollScale::getQuickZoomLevel(mag); + if (zoomlvl < 23) + zoomlvl++; + + int newmag = ScrollScale::convertQuickZoomLevelToMag(zoomlvl); + + hscroll->setMag(newmag); + +} + +void Arranger::horizontalZoomOut() +{ + int mag = hscroll->mag(); + int zoomlvl = ScrollScale::getQuickZoomLevel(mag); + if (zoomlvl > 1) + zoomlvl--; + + int newmag = ScrollScale::convertQuickZoomLevelToMag(zoomlvl); + + hscroll->setMag(newmag); + +} diff --git a/muse2/muse/arranger/arranger.h b/muse2/muse/arranger/arranger.h index 0143afd5..262d7464 100644 --- a/muse2/muse/arranger/arranger.h +++ b/muse2/muse/arranger/arranger.h @@ -122,6 +122,8 @@ class Arranger : public QWidget { void setTempo200(); //void seek(); void verticalScrollSetYpos(unsigned); + void horizontalZoomIn(); + void horizontalZoomOut(); signals: void redirectWheelEvent(QWheelEvent*); diff --git a/muse2/muse/midiedit/drumedit.cpp b/muse2/muse/midiedit/drumedit.cpp index ed3cd0e8..5cd4c130 100644 --- a/muse2/muse/midiedit/drumedit.cpp +++ b/muse2/muse/midiedit/drumedit.cpp @@ -368,6 +368,8 @@ DrumEdit::DrumEdit(PartList* pl, QWidget* parent, const char* name, unsigned ini canvas->setCanvasTools(drumeditTools); canvas->setFocus(); connect(canvas, SIGNAL(toolChanged(int)), tools2, SLOT(set(int))); + connect(canvas, SIGNAL(horizontalZoomIn()), SLOT(horizontalZoomIn())); + connect(canvas, SIGNAL(horizontalZoomOut()), SLOT(horizontalZoomOut())); time->setOrigin(offset, 0); QList mops; diff --git a/muse2/muse/midiedit/pianoroll.cpp b/muse2/muse/midiedit/pianoroll.cpp index 2778d8b9..f02b10a6 100644 --- a/muse2/muse/midiedit/pianoroll.cpp +++ b/muse2/muse/midiedit/pianoroll.cpp @@ -423,6 +423,8 @@ PianoRoll::PianoRoll(PartList* pl, QWidget* parent, const char* name, unsigned i canvas->setCanvasTools(pianorollTools); canvas->setFocus(); connect(canvas, SIGNAL(toolChanged(int)), tools2, SLOT(set(int))); + connect(canvas, SIGNAL(horizontalZoomIn()), SLOT(horizontalZoomIn())); + connect(canvas, SIGNAL(horizontalZoomOut()), SLOT(horizontalZoomOut())); time->setOrigin(offset, 0); gridS1->setRowStretch(2, 100); diff --git a/muse2/muse/midieditor.cpp b/muse2/muse/midieditor.cpp index 9191233d..7e25972c 100644 --- a/muse2/muse/midieditor.cpp +++ b/muse2/muse/midieditor.cpp @@ -241,3 +241,30 @@ void MidiEditor::setCurCanvasPart(Part* part) canvas->setCurrentPart(part); } +void MidiEditor::horizontalZoomIn() +{ + printf("zoom in \n"); + int mag = hscroll->mag(); + int zoomlvl = ScrollScale::getQuickZoomLevel(mag); + if (zoomlvl < 23) + zoomlvl++; + + int newmag = ScrollScale::convertQuickZoomLevelToMag(zoomlvl); + + hscroll->setMag(newmag); + +} + +void MidiEditor::horizontalZoomOut() +{ + printf("zoom out \n"); + int mag = hscroll->mag(); + int zoomlvl = ScrollScale::getQuickZoomLevel(mag); + if (zoomlvl > 1) + zoomlvl--; + + int newmag = ScrollScale::convertQuickZoomLevelToMag(zoomlvl); + + hscroll->setMag(newmag); + +} diff --git a/muse2/muse/midieditor.h b/muse2/muse/midieditor.h index 1f465c2d..c5668abf 100644 --- a/muse2/muse/midieditor.h +++ b/muse2/muse/midieditor.h @@ -55,7 +55,9 @@ class MidiEditor : public TopWin { public slots: void songChanged(int type); void setCurDrumInstrument(int instr); - + void horizontalZoomIn(); + void horizontalZoomOut(); + virtual void updateHScrollRange() { }; signals: void curDrumInstrumentChanged(int); diff --git a/muse2/muse/waveedit/waveedit.cpp b/muse2/muse/waveedit/waveedit.cpp index 2350a2c5..ccfb2730 100644 --- a/muse2/muse/waveedit/waveedit.cpp +++ b/muse2/muse/waveedit/waveedit.cpp @@ -222,6 +222,9 @@ WaveEdit::WaveEdit(PartList* pl) ymag->setFixedWidth(16); connect(view, SIGNAL(mouseWheelMoved(int)), this, SLOT(moveVerticalSlider(int))); connect(ymag, SIGNAL(valueChanged(int)), view, SLOT(setYScale(int))); + connect(view, SIGNAL(horizontalZoomIn()), SLOT(horizontalZoomIn())); + connect(view, SIGNAL(horizontalZoomOut()), SLOT(horizontalZoomOut())); + time->setOrigin(0, 0); mainGrid->setRowStretch(0, 100); @@ -246,6 +249,8 @@ WaveEdit::WaveEdit(PartList* pl) // connect(time, SIGNAL(timeChanged(unsigned)), SLOT(setTime(unsigned))); connect(view, SIGNAL(timeChanged(unsigned)), SLOT(setTime(unsigned))); + connect(view, SIGNAL(horizontalScroll(unsigned)),hscroll, SLOT(setPos(unsigned))); + connect(hscroll, SIGNAL(scaleChanged(int)), SLOT(updateHScrollRange())); connect(song, SIGNAL(songChanged(int)), SLOT(songChanged1(int))); @@ -498,3 +503,29 @@ void WaveEdit::moveVerticalSlider(int val) ymag->setValue(ymag->value() + val); } + +void WaveEdit::horizontalZoomIn() +{ + int mag = hscroll->mag(); + int zoomlvl = ScrollScale::getQuickZoomLevel(mag); + if (zoomlvl < 23) + zoomlvl++; + + int newmag = ScrollScale::convertQuickZoomLevelToMag(zoomlvl); + + hscroll->setMag(newmag); + +} + +void WaveEdit::horizontalZoomOut() +{ + int mag = hscroll->mag(); + int zoomlvl = ScrollScale::getQuickZoomLevel(mag); + if (zoomlvl > 1) + zoomlvl--; + + int newmag = ScrollScale::convertQuickZoomLevelToMag(zoomlvl); + + hscroll->setMag(newmag); + +} diff --git a/muse2/muse/waveedit/waveedit.h b/muse2/muse/waveedit/waveedit.h index 67230897..b4000794 100644 --- a/muse2/muse/waveedit/waveedit.h +++ b/muse2/muse/waveedit/waveedit.h @@ -66,6 +66,9 @@ class WaveEdit : public MidiEditor { void configChanged(); virtual void updateHScrollRange(); + void horizontalZoomIn(); + void horizontalZoomOut(); + signals: void deleted(unsigned long); diff --git a/muse2/muse/waveedit/waveview.cpp b/muse2/muse/waveedit/waveview.cpp index f83ae1d5..0c387f72 100644 --- a/muse2/muse/waveedit/waveview.cpp +++ b/muse2/muse/waveedit/waveview.cpp @@ -25,6 +25,7 @@ #include "waveedit.h" #include "audio.h" #include "gconfig.h" +#include "fastlog.h" bool modifyWarnedYet = false; //--------------------------------------------------------- @@ -381,14 +382,52 @@ void WaveView::viewMousePressEvent(QMouseEvent* event) viewMouseMoveEvent(event); } - +#define WHEEL_STEPSIZE 40 +#define WHEEL_DELTA 120 //--------------------------------------------------------- // wheelEvent //--------------------------------------------------------- -void WaveView::wheelEvent(QWheelEvent* event) - { - emit mouseWheelMoved(event->delta() / 10); - } +void WaveView::wheelEvent(QWheelEvent* ev) +{ + int keyState = ev->modifiers(); + + bool shift = keyState & Qt::ShiftModifier; + bool alt = keyState & Qt::AltModifier; + bool ctrl = keyState & Qt::ControlModifier; + + if (shift) { // scroll vertically + emit mouseWheelMoved(ev->delta() / 10); + + } else if (ctrl) { // zoom horizontally + if (ev->delta()>0) + emit horizontalZoomIn(); + else + emit horizontalZoomOut(); + + } else { // scroll horizontally + int delta = ev->delta() / WHEEL_DELTA; + int xpixelscale = 5*fast_log10(rmapxDev(1)); + + + if (xpixelscale <= 0) + xpixelscale = 1; + + int scrollstep = WHEEL_STEPSIZE * (delta); + ///if (ev->state() == Qt::ShiftModifier) +// if (((QInputEvent*)ev)->modifiers() == Qt::ShiftModifier) + scrollstep = scrollstep / 10; + + int newXpos = xpos + xpixelscale * scrollstep; + + if (newXpos < 0) + newXpos = 0; + + //setYPos(newYpos); + emit horizontalScroll((unsigned)newXpos); + + } + +} //--------------------------------------------------------- // viewMouseReleaseEvent diff --git a/muse2/muse/waveedit/waveview.h b/muse2/muse/waveedit/waveview.h index 3ee0d5f8..c7992952 100644 --- a/muse2/muse/waveedit/waveview.h +++ b/muse2/muse/waveedit/waveview.h @@ -88,6 +88,9 @@ class WaveView : public View { void followEvent(int); void timeChanged(unsigned); void mouseWheelMoved(int); + void horizontalScroll(unsigned); + void horizontalZoomIn(); + void horizontalZoomOut(); public: WaveView(MidiEditor*, QWidget* parent, int xscale, int yscale); diff --git a/muse2/muse/widgets/canvas.cpp b/muse2/muse/widgets/canvas.cpp index 14f414b7..07ad1d1f 100644 --- a/muse2/muse/widgets/canvas.cpp +++ b/muse2/muse/widgets/canvas.cpp @@ -24,6 +24,7 @@ #include "icons.h" #include "../marker/marker.h" #include "part.h" +#include "fastlog.h" #define ABS(x) ((x) < 0) ? -(x) : (x) @@ -338,7 +339,13 @@ void Canvas::draw(QPainter& p, const QRect& rect) // wheelEvent //--------------------------------------------------------- void Canvas::wheelEvent(QWheelEvent* ev) - { +{ + int keyState = ev->modifiers(); + + bool shift = keyState & Qt::ShiftModifier; + bool ctrl = keyState & Qt::ControlModifier; + + if (shift) { // scroll vertically int delta = ev->delta() / WHEEL_DELTA; int ypixelscale = rmapyDev(1); @@ -347,8 +354,8 @@ void Canvas::wheelEvent(QWheelEvent* ev) int scrollstep = WHEEL_STEPSIZE * (-delta); ///if (ev->state() == Qt::ShiftModifier) - if (((QInputEvent*)ev)->modifiers() == Qt::ShiftModifier) - scrollstep = scrollstep / 10; +// if (((QInputEvent*)ev)->modifiers() == Qt::ShiftModifier) + scrollstep = scrollstep / 2; int newYpos = ypos + ypixelscale * scrollstep; @@ -358,7 +365,36 @@ void Canvas::wheelEvent(QWheelEvent* ev) //setYPos(newYpos); emit verticalScroll((unsigned)newYpos); - } + } else if (ctrl) { // zoom horizontally + if (ev->delta()>0) + emit horizontalZoomIn(); + else + emit horizontalZoomOut(); + + } else { // scroll horizontally + int delta = ev->delta() / WHEEL_DELTA; + int xpixelscale = 5*fast_log10(rmapxDev(1)); + + + if (xpixelscale <= 0) + xpixelscale = 1; + + int scrollstep = WHEEL_STEPSIZE * (delta); + ///if (ev->state() == Qt::ShiftModifier) +// if (((QInputEvent*)ev)->modifiers() == Qt::ShiftModifier) + scrollstep = scrollstep / 10; + + int newXpos = xpos + xpixelscale * scrollstep; + + if (newXpos < 0) + newXpos = 0; + + //setYPos(newYpos); + emit horizontalScroll((unsigned)newXpos); + + } + +} void Canvas::redirectedWheelEvent(QWheelEvent* ev) { diff --git a/muse2/muse/widgets/canvas.h b/muse2/muse/widgets/canvas.h index 97392f1e..6e8b9fa8 100644 --- a/muse2/muse/widgets/canvas.h +++ b/muse2/muse/widgets/canvas.h @@ -174,6 +174,8 @@ class Canvas : public View { void verticalScroll(unsigned); void horizontalScroll(unsigned); void horizontalScrollNoLimit(unsigned); + void horizontalZoomIn(); + void horizontalZoomOut(); public: Canvas(QWidget* parent, int sx, int sy, const char* name = 0); bool isSingleSelection(); -- cgit v1.2.3