Add buffer-specific actions to ChatView's context menu
[quassel.git] / src / qtui / chatitem.cpp
index 9785325..b629a26 100644 (file)
 #include <QTextLayout>
 #include <QMenu>
 
-
+#include "bufferview.h"
 #include "chatitem.h"
 #include "chatlinemodel.h"
+#include "iconloader.h"
+#include "mainwin.h"
 #include "qtui.h"
 #include "qtuistyle.h"
 
@@ -410,7 +412,7 @@ QList<ContentsChatItem::Clickable> 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,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.toAscii()));
+         QDesktopServices::openUrl(QUrl::fromEncoded(str.toUtf8(), QUrl::TolerantMode));
           break;
         case Clickable::Channel:
           // TODO join or whatever...
@@ -580,13 +582,25 @@ void ContentsChatItem::addActionsToMenu(QMenu *menu, const QPointF &pos) {
     switch(privateData()->currentClickable.type) {
       case Clickable::Url:
         privateData()->activeClickable = privateData()->currentClickable;
-        menu->addAction(tr("Copy Link Address"), &_actionProxy, SLOT(copyLinkToClipboard()))->setData(QVariant::fromValue<void *>(this));
+        menu->addAction(SmallIcon("edit-copy"), tr("Copy Link Address"),
+                         &_actionProxy, SLOT(copyLinkToClipboard()))->setData(QVariant::fromValue<void *>(this));
         break;
 
       default:
         break;
     }
   }
+
+  // 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);
+    }
+  }
+
 }
 
 void ContentsChatItem::copyLinkToClipboard() {