[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