X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatwidget.cpp;h=8a9b7a2f5ba471c8d7fa1be86025d1262ad5c805;hp=004ca93d717d1cc62d2903b1bdc96d0def96ebe7;hb=858c7dbcbfa84deda9a71b4f4d25b1555bae3cc1;hpb=70706ff642683d03ff091cab25d984ec7d9612de diff --git a/src/qtui/chatwidget.cpp b/src/qtui/chatwidget.cpp index 004ca93d..8a9b7a2f 100644 --- a/src/qtui/chatwidget.cpp +++ b/src/qtui/chatwidget.cpp @@ -1,11 +1,11 @@ /*************************************************************************** - * 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 * @@ -22,7 +22,7 @@ #include "chatwidget.h" #include "chatline-old.h" #include "qtui.h" - +#include "uisettings.h" ChatWidget::ChatWidget(QWidget *parent) : QAbstractScrollArea(parent) { //setAutoFillBackground(false); @@ -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; @@ -45,13 +45,15 @@ ChatWidget::ChatWidget(QWidget *parent) : QAbstractScrollArea(parent) { connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(scrollBarValChanged(int))); } -void ChatWidget::init(QString netname, QString bufname) { - networkName = netname; - bufferName = bufname; +void ChatWidget::init(BufferId id) { + bufferId = id; setBackgroundRole(QPalette::Base); setFont(QFont("Fixed")); - tsWidth = 90; - senderWidth = 100; + UiSettings s; + QVariant tsDef = s.value("DefaultTimestampColumnWidth", 90); + QVariant senderDef = s.value("DefaultSenderColumnWidth", 100); + tsWidth = s.value(QString("%1/TimestampColumnWidth").arg(bufferId.toInt()), tsDef).toInt(); + senderWidth = s.value(QString("%1/SenderColumnWidth").arg(bufferId.toInt()), senderDef).toInt(); computePositions(); adjustScrollBar(); verticalScrollBar()->setValue(verticalScrollBar()->maximum()); @@ -60,7 +62,7 @@ void ChatWidget::init(QString netname, QString bufname) { //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; @@ -69,16 +71,29 @@ void ChatWidget::init(QString netname, QString bufname) { ChatWidget::~ChatWidget() { //qDebug() << "destroying chatwidget" << bufferName; - //foreach(ChatLine *l, lines) { + //foreach(ChatLineOld *l, lines) { // delete l; //} + UiSettings s; + s.setValue("DefaultTimestampColumnWidth", tsWidth); // FIXME stupid dirty quicky + s.setValue("DefaultSenderColumnWidth", senderWidth); + s.setValue(QString("%1/TimestampColumnWidth").arg(bufferId.toInt()), tsWidth); + s.setValue(QString("%1/SenderColumnWidth").arg(bufferId.toInt()), senderWidth); +} + +QSize ChatWidget::minimumSizeHint() const { + return QSize(20, 20); } QSize ChatWidget::sizeHint() const { - //qDebug() << size(); - return size(); + return QSize(400, 100); } +// QSize ChatWidget::sizeHint() const { +// //qDebug() << size(); +// return size(); +// } + void ChatWidget::adjustScrollBar() { verticalScrollBar()->setPageStep(viewport()->height()); verticalScrollBar()->setSingleStep(20); @@ -146,12 +161,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); @@ -166,10 +181,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); } @@ -193,12 +208,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; @@ -210,8 +225,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; @@ -223,7 +238,7 @@ void ChatWidget::appendChatLines(QList list) { viewport()->update(); } -void ChatWidget::setContents(QList list) { +void ChatWidget::setContents(QList list) { ycoords.clear(); ycoords.append(0); height = 0; @@ -245,7 +260,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(); } @@ -324,10 +339,42 @@ 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); + if(word.startsWith("http://")) { + QDesktopServices::openUrl(QUrl(word)); + } + } void ChatWidget::mouseReleaseEvent(QMouseEvent *event) { @@ -479,13 +526,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) { @@ -495,16 +542,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; @@ -517,10 +564,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; @@ -535,7 +582,7 @@ QString ChatWidget::selectionToString() { QString result; for(int l = selectionStart; l <= selectionEnd; l++) { result += QString("[%1] %2 %3\n").arg(lines[l]->timestamp().toLocalTime().toString("hh:mm:ss")) - .arg(lines[l]->sender()).arg(lines[l]->text()); + . arg(lines[l]->sender()).arg(lines[l]->text()); } return result; }