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 backlogReceived(Buffer *, QList<Message>);
void requestBacklog(BufferInfo, QVariant, QVariant);
void requestNetworkStates();
+ void messageReceived(const Message &msg);
void showConfigWizard(const QVariantMap &coredata);
#include "util.h" // get rid of this (needed for isChannelName)
-// #define PHONDEV
/*****************************************
* Fancy Buffer Items
</qresource>
<qresource prefix="/icons" >
<file>quassel-icon.png</file>
+ <file>quassel-icon-active.png</file>
</qresource>
</RCC>
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..."));
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."));
setupInputWidget();
setupSystray();
-
setupSettingsDlg();
// restore mainwin state
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());
}
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);
showNormal();
raise();
- setFocus(Qt::ActiveWindowFocusReason);
- // activateWindow();
+ activateWindow();
+ // setFocus(); //Qt::ActiveWindowFocusReason
+
} else {
if(systray->isSystemTrayAvailable ()) {
clearFocus();
}
}
+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();
#include "bufferviewfilter.h"
#include <QSystemTrayIcon>
+#include <QTimer>
class ServerListDlg;
class CoreConnectDlg;
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);
void systrayActivated( QSystemTrayIcon::ActivationReason );
private slots:
+ void receiveMessage(const Message &msg);
void showSettingsDlg();
void showNetworkDlg();
void showAboutDlg();
void connectOrDisconnectFromNet();
void changeTopic(const QString &topic);
+ void makeTrayIconBlink();
signals:
void connectToCore(const QVariantMap &connInfo);
void enableMenus();
QSystemTrayIcon *systray;
+ QIcon activeTrayIcon;
+ QIcon inactiveTrayIcon;
+ bool trayIconActive;
+ QTimer *timer;
CoreConnectDlg *coreConnectDlg;
SettingsDlg *settingsDlg;
#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) {
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)
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;
private:
Ui::NickListWidget ui;
QHash<BufferId, NickView *> nickViews;
+ QAction *_showNickListAction;
+ QPointer<QAction> _showDockAction;
};
#endif
quasselVersion = "0.2.0-alpha4-pre";
quasselDate = "2008-03-18";
- quasselBuild = 647;
+ quasselBuild = 649;
//! Minimum client build number the core needs
clientBuildNeeded = 642;