diff options
| author | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-05-31 01:49:11 +0200 |
|---|---|---|
| committer | Jonas Kümmerlin <jonas@kuemmerlin.eu> | 2020-05-31 01:49:11 +0200 |
| commit | 9251e89359ce46d08c0924b09d48fedbdf2c95fb (patch) | |
| tree | 4adb0418223a07834f8e55a457c07ceda1bf29b3 /widgetfactory.cpp | |
| parent | 8d31086aed4aa91232cbaad9cf88d720e6329bcf (diff) | |
ALFApplication and multiple toplevels support
Diffstat (limited to 'widgetfactory.cpp')
| -rw-r--r-- | widgetfactory.cpp | 79 |
1 files changed, 73 insertions, 6 deletions
diff --git a/widgetfactory.cpp b/widgetfactory.cpp index 060544b..f761d2b 100644 --- a/widgetfactory.cpp +++ b/widgetfactory.cpp @@ -40,11 +40,15 @@ enum { IDM_PANES, IDM_PANES__MAX = IDM_PANES + PANE__MAX, IDM_MODALDIALOG_PANES, - IDM_MODALDIALOG_PANES__MAX = IDM_MODALDIALOG_PANES + PANE__MAX + IDM_MODALDIALOG_PANES__MAX = IDM_MODALDIALOG_PANES + PANE__MAX, + IDM_MODELESSDIALOG_PANES, + IDM_MODELESSDIALOG_PANES__MAX = IDM_MODELESSDIALOG_PANES + PANE__MAX }; BOOL (WINAPI *fnGradientFill)(HDC, PTRIVERTEX, ULONG, PVOID, ULONG, ULONG) = NULL; +static ALFApplication *g_application = NULL; + enum PanelBackgroundMode { BG_INHERIT, BG_GRADIENT, @@ -55,6 +59,7 @@ enum PanelBackgroundMode { #define FM_PANEL_SET_BGMODE (ALF_WM_USER + 1) static void wfModalDialogRun(HWND owner, int pane); +static void wfModelessDialogStart(int pane); /* common stuff */ typedef struct { @@ -749,7 +754,8 @@ handleClose(void *closure, HWND window) { (void)closure; - ALF_Toplevel_SetModalResult(window, 0); + //ALF_Toplevel_SetModalResult(window, 0); + DestroyWindow(window); } static LRESULT @@ -819,6 +825,11 @@ handleCommand(void *closure, HWND window, WORD notificationcode, WORD sourceid, wfModalDialogRun(window, paneId); } + if (sourceid >= IDM_MODELESSDIALOG_PANES && sourceid < IDM_MODELESSDIALOG_PANES__MAX) { + int paneId = sourceid - IDM_MODELESSDIALOG_PANES; + wfModelessDialogStart(paneId); + } + return 0; } @@ -868,13 +879,62 @@ wfModalDialogRun(HWND owner, int pane) { HWND dlg = ALF_CreateToplevelWindow(WS_EX_DLGMODALFRAME, WS_POPUPWINDOW | WS_CAPTION | WS_THICKFRAME, - owner, + owner, g_application, &g_wfModalDialogVtbl, (void*)(LONG_PTR)pane); ALF_Toplevel_ShowModal(dlg); DestroyWindow(dlg); } +static BOOL +wfModelessDialogInit(void *closure, HWND dialog) +{ + HWND panel = ALF_AddPanel(dialog, (WORD)-1, 1, 1); + int paneid = (int)(LONG_PTR)closure; + g_paneInitTable[paneid](panel); + + ALF_SetText(dialog, g_paneLabels[paneid]); + + ALF_LayoutSetColumnExpandNumerator(dialog, 1, 1); + ALF_LayoutSetRowExpandNumerator(dialog, 1, 1); + ALF_LayoutSetRowMinSize(dialog, 0, 525); + ALF_LayoutSetRowMinSize(dialog, 2, 525); + ALF_LayoutSetColumnMinSize(dialog, 0, 525); + ALF_LayoutSetColumnMinSize(dialog, 2, 525); + + return TRUE; +} + +static void +wfModelessDialogClose(void *closure, HWND dialog) +{ + (void)closure; + + DestroyWindow(dialog); +} + +static ALFToplevelVTable g_wfModelessDialogVtbl; + +static void +wfModelessDialogPrepareVtbl(void) +{ + ZeroMemory(&g_wfModelessDialogVtbl, sizeof(g_wfModelessDialogVtbl)); + g_wfModelessDialogVtbl.close = wfModelessDialogClose; + g_wfModelessDialogVtbl.initialize = wfModelessDialogInit; +} + +static void +wfModelessDialogStart(int pane) +{ + HWND dlg = ALF_CreateToplevelWindow(0, + WS_OVERLAPPEDWINDOW, + NULL, g_application, + &g_wfModelessDialogVtbl, + (void*)(LONG_PTR)pane); + ShowWindow(dlg, SW_SHOW); +} + + int CALLBACK #ifdef UNICODE wWinMain @@ -898,6 +958,7 @@ WinMain } wfModalDialogPrepareVtbl(); + wfModelessDialogPrepareVtbl(); ALFToplevelVTable vtbl; ZeroMemory(&vtbl, sizeof(vtbl)); @@ -907,7 +968,9 @@ WinMain ALF_Initialize(); - HWND win = ALF_CreateToplevelWindow(0, WS_OVERLAPPEDWINDOW, NULL, &vtbl, NULL); + g_application = ALF_CreateApplication(); + + HWND win = ALF_CreateToplevelWindow(0, WS_OVERLAPPEDWINDOW, NULL, g_application, &vtbl, NULL); if (!win) { MessageBox(0, TEXT("couldn't create main window!"), 0, MB_ICONHAND|MB_OK); return 1; @@ -944,6 +1007,7 @@ WinMain HMENU filemenu = CreateMenu(); HMENU newtabmn = CreateMenu(); HMENU modwndmn = CreateMenu(); + HMENU mlwndmn = CreateMenu(); HMENU helpmenu = CreateMenu(); HMENU bgmenu = CreateMenu(); @@ -951,6 +1015,7 @@ WinMain AppendMenu(filemenu, MF_SEPARATOR, 0, 0); AppendMenu(filemenu, MF_POPUP, (UINT_PTR)newtabmn, TEXT("New Tab")); AppendMenu(filemenu, MF_POPUP, (UINT_PTR)modwndmn, TEXT("Show Modal")); + AppendMenu(filemenu, MF_POPUP, (UINT_PTR)mlwndmn, TEXT("Show Modeless")); AppendMenu(filemenu, MF_SEPARATOR, 0, 0); AppendMenu(filemenu, MF_STRING, IDM_FILE_CLOSE, TEXT("&Close\tAlt+F4")); @@ -968,14 +1033,16 @@ WinMain for (int i = 0; i < PANE__MAX; ++i) { AppendMenu(newtabmn, MF_STRING, IDM_PANES + (UINT)i, g_paneLabels[i]); AppendMenu(modwndmn, MF_STRING, IDM_MODALDIALOG_PANES + (UINT)i, g_paneLabels[i]); + AppendMenu(mlwndmn, MF_STRING, IDM_MODELESSDIALOG_PANES + (UINT)i, g_paneLabels[i]); } SetMenu(win, mainmenu); ALF_Toplevel_EnsureBigEnough(win); - ALF_Toplevel_ShowModal(win); - DestroyWindow(win); + ALF_Application_Run(g_application); + ALF_DestroyApplication(g_application); + ALF_UnInitialize(); return 0; |
