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 clear();
39 } else {
42 }
43 e->accept();
44 return;
45 } else if (key == Qt::Key_Up || key == Qt::Key_Down) {
46 if (!(e->modifiers() & Qt::AltModifier)) {
47 // document()->lineCount() is > 1 if the user used Shift+Enter
48 // firstBlockLayout->lineCount() is > 1 if a single long line wrapped around
49 const QTextLayout *firstBlockLayout = document()->firstBlock().layout();
50 if (document()->lineCount() > 1 || firstBlockLayout->lineCount() > 1) {
52 return;
53 }
54 }
55 }
56 e->ignore();
57 // Assign key to KTextEdit first otherwise text() doesn't return correct text
59}
60
61QSize TextAutogenerateTextLineEdit::sizeHint() const
62{
63 // The width of the QTextDocument is the current widget width, so this is somewhat circular logic.
64 // But I don't really want to redo the layout with a different width like idealWidth(), seems slow.
65 const QSize docSize = document()->size().toSize();
66 const int margin = int(document()->documentMargin());
67 return {docSize.width() + margin, qMin(300, docSize.height()) + margin};
68}
69
70QSize TextAutogenerateTextLineEdit::minimumSizeHint() const
71{
72 const int margin = int(document()->documentMargin());
73 return {300, fontMetrics().height() + margin};
74}
75
76#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()
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 clear()
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 Apr 18 2025 12:00:52 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.