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//------------------------------------------------------------------------------
16BitButton::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//------------------------------------------------------------------------------
42void 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//------------------------------------------------------------------------------
75bool BitButton::isOn() const
76{
77 return on_;
78}
79
80//------------------------------------------------------------------------------
81// Name: setOn
82// Desc: changes the "on" value for the bitset
83//------------------------------------------------------------------------------
84void BitButton::setOn(bool value)
85{
86 on_ = value;
87 update();
88}
89
90//------------------------------------------------------------------------------
91// Name: renderSize
92// Desc: returns current render size
93//------------------------------------------------------------------------------
94void BitButton::setRenderSize(const QSize &size)
95{
96 renderSize_ = size;
97}
98
99//------------------------------------------------------------------------------
100// Name: renderSize
101// Desc: returns current render size
102//------------------------------------------------------------------------------
103QSize 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//------------------------------------------------------------------------------
112void 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//------------------------------------------------------------------------------
122void 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//------------------------------------------------------------------------------
134void 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//------------------------------------------------------------------------------
144void BitButton::focusOutEvent(QFocusEvent *event)
145{
146 over_ = false;
147 update();
148}
149
150#include "moc_bitbutton.cpp"
151

source code of kcalc/bitbutton.cpp