From 425d2ba6f75053784b1b304646aea745fc4aeb94 Mon Sep 17 00:00:00 2001 From: Aurelien Gateau Date: Fri, 22 Jan 2010 15:12:15 +0100 Subject: [PATCH] Adds support for Message Indicator --- CMakeLists.txt | 5 ++ config-konversation.h.cmake | 3 +- src/CMakeLists.txt | 9 ++- src/config/konversation.kcfg | 17 +++++ src/config/messageindicator_config.ui | 69 ++++++++++++++++++ src/config/settingsdialog.cpp | 13 ++++ src/notificationhandler.cpp | 126 +++++++++++++++++++++++++++++++++ src/notificationhandler.h | 20 +++++- 8 files changed, 259 insertions(+), 3 deletions(-) create mode 100644 src/config/messageindicator_config.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index d2a3497..6084fd2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,7 @@ set(KDE_MIN_VERSION "4.00.82") #atm this gets us FindQt4 and FindX11 (provided that the default cmake FindQt4 doesn't get used) find_package(KDE4 REQUIRED) find_package(KdepimLibs REQUIRED) +find_package(PkgConfig REQUIRED) include(KDE4Defaults) include(MacroLibrary) include(CheckIncludeFile) @@ -37,6 +38,10 @@ macro_optional_find_package(QCA2) macro_bool_to_01(QCA2_FOUND HAVE_QCA2) macro_log_feature(QCA2_FOUND "QCA" "Qt Cryptographic Architecture" "http://delta.affinix.com/qca" FALSE "2.0.0" "Required for using encryption in IRC") +pkg_check_modules(INDICATEQT indicate-qt) +macro_bool_to_01(INDICATEQT_FOUND HAVE_INDICATEQT) +macro_log_feature(INDICATEQT_FOUND "libindicate-qt" "Qt binding for libindicate" "http://launchpad.net/libindicate-qt" FALSE "" "Support for message indicator") + #check for greater than 4.3.80 macro_ensure_version( "4.3.80" ${KDE_VERSION} HAVEKDE4_4 ) macro_bool_to_01(HAVEKDE4_4 HAVE_KSTATUSNOTIFIERITEM) diff --git a/config-konversation.h.cmake b/config-konversation.h.cmake index 3e235b5..df7621d 100644 --- a/config-konversation.h.cmake +++ b/config-konversation.h.cmake @@ -2,4 +2,5 @@ #cmakedefine HAVE_X11 1 #cmakedefine HAVE_XUTIL 1 #cmakedefine HAVE_QCA2 1 -#cmakedefine HAVE_KSTATUSNOTIFIERITEM 1 \ No newline at end of file +#cmakedefine HAVE_KSTATUSNOTIFIERITEM 1 +#cmakedefine HAVE_INDICATEQT 1 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5b0c92b..842777e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -126,6 +126,7 @@ kde4_add_ui_files(config_SRCS config/theme_configui.ui config/warnings_configui.ui config/watchednicknames_configui.ui + config/messageindicator_config.ui ) #=== Viewer @@ -198,6 +199,11 @@ if (QCA2_FOUND) cipher.cpp) endif (QCA2_FOUND) +if (INDICATEQT_FOUND) + include_directories(${INDICATEQT_INCLUDE_DIRS}) + link_directories(${INDICATEQT_LIBRARY_DIRS}) +endif (INDICATEQT_FOUND) + set(upnp_SRCS upnp/soap.cpp upnp/upnpdescriptionparser.cpp @@ -230,7 +236,8 @@ kde4_add_executable(konversation ${konversation_SRCS}) target_link_libraries(konversation ${KDE4_KIO_LIBS} ${KDE4_KUTILS_LIBS} ${KDE4_KPARTS_LIBS} ${KDE4_KDE3SUPPORT_LIBS} ${KDE4_KABC_LIBS} - ${KDE4_KNOTIFYCONFIG_LIBRARY} ${PHONON_LIBRARY} ${KDE4_SOLID_LIBS}) + ${KDE4_KNOTIFYCONFIG_LIBRARY} ${PHONON_LIBRARY} ${KDE4_SOLID_LIBS} + ${INDICATEQT_LIBRARIES}) if (X11_FOUND AND X11_Xutil_FOUND) target_link_libraries(konversation ${X11_X11_LIB}) diff --git a/src/config/konversation.kcfg b/src/config/konversation.kcfg index c2b3d23..9dfa725 100644 --- a/src/config/konversation.kcfg +++ b/src/config/konversation.kcfg @@ -518,6 +518,23 @@ + + + true + + + + + false + + + + + true + + + + 20 diff --git a/src/config/messageindicator_config.ui b/src/config/messageindicator_config.ui new file mode 100644 index 0000000..342004a --- /dev/null +++ b/src/config/messageindicator_config.ui @@ -0,0 +1,69 @@ + + + MessageIndicator_Config + + + + 0 + 0 + 400 + 155 + + + + Form + + + + + + Use Message Indicator + + + + + + If own nick appears in channel message + + + + + + + On any channel message + + + + + + + On query activity + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + kcfg_MessageIndicatorShowOwnNick + kcfg_MessageIndicatorShowChannel + kcfg_MessageIndicatorShowQuery + + + + diff --git a/src/config/settingsdialog.cpp b/src/config/settingsdialog.cpp index 8d85483..1bb6fb5 100644 --- a/src/config/settingsdialog.cpp +++ b/src/config/settingsdialog.cpp @@ -10,6 +10,7 @@ Copyright (C) 2006 Eike Hein */ +#include "config-konversation.h" #include "settingsdialog.h" #include "configdialog.h" #include "preferences.h" @@ -36,6 +37,10 @@ #include +#ifdef HAVE_INDICATEQT +#include "ui_messageindicator_config.h" +#endif + KonviSettingsDialog::KonviSettingsDialog( QWidget *parent) : KonviConfigDialog( parent, "settings", Preferences::self(), KPageDialog::Tree) @@ -174,6 +179,14 @@ KonviSettingsDialog::KonviSettingsDialog( QWidget *parent) : //no modified connection needed - it's all kcfg widgets m_pages.append(m_confOSDWdg); + #ifdef HAVE_INDICATEQT + //Notification/Message Indicator + Ui::MessageIndicator_Config confMessageIndicator; + w = new QWidget(); + confMessageIndicator.setupUi(w); + addPage(w, notificationGroup, "mail-unread-new", i18n("Message Indicator")); + #endif + //Notification/Warning Dialogs m_confWarningsWdg = new Warnings_Config( this, "Warnings" ); addPage ( m_confWarningsWdg, notificationGroup, "dialog-warning", i18n("Warning Dialogs") ); diff --git a/src/notificationhandler.cpp b/src/notificationhandler.cpp index 9f913ca..b9b86a6 100644 --- a/src/notificationhandler.cpp +++ b/src/notificationhandler.cpp @@ -18,11 +18,27 @@ #include "viewcontainer.h" #include "trayicon.h" #include "server.h" +#include "config-konversation.h" #include #include +#include +#ifdef HAVE_INDICATEQT +#include +#include + +class Indicator : public QIndicate::Indicator +{ + public: + Indicator(QIndicate::Server* server) + : QIndicate::Indicator(server) + {} + + QPointer m_chatWin; +}; +#endif namespace Konversation { @@ -31,6 +47,23 @@ namespace Konversation : QObject(parent) { m_mainWindow = parent->getMainWindow(); + #ifdef HAVE_INDICATEQT + m_indicateServer = QIndicate::Server::defaultInstance(); + m_indicateServer->setType("message.irc"); + QString appName = KGlobal::mainComponent().componentName(); + kDebug() << "appName" << appName; + KService::Ptr service = KService::serviceByDesktopName(appName); + if (service) { + m_indicateServer->setDesktopFile(service->entryPath()); + } else { + kWarning() << "Could not find desktop file for application"; + } + connect(m_indicateServer, SIGNAL(serverDisplay()), + SLOT(slotIndicateServerDisplay())); + m_indicateServer->show(); + + m_mainWindow->installEventFilter(this); + #endif } NotificationHandler::~NotificationHandler() @@ -42,6 +75,9 @@ namespace Konversation if (!chatWin || !chatWin->notificationsEnabled()) return; + if (Preferences::self()->messageIndicatorShowChannel()) + addIndicator(chatWin, fromNick); + if (Preferences::self()->disableNotifyWhileAway() && chatWin->getServer() && chatWin->getServer()->isAway()) return; @@ -70,6 +106,9 @@ namespace Konversation if (!chatWin || !chatWin->notificationsEnabled()) return; + if (Preferences::self()->messageIndicatorShowOwnNick()) + addIndicator(chatWin, fromNick); + if (Preferences::self()->disableNotifyWhileAway() && chatWin->getServer() && chatWin->getServer()->isAway()) return; @@ -96,6 +135,9 @@ namespace Konversation if (!chatWin || !chatWin->notificationsEnabled()) return; + if (Preferences::self()->messageIndicatorShowQuery()) + addIndicator(chatWin, fromNick); + if (Preferences::self()->disableNotifyWhileAway() && chatWin->getServer() && chatWin->getServer()->isAway()) return; @@ -372,6 +414,90 @@ namespace Konversation return cutup; } + void NotificationHandler::addIndicator(ChatWindow* chatWin, const QString& nick) + { + #ifdef HAVE_INDICATEQT + ViewContainer* viewContainer = m_mainWindow->getViewContainer(); + if (m_mainWindow->isActiveWindow() && chatWin == viewContainer->getFrontView()) { + // Do not show indicator if the user is already using this chat + // window + return; + } + Indicator* indicator = m_indicatorForChatWindow.value(chatWin); + if (!indicator) { + indicator = new Indicator(m_indicateServer); + indicator->m_chatWin = chatWin; + m_indicatorForChatWindow.insert(chatWin, indicator); + connect(chatWin, SIGNAL(closing(ChatWindow*)), SLOT(deleteIndicatorForChatWindow(ChatWindow*))); + connect(viewContainer, SIGNAL(viewChanged(ChatWindow*)), SLOT(slotViewChanged(ChatWindow*))); + + connect(indicator, SIGNAL(display(QIndicate::Indicator*)), SLOT(slotIndicatorDisplay(QIndicate::Indicator*))); + indicator->show(); + } + QString name; + if (chatWin->getType() == ChatWindow::Query) { + name = nick; + } else { + name = QString("%1 (%2)").arg(chatWin->getName()).arg(nick); + } + indicator->setNameProperty(name); + indicator->setTimeProperty(QDateTime::currentDateTime()); + indicator->setDrawAttentionProperty(true); + #endif + } + + void NotificationHandler::slotIndicatorDisplay(QIndicate::Indicator* _indicator) + { + #ifdef HAVE_INDICATEQT + Indicator* indicator = static_cast(_indicator); + ChatWindow* chatWin = indicator->m_chatWin; + m_indicatorForChatWindow.remove(chatWin); + delete indicator; + + m_mainWindow->show(); + KWindowSystem::forceActiveWindow(m_mainWindow->winId()); + if (chatWin) { + m_mainWindow->getViewContainer()->showView(chatWin); + chatWin->adjustFocus(); + } + #endif + } + + void NotificationHandler::slotIndicateServerDisplay() + { + m_mainWindow->show(); + KWindowSystem::forceActiveWindow(m_mainWindow->winId()); + } + + void NotificationHandler::deleteIndicatorForChatWindow(ChatWindow* chatWin) + { + #ifdef HAVE_INDICATEQT + delete m_indicatorForChatWindow.take(chatWin); + #endif + } + + void NotificationHandler::slotViewChanged(ChatWindow* chatWin) + { + #ifdef HAVE_INDICATEQT + deleteIndicatorForChatWindow(chatWin); + #endif + } + + bool NotificationHandler::eventFilter(QObject*, QEvent* event) + { + #ifdef HAVE_INDICATEQT + if (event->type() == QEvent::WindowActivate) { + ViewContainer* viewContainer = m_mainWindow->getViewContainer(); + QPointer chatWin = viewContainer->getFrontView(); + if (chatWin) { + deleteIndicatorForChatWindow(chatWin); + } + } + #else + Q_UNUSED(event); + #endif + return false; + } } #include "notificationhandler.moc" diff --git a/src/notificationhandler.h b/src/notificationhandler.h index e268449..b5cc78a 100644 --- a/src/notificationhandler.h +++ b/src/notificationhandler.h @@ -12,6 +12,7 @@ #ifndef KONVERSATIONNOTIFICATIONHANDLER_H #define KONVERSATIONNOTIFICATIONHANDLER_H +#include #include @@ -19,9 +20,15 @@ class ChatWindow; class Application; class MainWindow; -namespace Konversation +namespace QIndicate { + class Server; + class Indicator; +} +class Indicator; +namespace Konversation +{ class NotificationHandler : public QObject { Q_OBJECT @@ -54,9 +61,20 @@ namespace Konversation protected: void startTrayNotification(ChatWindow* chatWin); QString addLineBreaks(const QString& string); + virtual bool eventFilter(QObject*, QEvent*); + + private slots: + void slotIndicatorDisplay(QIndicate::Indicator*); + void slotIndicateServerDisplay(); + void deleteIndicatorForChatWindow(ChatWindow*); + void slotViewChanged(ChatWindow* chatWin); private: MainWindow* m_mainWindow; + QIndicate::Server* m_indicateServer; + QHash m_indicatorForChatWindow; + + void addIndicator(ChatWindow*, const QString& nick); }; } -- 1.6.5