X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatitem.cpp;h=be19367bc80369355f5fd7d9cd956719bf5eb774;hp=433d8d62c52dff2d187217cc1f7e996b4d8f5014;hb=a25d2ec9cf8caf283624eef270998c0ba9e903dd;hpb=12db1c296a1964d60de7e438306ddedbf809a1bf diff --git a/src/qtui/chatitem.cpp b/src/qtui/chatitem.cpp index 433d8d62..be19367b 100644 --- a/src/qtui/chatitem.cpp +++ b/src/qtui/chatitem.cpp @@ -28,9 +28,12 @@ #include #include - +#include "buffermodel.h" +#include "bufferview.h" #include "chatitem.h" #include "chatlinemodel.h" +#include "iconloader.h" +#include "mainwin.h" #include "qtui.h" #include "qtuistyle.h" @@ -447,8 +450,17 @@ QList ContentsChatItem::findClickables() const { } if(type >= 0) { idx = matchEnd[type]; + QString match = str.mid(matches[type], matchEnd[type] - matches[type]); if(type == Clickable::Url && str.at(idx-1) == ')') { // special case: closing paren only matches if we had an open one - if(!str.mid(matches[type], matchEnd[type]-matches[type]).contains('(')) matchEnd[type]--; + if(!match.contains('(')) { + matchEnd[type]--; + match.chop(1); + } + } + if(type == Clickable::Channel) { + // don't make clickable if it could be a #number + if(QRegExp("^#\\d+$").exactMatch(match)) + continue; } result.append(Clickable((Clickable::Type)type, matches[type], matchEnd[type] - matches[type])); } @@ -507,11 +519,20 @@ void ContentsChatItem::handleClick(const QPointF &pos, ChatScene::ClickMode clic case Clickable::Url: if(!str.contains("://")) str = "http://" + str; - QDesktopServices::openUrl(QUrl::fromEncoded(str.toAscii())); + QDesktopServices::openUrl(QUrl::fromEncoded(str.toUtf8(), QUrl::TolerantMode)); break; - case Clickable::Channel: - // TODO join or whatever... + case Clickable::Channel: { + NetworkId networkId = Client::networkModel()->networkId(data(MessageModel::BufferIdRole).value()); + BufferId bufId = Client::networkModel()->bufferId(networkId, str); + if(bufId.isValid()) { + QModelIndex targetIdx = Client::networkModel()->bufferIndex(bufId); + Client::bufferModel()->switchToBuffer(bufId); + if(!targetIdx.data(NetworkModel::ItemActiveRole).toBool()) + Client::userInput(BufferInfo::fakeStatusBuffer(networkId), QString("/JOIN %1").arg(str)); + } else + Client::userInput(BufferInfo::fakeStatusBuffer(networkId), QString("/JOIN %1").arg(str)); break; + } default: break; } @@ -559,8 +580,11 @@ void ContentsChatItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event) { onClickable = true; showWebPreview(click); } else if(click.type == Clickable::Channel) { - // TODO: don't make clickable if it's our own name - // onClickable = true; //FIXME disabled for now + QString name = data(ChatLineModel::DisplayRole).toString().mid(click.start, click.length); + // don't make clickable if it's our own name + BufferId myId = data(MessageModel::BufferIdRole).value(); + if(Client::networkModel()->bufferName(myId) != name) + onClickable = true; } if(onClickable) { setCursor(Qt::PointingHandCursor); @@ -577,15 +601,28 @@ void ContentsChatItem::addActionsToMenu(QMenu *menu, const QPointF &pos) { Q_UNUSED(pos); // we assume that the current mouse cursor pos is the point of invocation if(privateData()->currentClickable.isValid()) { - switch(privateData()->currentClickable.type) { + Clickable click = privateData()->currentClickable; + switch(click.type) { case Clickable::Url: - privateData()->activeClickable = privateData()->currentClickable; - menu->addAction(tr("Copy Link Address"), &_actionProxy, SLOT(copyLinkToClipboard()))->setData(QVariant::fromValue(this)); + privateData()->activeClickable = click; + menu->addAction(SmallIcon("edit-copy"), tr("Copy Link Address"), + &_actionProxy, SLOT(copyLinkToClipboard()))->setData(QVariant::fromValue(this)); break; - + case Clickable::Channel: { + // Hide existing menu actions, they confuse us when right-clicking on a clickable + foreach(QAction *action, menu->actions()) + action->setVisible(false); + QString name = data(ChatLineModel::DisplayRole).toString().mid(click.start, click.length); + Client::mainUi()->actionProvider()->addActions(menu, chatScene()->filter(), data(MessageModel::BufferIdRole).value(), name); + break; + } default: break; } + } else { + + // Buffer-specific actions + Client::mainUi()->actionProvider()->addActions(menu, chatScene()->filter(), data(MessageModel::BufferIdRole).value()); } }