summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-02-14 16:24:51 +0100
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-02-14 16:24:51 +0100
commit68e0176c1d054ab285d9f2bbaa958e50cf3a5e73 (patch)
treeba65ad2e30e5a7d28585b2d01ebffbe157501fab /plugins
parent4b11bd6042edb71ac3e64c5cbe9b76aa0f732f58 (diff)
playlist refactoring WIP
Diffstat (limited to 'plugins')
-rw-r--r--plugins/gtkui/Makefile.am2
-rw-r--r--plugins/gtkui/callbacks.c127
-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.c100
-rw-r--r--plugins/gtkui/gtkui.c171
-rw-r--r--plugins/gtkui/gtkui.h26
-rw-r--r--plugins/gtkui/search.c2
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))