diff options
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.c | 222 |
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); } } |