コード例 #1
0
static void
mex_grid_view_set_model (MexGridView *view,
                         MexModel    *model)
{
  MexGridViewPrivate *priv = MEX_GRID_VIEW (view)->priv;
  gchar *category = NULL;

  g_return_if_fail (model != NULL);

  if (model == priv->model)
    return;

  if (priv->model)
    g_object_unref (priv->model);

  priv->model = g_object_ref (model);

  g_object_get (model, "category", &category, NULL);

  /* Add the clear queue option */
  if (g_strcmp0 (category, "queue") == 0)
    {
      MxAction *clear_queue;

      clear_queue =
        mx_action_new_full ("clear-queue",
                            _("Clear queue"),
                            G_CALLBACK (mex_clear_queue_cb),
                            model);

      mex_menu_add_action (MEX_MENU (priv->menu_layout),
                           clear_queue,
                           MEX_MENU_NONE);
    }

  /* set the model on the grid */
  mex_grid_set_model (MEX_GRID (priv->grid), model);

  /* set grid title */
  g_object_bind_property (model, "title",
                          priv->grid_title, "text",
                          G_BINDING_SYNC_CREATE);

  /* set column title and icon */
  if (category)
    {
      const MexModelCategoryInfo *cat_info;
      cat_info = mex_model_manager_get_category_info (mex_model_manager_get_default (),
                                                      category);
      mx_label_set_text (MX_LABEL (priv->menu_title), cat_info->display_name);
    }

  g_free (category);
}
コード例 #2
0
static void
mex_search_plugin_dispose (GObject *object)
{
  MexSearchPlugin *self = MEX_SEARCH_PLUGIN (object);
  MexSearchPluginPrivate *priv = self->priv;

  mex_model_manager_remove_category (mex_model_manager_get_default (),
                                     "search");

  if (priv->history_model)
    {
      g_object_unref (priv->history_model);
      priv->history_model = NULL;
    }

  if (priv->suggest_model)
    {
      g_object_unref (priv->suggest_model);
      priv->suggest_model = NULL;
    }

  if (priv->suggest_timeout)
    {
      g_source_remove (priv->suggest_timeout);
      priv->suggest_timeout = 0;
    }

  if (priv->suggest_id)
    {
      MexDownloadQueue *dq = mex_download_queue_get_default ();
      mex_download_queue_cancel (dq, priv->suggest_id);
      priv->suggest_id = NULL;
    }

  if (priv->search_proxy)
    {
      g_object_unref (priv->search_proxy);
      priv->search_proxy = NULL;
    }

  if (priv->search_page)
    {
      g_object_unref (priv->search_page);
      priv->search_page = NULL;
    }

  if (priv->action_info.action)
    {
      g_object_unref (priv->action_info.action);
      priv->action_info.action = NULL;
    }

  G_OBJECT_CLASS (mex_search_plugin_parent_class)->dispose (object);
}
コード例 #3
0
ファイル: mex-main.c プロジェクト: ocrete/media-explorer
/**
 * mex_init_default_categories:
 *
 * Add the default categories to the model manager
 */
