1 | /* |
2 | SPDX-FileCopyrightText: 2012-2013 Evan Teran <evan.teran@gmail.com> |
3 | SPDX-FileCopyrightText: 2006 Michel Marti <mma@objectxp.com> |
4 | |
5 | SPDX-License-Identifier: GPL-2.0-or-later |
6 | */ |
7 | |
8 | #include "bitbutton.h" |
9 | #include <QEvent> |
10 | #include <QPainter> |
11 | |
12 | //------------------------------------------------------------------------------ |
13 | // Name: BitButton |
14 | // Desc: constructor |
15 | //------------------------------------------------------------------------------ |
16 | BitButton::BitButton(QWidget *parent) |
17 | : QAbstractButton(parent) |
18 | { |
19 | // too many bits for tab focus |
20 | setFocusPolicy(Qt::ClickFocus); |
21 | |
22 | // size button by font |
23 | QSize size = fontMetrics().size(0, QStringLiteral("M" )); |
24 | |
25 | if (size.width() < size.height()) { |
26 | size.setHeight(size.width()); |
27 | } else { |
28 | size.setWidth(size.height()); |
29 | } |
30 | |
31 | setMinimumSize(size); |
32 | setRenderSize(size); |
33 | setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); |
34 | |
35 | this->setAttribute(Qt::WA_Hover, true); |
36 | } |
37 | |
38 | //------------------------------------------------------------------------------ |
39 | // Name: paintEvent |
40 | // Desc: draws the button |
41 | //------------------------------------------------------------------------------ |
42 | void BitButton::paintEvent(QPaintEvent *) |
43 | { |
44 | uint8_t alpha = 0x60; |
45 | QPainter painter(this); |
46 | painter.setRenderHint(QPainter::Antialiasing, true); |
47 | QPen pen(palette().text(), 1); |
48 | pen.setJoinStyle(Qt::MiterJoin); |
49 | painter.setPen(pen); |
50 | |
51 | if (on_) { |
52 | painter.setBrush(palette().text()); |
53 | alpha = 0xB0; |
54 | } else { |
55 | painter.setBrush(palette().base()); |
56 | } |
57 | |
58 | if (over_) { |
59 | painter.setBrush(QColor(palette().text().color().red(), palette().text().color().green(), palette().text().color().blue(), alpha)); |
60 | } |
61 | |
62 | // Prepare button size (should be square) |
63 | QRect square = rect(); |
64 | square.setSize(renderSize()); |
65 | |
66 | // Draw button |
67 | painter.translate(QPoint(0, (rect().height() - square.height()) / 2)); // center button |
68 | painter.drawRect(square.adjusted(1, 1, -1, -1)); |
69 | } |
70 | |
71 | //------------------------------------------------------------------------------ |
72 | // Name: isOn |
73 | // Desc: returns true if this bit-button is "on" |
74 | //------------------------------------------------------------------------------ |
75 | bool BitButton::isOn() const |
76 | { |
77 | return on_; |
78 | } |
79 | |
80 | //------------------------------------------------------------------------------ |
81 | // Name: setOn |
82 | // Desc: changes the "on" value for the bitset |
83 | //------------------------------------------------------------------------------ |
84 | void BitButton::setOn(bool value) |
85 | { |
86 | on_ = value; |
87 | update(); |
88 | } |
89 | |
90 | //------------------------------------------------------------------------------ |
91 | // Name: renderSize |
92 | // Desc: returns current render size |
93 | //------------------------------------------------------------------------------ |
94 | void BitButton::setRenderSize(const QSize &size) |
95 | { |
96 | renderSize_ = size; |
97 | } |
98 | |
99 | //------------------------------------------------------------------------------ |
100 | // Name: renderSize |
101 | // Desc: returns current render size |
102 | //------------------------------------------------------------------------------ |
103 | QSize BitButton::renderSize() const |
104 | { |
105 | return renderSize_; |
106 | } |
107 | |
108 | //------------------------------------------------------------------------------ |
109 | // Name: enterEvent |
110 | // Desc: sets to true the "over" variable on Enter event |
111 | //------------------------------------------------------------------------------ |
112 | void BitButton::enterEvent(QEnterEvent *event) |
113 | { |
114 | over_ = true; |
115 | update(); |
116 | } |
117 | |
118 | //------------------------------------------------------------------------------ |
119 | // Name: leaveEvent |
120 | // Desc: sets to false the "over" variable on Leave event |
121 | //------------------------------------------------------------------------------ |
122 | void BitButton::leaveEvent(QEvent *event) |
123 | { |
124 | if (event->type() == QEvent::Leave) { |
125 | over_ = false; |
126 | update(); |
127 | } |
128 | } |
129 | |
130 | //------------------------------------------------------------------------------ |
131 | // Name: focusInEvent |
132 | // Desc: sets to true the "over" variable on Enter event |
133 | //------------------------------------------------------------------------------ |
134 | void BitButton::focusInEvent(QFocusEvent *event) |
135 | { |
136 | over_ = true; |
137 | update(); |
138 | } |
139 | |
140 | //------------------------------------------------------------------------------ |
141 | // Name: focusOutEvent |
142 | // Desc: sets to false the "over" variable on Leave event |
143 | //------------------------------------------------------------------------------ |
144 | void BitButton::focusOutEvent(QFocusEvent *event) |
145 | { |
146 | over_ = false; |
147 | update(); |
148 | } |
149 | |
150 | #include "moc_bitbutton.cpp" |
151 | |