📄 playlist.c
字号:
} 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 + -