ukui-panel/plugin-calendar/calendarbuttontext.cpp

320 lines
10 KiB
C++
Raw Normal View History

/*
* Copyright (C) 2023, KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/&gt;.
*
*/
#include "calendarbuttontext.h"
#include <QtDBus/QtDBus>
#define HOUR_SYSTEM_CONTROL "org.ukui.control-center.panel.plugins"
#define DATA_FORMAT "date" //日期格式yyyy/MM/dd、yyyy-MM-dd
#define TIME_FORMAT "hoursystem" //时间格式12小时制、24小时制
#define SYSTEM_FONT_SET "org.ukui.style"
#define SYSTEM_FONT_SIZE "systemFontSize"
#define SYSTEM_FONT "systemFont"
#define SYSTEM_MIN_FONT 10
#define PANEL_SETTINGS "org.ukui.panel.settings"
#define PANEL_POSITION_KEY "panelposition"
#define ICON_SIZE_KEY "iconsize"
#define PANEL_SIZE_KEY "panelsize"
#define CALENDAR_BUTTON_WIDTH 120
#define PANEL_SIZE_LARGE 92
#define PANEL_SIZE_MEDIUM 70
#define PANEL_SIZE_SMALL 46
#define PANEL_SIZE_KEY "panelsize"
#define UKUI_CONTROL_CENTER_SERVER "org.freedesktop.Accounts"
#define UKUI_CONTROL_CENTER_PATH "/org/freedesktop/Accounts/User1000"
#define UKUI_CONTROL_CENTER_INTERFACE "org.freedesktop.Accounts.User"
#define PROPERTIES_NAME "FormatsLocale"
#define US_FORMATS "en_US.UTF-8"
#define ZH_CN_FORMATS "zh_CN.UTF-8"
#define INSIDE_SPAC 6
CalendarButtonText::CalendarButtonText(IUKUIPanelPlugin *plugin, QPushButton *parent):
m_plugin(plugin),
m_parent(parent)
{
m_dataTime = QDateTime::currentDateTime();
const QByteArray controlId(HOUR_SYSTEM_CONTROL);
if (QGSettings::isSchemaInstalled(controlId)) {
m_timeFormat = new QGSettings(controlId);
}
const QByteArray fontId(SYSTEM_FONT_SET);
if (QGSettings::isSchemaInstalled(fontId)) {
m_fontGsettings = new QGSettings(fontId);
}
const QByteArray panelId(PANEL_SETTINGS);
if (QGSettings::isSchemaInstalled(panelId)) {
m_panelGsettings = new QGSettings(panelId);
}
}
CalendarButtonText::~CalendarButtonText()
{
if(m_timeFormat) {
m_timeFormat->deleteLater();
}
if(m_fontGsettings) {
m_fontGsettings->deleteLater();
}
if(m_panelGsettings) {
m_panelGsettings->deleteLater();
}
}
QString CalendarButtonText::getAmPm()
{
QString time = m_dataTime.toString("A hh:mm");
QStringList timeList = time.split(" ", QString::SkipEmptyParts);
return timeList.first();
}
QString CalendarButtonText::getTime()
{
QString time = m_dataTime.toString("A hh:mm");
QStringList timeList = time.split(" ", QString::SkipEmptyParts);
QString time12 = timeList.last();
QString time24 = m_dataTime.toString("hh:mm");
if(m_timeFormat && m_timeFormat->get(TIME_FORMAT).toString() == "12") {
return time12;
} else {
return time24;
}
}
QString CalendarButtonText::getWeek()
{
QDBusInterface interface(UKUI_CONTROL_CENTER_SERVER,
UKUI_CONTROL_CENTER_PATH,
UKUI_CONTROL_CENTER_INTERFACE,
QDBusConnection::systemBus());
QString language = interface.property(PROPERTIES_NAME).toString();
if(language == US_FORMATS) {
return m_dataTime.toString("ddd");
} else if(language == ZH_CN_FORMATS) {
return m_dataTime.toString("dddd");
}
}
QString CalendarButtonText::getDate(DateStyle dateStyle)
{
QString year = m_dataTime.toString("yyyy");
QString mon = m_dataTime.toString("MM");
QString day = m_dataTime.toString("dd");
QString spacer = "/";
if(m_timeFormat && m_timeFormat->get(DATA_FORMAT).toString() == "en") {
spacer = "-";
} else {
spacer = "/";
}
if(dateStyle == DateStyle::YEAR_MON_DAY) {
return year + spacer + mon + spacer + day;
}
else {
return mon + spacer + day;
}
}
void CalendarButtonText::updateFontSize(QString btnText)
{
QStringList textList = btnText.split("\n", QString::SkipEmptyParts);
int maxLength;
if(m_plugin->panel()->isHorizontal()) {
if(m_panelGsettings->get(PANEL_SIZE_KEY).toInt() < PANEL_SIZE_MEDIUM) {
QString systemFont = m_fontGsettings->get(SYSTEM_FONT).toString();
m_parent->setFont(QFont(systemFont, SYSTEM_MIN_FONT));
return;
}
maxLength = CALENDAR_BUTTON_WIDTH;
setOptimalFont(textList, maxLength);
} else {
int m_panelSize = m_panelGsettings->get(PANEL_SIZE_KEY).toInt();
if(m_panelSize >= PANEL_SIZE_SMALL && m_panelSize < PANEL_SIZE_MEDIUM) {
maxLength = PANEL_SIZE_SMALL;
} else if(m_panelSize >= PANEL_SIZE_MEDIUM && m_panelSize < PANEL_SIZE_LARGE) {
maxLength = PANEL_SIZE_MEDIUM;
} else if(m_panelSize == PANEL_SIZE_LARGE) {
maxLength = PANEL_SIZE_LARGE;
} else {
maxLength = PANEL_SIZE_SMALL;
}
setOptimalFont(textList, maxLength);
}
}
//判断最长字体的是否可以显示下,选取最优字体大小显示
void CalendarButtonText::setOptimalFont(QStringList textList, int btnMaxLength)
{
QString systemFont = m_fontGsettings->get(SYSTEM_FONT).toString();
double fontSizeCurrent = m_fontGsettings->get(SYSTEM_FONT_SIZE).toDouble();
QList<double> systemFonts;
systemFonts<<10<<12<<13.5<<15;
//获取最长的行
QFontMetrics fontMetrics(QFont(systemFont, fontSizeCurrent));
int fontWidth = fontMetrics.width(textList.first());
int maxIndex = 0;
for(int i=1; i<textList.size(); i++) {
int width = fontMetrics.width(textList.at(i));
if(width > fontWidth) {
fontWidth = width;
maxIndex = i;
}
}
//判断最长字体的是否可以显示下,选取最优字体
int maxFontWidth = fontMetrics.width(textList.at(maxIndex));
if(maxFontWidth > btnMaxLength-INSIDE_SPAC) {
int index = systemFonts.indexOf(fontSizeCurrent);
if(index>0) {
for(int i=index-1; i>=0; i--) {
QFontMetrics fontMetrics(QFont(systemFont, systemFonts.at(i)));
int width = fontMetrics.width(textList.at(maxIndex));
if(width <= btnMaxLength-INSIDE_SPAC) {
m_parent->setFont(QFont(systemFont, systemFonts.at(i)));
break;
}
}
} else {
//容错处理,如果系统 org.ukui.style system-font-size 设置错误,也可保证日期正常显示不遮挡
m_parent->setFont(QFont(systemFont, systemFonts.first()));
}
} else {
m_parent->setFont(QFont(systemFont, fontSizeCurrent));
}
}
EnUsText::EnUsText(IUKUIPanelPlugin *plugin,QPushButton *parent):
CalendarButtonText(plugin,parent)
{
}
QString EnUsText::getBtnText()
{
QString amPmStr = getAmPm();
QString timeStr = getTime();
QString weekStr = getWeek();
QString dataStr;
QString btnTextStr;
if(m_plugin->panel()->isHorizontal()) {
dataStr = getDate(DateStyle::YEAR_MON_DAY);
if(m_timeFormat && m_timeFormat->get(TIME_FORMAT).toString() == "12") {
btnTextStr = timeStr + " " + amPmStr + " " + weekStr + "\n" + dataStr;
} else {
btnTextStr = timeStr + " " + weekStr + "\n" + dataStr;
}
} else {
if(m_panelGsettings->get(PANEL_SIZE_KEY).toInt() < PANEL_SIZE_LARGE) {
dataStr = getDate(DateStyle::MON_DAY);
} else {
dataStr = getDate(DateStyle::YEAR_MON_DAY);
}
if(m_timeFormat && m_timeFormat->get(TIME_FORMAT).toString() == "12") {
btnTextStr = timeStr + "\n" + amPmStr + "\n" + weekStr + "\n" + dataStr;
} else {
btnTextStr = timeStr + "\n" + weekStr + "\n" + dataStr;
}
}
updateFontSize(btnTextStr);
return btnTextStr;
}
ZhCnText::ZhCnText(IUKUIPanelPlugin *plugin,QPushButton *parent):
CalendarButtonText(plugin,parent)
{
}
QString ZhCnText::getBtnText()
{
QString amPmStr = getAmPm();
QString timeStr = getTime();
QString weekStr = getWeek();
QString dataStr;
QString btnTextStr;
if(m_plugin->panel()->isHorizontal()) {
dataStr = getDate(DateStyle::YEAR_MON_DAY);
if(m_timeFormat && m_timeFormat->get(TIME_FORMAT).toString() == "12") {
btnTextStr = amPmStr + " " + timeStr + " " + weekStr + "\n" + dataStr;
} else {
btnTextStr = timeStr + " " + weekStr + "\n" + dataStr;
}
} else {
if(m_panelGsettings->get(PANEL_SIZE_KEY).toInt() < PANEL_SIZE_LARGE) {
dataStr = getDate(DateStyle::MON_DAY);
} else {
dataStr = getDate(DateStyle::YEAR_MON_DAY);
}
if(m_timeFormat && m_timeFormat->get(TIME_FORMAT).toString() == "12") {
btnTextStr = amPmStr + "\n" + timeStr + "\n" + weekStr + "\n" + dataStr;
} else {
btnTextStr = timeStr + "\n" + weekStr + "\n" + dataStr;
}
}
updateFontSize(btnTextStr);
return btnTextStr;
}
OtherLanguagText::OtherLanguagText(IUKUIPanelPlugin *plugin,QPushButton *parent):
CalendarButtonText(plugin,parent)
{
}
QString OtherLanguagText::getBtnText()
{
QString amPmStr = getAmPm();
QString timeStr = getTime();
QString dataStr;
QString btnTextStr;
if(m_plugin->panel()->isHorizontal()) {
dataStr = getDate(DateStyle::YEAR_MON_DAY);
if(m_timeFormat && m_timeFormat->get(TIME_FORMAT).toString() == "12") {
btnTextStr = amPmStr + " " + timeStr + "\n" + dataStr;
} else {
btnTextStr = timeStr + "\n" + dataStr;
}
} else {
//任务栏纵向状态下大尺寸以下均不显示year
if(m_panelGsettings->get(PANEL_SIZE_KEY).toInt() < PANEL_SIZE_LARGE) {
dataStr = getDate(DateStyle::MON_DAY);
} else {
dataStr = getDate(DateStyle::YEAR_MON_DAY);
}
if(m_timeFormat && m_timeFormat->get(TIME_FORMAT).toString() == "12") {
btnTextStr = amPmStr + "\n" + timeStr + "\n" + dataStr;
} else {
btnTextStr = timeStr + "\n" + dataStr;
}
}
updateFontSize(btnTextStr);
return btnTextStr;
}