/** * mex_column_get_model: * * Get the current model. * * Returns: the current model */ MexModel* mex_column_get_model (MexColumn *column) { g_return_val_if_fail (MEX_IS_COLUMN (column), NULL); return column->priv->model; }
gboolean mex_column_get_opened (MexColumn *column) { g_return_val_if_fail (MEX_IS_COLUMN (column), FALSE); return column->priv->open_boxes != 0; }
ClutterActor* mex_column_get_placeholder_actor (MexColumn *column) { g_return_val_if_fail (MEX_IS_COLUMN (column), NULL); return column->priv->placeholder_actor; }
MexActorSortFunc mex_column_get_sort_func (MexColumn *column, gpointer *userdata) { g_return_val_if_fail (MEX_IS_COLUMN (column), NULL); if (userdata) *userdata = column->priv->sort_data; return column->priv->sort_func; }
void mex_column_set_focus (MexColumn *column, gboolean focus) { MexColumnPrivate *priv; g_return_if_fail (MEX_IS_COLUMN (column)); priv = column->priv; if (priv->has_focus != focus) { priv->has_focus = focus; priv->has_focus_changed = TRUE; if (focus) mex_column_expand_children (column, priv->current_focus); else mex_column_shrink_children (column); } }
void mex_column_set_placeholder_actor (MexColumn *column, ClutterActor *actor) { MexColumnPrivate *priv = column->priv; g_return_if_fail (MEX_IS_COLUMN (column)); g_return_if_fail (CLUTTER_IS_ACTOR (actor)); /* placeholder label */ if (priv->placeholder_actor) clutter_actor_unparent (priv->placeholder_actor); priv->placeholder_actor = actor; clutter_actor_push_internal (CLUTTER_ACTOR (column)); clutter_actor_set_parent (priv->placeholder_actor, CLUTTER_ACTOR (column)); clutter_actor_pop_internal (CLUTTER_ACTOR (column)); clutter_actor_queue_relayout (CLUTTER_ACTOR (column)); }
/** * mex_column_set_model: * * Set the current model. */ void mex_column_set_model (MexColumn *column, MexModel *model) { MexColumnPrivate *priv; GController *controller; g_return_if_fail (MEX_IS_COLUMN (column)); g_return_if_fail (model == NULL || MEX_IS_MODEL (model)); priv = column->priv; if (priv->model) { /* remove the "changed" signal handler */ controller = mex_model_get_controller (priv->model); g_signal_handlers_disconnect_by_func (controller, mex_column_controller_changed, column); /* clear the column */ mex_column_clear (column); /* remove the model */ g_object_unref (priv->model); } if (model) { priv->model = g_object_ref (model); mex_column_populate (column); controller = mex_model_get_controller (priv->model); g_signal_connect (controller, "changed", G_CALLBACK (mex_column_controller_changed), column); } else priv->model = NULL; }
void mex_column_set_collapse_on_focus (MexColumn *column, gboolean collapse) { MexColumnPrivate *priv; g_return_if_fail (MEX_IS_COLUMN (column)); priv = column->priv; if (priv->collapse != collapse) { ClutterActor *stage; priv->collapse = collapse; g_object_notify (G_OBJECT (column), "collapse-on-focus"); if ((stage = clutter_actor_get_stage (CLUTTER_ACTOR (column)))) { MxFocusManager *manager = mx_focus_manager_get_for_stage (CLUTTER_STAGE (stage)); mex_column_notify_focused_cb (manager, NULL, column); } } }
void mex_column_set_sort_func (MexColumn *column, MexActorSortFunc func, gpointer userdata) { MexColumnPrivate *priv; g_return_if_fail (MEX_IS_COLUMN (column)); priv = column->priv; if ((priv->sort_func != func) || (priv->sort_data != userdata)) { priv->sort_func = func; priv->sort_data = userdata; if (func) { priv->children = g_list_sort_with_data (priv->children, (GCompareDataFunc)func, userdata); clutter_actor_queue_relayout (CLUTTER_ACTOR (column)); } } }
gboolean mex_column_get_collapse_on_focus (MexColumn *column) { g_return_val_if_fail (MEX_IS_COLUMN (column), FALSE); return column->priv->collapse; }
gboolean mex_column_is_empty (MexColumn *column) { g_return_val_if_fail (MEX_IS_COLUMN (column), TRUE); return (column->priv->children == NULL); }
void mex_column_set_icon_name (MexColumn *column, const gchar *name) { g_return_if_fail (MEX_IS_COLUMN (column)); mx_icon_set_icon_name (MX_ICON (column->priv->icon), name); }
const gchar * mex_column_get_icon_name (MexColumn *column) { g_return_val_if_fail (MEX_IS_COLUMN (column), NULL); return mx_icon_get_icon_name (MX_ICON (column->priv->icon)); }
void mex_column_set_label (MexColumn *column, const gchar *label) { g_return_if_fail (MEX_IS_COLUMN (column)); mx_label_set_text (MX_LABEL (column->priv->label), label ? label : ""); }
const gchar * mex_column_get_label (MexColumn *column) { g_return_val_if_fail (MEX_IS_COLUMN (column), NULL); return mx_label_get_text (MX_LABEL (column->priv->label)); }
static void mex_column_notify_focused_cb (MxFocusManager *manager, GParamSpec *pspec, MexColumn *self) { GList *c; guint offset, increment; ClutterActor *focused, *focused_cell; gboolean cell_has_focus, has_focus, open, set_tile_important; MexColumnPrivate *priv = self->priv; focused = (ClutterActor *)mx_focus_manager_get_focused (manager); /* Check if we have focus, and what child is focused */ focused_cell = NULL; set_tile_important = FALSE; cell_has_focus = has_focus = FALSE; if (focused) { gboolean contains_column = FALSE; ClutterActor *parent = clutter_actor_get_parent (focused); while (parent) { if (parent == (ClutterActor *)self) { has_focus = TRUE; if (!priv->has_focus) { set_tile_important = TRUE; priv->has_focus = TRUE; } if (focused != priv->header) { cell_has_focus = TRUE; focused_cell = focused; } break; } else if (MEX_IS_COLUMN (parent)) { contains_column = TRUE; } focused = parent; parent = clutter_actor_get_parent (focused); } if (!contains_column) has_focus = TRUE; } if (!has_focus && priv->has_focus) { priv->has_focus = FALSE; set_tile_important = TRUE; } /* Scroll the adjustment to the top */ if (!cell_has_focus && priv->adjustment) mx_adjustment_interpolate (priv->adjustment, 0, 250, CLUTTER_EASE_OUT_CUBIC); /* Open/close boxes as appropriate */ offset = 0; increment = 150; /* If we're changing the tile importance, initialise the state manager */ if (set_tile_important && priv->n_items > 0) { if (priv->expand_timeline) g_object_unref (priv->expand_timeline); priv->expand_timeline = clutter_timeline_new (priv->n_items * increment); clutter_timeline_set_delay (priv->expand_timeline, 350); } /* Loop through children and set the expander box important/unimportant * as necessary, and if necessary, do the same for the tile inside the * expander-box. */ open = has_focus && !cell_has_focus; for (c = priv->children; c; c = c->next) { gchar signal_name[32+16]; ClutterActor *child = c->data; if ((!priv->collapse && priv->has_focus) || (child == focused_cell)) open = TRUE; if (!MEX_IS_EXPANDER_BOX (child)) continue; /* Note, 'marker-reached::' is 16 characters long */ g_snprintf (signal_name, G_N_ELEMENTS (signal_name), "marker-reached::%p", child); if (MEX_IS_CONTENT_BOX (child)) { ClutterActor *tile = mex_content_box_get_tile (MEX_CONTENT_BOX (child)); mex_tile_set_important (MEX_TILE (tile), priv->has_focus); } if (!open) { if (priv->expand_timeline) { if (clutter_timeline_has_marker (priv->expand_timeline, signal_name + 16)) clutter_timeline_remove_marker (priv->expand_timeline, signal_name + 16); g_signal_handlers_disconnect_by_func (priv->expand_timeline, mex_column_expand_drawer_cb, child); } mex_expander_box_set_important (MEX_EXPANDER_BOX (child), FALSE); } else if (set_tile_important) { mex_expander_box_set_important (MEX_EXPANDER_BOX (child), FALSE); clutter_timeline_add_marker_at_time (priv->expand_timeline, signal_name + 16, offset); g_signal_connect_swapped (priv->expand_timeline, signal_name, G_CALLBACK (mex_column_expand_drawer_cb), child); offset += increment; } else mex_expander_box_set_important (MEX_EXPANDER_BOX (child), TRUE); } if (priv->expand_timeline && set_tile_important && (offset >= increment)) clutter_timeline_start (priv->expand_timeline); }