void mex_aggregate_model_remove_model (MexAggregateModel *aggregate, MexModel *model) { GList *link; GController *controller; MexAggregateModelPrivate *priv; g_return_if_fail (MEX_IS_AGGREGATE_MODEL (aggregate)); g_return_if_fail (MEX_IS_MODEL (model)); priv = aggregate->priv; if (!(link = g_list_find (priv->models, model))) return; controller = mex_model_get_controller (model); /* Remove items */ mex_aggregate_model_clear_model (aggregate, model); /* Disconnect from signal */ g_signal_handlers_disconnect_by_func (controller, mex_aggregate_model_controller_changed_cb, aggregate); /* Remove model from list and remove custom data */ g_hash_table_remove (priv->controller_to_model, controller); priv->models = g_list_delete_link (priv->models, link); /* Emit removed signal */ g_signal_emit (aggregate, signals[MODEL_REMOVED], 0, model); /* Unref model */ g_object_unref (model); }
gboolean mex_model_provider_model_activated (MexModelProvider *provider, MexModel *model) { MexModelProviderInterface *iface; g_return_val_if_fail (MEX_IS_MODEL_PROVIDER (provider), FALSE); g_return_val_if_fail (MEX_IS_MODEL (model), FALSE); iface = MEX_MODEL_PROVIDER_GET_IFACE (provider); if (iface->model_activated) return iface->model_activated (provider, model); return FALSE; }
void mex_content_view_set_context (MexContentView *view, MexModel *context) { MexContentViewIface *iface; g_return_if_fail (MEX_IS_CONTENT_VIEW (view)); g_return_if_fail (MEX_IS_MODEL (context) || context == NULL); iface = MEX_CONTENT_VIEW_GET_IFACE (view); if (G_LIKELY (iface->set_context)) { iface->set_context (view, context); return; } g_warning ("MexContentView of type '%s' does not implement set_context()", g_type_name (G_OBJECT_TYPE (view))); }
/** * 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_aggregate_model_add_model (MexAggregateModel *aggregate, MexModel *model) { gint i; MexContent *content; GController *controller; MexAggregateModelPrivate *priv; g_return_if_fail (MEX_IS_AGGREGATE_MODEL (aggregate)); g_return_if_fail (MEX_IS_MODEL (model)); priv = aggregate->priv; if (g_list_find (priv->models, model)) return; /* Add a link back to the model from the controller */ controller = mex_model_get_controller (model); g_hash_table_insert (priv->controller_to_model, controller, model); /* Add model to list */ priv->models = g_list_insert_sorted (priv->models, model, (GCompareFunc) mex_aggregate_model_sort_func); /* Add existing items */ i = 0; while ((content = mex_model_get_content (model, i))) { g_hash_table_insert (priv->content_to_model, content, model); mex_model_add_content (MEX_MODEL (aggregate), content); i++; } /* Connect to the controller changed signal */ g_signal_connect (controller, "changed", G_CALLBACK (mex_aggregate_model_controller_changed_cb), aggregate); /* Emit added signal */ g_signal_emit (aggregate, signals[MODEL_ADDED], 0, model); }
/** * mex_feed_search: * @feed: A #MexFeed * @search: A string array * @mode: The #MexFeedSearchMode * @results_feed: A #MexFeed to store the results of the search. * * Searches @feed for the terms found in @search and puts the results * into @results_feed; */ void mex_feed_search (MexFeed *feed, const char **search, MexFeedSearchMode mode, MexModel *results_model) { MexFeedPrivate *priv; int i; GHashTable *count_hash = NULL; GPtrArray *terms; g_return_if_fail (MEX_IS_FEED (feed)); g_return_if_fail (MEX_IS_MODEL (results_model)); priv = feed->priv; terms = get_full_search_terms (feed, search); for (i = 0; i < terms->len; i++) { GPtrArray *possible_terms = terms->pdata[i]; GHashTable *term_programs; term_programs = get_programs_for_term (feed, possible_terms); /* term_programs now contains all the programs that match the term in search[i] */ if (mode == MEX_FEED_SEARCH_MODE_OR) { /* For OR mode we just need to add the programs to the feed */ g_hash_table_foreach (term_programs, or_add_to_feed, results_model); } else { GList *programs, *p; gpointer count_as_ptr; int count; /* For AND mode we need to count how many terms each program is found in */ if (G_UNLIKELY (count_hash == NULL)) { count_hash = g_hash_table_new (NULL, NULL); } programs = g_hash_table_get_keys (term_programs); for (p = programs; p; p = p->next) { MexProgram *program = (MexProgram *) p->data; count_as_ptr = g_hash_table_lookup (count_hash, program); count = GPOINTER_TO_INT (count_as_ptr); count++; g_hash_table_insert (count_hash, program, GINT_TO_POINTER (count)); } g_list_free (programs); } g_ptr_array_free (possible_terms, TRUE); g_hash_table_destroy (term_programs); } if (count_hash) { struct _SearchPayload payload; payload.model = results_model; payload.term_count = i; g_hash_table_foreach (count_hash, and_add_to_feed, &payload); g_hash_table_destroy (count_hash); } g_ptr_array_free (terms, TRUE); }