summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2009-07-04 03:48:57 +0200
committerGravatar waker <wakeroid@gmail.com>2009-07-04 03:48:57 +0200
commit6f16e4e363936722d7f3c3b819f787e947260310 (patch)
treef222359003da6571d866595a924053910421382e
parent56ccf563e1de7068e414df1d05f0dd015cd44f7a (diff)
playlist scrolling
-rw-r--r--callbacks.c48
-rw-r--r--callbacks.h4
-rw-r--r--deadbeef.glade40
-rw-r--r--interface.c17
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;
}