[tracker/search-bar] Turn TrackerResultsWindow into a GtkWidget.
- From: Carlos Garnacho <carlosg src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker/search-bar] Turn TrackerResultsWindow into a GtkWidget.
- Date: Thu, 24 Sep 2009 11:17:38 +0000 (UTC)
commit b8d6b62da265e1bfb0a265dfda4646cecf0efea5
Author: Carlos Garnacho <carlos lanedo com>
Date: Thu Sep 24 12:35:09 2009 +0200
Turn TrackerResultsWindow into a GtkWidget.
It inherits from TrackerAlignedWindow, and does some things in a more proper
way.
src/tracker-search-bar/tracker-applet.c | 4 +-
src/tracker-search-bar/tracker-results-window.c | 446 ++++++++++++++---------
src/tracker-search-bar/tracker-results-window.h | 26 ++-
3 files changed, 300 insertions(+), 176 deletions(-)
---
diff --git a/src/tracker-search-bar/tracker-applet.c b/src/tracker-search-bar/tracker-applet.c
index 351f636..53a80bd 100644
--- a/src/tracker-search-bar/tracker-applet.c
+++ b/src/tracker-search-bar/tracker-applet.c
@@ -96,9 +96,11 @@ applet_entry_activate_cb (GtkEntry *entry,
}
g_print ("Searching for: '%s'\n", text);
- applet->results = tracker_results_window_new (applet, text);
+ applet->results = tracker_results_window_new (applet->parent, text);
gtk_entry_set_text (entry, "");
+
+ gtk_widget_show (GTK_WIDGET (applet->results));
}
static gboolean
diff --git a/src/tracker-search-bar/tracker-results-window.c b/src/tracker-search-bar/tracker-results-window.c
index 946970b..bee608a 100644
--- a/src/tracker-search-bar/tracker-results-window.c
+++ b/src/tracker-search-bar/tracker-results-window.c
@@ -35,6 +35,30 @@
#include "tracker-results-window.h"
#include "tracker-aligned-window.h"
+static void results_window_constructed (GObject *object);
+static void results_window_finalize (GObject *object);
+
+static void results_window_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void results_window_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec);
+
+static gboolean results_window_key_press_event (GtkWidget *widget,
+ GdkEventKey *event);
+static void results_window_size_request (GtkWidget *widget,
+ GtkRequisition *requisition);
+static void results_window_screen_changed (GtkWidget *widget,
+ GdkScreen *prev_screen);
+
+static void model_set_up (TrackerResultsWindow *window);
+static gboolean search_get (TrackerResultsWindow *window,
+ const gchar *query);
+
+
#define MUSIC_SEARCH "SELECT ?urn ?type ?title ?belongs WHERE { ?urn a nmm:MusicPiece ; rdf:type ?type ; nfo:fileName ?title ; nfo:belongsToContainer ?belongs . ?urn fts:match \"%s*\" } OFFSET 0 LIMIT 500"
#define PHOTO_SEARCH "SELECT ?urn ?type ?title ?belongs WHERE { ?urn a nmm:Photo ; rdf:type ?type ; nfo:fileName ?title ; nfo:belongsToContainer ?belongs . ?urn fts:match \"%s*\" } OFFSET 0 LIMIT 500"
#define VIDEO_SEARCH "SELECT ?urn ?type ?title ?belongs WHERE { ?urn a nmm:Video ; rdf:type ?type ; nfo:fileName ?title ; nfo:belongsToContainer ?belongs . ?urn fts:match \"%s*\" } OFFSET 0 LIMIT 500"
@@ -43,9 +67,9 @@
#define GENERAL_SEARCH "SELECT ?s ?type ?title WHERE { ?s fts:match \"%s*\" ; rdf:type ?type . OPTIONAL { ?s nie:title ?title } } OFFSET %d LIMIT %d"
-typedef struct {
- GtkWidget *window;
+#define TRACKER_RESULTS_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRACKER_TYPE_RESULTS_WINDOW, TrackerResultsWindowPrivate))
+typedef struct {
GtkWidget *frame;
GtkWidget *treeview;
GObject *store;
@@ -53,7 +77,8 @@ typedef struct {
GtkIconTheme *icon_theme;
TrackerClient *client;
-} TrackerResultsWindow;
+ gchar *query;
+} TrackerResultsWindowPrivate;
typedef enum {
CATEGORY_NONE = 1 << 0,
@@ -94,6 +119,228 @@ struct FindCategory {
gboolean found;
};
+enum {
+ PROP_0,
+ PROP_QUERY
+};
+
+G_DEFINE_TYPE (TrackerResultsWindow, tracker_results_window, TRACKER_TYPE_ALIGNED_WINDOW)
+
+static void
+tracker_results_window_class_init (TrackerResultsWindowClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ object_class->constructed = results_window_constructed;
+ object_class->finalize = results_window_finalize;
+ object_class->set_property = results_window_set_property;
+ object_class->get_property = results_window_get_property;
+
+ widget_class->key_press_event = results_window_key_press_event;
+ widget_class->size_request = results_window_size_request;
+ widget_class->screen_changed = results_window_screen_changed;
+
+ g_object_class_install_property (object_class,
+ PROP_QUERY,
+ g_param_spec_string ("query",
+ "Query",
+ "Query",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
+ g_type_class_add_private (object_class, sizeof (TrackerResultsWindowPrivate));
+}
+
+static void
+tracker_results_window_init (TrackerResultsWindow *window)
+{
+ TrackerResultsWindowPrivate *priv;
+ GtkWidget *vbox;
+ GtkWidget *scrolled_window;
+
+ priv = TRACKER_RESULTS_WINDOW_GET_PRIVATE (window);
+
+ priv->client = tracker_connect (FALSE, G_MAXINT);
+
+ priv->frame = gtk_frame_new (NULL);
+ gtk_container_add (GTK_CONTAINER (window), priv->frame);
+ gtk_frame_set_shadow_type (GTK_FRAME (priv->frame), GTK_SHADOW_IN);
+ gtk_widget_set_size_request (priv->frame, 500, 300);
+
+ vbox = gtk_vbox_new (FALSE, 12);
+ gtk_container_add (GTK_CONTAINER (priv->frame), vbox);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 2);
+
+ scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+ gtk_container_add (GTK_CONTAINER (vbox), scrolled_window);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+
+ priv->treeview = gtk_tree_view_new ();
+ gtk_container_add (GTK_CONTAINER (scrolled_window), priv->treeview);
+
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (priv->treeview), FALSE);
+
+ priv->icon_theme = gtk_icon_theme_get_default ();
+
+ model_set_up (window);
+
+ gtk_widget_show_all (priv->frame);
+}
+
+static void
+results_window_constructed (GObject *object)
+{
+ TrackerResultsWindowPrivate *priv;
+ TrackerResultsWindow *window;
+ gchar *sparql;
+
+ window = TRACKER_RESULTS_WINDOW (object);
+ priv = TRACKER_RESULTS_WINDOW_GET_PRIVATE (window);
+
+ sparql = g_strdup_printf (MUSIC_SEARCH, priv->query);
+ search_get (window, sparql);
+ g_free (sparql);
+
+ sparql = g_strdup_printf (PHOTO_SEARCH, priv->query);
+ search_get (window, sparql);
+ g_free (sparql);
+
+ sparql = g_strdup_printf (VIDEO_SEARCH, priv->query);
+ search_get (window, sparql);
+ g_free (sparql);
+
+ sparql = g_strdup_printf (DOCUMENT_SEARCH, priv->query);
+ search_get (window, sparql);
+ g_free (sparql);
+
+ sparql = g_strdup_printf (FOLDER_SEARCH, priv->query);
+ search_get (window, sparql);
+ g_free (sparql);
+}
+
+static void
+results_window_finalize (GObject *object)
+{
+ TrackerResultsWindowPrivate *priv;
+
+ priv = TRACKER_RESULTS_WINDOW_GET_PRIVATE (object);
+
+ g_free (priv->query);
+
+ if (priv->client) {
+ tracker_disconnect (priv->client);
+ }
+
+ G_OBJECT_CLASS (tracker_results_window_parent_class)->finalize (object);
+}
+
+static void
+results_window_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ TrackerResultsWindowPrivate *priv;
+
+ priv = TRACKER_RESULTS_WINDOW_GET_PRIVATE (object);
+
+ switch (prop_id) {
+ case PROP_QUERY:
+ g_free (priv->query);
+ priv->query = g_value_dup_string (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+results_window_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ TrackerResultsWindowPrivate *priv;
+
+ priv = TRACKER_RESULTS_WINDOW_GET_PRIVATE (object);
+
+ switch (prop_id) {
+ case PROP_QUERY:
+ g_value_set_string (value, priv->query);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+results_window_key_press_event (GtkWidget *widget,
+ GdkEventKey *event)
+{
+ if (event->keyval == GDK_Escape) {
+ gtk_widget_hide (widget);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+results_window_size_request (GtkWidget *widget,
+ GtkRequisition *requisition)
+{
+ GtkRequisition child_req;
+ guint border_width;
+
+ gtk_widget_size_request (GTK_BIN (widget)->child, &child_req);
+ border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
+
+ requisition->width = child_req.width + (2 * border_width);
+ requisition->height = child_req.height + (2 * border_width);
+
+ if (GTK_WIDGET_REALIZED (widget)) {
+ GdkScreen *screen;
+ GdkRectangle monitor_geom;
+ guint monitor_num;
+
+ /* make it no larger than half the monitor size */
+ screen = gtk_widget_get_screen (widget);
+ monitor_num = gdk_screen_get_monitor_at_window (screen, widget->window);
+
+ gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor_geom);
+
+ requisition->width = MIN (requisition->width, monitor_geom.width / 2);
+ requisition->height = MIN (requisition->height, monitor_geom.height / 2);
+ }
+}
+
+static void
+results_window_screen_changed (GtkWidget *widget,
+ GdkScreen *prev_screen)
+{
+ TrackerResultsWindowPrivate *priv;
+ GdkScreen *screen;
+
+ priv = TRACKER_RESULTS_WINDOW_GET_PRIVATE (widget);
+
+ if (priv->icon_theme) {
+ priv->icon_theme = NULL;
+ }
+
+ screen = gtk_widget_get_screen (widget);
+
+ if (screen) {
+ priv->icon_theme = gtk_icon_theme_get_for_screen (screen);
+ /* FIXME: trigger the model to update icons */
+ }
+}
+
static ItemData *
item_data_new (const gchar *urn,
const gchar *type,
@@ -398,6 +645,7 @@ pixbuf_get (TrackerResultsWindow *window,
const gchar *urn,
gboolean is_image)
{
+ TrackerResultsWindowPrivate *priv;
const gchar *attributes;
GFile *file;
GFileInfo *info;
@@ -405,8 +653,9 @@ pixbuf_get (TrackerResultsWindow *window,
GdkPixbuf *pixbuf = NULL;
GError *error = NULL;
+ priv = TRACKER_RESULTS_WINDOW_GET_PRIVATE (window);
file = g_file_new_for_uri (urn);
-
+
if (is_image) {
gchar *path;
@@ -455,7 +704,7 @@ pixbuf_get (TrackerResultsWindow *window,
const gchar **names;
names = (const gchar**) g_themed_icon_get_names (G_THEMED_ICON (icon));
- icon_info = gtk_icon_theme_choose_icon (window->icon_theme,
+ icon_info = gtk_icon_theme_choose_icon (priv->icon_theme,
names,
24,
GTK_ICON_LOOKUP_USE_BUILTIN);
@@ -520,13 +769,15 @@ model_pixbuf_cell_data_func (GtkTreeViewColumn *tree_column,
static void
model_set_up (TrackerResultsWindow *window)
{
+ TrackerResultsWindowPrivate *priv;
GtkTreeView *view;
GtkTreeViewColumn *column;
GtkTreeSelection *selection;
GtkListStore *store;
GtkCellRenderer *cell;
- view = GTK_TREE_VIEW (window->treeview);
+ priv = TRACKER_RESULTS_WINDOW_GET_PRIVATE (window);
+ view = GTK_TREE_VIEW (priv->treeview);
/* Store */
store = gtk_list_store_new (COL_COUNT,
@@ -586,7 +837,7 @@ model_set_up (TrackerResultsWindow *window)
gtk_tree_view_set_tooltip_column (view, COL_BELONGS);
/* Save */
- window->store = G_OBJECT (store);
+ priv->store = G_OBJECT (store);
}
static gboolean
@@ -614,15 +865,17 @@ model_add (TrackerResultsWindow *window,
TrackerCategory category,
const gchar *urn,
const gchar *title,
- const gchar *belongs)
+ const gchar *belongs)
{
+ TrackerResultsWindowPrivate *priv;
struct FindCategory fc;
GtkTreeIter iter;
GdkPixbuf *pixbuf;
const gchar *category_str;
+ priv = TRACKER_RESULTS_WINDOW_GET_PRIVATE (window);
pixbuf = NULL;
-
+
/* Get category for id */
category_str = category_to_string (category);
@@ -630,12 +883,12 @@ model_add (TrackerResultsWindow *window,
fc.category_str = category_str;
fc.found = FALSE;
- gtk_tree_model_foreach (GTK_TREE_MODEL (window->store),
+ gtk_tree_model_foreach (GTK_TREE_MODEL (priv->store),
model_add_category_foreach,
&fc);
- gtk_list_store_append (GTK_LIST_STORE (window->store), &iter);
- gtk_list_store_set (GTK_LIST_STORE (window->store), &iter,
+ gtk_list_store_append (GTK_LIST_STORE (priv->store), &iter);
+ gtk_list_store_set (GTK_LIST_STORE (priv->store), &iter,
COL_CATEGORY_ID, category,
COL_CATEGORY, fc.found ? NULL : category_str,
COL_IMAGE, pixbuf ? pixbuf : NULL,
@@ -651,90 +904,6 @@ model_add (TrackerResultsWindow *window,
/* gtk_tree_selection_select_iter (selection, &iter); */
}
-static gboolean
-window_key_press_event_cb (GtkWidget *widget,
- GdkEventKey *event,
- gpointer user_data)
-{
- TrackerApplet *applet = user_data;
-
- if (event->keyval == GDK_Escape) {
- gtk_widget_hide (widget);
-
- return TRUE;
- } else if ((event->keyval == GDK_l) && (event->state & GDK_CONTROL_MASK)) {
- gtk_widget_grab_focus (applet->entry);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-window_show_cb (GtkWidget *widget_to_show,
- TrackerResultsWindow *window)
-{
- GtkWidget *widget;
- gint width, height;
- GdkScreen *screen;
- gint monitor_num;
- GtkRequisition req;
- GdkRectangle monitor;
-
- /* if (!priv->window) { */
- /* return; */
- /* } */
-
- widget = window->window;
-
-#if 0
- gint font_size;
-
- /* Size based on the font size */
- font_size = pango_font_description_get_size (defbox->style->font_desc);
- font_size = PANGO_PIXELS (font_size);
-
- width = font_size * WINDOW_NUM_COLUMNS;
- height = font_size * WINDOW_NUM_ROWS;
-#endif
-
- /* Use at least the requisition size of the window... */
- gtk_widget_size_request (widget, &req);
- width = MAX (width, req.width);
- height = MAX (height, req.height);
-
- /* ... but make it no larger than half the monitor size */
- screen = gtk_widget_get_screen (widget);
- monitor_num = gdk_screen_get_monitor_at_window (screen, widget->window);
-
- gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor);
-
- width = MIN (width, monitor.width / 2);
- height = MIN (height, monitor.height / 2);
-
- /* Set size */
- gtk_widget_set_size_request (GTK_WIDGET (window->frame), width, height);
-}
-
-static gboolean
-window_delete_event_cb (GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
-{
- TrackerResultsWindow *window = user_data;
-
- window = user_data;
-
- if (window->client) {
- tracker_disconnect (window->client);
- }
-
- g_free (window);
-
- return FALSE;
-}
-
inline static void
search_get_foreach (gpointer value,
gpointer user_data)
@@ -775,10 +944,12 @@ static gboolean
search_get (TrackerResultsWindow *window,
const gchar *query)
{
+ TrackerResultsWindowPrivate *priv;
GError *error = NULL;
GPtrArray *results;
- results = tracker_resources_sparql_query (window->client, query, &error);
+ priv = TRACKER_RESULTS_WINDOW_GET_PRIVATE (window);
+ results = tracker_resources_sparql_query (priv->client, query, &error);
if (error) {
g_printerr ("%s, %s\n",
@@ -831,80 +1002,11 @@ search_get (TrackerResultsWindow *window,
}
GtkWidget *
-tracker_results_window_new (TrackerApplet *applet,
- const gchar *query)
+tracker_results_window_new (GtkWidget *parent,
+ const gchar *query)
{
- TrackerResultsWindow *window;
- GtkWidget *vbox;
- GtkWidget *scrolled_window;
- GdkScreen *screen;
- gchar *sparql;
-
- g_return_val_if_fail (applet != NULL, NULL);
-
- window = g_new0 (TrackerResultsWindow, 1);
-
- window->client = tracker_connect (FALSE, G_MAXINT);
-
- /* window->window = gtk_builder_get_object (builder, "window_results"); */
-
- window->window = tracker_aligned_window_new (applet->parent);
-
- window->frame = gtk_frame_new (NULL);
- gtk_container_add (GTK_CONTAINER (window->window), window->frame);
- gtk_frame_set_shadow_type (GTK_FRAME (window->frame), GTK_SHADOW_IN);
- gtk_widget_set_size_request (window->frame, 500, 300);
-
- vbox = gtk_vbox_new (FALSE, 12);
- gtk_container_add (GTK_CONTAINER (window->frame), vbox);
- gtk_container_set_border_width (GTK_CONTAINER (vbox), 2);
-
- scrolled_window = gtk_scrolled_window_new (NULL, NULL);
- gtk_container_add (GTK_CONTAINER (vbox), scrolled_window);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
-
- window->treeview = gtk_tree_view_new ();
- gtk_container_add (GTK_CONTAINER (scrolled_window), window->treeview);
-
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (window->treeview), FALSE);
-
- g_signal_connect (window->window, "key-press-event",
- G_CALLBACK (window_key_press_event_cb),
- window);
- g_signal_connect (window->window, "show",
- G_CALLBACK (window_show_cb),
- window);
- g_signal_connect (window->window, "delete-event",
- G_CALLBACK (window_delete_event_cb), window);
-
- screen = gtk_widget_get_screen (window->treeview);
- window->icon_theme = gtk_icon_theme_get_for_screen (screen);
-
- model_set_up (window);
-
- gtk_widget_show_all (GTK_WIDGET (window->window));
-
- sparql = g_strdup_printf (MUSIC_SEARCH, query);
- search_get (window, sparql);
- g_free (sparql);
-
- sparql = g_strdup_printf (PHOTO_SEARCH, query);
- search_get (window, sparql);
- g_free (sparql);
-
- sparql = g_strdup_printf (VIDEO_SEARCH, query);
- search_get (window, sparql);
- g_free (sparql);
-
- sparql = g_strdup_printf (DOCUMENT_SEARCH, query);
- search_get (window, sparql);
- g_free (sparql);
-
- sparql = g_strdup_printf (FOLDER_SEARCH, query);
- search_get (window, sparql);
- g_free (sparql);
-
- return GTK_WIDGET (window->window);
+ return g_object_new (TRACKER_TYPE_RESULTS_WINDOW,
+ "align-widget", parent,
+ "query", query,
+ NULL);
}
diff --git a/src/tracker-search-bar/tracker-results-window.h b/src/tracker-search-bar/tracker-results-window.h
index d9661fc..67a2e3a 100644
--- a/src/tracker-search-bar/tracker-results-window.h
+++ b/src/tracker-search-bar/tracker-results-window.h
@@ -23,12 +23,32 @@
#ifndef __TRACKER_RESULTS_WINDOW_H__
#define __TRACKER_RESULTS_WINDOW_H__
-#include "tracker-applet.h"
+#include "tracker-aligned-window.h"
G_BEGIN_DECLS
-GtkWidget * tracker_results_window_new (TrackerApplet *applet,
- const gchar *query);
+#define TRACKER_TYPE_RESULTS_WINDOW (tracker_results_window_get_type())
+#define TRACKER_RESULTS_WINDOW(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TRACKER_TYPE_RESULTS_WINDOW, TrackerResultsWindow))
+#define TRACKER_RESULTS_WINDOW_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), TRACKER_TYPE_RESULTS_WINDOW, TrackerResultsWindowClass))
+#define TRACKER_IS_RESULTS_WINDOW(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TRACKER_TYPE_RESULTS_WINDOW))
+#define TRACKER_IS_RESULTS_WINDOW_CLASS(c) (G_TYPE_CHECK_CLASS_TYPE ((c), TRACKER_TYPE_RESULTS_WINDOW))
+#define TRACKER_RESULTS_WINDOW_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TRACKER_TYPE_RESULTS_WINDOW, TrackerResultsWindowClass))
+
+typedef struct TrackerResultsWindow TrackerResultsWindow;
+typedef struct TrackerResultsWindowClass TrackerResultsWindowClass;
+
+struct TrackerResultsWindow {
+ TrackerAlignedWindow parent_instance;
+};
+
+struct TrackerResultsWindowClass {
+ TrackerAlignedWindowClass parent_class;
+};
+
+GType tracker_results_window_get_type (void) G_GNUC_CONST;
+
+GtkWidget * tracker_results_window_new (GtkWidget *parent,
+ const gchar *query);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]