From: Manuel Nickschas Date: Sun, 14 Dec 2008 00:03:12 +0000 (+0100) Subject: Making channel names clickable X-Git-Tag: 0.4.0~370 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=7ea9c498bfb975a95c11d6ddc28835840cf3353d;hp=6eebebc97f84a94f732b05a793ea8e4c000643ab;ds=sidebyside Making channel names clickable Add a context menu for #channelnames in a ChatView. Also clean up NetworkModel's #includes... --- diff --git a/src/client/networkmodel.h b/src/client/networkmodel.h index 807403e5..6fd078e2 100644 --- a/src/client/networkmodel.h +++ b/src/client/networkmodel.h @@ -21,25 +21,12 @@ #ifndef NETWORKMODEL_H #define NETWORKMODEL_H -#include - -#include "treemodel.h" #include "bufferinfo.h" - -#include - -class BufferInfo; - -#include "selectionmodelsynchronizer.h" -#include "modelpropertymapper.h" #include "clientsettings.h" -#include "ircchannel.h" -#include "ircuser.h" #include "message.h" #include "network.h" +#include "treemodel.h" -class MappedSelectionModel; -class QAbstractItemView; class BufferItem; /***************************************** diff --git a/src/qtui/chatitem.cpp b/src/qtui/chatitem.cpp index a5eae80a..be792c97 100644 --- a/src/qtui/chatitem.cpp +++ b/src/qtui/chatitem.cpp @@ -509,7 +509,7 @@ void ContentsChatItem::handleClick(const QPointF &pos, ChatScene::ClickMode clic 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... @@ -561,8 +561,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); @@ -579,13 +582,21 @@ 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; + 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; } diff --git a/src/uisupport/networkmodelactionprovider.cpp b/src/uisupport/networkmodelactionprovider.cpp index 31117f4e..12fd2e4b 100644 --- a/src/uisupport/networkmodelactionprovider.cpp +++ b/src/uisupport/networkmodelactionprovider.cpp @@ -29,6 +29,7 @@ #include "iconloader.h" #include "identity.h" #include "network.h" +#include "util.h" NetworkModelActionProvider::NetworkModelActionProvider(QObject *parent) : AbstractActionProvider(parent), @@ -219,6 +220,24 @@ void NetworkModelActionProvider::addActions(QMenu *menu, // TODO: actions for merged buffers... _indexList contains the index of the message we clicked on } + } else { + // context item = chan or nick, _indexList = buf where the msg clicked on originated + if(isChannelName(_contextItem)) { + QModelIndex msgIdx = _indexList.at(0); + if(!msgIdx.isValid()) + return; + NetworkId networkId = msgIdx.data(NetworkModel::NetworkIdRole).value(); + BufferId bufId = Client::networkModel()->bufferId(networkId, _contextItem); + if(bufId.isValid()) { + QModelIndex targetIdx = Client::networkModel()->bufferIndex(bufId); + _indexList = QList() << targetIdx; + addAction(BufferJoin, menu, targetIdx, InactiveState); + addAction(BufferSwitchTo, menu, targetIdx, ActiveState); + } else + addAction(JoinChannel, menu); + } else { + // TODO: actions for a nick + } } } } @@ -520,17 +539,17 @@ void NetworkModelActionProvider::handleGeneralAction(ActionType type, QAction *a return; switch(type) { - case JoinChannel: - { - // FIXME no QInputDialog in Qtopia -# ifndef Q_WS_QWS - bool ok; - QString channelName = QInputDialog::getText(0, tr("Join Channel"), tr("Input channel name:"), QLineEdit::Normal, QString(), &ok); - if(ok && !channelName.isEmpty()) { - Client::instance()->userInput(BufferInfo::fakeStatusBuffer(networkId), - QString("/JOIN %1").arg(channelName)); + case JoinChannel: { + QString channelName = _contextItem; + if(channelName.isEmpty()) { + bool ok; + channelName = QInputDialog::getText(0, tr("Join Channel"), tr("Input channel name:"), QLineEdit::Normal, QString(), &ok); + if(!ok) + return; + } + if(!channelName.isEmpty()) { + Client::instance()->userInput(BufferInfo::fakeStatusBuffer(networkId), QString("/JOIN %1").arg(channelName)); } -# endif break; } case ShowChannelList: