mirror of https://github.com/GNOME/gimp.git
app: add GimpToolItem::shown property
Add a new read-only GimpToolItem::shown property, and a corresponding GimpToolItem::shown-changed signal, which determines if a tool item is visible throughtout the hierarchy, i.e., if it and all its ancestors are visible. This replaces gimp_tool_item_is_visible(). Use the new property and signal in GimpToolPalette and GimpToolEditor, to simplify the code, and in preparation for a flat toolbox view.
This commit is contained in:
parent
30d833d00f
commit
ee9661237e
|
@ -89,6 +89,8 @@ static void gimp_tool_group_child_remove (GimpContainer *containe
|
|||
GimpToolInfo *tool_info,
|
||||
GimpToolGroup *tool_group);
|
||||
|
||||
static void gimp_tool_group_shown_changed (GimpToolItem *tool_item);
|
||||
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (GimpToolGroup, gimp_tool_group, GIMP_TYPE_TOOL_ITEM)
|
||||
|
||||
|
@ -105,6 +107,7 @@ gimp_tool_group_class_init (GimpToolGroupClass *klass)
|
|||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
GimpObjectClass *gimp_object_class = GIMP_OBJECT_CLASS (klass);
|
||||
GimpViewableClass *viewable_class = GIMP_VIEWABLE_CLASS (klass);
|
||||
GimpToolItemClass *tool_item_class = GIMP_TOOL_ITEM_CLASS (klass);
|
||||
|
||||
gimp_tool_group_signals[ACTIVE_TOOL_CHANGED] =
|
||||
g_signal_new ("active-tool-changed",
|
||||
|
@ -127,6 +130,8 @@ gimp_tool_group_class_init (GimpToolGroupClass *klass)
|
|||
viewable_class->get_expanded = gimp_tool_group_get_expanded;
|
||||
viewable_class->set_expanded = gimp_tool_group_set_expanded;
|
||||
|
||||
tool_item_class->shown_changed = gimp_tool_group_shown_changed;
|
||||
|
||||
GIMP_CONFIG_PROP_STRING (object_class, PROP_ACTIVE_TOOL,
|
||||
"active-tool", NULL, NULL,
|
||||
NULL,
|
||||
|
@ -319,19 +324,39 @@ gimp_tool_group_child_remove (GimpContainer *container,
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_tool_group_shown_changed (GimpToolItem *tool_item)
|
||||
{
|
||||
GimpToolGroup *tool_group = GIMP_TOOL_GROUP (tool_item);
|
||||
GList *iter;
|
||||
|
||||
if (GIMP_TOOL_ITEM_CLASS (parent_class)->shown_changed)
|
||||
GIMP_TOOL_ITEM_CLASS (parent_class)->shown_changed (tool_item);
|
||||
|
||||
for (iter = GIMP_LIST (tool_group->priv->children)->queue->head;
|
||||
iter;
|
||||
iter = g_list_next (iter))
|
||||
{
|
||||
GimpToolItem *tool_item = iter->data;
|
||||
|
||||
if (gimp_tool_item_get_visible (tool_item))
|
||||
gimp_tool_item_shown_changed (tool_item);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* public functions */
|
||||
|
||||
GimpToolGroup *
|
||||
gimp_tool_group_new (void)
|
||||
{
|
||||
GimpToolGroup *group;
|
||||
GimpToolGroup *tool_group;
|
||||
|
||||
group = g_object_new (GIMP_TYPE_TOOL_GROUP, NULL);
|
||||
tool_group = g_object_new (GIMP_TYPE_TOOL_GROUP, NULL);
|
||||
|
||||
gimp_object_set_static_name (GIMP_OBJECT (group), "tool group");
|
||||
gimp_object_set_static_name (GIMP_OBJECT (tool_group), "tool group");
|
||||
|
||||
return group;
|
||||
return tool_group;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -38,13 +38,15 @@
|
|||
enum
|
||||
{
|
||||
VISIBLE_CHANGED,
|
||||
SHOWN_CHANGED,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
PROP_VISIBLE
|
||||
PROP_VISIBLE,
|
||||
PROP_SHOWN
|
||||
};
|
||||
|
||||
|
||||
|
@ -56,14 +58,14 @@ struct _GimpToolItemPrivate
|
|||
|
||||
/* local function prototypes */
|
||||
|
||||
static void gimp_tool_item_get_property (GObject *object,
|
||||
guint property_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec);
|
||||
static void gimp_tool_item_set_property (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec);
|
||||
static void gimp_tool_item_get_property (GObject *object,
|
||||
guint property_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec);
|
||||
static void gimp_tool_item_set_property (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec);
|
||||
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (GimpToolItem, gimp_tool_item, GIMP_TYPE_VIEWABLE)
|
||||
|
@ -89,6 +91,15 @@ gimp_tool_item_class_init (GimpToolItemClass *klass)
|
|||
gimp_marshal_VOID__VOID,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
gimp_tool_item_signals[SHOWN_CHANGED] =
|
||||
g_signal_new ("shown-changed",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
G_STRUCT_OFFSET (GimpToolItemClass, shown_changed),
|
||||
NULL, NULL,
|
||||
gimp_marshal_VOID__VOID,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
object_class->get_property = gimp_tool_item_get_property;
|
||||
object_class->set_property = gimp_tool_item_set_property;
|
||||
|
||||
|
@ -96,6 +107,11 @@ gimp_tool_item_class_init (GimpToolItemClass *klass)
|
|||
"visible", NULL, NULL,
|
||||
TRUE,
|
||||
GIMP_PARAM_STATIC_STRINGS);
|
||||
|
||||
g_object_class_install_property (object_class, PROP_SHOWN,
|
||||
g_param_spec_boolean ("shown", NULL, NULL,
|
||||
TRUE,
|
||||
GIMP_PARAM_READABLE));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -117,6 +133,9 @@ gimp_tool_item_get_property (GObject *object,
|
|||
case PROP_VISIBLE:
|
||||
g_value_set_boolean (value, tool_item->priv->visible);
|
||||
break;
|
||||
case PROP_SHOWN:
|
||||
g_value_set_boolean (value, gimp_tool_item_get_shown (tool_item));
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
|
@ -155,11 +174,22 @@ gimp_tool_item_set_visible (GimpToolItem *tool_item,
|
|||
|
||||
if (visible != tool_item->priv->visible)
|
||||
{
|
||||
gboolean old_shown;
|
||||
|
||||
g_object_freeze_notify (G_OBJECT (tool_item));
|
||||
|
||||
old_shown = gimp_tool_item_get_shown (tool_item);
|
||||
|
||||
tool_item->priv->visible = visible;
|
||||
|
||||
g_signal_emit (tool_item, gimp_tool_item_signals[VISIBLE_CHANGED], 0);
|
||||
|
||||
if (gimp_tool_item_get_shown (tool_item) != old_shown)
|
||||
gimp_tool_item_shown_changed (tool_item);
|
||||
|
||||
g_object_notify (G_OBJECT (tool_item), "visible");
|
||||
|
||||
g_object_thaw_notify (G_OBJECT (tool_item));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -172,7 +202,7 @@ gimp_tool_item_get_visible (GimpToolItem *tool_item)
|
|||
}
|
||||
|
||||
gboolean
|
||||
gimp_tool_item_is_visible (GimpToolItem *tool_item)
|
||||
gimp_tool_item_get_shown (GimpToolItem *tool_item)
|
||||
{
|
||||
GimpToolItem *parent;
|
||||
|
||||
|
@ -182,5 +212,16 @@ gimp_tool_item_is_visible (GimpToolItem *tool_item)
|
|||
gimp_viewable_get_parent (GIMP_VIEWABLE (tool_item)));
|
||||
|
||||
return tool_item->priv->visible &&
|
||||
(! parent || gimp_tool_item_is_visible (parent));
|
||||
(! parent || gimp_tool_item_get_shown (parent));
|
||||
}
|
||||
|
||||
|
||||
/* protected functions */
|
||||
|
||||
void
|
||||
gimp_tool_item_shown_changed (GimpToolItem *tool_item)
|
||||
{
|
||||
g_signal_emit (tool_item, gimp_tool_item_signals[SHOWN_CHANGED], 0);
|
||||
|
||||
g_object_notify (G_OBJECT (tool_item), "shown");
|
||||
}
|
||||
|
|
|
@ -49,15 +49,22 @@ struct _GimpToolItemClass
|
|||
|
||||
/* signals */
|
||||
void (* visible_changed) (GimpToolItem *tool_item);
|
||||
void (* shown_changed) (GimpToolItem *tool_item);
|
||||
};
|
||||
|
||||
|
||||
GType gimp_tool_item_get_type (void) G_GNUC_CONST;
|
||||
GType gimp_tool_item_get_type (void) G_GNUC_CONST;
|
||||
|
||||
void gimp_tool_item_set_visible (GimpToolItem *tool_item,
|
||||
gboolean visible);
|
||||
gboolean gimp_tool_item_get_visible (GimpToolItem *tool_item);
|
||||
|
||||
gboolean gimp_tool_item_get_shown (GimpToolItem *tool_item);
|
||||
|
||||
void gimp_tool_item_set_visible (GimpToolItem *tool_item,
|
||||
gboolean visible);
|
||||
gboolean gimp_tool_item_get_visible (GimpToolItem *tool_item);
|
||||
gboolean gimp_tool_item_is_visible (GimpToolItem *tool_item);
|
||||
|
||||
/* protected */
|
||||
|
||||
void gimp_tool_item_shown_changed (GimpToolItem *tool_item);
|
||||
|
||||
|
||||
#endif /* __GIMP_TOOL_ITEM_H__ */
|
||||
|
|
|
@ -61,7 +61,7 @@ struct _GimpToolEditorPrivate
|
|||
GtkWidget *delete_button;
|
||||
GtkWidget *reset_button;
|
||||
|
||||
GimpTreeHandler *visible_changed_handler;
|
||||
GimpTreeHandler *shown_changed_handler;
|
||||
|
||||
/* State of tools at creation of the editor, stored to support
|
||||
* reverting changes
|
||||
|
@ -97,7 +97,7 @@ static void gimp_tool_editor_drop_viewable (GimpContainer
|
|||
GimpViewable *dest_viewable,
|
||||
GtkTreeViewDropPosition drop_pos);
|
||||
|
||||
static void gimp_tool_editor_visible_changed (GimpToolItem *tool_item,
|
||||
static void gimp_tool_editor_shown_changed (GimpToolItem *tool_item,
|
||||
GimpToolEditor *tool_editor);
|
||||
|
||||
static void gimp_tool_editor_eye_data_func (GtkTreeViewColumn *tree_column,
|
||||
|
@ -575,8 +575,8 @@ gimp_tool_editor_reset_clicked (GtkButton *button,
|
|||
}
|
||||
|
||||
static void
|
||||
gimp_tool_editor_visible_changed (GimpToolItem *tool_item,
|
||||
GimpToolEditor *tool_editor)
|
||||
gimp_tool_editor_shown_changed (GimpToolItem *tool_item,
|
||||
GimpToolEditor *tool_editor)
|
||||
{
|
||||
GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (tool_editor);
|
||||
GimpContainerView *container_view = GIMP_CONTAINER_VIEW (tool_editor);
|
||||
|
@ -587,23 +587,13 @@ gimp_tool_editor_visible_changed (GimpToolItem *tool_item,
|
|||
|
||||
if (iter)
|
||||
{
|
||||
GtkTreePath *path;
|
||||
GimpContainer *children;
|
||||
GtkTreePath *path;
|
||||
|
||||
path = gtk_tree_model_get_path (tree_view->model, iter);
|
||||
|
||||
gtk_tree_model_row_changed (tree_view->model, path, iter);
|
||||
|
||||
gtk_tree_path_free (path);
|
||||
|
||||
children = gimp_viewable_get_children (GIMP_VIEWABLE (tool_item));
|
||||
|
||||
if (children)
|
||||
{
|
||||
gimp_container_foreach (children,
|
||||
(GFunc) gimp_tool_editor_visible_changed,
|
||||
tool_editor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -626,7 +616,7 @@ gimp_tool_editor_eye_data_func (GtkTreeViewColumn *tree_column,
|
|||
g_object_set (cell,
|
||||
"active", gimp_tool_item_get_visible (tool_item),
|
||||
"inconsistent", gimp_tool_item_get_visible (tool_item) &&
|
||||
! gimp_tool_item_is_visible (tool_item),
|
||||
! gimp_tool_item_get_shown (tool_item),
|
||||
NULL);
|
||||
|
||||
g_object_unref (renderer);
|
||||
|
@ -725,7 +715,7 @@ gimp_tool_editor_update_container (GimpToolEditor *tool_editor)
|
|||
GimpContainer *container;
|
||||
GimpContext *context;
|
||||
|
||||
g_clear_pointer (&tool_editor->priv->visible_changed_handler,
|
||||
g_clear_pointer (&tool_editor->priv->shown_changed_handler,
|
||||
gimp_tree_handler_disconnect);
|
||||
|
||||
g_clear_pointer (&tool_editor->priv->initial_tool_state, g_free);
|
||||
|
@ -741,9 +731,9 @@ gimp_tool_editor_update_container (GimpToolEditor *tool_editor)
|
|||
tool_editor->priv->container = container;
|
||||
tool_editor->priv->context = context;
|
||||
|
||||
tool_editor->priv->visible_changed_handler = gimp_tree_handler_connect (
|
||||
container, "visible-changed",
|
||||
G_CALLBACK (gimp_tool_editor_visible_changed),
|
||||
tool_editor->priv->shown_changed_handler = gimp_tree_handler_connect (
|
||||
container, "shown-changed",
|
||||
G_CALLBACK (gimp_tool_editor_shown_changed),
|
||||
tool_editor);
|
||||
|
||||
/* save initial tool order */
|
||||
|
|
|
@ -448,10 +448,10 @@ gimp_tool_palette_add_button (GimpToolPalette *palette,
|
|||
tool_button, index);
|
||||
gtk_widget_show (GTK_WIDGET (tool_button));
|
||||
|
||||
g_object_bind_property (tool_item, "visible",
|
||||
g_object_bind_property (tool_item, "shown",
|
||||
tool_button, "visible-horizontal",
|
||||
G_BINDING_SYNC_CREATE);
|
||||
g_object_bind_property (tool_item, "visible",
|
||||
g_object_bind_property (tool_item, "shown",
|
||||
tool_button, "visible-vertical",
|
||||
G_BINDING_SYNC_CREATE);
|
||||
|
||||
|
|
Loading…
Reference in New Issue