app: display the floating mask over the layer mask.

It would make using floating masks a lot easier as it is visually understandable
that it applies to the layer mask.
This commit is contained in:
Jehan 2022-11-02 01:25:43 +01:00
parent 2c4f91f585
commit 28457ce337
10 changed files with 142 additions and 93 deletions

View file

@ -167,7 +167,7 @@ gimp_container_combo_box_init (GimpContainerComboBox *combo)
NULL);
gimp_container_tree_store_add_renderer_cell (GIMP_CONTAINER_TREE_STORE (model),
cell);
cell, -1);
combo->viewable_renderer = cell;

View file

@ -165,7 +165,7 @@ gimp_container_entry_init (GimpContainerEntry *entry)
NULL);
gimp_container_tree_store_add_renderer_cell (GIMP_CONTAINER_TREE_STORE (model),
cell);
cell, -1);
gtk_entry_completion_set_text_column (completion,
GIMP_CONTAINER_TREE_STORE_COLUMN_NAME);

View file

@ -212,7 +212,7 @@ gimp_container_icon_view_constructed (GObject *object)
NULL);
gimp_container_tree_store_add_renderer_cell (GIMP_CONTAINER_TREE_STORE (icon_view->model),
icon_view->renderer_cell);
icon_view->renderer_cell, -1);
g_signal_connect (icon_view->view, "selection-changed",
G_CALLBACK (gimp_container_icon_view_selection_changed),

View file

@ -52,6 +52,7 @@ struct _GimpContainerTreeStorePrivate
{
GimpContainerView *container_view;
GList *renderer_cells;
GList *renderer_columns;
gboolean use_name;
};
@ -123,11 +124,8 @@ gimp_container_tree_store_finalize (GObject *object)
{
GimpContainerTreeStorePrivate *private = GET_PRIVATE (object);
if (private->renderer_cells)
{
g_list_free (private->renderer_cells);
private->renderer_cells = NULL;
}
g_list_free (private->renderer_cells);
g_list_free (private->renderer_columns);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@ -203,7 +201,8 @@ gimp_container_tree_store_new (GimpContainerView *container_view,
void
gimp_container_tree_store_add_renderer_cell (GimpContainerTreeStore *store,
GtkCellRenderer *cell)
GtkCellRenderer *cell,
gint column_number)
{
GimpContainerTreeStorePrivate *private;
@ -213,6 +212,37 @@ gimp_container_tree_store_add_renderer_cell (GimpContainerTreeStore *store,
private = GET_PRIVATE (store);
private->renderer_cells = g_list_prepend (private->renderer_cells, cell);
if (column_number >= 0)
private->renderer_columns = g_list_append (private->renderer_columns,
GINT_TO_POINTER (column_number));
}
GimpViewRenderer *
gimp_container_tree_store_get_renderer (GimpContainerTreeStore *store,
GtkTreeIter *iter)
{
GimpContainerTreeStorePrivate *private;
GimpViewRenderer *renderer = NULL;
GList *c;
g_return_val_if_fail (GIMP_IS_CONTAINER_TREE_STORE (store), NULL);
private = GET_PRIVATE (store);
for (c = private->renderer_columns; c; c = c->next)
{
gtk_tree_model_get (GTK_TREE_MODEL (store), iter,
GPOINTER_TO_INT (c->data), &renderer,
-1);
if (renderer)
break;
}
g_return_val_if_fail (renderer != NULL, NULL);
return renderer;
}
void

View file

@ -67,7 +67,12 @@ GtkTreeModel * gimp_container_tree_store_new (GimpContainerView *
GType *types);
void gimp_container_tree_store_add_renderer_cell (GimpContainerTreeStore *store,
GtkCellRenderer *cell);
GtkCellRenderer *cell,
gint column_number);
GimpViewRenderer *
gimp_container_tree_store_get_renderer (GimpContainerTreeStore *store,
GtkTreeIter *iter);
void gimp_container_tree_store_set_use_name (GimpContainerTreeStore *store,
gboolean use_name);
gboolean gimp_container_tree_store_get_use_name (GimpContainerTreeStore *store);

View file

@ -247,9 +247,8 @@ gimp_container_tree_view_drop_status (GimpContainerTreeView *tree_view,
gtk_tree_model_get_iter (tree_view->model, &iter, drop_path);
gtk_tree_model_get (tree_view->model, &iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (tree_view->model),
&iter);
dest_viewable = renderer->viewable;
@ -297,10 +296,8 @@ gimp_container_tree_view_drop_status (GimpContainerTreeView *tree_view,
{
GimpViewRenderer *renderer;
gtk_tree_model_get (tree_view->model, &iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER,
&renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (tree_view->model),
&iter);
drop_path = gtk_tree_model_get_path (tree_view->model, &iter);
dest_viewable = renderer->viewable;

View file

@ -335,7 +335,8 @@ gimp_container_tree_view_constructed (GObject *object)
tree_view);
gimp_container_tree_view_add_renderer_cell (tree_view,
tree_view->renderer_cell);
tree_view->renderer_cell,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER);
tree_view->priv->selection = gtk_tree_view_get_selection (tree_view->view);
@ -395,11 +396,7 @@ gimp_container_tree_view_finalize (GObject *object)
tree_view->priv->toggle_cells = NULL;
}
if (tree_view->priv->renderer_cells)
{
g_list_free (tree_view->priv->renderer_cells);
tree_view->priv->renderer_cells = NULL;
}
g_list_free (tree_view->priv->renderer_cells);
if (tree_view->priv->editable_cells)
{
@ -421,9 +418,7 @@ gimp_container_tree_view_style_updated_foreach (GtkTreeModel *model,
{
GimpViewRenderer *renderer;
gtk_tree_model_get (model, iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (model), iter);
if (renderer)
{
@ -551,7 +546,8 @@ gimp_container_tree_view_add_toggle_cell (GimpContainerTreeView *tree_view,
void
gimp_container_tree_view_add_renderer_cell (GimpContainerTreeView *tree_view,
GtkCellRenderer *cell)
GtkCellRenderer *cell,
gint column_number)
{
g_return_if_fail (GIMP_IS_CONTAINER_TREE_VIEW (tree_view));
g_return_if_fail (GIMP_IS_CELL_RENDERER_VIEWABLE (cell));
@ -560,7 +556,7 @@ gimp_container_tree_view_add_renderer_cell (GimpContainerTreeView *tree_view,
cell);
gimp_container_tree_store_add_renderer_cell (GIMP_CONTAINER_TREE_STORE (tree_view->model),
cell);
cell, column_number);
}
void
@ -612,9 +608,7 @@ gimp_container_tree_view_name_edited (GtkCellRendererText *cell,
GimpObject *object;
const gchar *old_name;
gtk_tree_model_get (tree_view->model, &iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (tree_view->model), &iter);
object = GIMP_OBJECT (renderer->viewable);
@ -820,9 +814,8 @@ gimp_container_tree_view_reorder_item (GimpContainerView *view,
{
GimpViewRenderer *renderer;
gtk_tree_model_get (tree_view->model, &selected_iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (tree_view->model),
&selected_iter);
if (renderer->viewable != viewable)
selected = FALSE;
@ -868,9 +861,7 @@ gimp_container_tree_view_expand_item (GimpContainerView *view,
GtkTreeIter *iter = (GtkTreeIter *) insert_data;
GimpViewRenderer *renderer;
gtk_tree_model_get (tree_view->model, iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (tree_view->model), iter);
if (renderer)
{
@ -1090,9 +1081,8 @@ gimp_container_tree_view_real_edit_name (GimpContainerTreeView *tree_view)
{
GimpViewRenderer *renderer;
gtk_tree_model_get (tree_view->model, &selected_iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (tree_view->model),
&selected_iter);
if (gimp_viewable_is_name_editable (renderer->viewable))
{
@ -1172,9 +1162,7 @@ gimp_container_tree_view_name_started (GtkCellRendererText *cell,
GimpViewRenderer *renderer;
const gchar *real_name;
gtk_tree_model_get (tree_view->model, &iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (tree_view->model), &iter);
real_name = gimp_object_get_name (renderer->viewable);
gimp_view_renderer_remove_idle (renderer);
@ -1198,9 +1186,7 @@ gimp_container_tree_view_name_canceled (GtkCellRendererText *cell,
GimpViewRenderer *renderer;
gchar *name;
gtk_tree_model_get (tree_view->model, &iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (tree_view->model), &iter);
name = gimp_viewable_get_description (renderer->viewable, NULL);
@ -1313,9 +1299,7 @@ gimp_container_tree_view_button (GtkWidget *widget,
gtk_tree_model_get_iter (tree_view->model, &iter, path);
gtk_tree_model_get (tree_view->model, &iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (tree_view->model), &iter);
tree_view->priv->dnd_renderer = renderer;
@ -1699,9 +1683,7 @@ gimp_container_tree_view_tooltip (GtkWidget *widget,
NULL, &path, &iter))
return FALSE;
gtk_tree_model_get (tree_view->model, &iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (tree_view->model), &iter);
if (renderer)
{
@ -1884,9 +1866,8 @@ gimp_container_tree_view_get_selected (GimpContainerView *view,
gtk_tree_model_get_iter (GTK_TREE_MODEL (tree_view->model), &iter,
(GtkTreePath *) current_row->data);
gtk_tree_model_get (tree_view->model, &iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (tree_view->model),
&iter);
if (renderer->viewable)
*items = g_list_prepend (*items, renderer->viewable);
@ -1925,9 +1906,8 @@ gimp_container_tree_view_row_expanded (GtkTreeView *tree_view,
{
GimpViewRenderer *renderer;
gtk_tree_model_get (view->model, iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (view->model),
iter);
if (renderer)
{
gboolean expanded = gtk_tree_view_row_expanded (tree_view, path);
@ -1964,9 +1944,8 @@ gimp_container_tree_view_expand_rows (GtkTreeModel *model,
{
GimpViewRenderer *renderer;
gtk_tree_model_get (model, &iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (model),
&iter);
if (renderer)
{
GtkTreePath *path = gtk_tree_model_get_path (model, &iter);
@ -1993,9 +1972,8 @@ gimp_container_tree_view_monitor_changed_foreach (GtkTreeModel *model,
{
GimpViewRenderer *renderer;
gtk_tree_model_get (model, iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (model),
iter);
if (renderer)
{
@ -2029,9 +2007,8 @@ gimp_container_tree_view_search_path_foreach (GtkTreeModel *model,
SearchData *search_data = data;
GimpViewRenderer *renderer;
gtk_tree_model_get (model, iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (model),
iter);
if (renderer->viewable == search_data->viewable)
search_data->path = gtk_tree_path_copy (path);

View file

@ -122,7 +122,8 @@ void gimp_container_tree_view_add_toggle_cell
void gimp_container_tree_view_add_renderer_cell
(GimpContainerTreeView *tree_view,
GtkCellRenderer *cell);
GtkCellRenderer *cell,
gint column_number);
void gimp_container_tree_view_set_dnd_drop_to_empty
(GimpContainerTreeView *tree_view,

View file

@ -1569,9 +1569,8 @@ gimp_item_tree_view_name_edited (GtkCellRendererText *cell,
const gchar *old_name;
GError *error = NULL;
gtk_tree_model_get (tree_view->model, &iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (tree_view->model),
&iter);
item = GIMP_ITEM (renderer->viewable);
@ -1666,9 +1665,8 @@ gimp_item_tree_view_eye_clicked (GtkCellRendererToggle *toggle,
context = gimp_container_view_get_context (GIMP_CONTAINER_VIEW (view));
gtk_tree_model_get (tree_view->model, &iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (tree_view->model),
&iter);
g_object_get (toggle,
"active", &active,
NULL);
@ -1724,14 +1722,14 @@ gimp_item_tree_view_lock_clicked (GtkCellRendererToggle *toggle,
if (gtk_tree_model_get_iter (GIMP_CONTAINER_TREE_VIEW (view)->model,
&iter, path))
{
GimpViewRenderer *renderer;
GimpItem *item;
GdkRectangle rect;
GimpViewRenderer *renderer;
GimpContainerTreeStore *store;
GimpItem *item;
GdkRectangle rect;
/* Update the lock state. */
gtk_tree_model_get (GIMP_CONTAINER_TREE_VIEW (view)->model, &iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
store = GIMP_CONTAINER_TREE_STORE (GIMP_CONTAINER_TREE_VIEW (view)->model);
renderer = gimp_container_tree_store_get_renderer (store, &iter);
item = GIMP_ITEM (renderer->viewable);
g_object_unref (renderer);
gimp_item_tree_view_update_lock_box (view, item, path);
@ -1918,9 +1916,8 @@ gimp_item_tree_view_item_pre_clicked (GimpCellRendererViewable *cell,
GimpImage *image = gimp_item_tree_view_get_image (item_view);
GimpViewRenderer *renderer = NULL;
gtk_tree_model_get (tree_view->model, &iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
renderer = gimp_container_tree_store_get_renderer (GIMP_CONTAINER_TREE_STORE (tree_view->model),
&iter);
if (renderer)
{
@ -2062,12 +2059,12 @@ gimp_item_tree_view_row_expanded (GtkTreeView *tree_view,
if (selected_items)
{
GimpViewRenderer *renderer;
GimpItem *expanded_item;
GimpContainerTreeStore *store;
GimpViewRenderer *renderer;
GimpItem *expanded_item;
gtk_tree_model_get (GIMP_CONTAINER_TREE_VIEW (item_view)->model, iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
store = GIMP_CONTAINER_TREE_STORE (GIMP_CONTAINER_TREE_VIEW (item_view)->model);
renderer = gimp_container_tree_store_get_renderer (store, iter);
expanded_item = GIMP_ITEM (renderer->viewable);
g_object_unref (renderer);

View file

@ -368,7 +368,8 @@ gimp_layer_tree_view_constructed (GObject *object)
NULL);
gimp_container_tree_view_add_renderer_cell (tree_view,
layer_view->priv->mask_cell);
layer_view->priv->mask_cell,
layer_view->priv->model_column_mask);
g_signal_connect (tree_view->renderer_cell, "clicked",
G_CALLBACK (gimp_layer_tree_view_layer_clicked),
@ -762,6 +763,32 @@ gimp_layer_tree_view_insert_item (GimpContainerView *view,
gimp_layer_tree_view_mask_update (layer_view, iter, layer);
if (GIMP_IS_LAYER (viewable) && gimp_layer_is_floating_sel (GIMP_LAYER (viewable)))
{
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view);
GimpLayer *floating = GIMP_LAYER (viewable);
GimpDrawable *drawable = gimp_layer_get_floating_sel_drawable (floating);
if (GIMP_IS_LAYER_MASK (drawable))
{
/* Display floating mask in the mask column. */
GimpViewRenderer *renderer = NULL;
gtk_tree_model_get (GTK_TREE_MODEL (tree_view->model), iter,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
-1);
if (renderer)
{
gtk_tree_store_set (GTK_TREE_STORE (tree_view->model), iter,
layer_view->priv->model_column_mask, renderer,
layer_view->priv->model_column_mask_visible, TRUE,
GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, NULL,
-1);
g_object_unref (renderer);
}
}
}
return iter;
}
@ -1901,7 +1928,7 @@ gimp_layer_tree_view_update_borders (GimpLayerTreeView *layer_view,
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (layer_view);
GimpViewRenderer *layer_renderer;
GimpViewRenderer *mask_renderer;
GimpLayer *layer;
GimpLayer *layer = NULL;
GimpLayerMask *mask = NULL;
GimpViewBorderType layer_type = GIMP_VIEW_BORDER_BLACK;
@ -1910,15 +1937,25 @@ gimp_layer_tree_view_update_borders (GimpLayerTreeView *layer_view,
layer_view->priv->model_column_mask, &mask_renderer,
-1);
layer = GIMP_LAYER (layer_renderer->viewable);
if (layer_renderer)
layer = GIMP_LAYER (layer_renderer->viewable);
else if (mask_renderer && GIMP_IS_LAYER (mask_renderer->viewable))
/* This happens when floating masks are displayed (in the mask column).
* In such a case, the mask_renderer will actually be a layer renderer
* showing the floating mask.
*/
layer = GIMP_LAYER (mask_renderer->viewable);
if (mask_renderer)
g_return_if_fail (layer != NULL);
if (mask_renderer && GIMP_IS_LAYER_MASK (mask_renderer->viewable))
mask = GIMP_LAYER_MASK (mask_renderer->viewable);
if (! mask || (mask && ! gimp_layer_get_edit_mask (layer)))
layer_type = GIMP_VIEW_BORDER_WHITE;
gimp_view_renderer_set_border_type (layer_renderer, layer_type);
if (layer_renderer)
gimp_view_renderer_set_border_type (layer_renderer, layer_type);
if (mask)
{
@ -1939,6 +1976,11 @@ gimp_layer_tree_view_update_borders (GimpLayerTreeView *layer_view,
gimp_view_renderer_set_border_type (mask_renderer, mask_color);
}
else if (mask_renderer)
{
/* Floating mask. */
gimp_view_renderer_set_border_type (mask_renderer, GIMP_VIEW_BORDER_WHITE);
}
if (layer_renderer)
g_object_unref (layer_renderer);