KTextAddons

textautogeneratetextlineedit.cpp
1/*
2 SPDX-FileCopyrightText: 2025 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#include "textautogeneratetextlineedit.h"
8#include <KLineEditEventHandler>
9#include <KLocalizedString>
10#include <QAbstractTextDocumentLayout>
11
12using namespace TextAutogenerateText;
13TextAutogenerateTextLineEdit::TextAutogenerateTextLineEdit(QWidget *parent)
14 : KTextEdit(parent)
15{
16 setPlaceholderText(i18nc("@info:placeholder", "Enter a message"));
18 setTabChangesFocus(true);
19 setAcceptRichText(false);
20 enableFindReplace(false); // not needed here, let's instead make sure the Ctrl+F shortcut will search through channel history
22}
23
24TextAutogenerateTextLineEdit::~TextAutogenerateTextLineEdit() = default;
25
26QString TextAutogenerateTextLineEdit::text() const
27{
28 return toPlainText();
29}
30
31void TextAutogenerateTextLineEdit::keyPressEvent(QKeyEvent *e)
32{
33 const int key = e->key();
34
35 if (key == Qt::Key_Return || key == Qt::Key_Enter) {
36 if ((key == Qt::Key_Enter && (e->modifiers() == Qt::KeypadModifier)) || !e->modifiers()) {
37 Q_EMIT sendMessage(text());
38 } else {
41 }
42 e->accept();
43 return;
44 } else if (key == Qt::Key_Up || key == Qt::Key_Down) {
45 if (!(e->modifiers() & Qt::AltModifier)) {
46 // document()->lineCount() is > 1 if the user used Shift+Enter
47 // firstBlockLayout->lineCount() is > 1 if a single long line wrapped around
48 const QTextLayout *firstBlockLayout = document()->firstBlock().layout();
49 if (document()->lineCount() > 1 || firstBlockLayout->lineCount() > 1) {
51 return;
52 }
53 }
54 }
55 e->ignore();
56 // Check if the listview or room widget want to handle the key (e.g Esc, PageUp)
57 Q_EMIT keyPressed(e);
58 if (e->isAccepted()) {
59 return;
60 }
61 // Assign key to KTextEdit first otherwise text() doesn't return correct text
63}
64
65QSize TextAutogenerateTextLineEdit::sizeHint() const
66{
67 // The width of the QTextDocument is the current widget width, so this is somewhat circular logic.
68 // But I don't really want to redo the layout with a different width like idealWidth(), seems slow.
69 const QSize docSize = document()->size().toSize();
70 const int margin = int(document()->documentMargin());
71 return {docSize.width() + margin, qMin(300, docSize.height()) + margin};
72}
73
74QSize TextAutogenerateTextLineEdit::minimumSizeHint() const
75{
76 const int margin = int(document()->documentMargin());
77 return {300, fontMetrics().height() + margin};
78}
79
80#include "moc_textautogeneratetextlineedit.cpp"
void keyPressEvent(QKeyEvent *) override
QString i18nc(const char *context, const char *text, const TYPE &arg...)
void catchReturnKey(QObject *lineEdit)
void documentSizeChanged(const QSizeF &newSize)
void accept()
bool isAccepted() const const
void ignore()
int height() const const
int key() const const
Qt::KeyboardModifiers modifiers() const const
Q_EMITQ_EMIT
int height() const const
int width() const const
Key_Return
KeypadModifier
void insertBlock()
void ensureCursorVisible()
QTextCursor textCursor() const const
QString toPlainText() const const
int lineCount() const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
QFontMetrics fontMetrics() const const
void updateGeometry()
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri May 2 2025 12:06:03 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.