summaryrefslogtreecommitdiff
path: root/gtkplaylist.c
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2009-08-06 19:10:03 +0200
committerGravatar waker <wakeroid@gmail.com>2009-08-06 19:10:03 +0200
commita8d53a428825732896e954d9eacd40dc45f029ad (patch)
treeaf36aa8757df5d977c3f789a9034beea0e377e7a /gtkplaylist.c
parent9a9be9710c1cb28d6c1a47a2c120d35d68ec565f (diff)
header widget upgrade (sizing)
Diffstat (limited to 'gtkplaylist.c')
-rw-r--r--gtkplaylist.c116
1 files changed, 100 insertions, 16 deletions
diff --git a/gtkplaylist.c b/gtkplaylist.c
index 466d64ca..17324d97 100644
--- a/gtkplaylist.c
+++ b/gtkplaylist.c
@@ -33,7 +33,9 @@ static int shift_sel_anchor = -1;
#define ncolumns 5
#define colname_max 100
-int refit_header = 1;
+int refit_header[ncolumns] = {
+ 1, 1, 1, 1, 1
+};
const char *colnames[ncolumns] = {
"Playing Status",
@@ -223,7 +225,7 @@ draw_ps_row (GdkDrawable *drawable, cairo_t *cr, int row, playItem_t *it) {
text_draw (cr, x + 3, row * rowheight - scrollpos * rowheight, str);
}
}
- x += colwidths[i] + 2;
+ x += colwidths[i];
}
#endif
#if 0
@@ -1081,11 +1083,8 @@ gtkps_handle_fm_drag_drop (int drop_y, void *ptr, int length) {
gtkps_expose (widget, 0, 0, widget->allocation.width, widget->allocation.height);
}
-gboolean
-on_header_expose_event (GtkWidget *widget,
- GdkEventExpose *event,
- gpointer user_data)
-{
+void
+header_draw (GtkWidget *widget) {
int x = 0;
int w = 100;
int h = widget->allocation.height;
@@ -1096,9 +1095,9 @@ on_header_expose_event (GtkWidget *widget,
break;
}
w = colwidths[i];
- gtk_paint_box (widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, NULL, NULL, detail, x, 0, w, h);
- gtk_paint_vline (widget->style, widget->window, GTK_STATE_NORMAL, NULL, NULL, NULL, 0, h, x+w);
- x += w + 2;
+ gtk_paint_box (widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, NULL, NULL, detail, x, 0, w - 2, h);
+ gtk_paint_vline (widget->style, widget->window, GTK_STATE_NORMAL, NULL, NULL, NULL, 0, h, x+w - 2);
+ x += w;
}
if (x < widget->allocation.width) {
gtk_paint_box (widget->style, widget->window, GTK_STATE_INSENSITIVE, GTK_SHADOW_OUT, NULL, NULL, detail, x, 0, widget->allocation.width-x, h);
@@ -1106,7 +1105,7 @@ on_header_expose_event (GtkWidget *widget,
cairo_t *cr;
cr = gdk_cairo_create (widget->window);
if (!cr) {
- return FALSE;
+ return;
}
x = 0;
for (int i = 0; i < ncolumns; i++) {
@@ -1115,14 +1114,22 @@ on_header_expose_event (GtkWidget *widget,
}
w = colwidths[i];
cairo_move_to (cr, x + 5, 15);
- if (refit_header) {
+ if (refit_header[i]) {
fit_text (cr, colnames_fitted[i], colname_max, colnames[i], colwidths[i]-10);
+ refit_header[i] = 0;
}
cairo_show_text (cr, colnames_fitted[i]);
- x += w + 2;
+ x += w;
}
- refit_header = 0;
cairo_destroy (cr);
+}
+
+gboolean
+on_header_expose_event (GtkWidget *widget,
+ GdkEventExpose *event,
+ gpointer user_data)
+{
+ header_draw (widget);
return FALSE;
}
@@ -1137,6 +1144,10 @@ on_header_configure_event (GtkWidget *widget,
GdkCursor* cursor_sz;
+GdkCursor* cursor_drag;
+int header_dragging = -1;
+int header_sizing = -1;
+int header_dragpt[2];
void
on_header_realize (GtkWidget *widget,
@@ -1144,6 +1155,7 @@ on_header_realize (GtkWidget *widget,
{
// create cursor for sizing headers
cursor_sz = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
+ cursor_drag = gdk_cursor_new (GDK_FLEUR);
}
gboolean
@@ -1151,17 +1163,89 @@ on_header_motion_notify_event (GtkWidget *widget,
GdkEventMotion *event,
gpointer user_data)
{
+ if (header_dragging >= 0) {
+ gdk_window_set_cursor (widget->window, cursor_drag);
+ }
+ else if (header_sizing >= 0) {
+ gdk_window_set_cursor (widget->window, cursor_sz);
+ // get column start pos
+ int x = 0;
+ for (int i = 0; i < header_sizing; i++) {
+ int w = colwidths[i];
+ x += w;
+ }
+ int newx = event->x > x + 20 ? event->x : x + 20;
+ colwidths[header_sizing] = newx - x;
+ //printf ("ev->x = %d, w = %d\n", (int)event->x, newx - x - 2);
+ refit_header[header_sizing] = 1;
+ header_draw (widget);
+ GtkWidget *ps = lookup_widget (mainwin, "playlist");
+ draw_playlist (ps, 0, 0, ps->allocation.width, ps->allocation.height);
+ gtkps_expose (ps, 0, 0, ps->allocation.width, ps->allocation.height);
+ }
+ else {
+ int x = 0;
+ for (int i = 0; i < ncolumns; i++) {
+ int w = colwidths[i];
+ if (event->x >= x + w - 2 && event->x <= x + w) {
+ gdk_window_set_cursor (widget->window, cursor_sz);
+ break;
+ }
+ else {
+ gdk_window_set_cursor (widget->window, NULL);
+ }
+ x += w;
+ }
+ }
+ return FALSE;
+}
+
+gboolean
+on_header_button_press_event (GtkWidget *widget,
+ GdkEventButton *event,
+ gpointer user_data)
+{
+ if (event->button == 1) {
+ // start sizing/dragging
+ header_dragging = -1;
+ header_sizing = -1;
+ header_dragpt[0] = event->x;
+ header_dragpt[1] = event->y;
+ int x = 0;
+ for (int i = 0; i < ncolumns; i++) {
+ int w = colwidths[i];
+ if (event->x >= x + w - 2 && event->x <= x + w) {
+ header_sizing = i;
+ header_dragging = -1;
+ break;
+ }
+ else {
+ header_dragging = i;
+ }
+ x += w;
+ }
+ }
+ return FALSE;
+}
+
+gboolean
+on_header_button_release_event (GtkWidget *widget,
+ GdkEventButton *event,
+ gpointer user_data)
+{
+ header_dragging = -1;
+ header_sizing = -1;
int x = 0;
for (int i = 0; i < ncolumns; i++) {
int w = colwidths[i];
- if (event->x >= x + w && event->x <= x+w+2) {
+ if (event->x >= x + w - 2 && event->x <= x + w) {
gdk_window_set_cursor (widget->window, cursor_sz);
break;
}
else {
gdk_window_set_cursor (widget->window, NULL);
}
- x += w + 2;
+ x += w;
}
return FALSE;
}