summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--wintable/main.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/wintable/main.c b/wintable/main.c
index 1de3a3f..f4c5a9a 100644
--- a/wintable/main.c
+++ b/wintable/main.c
@@ -84,6 +84,12 @@ struct table {
intptr_t focusedColumn;
int checkboxWidth;
int checkboxHeight;
+ BOOL lastmouse;
+ int lastmouseX;
+ int lastmouseY;
+ BOOL mouseDown; // TRUE if over a checkbox; the next two decide which ones
+ intptr_t mouseDownRow;
+ intptr_t mouseDownColumn;
};
static LONG rowHeight(struct table *t)
@@ -520,6 +526,10 @@ static void selectItem(struct table *t, WPARAM wParam, LPARAM lParam)
if (t->selected >= t->count)
t->selected = -1;
t->focusedColumn = hitTestColumn(t, x);
+ // TODO only if inside a checkbox
+ t->mouseDown = TRUE;
+ t->mouseDownRow = t->selected;
+ t->mouseDownColumn = t->focusedColumn;
finishSelect(t, prev);
}
@@ -557,6 +567,7 @@ static void drawItem(struct table *t, HDC dc, intptr_t i, LONG y, LONG height, R
intptr_t j;
LRESULT xoff;
IMAGELISTDRAWPARAMS ip;
+ POINT pt;
// TODO verify these two
background = (HBRUSH) (COLOR_WINDOW + 1);
@@ -629,8 +640,21 @@ static void drawItem(struct table *t, HDC dc, intptr_t i, LONG y, LONG height, R
rsel.top = y;
rsel.right = rsel.left + t->checkboxWidth;
rsel.bottom = rsel.top + t->checkboxHeight;
- if (SetDCBrushColor(dc, RGB(255, 0, 0)) == CLR_INVALID)
+ { COLORREF c;
+
+ c = RGB(255, 0, 0);
+ if (t->mouseDown) {
+ if (i == t->mouseDownRow && j == t->mouseDownColumn)
+ c = RGB(0, 0, 255);
+ } else if (t->lastmouse) {
+ pt.x = t->lastmouseX;
+ pt.y = t->lastmouseY;
+ if (PtInRect(&rsel, pt) != 0)
+ c = RGB(0, 255, 0);
+ }
+ if (SetDCBrushColor(dc, c) == CLR_INVALID)
abort();
+ }
if (FillRect(dc, &rsel, GetStockObject(DC_BRUSH)) == 0)
abort();
break;
@@ -785,6 +809,14 @@ if (ImageList_GetIconSize(t->imagelist, &unused, &(t->imagelistHeight)) == 0)abo
case WM_LBUTTONDOWN:
selectItem(t, wParam, lParam);
return 0;
+ case WM_LBUTTONUP:
+ // TODO toggle checkbox
+ if (t->mouseDown) {
+ t->mouseDown = FALSE;
+ redrawRow(t, t->mouseDownRow);
+ }
+ return 0;
+ // TODO other mouse buttons?
case WM_SETFOCUS:
case WM_KILLFOCUS:
// all we need to do here is redraw the highlight