diff options
Diffstat (limited to 'src-qt5/core/lumina-desktop/panel-plugins/clock')
-rw-r--r-- | src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.cpp | 214 | ||||
-rw-r--r-- | src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.h | 56 |
2 files changed, 270 insertions, 0 deletions
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.cpp b/src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.cpp new file mode 100644 index 00000000..0ecef3b2 --- /dev/null +++ b/src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.cpp @@ -0,0 +1,214 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2012-2015, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#include "LClock.h" +#include "LSession.h" +#include <LuminaThemes.h> +#include <LuminaXDG.h> + +LClock::LClock(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){ + button = new QToolButton(this); + button->setAutoRaise(true); + button->setToolButtonStyle(Qt::ToolButtonTextOnly); + button->setStyleSheet("font-weight: bold;"); + button->setPopupMode(QToolButton::DelayedPopup); //make sure it runs the update routine first + button->setMenu(new QMenu()); + //button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); + //this->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); + connect(button, SIGNAL(clicked()), this, SLOT(openMenu())); + connect(button->menu(), SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed())); + calendar = new QCalendarWidget(this); + calAct = new QWidgetAction(this); + calAct->setDefaultWidget(calendar); + TZMenu = new QMenu(this); + connect(TZMenu, SIGNAL(triggered(QAction*)), this, SLOT(ChangeTZ(QAction*)) ); + + //Now assemble the menu + button->menu()->addAction(calAct); + button->menu()->addMenu(TZMenu); + + this->layout()->setContentsMargins(0,0,0,0); //reserve some space on left/right + this->layout()->addWidget(button); + + //Setup the timer + timer = new QTimer(); + //Load all the initial settings + updateFormats(); + LocaleChange(); + ThemeChange(); + OrientationChange(); + //Now connect/start the timer + connect(timer,SIGNAL(timeout()), this, SLOT(updateTime()) ); + connect(QApplication::instance(), SIGNAL(SessionConfigChanged()), this, SLOT(updateFormats()) ); + timer->start(); +} + +LClock::~LClock(){ + timer->stop(); + delete timer; +} + + +void LClock::updateTime(bool adjustformat){ + QDateTime CT = QDateTime::currentDateTime(); + //Now update the display + QString label; + QString timelabel; + QString datelabel; + if(deftime){ timelabel = CT.time().toString(Qt::DefaultLocaleShortDate) ; } + else{ timelabel=CT.toString(timefmt); } + if(defdate){ datelabel = CT.date().toString(Qt::DefaultLocaleShortDate); } + else{ datelabel = CT.toString(datefmt); } + if(datetimeorder == "dateonly"){ + label = datelabel; + button->setToolTip(timelabel); + }else if(datetimeorder == "timedate"){ + label = timelabel + "\n" + datelabel; + button->setToolTip(""); + }else if(datetimeorder == "datetime"){ + label = datelabel + "\n" + timelabel; + button->setToolTip(""); + }else{ + label = timelabel; + button->setToolTip(datelabel); + } + if( this->layout()->direction() == QBoxLayout::TopToBottom ){ + //different routine for vertical text (need newlines instead of spaces) + label.replace(" ","\n"); + } + if(adjustformat){ + //Check the font/spacing for the display and adjust as necessary + /*double efflines = label.count("\n")+1; //effective lines (with wordwrap) + if( (button->fontMetrics().height()*efflines) > button->height() ){ + //Force a pixel metric font size to fit everything + int szH = qRound( (button->height() - button->fontMetrics().lineSpacing() )/efflines ); + //Need to supply a *width* pixel, not a height metric + int szW = qRound( (szH*button->fontMetrics().maxWidth())/( (double) button->fontMetrics().height()) ); + qDebug() << "Change Clock font:" << button->height() << szH << szW << efflines << button->fontMetrics().height() << button->fontMetrics().lineSpacing(); + button->setStyleSheet("font-weight: bold; font-size: "+QString::number(szW)+"px;"); + }else{ + button->setStyleSheet("font-weight: bold;"); + }*/ + } + button->setText(label); + +} + +void LClock::updateFormats(){ + qDebug() << "Updating clock format"; + timefmt = LSession::handle()->sessionSettings()->value("TimeFormat","").toString(); + datefmt = LSession::handle()->sessionSettings()->value("DateFormat","").toString(); + deftime = timefmt.simplified().isEmpty(); + defdate = datefmt.simplified().isEmpty(); + //Adjust the timer interval based on the smallest unit displayed + if(deftime){ timer->setInterval(500); } //1/2 second + else if(timefmt.contains("z")){ timer->setInterval(1); } //every millisecond (smallest unit) + else if(timefmt.contains("s")){ timer->setInterval(500); } //1/2 second + else if(timefmt.contains("m")){ timer->setInterval(2000); } //2 seconds + else{ timer->setInterval(1000); } //unknown format - use 1 second interval + datetimeorder = LSession::handle()->sessionSettings()->value("DateTimeOrder", "timeonly").toString().toLower(); + //this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + updateTime(true); + //Now fix the size of the widget with the new size hint + this->setFixedWidth( this->sizeHint().width() +6); +} + +void LClock::updateMenu(){ + QDateTime cdt = QDateTime::currentDateTime(); + TZMenu->setTitle(QString(tr("Time Zone (%1)")).arg(cdt.timeZoneAbbreviation()) ); + calendar->showToday(); //make sure the current month is visible + calendar->setSelectedDate(QDate::currentDate()); //select the actual date for today +} + +void LClock::openMenu(){ + updateMenu(); + button->showMenu(); +} + +void LClock::closeMenu(){ + button->menu()->hide(); +} + +void LClock::ChangeTZ(QAction *act){ + LTHEME::setCustomEnvSetting("TZ",act->whatsThis()); + QTimer::singleShot(500, this, SLOT(updateTime()) ); +} + +void LClock::LocaleChange(){ + //Refresh all the time zone information + TZMenu->clear(); + TZMenu->addAction(tr("Use System Time")); + TZMenu->addSeparator(); + QList<QByteArray> TZList = QTimeZone::availableTimeZoneIds(); + //Orgnize time zones for smaller menus (Continent/Country/City) + // Note: id = Continent/City + QStringList info; + for(int i=0; i<TZList.length(); i++){ + QTimeZone tz(TZList[i]); + if(!QString(tz.id()).contains("/")){ continue; } + info << "::::"+QString(tz.id()).section("/",0,0)+"::::"+QLocale::countryToString(tz.country())+"::::"+QString(tz.id()).section("/",1,100).replace("_"," ")+"::::"+QString(tz.id()); + } + //Now sort alphabetically + info.sort(); + //Now create the menu tree + QString continent, country; //current continent/country + QMenu *tmpC=0; //continent menu + QMenu *tmpCM=0; //country menu + for(int i=0; i<info.length(); i++){ + //Check if different continent + if(info[i].section("::::",1,1)!=continent){ + if(tmpC!=0){ + if(tmpCM!=0 && !tmpCM->isEmpty()){ + tmpC->addMenu(tmpCM); + } + if(!tmpC->isEmpty()){ TZMenu->addMenu(tmpC); } + } + tmpC = new QMenu(this); + tmpC->setTitle(info[i].section("::::",1,1)); + tmpCM = new QMenu(this); + tmpCM->setTitle(info[i].section("::::",2,2)); + //Check if different country + }else if(info[i].section("::::",2,2)!=country){ + if(tmpC!=0 && tmpCM!=0 && !tmpCM->isEmpty()){ + tmpC->addMenu(tmpCM); + } + tmpCM = new QMenu(this); + tmpCM->setTitle(info[i].section("::::",2,2)); + } + //Now create the entry within the country menu + if(tmpCM!=0){ + QAction *act = new QAction(info[i].section("::::",3,3), this); + act->setWhatsThis(info[i].section("::::",4,4) ); + tmpCM->addAction(act); + } + //Save the values for the next run + continent = info[i].section("::::",1,1); + country = info[i].section("::::",2,2); + + if(i== info.length()-1){ + //last go through - save all menus + if(tmpCM!=0 && tmpC!=0 && !tmpCM->isEmpty()){ tmpC->addMenu(tmpCM); } + if(tmpC!=0 && !tmpC->isEmpty()){ TZMenu->addMenu(tmpC); } + } + } + +} + +void LClock::ThemeChange(){ + TZMenu->setIcon(LXDG::findIcon("clock","")); +} + +void LClock::OrientationChange(){ + if(this->layout()->direction()==QBoxLayout::LeftToRight){ + this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); + button->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); + }else{ + this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + } + updateTime(true); //re-adjust the font/spacings + this->layout()->update(); +} diff --git a/src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.h b/src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.h new file mode 100644 index 00000000..8131375d --- /dev/null +++ b/src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.h @@ -0,0 +1,56 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2012-2015, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_DESKTOP_CLOCK_H +#define _LUMINA_DESKTOP_CLOCK_H + +#include <QTimer> +#include <QDateTime> +#include <QLabel> +#include <QWidget> +#include <QString> +#include <QLocale> +#include <QTimeZone> +#include <QCalendarWidget> +#include <QWidgetAction> +#include <QAction> +#include <QToolButton> +#include <QMenu> + +#include "../LPPlugin.h" + +class LClock : public LPPlugin{ + Q_OBJECT +public: + LClock(QWidget *parent = 0, QString id = "clock", bool horizontal=true); + ~LClock(); + +private: + QTimer *timer; + QToolButton *button; + QString timefmt, datefmt, datetimeorder; + bool deftime, defdate; + QMenu *TZMenu; + QCalendarWidget *calendar; + QWidgetAction *calAct; + +private slots: + void updateTime(bool adjustformat = false); + void updateFormats(); + + void updateMenu(); + void openMenu(); + void closeMenu(); + + void ChangeTZ(QAction*); + +public slots: + void LocaleChange(); + void ThemeChange(); + void OrientationChange(); +}; + +#endif |