[Goodies-commits] r4876 - xfmpc/trunk/src

Mike Massonnet mmassonnet at xfce.org
Sun Jun 1 21:17:10 CEST 2008


Author: mmassonnet
Date: 2008-06-01 19:17:09 +0000 (Sun, 01 Jun 2008)
New Revision: 4876

Modified:
   xfmpc/trunk/src/dbbrowser.c
   xfmpc/trunk/src/dbbrowser.h
   xfmpc/trunk/src/mpdclient.c
   xfmpc/trunk/src/mpdclient.h
Log:
Add search functions inside XfmpcMpdclient and extend XfmpcDbbrowser

* src/mpdclient.c:
  - Return the name of the song with new private function _get_formatted_name
    (remove duplicates of code)
  - New function xfmpc_mpdclient_database_search
* src/dbbrowser.c:
  - New private boolean is_searching to lock the tree view from updating
  - New function xfmpc_dbbrowser_search, makes use of xfmpc_mdclient_search and
    populates the tree view


Modified: xfmpc/trunk/src/dbbrowser.c
===================================================================
--- xfmpc/trunk/src/dbbrowser.c	2008-06-01 19:17:04 UTC (rev 4875)
+++ xfmpc/trunk/src/dbbrowser.c	2008-06-01 19:17:09 UTC (rev 4876)
@@ -85,6 +85,8 @@
   GtkListStore             *store;
   GtkWidget                *search_entry;
 
+  gboolean                  is_searching;
+
   gchar                    *wdir;
   gchar                    *last_wdir;
 };
@@ -312,7 +314,6 @@
 void
 xfmpc_dbbrowser_reload (XfmpcDbbrowser *dbbrowser)
 {
-  /* TODO block while doing a search */
   XfmpcDbbrowserPrivate    *priv = XFMPC_DBBROWSER_GET_PRIVATE (dbbrowser);
   gchar                    *filename;
   gchar                    *basename;
@@ -321,6 +322,8 @@
 
   if (G_UNLIKELY (!xfmpc_mpdclient_is_connected (dbbrowser->mpdclient)))
     return;
+  else if (priv->is_searching)
+    return;
 
   xfmpc_dbbrowser_clear (dbbrowser);
 
@@ -356,8 +359,38 @@
     }
 }
 
+void
+xfmpc_dbbrowser_search (XfmpcDbbrowser *dbbrowser,
+                        const gchar *query)
+{
+  XfmpcDbbrowserPrivate    *priv = XFMPC_DBBROWSER_GET_PRIVATE (dbbrowser);
+  gchar                    *filename;
+  gchar                    *basename;
+  gint                      i = 0;
 
+  if (G_UNLIKELY (!xfmpc_mpdclient_is_connected (dbbrowser->mpdclient)))
+    return;
 
+  priv->is_searching = TRUE;
+  xfmpc_dbbrowser_clear (dbbrowser);
+
+  while (xfmpc_mpdclient_database_search (dbbrowser->mpdclient, query, &filename, &basename))
+    {
+      xfmpc_dbbrowser_append (dbbrowser, filename, basename, FALSE);
+      g_free (filename);
+      g_free (basename);
+      i++;
+    }
+
+  if (i == 0)
+    {
+      /* TODO display a message that the query returned "no result" */
+      g_message ("change query bad query");
+    }
+}
+
+
+
 void
 xfmpc_dbbrowser_set_wdir (XfmpcDbbrowser *dbbrowser,
                           const gchar *dir)
