diff options
author | waker <wakeroid@gmail.com> | 2009-07-04 03:48:57 +0200 |
---|---|---|
committer | waker <wakeroid@gmail.com> | 2009-07-04 03:48:57 +0200 |
commit | 6f16e4e363936722d7f3c3b819f787e947260310 (patch) | |
tree | f222359003da6571d866595a924053910421382e | |
parent | 56ccf563e1de7068e414df1d05f0dd015cd44f7a (diff) |
playlist scrolling
-rw-r--r-- | callbacks.c | 48 | ||||
-rw-r--r-- | callbacks.h | 4 | ||||
-rw-r--r-- | deadbeef.glade | 40 | ||||
-rw-r--r-- | interface.c | 17 |
4 files changed, 93 insertions, 16 deletions
diff --git a/callbacks.c b/callbacks.c index 9470049e..97194825 100644 --- a/callbacks.c +++ b/callbacks.c @@ -18,7 +18,7 @@ extern GtkWidget *mainwin; static GdkPixmap *backbuf; static int rowheight = 12; -#define trackerscroll 0 +int trackerscroll = 0; static int playlist_row = -1; static double playlist_clicktime = 0; static double ps_lastpos[2]; @@ -29,7 +29,23 @@ addfile_func (gpointer data, gpointer userdata) { g_free (data); } - void +static void +setup_ps_scrollbar (void) { + GtkWidget *playlist = lookup_widget (mainwin, "playlist"); + int h = playlist->allocation.height / rowheight; + int size = ps_getcount (); + if (h >= size) { + size = 0; + } + GtkWidget *scroll = lookup_widget (mainwin, "playscroll"); + printf ("%d\n", size); +// gtk_range_set_range (GTK_RANGE (scroll), 0, size); +// gtk_range_set_increments (GTK_RANGE (scroll), 1, h); + GtkAdjustment *adj = (GtkAdjustment*)gtk_adjustment_new (gtk_range_get_value (GTK_RANGE (scroll)), 0, size, 1, h, h); + gtk_range_set_adjustment (GTK_RANGE (scroll), adj); +} + +void on_addbtn_clicked (GtkButton *button, gpointer user_data) { @@ -56,6 +72,7 @@ on_addbtn_clicked (GtkButton *button, g_slist_free (lst); } gtk_widget_destroy (dlg); + setup_ps_scrollbar (); } @@ -89,6 +106,7 @@ on_playlist_configure_event (GtkWidget *widget, GdkEventConfigure *event, gpointer user_data) { + setup_ps_scrollbar (); if (backbuf) { g_object_unref (backbuf); } @@ -113,15 +131,12 @@ draw_ps_row_back (GdkDrawable *drawable, cairo_t *cr, int row) { } 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_set_source_rgb (cr, 0.88, 0.88, 0.88); 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_set_source_rgb (cr, 0.77, 0.77, 0.77); cairo_rectangle (cr, 0, row * rowheight - trackerscroll * rowheight, width, rowheight); cairo_fill (cr); } @@ -139,13 +154,18 @@ draw_ps_row_back (GdkDrawable *drawable, cairo_t *cr, int row) { 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) { + if (row == playlist_row) { + cairo_set_source_rgb (cr, 1, 1, 1); + } + else { + cairo_set_source_rgb (cr, 0, 0, 0); + } text_draw (cr, 0, row * rowheight - trackerscroll * rowheight, it->displayname); } @@ -238,7 +258,7 @@ on_playlist_button_press_event (GtkWidget *widget, ps_lastpos[1] = event->y; // select item int y = event->y/rowheight - trackerscroll; - if (y < 0 && y >= ps_getcount ()) { + if (y < 0 || y >= ps_getcount ()) { y = -1; } @@ -275,3 +295,13 @@ on_playlist_button_press_event (GtkWidget *widget, return FALSE; } + +void +on_playscroll_value_changed (GtkRange *range, + gpointer user_data) +{ + trackerscroll = gtk_range_get_value (GTK_RANGE (range)); + GtkWidget *playlist = lookup_widget (mainwin, "playlist"); + draw_playlist (playlist, 0, 0, playlist->allocation.width, playlist->allocation.height); +} + diff --git a/callbacks.h b/callbacks.h index d828168f..da43fd9c 100644 --- a/callbacks.h +++ b/callbacks.h @@ -35,3 +35,7 @@ gboolean on_playlist_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); + +void +on_playscroll_value_changed (GtkRange *range, + gpointer user_data); diff --git a/deadbeef.glade b/deadbeef.glade index 088e16ef..73da0a0f 100644 --- a/deadbeef.glade +++ b/deadbeef.glade @@ -247,13 +247,41 @@ </child> <child> - <widget class="GtkDrawingArea" id="playlist"> + <widget class="GtkHBox" id=" "> <property name="visible">True</property> - <property name="events">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</property> - <signal name="configure_event" handler="on_playlist_configure_event" last_modification_time="Sat, 04 Jul 2009 00:03:23 GMT"/> - <signal name="expose_event" handler="on_playlist_expose_event" last_modification_time="Sat, 04 Jul 2009 00:03:29 GMT"/> - <signal name="realize" handler="on_playlist_realize" last_modification_time="Sat, 04 Jul 2009 00:03:36 GMT"/> - <signal name="button_press_event" handler="on_playlist_button_press_event" last_modification_time="Sat, 04 Jul 2009 00:41:38 GMT"/> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkDrawingArea" id="playlist"> + <property name="visible">True</property> + <property name="events">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</property> + <signal name="configure_event" handler="on_playlist_configure_event" last_modification_time="Sat, 04 Jul 2009 00:03:23 GMT"/> + <signal name="expose_event" handler="on_playlist_expose_event" last_modification_time="Sat, 04 Jul 2009 00:03:29 GMT"/> + <signal name="realize" handler="on_playlist_realize" last_modification_time="Sat, 04 Jul 2009 00:03:36 GMT"/> + <signal name="button_press_event" handler="on_playlist_button_press_event" last_modification_time="Sat, 04 Jul 2009 00:41:38 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkVScrollbar" id="playscroll"> + <property name="visible">True</property> + <property name="update_policy">GTK_UPDATE_CONTINUOUS</property> + <property name="inverted">False</property> + <property name="adjustment">0 0 1 1 0 0</property> + <signal name="value_changed" handler="on_playscroll_value_changed" last_modification_time="Sat, 04 Jul 2009 01:42:24 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> </widget> <packing> <property name="padding">0</property> diff --git a/interface.c b/interface.c index bf5b494e..38a936e9 100644 --- a/interface.c +++ b/interface.c @@ -46,7 +46,9 @@ create_mainwin (void) GtkWidget *vbox3; GtkWidget *label2; GtkWidget *playpos; + GtkWidget *_; GtkWidget *playlist; + GtkWidget *playscroll; mainwin = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (mainwin), "DeaDBeeF"); @@ -118,11 +120,19 @@ create_mainwin (void) gtk_widget_set_size_request (playpos, 200, -1); gtk_scale_set_draw_value (GTK_SCALE (playpos), FALSE); + _ = gtk_hbox_new (FALSE, 0); + gtk_widget_show (_); + gtk_box_pack_start (GTK_BOX (vbox1), _, TRUE, TRUE, 0); + playlist = gtk_drawing_area_new (); gtk_widget_show (playlist); - gtk_box_pack_start (GTK_BOX (vbox1), playlist, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (_), playlist, TRUE, TRUE, 0); gtk_widget_set_events (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); + playscroll = gtk_vscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 1, 1, 0, 0))); + gtk_widget_show (playscroll); + gtk_box_pack_start (GTK_BOX (_), playscroll, FALSE, FALSE, 0); + g_signal_connect ((gpointer) mainwin, "destroy", G_CALLBACK (gtk_main_quit), NULL); @@ -150,6 +160,9 @@ create_mainwin (void) g_signal_connect ((gpointer) playlist, "button_press_event", G_CALLBACK (on_playlist_button_press_event), NULL); + g_signal_connect ((gpointer) playscroll, "value_changed", + G_CALLBACK (on_playscroll_value_changed), + NULL); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (mainwin, mainwin, "mainwin"); @@ -168,7 +181,9 @@ create_mainwin (void) GLADE_HOOKUP_OBJECT (mainwin, vbox3, "vbox3"); GLADE_HOOKUP_OBJECT (mainwin, label2, "label2"); GLADE_HOOKUP_OBJECT (mainwin, playpos, "playpos"); + GLADE_HOOKUP_OBJECT (mainwin, _, "_"); GLADE_HOOKUP_OBJECT (mainwin, playlist, "playlist"); + GLADE_HOOKUP_OBJECT (mainwin, playscroll, "playscroll"); return mainwin; } |