Warning, file /utilities/kronometer/src/gui/timedisplay.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002     Copyright (C) 2014 by Elvis Angelaccio <elvis.angelaccio@kde.org>
0003 
0004     This file is part of Kronometer.
0005 
0006     Kronometer is free software: you can redistribute it and/or modify
0007     it under the terms of the GNU General Public License as published by
0008     the Free Software Foundation, either version 2 of the License, or
0009     (at your option) any later version.
0010 
0011     Kronometer is distributed in the hope that it will be useful,
0012     but WITHOUT ANY WARRANTY; without even the implied warranty of
0013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0014     GNU General Public License for more details.
0015 
0016     You should have received a copy of the GNU General Public License
0017     along with Kronometer.  If not, see <http://www.gnu.org/licenses/>.
0018 */
0019 
0020 #include "timedisplay.h"
0021 #include "digitdisplay.h"
0022 
0023 #include <KLocalizedString>
0024 
0025 #include <QBoxLayout>
0026 #include <QGroupBox>
0027 
0028 TimeDisplay::TimeDisplay(QWidget *parent) : QWidget(parent)
0029 {
0030     setupUi(this);
0031 
0032     m_hourDisplay->setDigits(DigitDisplay::Digits::Two);
0033     m_minDisplay->setDigits(DigitDisplay::Digits::Two);
0034     m_secDisplay->setDigits(DigitDisplay::Digits::Two);
0035 
0036     m_hourDisplay->showDigits(m_currentFormat.formatHours(m_displayTime));
0037     m_minDisplay->showDigits(m_currentFormat.formatMinutes(m_displayTime));
0038     m_secDisplay->showDigits(m_currentFormat.formatSeconds(m_displayTime));
0039     m_fracDisplay->showDigits(m_currentFormat.formatFractions(m_displayTime));
0040 }
0041 
0042 void TimeDisplay::setTimeFormat(const TimeFormat& format)
0043 {
0044     m_defaultFormat = format;
0045     m_currentFormat = format;
0046     updateTimeFormat();
0047 }
0048 
0049 void TimeDisplay::setHoursFont(const QFont& font)
0050 {
0051     m_hourDisplay->setFont(font);
0052     updateWidth();
0053 }
0054 
0055 void TimeDisplay::setMinutesFont(const QFont& font)
0056 {
0057     m_minDisplay->setFont(font);
0058     updateWidth();
0059 }
0060 
0061 void TimeDisplay::setSecondsFont(const QFont& font)
0062 {
0063     m_secDisplay->setFont(font);
0064     updateWidth();
0065 }
0066 
0067 void TimeDisplay::setFractionsFont(const QFont& font)
0068 {
0069     m_fracDisplay->setFont(font);
0070     updateWidth();
0071 }
0072 
0073 void TimeDisplay::setBackgroundColor(const QColor& color)
0074 {
0075     setGroupboxColor(m_hourGroup, m_hourGroup->backgroundRole(), color);
0076     setGroupboxColor(m_minGroup, m_minGroup->backgroundRole(), color);
0077     setGroupboxColor(m_secGroup, m_secGroup->backgroundRole(), color);
0078     setGroupboxColor(m_fracGroup, m_fracGroup->backgroundRole(), color);
0079     update();
0080 }
0081 
0082 void TimeDisplay::setTextColor(const QColor& color)
0083 {
0084     setGroupboxColor(m_hourGroup, m_hourGroup->foregroundRole(), color);
0085     setGroupboxColor(m_minGroup, m_minGroup->foregroundRole(), color);
0086     setGroupboxColor(m_secGroup, m_secGroup->foregroundRole(), color);
0087     setGroupboxColor(m_fracGroup, m_fracGroup->foregroundRole(), color);
0088     update();
0089 }
0090 
0091 QString TimeDisplay::currentTime()
0092 {
0093     m_currentFormat.showDividers(true);
0094     const auto currentTime = m_currentFormat.format(m_displayTime);
0095     m_currentFormat.showDividers(false);
0096 
0097     return currentTime;
0098 }
0099 
0100 void TimeDisplay::setTime(int time)
0101 {
0102     m_displayTime.setHMS(time / MSECS_PER_HOUR,
0103                         (time % MSECS_PER_HOUR) / MSECS_PER_MIN,
0104                         (time / MSECS_PER_SEC) % 60,
0105                         time % MSECS_PER_SEC);
0106 
0107     updateTimer();
0108 }
0109 
0110 void TimeDisplay::reset()
0111 {
0112     if (m_currentFormat == m_defaultFormat)
0113         return;
0114 
0115     setTimeFormat(m_defaultFormat);
0116 }
0117 
0118 void TimeDisplay::updateTimer()
0119 {
0120     if (m_currentFormat.hasHours()) {
0121         m_hourDisplay->showDigits(m_currentFormat.formatHours(m_displayTime));
0122     }
0123     else if (m_displayTime.hour() >= 1) {
0124         m_currentFormat.overrideHours();
0125         updateTimeFormat();
0126     }
0127 
0128     if (m_currentFormat.hasMinutes()) {
0129         m_minDisplay->showDigits(m_currentFormat.formatMinutes(m_displayTime));
0130     }
0131     else if (m_displayTime.minute() >= 1) {
0132         m_currentFormat.overrideMinutes();
0133         updateTimeFormat();
0134     }
0135 
0136     m_secDisplay->showDigits(m_currentFormat.formatSeconds(m_displayTime));
0137 
0138     if (m_currentFormat.hasFractions()) {
0139         m_fracDisplay->showDigits(m_currentFormat.formatFractions(m_displayTime));
0140     }
0141 }
0142 
0143 void TimeDisplay::updateWidth()
0144 {
0145     auto width = qMax(qMax(m_hourDisplay->minimumSizeHint().width(),
0146                           m_minDisplay->minimumSizeHint().width()),
0147                      qMax(m_secDisplay->minimumSizeHint().width(),
0148                           m_fracDisplay->minimumSizeHint().width()));
0149 
0150     width = width + (width * 20 / 100); // 20% as padding, i.e. 10% as right padding and 10% as left padding
0151 
0152     m_hourGroup->setMinimumWidth(width);
0153     m_minGroup->setMinimumWidth(width);
0154     m_secGroup->setMinimumWidth(width);
0155     m_fracGroup->setMinimumWidth(width);
0156 }
0157 
0158 void TimeDisplay::updateTimeFormat()
0159 {
0160     m_hourGroup->setVisible(m_currentFormat.hasHours());
0161     m_minGroup->setVisible(m_currentFormat.hasMinutes());
0162     m_fracGroup->setVisible(m_currentFormat.hasFractions());
0163 
0164     if (m_currentFormat.hasFractions()) {
0165         switch (m_currentFormat.secondFractions()) {
0166         case TimeFormat::UpToTenths:
0167             m_fracGroup->setTitle(i18nc("@title:column", "Tenths"));
0168             m_fracDisplay->setDigits(DigitDisplay::Digits::One);
0169             break;
0170         case TimeFormat::UpToHundredths:
0171             m_fracGroup->setTitle(i18nc("@title:column", "Hundredths"));
0172             m_fracDisplay->setDigits(DigitDisplay::Digits::Two);
0173             break;
0174         case TimeFormat::UpToMilliseconds:
0175             m_fracGroup->setTitle(i18nc("@title:column", "Milliseconds"));
0176             m_fracDisplay->setDigits(DigitDisplay::Digits::Three);
0177             break;
0178         default:
0179             break;
0180         }
0181     }
0182 
0183     updateTimer();
0184 }
0185 
0186 void TimeDisplay::setGroupboxColor(QGroupBox *groupBox, QPalette::ColorRole role, const QColor& color)
0187 {
0188     if (not groupBox) {
0189         return;
0190     }
0191 
0192     auto palette = QPalette {groupBox->palette()};
0193     palette.setColor(role, color);
0194     groupBox->setPalette(palette);
0195 }
0196