Skip to content

Commit

Permalink
resizing-column/column: rework visual focus
Browse files Browse the repository at this point in the history
There are 2 levels of focus on resizing-hbox/columns, the traditionnal
focus + a visual focus. This patch rework the visual focus to make
things easier to read.
  • Loading branch information
djdeath committed Sep 12, 2011
1 parent 9e7efc6 commit 01325c7
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 83 deletions.
79 changes: 13 additions & 66 deletions mex/mex-column-view.c
Expand Up @@ -110,9 +110,6 @@ mex_column_view_move_focus (MxFocusable *focusable,
break;
}

if (!focusable)
priv->has_focus = FALSE;

return focusable;
}

Expand Down Expand Up @@ -162,9 +159,6 @@ mex_column_view_accept_focus (MxFocusable *focusable,
break;
}

if (focusable)
priv->has_focus = TRUE;

return focusable;
}

Expand Down Expand Up @@ -489,64 +483,6 @@ mex_column_view_pick (ClutterActor *actor, const ClutterColor *color)
clutter_actor_paint (priv->header);
}

static void
mex_column_view_notify_focused_cb (MxFocusManager *manager,
GParamSpec *pspec,
MexColumnView *self)
{
MexColumnViewPrivate *priv = self->priv;
ClutterActor *focused;

focused = (ClutterActor *) mx_focus_manager_get_focused (manager);

/* Check if we have focus */
if (focused)
{
ClutterActor *parent = clutter_actor_get_parent (focused);
while (parent)
{
if (parent == (ClutterActor *)self)
{
mex_column_set_has_focus (MEX_COLUMN (priv->column), TRUE);
return;
}

focused = parent;
parent = clutter_actor_get_parent (focused);
}
}

mex_column_set_has_focus (MEX_COLUMN (priv->column), FALSE);
}

static void
mex_column_view_map (ClutterActor *actor)
{
MxFocusManager *manager;
MexColumnView *self = MEX_COLUMN_VIEW (actor);

CLUTTER_ACTOR_CLASS (mex_column_view_parent_class)->map (actor);

manager = mx_focus_manager_get_for_stage ((ClutterStage *)
clutter_actor_get_stage (actor));
g_signal_connect (manager, "notify::focused",
G_CALLBACK (mex_column_view_notify_focused_cb), actor);
mex_column_view_notify_focused_cb (manager, NULL, self);
}

static void
mex_column_view_unmap (ClutterActor *actor)
{
MxFocusManager *manager =
mx_focus_manager_get_for_stage ((ClutterStage *)
clutter_actor_get_stage (actor));
g_signal_handlers_disconnect_by_func (manager,
mex_column_view_notify_focused_cb,
actor);

CLUTTER_ACTOR_CLASS (mex_column_view_parent_class)->unmap (actor);
}

static void
mex_column_view_class_init (MexColumnViewClass *klass)
{
Expand All @@ -564,8 +500,6 @@ mex_column_view_class_init (MexColumnViewClass *klass)
a_class->allocate = mex_column_view_allocate;
a_class->paint = mex_column_view_paint;
a_class->pick = mex_column_view_pick;
a_class->map = mex_column_view_map;
a_class->unmap = mex_column_view_unmap;

g_type_class_add_private (klass, sizeof (MexColumnViewPrivate));

Expand Down Expand Up @@ -785,3 +719,16 @@ mex_column_view_set_icon_name (MexColumnView *column, const gchar *name)
g_return_if_fail (MEX_IS_COLUMN_VIEW (column));
mx_icon_set_icon_name (MX_ICON (column->priv->icon), name);
}

void
mex_column_view_set_focus (MexColumnView *column, gboolean focus)
{
MexColumnViewPrivate *priv;

g_return_if_fail (MEX_IS_COLUMN_VIEW (column));

priv = column->priv;
priv->has_focus = focus;

mex_column_set_focus (MEX_COLUMN (priv->column), focus);
}
2 changes: 2 additions & 0 deletions mex/mex-column-view.h
Expand Up @@ -85,6 +85,8 @@ ClutterActor* mex_column_view_get_placeholder_actor (MexColumnView *column);
void mex_column_view_set_placeholder_actor (MexColumnView *column,
ClutterActor *label);

void mex_column_view_set_focus (MexColumnView *column, gboolean focus);

G_END_DECLS

