KTextAddons

textautogeneratelistview.cpp
1/*
2 SPDX-FileCopyrightText: 2025 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6#include "textautogeneratelistview.h"
7#include "core/textautogeneratechatmodel.h"
8#include "core/textautogeneratemanager.h"
9#include "textautogeneratelistviewdelegate.h"
10#include <KLocalizedString>
11#include <QApplication>
12#include <QClipboard>
13#include <QMenu>
14#include <QMouseEvent>
15#include <QScrollBar>
16
17using namespace TextAutogenerateText;
18TextAutogenerateListView::TextAutogenerateListView(QWidget *parent)
19 : QListView(parent)
20 , mDelegate(new TextAutogenerateListViewDelegate(this))
21{
22 setItemDelegate(mDelegate);
23 setModel(TextAutogenerateManager::self()->textAutoGenerateChatModel());
24
25 connect(TextAutogenerateManager::self()->textAutoGenerateChatModel(), &TextAutoGenerateChatModel::conversationCleared, this, [this]() {
26 mDelegate->clearCache();
27 });
28
29 connect(mDelegate, &TextAutogenerateListViewDelegate::updateView, this, [this](const QModelIndex &index) {
30 update(index);
31 });
32
33 connect(TextAutogenerateManager::self()->textAutoGenerateChatModel(),
35 this,
36 [this](const QModelIndex &topLeft, const QModelIndex &, const QList<int> &roles) {
37 if (roles.contains(TextAutoGenerateChatModel::MessageRole) || roles.contains(TextAutoGenerateChatModel::FinishedRole)) {
38 const QByteArray uuid = topLeft.data(TextAutoGenerateChatModel::UuidRole).toByteArray();
39 if (!uuid.isEmpty()) {
40 mDelegate->removeMessageCache(uuid);
41 }
42 }
43 });
44}
45
46TextAutogenerateListView::~TextAutogenerateListView()
47{
48 TextAutogenerateManager::self()->textAutoGenerateChatModel()->resetConversation();
49}
50
51void TextAutogenerateListView::setMessages(const QList<TextAutoGenerateMessage> &msg)
52{
53 TextAutogenerateManager::self()->textAutoGenerateChatModel()->setMessages(msg);
54}
55
56void TextAutogenerateListView::contextMenuEvent(QContextMenuEvent *event)
57{
58 QMenu menu(this);
59 const QModelIndex index = indexAt(event->pos());
60 if (index.isValid()) {
61 auto copyAction = new QAction(QIcon::fromTheme(QStringLiteral("edit-copy")),
62 mDelegate->hasSelection() ? i18nc("@action", "Copy Selection") : i18nc("@action", "Copy"),
63 &menu);
64 copyAction->setShortcut(QKeySequence::Copy);
65 connect(copyAction, &QAction::triggered, this, [index]() {
66 const QString currentValue = index.data().toString();
67 QClipboard *clip = QApplication::clipboard();
68 clip->setText(currentValue, QClipboard::Clipboard);
69 clip->setText(currentValue, QClipboard::Selection);
70 });
71 menu.addAction(copyAction);
72 menu.addSeparator();
73 auto selectAllAction = new QAction(QIcon::fromTheme(QStringLiteral("edit-select-all")), i18nc("@action", "Select All"), &menu);
74 connect(selectAllAction, &QAction::triggered, this, [this, index]() {
75 slotSelectAll(index);
76 });
77 selectAllAction->setShortcut(QKeySequence::SelectAll);
78 menu.addAction(selectAllAction);
79 }
80 if (!menu.actions().isEmpty()) {
81 menu.exec(event->globalPos());
82 }
83}
84
85void TextAutogenerateListView::slotSelectAll(const QModelIndex &index)
86{
87 mDelegate->selectAll(listViewOptions(), index);
88}
89
90void TextAutogenerateListView::resizeEvent(QResizeEvent *ev)
91{
93
94 // Fix not being really at bottom when the view gets reduced by the header widget becoming taller
95 checkIfAtBottom();
96 maybeScrollToBottom(); // this forces a layout in QAIV, which then changes the vbar max value
97 updateVerticalPageStep();
98 mDelegate->clearSizeHintCache();
99}
100
101void TextAutogenerateListView::checkIfAtBottom()
102{
103 auto *vbar = verticalScrollBar();
104 mAtBottom = vbar->value() == vbar->maximum();
105}
106
107void TextAutogenerateListView::maybeScrollToBottom()
108{
109 if (mAtBottom) {
111 }
112}
113
114void TextAutogenerateListView::updateVerticalPageStep()
115{
117}
118
119void TextAutogenerateListView::mouseReleaseEvent(QMouseEvent *event)
120{
121 handleMouseEvent(event);
122}
123
124void TextAutogenerateListView::mouseDoubleClickEvent(QMouseEvent *event)
125{
126 handleMouseEvent(event);
127}
128
129void TextAutogenerateListView::mousePressEvent(QMouseEvent *event)
130{
131 mPressedPosition = event->pos();
132 handleMouseEvent(event);
133}
134
135void TextAutogenerateListView::mouseMoveEvent(QMouseEvent *event)
136{
137 // Drag support
138 const int distance = (event->pos() - mPressedPosition).manhattanLength();
139 if (distance > QApplication::startDragDistance()) {
140 mPressedPosition = {};
141 const QPersistentModelIndex index = indexAt(event->pos());
142 if (index.isValid()) {
143 QStyleOptionViewItem options = listViewOptions();
144 options.rect = visualRect(index);
145 if (maybeStartDrag(event, options, index)) {
146 return;
147 }
148 }
149 }
150 handleMouseEvent(event);
151}
152
153QStyleOptionViewItem TextAutogenerateListView::listViewOptions() const
154{
155 QStyleOptionViewItem option;
156 initViewItemOption(&option);
157 return option;
158}
159
160void TextAutogenerateListView::handleMouseEvent(QMouseEvent *event)
161{
162 const QPersistentModelIndex index = indexAt(event->pos());
163 if (index.isValid()) {
164 if (mCurrentIndex != index) {
165 mCurrentIndex = index;
166 }
167
168 QStyleOptionViewItem options = listViewOptions();
169 options.rect = visualRect(mCurrentIndex);
170 if (mouseEvent(event, options, mCurrentIndex)) {
171 update(mCurrentIndex);
172 }
173 }
174}
175
176bool TextAutogenerateListView::maybeStartDrag(QMouseEvent *event, const QStyleOptionViewItem &option, const QModelIndex &index)
177{
178 return mDelegate->maybeStartDrag(event, option, index);
179}
180
181bool TextAutogenerateListView::mouseEvent(QMouseEvent *event, const QStyleOptionViewItem &option, const QModelIndex &index)
182{
183 return mDelegate->mouseEvent(event, option, index);
184}
185
186#include "moc_textautogeneratelistview.cpp"
QString i18nc(const char *context, const char *text, const TYPE &arg...)
void update(Part *part, const QByteArray &data, qint64 dataSize)
KOSM_EXPORT double distance(const std::vector< const OSM::Node * > &path, Coordinate coord)
void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList< int > &roles)
virtual bool event(QEvent *event) override
QScrollBar * verticalScrollBar() const const
QWidget * viewport() const const
void setPageStep(int)
void triggered(bool checked)
bool isEmpty() const const
void setText(const QString &text, Mode mode)
QClipboard * clipboard()
QIcon fromTheme(const QString &name)
bool contains(const AT &value) const const
virtual QModelIndex indexAt(const QPoint &p) const const override
virtual void initViewItemOption(QStyleOptionViewItem *option) const const override
virtual void resizeEvent(QResizeEvent *e) override
virtual QRect visualRect(const QModelIndex &index) const const override
QVariant data(int role) const const
bool isValid() const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
bool isValid() const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
QByteArray toByteArray() const const
QString toString() const const
void update()
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.