aboutsummaryrefslogtreecommitdiff
path: root/simple-visualization/qmppianowidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'simple-visualization/qmppianowidget.cpp')
-rw-r--r--simple-visualization/qmppianowidget.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/simple-visualization/qmppianowidget.cpp b/simple-visualization/qmppianowidget.cpp
new file mode 100644
index 0000000..febd90f
--- /dev/null
+++ b/simple-visualization/qmppianowidget.cpp
@@ -0,0 +1,62 @@
+#include <cstring>
+#include <QPainter>
+#include "qmppianowidget.hpp"
+
+qmpPianoWidget::qmpPianoWidget(QWidget *parent) : QWidget(parent)
+{
+ memset(keystates,0,sizeof(keystates));
+}
+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);
+}
+
+void qmpPianoWidget::paintEvent(QPaintEvent *event)
+{
+ Q_UNUSED(event)
+ for(int i=0;i<128;++i)
+ {
+ QRectF r=getKeyRect(i);
+ paintKey(r,QColor(keystates[i]?0xff66cc:0x66ccff));
+ }
+}
+
+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;
+}