/*! \brief Paint the piano display view in response to an event * * This method draws the piano and the 'root note' base. It draws * the base first, then all the white keys, then all the black keys. * * \todo Is there supposed to be a parameter given here? */ void PianoView::paintEvent( QPaintEvent * ) { QPainter p( this ); // set smaller font for printing number of every octave p.setFont( pointSize<LABEL_TEXT_SIZE>( p.font() ) ); // draw bar above the keyboard (there will be the labels // for all C's) p.fillRect( QRect( 0, 1, width(), PIANO_BASE-2 ), p.background() ); // draw the line above the keyboard p.setPen( Qt::black ); p.drawLine( 0, 0, width(), 0 ); p.drawLine( 0, PIANO_BASE-1, width(), PIANO_BASE-1 ); p.setPen( Qt::white ); const int base_key = ( m_piano != NULL ) ? m_piano->instrumentTrack()->baseNoteModel()->value() : 0; QColor baseKeyColor = QApplication::palette().color( QPalette::Active, QPalette::BrightText ); if( Piano::isWhiteKey( base_key ) ) { p.fillRect( QRect( getKeyX( base_key ), 1, PW_WHITE_KEY_WIDTH-1, PIANO_BASE-2 ), baseKeyColor ); } else { p.fillRect( QRect( getKeyX( base_key ) + 1, 1, PW_BLACK_KEY_WIDTH - 1, PIANO_BASE - 2 ), baseKeyColor); } int cur_key = m_startKey; // draw all white keys... for( int x = 0; x < width(); ) { while( Piano::isBlackKey( cur_key ) ) { ++cur_key; } // draw pressed or not pressed key, depending on state of // current key if( m_piano && m_piano->isKeyPressed( cur_key ) ) { p.drawPixmap( x, PIANO_BASE, *s_whiteKeyPressedPm ); } else { p.drawPixmap( x, PIANO_BASE, *s_whiteKeyPm ); } x += PW_WHITE_KEY_WIDTH; if( (Keys) (cur_key%KeysPerOctave) == Key_C ) { // label key of note C with "C" and number of current // octave p.drawText( x - PW_WHITE_KEY_WIDTH, LABEL_TEXT_SIZE + 2, QString( "C" ) + QString::number( cur_key / KeysPerOctave, 10 ) ); } ++cur_key; } // reset all values, because now we're going to draw all black keys cur_key = m_startKey; int white_cnt = 0; int startKey = m_startKey; if( startKey > 0 && Piano::isBlackKey( (Keys)(--startKey) ) ) { if( m_piano && m_piano->isKeyPressed( startKey ) ) { p.drawPixmap( 0 - PW_WHITE_KEY_WIDTH / 2, PIANO_BASE, *s_blackKeyPressedPm ); } else { p.drawPixmap( 0 - PW_WHITE_KEY_WIDTH / 2, PIANO_BASE, *s_blackKeyPm ); } } // now draw all black keys... for( int x = 0; x < width(); ) { if( Piano::isBlackKey( cur_key ) ) { // draw pressed or not pressed key, depending on // state of current key if( m_piano && m_piano->isKeyPressed( cur_key ) ) { p.drawPixmap( x + PW_WHITE_KEY_WIDTH / 2, PIANO_BASE, *s_blackKeyPressedPm ); } else { p.drawPixmap( x + PW_WHITE_KEY_WIDTH / 2, PIANO_BASE, *s_blackKeyPm ); } x += PW_WHITE_KEY_WIDTH; white_cnt = 0; } else { // simple workaround for increasing x if there were two // white keys (e.g. between E and F) ++white_cnt; if( white_cnt > 1 ) { x += PW_WHITE_KEY_WIDTH; } } ++cur_key; } }
/*! \brief Paint the piano display view in response to an event * * This method draws the piano and the 'root note' base. It draws * the base first, then all the white keys, then all the black keys. * * \todo Is there supposed to be a parameter given here? */ void PianoView::paintEvent( QPaintEvent * ) { QPainter p( this ); // set smaller font for printing number of every octave p.setFont( pointSize<LABEL_TEXT_SIZE>( p.font() ) ); // draw blue bar above the actual keyboard (there will be the labels // for all C's) QLinearGradient g( 0, 0, 0, PIANO_BASE-3 ); g.setColorAt( 0, Qt::black ); g.setColorAt( 0.1, QColor( 96, 96, 96 ) ); g.setColorAt( 1, Qt::black ); p.fillRect( QRect( 0, 1, width(), PIANO_BASE-2 ), g ); // draw stuff above the actual keyboard p.setPen( Qt::black ); p.drawLine( 0, 0, width(), 0 ); p.drawLine( 0, PIANO_BASE-1, width(), PIANO_BASE-1 ); p.setPen( Qt::white ); const int base_key = ( m_piano != NULL ) ? m_piano->m_midiEvProc->baseNoteModel()->value() : 0; g.setColorAt( 0, QColor( 0, 96, 0 ) ); g.setColorAt( 0.1, QColor( 64, 255, 64 ) ); g.setColorAt( 1, QColor( 0, 96, 0 ) ); if( KEY_ORDER[base_key % KeysPerOctave] == Piano::WhiteKey ) { p.fillRect( QRect( getKeyX( base_key ), 1, PW_WHITE_KEY_WIDTH-1, PIANO_BASE-2 ), g ); } else { p.fillRect( QRect( getKeyX( base_key ) + 1, 1, PW_BLACK_KEY_WIDTH - 1, PIANO_BASE - 2 ), g ); } int cur_key = m_startKey; // draw all white keys... for( int x = 0; x < width(); ) { while( KEY_ORDER[cur_key%KeysPerOctave] != Piano::WhiteKey ) { ++cur_key; } // draw pressed or not pressed key, depending on state of // current key if( m_piano && m_piano->m_pressedKeys[cur_key] == true ) { p.drawPixmap( x, PIANO_BASE, *s_whiteKeyPressedPm ); } else { p.drawPixmap( x, PIANO_BASE, *s_whiteKeyPm ); } x += PW_WHITE_KEY_WIDTH; if( (Keys) (cur_key%KeysPerOctave) == Key_C ) { // label key of note C with "C" and number of current // octave p.drawText( x - PW_WHITE_KEY_WIDTH, LABEL_TEXT_SIZE + 2, QString( "C" ) + QString::number( cur_key / KeysPerOctave, 10 ) ); } ++cur_key; } // reset all values, because now we're going to draw all black keys cur_key = m_startKey; int white_cnt = 0; int s_key = m_startKey; if( s_key > 0 && KEY_ORDER[(Keys)(--s_key) % KeysPerOctave] == Piano::BlackKey ) { if( m_piano && m_piano->m_pressedKeys[s_key] == true ) { p.drawPixmap( 0 - PW_WHITE_KEY_WIDTH / 2, PIANO_BASE, *s_blackKeyPressedPm ); } else { p.drawPixmap( 0 - PW_WHITE_KEY_WIDTH / 2, PIANO_BASE, *s_blackKeyPm ); } } // now draw all black keys... for( int x = 0; x < width(); ) { if( KEY_ORDER[cur_key%KeysPerOctave] == Piano::BlackKey ) { // draw pressed or not pressed key, depending on // state of current key if( m_piano && m_piano->m_pressedKeys[cur_key] == true ) { p.drawPixmap( x + PW_WHITE_KEY_WIDTH / 2, PIANO_BASE, *s_blackKeyPressedPm ); } else { p.drawPixmap( x + PW_WHITE_KEY_WIDTH / 2, PIANO_BASE, *s_blackKeyPm ); } x += PW_WHITE_KEY_WIDTH; white_cnt = 0; } else { // simple workaround for increasing x if there were two // white keys (e.g. between E and F) ++white_cnt; if( white_cnt > 1 ) { x += PW_WHITE_KEY_WIDTH; } } ++cur_key; } }