diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-04-22 16:49:38 +0200 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-04-22 16:49:38 +0200 |
| commit | f81e1371de63c0bd4c0ae77cbba0fed908fd58b2 (patch) | |
| tree | 50fe12f2a0d0739c69265180b22fe1847f62d207 /alf | |
| parent | 31b35bfe05740beac6481e6ff8d365f2a9cebbb3 (diff) | |
notebook: save layout flags to control font and bg inheritance
this makes setting fonts and background color for tab panels work,
instead of appearing to work but then being overridden later
Diffstat (limited to 'alf')
| -rw-r--r-- | alf/alfnotebook.cpp | 119 |
1 files changed, 101 insertions, 18 deletions
diff --git a/alf/alfnotebook.cpp b/alf/alfnotebook.cpp index 143defa..501b072 100644 --- a/alf/alfnotebook.cpp +++ b/alf/alfnotebook.cpp @@ -19,6 +19,12 @@ typedef struct { DWORD flags; } ALFNotebookPriv; +typedef struct { + TCITEMHEADER header; + DWORD layoutFlags; + HWND panel; +} ALFNotebookPage; + static ALFNotebookPriv * ALF_Notebook_CreatePriv(void) { @@ -49,13 +55,13 @@ ALF_Notebook_InternalTabPanel(HWND notebook, HWND tabControl, int index) { (void)notebook; - TCITEM tci; - ZeroMemory(&tci, sizeof(tci)); + ALFNotebookPage p; + ZeroMemory(&p, sizeof(p)); - tci.mask = TCIF_PARAM; + p.header.mask = TCIF_PARAM; - if (TabCtrl_GetItem(tabControl, index, &tci)) { - return (HWND)tci.lParam; + if (TabCtrl_GetItem(tabControl, index, &p)) { + return p.panel; } else { return NULL; } @@ -101,8 +107,32 @@ ALF_Notebook_SetAllTabBackgrounds(HWND hwndNotebook, ALFNotebookPriv *priv) { int n = ALF_Notebook_InternalTabCount(hwndNotebook, priv->hwndTabCtrl); for (int i = 0; i < n; ++i) { - HWND panel = ALF_Notebook_InternalTabPanel(hwndNotebook, priv->hwndTabCtrl, i); - ALF_Notebook_SetSingleTabBackground(hwndNotebook, priv, panel); + ALFNotebookPage p; + ZeroMemory(&p, sizeof(p)); + p.header.mask = TCIF_PARAM; + + if (TabCtrl_GetItem(priv->hwndTabCtrl, i, &p)) { + if (p.layoutFlags & ALF_LAYOUT_INHERITBGCOLOR) { + ALF_Notebook_SetSingleTabBackground(hwndNotebook, priv, p.panel); + } + } + } +} + +static void +ALF_Notebook_PropagateFontToPages(HWND hwndNotebook, ALFNotebookPriv *priv, HFONT font, LPARAM lparam) +{ + int n = ALF_Notebook_InternalTabCount(hwndNotebook, priv->hwndTabCtrl); + for (int i = 0; i < n; ++i) { + ALFNotebookPage p; + ZeroMemory(&p, sizeof(p)); + p.header.mask = TCIF_PARAM; + + if (TabCtrl_GetItem(priv->hwndTabCtrl, i, &p)) { + if (p.layoutFlags & ALF_LAYOUT_INHERITFONT) { + SendMessage(p.panel, WM_SETFONT, (WPARAM)font, lparam); + } + } } } @@ -145,14 +175,15 @@ ALF_Notebook_InternalAddTab(HWND notebook, ALFNotebookPriv *priv, const TCHAR *t ALF_Notebook_SetSingleTabBackground(notebook, priv, hwndPanel); - TCITEM tie; - ZeroMemory(&tie, sizeof(tie)); + ALFNotebookPage p; + ZeroMemory(&p, sizeof(p)); - tie.mask = TCIF_TEXT | TCIF_PARAM; - tie.pszText = (TCHAR*)title; - tie.lParam = (LPARAM)hwndPanel; + p.header.mask = TCIF_TEXT | TCIF_PARAM; + p.header.pszText = (TCHAR*)title; + p.layoutFlags = ALF_LAYOUT_INHERITBGCOLOR | ALF_LAYOUT_INHERITFONT; + p.panel = hwndPanel; - TabCtrl_InsertItem(priv->hwndTabCtrl, ALF_Notebook_InternalTabCount(notebook, priv->hwndTabCtrl), &tie); + TabCtrl_InsertItem(priv->hwndTabCtrl, ALF_Notebook_InternalTabCount(notebook, priv->hwndTabCtrl), &p); ALF_Notebook_InternalHandleTabChange(notebook, priv->hwndTabCtrl); ALF_InvalidateLayout(notebook); @@ -222,6 +253,56 @@ ALF_Notebook_InternalPaint(HWND hwnd, ALFNotebookPriv *priv, HDC dc, RECT *f) FillRect(dc, f, GetSysColorBrush(COLOR_BTNFACE)); } +static DWORD +ALF_Notebook_GetWidgetFlags(HWND hwndNotebook, ALFNotebookPriv *priv, HWND widget) +{ + int n = ALF_Notebook_InternalTabCount(hwndNotebook, priv->hwndTabCtrl); + for (int i = 0; i < n; ++i) { + ALFNotebookPage p; + ZeroMemory(&p, sizeof(p)); + p.header.mask = TCIF_PARAM; + + if (TabCtrl_GetItem(priv->hwndTabCtrl, i, &p)) { + if (p.panel == widget) { + return p.layoutFlags; + } + } + } + + return 0; +} + +static BOOL +ALF_Notebook_SetWidgetFlags(HWND hwndNotebook, ALFNotebookPriv *priv, HWND widget, DWORD flags) +{ + int n = ALF_Notebook_InternalTabCount(hwndNotebook, priv->hwndTabCtrl); + for (int i = 0; i < n; ++i) { + ALFNotebookPage p; + ZeroMemory(&p, sizeof(p)); + p.header.mask = TCIF_PARAM; + + if (TabCtrl_GetItem(priv->hwndTabCtrl, i, &p)) { + if (p.panel == widget) { + if (p.layoutFlags == flags) + return TRUE; + + if ((flags & ALF_LAYOUT_INHERITFONT) && !(p.layoutFlags & ALF_LAYOUT_INHERITFONT)) { + SendMessage(p.panel, WM_SETFONT, (WPARAM)SendMessage(priv->hwndTabCtrl, WM_GETFONT, 0, 0), TRUE); + } + if ((flags & ALF_LAYOUT_INHERITBGCOLOR) && !(p.layoutFlags & ALF_LAYOUT_INHERITBGCOLOR)) { + ALF_Notebook_SetSingleTabBackground(hwndNotebook, priv, p.panel); + } + + p.layoutFlags = flags; + + return TabCtrl_SetItem(priv->hwndTabCtrl, i, &p); + } + } + } + + return FALSE; +} + static LRESULT CALLBACK ALF__NotebookWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -242,6 +323,8 @@ ALF__NotebookWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ALF_HINSTANCE, NULL); + TabCtrl_SetItemExtra(priv->hwndTabCtrl, sizeof(ALFNotebookPage) - sizeof(TCITEMHEADER)); + ALF_Compat_SetWindowSubclass(priv->hwndTabCtrl, ALF_Notebook_TabCtrlSubclassProc, 0, 0); SetWindowLongPtr(hwnd, 0, (LONG_PTR)priv); @@ -258,11 +341,7 @@ ALF__NotebookWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } else if (uMsg == WM_SETFONT) { SendMessage(priv->hwndTabCtrl, WM_SETFONT, wParam, lParam); - int n = ALF_Notebook_InternalTabCount(hwnd, priv->hwndTabCtrl); - for (int i = 0; i < n; ++i) { - HWND p = ALF_Notebook_InternalTabPanel(hwnd, priv->hwndTabCtrl, i); - SendMessage(p, WM_SETFONT, wParam, lParam); - } + ALF_Notebook_PropagateFontToPages(hwnd, priv, (HFONT)wParam, lParam); ALF_InvalidateLayout(hwnd); } else if (uMsg == WM_GETFONT) { @@ -375,6 +454,10 @@ ALF__NotebookWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if ((oldFlags & ALF_NOTEBOOK_SOLID_TAB_BACKGROUND) != (priv->flags & ALF_NOTEBOOK_SOLID_TAB_BACKGROUND)) { ALF_Notebook_SetAllTabBackgrounds(hwnd, priv); } + } else if (uMsg == ALF_WM_LYT_GETWDGTFLAGS) { + return (LRESULT)ALF_Notebook_GetWidgetFlags(hwnd, priv, (HWND)wParam); + } else if (uMsg == ALF_WM_LYT_SETWDGTFLAGS) { + return (LRESULT)ALF_Notebook_SetWidgetFlags(hwnd, priv, (HWND)wParam, (DWORD)lParam); } return DefWindowProc(hwnd, uMsg, wParam, lParam); |
