7#include "textautogeneratechatmodel.h"
8#include "textautogeneratetextcore_debug.h"
10using namespace TextAutogenerateText;
11TextAutoGenerateChatModel::TextAutoGenerateChatModel(
QObject *parent)
16TextAutoGenerateChatModel::~TextAutoGenerateChatModel() =
default;
18int TextAutoGenerateChatModel::rowCount(
const QModelIndex &parent)
const
23 return mMessages.count();
26QVariant TextAutoGenerateChatModel::data(
const QModelIndex &index,
int role)
const
28 if (
index.row() < 0 ||
index.row() >= mMessages.count()) {
31 const auto &message = mMessages[
index.row()];
35 return message.htmlGenerated();
37 return message.dateTimeStr();
39 return message.dateTime();
43 return !message.inProgress();
45 return message.uuid();
47 return message.topic();
49 return message.mouseHover();
51 return message.archived();
53 return message.editingMode();
58QList<TextAutoGenerateMessage> TextAutoGenerateChatModel::messages()
const
63void TextAutoGenerateChatModel::setMessages(
const QList<TextAutoGenerateMessage> &newMessages)
66 mMessages = newMessages;
70void TextAutoGenerateChatModel::resetConversation()
75 Q_EMIT conversationCleared();
81 mMessages.append(msg);
82 if (msg.sender() == TextAutoGenerateMessage::Sender::LLM) {
83 auto emitChanged = [
this](
int rowNumber,
const QList<int> &roles = QList<int>()) {
87 emitChanged(mMessages.count() - 1, {FinishedRole});
92QByteArray TextAutoGenerateChatModel::editMessage(
const QByteArray &uuid,
const QString &str)
97 auto matchesUuid = [&](
const TextAutoGenerateMessage &msg) {
98 return msg.uuid() == uuid;
100 const auto it = std::find_if(mMessages.begin(), mMessages.end(), matchesUuid);
101 if (it != mMessages.end()) {
102 const int i = std::distance(mMessages.begin(), it);
103 const QByteArray answerUuid = it->answerUuid();
105 (*it).setContent(str);
106 auto emitChanged = [
this](
int rowNumber,
const QList<int> &roles = QList<int>()) {
110 emitChanged(i, {MessageRole});
112 auto matchesAnswerUuid = [&](
const TextAutoGenerateMessage &msg) {
113 return msg.uuid() == answerUuid;
115 const auto answerIt = std::find_if(mMessages.begin(), mMessages.end(), matchesAnswerUuid);
116 if (answerIt != mMessages.end()) {
117 const int i = std::distance(mMessages.begin(), answerIt);
118 (*answerIt).setInProgress(
true);
119 (*answerIt).setContent({});
120 emitChanged(i, {MessageRole | FinishedRole});
127void TextAutoGenerateChatModel::changeInProgress(
const QByteArray &uuid,
bool inProgress)
132 auto matchesUuid = [&](
const TextAutoGenerateMessage &msg) {
133 return msg.uuid() == uuid;
135 auto it = std::find_if(mMessages.begin(), mMessages.end(), matchesUuid);
136 if (it != mMessages.end()) {
137 (*it).setInProgress(inProgress);
138 const int i = std::distance(mMessages.begin(), it);
139 auto emitChanged = [
this](
int rowNumber,
const QList<int> &roles = QList<int>()) {
143 emitChanged(i, {MessageRole | FinishedRole});
147void TextAutoGenerateChatModel::replaceContent(
const QByteArray &uuid,
const QString &content)
152 auto matchesUuid = [&](
const TextAutoGenerateMessage &msg) {
153 return msg.uuid() == uuid;
155 auto it = std::find_if(mMessages.begin(), mMessages.end(), matchesUuid);
156 if (it != mMessages.end()) {
157 (*it).setContent(content);
158 const int i = std::distance(mMessages.begin(), it);
159 auto emitChanged = [
this](
int rowNumber,
const QList<int> &roles = QList<int>()) {
163 emitChanged(i, {MessageRole});
167void TextAutoGenerateChatModel::removeDiscussion(
const QByteArray &uuid)
172 auto matchesUuid = [&](
const TextAutoGenerateMessage &msg) {
173 return msg.uuid() == uuid;
175 const auto it = std::find_if(mMessages.begin(), mMessages.end(), matchesUuid);
176 if (it != mMessages.end()) {
177 const int i = std::distance(mMessages.begin(), it);
178 const QByteArray answerUuid = it->answerUuid();
180 mMessages.removeAt(i);
183 auto matchesAnswerUuid = [&](
const TextAutoGenerateMessage &msg) {
184 return msg.uuid() == answerUuid;
186 const auto answerIt = std::find_if(mMessages.begin(), mMessages.end(), matchesAnswerUuid);
187 if (answerIt != mMessages.end()) {
188 const int i = std::distance(mMessages.begin(), answerIt);
190 mMessages.removeAt(i);
196bool TextAutoGenerateChatModel::cancelRequest(
const QModelIndex &index)
198 return setData(
index,
false, TextAutoGenerateChatModel::FinishedRole);
201bool TextAutoGenerateChatModel::setData(
const QModelIndex &idx,
const QVariant &value,
int role)
204 qCWarning(TEXTAUTOGENERATETEXT_CORE_LOG) <<
"ERROR: invalid index";
207 const int id = idx.
row();
208 TextAutoGenerateMessage &msg = mMessages[id];
210 case ChatRoles::TopicRole: {
212 const QModelIndex newIndex =
index(idx.
row(), ChatRoles::TopicRole);
216 case ChatRoles::MouseHoverRole:
217 msg.setMouseHover(value.
toBool());
220 case ChatRoles::EditingRole:
221 msg.setEditingMode(value.
toBool());
224 case ChatRoles::FinishedRole:
225 msg.setInProgress(value.
toBool());
228 case ChatRoles::MessageRole:
229 case ChatRoles::SenderRole:
230 case ChatRoles::DateTimeRole:
231 case ChatRoles::UuidRole:
232 case ChatRoles::ArchivedRole:
238QModelIndex TextAutoGenerateChatModel::indexForUuid(
const QByteArray &uuid)
const
240 auto matchesUuid = [&](
const TextAutoGenerateMessage &msg) {
241 return msg.uuid() == uuid;
243 auto it = std::find_if(mMessages.begin(), mMessages.end(), matchesUuid);
244 if (it == mMessages.end()) {
247 const QModelIndex idx =
createIndex(std::distance(mMessages.begin(), it), 0);
251Qt::ItemFlags TextAutoGenerateChatModel::flags(
const QModelIndex &index)
const
253 if (!
index.isValid())
259#include "moc_textautogeneratechatmodel.cpp"
The TextAutoGenerateMessage class.
void beginInsertRows(const QModelIndex &parent, int first, int last)
void beginRemoveRows(const QModelIndex &parent, int first, int last)
QModelIndex createIndex(int row, int column, const void *ptr) const const
void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList< int > &roles)
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const const=0
virtual QModelIndex parent(const QModelIndex &index) const const=0
virtual bool setData(const QModelIndex &index, const QVariant &value, int role)
virtual Qt::ItemFlags flags(const QModelIndex &index) const const override
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const const override
bool isEmpty() const const
bool isValid() const const
QVariant fromValue(T &&value)
bool toBool() const const
QString toString() const const