From 597b1cea5afa692548da59afffc4cf523801eaa4 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Wed, 2 Sep 2015 13:19:34 -0400 Subject: [PATCH] Made uiTab pages siblings of the tab control itself rather than children. This is more correct. --- redo/windows/child.c | 4 +++- redo/windows/tab.c | 31 +++++++++++++++++++++++++------ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/redo/windows/child.c b/redo/windows/child.c index ec2f5c28..f126fd13 100644 --- a/redo/windows/child.c +++ b/redo/windows/child.c @@ -24,6 +24,7 @@ struct child { struct child *newChild(uiControl *child, uiControl *parent, HWND parentHWND) { struct child *c; + uiWindowsControl *wc; if (child == NULL) return NULL; @@ -33,7 +34,8 @@ struct child *newChild(uiControl *child, uiControl *parent, HWND parentHWND) c->hwnd = (HWND) uiControlHandle(c->c); uiControlSetParent(c->c, parent); - uiWindowsEnsureSetParent(c->hwnd, parentHWND); + wc = uiWindowsControl(c->c); + (*(wc->CommitSetParent))(wc, parentHWND); return c; } diff --git a/redo/windows/tab.c b/redo/windows/tab.c index 0e517ccb..29d8b74c 100644 --- a/redo/windows/tab.c +++ b/redo/windows/tab.c @@ -3,12 +3,14 @@ // TODO // - can't seem to tab away anymore -// - removving the first page then pressing a BS_PUSHBUTTON button hangs +// - write comment here about how tabs and parents work +// - make sure parent Z-orders are always above tab Z-orders struct uiTab { uiWindowsControl c; HWND hwnd; struct ptrArray *pages; + HWND parent; }; static void onDestroy(uiTab *); @@ -70,6 +72,23 @@ static void onDestroy(uiTab *t) uiWindowsUnregisterWM_NOTIFYHandler(t->hwnd); } +static void tabCommitSetParent(uiWindowsControl *c, HWND parent) +{ + uiTab *t = uiTab(c); + struct child *page; + HWND pagehwnd; + uintmax_t i; + + t->parent = parent; + uiWindowsEnsureSetParent(t->hwnd, t->parent); + for (i = 0; i < t->pages->len; i++) { + page = ptrArrayIndex(t->pages, struct child *, i); + pagehwnd = childTabPage(page); + uiWindowsEnsureSetParent(pagehwnd, t->parent); + } + uiWindowsRearrangeControlIDsZOrder(uiControl(t)); +} + static void minimumSize(uiWindowsControl *c, uiWindowsSizing *d, intmax_t *width, intmax_t *height) { /* TODO @@ -117,11 +136,11 @@ static void tabRelayout(uiWindowsControl *c, intmax_t x, intmax_t y, intmax_t wi // now we need to figure out what rect the child goes // this rect needs to be in parent window coordinates, but TCM_ADJUSTRECT wants a window rect, which is screen coordinates + // because we have each page as a sibling of the tab, use the tab's own rect as the input rect r.left = x; r.top = y; r.right = x + width; r.bottom = y + height; - // TODO use the real parent; see below mapWindowRect(t->hwnd, NULL, &r); SendMessageW(t->hwnd, TCM_ADJUSTRECT, (WPARAM) FALSE, (LPARAM) (&r)); mapWindowRect(NULL, t->hwnd, &r); @@ -168,10 +187,7 @@ void uiTabInsertAt(uiTab *t, const char *name, uintmax_t n, uiControl *child) // see below hide = curpage(t); - // TODO make a child of the parent, not of the tab - // this is the only real way to do proper tab stops - // it's how tabs are /supposed to/ be done, anyway - page = newChildWithTabPage(child, uiControl(t), t->hwnd); + page = newChildWithTabPage(child, uiControl(t), t->parent); childSetSoleControlID(page); ptrArrayInsertAt(t->pages, n, page); @@ -243,8 +259,11 @@ uiTab *uiNewTab(void) t->pages = newPtrArray(); + t->parent = utilWindow; + uiWindowsFinishNewControl(t, uiTab); uiControl(t)->ContainerUpdateState = tabContainerUpdateState; + uiWindowsControl(t)->CommitSetParent = tabCommitSetParent; uiWindowsControl(t)->Relayout = tabRelayout; uiWindowsControl(t)->ArrangeChildrenControlIDsZOrder = tabArrangeChildrenControlIDsZOrder;