C

Qt Quick Ultralite Watch Demo

// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial

#include "WatchModel.h"

#include <ctime>

namespace {
const int ONE_SECOND_ANGLE = 6;
const int ONE_MINUTE_ANGLE = 6;
const int ONE_HOUR_ANGLE = 30;
const int MINUTES_PER_HOUR = 60;
const int DEFAULT_VALUE = 0;

void TimeToUTC(const time_t &time, tm &tm_out)
{
    const unsigned int SECONDS_PER_DAY = 60 * 60 * 24;
    const unsigned int time_of_day = time % SECONDS_PER_DAY;
    const unsigned int number_of_day = time / SECONDS_PER_DAY;
    tm_out.tm_sec = time_of_day % 60;
    tm_out.tm_min = (time_of_day % 3600) / 60;
    tm_out.tm_hour = time_of_day / 3600;
    tm_out.tm_wday = (number_of_day + 4) % 7;
}

int CalculateSecondsAngle(const tm *timeStruct)
{
    return timeStruct->tm_sec * ONE_SECOND_ANGLE;
}

int CalculateMinutesAngle(const tm *timeStruct)
{
    return timeStruct->tm_min * ONE_MINUTE_ANGLE;
}

int CalculateHoursAngle(const tm *timeStruct)
{
    return timeStruct->tm_hour * ONE_HOUR_ANGLE + (ONE_HOUR_ANGLE * timeStruct->tm_min / MINUTES_PER_HOUR);
}
} // namespace

WatchModel::WatchModel()
    : SecondAngle(DEFAULT_VALUE)
    , MinuteAngle(DEFAULT_VALUE)
    , HourAngle(DEFAULT_VALUE)
    , DayOfWeek(DEFAULT_VALUE)
{
    update();
}

void WatchModel::update()
{
    const time_t currentTime = time(NULL);
    tm currentTimeDateStruct;
    TimeToUTC(currentTime, currentTimeDateStruct);

    MinuteAngle.setValue(CalculateMinutesAngle(&currentTimeDateStruct));
    HourAngle.setValue(CalculateHoursAngle(&currentTimeDateStruct));
    SecondAngle.setValue(CalculateSecondsAngle(&currentTimeDateStruct));
    DayOfWeek.setValue(currentTimeDateStruct.tm_wday);
}