From: Alexander von Renteln Date: Thu, 20 Mar 2008 00:28:30 +0000 (+0000) Subject: -added tray icon notification X-Git-Tag: 0.2.0-alpha4~12 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=76a276c472cb99032e2407d8e4bc2f2d693e8e67 -added tray icon notification -nick widget is hidden in non channels --- diff --git a/src/client/client.cpp b/src/client/client.cpp index e276cd80..1c4b446e 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -475,6 +475,8 @@ void Client::recvMessage(const Message &message) { Message mmsg = Message(msg.timestamp(), msg.bufferInfo(), msg.type(), msg.text(), sender, msg.flags()); monitorBuffer()->appendMsg(mmsg); } + + emit messageReceived(msg); } void Client::recvStatusMsg(QString /*net*/, QString /*msg*/) { diff --git a/src/client/client.h b/src/client/client.h index f7e0dc01..fad53acf 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -119,6 +119,7 @@ signals: void backlogReceived(Buffer *, QList); void requestBacklog(BufferInfo, QVariant, QVariant); void requestNetworkStates(); + void messageReceived(const Message &msg); void showConfigWizard(const QVariantMap &coredata); diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index 6b1a785f..e40c5055 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -33,7 +33,6 @@ #include "util.h" // get rid of this (needed for isChannelName) -// #define PHONDEV /***************************************** * Fancy Buffer Items diff --git a/src/icons/icons.qrc b/src/icons/icons.qrc index 187c37d8..4ece047f 100644 --- a/src/icons/icons.qrc +++ b/src/icons/icons.qrc @@ -596,5 +596,6 @@ quassel-icon.png + quassel-icon-active.png diff --git a/src/icons/quassel-icon-active.png b/src/icons/quassel-icon-active.png new file mode 100644 index 00000000..e834f95c Binary files /dev/null and b/src/icons/quassel-icon-active.png differ diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 1d1372da..e81eb889 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -56,12 +56,16 @@ MainWin::MainWin(QtUi *_gui, QWidget *parent) : QMainWindow(parent), gui(_gui), + activeTrayIcon(":/icons/quassel-icon-active.png"), + inactiveTrayIcon(":/icons/quassel-icon.png"), + trayIconActive(false), + timer(new QTimer(this)), settingsDlg(new SettingsDlg(this)), debugConsole(new DebugConsole(this)) { ui.setupUi(this); setWindowTitle("Quassel IRC"); - setWindowIcon(QIcon(":icons/quassel-icon.png")); + setWindowIcon(inactiveTrayIcon); setWindowIconText("Quassel IRC"); statusBar()->showMessage(tr("Waiting for core...")); @@ -81,7 +85,7 @@ void MainWin::init() { connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), this, SLOT(clientNetworkCreated(NetworkId))); connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), this, SLOT(clientNetworkRemoved(NetworkId))); ui.bufferWidget->init(); - + show(); statusBar()->showMessage(tr("Not connected to core.")); @@ -103,7 +107,6 @@ void MainWin::init() { setupInputWidget(); setupSystray(); - setupSettingsDlg(); // restore mainwin state @@ -200,9 +203,11 @@ void MainWin::setupNickWidget() { nickListWidget = new NickListWidget(nickDock); nickDock->setWidget(nickListWidget); + nickListWidget->setShowDockAction(nickDock->toggleViewAction()); + connect(nickDock->toggleViewAction(), SIGNAL(toggled(bool)), nickListWidget, SLOT(changedVisibility(bool))); addDockWidget(Qt::RightDockWidgetArea, nickDock); - ui.menuViews->addAction(nickDock->toggleViewAction()); + ui.menuViews->addAction(nickListWidget->showNickListAction()); // attach the NickListWidget to the BufferModel and the default selection nickListWidget->setModel(Client::bufferModel()); @@ -270,8 +275,11 @@ void MainWin::setupTopicWidget() { } void MainWin::setupSystray() { + connect(timer, SIGNAL(timeout()), this, SLOT(makeTrayIconBlink())); + connect(Client::instance(), SIGNAL(messageReceived(const Message &)), this, SLOT(receiveMessage(const Message &))); + systray = new QSystemTrayIcon(this); - systray->setIcon(QIcon(":/icons/quassel-icon.png")); + systray->setIcon(inactiveTrayIcon); // systray->setToolTip("left click to minimize the quassel client to tray"); // systray->setToolTip(toolTip); @@ -398,8 +406,9 @@ void MainWin::toggleVisibility() { showNormal(); raise(); - setFocus(Qt::ActiveWindowFocusReason); - // activateWindow(); + activateWindow(); + // setFocus(); //Qt::ActiveWindowFocusReason + } else { if(systray->isSystemTrayAvailable ()) { clearFocus(); @@ -413,6 +422,57 @@ void MainWin::toggleVisibility() { } } +void MainWin::receiveMessage(const Message &msg) { + if(QApplication::activeWindow() != 0) + return; + + if(msg.flags() & Message::Highlight || msg.bufferInfo().type() == BufferInfo::QueryBuffer) { + QString title = msg.bufferInfo().bufferName();; + if(msg.bufferInfo().type() != BufferInfo::QueryBuffer) { + QString sender = msg.sender(); + int i = sender.indexOf("!"); + if(i != -1) + sender = sender.left(i); + title += QString(" - %1").arg(sender); + } + QString text = QtUi::style()->styleString(Message::mircToInternal(msg.text())).text; + displayTrayIconMessage(title, text); + QApplication::alert(this); + setTrayIconActivity(true); + } +} + +bool MainWin::event(QEvent *event) { + if(event->type() == QEvent::WindowActivate) + setTrayIconActivity(false); + return QMainWindow::event(event); +} + +void MainWin::displayTrayIconMessage(const QString &title, const QString &message) { + systray->showMessage(title, message); +} + +void MainWin::setTrayIconActivity(bool active) { + if(active) { + if(!timer->isActive()) + timer->start(500); + } else { + timer->stop(); + systray->setIcon(inactiveTrayIcon); + } +} + +void MainWin::makeTrayIconBlink() { + if(trayIconActive) { + systray->setIcon(inactiveTrayIcon); + trayIconActive = false; + } else { + systray->setIcon(activeTrayIcon); + trayIconActive = true; + } +} + + void MainWin::showNetworkDlg() { SettingsPageDlg dlg(new NetworksSettingsPage(this), this); dlg.exec(); diff --git a/src/qtui/mainwin.h b/src/qtui/mainwin.h index 57c8bb3d..32bf286e 100644 --- a/src/qtui/mainwin.h +++ b/src/qtui/mainwin.h @@ -27,6 +27,7 @@ #include "bufferviewfilter.h" #include +#include class ServerListDlg; class CoreConnectDlg; @@ -49,6 +50,12 @@ class MainWin : public QMainWindow { QDockWidget *addBufferView(const QString &, QAbstractItemModel *, const BufferViewFilter::Modes &, const QList &); AbstractUiMsg *layoutMsg(const Message &); + void displayTrayIconMessage(const QString &title, const QString &message); + + virtual bool event(QEvent *event); + + public slots: + void setTrayIconActivity(bool active = false); protected: void closeEvent(QCloseEvent *event); @@ -60,6 +67,7 @@ class MainWin : public QMainWindow { void systrayActivated( QSystemTrayIcon::ActivationReason ); private slots: + void receiveMessage(const Message &msg); void showSettingsDlg(); void showNetworkDlg(); void showAboutDlg(); @@ -74,6 +82,7 @@ class MainWin : public QMainWindow { void connectOrDisconnectFromNet(); void changeTopic(const QString &topic); + void makeTrayIconBlink(); signals: void connectToCore(const QVariantMap &connInfo); @@ -101,6 +110,10 @@ class MainWin : public QMainWindow { void enableMenus(); QSystemTrayIcon *systray; + QIcon activeTrayIcon; + QIcon inactiveTrayIcon; + bool trayIconActive; + QTimer *timer; CoreConnectDlg *coreConnectDlg; SettingsDlg *settingsDlg; diff --git a/src/qtui/nicklistwidget.cpp b/src/qtui/nicklistwidget.cpp index 714731a9..68a6757c 100644 --- a/src/qtui/nicklistwidget.cpp +++ b/src/qtui/nicklistwidget.cpp @@ -26,11 +26,58 @@ #include "networkmodel.h" #include "buffermodel.h" #include "nickviewfilter.h" +#include "qtuisettings.h" NickListWidget::NickListWidget(QWidget *parent) - : AbstractItemView(parent) + : AbstractItemView(parent), + _showNickListAction(new QAction(tr("Nicks"), this)), + _showDockAction(0) { + _showNickListAction->setCheckable(true); + QtUiSettings s; + _showNickListAction->setChecked(s.value("ShowNickListAction", QVariant(true)).toBool()); ui.setupUi(this); + connect(_showNickListAction, SIGNAL(toggled(bool)), this, SLOT(showWidget(bool))); +} + +NickListWidget::~NickListWidget() { + QtUiSettings s; + s.setValue("ShowNickListAction", showNickListAction()->isChecked()); +} + +void NickListWidget::setShowDockAction(QAction *action) { + _showDockAction = action; +} + +QAction *NickListWidget::showDockAction() const { + return _showDockAction; +} + +QAction *NickListWidget::showNickListAction() const { + return _showNickListAction; +} + +void NickListWidget::showWidget(bool visible) { + if(!selectionModel()) + return; + + QModelIndex currentIndex = selectionModel()->currentIndex(); + if(currentIndex.data(NetworkModel::BufferTypeRole) == BufferInfo::ChannelBuffer && showDockAction()) { + if(visible != showDockAction()->isChecked()) { + // show or hide + showDockAction()->trigger(); + } + } +} + +void NickListWidget::changedVisibility(bool visible) { + if(!selectionModel()) + return; + + QModelIndex currentIndex = selectionModel()->currentIndex(); + if(currentIndex.data(NetworkModel::BufferTypeRole) == BufferInfo::ChannelBuffer && !visible) { + showNickListAction()->setChecked(false); + } } void NickListWidget::currentChanged(const QModelIndex ¤t, const QModelIndex &previous) { @@ -40,7 +87,17 @@ void NickListWidget::currentChanged(const QModelIndex ¤t, const QModelInde if(bufferType != BufferInfo::ChannelBuffer) { ui.stackedWidget->setCurrentWidget(ui.emptyPage); + if(showDockAction() && showDockAction()->isChecked()) { + // hide + showDockAction()->trigger(); + } return; + } else { + if(showNickListAction()->isChecked()) + if(showDockAction()&& !showDockAction()->isChecked()) { + // show + showDockAction()->trigger(); + } } if(newBufferId == oldBufferId) diff --git a/src/qtui/nicklistwidget.h b/src/qtui/nicklistwidget.h index 8c266052..3a6dfe6a 100644 --- a/src/qtui/nicklistwidget.h +++ b/src/qtui/nicklistwidget.h @@ -38,6 +38,14 @@ class NickListWidget : public AbstractItemView { public: NickListWidget(QWidget *parent = 0); + ~NickListWidget(); + void setShowDockAction(QAction *action); + QAction *showDockAction() const; + QAction *showNickListAction() const; + +public slots: + void changedVisibility(bool visible); + void showWidget(bool visible); protected: virtual QSize sizeHint() const; @@ -52,6 +60,8 @@ private slots: private: Ui::NickListWidget ui; QHash nickViews; + QAction *_showNickListAction; + QPointer _showDockAction; }; #endif diff --git a/version.inc b/version.inc index a20f51f6..14b4ad24 100644 --- a/version.inc +++ b/version.inc @@ -5,7 +5,7 @@ quasselVersion = "0.2.0-alpha4-pre"; quasselDate = "2008-03-18"; - quasselBuild = 647; + quasselBuild = 649; //! Minimum client build number the core needs clientBuildNeeded = 642;