diff options
author | 2009-07-04 03:06:34 +0200 | |
---|---|---|
committer | 2009-07-04 03:06:34 +0200 | |
commit | 56ccf563e1de7068e414df1d05f0dd015cd44f7a (patch) | |
tree | 16c86ec05830b245f0e05bbfb12c2842ea3ca927 /callbacks.c | |
parent | 4f836e3de6c0a40f7bb29650ae9ae3230bad31b4 (diff) |
thrown in some gui
Diffstat (limited to 'callbacks.c')
-rw-r--r-- | callbacks.c | 277 |
1 files changed, 277 insertions, 0 deletions
diff --git a/callbacks.c b/callbacks.c new file mode 100644 index 00000000..9470049e --- /dev/null +++ b/callbacks.c @@ -0,0 +1,277 @@ +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <gtk/gtk.h> +#include <math.h> + +#include "callbacks.h" +#include "interface.h" +#include "support.h" + +#include "psdl.h" +#include "playlist.h" + +#define min(x,y) ((x)<(y)?(x):(y)) +#define max(x,y) ((x)>(y)?(x):(y)) + +extern GtkWidget *mainwin; +static GdkPixmap *backbuf; +static int rowheight = 12; +#define trackerscroll 0 +static int playlist_row = -1; +static double playlist_clicktime = 0; +static double ps_lastpos[2]; + +static void +addfile_func (gpointer data, gpointer userdata) { + ps_add_file (data); + g_free (data); +} + + void +on_addbtn_clicked (GtkButton *button, + gpointer user_data) +{ + GtkWidget *dlg = gtk_file_chooser_dialog_new ("Add file(s) to 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, "Supported music files"); + gtk_file_filter_add_pattern (flt, "*.ogg"); + gtk_file_filter_add_pattern (flt, "*.mod"); + gtk_file_filter_add_pattern (flt, "*.wav"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dlg), flt); + gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dlg), flt); + flt = gtk_file_filter_new (); + gtk_file_filter_set_name (flt, "Other files (*)"); + gtk_file_filter_add_pattern (flt, "*"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dlg), flt); + gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dlg), TRUE); + + if (gtk_dialog_run (GTK_DIALOG (dlg)) == GTK_RESPONSE_OK) + { + GSList *lst = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER (dlg)); + g_slist_foreach(lst, addfile_func, NULL); + g_slist_free (lst); + } + gtk_widget_destroy (dlg); +} + + +void +on_playbtn_clicked (GtkButton *button, + gpointer user_data) +{ + +} + + +void +on_volume_value_changed (GtkRange *range, + gpointer user_data) +{ + psdl_set_volume (gtk_range_get_value (range) / 100); +} + + +void +on_playpos_value_changed (GtkRange *range, + gpointer user_data) +{ + +} + + +// change properties +gboolean +on_playlist_configure_event (GtkWidget *widget, + GdkEventConfigure *event, + gpointer user_data) +{ + if (backbuf) { + g_object_unref (backbuf); + } + backbuf = gdk_pixmap_new (widget->window, widget->allocation.width, widget->allocation.height, -1); + + return FALSE; +} + +void +draw_ps_row_back (GdkDrawable *drawable, cairo_t *cr, int row) { + // draw background + float w; + int start, end; + int startx, endx; + int width, height; + gdk_drawable_get_size (drawable, &width, &height); + w = width; + if (row == playlist_row) { + cairo_set_source_rgb (cr, 0.22, 0.1, 0.1); + cairo_rectangle (cr, 0, row * rowheight - trackerscroll * rowheight, width, rowheight); + cairo_fill (cr); + } + else { + if (row % 2) { +// cairo_set_source_rgb (cr, 0.22, 0.22, 0.22); +// cairo_rectangle (cr, w, row * rowheight - trackerscroll * rowheight, width - w, rowheight); +// cairo_fill (cr); + cairo_set_source_rgb (cr, 0.33, 0.33, 0.33); + cairo_rectangle (cr, 0, row * rowheight - trackerscroll * rowheight, w, rowheight); + cairo_fill (cr); + } + else { + cairo_set_source_rgb (cr, 0.22, 0.22, 0.22); + cairo_rectangle (cr, 0, row * rowheight - trackerscroll * rowheight, width, rowheight); + cairo_fill (cr); + } + } +// start = min (vbstart[1], vbend[1]); +// end = max (vbstart[1], vbend[1]); +// startx = min (vbstart[0], vbend[0]); +// endx = max (vbstart[0], vbend[0]); +// if (tracker_vbmode && row >= start && row <= end) { // hilight selected notes +// cairo_set_source_rgb (cr, 0.0, 0.44, 0.0); +// cairo_rectangle (cr, startx * colwidth * COL_NUM_CHARS + colwidth * 3, row * rowheight - trackerscroll * rowheight, (endx - startx + 1) * colwidth * COL_NUM_CHARS, rowheight); +// cairo_fill (cr); +// } +} + +static void +text_draw (cairo_t *cr, int x, int y, const char *text) { + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_move_to (cr, x, y+rowheight-3); + cairo_show_text (cr, text); +} + +void +draw_ps_row (GdkDrawable *drawable, cairo_t *cr, int row, playItem_t *it) { + text_draw (cr, 0, row * rowheight - trackerscroll * rowheight, it->displayname); +} + +void +redraw_ps_row (GtkWidget *widget, int row) { + int x, y, w, h; + + x = 0; + y = (row - trackerscroll) * rowheight; + w = widget->allocation.width; + h = rowheight; + + cairo_t *cr; + cr = gdk_cairo_create (backbuf); + if (!cr) { + return; + } + + cairo_select_font_face (cr, "fixed", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, rowheight); + + playItem_t *it = ps_get_for_idx (row); + if (it) { + draw_ps_row_back (backbuf, cr, row); + draw_ps_row (backbuf, cr, row, it); + } + cairo_destroy (cr); + gdk_draw_drawable (widget->window, widget->style->black_gc, backbuf, x, y, x, y, w, h); +} + +void draw_playlist (GtkWidget *widget, int x, int y, int w, int h) { + cairo_t *cr; + cr = gdk_cairo_create (backbuf); + if (!cr) { + return; + } + + cairo_select_font_face (cr, "fixed", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, rowheight); + int row; + int row1; + int row2; + int row2_full; + row1 = max (0, y / rowheight + trackerscroll); + row2 = min (ps_getcount (), (y+h) / rowheight + trackerscroll + 1); + row2_full = (y+h) / rowheight + trackerscroll + 1; + // draw background + for (row = row1; row < row2_full; row++) { + draw_ps_row_back (backbuf, cr, row); + } + playItem_t *it = ps_get_for_idx (trackerscroll); + for (row = row1; row < row2; row++) { + draw_ps_row (backbuf, cr, row, it); + it = it->next; + } + + cairo_destroy (cr); + gdk_draw_drawable (widget->window, widget->style->black_gc, backbuf, x, y, x, y, w, h); +} + + +// redraw +gboolean +on_playlist_expose_event (GtkWidget *widget, + GdkEventExpose *event, + gpointer user_data) +{ + // draw visible area of playlist + draw_playlist (widget, event->area.x, event->area.y, event->area.width, event->area.height); + + return FALSE; +} + + +void +on_playlist_realize (GtkWidget *widget, + gpointer user_data) +{ + +} + + +gboolean +on_playlist_button_press_event (GtkWidget *widget, + GdkEventButton *event, + gpointer user_data) +{ + // remember mouse coords for doubleclick detection + ps_lastpos[0] = event->x; + ps_lastpos[1] = event->y; + // select item + int y = event->y/rowheight - trackerscroll; + if (y < 0 && y >= ps_getcount ()) { + y = -1; + } + + if (playlist_row != y) { + int old = playlist_row; + playlist_row = y; + if (old != -1) { + redraw_ps_row (widget, old); + } + if (playlist_row != -1) { + redraw_ps_row (widget, playlist_row); + } + } + + if (event->time - playlist_clicktime < 0.5 + && fabs(ps_lastpos[0] - event->x) < 3 + && fabs(ps_lastpos[1] - event->y) < 3) { + // doubleclick - play this item + if (playlist_row != -1) { + playItem_t *it = ps_get_for_idx (playlist_row); + if (it) { + psdl_stop (); + psdl_play (it); + } + } + + + // prevent next click to trigger doubleclick + playlist_clicktime = event->time-1; + } + else { + playlist_clicktime = event->time; + } + return FALSE; +} + |