diff --git a/doc/user_manual_en.md b/doc/user_manual_en.md
index db29ffd66..d781230b5 100644
--- a/doc/user_manual_en.md
+++ b/doc/user_manual_en.md
@@ -6,6 +6,7 @@
* [Settings](#settings)
* [Groupchats](#groupchats)
* [Message Styling](#message-styling)
+* [Quotes](#quotes)
* [Multi Window Mode](#multi-window-mode)
* [Keyboard Shortcuts](#keyboard-shortcuts)
@@ -239,6 +240,16 @@ Additionally, qTox supports three modes of Markdown parsing:
*Note that any change in Markdown preference will require a restart.*
+## Quotes
+
+qTox has feature to quote selected text in chat window:
+
+1. Select the text you want to quote.
+2. Right-click on the selected text and choose "Quote selected text" in the
+context menu. You also can use `ALT` + `q` shortcut.
+3. Selected text will be automatically quoted into the message input area in a
+pretty formatting.
+
## Multi Window Mode
In this mode, qTox will separate its main window into a single contact list and
@@ -260,3 +271,4 @@ The following shortcuts are currently supported:
| `CTRL` + `Page Up` | Switch to the previous contact|
| `CTRL` + `TAB` | Switch to the next contact |
| `CTRL` + `SHIFT` + `TAB` | Switch to the previous contact|
+| `ALT` + `q` | Quote selected text |
diff --git a/src/widget/form/genericchatform.cpp b/src/widget/form/genericchatform.cpp
index 372df99cf..510ac9e57 100644
--- a/src/widget/form/genericchatform.cpp
+++ b/src/widget/form/genericchatform.cpp
@@ -191,6 +191,10 @@ GenericChatForm::GenericChatForm(QWidget *parent)
QString(), this, SLOT(onSaveLogClicked()));
clearAction = menu.addAction(QIcon::fromTheme("edit-clear"),
QString(), this, SLOT(clearChatArea(bool)));
+
+ quoteAction = menu.addAction(QIcon(),
+ QString(), this, SLOT(quoteSelectedText()));
+
menu.addSeparator();
connect(emoteButton, &QPushButton::clicked,
@@ -199,6 +203,7 @@ GenericChatForm::GenericChatForm(QWidget *parent)
this, &GenericChatForm::onChatContextMenuRequested);
new QShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_L, this, SLOT(clearChatArea()));
+ new QShortcut(Qt::ALT + Qt::Key_Q, this, SLOT(quoteSelectedText()));
chatWidget->setStyleSheet(Style::getStylesheet(":/ui/chatArea/chatArea.css"));
headWidget->setStyleSheet(Style::getStylesheet(":/ui/chatArea/chatHead.css"));
@@ -562,6 +567,26 @@ void GenericChatForm::onShowMessagesClicked()
}
}
+void GenericChatForm::quoteSelectedText()
+{
+ QString selectedText = chatWidget->getSelectedText();
+
+ if (selectedText.isEmpty())
+ return;
+
+ // forming pretty quote text
+ // 1. insert "> " to the begining of quote;
+ // 2. replace all possible line terminators with "\n> ";
+ // 3. append new line to the end of quote.
+ QString quote = selectedText;
+
+ quote.insert(0, "> ");
+ quote.replace(QRegExp(QString("\r\n|[\r\n\u2028\u2029]")), QString("\n> "));
+ quote.append("\n");
+
+ msgEdit->append(quote);
+}
+
void GenericChatForm::retranslateUi()
{
QString callObjectName = callButton->objectName();
@@ -587,6 +612,7 @@ void GenericChatForm::retranslateUi()
screenshotButton->setToolTip(tr("Send a screenshot"));
saveChatAction->setText(tr("Save chat log"));
clearAction->setText(tr("Clear displayed messages"));
+ quoteAction->setText(tr("Quote selected text"));
}
void GenericChatForm::showNetcam()
diff --git a/src/widget/form/genericchatform.h b/src/widget/form/genericchatform.h
index a1d4d4d1a..985c0a21e 100644
--- a/src/widget/form/genericchatform.h
+++ b/src/widget/form/genericchatform.h
@@ -91,6 +91,7 @@ protected slots:
void hideFileMenu();
void onShowMessagesClicked();
void onSplitterMoved(int pos, int index);
+ void quoteSelectedText();
private:
void retranslateUi();
@@ -109,7 +110,7 @@ protected:
virtual bool eventFilter(QObject* object, QEvent* event) final override;
protected:
- QAction* saveChatAction, *clearAction;
+ QAction* saveChatAction, *clearAction, *quoteAction;
ToxId previousId;
QDateTime prevMsgDateTime;
Widget *parent;
diff --git a/translations/ru.ts b/translations/ru.ts
index 98e6bc14a..22c1b411f 100644
--- a/translations/ru.ts
+++ b/translations/ru.ts
@@ -1171,6 +1171,10 @@ will be sent to them when they appear online to you.
Очистить показываемые сообщения
+
+
+ Цитировать выделенное
+
Не отправлено