From ea92db188b79a7a602b8c4b902c4aab882d0a8d1 Mon Sep 17 00:00:00 2001 From: gocha Date: Tue, 20 Oct 2009 08:06:29 +0000 Subject: [PATCH] luaconsole: allow resizing, add vertical scrollbar --- src/drivers/win/luaconsole.cpp | 116 +++++++++++++++++++++++++++++++-- src/drivers/win/res.rc | 4 +- 2 files changed, 113 insertions(+), 7 deletions(-) diff --git a/src/drivers/win/luaconsole.cpp b/src/drivers/win/luaconsole.cpp index 31a6a70f..e4152b7e 100644 --- a/src/drivers/win/luaconsole.cpp +++ b/src/drivers/win/luaconsole.cpp @@ -9,6 +9,39 @@ extern HWND hAppWnd; HWND LuaConsoleHWnd = NULL; +struct ControlLayoutInfo +{ + int controlID; + + enum LayoutType // what to do when the containing window resizes + { + NONE, // leave the control where it was + RESIZE_END, // resize the control + MOVE_START, // move the control + }; + LayoutType horizontalLayout; + LayoutType verticalLayout; +}; +struct ControlLayoutState +{ + int x,y,width,height; + bool valid; + ControlLayoutState() : valid(false) {} +}; + +static ControlLayoutInfo controlLayoutInfos [] = { + {IDC_LUACONSOLE, ControlLayoutInfo::RESIZE_END, ControlLayoutInfo::RESIZE_END}, + {IDC_EDIT_LUAPATH, ControlLayoutInfo::RESIZE_END, ControlLayoutInfo::NONE}, + {IDC_BUTTON_LUARUN, ControlLayoutInfo::MOVE_START, ControlLayoutInfo::NONE}, + {IDC_BUTTON_LUASTOP, ControlLayoutInfo::MOVE_START, ControlLayoutInfo::NONE}, +}; +static const int numControlLayoutInfos = sizeof(controlLayoutInfos)/sizeof(*controlLayoutInfos); + +struct { + int width; int height; + ControlLayoutState layoutState [numControlLayoutInfos]; +} windowInfo; + void PrintToWindowConsole(int hDlgAsInt, const char* str) { HWND hDlg = (HWND)hDlgAsInt; @@ -72,11 +105,6 @@ INT_PTR CALLBACK DlgLuaScriptDialog(HWND hDlg, UINT msg, WPARAM wParam, LPARAM l case WM_INITDIALOG: { - // disable resizing - LONG wndStyle = GetWindowLong(hDlg, GWL_STYLE); - wndStyle &= ~WS_THICKFRAME; - SetWindowLong(hDlg, GWL_STYLE, wndStyle); - // remove the 30000 character limit from the console control SendMessage(GetDlgItem(hDlg, IDC_LUACONSOLE),EM_LIMITTEXT,0,0); @@ -111,11 +139,89 @@ INT_PTR CALLBACK DlgLuaScriptDialog(HWND hDlg, UINT msg, WPARAM wParam, LPARAM l SetWindowPos(hDlg, NULL, r.left, r.top, NULL, NULL, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW); + RECT r3; + GetClientRect(hDlg, &r3); + windowInfo.width = r3.right - r3.left; + windowInfo.height = r3.bottom - r3.top; + for(int i = 0; i < numControlLayoutInfos; i++) { + ControlLayoutState& layoutState = windowInfo.layoutState[i]; + layoutState.valid = false; + } + DragAcceptFiles(hDlg, true); SetDlgItemText(hDlg, IDC_EDIT_LUAPATH, FCEU_GetLuaScriptName()); return true; } break; + case WM_SIZE: + { + // resize or move controls in the window as necessary when the window is resized + + //LuaPerWindowInfo& windowInfo = LuaWindowInfo[hDlg]; + int prevDlgWidth = windowInfo.width; + int prevDlgHeight = windowInfo.height; + + int dlgWidth = LOWORD(lParam); + int dlgHeight = HIWORD(lParam); + + int deltaWidth = dlgWidth - prevDlgWidth; + int deltaHeight = dlgHeight - prevDlgHeight; + + for(int i = 0; i < numControlLayoutInfos; i++) + { + ControlLayoutInfo layoutInfo = controlLayoutInfos[i]; + ControlLayoutState& layoutState = windowInfo.layoutState[i]; + + HWND hCtrl = GetDlgItem(hDlg,layoutInfo.controlID); + + int x,y,width,height; + if(layoutState.valid) + { + x = layoutState.x; + y = layoutState.y; + width = layoutState.width; + height = layoutState.height; + } + else + { + RECT r; + GetWindowRect(hCtrl, &r); + POINT p = {r.left, r.top}; + ScreenToClient(hDlg, &p); + x = p.x; + y = p.y; + width = r.right - r.left; + height = r.bottom - r.top; + } + + switch(layoutInfo.horizontalLayout) + { + case ControlLayoutInfo::RESIZE_END: width += deltaWidth; break; + case ControlLayoutInfo::MOVE_START: x += deltaWidth; break; + default: break; + } + switch(layoutInfo.verticalLayout) + { + case ControlLayoutInfo::RESIZE_END: height += deltaHeight; break; + case ControlLayoutInfo::MOVE_START: y += deltaHeight; break; + default: break; + } + + SetWindowPos(hCtrl, 0, x,y, width,height, 0); + + layoutState.x = x; + layoutState.y = y; + layoutState.width = width; + layoutState.height = height; + layoutState.valid = true; + } + + windowInfo.width = dlgWidth; + windowInfo.height = dlgHeight; + + RedrawWindow(hDlg, NULL, NULL, RDW_INVALIDATE); + } break; + case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: diff --git a/src/drivers/win/res.rc b/src/drivers/win/res.rc index 05913466..2eb0d5fb 100644 --- a/src/drivers/win/res.rc +++ b/src/drivers/win/res.rc @@ -1447,7 +1447,7 @@ BEGIN END IDD_LUA DIALOGEX 0, 0, 270, 150 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME CAPTION "Lua Script" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN @@ -1455,7 +1455,7 @@ BEGIN PUSHBUTTON "Run",IDC_BUTTON_LUARUN,213,31,50,16 PUSHBUTTON "Stop",IDC_BUTTON_LUASTOP,160,31,50,16 EDITTEXT IDC_EDIT_LUAPATH,7,16,256,14,ES_AUTOHSCROLL - EDITTEXT IDC_LUACONSOLE,7,61,256,81,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY + EDITTEXT IDC_LUACONSOLE,7,61,256,81,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL LTEXT "Output Console",IDC_STATIC,7,51,51,8 LTEXT "Script File",IDC_STATIC,7,7,32,8 PUSHBUTTON "Edit",IDC_BUTTON_LUAEDIT,58,31,46,16