File indexing completed on 2024-04-21 05:50:04

0001 /*
0002     SPDX-FileCopyrightText: 2012-2013 Evan Teran <evan.teran@gmail.com>
0003     SPDX-FileCopyrightText: 2006 Michel Marti <mma@objectxp.com>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "bitbutton.h"
0009 #include <QEvent>
0010 #include <QPainter>
0011 
0012 //------------------------------------------------------------------------------
0013 // Name: BitButton
0014 // Desc: constructor
0015 //------------------------------------------------------------------------------
0016 BitButton::BitButton(QWidget *parent)
0017     : QAbstractButton(parent)
0018 {
0019     // too many bits for tab focus
0020     setFocusPolicy(Qt::ClickFocus);
0021 
0022     // size button by font
0023     QSize size = fontMetrics().size(0, QStringLiteral("M"));
0024 
0025     if (size.width() < size.height()) {
0026         size.setHeight(size.width());
0027     } else {
0028         size.setWidth(size.height());
0029     }
0030 
0031     setMinimumSize(size);
0032     setRenderSize(size);
0033     setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
0034 
0035     this->setAttribute(Qt::WA_Hover, true);
0036 }
0037 
0038 //------------------------------------------------------------------------------
0039 // Name: paintEvent
0040 // Desc: draws the button
0041 //------------------------------------------------------------------------------
0042 void BitButton::paintEvent(QPaintEvent *)
0043 {
0044     uint8_t alpha = 0x60;
0045     QPainter painter(this);
0046     painter.setRenderHint(QPainter::Antialiasing, true);
0047     QPen pen(palette().text(), 1);
0048     pen.setJoinStyle(Qt::MiterJoin);
0049     painter.setPen(pen);
0050 
0051     if (on_) {
0052         painter.setBrush(palette().text());
0053         alpha = 0xB0;
0054     } else {
0055         painter.setBrush(palette().base());
0056     }
0057 
0058     if (over_) {
0059         painter.setBrush(QColor(palette().text().color().red(), palette().text().color().green(), palette().text().color().blue(), alpha));
0060     }
0061 
0062     // Prepare button size (should be square)
0063     QRect square = rect();
0064     square.setSize(renderSize());
0065 
0066     // Draw button
0067     painter.translate(QPoint(0, (rect().height() - square.height()) / 2)); // center button
0068     painter.drawRect(square.adjusted(1, 1, -1, -1));
0069 }
0070 
0071 //------------------------------------------------------------------------------
0072 // Name: isOn
0073 // Desc: returns true if this bit-button is "on"
0074 //------------------------------------------------------------------------------
0075 bool BitButton::isOn() const
0076 {
0077     return on_;
0078 }
0079 
0080 //------------------------------------------------------------------------------
0081 // Name: setOn
0082 // Desc: changes the "on" value for the bitset
0083 //------------------------------------------------------------------------------
0084 void BitButton::setOn(bool value)
0085 {
0086     on_ = value;
0087     update();
0088 }
0089 
0090 //------------------------------------------------------------------------------
0091 // Name: renderSize
0092 // Desc: returns current render size
0093 //------------------------------------------------------------------------------
0094 void BitButton::setRenderSize(const QSize &size)
0095 {
0096     renderSize_ = size;
0097 }
0098 
0099 //------------------------------------------------------------------------------
0100 // Name: renderSize
0101 // Desc: returns current render size
0102 //------------------------------------------------------------------------------
0103 QSize BitButton::renderSize() const
0104 {
0105     return renderSize_;
0106 }
0107 
0108 //------------------------------------------------------------------------------
0109 // Name: enterEvent
0110 // Desc: sets to true the "over" variable on Enter event
0111 //------------------------------------------------------------------------------
0112 void BitButton::enterEvent(QEnterEvent *event)
0113 {
0114     Q_UNUSED(event)
0115     over_ = true;
0116     update();
0117 }
0118 
0119 //------------------------------------------------------------------------------
0120 // Name: leaveEvent
0121 // Desc: sets to false the "over" variable on Leave event
0122 //------------------------------------------------------------------------------
0123 void BitButton::leaveEvent(QEvent *event)
0124 {
0125     if (event->type() == QEvent::Leave) {
0126         over_ = false;
0127         update();
0128     }
0129 }
0130 
0131 //------------------------------------------------------------------------------
0132 // Name: focusInEvent
0133 // Desc: sets to true the "over" variable on Enter event
0134 //------------------------------------------------------------------------------
0135 void BitButton::focusInEvent(QFocusEvent *event)
0136 {
0137     Q_UNUSED(event)
0138     over_ = true;
0139     update();
0140 }
0141 
0142 //------------------------------------------------------------------------------
0143 // Name: focusOutEvent
0144 // Desc: sets to false the "over" variable on Leave event
0145 //------------------------------------------------------------------------------
0146 void BitButton::focusOutEvent(QFocusEvent *event)
0147 {
0148     Q_UNUSED(event)
0149     over_ = false;
0150     update();
0151 }
0152 
0153 #include "moc_bitbutton.cpp"