commit ac35535a4b355241f9e7e2fbcadc4524fe26c2e5
parent 714a3989789b0120fe545a8ead86e1bbc31f3a26
Author: Jacki <jacki@thejackimonster.de>
Date: Wed, 13 Mar 2024 18:56:37 +0100
Show list of blocked contacts in settings
Signed-off-by: Jacki <jacki@thejackimonster.de>
Diffstat:
5 files changed, 144 insertions(+), 35 deletions(-)
diff --git a/resources/ui.gresource.xml b/resources/ui.gresource.xml
@@ -1,30 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
- <gresource prefix="/org/gnunet/Messenger">
- <file compressed="true">ui/about.ui</file>
- <file compressed="true">ui/accounts.ui</file>
- <file compressed="true">ui/chat_entry.ui</file>
- <file compressed="true">ui/chat.ui</file>
- <file compressed="true">ui/contact_entry.ui</file>
- <file compressed="true">ui/contact_info.ui</file>
- <file compressed="true">ui/contacts.ui</file>
- <file compressed="true">ui/delete_messages.ui</file>
- <file compressed="true">ui/file_load_entry.ui</file>
- <file compressed="true">ui/invite_contact.ui</file>
- <file compressed="true">ui/message_content.ui</file>
- <file compressed="true">ui/message.ui</file>
- <file compressed="true">ui/message-sent.ui</file>
- <file compressed="true">ui/message-status.ui</file>
- <file compressed="true">ui/messenger.ui</file>
- <file compressed="true">ui/new_contact.ui</file>
- <file compressed="true">ui/new_group.ui</file>
- <file compressed="true">ui/new_lobby.ui</file>
- <file compressed="true">ui/new_platform.ui</file>
- <file compressed="true">ui/new_account.ui</file>
- <file compressed="true">ui/picker.ui</file>
- <file compressed="true">ui/play_media.ui</file>
- <file compressed="true">ui/account_entry.ui</file>
- <file compressed="true">ui/send_file.ui</file>
- <file compressed="true">ui/settings.ui</file>
- </gresource>
+ <gresource prefix="/org/gnunet/Messenger">
+ <file compressed="true">ui/about.ui</file>
+ <file compressed="true">ui/accounts.ui</file>
+ <file compressed="true">ui/chat_entry.ui</file>
+ <file compressed="true">ui/chat.ui</file>
+ <file compressed="true">ui/contact_entry.ui</file>
+ <file compressed="true">ui/contact_info.ui</file>
+ <file compressed="true">ui/contacts.ui</file>
+ <file compressed="true">ui/delete_messages.ui</file>
+ <file compressed="true">ui/file_load_entry.ui</file>
+ <file compressed="true">ui/invite_contact.ui</file>
+ <file compressed="true">ui/message_content.ui</file>
+ <file compressed="true">ui/message.ui</file>
+ <file compressed="true">ui/message-sent.ui</file>
+ <file compressed="true">ui/message-status.ui</file>
+ <file compressed="true">ui/messenger.ui</file>
+ <file compressed="true">ui/new_contact.ui</file>
+ <file compressed="true">ui/new_group.ui</file>
+ <file compressed="true">ui/new_lobby.ui</file>
+ <file compressed="true">ui/new_platform.ui</file>
+ <file compressed="true">ui/new_account.ui</file>
+ <file compressed="true">ui/picker.ui</file>
+ <file compressed="true">ui/play_media.ui</file>
+ <file compressed="true">ui/account_entry.ui</file>
+ <file compressed="true">ui/send_file.ui</file>
+ <file compressed="true">ui/settings.ui</file>
+ </gresource>
</gresources>
diff --git a/resources/ui/settings.ui b/resources/ui/settings.ui
@@ -282,13 +282,53 @@ Author: Tobias Frisch
<property name="visible">True</property>
<property name="can-focus">True</property>
<child>
- <object class="GtkLabel" id="blocked_label">
+ <object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
- <property name="label" translatable="yes">0 blocked contacts</property>
- <style>
- <class name="settings-entry"/>
- </style>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkLabel" id="blocked_label">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes">0 blocked contacts</property>
+ <style>
+ <class name="settings-entry"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="blocked_scrolled_window">
+ <property name="name">0</property>
+ <property name="can-focus">True</property>
+ <property name="propagate-natural-height">True</property>
+ <child>
+ <object class="GtkViewport">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <child>
+ <object class="GtkListBox" id="blocked_listbox">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="selection-mode">none</property>
+ <property name="activate-on-single-click">False</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="pack-type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
</object>
</child>
</object>
diff --git a/src/ui/meson.build b/src/ui/meson.build
@@ -1,6 +1,6 @@
#
# This file is part of GNUnet.
-# Copyright (C) 2023 GNUnet e.V.
+# Copyright (C) 2023--2024 GNUnet e.V.
#
# GNUnet is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
diff --git a/src/ui/settings.c b/src/ui/settings.c
@@ -27,6 +27,8 @@
#include "../application.h"
#include "../request.h"
+#include "contact_entry.h"
+
#include <gnunet/gnunet_chat_lib.h>
#include <gnunet/gnunet_common.h>
@@ -213,6 +215,9 @@ _count_blocked_contacts(void *cls,
{
g_assert((cls) && (contact));
+ if (GNUNET_YES == GNUNET_CHAT_contact_is_owned(contact))
+ return GNUNET_YES;
+
guint *count = (guint*) cls;
if (GNUNET_YES == GNUNET_CHAT_contact_is_blocked(contact))
@@ -221,6 +226,43 @@ _count_blocked_contacts(void *cls,
return GNUNET_YES;
}
+static enum GNUNET_GenericReturnValue
+_iterate_blocked_contacts(void *cls,
+ UNUSED struct GNUNET_CHAT_Handle *handle,
+ struct GNUNET_CHAT_Contact *contact)
+{
+ g_assert((cls) && (contact));
+
+ if ((GNUNET_YES == GNUNET_CHAT_contact_is_owned(contact)) ||
+ (GNUNET_YES != GNUNET_CHAT_contact_is_blocked(contact)))
+ return GNUNET_YES;
+
+ MESSENGER_Application *app = (MESSENGER_Application*) cls;
+
+ UI_CONTACT_ENTRY_Handle *entry = ui_contact_entry_new(app);
+ ui_contact_entry_set_contact(entry, contact);
+
+ gtk_list_box_prepend(
+ app->ui.settings.blocked_listbox,
+ entry->entry_box
+ );
+
+ GtkListBoxRow *row = GTK_LIST_BOX_ROW(
+ gtk_widget_get_parent(entry->entry_box)
+ );
+
+ g_object_set_qdata(G_OBJECT(row), app->quarks.data, contact);
+
+ g_object_set_qdata_full(
+ G_OBJECT(row),
+ app->quarks.ui,
+ entry,
+ (GDestroyNotify) ui_contact_entry_delete
+ );
+
+ return GNUNET_YES;
+}
+
void
ui_settings_dialog_init(MESSENGER_Application *app,
UI_SETTINGS_Handle *handle)
@@ -314,6 +356,14 @@ ui_settings_dialog_init(MESSENGER_Application *app,
gtk_builder_get_object(handle->builder, "blocked_label")
);
+ handle->blocked_scrolled_window = GTK_WIDGET(
+ gtk_builder_get_object(handle->builder, "blocked_scrolled_window")
+ );
+
+ handle->blocked_listbox = GTK_LIST_BOX(
+ gtk_builder_get_object(handle->builder, "blocked_listbox")
+ );
+
guint blocked_count = 0;
GNUNET_CHAT_iterate_contacts(
app->chat.messenger.handle,
@@ -321,13 +371,22 @@ ui_settings_dialog_init(MESSENGER_Application *app,
&blocked_count
);
+ gtk_widget_set_size_request(
+ handle->blocked_scrolled_window,
+ 0,
+ 56 * (blocked_count > 3? 3 : blocked_count)
+ );
+
+ gtk_widget_set_visible(handle->blocked_scrolled_window, blocked_count > 0);
+
GString *blocked_text = g_string_new(NULL);
if (blocked_text)
{
g_string_printf(
blocked_text,
- "%u blocked contacts",
- blocked_count
+ "%u blocked contact%s",
+ blocked_count,
+ blocked_count == 1? "" : "s"
);
gtk_label_set_text(
@@ -338,6 +397,14 @@ ui_settings_dialog_init(MESSENGER_Application *app,
g_string_free(blocked_text, TRUE);
}
+ GNUNET_CHAT_iterate_contacts(
+ app->chat.messenger.handle,
+ _iterate_blocked_contacts,
+ app
+ );
+
+ gtk_list_box_invalidate_filter(handle->blocked_listbox);
+
handle->read_receipts_switch = GTK_SWITCH(
gtk_builder_get_object(handle->builder, "read_receipts_switch")
);
diff --git a/src/ui/settings.h b/src/ui/settings.h
@@ -38,6 +38,8 @@ typedef struct UI_SETTINGS_Handle
GtkSwitch *enable_notifications_switch;
GtkLabel *blocked_label;
+ GtkWidget *blocked_scrolled_window;
+ GtkListBox *blocked_listbox;
GtkSwitch *read_receipts_switch;
GtkComboBox *auto_delete_combo_box;