messenger-gtk

Gtk+3 graphical user interfaces for GNUnet Messenger
Log | Files | Refs | Submodules | README | LICENSE

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:
Mresources/ui.gresource.xml | 54+++++++++++++++++++++++++++---------------------------
Mresources/ui/settings.ui | 50+++++++++++++++++++++++++++++++++++++++++++++-----
Msrc/ui/meson.build | 2+-
Msrc/ui/settings.c | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/ui/settings.h | 2++
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;