static void
mex_init_default_categories (void)
{
  MexModelManager *mmanager;

  mmanager = mex_model_manager_get_default ();

  mex_model_manager_add_category (mmanager, &live);
  mex_model_manager_add_category (mmanager, &videos);
  mex_model_manager_add_category (mmanager, &music);
  mex_model_manager_add_category (mmanager, &pictures);
  mex_model_manager_add_category (mmanager, &queue);
}
コード例 #4
0
static gint
mex_aggregate_model_sort_func (MexModel *a,
                               MexModel *b)
{
    MexModelManager *manager;
    const MexModelInfo *info_a, *info_b;

    manager = mex_model_manager_get_default ();

    info_a = mex_model_manager_get_model_info (manager, a);
    info_b = mex_model_manager_get_model_info (manager, b);

    if (info_a && info_b)
        return info_a->priority - info_b->priority;
    else
        return 0;
}
コード例 #5
0
static void
mex_bliptv_plugin_init (MexBliptvPlugin  *self)
{
  MexBliptvPluginPrivate *priv;
  GrlRegistry *registry;
  GList *sources, *iter;

  priv = self->priv = GET_PRIVATE (self);

  priv->video_models = g_hash_table_new_full (g_direct_hash, g_direct_equal,
                                                   NULL, NULL);

  priv->query_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID,
                                                GRL_METADATA_KEY_TITLE,
                                                GRL_METADATA_KEY_MIME,
                                                GRL_METADATA_KEY_URL,
                                                GRL_METADATA_KEY_PUBLICATION_DATE,
                                                NULL);

  priv->video_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID,
                                                GRL_METADATA_KEY_DESCRIPTION,
                                                GRL_METADATA_KEY_DURATION,
                                                GRL_METADATA_KEY_THUMBNAIL,
                                                GRL_METADATA_KEY_WIDTH,
                                                GRL_METADATA_KEY_HEIGHT,
                                                NULL);

  priv->manager = mex_model_manager_get_default ();

  registry = grl_registry_get_default ();
  sources = grl_registry_get_sources (registry, FALSE);
  for (iter = sources; iter != NULL; iter = iter->next)
    handle_new_source (self, GRL_SOURCE (iter->data));
  g_list_free (sources);

  g_signal_connect (registry, "source-added",
                    G_CALLBACK (registry_source_added_cb), self);
  g_signal_connect (registry, "source-removed",
                    G_CALLBACK (registry_source_removed_cb), self);
}
コード例 #6
0
static void
mex_tracker_plugin_init (MexTrackerPlugin  *self)
{
  MexTrackerPluginPrivate *priv;
  GrlPluginRegistry *registry;
  GList *plugins, *iter;

  priv = self->priv = GET_PRIVATE (self);

  priv->image_models = g_hash_table_new_full (g_direct_hash, g_direct_equal,
                                              g_object_unref, NULL);
  priv->video_models = g_hash_table_new_full (g_direct_hash, g_direct_equal,
                                              g_object_unref, NULL);
  priv->music_models = g_hash_table_new_full (g_direct_hash, g_direct_equal,
                                              g_object_unref, NULL);

  priv->query_video_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID,
                                                      GRL_METADATA_KEY_TITLE,
                                                      GRL_METADATA_KEY_MIME,
                                                      GRL_METADATA_KEY_URL,
                                                      GRL_METADATA_KEY_DATE,
                                                      GRL_METADATA_KEY_THUMBNAIL,
                                                      GRL_METADATA_KEY_PLAY_COUNT,
                                                      NULL);

  priv->query_image_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID,
                                                      GRL_METADATA_KEY_TITLE,
                                                      GRL_METADATA_KEY_MIME,
                                                      GRL_METADATA_KEY_URL,
                                                      GRL_METADATA_KEY_DATE,
                                                      GRL_METADATA_KEY_THUMBNAIL,
                                                      GRL_METADATA_KEY_PLAY_COUNT,
                                                      NULL);

  priv->query_music_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID,
                                                      GRL_METADATA_KEY_TITLE,
                                                      GRL_METADATA_KEY_MIME,
                                                      GRL_METADATA_KEY_URL,
                                                      GRL_METADATA_KEY_DATE,
                                                      GRL_METADATA_KEY_THUMBNAIL,
                                                      GRL_METADATA_KEY_PLAY_COUNT,
                                                      GRL_METADATA_KEY_ALBUM,
                                                      GRL_METADATA_KEY_ARTIST,
                                                      NULL);

  priv->image_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID,
                                                GRL_METADATA_KEY_DESCRIPTION,
                                                GRL_METADATA_KEY_THUMBNAIL,
                                                GRL_METADATA_KEY_WIDTH,
                                                GRL_METADATA_KEY_HEIGHT,
                                                GRL_METADATA_KEY_LAST_PLAYED,
                                                GRL_METADATA_KEY_CAMERA_MODEL,
                                                GRL_METADATA_KEY_EXPOSURE_TIME,
                                                GRL_METADATA_KEY_ISO_SPEED,
                                                GRL_METADATA_KEY_FLASH_USED,
                                                GRL_METADATA_KEY_ORIENTATION,
                                                GRL_METADATA_KEY_CREATION_DATE,
                                                NULL);

  priv->video_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID,
                                                GRL_METADATA_KEY_DESCRIPTION,
                                                GRL_METADATA_KEY_DURATION,
                                                GRL_METADATA_KEY_THUMBNAIL,
                                                GRL_METADATA_KEY_WIDTH,
                                                GRL_METADATA_KEY_HEIGHT,
                                                GRL_METADATA_KEY_LAST_POSITION,
                                                GRL_METADATA_KEY_LAST_PLAYED,
                                                NULL);

  priv->music_keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ID,
                                                GRL_METADATA_KEY_DURATION,
                                                GRL_METADATA_KEY_THUMBNAIL,
                                                GRL_METADATA_KEY_LAST_POSITION,
                                                GRL_METADATA_KEY_LAST_PLAYED,
                                                NULL);

  priv->manager = mex_model_manager_get_default ();

  /* log domain */
  MEX_LOG_DOMAIN_INIT (tracker_log_domain, "tracker");

  registry = grl_plugin_registry_get_default ();
  plugins = grl_plugin_registry_get_sources (registry, FALSE);
  for (iter = plugins; iter != NULL; iter = iter->next)
    handle_new_source_plugin (self, GRL_MEDIA_PLUGIN (iter->data));
  g_list_free (plugins);

  g_signal_connect (registry, "source-added",
                    G_CALLBACK (registry_source_added_cb), self);
  g_signal_connect (registry, "source-removed",
                    G_CALLBACK (registry_source_removed_cb), self);
}
コード例 #7
0
static void
mex_search_plugin_init (MexSearchPlugin *self)
{
  MexModel *view_model;
  MexProxy *suggest_proxy;
  ClutterActor *icon, *header, *text, *frame, *box, *hbox;
  MexSearchPluginPrivate *priv = self->priv = SEARCH_PLUGIN_PRIVATE (self);
  MexModelCategoryInfo search = { "search", _("Search"), "icon-panelheader-search", 0, "" };
  /* create a category for search results that is not shown on the home screen */
  MexModelCategoryInfo search_results = {
      "search-results", _("Search"), "icon-panelheader-search", -1, "" };
  MexModelManager *manager = mex_model_manager_get_default ();

  manager = mex_model_manager_get_default ();
  mex_model_manager_add_category (manager, &search);
  mex_model_manager_add_category (manager, &search_results);

  /* Create the history model and models list */
  priv->history_model = mex_feed_new (_("Search"), _("Search"));
  g_object_set (G_OBJECT (priv->history_model), "category", "search", NULL);

  priv->models = g_list_append (NULL, priv->history_model);

  /* Create the actions list */
  memset (&priv->action_info, 0, sizeof (MexActionInfo));
  priv->action_info.action =
    mx_action_new_full ("x-mex/search",
                        _("Search"),
                        G_CALLBACK (mex_search_plugin_history_cb),
                        self);
  priv->action_info.mime_types = (gchar **)search_mimetypes;
  priv->actions = g_list_append (NULL, &priv->action_info);

  /* Create the suggestions model */
  priv->suggest_model =
    mex_feed_new (_("Suggestions"), _("Google Suggestions"));

  /* Create the search page */

  /* Create header */
  icon = mx_icon_new ();
  mx_stylable_set_style_class (MX_STYLABLE (icon), "Search");

  header = mx_box_layout_new ();
  mx_box_layout_set_spacing (MX_BOX_LAYOUT (header), 5);
  clutter_actor_set_name (header, "search-header");

  /* Create search entry */
  frame = mx_table_new ();
  clutter_actor_set_name (frame, "search-entry-frame");
  priv->search_entry = mx_entry_new ();
  priv->spinner = mx_spinner_new ();

  mx_table_insert_actor (MX_TABLE (frame), priv->search_entry, 0, 0);
  mx_table_insert_actor (MX_TABLE (frame), priv->spinner, 0, 1);
  mx_table_child_set_x_fill (MX_TABLE (frame), priv->spinner, FALSE);
  mx_table_child_set_x_expand (MX_TABLE (frame), priv->spinner, FALSE);
  mx_table_child_set_y_fill (MX_TABLE (frame), priv->spinner, FALSE);

  mx_spinner_set_animating (MX_SPINNER (priv->spinner), FALSE);
  clutter_actor_hide (priv->spinner);

  clutter_container_add (CLUTTER_CONTAINER (header), icon, frame, NULL);
  clutter_container_child_set (CLUTTER_CONTAINER (header), icon,
                               "x-fill", FALSE, "y-fill", FALSE, NULL);
  clutter_container_child_set (CLUTTER_CONTAINER (header), frame,
                               "expand", TRUE, "x-fill", TRUE, NULL);

  text = mx_entry_get_clutter_text (MX_ENTRY (priv->search_entry));
  g_signal_connect_swapped (text, "activate",
                            G_CALLBACK (mex_search_plugin_search_cb), self);
  g_signal_connect (priv->search_entry, "notify::text",
                    G_CALLBACK (mex_search_text_changed_cb), self);
  g_signal_connect (priv->search_entry, "notify::style-pseudo-class",
                    G_CALLBACK (mex_search_text_style_changed), header);

  /* Create the suggestions column */
  priv->suggest_column = mx_box_layout_new ();
  clutter_actor_set_name (priv->suggest_column, "suggest-column");
  mx_box_layout_set_orientation (MX_BOX_LAYOUT (priv->suggest_column),
                                 MX_ORIENTATION_VERTICAL);

  view_model = mex_view_model_new (MEX_MODEL (priv->suggest_model));
  suggest_proxy = mex_generic_proxy_new (view_model,
                                         MX_TYPE_BUTTON);
  mex_generic_proxy_bind (MEX_GENERIC_PROXY (suggest_proxy),
                          mex_enum_to_string (MEX_TYPE_CONTENT_METADATA,
                                              MEX_CONTENT_METADATA_TITLE),
                          "label");
  g_signal_connect (suggest_proxy, "object-created",
                    G_CALLBACK (mex_search_proxy_add_cb),
                    priv->suggest_column);
  g_signal_connect (suggest_proxy, "object-removed",
                    G_CALLBACK (mex_search_proxy_remove_cb),
                    priv->suggest_column);
  g_object_weak_ref (G_OBJECT (priv->suggest_column),
                     (GWeakNotify)g_object_unref, suggest_proxy);

  /* Pack the search page */
  priv->search_page = mx_frame_new ();
  clutter_actor_set_name (priv->search_page, "search-page");
  mx_bin_set_fill (MX_BIN (priv->search_page), FALSE, TRUE);
  mx_bin_set_alignment (MX_BIN (priv->search_page), MX_ALIGN_START,
                        MX_ALIGN_START);
  hbox = mex_resizing_hbox_new ();
  mex_resizing_hbox_set_resizing_enabled (MEX_RESIZING_HBOX (hbox), FALSE);
  box = mx_box_layout_new ();
  mx_bin_set_child (MX_BIN (priv->search_page), hbox);
  clutter_actor_add_child (hbox, box);
  mx_box_layout_set_orientation (MX_BOX_LAYOUT (box),
                                 MX_ORIENTATION_VERTICAL);
  clutter_container_add (CLUTTER_CONTAINER (box),
                         header, priv->suggest_column, NULL);
  mx_box_layout_child_set_expand (MX_BOX_LAYOUT (box),
                                  priv->suggest_column, TRUE);
  clutter_container_child_set (CLUTTER_CONTAINER (box), header,
                               "x-fill", TRUE,
                               "x-align", MX_ALIGN_START, NULL);
  clutter_container_child_set (CLUTTER_CONTAINER (box),
                               priv->suggest_column,
                               "x-fill", TRUE,
                               "x-align", MX_ALIGN_START, NULL);
  clutter_actor_set_width (box, 426.0);

  /* Update the history list */
  mex_search_plugin_update_history (self, NULL);
}
コード例 #8
0
static void
mex_search_plugin_search (MexSearchPlugin *self,
                          const gchar     *search)
{
  GList *l, *list;
  MexSearchPluginPrivate *priv = self->priv;
  MexModelManager *manager = mex_model_manager_get_default ();
  gboolean have_tracker = FALSE;

  if (!priv->search_model)
    {
      /* Create search model */
      priv->search_model = mex_aggregate_model_new ();
      g_object_set (G_OBJECT (priv->search_model),
                    "title", _("Search results"), NULL);
    }

  /* Kill the last search */
  list = (GList *) mex_aggregate_model_get_models (
                       MEX_AGGREGATE_MODEL (priv->search_model));
  for (l = list; l; l = l->next)
    mex_model_manager_remove_model (manager, l->data);
  mex_aggregate_model_clear (MEX_AGGREGATE_MODEL (priv->search_model));

  /* Iterate over searchable Grilo sources */
  list = grl_plugin_registry_get_sources (grl_plugin_registry_get_default (),
                                             FALSE);

  /* find the local files source and place it first */
  for (l = list; l; l = l->next)
    {
      GrlMetadataSource *meta_src = l->data;
      const gchar *name = grl_metadata_source_get_name (meta_src);
      const gchar *source_id;

      if (!GRL_IS_METADATA_SOURCE (meta_src))
        continue;

      source_id = grl_media_plugin_get_id (GRL_MEDIA_PLUGIN (meta_src));

      if (source_id && g_str_equal (source_id, "grl-tracker"))
        have_tracker = TRUE;

      if (name && !strcmp (name, "Local files"))
        {
          list = g_list_remove_link (list, l);
          list = g_list_concat (list, l);
          break;
        }
    }

  /* prefer tracker over the filesystem plugin by removing it from the list if
   * tracker is available */
  if (have_tracker)
    {
      for (l = list; l; l = l->next)
        {
          GrlMetadataSource *meta_src = l->data;
          const gchar *source_id;

          if (!GRL_IS_METADATA_SOURCE (meta_src))
            continue;

          source_id = grl_media_plugin_get_id (GRL_MEDIA_PLUGIN (meta_src));

          if (source_id && g_str_equal (source_id, "grl-filesystem"))
            {
              list = g_list_delete_link (list, l);
              break;
            }
        }
    }


  for (l = list; l; l = l->next)
    {
      const gchar *source_id;
      GrlSupportedOps supported;
      GrlMetadataSource *meta_src = l->data;

      if (!GRL_IS_METADATA_SOURCE (meta_src))
        continue;

      /* only search upnp and tracker sources */
      source_id = grl_media_plugin_get_id (GRL_MEDIA_PLUGIN (meta_src));

      supported = grl_metadata_source_supported_operations (meta_src);
      if ((supported & GRL_OP_SEARCH) || (supported & GRL_OP_QUERY))
        {
          MexFeed *feed;
          GController *controller;

          if (g_str_equal (source_id, "grl-tracker"))
            feed = mex_grilo_tracker_feed_new (GRL_MEDIA_SOURCE (meta_src),
                                               NULL, NULL, NULL, NULL);
          else
            feed =
              mex_grilo_feed_new (GRL_MEDIA_SOURCE (meta_src), NULL, NULL, NULL);
          mex_model_set_sort_func (MEX_MODEL (feed),
                                   mex_model_sort_time_cb,
                                   GINT_TO_POINTER (TRUE));

          g_object_set (G_OBJECT (feed),
                        "category", "search-results",
                        "placeholder-text", _("No videos found"),
                        NULL);
          mex_model_manager_add_model (manager, MEX_MODEL (feed));

          controller = mex_model_get_controller (MEX_MODEL (feed));

          /* Attach to the changed signal so that we can alter the
           * mime-type of content if necessary.
           */
          g_signal_connect (controller, "changed",
                            G_CALLBACK (mex_search_plugin_model_changed_cb),
                            feed);

          mex_aggregate_model_add_model (
            MEX_AGGREGATE_MODEL (priv->search_model), MEX_MODEL (feed));

          /* FIXME: Arbitrary 50 item limit... */
          mex_grilo_feed_search (MEX_GRILO_FEED (feed), search, 0, 50);

          g_object_unref (G_OBJECT (feed));
        }
    }
  g_list_free (list);
}