Along with this change, the snap preferences have been moved from GimpDisplayConfig to GimpDisplayOptions, where it makes much more sense. One of the consequences is that there is no need to duplicate these values in GimpDisplayShell anymore to differenciate defaults and current settings.
600 lines
17 KiB
C
600 lines
17 KiB
C
/* 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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include <gegl.h>
|
|
#include <gtk/gtk.h>
|
|
|
|
#include "libgimpcolor/gimpcolor.h"
|
|
#include "libgimpwidgets/gimpwidgets.h"
|
|
|
|
#include "display-types.h"
|
|
|
|
#include "config/gimpdisplayoptions.h"
|
|
|
|
#include "core/gimp.h"
|
|
#include "core/gimpcontext.h"
|
|
#include "core/gimpimage.h"
|
|
|
|
#include "widgets/gimpactiongroup.h"
|
|
#include "widgets/gimpdockcolumns.h"
|
|
#include "widgets/gimprender.h"
|
|
#include "widgets/gimpuimanager.h"
|
|
#include "widgets/gimpwidgets-utils.h"
|
|
|
|
#include "gimpcanvas.h"
|
|
#include "gimpcanvasitem.h"
|
|
#include "gimpdisplay.h"
|
|
#include "gimpdisplayshell.h"
|
|
#include "gimpdisplayshell-appearance.h"
|
|
#include "gimpdisplayshell-selection.h"
|
|
#include "gimpimagewindow.h"
|
|
#include "gimpstatusbar.h"
|
|
|
|
|
|
/* local function prototypes */
|
|
|
|
static GimpDisplayOptions *
|
|
appearance_get_options (GimpDisplayShell *shell);
|
|
static void appearance_set_action_active (GimpDisplayShell *shell,
|
|
const gchar *action,
|
|
gboolean active);
|
|
static void appearance_set_action_color (GimpDisplayShell *shell,
|
|
const gchar *action,
|
|
const GimpRGB *color);
|
|
|
|
|
|
/* 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);
|
|
|
|
appearance_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_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);
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
appearance_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);
|
|
|
|
appearance_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);
|
|
|
|
appearance_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);
|
|
|
|
appearance_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);
|
|
|
|
appearance_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);
|
|
|
|
appearance_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_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);
|
|
|
|
appearance_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);
|
|
|
|
appearance_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);
|
|
|
|
appearance_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);
|
|
|
|
appearance_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;
|
|
}
|
|
|
|
|
|
/* 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;
|
|
}
|
|
|
|
static void
|
|
appearance_set_action_active (GimpDisplayShell *shell,
|
|
const gchar *action,
|
|
gboolean active)
|
|
{
|
|
GimpImageWindow *window = gimp_display_shell_get_window (shell);
|
|
GimpContext *context;
|
|
|
|
if (window && gimp_image_window_get_active_shell (window) == shell)
|
|
{
|
|
GimpUIManager *manager = gimp_image_window_get_ui_manager (window);
|
|
GimpActionGroup *action_group;
|
|
|
|
action_group = gimp_ui_manager_get_action_group (manager, "view");
|
|
|
|
if (action_group)
|
|
gimp_action_group_set_action_active (action_group, action, active);
|
|
}
|
|
|
|
context = gimp_get_user_context (shell->display->gimp);
|
|
|
|
if (shell->display == gimp_context_get_display (context))
|
|
{
|
|
GimpActionGroup *action_group;
|
|
|
|
action_group = gimp_ui_manager_get_action_group (shell->popup_manager,
|
|
"view");
|
|
|
|
if (action_group)
|
|
gimp_action_group_set_action_active (action_group, action, active);
|
|
}
|
|
}
|
|
|
|
static void
|
|
appearance_set_action_color (GimpDisplayShell *shell,
|
|
const gchar *action,
|
|
const GimpRGB *color)
|
|
{
|
|
GimpImageWindow *window = gimp_display_shell_get_window (shell);
|
|
GimpContext *context;
|
|
|
|
if (window && gimp_image_window_get_active_shell (window) == shell)
|
|
{
|
|
GimpUIManager *manager = gimp_image_window_get_ui_manager (window);
|
|
GimpActionGroup *action_group;
|
|
|
|
action_group = gimp_ui_manager_get_action_group (manager, "view");
|
|
|
|
if (action_group)
|
|
gimp_action_group_set_action_color (action_group, action, color, FALSE);
|
|
}
|
|
|
|
context = gimp_get_user_context (shell->display->gimp);
|
|
|
|
if (shell->display == gimp_context_get_display (context))
|
|
{
|
|
GimpActionGroup *action_group;
|
|
|
|
action_group = gimp_ui_manager_get_action_group (shell->popup_manager,
|
|
"view");
|
|
|
|
if (action_group)
|
|
gimp_action_group_set_action_color (action_group, action, color, FALSE);
|
|
}
|
|
}
|