You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdepim/karm/tray.cpp

169 lines
3.6 KiB

/*
* KTray.
*
* This implements the functionality of the little icon in the kpanel
* tray. Among which are tool tips and the running clock animated icon
*
* Distributed under the GPL.
*/
// #include <qkeycode.h>
// #include <qlayout.h>
#include <qpixmap.h>
#include <qptrlist.h>
#include <qstring.h>
#include <qtimer.h>
#include <qtooltip.h>
#include <kaction.h> // actionPreferences()
#include <kglobal.h>
#include <kglobalsettings.h>
#include <kiconloader.h> // UserIcon
#include <klocale.h> // i18n
#include <kpopupmenu.h> // plug()
#include <ksystemtray.h>
#include "mainwindow.h"
#include "task.h"
#include "tray.h"
QPtrVector<QPixmap> *KarmTray::icons = 0;
KarmTray::KarmTray(MainWindow* parent)
: KSystemTray(parent, "Karm 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 QPtrVector<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);
}
}
parent->actionPreferences->plug( contextMenu() );
parent->actionStopAll->plug( contextMenu() );
resetClock();
initToolTip();
// start of a kind of menu for the tray
// this are experiments/tests
/*
for (int i=0; i<30; i++)
_tray->insertTitle(i 18n("bla ").arg(i));
for (int i=0; i<30; i++)
_tray->insertTitle2(i 18n("bli ").arg(i));
*/
// experimenting with menus for the tray
/*
trayPopupMenu = contextMenu();
trayPopupMenu2 = new QPopupMenu();
trayPopupMenu->insertItem(i18n("Submenu"), *trayPopupMenu2);
*/
}
KarmTray::KarmTray(karmPart * parent)
: KSystemTray( 0 , "Karm Tray")
{
// it is not convenient if every kpart gets an icon in the systray.
_taskActiveTimer = 0;
}
KarmTray::~KarmTray()
{
}
// experiment
/*
void KarmTray::insertTitle(QString title)
{
trayPopupMenu->insertTitle(title);
}
*/
void KarmTray::startClock()
{
if ( _taskActiveTimer )
{
_taskActiveTimer->start(1000);
setPixmap( *(*icons)[_activeIcon] );
show();
}
}
void KarmTray::stopClock()
{
if ( _taskActiveTimer )
{
_taskActiveTimer->stop();
show();
}
}
void KarmTray::advanceClock()
{
_activeIcon = (_activeIcon+1) % 8;
setPixmap( *(*icons)[_activeIcon]);
}
void KarmTray::resetClock()
{
_activeIcon = 0;
setPixmap( *(*icons)[_activeIcon]);
show();
}
void KarmTray::initToolTip()
{
updateToolTip(QPtrList<Task> ());
}
void KarmTray::updateToolTip(QPtrList<Task> activeTasks)
{
if ( activeTasks.isEmpty() ) {
QToolTip::add( this, 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(this).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.
QPtrListIterator<Task> item( activeTasks );
for ( int i = 0; item.current(); ++item, ++i ) {
Task* task = item.current();
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;
}
QToolTip::add( this, qTip );
}
#include "tray.moc"