[PATCH] Skin's directory browser

"Kazantsev Anatoly" <[email protected]> Wed, 02 Feb 2005 06:30:24 +0300
Newsgroups gmane.comp.multimedia.xmms.devel
Message-ID <[email protected]>
Hi!

I fixed bugs in my previous patch.

----
Kazantsev Anatoly

_______________________________________________
xmms-devel mailing list
[email protected]
http://lists.xmms.org/mailman/listinfo/xmms-devel
skindir_browser-20040202.patch (text/x-patch, 12.1 KB)
diff -urN xmms-1.2.10-20050113cvs/xmms/main.c xmms-1.2.10-20050113cvs.skindir-browser/xmms/main.c
--- xmms-1.2.10-20050113cvs/xmms/main.c	2005-02-02 00:08:07.000000000 +0000
+++ xmms-1.2.10-20050113cvs.skindir-browser/xmms/main.c	2005-01-31 14:09:23.000000000 +0000
@@ -477,10 +477,37 @@
 					cfg.url_history = g_list_append(cfg.url_history, temp);
 			}
 		}
+		
+		gchar *temp;
+		if (xmms_cfg_read_int(cfgfile, "xmms", "skin_dirs_number", &length))
+		{
+			for(i = 0; i < length; i++)
+			{
+				gchar str[19];
+
+				sprintf(str, "skin_dir%d", i);
+				if (xmms_cfg_read_string(cfgfile, "xmms", str, &temp))
+				{
+					cfg.skin_dirs = g_list_append(cfg.skin_dirs, temp);
+				}
+			}
+		}
+		else
+		{
+			temp = g_strconcat(g_get_home_dir(), "/.xmms/Skins", NULL);
+			cfg.skin_dirs = g_list_append(cfg.skin_dirs, temp);
+		}
+
 		xmms_cfg_read_string(cfgfile, "xmms", "generic_title_format", &cfg.gentitle_format);
 		
 		xmms_cfg_free(cfgfile);
 	}
+	else
+	{
+		gchar *temp;
+		temp = g_strconcat(g_get_home_dir(), "/.xmms/Skins", NULL);
+		cfg.skin_dirs = g_list_append(cfg.skin_dirs, temp);
+	}
 
 	if (cfg.playlist_font && strlen(cfg.playlist_font) == 0)
 	{
@@ -673,6 +700,20 @@
 		xmms_cfg_write_string(cfgfile, "xmms", str, node->data);
 		g_free(str);
 	}
+	if (g_list_length(cfg.skin_dirs) != 0)
+	{
+		xmms_cfg_write_int(cfgfile, "xmms", "skin_dirs_number", g_list_length(cfg.skin_dirs));
+		for (node = cfg.skin_dirs, i = 0; node; node = g_list_next(node), i++)
+		{
+			str = g_strdup_printf("skin_dir%d", i);
+			xmms_cfg_write_string(cfgfile, "xmms", str, node->data);
+			g_free(str);
+		}
+	}
+	else
+	{
+		xmms_cfg_write_int(cfgfile, "xmms", "skin_dirs_number", 0);
+	}
 	xmms_cfg_write_string(cfgfile, "xmms", "generic_title_format", cfg.gentitle_format);
 	
 	xmms_cfg_write_file(cfgfile, filename);
diff -urN xmms-1.2.10-20050113cvs/xmms/main.h xmms-1.2.10-20050113cvs.skindir-browser/xmms/main.h
--- xmms-1.2.10-20050113cvs/xmms/main.h	2005-02-02 00:08:07.000000000 +0000
+++ xmms-1.2.10-20050113cvs.skindir-browser/xmms/main.h	2005-01-31 11:15:57.000000000 +0000
@@ -60,6 +60,7 @@
 	gint mouse_change;
 	gboolean playlist_transparent;
         gchar *gentitle_format;
+	GList *skin_dirs;
 }
 Config;
 
diff -urN xmms-1.2.10-20050113cvs/xmms/playlist.c xmms-1.2.10-20050113cvs.skindir-browser/xmms/playlist.c
--- xmms-1.2.10-20050113cvs/xmms/playlist.c	2005-02-02 00:08:07.000000000 +0000
+++ xmms-1.2.10-20050113cvs.skindir-browser/xmms/playlist.c	2005-01-31 11:15:57.000000000 +0000
@@ -576,9 +576,8 @@
 				load_skin(skin->path);
 			}
 		}
-		/* Call scan_skins() again to make sure skin selector */
-		/* is up to date */
-		scan_skins();
+		find_current_skindir();
+		update_skindirs_window();
 	}
 
 	if (get_input_playing())
