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:
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;