/* PIKA - Photo and Image Kooker Application * a rebranding of The GNU Image Manipulation Program (created with heckimp) * A derived work which may be trivial. However, any changes may be (C)2023 by Aldercone Studio * * Original copyright, applying to most contents (license remains unchanged): * Copyright (C) 1995 Spencer Kimball and Peter Mattis * * pikatooldialog.c * Copyright (C) 2003 Sven Neumann * * 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 . */ #include "config.h" #include #include #include "libpikawidgets/pikawidgets.h" #include "display-types.h" #include "core/pikaobject.h" #include "core/pikatoolinfo.h" #include "widgets/pikadialogfactory.h" #include "pikadisplayshell.h" #include "pikatooldialog.h" typedef struct _PikaToolDialogPrivate PikaToolDialogPrivate; struct _PikaToolDialogPrivate { PikaDisplayShell *shell; }; #define GET_PRIVATE(dialog) ((PikaToolDialogPrivate *) pika_tool_dialog_get_instance_private ((PikaToolDialog *) (dialog))) static void pika_tool_dialog_dispose (GObject *object); static void pika_tool_dialog_shell_unmap (PikaDisplayShell *shell, PikaToolDialog *dialog); G_DEFINE_TYPE_WITH_PRIVATE (PikaToolDialog, pika_tool_dialog, PIKA_TYPE_VIEWABLE_DIALOG) static void pika_tool_dialog_class_init (PikaToolDialogClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->dispose = pika_tool_dialog_dispose; gtk_widget_class_set_css_name (GTK_WIDGET_CLASS (klass), "PikaToolDialog"); } static void pika_tool_dialog_init (PikaToolDialog *dialog) { } static void pika_tool_dialog_dispose (GObject *object) { PikaToolDialogPrivate *private = GET_PRIVATE (object); g_clear_weak_pointer (&private->shell); G_OBJECT_CLASS (pika_tool_dialog_parent_class)->dispose (object); } /** * pika_tool_dialog_new: (skip) * @tool_info: a #PikaToolInfo * @desc: a string to use in the dialog header or %NULL to use the help * field from #PikaToolInfo * @...: a %NULL-terminated valist of button parameters as described in * gtk_dialog_new_with_buttons(). * * This function conveniently creates a #PikaViewableDialog using the * information stored in @tool_info. It also registers the tool with * the "toplevel" dialog factory. * * Returns: a new #PikaViewableDialog **/ GtkWidget * pika_tool_dialog_new (PikaToolInfo *tool_info, GdkMonitor *monitor, const gchar *title, const gchar *description, const gchar *icon_name, const gchar *help_id, ...) { GtkWidget *dialog; gchar *identifier; va_list args; gboolean use_header_bar; g_return_val_if_fail (PIKA_IS_TOOL_INFO (tool_info), NULL); if (! title) title = tool_info->label; if (! description) description = tool_info->tooltip; if (! help_id) help_id = tool_info->help_id; if (! icon_name) icon_name = pika_viewable_get_icon_name (PIKA_VIEWABLE (tool_info)); g_object_get (gtk_settings_get_default (), "gtk-dialogs-use-header", &use_header_bar, NULL); dialog = g_object_new (PIKA_TYPE_TOOL_DIALOG, "title", title, "role", pika_object_get_name (tool_info), "description", description, "icon-name", icon_name, "help-func", pika_standard_help_func, "help-id", help_id, "use-header-bar", use_header_bar, NULL); va_start (args, help_id); pika_dialog_add_buttons_valist (PIKA_DIALOG (dialog), args); va_end (args); identifier = g_strconcat (pika_object_get_name (tool_info), "-dialog", NULL); pika_dialog_factory_add_foreign (pika_dialog_factory_get_singleton (), identifier, dialog, monitor); g_free (identifier); return dialog; } void pika_tool_dialog_set_shell (PikaToolDialog *tool_dialog, PikaDisplayShell *shell) { PikaToolDialogPrivate *private = GET_PRIVATE (tool_dialog); g_return_if_fail (PIKA_IS_TOOL_DIALOG (tool_dialog)); g_return_if_fail (shell == NULL || PIKA_IS_DISPLAY_SHELL (shell)); if (shell == private->shell) return; if (private->shell) { g_signal_handlers_disconnect_by_func (private->shell, pika_tool_dialog_shell_unmap, tool_dialog); gtk_window_set_transient_for (GTK_WINDOW (tool_dialog), NULL); } g_set_weak_pointer (&private->shell, shell); if (private->shell) { GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (shell)); gtk_window_set_transient_for (GTK_WINDOW (tool_dialog), GTK_WINDOW (toplevel)); g_signal_connect_object (private->shell, "unmap", G_CALLBACK (pika_tool_dialog_shell_unmap), tool_dialog, 0); } } /* private functions */ static void pika_tool_dialog_shell_unmap (PikaDisplayShell *shell, PikaToolDialog *dialog) { /* the dialog being mapped while the shell is being unmapped * happens when switching images in PikaImageWindow */ if (gtk_widget_get_mapped (GTK_WIDGET (dialog))) g_signal_emit_by_name (dialog, "close"); }