X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Ftopicwidget.cpp;h=ff3ce650685f8f15ac6e46f6a93385fbb8b839be;hp=8b8e16d4f8e960fb1231b2fda7c34ac9370df8d6;hb=1f21c1f9613031ae263eeed0c4883bfcd5488343;hpb=04315f46a16fc3627218377071e008b6b9744992 diff --git a/src/qtui/topicwidget.cpp b/src/qtui/topicwidget.cpp index 8b8e16d4..ff3ce650 100644 --- a/src/qtui/topicwidget.cpp +++ b/src/qtui/topicwidget.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2013 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 * @@ -21,29 +21,32 @@ #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(QWidget* parent) : 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(&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 ¤t, 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 QVariant& v) { 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()); } - -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(); if (id.isValid()) { QModelIndex index0 = index.sibling(index.row(), 0); - const Network *network = Client::network(Client::networkModel()->networkId(id)); + const Network* network = 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 IrcUser* user = 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(); - 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(event); + auto* keyEvent = static_cast(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; +}