@@ -466,12 +499,17 @@
 static void
 cb_search_entry_activated (XfmpcDbbrowser *dbbrowser)
 {
-  g_debug (__func__);
-  /* TODO execute the search */
-#if 0
-  XfmpcDbbrowserPrivate *priv = XFMPC_DBBROWSER_GET_PRIVATE (dbbrowser);
-  GtkTreeModel         *model = GTK_TREE_MODEL (priv->filter);
-#endif
+  XfmpcDbbrowserPrivate    *priv = XFMPC_DBBROWSER_GET_PRIVATE (dbbrowser);
+  const gchar              *entry_text = gtk_entry_get_text (GTK_ENTRY (priv->search_entry));
+
+  if (entry_text[0] == '\0')
+    {
+      priv->is_searching = FALSE;
+      xfmpc_dbbrowser_reload (dbbrowser);
+      return;
+    }
+
+  xfmpc_dbbrowser_search (dbbrowser, entry_text);
 }
 
 static gboolean
@@ -485,7 +523,7 @@
 
   if (event->keyval == GDK_Escape)
     {
-      g_debug (__func__);
+      priv->is_searching = FALSE;
       gtk_entry_set_text (GTK_ENTRY (priv->search_entry), "");
       xfmpc_dbbrowser_reload (dbbrowser);
     }
@@ -496,11 +534,6 @@
 static void
 cb_search_entry_changed (XfmpcDbbrowser *dbbrowser)
 {
-  /* TODO do nothing? execute a timeout do postpone the search? */
-#if 0
-  XfmpcPlaylistPrivate *priv = XFMPC_PLAYLIST_GET_PRIVATE (playlist);
-
-  gtk_tree_model_filter_refilter (priv->filter);
-#endif
+  /* TODO do nothing? execute a timeout to postpone the search? */
 }
 

Modified: xfmpc/trunk/src/dbbrowser.h
===================================================================
--- xfmpc/trunk/src/dbbrowser.h	2008-06-01 19:17:04 UTC (rev 4875)
+++ xfmpc/trunk/src/dbbrowser.h	2008-06-01 19:17:09 UTC (rev 4876)
@@ -49,6 +49,8 @@
 
 void            xfmpc_dbbrowser_reload                  (XfmpcDbbrowser *dbbrowser);
 
+void            xfmpc_dbbrowser_search                  (XfmpcDbbrowser *dbbrowser,
+                                                         const gchar *query);
 void            xfmpc_dbbrowser_set_wdir                (XfmpcDbbrowser *dbbrowser,
                                                          const gchar *dir);
 gboolean        xfmpc_dbbrowser_wdir_is_root            (XfmpcDbbrowser *dbbrowser);

Modified: xfmpc/trunk/src/mpdclient.c
===================================================================
--- xfmpc/trunk/src/mpdclient.c	2008-06-01 19:17:04 UTC (rev 4875)
+++ xfmpc/trunk/src/mpdclient.c	2008-06-01 19:17:09 UTC (rev 4876)
@@ -61,9 +61,9 @@
 static void             cb_xfmpc_mpdclient_status_changed       (MpdObj *mi,
                                                                  ChangedStatusType what,
                                                                  gpointer user_data);
+static gchar *          _get_formatted_name                     (mpd_Song *song);
 
 
-
 struct _XfmpcMpdclientClass
 {
   GObjectClass              parent_class;
@@ -696,16 +696,7 @@
 
   if (NULL != data)
     {
-      if (NULL != data->song->title)
-        {
-          if (data->song->artist)
-            *song = g_strdup_printf ("%s - %s", data->song->artist, data->song->title);
-          else
-            *song = g_strdup (data->song->title);
-        }
-      else
-        *song = g_path_get_basename (data->song->file);
-
+      *song = _get_formatted_name (data->song);
       *length = g_strdup_printf ("%d:%02d", data->song->time / 60, data->song->time % 60);
       *id = data->song->id;
     }
@@ -725,14 +716,25 @@
 }
 
 gboolean
