[Goodies-commits] r2245 - xfce4-mpc-plugin/trunk/panel-plugin

Landry Breuil landry at xfce.org
Sun Dec 17 19:38:35 CET 2006


Author: landry
Date: 2006-12-17 18:38:35 +0000 (Sun, 17 Dec 2006)
New Revision: 2245

Modified:
   xfce4-mpc-plugin/trunk/panel-plugin/xfce4-mpc-plugin.c
   xfce4-mpc-plugin/trunk/panel-plugin/xfce4-mpc-plugin.h
Log:
 * added _simple_ playlist support, works only if built against libmpd atm 
 * need to write same interface in simple-libmpd
 * middle-click on the plugin buttons to show playlist (keep_above window, UGLY solution)
 * dbl-click on a track to play it and close window
 * need to work on little memory leaks (tooltip, windows..)



Modified: xfce4-mpc-plugin/trunk/panel-plugin/xfce4-mpc-plugin.c
===================================================================
--- xfce4-mpc-plugin/trunk/panel-plugin/xfce4-mpc-plugin.c	2006-12-17 15:49:50 UTC (rev 2244)
+++ xfce4-mpc-plugin/trunk/panel-plugin/xfce4-mpc-plugin.c	2006-12-17 18:38:35 UTC (rev 2245)
@@ -345,83 +345,169 @@
    /* g_free(song); FIXME ?? */
 }
 
-static void 
-toggle(GtkWidget *widget, GdkEventButton* event, t_mpc* mpc)
+static void
+playlist_title_dblclicked (GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, t_mpc* mpc)
 {
+#ifdef HAVE_LIBMPD
+   GtkTreeModel *model;
+   GtkTreeIter iter;
+   gint id = 0, pos = 0;
+
+   model = gtk_tree_view_get_model(treeview);
+   if (gtk_tree_model_get_iter(model, &iter, path))
+   {
+      gtk_tree_model_get(model, &iter, 2, &pos, 3, &id, -1);
+      DBG("Dbl-clicked id %d (pos=%d)",id, pos);
+      mpd_player_play_id(mpc->mo, id);
+   }
+   gtk_widget_destroy(mpc->playlist);
+#endif
+}
+
+static void
+show_playlist (t_mpc* mpc)
+{
+#ifdef HAVE_LIBMPD
    DBG("!");
+   GtkWidget *scrolledwin,*treeview;
+   GtkListStore *liststore;
+   GtkTreeIter iter;
+   GtkTreePath *path_to_cur;
+   GtkCellRenderer *renderer;
+   gchar str[512];
+   int current, i;
+   MpdData *mpd_data;
 
-   if (event->button != 1) 
-      return;
-   
-   if (mpd_status_update (mpc->mo) != MPD_OK)
-      if (!mpc_plugin_reconnect (mpc))
-         return;
-   
-   switch (mpd_player_get_state(mpc->mo))
+   mpc->playlist = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+   gtk_window_set_default_size(GTK_WINDOW(mpc->playlist), 300, 530);
+   gtk_window_set_icon_name(GTK_WINDOW(mpc->playlist),"xfce-multimedia");
+   gtk_window_set_title(GTK_WINDOW(mpc->playlist),_("Mpd playlist"));
+   gtk_window_set_keep_above(GTK_WINDOW(mpc->playlist),TRUE); /* UGLY !!! */
+   scrolledwin = gtk_scrolled_window_new(NULL, NULL);
+   gtk_container_add(GTK_CONTAINER(mpc->playlist),GTK_WIDGET(scrolledwin));
+
+   treeview = gtk_tree_view_new ();
+   gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
+   gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
+   g_signal_connect(treeview, "row-activated", G_CALLBACK(playlist_title_dblclicked), mpc);
+   gtk_container_add(GTK_CONTAINER(scrolledwin),treeview);
+
+   liststore = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
+   gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL(liststore));
+
+   renderer = gtk_cell_renderer_pixbuf_new ();
+   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), -1, "Icon", renderer, "stock-id", 0, NULL);
+   renderer = gtk_cell_renderer_text_new ();
+   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), -1, "Title", renderer, "text", 1, NULL);
+
+   mpc_plugin_reconnect(mpc);
+
+   current = mpd_player_get_current_song_pos (mpc->mo);
+   DBG ("Current song pos in the list: %d", current);
+
+   for (i=0, mpd_data = mpd_playlist_get_changes (mpc->mo, -1); mpd_data != NULL; i++, mpd_data=mpd_data_get_next (mpd_data))
    {
-      case MPD_PLAYER_PAUSE:
-      case MPD_PLAYER_PLAY:
-         mpd_player_pause(mpc->mo); /* toggles play/pause */
-         break;
-      case MPD_PLAYER_STOP:
-      default:
-         mpd_player_play(mpc->mo); /* if stopped, mpd_player_pause() doesn't restart playing */
-         break;
+      g_sprintf(str,"%s - %s", mpd_data->song->artist, mpd_data->song->title);
+
+      gtk_list_store_append (liststore, &iter);
+      if (current == i)
+      {
+         gtk_list_store_set (liststore, &iter, 0, "gtk-media-play", 1, str, 2, mpd_data->song->pos, 3, mpd_data->song->id, -1);
+         path_to_cur = gtk_tree_model_get_path(GTK_TREE_MODEL(liststore), &iter);
+         gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(treeview), path_to_cur, NULL, TRUE, 0.5, 0);
+         gtk_tree_view_set_cursor(GTK_TREE_VIEW(treeview), path_to_cur, NULL, FALSE);
+         gtk_tree_path_free(path_to_cur);
+      }
+      else
+         gtk_list_store_set (liststore, &iter, 0, NULL, 1, str, 2, mpd_data->song->pos, 3, mpd_data->song->id, -1);
    }
