From a9a5574339effeb22fe3e02b30b2e614b93ffa07 Mon Sep 17 00:00:00 2001 From: Stefan Hacker Date: Thu, 16 Apr 2009 04:31:32 +0200 Subject: [PATCH] Add auto formating capability to chatbar. --- src/mumble/MainWindow.cpp | 17 ++++++--- src/mumble/TextMessage.cpp | 70 ++++++++++++++++++++------------------ src/mumble/TextMessage.h | 1 + 3 files changed, 50 insertions(+), 38 deletions(-) diff --git a/src/mumble/MainWindow.cpp b/src/mumble/MainWindow.cpp index 3c7ae7ae9..d8bc9cc4e 100644 --- a/src/mumble/MainWindow.cpp +++ b/src/mumble/MainWindow.cpp @@ -814,7 +814,14 @@ void MainWindow::on_qleChat_returnPressed() { Channel *c = pmModel->getChannel(qtvPlayers->currentIndex()); MumbleProto::TextMessage mptm; - mptm.set_message(u8(qleChat->text())); + QString qsText; + + qsText = qleChat->text(); + if (! Qt::mightBeRichText(qsText)) { + qsText = TextMessage::autoFormat(qsText); + } + + mptm.set_message(u8(qsText)); if (p == NULL || p->uiSession == g.uiSession) { // Channel tree message @@ -822,16 +829,16 @@ void MainWindow::on_qleChat_returnPressed() { c = ClientPlayer::get(g.uiSession)->cChannel; mptm.add_channel_id(c->iId); - g.l->log(Log::TextMessage, tr("To %1: %2").arg(c->qsName).arg(qleChat->text()), tr("Message to %1").arg(c->qsName)); + g.l->log(Log::TextMessage, tr("To channel %1: %2").arg(c->qsName).arg(qsText), tr("Message to channel %1").arg(c->qsName)); } else { // Player message mptm.add_session(p->uiSession); - g.l->log(Log::TextMessage, tr("To %1: %2").arg(p->qsName).arg(qleChat->text()), tr("Message to %1").arg(p->qsName)); + g.l->log(Log::TextMessage, tr("To %1: %2").arg(p->qsName).arg(qsText), tr("Message to %1").arg(p->qsName)); } g.sh->sendMessage(mptm); - qleChat->setText(QString()); + qleChat->clear(); } void MainWindow::on_qmConfig_aboutToShow() { @@ -1073,7 +1080,7 @@ void MainWindow::on_qaChannelSendMessage_triggered() { mptm.add_channel_id(id); mptm.set_message(u8(texm->message())); g.sh->sendMessage(mptm); - g.l->log(Log::TextMessage, tr("To tree %1: %2").arg(c->qsName).arg(texm->message()), tr("Message to tree %1").arg(c->qsName)); + g.l->log(Log::TextMessage, tr("To channel %1: %2").arg(c->qsName).arg(texm->message()), tr("Message to channel %1").arg(c->qsName)); } delete texm; } diff --git a/src/mumble/TextMessage.cpp b/src/mumble/TextMessage.cpp index b22807277..1d2b1509c 100644 --- a/src/mumble/TextMessage.cpp +++ b/src/mumble/TextMessage.cpp @@ -41,6 +41,42 @@ void TextMessage::on_qcbRawMessage_stateChanged(int) { on_qteEdit_textChanged(); } +QString TextMessage::autoFormat(QString qsPlain) { + QRegExp qr; + qr.setMinimal(true); + qr.setPatternSyntax(QRegExp::RegExp2); + qr.setCaseSensitivity(Qt::CaseInsensitive); + + qr.setPattern(QLatin1String("[\\r\\n]+")); + qsPlain.replace(qr, QLatin1String("
")); + + qr.setPattern(QLatin1String("\\*(\\w+)\\*")); + qsPlain.replace(qr, QLatin1String("\\1")); + + qr.setPattern(QLatin1String("\"([^\"]+)\"")); + qsPlain.replace(qr, QLatin1String("\"\\1\"")); + + qr.setPattern(QLatin1String("[a-z]+://[^ <$]*")); + qr.setMinimal(false); + + int idx = 0; + do { + idx = qr.indexIn(qsPlain, idx); + if (idx >= 0) { + QString url = qr.capturedTexts().at(0); + QUrl u(url); + if (u.isValid()) { + int len = qr.matchedLength(); + QString replacement = QString::fromLatin1("%1").arg(url); + qsPlain.replace(idx, len, replacement); + idx += replacement.length(); + } else { + idx++; + } + } + } while (idx >= 0); + return qsPlain; +} void TextMessage::on_qteEdit_textChanged() { qsRep = qteEdit->toPlainText(); @@ -49,39 +85,7 @@ void TextMessage::on_qteEdit_textChanged() { } if (! Qt::mightBeRichText(qsRep) && !qcbRawMessage->isChecked()) { - QRegExp qr; - qr.setMinimal(true); - qr.setPatternSyntax(QRegExp::RegExp2); - qr.setCaseSensitivity(Qt::CaseInsensitive); - - qr.setPattern(QLatin1String("[\\r\\n]+")); - qsRep.replace(qr, QLatin1String("
")); - - qr.setPattern(QLatin1String("\\*(\\w+)\\*")); - qsRep.replace(qr, QLatin1String("\\1")); - - qr.setPattern(QLatin1String("\"([^\"]+)\"")); - qsRep.replace(qr, QLatin1String("\"\\1\"")); - - qr.setPattern(QLatin1String("[a-z]+://[^ <$]*")); - qr.setMinimal(false); - - int idx = 0; - do { - idx = qr.indexIn(qsRep, idx); - if (idx >= 0) { - QString url = qr.capturedTexts().at(0); - QUrl u(url); - if (u.isValid()) { - int len = qr.matchedLength(); - QString replacement = QString::fromLatin1("%1").arg(url); - qsRep.replace(idx, len, replacement); - idx += replacement.length(); - } else { - idx++; - } - } - } while (idx >= 0); + qsRep = autoFormat(qsRep); } qtbPreview->setHtml(qsRep); diff --git a/src/mumble/TextMessage.h b/src/mumble/TextMessage.h index 36d859bef..de4a000e8 100644 --- a/src/mumble/TextMessage.h +++ b/src/mumble/TextMessage.h @@ -44,6 +44,7 @@ class TextMessage : public QDialog, public Ui::TextMessage { TextMessage(QWidget *parent = NULL); QString message(); bool eventFilter(QObject *obj, QEvent *event); + static QString autoFormat(QString qsPlain); public slots: void on_qteEdit_textChanged(); void on_qcbRawMessage_stateChanged(int);