diff -urN xmms-1.2.10-20050113cvs/xmms/skinwin.c xmms-1.2.10-20050113cvs.skindir-browser/xmms/skinwin.c
--- xmms-1.2.10-20050113cvs/xmms/skinwin.c	2005-02-02 00:08:07.000000000 +0000
+++ xmms-1.2.10-20050113cvs.skindir-browser/xmms/skinwin.c	2005-02-02 00:00:34.000000000 +0000
@@ -20,14 +20,71 @@
 
 GtkWidget *skinwin, *skinwin_list, *skinwin_close;
 GList *skinlist = NULL;
+GtkWidget *skinwin_adddirbutton;
+GtkWidget *skinwin_deldirbutton;
+GtkWidget *skinwin_dir_browser;
+GtkWidget *skinwin_dirlist;
+gint current_skindir = 0;
 
-gint skinwin_delete_event(GtkWidget * widget, GdkEvent * event, gpointer data)
+static void update_skins_window(void);
+
+static gint skinwin_delete_event(GtkWidget * widget, GdkEvent * event, gpointer data)
 {
 	gtk_widget_hide(skinwin);
 	return (TRUE);
 }
 
-void change_skin_event(GtkWidget * widget, gint row, gint column, GdkEventButton * event)
+static gint skindirs_compare_func(gconstpointer a, gconstpointer b)
+{
+	return strcasecmp(a, b);
+}
+
+static void skinwin_add_dir_handler(gchar *dir)
+{
+	if(!g_list_find_custom(cfg.skin_dirs, dir, skindirs_compare_func))
+	{
+		cfg.skin_dirs = g_list_append(cfg.skin_dirs, g_strdup(dir));
+		current_skindir = g_list_length(cfg.skin_dirs) - 1;
+		update_skindirs_window();
+	}
+}
+
+static gint skinwin_adddirbutton_event(GtkWidget * widget, GdkEvent * event, gpointer data)
+{
+	gchar *path;
+	if (g_list_last(cfg.skin_dirs) != NULL)
+	{
+		path = g_list_last(cfg.skin_dirs)->data;
+	}
+	else
+	{
+		path = NULL;
+	}
+	skinwin_dir_browser = xmms_create_dir_browser(_("Select directory to add:"), path, GTK_SELECTION_SINGLE, skinwin_add_dir_handler);
+	gtk_signal_connect(GTK_OBJECT(skinwin_dir_browser), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &skinwin_dir_browser);
+	gtk_window_set_transient_for(GTK_WINDOW(skinwin_dir_browser), GTK_WINDOW(skinwin));
+	gtk_widget_show(skinwin_dir_browser);
+	return (TRUE);
+}
+
+static gint skinwin_deldirbutton_event(GtkWidget * widget, GdkEvent * event, gpointer data)
+{
+	if (g_list_nth(cfg.skin_dirs, current_skindir) != NULL)
+	{
+		
+		int length = g_list_length(cfg.skin_dirs);
+		g_free(g_list_nth(cfg.skin_dirs, current_skindir)->data);
+		cfg.skin_dirs = g_list_remove_link(cfg.skin_dirs, g_list_nth(cfg.skin_dirs, current_skindir));
+		if (current_skindir == length - 1)
+		{
+			current_skindir--;
+		}
+		update_skindirs_window();
+	}
+	return (TRUE);
+}
+
+static void change_skin_event(GtkWidget * widget, gint row, gint column, GdkEventButton * event)
 {
 	if (row == 0)
 		load_skin(NULL);
@@ -36,6 +93,12 @@
 
 }
 
