diff options
| author | Pietro Gagliardi <[email protected]> | 2014-12-13 13:56:31 -0500 |
|---|---|---|
| committer | Pietro Gagliardi <[email protected]> | 2014-12-13 13:56:31 -0500 |
| commit | cecfa8299429d52315616a9a3ce74302946d5662 (patch) | |
| tree | a67a0c3f2e37d145c5ce4b3c227e2eff7175e62d | |
| parent | 516173916e598781f22c42580aecbf75b109f6d3 (diff) | |
Implemented mouse click selection.
| -rw-r--r-- | wintable/new/coord.h | 75 | ||||
| -rw-r--r-- | wintable/new/events.h | 2 | ||||
| -rw-r--r-- | wintable/new/main.c | 1 | ||||
| -rw-r--r-- | wintable/new/select.h | 23 |
4 files changed, 64 insertions, 37 deletions
diff --git a/wintable/new/coord.h b/wintable/new/coord.h index 5716db4..16f93a3 100644 --- a/wintable/new/coord.h +++ b/wintable/new/coord.h @@ -1,5 +1,33 @@ // 4 december 2014 +// TODO find a better place for this +static LONG rowHeight(struct table *t, HDC dc, BOOL select) +{ + BOOL release; + HFONT prevfont, newfont; + TEXTMETRICW tm; + + release = FALSE; + if (dc == NULL) { + dc = GetDC(t->hwnd); + if (dc == NULL) + panic("error getting Table DC for rowHeight()"); + release = TRUE; + } + if (select) + prevfont = selectFont(t, dc, &newfont); + if (GetTextMetricsW(dc, &tm) == 0) + panic("error getting text metrics for rowHeight()"); + if (select) + deselectFont(dc, prevfont, newfont); + if (release) + if (ReleaseDC(t->hwnd, dc) == 0) + panic("error releasing Table DC for rowHeight()"); + return tm.tmHeight; +} + +#define rowht(t) rowHeight(t, NULL, TRUE) + struct rowcol { intptr_t row; intptr_t column; @@ -19,27 +47,28 @@ static struct rowcol clientCoordToRowColumn(struct table *t, POINT pt) if (GetClientRect(t->hwnd, &r) == 0) panic("error getting Table client rect in clientCoordToRowColumn()"); r.top += t->headerHeight; - if (PtInRect(&r, p) == 0) + if (PtInRect(&r, pt) == 0) return rc; // the row is easy - rc.row = (pt.y / rowht(t)) + t->yscrollpos; + pt.y -= t->headerHeight; + rc.row = (pt.y / rowht(t)) + t->vscrollpos; // the column... not so much // we scroll p.x, then subtract column widths until we cross the left edge of the control - p.x += t->hscrollpos; + pt.x += t->hscrollpos; rc.column = 0; for (i = 0; i < t->nColumns; i++) { // TODO error check SendMessage(t->header, HDM_GETITEMRECT, (WPARAM) i, (LPARAM) (&colrect)); - p.x -= colrect.right - colrect.left; + pt.x -= colrect.right - colrect.left; // use <, not <=, here: // assume r.left and t->hscrollpos == 0; // given the first column is 100 wide, - // p.x == 0 (first pixel of col 0) -> p.x - 100 == -100 < 0 -> break - // p.x == 99 (last pixel of col 0) -> p.x - 100 == -1 < 0 -> break - // p.x == 100 (first pixel of col 1) -> p.x - 100 == 0 >= 0 -> next column - if (p.x < r.left) + // pt.x == 0 (first pixel of col 0) -> p.x - 100 == -100 < 0 -> break + // pt.x == 99 (last pixel of col 0) -> p.x - 100 == -1 < 0 -> break + // pt.x == 100 (first pixel of col 1) -> p.x - 100 == 0 >= 0 -> next column + if (pt.x < r.left) break; rc.column++; } @@ -59,37 +88,9 @@ static struct rowcol lParamToRowColumn(struct table *t, LPARAM lParam) } // returns TRUE if the row is visible and thus has client coordinates; FALSE otherwise -static BOOL rowColumnToClientCoord(struct table *t, struct rowcol rc, struct POINT *pt) +static BOOL rowColumnToClientCoord(struct table *t, struct rowcol rc, POINT *pt) { // TODO } // TODO idealCoordToRowColumn/rowColumnToIdealCoord? - -// TODO find a better place for this -static LONG rowHeight(struct table *t, HDC dc, BOOL select) -{ - BOOL release; - HFONT prevfont, newfont; - TEXTMETRICW tm; - - release = FALSE; - if (dc == NULL) { - dc = GetDC(t->hwnd); - if (dc == NULL) - panic("error getting Table DC for rowHeight()"); - release = TRUE; - } - if (select) - prevfont = selectFont(t, dc, &newfont); - if (GetTextMetricsW(dc, &tm) == 0) - panic("error getting text metrics for rowHeight()"); - if (select) - deselectFont(dc, prevfont, newfont); - if (release) - if (ReleaseDC(t->hwnd, dc) == 0) - panic("error releasing Table DC for rowHeight()"); - return tm.tmHeight; -} - -#define rowht(t) rowHeight(t, NULL, TRUE) diff --git a/wintable/new/events.h b/wintable/new/events.h index 2e270a9..a631178 100644 --- a/wintable/new/events.h +++ b/wintable/new/events.h @@ -21,6 +21,7 @@ static const handlerfunc mouseLeaveHandlers[] = { }; static const handlerfunc lbuttonDownHandlers[] = { + mouseDownSelectHandler, NULL, }; @@ -28,6 +29,7 @@ static const handlerfunc lbuttonUpHandlers[] = { NULL, }; +// TODO remove or something? depends on if we implement combobox and how static const handlerfunc mouseWheelHandlers[] = { NULL, }; diff --git a/wintable/new/main.c b/wintable/new/main.c index 9a806b6..4635c16 100644 --- a/wintable/new/main.c +++ b/wintable/new/main.c @@ -70,6 +70,7 @@ struct table { #include "util.h" #include "coord.h" +#include "select.h" #include "events.h" #include "scroll.h" #include "hscroll.h" diff --git a/wintable/new/select.h b/wintable/new/select.h new file mode 100644 index 0000000..c849802 --- /dev/null +++ b/wintable/new/select.h @@ -0,0 +1,23 @@ +// 13 december 2014 + +// damn winsock +static void doselect(struct table *t, intptr_t row, intptr_t column) +{ + t->selectedRow = row; + t->selectedColumn = column; + // TODO scroll to ensure the full cell is visible + // TODO redraw only the old and new columns /if there was no scrolling/ + InvalidateRect(t->hwnd, NULL, TRUE); +} + +// TODO which WM_xBUTTONDOWNs? +HANDLER(mouseDownSelectHandler) +{ + struct rowcol rc; + + rc = lParamToRowColumn(t, lParam); + // don't check if lParamToRowColumn() returned row -1 or column -1; we want deselection behavior + doselect(t, rc.row, rc.column); + *lResult = 0; + return TRUE; +} |
