messenger-gtk

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

commit e134f8741e94254b5c36490269032171db31ca8f
parent 36ba13a946169ee4a206bf0895eedf6ca2a3caeb
Author: Jacki <jacki@thejackimonster.de>
Date:   Wed,  3 Jan 2024 18:11:28 +0100

Add block button to contact sidebar

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

Diffstat:
Mresources/ui/chat.ui | 108+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Mresources/ui/contact_info.ui | 2+-
Msrc/ui/chat.c | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/ui/chat.h | 5++++-
4 files changed, 192 insertions(+), 6 deletions(-)

diff --git a/resources/ui/chat.ui b/resources/ui/chat.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) 2021‑‑2022 GNUnet e.V. @@ -674,6 +674,110 @@ Author: Tobias Frisch </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> + <property name="relief">none</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="border-width">4</property> + <property name="spacing">16</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> + <property name="icon_size">3</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="label" translatable="yes">Block Contact</property> + <property name="xalign">0</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> + <property name="relief">none</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="border-width">4</property> + <property name="spacing">16</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> + <property name="icon_size">3</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="label" translatable="yes">Unblock Contact</property> + <property name="xalign">0</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> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> <object class="GtkButton" id="leave_chat_button"> <property name="visible">True</property> <property name="can-focus">True</property> @@ -720,7 +824,7 @@ Author: Tobias Frisch <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="position">1</property> + <property name="position">2</property> </packing> </child> <style> diff --git a/resources/ui/contact_info.ui b/resources/ui/contact_info.ui @@ -172,7 +172,7 @@ Author: Tobias Frisch <object class="GtkImage"> <property name="visible">True</property> <property name="can-focus">False</property> - <property name="icon-name">avatar-default-symbolic</property> + <property name="icon-name">user-info-symbolic</property> </object> <packing> <property name="expand">False</property> diff --git a/src/ui/chat.c b/src/ui/chat.c @@ -25,6 +25,7 @@ #include "chat.h" #include <gdk/gdkkeysyms.h> +#include <gnunet/gnunet_chat_lib.h> #include <stdlib.h> #include "chat_entry.h" @@ -184,6 +185,42 @@ handle_reveal_identity_button_click(GtkButton *button, } static void +handle_block_button_click(UNUSED GtkButton *button, + gpointer user_data) +{ + UI_CHAT_Handle *handle = (UI_CHAT_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_CHAT_Handle *handle = (UI_CHAT_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_leave_chat_button_click(UNUSED GtkButton *button, gpointer user_data) { @@ -194,8 +231,8 @@ handle_leave_chat_button_click(UNUSED GtkButton *button, struct GNUNET_CHAT_Context *context = (struct GNUNET_CHAT_Context*) ( g_object_get_qdata( - G_OBJECT(handle->send_text_view), - handle->app->quarks.data + G_OBJECT(handle->send_text_view), + handle->app->quarks.data ) ); @@ -1081,6 +1118,32 @@ ui_chat_new(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->leave_chat_button = GTK_BUTTON( gtk_builder_get_object(handle->builder, "leave_chat_button") ); @@ -1455,6 +1518,22 @@ ui_chat_update(UI_CHAT_Handle *handle, contact? TRUE : FALSE ); + g_object_set_qdata( + G_OBJECT(handle->block_stack), + app->quarks.data, + contact + ); + + if (GNUNET_YES == GNUNET_CHAT_contact_is_blocked(contact)) + gtk_stack_set_visible_child(handle->block_stack, GTK_WIDGET(handle->unblock_button)); + else + gtk_stack_set_visible_child(handle->block_stack, GTK_WIDGET(handle->block_button)); + + gtk_widget_set_visible( + GTK_WIDGET(handle->block_stack), + contact? TRUE : FALSE + ); + gtk_widget_set_sensitive( GTK_WIDGET(handle->leave_chat_button), (contact) || (group)? TRUE : FALSE diff --git a/src/ui/chat.h b/src/ui/chat.h @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2021--2022 GNUnet e.V. + Copyright (C) 2021--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 @@ -95,6 +95,9 @@ typedef struct UI_CHAT_Handle HdyAvatar *chat_details_avatar; GtkButton *reveal_identity_button; + GtkStack *block_stack; + GtkButton *block_button; + GtkButton *unblock_button; GtkButton *leave_chat_button; GtkSwitch *chat_notifications_switch;