From 096874d5f4e87b16daadbeceefda6e77c441955e Mon Sep 17 00:00:00 2001 From: apprb Date: Thu, 11 Sep 2014 02:22:00 +0700 Subject: [PATCH] HTML table chat representation replaced by QTextTable one --- widget/chatareawidget.cpp | 29 +++++++++++-- widget/chatareawidget.h | 3 ++ widget/tool/chataction.cpp | 86 ++++++++++++++++---------------------- widget/tool/chataction.h | 23 +++++----- 4 files changed, 73 insertions(+), 68 deletions(-) diff --git a/widget/chatareawidget.cpp b/widget/chatareawidget.cpp index 44d2f6505..1558ed520 100644 --- a/widget/chatareawidget.cpp +++ b/widget/chatareawidget.cpp @@ -33,6 +33,22 @@ ChatAreaWidget::ChatAreaWidget(QWidget *parent) : setOpenLinks(false); setAcceptRichText(false); + chatTextTable = textCursor().insertTable(1,3); + + QTextTableFormat tableFormat; + tableFormat.setColumnWidthConstraints({QTextLength(QTextLength::VariableLength,0), + QTextLength(QTextLength::PercentageLength,100), + QTextLength(QTextLength::VariableLength,0)}); + tableFormat.setBorderStyle(QTextFrameFormat::BorderStyle_None); + chatTextTable->setFormat(tableFormat); + chatTextTable->format().setCellSpacing(2); + chatTextTable->format().setWidth(QTextLength(QTextLength::PercentageLength,100)); + + nameFormat.setAlignment(Qt::AlignRight); + nameFormat.setNonBreakableLines(true); + dateFormat.setAlignment(Qt::AlignLeft); + dateFormat.setNonBreakableLines(true); + connect(this, &ChatAreaWidget::anchorClicked, this, &ChatAreaWidget::onAnchorClicked); connect(verticalScrollBar(), SIGNAL(rangeChanged(int,int)), this, SLOT(onSliderRangeChanged())); } @@ -87,12 +103,17 @@ void ChatAreaWidget::insertMessage(ChatAction *msgAction) checkSlider(); - moveCursor(QTextCursor::End); - moveCursor(QTextCursor::PreviousCell); - QTextCursor cur = textCursor(); + int row = chatTextTable->rows() - 1; + chatTextTable->cellAt(row,0).firstCursorPosition().setBlockFormat(nameFormat); + chatTextTable->cellAt(row,2).firstCursorPosition().setBlockFormat(dateFormat); + QTextCursor cur = chatTextTable->cellAt(row,1).firstCursorPosition(); cur.clearSelection(); cur.setKeepPositionOnInsert(true); - insertHtml(msgAction->getHtml()); + chatTextTable->cellAt(row,0).firstCursorPosition().insertHtml(msgAction->getName()); + chatTextTable->cellAt(row,1).firstCursorPosition().insertHtml(msgAction->getMessage()); + chatTextTable->cellAt(row,2).firstCursorPosition().insertHtml(msgAction->getDate()); + chatTextTable->appendRows(1); + msgAction->setTextCursor(cur); messages.append(msgAction); diff --git a/widget/chatareawidget.h b/widget/chatareawidget.h index ebc76fa06..ffcfd0d5b 100644 --- a/widget/chatareawidget.h +++ b/widget/chatareawidget.h @@ -19,6 +19,7 @@ #include #include +#include class ChatAction; @@ -46,6 +47,8 @@ private: QList messages; bool lockSliderToBottom; int sliderPosition; + QTextTable *chatTextTable; + QTextBlockFormat nameFormat, dateFormat; }; #endif // CHATAREAWIDGET_H diff --git a/widget/tool/chataction.cpp b/widget/tool/chataction.cpp index cb59290ae..92b8a18b3 100644 --- a/widget/tool/chataction.cpp +++ b/widget/tool/chataction.cpp @@ -40,34 +40,42 @@ QString ChatAction::QImage2base64(const QImage &img) return ba.toBase64(); } -QString ChatAction::wrapName(const QString &name) +QString ChatAction::getName() { if (isMe) - return QString("
" + name + "
\n"); + return QString("
" + name + "
"); else - return QString("
" + name + "
\n"); + return QString("
" + name + "
"); } -QString ChatAction::wrapDate(const QString &date) +QString ChatAction::getDate() { - QString res = "
" + date + "
\n"; - return res; -} - -QString ChatAction::wrapMessage(const QString &message) -{ - QString res = "
" + message + "
\n"; - return res; -} - -QString ChatAction::wrapWholeLine(const QString &line) -{ - QString res = "\n" + line + "\n"; + QString res = "
" + date + "
"; return res; } MessageAction::MessageAction(const QString &author, const QString &message, const QString &date, const bool &me) : - ChatAction(me) + ChatAction(me, author, date), + message(message) +{ +} + +void MessageAction::setTextCursor(QTextCursor cursor) +{ + // When this function is called, we're supposed to only update ourselve when needed + // Nobody should ask us to do anything with our content, we're on our own + // Except we never udpate on our own, so we can safely free our resources + + (void) cursor; + message.clear(); + message.squeeze(); + name.clear(); + name.squeeze(); + date.clear(); + date.squeeze(); +} + +QString MessageAction::getMessage() { QString message_ = SmileyPack::getInstance().smileyfied(toHtmlChars(message)); @@ -100,29 +108,11 @@ MessageAction::MessageAction(const QString &author, const QString &message, cons } message_ = message_.left(message_.length()-4); - content = wrapWholeLine(wrapName(author) + wrapMessage(message_) + wrapDate(date)); -} - -void MessageAction::setTextCursor(QTextCursor cursor) -{ - // When this function is called, we're supposed to only update ourselve when needed - // Nobody should ask us to do anything with our content, we're on our own - // Except we never udpate on our own, so we can safely free our resources - - (void) cursor; - content.clear(); - content.squeeze(); -} - -QString MessageAction::getHtml() -{ - return content; + return QString("
" + message_ + "
"); } FileTransferAction::FileTransferAction(FileTransferInstance *widget, const QString &author, const QString &date, const bool &me) : - ChatAction(me), - sender(author), - timestamp(date) + ChatAction(me, author, date) { w = widget; @@ -133,22 +123,16 @@ FileTransferAction::~FileTransferAction() { } -QString FileTransferAction::getHtml() +QString FileTransferAction::getMessage() { QString widgetHtml; if (w != nullptr) widgetHtml = w->getHtmlImage(); else widgetHtml = "
EMPTY CONTENT
"; - QString res = wrapWholeLine(wrapName(sender) + wrapMessage(widgetHtml) + wrapDate(timestamp)); - return res; + return widgetHtml; } -QString FileTransferAction::wrapMessage(const QString &message) -{ - QString res = "" + message + "\n"; - return res; -} void FileTransferAction::setTextCursor(QTextCursor cursor) { cur = cursor; @@ -166,7 +150,7 @@ void FileTransferAction::updateHtml() int pos = cur.selectionStart(); cur.removeSelectedText(); cur.setKeepPositionOnInsert(false); - cur.insertHtml(getHtml()); + cur.insertHtml(getMessage()); cur.setKeepPositionOnInsert(true); int end = cur.position(); cur.setPosition(pos); @@ -176,10 +160,10 @@ void FileTransferAction::updateHtml() if (w->getState() == FileTransferInstance::TransfState::tsCanceled || w->getState() == FileTransferInstance::TransfState::tsFinished) { - sender.clear(); - sender.squeeze(); - timestamp.clear(); - timestamp.squeeze(); + name.clear(); + name.squeeze(); + date.clear(); + date.squeeze(); cur = QTextCursor(); } } diff --git a/widget/tool/chataction.h b/widget/tool/chataction.h index 22420c85e..a324a41c6 100644 --- a/widget/tool/chataction.h +++ b/widget/tool/chataction.h @@ -25,22 +25,21 @@ class FileTransferInstance; class ChatAction : public QObject { public: - ChatAction(const bool &me) : isMe(me) {;} + ChatAction(const bool &me, const QString &author, const QString &date) : isMe(me), name(author), date(date) {;} virtual ~ChatAction(){;} - virtual QString getHtml() = 0; virtual void setTextCursor(QTextCursor cursor){(void)cursor;} ///< Call once, and then you MUST let the object update itself + virtual QString getName(); + virtual QString getMessage() = 0; + virtual QString getDate(); + protected: QString toHtmlChars(const QString &str); QString QImage2base64(const QImage &img); - virtual QString wrapName(const QString &name); - virtual QString wrapDate(const QString &date); - virtual QString wrapMessage(const QString &message); - virtual QString wrapWholeLine(const QString &line); - -private: +protected: bool isMe; + QString name, date; }; class MessageAction : public ChatAction @@ -48,11 +47,11 @@ class MessageAction : public ChatAction public: MessageAction(const QString &author, const QString &message, const QString &date, const bool &me); virtual ~MessageAction(){;} - virtual QString getHtml(); + virtual QString getMessage(); virtual void setTextCursor(QTextCursor cursor) final; private: - QString content; + QString message; }; class FileTransferAction : public ChatAction @@ -61,8 +60,7 @@ class FileTransferAction : public ChatAction public: FileTransferAction(FileTransferInstance *widget, const QString &author, const QString &date, const bool &me); virtual ~FileTransferAction(); - virtual QString getHtml(); - virtual QString wrapMessage(const QString &message); + virtual QString getMessage(); virtual void setTextCursor(QTextCursor cursor) final; private slots: @@ -70,7 +68,6 @@ private slots: private: FileTransferInstance *w; - QString sender, timestamp; QTextCursor cur; };