From 01a8fbd652eb3f2a25bda600bb3137a3cff4045d Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Sun, 17 Aug 2014 17:44:33 -0400 Subject: [PATCH] Implemented Windows Table checkbox clicking. --- redo/table_windows.c | 16 ++++++++++------ redo/table_windows.go | 17 +++++++++++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/redo/table_windows.c b/redo/table_windows.c index c0697ef..cd780d3 100644 --- a/redo/table_windows.c +++ b/redo/table_windows.c @@ -6,7 +6,7 @@ // provided for cgo's benefit LPWSTR xWC_LISTVIEW = WC_LISTVIEW; -static void handleMouseMove(HWND hwnd, WPARAM wParam, LPARAM lParam, void *data) +static void handle(HWND hwnd, WPARAM wParam, LPARAM lParam, void (*handler)(void *, int, int), void *data) { LVHITTESTINFO ht; @@ -15,14 +15,14 @@ static void handleMouseMove(HWND hwnd, WPARAM wParam, LPARAM lParam, void *data) ht.pt.x = GET_X_LPARAM(lParam); ht.pt.y = GET_Y_LPARAM(lParam); if (SendMessageW(hwnd, LVM_SUBITEMHITTEST, 0, (LPARAM) (&ht)) == (LRESULT) -1) { - tableSetHot(data, -1, -1); + (*handler)(data, -1, -1); return; // no item } if (ht.flags != LVHT_ONITEMSTATEICON) { - tableSetHot(data, -1, -1); - return; + (*handler)(data, -1, -1); + return; // not on a checkbox } - tableSetHot(data, ht.iItem, ht.iSubItem); + (*handler)(data, ht.iItem, ht.iSubItem); } static LRESULT CALLBACK tableSubProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR id, DWORD_PTR data) @@ -39,7 +39,11 @@ static LRESULT CALLBACK tableSubProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM } return (*fv_DefSubclassProc)(hwnd, uMsg, wParam, lParam); case WM_MOUSEMOVE: - handleMouseMove(hwnd, wParam, lParam, (void *) data); + handle(hwnd, wParam, lParam, tableSetHot, (void *) data); + // and let the list view do its thing + return (*fv_DefSubclassProc)(hwnd, uMsg, wParam, lParam); + case WM_LBUTTONUP: + handle(hwnd, wParam, lParam, tableToggled, (void *) data); // and let the list view do its thing return (*fv_DefSubclassProc)(hwnd, uMsg, wParam, lParam); // see table.autoresize() in table_windows.go for the column autosize policy diff --git a/redo/table_windows.go b/redo/table_windows.go index 83e6cd1..fdb96d6 100644 --- a/redo/table_windows.go +++ b/redo/table_windows.go @@ -126,6 +126,23 @@ func tableSetHot(data unsafe.Pointer, row C.int, col C.int) { } } +//export tableToggled +func tableToggled(data unsafe.Pointer, row C.int, col C.int) { + t := (*table)(data) + if row == -1 || col == -1 { // discard extras sent by handle() in table_windows.c + return + } + t.Lock() + defer t.Unlock() + d := reflect.Indirect(reflect.ValueOf(t.data)) + datum := d.Index(int(row)).Field(int(col)) + if datum.Kind() == reflect.Bool { + datum.SetBool(!datum.Bool()) + return + } + panic(fmt.Errorf("tableSetHot() on non-checkbox at (%d, %d)", row, col)) +} + func (t *table) hwnd() C.HWND { return t._hwnd }