File indexing completed on 2024-05-12 05:54:13

0001 /*
0002     SPDX-FileCopyrightText: 2014 Elvis Angelaccio <elvis.angelaccio@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "digitdisplay.h"
0008 
0009 #include <QHBoxLayout>
0010 #include <QLabel>
0011 
0012 DigitDisplay::DigitDisplay(QWidget *parent, Digits digits) : QWidget(parent)
0013 {
0014     auto layout = new QHBoxLayout {this};
0015     m_leftmostDigit = new QLabel {this};
0016     m_centerDigit = new QLabel {this};
0017     m_rightmostDigit = new QLabel {this};
0018 
0019     m_leftmostDigit->setAlignment(Qt::AlignCenter);
0020     m_centerDigit->setAlignment(Qt::AlignCenter);
0021     m_rightmostDigit->setAlignment(Qt::AlignCenter);
0022 
0023     layout->addWidget(m_leftmostDigit);
0024     layout->addWidget(m_centerDigit);
0025     layout->addWidget(m_rightmostDigit);
0026 
0027     setDigits(digits);
0028 }
0029 
0030 void DigitDisplay::setDigits(Digits digits)
0031 {
0032     m_digits = digits;
0033 
0034     switch (m_digits) {
0035     case Digits::One:
0036         m_leftmostDigit->show();
0037         m_centerDigit->hide();
0038         m_rightmostDigit->hide();
0039         break;
0040     case Digits::Two:
0041         m_leftmostDigit->show();
0042         m_centerDigit->show();
0043         m_rightmostDigit->hide();
0044         break;
0045     case Digits::Three:
0046         m_leftmostDigit->show();
0047         m_centerDigit->show();
0048         m_rightmostDigit->show();
0049         break;
0050     default:
0051         m_leftmostDigit->hide();
0052         m_centerDigit->hide();
0053         m_rightmostDigit->hide();
0054         break;
0055     }
0056 }
0057 
0058 void DigitDisplay::showDigits(const QString& digits) const
0059 {
0060     switch (m_digits) {
0061     case Digits::One:
0062         showOneDigit(digits);
0063         break;
0064     case Digits::Two:
0065         showTwoDigits(digits);
0066         break;
0067     case Digits::Three:
0068         showThreeDigits(digits);
0069         break;
0070     default:
0071         break;
0072     }
0073 }
0074 
0075 void DigitDisplay::setFont(const QFont& font)
0076 {
0077     m_displayFont = font;
0078 
0079     m_leftmostDigit->setFont(m_displayFont);
0080     m_centerDigit->setFont(m_displayFont);
0081     m_rightmostDigit->setFont(m_displayFont);
0082 }
0083 
0084 QSize DigitDisplay::minimumSizeHint() const
0085 {
0086     auto width = 0;
0087     auto fontMetrics = QFontMetrics {m_displayFont};
0088 
0089     switch (m_digits) {
0090     case Digits::One:
0091         width = fontMetrics.boundingRect(m_leftmostDigit->text()).width();
0092         break;
0093     case Digits::Two:
0094         width = fontMetrics.boundingRect(m_leftmostDigit->text()).width() + fontMetrics.boundingRect(m_centerDigit->text()).width();
0095         break;
0096     case Digits::Three:
0097         width = fontMetrics.boundingRect(m_leftmostDigit->text()).width() + fontMetrics.boundingRect(m_centerDigit->text()).width() + fontMetrics.boundingRect(m_rightmostDigit->text()).width();
0098         break;
0099     default:
0100         break;
0101     }
0102 
0103     width += (width * 10 / 100); // 10% used as padding between digits
0104 
0105     return {width, QWidget::minimumSizeHint().height()};
0106 }
0107 
0108 bool DigitDisplay::isValid(const QString &text) const
0109 {
0110     switch (m_digits) {
0111     case Digits::One:
0112         return text.size() == 1;
0113     case Digits::Two:
0114         return text.size() == 2;
0115     case Digits::Three:
0116         return text.size() == 3;
0117     default:
0118         return false;
0119     }
0120 }
0121 
0122 void DigitDisplay::showOneDigit(const QString& digit) const
0123 {
0124     if (!isValid(digit)) {
0125         return;
0126     }
0127 
0128     m_leftmostDigit->setText(digit.at(0));
0129 }
0130 
0131 void DigitDisplay::showTwoDigits(const QString& digits) const
0132 {
0133     if (!isValid(digits)) {
0134         return;
0135     }
0136 
0137     // digits are displayed from right to left
0138     m_centerDigit->setText(digits.at(1));
0139     m_leftmostDigit->setText(digits.at(0));
0140 }
0141 
0142 void DigitDisplay::showThreeDigits(const QString& digits) const
0143 {
0144     if (!isValid(digits)) {
0145         return;
0146     }
0147 
0148     // digits are displayed from right to left
0149     m_rightmostDigit->setText(digits.at(2));
0150     m_centerDigit->setText(digits.at(1));
0151     m_leftmostDigit->setText(digits.at(0));
0152 }
0153 
0154 #include "moc_digitdisplay.cpp"