From 5d8e439bc597159e3c9f0a8b65c0ae869dead3a8 Mon Sep 17 00:00:00 2001 From: Matthew Fennell Date: Sat, 27 Dec 2025 12:40:20 +0000 Subject: Import Upstream version 43.0 --- src/gui/gtd-provider-popover.c | 245 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 src/gui/gtd-provider-popover.c (limited to 'src/gui/gtd-provider-popover.c') diff --git a/src/gui/gtd-provider-popover.c b/src/gui/gtd-provider-popover.c new file mode 100644 index 0000000..0fa580d --- /dev/null +++ b/src/gui/gtd-provider-popover.c @@ -0,0 +1,245 @@ +/* gtd-provider-popover.c + * + * Copyright (C) 2015-2020 Georges Basile Stavracas Neto + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#define G_LOG_DOMAIN "GtdProviderPopover" + +#include "gtd-manager.h" +#include "gtd-provider.h" +#include "gtd-provider-popover.h" +#include "gtd-provider-selector.h" +#include "gtd-task-list.h" + +#include + +struct _GtdProviderPopover +{ + GtkPopover parent; + + GtkWidget *change_location_button; + GtkWidget *location_provider_image; + GtkWidget *new_list_create_button; + GtkEditable *new_list_name_entry; + GtkWidget *stack; + GtkWidget *provider_selector; +}; + +G_DEFINE_TYPE (GtdProviderPopover, gtd_provider_popover, GTK_TYPE_POPOVER) + +static void +clear_and_hide (GtdProviderPopover *popover) +{ + GtdManager *manager; + GList *locations; + GList *l; + + g_return_if_fail (GTD_IS_PROVIDER_POPOVER (popover)); + + manager = gtd_manager_get_default (); + + /* Select the default source again */ + locations = gtd_manager_get_providers (manager); + + for (l = locations; l != NULL; l = l->next) + { + if (FALSE)//gtd_provider_get_is_default (l->data)) + { + gtd_provider_selector_set_selected_provider (GTD_PROVIDER_SELECTOR (popover->provider_selector), l->data); + break; + } + } + + g_list_free (locations); + + /* By clearing the text, Create button will get insensitive */ + gtk_editable_set_text (popover->new_list_name_entry, ""); + + /* Hide the popover at last */ + gtk_widget_hide (GTK_WIDGET (popover)); +} + +static void +gtd_provider_popover__closed (GtdProviderPopover *popover) +{ + g_return_if_fail (GTD_IS_PROVIDER_POPOVER (popover)); + + gtk_stack_set_visible_child_name (GTK_STACK (popover->stack), "main"); +} + +static void +on_task_list_created_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr (GError) error = NULL; + + gtd_provider_create_task_list_finish (GTD_PROVIDER (source), result, &error); + + if (error) + { + g_warning ("Error creating task list: %s", error->message); + + gtd_manager_emit_error_message (gtd_manager_get_default (), + _("An error occurred while creating a task list"), + error->message, + NULL, + NULL); + } +} + +static void +create_task_list (GtdProviderPopover *popover) +{ + GtdProvider *provider; + const gchar *name; + + provider = gtd_provider_selector_get_selected_provider (GTD_PROVIDER_SELECTOR (popover->provider_selector)); + name = gtk_editable_get_text (popover->new_list_name_entry); + + gtd_provider_create_task_list (provider, + name, + NULL, + on_task_list_created_cb, + popover); +} + +static void +gtd_provider_popover__entry_activate (GtdProviderPopover *popover, + GtkEntry *entry) +{ + if (gtk_entry_get_text_length (entry) > 0) + { + create_task_list (popover); + clear_and_hide (popover); + } +} + +static void +gtd_provider_popover__action_button_clicked (GtdProviderPopover *popover, + GtkWidget *button) +{ + g_return_if_fail (GTD_IS_PROVIDER_POPOVER (popover)); + + if (button == popover->new_list_create_button) + create_task_list (popover); + + clear_and_hide (popover); +} + +static void +gtd_provider_popover__text_changed_cb (GtdProviderPopover *popover, + GParamSpec *spec, + GtkEntry *entry) +{ + g_return_if_fail (GTD_IS_PROVIDER_POPOVER (popover)); + g_return_if_fail (GTK_IS_ENTRY (entry)); + + gtk_widget_set_sensitive (popover->new_list_create_button, gtk_entry_get_text_length (entry) > 0); +} + +static void +gtd_provider_popover__change_location_clicked (GtdProviderPopover *popover, + GtkWidget *button) +{ + g_return_if_fail (GTD_IS_PROVIDER_POPOVER (popover)); + + if (button == popover->change_location_button) + gtk_stack_set_visible_child_name (GTK_STACK (popover->stack), "selector"); + else + gtk_stack_set_visible_child_name (GTK_STACK (popover->stack), "main"); +} + +static void +gtd_provider_popover__provider_selected (GtdProviderPopover *popover, + GtdProvider *provider) +{ + g_return_if_fail (GTD_IS_PROVIDER_POPOVER (popover)); + g_return_if_fail (GTD_IS_PROVIDER (provider)); + + if (provider) + { + gtk_image_set_from_gicon (GTK_IMAGE (popover->location_provider_image), gtd_provider_get_icon (provider)); + gtk_widget_set_tooltip_text (popover->change_location_button, gtd_provider_get_name (provider)); + + /* Go back immediately after selecting a provider */ + gtk_stack_set_visible_child_name (GTK_STACK (popover->stack), "main"); + + if (gtk_widget_is_visible (GTK_WIDGET (popover))) + gtk_widget_grab_focus (GTK_WIDGET (popover->new_list_name_entry)); + } +} + +static void +gtd_provider_popover_finalize (GObject *object) +{ + G_OBJECT_CLASS (gtd_provider_popover_parent_class)->finalize (object); +} + +static void +gtd_provider_popover_constructed (GObject *object) +{ + GtdProviderPopover *popover; + GtdProvider *provider; + + G_OBJECT_CLASS (gtd_provider_popover_parent_class)->constructed (object); + + popover = GTD_PROVIDER_POPOVER (object); + provider = gtd_provider_selector_get_selected_provider (GTD_PROVIDER_SELECTOR (popover->provider_selector)); + + if (provider) + gtk_image_set_from_gicon (GTK_IMAGE (popover->location_provider_image), gtd_provider_get_icon (provider)); +} + +static void +gtd_provider_popover_class_init (GtdProviderPopoverClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->finalize = gtd_provider_popover_finalize; + object_class->constructed = gtd_provider_popover_constructed; + + g_type_ensure (GTD_TYPE_PROVIDER_SELECTOR); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/todo/ui/gtd-provider-popover.ui"); + + gtk_widget_class_bind_template_child (widget_class, GtdProviderPopover, change_location_button); + gtk_widget_class_bind_template_child (widget_class, GtdProviderPopover, location_provider_image); + gtk_widget_class_bind_template_child (widget_class, GtdProviderPopover, new_list_create_button); + gtk_widget_class_bind_template_child (widget_class, GtdProviderPopover, new_list_name_entry); + gtk_widget_class_bind_template_child (widget_class, GtdProviderPopover, stack); + gtk_widget_class_bind_template_child (widget_class, GtdProviderPopover, provider_selector); + + gtk_widget_class_bind_template_callback (widget_class, gtd_provider_popover__action_button_clicked); + gtk_widget_class_bind_template_callback (widget_class, gtd_provider_popover__change_location_clicked); + gtk_widget_class_bind_template_callback (widget_class, gtd_provider_popover__closed); + gtk_widget_class_bind_template_callback (widget_class, gtd_provider_popover__entry_activate); + gtk_widget_class_bind_template_callback (widget_class, gtd_provider_popover__provider_selected); + gtk_widget_class_bind_template_callback (widget_class, gtd_provider_popover__text_changed_cb); +} + +static void +gtd_provider_popover_init (GtdProviderPopover *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); +} + +GtkWidget* +gtd_provider_popover_new (void) +{ + return g_object_new (GTD_TYPE_PROVIDER_POPOVER, NULL); +} -- cgit v1.2.3