akmenu-next/arm9/source/bigclock.cpp
2024-10-13 02:11:14 -07:00

105 lines
2.8 KiB
C++

/*
bigclock.cpp
Copyright (C) 2007 Acekard, www.acekard.com
Copyright (C) 2007-2009 somebody
Copyright (C) 2009 yellow wood goblin
SPDX-License-Identifier: GPL-3.0-or-later
*/
#include "bigclock.h"
#include "globalsettings.h"
#include "inifile.h"
#include "stringtool.h"
#include "systemfilenames.h"
#include "windowmanager.h"
using namespace akui;
cBigClock::cBigClock() : cWindow(NULL, "big clock") {
_size = cSize(0, 0);
_position = cPoint(8, 80);
_engine = GE_SUB;
_show = false;
_colonShow = false;
_ampmShow = false;
_ampmColor = RGB15(17, 12, 0);
}
void cBigClock::init() {
loadAppearance(SFN_UI_SETTINGS);
}
cWindow& cBigClock::loadAppearance(const std::string& aFileName) {
CIniFile ini(aFileName);
_position.x = ini.GetInt("big clock", "x", 8);
_position.y = ini.GetInt("big clock", "y", 80);
_show = ini.GetInt("big clock", "show", _show);
_ampmPosition.x = ini.GetInt("am pm", "x", 8);
_ampmPosition.y = ini.GetInt("am pm", "y", 80);
_ampmShow = ini.GetInt("am pm", "show", _ampmShow);
_ampmColor = ini.GetInt("am pm", "color", _ampmColor);
_numbers = createBMP15FromFile(SFN_CLOCK_NUMBERS);
_colon = createBMP15FromFile(SFN_CLOCK_COLON);
return *this;
}
void cBigClock::drawNumber(u8 id, u8 number) {
if (number > 10) return;
u8 x = _position.x + id * (_numbers.width() + 2);
if (id > 2) { // minute number
x -= 8;
}
if (_numbers.valid()) {
u8 w = _numbers.width();
u8 h = _numbers.height() / 10;
u8 pitch = _numbers.pitch() >> 1;
gdi().maskBlt(_numbers.buffer() + number * pitch * h / 2, x, _position.y, w, h,
selectedEngine());
}
}
void cBigClock::drawColon() {
u8 x = _position.x + 2 * _numbers.width();
if (_colon.valid()) {
gdi().maskBlt(_colon.buffer(), x, _position.y, _colon.width(), _colon.height(),
selectedEngine());
}
}
void cBigClock::draw() {
if (!_show) return;
u8 hours = datetime().hours();
u8 minutes = datetime().minutes();
const char* ampm = (hours < 12) ? "AM" : "PM";
if (gs().show12hrClock) {
if (hours > 12) hours -= 12;
if (hours == 0) hours = 12;
}
u8 number1 = hours / 10;
u8 number2 = hours % 10;
u8 number3 = minutes / 10;
u8 number4 = minutes % 10;
// u8 number5 = datetime().seconds() / 10;
// u8 number6 = datetime().seconds() % 10;
drawNumber(0, number1);
drawNumber(1, number2);
drawNumber(3, number3);
drawNumber(4, number4);
if (_colonShow) drawColon();
if (gs().show12hrClock && _ampmShow) {
gdi().setPenColor(_ampmColor, _engine);
gdi().textOut(_ampmPosition.x, _ampmPosition.y, ampm, _engine);
}
}
void cBigClock::blinkColon() {
_colonShow = !_colonShow;
}