summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-09-13 12:18:21 +0200
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-09-13 12:18:21 +0200
commitfb55d80aec8d8c7e6bbab4f6ccff32fadd699e90 (patch)
tree34318f5aa05aad0d36e278f23d14702997d00007
parent9363a7b0cda727042d3e5dfc67ee8094ec993651 (diff)
added horizontal scrolling
-rw-r--r--callbacks.c26
-rw-r--r--callbacks.h8
-rw-r--r--deadbeef.glade177
-rw-r--r--gtkplaylist.c65
-rw-r--r--gtkplaylist.h5
-rw-r--r--interface.c66
6 files changed, 259 insertions, 88 deletions
diff --git a/callbacks.c b/callbacks.c
index 3d13b550..e1f4c821 100644
--- a/callbacks.c
+++ b/callbacks.c
@@ -66,11 +66,13 @@ main_playlist_init (GtkWidget *widget) {
main_playlist.playlist = widget;
main_playlist.header = lookup_widget (mainwin, "header");
main_playlist.scrollbar = lookup_widget (mainwin, "playscroll");
+ main_playlist.hscrollbar = lookup_widget (mainwin, "playhscroll");
main_playlist.pcurr = &playlist_current_ptr;
main_playlist.pcount = &pl_count;
main_playlist.iterator = PL_MAIN;
main_playlist.multisel = 1;
main_playlist.scrollpos = 0;
+ main_playlist.hscrollpos = 0;
main_playlist.row = -1;
main_playlist.clicktime = -1;
main_playlist.nvisiblerows = 0;
@@ -81,6 +83,7 @@ main_playlist_init (GtkWidget *widget) {
gtk_object_set_data (GTK_OBJECT (main_playlist.playlist), "ps", &main_playlist);
gtk_object_set_data (GTK_OBJECT (main_playlist.header), "ps", &main_playlist);
gtk_object_set_data (GTK_OBJECT (main_playlist.scrollbar), "ps", &main_playlist);
+ gtk_object_set_data (GTK_OBJECT (main_playlist.hscrollbar), "ps", &main_playlist);
}
void
@@ -91,6 +94,7 @@ search_playlist_init (GtkWidget *widget) {
search_playlist.playlist = widget;
search_playlist.header = lookup_widget (searchwin, "searchheader");
search_playlist.scrollbar = lookup_widget (searchwin, "searchscroll");
+ search_playlist.hscrollbar = lookup_widget (searchwin, "searchhscroll");
assert (search_playlist.header);
assert (search_playlist.scrollbar);
// main_playlist.pcurr = &search_current;
@@ -98,6 +102,7 @@ search_playlist_init (GtkWidget *widget) {
search_playlist.multisel = 0;
search_playlist.iterator = PL_SEARCH;
search_playlist.scrollpos = 0;
+ search_playlist.hscrollpos = 0;
search_playlist.row = -1;
search_playlist.clicktime = -1;
search_playlist.nvisiblerows = 0;
@@ -108,6 +113,7 @@ search_playlist_init (GtkWidget *widget) {
gtk_object_set_data (GTK_OBJECT (search_playlist.playlist), "ps", &search_playlist);
gtk_object_set_data (GTK_OBJECT (search_playlist.header), "ps", &search_playlist);
gtk_object_set_data (GTK_OBJECT (search_playlist.scrollbar), "ps", &search_playlist);
+ gtk_object_set_data (GTK_OBJECT (search_playlist.hscrollbar), "ps", &search_playlist);
}
// redraw
@@ -1254,3 +1260,23 @@ on_help1_activate (GtkMenuItem *menuitem,
gtk_widget_show (widget);
}
+
+void
+on_playhscroll_value_changed (GtkRange *widget,
+ gpointer user_data)
+{
+ GTKPL_PROLOGUE;
+ int newscroll = gtk_range_get_value (GTK_RANGE (widget));
+ gtkpl_hscroll (ps, newscroll);
+}
+
+
+void
+on_searchhscroll_value_changed (GtkRange *widget,
+ gpointer user_data)
+{
+ GTKPL_PROLOGUE;
+ int newscroll = gtk_range_get_value (GTK_RANGE (widget));
+ gtkpl_hscroll (ps, newscroll);
+}
+
diff --git a/callbacks.h b/callbacks.h
index 31f122fd..120e7488 100644
--- a/callbacks.h
+++ b/callbacks.h
@@ -529,3 +529,11 @@ on_find_activate (GtkMenuItem *menuitem,
void
on_help1_activate (GtkMenuItem *menuitem,
gpointer user_data);
+
+void
+on_playhscroll_value_changed (GtkRange *range,
+ gpointer user_data);
+
+void
+on_searchhscroll_value_changed (GtkRange *range,
+ gpointer user_data);
diff --git a/deadbeef.glade b/deadbeef.glade
index 7c80c293..7f734701 100644
--- a/deadbeef.glade
+++ b/deadbeef.glade
@@ -659,57 +659,73 @@
</child>
<child>
- <widget class="GtkHBox" id=" ">
- <property name="border_width">3</property>
+ <widget class="GtkTable" id="table1">
<property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
<property name="homogeneous">False</property>
- <property name="spacing">0</property>
+ <property name="row_spacing">0</property>
+ <property name="column_spacing">0</property>
<child>
- <widget class="GtkVBox" id="vbox3">
+ <widget class="GtkHBox" id=" ">
+ <property name="border_width">3</property>
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
- <widget class="GtkDrawingArea" id="header">
- <property name="height_request">24</property>
+ <widget class="GtkVBox" id="vbox3">
<property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <signal name="expose_event" handler="on_header_expose_event" last_modification_time="Thu, 06 Aug 2009 14:54:29 GMT"/>
- <signal name="configure_event" handler="on_header_configure_event" last_modification_time="Thu, 06 Aug 2009 14:54:33 GMT"/>
- <signal name="realize" handler="on_header_realize" last_modification_time="Thu, 06 Aug 2009 14:54:41 GMT"/>
- <signal name="motion_notify_event" handler="on_header_motion_notify_event" last_modification_time="Thu, 06 Aug 2009 16:33:54 GMT"/>
- <signal name="button_press_event" handler="on_header_button_press_event" last_modification_time="Thu, 06 Aug 2009 16:42:32 GMT"/>
- <signal name="button_release_event" handler="on_header_button_release_event" last_modification_time="Thu, 06 Aug 2009 16:47:31 GMT"/>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
+ <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"/>
- <signal name="scroll_event" handler="on_playlist_scroll_event" last_modification_time="Sat, 04 Jul 2009 17:16:21 GMT"/>
- <signal name="drag_begin" handler="on_playlist_drag_begin" last_modification_time="Fri, 31 Jul 2009 10:36:23 GMT"/>
- <signal name="drag_motion" handler="on_playlist_drag_motion" last_modification_time="Fri, 31 Jul 2009 10:36:30 GMT"/>
- <signal name="drag_drop" handler="on_playlist_drag_drop" last_modification_time="Fri, 31 Jul 2009 10:36:39 GMT"/>
- <signal name="drag_data_get" handler="on_playlist_drag_data_get" last_modification_time="Fri, 31 Jul 2009 10:36:43 GMT"/>
- <signal name="drag_end" handler="on_playlist_drag_end" last_modification_time="Fri, 31 Jul 2009 11:41:00 GMT"/>
- <signal name="drag_failed" handler="on_playlist_drag_failed" last_modification_time="Fri, 31 Jul 2009 11:41:05 GMT"/>
- <signal name="drag_leave" handler="on_playlist_drag_leave" last_modification_time="Fri, 31 Jul 2009 11:41:11 GMT"/>
- <signal name="button_release_event" handler="on_playlist_button_release_event" last_modification_time="Fri, 31 Jul 2009 12:20:56 GMT"/>
- <signal name="motion_notify_event" handler="on_playlist_motion_notify_event" last_modification_time="Fri, 31 Jul 2009 12:23:49 GMT"/>
- <signal name="drag_data_received" handler="on_playlist_drag_data_received" last_modification_time="Mon, 03 Aug 2009 12:07:39 GMT"/>
- <signal name="drag_data_delete" handler="on_playlist_drag_data_delete" last_modification_time="Mon, 03 Aug 2009 12:35:47 GMT"/>
+ <child>
+ <widget class="GtkDrawingArea" id="header">
+ <property name="height_request">24</property>
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <signal name="expose_event" handler="on_header_expose_event" last_modification_time="Thu, 06 Aug 2009 14:54:29 GMT"/>
+ <signal name="configure_event" handler="on_header_configure_event" last_modification_time="Thu, 06 Aug 2009 14:54:33 GMT"/>
+ <signal name="realize" handler="on_header_realize" last_modification_time="Thu, 06 Aug 2009 14:54:41 GMT"/>
+ <signal name="motion_notify_event" handler="on_header_motion_notify_event" last_modification_time="Thu, 06 Aug 2009 16:33:54 GMT"/>
+ <signal name="button_press_event" handler="on_header_button_press_event" last_modification_time="Thu, 06 Aug 2009 16:42:32 GMT"/>
+ <signal name="button_release_event" handler="on_header_button_release_event" last_modification_time="Thu, 06 Aug 2009 16:47:31 GMT"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <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"/>
+ <signal name="scroll_event" handler="on_playlist_scroll_event" last_modification_time="Sat, 04 Jul 2009 17:16:21 GMT"/>
+ <signal name="drag_begin" handler="on_playlist_drag_begin" last_modification_time="Fri, 31 Jul 2009 10:36:23 GMT"/>
+ <signal name="drag_motion" handler="on_playlist_drag_motion" last_modification_time="Fri, 31 Jul 2009 10:36:30 GMT"/>
+ <signal name="drag_drop" handler="on_playlist_drag_drop" last_modification_time="Fri, 31 Jul 2009 10:36:39 GMT"/>
+ <signal name="drag_data_get" handler="on_playlist_drag_data_get" last_modification_time="Fri, 31 Jul 2009 10:36:43 GMT"/>
+ <signal name="drag_end" handler="on_playlist_drag_end" last_modification_time="Fri, 31 Jul 2009 11:41:00 GMT"/>
+ <signal name="drag_failed" handler="on_playlist_drag_failed" last_modification_time="Fri, 31 Jul 2009 11:41:05 GMT"/>
+ <signal name="drag_leave" handler="on_playlist_drag_leave" last_modification_time="Fri, 31 Jul 2009 11:41:11 GMT"/>
+ <signal name="button_release_event" handler="on_playlist_button_release_event" last_modification_time="Fri, 31 Jul 2009 12:20:56 GMT"/>
+ <signal name="motion_notify_event" handler="on_playlist_motion_notify_event" last_modification_time="Fri, 31 Jul 2009 12:23:49 GMT"/>
+ <signal name="drag_data_received" handler="on_playlist_drag_data_received" last_modification_time="Mon, 03 Aug 2009 12:07:39 GMT"/>
+ <signal name="drag_data_delete" handler="on_playlist_drag_data_delete" last_modification_time="Mon, 03 Aug 2009 12:35:47 GMT"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
</widget>
<packing>
<property name="padding">0</property>
@@ -719,9 +735,10 @@
</child>
</widget>
<packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
</packing>
</child>
@@ -734,9 +751,30 @@
<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">True</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">fill</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHScrollbar" id="playhscroll">
+ <property name="visible">True</property>
+ <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
+ <property name="inverted">False</property>
+ <property name="adjustment">0 0 0 0 0 0</property>
+ <signal name="value_changed" handler="on_playhscroll_value_changed" last_modification_time="Sun, 13 Sep 2009 09:53:45 GMT"/>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">fill</property>
</packing>
</child>
</widget>
@@ -877,10 +915,31 @@ Stas &quot;uncle lag&quot; Akimushkin &lt;uncle.lag@gmail.com&gt;</property>
</child>
<child>
- <widget class="GtkHBox" id="hbox6">
+ <widget class="GtkTable" id="table2">
<property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
<property name="homogeneous">False</property>
- <property name="spacing">0</property>
+ <property name="row_spacing">0</property>
+ <property name="column_spacing">0</property>
+
+ <child>
+ <widget class="GtkVScrollbar" id="searchscroll">
+ <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, 08 Aug 2009 23:47:34 GMT"/>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">fill</property>
+ </packing>
+ </child>
<child>
<widget class="GtkVBox" id="vbox5">
@@ -928,24 +987,28 @@ Stas &quot;uncle lag&quot; Akimushkin &lt;uncle.lag@gmail.com&gt;</property>
</child>
</widget>
<packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
</packing>
</child>
<child>
- <widget class="GtkVScrollbar" id="searchscroll">
+ <widget class="GtkHScrollbar" id="searchhscroll">
<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, 08 Aug 2009 23:47:34 GMT"/>
+ <property name="adjustment">0 0 0 0 0 0</property>
+ <signal name="value_changed" handler="on_searchhscroll_value_changed" last_modification_time="Sun, 13 Sep 2009 10:07:12 GMT"/>
</widget>
<packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">fill</property>
</packing>
</child>
</widget>
diff --git a/gtkplaylist.c b/gtkplaylist.c
index 11bac24c..4a41f6d6 100644
--- a/gtkplaylist.c
+++ b/gtkplaylist.c
@@ -194,6 +194,34 @@ gtkpl_setup_scrollbar (gtkplaylist_t *ps) {
}
void
+gtkpl_setup_hscrollbar (gtkplaylist_t *ps) {
+ GtkWidget *playlist = ps->playlist;
+ int w = playlist->allocation.width;
+ int size = 0;
+ int i;
+ for (i = 0; i < pl_ncolumns; i++) {
+ size += ps->colwidths[i];
+ }
+ if (w >= size) {
+ size = 0;
+ }
+ GtkWidget *scroll = ps->hscrollbar;
+ if (ps->hscrollpos >= size-w) {
+ int n = size-w-1;
+ ps->hscrollpos = max (0, n);
+ gtk_range_set_value (GTK_RANGE (scroll), ps->hscrollpos);
+ }
+ if (size == 0) {
+ gtk_widget_hide (scroll);
+ }
+ else {
+ GtkAdjustment *adj = (GtkAdjustment*)gtk_adjustment_new (gtk_range_get_value (GTK_RANGE (scroll)), 0, size, 1, w, w);
+ gtk_range_set_adjustment (GTK_RANGE (scroll), adj);
+ gtk_widget_show (scroll);
+ }
+}
+
+void
gtkpl_redraw_pl_row_novis (gtkplaylist_t *ps, int row, playItem_t *it) {
draw_begin ((uintptr_t)ps->backbuf);
if (it) {
@@ -260,7 +288,7 @@ gtkpl_draw_pl_row (gtkplaylist_t *ps, int row, playItem_t *it) {
draw_get_canvas_size ((uintptr_t)ps->backbuf, &width, &height);
if (it == playlist_current_ptr && ps->colwidths[0] > 0/* && !p_isstopped ()*/) {
uintptr_t pixbuf = p_ispaused () ? pause16_pixbuf : play16_pixbuf;
- draw_pixbuf ((uintptr_t)ps->backbuf, pixbuf, ps->colwidths[0]/2-8, (row - ps->scrollpos) * rowheight + rowheight/2 - 8, 0, 0, 16, 16);
+ draw_pixbuf ((uintptr_t)ps->backbuf, pixbuf, ps->colwidths[0]/2-8-ps->hscrollpos, (row - ps->scrollpos) * rowheight + rowheight/2 - 8, 0, 0, 16, 16);
}
if (it && ((it->selected && ps->multisel) || (row == ps->row && !ps->multisel))) {
if (row % 2) {
@@ -315,8 +343,7 @@ gtkpl_draw_pl_row (gtkplaylist_t *ps, int row, playItem_t *it) {
title,
dur
};
- int x = 0;
-#if 1
+ int x = -ps->hscrollpos;
for (int i = 0; i < pl_ncolumns; i++) {
char str[512];
if (i > 0) {
@@ -349,12 +376,6 @@ gtkpl_draw_pl_row (gtkplaylist_t *ps, int row, playItem_t *it) {
}
x += ps->colwidths[i];
}
-#endif
-#if 0
- char dname[512];
- pl_format_item_display_name (it, dname, 512);
- text_draw (cr, rowheight, row * rowheight - ps->scrollpos * rowheight, dname);
-#endif
}
@@ -398,6 +419,7 @@ gtkpl_draw_playlist (gtkplaylist_t *ps, int x, int y, int w, int h) {
void
gtkpl_configure (gtkplaylist_t *ps) {
gtkpl_setup_scrollbar (ps);
+ gtkpl_setup_hscrollbar (ps);
GtkWidget *widget = ps->playlist;
if (ps->backbuf) {
g_object_unref (ps->backbuf);
@@ -752,6 +774,18 @@ gtkpl_scroll (gtkplaylist_t *ps, int newscroll) {
}
void
+gtkpl_hscroll (gtkplaylist_t *ps, int newscroll) {
+ if (newscroll != ps->hscrollpos) {
+ ps->hscrollpos = newscroll;
+ GtkWidget *widget = ps->playlist;
+ gtkpl_header_draw (ps);
+ gtkpl_expose_header (ps, 0, 0, ps->header->allocation.width, ps->header->allocation.height);
+ gtkpl_draw_playlist (ps, 0, 0, widget->allocation.width, widget->allocation.height);
+ gdk_draw_drawable (widget->window, widget->style->black_gc, ps->backbuf, 0, 0, 0, 0, widget->allocation.width, widget->allocation.height);
+ }
+}
+
+void
gtkpl_randomsong (void) {
p_stop ();
pl_randomsong ();
@@ -1156,7 +1190,7 @@ gtkpl_handle_fm_drag_drop (gtkplaylist_t *ps, int drop_y, void *ptr, int length)
void
gtkpl_header_draw (gtkplaylist_t *ps) {
GtkWidget *widget = ps->header;
- int x = 0;
+ int x = -ps->hscrollpos;
int w = 100;
int h = widget->allocation.height;
const char *detail = "toolbar";
@@ -1178,8 +1212,7 @@ gtkpl_header_draw (gtkplaylist_t *ps) {
gtk_paint_box (widget->style, ps->backbuf_header, GTK_STATE_INSENSITIVE, GTK_SHADOW_OUT, NULL, NULL, detail, x, 0, widget->allocation.width-x, h);
}
draw_begin ((uintptr_t)ps->backbuf_header);
- x = 0;
-// gtkpl_set_cairo_header_font (cr);
+ x = -ps->hscrollpos;
for (int i = 0; i < pl_ncolumns; i++) {
if (x >= widget->allocation.width) {
break;
@@ -1187,7 +1220,6 @@ gtkpl_header_draw (gtkplaylist_t *ps) {
w = ps->colwidths[i];
if (w > 0) {
if (!ps->header_fitted[i]) {
- //gtkpl_set_cairo_header_font (cr);
gtkpl_fit_text (ps->colnames_fitted[i], NULL, pl_colname_max, colnames[i], ps->colwidths[i]-10);
ps->header_fitted[i] = 1;
}
@@ -1268,7 +1300,7 @@ on_header_motion_notify_event (GtkWidget *widget,
prev_header_x = event->x;
gdk_window_set_cursor (widget->window, cursor_sz);
// get column start pos
- int x = 0;
+ int x = -ps->hscrollpos;
for (int i = 0; i < header_sizing; i++) {
int w = ps->colwidths[i];
x += w;
@@ -1281,13 +1313,14 @@ on_header_motion_notify_event (GtkWidget *widget,
int cidx = (k * pl_ncolumns + header_sizing) * 3;
ps->fmtcache[cidx+2] = 0;
}
+ gtkpl_setup_hscrollbar (ps);
gtkpl_header_draw (ps);
gtkpl_expose_header (ps, 0, 0, ps->header->allocation.width, ps->header->allocation.height);
gtkpl_draw_playlist (ps, 0, 0, ps->playlist->allocation.width, ps->playlist->allocation.height);
gtkpl_expose (ps, 0, 0, ps->playlist->allocation.width, ps->playlist->allocation.height);
}
else {
- int x = 0;
+ int x = -ps->hscrollpos;
for (int i = 0; i < pl_ncolumns; i++) {
int w = ps->colwidths[i];
if (w > 0) { // ignore collapsed columns (hack for search window)
@@ -1320,7 +1353,7 @@ on_header_button_press_event (GtkWidget *widget,
header_sizing = -1;
header_dragpt[0] = event->x;
header_dragpt[1] = event->y;
- int x = 0;
+ int x = -ps->hscrollpos;
for (int i = 0; i < pl_ncolumns; i++) {
int w = ps->colwidths[i];
if (event->x >= x + w - 2 && event->x <= x + w) {
diff --git a/gtkplaylist.h b/gtkplaylist.h
index 672a199c..9584aa06 100644
--- a/gtkplaylist.h
+++ b/gtkplaylist.h
@@ -57,6 +57,7 @@ typedef struct {
GtkWidget *playlist;
GtkWidget *header;
GtkWidget *scrollbar;
+ GtkWidget *hscrollbar;
GdkPixmap *backbuf;
GdkPixmap *backbuf_header;
// parameters
@@ -67,6 +68,7 @@ typedef struct {
int multisel; // if it uses multiple selection
// current state
int scrollpos;
+ int hscrollpos;
int row;
double clicktime; // for doubleclick detection
int nvisiblerows;
@@ -127,6 +129,9 @@ void
gtkpl_scroll (gtkplaylist_t *ps, int newscroll);
void
+gtkpl_hscroll (gtkplaylist_t *ps, int newscroll);
+
+void
gtkpl_handle_scroll_event (gtkplaylist_t *ps, int direction);
void
diff --git a/interface.c b/interface.c
index 3037742f..a83d8321 100644
--- a/interface.c
+++ b/interface.c
@@ -94,11 +94,13 @@ create_mainwin (void)
GtkWidget *image6;
GtkWidget *volumebar;
GtkWidget *seekbar;
+ GtkWidget *table1;
GtkWidget *_;
GtkWidget *vbox3;
GtkWidget *header;
GtkWidget *playlist;
GtkWidget *playscroll;
+ GtkWidget *playhscroll;
GtkWidget *statusbar;
GtkAccelGroup *accel_group;
@@ -420,9 +422,15 @@ create_mainwin (void)
gtk_widget_set_size_request (seekbar, 200, -1);
gtk_widget_set_events (seekbar, GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
+ table1 = gtk_table_new (2, 2, FALSE);
+ gtk_widget_show (table1);
+ gtk_box_pack_start (GTK_BOX (vbox1), table1, TRUE, TRUE, 0);
+
_ = gtk_hbox_new (FALSE, 0);
gtk_widget_show (_);
- gtk_box_pack_start (GTK_BOX (vbox1), _, TRUE, TRUE, 0);
+ gtk_table_attach (GTK_TABLE (table1), _, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
gtk_container_set_border_width (GTK_CONTAINER (_), 3);
vbox3 = gtk_vbox_new (FALSE, 0);
@@ -442,7 +450,15 @@ create_mainwin (void)
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, TRUE, 0);
+ gtk_table_attach (GTK_TABLE (table1), playscroll, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+ playhscroll = gtk_hscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 0, 0, 0, 0)));
+ gtk_widget_show (playhscroll);
+ gtk_table_attach (GTK_TABLE (table1), playhscroll, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 0);
statusbar = gtk_statusbar_new ();
gtk_widget_show (statusbar);
@@ -640,6 +656,9 @@ create_mainwin (void)
g_signal_connect ((gpointer) playscroll, "value_changed",
G_CALLBACK (on_playscroll_value_changed),
NULL);
+ g_signal_connect ((gpointer) playhscroll, "value_changed",
+ G_CALLBACK (on_playhscroll_value_changed),
+ NULL);
/* Store pointers to all widgets, for use by lookup_widget(). */
GLADE_HOOKUP_OBJECT_NO_REF (mainwin, mainwin, "mainwin");
@@ -705,11 +724,13 @@ create_mainwin (void)
GLADE_HOOKUP_OBJECT (mainwin, image6, "image6");
GLADE_HOOKUP_OBJECT (mainwin, volumebar, "volumebar");
GLADE_HOOKUP_OBJECT (mainwin, seekbar, "seekbar");
+ GLADE_HOOKUP_OBJECT (mainwin, table1, "table1");
GLADE_HOOKUP_OBJECT (mainwin, _, "_");
GLADE_HOOKUP_OBJECT (mainwin, vbox3, "vbox3");
GLADE_HOOKUP_OBJECT (mainwin, header, "header");
GLADE_HOOKUP_OBJECT (mainwin, playlist, "playlist");
GLADE_HOOKUP_OBJECT (mainwin, playscroll, "playscroll");
+ GLADE_HOOKUP_OBJECT (mainwin, playhscroll, "playhscroll");
GLADE_HOOKUP_OBJECT (mainwin, statusbar, "statusbar");
gtk_window_add_accel_group (GTK_WINDOW (mainwin), accel_group);
@@ -765,11 +786,12 @@ create_searchwin (void)
GtkWidget *searchwin;
GtkWidget *vbox4;
GtkWidget *searchentry;
- GtkWidget *hbox6;
+ GtkWidget *table2;
+ GtkWidget *searchscroll;
GtkWidget *vbox5;
GtkWidget *searchheader;
GtkWidget *searchlist;
- GtkWidget *searchscroll;
+ GtkWidget *searchhscroll;
searchwin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request (searchwin, 600, 150);
@@ -790,13 +812,21 @@ create_searchwin (void)
gtk_entry_set_invisible_char (GTK_ENTRY (searchentry), 8226);
gtk_entry_set_activates_default (GTK_ENTRY (searchentry), TRUE);
- hbox6 = gtk_hbox_new (FALSE, 0);
- gtk_widget_show (hbox6);
- gtk_box_pack_start (GTK_BOX (vbox4), hbox6, TRUE, TRUE, 0);
+ table2 = gtk_table_new (2, 2, FALSE);
+ gtk_widget_show (table2);
+ gtk_box_pack_start (GTK_BOX (vbox4), table2, TRUE, TRUE, 0);
+
+ searchscroll = gtk_vscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 1, 1, 0, 0)));
+ gtk_widget_show (searchscroll);
+ gtk_table_attach (GTK_TABLE (table2), searchscroll, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 0);
vbox5 = gtk_vbox_new (FALSE, 0);
gtk_widget_show (vbox5);
- gtk_box_pack_start (GTK_BOX (hbox6), vbox5, TRUE, TRUE, 0);
+ gtk_table_attach (GTK_TABLE (table2), vbox5, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
searchheader = gtk_drawing_area_new ();
gtk_widget_show (searchheader);
@@ -810,9 +840,11 @@ create_searchwin (void)
GTK_WIDGET_SET_FLAGS (searchlist, GTK_CAN_DEFAULT);
gtk_widget_set_events (searchlist, GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
- searchscroll = gtk_vscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 1, 1, 0, 0)));
- gtk_widget_show (searchscroll);
- gtk_box_pack_start (GTK_BOX (hbox6), searchscroll, FALSE, TRUE, 0);
+ searchhscroll = gtk_hscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 0, 0, 0, 0)));
+ gtk_widget_show (searchhscroll);
+ gtk_table_attach (GTK_TABLE (table2), searchhscroll, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 0);
g_signal_connect ((gpointer) searchwin, "key_press_event",
G_CALLBACK (on_searchwin_key_press_event),
@@ -823,6 +855,9 @@ create_searchwin (void)
g_signal_connect ((gpointer) searchentry, "changed",
G_CALLBACK (on_searchentry_changed),
NULL);
+ g_signal_connect ((gpointer) searchscroll, "value_changed",
+ G_CALLBACK (on_playscroll_value_changed),
+ NULL);
g_signal_connect ((gpointer) searchheader, "button_press_event",
G_CALLBACK (on_header_button_press_event),
NULL);
@@ -859,19 +894,20 @@ create_searchwin (void)
g_signal_connect ((gpointer) searchlist, "motion_notify_event",
G_CALLBACK (on_playlist_motion_notify_event),
NULL);
- g_signal_connect ((gpointer) searchscroll, "value_changed",
- G_CALLBACK (on_playscroll_value_changed),
+ g_signal_connect ((gpointer) searchhscroll, "value_changed",
+ G_CALLBACK (on_searchhscroll_value_changed),
NULL);
/* Store pointers to all widgets, for use by lookup_widget(). */
GLADE_HOOKUP_OBJECT_NO_REF (searchwin, searchwin, "searchwin");
GLADE_HOOKUP_OBJECT (searchwin, vbox4, "vbox4");
GLADE_HOOKUP_OBJECT (searchwin, searchentry, "searchentry");
- GLADE_HOOKUP_OBJECT (searchwin, hbox6, "hbox6");
+ GLADE_HOOKUP_OBJECT (searchwin, table2, "table2");
+ GLADE_HOOKUP_OBJECT (searchwin, searchscroll, "searchscroll");
GLADE_HOOKUP_OBJECT (searchwin, vbox5, "vbox5");
GLADE_HOOKUP_OBJECT (searchwin, searchheader, "searchheader");
GLADE_HOOKUP_OBJECT (searchwin, searchlist, "searchlist");
- GLADE_HOOKUP_OBJECT (searchwin, searchscroll, "searchscroll");
+ GLADE_HOOKUP_OBJECT (searchwin, searchhscroll, "searchhscroll");
gtk_widget_grab_default (searchlist);
return searchwin;