//============================================================================= // // File : KvsObject_trayIcon.cpp // Creation date : Wed Ago 25 17:28:45 2010 GMT by Carbone Alesssandro // // This file is part of the KVIrc irc client distribution // Copyright (C) 2009 Alessandro Carbone (elfonol at gmail dot com) // // 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 opinion) 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. // //============================================================================= #include "KvsObject_trayIcon.h" #include "KvsObject_popupMenu.h" #include "KviIconManager.h" #include "kvi_debug.h" #include "KviError.h" #include "KviLocale.h" #include /* @doc: trayicon @keyterms: trayicon object class @title: trayicon class @type: class @short: An implementation of the the system tray icon. @inherits: [class]object[/class] @description: This class provides a standard trayicon functionality.[br] @functions: !fn: setIcon(). Sets the tray icon. See the [doc:image_id]image identifier[/doc] documentation for the explaination of the parameter. !fn: setTooltip(). Sets the tray icon tooltip. !fn: show() Shows the tray icon. !fn: hide() Hides the tray icon. !fn: isVisible() Returns '1' if the tray icon is currently visible. !fn: showMessage(,,,) Shows a balloon message for the entry with the given title, message and message_icon for the time specified in millisecondsTimeoutHint. title and message must be plain text strings. Message can be clicked by the user; the messageClickedEvent() will be triggered when this occurs. Valid values for message_icon are: - NoIcon : No icon is shown. - Information : An information icon is shown. - Warning : A standard warning icon is shown. - Critical : A critical warning icon is shown. !fn: setContextMenu(). Associates the given with the tray icon. !fn: activatedEvent() This event is triggered when the user click the tray icon. If you reimplement this function the reason parameter will be passed as $0. Values for reason are: - Unknown : Unknown reason. - Context : The context menu for the tray icon was requested. - DoubleClick : The tray icon was double clicked. - Trigger : The tray icon was clicked. - MiddleClick : The tray icon was clicked with the middle mouse button. The default implementation emits the [classfnc]$activated[/classfnc]() signal. !fn: messageClickedEvent() This event is triggered when the message displayed using [classfnc]$showMessage[/classfnc]() was clicked by the user. The default implementation emits the [classfnc]$messageClicked[/classfnc]() signal. @signals: !sg: $activated() This signal is emitted by the default implementation of [classfnc]$activatedEvent[/classfnc]. !sg: $messageClicked() This signal is emitted by the default implementation of [classfnc]$messageClickedEvent[/classfnc]. */ KVSO_BEGIN_REGISTERCLASS(KvsObject_trayIcon,"trayicon","object") KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_trayIcon,show) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_trayIcon,hide) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_trayIcon,isVisible) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_trayIcon,setIcon) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_trayIcon,setTooltip) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_trayIcon,showMessage) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_trayIcon,setContextMenu) // events KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_trayIcon,activatedEvent) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_trayIcon,messageClickedEvent) KVSO_END_REGISTERCLASS(KvsObject_trayIcon) KVSO_BEGIN_CONSTRUCTOR(KvsObject_trayIcon,KviKvsObject) m_pTrayIcon = new QSystemTrayIcon(0); connect(m_pTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(slotActivated(QSystemTrayIcon::ActivationReason))); connect(m_pTrayIcon,SIGNAL(messageClicked()),this,SLOT(slotMessageClicked())); KVSO_END_CONSTRUCTOR(KvsObject_trayIcon) KVSO_BEGIN_DESTRUCTOR(KvsObject_trayIcon) delete m_pTrayIcon; KVSO_END_DESTRUCTOR(KvsObject_trayIcon) KVSO_CLASS_FUNCTION(trayIcon,setIcon) { CHECK_INTERNAL_POINTER(m_pTrayIcon) QString szIcon; KVSO_PARAMETERS_BEGIN(c) KVSO_PARAMETER("icon",KVS_PT_STRING,0,szIcon) KVSO_PARAMETERS_END(c) QPixmap * pix = g_pIconManager->getImage(szIcon); if(pix) m_pTrayIcon->setIcon(*pix); return true; } KVSO_CLASS_FUNCTION(trayIcon,setTooltip) { CHECK_INTERNAL_POINTER(m_pTrayIcon) QString szTooltip; KVSO_PARAMETERS_BEGIN(c) KVSO_PARAMETER("icon",KVS_PT_STRING,0,szTooltip) KVSO_PARAMETERS_END(c) m_pTrayIcon->setToolTip(szTooltip); return true; } KVSO_CLASS_FUNCTION(trayIcon,show) { CHECK_INTERNAL_POINTER(m_pTrayIcon) m_pTrayIcon->show(); return true; } KVSO_CLASS_FUNCTION(trayIcon,hide) { CHECK_INTERNAL_POINTER(m_pTrayIcon) m_pTrayIcon->show(); return true; } KVSO_CLASS_FUNCTION(trayIcon,isVisible) { CHECK_INTERNAL_POINTER(m_pTrayIcon) c->returnValue()->setBoolean(m_pTrayIcon->isVisible()); return true; } KVSO_CLASS_FUNCTION(trayIcon,showMessage) { CHECK_INTERNAL_POINTER(m_pTrayIcon) QString szMessage,szTitle,szMessageIcon; kvs_uint_t uTimeout; KVSO_PARAMETERS_BEGIN(c) KVSO_PARAMETER("title",KVS_PT_STRING,0,szTitle) KVSO_PARAMETER("message",KVS_PT_STRING,0,szMessage) KVSO_PARAMETER("icon",KVS_PT_STRING,0,szMessageIcon) KVSO_PARAMETER("timeout",KVS_PT_UINT,0,uTimeout) KVSO_PARAMETERS_END(c) QSystemTrayIcon::MessageIcon message=QSystemTrayIcon::NoIcon; if(KviQString::equalCI(szMessageIcon,"NoIcon")) message= QSystemTrayIcon::NoIcon; else if(KviQString::equalCI(szMessageIcon,"Information"))message= QSystemTrayIcon::Information; else if(KviQString::equalCI(szMessageIcon,"Warning")) message= QSystemTrayIcon::Warning; else if(KviQString::equalCI(szMessageIcon,"Critical")) message= QSystemTrayIcon::Critical; else c->warning(__tr2qs_ctx("Invalid message Icon: switch to default NoIcon '%Q'","objects"),&szMessageIcon); m_pTrayIcon->showMessage(szTitle,szMessage,message,uTimeout); return true; } KVSO_CLASS_FUNCTION(trayIcon,setContextMenu) { CHECK_INTERNAL_POINTER(m_pTrayIcon) KviKvsObject *ob; kvs_hobject_t hObject; KVSO_PARAMETERS_BEGIN(c) KVSO_PARAMETER("widget",KVS_PT_HOBJECT,0,hObject) KVSO_PARAMETERS_END(c) ob=KviKvsKernel::instance()->objectController()->lookupObject(hObject); if (!ob) { c->warning(__tr2qs_ctx("Widget parameter is not an object","objects")); return true; } if (!ob->object()) { c->warning(__tr2qs_ctx("Widget parameter is not a valid object","objects")); return true; } if(!ob->inheritsClass("popupmenu")) { c->warning(__tr2qs_ctx("Can't add a non-popupmenu object","objects")); return true; } m_pTrayIcon->setContextMenu(((QMenu *)(ob->object()))); return true; } KVSO_CLASS_FUNCTION(trayIcon,activatedEvent) { emitSignal("activated",c,c->params()); return true; } KVSO_CLASS_FUNCTION(trayIcon,messageClickedEvent) { emitSignal("messageClicked",c,c->params()); return true; } void KvsObject_trayIcon::slotMessageClicked() { KviKvsVariantList *lParams=0; callFunction(this,"messageClickedEvent",0,lParams); } void KvsObject_trayIcon::slotActivated(QSystemTrayIcon::ActivationReason reason) { QString szReason; if (reason==QSystemTrayIcon::Unknown) szReason="Unknown"; else if(reason==QSystemTrayIcon::Context) szReason="Context"; else if(reason==QSystemTrayIcon::DoubleClick) szReason="DoubleClick"; else if(reason==QSystemTrayIcon::Trigger) szReason="Trigger"; else szReason="MiddleClick"; KviKvsVariantList lParams; lParams.append(new KviKvsVariant(szReason)); callFunction(this,"activatedEvent",0,&lParams); } #ifndef COMPILE_USE_STANDALONE_MOC_SOURCES #include "m_KvsObject_trayIcon.moc" #endif //!COMPILE_USE_STANDALONE_MOC_SOURCES