+xfmpc_mpdclient_database_refresh (XfmpcMpdclient *mpdclient)
+{
+  XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT_GET_PRIVATE (mpdclient);
+
+  if (mpd_database_update_dir (priv->mi, "/") != MPD_OK)
+    return FALSE;
+
+  return TRUE;
+}
+
+gboolean
 xfmpc_mpdclient_database_read (XfmpcMpdclient *mpdclient,
                                const gchar *dir,
                                gchar **filename,
                                gchar **basename,
                                gboolean *is_dir)
 {
-  static MpdData       *data = NULL;
   XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT_GET_PRIVATE (mpdclient);
+  static MpdData        *data = NULL;
 
   if (NULL == data)
     data = mpd_database_get_directory (priv->mi, (gchar *)dir);
@@ -752,17 +754,7 @@
         case MPD_DATA_TYPE_SONG:
           *is_dir = FALSE;
           *filename = g_strdup (data->song->file);
-
-          if (NULL != data->song->title)
-            {
-              if (data->song->artist)
-                *basename = g_strdup_printf ("%s - %s", data->song->artist, data->song->title);
-              else
-                *basename = g_strdup (data->song->title);
-            }
-          else
-            *basename = g_path_get_basename (data->song->file);
-
+          *basename = _get_formatted_name (data->song);
           break;
 
         case MPD_DATA_TYPE_PLAYLIST:
@@ -783,13 +775,56 @@
 }
 
 gboolean
-xfmpc_mpdclient_database_refresh (XfmpcMpdclient *mpdclient)
+xfmpc_mpdclient_database_search (XfmpcMpdclient *mpdclient,
+                                 const gchar *query,
+                                 gchar **filename,
+                                 gchar **basename)
 {
   XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT_GET_PRIVATE (mpdclient);
+  static MpdData        *data = NULL;
+  gchar                **queries;
+  gint                   i;
 
-  if (mpd_database_update_dir (priv->mi, "/") != MPD_OK)
-    return FALSE;
+  if (NULL == data)
+    {
+      queries = g_strsplit (query, " ", -1);
 
-  return TRUE;
+      mpd_database_search_start (priv->mi, FALSE);
+      for (i = 0; queries[i] != NULL; i++)
+        mpd_database_search_add_constraint (priv->mi, MPD_TAG_ITEM_ANY, queries[i]);
+      data = mpd_database_search_commit (priv->mi);
+
+      g_strfreev (queries);
+    }
+  else
+    data = mpd_data_get_next (data);
+
+  if (NULL != data)
+    {
+      *filename = g_strdup (data->song->file);
+      *basename = _get_formatted_name (data->song);
+    }
+
+  return NULL != data;
 }
 
+
+
+static gchar *
+_get_formatted_name (mpd_Song *song)
+{
+  gchar *formatted_name;
+
+  if (NULL != song->title)
+    {
+      if (song->artist)
+        formatted_name = g_strdup_printf ("%s - %s", song->artist, song->title);
+      else
+        formatted_name = g_strdup (song->title);
+    }
+  else
+    formatted_name = g_path_get_basename (song->file);
+
+  return formatted_name;
+}
+

Modified: xfmpc/trunk/src/mpdclient.h
===================================================================
--- xfmpc/trunk/src/mpdclient.h	2008-06-01 19:17:04 UTC (rev 4875)
+++ xfmpc/trunk/src/mpdclient.h	2008-06-01 19:17:09 UTC (rev 4876)
@@ -107,14 +107,18 @@
                                                                  gchar **length);
 gboolean                xfmpc_mpdclient_playlist_clear          (XfmpcMpdclient *mpdclient);
 
+gboolean                xfmpc_mpdclient_database_refresh        (XfmpcMpdclient *mpdclient);
+
 gboolean                xfmpc_mpdclient_database_read           (XfmpcMpdclient *mpdclient,
                                                                  const gchar *dir,
                                                                  gchar **filename,
                                                                  gchar **basename,
                                                                  gboolean *is_dir);
-gboolean                xfmpc_mpdclient_database_refresh        (XfmpcMpdclient *mpdclient);
+gboolean                xfmpc_mpdclient_database_search         (XfmpcMpdclient *mpdclient,
+                                                                 const gchar *query,
+                                                                 gchar **filename,
+                                                                 gchar **basename);
 
-
 G_END_DECLS
 
 #endif




More information about the Goodies-commits mailing list