+static void change_dir_event(GtkWidget * widget, gint row, gint column, GdkEventButton * event)
+{
+	current_skindir = row;
+	update_skins_window();
+}
+
 static void enable_random_skin_event(GtkWidget * widget, gpointer data)
 {
 	cfg.random_skin_on_play = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
@@ -44,7 +107,7 @@
 void create_skin_window(void)
 {
 	char *titles[1];
-	GtkWidget *vbox, *hbox, *main_hbox, *separator, *scrolled_win, *checkbox;
+	GtkWidget *vbox, *hbox, *main_hbox, *separator, *scrolled_win, *checkbox, *scrolled_dirwin;
 
 	skinwin = gtk_window_new(GTK_WINDOW_DIALOG);
 	gtk_window_set_title(GTK_WINDOW(skinwin), _("Skin selector"));
@@ -66,7 +129,19 @@
 	gtk_container_border_width(GTK_CONTAINER(scrolled_win), 5);
 	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
 	gtk_box_pack_start(GTK_BOX(vbox), scrolled_win, TRUE, TRUE, 0);
-
+	
+	titles[0] = _("Directories");
+	skinwin_dirlist = gtk_clist_new_with_titles(1, titles);
+	gtk_clist_column_titles_passive(GTK_CLIST(skinwin_dirlist));
+	gtk_clist_set_selection_mode(GTK_CLIST(skinwin_dirlist), GTK_SELECTION_SINGLE);
+	gtk_signal_connect(GTK_OBJECT(skinwin_dirlist), "select_row", GTK_SIGNAL_FUNC(change_dir_event), NULL);
+	gtk_widget_set_usize(skinwin_dirlist, 250, 200);
+	scrolled_dirwin = gtk_scrolled_window_new(NULL, NULL);
+	gtk_container_add(GTK_CONTAINER(scrolled_dirwin), skinwin_dirlist);
+	gtk_container_border_width(GTK_CONTAINER(scrolled_dirwin), 5);
+	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_dirwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+	gtk_box_pack_start(GTK_BOX(vbox), scrolled_dirwin, TRUE, TRUE, 0);
+	
 	separator = gtk_hseparator_new();
 	gtk_box_pack_start(GTK_BOX(vbox), separator, FALSE, TRUE, 0);
 
@@ -83,6 +158,17 @@
 	gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
 	gtk_button_box_set_spacing(GTK_BUTTON_BOX(hbox), 5);
 	gtk_box_pack_start(GTK_BOX(main_hbox), hbox, TRUE, TRUE, 0);
+	
+	skinwin_adddirbutton = gtk_button_new_with_label(_("Add directory"));
+	GTK_WIDGET_SET_FLAGS(skinwin_adddirbutton, GTK_CAN_DEFAULT);
+	gtk_signal_connect(GTK_OBJECT(skinwin_adddirbutton), "clicked", GTK_SIGNAL_FUNC(skinwin_adddirbutton_event), NULL);
+	gtk_box_pack_start(GTK_BOX(hbox), skinwin_adddirbutton, FALSE, FALSE, 0);
+
+	skinwin_deldirbutton = gtk_button_new_with_label(_("Delete directory"));
+	GTK_WIDGET_SET_FLAGS(skinwin_deldirbutton, GTK_CAN_DEFAULT);
+	gtk_signal_connect(GTK_OBJECT(skinwin_deldirbutton), "clicked", GTK_SIGNAL_FUNC(skinwin_deldirbutton_event), NULL);
+	gtk_box_pack_start(GTK_BOX(hbox), skinwin_deldirbutton, FALSE, FALSE, 0);
+
 	skinwin_close = gtk_button_new_with_label(_("Close"));
 	GTK_WIDGET_SET_FLAGS(skinwin_close, GTK_CAN_DEFAULT);
 	gtk_signal_connect(GTK_OBJECT(skinwin_close), "clicked", GTK_SIGNAL_FUNC(skinwin_delete_event), NULL);
@@ -185,56 +271,124 @@
 	g_free(data);
 }
 
-void scan_skins(void)
+static void free_skinlist(void)
 {
-	int i;
-	GList *entry;
-	char *none, *str, *skinsdir;
-	gchar **list;
-
-	none = _("(none)");
 	if (skinlist)
 	{
 		g_list_foreach(skinlist, skin_free_func, NULL);
 		g_list_free(skinlist);
 	}
 	skinlist = NULL;
-	str = g_strconcat(g_get_home_dir(), "/.xmms/Skins", NULL);
-	scan_skindir(str);
-	g_free(str);
-	str = g_strconcat(DATA_DIR, "/Skins", NULL);
-	scan_skindir(str);
-	g_free(str);
-	skinlist = g_list_sort(skinlist, skinlist_compare_func);
-	skinsdir = getenv("SKINSDIR");
-	if (skinsdir)
-	{
-		list = g_strsplit(skinsdir, ":", 0);
-		i = 0;
-		while (list[i])
-			scan_skindir(list[i++]);
+}
+
+void update_skindirs_window(void)
+{
+	gint i;
+	gchar *text[1];
+	
+	gtk_clist_freeze(GTK_CLIST(skinwin_dirlist));
+	gtk_clist_clear(GTK_CLIST(skinwin_dirlist));
+	
+	if (g_list_length(cfg.skin_dirs) != 0)
+	{
+		for(i = 0; i < g_list_length(cfg.skin_dirs); i++)
+		{
+			text[0] = g_list_nth_data(cfg.skin_dirs, i);
+			gtk_clist_append(GTK_CLIST(skinwin_dirlist), text);
+		}
+		gtk_clist_select_row(GTK_CLIST(skinwin_dirlist), current_skindir, 0);
+	}
+	else
+	{
+		update_skins_window();
+	}
+	gtk_clist_thaw(GTK_CLIST(skinwin_dirlist));
+}
+
+void scan_skins(void)
+{
+	gint i;
+	
+	free_skinlist();
+	
+	for (i = 0; i < g_list_length(cfg.skin_dirs); i++)
+	{
+		scan_skindir(g_list_nth(cfg.skin_dirs, i)->data);
+	}
+}
+ 
+void find_current_skindir(void)
+{
+	gint i, n;
+	GList *entry;
+	
+	if (!skin->path) return;
+	
+	free_skinlist();
+	
+	for (i = 0; i < g_list_length(cfg.skin_dirs); i++)
+	{
+		scan_skindir(g_list_nth(cfg.skin_dirs, i)->data);
+		for (n = 0; n < g_list_length(skinlist); n++)
+		{
+			entry = g_list_nth(skinlist, n);
+			if (skin->path)
+				if (!strcmp(((struct SkinNode *) entry->data)->path, skin->path))
+				{
+					current_skindir = i;
+					return;
+				}
+		}
+	}
+}
+
+static void update_skins_window(void)
+{
+	int i;
+	GList *entry;
+	char *none;
+
+	none = _("(none)");
+	
+	free_skinlist();
+	
+	if (g_list_length(cfg.skin_dirs) != 0)
+	{
+		scan_skindir(g_list_nth(cfg.skin_dirs, current_skindir)->data);
 	}
 
 	gtk_clist_freeze(GTK_CLIST(skinwin_list));
 	gtk_clist_clear(GTK_CLIST(skinwin_list));
 	gtk_clist_append(GTK_CLIST(skinwin_list), &none);
-	if (!skin->path)
+	
+	if (g_list_length(cfg.skin_dirs) == 0)
+	{
 		gtk_clist_select_row(GTK_CLIST(skinwin_list), 0, 0);
+	}
+	else
+	{	
+		if (!skin->path)
+		{
+			gtk_clist_select_row(GTK_CLIST(skinwin_list), 0, 0);
+		}
 
-	for (i = 0; i < g_list_length(skinlist); i++)
-	{
-		entry = g_list_nth(skinlist, i);
-		gtk_clist_append(GTK_CLIST(skinwin_list), (gchar **) & ((struct SkinNode *) entry->data)->name);
-		if (skin->path)
-			if (!strcmp(((struct SkinNode *) entry->data)->path, skin->path))
-				gtk_clist_select_row(GTK_CLIST(skinwin_list), i + 1, 0);
+		for (i = 0; i < g_list_length(skinlist); i++)
+		{
+			entry = g_list_nth(skinlist, i);
+			gtk_clist_append(GTK_CLIST(skinwin_list), (gchar **) & ((struct SkinNode *) entry->data)->name);
+			if (skin->path)
+				if (!strcmp(((struct SkinNode *) entry->data)->path, skin->path))
+					gtk_clist_select_row(GTK_CLIST(skinwin_list), i + 1, 0);
+		}
 	}
+	
 	gtk_clist_thaw(GTK_CLIST(skinwin_list));
 }
 
 void show_skin_window(void)
 {
-	scan_skins();
+	find_current_skindir();
+	update_skindirs_window();
 	gtk_window_set_position(GTK_WINDOW(skinwin), GTK_WIN_POS_MOUSE);
 	gtk_widget_show_all(skinwin);
 	gtk_widget_grab_focus(skinwin_list);
diff -urN xmms-1.2.10-20050113cvs/xmms/skinwin.h xmms-1.2.10-20050113cvs.skindir-browser/xmms/skinwin.h
--- xmms-1.2.10-20050113cvs/xmms/skinwin.h	2005-02-02 00:08:07.000000000 +0000
+++ xmms-1.2.10-20050113cvs.skindir-browser/xmms/skinwin.h	2005-01-31 11:15:57.000000000 +0000
@@ -19,6 +19,8 @@
 #ifndef SKINWIN_H
 #define SKINWIN_H
 
+#include "libxmms/dirbrowser.h"
+
 extern GList *skinlist;
 
 struct SkinNode
@@ -29,5 +31,7 @@
 void create_skin_window(void);
 void show_skin_window(void);
 void scan_skins(void);
+void find_current_skindir(void);
+void update_skindirs_window(void);
 
 #endif