ukui-panel/plugin-calendar/calendarbuttontext.cpp

320 lines
10 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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;
}