-added tray icon notification
authorAlexander von Renteln <phon@quassel-irc.org>
Thu, 20 Mar 2008 00:28:30 +0000 (00:28 +0000)
committerAlexander von Renteln <phon@quassel-irc.org>
Thu, 20 Mar 2008 00:28:30 +0000 (00:28 +0000)
-nick widget is hidden in non channels

src/client/client.cpp
src/client/client.h
src/client/networkmodel.cpp
src/icons/icons.qrc
src/icons/quassel-icon-active.png [new file with mode: 0644]
src/qtui/mainwin.cpp
src/qtui/mainwin.h
src/qtui/nicklistwidget.cpp
src/qtui/nicklistwidget.h
version.inc

index e276cd8..1c4b446 100644 (file)
@@ -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);
   }
     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*/) {
 }
 
 void Client::recvStatusMsg(QString /*net*/, QString /*msg*/) {
index f7e0dc0..fad53ac 100644 (file)
@@ -119,6 +119,7 @@ signals:
   void backlogReceived(Buffer *, QList<Message>);
   void requestBacklog(BufferInfo, QVariant, QVariant);
   void requestNetworkStates();
   void backlogReceived(Buffer *, QList<Message>);
   void requestBacklog(BufferInfo, QVariant, QVariant);
   void requestNetworkStates();
+  void messageReceived(const Message &msg);
 
   void showConfigWizard(const QVariantMap &coredata);
 
 
   void showConfigWizard(const QVariantMap &coredata);
 
index 6b1a785..e40c505 100644 (file)
@@ -33,7 +33,6 @@
 
 #include "util.h" // get rid of this (needed for isChannelName)
 
 
 #include "util.h" // get rid of this (needed for isChannelName)
 
-// #define PHONDEV
 
 /*****************************************
 *  Fancy Buffer Items
 
 /*****************************************
 *  Fancy Buffer Items
index 187c37d..4ece047 100644 (file)
     </qresource>
     <qresource prefix="/icons" >
         <file>quassel-icon.png</file>
     </qresource>
     <qresource prefix="/icons" >
         <file>quassel-icon.png</file>
+        <file>quassel-icon-active.png</file>
     </qresource>
 </RCC>
     </qresource>
 </RCC>
diff --git a/src/icons/quassel-icon-active.png b/src/icons/quassel-icon-active.png
new file mode 100644 (file)
index 0000000..e834f95
Binary files /dev/null and b/src/icons/quassel-icon-active.png differ
index 1d1372d..e81eb88 100644 (file)
 MainWin::MainWin(QtUi *_gui, QWidget *parent)
   : QMainWindow(parent),
     gui(_gui),
 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");
     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..."));
   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();
   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."));
   show();
 
   statusBar()->showMessage(tr("Not connected to core."));
@@ -103,7 +107,6 @@ void MainWin::init() {
   setupInputWidget();
   setupSystray();
 
   setupInputWidget();
   setupSystray();
 
-  
   setupSettingsDlg();
 
   // restore mainwin state
   setupSettingsDlg();
 
   // restore mainwin state
@@ -200,9 +203,11 @@ void MainWin::setupNickWidget() {
   nickListWidget = new NickListWidget(nickDock);
   nickDock->setWidget(nickListWidget);
 
   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);
 
   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());
 
   // attach the NickListWidget to the BufferModel and the default selection
   nickListWidget->setModel(Client::bufferModel());
@@ -270,8 +275,11 @@ void MainWin::setupTopicWidget() {
 }
 
 void MainWin::setupSystray() {
 }
 
 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 = 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);
 
 //  systray->setToolTip("left click to minimize the quassel client to tray");
 //  systray->setToolTip(toolTip);
 
@@ -398,8 +406,9 @@ void MainWin::toggleVisibility() {
         showNormal();
 
     raise();
         showNormal();
 
     raise();
-    setFocus(Qt::ActiveWindowFocusReason);
-    // activateWindow();
+    activateWindow();
+    // setFocus(); //Qt::ActiveWindowFocusReason
+
   } else {
     if(systray->isSystemTrayAvailable ()) {
       clearFocus();
   } 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();
 void MainWin::showNetworkDlg() {
   SettingsPageDlg dlg(new NetworksSettingsPage(this), this);
   dlg.exec();
index 57c8bb3..32bf286 100644 (file)
@@ -27,6 +27,7 @@
 #include "bufferviewfilter.h"
 
 #include <QSystemTrayIcon>
 #include "bufferviewfilter.h"
 
 #include <QSystemTrayIcon>
+#include <QTimer>
 
 class ServerListDlg;
 class CoreConnectDlg;
 
 class ServerListDlg;
 class CoreConnectDlg;
@@ -49,6 +50,12 @@ class MainWin : public QMainWindow {
     QDockWidget *addBufferView(const QString &, QAbstractItemModel *, const BufferViewFilter::Modes &, const QList<NetworkId> &);
 
     AbstractUiMsg *layoutMsg(const Message &);
     QDockWidget *addBufferView(const QString &, QAbstractItemModel *, const BufferViewFilter::Modes &, const QList<NetworkId> &);
 
     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);
 
   protected:
     void closeEvent(QCloseEvent *event);
@@ -60,6 +67,7 @@ class MainWin : public QMainWindow {
     void systrayActivated( QSystemTrayIcon::ActivationReason );
 
   private slots:
     void systrayActivated( QSystemTrayIcon::ActivationReason );
 
   private slots:
+    void receiveMessage(const Message &msg);
     void showSettingsDlg();
     void showNetworkDlg();
     void showAboutDlg();
     void showSettingsDlg();
     void showNetworkDlg();
     void showAboutDlg();
@@ -74,6 +82,7 @@ class MainWin : public QMainWindow {
     void connectOrDisconnectFromNet();
 
     void changeTopic(const QString &topic);
     void connectOrDisconnectFromNet();
 
     void changeTopic(const QString &topic);
+    void makeTrayIconBlink();
 
   signals:
     void connectToCore(const QVariantMap &connInfo);
 
   signals:
     void connectToCore(const QVariantMap &connInfo);
@@ -101,6 +110,10 @@ class MainWin : public QMainWindow {
     void enableMenus();
 
     QSystemTrayIcon *systray;
     void enableMenus();
 
     QSystemTrayIcon *systray;
+    QIcon activeTrayIcon;
+    QIcon inactiveTrayIcon;
+    bool trayIconActive;
+    QTimer *timer;
 
     CoreConnectDlg *coreConnectDlg;
     SettingsDlg *settingsDlg;
 
     CoreConnectDlg *coreConnectDlg;
     SettingsDlg *settingsDlg;
index 714731a..68a6757 100644 (file)
 #include "networkmodel.h"
 #include "buffermodel.h"
 #include "nickviewfilter.h"
 #include "networkmodel.h"
 #include "buffermodel.h"
 #include "nickviewfilter.h"
+#include "qtuisettings.h"
 
 NickListWidget::NickListWidget(QWidget *parent)
 
 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);
   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 &current, const QModelIndex &previous) {
 }
 
 void NickListWidget::currentChanged(const QModelIndex &current, const QModelIndex &previous) {
@@ -40,7 +87,17 @@ void NickListWidget::currentChanged(const QModelIndex &current, const QModelInde
 
   if(bufferType != BufferInfo::ChannelBuffer) {
     ui.stackedWidget->setCurrentWidget(ui.emptyPage);
 
   if(bufferType != BufferInfo::ChannelBuffer) {
     ui.stackedWidget->setCurrentWidget(ui.emptyPage);
+    if(showDockAction() && showDockAction()->isChecked()) {
+      // hide
+      showDockAction()->trigger();
+    }
     return;
     return;
+  } else {
+    if(showNickListAction()->isChecked())
+      if(showDockAction()&& !showDockAction()->isChecked()) {
+        // show
+        showDockAction()->trigger();
+      }
   }
 
   if(newBufferId == oldBufferId)
   }
 
   if(newBufferId == oldBufferId)
index 8c26605..3a6dfe6 100644 (file)
@@ -38,6 +38,14 @@ class NickListWidget : public AbstractItemView {
 
 public:
   NickListWidget(QWidget *parent = 0);
 
 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;
 
 protected:
   virtual QSize sizeHint() const;
@@ -52,6 +60,8 @@ private slots:
 private:
   Ui::NickListWidget ui;
   QHash<BufferId, NickView *> nickViews;
 private:
   Ui::NickListWidget ui;
   QHash<BufferId, NickView *> nickViews;
+  QAction *_showNickListAction;
+  QPointer<QAction> _showDockAction;
 };
 
 #endif
 };
 
 #endif
index a20f51f..14b4ad2 100644 (file)
@@ -5,7 +5,7 @@
 
   quasselVersion = "0.2.0-alpha4-pre";
   quasselDate = "2008-03-18";
 
   quasselVersion = "0.2.0-alpha4-pre";
   quasselDate = "2008-03-18";
-  quasselBuild = 647;
+  quasselBuild = 649;
 
   //! Minimum client build number the core needs
   clientBuildNeeded = 642;
 
   //! Minimum client build number the core needs
   clientBuildNeeded = 642;