summaryrefslogtreecommitdiffstats
path: root/app/display/gimpdisplayshell-appearance.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/display/gimpdisplayshell-appearance.c')
-rw-r--r--app/display/gimpdisplayshell-appearance.c606
1 files changed, 606 insertions, 0 deletions
diff --git a/app/display/gimpdisplayshell-appearance.c b/app/display/gimpdisplayshell-appearance.c
new file mode 100644
index 0000000..1080acf
--- /dev/null
+++ b/app/display/gimpdisplayshell-appearance.c
@@ -0,0 +1,606 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * 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 <gegl.h>
+#include <gtk/gtk.h>
+
+#include "display-types.h"
+
+#include "config/gimpdisplayoptions.h"
+
+#include "core/gimpimage.h"
+
+#include "widgets/gimpdockcolumns.h"
+#include "widgets/gimprender.h"
+#include "widgets/gimpwidgets-utils.h"
+
+#include "gimpcanvas.h"
+#include "gimpcanvasitem.h"
+#include "gimpdisplay.h"
+#include "gimpdisplayshell.h"
+#include "gimpdisplayshell-actions.h"
+#include "gimpdisplayshell-appearance.h"
+#include "gimpdisplayshell-expose.h"
+#include "gimpdisplayshell-selection.h"
+#include "gimpdisplayshell-scroll.h"
+#include "gimpdisplayshell-scrollbars.h"
+#include "gimpimagewindow.h"
+#include "gimpstatusbar.h"
+
+
+/* local function prototypes */
+
+static GimpDisplayOptions * appearance_get_options (GimpDisplayShell *shell);
+
+
+/* public functions */
+
+void
+gimp_display_shell_appearance_update (GimpDisplayShell *shell)
+{
+ GimpDisplayOptions *options;
+ GimpImageWindow *window;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+ window = gimp_display_shell_get_window (shell);
+
+ if (window)
+ {
+ GimpDockColumns *left_docks;
+ GimpDockColumns *right_docks;
+ gboolean fullscreen;
+ gboolean has_grip;
+
+ fullscreen = gimp_image_window_get_fullscreen (window);
+
+ gimp_display_shell_set_action_active (shell, "view-fullscreen",
+ fullscreen);
+
+ left_docks = gimp_image_window_get_left_docks (window);
+ right_docks = gimp_image_window_get_right_docks (window);
+
+ has_grip = (! fullscreen &&
+ ! (left_docks && gimp_dock_columns_get_docks (left_docks)) &&
+ ! (right_docks && gimp_dock_columns_get_docks (right_docks)));
+
+ gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (shell->statusbar),
+ has_grip);
+ }
+
+ gimp_display_shell_set_show_menubar (shell,
+ options->show_menubar);
+ gimp_display_shell_set_show_statusbar (shell,
+ options->show_statusbar);
+
+ gimp_display_shell_set_show_rulers (shell,
+ options->show_rulers);
+ gimp_display_shell_set_show_scrollbars (shell,
+ options->show_scrollbars);
+ gimp_display_shell_set_show_selection (shell,
+ options->show_selection);
+ gimp_display_shell_set_show_layer (shell,
+ options->show_layer_boundary);
+ gimp_display_shell_set_show_canvas (shell,
+ options->show_canvas_boundary);
+ gimp_display_shell_set_show_guides (shell,
+ options->show_guides);
+ gimp_display_shell_set_show_grid (shell,
+ options->show_grid);
+ gimp_display_shell_set_show_sample_points (shell,
+ options->show_sample_points);
+ gimp_display_shell_set_padding (shell,
+ options->padding_mode,
+ &options->padding_color);
+ gimp_display_shell_set_padding_in_show_all (shell,
+ options->padding_in_show_all);
+}
+
+void
+gimp_display_shell_set_show_menubar (GimpDisplayShell *shell,
+ gboolean show)
+{
+ GimpDisplayOptions *options;
+ GimpImageWindow *window;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+ window = gimp_display_shell_get_window (shell);
+
+ g_object_set (options, "show-menubar", show, NULL);
+
+ if (window && gimp_image_window_get_active_shell (window) == shell)
+ {
+ gimp_image_window_keep_canvas_pos (gimp_display_shell_get_window (shell));
+ gimp_image_window_set_show_menubar (window, show);
+ }
+
+ gimp_display_shell_set_action_active (shell, "view-show-menubar", show);
+}
+
+gboolean
+gimp_display_shell_get_show_menubar (GimpDisplayShell *shell)
+{
+ g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
+
+ return appearance_get_options (shell)->show_menubar;
+}
+
+void
+gimp_display_shell_set_show_statusbar (GimpDisplayShell *shell,
+ gboolean show)
+{
+ GimpDisplayOptions *options;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+
+ g_object_set (options, "show-statusbar", show, NULL);
+
+ gimp_image_window_keep_canvas_pos (gimp_display_shell_get_window (shell));
+ gimp_statusbar_set_visible (GIMP_STATUSBAR (shell->statusbar), show);
+
+ gimp_display_shell_set_action_active (shell, "view-show-statusbar", show);
+}
+
+gboolean
+gimp_display_shell_get_show_statusbar (GimpDisplayShell *shell)
+{
+ g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
+
+ return appearance_get_options (shell)->show_statusbar;
+}
+
+void
+gimp_display_shell_set_show_rulers (GimpDisplayShell *shell,
+ gboolean show)
+{
+ GimpDisplayOptions *options;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+
+ g_object_set (options, "show-rulers", show, NULL);
+
+ gimp_image_window_keep_canvas_pos (gimp_display_shell_get_window (shell));
+ gtk_widget_set_visible (shell->origin, show);
+ gtk_widget_set_visible (shell->hrule, show);
+ gtk_widget_set_visible (shell->vrule, show);
+
+ gimp_display_shell_set_action_active (shell, "view-show-rulers", show);
+}
+
+gboolean
+gimp_display_shell_get_show_rulers (GimpDisplayShell *shell)
+{
+ g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
+
+ return appearance_get_options (shell)->show_rulers;
+}
+
+void
+gimp_display_shell_set_show_scrollbars (GimpDisplayShell *shell,
+ gboolean show)
+{
+ GimpDisplayOptions *options;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+
+ g_object_set (options, "show-scrollbars", show, NULL);
+
+ gimp_image_window_keep_canvas_pos (gimp_display_shell_get_window (shell));
+ gtk_widget_set_visible (shell->nav_ebox, show);
+ gtk_widget_set_visible (shell->hsb, show);
+ gtk_widget_set_visible (shell->vsb, show);
+ gtk_widget_set_visible (shell->quick_mask_button, show);
+ gtk_widget_set_visible (shell->zoom_button, show);
+
+ gimp_display_shell_set_action_active (shell, "view-show-scrollbars", show);
+}
+
+gboolean
+gimp_display_shell_get_show_scrollbars (GimpDisplayShell *shell)
+{
+ g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
+
+ return appearance_get_options (shell)->show_scrollbars;
+}
+
+void
+gimp_display_shell_set_show_selection (GimpDisplayShell *shell,
+ gboolean show)
+{
+ GimpDisplayOptions *options;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+
+ g_object_set (options, "show-selection", show, NULL);
+
+ gimp_display_shell_selection_set_show (shell, show);
+
+ gimp_display_shell_set_action_active (shell, "view-show-selection", show);
+}
+
+gboolean
+gimp_display_shell_get_show_selection (GimpDisplayShell *shell)
+{
+ g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
+
+ return appearance_get_options (shell)->show_selection;
+}
+
+void
+gimp_display_shell_set_show_layer (GimpDisplayShell *shell,
+ gboolean show)
+{
+ GimpDisplayOptions *options;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+
+ g_object_set (options, "show-layer-boundary", show, NULL);
+
+ gimp_canvas_item_set_visible (shell->layer_boundary, show);
+
+ gimp_display_shell_set_action_active (shell, "view-show-layer-boundary", show);
+}
+
+gboolean
+gimp_display_shell_get_show_layer (GimpDisplayShell *shell)
+{
+ g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
+
+ return appearance_get_options (shell)->show_layer_boundary;
+}
+
+void
+gimp_display_shell_set_show_canvas (GimpDisplayShell *shell,
+ gboolean show)
+{
+ GimpDisplayOptions *options;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+
+ g_object_set (options, "show-canvas-boundary", show, NULL);
+
+ gimp_canvas_item_set_visible (shell->canvas_boundary,
+ show && shell->show_all);
+
+ gimp_display_shell_set_action_active (shell, "view-show-canvas-boundary", show);
+}
+
+gboolean
+gimp_display_shell_get_show_canvas (GimpDisplayShell *shell)
+{
+ g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
+
+ return appearance_get_options (shell)->show_canvas_boundary;
+}
+
+void
+gimp_display_shell_update_show_canvas (GimpDisplayShell *shell)
+{
+ GimpDisplayOptions *options;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+
+ gimp_canvas_item_set_visible (shell->canvas_boundary,
+ options->show_canvas_boundary &&
+ shell->show_all);
+}
+
+void
+gimp_display_shell_set_show_guides (GimpDisplayShell *shell,
+ gboolean show)
+{
+ GimpDisplayOptions *options;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+
+ g_object_set (options, "show-guides", show, NULL);
+
+ gimp_canvas_item_set_visible (shell->guides, show);
+
+ gimp_display_shell_set_action_active (shell, "view-show-guides", show);
+}
+
+gboolean
+gimp_display_shell_get_show_guides (GimpDisplayShell *shell)
+{
+ g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
+
+ return appearance_get_options (shell)->show_guides;
+}
+
+void
+gimp_display_shell_set_show_grid (GimpDisplayShell *shell,
+ gboolean show)
+{
+ GimpDisplayOptions *options;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+
+ g_object_set (options, "show-grid", show, NULL);
+
+ gimp_canvas_item_set_visible (shell->grid, show);
+
+ gimp_display_shell_set_action_active (shell, "view-show-grid", show);
+}
+
+gboolean
+gimp_display_shell_get_show_grid (GimpDisplayShell *shell)
+{
+ g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
+
+ return appearance_get_options (shell)->show_grid;
+}
+
+void
+gimp_display_shell_set_show_sample_points (GimpDisplayShell *shell,
+ gboolean show)
+{
+ GimpDisplayOptions *options;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+
+ g_object_set (options, "show-sample-points", show, NULL);
+
+ gimp_canvas_item_set_visible (shell->sample_points, show);
+
+ gimp_display_shell_set_action_active (shell, "view-show-sample-points", show);
+}
+
+gboolean
+gimp_display_shell_get_show_sample_points (GimpDisplayShell *shell)
+{
+ g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
+
+ return appearance_get_options (shell)->show_sample_points;
+}
+
+void
+gimp_display_shell_set_snap_to_grid (GimpDisplayShell *shell,
+ gboolean snap)
+{
+ GimpDisplayOptions *options;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+
+ g_object_set (options, "snap-to-grid", snap, NULL);
+}
+
+gboolean
+gimp_display_shell_get_snap_to_grid (GimpDisplayShell *shell)
+{
+ g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
+
+ return appearance_get_options (shell)->snap_to_grid;
+}
+
+void
+gimp_display_shell_set_snap_to_guides (GimpDisplayShell *shell,
+ gboolean snap)
+{
+ GimpDisplayOptions *options;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+
+ g_object_set (options, "snap-to-guides", snap, NULL);
+}
+
+gboolean
+gimp_display_shell_get_snap_to_guides (GimpDisplayShell *shell)
+{
+ g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
+
+ return appearance_get_options (shell)->snap_to_guides;
+}
+
+void
+gimp_display_shell_set_snap_to_canvas (GimpDisplayShell *shell,
+ gboolean snap)
+{
+ GimpDisplayOptions *options;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+
+ g_object_set (options, "snap-to-canvas", snap, NULL);
+}
+
+gboolean
+gimp_display_shell_get_snap_to_canvas (GimpDisplayShell *shell)
+{
+ g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
+
+ return appearance_get_options (shell)->snap_to_canvas;
+}
+
+void
+gimp_display_shell_set_snap_to_vectors (GimpDisplayShell *shell,
+ gboolean snap)
+{
+ GimpDisplayOptions *options;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+
+ g_object_set (options, "snap-to-path", snap, NULL);
+}
+
+gboolean
+gimp_display_shell_get_snap_to_vectors (GimpDisplayShell *shell)
+{
+ g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
+
+ return appearance_get_options (shell)->snap_to_path;
+}
+
+void
+gimp_display_shell_set_padding (GimpDisplayShell *shell,
+ GimpCanvasPaddingMode padding_mode,
+ const GimpRGB *padding_color)
+{
+ GimpDisplayOptions *options;
+ GimpRGB color;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+ g_return_if_fail (padding_color != NULL);
+
+ options = appearance_get_options (shell);
+ color = *padding_color;
+
+ switch (padding_mode)
+ {
+ case GIMP_CANVAS_PADDING_MODE_DEFAULT:
+ if (shell->canvas)
+ {
+ GtkStyle *style;
+
+ gtk_widget_ensure_style (shell->canvas);
+
+ style = gtk_widget_get_style (shell->canvas);
+
+ gimp_rgb_set_gdk_color (&color, style->bg + GTK_STATE_NORMAL);
+ }
+ break;
+
+ case GIMP_CANVAS_PADDING_MODE_LIGHT_CHECK:
+ color = *gimp_render_light_check_color ();
+ break;
+
+ case GIMP_CANVAS_PADDING_MODE_DARK_CHECK:
+ color = *gimp_render_dark_check_color ();
+ break;
+
+ case GIMP_CANVAS_PADDING_MODE_CUSTOM:
+ case GIMP_CANVAS_PADDING_MODE_RESET:
+ break;
+ }
+
+ g_object_set (options,
+ "padding-mode", padding_mode,
+ "padding-color", &color,
+ NULL);
+
+ gimp_canvas_set_bg_color (GIMP_CANVAS (shell->canvas), &color);
+
+ gimp_display_shell_set_action_color (shell, "view-padding-color-menu",
+ &options->padding_color);
+}
+
+void
+gimp_display_shell_get_padding (GimpDisplayShell *shell,
+ GimpCanvasPaddingMode *padding_mode,
+ GimpRGB *padding_color)
+{
+ GimpDisplayOptions *options;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+
+ if (padding_mode)
+ *padding_mode = options->padding_mode;
+
+ if (padding_color)
+ *padding_color = options->padding_color;
+}
+
+void
+gimp_display_shell_set_padding_in_show_all (GimpDisplayShell *shell,
+ gboolean keep)
+{
+ GimpDisplayOptions *options;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ options = appearance_get_options (shell);
+
+ if (options->padding_in_show_all != keep)
+ {
+ g_object_set (options, "padding-in-show-all", keep, NULL);
+
+ if (shell->display)
+ {
+ gimp_display_shell_scroll_clamp_and_update (shell);
+ gimp_display_shell_scrollbars_update (shell);
+
+ gimp_display_shell_expose_full (shell);
+ }
+
+ gimp_display_shell_set_action_active (shell,
+ "view-padding-color-in-show-all",
+ keep);
+
+ g_object_notify (G_OBJECT (shell), "infinite-canvas");
+ }
+}
+
+gboolean
+gimp_display_shell_get_padding_in_show_all (GimpDisplayShell *shell)
+{
+ g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
+
+ return appearance_get_options (shell)->padding_in_show_all;
+}
+
+
+/* private functions */
+
+static GimpDisplayOptions *
+appearance_get_options (GimpDisplayShell *shell)
+{
+ if (gimp_display_get_image (shell->display))
+ {
+ GimpImageWindow *window = gimp_display_shell_get_window (shell);
+
+ if (window && gimp_image_window_get_fullscreen (window))
+ return shell->fullscreen_options;
+ else
+ return shell->options;
+ }
+
+ return shell->no_image_options;
+}