Wrote up the hscroll code. Not sure why it doesn't work yet. Not yet applied to headers or drawing.
This commit is contained in:
parent
4e21ee8b11
commit
62a1db4756
|
@ -68,8 +68,8 @@ static void updateTableWidth(struct table *t)
|
||||||
panic("error getting Table column width for updateTableWidth()");
|
panic("error getting Table column width for updateTableWidth()");
|
||||||
t->width += item.cxy;
|
t->width += item.cxy;
|
||||||
}
|
}
|
||||||
// TODO replace this with a call to hscrollby(t, 0)
|
// do a dummy scroll to update the horizontal scrollbar to use the new width
|
||||||
recomputeHScroll(t);
|
hscrollby(t, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLER(headerNotifyHandler)
|
HANDLER(headerNotifyHandler)
|
||||||
|
|
|
@ -1,33 +1,106 @@
|
||||||
// 9 december 2014
|
// 9 december 2014
|
||||||
|
|
||||||
|
// forward declaration needed here
|
||||||
|
static void repositionHeader(struct table *);
|
||||||
|
|
||||||
static void hscrollto(struct table *t, intptr_t pos)
|
static void hscrollto(struct table *t, intptr_t pos)
|
||||||
{
|
{
|
||||||
// TODO
|
RECT scrollArea;
|
||||||
|
SCROLLINFO si;
|
||||||
|
|
||||||
|
if (pos < 0)
|
||||||
|
pos = 0;
|
||||||
|
if (pos > t->width - t->hpagesize)
|
||||||
|
pos = t->width - t->hpagesize;
|
||||||
|
|
||||||
|
// we don't want to scroll the header
|
||||||
|
if (GetClientRect(t->hwnd, &scrollArea) == 0)
|
||||||
|
panic("error getting Table client rect for hscrollto()");
|
||||||
|
scrollArea.top += t->headerHeight;
|
||||||
|
|
||||||
|
// negative because ScrollWindowEx() is "backwards"
|
||||||
|
if (ScrollWindowEx(t->hwnd, -(pos - t->hscrollpos), 0,
|
||||||
|
&scrollArea, &scrollArea, NULL, NULL,
|
||||||
|
SW_ERASE | SW_INVALIDATE) == ERROR)
|
||||||
|
panic("error horizontally scrolling Table");
|
||||||
|
// TODO call UpdateWindow()?
|
||||||
|
|
||||||
|
t->hscrollpos = pos;
|
||||||
|
|
||||||
|
// now commit our new scrollbar setup...
|
||||||
|
ZeroMemory(&si, sizeof (SCROLLINFO));
|
||||||
|
si.cbSize = sizeof (SCROLLINFO);
|
||||||
|
si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
|
||||||
|
// the width of scrollArea is unchanged here; use it
|
||||||
|
t->hpagesize = scrollArea.right - scrollArea.left;
|
||||||
|
si.nPage = t->hpagesize;
|
||||||
|
si.nMin = 0;
|
||||||
|
si.nMax = t->width - 1; // endpoint inclusive
|
||||||
|
si.nPos = t->hscrollpos;
|
||||||
|
SetScrollInfo(t->hwnd, SB_HORZ, &si, TRUE);
|
||||||
|
|
||||||
|
// and finally move the header
|
||||||
|
repositionHeader(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hscrollby(struct table *t, intptr_t delta)
|
static void hscrollby(struct table *t, intptr_t delta)
|
||||||
{
|
{
|
||||||
// TODO
|
hscrollto(t, t->hscrollpos + delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hscroll(struct table *t, WPARAM wParam, LPARAM lParam)
|
static void hscroll(struct table *t, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
// TODO
|
intptr_t pos;
|
||||||
}
|
|
||||||
|
|
||||||
static void recomputeHScroll(struct table *t)
|
|
||||||
{
|
|
||||||
SCROLLINFO si;
|
SCROLLINFO si;
|
||||||
RECT r;
|
|
||||||
|
|
||||||
if (GetClientRect(t->hwnd, &r) == 0)
|
pos = t->hscrollpos;
|
||||||
panic("error getting Table client rect for recomputeHScroll()");
|
switch (LOWORD(wParam)) {
|
||||||
ZeroMemory(&si, sizeof (SCROLLINFO));
|
case SB_LEFT:
|
||||||
si.cbSize = sizeof (SCROLLINFO);
|
pos = 0;
|
||||||
si.fMask = SIF_PAGE | SIF_RANGE;
|
break;
|
||||||
si.nPage = r.right - r.left;
|
case SB_RIGHT:
|
||||||
si.nMin = 0;
|
pos = t->width - t->hpagesize;
|
||||||
si.nMax = t->width - 1; // endpoint inclusive
|
break;
|
||||||
SetScrollInfo(t->hwnd, SB_HORZ, &si, TRUE);
|
case SB_LINELEFT:
|
||||||
// TODO what happens if the above call renders the current scroll position moot?
|
pos--;
|
||||||
|
break;
|
||||||
|
case SB_LINERIGHT:
|
||||||
|
pos++;
|
||||||
|
break;
|
||||||
|
case SB_PAGELEFT:
|
||||||
|
pos -= t->hpagesize;
|
||||||
|
break;
|
||||||
|
case SB_PAGERIGHT:
|
||||||
|
pos += t->hpagesize;
|
||||||
|
break;
|
||||||
|
case SB_THUMBPOSITION:
|
||||||
|
ZeroMemory(&si, sizeof (SCROLLINFO));
|
||||||
|
si.cbSize = sizeof (SCROLLINFO);
|
||||||
|
si.fMask = SIF_POS;
|
||||||
|
if (GetScrollInfo(t->hwnd, SB_HORZ, &si) == 0)
|
||||||
|
panic("error getting thumb position for WM_HSCROLL in Table");
|
||||||
|
pos = si.nPos;
|
||||||
|
break;
|
||||||
|
case SB_THUMBTRACK:
|
||||||
|
ZeroMemory(&si, sizeof (SCROLLINFO));
|
||||||
|
si.cbSize = sizeof (SCROLLINFO);
|
||||||
|
si.fMask = SIF_TRACKPOS;
|
||||||
|
if (GetScrollInfo(t->hwnd, SB_HORZ, &si) == 0)
|
||||||
|
panic("error getting thumb track position for WM_HSCROLL in Table");
|
||||||
|
pos = si.nTrackPos;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
hscrollto(t, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO find out if we can indicriminately check for WM_WHEELHSCROLL
|
||||||
|
HANDLER(hscrollHandler)
|
||||||
|
{
|
||||||
|
if (uMsg != WM_HSCROLL)
|
||||||
|
return FALSE;
|
||||||
|
hscroll(t, wParam, lParam);
|
||||||
|
*lResult = 0;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO when we write vscroll.h, see just /what/ is common so we can isolate it
|
||||||
|
|
|
@ -54,6 +54,8 @@ struct table {
|
||||||
int *columnTypes;
|
int *columnTypes;
|
||||||
intptr_t width;
|
intptr_t width;
|
||||||
intptr_t headerHeight;
|
intptr_t headerHeight;
|
||||||
|
intptr_t hscrollpos;
|
||||||
|
intptr_t hpagesize;
|
||||||
};
|
};
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
@ -72,6 +74,7 @@ static const handlerfunc handlers[] = {
|
||||||
resizeHandler,
|
resizeHandler,
|
||||||
drawHandlers,
|
drawHandlers,
|
||||||
apiHandlers,
|
apiHandlers,
|
||||||
|
hscrollHandler,
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue