@@ -156,6 +156,16 @@ ChatEditor::ChatEditor()
156156 &ChatManager::messageExtraUpdated,
157157 this ,
158158 &ChatEditor::onMessageExtraUpdated);
159+ connect (&ChatManager::instance (),
160+ &ChatManager::messageDeleted,
161+ this ,
162+ [this ](const QString &convId) {
163+ if (convId == m_viewingConvId) {
164+ // Refresh the entire view to update the tree
165+ ViewingChat chat = ChatManager::instance ().getViewingChat (m_viewingConvId);
166+ refreshMessages (chat.messages , chat.conv .currNode );
167+ }
168+ });
159169
160170 connect (m_input, &ChatInput::sendRequested, this , &ChatEditor::onSendRequested);
161171 connect (m_input, &ChatInput::stopRequested, this , &ChatEditor::onStopRequested);
@@ -425,6 +435,7 @@ void ChatEditor::refreshMessages(const QVector<Message> &messages, qint64 leafNo
425435 connect (w, &ChatMessage::editRequested, this , &ChatEditor::onEditRequested);
426436 connect (w, &ChatMessage::regenerateRequested, this , &ChatEditor::onRegenerateRequested);
427437 connect (w, &ChatMessage::siblingChanged, this , &ChatEditor::onSiblingChanged);
438+ connect (w, &ChatMessage::deleteRequested, this , &ChatEditor::onDeleteMessageRequested);
428439 m_messageLayout->addWidget (w);
429440 m_messageWidgets.append (w);
430441 }
@@ -515,6 +526,7 @@ void ChatEditor::onMessageAppended(const Message &msg, qint64 pendingId)
515526 connect (w, &ChatMessage::editRequested, this , &ChatEditor::onEditRequested);
516527 connect (w, &ChatMessage::regenerateRequested, this , &ChatEditor::onRegenerateRequested);
517528 connect (w, &ChatMessage::siblingChanged, this , &ChatEditor::onSiblingChanged);
529+ connect (w, &ChatMessage::deleteRequested, this , &ChatEditor::onDeleteMessageRequested);
518530
519531 m_messageLayout->addWidget (w);
520532 m_messageWidgets.append (w);
@@ -565,6 +577,7 @@ void ChatEditor::onPendingMessageChanged(const Message &pm)
565577 connect (w, &ChatMessage::editRequested, this , &ChatEditor::onEditRequested);
566578 connect (w, &ChatMessage::regenerateRequested, this , &ChatEditor::onRegenerateRequested);
567579 connect (w, &ChatMessage::siblingChanged, this , &ChatEditor::onSiblingChanged);
580+ connect (w, &ChatMessage::deleteRequested, this , &ChatEditor::onDeleteMessageRequested);
568581
569582 // Insert speed label after the assistant widget
570583 if (settings ().showTokensPerSecond .value ()) {
@@ -678,6 +691,34 @@ void ChatEditor::onServerPropsUpdated()
678691 }
679692}
680693
694+ void ChatEditor::onDeleteMessageRequested (const Message &msg)
695+ {
696+ auto [userMessages, assistantMessages] = ChatManager::instance ().getBranchStats (msg.convId ,
697+ msg.id );
698+ int totalMessages = userMessages + assistantMessages;
699+ if (totalMessages > 1 ) {
700+ QString warningText = Tr::tr (" This will delete %1 messages including: %2 user messages and "
701+ " %3 assistant responses ..." )
702+ .arg (totalMessages)
703+ .arg (userMessages)
704+ .arg (assistantMessages);
705+
706+ if (QMessageBox::question (widget (), Tr::tr (" Confirm Branch Deletion" ), warningText)
707+ != QMessageBox::Yes) {
708+ return ;
709+ }
710+ } else {
711+ if (QMessageBox::question (widget (),
712+ Tr::tr (" Delete Message" ),
713+ Tr::tr (" Are you sure you want to delete this message?" ))
714+ != QMessageBox::Yes) {
715+ return ;
716+ }
717+ }
718+
719+ ChatManager::instance ().deleteMessageBranch (msg.convId , msg.id );
720+ }
721+
681722void ChatEditor::startSearch ()
682723{
683724 // Show the floating search toolbar
0 commit comments