Resize text input vertically to fit the contents

This commit is contained in:
Konstantinos Sideris 2018-01-25 07:57:19 +02:00
parent 1fad9398fc
commit 936e215aed
2 changed files with 20 additions and 9 deletions

View File

@ -50,6 +50,7 @@ public:
void submit(); void submit();
signals: signals:
void heightChanged(int height);
void startedTyping(); void startedTyping();
void stoppedTyping(); void stoppedTyping();
void message(QString); void message(QString);
@ -73,7 +74,7 @@ private:
void afterCompletion(int); void afterCompletion(int);
}; };
class TextInputWidget : public QFrame class TextInputWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT

View File

@ -32,19 +32,22 @@
#include "TextInputWidget.h" #include "TextInputWidget.h"
static constexpr size_t INPUT_HISTORY_SIZE = 127; static constexpr size_t INPUT_HISTORY_SIZE = 127;
static constexpr int MAX_TEXTINPUT_HEIGHT = 120;
FilteredTextEdit::FilteredTextEdit(QWidget *parent) FilteredTextEdit::FilteredTextEdit(QWidget *parent)
: QTextEdit{parent} : QTextEdit{parent}
, history_index_{0} , history_index_{0}
, previewDialog_{parent} , previewDialog_{parent}
{ {
setFrameStyle(QFrame::NoFrame);
connect(document()->documentLayout(), connect(document()->documentLayout(),
&QAbstractTextDocumentLayout::documentSizeChanged, &QAbstractTextDocumentLayout::documentSizeChanged,
this, this,
&FilteredTextEdit::updateGeometry); &FilteredTextEdit::updateGeometry);
QSizePolicy policy(QSizePolicy::Expanding, QSizePolicy::Fixed); connect(document()->documentLayout(),
policy.setHeightForWidth(true); &QAbstractTextDocumentLayout::documentSizeChanged,
setSizePolicy(policy); this,
[=]() { emit heightChanged(document()->size().toSize().height()); });
working_history_.push_back(""); working_history_.push_back("");
connect(this, &QTextEdit::textChanged, this, &FilteredTextEdit::textChanged); connect(this, &QTextEdit::textChanged, this, &FilteredTextEdit::textChanged);
setAcceptRichText(false); setAcceptRichText(false);
@ -238,17 +241,16 @@ FilteredTextEdit::receiveImage(const QByteArray img, const QString &img_name)
} }
TextInputWidget::TextInputWidget(QWidget *parent) TextInputWidget::TextInputWidget(QWidget *parent)
: QFrame(parent) : QWidget(parent)
{ {
setFont(QFont("Emoji One")); setFont(QFont("Emoji One"));
setFixedHeight(conf::textInput::height); setFixedHeight(conf::textInput::height);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
setCursor(Qt::ArrowCursor); setCursor(Qt::ArrowCursor);
topLayout_ = new QHBoxLayout(); topLayout_ = new QHBoxLayout();
topLayout_->setSpacing(0); topLayout_->setSpacing(0);
topLayout_->setContentsMargins(15, 0, 15, 5); topLayout_->setContentsMargins(15, 0, 15, 0);
QIcon send_file_icon; QIcon send_file_icon;
send_file_icon.addFile(":/icons/icons/ui/paper-clip-outline.png"); send_file_icon.addFile(":/icons/icons/ui/paper-clip-outline.png");
@ -269,9 +271,17 @@ TextInputWidget::TextInputWidget(QWidget *parent)
input_ = new FilteredTextEdit(this); input_ = new FilteredTextEdit(this);
input_->setFixedHeight(32); input_->setFixedHeight(32);
input_->setFont(font); input_->setFont(font);
input_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); input_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
input_->setPlaceholderText(tr("Write a message...")); 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); sendMessageBtn_ = new FlatButton(this);