app: can't rely on a context being set on a GimpItemTreeView

In GimpLayerTreeView, set the action states using GimpActionGroup
instead of using gimp->app directly to look up the actions ( after
trying to get the Gimp from a NULL GimpContext).

Fixes #9433
This commit is contained in:
Michael Natterer 2023-05-25 23:52:40 +02:00
parent a411026b4c
commit 6fcf25b3de
2 changed files with 31 additions and 51 deletions

View File

@ -337,13 +337,8 @@ gimp_drawable_tree_view_floating_selection_changed (GimpImage *image,
items = g_list_copy (items); items = g_list_copy (items);
/* update button states */ /* update button states */
g_signal_handlers_block_by_func (gimp_item_tree_view_get_image (GIMP_ITEM_TREE_VIEW (view)),
gimp_drawable_tree_view_floating_selection_changed,
view);
gimp_container_view_select_items (GIMP_CONTAINER_VIEW (view), items); gimp_container_view_select_items (GIMP_CONTAINER_VIEW (view), items);
g_signal_handlers_unblock_by_func (gimp_item_tree_view_get_image (GIMP_ITEM_TREE_VIEW (view)),
gimp_drawable_tree_view_floating_selection_changed,
view);
g_list_free (items); g_list_free (items);
} }

View File

@ -808,10 +808,10 @@ gimp_layer_tree_view_select_items (GimpContainerView *view,
GList *paths) GList *paths)
{ {
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view); GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view);
GimpLayerTreeView *layer_view = GIMP_LAYER_TREE_VIEW (view); GimpLayerTreeView *layer_view = GIMP_LAYER_TREE_VIEW (view);
GList *layers = items; GList *layers = items;
GList *path = paths; GList *path = paths;
gboolean success; gboolean success;
success = parent_view_iface->select_items (view, items, paths); success = parent_view_iface->select_items (view, items, paths);
@ -819,13 +819,16 @@ gimp_layer_tree_view_select_items (GimpContainerView *view,
{ {
if (success) if (success)
{ {
for (layers = items, path = paths; layers && path; layers = layers->next, path = path->next) for (layers = items, path = paths;
layers && path;
layers = layers->next, path = path->next)
{ {
GtkTreeIter iter; GtkTreeIter iter;
gtk_tree_model_get_iter (tree_view->model, &iter, path->data); gtk_tree_model_get_iter (tree_view->model, &iter, path->data);
gimp_layer_tree_view_update_borders (layer_view, &iter); gimp_layer_tree_view_update_borders (layer_view, &iter);
} }
gimp_layer_tree_view_update_options (layer_view, items); gimp_layer_tree_view_update_options (layer_view, items);
gimp_layer_tree_view_update_menu (layer_view, items); gimp_layer_tree_view_update_menu (layer_view, items);
} }
@ -1782,16 +1785,14 @@ static void
gimp_layer_tree_view_update_menu (GimpLayerTreeView *layer_view, gimp_layer_tree_view_update_menu (GimpLayerTreeView *layer_view,
GList *layers) GList *layers)
{ {
GimpContext *context; GimpUIManager *ui_manager = gimp_editor_get_ui_manager (GIMP_EDITOR (layer_view));
Gimp *gimp; GimpActionGroup *group;
GAction *action; GList *iter;
GList *iter; gboolean have_masks = FALSE;
gboolean have_masks = FALSE; gboolean all_masks_shown = TRUE;
gboolean all_masks_shown = TRUE; gboolean all_masks_disabled = TRUE;
gboolean all_masks_disabled = TRUE;
context = gimp_container_view_get_context (GIMP_CONTAINER_VIEW (layer_view)); group = gimp_ui_manager_get_action_group (ui_manager, "layers");
gimp = context->gimp;
for (iter = layers; iter; iter = iter->next) for (iter = layers; iter; iter = iter->next)
{ {
@ -1805,26 +1806,16 @@ gimp_layer_tree_view_update_menu (GimpLayerTreeView *layer_view,
} }
} }
action = g_action_map_lookup_action (G_ACTION_MAP (gimp->app), gimp_action_group_set_action_active (group, "layers-mask-show",
"layers-mask-show"); have_masks && all_masks_shown);
g_return_if_fail (GIMP_IS_TOGGLE_ACTION (action)); gimp_action_group_set_action_active (group, "layers-mask-disable",
gimp_toggle_action_set_active (GIMP_TOGGLE_ACTION (action), have_masks && all_masks_disabled);
have_masks && all_masks_shown);
action = g_action_map_lookup_action (G_ACTION_MAP (gimp->app),
"layers-mask-disable");
g_return_if_fail (GIMP_IS_TOGGLE_ACTION (action));
gimp_toggle_action_set_active (GIMP_TOGGLE_ACTION (action),
have_masks && all_masks_disabled);
/* Only one layer mask at a time can be edited. */ /* Only one layer mask at a time can be edited. */
action = g_action_map_lookup_action (G_ACTION_MAP (gimp->app), gimp_action_group_set_action_active (group, "layers-mask-edit",
"layers-mask-edit"); g_list_length (layers) == 1 &&
g_return_if_fail (GIMP_IS_TOGGLE_ACTION (action)); gimp_layer_get_mask (layers->data) &&
gimp_toggle_action_set_active (GIMP_TOGGLE_ACTION (action), gimp_layer_get_edit_mask (layers->data));
g_list_length (layers) == 1 &&
gimp_layer_get_mask (layers->data) &&
gimp_layer_get_edit_mask (layers->data));
} }
static void static void
@ -2059,8 +2050,13 @@ gimp_layer_tree_view_layer_clicked (GimpCellRendererViewable *cell,
if (gtk_tree_model_get_iter (tree_view->model, &iter, path)) if (gtk_tree_model_get_iter (tree_view->model, &iter, path))
{ {
GimpUIManager *ui_manager;
GimpActionGroup *group;
GimpViewRenderer *renderer; GimpViewRenderer *renderer;
ui_manager = gimp_editor_get_ui_manager (GIMP_EDITOR (tree_view));
group = gimp_ui_manager_get_action_group (ui_manager, "layers");
gtk_tree_model_get (tree_view->model, &iter, gtk_tree_model_get (tree_view->model, &iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer, GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1); -1);
@ -2161,19 +2157,8 @@ gimp_layer_tree_view_layer_clicked (GimpCellRendererViewable *cell,
/* Simple clicks (without modifiers) activate the layer */ /* Simple clicks (without modifiers) activate the layer */
if (mask) if (mask)
{ gimp_action_group_set_action_active (group,
GimpContext *context; "layers-mask-edit", FALSE);
Gimp *gimp;
GAction *action;
context = gimp_container_view_get_context (GIMP_CONTAINER_VIEW (layer_view));
gimp = context->gimp;
action = g_action_map_lookup_action (G_ACTION_MAP (gimp->app),
"layers-mask-edit");
g_return_if_fail (GIMP_IS_TOGGLE_ACTION (action));
gimp_toggle_action_set_active (GIMP_TOGGLE_ACTION (action),
FALSE);
}
} }
g_object_unref (renderer); g_object_unref (renderer);