From e7696b65e76e50137b8bab0ec3e43ce66a94f190 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Wed, 30 Jan 2008 00:43:40 +0000 Subject: [PATCH] - implemented on request a chat monitor: a simple buffer which shows all new messages of all buffers. (no backlog data (yet?)) - quassel restores now it's size --- src/client/client.cpp | 12 ++++ src/client/client.h | 3 + src/qtui/chatwidget.cpp | 18 +++-- src/qtui/chatwidget.h | 3 +- src/qtui/mainwin.cpp | 143 +++++++++++++++++++++++-------------- src/qtui/mainwin.h | 5 ++ src/qtui/ui/inputwidget.ui | 10 ++- src/qtui/ui/topicwidget.ui | 6 +- version.inc | 4 +- 9 files changed, 137 insertions(+), 67 deletions(-) diff --git a/src/client/client.cpp b/src/client/client.cpp index 3c27145b..772601f5 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -65,6 +65,7 @@ Client::Client(QObject *parent) _connectedToCore(false), _syncedToCore(false) { + _monitorBuffer = new Buffer(BufferInfo(), this); } Client::~Client() { @@ -165,6 +166,10 @@ Buffer *Client::buffer(BufferInfo id) { return buff; } +Buffer *Client::monitorBuffer() { + return instance()->_monitorBuffer; +} + NetworkModel *Client::networkModel() { return instance()->_networkModel; @@ -419,6 +424,13 @@ void Client::recvMessage(const Message &msg) { Buffer *b = buffer(msg.buffer()); b->appendMsg(msg); networkModel()->updateBufferActivity(msg); + + if(msg.type() == Message::Plain || msg.type() == Message::Notice || msg.type() == Message::Action) { + QString sender = msg.buffer().network() + ":" + msg.buffer().buffer() + ":" + msg.sender(); + Message mmsg = Message(msg.timestamp(), msg.buffer(), msg.type(), msg.text(), sender, msg.flags()); + monitorBuffer()->appendMsg(mmsg); + } + } void Client::recvStatusMsg(QString /*net*/, QString /*msg*/) { diff --git a/src/client/client.h b/src/client/client.h index 95f30a35..a9580570 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -59,6 +59,7 @@ public: static QList buffers(); static Buffer *buffer(BufferId bufferUid); static Buffer *buffer(BufferInfo); + static Buffer *monitorBuffer(); static QList networkIds(); static const Network * network(NetworkId); @@ -206,6 +207,8 @@ private: QHash _networks; QHash _identities; + Buffer *_monitorBuffer; + QTimer *layoutTimer; QList layoutQueue; diff --git a/src/qtui/chatwidget.cpp b/src/qtui/chatwidget.cpp index e488f03e..ced9b6b1 100644 --- a/src/qtui/chatwidget.cpp +++ b/src/qtui/chatwidget.cpp @@ -32,9 +32,9 @@ ChatWidget::ChatWidget(QWidget *parent) : QAbstractScrollArea(parent) { scrollTimer = new QTimer(this); scrollTimer->setSingleShot(false); scrollTimer->setInterval(100); + // setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); - setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - setMinimumSize(QSize(400,400)); + setMinimumSize(QSize(20,20)); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); bottomLine = -1; @@ -62,7 +62,7 @@ void ChatWidget::init(BufferId id) { //verticalScrollBar()->setMinimum(0); //verticalScrollBar()->setMaximum((int)height - verticalScrollBar()->pageStep()); - setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + // setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); setMouseTracking(true); mouseMode = Normal; selectionMode = NoSelection; @@ -81,11 +81,15 @@ ChatWidget::~ChatWidget() { s.setValue(QString("%1/SenderColumnWidth").arg(bufferId.toInt()), senderWidth); } -QSize ChatWidget::sizeHint() const { - //qDebug() << size(); - return size(); +QSize ChatWidget::minimumSizeHint() const { + return QSize(20, 20); } +// QSize ChatWidget::sizeHint() const { +// //qDebug() << size(); +// return size(); +// } + void ChatWidget::adjustScrollBar() { verticalScrollBar()->setPageStep(viewport()->height()); verticalScrollBar()->setSingleStep(20); @@ -252,7 +256,7 @@ void ChatWidget::resizeEvent(QResizeEvent *event) { /*if(event->oldSize().isValid())*/ //contents->setWidth(event->size().width()); //setAlignment(Qt::AlignBottom); - if(event->size().width() != event->oldSize().width()) { + if(event->size() != event->oldSize()) { computePositions(); layout(); } diff --git a/src/qtui/chatwidget.h b/src/qtui/chatwidget.h index 8e32783c..305af689 100644 --- a/src/qtui/chatwidget.h +++ b/src/qtui/chatwidget.h @@ -47,7 +47,8 @@ class ChatWidget : public QAbstractScrollArea { ~ChatWidget(); void init(BufferId id); - virtual QSize sizeHint() const; + virtual QSize minimumSizeHint() const; + // virtual QSize sizeHint() const; public slots: void clear(); diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index a45bfc1d..cdbe71b9 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -21,6 +21,7 @@ #include "mainwin.h" +#include "chatwidget.h" #include "bufferview.h" #include "chatline-old.h" #include "client.h" @@ -59,6 +60,9 @@ MainWin::MainWin(QtUi *_gui, QWidget *parent) : QMainWindow(parent), gui(_gui) { } void MainWin::init() { + UiSettings s; + resize(s.value("MainWinSize").toSize()); + Client::signalProxy()->attachSignal(this, SIGNAL(requestBacklog(BufferInfo, QVariant, QVariant))); Client::signalProxy()->attachSignal(this, SIGNAL(disconnectFromNetwork(NetworkId))); ui.bufferWidget->init(); @@ -71,6 +75,7 @@ void MainWin::init() { //connectToCore(connInfo); statusBar()->showMessage(tr("Not connected to core.")); + systray = new QSystemTrayIcon(this); systray->setIcon(QIcon(":/icons/quassel-icon.png")); @@ -91,25 +96,26 @@ void MainWin::init() { connect(systray, SIGNAL(activated( QSystemTrayIcon::ActivationReason )), this, SLOT(systrayActivated( QSystemTrayIcon::ActivationReason ))); - //setupSettingsDlg(); + // DOCK OPTIONS + setDockNestingEnabled(true); + + setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); + setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); + + setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea); + setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea); + // setup the docks etc... setupMenus(); setupViews(); + setupNickWidget(); + setupChatMonitor(); + setupInputWidget(); + setupTopicWidget(); + setupSettingsDlg(); - // create nick dock - nickDock = new QDockWidget(tr("Nicks"), this); - nickDock->setObjectName("NickDock"); - nickDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); - - nickListWidget = new NickListWidget(nickDock); - nickDock->setWidget(nickListWidget); - - addDockWidget(Qt::RightDockWidgetArea, nickDock); - ui.menuViews->addAction(nickDock->toggleViewAction()); - // restore mainwin state - UiSettings s; restoreState(s.value("MainWinState").toByteArray()); disconnectedFromCore(); // Disable menus and stuff @@ -120,49 +126,10 @@ void MainWin::init() { showServerList(); } - // DOCK OPTIONS - setDockNestingEnabled(true); - - setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); - setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); - - setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea); - setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea); - - // new Topic Stuff... should be probably refactored out into a separate method - VerticalDock *topicDock = new VerticalDock(tr("Topic"), this); - topicDock->setObjectName("TopicDock"); - TopicWidget *topicwidget = new TopicWidget(topicDock); - topicDock->setWidget(topicwidget); - - Client::bufferModel()->mapProperty(1, Qt::DisplayRole, topicwidget, "topic"); - - addDockWidget(Qt::TopDockWidgetArea, topicDock); - - ui.menuViews->addAction(topicDock->toggleViewAction()); - - // NEW INPUT WIDGET -- damn init() needs a cleanup - VerticalDock *inputDock = new VerticalDock(tr("Inputline"), this); - inputDock->setObjectName("InputDock"); - InputWidget *inputWidget = new InputWidget(inputDock); - inputDock->setWidget(inputWidget); - - addDockWidget(Qt::BottomDockWidgetArea, inputDock); - - ui.menuViews->addAction(inputDock->toggleViewAction()); - - inputWidget->setModel(Client::bufferModel()); - inputWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel()); - - ui.bufferWidget->setFocusProxy(inputWidget); - // attach the BufferWidget to the PropertyMapper ui.bufferWidget->setModel(Client::bufferModel()); ui.bufferWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel()); - // attach the NickList to the PropertyMapper - Client::bufferModel()->mapProperty(0, NetworkModel::BufferIdRole, nickListWidget, "currentBuffer"); - #ifdef SPUTDEV showSettingsDlg(); @@ -241,6 +208,78 @@ void MainWin::setupSettingsDlg() { #endif } +void MainWin::setupNickWidget() { + // create nick dock + nickDock = new QDockWidget(tr("Nicks"), this); + nickDock->setObjectName("NickDock"); + nickDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + + nickListWidget = new NickListWidget(nickDock); + nickDock->setWidget(nickListWidget); + + addDockWidget(Qt::RightDockWidgetArea, nickDock); + ui.menuViews->addAction(nickDock->toggleViewAction()); + + Client::bufferModel()->mapProperty(0, NetworkModel::BufferIdRole, nickListWidget, "currentBuffer"); +} + +void MainWin::setupChatMonitor() { + VerticalDock *dock = new VerticalDock(tr("Chat Monitor"), this); + dock->setObjectName("ChatMonitorDock"); + + ChatWidget *chatWidget = new ChatWidget(this); + chatWidget->show(); + dock->setWidget(chatWidget); + dock->show(); + + Buffer *buf = Client::monitorBuffer(); + if(!buf) + return; + + chatWidget->init(BufferId(0)); + QList lines; + QList msgs = buf->contents(); + foreach(AbstractUiMsg *msg, msgs) { + lines.append(dynamic_cast(msg)); + } + chatWidget->setContents(lines); + connect(buf, SIGNAL(msgAppended(AbstractUiMsg *)), chatWidget, SLOT(appendMsg(AbstractUiMsg *))); + connect(buf, SIGNAL(msgPrepended(AbstractUiMsg *)), chatWidget, SLOT(prependMsg(AbstractUiMsg *))); + + addDockWidget(Qt::TopDockWidgetArea, dock, Qt::Vertical); + ui.menuViews->addAction(dock->toggleViewAction()); +} + +void MainWin::setupInputWidget() { + VerticalDock *dock = new VerticalDock(tr("Inputline"), this); + dock->setObjectName("InputDock"); + + InputWidget *inputWidget = new InputWidget(dock); + dock->setWidget(inputWidget); + + addDockWidget(Qt::BottomDockWidgetArea, dock); + + ui.menuViews->addAction(dock->toggleViewAction()); + + inputWidget->setModel(Client::bufferModel()); + inputWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel()); + + ui.bufferWidget->setFocusProxy(inputWidget); +} + +void MainWin::setupTopicWidget() { + VerticalDock *dock = new VerticalDock(tr("Topic"), this); + dock->setObjectName("TopicDock"); + TopicWidget *topicwidget = new TopicWidget(dock); + dock->setWidget(topicwidget); + + Client::bufferModel()->mapProperty(1, Qt::DisplayRole, topicwidget, "topic"); + + addDockWidget(Qt::TopDockWidgetArea, dock); + + ui.menuViews->addAction(dock->toggleViewAction()); +} + void MainWin::connectedToCore() { foreach(BufferInfo id, Client::allBufferInfos()) { emit requestBacklog(id, 1000, -1); diff --git a/src/qtui/mainwin.h b/src/qtui/mainwin.h index d4b8ab14..16f11811 100644 --- a/src/qtui/mainwin.h +++ b/src/qtui/mainwin.h @@ -80,6 +80,11 @@ class MainWin : public QMainWindow { void setupMenus(); void setupViews(); + void setupNickWidget(); + void setupChatMonitor(); + void setupInputWidget(); + void setupTopicWidget(); + void setupSettingsDlg(); void enableMenus(); diff --git a/src/qtui/ui/inputwidget.ui b/src/qtui/ui/inputwidget.ui index 349bc8d4..bb8f5027 100644 --- a/src/qtui/ui/inputwidget.ui +++ b/src/qtui/ui/inputwidget.ui @@ -5,10 +5,16 @@ 0 0 - 674 - 136 + 696 + 28 + + + 0 + 0 + + Form diff --git a/src/qtui/ui/topicwidget.ui b/src/qtui/ui/topicwidget.ui index e1587b83..f5a91f50 100644 --- a/src/qtui/ui/topicwidget.ui +++ b/src/qtui/ui/topicwidget.ui @@ -5,12 +5,12 @@ 0 0 - 559 - 30 + 577 + 32 - + 0 0 diff --git a/version.inc b/version.inc index 29c85b7b..f6ffdee4 100644 --- a/version.inc +++ b/version.inc @@ -4,8 +4,8 @@ { using namespace Global; quasselVersion = "0.2.0-pre"; - quasselDate = "2008-01-29"; - quasselBuild = 410; + quasselDate = "2008-01-30"; + quasselBuild = 411; //! Minimum client build number the core needs clientBuildNeeded = 358; -- 2.20.1