Properly stop #nnn from being clickable
[quassel.git] / src / qtui / chatitem.cpp
index be792c9..be19367 100644 (file)
@@ -28,6 +28,7 @@
 #include <QTextLayout>
 #include <QMenu>
 
+#include "buffermodel.h"
 #include "bufferview.h"
 #include "chatitem.h"
 #include "chatlinemodel.h"
@@ -449,8 +450,17 @@ QList<ContentsChatItem::Clickable> 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]));
     }
@@ -511,9 +521,18 @@ void ContentsChatItem::handleClick(const QPointF &pos, ChatScene::ClickMode clic
             str = "http://" + str;
           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;
       }
@@ -561,8 +580,8 @@ void ContentsChatItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event) {
       onClickable = true;
       showWebPreview(click);
     } else if(click.type == Clickable::Channel) {
-      // don't make clickable if it's our own name
       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<BufferId>();
       if(Client::networkModel()->bufferName(myId) != name)
         onClickable = true;