[gimp] app: new welcome dialog to appear only at first launch after a new…
- From: Jehan <jehanp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: new welcome dialog to appear only at first launch after a new…
- Date: Tue, 22 Feb 2022 11:56:00 +0000 (UTC)
commit 62a76d785610bdd77795954a4eee3d18f350f00f
Author: Jehan <jehan girinstud io>
Date: Sun Feb 20 18:23:27 2022 +0100
app: new welcome dialog to appear only at first launch after a new…
… installation or an update.
app/actions/dialogs-actions.c | 6 +
app/dialogs/Makefile.am | 20 +-
app/dialogs/dialogs-constructors.c | 10 +
app/dialogs/dialogs-constructors.h | 4 +
app/dialogs/dialogs.c | 2 +
app/dialogs/meson.build | 2 +
app/dialogs/welcome-dialog.c | 457 +++++++++++++++++++++++++++++++++++++
app/dialogs/welcome-dialog.h | 28 +++
app/widgets/gimphelp-ids.h | 1 +
menus/image-menu.xml.in | 1 +
meson.build | 1 +
po/POTFILES.in | 1 +
12 files changed, 525 insertions(+), 8 deletions(-)
---
diff --git a/app/actions/dialogs-actions.c b/app/actions/dialogs-actions.c
index 2b3972d0ea..613a8a9fee 100644
--- a/app/actions/dialogs-actions.c
+++ b/app/actions/dialogs-actions.c
@@ -276,6 +276,12 @@ static const GimpStringActionEntry dialogs_toplevel_actions[] =
"gimp-tips-dialog",
GIMP_HELP_TIPS_DIALOG },
+ { "dialogs-welcome", GIMP_ICON_DIALOG_INFORMATION,
+ NC_("dialogs-action", "Welcome Dialog"), NULL,
+ NC_("dialogs-action", "Show information on running GIMP release"),
+ "gimp-welcome-dialog",
+ GIMP_HELP_WELCOME_DIALOG },
+
{ "dialogs-about", GIMP_ICON_HELP_ABOUT,
#if defined(G_OS_WIN32)
NC_("dialogs-action", "About GIMP"),
diff --git a/app/dialogs/Makefile.am b/app/dialogs/Makefile.am
index 49abd913de..4391216a3c 100644
--- a/app/dialogs/Makefile.am
+++ b/app/dialogs/Makefile.am
@@ -1,13 +1,15 @@
## Process this file with automake to produce Makefile.in
AM_CPPFLAGS = \
- -DG_LOG_DOMAIN=\"Gimp-Dialogs\" \
- -I$(top_builddir) \
- -I$(top_srcdir) \
- -I$(top_builddir)/app \
- -I$(top_srcdir)/app \
- $(GEGL_CFLAGS) \
- $(GTK_CFLAGS) \
+ -DG_LOG_DOMAIN=\"Gimp-Dialogs\" \
+ -DDESKTOP_DATADIR=\""$(DESKTOP_DATADIR)"\" \
+ -I$(top_builddir) \
+ -I$(top_srcdir) \
+ -I$(top_builddir)/app \
+ -I$(top_srcdir)/app \
+ $(APPSTREAM_GLIB_CFLAGS) \
+ $(GEGL_CFLAGS) \
+ $(GTK_CFLAGS) \
-I$(includedir)
noinst_LIBRARIES = libappdialogs.a
@@ -102,7 +104,9 @@ libappdialogs_a_sources = \
vectors-import-dialog.c \
vectors-import-dialog.h \
vectors-options-dialog.c \
- vectors-options-dialog.h
+ vectors-options-dialog.h \
+ welcome-dialog.c \
+ welcome-dialog.h
libappdialogs_a_built_sources = \
authors.h
diff --git a/app/dialogs/dialogs-constructors.c b/app/dialogs/dialogs-constructors.c
index 36a8065179..e6820b57bb 100644
--- a/app/dialogs/dialogs-constructors.c
+++ b/app/dialogs/dialogs-constructors.c
@@ -83,6 +83,7 @@
#include "preferences-dialog.h"
#include "quit-dialog.h"
#include "tips-dialog.h"
+#include "welcome-dialog.h"
#include "gimp-intl.h"
@@ -199,6 +200,15 @@ dialogs_tips_get (GimpDialogFactory *factory,
return tips_dialog_create (context->gimp);
}
+GtkWidget *
+dialogs_welcome_get (GimpDialogFactory *factory,
+ GimpContext *context,
+ GimpUIManager *ui_manager,
+ gint view_size)
+{
+ return welcome_dialog_create (context->gimp);
+}
+
GtkWidget *
dialogs_about_get (GimpDialogFactory *factory,
GimpContext *context,
diff --git a/app/dialogs/dialogs-constructors.h b/app/dialogs/dialogs-constructors.h
index e656e35b26..265e2638b0 100644
--- a/app/dialogs/dialogs-constructors.h
+++ b/app/dialogs/dialogs-constructors.h
@@ -69,6 +69,10 @@ GtkWidget * dialogs_tips_get (GimpDialogFactory *factory,
GimpContext *context,
GimpUIManager *ui_manager,
gint view_size);
+GtkWidget * dialogs_welcome_get (GimpDialogFactory *factory,
+ GimpContext *context,
+ GimpUIManager *ui_manager,
+ gint view_size);
GtkWidget * dialogs_about_get (GimpDialogFactory *factory,
GimpContext *context,
GimpUIManager *ui_manager,
diff --git a/app/dialogs/dialogs.c b/app/dialogs/dialogs.c
index 730e777928..2ffb8ed253 100644
--- a/app/dialogs/dialogs.c
+++ b/app/dialogs/dialogs.c
@@ -281,6 +281,8 @@ static const GimpDialogFactoryEntry entries[] =
dialogs_palette_import_get, TRUE, TRUE, TRUE),
TOPLEVEL ("gimp-tips-dialog",
dialogs_tips_get, TRUE, FALSE, FALSE),
+ TOPLEVEL ("gimp-welcome-dialog",
+ dialogs_welcome_get, TRUE, FALSE, FALSE),
TOPLEVEL ("gimp-about-dialog",
dialogs_about_get, TRUE, FALSE, FALSE),
TOPLEVEL ("gimp-action-search-dialog",
diff --git a/app/dialogs/meson.build b/app/dialogs/meson.build
index d934dadecf..3f4cbb6daa 100644
--- a/app/dialogs/meson.build
+++ b/app/dialogs/meson.build
@@ -43,6 +43,7 @@ libappdialogs_sources = [
'vectors-export-dialog.c',
'vectors-import-dialog.c',
'vectors-options-dialog.c',
+ 'welcome-dialog.c',
gitversion_h,
]
@@ -61,5 +62,6 @@ libappdialogs = static_library('appdialogs',
c_args: '-DG_LOG_DOMAIN="Gimp-Dialogs"',
dependencies: [
gegl, gtk3,
+ appstream_glib,
],
)
diff --git a/app/dialogs/welcome-dialog.c b/app/dialogs/welcome-dialog.c
new file mode 100644
index 0000000000..55263d9ccf
--- /dev/null
+++ b/app/dialogs/welcome-dialog.c
@@ -0,0 +1,457 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * welcome-dialog.c
+ * Copyright (C) 2022 Jehan
+ *
+ * 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 <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <appstream-glib.h>
+#include <gegl.h>
+#include <gtk/gtk.h>
+#ifdef GDK_WINDOWING_WAYLAND
+#include <gdk/gdkwayland.h>
+#endif
+
+#include "libgimpbase/gimpbase.h"
+#include "libgimpwidgets/gimpwidgets.h"
+
+#include "dialogs-types.h"
+
+#include "config/gimpguiconfig.h"
+
+#include "core/gimp.h"
+#include "core/gimp-utils.h"
+
+#include "widgets/gimphelp-ids.h"
+
+#include "welcome-dialog.h"
+
+#include "gimp-intl.h"
+
+
+static void welcome_add_link (GtkGrid *grid,
+ gint column,
+ gint *row,
+ const gchar *emoji,
+ const gchar *title,
+ const gchar *link);
+
+
+GtkWidget *
+welcome_dialog_create (Gimp *gimp)
+{
+ GtkWidget *welcome_dialog;
+ AsApp *app = NULL;
+ const gchar *release_notes = NULL;
+ GError *error = NULL;
+ GFile *splash_file;
+ GdkPixbuf *pixbuf;
+ GdkMonitor *monitor;
+ GdkRectangle workarea;
+
+ GtkWidget *main_vbox;
+ GtkWidget *stack;
+ GtkWidget *grid;
+ GtkWidget *switcher;
+
+ GtkWidget *scrolled_window;
+ GtkWidget *vbox;
+ GtkWidget *hbox;
+ GtkWidget *image;
+ GtkWidget *widget;
+
+ GtkTextBuffer *buffer;
+ GtkTextIter iter;
+
+ gchar *release_link;
+ gchar *appdata_path;
+ gchar *title;
+ gchar *markup;
+ gchar *tmp;
+
+ gint row;
+ gint max_width;
+ gint max_height;
+
+ g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
+
+ appdata_path = g_build_filename (DESKTOP_DATADIR, "metainfo",
+ "org.gimp.GIMP.appdata.xml",
+ NULL);
+ if (g_file_test (appdata_path, G_FILE_TEST_IS_REGULAR))
+ {
+ AsRelease *release;
+
+ app = as_app_new ();
+ if (as_app_parse_file (app, appdata_path,
+ AS_APP_PARSE_FLAG_USE_HEURISTICS,
+ &error))
+ {
+ if ((release = as_app_get_release (app, GIMP_VERSION)) != NULL)
+ release_notes = as_release_get_description (release, g_getenv ("LANGUAGE")) ?
+ as_release_get_description (release, g_getenv ("LANGUAGE")) :
+ as_release_get_description (release, NULL);
+ else if (GIMP_MICRO_VERSION % 2 == 0)
+ g_printerr ("%s: no <release> tag for version %s in '%s'\n",
+ G_STRFUNC, GIMP_VERSION, appdata_path);
+ }
+ else if (error)
+ {
+ g_printerr ("%s: %s\n", G_STRFUNC, error->message);
+ g_clear_error (&error);
+ }
+ else
+ {
+ g_printerr ("%s: failed to load AppStream file '%s'\n", G_STRFUNC, appdata_path);
+ }
+ }
+ else
+ {
+ /* Note that none of the errors here and above should happen.
+ * Each of our releases (even micro value) should have a <release>
+ * tag. But I am just printing to stderr and half-ignoring the
+ * miss because it is not serious enough to break normal GIMP
+ * usage.
+ */
+ g_printerr ("%s: AppStream file '%s' is not a regular file.\n", G_STRFUNC, appdata_path);
+ }
+ g_free (appdata_path);
+
+ monitor = gimp_get_monitor_at_pointer ();
+ gdk_monitor_get_workarea (monitor, &workarea);
+#ifdef GDK_WINDOWING_WAYLAND
+ if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ()))
+ {
+ /* See the long comment in app/gui/splash.c on why we do this
+ * weird stuff for Wayland only.
+ * See also #5322.
+ */
+ max_width = workarea.width / 4;
+ max_height = workarea.height / 4;
+ }
+ else
+#endif
+ {
+ max_width = workarea.width / 2;
+ max_height = workarea.height / 2;
+ }
+
+ /* Translators: the %s string will be the version, e.g. "3.0". */
+ title = g_strdup_printf (_("Welcome to GIMP %s"), GIMP_VERSION);
+ welcome_dialog = gimp_dialog_new (title,
+ "gimp-welcome-dialog",
+ NULL, 0, NULL, NULL,
+ NULL);
+ gtk_window_set_resizable (GTK_WINDOW (welcome_dialog), FALSE);
+ g_free (title);
+
+ g_signal_connect (welcome_dialog,
+ "response",
+ G_CALLBACK (gtk_widget_destroy),
+ NULL);
+
+ main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 12);
+ gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (welcome_dialog))),
+ main_vbox, TRUE, TRUE, 0);
+ gtk_widget_show (main_vbox);
+
+ stack = gtk_stack_new ();
+ gtk_box_pack_start (GTK_BOX (main_vbox), stack, TRUE, TRUE, 0);
+ gtk_widget_show (stack);
+
+ /****************/
+ /* Welcome page */
+ /****************/
+
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_stack_add_titled (GTK_STACK (stack), vbox, "welcome",
+ "Welcome");
+ gtk_widget_show (vbox);
+
+ splash_file = gimp_data_directory_file ("images", "gimp-splash.png", NULL);
+ pixbuf = gdk_pixbuf_new_from_file_at_scale (g_file_peek_path (splash_file),
+ max_width, max_height,
+ TRUE, &error);
+ if (pixbuf)
+ {
+ image = gtk_image_new_from_pixbuf (pixbuf);
+ g_object_unref (pixbuf);
+ }
+ else
+ {
+ g_printerr ("%s: Error loading '%s': %s\n", G_STRFUNC,
+ g_file_peek_path (splash_file),
+ error->message);
+ g_clear_error (&error);
+
+ image = gtk_image_new_from_icon_name ("gimp-wilber",
+ GTK_ICON_SIZE_DIALOG);
+ }
+ g_object_unref (splash_file);
+
+ gtk_widget_set_valign (image, GTK_ALIGN_CENTER);
+ gtk_box_pack_start (GTK_BOX (vbox), image, FALSE, FALSE, 0);
+ gtk_widget_show (image);
+
+ /* Welcome title. */
+
+ /* Translators: the %s string will be the version, e.g. "3.0". */
+ tmp = g_strdup_printf (_("You installed GIMP %s!"), GIMP_VERSION);
+ markup = g_strdup_printf ("<big>%s</big>", tmp);
+ g_free (tmp);
+ widget = gtk_label_new (NULL);
+ gtk_label_set_markup (GTK_LABEL (widget), markup);
+ g_free (markup);
+ gtk_label_set_selectable (GTK_LABEL (widget), TRUE);
+ gtk_label_set_justify (GTK_LABEL (widget), GTK_JUSTIFY_CENTER);
+ gtk_label_set_line_wrap (GTK_LABEL (widget), FALSE);
+ gtk_box_pack_start (GTK_BOX (vbox), widget, TRUE, TRUE, 0);
+ gtk_widget_show (widget);
+
+ grid = gtk_grid_new ();
+ gtk_grid_set_column_homogeneous (GTK_GRID (grid), TRUE);
+ gtk_grid_set_row_spacing (GTK_GRID (grid), 0);
+ gtk_grid_set_column_spacing (GTK_GRID (grid), 4);
+ gtk_box_pack_start (GTK_BOX (vbox), grid, TRUE, TRUE, 0);
+ gtk_widget_show (grid);
+
+ /* Welcome message: left */
+
+ markup = _("GIMP is a Free Software for image authoring and manipulation.\n"
+ "Want to know more?");
+
+ widget = gtk_label_new (NULL);
+ gtk_label_set_max_width_chars (GTK_LABEL (widget), 30);
+ /*gtk_widget_set_size_request (widget, max_width / 2, -1);*/
+ gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE);
+ gtk_widget_set_vexpand (widget, FALSE);
+ gtk_widget_set_hexpand (widget, FALSE);
+
+ /* Making sure the labels are well top aligned to avoid some ugly
+ * misalignment if left and right labels have different sizes,
+ * but also left-aligned so that the messages are slightly to the left
+ * of the emoji/link list below.
+ * Following design decisions by Aryeom.
+ */
+ gtk_label_set_xalign (GTK_LABEL (widget), 0.0);
+ gtk_label_set_yalign (GTK_LABEL (widget), 0.0);
+ gtk_widget_set_margin_bottom (widget, 10);
+ gtk_label_set_markup (GTK_LABEL (widget), markup);
+
+ gtk_grid_attach (GTK_GRID (grid), widget, 0, 0, 1, 1);
+
+ gtk_widget_show (widget);
+
+ row = 1;
+ welcome_add_link (GTK_GRID (grid), 0, &row,
+ /* "globe with meridians" emoticone in UTF-8. */
+ "\xf0\x9f\x8c\x90",
+ _("GIMP website"), "https://www.gimp.org/");
+ welcome_add_link (GTK_GRID (grid), 0, &row,
+ /* "graduation cap" emoticone in UTF-8. */
+ "\xf0\x9f\x8e\x93",
+ _("Tutorials"),
+ "https://www.gimp.org/tutorials/");
+ welcome_add_link (GTK_GRID (grid), 0, &row,
+ /* "open book" emoticone in UTF-8. */
+ "\xf0\x9f\x93\x96",
+ _("Documentation"),
+ "https://docs.gimp.org/");
+
+ /* XXX: should we add API docs for plug-in developers once it's
+ * properly set up? */
+
+ /* Welcome message: right */
+
+ markup = _("GIMP is a Community Software under the GNU general public license v3.\n"
+ "Want to contribute?");
+
+ widget = gtk_label_new (NULL);
+ gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE);
+ gtk_label_set_max_width_chars (GTK_LABEL (widget), 30);
+ /*gtk_widget_set_size_request (widget, max_width / 2, -1);*/
+
+ /* Again the alignments are important. */
+ gtk_label_set_xalign (GTK_LABEL (widget), 0.0);
+ gtk_widget_set_vexpand (widget, FALSE);
+ gtk_widget_set_hexpand (widget, FALSE);
+ gtk_label_set_xalign (GTK_LABEL (widget), 0.0);
+ gtk_label_set_yalign (GTK_LABEL (widget), 0.0);
+ gtk_widget_set_margin_bottom (widget, 10);
+ gtk_label_set_markup (GTK_LABEL (widget), markup);
+
+ gtk_grid_attach (GTK_GRID (grid), widget, 1, 0, 1, 1);
+
+ gtk_widget_show (widget);
+
+ row = 1;
+ welcome_add_link (GTK_GRID (grid), 1, &row,
+ /* "keyboard" emoticone in UTF-8. */
+ "\xe2\x8c\xa8",
+ _("Contributing"),
+ "https://www.gimp.org/develop/");
+ welcome_add_link (GTK_GRID (grid), 1, &row,
+ /* "love letter" emoticone in UTF-8. */
+ "\xf0\x9f\x92\x8c",
+ _("Donating"),
+ "https://www.gimp.org/donating/");
+
+ /*****************/
+ /* Release Notes */
+ /*****************/
+
+ if (release_notes)
+ {
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
+ gtk_stack_add_titled (GTK_STACK (stack), vbox, "release-notes",
+ "Release Notes");
+ gtk_widget_show (vbox);
+
+ /* Release note title. */
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 6);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+ gtk_widget_show (hbox);
+
+ /* Translators: the %s string will be the version, e.g. "3.0". */
+ tmp = g_strdup_printf (_("GIMP %s Release Notes"), GIMP_VERSION);
+ markup = g_strdup_printf ("<b><big>%s</big></b>", tmp);
+ g_free (tmp);
+ widget = gtk_label_new (NULL);
+ gtk_label_set_markup (GTK_LABEL (widget), markup);
+ g_free (markup);
+ gtk_label_set_selectable (GTK_LABEL (widget), FALSE);
+ gtk_label_set_justify (GTK_LABEL (widget), GTK_JUSTIFY_CENTER);
+ gtk_label_set_line_wrap (GTK_LABEL (widget), FALSE);
+ gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
+ gtk_widget_show (widget);
+
+ image = gtk_image_new_from_icon_name ("gimp-user-manual",
+ GTK_ICON_SIZE_DIALOG);
+ gtk_widget_set_valign (image, GTK_ALIGN_START);
+ gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
+ gtk_widget_show (image);
+
+ /* Release note contents. */
+
+ scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+ gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
+ gtk_widget_show (scrolled_window);
+
+ widget = gtk_text_view_new ();
+ gtk_widget_set_vexpand (widget, TRUE);
+ gtk_widget_set_hexpand (widget, TRUE);
+ gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (widget), GTK_WRAP_WORD_CHAR);
+ gtk_text_view_set_editable (GTK_TEXT_VIEW (widget), FALSE);
+ gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (widget), FALSE);
+ gtk_text_view_set_justification (GTK_TEXT_VIEW (widget), GTK_JUSTIFY_LEFT);
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
+ gtk_text_buffer_get_start_iter (buffer, &iter);
+
+ markup = gimp_appstream_to_pango_markup (release_notes);
+ gtk_text_buffer_insert_markup (buffer, &iter, markup, -1);
+ g_free (markup);
+
+ gtk_container_add (GTK_CONTAINER (scrolled_window), widget);
+ gtk_widget_show (widget);
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+ gtk_widget_show (hbox);
+
+ if (GIMP_MINOR_VERSION % 2 == 0)
+ release_link = g_strdup_printf ("https://www.gimp.org/release-notes/gimp-%d.%d.html",
+ GIMP_MAJOR_VERSION, GIMP_MINOR_VERSION);
+ else
+ release_link = g_strdup ("https://www.gimp.org/");
+
+ widget = gtk_link_button_new_with_label (release_link, _("Learn more"));
+ gtk_widget_show (widget);
+ gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
+ g_free (release_link);
+
+ /*****************/
+ /* Task switcher */
+ /*****************/
+
+ switcher = gtk_stack_switcher_new ();
+ gtk_stack_switcher_set_stack (GTK_STACK_SWITCHER (switcher),
+ GTK_STACK (stack));
+ gtk_box_pack_start (GTK_BOX (main_vbox), switcher, FALSE, FALSE, 0);
+ gtk_widget_set_halign (switcher, GTK_ALIGN_CENTER);
+ gtk_widget_show (switcher);
+ }
+
+ /**************/
+ /* Info label */
+ /**************/
+
+ widget = gtk_label_new (NULL);
+ tmp = g_strdup (_("This welcome dialog is only shown at first launch. "
+ "You can call if again from the \"Help\" menu."));
+ markup = g_strdup_printf ("<small>%s</small>", tmp);
+ g_free (tmp);
+ widget = gtk_label_new (NULL);
+ gtk_label_set_markup (GTK_LABEL (widget), markup);
+ gtk_widget_show (widget);
+ gtk_box_pack_start (GTK_BOX (main_vbox), widget, FALSE, FALSE, 0);
+
+ g_clear_object (&app);
+
+ return welcome_dialog;
+}
+
+static void
+welcome_add_link (GtkGrid *grid,
+ gint column,
+ gint *row,
+ const gchar *emoji,
+ const gchar *title,
+ const gchar *link)
+{
+ GtkWidget *hbox;
+ GtkWidget *button;
+ GtkWidget *icon;
+
+ /* TODO: Aryeom doesn't like the spacing here. There is too much
+ * spacing between the link lines and between emojis and links. But we
+ * didn't manage to find how to close a bit these 2 spacings in GTK.
+ * :-/
+ */
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_grid_attach (grid, hbox, column, *row, 1, 1);
+ /* These margin are by design to emphasize a bit the link list by
+ * moving them a tiny bit to the right instead of being exactly
+ * aligned with the top text.
+ */
+ gtk_widget_set_margin_start (hbox, 10);
+ gtk_widget_show (hbox);
+
+ ++(*row);
+
+ icon = gtk_label_new (emoji);
+ gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0);
+ gtk_widget_show (icon);
+
+ button = gtk_link_button_new_with_label (link, title);
+ gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+ gtk_widget_show (button);
+}
diff --git a/app/dialogs/welcome-dialog.h b/app/dialogs/welcome-dialog.h
new file mode 100644
index 0000000000..012ab3f32c
--- /dev/null
+++ b/app/dialogs/welcome-dialog.h
@@ -0,0 +1,28 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * welcome-dialog.h
+ * Copyright (C) 2022 Jehan
+ *
+ * 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 <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef __WELCOME_DIALOG_H__
+#define __WELCOME_DIALOG_H__
+
+
+GtkWidget * welcome_dialog_create (Gimp *gimp);
+
+
+#endif /* __WELCOME_DIALOG_H__ */
diff --git a/app/widgets/gimphelp-ids.h b/app/widgets/gimphelp-ids.h
index 60ebd9ecc0..b860782bd0 100644
--- a/app/widgets/gimphelp-ids.h
+++ b/app/widgets/gimphelp-ids.h
@@ -726,6 +726,7 @@
#define GIMP_HELP_TEXT_EDITOR_DIALOG "gimp-text-editor-dialog"
#define GIMP_HELP_TIPS_DIALOG "gimp-tips-dialog"
#define GIMP_HELP_UNDO_DIALOG "gimp-undo-dialog"
+#define GIMP_HELP_WELCOME_DIALOG "gimp-welcome-dialog"
#define GIMP_HELP_EXPORT_DIALOG "gimp-export-dialog"
#define GIMP_HELP_EXPORT_CONFIRM_DIALOG "gimp-export-confirm-dialog"
diff --git a/menus/image-menu.xml.in b/menus/image-menu.xml.in
index 785ef2d305..f9b7b5c262 100644
--- a/menus/image-menu.xml.in
+++ b/menus/image-menu.xml.in
@@ -877,6 +877,7 @@
<menuitem action="help-context-help" />
<menuitem action="dialogs-tips" />
<menuitem action="dialogs-about" />
+ <menuitem action="dialogs-welcome" />
<separator />
<menuitem action="dialogs-action-search" />
<separator />
diff --git a/meson.build b/meson.build
index 6f70f82df4..9dbc83287e 100644
--- a/meson.build
+++ b/meson.build
@@ -1426,6 +1426,7 @@ conf.set_quoted('GIMPDATADIR', prefix / gimpdatadir)
conf.set_quoted('GIMPPLUGINDIR', prefix / gimpplugindir)
conf.set_quoted('PLUGINDIR', prefix / gimpplugindir)
conf.set_quoted('LOCALEDIR', prefix / localedir)
+conf.set_quoted('DESKTOP_DATADIR', prefix / get_option('datadir'))
conf.set_quoted('LOCALSTATEDIR', prefix / get_option('localstatedir'))
# /usr/com?
diff --git a/po/POTFILES.in b/po/POTFILES.in
index b66204f884..fa73f471dc 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -248,6 +248,7 @@ app/dialogs/user-install-dialog.c
app/dialogs/vectors-export-dialog.c
app/dialogs/vectors-import-dialog.c
app/dialogs/vectors-options-dialog.c
+app/dialogs/welcome-dialog.c
app/display/display-enums.c
app/display/gimpcursorview.c
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]