qa: Replace deprecated qVariantFromValue() by QVariant::fromValue()
[quassel.git] / src / qtui / topicwidget.cpp
index 4af94b6..ff3ce65 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2012 by the Quassel Project                        *
+ *   Copyright (C) 2005-2019 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
 #include "topicwidget.h"
 
 #include "client.h"
-#include "iconloader.h"
+#include "graphicalui.h"
+#include "icon.h"
 #include "networkmodel.h"
 #include "uisettings.h"
+#include "uistyle.h"
+#include "util.h"
 
-TopicWidget::TopicWidget(QWidget *parent)
+TopicWidget::TopicWidget(QWidgetparent)
     : AbstractItemView(parent)
 {
     ui.setupUi(this);
-    ui.topicEditButton->setIcon(SmallIcon("edit-rename"));
-    ui.topicLineEdit->setWordWrapEnabled(true);
+    ui.topicEditButton->setIcon(icon::get("edit-rename"));
+    ui.topicLineEdit->setLineWrapEnabled(true);
     ui.topicLineEdit->installEventFilter(this);
 
-    connect(ui.topicLabel, SIGNAL(clickableActivated(Clickable)), SLOT(clickableActivated(Clickable)));
-    connect(ui.topicLineEdit, SIGNAL(noTextEntered()), SLOT(on_topicLineEdit_textEntered()));
+    connect(ui.topicLabel, &StyledLabel::clickableActivated, this, &TopicWidget::clickableActivated);
+    connect(ui.topicLineEdit, &MultiLineEdit::noTextEntered, this, &TopicWidget::on_topicLineEdit_textEntered);
 
     UiSettings s("TopicWidget");
-    s.notify("DynamicResize", this, SLOT(updateResizeMode()));
-    s.notify("ResizeOnHover", this, SLOT(updateResizeMode()));
+    s.notify("DynamicResize", this, &TopicWidget::updateResizeMode);
+    s.notify("ResizeOnHover", this, &TopicWidget::updateResizeMode);
     updateResizeMode();
 
     UiStyleSettings fs("Fonts");
-    fs.notify("UseCustomTopicWidgetFont", this, SLOT(setUseCustomFont(QVariant)));
-    fs.notify("TopicWidget", this, SLOT(setCustomFont(QVariant)));
+    fs.notify("UseCustomTopicWidgetFont", this, &TopicWidget::setUseCustomFont);
+    fs.notify("TopicWidget", this, selectOverload<const QVariant&>(&TopicWidget::setCustomFont));
     if (fs.value("UseCustomTopicWidgetFont", false).toBool())
         setCustomFont(fs.value("TopicWidget", QFont()));
 
@@ -51,23 +54,21 @@ TopicWidget::TopicWidget(QWidget *parent)
     _readonly = false;
 }
 
-
-void TopicWidget::currentChanged(const QModelIndex &current, const QModelIndex &previous)
+void TopicWidget::currentChanged(const QModelIndex& current, const QModelIndex& previous)
 {
     Q_UNUSED(previous);
     setTopic(current);
 }
 
-
-void TopicWidget::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
+void TopicWidget::dataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight)
 {
     QItemSelectionRange changedArea(topLeft, bottomRight);
     QModelIndex currentTopicIndex = selectionModel()->currentIndex().sibling(selectionModel()->currentIndex().row(), 1);
     if (changedArea.contains(currentTopicIndex))
         setTopic(selectionModel()->currentIndex());
-};
+}
 