+   gtk_widget_show_all(mpc->playlist);
+#endif
 }
 
 static void 
+toggle(GtkWidget *widget, GdkEventButton* event, t_mpc* mpc)
+{
+   if (1 == event->button)
+   {
+      if (mpd_status_update (mpc->mo) != MPD_OK)
+         if (!mpc_plugin_reconnect (mpc))
+            return;
+
+      switch (mpd_player_get_state(mpc->mo))
+      {
+         case MPD_PLAYER_PAUSE:
+         case MPD_PLAYER_PLAY:
+            mpd_player_pause(mpc->mo); /* toggles play/pause */
+            break;
+         case MPD_PLAYER_STOP:
+         default:
+            mpd_player_play(mpc->mo); /* if stopped, mpd_player_pause() doesn't restart playing */
+            break;
+      }
+   }
+   else
+      show_playlist(mpc);
+}
+
+static void 
 prev(GtkWidget *widget, GdkEventButton* event, t_mpc* mpc) 
 {
-   if (event->button != 1) 
-      return;
-   
-   if (mpd_player_prev(mpc->mo) != MPD_OK)
+   if (1 == event->button)
    {
-      if (mpc_plugin_reconnect (mpc))
+      if (mpd_player_prev(mpc->mo) != MPD_OK)
       {
-         DBG("calling mpd_player_prev() after reconnect");
-	 mpd_player_prev(mpc->mo);
+         if (mpc_plugin_reconnect(mpc))
+         {
+            DBG("calling mpd_player_prev() after reconnect");
+            mpd_player_prev(mpc->mo);
+         }
       }
+      else
+         DBG("mpd_player_prev() ok");
    }
    else
-      DBG("mpd_player_prev() ok");
+      show_playlist(mpc);
 }
 
 static void 
 stop(GtkWidget *widget, GdkEventButton* event, t_mpc* mpc) 
 {
-   if (event->button != 1) 
-      return;
-   
-   if (mpd_player_stop(mpc->mo) != MPD_OK)
+   if (1 == event->button)
    {
-      if (mpc_plugin_reconnect(mpc))
+      if (mpd_player_stop(mpc->mo) != MPD_OK)
       {
-         DBG("calling mpd_player_stop() after reconnect");
-	 mpd_player_stop(mpc->mo);
+         if (mpc_plugin_reconnect(mpc))
+         {
+            DBG("calling mpd_player_stop() after reconnect");
+            mpd_player_stop(mpc->mo);
+         }
       }
+      else
+         DBG("mpd_player_stop() ok");
    }
    else
-      DBG("mpd_player_stop() ok");
+      show_playlist(mpc);
 }
 
 static void 
 next(GtkWidget *widget, GdkEventButton* event, t_mpc* mpc) 
 {
-   if (event->button != 1) 
-      return;
-   
-   if (mpd_player_next(mpc->mo) != MPD_OK)
+   if (1 == event->button)
    {
-      if (mpc_plugin_reconnect (mpc))
+      if (mpd_player_next(mpc->mo) != MPD_OK)
       {
-         DBG("calling mpd_player_next() after reconnect");
-	 mpd_player_next(mpc->mo);
+         if (mpc_plugin_reconnect(mpc))
+         {
+            DBG("calling mpd_player_next() after reconnect");
+            mpd_player_next(mpc->mo);
+         }
       }
+      else
+         DBG("mpd_player_next() ok");
    }
    else
-      DBG("mpd_player_next() ok");
+      show_playlist(mpc);
 }
 
 static void 
@@ -435,8 +521,8 @@
    {
       if (!mpc_plugin_reconnect (mpc) || mpd_status_update (mpc->mo) != MPD_OK)
       {
-	 gtk_tooltips_set_tip (mpc->tips, widget, _(".... not connected ?"), NULL);
-	 return;
+         gtk_tooltips_set_tip (mpc->tips, widget, _(".... not connected ?"), NULL);
+         return;
       }
    }
 
@@ -534,7 +620,7 @@
    mpc->mpd_password = g_strdup("");
    mpc->client_appl = g_strdup("");
    mpc->show_frame = TRUE;
-   /* mpc->stay_connected = TRUE; */
+   mpc->playlist = NULL;
 
    mpc_read_config (plugin, mpc);
    

Modified: xfce4-mpc-plugin/trunk/panel-plugin/xfce4-mpc-plugin.h
===================================================================
--- xfce4-mpc-plugin/trunk/panel-plugin/xfce4-mpc-plugin.h	2006-12-17 15:49:50 UTC (rev 2244)
+++ xfce4-mpc-plugin/trunk/panel-plugin/xfce4-mpc-plugin.h	2006-12-17 18:38:35 UTC (rev 2245)
@@ -35,6 +35,7 @@
    XfcePanelPlugin *plugin;
    GtkTooltips *tips;
    GtkWidget *frame,*ebox,*box,*prev,*stop,*toggle,*next,*random,*repeat,*appl;
+   GtkWidget *playlist;
    gboolean show_frame;
    /* mpd handle */
    MpdObj *mo;




More information about the Goodies-commits mailing list