/***************************************************************************
- * Copyright (C) 2005-07 by The Quassel Team *
+ * Copyright (C) 2005-08 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
+ * (at your option) version 3. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#include "buffer.h"
+#include "buffersyncer.h"
#include "client.h"
+#include "networkmodel.h"
+#include "quasselui.h"
#include "util.h"
Buffer::Buffer(BufferInfo bufferid, QObject *parent)
: QObject(parent),
_bufferInfo(bufferid),
- _active(false)
+ _isVisible(false),
+ _activityLevel(NoActivity)
{
- if(bufferid.buffer().isEmpty())
- _type = StatusType;
- else if(isChannelName(bufferid.buffer()))
- _type = ChannelType;
- else
- _type = QueryType;
-
-/*
- QSettings s;
- s.beginGroup(QString("GUI/BufferStates/%1/%2").arg(netname).arg(bufname));
- state->splitterState = s.value("Splitter").toByteArray();
- s.endGroup();
- */
- emit bufferUpdated(this);
-}
-
-Buffer::~Buffer() {
- //delete widget;
- /*
- QSettings s;
- s.beginGroup(QString("GUI/BufferStates/%1/%2").arg(networkName).arg(bufferName));
- s.setValue("Splitter", state->splitterState);
- s.endGroup();
-*/
- //delete state;
-}
-
-Buffer::Type Buffer::bufferType() const {
- return _type;
-}
-bool Buffer::isActive() const {
- // FIXME determine status by checking for a networkInfo objekt
- return true;
}
BufferInfo Buffer::bufferInfo() const {
- return _bufferInfo;
-}
-
-void Buffer::updateBufferInfo(BufferInfo bufferid) {
- _bufferInfo = bufferid;
-}
-
-uint Buffer::uid() const {
- return bufferInfo().uid();
-}
-
-uint Buffer::networkId() const {
- return bufferInfo().networkId();
-}
-
-QString Buffer::networkName() const {
- return bufferInfo().network();
-}
-
-QString Buffer::bufferName() const {
- return bufferInfo().buffer();
-}
-
-QString Buffer::displayName() const {
- if(bufferType() == StatusType)
- return tr("Status Buffer");
- else
- return bufferName();
+ // still needed by the gui *sigh* to request the backlogs *sigh*
+ return _bufferInfo;
}
QList<AbstractUiMsg *> Buffer::contents() const {
return layoutedMsgs;
}
-QVariantMap Buffer::nickList() const {
- // FIXME should return a Map or List of IrcUsers in the future
- return QVariantMap();
-}
-
-QString Buffer::topic() const {
- // FIXME check if we got a networkInfo() object
- return QString();
-}
-
-QString Buffer::ownNick() const {
- // FIXME check if we got a networkInfo() object
- return QString();
-}
-
-bool Buffer::isStatusBuffer() const {
- return bufferType() == StatusType;
-}
-
-void Buffer::setActive(bool a) {
-// if(a != active) {
-// active = a;
-// emit bufferUpdated(this);
-// }
-}
-
void Buffer::appendMsg(const Message &msg) {
+ updateActivityLevel(msg);
AbstractUiMsg *m = Client::layoutMsg(msg);
layoutedMsgs.append(m);
emit msgAppended(m);
}
void Buffer::prependMsg(const Message &msg) {
+ // check for duplicate first
+ if(contents().count() > 0 && msg.msgId() >= contents().first()->msgId()) {
+ return;
+ }
+ updateActivityLevel(msg);
layoutQueue.append(msg);
}
return layoutQueue.count();
}
-void Buffer::processUserInput(QString msg) {
- // TODO User Input processing (plugins) -> well, this goes through MainWin into Core for processing... so...
- emit userInput(_bufferInfo, msg);
+void Buffer::setVisible(bool visible) {
+ _isVisible = visible;
+ setActivityLevel(NoActivity);
+ if(!layoutedMsgs.count()) return;
+ setLastSeen(layoutedMsgs.last()->timestamp());
}
-// no longer needed
-// back reference:
-// void Buffer::setTopic(QString t) {
-// _topic = t;
-// emit topicSet(t);
-// emit bufferUpdated(this);
-// }
-
-// void Buffer::addNick(QString nick, QVariantMap props) {
-// if(nick == ownNick()) setActive(true);
-// nicks[nick] = props;
-// emit nickListChanged(nicks);
-// }
-
-// void Buffer::updateNick(QString nick, QVariantMap props) {
-// nicks[nick] = props;
-// emit nickListChanged(nicks);
-// }
-
-// void Buffer::renameNick(QString oldnick, QString newnick) {
-// QVariant v = nicks.take(oldnick);
-// nicks[newnick] = v;
-// emit nickListChanged(nicks);
-// }
-
-// void Buffer::removeNick(QString nick) {
-// if(nick == ownNick()) setActive(false);
-// nicks.remove(nick);
-// emit nickListChanged(nicks);
-// }
-
-// void Buffer::setOwnNick(QString nick) {
-// _ownNick = nick;
-// emit ownNickSet(nick);
-// }
+void Buffer::setLastSeen(const QDateTime &seen) { // qDebug() << "want to set lastSeen:" << bufferInfo() << seen << lastSeen();
+ if(!lastSeen().isValid() || seen.isValid() && seen > lastSeen()) { //qDebug() << "setting:" << bufferInfo().bufferName() << seen;
+ _lastSeen = seen;
+ Client::setBufferLastSeen(bufferInfo().bufferId(), seen);
+ //qDebug() << "setting lastSeen:" << bufferInfo() << lastSeen();
+ setActivityLevel(NoActivity);
+ }
+}
+
+void Buffer::setActivityLevel(ActivityLevel level) {
+ _activityLevel = level;
+ if(bufferInfo().bufferId() > 0) {
+ Client::networkModel()->setBufferActivity(bufferInfo(), level);
+ //qDebug() << "setting level:" << bufferInfo() << lastSeen() << level;
+ }
+}
+
+void Buffer::updateActivityLevel(const Message &msg) {
+ if(isVisible())
+ return;
+
+ if(msg.flags() & Message::Self) // don't update activity for our own messages
+ return;
+
+ if(lastSeen().isValid() && lastSeen() >= msg.timestamp())
+ return;
+
+ ActivityLevel level = activityLevel() | OtherActivity;
+ if(msg.type() == Message::Plain || msg.type() == Message::Notice) level |= NewMessage;
+ if(msg.flags() & Message::Highlight) level |= Highlight;
+
+ if(level != activityLevel()) setActivityLevel(level);
+}