2 kopeteonlinestatus.cpp - Kopete Online Status
4 Copyright (c) 2003 by Martijn Klingens <klingens@kde.org>
5 Copyright (c) 2003 by Duncan Mac-Vicar Prett <duncan@kde.org>
6 Copyright (c) 2003 by Will Stephenson <wstephenson@kde.org>
7 Copyright (c) 2004-2008 by Olivier Goffart <ogoffart@kde.org>
9 Kopete (c) 2002-2007 by the Kopete developers <kopete-devel@kde.org>
11 *************************************************************************
13 * This library is free software; you can redistribute it and/or *
14 * modify it under the terms of the GNU Lesser General Public *
15 * License as published by the Free Software Foundation; either *
16 * version 2 of the License, or (at your option) any later version. *
18 *************************************************************************
21 #include "kopeteonlinestatus.h"
22 #include "kopeteonlinestatusmanager.h"
24 #include "kopeteidentity.h"
25 #include "kopeteprotocol.h"
26 #include "kopeteaccount.h"
27 #include "kopetecontact.h"
28 #include <kiconloader.h>
29 #include <kiconeffect.h>
33 #include <QIconEngineV2>
39 class OnlineStatusIconEngine
: public QIconEngineV2
42 OnlineStatusIconEngine( const OnlineStatus
&s
, const QString
& i
,
43 const QColor
&c
, bool _idle
)
44 : status(s
) , icon(i
), color(c
), idle(_idle
) {}
46 virtual QIconEngineV2
*clone() const
47 { return new OnlineStatusIconEngine(status
,icon
,color
,idle
); }
49 virtual QString
key () const
50 { return OnlineStatusManager::self()->fingerprint( status
, icon
, 0, color
, idle
); }
52 QPixmap
pixmap ( const QSize
& size
, QIcon::Mode mode
, QIcon::State state
)
54 const int iconSize
= qMin(size
.width(), size
.height());
55 QIcon
i(OnlineStatusManager::self()->cacheLookupByObject( status
, icon
, iconSize
, color
, idle
));
56 return i
.pixmap(size
, mode
, state
);
59 void paint( QPainter
* painter
, const QRect
& rect
, QIcon::Mode mode
, QIcon::State state
)
61 QPixmap pix
= pixmap(rect
.size() , mode
, state
);
62 painter
->drawPixmap(rect
, pix
);
74 using namespace Kopete
;
76 class OnlineStatus::Private
83 unsigned internalStatus
;
84 QStringList overlayIcons
;
87 OnlineStatusManager::Categories categories
;
88 OnlineStatusManager::Options options
;
91 QString
protocolIcon() const
93 return protocol
? protocol
->pluginIcon() : QString::fromLatin1( "unknown" );
98 * This is required by some plugins, when a status need to be stored on
99 * the disk, to avoid problems.
103 OnlineStatus::StatusType status
;
106 { OnlineStatus::Unknown
, "Unknown" },
107 { OnlineStatus::Offline
, "Offline" },
108 { OnlineStatus::Connecting
, "Connecting" },
109 { OnlineStatus::Invisible
, "Invisible" },
110 { OnlineStatus::Online
, "Online"},
111 { OnlineStatus::Away
, "Away" } };
113 OnlineStatus::OnlineStatus( StatusType status
, unsigned weight
, Protocol
*protocol
,
114 unsigned internalStatus
, const QStringList
&overlayIcons
, const QString
&description
)
118 d
->internalStatus
= internalStatus
;
120 d
->overlayIcons
= overlayIcons
;
121 d
->protocol
= protocol
;
122 d
->description
= description
;
123 d
->categories
= 0x00;
127 OnlineStatus::OnlineStatus( StatusType status
, unsigned weight
, Protocol
*protocol
, unsigned internalStatus
,
128 const QStringList
&overlayIcons
, const QString
&description
, const QString
&caption
, OnlineStatusManager::Categories categories
, OnlineStatusManager::Options options
)
132 d
->internalStatus
= internalStatus
;
134 d
->overlayIcons
= overlayIcons
;
135 d
->protocol
= protocol
;
136 d
->description
= description
;
137 d
->caption
= caption
;
138 d
->categories
= categories
;
139 d
->options
= options
;
141 OnlineStatusManager::self()->registerOnlineStatus( *this );
144 OnlineStatus::OnlineStatus( StatusType status
)
148 d
->internalStatus
= 0;
151 d
->categories
= 0x00;
157 d
->description
= i18n( "Online" );
160 d
->description
= i18n( "Away" );
163 d
->description
= i18n( "Connecting" );
166 d
->description
= i18n( "Invisible" );
169 d
->description
= i18n( "Offline" );
173 d
->description
= i18n( "Unknown" );
174 d
->overlayIcons
= QStringList( QString::fromLatin1("status_unknown") );
180 OnlineStatus::OnlineStatus()
184 d
->internalStatus
= 0;
187 d
->overlayIcons
= QStringList( QString::fromLatin1( "status_unknown" ) );
188 d
->categories
= 0x00;
192 OnlineStatus::OnlineStatus( const OnlineStatus
&other
)
197 bool OnlineStatus::operator==( const OnlineStatus
&other
) const
199 if ( d
->internalStatus
== other
.d
->internalStatus
&& d
->protocol
== other
.d
->protocol
&&
200 d
->weight
== other
.d
->weight
&& d
->overlayIcons
== other
.d
->overlayIcons
&&
201 d
->description
== other
.d
->description
)
209 bool OnlineStatus::operator!=( const OnlineStatus
&other
) const
211 return !(*this == other
);
215 bool OnlineStatus::operator>( const OnlineStatus
&other
) const
217 if( d
->status
== other
.d
->status
)
218 return d
->weight
> other
.d
->weight
;
220 return d
->status
> other
.d
->status
;
223 bool OnlineStatus::operator<( const OnlineStatus
&other
) const
225 if( d
->status
== other
.d
->status
)
226 return d
->weight
< other
.d
->weight
;
228 return d
->status
< other
.d
->status
;
231 OnlineStatus
& OnlineStatus::operator=( const OnlineStatus
&other
)
237 OnlineStatus::~OnlineStatus()
241 OnlineStatus::StatusType
OnlineStatus::status() const
246 unsigned OnlineStatus::internalStatus() const
248 return d
->internalStatus
;
251 unsigned OnlineStatus::weight() const
256 QStringList
OnlineStatus::overlayIcons() const
258 return d
->overlayIcons
;
261 QString
OnlineStatus::description() const
263 return d
->description
;
266 Protocol
* OnlineStatus::protocol() const
271 QString
OnlineStatus::caption() const
276 OnlineStatusManager::Categories
OnlineStatus::categories() const
278 return d
->categories
;
281 OnlineStatusManager::Options
OnlineStatus::options() const
286 bool OnlineStatus::isDefinitelyOnline() const
288 if ( status() == Offline
|| status() == Connecting
|| status() == Unknown
)
293 QIcon
OnlineStatus::iconFor( const Contact
*contact
) const
295 QString iconName
= contact
->icon();
296 if ( iconName
.isNull() )
297 iconName
= contact
->account()->customIcon();
298 if ( iconName
.isNull() )
299 iconName
= d
->protocolIcon();
300 return QIcon(new OnlineStatusIconEngine( *this, iconName
,
301 contact
->account()->color(), contact
->idleTime() >= 10*60));
305 QString
OnlineStatus::mimeSourceFor( const Contact
*contact
, int size
) const
307 // figure out what icon we should use for this contact
308 QString iconName
= contact
->icon();
309 if ( iconName
.isNull() )
310 iconName
= contact
->account()->customIcon();
311 if ( iconName
.isNull() )
312 iconName
= d
->protocolIcon();
315 return mimeSource( iconName
, size
, contact
->account()->color(),contact
->idleTime() >= 10*60 );
318 QIcon
OnlineStatus::iconFor( const Account
*account
) const
320 QString iconName
= account
->customIcon();
321 if ( iconName
.isNull() )
322 iconName
= d
->protocolIcon();
323 return QIcon(new OnlineStatusIconEngine(*this, iconName
, account
->color(),false));
327 QString
OnlineStatus::mimeSourceFor( const Account
*account
, int size
) const
329 QString iconName
= account
->customIcon();
330 if ( iconName
.isNull() )
331 iconName
= d
->protocolIcon();
333 return mimeSource( iconName
, size
, account
->color(), false );
336 QPixmap
OnlineStatus::iconFor( const QString
&mimeSource
) const
338 return OnlineStatusManager::self()->cacheLookupByMimeSource( mimeSource
);
341 QPixmap
OnlineStatus::protocolIcon() const
343 return OnlineStatusManager::self()->cacheLookupByObject( *this, d
->protocolIcon() , 16, QColor() );
346 QString
OnlineStatus::mimeSource( const QString
& icon
, int size
, QColor color
, bool idle
) const
348 // make sure the item is in the cache
349 OnlineStatusManager::self()->cacheLookupByObject( *this, icon
, size
, color
, idle
);
350 // now return the fingerprint instead
351 return OnlineStatusManager::self()->fingerprint( *this, icon
, size
, color
, idle
);
354 QString
OnlineStatus::statusTypeToString(OnlineStatus::StatusType statusType
)
356 const int size
= sizeof(statusNames
) / sizeof(statusNames
[0]);
358 for (int i
=0; i
< size
; i
++)
359 if (statusNames
[i
].status
== statusType
)
360 return QString::fromLatin1(statusNames
[i
].name
);
362 return QString::fromLatin1(statusNames
[0].name
); // Unknown
365 OnlineStatus::StatusType
OnlineStatus::statusStringToType(const QString
& string
)
367 int size
= sizeof(statusNames
) / sizeof(statusNames
[0]);
369 for (int i
=0; i
< size
; i
++)
370 if (QString::fromLatin1(statusNames
[i
].name
) == string
)
371 return statusNames
[i
].status
;
373 return OnlineStatus::Unknown
;
376 // vim: set noet ts=4 sts=4 sw=4: