summaryrefslogtreecommitdiff
path: root/alf/alfnotebook.cpp
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2020-04-22 16:49:38 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2020-04-22 16:49:38 +0200
commitf81e1371de63c0bd4c0ae77cbba0fed908fd58b2 (patch)
tree50fe12f2a0d0739c69265180b22fe1847f62d207 /alf/alfnotebook.cpp
parent31b35bfe05740beac6481e6ff8d365f2a9cebbb3 (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/alfnotebook.cpp')
-rw-r--r--alf/alfnotebook.cpp119
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);