Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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)));
}
Exemplo n.º 4
0
/**
 * 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;
}
Exemplo n.º 5
0
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);
}
Exemplo n.º 6
0
/**
 * 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);
}