⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playlist.c

📁 Aqualung is an advanced music player primarily targeted for the GNU/Linux operating system, but als
💻 C
📖 第 1 页 / 共 5 页
字号:
		}		if (recalc_pos_parent) {			recalc_album_node(&pos_parent);			unmark_track(&pos_parent);			mark_track(&pos_parent);		}		g_free(tname);		g_free(fname);		g_free(color);		g_free(voldisp);		g_free(durdisp);	}}gintplaylist_drag_data_received(GtkWidget * widget, GdkDragContext * drag_context, gint x, gint y, 			    GtkSelectionData  * data, guint info, guint time) {	GtkTreeViewColumn * column;	if (!strcmp((gchar *)data->data, "store")) {		GtkTreePath * path = NULL;		GtkTreeIter * piter = NULL;		GtkTreeIter iter;		GtkTreeIter parent;		if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(play_list),						  x, y, &path, &column, NULL, NULL)) {			if (info != 4) { /* dragging store, artist or record */				while (gtk_tree_path_get_depth(path) > 1) {					gtk_tree_path_up(path);				}			}			gtk_tree_model_get_iter(GTK_TREE_MODEL(play_store), &iter, path);			piter = &iter;		}		switch (info) {		case 1:			store__addlist_defmode(piter);			break;		case 2:			artist__addlist_defmode(piter);			break;		case 3:			record__addlist_defmode(piter);			break;		case 4:			track__addlist_cb(piter);			if (piter && gtk_tree_model_iter_parent(GTK_TREE_MODEL(play_store),								&parent, piter)) {				recalc_album_node(&parent);				unmark_track(&parent);				mark_track(&parent);			}			break;		}		if (path) {			gtk_tree_path_free(path);		}	} else if (!strcmp((gchar *)data->data, "list")) {		GtkTreeModel * model;		GtkTreeIter sel_iter;		GtkTreeIter pos_iter;		GtkTreePath * sel_path = NULL;		GtkTreePath * pos_path = NULL;		gtk_tree_selection_set_mode(play_select, GTK_SELECTION_SINGLE);		if (gtk_tree_selection_get_selected(play_select, &model, &sel_iter)) {			sel_path = gtk_tree_model_get_path(model, &sel_iter);			if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(play_list),						  x, y, &pos_path, &column, NULL, NULL)) {				gtk_tree_model_get_iter(model, &pos_iter, pos_path);				playlist_perform_drag(model,						      &sel_iter, sel_path,						      &pos_iter, pos_path);			}		}		if (sel_path) {			gtk_tree_path_free(sel_path);		}		if (pos_path) {			gtk_tree_path_free(pos_path);		}		gtk_tree_selection_set_mode(play_select, GTK_SELECTION_MULTIPLE);	}	return FALSE;}voidplaylist_remove_scroll_tags() {	if (playlist_scroll_up_tag > 0) {			g_source_remove(playlist_scroll_up_tag);		playlist_scroll_up_tag = -1;	}	if (playlist_scroll_dn_tag > 0) {			g_source_remove(playlist_scroll_dn_tag);		playlist_scroll_dn_tag = -1;	}}gintplaylist_scroll_up(gpointer data) {	g_signal_emit_by_name(G_OBJECT(scrolled_win), "scroll-child",			      GTK_SCROLL_STEP_BACKWARD, FALSE/*vertical*/, NULL);	return TRUE;}gintplaylist_scroll_dn(gpointer data) {	g_signal_emit_by_name(G_OBJECT(scrolled_win), "scroll-child",			      GTK_SCROLL_STEP_FORWARD, FALSE/*vertical*/, NULL);	return TRUE;}voidplaylist_drag_leave(GtkWidget * widget, GdkDragContext * drag_context, guint time) {	if (playlist_drag_y < widget->allocation.height / 2) {		if (playlist_scroll_up_tag == -1) {			playlist_scroll_up_tag = g_timeout_add(100, playlist_scroll_up, NULL);		}	} else {		if (playlist_scroll_dn_tag == -1) {			playlist_scroll_dn_tag = g_timeout_add(100, playlist_scroll_dn, NULL);		}	}}gbooleanplaylist_drag_motion(GtkWidget * widget, GdkDragContext * context,		     gint x, gint y, guint time) {	playlist_drag_y = y;	playlist_remove_scroll_tags();	return TRUE;}voidplaylist_drag_end(GtkWidget * widget, GdkDragContext * drag_context, gpointer data) {	playlist_remove_scroll_tags();	gtk_drag_dest_unset(play_list);}voidcreate_playlist(void) {	GtkWidget * vbox;	GtkWidget * hbox_bottom;	GtkWidget * add_button;	GtkWidget * selall_button;	GtkWidget * remsel_button;	GtkWidget * viewport;	GtkWidget * statusbar;	GtkWidget * statusbar_scrolledwin;	GtkWidget * statusbar_viewport;	int i;	GdkPixbuf * pixbuf;	char path[MAXLEN];	GtkTargetEntry target_table[] = {		{ "", GTK_TARGET_SAME_APP, 0 }	};        /* window creating stuff */	if (!options.playlist_is_embedded) {		playlist_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);		gtk_window_set_title(GTK_WINDOW(playlist_window), _("Playlist"));		gtk_container_set_border_width(GTK_CONTAINER(playlist_window), 2);		g_signal_connect(G_OBJECT(playlist_window), "delete_event",				 G_CALLBACK(playlist_window_close), NULL);		gtk_widget_set_size_request(playlist_window, 300, 200);	} else {		gtk_widget_set_size_request(playlist_window, 200, 200);	}        if (!options.playlist_is_embedded) {                g_signal_connect(G_OBJECT(playlist_window), "key_press_event",                                 G_CALLBACK(playlist_window_key_pressed), NULL);        }	gtk_widget_set_events(playlist_window, GDK_BUTTON_PRESS_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);        if (!options.playlist_is_embedded) {                plist_menu = gtk_menu_new();                init_plist_menu(plist_menu);        }        vbox = gtk_vbox_new(FALSE, 2);        gtk_container_add(GTK_CONTAINER(playlist_window), vbox);        /* create playlist */	if (!play_store) {		play_store = gtk_tree_store_new(8,						G_TYPE_STRING,          /* track name */						G_TYPE_STRING,          /* physical filename */						G_TYPE_STRING,          /* color for selections */						G_TYPE_FLOAT,           /* volume adjustment [dB] */						G_TYPE_STRING,          /* volume adj. displayed */						G_TYPE_FLOAT,           /* duration (in secs) */						G_TYPE_STRING,          /* duration displayed */                                                G_TYPE_INT);            /* font weight */	}        play_list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(play_store));	gtk_tree_view_set_enable_search(GTK_TREE_VIEW(play_list), FALSE);	gtk_widget_set_name(play_list, "play_list");	gtk_widget_set_size_request(play_list, 100, 100);        if (options.override_skin_settings) {                gtk_widget_modify_font (play_list, fd_playlist);        }        if (options.enable_pl_rules_hint) {                gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(play_list), TRUE);        }        playlist_color_is_set = 0;	for (i = 0; i < 3; i++) {		switch (options.plcol_idx[i]) {		case 0:			track_renderer = gtk_cell_renderer_text_new();			track_column = gtk_tree_view_column_new_with_attributes("Tracks",										track_renderer,										"text", 0,										"foreground", 2,                                                                                "weight", 7,										NULL);			gtk_tree_view_column_set_sizing(GTK_TREE_VIEW_COLUMN(track_column),							GTK_TREE_VIEW_COLUMN_FIXED);			gtk_tree_view_column_set_spacing(GTK_TREE_VIEW_COLUMN(track_column), 3);			gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(track_column), FALSE);			gtk_tree_view_column_set_fixed_width(GTK_TREE_VIEW_COLUMN(track_column), 10);                        g_object_set(G_OBJECT(track_renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);                        gtk_cell_renderer_set_fixed_size(track_renderer, 10, -1);			gtk_tree_view_append_column(GTK_TREE_VIEW(play_list), track_column);			break;		case 1:			rva_renderer = gtk_cell_renderer_text_new();			g_object_set((gpointer)rva_renderer, "xalign", 1.0, NULL);			rva_column = gtk_tree_view_column_new_with_attributes("RVA",									      rva_renderer,									      "text", 4,									      "foreground", 2,                                                                              "weight", 7,									      NULL);			gtk_tree_view_column_set_sizing(GTK_TREE_VIEW_COLUMN(rva_column),							GTK_TREE_VIEW_COLUMN_FIXED);			gtk_tree_view_column_set_spacing(GTK_TREE_VIEW_COLUMN(rva_column), 3);			if (options.show_rva_in_playlist) {				gtk_tree_view_column_set_visible(GTK_TREE_VIEW_COLUMN(rva_column), TRUE);				gtk_tree_view_column_set_fixed_width(GTK_TREE_VIEW_COLUMN(rva_column), 50);			} else {				gtk_tree_view_column_set_visible(GTK_TREE_VIEW_COLUMN(rva_column), FALSE);				gtk_tree_view_column_set_fixed_width(GTK_TREE_VIEW_COLUMN(rva_column), 1);			}			gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(rva_column), FALSE);			gtk_tree_view_append_column(GTK_TREE_VIEW(play_list), rva_column);			break;		case 2:			length_renderer = gtk_cell_renderer_text_new();			g_object_set((gpointer)length_renderer, "xalign", 1.0, NULL);			length_column = gtk_tree_view_column_new_with_attributes("Length",										 length_renderer,										 "text", 6,										 "foreground", 2,                                                                                 "weight", 7,										 NULL);			gtk_tree_view_column_set_sizing(GTK_TREE_VIEW_COLUMN(length_column),							GTK_TREE_VIEW_COLUMN_FIXED);			gtk_tree_view_column_set_spacing(GTK_TREE_VIEW_COLUMN(length_column), 3);			if (options.show_length_in_playlist) {				gtk_tree_view_column_set_visible(GTK_TREE_VIEW_COLUMN(length_column), TRUE);				gtk_tree_view_column_set_fixed_width(GTK_TREE_VIEW_COLUMN(length_column), 50);			} else {				gtk_tree_view_column_set_visible(GTK_TREE_VIEW_COLUMN(length_column), FALSE);				gtk_tree_view_column_set_fixed_width(GTK_TREE_VIEW_COLUMN(length_column), 1);			}			gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(length_column), FALSE);			gtk_tree_view_append_column(GTK_TREE_VIEW(play_list), length_column);		}	}        gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(play_list), FALSE);	/* setup drag and drop inside playlist for reordering */		gtk_drag_source_set(play_list,			    GDK_BUTTON1_MASK,			    target_table,			    1,			    GDK_ACTION_MOVE);		snprintf(path, MAXLEN-1, "%s/drag.png", AQUALUNG_DATADIR);	if ((pixbuf = gdk_pixbuf_new_from_file(path, NULL)) != NULL) {		gtk_drag_source_set_icon_pixbuf(play_list, pixbuf);	}			g_signal_connect(G_OBJECT(play_list), "drag_begin",			 G_CALLBACK(playlist_drag_begin), NULL);	g_signal_connect(G_OBJECT(play_list), "drag_end",			 G_CALLBACK(playlist_drag_end), NULL);	g_signal_connect(G_OBJECT(play_list), "drag_data_get",			 G_CALLBACK(playlist_drag_data_get), NULL);	g_signal_connect(G_OBJECT(play_list), "drag_leave",			 G_CALLBACK(playlist_drag_leave), NULL);	g_signal_connect(G_OBJECT(play_list), "drag_motion",			 G_CALLBACK(playlist_drag_motion), NULL);	g_signal_connect(G_OBJECT(play_list), "drag_data_received",			 G_CALLBACK(playlist_drag_data_received), NULL);	        play_select = gtk_tree_view_get_selection(GTK_TREE_VIEW(play_list));        gtk_tree_selection_set_mode(play_select, GTK_SELECTION_MULTIPLE);	g_signal_connect(G_OBJECT(play_select), "changed",			 G_CALLBACK(playlist_selection_changed), NULL);	g_signal_connect(G_OBJECT(play_list), "button_press_event",			 G_CALLBACK(doubleclick_handler), NULL);	viewport = gtk_viewport_new(NULL, NULL);        gtk_box_pack_start(GTK_BOX(vbox), viewport, TRUE, TRUE, 0);	scrolled_win = gtk_scrolled_window_new(NULL, NULL);	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win),				       GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);        gtk_container_add(GTK_CONTAINER(viewport), scrolled_win);	gtk_container_add(GTK_CONTAINER(scrolled_win), play_list);	/* statusbar */	if (options.enable_playlist_statusbar) {		statusbar_scrolledwin = gtk_scrolled_window_new(NULL, NULL);                GTK_WIDGET_UNSET_FLAGS(statusbar_scrolledwin, GTK_CAN_FOCUS);		gtk_widget_set_size_request(statusbar_scrolledwin, 1, -1);    /* MAGIC */		gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(statusbar_scrolledwin),					       GTK_POLICY_NEVER, GTK_POLICY_NEVER);		statusbar_viewport = gtk_viewport_new(NULL, NULL);		gtk_widget_set_name(statusbar_viewport, "info_viewport");		gtk_container_add(GTK_CONTAINER(statusbar_scrolledwin), statusbar_viewport);		gtk_box_pack_start(GTK_BOX(vbox), statusbar_scrolledwin, FALSE, TRUE, 2);		gtk_widget_set_events(statusbar_viewport,				      GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK);		g_signal_connect(G_OBJECT(statusbar_viewport), "button_press_event",				 G_CALLBACK(scroll_btn_pressed), NULL);		g_signal_connect(G_OBJECT(statusbar_viewport), "button_release_event",				 G_CALLBACK(scroll_btn_released), (gpointer)statusbar_scrolledwin);		g_signal_connect(G_OBJECT(statusbar_viewport), "motion_notify_event",				 G_CALLBACK(scroll_motion_notify), (gpointer)statusbar_scrolledwin);				statusbar = gtk_hbox_new(FALSE, 0);		gtk_container_set_border_width(GTK_CONTAINER(statusbar), 1);		gtk_container_add(GTK_CONTAINER(statusbar_viewport), statusbar);				statusbar_selected = gtk_label_new("");		gtk_widget_set_name(statusbar_selected, "label_info");		gtk_box_pack_end(GTK_BOX(statusbar), statusbar_selected, FALSE, TRUE, 0);				statusbar_selected_label = gtk_label_new(_("Selected: "));		gtk_widget_set_name(statusbar_selected_label, "label_info");		gtk_box_pack_end(GTK_BOX(statusbar), statusbar_selected_label, FALSE, TRUE, 0);				gtk_box_pack_end(GTK_BOX(statusbar), gtk_vseparator_new(), FALSE, TRUE, 5);				statusbar_total = gtk_label_new("");		gtk_widget_set_name(statusbar_total, "label_info");		gtk_box_pack_end(GTK_BOX(statusbar), statusbar_total, FALSE, TRUE, 0);				statusbar_total_label = gtk_label_new(_("Total: "));		gtk_widget_set_name(statusbar_total_label, "label_info");		gtk_box_pack_end(GTK_BOX(statusbar), statusbar_total_label, FALSE, TRUE, 0);                if (options.override_skin_settings) {                        gtk_widget_modify_font (statusbar_selected, fd_statusbar);                        gtk_widget_modify_font (statusbar_selected_label, fd_statusbar);                        gtk_widget_modify_font (statusbar_total, fd_statusbar);                        gtk_widget_modify_font (statusbar_total_label, fd_statusbar);                }				playlist_selection_changed(NULL, NULL);		playlist_content_changed();	}		/* bottom area of playlist window */        hbox_bottom = gtk_hbox_new(FALSE, 0);        gtk_box_pack_start(GTK_BOX(vbox), hbox_bottom, FALSE, TRUE, 0);	add_button = gtk_button_new_with_label(_("Add files"));        GTK_WIDGET_UNSET_FLAGS(add_button, GTK_CAN_FOCUS);        gtk_tooltips_set_tip (GTK_TOOLTIPS (aqualung_tooltips), add_button, _("Add files to playlist\n(Press right mouse button for menu)"), NULL);        gtk_box_pack_start(GTK_BOX(hbox_bottom), add_button, TRUE, TRUE, 0);        g_signal_connect(G_OBJECT(add_button), "clicked", G_CALLBACK(add_files), NULL);	selall_button = gtk_button_new_with_label(_("Select all"));        GTK_WIDGET_UNSET_FLAGS(selall_button, GTK_CAN_FOCUS);        gtk_tooltips_set_tip (GTK_TOOLTIPS (aqualung_tooltips), selall_button, _("Select all songs in playlist\n(Press right mouse button for menu)"), NULL);        gtk_box_pack_start(GTK_BOX(hbox_bottom), selall_button, TRUE, TRUE, 0);        g_signal_connect(G_OBJECT(selall_button), "clicked", G_CALLBACK(select_all), NULL);		remsel_button = gtk_button_new_with_label(_("Remove selected"));        GTK_WIDGET_UNSET_FLAGS(remsel_button, GTK_CAN_FOCUS);        gtk_tooltips_set_tip (GTK_TOOLTIPS (aqualung_tooltips), remsel_button, _("Remove selected songs from playlist\n(Press right mouse button for menu)"), NULL);        gtk_box_pack_start(GTK_BOX(hbox_bottom), remsel_button, TRUE, TRUE, 0);        g_signal_connect(G_OBJECT(remsel_button), "clicked", G_CALLBACK(remove_sel), NULL);        add_menu = gtk_menu_new();        add__dir = gtk_menu_item_new_with_label(_("Add directory"));        gtk_menu_shell_append(GTK_MENU_SHELL(add_menu), add__dir);        g_signal_connect_swapped(G_OBJECT(add__dir), "activate", G_CALLBACK(add__dir_cb), NULL);	gtk_widget_show(add__dir);        add__files = gtk_menu_item_new_with_label(_("Add files"));        gtk_menu_shell_append(GTK_MENU_SHELL(add_menu), add__files);        g_signal_connect_swapped(G_OBJECT(add__files), "activate", G_CALLBACK(add__files_cb), NULL);	gtk_widget_show(add__files);        g_signal_connect_swapped(G_OBJECT(add_button), "event", G_CALLBACK(add_cb), NULL);        sel_menu = gtk_menu_new();        sel__none = gtk_menu_item_new_with_label(_("Select none"));        gtk_menu_shell_append(GTK_MENU_SHELL(sel_menu), sel__none);        g_signal_connect_swapped(G_OBJECT(sel__none), "activ

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -