aboutsummaryrefslogtreecommitdiff
path: root/simple-visualization/qmppianowidget.cpp
blob: daeff25cadd0f168c7134f7a26181cd55b1dd80e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <cstring>
#include <QPainter>
#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;
}