#endif /* _MEX_COLUMN_VIEW_H */
16 changes: 4 additions & 12 deletions mex/mex-column.c
Expand Up @@ -1052,6 +1052,8 @@ mex_column_notify_focused_cb (MxFocusManager *manager,

if (priv->expand_timeline && set_tile_important && (offset >= increment))
clutter_timeline_start (priv->expand_timeline);

priv->has_focus_changed = FALSE;
}

static void
Expand Down Expand Up @@ -1228,7 +1230,7 @@ mex_column_get_collapse_on_focus (MexColumn *column)
}

void
mex_column_set_has_focus (MexColumn *column, gboolean focus)
mex_column_set_focus (MexColumn *column, gboolean focus)
{
MexColumnPrivate *priv;

Expand All @@ -1238,18 +1240,8 @@ mex_column_set_has_focus (MexColumn *column, gboolean focus)

if (priv->has_focus != focus)
{
ClutterActor *stage;

priv->has_focus = focus;

if ((stage = clutter_actor_get_stage (CLUTTER_ACTOR (column))))
{
MxFocusManager *manager =
mx_focus_manager_get_for_stage (CLUTTER_STAGE (stage));
priv->has_focus_changed = TRUE;
mex_column_notify_focused_cb (manager, NULL, column);
priv->has_focus_changed = FALSE;
}
priv->has_focus_changed = TRUE;
}
}

Expand Down
2 changes: 1 addition & 1 deletion mex/mex-column.h
Expand Up @@ -74,7 +74,7 @@ void mex_column_set_collapse_on_focus (MexColumn *column,
gboolean collapse);
gboolean mex_column_get_collapse_on_focus (MexColumn *column);

void mex_column_set_has_focus (MexColumn *column, gboolean focus);
void mex_column_set_focus (MexColumn *column, gboolean focus);

gboolean mex_column_get_opened (MexColumn *column);

Expand Down
26 changes: 22 additions & 4 deletions mex/mex-resizing-hbox.c
Expand Up @@ -606,12 +606,13 @@ mex_resizing_hbox_move_focus (MxFocusable *focusable,
static MxFocusable *
mex_resizing_hbox_accept_focus (MxFocusable *focusable, MxFocusHint hint)
{
GList *c;
gboolean reverse;

MexResizingHBox *self = MEX_RESIZING_HBOX (focusable);
MexResizingHBoxPrivate *priv = self->priv;

GList *c;
gboolean reverse;
ClutterActor *child = priv->current_focus;

if (hint == MX_FOCUS_HINT_FROM_LEFT)
hint = MX_FOCUS_HINT_FIRST;
else if (hint == MX_FOCUS_HINT_FROM_RIGHT)
Expand All @@ -635,7 +636,7 @@ mex_resizing_hbox_accept_focus (MxFocusable *focusable, MxFocusHint hint)
for (c = reverse ? g_list_last (priv->children) : priv->children;
c; c = reverse ? c->prev : c->next)
{
ClutterActor *child = c->data;
child = c->data;

if (!MX_IS_FOCUSABLE (child) ||
!CLUTTER_ACTOR_IS_VISIBLE (child))
Expand All @@ -646,6 +647,16 @@ mex_resizing_hbox_accept_focus (MxFocusable *focusable, MxFocusHint hint)
}
}

if (child != priv->current_focus)
{
if (MEX_IS_COLUMN_VIEW (priv->current_focus))
mex_column_view_set_focus (MEX_COLUMN_VIEW (priv->current_focus),
FALSE);
if (MEX_IS_COLUMN_VIEW (child))
mex_column_view_set_focus (MEX_COLUMN_VIEW (child),
TRUE);
}

return focusable;
}

Expand Down Expand Up @@ -1535,6 +1546,13 @@ mex_resizing_hbox_notify_focused_cb (MxFocusManager *manager,
"opacity", INACTIVE_OPACITY,
NULL);

if (MEX_IS_COLUMN_VIEW (priv->current_focus))
mex_column_view_set_focus (MEX_COLUMN_VIEW (priv->current_focus),
FALSE);
if (MEX_IS_COLUMN_VIEW (focused))
mex_column_view_set_focus (MEX_COLUMN_VIEW (focused),
TRUE);

priv->current_focus = focused;
priv->has_focus = TRUE;

Expand Down

0 comments on commit 01325c7

Please sign in to comment.