X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatwidget.cpp;h=85d8cad6d65874b1201c87394dfeec739b34a82e;hp=ced9b6b11a26cf832150dbe881f89a7a13af43c3;hb=508a14a5632d3a2a3d65c20dda7c942f8f120f9c;hpb=e7696b65e76e50137b8bab0ec3e43ce66a94f190 diff --git a/src/qtui/chatwidget.cpp b/src/qtui/chatwidget.cpp index ced9b6b1..85d8cad6 100644 --- a/src/qtui/chatwidget.cpp +++ b/src/qtui/chatwidget.cpp @@ -23,8 +23,14 @@ #include "chatline-old.h" #include "qtui.h" #include "uisettings.h" - -ChatWidget::ChatWidget(QWidget *parent) : QAbstractScrollArea(parent) { +#include "client.h" +#include "buffer.h" +#include "clientbacklogmanager.h" + +ChatWidget::ChatWidget(BufferId bufid, QWidget *parent) : QAbstractScrollArea(parent), AbstractChatView(), + lastBacklogOffset(0), + lastBacklogSize(0) +{ //setAutoFillBackground(false); //QPalette palette; //palette.setColor(backgroundRole(), QColor(0, 0, 0, 50)); @@ -43,6 +49,8 @@ ChatWidget::ChatWidget(QWidget *parent) : QAbstractScrollArea(parent) { pointerPosition = QPoint(0,0); connect(verticalScrollBar(), SIGNAL(actionTriggered(int)), this, SLOT(scrollBarAction(int))); connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(scrollBarValChanged(int))); + + init(bufid); } void ChatWidget::init(BufferId id) { @@ -67,11 +75,14 @@ void ChatWidget::init(BufferId id) { mouseMode = Normal; selectionMode = NoSelection; connect(scrollTimer, SIGNAL(timeout()), this, SLOT(handleScrollTimer())); + + if(bufferId.isValid()) + connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(viewportChanged(int))); } ChatWidget::~ChatWidget() { //qDebug() << "destroying chatwidget" << bufferName; - //foreach(ChatLine *l, lines) { + //foreach(ChatLineOld *l, lines) { // delete l; //} UiSettings s; @@ -85,6 +96,10 @@ QSize ChatWidget::minimumSizeHint() const { return QSize(20, 20); } +QSize ChatWidget::sizeHint() const { + return QSize(400, 100); +} + // QSize ChatWidget::sizeHint() const { // //qDebug() << size(); // return size(); @@ -157,12 +172,12 @@ void ChatWidget::clear() { } void ChatWidget::prependMsg(AbstractUiMsg *msg) { - ChatLine *line = dynamic_cast(msg); + ChatLineOld *line = dynamic_cast(msg); Q_ASSERT(line); prependChatLine(line); } -void ChatWidget::prependChatLine(ChatLine *line) { +void ChatWidget::prependChatLine(ChatLineOld *line) { qreal h = line->layout(tsWidth, senderWidth, textWidth); for(int i = 1; i < ycoords.count(); i++) ycoords[i] += h; ycoords.insert(1, h); @@ -177,10 +192,10 @@ void ChatWidget::prependChatLine(ChatLine *line) { viewport()->update(); } -void ChatWidget::prependChatLines(QList clist) { +void ChatWidget::prependChatLines(QList clist) { QList tmpy; tmpy.append(0); qreal h = 0; - foreach(ChatLine *l, clist) { + foreach(ChatLineOld *l, clist) { h += l->layout(tsWidth, senderWidth, textWidth); tmpy.append(h); } @@ -204,12 +219,12 @@ void ChatWidget::prependChatLines(QList clist) { } void ChatWidget::appendMsg(AbstractUiMsg *msg) { - ChatLine *line = dynamic_cast(msg); + ChatLineOld *line = dynamic_cast(msg); Q_ASSERT(line); appendChatLine(line); } -void ChatWidget::appendChatLine(ChatLine *line) { +void ChatWidget::appendChatLine(ChatLineOld *line) { qreal h = line->layout(tsWidth, senderWidth, textWidth); ycoords.append(h + ycoords[ycoords.count() - 1]); height += h; @@ -221,8 +236,8 @@ void ChatWidget::appendChatLine(ChatLine *line) { } -void ChatWidget::appendChatLines(QList list) { - foreach(ChatLine *line, list) { +void ChatWidget::appendChatLines(QList list) { + foreach(ChatLineOld *line, list) { qreal h = line->layout(tsWidth, senderWidth, textWidth); ycoords.append(h + ycoords[ycoords.count() - 1]); height += h; @@ -234,12 +249,14 @@ void ChatWidget::appendChatLines(QList list) { viewport()->update(); } -void ChatWidget::setContents(QList list) { +void ChatWidget::setContents(const QList &list) { ycoords.clear(); ycoords.append(0); height = 0; lines.clear(); - appendChatLines(list); + QList cl; + foreach(AbstractUiMsg *msg, list) cl << dynamic_cast(msg); + appendChatLines(cl); } //!\brief Computes the different x position vars for given tsWidth and senderWidth. @@ -335,10 +352,43 @@ void ChatWidget::mousePressEvent(QMouseEvent *event) { } } -void ChatWidget::mouseDoubleClickEvent(QMouseEvent * /*event*/) { - +void ChatWidget::mouseDoubleClickEvent(QMouseEvent *event) { + // dirty and fast hack to make http:// urls klickable + if(lines.isEmpty()) + return; + QPoint pos = event->pos() + QPoint(0, verticalScrollBar()->value()); + int x = pos.x(); + int y = pos.y(); + int l = yToLineIdx(y); + if(lines.count() <= l) + return; + + ChatLineOld *line = lines[l]; + QString text = line->text(); + int cursorAt = qMax(0, line->posToCursor(QPointF(x, y - ycoords[l])) - 1); + + int start = 0; + if(cursorAt > 0) { + for(int i = cursorAt; i > 0; i--) { + if(text[i] == ' ') { + start = i + 1; + break; + } + } + } + int end = text.indexOf(" ", start); + int len = -1; + if(end != -1) { + len = end - start; + } + QString word = text.mid(start, len); + QRegExp regex("^(h|f)t{1,2}ps?:\\/\\/"); + if(regex.indexIn(word) != -1) { + QDesktopServices::openUrl(QUrl(word)); + } + } void ChatWidget::mouseReleaseEvent(QMouseEvent *event) { @@ -490,13 +540,13 @@ void ChatWidget::handleMouseMoveEvent(const QPoint &_pos) { if(curLine == dragStartLine && c >= 0) { if(c != curCursor) { curCursor = c; - lines[curLine]->setSelection(ChatLine::Partial, dragStartCursor, c); + lines[curLine]->setSelection(ChatLineOld::Partial, dragStartCursor, c); viewport()->update(); } } else { mouseMode = MarkLines; selectionStart = qMin(curLine, dragStartLine); selectionEnd = qMax(curLine, dragStartLine); - for(int i = selectionStart; i <= selectionEnd; i++) lines[i]->setSelection(ChatLine::Full); + for(int i = selectionStart; i <= selectionEnd; i++) lines[i]->setSelection(ChatLineOld::Full); viewport()->update(); } } else if(mouseMode == MarkLines) { @@ -506,16 +556,16 @@ void ChatWidget::handleMouseMoveEvent(const QPoint &_pos) { selectionStart = qMin(l, dragStartLine); selectionEnd = qMax(l, dragStartLine); if(curLine < 0) { Q_ASSERT(selectionStart == selectionEnd); - lines[l]->setSelection(ChatLine::Full); + lines[l]->setSelection(ChatLineOld::Full); } else { if(curLine < selectionStart) { - for(int i = curLine; i < selectionStart; i++) lines[i]->setSelection(ChatLine::None); + for(int i = curLine; i < selectionStart; i++) lines[i]->setSelection(ChatLineOld::None); } else if(curLine > selectionEnd) { - for(int i = selectionEnd+1; i <= curLine; i++) lines[i]->setSelection(ChatLine::None); + for(int i = selectionEnd+1; i <= curLine; i++) lines[i]->setSelection(ChatLineOld::None); } else if(selectionStart < curLine && l < curLine) { - for(int i = selectionStart; i < curLine; i++) lines[i]->setSelection(ChatLine::Full); + for(int i = selectionStart; i < curLine; i++) lines[i]->setSelection(ChatLineOld::Full); } else if(curLine < selectionEnd && l > curLine) { - for(int i = curLine+1; i <= selectionEnd; i++) lines[i]->setSelection(ChatLine::Full); + for(int i = curLine+1; i <= selectionEnd; i++) lines[i]->setSelection(ChatLineOld::Full); } } curLine = l; @@ -528,10 +578,10 @@ void ChatWidget::handleMouseMoveEvent(const QPoint &_pos) { //!\brief Clear current text selection. void ChatWidget::clearSelection() { if(selectionMode == TextSelected) { - lines[selectionLine]->setSelection(ChatLine::None); + lines[selectionLine]->setSelection(ChatLineOld::None); } else if(selectionMode == LinesSelected) { for(int i = selectionStart; i <= selectionEnd; i++) { - lines[i]->setSelection(ChatLine::None); + lines[i]->setSelection(ChatLineOld::None); } } selectionMode = NoSelection; @@ -554,3 +604,26 @@ QString ChatWidget::selectionToString() { return lines[selectionLine]->text().mid(selectionStart, selectionEnd - selectionStart); } +void ChatWidget::viewportChanged(int newPos) { + const int REQUEST_COUNT = 50; + QAbstractSlider *vbar = verticalScrollBar(); + if(!vbar) + return; + + int relativePos = 100; + if(vbar->maximum() - vbar->minimum() != 0) + relativePos = (newPos - vbar->minimum()) * 100 / (vbar->maximum() - vbar->minimum()); + + if(relativePos < 20) { + Buffer *buffer = Client::buffer(bufferId); + Q_CHECK_PTR(buffer); + if(buffer->contents().isEmpty()) + return; + MsgId msgId = buffer->contents().first()->msgId(); + if(!lastBacklogOffset.isValid() || msgId < lastBacklogOffset && lastBacklogSize + REQUEST_COUNT <= buffer->contents().count()) { + Client::backlogManager()->requestBacklog(bufferId, REQUEST_COUNT, msgId.toInt()); + lastBacklogOffset = msgId; + lastBacklogSize = buffer->contents().size(); + } + } +}