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"