diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-05-09 15:31:34 +0200 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-05-09 15:32:12 +0200 |
| commit | 97fd5d9ba445dbac0deaef763dce1382a88211d9 (patch) | |
| tree | 90cf926be783f67a744f47c11bb7866b88e965f0 | |
| parent | 77f3c00f226266a92587fce97f5b9bad38ab9fe2 (diff) | |
widget factory: table-based pane registry, allow adding tabs via menu
| -rw-r--r-- | alf/alflayout.cpp | 4 | ||||
| -rw-r--r-- | widgetfactory.cpp | 202 |
2 files changed, 125 insertions, 81 deletions
diff --git a/alf/alflayout.cpp b/alf/alflayout.cpp index 8035e74..0fa3473 100644 --- a/alf/alflayout.cpp +++ b/alf/alflayout.cpp @@ -571,9 +571,9 @@ ALF_Layout_Invalidate(ALFLayout *layout, HWND window) HWND parent = GetParent(window); if (parent) { ALF_InvalidateLayout(parent); - } else { - PostMessage(window, ALF_WM_VALIDATELAYOUT, 0, 0); } + + PostMessage(window, ALF_WM_VALIDATELAYOUT, 0, 0); } diff --git a/widgetfactory.cpp b/widgetfactory.cpp index 008fdb4..7299074 100644 --- a/widgetfactory.cpp +++ b/widgetfactory.cpp @@ -1,6 +1,25 @@ #include "alf/alf.h" enum { + PANE_BUTTONS = 0, + PANE_LABEL, + PANE_COMBO, + PANE_NOTEBOOK, + PANE_CHECKBOX, + PANE_GROUPBOX, + PANE__MAX +}; + +static const TCHAR *g_paneLabels[PANE__MAX] = { + TEXT("Buttons"), //PANE_BUTTONS + TEXT("Label"), //PANE_LABEL, + TEXT("Combo Box"), //PANE_COMBO, + TEXT("Notebook"), //PANE_NOTEBOOK, + TEXT("Checkbox"), //PANE_CHECKBOX, + TEXT("GroupBox") //PANE_GROUPBOX +}; + +enum { ID_COMBO1, ID_COMBO2, ID_LBLCOMBOTEXT, @@ -18,7 +37,8 @@ enum { IDM_BACKGROUND_GRADIENT, IDM_BACKGROUND_GREEN, IDM_BACKGROUND_BLUE, - ID__MAX + IDM_PANES, + IDM_PANES__MAX = IDM_PANES + PANE__MAX }; BOOL (WINAPI *fnGradientFill)(HDC, PTRIVERTEX, ULONG, PVOID, ULONG, ULONG) = NULL; @@ -32,66 +52,6 @@ enum PanelBackgroundMode { #define FM_PANEL_SET_BGMODE (ALF_WM_USER + 1) - -static LRESULT -handleCommand(void *closure, HWND window, WORD notificationcode, WORD sourceid, HWND control) -{ - (void)closure; - - if (notificationcode == CBN_SELCHANGE && sourceid == ID_COMBO2) { - TCHAR *text = ALF_ComboBoxCurrentText(control); - - ALF_SetWidgetText(window, ID_LBLCOMBOTEXT, text); - - ALF_Free(text); - } - if (control != NULL && sourceid == ID_BTNCOMBOCLEAR) { - HWND combo = ALF_WidgetHwndById(window, ID_COMBO2); - ALF_ComboBoxSetCurrentIndex(combo, -1); - } - if (sourceid == ID_HELLO) { - MessageBox(window, TEXT("Hello World!"), TEXT("Hello"), MB_ICONASTERISK|MB_OK); - } - if (control != NULL && sourceid == ID_B_TABBGSOLID) { - HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); - ALF_NotebookAddFlag(nb, ALF_NOTEBOOK_SOLID_TAB_BACKGROUND); - } - if (control != NULL && sourceid == ID_B_TABBGTEXTURE) { - HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); - ALF_NotebookRemoveFlag(nb, ALF_NOTEBOOK_SOLID_TAB_BACKGROUND); - } - - if (sourceid == IDM_FILE_CLOSE) { - SendMessage(window, WM_CLOSE, 0, 0); - } - - if (sourceid == IDM_BACKGROUND_BLUE) { - HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); - HWND panel = ALF_NotebookSelectedPanel(nb); - SendMessage(panel, FM_PANEL_SET_BGMODE, 0, (LPARAM)BG_SOLID_BLUE); - } - - if (sourceid == IDM_BACKGROUND_GREEN) { - HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); - HWND panel = ALF_NotebookSelectedPanel(nb); - SendMessage(panel, FM_PANEL_SET_BGMODE, 0, (LPARAM)BG_SOLID_GREEN); - } - - if (sourceid == IDM_BACKGROUND_INHERIT) { - HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); - HWND panel = ALF_NotebookSelectedPanel(nb); - SendMessage(panel, FM_PANEL_SET_BGMODE, 0, (LPARAM)BG_INHERIT); - } - - if (sourceid == IDM_BACKGROUND_GRADIENT) { - HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); - HWND panel = ALF_NotebookSelectedPanel(nb); - SendMessage(panel, FM_PANEL_SET_BGMODE, 0, (LPARAM)BG_GRADIENT); - } - - return 0; -} - /* common stuff */ typedef struct { DWORD bgmode; @@ -401,9 +361,8 @@ static ALFPanelVTable buttonPanelVtbl = { }; static void -buttonPanelAddToNotebook(HWND hwndNotebook) +buttonPanelInit(HWND panel) { - HWND panel = ALF_NotebookAddTab(hwndNotebook, TEXT("Buttons")); CommonPanelPriv *priv = ALF_New(CommonPanelPriv, 1); ALF_PanelSetVTable(panel, &buttonPanelVtbl, priv); } @@ -495,9 +454,8 @@ static ALFPanelVTable labelPanelVtbl = { }; static void -labelPanelAddToNotebook(HWND hwndNotebook) +labelPanelInit(HWND panel) { - HWND panel = ALF_NotebookAddTab(hwndNotebook, TEXT("Label")); CommonPanelPriv *priv = ALF_New(CommonPanelPriv, 1); ALF_PanelSetVTable(panel, &labelPanelVtbl, priv); } @@ -549,9 +507,8 @@ static ALFPanelVTable comboPanelVtbl = { }; static void -comboPanelAddToNotebook(HWND hwndNotebook) +comboPanelInit(HWND panel) { - HWND panel = ALF_NotebookAddTab(hwndNotebook, TEXT("Combo Box")); CommonPanelPriv *priv = ALF_New(CommonPanelPriv, 1); ALF_PanelSetVTable(panel, &comboPanelVtbl, priv); } @@ -600,9 +557,8 @@ static ALFPanelVTable notebookPanelVtbl = { }; static void -notebookPanelAddToNotebook(HWND hwndNotebook) +notebookPanelInit(HWND panel) { - HWND panel = ALF_NotebookAddTab(hwndNotebook, TEXT("Notebook")); CommonPanelPriv *priv = ALF_New(CommonPanelPriv, 1); ALF_PanelSetVTable(panel, ¬ebookPanelVtbl, priv); } @@ -637,9 +593,8 @@ static ALFPanelVTable checkboxPanelVtbl = { }; static void -checkboxPanelAddToNotebook(HWND hwndNotebook) +checkboxPanelInit(HWND panel) { - HWND panel = ALF_NotebookAddTab(hwndNotebook, TEXT("Checkbox")); CommonPanelPriv *priv = ALF_New(CommonPanelPriv, 1); ALF_PanelSetVTable(panel, &checkboxPanelVtbl, priv); } @@ -708,13 +663,94 @@ static ALFPanelVTable groupboxPanelVtbl = { }; static void -groupboxPanelAddToNotebook(HWND hwndNotebook) +groupboxPanelInit(HWND panel) { - HWND panel = ALF_NotebookAddTab(hwndNotebook, TEXT("GroupBox")); CommonPanelPriv *priv = ALF_New(CommonPanelPriv, 1); ALF_PanelSetVTable(panel, &groupboxPanelVtbl, priv); } +void (*g_paneInitTable[PANE__MAX])(HWND) = { + buttonPanelInit, //PANE_BUTTONS + labelPanelInit, //PANE_LABEL, + comboPanelInit, //PANE_COMBO, + notebookPanelInit, //PANE_NOTEBOOK, + checkboxPanelInit, //PANE_CHECKBOX, + groupboxPanelInit //PANE_GROUPBOX, +}; + +static void +addPaneToNotebook(HWND hwndNotebook, int paneId) +{ + HWND panel = ALF_NotebookAddTab(hwndNotebook, g_paneLabels[paneId]); + g_paneInitTable[paneId](panel); +} + + +static LRESULT +handleCommand(void *closure, HWND window, WORD notificationcode, WORD sourceid, HWND control) +{ + (void)closure; + + if (notificationcode == CBN_SELCHANGE && sourceid == ID_COMBO2) { + TCHAR *text = ALF_ComboBoxCurrentText(control); + + ALF_SetWidgetText(window, ID_LBLCOMBOTEXT, text); + + ALF_Free(text); + } + if (control != NULL && sourceid == ID_BTNCOMBOCLEAR) { + HWND combo = ALF_WidgetHwndById(window, ID_COMBO2); + ALF_ComboBoxSetCurrentIndex(combo, -1); + } + if (sourceid == ID_HELLO) { + MessageBox(window, TEXT("Hello World!"), TEXT("Hello"), MB_ICONASTERISK|MB_OK); + } + if (control != NULL && sourceid == ID_B_TABBGSOLID) { + HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); + ALF_NotebookAddFlag(nb, ALF_NOTEBOOK_SOLID_TAB_BACKGROUND); + } + if (control != NULL && sourceid == ID_B_TABBGTEXTURE) { + HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); + ALF_NotebookRemoveFlag(nb, ALF_NOTEBOOK_SOLID_TAB_BACKGROUND); + } + + if (sourceid == IDM_FILE_CLOSE) { + SendMessage(window, WM_CLOSE, 0, 0); + } + + if (sourceid == IDM_BACKGROUND_BLUE) { + HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); + HWND panel = ALF_NotebookSelectedPanel(nb); + SendMessage(panel, FM_PANEL_SET_BGMODE, 0, (LPARAM)BG_SOLID_BLUE); + } + + if (sourceid == IDM_BACKGROUND_GREEN) { + HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); + HWND panel = ALF_NotebookSelectedPanel(nb); + SendMessage(panel, FM_PANEL_SET_BGMODE, 0, (LPARAM)BG_SOLID_GREEN); + } + + if (sourceid == IDM_BACKGROUND_INHERIT) { + HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); + HWND panel = ALF_NotebookSelectedPanel(nb); + SendMessage(panel, FM_PANEL_SET_BGMODE, 0, (LPARAM)BG_INHERIT); + } + + if (sourceid == IDM_BACKGROUND_GRADIENT) { + HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); + HWND panel = ALF_NotebookSelectedPanel(nb); + SendMessage(panel, FM_PANEL_SET_BGMODE, 0, (LPARAM)BG_GRADIENT); + } + + if (sourceid >= IDM_PANES && sourceid < IDM_PANES__MAX) { + int paneId = sourceid - IDM_PANES; + HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); + addPaneToNotebook(nb, paneId); + } + + return 0; +} + int CALLBACK #ifdef UNICODE wWinMain @@ -753,12 +789,13 @@ WinMain MessageBox(0, TEXT("couldn't create main window!"), 0, MB_ICONHAND|MB_OK); HWND hwndNtbk = ALF_AddNotebook(win, ID_NOTEBOOK, 0, 0); - buttonPanelAddToNotebook(hwndNtbk); - labelPanelAddToNotebook(hwndNtbk); - comboPanelAddToNotebook(hwndNtbk); - notebookPanelAddToNotebook(hwndNtbk); - checkboxPanelAddToNotebook(hwndNtbk); - groupboxPanelAddToNotebook(hwndNtbk); + + addPaneToNotebook(hwndNtbk, PANE_BUTTONS); + addPaneToNotebook(hwndNtbk, PANE_LABEL); + addPaneToNotebook(hwndNtbk, PANE_CHECKBOX); + addPaneToNotebook(hwndNtbk, PANE_NOTEBOOK); + addPaneToNotebook(hwndNtbk, PANE_COMBO); + addPaneToNotebook(hwndNtbk, PANE_GROUPBOX); ALF_SetDefaultButton(win, ID_HELLO); @@ -766,11 +803,14 @@ WinMain HMENU mainmenu = CreateMenu(); HMENU filemenu = CreateMenu(); + HMENU newtabmn = CreateMenu(); HMENU helpmenu = CreateMenu(); HMENU bgmenu = CreateMenu(); AppendMenu(filemenu, MF_STRING, ID_HELLO, TEXT("Hello")); AppendMenu(filemenu, MF_SEPARATOR, 0, 0); + AppendMenu(filemenu, MF_POPUP, (UINT_PTR)newtabmn, TEXT("New Tab")); + AppendMenu(filemenu, MF_SEPARATOR, 0, 0); AppendMenu(filemenu, MF_STRING, IDM_FILE_CLOSE, TEXT("&Close\tAlt+F4")); AppendMenu(helpmenu, MF_STRING, IDM_HELP_ABOUT, TEXT("&About")); @@ -784,6 +824,10 @@ WinMain AppendMenu(mainmenu, MF_POPUP, (UINT_PTR)bgmenu, TEXT("Background")); AppendMenu(mainmenu, MF_POPUP, (UINT_PTR)helpmenu, TEXT("&Help")); + for (int i = 0; i < PANE__MAX; ++i) { + AppendMenu(newtabmn, MF_STRING, IDM_PANES + (UINT)i, g_paneLabels[i]); + } + SetMenu(win, mainmenu); ALF_ShowModal(win); |
