mirror of
https://bitbucket.org/smil3y/kde-playground.git
synced 2025-02-23 18:32:51 +00:00
177 lines
4.6 KiB
C++
177 lines
4.6 KiB
C++
/*
|
|
* Copyright (C) 2003 by Scott Monachello <smonach@cox.net>
|
|
*
|
|
* 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 2 of the License, 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, write to the
|
|
* Free Software Foundation, Inc.
|
|
* 51 Franklin Street, Fifth Floor
|
|
* Boston, MA 02110-1301 USA.
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* TrayIcon.
|
|
*
|
|
* This implements the functionality of the little icon in the kpanel
|
|
* tray. Among which are tool tips and the running clock animated icon
|
|
*/
|
|
|
|
#include "tray.h"
|
|
|
|
#include <QPixmap>
|
|
#include <QString>
|
|
#include <QTimer>
|
|
#include <QToolTip>
|
|
#include <QMenu>
|
|
|
|
#include <KAction>
|
|
#include <KGlobalSettings>
|
|
#include <KLocale>
|
|
#include <KMenu>
|
|
#include <KDebug>
|
|
#include "mainwindow.h"
|
|
#include "task.h"
|
|
#include "timetrackerwidget.h"
|
|
|
|
QVector<QPixmap*> *TrayIcon::icons = 0;
|
|
|
|
TrayIcon::TrayIcon(MainWindow* parent)
|
|
: KStatusNotifierItem(parent)
|
|
{
|
|
setObjectName( "Ktimetracker Tray" );
|
|
// the timer that updates the "running" icon in the tray
|
|
_taskActiveTimer = new QTimer(this);
|
|
connect( _taskActiveTimer, SIGNAL(timeout()), this,
|
|
SLOT(advanceClock()) );
|
|
|
|
if (icons == 0)
|
|
{
|
|
icons = new QVector<QPixmap*>(8);
|
|
for (int i=0; i<8; ++i)
|
|
{
|
|
QPixmap *icon = new QPixmap();
|
|
QString name;
|
|
name.sprintf("active-icon-%d.xpm",i);
|
|
*icon = UserIcon(name);
|
|
icons->insert(i,icon);
|
|
}
|
|
}
|
|
TimetrackerWidget *timetrackerWidget = static_cast< TimetrackerWidget * >( parent->centralWidget() );
|
|
if ( timetrackerWidget )
|
|
{
|
|
KAction *action = timetrackerWidget->action( "configure_ktimetracker" );
|
|
if ( action ) contextMenu()->addAction( action );
|
|
action = timetrackerWidget->action( "stopAll" );
|
|
if ( action ) contextMenu()->addAction( action );
|
|
}
|
|
resetClock();
|
|
initToolTip();
|
|
}
|
|
|
|
TrayIcon::TrayIcon(ktimetrackerpart *)
|
|
: KStatusNotifierItem( 0 )
|
|
{
|
|
setObjectName( "Ktimetracker Tray" );
|
|
// it is not convenient if every kpart gets an icon in the systray.
|
|
_taskActiveTimer = 0;
|
|
}
|
|
|
|
TrayIcon::TrayIcon()
|
|
: KStatusNotifierItem( 0 )
|
|
// will display nothing at all
|
|
{
|
|
setObjectName( "Ktimetracker Tray" );
|
|
_taskActiveTimer = 0;
|
|
}
|
|
|
|
TrayIcon::~TrayIcon()
|
|
{
|
|
}
|
|
|
|
void TrayIcon::startClock()
|
|
{
|
|
kDebug(5970) << "Entering function";
|
|
if ( _taskActiveTimer )
|
|
{
|
|
_taskActiveTimer->start(1000);
|
|
setIconByPixmap( *(*icons)[_activeIcon] );
|
|
}
|
|
kDebug(5970) << "Leaving function";
|
|
}
|
|
|
|
void TrayIcon::stopClock()
|
|
{
|
|
kDebug(5970) << "Entering function";
|
|
if ( _taskActiveTimer )
|
|
{
|
|
_taskActiveTimer->stop();
|
|
}
|
|
kDebug(5970) << "Leaving function";
|
|
}
|
|
|
|
void TrayIcon::advanceClock()
|
|
{
|
|
_activeIcon = (_activeIcon+1) % 8;
|
|
setIconByPixmap( *(*icons)[_activeIcon]);
|
|
}
|
|
|
|
void TrayIcon::resetClock()
|
|
{
|
|
_activeIcon = 0;
|
|
setIconByPixmap( *(*icons)[_activeIcon]);
|
|
}
|
|
|
|
void TrayIcon::initToolTip()
|
|
{
|
|
updateToolTip(QList<Task*> ());
|
|
}
|
|
|
|
void TrayIcon::updateToolTip(QList<Task*> activeTasks)
|
|
{
|
|
if ( activeTasks.isEmpty() )
|
|
{
|
|
this->setToolTip( "ktimetracker", "ktimetracker", i18n("No active tasks") );
|
|
return;
|
|
}
|
|
|
|
QFontMetrics fm( QToolTip::font() );
|
|
const QString continued = i18n( ", ..." );
|
|
const int buffer = fm.boundingRect( continued ).width();
|
|
const int desktopWidth = KGlobalSettings::desktopGeometry(associatedWidget()).width();
|
|
const int maxWidth = desktopWidth - buffer;
|
|
|
|
QString qTip;
|
|
QString s;
|
|
|
|
// Build the tool tip with all of the names of the active tasks.
|
|
// If at any time the width of the tool tip is larger than the desktop,
|
|
// stop building it.
|
|
|
|
for ( int i = 0; i < activeTasks.count(); ++i )
|
|
{
|
|
Task* task = activeTasks.at( i );
|
|
if ( i > 0 )
|
|
s += i18n( ", " ) + task->name();
|
|
else
|
|
s += task->name();
|
|
int width = fm.boundingRect( s ).width();
|
|
if ( width > maxWidth )
|
|
{
|
|
qTip += continued;
|
|
break;
|
|
}
|
|
qTip = s;
|
|
}
|
|
this->setToolTip( "ktimetracker", "ktimetracker", qTip );
|
|
}
|
|
|