ukui-panel/plugin-calendar/calendarbutton.cpp

298 lines
11 KiB
C++
Raw Permalink 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) 2019 Tianjin KYLIN Information Technology 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 "calendarbutton.h"
#include <QStylePainter>
#include <QStyleOptionButton>
#include <QApplication>
#include "kysdk/applications/windowmanager/windowmanager.h"
#define ORG_UKUI_STYLE "org.ukui.style"
#define STYLE_NAME "styleName"
#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 WEEK_FORMAT "firstday" //一周第一天:星期一、星期日
#define CALENDAR_FORMAT "calendar" //日历格式:公历-solarlunar、农历-lunar
#define HOUR_SYSTEM_24_Vertical "hh:mm ddd yyyy/MM/dd"
#define HOUR_SYSTEM_12_Horizontal "Ahh:mm ddd yyyy/MM/dd"
#define SYSTEM_FONT_SET "org.ukui.style"
#define SYSTEM_FONT_SIZE "systemFontSize"
#define SYSTEM_FONT "systemFont"
#define CALENDAR_BUTTON_WIDTH 120
#define KYSDK_TIMERSERVER "com.kylin.kysdk.TimeServer"
#define KYSDK_TIMERPATH "/com/kylin/kysdk/Timer"
#define KYSDK_TIMERINTERFACE "com.kylin.kysdk.TimeInterface"
#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 BO_CN_FORMATS "bo_CN.UTF-8" //藏文
#define PANEL_SIZE_LARGE 92
#define PANEL_SIZE_MEDIUM 70
#define PANEL_SIZE_SMALL 46
#define PANEL_SIZE_KEY "panelsize"
CalendarButton::CalendarButton(IUKUIPanelPlugin *plugin, QWidget *parent):
QPushButton(parent),
m_parent(parent),
m_plugin(plugin)
{
//设置按钮样式和属性
this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
this->setFlat(true);
/*按钮边距固定0px尽可能多显示日期信息。CalendarButton不继承ToolButton的原因就是
主题框架提供的ToolButton的边距是固定值无法修改*/
this->setStyleSheet("padding: 0px;}");
const QByteArray id(ORG_UKUI_STYLE);
if (QGSettings::isSchemaInstalled(id)) {
m_styleGsettings = new QGSettings(id);
connect(m_styleGsettings, &QGSettings::changed, this, [=] (const QString &key) {
if (key==STYLE_NAME) {
update();
}
});
}
this->setToolTip(tr("Time and Date"));
//初始化时间日期格式相关Gsettings
initTimeGsettings();
//初始化系统字体相关Gsetting
initFontGsettings();
//使用系统提供的sdk刷新时间显示
QDBusConnection::systemBus().connect(KYSDK_TIMERSERVER,
KYSDK_TIMERPATH,
KYSDK_TIMERINTERFACE,
"TimeSignal",
this,
SLOT(updateBtnText(QString))
);
QDBusConnection::systemBus().connect(KYSDK_TIMERSERVER,
KYSDK_TIMERPATH,
KYSDK_TIMERINTERFACE,
"TimeChangeSignal",
this,
SLOT(updateBtnText(QString))
);
m_listenGsettings = new ListenGsettings();
QObject::connect(m_listenGsettings,&ListenGsettings::iconsizechanged,[this]{updateBtnText(QString());});
QObject::connect(m_listenGsettings,&ListenGsettings::panelpositionchanged,[this]{updateBtnText(QString());});
//更新日历按钮内容
updateBtnText(QString());
}
CalendarButton::~CalendarButton()
{
if(m_styleGsettings) {
m_styleGsettings->deleteLater();
}
if(m_timeGsettings) {
m_timeGsettings->deleteLater();
}
if(m_fontGsettings) {
m_fontGsettings->deleteLater();
}
if(m_listenGsettings) {
m_listenGsettings->deleteLater();
}
}
void CalendarButton::contextMenuEvent(QContextMenuEvent *event)
{
m_menuCalender = new QMenu();
m_menuCalender->setAttribute(Qt::WA_DeleteOnClose);
m_menuCalender->setGeometry(m_plugin->panel()->calculatePopupWindowPos
(mapToGlobal(event->pos()),
m_menuCalender->sizeHint()));
m_menuCalender->addAction(QIcon::fromTheme("document-page-setup-symbolic"),
tr("Time and Date Setting"),
this, SLOT(setControlTime()));
m_menuCalender->show();
kdk::WindowManager::setGeometry(m_menuCalender->windowHandle(),
m_plugin->panel()->calculatePopupWindowPos(mapToGlobal(event->pos()), m_menuCalender->sizeHint()));
}
void CalendarButton::mousePressEvent(QMouseEvent *event)
{
if (Qt::LeftButton == event->button()){
Q_EMIT pressShowHideCalendar();
}
}
//初始化时间日期格式相关Gsettings
void CalendarButton::initTimeGsettings()
{
const QByteArray id(HOUR_SYSTEM_CONTROL);
if (QGSettings::isSchemaInstalled(id)) {
m_timeGsettings = new QGSettings(id);
connect(m_timeGsettings, &QGSettings::changed, this, [=] (const QString &key) {
if (key == DATA_FORMAT) {
m_dataFormat = m_timeGsettings->get(DATA_FORMAT).toString();
} else if(key == TIME_FORMAT) {
m_timeFormat = m_timeGsettings->get(TIME_FORMAT).toString();
} else if(key == WEEK_FORMAT) {
m_weekFormat = m_timeGsettings->get(WEEK_FORMAT).toString();
} else if(key == CALENDAR_FORMAT) {
m_calendarFormat = m_timeGsettings->get(CALENDAR_FORMAT).toString();
}
updateBtnText(QString());
});
QStringList ketList = m_timeGsettings->keys();
if(ketList.contains(DATA_FORMAT))
m_dataFormat = m_timeGsettings->get(DATA_FORMAT).toString();
if(ketList.contains(TIME_FORMAT))
m_timeFormat = m_timeGsettings->get(TIME_FORMAT).toString();
if(ketList.contains(WEEK_FORMAT))
m_weekFormat = m_timeGsettings->get(WEEK_FORMAT).toString();
if(ketList.contains(CALENDAR_FORMAT))
m_calendarFormat = m_timeGsettings->get(CALENDAR_FORMAT).toString();
}
}
//初始化系统字体相关Gsetting
void CalendarButton::initFontGsettings()
{
const QByteArray id(SYSTEM_FONT_SET);
if (QGSettings::isSchemaInstalled(id)) {
m_fontGsettings = new QGSettings(id);
connect(m_fontGsettings, &QGSettings::changed, this, [=] (const QString &keys){
if(keys == SYSTEM_FONT_SIZE || keys == SYSTEM_FONT){
m_systemFontSize = m_fontGsettings->get(SYSTEM_FONT_SIZE).toString();
m_systemFont = m_fontGsettings->get(SYSTEM_FONT).toString();
updateBtnText(QString());
}
});
QStringList ketList = m_fontGsettings->keys();
if(ketList.contains(SYSTEM_FONT_SIZE))
m_systemFontSize = m_fontGsettings->get(SYSTEM_FONT_SIZE).toString();
if(ketList.contains(SYSTEM_FONT))
m_systemFont = m_fontGsettings->get(SYSTEM_FONT).toString();
}
}
//右键跳转到控制面板日期页面
void CalendarButton::setControlTime()
{
QProcess *process =new QProcess(this);
process->start(
"bash",
QStringList() << "-c"
<< "dpkg -l | grep ukui-control-center");
process->waitForFinished();
QString strResult = process->readAllStandardOutput() + process->readAllStandardError();
if (-1 != strResult.indexOf("3.0")) {
QProcess::startDetached(QString("ukui-control-center -t"));
} else {
QProcess::startDetached(QString("ukui-control-center -m Date"));
}
}
/*
* 更新时间文字显示
* 横向任务栏显示格式(中文)
* 24小时制
* hh:mm ddd
* yyyy/MM/dd
* 12小时制
* AM hh:mm ddd
* yyyy/MM/dd
*
* 纵向任务栏显示格式:
* 24小时制
* hh:mm 或 hh:mm
* ddd ddd
* yyyy/MM/dd MM/dd
* 12小时制
* AM AM
* hh:mm hh:mm
* ddd 或 ddd
* yyyy/MM/dd MM/dd
*/
void CalendarButton::updateBtnText(QString timerStr)
{
Q_UNUSED(timerStr);
QString formatsLocale = getFormatsLocale();
QString displayText;
CalendarButtonText *m_btnText;
if(formatsLocale == ZH_CN_FORMATS) {
m_btnText = new ZhCnText(m_plugin,this);
} else if(formatsLocale == US_FORMATS) {
m_btnText = new EnUsText(m_plugin,this);
} else {
m_btnText = new OtherLanguagText(m_plugin,this);
}
displayText = m_btnText->getBtnText();
m_btnText->deleteLater();
this->setText(displayText);
}
/* 获取时间、日期、货币格式 */
QString CalendarButton::getFormatsLocale()
{
QDBusInterface interface(UKUI_CONTROL_CENTER_SERVER,
UKUI_CONTROL_CENTER_PATH,
UKUI_CONTROL_CENTER_INTERFACE,
QDBusConnection::systemBus());
QVariant ret = interface.property(PROPERTIES_NAME);
return ret.toString();
}
void CalendarButton::paintEvent(QPaintEvent* event)
{
QStylePainter painter(this);
QStyleOptionButton option;
initStyleOption(&option);
if ((option.state & QStyle::State_Enabled) &&
(option.state & QStyle::State_MouseOver ||
option.state & QStyle::State_HasFocus)) {
painter.save();
painter.setPen(Qt::NoPen);
QPalette pal = qApp->palette();
QColor color = pal.color(QPalette::Active, QPalette::BrightText);
color.setAlphaF(m_btnAlphaF);
painter.setBrush(color);
painter.setRenderHint(QPainter::Antialiasing);
painter.drawRoundedRect(option.rect, 6, 6);
painter.restore();
}
QStyleOptionButton subopt = option;
subopt.rect = painter.style()->subElementRect(QStyle::SE_PushButtonContents, &option, this);
subopt.palette.setBrush(QPalette::BrightText, subopt.palette.brightText());
painter.style()->drawControl(QStyle::CE_PushButtonLabel, &subopt, &painter, this);
return;
}