From 451e0b8595be60687ad3a278c65953cf72c1ee83 Mon Sep 17 00:00:00 2001 From: unknown <georgijbondarenko248@gmail.com> Date: Wed, 14 Aug 2024 13:29:22 +0300 Subject: [PATCH] GUI is now used as submodule, because it useing not only NGT. --- .gitignore | 2 +- .gitmodules | 6 + GUI | 1 + NGTScript/NGTScript.vcxproj | 4 +- NGTScript/NGTScript.vcxproj.filters | 4 +- NGTScript/gui.cpp | 608 ---------------------------- NGTScript/gui.h | 64 --- NGTScript/ngt.h | 2 +- ngt-docs | 1 + 9 files changed, 14 insertions(+), 678 deletions(-) create mode 100644 .gitmodules create mode 160000 GUI delete mode 100644 NGTScript/gui.cpp delete mode 100644 NGTScript/gui.h create mode 160000 ngt-docs diff --git a/.gitignore b/.gitignore index a99b039..a4b1866 100644 --- a/.gitignore +++ b/.gitignore @@ -9,5 +9,5 @@ NGTScript/NGTScript *.swp *.pdb *.reapeaks -docs/ +ngt-docs/ GUI/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..9442984 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "ngt-docs"] + path = ngt-docs + url = https://github.com/m1maker/ngt-docs +[submodule "GUI"] + path = GUI + url = https://github.com/m1maker/GUI diff --git a/GUI b/GUI new file mode 160000 index 0000000..af0fd99 --- /dev/null +++ b/GUI @@ -0,0 +1 @@ +Subproject commit af0fd998228758d947f44f26f558352129036e34 diff --git a/NGTScript/NGTScript.vcxproj b/NGTScript/NGTScript.vcxproj index d939c07..b980cc9 100644 --- a/NGTScript/NGTScript.vcxproj +++ b/NGTScript/NGTScript.vcxproj @@ -153,6 +153,7 @@ </Xdcmake> </ItemDefinitionGroup> <ItemGroup> + <ClInclude Include="..\GUI\gui.h" /> <ClInclude Include="AES\aes.h" /> <ClInclude Include="AES\aes.hpp" /> <ClInclude Include="angelscript.h" /> @@ -179,7 +180,6 @@ <ClInclude Include="ffi_common.h" /> <ClInclude Include="fx\freeverb.h" /> <ClInclude Include="fx\verblib.h" /> - <ClInclude Include="gui.h" /> <ClInclude Include="http.h" /> <ClInclude Include="joystick.h" /> <ClInclude Include="MemoryStream.h" /> @@ -294,6 +294,7 @@ <ClInclude Include="uni_algo.h" /> </ItemGroup> <ItemGroup> + <ClCompile Include="..\GUI\gui.cpp" /> <ClCompile Include="AES\aes.c" /> <ClCompile Include="as_class.cpp" /> <ClCompile Include="cmp.c" /> @@ -303,7 +304,6 @@ <ClCompile Include="dlibrary.cpp" /> <ClCompile Include="docgen.cpp" /> <ClCompile Include="fx\freeverb.c" /> - <ClCompile Include="gui.cpp" /> <ClCompile Include="http.cpp" /> <ClCompile Include="joystick.cpp" /> <ClCompile Include="main.cpp" /> diff --git a/NGTScript/NGTScript.vcxproj.filters b/NGTScript/NGTScript.vcxproj.filters index de2e2d4..48e6fe4 100644 --- a/NGTScript/NGTScript.vcxproj.filters +++ b/NGTScript/NGTScript.vcxproj.filters @@ -37,10 +37,10 @@ <ClCompile Include="fx\freeverb.c" /> <ClCompile Include="cmp.c" /> <ClCompile Include="docgen.cpp" /> - <ClCompile Include="gui.cpp" /> <ClCompile Include="MemoryStream.cpp" /> <ClCompile Include="scriptstdstring\scriptstdwstring.cpp" /> <ClCompile Include="AES\aes.c" /> + <ClCompile Include="..\GUI\gui.cpp" /> </ItemGroup> <ItemGroup> <ClInclude Include="angelscript.h" /> @@ -174,7 +174,6 @@ <ClInclude Include="SDL3\SDL_video.h" /> <ClInclude Include="SDL3\SDL_vulkan.h" /> <ClInclude Include="docgen.h" /> - <ClInclude Include="gui.h" /> <ClInclude Include="MemoryStream.h" /> <ClInclude Include="ffi.h" /> <ClInclude Include="ffi_cfi.h" /> @@ -182,5 +181,6 @@ <ClInclude Include="scriptstdstring\scriptstdwstring.h" /> <ClInclude Include="AES\aes.h" /> <ClInclude Include="AES\aes.hpp" /> + <ClInclude Include="..\GUI\gui.h" /> </ItemGroup> </Project> \ No newline at end of file diff --git a/NGTScript/gui.cpp b/NGTScript/gui.cpp deleted file mode 100644 index 0418029..0000000 --- a/NGTScript/gui.cpp +++ /dev/null @@ -1,608 +0,0 @@ -#include<chrono> -#include <iostream> -#include <sstream> -#include <string> -#include <unordered_map> -#include <vector> -#include <Windows.h> - -namespace gui { - bool g_Hotkeys[512]; - bool g_KeysPressed[256]; - bool g_KeysReleased[256]; - bool g_KeysDown[256]; - HWND g_CurrentFocused; - HWND g_MainWindow; - bool try_close = false; - HWND g_LastFocused; - WNDPROC originalEditProc; - LRESULT CALLBACK Edit_Prc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) - { - if (msg == WM_CHAR && wParam == 1) - { - SendMessage(hwnd, EM_SETSEL, 0, -1); - return 1; - } - else - { - return CallWindowProc(originalEditProc, hwnd, msg, wParam, lParam); - } - } - LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) - { - switch (msg) { - case WM_SETFOCUS: { - SetFocus(g_CurrentFocused); - break; - } - case WM_CLOSE: { - try_close = true; - return 0; - } - default: - return DefWindowProc(hwnd, msg, wParam, lParam); - } - return DefWindowProc(hwnd, msg, wParam, lParam); - } - WNDCLASSEXW wc; - HWND show_window(std::wstring title) - { - for (auto i = 0; i < 256; i++) - { - g_KeysReleased[i] = true; - } - if (IsWindow(g_MainWindow)) { - ShowWindow(g_MainWindow, SW_SHOW); - return g_MainWindow; - } - HINSTANCE hInstance = GetModuleHandle(NULL); - - wc.cbSize = sizeof(WNDCLASSEXW); - wc.style = 0; - wc.lpfnWndProc = WndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = hInstance; - wc.hIcon = NULL; - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); - wc.lpszMenuName = NULL; - wc.lpszClassName = L"NGTApp"; - wc.hIconSm = NULL; - - if (!RegisterClassExW(&wc)) - { - return nullptr; - } - - HWND hwnd = CreateWindowExW(256, L"NGTApp", title.c_str(), WS_VISIBLE | WS_CAPTION | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL); - if (!hwnd) - { - return nullptr; - } - ShowWindow(hwnd, SW_SHOW); - UpdateWindow(hwnd); - SetForegroundWindow(hwnd); - g_MainWindow = hwnd; - return hwnd; - } - bool hide_window(HWND window) { - if (window == nullptr)return false; - return ShowWindow(window, SW_HIDE); - } - void update_window(HWND window, bool wait_event) - { - MSG msg; - UpdateWindow(window); - if (wait_event) - GetMessage(&msg, NULL, 0, 0); - else - PeekMessage(&msg, NULL, 0, 0, PM_REMOVE); - switch (msg.message) { - case WM_HOTKEY: { - g_Hotkeys[msg.wParam] = true; - } - case WM_KEYDOWN: - g_KeysDown[msg.wParam] = true; - if (g_KeysPressed[msg.wParam] == false && g_KeysReleased[msg.wParam] == true && g_KeysDown[msg.wParam] == true) - { - g_KeysPressed[msg.wParam] = true; - g_KeysReleased[msg.wParam] = false; - } - else if (g_KeysReleased[msg.wParam] == false) - { - g_KeysPressed[msg.wParam] = false; - } - break; - case WM_KEYUP: - g_KeysDown[msg.wParam] = false; - g_KeysPressed[msg.wParam] = false; - g_KeysReleased[msg.wParam] = true; - break; - } - if (!IsDialogMessage(window, &msg)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - - if (GetForegroundWindow() == window) { - g_CurrentFocused = GetFocus(); - } - } - } - - bool key_pressed(int keyCode) - { - if (g_KeysPressed[keyCode] == true) - { - g_KeysPressed[keyCode] = false; - return true; - } - else - { - return false; - } - } - - bool key_released(int keyCode) - { - if (g_KeysPressed[keyCode] == false && g_KeysReleased[keyCode] == true) - { - g_KeysReleased[keyCode] = g_KeysPressed[keyCode]; - return true; - } - else - { - return false; - } - } - - bool key_down(int keyCode) - { - return g_KeysDown[keyCode]; - } - - int alert(std::wstring title, std::wstring text, int flags) - { - HWND windowHandle = GetForegroundWindow(); - return MessageBoxW(windowHandle, text.c_str(), title.c_str(), flags); - } - int get_vk_code(const std::string& key) { - static const std::unordered_map<std::string, int> keyMap = { - { "Backspace", VK_BACK }, - { "Tab", VK_TAB }, - { "Enter", VK_RETURN }, - { "Shift", VK_SHIFT }, - { "Control", VK_CONTROL }, - { "Alt", VK_MENU }, - { "Pause", VK_PAUSE }, - { "CapsLock", VK_CAPITAL }, - { "Escape", VK_ESCAPE }, - { "Space", VK_SPACE }, - { "PageUp", VK_PRIOR }, - { "PageDown", VK_NEXT }, - { "End", VK_END }, - { "Home", VK_HOME }, - { "Left", VK_LEFT }, - { "Up", VK_UP }, - { "Right", VK_RIGHT }, - { "Down", VK_DOWN }, - { "Insert", VK_INSERT }, - { "Delete", VK_DELETE }, - { "F1", VK_F1 }, - { "F2", VK_F2 }, - { "F3", VK_F3 }, - { "F4", VK_F4 }, - { "F5", VK_F5 }, - { "F6", VK_F6 }, - { "F7", VK_F7 }, - { "F8", VK_F8 }, - { "F9", VK_F9 }, - { "F10", VK_F10 }, - { "F11", VK_F11 }, - { "F12", VK_F12 }, - { "0", '0' }, - { "1", '1' }, - { "2", '2' }, - { "3", '3' }, - { "4", '4' }, - { "5", '5' }, - { "6", '6' }, - { "7", '7' }, - { "8", '8' }, - { "9", '9' }, - { "A", 'A' }, - { "B", 'B' }, - { "C", 'C' }, - { "D", 'D' }, - { "E", 'E' }, - { "F", 'F' }, - { "G", 'G' }, - { "H", 'H' }, - { "I", 'I' }, - { "J", 'J' }, - { "K", 'K' }, - { "L", 'L' }, - { "M", 'M' }, - { "N", 'N' }, - { "O", 'O' }, - { "P", 'P' }, - { "Q", 'Q' }, - { "R", 'R' }, - { "S", 'S' }, - { "T", 'T' }, - { "U", 'U' }, - { "V", 'V' }, - { "W", 'W' }, - { "X", 'X' }, - { "Y", 'Y' }, - { "Z", 'Z' }, - { "`", VK_OEM_3 }, - { "-", VK_OEM_MINUS }, - { "=", VK_OEM_PLUS }, - { "[", VK_OEM_4 }, - { "]", VK_OEM_5 }, - { "\\\\", VK_OEM_6 }, - { ";", VK_OEM_1 }, - { "'", VK_OEM_7 }, - { ",", VK_OEM_COMMA }, - { ".", VK_OEM_PERIOD }, - { "/", VK_OEM_2 } - }; - - auto it = keyMap.find(key); - if (it != keyMap.end()) { - return it->second; - } - return 0; - } - - DWORD get_mod_code(const std::string& key) { - if (key == "Ctrl") { - return MOD_CONTROL; - } - else if (key == "Alt") { - return MOD_ALT; - } - else if (key == "Shift") { - return MOD_SHIFT; - } - else if (key == "Windows") { - return MOD_WIN; - } - - return 0; // No modifier - } - - // Function to parse hotkey string - bool parse_hotkey(const std::string& hotkeyStr, DWORD& modKeys, int& vkKey) { - std::stringstream ss(hotkeyStr); - std::string keyPart; - modKeys = 0; - vkKey = 0; - - while (std::getline(ss, keyPart, '+')) { - - DWORD mod = get_mod_code(keyPart); - if (mod != 0) { - modKeys |= mod; - } - else { - vkKey = get_vk_code(keyPart); - if (vkKey == 0) { - return false; // Invalid key - } - } - } - - return true; // Success - } - - bool hotkey_pressed(int id) { - if (g_Hotkeys[id] == true) { - g_Hotkeys[id] = false; - return true; - } - return false; - } - void wait(int time) - { - std::chrono::steady_clock::time_point startTime = std::chrono::steady_clock::now(); - int elapsed = 0; - - while (elapsed < time) - { - update_window(g_MainWindow, false); - elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - startTime).count(); - } - } - - class timer - { - public: - std::chrono::steady_clock::time_point initTime = std::chrono::steady_clock::now(); - - int paused = false; - timer() - { - restart(); - } - - int elapsed() - { - if (paused != 0) - { - return paused; - } - else - { - return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - initTime).count(); - } - } - - void elapsed(int amount) - { - if (paused == 0) - { - initTime = std::chrono::steady_clock::now() - std::chrono::milliseconds(amount); - } - else - { - paused = amount; - } - } - - void restart() - { - initTime = std::chrono::steady_clock::now(); - paused = 0; - } - - void pause() - { - paused = elapsed(); - } - - void resume() - { - initTime = std::chrono::steady_clock::now() - std::chrono::milliseconds(paused); - paused = 0; - } - }; - - void add_list_item(HWND hwndList, LPCTSTR lpszItem) - { - SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)lpszItem); - } - - void add_text(HWND hwndEdit, LPCTSTR lpszText) - { - int nLength = GetWindowTextLength(hwndEdit); - SendMessage(hwndEdit, EM_SETSEL, (WPARAM)nLength, (LPARAM)nLength); - SendMessage(hwndEdit, EM_REPLACESEL, 0, (LPARAM)lpszText); - } - std::wstring get_text(HWND hwndEdit) - { - int nLength = GetWindowTextLength(hwndEdit); - std::wstring text; - if (nLength > 0) - { - text.resize(nLength + 1); - GetWindowText(hwndEdit, &text[0], nLength + 1); - } - return text; - } - void clear_list(HWND hwndList) - { - SendMessage(hwndList, LB_RESETCONTENT, 0, 0); - } - - HWND create_button(HWND hwndParent, LPCTSTR lpszCaption, int x, int y, int width, int height, int id) - { - return CreateWindow( - TEXT("BUTTON"), - lpszCaption, - WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | WS_TABSTOP, - x, - y, - width, - height, - hwndParent, - (HMENU)id, - NULL, - NULL - ); - } - - HWND create_text(HWND hwndParent, LPCTSTR lpszCaption, int x, int y, int width, int height, int id) - { - return CreateWindow( - TEXT("STATIC"), - lpszCaption, - WS_VISIBLE | WS_CHILD, - x, - y, - width, - height, - hwndParent, - (HMENU)id, - NULL, - NULL - ); - } - - HWND create_checkbox(HWND hwndParent, LPCTSTR lpszCaption, int x, int y, int width, int height, int id) - { - return CreateWindow( - TEXT("BUTTON"), - lpszCaption, - WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON | WS_TABSTOP, - x, - y, - width, - height, - hwndParent, - (HMENU)id, - NULL, - NULL - ); - } - - HWND create_input_box(HWND hwndParent, bool secure, bool multiline, int x, int y, int width, int height, int id) - { - DWORD style = WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL | WS_TABSTOP; - if (secure) - { - style |= ES_PASSWORD; - } - if (multiline) - style |= ES_MULTILINE | ES_AUTOVSCROLL; - HWND window = CreateWindow( - TEXT("EDIT"), - NULL, - style, - x, - y, - width, - height, - hwndParent, - (HMENU)id, - NULL, - NULL - ); - originalEditProc = (WNDPROC)SetWindowLongPtr(window, GWLP_WNDPROC, (LONG_PTR)Edit_Prc); - - return window; - } - - HWND create_list(HWND hwndParent, int x, int y, int width, int height, int id) - { - return CreateWindow( - TEXT("LISTBOX"), - NULL, - WS_VISIBLE | WS_CHILD | WS_TABSTOP, - x, - y, - width, - height, - hwndParent, - (HMENU)id, - NULL, - NULL - ); - } - - void delete_control(HWND hwnd) - { - DestroyWindow(hwnd); - } - - void delete_list_item(HWND hwndList, int index) - { - SendMessage(hwndList, LB_DELETESTRING, (WPARAM)index, 0); - } - - void delete_list_selections(HWND hwndList) - { - int count = SendMessage(hwndList, LB_GETSELCOUNT, 0, 0); - if (count > 0) - { - std::vector<int> selections(count); - SendMessage(hwndList, LB_GETSELITEMS, (WPARAM)count, (LPARAM)selections.data()); - - for (int i = count - 1; i >= 0; i--) - { - SendMessage(hwndList, LB_DELETESTRING, (WPARAM)selections[i], 0); - } - } - } - - void edit_list_item(HWND hwndList, int index, LPCTSTR lpszItem) - { - SendMessage(hwndList, LB_DELETESTRING, (WPARAM)index, 0); - SendMessage(hwndList, LB_INSERTSTRING, (WPARAM)index, (LPARAM)lpszItem); - } - - void edit_text(HWND hwndEdit, LPCTSTR lpszText) - { - SetWindowText(hwndEdit, lpszText); - } - - void focus(HWND hwnd) - { - SetFocus(hwnd); - } - - HWND get_current_focus() - { - return GetFocus(); - } - - int get_list_position(HWND hwndList) - { - return SendMessage(hwndList, LB_GETCURSEL, 0, 0); - } - - std::wstring get_focused_list_item_name(HWND hwndList) - { - int focusedIndex = SendMessage(hwndList, LB_GETCURSEL, 0, 0); - if (focusedIndex != LB_ERR) - { - int textLength = SendMessage(hwndList, LB_GETTEXTLEN, focusedIndex, 0); - if (textLength != LB_ERR) - { - std::wstring listItemText; - listItemText.resize(textLength + 1); // Add 1 for null terminator - SendMessage(hwndList, LB_GETTEXT, focusedIndex, reinterpret_cast<LPARAM>(listItemText.data())); - listItemText.pop_back(); // Remove the null terminator - return listItemText; - } - } - return L""; // Return an empty string if there's an error - } - - bool is_checked(HWND hwndCheckbox) - { - return SendMessage(hwndCheckbox, BM_GETCHECK, 0, 0) == BST_CHECKED; - } - - bool is_enabled(HWND hwnd) - { - return IsWindowEnabled(hwnd) != FALSE; - } - - bool is_multiline(HWND hwndEdit) - { - return (GetWindowLong(hwndEdit, GWL_STYLE) & ES_MULTILINE) != 0; - } - - bool is_pressed(HWND hwndButton) - { - return (SendMessage(hwndButton, BM_GETSTATE, 0, 0) & BST_PUSHED) or (GetFocus() == hwndButton && key_pressed(VK_RETURN)); - } - - bool is_readOnly(HWND hwndEdit) - { - return (GetWindowLong(hwndEdit, GWL_STYLE) & ES_READONLY) != 0; - } - - bool is_visible(HWND hwnd) - { - return IsWindowVisible(hwnd) != FALSE; - } - - void set_checkboxMark(HWND hwndCheckbox, bool checked) - { - SendMessage(hwndCheckbox, BM_SETCHECK, checked ? BST_CHECKED : BST_UNCHECKED, 0); - } - - void set_list_position(HWND hwndList, int index) - { - SendMessage(hwndList, LB_SETCURSEL, (WPARAM)index, 0); - } - - void set_text(HWND hwndEdit, LPCTSTR lpszText) - { - SetWindowText(hwndEdit, lpszText); - } -} \ No newline at end of file diff --git a/NGTScript/gui.h b/NGTScript/gui.h deleted file mode 100644 index a12007e..0000000 --- a/NGTScript/gui.h +++ /dev/null @@ -1,64 +0,0 @@ -#ifndef GUI_H -#define GUI_H -#pragma once -#include <chrono> -#include <iostream> -#include <string> -#include <vector> -#include <Windows.h> - -namespace gui { - LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); - extern bool try_close; - HWND show_window(std::wstring title); - bool hide_window(HWND window); - void update_window(HWND window, bool wait_event = true); - bool key_pressed(int keyCode); - bool key_released(int keyCode); - bool key_down(int keyCode); - int alert(std::wstring title, std::wstring text, int flags = 0); - bool parse_hotkey(const std::string& hotkeyStr, DWORD& modKeys, int& vkKey); - void wait(int time); - bool hotkey_pressed(int id); - class timer; - class timer { - public: - std::chrono::steady_clock::time_point initTime; - int paused; - timer(); - int elapsed(); - void elapsed(int amount); - void restart(); - void pause(); - void resume(); - }; - - void add_list_item(HWND hwndList, LPCTSTR lpszItem); - void add_text(HWND hwndEdit, LPCTSTR lpszText); - std::wstring get_text(HWND hwndEdit); - void clear_list(HWND hwndList); - HWND create_button(HWND hwndParent, LPCTSTR lpszCaption, int x, int y, int width, int height, int id); - HWND create_text(HWND hwndParent, LPCTSTR lpszCaption, int x, int y, int width, int height, int id); - HWND create_checkbox(HWND hwndParent, LPCTSTR lpszCaption, int x, int y, int width, int height, int id); - HWND create_input_box(HWND hwndParent, bool secure, bool multiline, int x, int y, int width, int height, int id); - HWND create_list(HWND hwndParent, int x, int y, int width, int height, int id); - void delete_control(HWND hwnd); - void delete_list_item(HWND hwndList, int index); - void delete_list_selections(HWND hwndList); - void edit_list_item(HWND hwndList, int index, LPCTSTR lpszItem); - void edit_text(HWND hwndEdit, LPCTSTR lpszText); - void focus(HWND hwnd); - HWND get_current_focus(); - int get_list_position(HWND hwndList); - std::wstring get_focused_list_item_name(HWND hwndList); - bool is_checked(HWND hwndCheckbox); - bool is_enabled(HWND hwnd); - bool is_multiline(HWND hwndEdit); - bool is_pressed(HWND hwndButton); - bool is_readOnly(HWND hwndEdit); - bool is_visible(HWND hwnd); - void set_checkboxMark(HWND hwndCheckbox, bool checked); - void set_list_position(HWND hwndList, int index); - void set_text(HWND hwndEdit, LPCTSTR lpszText); -} -#endif // GUI_H \ No newline at end of file diff --git a/NGTScript/ngt.h b/NGTScript/ngt.h index 45ad904..f7172bb 100644 --- a/NGTScript/ngt.h +++ b/NGTScript/ngt.h @@ -4,7 +4,7 @@ #include"as_class.h" #ifdef _WIN32 #define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */ -#include "gui.h" +#include "../GUI/GUI.h" #include <Windows.h> #define FFI_BUILDING #include "ffi.h" diff --git a/ngt-docs b/ngt-docs new file mode 160000 index 0000000..11e175e --- /dev/null +++ b/ngt-docs @@ -0,0 +1 @@ +Subproject commit 11e175e82e6e4db7f9c1ebb5452ef2d63334ea2e