summaryrefslogtreecommitdiff
path: root/src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c')
-rw-r--r--src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c222
1 files changed, 214 insertions, 8 deletions
diff --git a/src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c b/src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c
index 591a23f..fdff487 100644
--- a/src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c
+++ b/src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c
@@ -33,6 +33,180 @@
#include <microhttpd.h>
+
+/**
+ * Context for menu callbacks.
+ */
+struct MenuContext
+{
+ /**
+ * Base URL of the selected provider.
+ */
+ char *url;
+
+};
+
+
+/**
+ * An item was selected from the context menu; destroy the menu shell.
+ *
+ * @param menushell menu to destroy
+ * @param user_data the 'struct MenuContext' of the menu
+ */
+static void
+context_popup_selection_done (GtkMenuShell *menushell,
+ gpointer user_data)
+{
+ struct MenuContext *ctx = user_data;
+
+ gtk_widget_destroy (GTK_WIDGET (menushell));
+ GNUNET_free (ctx->url);
+ GNUNET_free (ctx);
+}
+
+
+/**
+ * The user selected the 'view pp' menu.
+ *
+ * @param menuitem the selected menu
+ * @param user_data a `struct MenuContext`
+ */
+static void
+view_terms_of_service (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ struct MenuContext *ctx = user_data;
+ GNUNET_break (0); // FIXME: not implemented
+
+}
+
+
+/**
+ * The user selected the 'view tos' menu.
+ *
+ * @param menuitem the selected menu
+ * @param user_data a `struct MenuContext`
+ */
+static void
+view_privacy_policy (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ struct MenuContext *ctx = user_data;
+
+
+ GNUNET_break (0); // FIXME: not implemented
+}
+
+
+/**
+ * User clicked on the tree view. If it was a right-click, show
+ * context menu to allow user to view PP or TOS.
+ *
+ * @param widget the tree view
+ * @param event the event
+ * @param user_data the builder
+ */
+gboolean
+provider_tree_view_button_press_event_cb (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data)
+{
+ GtkBuilder *builder = GTK_BUILDER (user_data);
+ GdkEventButton *event_button = (GdkEventButton *) event;
+ GtkTreeView *tv;
+ GtkTreeModel *tm;
+ GtkTreePath *path;
+ GtkTreeIter iter;
+ struct MenuContext *ctx;
+ GtkMenu *menu;
+
+ if ((GDK_BUTTON_PRESS != event->type) ||
+ (3 != event_button->button))
+ return FALSE; /* not a right-click */
+ tm = GTK_TREE_MODEL (gtk_builder_get_object (builder,
+ "provider_liststore"));
+ if (NULL == tm)
+ {
+ GNUNET_break (0);
+ return FALSE;
+ }
+ tv = GTK_TREE_VIEW (GCG_get_main_window_object (
+ "provider_tree_view"));
+ if (! gtk_tree_view_get_path_at_pos (tv,
+ event_button->x,
+ event_button->y,
+ &path,
+ NULL,
+ NULL,
+ NULL))
+ {
+ /* nothing selected */
+ return FALSE;
+ }
+ if (! gtk_tree_model_get_iter (tm,
+ &iter,
+ path))
+ {
+ /* not sure how we got a path but no iter... */
+ GNUNET_break (0);
+ return FALSE;
+ }
+ gtk_tree_path_free (path);
+ ctx = GNUNET_new (struct MenuContext);
+ gtk_tree_model_get (tm,
+ &iter,
+ AG_PMC_PROVIDER_URL, &ctx->url,
+ -1);
+ menu = GTK_MENU (gtk_menu_new ());
+ {
+ GtkWidget *child;
+
+ child = gtk_menu_item_new_with_label (_ ("View _privacy policy..."));
+ g_signal_connect (child,
+ "activate",
+ G_CALLBACK (&view_privacy_policy),
+ ctx);
+ gtk_label_set_use_underline (GTK_LABEL (
+ gtk_bin_get_child (GTK_BIN (child))),
+ TRUE);
+ gtk_widget_show (child);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu),
+ child);
+ }
+ {
+ GtkWidget *child;
+
+ child = gtk_menu_item_new_with_label (_("View _terms of service..."));
+ g_signal_connect (child,
+ "activate",
+ G_CALLBACK (&view_terms_of_service),
+ ctx);
+ gtk_label_set_use_underline (GTK_LABEL (
+ gtk_bin_get_child (GTK_BIN (child))),
+ TRUE);
+ gtk_widget_show (child);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu),
+ child);
+ }
+
+ g_signal_connect (menu,
+ "selection-done",
+ G_CALLBACK (&context_popup_selection_done),
+ ctx);
+
+ gtk_menu_popup_at_pointer (menu,
+ event);
+
+ return FALSE;
+}
+
+
+/**
+ * The user clicked the "add" button to add a new provider to the list.
+ *
+ * @param button the button object
+ * @param user_data the builder
+ */
void
url_add_button_clicked_cb (GtkButton *button,
gpointer user_data)
@@ -52,12 +226,20 @@ url_add_button_clicked_cb (GtkButton *button,
NULL,
-1,
AG_PMC_PROVIDER_URL, url,
- -1);
+ AG_PMC_PROVIDER_STATUS, _("new"),
+ AG_PMC_PROVIDER_STATUS_COLOR, "yellow",
+ AG_PMC_PROVIDER_ENABLED, true,
+ AG_PMC_PROVIDER_SENSITIVE, false,
+ AG_PMC_PROVIDER_NOT_SENSITIVE, true,
+ -1);
gtk_entry_set_text (entry,
"");
}
+/**
+ * FIXME.
+ */
void
url_entry_changed_cb (GtkEntry *entry,
gpointer user_data)
@@ -117,14 +299,17 @@ edit_provider_dialog_response_cb (GtkDialog *dialog,
&iter))
do {
gchar *url;
+ gboolean enabled;
gtk_tree_model_get (tm,
&iter,
AG_PMC_PROVIDER_URL, &url,
+ AG_PMC_PROVIDER_ENABLED, &enabled,
-1);
if (NULL == json_object_get (providers,
url))
{
+ // FIXME: store enabled status in JSON state!
GNUNET_assert (0 ==
json_array_append_new (urls,
json_string (url)));
@@ -185,10 +370,15 @@ anastasis_gtk_edit_provider_list_clicked_cb (GtkButton *object,
{
uint32_t http_code;
uint32_t ec;
+ struct TALER_Amount ll;
struct GNUNET_JSON_Specification spec[] = {
GNUNET_JSON_spec_mark_optional (
GNUNET_JSON_spec_uint32 ("http_status",
&http_code)),
+ // FIXME: check: right fieldname?
+ GNUNET_JSON_spec_mark_optional (
+ TALER_JSON_spec_amount_any ("liability_limit",
+ &ll)),
GNUNET_JSON_spec_mark_optional (
GNUNET_JSON_spec_uint32 ("error_code",
&ec)),
@@ -196,7 +386,12 @@ anastasis_gtk_edit_provider_list_clicked_cb (GtkButton *object,
};
char *status;
const char *color;
+ bool sensitive = false;
+ const char *ll_s = NULL;
+ memset (&ll,
+ 0,
+ sizeof (ll));
if (GNUNET_OK !=
GNUNET_JSON_parse (provider,
spec,
@@ -212,6 +407,12 @@ anastasis_gtk_edit_provider_list_clicked_cb (GtkButton *object,
{
status = GNUNET_strdup (_ ("available"));
color = "green";
+ sensitive = true;
+ if (GNUNET_OK ==
+ TALER_amount_is_valid (&ll))
+ ll_s = TALER_amount2s (&ll);
+ else
+ GNUNET_break (0);
}
else if (0 == http_code)
{
@@ -231,13 +432,18 @@ anastasis_gtk_edit_provider_list_clicked_cb (GtkButton *object,
(unsigned int) ec);
color = "red";
}
- gtk_list_store_insert_with_values (ls,
- NULL,
- -1,
- AG_PMC_PROVIDER_URL, url,
- AG_PMC_PROVIDER_STATUS, status,
- AG_PMC_PROVIDER_STATUS_COLOR, color,
- -1);
+ gtk_list_store_insert_with_values (
+ ls,
+ NULL,
+ -1,
+ AG_PMC_PROVIDER_URL, url,
+ AG_PMC_PROVIDER_STATUS, status,
+ AG_PMC_PROVIDER_STATUS_COLOR, color,
+ AG_PMC_PROVIDER_LIABILITY_LIMIT, ll_s,
+ AG_PMC_PROVIDER_ENABLED, sensitive, // FIXME: store active/inactive status in JSON state!
+ AG_PMC_PROVIDER_SENSITIVE, sensitive,
+ AG_PMC_PROVIDER_NOT_SENSITIVE, ! sensitive,
+ -1);
GNUNET_free (status);
}
}