From 936e215aed9534894d3a295735f5e54840af5181 Mon Sep 17 00:00:00 2001 From: Konstantinos Sideris Date: Thu, 25 Jan 2018 07:57:19 +0200 Subject: [PATCH] Resize text input vertically to fit the contents --- include/TextInputWidget.h | 3 ++- src/TextInputWidget.cc | 26 ++++++++++++++++++-------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/include/TextInputWidget.h b/include/TextInputWidget.h index cc01be69..c7cb06c5 100644 --- a/include/TextInputWidget.h +++ b/include/TextInputWidget.h @@ -50,6 +50,7 @@ public: void submit(); signals: + void heightChanged(int height); void startedTyping(); void stoppedTyping(); void message(QString); @@ -73,7 +74,7 @@ private: void afterCompletion(int); }; -class TextInputWidget : public QFrame +class TextInputWidget : public QWidget { Q_OBJECT diff --git a/src/TextInputWidget.cc b/src/TextInputWidget.cc index 571df838..755145c5 100644 --- a/src/TextInputWidget.cc +++ b/src/TextInputWidget.cc @@ -32,19 +32,22 @@ #include "TextInputWidget.h" static constexpr size_t INPUT_HISTORY_SIZE = 127; +static constexpr int MAX_TEXTINPUT_HEIGHT = 120; FilteredTextEdit::FilteredTextEdit(QWidget *parent) : QTextEdit{parent} , history_index_{0} , previewDialog_{parent} { + setFrameStyle(QFrame::NoFrame); connect(document()->documentLayout(), &QAbstractTextDocumentLayout::documentSizeChanged, this, &FilteredTextEdit::updateGeometry); - QSizePolicy policy(QSizePolicy::Expanding, QSizePolicy::Fixed); - policy.setHeightForWidth(true); - setSizePolicy(policy); + connect(document()->documentLayout(), + &QAbstractTextDocumentLayout::documentSizeChanged, + this, + [=]() { emit heightChanged(document()->size().toSize().height()); }); working_history_.push_back(""); connect(this, &QTextEdit::textChanged, this, &FilteredTextEdit::textChanged); setAcceptRichText(false); @@ -238,17 +241,16 @@ FilteredTextEdit::receiveImage(const QByteArray img, const QString &img_name) } TextInputWidget::TextInputWidget(QWidget *parent) - : QFrame(parent) + : QWidget(parent) { setFont(QFont("Emoji One")); setFixedHeight(conf::textInput::height); - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); setCursor(Qt::ArrowCursor); topLayout_ = new QHBoxLayout(); topLayout_->setSpacing(0); - topLayout_->setContentsMargins(15, 0, 15, 5); + topLayout_->setContentsMargins(15, 0, 15, 0); QIcon send_file_icon; send_file_icon.addFile(":/icons/icons/ui/paper-clip-outline.png"); @@ -269,9 +271,17 @@ TextInputWidget::TextInputWidget(QWidget *parent) input_ = new FilteredTextEdit(this); input_->setFixedHeight(32); input_->setFont(font); - input_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + input_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); input_->setPlaceholderText(tr("Write a message...")); - input_->setStyleSheet("border: none; padding-top: 5px;"); + + connect(input_, &FilteredTextEdit::heightChanged, this, [=](int height) { + int textInputHeight = std::min(MAX_TEXTINPUT_HEIGHT, std::max(height, 32)); + int widgetHeight = + std::min(MAX_TEXTINPUT_HEIGHT, std::max(height, conf::textInput::height)); + + setFixedHeight(widgetHeight); + input_->setFixedHeight(textInputHeight); + }); sendMessageBtn_ = new FlatButton(this);