-void TopicWidget::setUseCustomFont(const QVariant &v)
+void TopicWidget::setUseCustomFont(const QVariantv)
 {
     if (v.toBool()) {
         UiStyleSettings fs("Fonts");
@@ -77,8 +78,7 @@ void TopicWidget::setUseCustomFont(const QVariant &v)
         setCustomFont(QFont());
 }
 
-
-void TopicWidget::setCustomFont(const QVariant &v)
+void TopicWidget::setCustomFont(const QVariant& v)
 {
     UiStyleSettings fs("Fonts");
     if (!fs.value("UseCustomTopicWidgetFont", false).toBool())
@@ -87,8 +87,7 @@ void TopicWidget::setCustomFont(const QVariant &v)
     setCustomFont(v.value<QFont>());
 }
 
-
-void TopicWidget::setCustomFont(const QFont &f)
+void TopicWidget::setCustomFont(const QFont& f)
 {
     QFont font = f;
     if (font.family().isEmpty())
@@ -98,8 +97,7 @@ void TopicWidget::setCustomFont(const QFont &f)
     ui.topicLabel->setCustomFont(font);
 }
 
-
-void TopicWidget::setTopic(const QModelIndex &index)
+void TopicWidget::setTopic(const QModelIndex& index)
 {
     QString newtopic;
     bool readonly = true;
@@ -107,16 +105,16 @@ void TopicWidget::setTopic(const QModelIndex &index)
     BufferId id = index.data(NetworkModel::BufferIdRole).value<BufferId>();
     if (id.isValid()) {
         QModelIndex index0 = index.sibling(index.row(), 0);
-        const Network *network = Client::network(Client::networkModel()->networkId(id));
+        const Networknetwork = Client::network(Client::networkModel()->networkId(id));
 
         switch (Client::networkModel()->bufferType(id)) {
         case BufferInfo::StatusBuffer:
             if (network) {
                 newtopic = QString("%1 (%2) | %3 | %4")
-                           .arg(Qt::escape(network->networkName()))
-                           .arg(Qt::escape(network->currentServer()))
-                           .arg(tr("Users: %1").arg(network->ircUsers().count()))
-                           .arg(tr("Lag: %1 msecs").arg(network->latency()));
+                               .arg(network->networkName().toHtmlEscaped())
+                               .arg(network->currentServer().toHtmlEscaped())
+                               .arg(tr("Users: %1").arg(network->ircUsers().count()))
+                               .arg(tr("Lag: %1 msecs").arg(network->latency()));
             }
             else {
                 newtopic = index0.data(Qt::DisplayRole).toString();
@@ -128,23 +126,23 @@ void TopicWidget::setTopic(const QModelIndex &index)
             readonly = false;
             break;
 
-        case BufferInfo::QueryBuffer:
-        {
+        case BufferInfo::QueryBuffer: {
             QString nickname = index0.data(Qt::DisplayRole).toString();
             if (network) {
-                const IrcUser *user = network->ircUser(nickname);
+                const IrcUseruser = network->ircUser(nickname);
                 if (user) {
-                    newtopic = QString("%1%2%3 | %4@%5").arg(nickname)
-                               .arg(user->userModes().isEmpty() ? QString() : QString(" (+%1)").arg(user->userModes()))
-                               .arg(user->realName().isEmpty() ? QString() : QString(" | %1").arg(user->realName()))
-                               .arg(user->user())
-                               .arg(user->host());
+                    newtopic = QString("%1%2%3 | %4@%5")
+                                   .arg(nickname)
+                                   .arg(user->userModes().isEmpty() ? QString() : QString(" (+%1)").arg(user->userModes()))
+                                   .arg(user->realName().isEmpty() ? QString() : QString(" | %1").arg(user->realName()))
+                                   .arg(user->user())
+                                   .arg(user->host());
                 }
-                else { // no such user
+                else {  // no such user
                     newtopic = nickname;
                 }
             }
-            else { // no valid Network-Obj.
+            else {  // no valid Network-Obj.
                 newtopic = nickname;
             }
             break;
@@ -154,17 +152,16 @@ void TopicWidget::setTopic(const QModelIndex &index)
         }
     }
 
-    _topic = newtopic;
+    _topic = sanitizeTopic(newtopic);
     _readonly = readonly;
 
     ui.topicEditButton->setVisible(!_readonly);
-    ui.topicLabel->setText(newtopic);
-    ui.topicLineEdit->setPlainText(newtopic);
+    ui.topicLabel->setText(_topic);
+    ui.topicLineEdit->setPlainText(_topic);
     switchPlain();
 }
 
-
-void TopicWidget::setReadOnly(const bool &readonly)
+void TopicWidget::setReadOnly(const bool& readonly)
 {
     if (_readonly == readonly)
         return;
@@ -172,7 +169,6 @@ void TopicWidget::setReadOnly(const bool &readonly)
     _readonly = readonly;
 }
 
-
 void TopicWidget::updateResizeMode()
 {
     StyledLabel::ResizeMode mode = StyledLabel::NoResize;
@@ -187,14 +183,14 @@ void TopicWidget::updateResizeMode()
     ui.topicLabel->setResizeMode(mode);
 }
 
-
-void TopicWidget::clickableActivated(const Clickable &click)
+void TopicWidget::clickableActivated(const Clickable& click)
 {
     NetworkId networkId = selectionModel()->currentIndex().data(NetworkModel::NetworkIdRole).value<NetworkId>();
-    click.activate(networkId, _topic);
+    UiStyle::StyledString sstr = GraphicalUi::uiStyle()->styleString(GraphicalUi::uiStyle()->mircToInternal(_topic),
+                                                                     UiStyle::FormatType::PlainMsg);
+    click.activate(networkId, sstr.plainText);
 }
 
-
 void TopicWidget::on_topicLineEdit_textEntered()
 {
     QModelIndex currentIdx = currentIndex();
@@ -208,13 +204,11 @@ void TopicWidget::on_topicLineEdit_textEntered()
     switchPlain();
 }
 
-
 void TopicWidget::on_topicEditButton_clicked()
 {
     switchEditable();
 }
 
-
 void TopicWidget::switchEditable()
 {
     ui.stackedWidget->setCurrentIndex(1);
@@ -223,7 +217,6 @@ void TopicWidget::switchEditable()
     updateGeometry();
 }
 
-
 void TopicWidget::switchPlain()
 {
     ui.stackedWidget->setCurrentIndex(0);
@@ -232,9 +225,8 @@ void TopicWidget::switchPlain()
     emit switchedPlain();
 }
 
-
 // filter for the input widget to switch back to normal mode
-bool TopicWidget::eventFilter(QObject *obj, QEvent *event)
+bool TopicWidget::eventFilter(QObject* obj, QEvent* event)
 {
     if (event->type() == QEvent::FocusOut && !_mouseEntered) {
         switchPlain();
@@ -252,7 +244,7 @@ bool TopicWidget::eventFilter(QObject *obj, QEvent *event)
     if (event->type() != QEvent::KeyRelease)
         return QObject::eventFilter(obj, event);
 
-    QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
+    auto* keyEvent = static_cast<QKeyEvent*>(event);
 
     if (keyEvent->key() == Qt::Key_Escape) {
         switchPlain();
@@ -261,3 +253,17 @@ bool TopicWidget::eventFilter(QObject *obj, QEvent *event)
 
     return false;
 }
+
+QString TopicWidget::sanitizeTopic(const QString& topic)
+{
+    // Normally, you don't have new lines in topic messages
+    // But the use of "plain text" functionnality from Qt replaces
+    // some unicode characters with a new line, which then triggers
+    // a stack overflow later
+    QString result(topic);
+    result.replace(QChar::CarriageReturn, " ");
+    result.replace(QChar::ParagraphSeparator, " ");
+    result.replace(QChar::LineSeparator, " ");
+
+    return result;
+}