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); }
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); }
/** * 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); }
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; }
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); }
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); }
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); }
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); }