static void mex_search_plugin_search_cb (MexSearchPlugin *self) { MexModelInfo *info; MexSearchPluginPrivate *priv = self->priv; const gchar *search = mx_entry_get_text (MX_ENTRY (priv->search_entry)); /* Stop the suggestions search */ if (priv->suggest_timeout) { g_source_remove (priv->suggest_timeout); priv->suggest_timeout = 0; } /* Start a new search */ mex_search_plugin_search (self, search); /* Update the history list */ mex_search_plugin_update_history (self, search); /* Present the search model */ info = mex_model_info_new_with_sort_funcs (priv->search_model, "search-results", 0); mex_model_provider_present_model (MEX_MODEL_PROVIDER (self), info); mex_model_info_free (info); /* Hide the search page, if it was visible */ if (CLUTTER_ACTOR_IS_VISIBLE (priv->search_page)) mex_tool_provider_remove_actor (MEX_TOOL_PROVIDER (self), priv->search_page); /* TODO: Maybe use weak references to stop the search if the application * didn't use it? */ }
static void mex_search_plugin_init (MexSearchPlugin *self) { MexProxy *suggest_proxy; ClutterActor *icon, *header, *text, *frame, *box, *hbox; MexSearchPluginPrivate *priv = self->priv = SEARCH_PLUGIN_PRIVATE (self); /* Load style data */ mx_style_load_from_file (mx_style_get_default (), PLUGIN_DATA_DIR "/style.css", NULL); /* Create the history model and models list */ priv->history_model = mex_feed_new (_("Search"), _("Search")); priv->model_info = mex_model_info_new_with_sort_funcs (MEX_MODEL (priv->history_model), "search", 0); g_object_unref (priv->history_model); priv->models = g_list_append (NULL, priv->model_info); /* 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_add_actor (MX_TABLE (frame), priv->search_entry, 0, 0); mx_table_add_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); suggest_proxy = mex_generic_proxy_new (MEX_MODEL (priv->suggest_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 (); clutter_container_add_actor (CLUTTER_CONTAINER (priv->search_page), hbox); clutter_container_add_actor (CLUTTER_CONTAINER (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); /* Start the history list and suggestions proxy */ mex_proxy_start (suggest_proxy); }
static void mex_library_plugin_init (MexLibraryPlugin *self) { GrlMediaPlugin *plugin; GrlPluginRegistry *registry; MexLibraryPluginPrivate *priv = self->priv = LIBRARY_PLUGIN_PRIVATE (self); registry = grl_plugin_registry_get_default (); plugin = grl_plugin_registry_lookup_source (registry, "grl-filesystem"); if (plugin) { GList *query_keys; MexFeed *feed; GrlMedia *box; const gchar *path; MexModelInfo *video_info, *photo_info, *music_info; 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_DATE, NULL); /* Add the videos model */ path = g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS); box = mex_library_plugin_get_box_for_path (GRL_MEDIA_SOURCE (plugin), query_keys, path); if (box) { GList *metadata_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); feed = mex_grilo_feed_new (GRL_MEDIA_SOURCE (plugin), query_keys, metadata_keys, box); g_object_set (feed, "icon-name", "icon-library", "placeholder-text", "No videos found", NULL); mex_grilo_feed_browse (MEX_GRILO_FEED (feed), 0, G_MAXINT); video_info = mex_model_info_new_with_sort_funcs (MEX_MODEL (feed), "videos", 0); priv->models = g_list_append (priv->models, video_info); g_object_unref (feed); g_list_free (metadata_keys); } /* Add the photos model */ path = g_get_user_special_dir (G_USER_DIRECTORY_PICTURES); box = mex_library_plugin_get_box_for_path (GRL_MEDIA_SOURCE (plugin), query_keys, path); if (box) { GList *metadata_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, NULL); feed = mex_grilo_feed_new (GRL_MEDIA_SOURCE (plugin), query_keys, metadata_keys, box); g_object_set (feed, "icon-name", "icon-library", "placeholder-text", "No pictures found", NULL); mex_grilo_feed_browse (MEX_GRILO_FEED (feed), 0, G_MAXINT); photo_info = mex_model_info_new_with_sort_funcs (MEX_MODEL (feed), "pictures", 0); priv->models = g_list_append (priv->models, photo_info); g_object_unref (feed); g_list_free (metadata_keys); } /* Add the music model */ path = g_get_user_special_dir (G_USER_DIRECTORY_MUSIC); box = mex_library_plugin_get_box_for_path (GRL_MEDIA_SOURCE (plugin), query_keys, path); if (box) { GList *metadata_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_ARTIST, GRL_METADATA_KEY_ALBUM, NULL); feed = mex_grilo_feed_new (GRL_MEDIA_SOURCE (plugin), query_keys, metadata_keys, box); g_object_set (feed, "icon-name", "icon-library", "placeholder-text", "No music found", NULL); mex_grilo_feed_browse (MEX_GRILO_FEED (feed), 0, G_MAXINT); music_info = mex_model_info_new_with_sort_funcs (MEX_MODEL (feed), "music", 0); priv->models = g_list_append (priv->models, music_info); g_object_unref (feed); g_list_free (metadata_keys); } g_list_free (query_keys); } else g_warning ("Filesystem plugin not found"); }