#include #include #include "qmppianowidget.hpp" qmpPianoWidget::qmpPianoWidget(QWidget *parent) : QWidget(parent) { memset(keystates, 0, sizeof(keystates)); QPalette p = palette(); p.setColor(QPalette::ColorRole::Highlight, 0xff66cc); p.setColor(QPalette::ColorRole::Base, 0x66ccff); setPalette(p); } void qmpPianoWidget::setKeyState(int key, bool state) { keystates[key] = state; update(); } void qmpPianoWidget::reset() { memset(keystates, 0, sizeof(keystates)); update(); } QSize qmpPianoWidget::minimumSizeHint()const { return QSize(320, 22); } bool qmpPianoWidget::hasHeightForWidth()const { return true; } int qmpPianoWidget::heightForWidth(int w)const { return w * 22 / 320; } void qmpPianoWidget::paintEvent(QPaintEvent *event) { Q_UNUSED(event) for (int i = 0; i < 128; ++i) { QRectF r = getKeyRect(i); QColor activeColor = palette().color(QPalette::ColorRole::Highlight); QColor inactiveColor = palette().color(QPalette::ColorRole::Base); if (i / 12 % 2) { if (inactiveColor.valueF() > 0.5) inactiveColor = inactiveColor.darker(112); else inactiveColor = inactiveColor.lighter(112); } paintKey(r, keystates[i] ? activeColor : inactiveColor); } } QRectF qmpPianoWidget::getKeyRect(int key) { int octave = key / 12; key %= 12; bool is_black = (key < 5 && (key & 1)) || (key > 5 && ((key & 1) ^ 1)); double key_width = width() / 75.; QRectF ret(0, 0, key_width, height() / 2.); if (!is_black) { ret.moveTop(height() / 2.); int shift = (key + (key >= 5)) >> 1; ret.moveLeft((octave * 7 + shift)*key_width); } else ret.moveLeft((octave * 7 + (key + (key >= 5)) / 2.)*key_width); return ret; } void qmpPianoWidget::paintKey(QRectF keyrect, QColor keycolor) { QColor bordercolor(keycolor); if (keycolor.valueF() > 0.5) bordercolor = bordercolor.darker(150); else bordercolor = bordercolor.lighter(150); QPainter *p = new QPainter(this); p->setPen(bordercolor); p->setBrush(QBrush(keycolor)); p->drawRect(keyrect.adjusted(1, 1, -1, -1)); delete p; }