X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fqtui%2Fchatitem.cpp;h=7e6d0e18cd1e855c994309eec1172d811887d16a;hb=981b43a699b4dd6da16e45f74d59443b68ad4b9c;hp=97853250bdff8f374bc0644c47cf2d9d651ea927;hpb=7c78f651ee68ac7f9028f9a3640d4c8ae808c826;p=quassel.git diff --git a/src/qtui/chatitem.cpp b/src/qtui/chatitem.cpp index 97853250..7e6d0e18 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" @@ -410,7 +413,7 @@ QList ContentsChatItem::findClickables() const { static QRegExp regExp[] = { // URL // QRegExp(QString("((?:https?://|s?ftp://|irc://|mailto:|www\\.)%1+|%1+\\.[a-z]{2,4}(?:?=/%1+|\\b))%2").arg(urlChars, urlEnd)), - QRegExp(QString("((?:(?:https?://|s?ftp://|irc://|mailto:)|www)%1+)%2").arg(urlChars, urlEnd), Qt::CaseInsensitive), + QRegExp(QString("((?:(?:https?://|s?ftp://|irc://|gopher://|mailto:)|www)%1+)%2").arg(urlChars, urlEnd), Qt::CaseInsensitive), // Channel name // We don't match for channel names starting with + or &, because that gives us a lot of false positives. @@ -507,11 +510,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 +571,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 + // don't make clickable if it's our own name + QString name = data(ChatLineModel::DisplayRole).toString().mid(click.start, click.length); + BufferId myId = data(MessageModel::BufferIdRole).value(); + if(Client::networkModel()->bufferName(myId) != name) + onClickable = true; } if(onClickable) { setCursor(Qt::PointingHandCursor); @@ -577,15 +592,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()); } }