diff options
author | 2010-02-14 16:24:51 +0100 | |
---|---|---|
committer | 2010-02-14 16:24:51 +0100 | |
commit | 68e0176c1d054ab285d9f2bbaa958e50cf3a5e73 (patch) | |
tree | ba65ad2e30e5a7d28585b2d01ebffbe157501fab /plugins | |
parent | 4b11bd6042edb71ac3e64c5cbe9b76aa0f732f58 (diff) |
playlist refactoring WIP
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/gtkui/Makefile.am | 2 | ||||
-rw-r--r-- | plugins/gtkui/callbacks.c | 127 | ||||
-rw-r--r-- | plugins/gtkui/ddblistview.c (renamed from plugins/gtkui/gtkplaylist.c) | 243 | ||||
-rw-r--r-- | plugins/gtkui/ddblistview.h (renamed from plugins/gtkui/gtkplaylist.h) | 66 | ||||
-rw-r--r-- | plugins/gtkui/fileman.c | 100 | ||||
-rw-r--r-- | plugins/gtkui/gtkui.c | 171 | ||||
-rw-r--r-- | plugins/gtkui/gtkui.h | 26 | ||||
-rw-r--r-- | plugins/gtkui/search.c | 2 |
8 files changed, 375 insertions, 362 deletions
diff --git a/plugins/gtkui/Makefile.am b/plugins/gtkui/Makefile.am index 235d8cfa..5cb58978 100644 --- a/plugins/gtkui/Makefile.am +++ b/plugins/gtkui/Makefile.am @@ -3,7 +3,7 @@ gtkuidir = $(libdir)/$(PACKAGE) pkglib_LTLIBRARIES = gtkui.la gtkui_la_SOURCES = gtkui.c gtkui.h\ callbacks.c interface.c support.c callbacks.h interface.h support.h\ - gtkplaylist.c gtkplaylist.h\ + ddblistview.c ddblistview.h\ drawing.h gdkdrawing.c\ progress.c progress.h\ search.c search.h\ diff --git a/plugins/gtkui/callbacks.c b/plugins/gtkui/callbacks.c index d363698a..2b4dd6b6 100644 --- a/plugins/gtkui/callbacks.c +++ b/plugins/gtkui/callbacks.c @@ -32,7 +32,7 @@ #include "interface.h" #include "support.h" -#include "gtkplaylist.h" +#include "ddblistview.h" #include "search.h" #include "progress.h" #include "../../session.h" @@ -222,15 +222,6 @@ on_quit_activate (GtkMenuItem *menuitem, } -void -on_clear1_activate (GtkMenuItem *menuitem, - gpointer user_data) -{ - deadbeef->pl_clear (); - main_refresh (); - search_refresh (); -} - void on_select_all1_activate (GtkMenuItem *menuitem, @@ -242,31 +233,6 @@ on_select_all1_activate (GtkMenuItem *menuitem, } -void -on_remove1_activate (GtkMenuItem *menuitem, - gpointer user_data) -{ - int cursor = deadbeef->pl_delete_selected (); -// if (cursor >= deadbeef->pl_getcount (PL_MAIN)) { -// cursor = deadbeef->pl_getcount (PL_MAIN)-1; -// } - //gtkpl_set_cursor (main_playlist.iterator, cursor); - - main_refresh (); - search_refresh (); -} - - -void -on_crop1_activate (GtkMenuItem *menuitem, - gpointer user_data) -{ - DdbListview *pl = DDB_LISTVIEW (lookup_widget (mainwin, "playlist")); - deadbeef->pl_crop_selected (); - main_refresh (); - search_refresh (); -} - @@ -329,7 +295,7 @@ on_mainwin_key_press_event (GtkWidget *widget, deadbeef->sendmessage (M_PLAYRANDOM, 0, 0, 0); } else { - gtkpl_keypress (DDB_LISTVIEW (lookup_widget (mainwin, "playlist")), event->keyval, event->state); + ddb_listview_handle_keypress (DDB_LISTVIEW (lookup_widget (mainwin, "playlist")), event->keyval, event->state); } return FALSE; } @@ -409,34 +375,6 @@ on_searchlist_realize (GtkWidget *widget, -void -on_playlist_load_activate (GtkMenuItem *menuitem, - gpointer user_data) -{ - GtkWidget *dlg = gtk_file_chooser_dialog_new ("Load Playlist", GTK_WINDOW (mainwin), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); - - GtkFileFilter* flt; - flt = gtk_file_filter_new (); - gtk_file_filter_set_name (flt, "DeaDBeeF playlist files (*.dbpl)"); - gtk_file_filter_add_pattern (flt, "*.dbpl"); - gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dlg), flt); - - if (gtk_dialog_run (GTK_DIALOG (dlg)) == GTK_RESPONSE_OK) - { - gchar *fname = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dlg)); - gtk_widget_destroy (dlg); - if (fname) { - /*int res = */deadbeef->pl_load (fname); - g_free (fname); - main_refresh (); - search_refresh (); - } - } - else { - gtk_widget_destroy (dlg); - } -} - char last_playlist_save_name[1024] = ""; void @@ -1020,15 +958,6 @@ on_helpwindow_key_press_event (GtkWidget *widget, return FALSE; } - -void -on_add_audio_cd_activate (GtkMenuItem *menuitem, - gpointer user_data) -{ - deadbeef->pl_add_file ("all.cda", NULL, NULL); - playlist_refresh (); -} - static GtkWidget *prefwin; static char alsa_device_names[100][64]; @@ -1446,25 +1375,6 @@ on_pref_close_clicked (GtkButton *button, void -on_add_location_activate (GtkMenuItem *menuitem, - gpointer user_data) -{ - GtkWidget *dlg= create_addlocationdlg (); - int res = gtk_dialog_run (GTK_DIALOG (dlg)); - if (res == GTK_RESPONSE_OK) { - GtkEntry *entry = GTK_ENTRY (lookup_widget (dlg, "addlocation_entry")); - if (entry) { - const char *text = gtk_entry_get_text (entry); - if (text) { - deadbeef->pl_add_file (text, NULL, NULL); - playlist_refresh (); - } - } - } - gtk_widget_destroy (dlg); -} - -void on_configure_plugin_clicked (GtkButton *button, gpointer user_data) { @@ -1594,16 +1504,6 @@ on_remove_from_playback_queue1_activate } -void -on_remove2_activate (GtkMenuItem *menuitem, - gpointer user_data) -{ - GtkWidget *widget = GTK_WIDGET (menuitem); - int cursor = deadbeef->pl_delete_selected (); - main_refresh (); - search_refresh (); -} - void on_properties1_activate (GtkMenuItem *menuitem, @@ -1686,18 +1586,17 @@ on_properties1_activate (GtkMenuItem *menuitem, #endif } -//gboolean -//on_trackproperties_key_press_event (GtkWidget *widget, -// GdkEventKey *event, -// gpointer user_data) -//{ -// KILLME -// if (event->keyval == GDK_Escape) { -// trackproperties = NULL; -// gtk_widget_destroy (widget); -// } -// return FALSE; -//} +gboolean +on_trackproperties_key_press_event (GtkWidget *widget, + GdkEventKey *event, + gpointer user_data) +{ + if (event->keyval == GDK_Escape) { + trackproperties = NULL; + gtk_widget_destroy (widget); + } + return FALSE; +} diff --git a/plugins/gtkui/gtkplaylist.c b/plugins/gtkui/ddblistview.c index 3be8a076..56f856d9 100644 --- a/plugins/gtkui/gtkplaylist.c +++ b/plugins/gtkui/ddblistview.c @@ -33,7 +33,7 @@ #include <ctype.h> #include <assert.h> #include <sys/time.h> -#include "gtkplaylist.h" +#include "ddblistview.h" #include "callbacks.h" #include "interface.h" #include "support.h" @@ -170,11 +170,11 @@ ddb_listview_list_expose_event (GtkWidget *widget, gpointer user_data); void -on_playlist_realize (GtkWidget *widget, +ddb_listview_list_realize (GtkWidget *widget, gpointer user_data); gboolean -on_playlist_button_press_event (GtkWidget *widget, +ddb_listview_list_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); @@ -220,7 +220,7 @@ ddb_listview_list_drag_leave (GtkWidget *widget, gpointer user_data); gboolean -on_playlist_button_release_event (GtkWidget *widget, +ddb_listview_list_button_release_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); @@ -229,17 +229,17 @@ ddb_listview_motion_notify_event (GtkWidget *widget, GdkEventMotion *event, gpointer user_data); gboolean -on_playlist_button_press_event (GtkWidget *widget, +ddb_listview_list_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); gboolean -ddl_playlist_vscroll_event (GtkWidget *widget, +ddb_listview_vscroll_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); gboolean -on_playlist_button_release_event (GtkWidget *widget, +ddb_listview_list_button_release_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); @@ -261,7 +261,7 @@ ddb_listview_init(DdbListview *listview) { // init instance - create all subwidgets, and insert into table - listview->rowheight = -1; + listview->rowheight = draw_get_font_size () + 12; listview->col_movepos = -1; listview->drag_motion_y = -1; @@ -315,10 +315,10 @@ ddb_listview_init(DdbListview *listview) gtk_widget_set_size_request (listview->header, -1, 24); gtk_widget_set_events (listview->header, GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); - listview->playlist = gtk_drawing_area_new (); - gtk_widget_show (listview->playlist); - gtk_box_pack_start (GTK_BOX (vbox), listview->playlist, TRUE, TRUE, 0); - gtk_widget_set_events (listview->playlist, GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); + listview->list = gtk_drawing_area_new (); + gtk_widget_show (listview->list); + gtk_box_pack_start (GTK_BOX (vbox), listview->list, TRUE, TRUE, 0); + gtk_widget_set_events (listview->list, GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); listview->hscrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 0, 0, 0, 0))); gtk_widget_show (listview->hscrollbar); @@ -327,12 +327,12 @@ ddb_listview_init(DdbListview *listview) (GtkAttachOptions) (GTK_FILL), 0, 0); - gtk_object_set_data (GTK_OBJECT (listview->playlist), "owner", listview); + gtk_object_set_data (GTK_OBJECT (listview->list), "owner", listview); gtk_object_set_data (GTK_OBJECT (listview->header), "owner", listview); gtk_object_set_data (GTK_OBJECT (listview->scrollbar), "owner", listview); gtk_object_set_data (GTK_OBJECT (listview->hscrollbar), "owner", listview); - g_signal_connect ((gpointer) listview->playlist, "configure_event", + g_signal_connect ((gpointer) listview->list, "configure_event", G_CALLBACK (ddb_listview_list_configure_event), NULL); @@ -357,46 +357,46 @@ ddb_listview_init(DdbListview *listview) g_signal_connect ((gpointer) listview->header, "button_release_event", G_CALLBACK (ddb_listview_header_button_release_event), NULL); - g_signal_connect ((gpointer) listview->playlist, "expose_event", + g_signal_connect ((gpointer) listview->list, "expose_event", G_CALLBACK (ddb_listview_list_expose_event), NULL); - g_signal_connect ((gpointer) listview->playlist, "realize", - G_CALLBACK (on_playlist_realize), + g_signal_connect ((gpointer) listview->list, "realize", + G_CALLBACK (ddb_listview_list_realize), NULL); - g_signal_connect ((gpointer) listview->playlist, "button_press_event", - G_CALLBACK (on_playlist_button_press_event), + g_signal_connect ((gpointer) listview->list, "button_press_event", + G_CALLBACK (ddb_listview_list_button_press_event), NULL); - g_signal_connect ((gpointer) listview->playlist, "scroll_event", - G_CALLBACK (ddl_playlist_vscroll_event), + g_signal_connect ((gpointer) listview->list, "scroll_event", + G_CALLBACK (ddb_listview_vscroll_event), NULL); -// g_signal_connect ((gpointer) listview->playlist, "drag_begin", +// g_signal_connect ((gpointer) listview->list, "drag_begin", // G_CALLBACK (on_playlist_drag_begin), // NULL); - g_signal_connect ((gpointer) listview->playlist, "drag_motion", + g_signal_connect ((gpointer) listview->list, "drag_motion", G_CALLBACK (ddb_listview_list_drag_motion), NULL); - g_signal_connect ((gpointer) listview->playlist, "drag_drop", + g_signal_connect ((gpointer) listview->list, "drag_drop", G_CALLBACK (ddb_listview_list_drag_drop), NULL); - g_signal_connect ((gpointer) listview->playlist, "drag_data_get", + g_signal_connect ((gpointer) listview->list, "drag_data_get", G_CALLBACK (ddb_listview_list_drag_data_get), NULL); - g_signal_connect ((gpointer) listview->playlist, "drag_end", + g_signal_connect ((gpointer) listview->list, "drag_end", G_CALLBACK (ddb_listview_list_drag_end), NULL); - g_signal_connect ((gpointer) listview->playlist, "drag_failed", + g_signal_connect ((gpointer) listview->list, "drag_failed", G_CALLBACK (ddb_listview_list_drag_failed), NULL); - g_signal_connect ((gpointer) listview->playlist, "drag_leave", + g_signal_connect ((gpointer) listview->list, "drag_leave", G_CALLBACK (ddb_listview_list_drag_leave), NULL); - g_signal_connect ((gpointer) listview->playlist, "button_release_event", - G_CALLBACK (on_playlist_button_release_event), + g_signal_connect ((gpointer) listview->list, "button_release_event", + G_CALLBACK (ddb_listview_list_button_release_event), NULL); - g_signal_connect ((gpointer) listview->playlist, "motion_notify_event", + g_signal_connect ((gpointer) listview->list, "motion_notify_event", G_CALLBACK (ddb_listview_motion_notify_event), NULL); - g_signal_connect ((gpointer) listview->playlist, "drag_data_received", + g_signal_connect ((gpointer) listview->list, "drag_data_received", G_CALLBACK (ddb_listview_list_drag_data_received), NULL); g_signal_connect ((gpointer) listview->hscrollbar, "value_changed", @@ -439,13 +439,13 @@ ddb_listview_refresh (DdbListview *listview, uint32_t flags) { ddb_listview_header_render (listview); } if (flags & DDB_REFRESH_LIST) { - ddb_listview_list_render (listview, 0, 0, listview->playlist->allocation.width, listview->playlist->allocation.height); + ddb_listview_list_render (listview, 0, 0, listview->list->allocation.width, listview->list->allocation.height); } if (flags & DDB_EXPOSE_COLUMNS) { ddb_listview_header_expose (listview, 0, 0, listview->header->allocation.width, listview->header->allocation.height); } if (flags & DDB_EXPOSE_LIST) { - ddb_listview_list_expose (listview, 0, 0, listview->playlist->allocation.width, listview->playlist->allocation.height); + ddb_listview_list_expose (listview, 0, 0, listview->list->allocation.width, listview->list->allocation.height); } } @@ -457,13 +457,13 @@ ddb_listview_list_configure_event (GtkWidget *widget, DdbListview *ps = DDB_LISTVIEW (gtk_object_get_data (GTK_OBJECT (widget), "owner")); ddb_listview_list_setup_vscroll (ps); ddb_listview_list_setup_hscroll (ps); - widget = ps->playlist; + widget = ps->list; if (ps->backbuf) { g_object_unref (ps->backbuf); ps->backbuf = NULL; } - ps->nvisiblerows = ceil (widget->allocation.height / (float)rowheight); - ps->nvisiblefullrows = floor (widget->allocation.height / (float)rowheight); + ps->nvisiblerows = ceil (widget->allocation.height / (float)ps->rowheight); + ps->nvisiblefullrows = floor (widget->allocation.height / (float)ps->rowheight); ps->backbuf = gdk_pixmap_new (widget->window, widget->allocation.width, widget->allocation.height, -1); ddb_listview_list_render (ps, 0, 0, widget->allocation.width, widget->allocation.height); @@ -480,10 +480,10 @@ ddb_listview_list_render (DdbListview *ps, int x, int y, int w, int h) { int row1; int row2; int row2_full; - row1 = max (0, y / rowheight + ps->scrollpos); + row1 = max (0, y / ps->rowheight + ps->scrollpos); int cnt = ps->binding->count (); - row2 = min (cnt, (y+h) / rowheight + ps->scrollpos + 1); - row2_full = (y+h) / rowheight + ps->scrollpos + 1; + row2 = min (cnt, (y+h) / ps->rowheight + ps->scrollpos + 1); + row2_full = (y+h) / ps->rowheight + ps->scrollpos + 1; // draw background DdbListviewIter it = ps->binding->get_for_idx (ps->scrollpos); DdbListviewIter it_copy = it; @@ -527,22 +527,22 @@ ddb_listview_list_expose_event (GtkWidget *widget, void ddb_listview_list_expose (DdbListview *ps, int x, int y, int w, int h) { - GtkWidget *widget = ps->playlist; + GtkWidget *widget = ps->list; if (widget->window) { draw_drawable (widget->window, widget->style->black_gc, ps->backbuf, x, y, x, y, w, h); } } gboolean -ddl_playlist_vscroll_event (GtkWidget *widget, +ddb_listview_vscroll_event (GtkWidget *widget, GdkEvent *event, gpointer user_data) { DdbListview *ps = DDB_LISTVIEW (gtk_object_get_data (GTK_OBJECT (widget), "owner")); GdkEventScroll *ev = (GdkEventScroll*)event; GtkWidget *range = ps->scrollbar;; - GtkWidget *playlist = ps->playlist; - int h = playlist->allocation.height / rowheight; + GtkWidget *playlist = ps->list; + int h = playlist->allocation.height / ps->rowheight; int size = ps->binding->count (); if (h >= size) { size = 0; @@ -570,12 +570,12 @@ ddb_listview_vscroll_value_changed (GtkRange *widget, DdbListview *ps = DDB_LISTVIEW (gtk_object_get_data (GTK_OBJECT (widget), "owner")); int newscroll = gtk_range_get_value (GTK_RANGE (widget)); if (newscroll != ps->scrollpos) { - GtkWidget *widget = ps->playlist; + GtkWidget *widget = ps->list; int di = newscroll - ps->scrollpos; int d = abs (di); if (d < ps->nvisiblerows) { if (di > 0) { - draw_drawable (ps->backbuf, widget->style->black_gc, ps->backbuf, 0, d * rowheight, 0, 0, widget->allocation.width, widget->allocation.height-d * rowheight); + draw_drawable (ps->backbuf, widget->style->black_gc, ps->backbuf, 0, d * ps->rowheight, 0, 0, widget->allocation.width, widget->allocation.height-d * ps->rowheight); int i; ps->scrollpos = newscroll; int start = ps->nvisiblerows-d-1; @@ -587,7 +587,7 @@ ddb_listview_vscroll_value_changed (GtkRange *widget, } } else { - draw_drawable (ps->backbuf, widget->style->black_gc, ps->backbuf, 0, 0, 0, d*rowheight, widget->allocation.width, widget->allocation.height); + draw_drawable (ps->backbuf, widget->style->black_gc, ps->backbuf, 0, 0, 0, d*ps->rowheight, widget->allocation.width, widget->allocation.height); ps->scrollpos = newscroll; int i; for (i = 0; i <= d+1; i++) { @@ -827,8 +827,8 @@ colhdr_anim_swap (DdbListview *pl, int c1, int c2, int x1, int x2) { void ddb_listview_list_setup_vscroll (DdbListview *ps) { - GtkWidget *playlist = ps->playlist; - int h = playlist->allocation.height / rowheight; + GtkWidget *playlist = ps->list; + int h = playlist->allocation.height / ps->rowheight; int cnt = ps->binding->count (); int size = cnt; if (h >= size) { @@ -856,7 +856,7 @@ ddb_listview_list_setup_vscroll (DdbListview *ps) { void ddb_listview_list_setup_hscroll (DdbListview *ps) { - GtkWidget *playlist = ps->playlist; + GtkWidget *playlist = ps->list; int w = playlist->allocation.width; int size = 0; DdbListviewColIter c; @@ -864,8 +864,8 @@ ddb_listview_list_setup_hscroll (DdbListview *ps) { size += ps->binding->col_get_width (c); } ps->totalwidth = size; - if (ps->totalwidth < ps->playlist->allocation.width) { - ps->totalwidth = ps->playlist->allocation.width; + if (ps->totalwidth < ps->list->allocation.width) { + ps->totalwidth = ps->list->allocation.width; } if (w >= size) { size = 0; @@ -899,11 +899,11 @@ ddb_listview_list_render_row (DdbListview *ps, int row, DdbListviewIter it) { void ddb_listview_list_expose_row (DdbListview *ps, int row, DdbListviewIter it) { int x, y, w, h; - GtkWidget *widget = ps->playlist; + GtkWidget *widget = ps->list; x = 0; - y = (row - ps->scrollpos) * rowheight; + y = (row - ps->scrollpos) * ps->rowheight; w = widget->allocation.width; - h = rowheight; + h = ps->rowheight; draw_drawable (widget->window, widget->style->black_gc, ps->backbuf, x, y, x, y, w, h); } @@ -927,16 +927,16 @@ ddb_listview_list_render_row_background (DdbListview *ps, int row, DdbListviewIt int x = -ps->hscrollpos; int w = ps->totalwidth; // clear area -- workaround for New Wave theme - if (ps->playlist->style->bg_gc[GTK_STATE_NORMAL]) { - gdk_draw_rectangle (ps->backbuf, ps->playlist->style->bg_gc[GTK_STATE_NORMAL], TRUE, 0, row * rowheight - ps->scrollpos * rowheight, ps->playlist->allocation.width, rowheight); + if (ps->list->style->bg_gc[GTK_STATE_NORMAL]) { + gdk_draw_rectangle (ps->backbuf, ps->list->style->bg_gc[GTK_STATE_NORMAL], TRUE, 0, row * ps->rowheight - ps->scrollpos * ps->rowheight, ps->list->allocation.width, ps->rowheight); } - gtk_paint_flat_box (treeview->style, ps->backbuf, (it && ps->binding->is_selected(it)) ? GTK_STATE_SELECTED : GTK_STATE_NORMAL, GTK_SHADOW_NONE, NULL, treeview, (row & 1) ? "cell_even_ruled" : "cell_odd_ruled", x, row * rowheight - ps->scrollpos * rowheight, w, rowheight); + gtk_paint_flat_box (treeview->style, ps->backbuf, (it && ps->binding->is_selected(it)) ? GTK_STATE_SELECTED : GTK_STATE_NORMAL, GTK_SHADOW_NONE, NULL, treeview, (row & 1) ? "cell_even_ruled" : "cell_odd_ruled", x, row * ps->rowheight - ps->scrollpos * ps->rowheight, w, ps->rowheight); if (row == ps->binding->cursor ()) { // not all gtk engines/themes render focus rectangle in treeviews // but we want it anyway - gdk_draw_rectangle (ps->backbuf, treeview->style->fg_gc[GTK_STATE_NORMAL], FALSE, x, row * rowheight - ps->scrollpos * rowheight, w-1, rowheight-1); + gdk_draw_rectangle (ps->backbuf, treeview->style->fg_gc[GTK_STATE_NORMAL], FALSE, x, row * ps->rowheight - ps->scrollpos * ps->rowheight, w-1, ps->rowheight-1); // gtkstyle focus drawing, for reference -// gtk_paint_focus (treeview->style, ps->backbuf, (it && ps->binding->is_selected(it)) ? GTK_STATE_SELECTED : GTK_STATE_NORMAL, NULL, treeview, "treeview", x, row * rowheight - ps->scrollpos * rowheight, w, rowheight); +// gtk_paint_focus (treeview->style, ps->backbuf, (it && ps->binding->is_selected(it)) ? GTK_STATE_SELECTED : GTK_STATE_NORMAL, NULL, treeview, "treeview", x, row * ps->rowheight - ps->scrollpos * ps->rowheight, w, ps->rowheight); } } @@ -963,7 +963,7 @@ ddb_listview_list_render_row_foreground (DdbListview *ps, int row, DdbListviewIt for (c = ps->binding->col_first (); c; c = ps->binding->col_next (c)) { int cw = ps->binding->col_get_width (c); if (ps->binding->draw_column_data) { - ps->binding->draw_column_data (ps->backbuf, it, row, c, x - ps->hscrollpos, row * rowheight - ps->scrollpos * rowheight, cw, rowheight); + ps->binding->draw_column_data (ps->backbuf, it, row, c, x - ps->hscrollpos, row * ps->rowheight - ps->scrollpos * ps->rowheight, cw, ps->rowheight); } x += cw; } @@ -1027,7 +1027,7 @@ ddb_listview_list_mouse1_pressed (DdbListview *ps, int state, int ex, int ey, do ps->lastpos[0] = ex; ps->lastpos[1] = ey; // select item - int y = ey/rowheight + ps->scrollpos; + int y = ey/ps->rowheight + ps->scrollpos; if (y < 0 || y >= ps->binding->count ()) { y = -1; } @@ -1236,7 +1236,7 @@ ddb_listview_list_scroll_cb (gpointer data) { void ddb_listview_list_mousemove (DdbListview *ps, GdkEventMotion *event) { if (ps->dragwait) { - GtkWidget *widget = ps->playlist; + GtkWidget *widget = ps->list; if (gtk_drag_check_threshold (widget, ps->lastpos[0], event->x, ps->lastpos[1], event->y)) { ps->dragwait = 0; GtkTargetEntry entry = { @@ -1249,7 +1249,7 @@ ddb_listview_list_mousemove (DdbListview *ps, GdkEventMotion *event) { } } else if (ps->areaselect) { - int y = event->y/rowheight + ps->scrollpos; + int y = event->y/ps->rowheight + ps->scrollpos; //if (y != shift_sel_anchor) { int start = min (y, ps->shift_sel_anchor); @@ -1285,7 +1285,7 @@ ddb_listview_list_mousemove (DdbListview *ps, GdkEventMotion *event) { g_idle_add (ddb_listview_list_scroll_cb, ps); } } - else if (event->y > ps->playlist->allocation.height-10) { + else if (event->y > ps->list->allocation.height-10) { ps->scroll_mode = 0; ps->scroll_pointer_y = event->y; ps->scroll_direction = 1; @@ -1309,7 +1309,7 @@ void ddb_listview_list_set_hscroll (DdbListview *ps, int newscroll) { if (newscroll != ps->hscrollpos) { ps->hscrollpos = newscroll; - GtkWidget *widget = ps->playlist; + GtkWidget *widget = ps->list; ddb_listview_header_render (ps); ddb_listview_header_expose (ps, 0, 0, ps->header->allocation.width, ps->header->allocation.height); ddb_listview_list_render (ps, 0, 0, widget->allocation.width, widget->allocation.height); @@ -1361,12 +1361,8 @@ ddb_listview_handle_keypress (DdbListview *ps, int keyval, int state) { cursor = 0; } else if (keyval == GDK_Delete) { - cursor = deadbeef->pl_delete_selected (); - if (cursor >= ps->binding->count ()) { - cursor = ps->binding->count ()-1; - } - main_refresh (); - search_refresh (); + ps->binding->delete_selected (); + cursor = ps->binding->cursor (); } else { return 0 ; @@ -1420,10 +1416,10 @@ ddb_listview_handle_keypress (DdbListview *ps, int keyval, int state) { void ddb_listview_list_track_dragdrop (DdbListview *ps, int y) { - GtkWidget *widget = ps->playlist; + GtkWidget *widget = ps->list; if (ps->drag_motion_y != -1) { // erase previous track - draw_drawable (widget->window, widget->style->black_gc, ps->backbuf, 0, ps->drag_motion_y * rowheight-3, 0, ps->drag_motion_y * rowheight-3, widget->allocation.width, 7); + draw_drawable (widget->window, widget->style->black_gc, ps->backbuf, 0, ps->drag_motion_y * ps->rowheight-3, 0, ps->drag_motion_y * ps->rowheight-3, widget->allocation.width, 7); } if (y == -1) { @@ -1431,12 +1427,12 @@ ddb_listview_list_track_dragdrop (DdbListview *ps, int y) { return; } draw_begin ((uintptr_t)widget->window); - ps->drag_motion_y = y / rowheight; + ps->drag_motion_y = y / ps->rowheight; theme_set_fg_color (COLO_DRAGDROP_MARKER); - draw_rect (0, ps->drag_motion_y * rowheight-1, widget->allocation.width, 3, 1); - draw_rect (0, ps->drag_motion_y * rowheight-3, 3, 7, 1); - draw_rect (widget->allocation.width-3, ps->drag_motion_y * rowheight-3, 3, 7, 1); + draw_rect (0, ps->drag_motion_y * ps->rowheight-1, widget->allocation.width, 3, 1); + draw_rect (0, ps->drag_motion_y * ps->rowheight-3, 3, 7, 1); + draw_rect (widget->allocation.width-3, ps->drag_motion_y * ps->rowheight-3, 3, 7, 1); draw_end (); if (y < 10) { ps->scroll_pointer_y = y; @@ -1449,7 +1445,7 @@ ddb_listview_list_track_dragdrop (DdbListview *ps, int y) { g_idle_add (ddb_listview_list_scroll_cb, ps); } } - else if (y > ps->playlist->allocation.height-10) { + else if (y > ps->list->allocation.height-10) { ps->scroll_mode = 1; ps->scroll_pointer_y = y; ps->scroll_direction = 1; @@ -1667,8 +1663,8 @@ ddb_listview_header_motion_notify_event (GtkWidget *widget, // colhdr_anim_swap (ps, c1, c2, x1, x2); // force redraw of everything // ddb_listview_list_setup_hscroll (ps); - ddb_listview_list_render (ps, 0, 0, ps->playlist->allocation.width, ps->playlist->allocation.height); - ddb_listview_list_expose (ps, 0, 0, ps->playlist->allocation.width, ps->playlist->allocation.height); + ddb_listview_list_render (ps, 0, 0, ps->list->allocation.width, ps->list->allocation.height); + ddb_listview_list_expose (ps, 0, 0, ps->list->allocation.width, ps->list->allocation.height); } else { // only redraw that if not animating @@ -1693,8 +1689,8 @@ ddb_listview_header_motion_notify_event (GtkWidget *widget, ddb_listview_list_setup_hscroll (ps); ddb_listview_header_render (ps); ddb_listview_header_expose (ps, 0, 0, ps->header->allocation.width, ps->header->allocation.height); - ddb_listview_list_render (ps, 0, 0, ps->playlist->allocation.width, ps->playlist->allocation.height); - ddb_listview_list_expose (ps, 0, 0, ps->playlist->allocation.width, ps->playlist->allocation.height); + ddb_listview_list_render (ps, 0, 0, ps->list->allocation.width, ps->list->allocation.height); + ddb_listview_list_expose (ps, 0, 0, ps->list->allocation.width, ps->list->allocation.height); } else { int x = -ps->hscrollpos; @@ -1839,45 +1835,8 @@ ddb_listview_header_button_release_event (GtkWidget *widget, return FALSE; } -// FIXME: port +// FIXME: port (maybe) #if 0 -void -gtkpl_add_dir (DdbListview *ps, char *folder) { - g_idle_add (progress_show_idle, NULL); - deadbeef->pl_add_dir (folder, gtkpl_add_file_info_cb, NULL); - g_free (folder); - g_idle_add (progress_hide_idle, NULL); -} - -static void -gtkpl_adddir_cb (gpointer data, gpointer userdata) { - deadbeef->pl_add_dir (data, gtkpl_add_file_info_cb, userdata); - g_free (data); -} - -void -gtkpl_add_dirs (DdbListview *ps, GSList *lst) { - g_idle_add (progress_show_idle, NULL); - g_slist_foreach(lst, gtkpl_adddir_cb, NULL); - g_slist_free (lst); - g_idle_add (progress_hide_idle, NULL); -} - -static void -gtkpl_addfile_cb (gpointer data, gpointer userdata) { - deadbeef->pl_add_file (data, gtkpl_add_file_info_cb, userdata); - g_free (data); -} - -void -gtkpl_add_files (GSList *lst) { - g_idle_add (progress_show_idle, NULL); - g_slist_foreach(lst, gtkpl_addfile_cb, NULL); - g_slist_free (lst); - g_idle_add (progress_hide_idle, NULL); -} -#endif - int gtkpl_get_idx_of (DdbListview *ps, DdbListviewIter it) { DdbListviewIter c = ps->binding->head (); @@ -1908,19 +1867,6 @@ gtkpl_get_for_idx (DdbListview *ps, int idx) { } return it; } - -void -playlist_refresh (void) { - extern DdbListview main_playlist; - DdbListview *ps = &main_playlist; - ddb_listview_list_setup_vscroll (ps); - GtkWidget *widget = ps->playlist; - ddb_listview_list_render (ps, 0, 0, widget->allocation.width, widget->allocation.height); - ddb_listview_list_expose (ps, 0, 0, widget->allocation.width, widget->allocation.height); - search_refresh (); -} - -#if 0 void gtk_pl_redraw_item_everywhere (DdbListviewIter it) { DdbListview *pl = &search_playlist; @@ -1996,7 +1942,7 @@ ddb_listview_list_set_cursor (DdbListview *pl, int cursor) { } gboolean -on_playlist_button_press_event (GtkWidget *widget, +ddb_listview_list_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { @@ -2006,7 +1952,7 @@ on_playlist_button_press_event (GtkWidget *widget, } else if (event->button == 3) { // get item under cursor - int y = event->y / rowheight + ps->scrollpos; + int y = event->y / ps->rowheight + ps->scrollpos; if (y < 0 || y >= ps->binding->count ()) { y = -1; } @@ -2015,33 +1961,41 @@ on_playlist_button_press_event (GtkWidget *widget, // clicked empty space -- deselect everything and show insensitive menu ps->binding->set_cursor (-1); it = ps->binding->head (); + int idx = 0; while (it) { ps->binding->select (it, 0); + ddb_listview_draw_row (ps, idx, it); + ps->binding->selection_changed (it, idx); it = PL_NEXT (it); + idx++; } - playlist_refresh (); // no menu } else { if (!ps->binding->is_selected (it)) { // item is unselected -- reset selection and select this DdbListviewIter it2 = ps->binding->head (); + int idx = 0; while (it2) { if (ps->binding->is_selected (it2) && it2 != it) { ps->binding->select (it2, 0); + ddb_listview_draw_row (ps, idx, it2); + ps->binding->selection_changed (it2, idx); } else if (it2 == it) { ps->binding->set_cursor (y); ps->binding->select (it2, 1); + ddb_listview_draw_row (ps, idx, it2); + ps->binding->selection_changed (it2, idx); } it2 = PL_NEXT (it2); + idx++; } - playlist_refresh (); } else { // something is selected; move cursor but keep selection ps->binding->set_cursor (y); - playlist_refresh (); + ddb_listview_draw_row (ps, y, it); } { int inqueue = deadbeef->pl_playqueue_test (it); @@ -2107,7 +2061,7 @@ on_playlist_button_press_event (GtkWidget *widget, } gboolean -on_playlist_button_release_event (GtkWidget *widget, +ddb_listview_list_button_release_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { @@ -2128,4 +2082,13 @@ ddb_listview_motion_notify_event (GtkWidget *widget, return FALSE; } +void +ddb_listview_set_binding (DdbListview *listview, DdbListviewBinding *binding) { + listview->binding = binding; +} + +DdbListviewIter +ddb_listview_get_iter_from_coord (DdbListview *listview, int x, int y) { + return listview->binding->get_for_idx ((y + listview->scrollpos)/listview->rowheight); +} diff --git a/plugins/gtkui/gtkplaylist.h b/plugins/gtkui/ddblistview.h index 239bd9e5..2fd1189f 100644 --- a/plugins/gtkui/gtkplaylist.h +++ b/plugins/gtkui/ddblistview.h @@ -15,8 +15,8 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef __GTKPLAYLIST_H -#define __GTKPLAYLIST_H +#ifndef __DDBLISTVIEW_H +#define __DDBLISTVIEW_H #include <gtk/gtk.h> #include <stdint.h> @@ -29,23 +29,6 @@ enum { TARGET_SAMEWIDGET, }; -// color scheme constants -enum { - COLO_PLAYLIST_CURSOR, - COLO_PLAYLIST_ODD, - COLO_PLAYLIST_EVEN, - COLO_PLAYLIST_SEL_ODD, - COLO_PLAYLIST_SEL_EVEN, - COLO_PLAYLIST_TEXT, - COLO_PLAYLIST_SEL_TEXT, - COLO_SEEKBAR_BACK, - COLO_SEEKBAR_FRONT, - COLO_VOLUMEBAR_BACK, - COLO_VOLUMEBAR_FRONT, - COLO_DRAGDROP_MARKER, - COLO_COUNT -}; - G_BEGIN_DECLS #define DDB_TYPE_LISTVIEW (ddb_listview_get_type ()) @@ -102,18 +85,13 @@ typedef struct { // callbacks void (*draw_column_data) (GdkDrawable *drawable, DdbListviewIter iter, int idx, DdbListviewColIter column, int x, int y, int width, int height); -// void (*edit_column) (DdbListviewColIter); -// void (*add_column) (DdbListviewColIter); -// void (*remove_column) (DdbListviewColIter); void (*list_context_menu) (DdbListview *listview, DdbListviewIter iter, int idx); void (*header_context_menu) (DdbListview *listview, DdbListviewColIter c); void (*handle_doubleclick) (DdbListview *listview, DdbListviewIter iter, int idx); void (*selection_changed) (DdbListviewIter it, int idx); + void (*delete_selected) (void); } DdbListviewBinding; -// structure of this kind must be set as user data for playlist, header and scrollbar widgets -// pointer to this structure must be passed too all functions that -// implement playlist functionality (like this pointer) struct _DdbListview { GtkTable parent; @@ -121,7 +99,7 @@ struct _DdbListview { DdbListviewBinding *binding; // cached gtk/gdk object pointers - GtkWidget *playlist; + GtkWidget *list; GtkWidget *header; GtkWidget *scrollbar; GtkWidget *hscrollbar; @@ -133,7 +111,7 @@ struct _DdbListview { // // parameters // int (*get_count)(void); // function pointer to get number of tracks // int iterator; // index into next array of DB_playItem_t struct - int lastpos[2]; // last mouse position (for playlist widget) + int lastpos[2]; // last mouse position (for list widget) // current state int scrollpos; int hscrollpos; @@ -182,11 +160,18 @@ struct _DdbListviewClass { GtkType ddb_listview_get_type(void); GtkWidget * ddb_listview_new(); -void ddb_listview_set_binding (DdbListview *listview, DdbListviewBinding *binding); -void ddb_listview_draw_row (DdbListview *listview, int idx, DdbListviewIter iter); -int ddb_listview_get_vscroll_pos (DdbListview *listview); -int ddb_listview_get_hscroll_pos (DdbListview *listview); -DdbListviewIter ddb_listview_get_iter_from_coord (DdbListview *listview, int x, int y); +void +ddb_listview_set_binding (DdbListview *listview, DdbListviewBinding *binding); +void +ddb_listview_draw_row (DdbListview *listview, int idx, DdbListviewIter iter); +int +ddb_listview_get_vscroll_pos (DdbListview *listview); +int +ddb_listview_get_hscroll_pos (DdbListview *listview); +DdbListviewIter +ddb_listview_get_iter_from_coord (DdbListview *listview, int x, int y); +int +ddb_listview_handle_keypress (DdbListview *ps, int keyval, int state); enum { DDB_REFRESH_COLUMNS = 1, @@ -201,6 +186,7 @@ void ddb_listview_refresh (DdbListview *listview, uint32_t flags); G_END_DECLS +#if 0 //extern DdbListview main_playlist; //extern DdbListview search_playlist; @@ -279,16 +265,13 @@ void gtkpl_add_dir (DdbListview *ps, char *folder); void -gtkpl_add_dirs (GSList *lst); - -void gtkpl_add_files (GSList *lst); -int -gtkpl_get_idx_of (DdbListview *ps, DdbListviewIter it); - -DdbListviewIter -gtkpl_get_for_idx (DdbListview *ps, int idx); +//int +//gtkpl_get_idx_of (DdbListview *ps, DdbListviewIter it); +// +//DdbListviewIter +//gtkpl_get_for_idx (DdbListview *ps, int idx); //// this functions take value from passed playlist, that's why it's here //void @@ -351,5 +334,6 @@ gtkpl_set_cursor (DdbListview *pl, int cursor); void main_refresh (void); +#endif -#endif // __GTKPLAYLIST_H +#endif // __DDBLISTVIEW_H diff --git a/plugins/gtkui/fileman.c b/plugins/gtkui/fileman.c index 452e14f7..340db924 100644 --- a/plugins/gtkui/fileman.c +++ b/plugins/gtkui/fileman.c @@ -3,7 +3,73 @@ #include <stdlib.h> #include <ctype.h> #include "gtkui.h" -#include "gtkplaylist.h" +#include "ddblistview.h" +#include "progress.h" + +static gboolean +progress_show_idle (gpointer data) { + progress_show (); + return FALSE; +} + +static gboolean +set_progress_text_idle (gpointer data) { + const char *text = (const char *)data; + progress_settext (text); + return FALSE; +} + +int +gtkpl_add_file_info_cb (DB_playItem_t *it, void *data) { + if (progress_is_aborted ()) { + return -1; + } + g_idle_add (set_progress_text_idle, it->fname); + return 0; +} + +static gboolean +progress_hide_idle (gpointer data) { + progress_hide (); + playlist_refresh (); + return FALSE; +} + +void +gtkpl_add_dir (DdbListview *ps, char *folder) { + g_idle_add (progress_show_idle, NULL); + deadbeef->pl_add_dir (folder, gtkpl_add_file_info_cb, NULL); + g_free (folder); + g_idle_add (progress_hide_idle, NULL); +} + +static void +gtkpl_adddir_cb (gpointer data, gpointer userdata) { + deadbeef->pl_add_dir (data, gtkpl_add_file_info_cb, userdata); + g_free (data); +} + +void +gtkpl_add_dirs (GSList *lst) { + g_idle_add (progress_show_idle, NULL); + g_slist_foreach(lst, gtkpl_adddir_cb, NULL); + g_slist_free (lst); + g_idle_add (progress_hide_idle, NULL); +} + +static void +gtkpl_addfile_cb (gpointer data, gpointer userdata) { + deadbeef->pl_add_file (data, gtkpl_add_file_info_cb, userdata); + g_free (data); +} + +void +gtkpl_add_files (GSList *lst) { + g_idle_add (progress_show_idle, NULL); + g_slist_foreach(lst, gtkpl_addfile_cb, NULL); + g_slist_free (lst); + g_idle_add (progress_hide_idle, NULL); +} static void add_dirs_worker (void *data) { @@ -83,38 +149,6 @@ strcopy_special (char *dest, const char *src, int len) { *dest = 0; } -static gboolean -set_progress_text_idle (gpointer data) { - const char *text = (const char *)data; - progress_settext (text); - return FALSE; -} - -int -gtkpl_add_file_info_cb (DdbListviewIter it, void *data) { -// FIXME: port -#if 0 - if (progress_is_aborted ()) { - return -1; - } - g_idle_add (set_progress_text_idle, it->fname); -#endif - return 0; -} - -static gboolean -progress_show_idle (gpointer data) { - progress_show (); - return FALSE; -} - -static gboolean -progress_hide_idle (gpointer data) { - progress_hide (); - playlist_refresh (); - return FALSE; -} - void gtkpl_add_fm_dropped_files (char *ptr, int length, int drop_y) { // FIXME: port diff --git a/plugins/gtkui/gtkui.c b/plugins/gtkui/gtkui.c index 6c619083..da7cef6e 100644 --- a/plugins/gtkui/gtkui.c +++ b/plugins/gtkui/gtkui.c @@ -29,7 +29,7 @@ #include <math.h> #include <sys/time.h> #include "gtkui.h" -#include "gtkplaylist.h" +#include "ddblistview.h" #include "search.h" #include "progress.h" #include "interface.h" @@ -115,7 +115,6 @@ gtkpl_init (void) { play16_pixbuf = draw_load_pixbuf ("play_16.png"); pause16_pixbuf = draw_load_pixbuf ("pause_16.png"); buffering16_pixbuf = draw_load_pixbuf ("buffering_16.png"); - rowheight = draw_get_font_size () + 12; memcpy (colo_current, colo_white_blue, sizeof (colo_current)); theme_treeview = gtk_tree_view_new (); GTK_WIDGET_UNSET_FLAGS (theme_treeview, GTK_CAN_FOCUS); @@ -355,28 +354,27 @@ gtkui_on_activate (DB_event_t *ev, uintptr_t data) { } void -redraw_queued_tracks (DdbListview *pl) { -// FIXME: port -#if 0 - DdbListviewIter it = deadbeef->pl_get_for_idx_and_iter (pl->scrollpos, pl->iterator); - int i = pl->scrollpos; +redraw_queued_tracks (DdbListview *pl, int list) { + DdbListviewIter it = deadbeef->pl_get_for_idx_and_iter (pl->scrollpos, list); + int i = ddb_listview_get_vscroll_pos (pl); while (it && i < pl->scrollpos + pl->nvisiblerows) { if (deadbeef->pl_playqueue_test (it) != -1) { - gtkpl_redraw_pl_row (pl, i, it); + ddb_listview_draw_row (pl, i, it); } - DdbListviewIter next = PL_NEXT (it, pl->iterator); - UNREF (it); + DdbListviewIter next = deadbeef->pl_get_next (it, list); + deadbeef->pl_item_unref (it); it = next; i++; } - UNREF (it); -#endif + if (it) { + deadbeef->pl_item_unref (it); + } } static gboolean redraw_queued_tracks_cb (gpointer nothing) { - redraw_queued_tracks (DDB_LISTVIEW (lookup_widget (mainwin, "playlist"))); - redraw_queued_tracks (DDB_LISTVIEW (lookup_widget (searchwin, "searchlist"))); + redraw_queued_tracks (DDB_LISTVIEW (lookup_widget (mainwin, "playlist")), PL_MAIN); + redraw_queued_tracks (DDB_LISTVIEW (lookup_widget (searchwin, "searchlist")), PL_SEARCH); return FALSE; } @@ -399,6 +397,15 @@ gtkui_on_songchanged (DB_event_trackchange_t *ev, uintptr_t data) { return 0; } +void +set_tray_tooltip (const char *text) { +#if (GTK_MINOR_VERSION < 16) + gtk_status_icon_set_tooltip (trayicon, text); +#else + gtk_status_icon_set_tooltip_text (trayicon, text); +#endif +} + struct trackinfo_t { int index; DB_playItem_t *track; @@ -458,6 +465,13 @@ gtkui_on_paused (DB_event_state_t *ev, uintptr_t data) { g_idle_add (paused_cb, NULL); } +void +playlist_refresh (void) { + DdbListview *ps = DDB_LISTVIEW (lookup_widget (mainwin, "playlist")); + ddb_listview_refresh (ps, DDB_REFRESH_LIST | DDB_REFRESH_VSCROLL | DDB_EXPOSE_LIST); + search_refresh (); +} + static gboolean playlistchanged_cb (gpointer none) { playlist_refresh (); @@ -1072,6 +1086,115 @@ main_header_context_menu (DdbListview *ps, DdbListviewColIter c) { gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, ps, 3, gtk_get_current_event_time()); } +void +main_refresh (void) { + if (mainwin && GTK_WIDGET_VISIBLE (mainwin)) { + DdbListview *pl = DDB_LISTVIEW (lookup_widget (mainwin, "playlist")); + ddb_listview_refresh (pl, DDB_REFRESH_VSCROLL | DDB_REFRESH_LIST | DDB_EXPOSE_LIST); + } +} + +// FIXME: wrong place for these functions +void +on_clear1_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + deadbeef->pl_clear (); + main_refresh (); + search_refresh (); +} + +void +on_remove1_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + int cursor = deadbeef->pl_delete_selected (); + main_refresh (); + search_refresh (); +} + + +void +on_crop1_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + DdbListview *pl = DDB_LISTVIEW (lookup_widget (mainwin, "playlist")); + deadbeef->pl_crop_selected (); + main_refresh (); + search_refresh (); +} + +void +on_remove2_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + GtkWidget *widget = GTK_WIDGET (menuitem); + int cursor = deadbeef->pl_delete_selected (); + main_refresh (); + search_refresh (); +} + +void +on_playlist_load_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + GtkWidget *dlg = gtk_file_chooser_dialog_new ("Load Playlist", GTK_WINDOW (mainwin), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); + + GtkFileFilter* flt; + flt = gtk_file_filter_new (); + gtk_file_filter_set_name (flt, "DeaDBeeF playlist files (*.dbpl)"); + gtk_file_filter_add_pattern (flt, "*.dbpl"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dlg), flt); + + if (gtk_dialog_run (GTK_DIALOG (dlg)) == GTK_RESPONSE_OK) + { + gchar *fname = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dlg)); + gtk_widget_destroy (dlg); + if (fname) { + /*int res = */deadbeef->pl_load (fname); + g_free (fname); + main_refresh (); + search_refresh (); + } + } + else { + gtk_widget_destroy (dlg); + } +} + +void +main_delete_selected (void) { + deadbeef->pl_delete_selected (); + main_refresh (); + search_refresh (); +} + +void +on_add_audio_cd_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + deadbeef->pl_add_file ("all.cda", NULL, NULL); + playlist_refresh (); +} + +void +on_add_location_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + GtkWidget *dlg= create_addlocationdlg (); + int res = gtk_dialog_run (GTK_DIALOG (dlg)); + if (res == GTK_RESPONSE_OK) { + GtkEntry *entry = GTK_ENTRY (lookup_widget (dlg, "addlocation_entry")); + if (entry) { + const char *text = gtk_entry_get_text (entry); + if (text) { + deadbeef->pl_add_file (text, NULL, NULL); + playlist_refresh (); + } + } + } + gtk_widget_destroy (dlg); +} DdbListviewBinding main_binding = { // rows .count = main_get_count, @@ -1112,6 +1235,7 @@ DdbListviewBinding main_binding = { .handle_doubleclick = main_handle_doubleclick, .selection_changed = main_selection_changed, .header_context_menu = main_header_context_menu, + .delete_selected = main_delete_selected, }; void @@ -1252,14 +1376,6 @@ gtkpl_songchanged (DdbListview *ps, int from, int to) { #endif } -void -main_refresh (void) { - if (mainwin && GTK_WIDGET_VISIBLE (mainwin)) { - DdbListview *pl = DDB_LISTVIEW (lookup_widget (mainwin, "playlist")); - ddb_listview_refresh (pl, DDB_REFRESH_VSCROLL | DDB_REFRESH_LIST | DDB_EXPOSE_LIST); - } -} - #if HAVE_NOTIFY static NotifyNotification* notification; #endif @@ -1298,7 +1414,7 @@ update_win_title_idle (gpointer data) { if (to >= 0) { DB_playItem_t *it = deadbeef->pl_get_for_idx (to); if (it) { // it might have been deleted after event was sent - gtkpl_current_track_changed (it); + current_track_changed (it); deadbeef->pl_item_unref (it); } } @@ -1323,15 +1439,6 @@ redraw_seekbar_cb (gpointer nothing) { } void -set_tray_tooltip (const char *text) { -#if (GTK_MINOR_VERSION < 16) - gtk_status_icon_set_tooltip (trayicon, text); -#else - gtk_status_icon_set_tooltip_text (trayicon, text); -#endif -} - -void gtkui_thread (void *ctx) { // let's start some gtk g_thread_init (NULL); diff --git a/plugins/gtkui/gtkui.h b/plugins/gtkui/gtkui.h index 2031b502..6dd2c412 100644 --- a/plugins/gtkui/gtkui.h +++ b/plugins/gtkui/gtkui.h @@ -49,4 +49,30 @@ plugin_configure (GtkWidget *parentwin, DB_plugin_t *p); void preferences_fill_soundcards (void); +// color scheme constants +enum { + COLO_PLAYLIST_CURSOR, + COLO_PLAYLIST_ODD, + COLO_PLAYLIST_EVEN, + COLO_PLAYLIST_SEL_ODD, + COLO_PLAYLIST_SEL_EVEN, + COLO_PLAYLIST_TEXT, + COLO_PLAYLIST_SEL_TEXT, + COLO_SEEKBAR_BACK, + COLO_SEEKBAR_FRONT, + COLO_VOLUMEBAR_BACK, + COLO_VOLUMEBAR_FRONT, + COLO_DRAGDROP_MARKER, + COLO_COUNT +}; + +void +theme_set_cairo_source_rgb (cairo_t *cr, int col); + +void +theme_set_fg_color (int col); + +void +theme_set_bg_color (int col); + #endif diff --git a/plugins/gtkui/search.c b/plugins/gtkui/search.c index ef9879cc..c7e8cb3b 100644 --- a/plugins/gtkui/search.c +++ b/plugins/gtkui/search.c @@ -30,7 +30,7 @@ #include "support.h" #include "search.h" -#include "gtkplaylist.h" +#include "ddblistview.h" #include "../../deadbeef.h" #define min(x,y) ((x)<(y)?(x):(y)) |