#include <QTextLayout>
#include <QMenu>
+#include "buffermodel.h"
#include "bufferview.h"
#include "chatitem.h"
#include "chatlinemodel.h"
case Clickable::Url:
if(!str.contains("://"))
str = "http://" + str;
- QDesktopServices::openUrl(QUrl::fromEncoded(str.toUtf8(), QUrl::TolerantMode));
+ 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>());
+ 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;
}
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<BufferId>();
+ if(Client::networkModel()->bufferName(myId) != name)
+ onClickable = true;
}
if(onClickable) {
setCursor(Qt::PointingHandCursor);
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;
+ privateData()->activeClickable = click;
menu->addAction(SmallIcon("edit-copy"), tr("Copy Link Address"),
&_actionProxy, SLOT(copyLinkToClipboard()))->setData(QVariant::fromValue<void *>(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<BufferId>(), name);
+ break;
+ }
default:
break;
}
- }
+ } else {
- // Buffer-specific actions
- // We add these in ChatItem (rather than the scene), because they depend on the current clickable
- if(chatScene()->isSingleBufferScene()) {
- QModelIndex index = Client::networkModel()->bufferIndex(chatScene()->singleBufferId());
- if(index.isValid()) {
- menu->addSeparator();
- QtUi::mainWindow()->allBuffersView()->addActionsToMenu(menu, index);
- }
+ // Buffer-specific actions
+ Client::mainUi()->actionProvider()->addActions(menu, chatScene()->filter(), data(MessageModel::BufferIdRole).value<BufferId>());
}
-
}
void ContentsChatItem::copyLinkToClipboard() {