From ac543ffc750d95023f1d58c41647402c9a3e1fc4 Mon Sep 17 00:00:00 2001 From: Hyunjin Song Date: Thu, 22 Mar 2018 12:39:17 +0900 Subject: [PATCH] Play correct note when dragging left side of virtual keyboard (#4265) --- src/gui/PianoView.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/gui/PianoView.cpp b/src/gui/PianoView.cpp index 351806936..2a64e72dd 100644 --- a/src/gui/PianoView.cpp +++ b/src/gui/PianoView.cpp @@ -327,7 +327,9 @@ void PianoView::modelChanged() */ int PianoView::getKeyFromMouse( const QPoint & _p ) const { - int key_num = (int)( (float) _p.x() / (float) PW_WHITE_KEY_WIDTH ); + int offset = _p.x() % PW_WHITE_KEY_WIDTH; + if( offset < 0 ) offset += PW_WHITE_KEY_WIDTH; + int key_num = ( _p.x() - offset) / PW_WHITE_KEY_WIDTH; for( int i = 0; i <= key_num; ++i ) { @@ -336,6 +338,13 @@ int PianoView::getKeyFromMouse( const QPoint & _p ) const ++key_num; } } + for( int i = 0; i >= key_num; --i ) + { + if ( Piano::isBlackKey( m_startKey+i ) ) + { + --key_num; + } + } key_num += m_startKey; @@ -345,16 +354,14 @@ int PianoView::getKeyFromMouse( const QPoint & _p ) const // then do extra checking whether the mouse-cursor is over // a black key if( key_num > 0 && Piano::isBlackKey( key_num-1 ) && - _p.x() % PW_WHITE_KEY_WIDTH <= - ( PW_WHITE_KEY_WIDTH / 2 ) - - ( PW_BLACK_KEY_WIDTH / 2 ) ) + offset <= ( PW_WHITE_KEY_WIDTH / 2 ) - + ( PW_BLACK_KEY_WIDTH / 2 ) ) { --key_num; } if( key_num < NumKeys - 1 && Piano::isBlackKey( key_num+1 ) && - _p.x() % PW_WHITE_KEY_WIDTH >= - ( PW_WHITE_KEY_WIDTH - - PW_BLACK_KEY_WIDTH / 2 ) ) + offset >= ( PW_WHITE_KEY_WIDTH - + PW_BLACK_KEY_WIDTH / 2 ) ) { ++key_num; }