messenger-gtk

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

commit bb7b62fdb665c574681847d954b7355686cafd65
parent 8201fb1dd1489899d036d9e32731ec8120ae3b6e
Author: Jacki <jacki@thejackimonster.de>
Date:   Wed,  3 Jan 2024 02:24:08 +0100

Implement button to block and unblock contacts

Signed-off-by: Jacki <jacki@thejackimonster.de>

Diffstat:
Mresources/ui/contact_info.ui | 174++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
Msrc/ui/contact_info.c | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------
Msrc/ui/contact_info.h | 5++++-
3 files changed, 276 insertions(+), 21 deletions(-)

diff --git a/resources/ui/contact_info.ui b/resources/ui/contact_info.ui @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.38.2 +<!-- Generated with glade 3.40.0 Copyright (C) 2022 GNUnet e.V. @@ -110,7 +110,7 @@ Author: Tobias Frisch <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="position">2</property> + <property name="position">1</property> </packing> </child> <child> @@ -155,15 +155,147 @@ Author: Tobias Frisch <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="position">3</property> + <property name="position">2</property> </packing> </child> <child> <object class="GtkButton" id="reveal_identity_button"> - <property name="label" translatable="yes">Reveal Identity</property> <property name="visible">True</property> <property name="can-focus">True</property> <property name="receives-default">True</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="spacing">4</property> + <child> + <object class="GtkImage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">avatar-default-symbolic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-end">16</property> + <property name="label" translatable="yes">Reveal Identity</property> + </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> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkStack" id="block_stack"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <child> + <object class="GtkButton" id="block_button"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="spacing">4</property> + <child> + <object class="GtkImage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">mail-mark-junk-symbolic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-end">16</property> + <property name="label" translatable="yes">Block Contact</property> + <property name="xalign">0.5</property> + </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> + <packing> + <property name="name">page_block</property> + </packing> + </child> + <child> + <object class="GtkButton" id="unblock_button"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="spacing">4</property> + <child> + <object class="GtkImage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">mail-mark-notjunk-symbolic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-end">16</property> + <property name="label" translatable="yes">Unblock Contact</property> + <property name="xalign">0.5</property> + </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> + <packing> + <property name="name">page_unblock</property> + <property name="position">1</property> + </packing> + </child> </object> <packing> <property name="expand">False</property> @@ -173,10 +305,42 @@ Author: Tobias Frisch </child> <child> <object class="GtkButton" id="open_chat_button"> - <property name="label" translatable="yes">Open Private Chat</property> <property name="visible">True</property> <property name="can-focus">True</property> <property name="receives-default">True</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="spacing">4</property> + <child> + <object class="GtkImage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">user-available-symbolic</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-end">16</property> + <property name="label" translatable="yes">Open Private Chat</property> + </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> <packing> <property name="expand">False</property> diff --git a/src/ui/contact_info.c b/src/ui/contact_info.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2022 GNUnet e.V. + Copyright (C) 2022--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 @@ -28,6 +28,7 @@ #include "../application.h" #include "../ui.h" +#include <gnunet/gnunet_chat_lib.h> static void handle_contact_edit_button_click(UNUSED GtkButton *button, @@ -59,8 +60,8 @@ handle_contact_edit_button_click(UNUSED GtkButton *button, if (GNUNET_YES != GNUNET_CHAT_set_name(handle->app->chat.messenger.handle, name)) gtk_entry_set_text( - handle->contact_name_entry, - GNUNET_CHAT_contact_get_name(contact) + handle->contact_name_entry, + GNUNET_CHAT_contact_get_name(contact) ); } else @@ -70,8 +71,8 @@ skip_change_name: gtk_image_set_from_icon_name( handle->contact_edit_symbol, editable? - "document-edit-symbolic" : - "emblem-ok-symbolic", + "document-edit-symbolic" : + "emblem-ok-symbolic", GTK_ICON_SIZE_BUTTON ); @@ -83,7 +84,7 @@ skip_change_name: static void handle_contact_name_entry_activate(UNUSED GtkEntry *entry, - gpointer user_data) + gpointer user_data) { UI_CONTACT_INFO_Handle *handle = (UI_CONTACT_INFO_Handle*) user_data; @@ -103,22 +104,70 @@ _contact_info_reveal_identity(UI_CONTACT_INFO_Handle *handle) static void handle_reveal_identity_button_click(UNUSED GtkButton *button, - gpointer user_data) + gpointer user_data) { _contact_info_reveal_identity((UI_CONTACT_INFO_Handle*) user_data); } static void +handle_block_button_click(UNUSED GtkButton *button, + gpointer user_data) +{ + UI_CONTACT_INFO_Handle *handle = (UI_CONTACT_INFO_Handle*) user_data; + + struct GNUNET_CHAT_Contact *contact = (struct GNUNET_CHAT_Contact*) ( + g_object_get_qdata( + G_OBJECT(handle->block_stack), + handle->app->quarks.data + ) + ); + + if (!contact) + return; + + GNUNET_CHAT_contact_set_blocked(contact, GNUNET_YES); + + gtk_stack_set_visible_child( + handle->block_stack, + GTK_WIDGET(handle->unblock_button) + ); +} + +static void +handle_unblock_button_click(UNUSED GtkButton *button, + gpointer user_data) +{ + UI_CONTACT_INFO_Handle *handle = (UI_CONTACT_INFO_Handle*) user_data; + + struct GNUNET_CHAT_Contact *contact = (struct GNUNET_CHAT_Contact*) ( + g_object_get_qdata( + G_OBJECT(handle->block_stack), + handle->app->quarks.data + ) + ); + + if (!contact) + return; + + GNUNET_CHAT_contact_set_blocked(contact, GNUNET_NO); + + gtk_stack_set_visible_child( + handle->block_stack, + GTK_WIDGET(handle->block_button) + ); +} + +static void handle_open_chat_button_click(UNUSED GtkButton *button, - gpointer user_data) + gpointer user_data) { UI_CONTACT_INFO_Handle *handle = (UI_CONTACT_INFO_Handle*) user_data; struct GNUNET_CHAT_Contact *contact = (struct GNUNET_CHAT_Contact*) ( - g_object_get_qdata( - G_OBJECT(handle->contact_name_entry), - handle->app->quarks.data - ) + g_object_get_qdata( + G_OBJECT(handle->contact_name_entry), + handle->app->quarks.data + ) ); if (!contact) @@ -160,7 +209,7 @@ close_dialog: static void handle_back_button_click(UNUSED GtkButton *button, - gpointer user_data) + gpointer user_data) { UI_CONTACT_INFO_Handle *handle = (UI_CONTACT_INFO_Handle*) user_data; @@ -349,6 +398,32 @@ ui_contact_info_dialog_init(MESSENGER_Application *app, handle ); + handle->block_stack = GTK_STACK( + gtk_builder_get_object(handle->builder, "block_stack") + ); + + handle->block_button = GTK_BUTTON( + gtk_builder_get_object(handle->builder, "block_button") + ); + + g_signal_connect( + handle->block_button, + "clicked", + G_CALLBACK(handle_block_button_click), + handle + ); + + handle->unblock_button = GTK_BUTTON( + gtk_builder_get_object(handle->builder, "unblock_button") + ); + + g_signal_connect( + handle->unblock_button, + "clicked", + G_CALLBACK(handle_unblock_button_click), + handle + ); + handle->open_chat_button = GTK_BUTTON( gtk_builder_get_object(handle->builder, "open_chat_button") ); @@ -415,8 +490,8 @@ ui_contact_info_dialog_init(MESSENGER_Application *app, void ui_contact_info_dialog_update(UI_CONTACT_INFO_Handle *handle, - struct GNUNET_CHAT_Contact *contact, - gboolean reveal) + struct GNUNET_CHAT_Contact *contact, + gboolean reveal) { const char *name = GNUNET_CHAT_contact_get_name(contact); @@ -457,6 +532,19 @@ ui_contact_info_dialog_update(UI_CONTACT_INFO_Handle *handle, key? TRUE : FALSE ); + gtk_stack_set_visible_child( + handle->block_stack, + GNUNET_YES == GNUNET_CHAT_contact_is_blocked(contact)? + GTK_WIDGET(handle->unblock_button) : + GTK_WIDGET(handle->block_button) + ); + + g_object_set_qdata( + G_OBJECT(handle->block_stack), + handle->app->quarks.data, + contact + ); + struct GNUNET_CHAT_Context *context = GNUNET_CHAT_contact_get_context( contact ); diff --git a/src/ui/contact_info.h b/src/ui/contact_info.h @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2022 GNUnet e.V. + Copyright (C) 2022--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 @@ -48,6 +48,9 @@ typedef struct UI_CONTACT_INFO_Handle GtkImage *contact_edit_symbol; GtkButton *reveal_identity_button; + GtkStack *block_stack; + GtkButton *block_button; + GtkButton *unblock_button; GtkButton *open_chat_button; GtkWidget *identity_box;