From 04bb71bd230d453867b89bbfa12d70b48b1b6f99 Mon Sep 17 00:00:00 2001
From: Nico Alt <nicoalt@posteo.org>
Date: Sat, 24 Oct 2020 12:51:43 +0200
Subject: [PATCH] Implement "Delete all messages of a chat"

Fixes #11
---
 briar-gtk/briar_gtk/actions/window.py         |  9 +++++++
 briar-gtk/briar_gtk/containers/main_window.py | 27 +++++++++++++++++++
 briar-gtk/data/ui/chat_menu.ui                | 16 ++++++++++-
 3 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/briar-gtk/briar_gtk/actions/window.py b/briar-gtk/briar_gtk/actions/window.py
index f7cda09..4d79ee0 100644
--- a/briar-gtk/briar_gtk/actions/window.py
+++ b/briar-gtk/briar_gtk/actions/window.py
@@ -23,6 +23,7 @@ class WindowActions(Actions):
 
     def _setup_actions(self):
         self._setup_back_to_sidebar_action()
+        self._setup_delete_all_messages_action()
         self._setup_delete_contact_action()
         self._setup_change_alias_contact_action()
         self._setup_open_about_page_action()
@@ -36,6 +37,10 @@ class WindowActions(Actions):
             f"{WINDOW_PREFIX}.back-to-sidebar", ["<Ctrl>w"]
         )
 
+    def _setup_delete_all_messages_action(self):
+        self._setup_action("delete-all-messages-dialog", None,
+                           self._delete_all_messages_dialog)
+
     def _setup_delete_contact_action(self):
         self._setup_action("delete-contact-dialog", None,
                            self._delete_contact_dialog)
@@ -62,6 +67,10 @@ class WindowActions(Actions):
         if isinstance(self.widget.current_container, MainWindowContainer):
             self.widget.current_container.show_sidebar()
 
+    # pylint: disable=unused-argument
+    def _delete_all_messages_dialog(self, action, parameter):
+        self.widget.current_container.open_delete_all_messages_dialog()
+
     # pylint: disable=unused-argument
     def _delete_contact_dialog(self, action, parameter):
         self.widget.current_container.open_delete_contact_dialog()
diff --git a/briar-gtk/briar_gtk/containers/main_window.py b/briar-gtk/briar_gtk/containers/main_window.py
index b9e0554..d311c1a 100644
--- a/briar-gtk/briar_gtk/containers/main_window.py
+++ b/briar-gtk/briar_gtk/containers/main_window.py
@@ -9,6 +9,7 @@ from gettext import gettext as _
 from gi.repository import Gio, GLib, Gtk
 
 from briar_wrapper.models.contacts import Contacts
+from briar_wrapper.models.private_chat import PrivateChat
 
 from briar_gtk.container import Container
 from briar_gtk.containers.private_chat import PrivateChatContainer
@@ -112,6 +113,24 @@ class MainWindowContainer(Container):
             self.contact_name_label.set_text(user_alias)
             self._refresh_contacts()
 
+    def open_delete_all_messages_dialog(self):
+        if self._current_contact_id == 0:
+            raise Exception("Can't delete all messages with contact ID 0")
+
+        confirmation_dialog = Gtk.MessageDialog(
+            transient_for=APP().window,
+            flags=Gtk.DialogFlags.MODAL,
+            message_type=Gtk.MessageType.WARNING,
+            buttons=Gtk.ButtonsType.OK_CANCEL,
+            text=_("Confirm Message Deletion"),
+        )
+        confirmation_dialog.format_secondary_text(
+            _("Are you sure that you want to delete all messages?")
+        )
+
+        confirmation_dialog.connect("response", self._delete_all_messages)
+        confirmation_dialog.show_all()
+
     def open_delete_contact_dialog(self):
         if self._current_contact_id == 0:
             raise Exception("Can't delete contact with ID 0")
@@ -131,6 +150,14 @@ class MainWindowContainer(Container):
         confirmation_dialog.connect("response", self._delete_contact)
         confirmation_dialog.show_all()
 
+    def _delete_all_messages(self, widget, response_id):
+        if response_id == Gtk.ResponseType.OK:
+            private_chat = PrivateChat(APP().api, self._current_contact_id)
+            private_chat.delete_all_messages()
+            self._refresh_contacts()
+            self.show_sidebar()
+        widget.destroy()
+
     def _delete_contact(self, widget, response_id):
         if response_id == Gtk.ResponseType.OK:
             Contacts(APP().api).delete(self._current_contact_id)
diff --git a/briar-gtk/data/ui/chat_menu.ui b/briar-gtk/data/ui/chat_menu.ui
index 471d119..3e3f789 100755
--- a/briar-gtk/data/ui/chat_menu.ui
+++ b/briar-gtk/data/ui/chat_menu.ui
@@ -35,6 +35,20 @@
             <property name="position">0</property>
           </packing>
         </child>
+        <child>
+          <object class="GtkModelButton" id="delete-all-messages-menu-entry">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="receives_default">False</property>
+            <property name="action_name">win.delete-all-messages-dialog</property>
+            <property name="text" translatable="yes">Delete all messages</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
         <child>
           <object class="GtkModelButton" id="delete-menu-entry">
             <property name="visible">True</property>
@@ -46,7 +60,7 @@
           <packing>
             <property name="expand">False</property>
             <property name="fill">True</property>
-            <property name="position">1</property>
+            <property name="position">2</property>
           </packing>
         </child>
       </object>
-- 
GitLab