diff --git a/src/LScreens.c b/src/LScreens.c index 24f596140..4d8380a2c 100644 --- a/src/LScreens.c +++ b/src/LScreens.c @@ -166,7 +166,7 @@ static void LScreen_MouseMove(struct LScreen* s, int idx, int deltaX, int deltaY s->HoverWidget(s, over); if (!over->VTABLE->MouseMove) return; - over->VTABLE->MouseMove(over, idx, deltaX, deltaY, overSame); + over->VTABLE->MouseMove(over, idx, overSame); } } static void LScreen_MouseWheel(struct LScreen* s, float delta) { } diff --git a/src/LWidgets.c b/src/LWidgets.c index cc9a321fb..e73e243f5 100644 --- a/src/LWidgets.c +++ b/src/LWidgets.c @@ -170,7 +170,7 @@ static void LButton_Draw(void* widget) { Launcher_MarkDirty(w->x, w->y, w->width, w->height); } -static void LButton_Hover(void* w, int idx, int x, int y, cc_bool wasOver) { +static void LButton_Hover(void* w, int idx, cc_bool wasOver) { /* only need to redraw when changing from unhovered to hovered */ if (!wasOver) LWidget_Draw(w); } @@ -994,9 +994,10 @@ static void LTable_KeyDown(void* widget, int key, cc_bool was) { LTable_SetSelectedTo(w, index); } -static void LTable_MouseMove(void* widget, int idx, int deltaX, int deltaY, cc_bool wasOver) { +static void LTable_MouseMove(void* widget, int idx, cc_bool wasOver) { struct LTable* w = (struct LTable*)widget; - int x = Pointers[idx].x - w->x, y = Pointers[idx].y - w->y, col; + int x = Pointers[idx].x - w->x, y = Pointers[idx].y - w->y; + int i, col, width, maxW; if (w->draggingScrollbar) { float scale = w->height / (float)w->rowsCount; @@ -1008,11 +1009,16 @@ static void LTable_MouseMove(void* widget, int idx, int deltaX, int deltaY, cc_b LTable_ClampTopRow(w); LWidget_Draw(w); } else if (w->draggingColumn >= 0) { - if (!deltaX || x >= w->x + w->width - cellMinWidth) return; - col = w->draggingColumn; + col = w->draggingColumn; + width = x - w->dragXStart; - w->columns[col].width += deltaX; - Math_Clamp(w->columns[col].width, cellMinWidth, w->width - cellMinWidth); + /* Ensure this column doesn't expand past right side of table */ + maxW = w->width; + for (i = 0; i < col; i++) maxW -= w->columns[i].width; + + Math_Clamp(width, cellMinWidth, maxW - cellMinWidth); + if (width == w->columns[col].width) return; + w->columns[col].width = width; LWidget_Draw(w); } } @@ -1042,6 +1048,7 @@ static void LTable_HeadersClick(struct LTable* w, int idx) { /* clicked on gridline, begin dragging */ if (mouseX >= (x - dragPad) && mouseX < (x + dragPad) && w->columns[i].interactable) { w->draggingColumn = i - 1; + w->dragXStart = (mouseX - w->x) - w->columns[i - 1].width; return; } diff --git a/src/LWidgets.h b/src/LWidgets.h index f6bf33235..2c785721d 100644 --- a/src/LWidgets.h +++ b/src/LWidgets.h @@ -18,7 +18,7 @@ struct LWidgetVTABLE { /* Called when key is pressed and this widget is selected. */ void (*KeyPress)(void* widget, char c); /* Called when mouse hovers/moves over this widget. */ - void (*MouseMove)(void* widget, int idx, int deltaX, int deltaY, cc_bool wasOver); + void (*MouseMove)(void* widget, int idx, cc_bool wasOver); /* Called when mouse moves away from this widget. */ void (*MouseLeft)(void* widget); /* Called when mouse clicks on this widget. */ @@ -174,6 +174,7 @@ struct LTable { /* Index of table column currently being dragged. */ int draggingColumn; + int dragXStart; /* X coordinate column drag started at */ cc_bool draggingScrollbar; /* Is scrollbar is currently being dragged */ int dragYOffset; /* Offset of mouse for scrollbar dragging */