diff --git a/src/chatlog/chatlog.cpp b/src/chatlog/chatlog.cpp index 9d0cc9075..511899265 100644 --- a/src/chatlog/chatlog.cpp +++ b/src/chatlog/chatlog.cpp @@ -610,6 +610,11 @@ void ChatLog::selectAll() updateMultiSelectionRect(); } +void ChatLog::forceRelayout() +{ + startResizeWorker(); +} + void ChatLog::checkVisibility() { if(lines.empty()) diff --git a/src/chatlog/chatlog.h b/src/chatlog/chatlog.h index b972e25aa..ec7cf5ecd 100644 --- a/src/chatlog/chatlog.h +++ b/src/chatlog/chatlog.h @@ -49,6 +49,7 @@ public: void setTypingNotificationVisible(bool visible); void scrollToLine(ChatLine::Ptr line); void selectAll(); + void forceRelayout(); QString getSelectedText() const; @@ -138,7 +139,7 @@ private: ChatLine::Ptr workerAnchorLine; // layout - QMargins margins = QMargins(10.0,10.0,10.0,10.0); + QMargins margins = QMargins(10,10,10,10); qreal lineSpacing = 5.0f; }; diff --git a/src/chatlog/chatmessage.cpp b/src/chatlog/chatmessage.cpp index 02c065309..581a8069a 100644 --- a/src/chatlog/chatmessage.cpp +++ b/src/chatlog/chatmessage.cpp @@ -35,11 +35,14 @@ ChatMessage::ChatMessage() } -ChatMessage::Ptr ChatMessage::createChatMessage(const QString &sender, const QString &rawMessage, bool isAction, bool alert, bool isMe, const QDateTime &date) +ChatMessage::Ptr ChatMessage::createChatMessage(const QString &sender, const QString &rawMessage, MessageType type, bool isMe, const QDateTime &date) { ChatMessage::Ptr msg = ChatMessage::Ptr(new ChatMessage); QString text = toHtmlChars(rawMessage); + QString senderText = sender; + + const QColor actionColor = QColor("#1818FF"); // has to match the color in innerStyle.css (div.action) //smileys if(Settings::getInstance().getUseEmoticons()) @@ -48,18 +51,23 @@ ChatMessage::Ptr ChatMessage::createChatMessage(const QString &sender, const QSt //quotes (green text) text = detectQuotes(detectAnchors(text)); - if(isAction) + switch(type) { - text = QString("
%1 %2
").arg(sender, text); + case ACTION: + senderText = "*"; + text = wrapDiv(QString("%1 %2").arg(sender, text), "action"); msg->setAsAction(); - } - else if(alert) - { - text = "
" + text + "
"; + break; + case ALERT: + text = wrapDiv(text, "alert"); + break; + default: + text = wrapDiv(text, "msg"); } - msg->addColumn(new Text(isAction ? "
*
" : sender, isMe ? Style::getFont(Style::BigBold) : Style::getFont(Style::Big), isAction ? false : true, sender), ColumnFormat(NAME_COL_WIDTH, ColumnFormat::FixedSize, ColumnFormat::Right)); - msg->addColumn(new Text(text, Style::getFont(Style::Big), false, isAction ? QString("*%1 %2*").arg(sender, rawMessage) : rawMessage), ColumnFormat(1.0, ColumnFormat::VariableSize)); + // Note: Eliding cannot be enabled for RichText items. (QTBUG-17207) + msg->addColumn(new Text(senderText, isMe ? Style::getFont(Style::BigBold) : Style::getFont(Style::Big), true, sender, type == ACTION ? actionColor : Qt::black), ColumnFormat(NAME_COL_WIDTH, ColumnFormat::FixedSize, ColumnFormat::Right)); + msg->addColumn(new Text(text, Style::getFont(Style::Big), false, type == ACTION ? QString("*%1 %2*").arg(sender, rawMessage) : rawMessage), ColumnFormat(1.0, ColumnFormat::VariableSize)); msg->addColumn(new Spinner(":/ui/chatArea/spinner.svg", QSize(16, 16), 360.0/1.6), ColumnFormat(TIME_COL_WIDTH, ColumnFormat::FixedSize, ColumnFormat::Right)); if(!date.isNull()) @@ -219,3 +227,8 @@ QString ChatMessage::toHtmlChars(const QString &str) return res; } + +QString ChatMessage::wrapDiv(const QString &str, const QString &div) +{ + return QString("
%2
").arg(div, str); +} diff --git a/src/chatlog/chatmessage.h b/src/chatlog/chatmessage.h index 0cab27107..c70cba82c 100644 --- a/src/chatlog/chatmessage.h +++ b/src/chatlog/chatmessage.h @@ -35,9 +35,16 @@ public: TYPING, }; + enum MessageType + { + NORMAL, + ACTION, + ALERT, + }; + ChatMessage(); - static ChatMessage::Ptr createChatMessage(const QString& sender, const QString& rawMessage, bool isAction, bool alert, bool isMe, const QDateTime& date = QDateTime()); + static ChatMessage::Ptr createChatMessage(const QString& sender, const QString& rawMessage, MessageType type, bool isMe, const QDateTime& date = QDateTime()); static ChatMessage::Ptr createChatInfoMessage(const QString& rawMessage, SystemMessageType type, const QDateTime& date); static ChatMessage::Ptr createFileTransferMessage(const QString& sender, ToxFile file, bool isMe, const QDateTime& date); static ChatMessage::Ptr createTypingNotification(); @@ -54,6 +61,7 @@ protected: static QString detectAnchors(const QString& str); static QString detectQuotes(const QString& str); static QString toHtmlChars(const QString& str); + static QString wrapDiv(const QString& str, const QString& div); private: bool action = false; diff --git a/src/chatlog/content/filetransferwidget.cpp b/src/chatlog/content/filetransferwidget.cpp index b004854a5..40794e4d0 100644 --- a/src/chatlog/content/filetransferwidget.cpp +++ b/src/chatlog/content/filetransferwidget.cpp @@ -306,6 +306,8 @@ void FileTransferWidget::onFileTransferPaused(ToxFile file) void FileTransferWidget::onFileTransferFinished(ToxFile file) { + static const QStringList openExtensions = { "png", "jpeg", "jpg", "gif", "zip", "rar" }; + if(fileInfo != file) return; @@ -316,14 +318,10 @@ void FileTransferWidget::onFileTransferFinished(ToxFile file) setupButtons(); hideWidgets(); - static const QStringList openExtensions = { "png", "jpeg", "jpg", "gif", "zip", "rar" }; - - if(openExtensions.contains(QFileInfo(file.fileName).suffix())) - { - ui->topButton->setIcon(QIcon(":/ui/fileTransferInstance/yes.svg")); - ui->topButton->setObjectName("ok"); - ui->topButton->show(); - } + ui->topButton->setIcon(QIcon(":/ui/fileTransferInstance/yes.svg")); + ui->topButton->setObjectName("ok"); + ui->topButton->setEnabled(openExtensions.contains(QFileInfo(file.fileName).suffix())); + ui->topButton->show(); // preview if(fileInfo.direction == ToxFile::RECEIVING) diff --git a/src/chatlog/content/text.cpp b/src/chatlog/content/text.cpp index a2009c646..90c287ac5 100644 --- a/src/chatlog/content/text.cpp +++ b/src/chatlog/content/text.cpp @@ -28,10 +28,11 @@ #include #include -Text::Text(const QString& txt, QFont font, bool enableElide, const QString &rwText) +Text::Text(const QString& txt, QFont font, bool enableElide, const QString &rwText, const QColor c) : rawText(rwText) , elide(enableElide) , defFont(font) + , color(c) { setText(txt); setAcceptedMouseButtons(Qt::LeftButton); @@ -52,9 +53,6 @@ void Text::setText(const QString& txt) void Text::setWidth(qreal w) { - if(w == width) - return; - width = w; dirty = true; @@ -171,6 +169,7 @@ void Text::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWid sel.format.setBackground(selectionColor.lighter(selectionHasFocus ? 100 : 160)); sel.format.setForeground(selectionHasFocus ? Qt::white : Qt::black); ctx.selections.append(sel); + ctx.palette.setColor(QPalette::Text, color); // draw text doc->documentLayout()->draw(painter, ctx); diff --git a/src/chatlog/content/text.h b/src/chatlog/content/text.h index 4fe23ad92..292d2396d 100644 --- a/src/chatlog/content/text.h +++ b/src/chatlog/content/text.h @@ -28,7 +28,7 @@ class Text : public ChatLineContent public: // txt: may contain html code // rawText: does not contain html code - Text(const QString& txt = "", QFont font = QFont(), bool enableElide = false, const QString& rawText = QString()); + Text(const QString& txt = "", QFont font = QFont(), bool enableElide = false, const QString& rawText = QString(), const QColor c = Qt::black); virtual ~Text(); void setText(const QString& txt); @@ -83,6 +83,7 @@ private: qreal ascent = 0.0; qreal width = 0.0; QFont defFont; + QColor color; }; diff --git a/src/widget/form/chatform.cpp b/src/widget/form/chatform.cpp index 98183ecce..98e2e5008 100644 --- a/src/widget/form/chatform.cpp +++ b/src/widget/form/chatform.cpp @@ -785,7 +785,7 @@ void ChatForm::loadHistory(QDateTime since, bool processUndelivered) if (msgDate > lastDate) { lastDate = msgDate; - historyMessages.append(ChatMessage::createChatInfoMessage(msgDate.toString(), ChatMessage::INFO, QDateTime::currentDateTime())); + historyMessages.append(ChatMessage::createChatInfoMessage(msgDate.toString(), ChatMessage::INFO, QDateTime())); } // Show each messages @@ -795,7 +795,7 @@ void ChatForm::loadHistory(QDateTime since, bool processUndelivered) ChatMessage::Ptr msg = ChatMessage::createChatMessage(authorStr, isAction ? it.message.right(it.message.length() - 4) : it.message, - isAction, false, + isAction ? ChatMessage::ACTION : ChatMessage::NORMAL, authorId.isMine(), QDateTime()); diff --git a/src/widget/form/genericchatform.cpp b/src/widget/form/genericchatform.cpp index 8c2fd3fb0..39108d51d 100644 --- a/src/widget/form/genericchatform.cpp +++ b/src/widget/form/genericchatform.cpp @@ -65,6 +65,8 @@ GenericChatForm::GenericChatForm(QWidget *parent) chatWidget = new ChatLog(this); chatWidget->setBusyNotification(ChatMessage::createBusyNotification()); + connect(&Settings::getInstance(), &Settings::emojiFontChanged, this, [this]() { chatWidget->forceRelayout(); }); + msgEdit = new ChatTextEdit(); sendButton = new QPushButton(); @@ -211,12 +213,12 @@ ChatMessage::Ptr GenericChatForm::addMessage(const ToxID& author, const QString ChatMessage::Ptr msg; if(isAction) { - msg = ChatMessage::createChatMessage(authorStr, message, true, false, false); + msg = ChatMessage::createChatMessage(authorStr, message, ChatMessage::ACTION, false); previousId.clear(); } else { - msg = ChatMessage::createChatMessage(authorStr, message, false, false, author.isMine()); + msg = ChatMessage::createChatMessage(authorStr, message, ChatMessage::NORMAL, author.isMine()); if(author == previousId) msg->hideSender(); @@ -239,7 +241,7 @@ ChatMessage::Ptr GenericChatForm::addSelfMessage(const QString &message, bool is void GenericChatForm::addAlertMessage(const ToxID &author, QString message, QDateTime datetime) { QString authorStr = resolveToxID(author); - ChatMessage::Ptr msg = ChatMessage::createChatMessage(authorStr, message, false, true, author.isMine(), datetime); + ChatMessage::Ptr msg = ChatMessage::createChatMessage(authorStr, message, ChatMessage::ALERT, author.isMine(), datetime); insertChatMessage(msg); if(author == previousId) diff --git a/ui/chatArea/innerStyle.css b/ui/chatArea/innerStyle.css index 5639d1af4..a1bbb3a13 100644 --- a/ui/chatArea/innerStyle.css +++ b/ui/chatArea/innerStyle.css @@ -1,4 +1,4 @@ -div.message { +div.msg { color: @black; font: @big; }