Просмотр исходного кода

IDE on Windows will now act properly if there are unsaved files. Switched IDE on Windows to use native menus/accelerators

Ivan Safrin 12 лет назад
Родитель
Сommit
e6653dbde3

+ 1 - 1
IDE/Build/Windows2013/Polycode.props

@@ -13,7 +13,7 @@
     <PolycodeLibsRelease>$(PolycodeCoreLibsRelease);$(PolycodeDependLibsRelease);$(PolycodeWinLibsRelease)</PolycodeLibsRelease>
   </PropertyGroup>
   <PropertyGroup>
-    <IncludePath>..\..\Contents\Include;$(PolycodeDir)Core\include;$(PolycodeDir)Modules\include;$(PolycodeDir)Core\Dependencies\include;$(PolycodeDir)Core\PolycodeView;$(PolycodeDir)Core\Dependencies\include\AL;$(IncludePath)</IncludePath>
+    <IncludePath>.\;..\WindowsShared;..\..\Contents\Include;$(PolycodeDir)Core\include;$(PolycodeDir)Modules\include;$(PolycodeDir)Core\Dependencies\include;$(PolycodeDir)Core\PolycodeView;$(PolycodeDir)Core\Dependencies\include\AL;$(IncludePath)</IncludePath>
   </PropertyGroup>
   <PropertyGroup>
     <LibraryPath>$(PolycodeDir)Core\lib;$(PolycodeDir)Core\Dependencies\lib;$(PolycodeDir)Modules\lib;$(PolycodeDir)Modules\Dependencies\lib;$(LibraryPath)</LibraryPath>

BIN
IDE/Build/Windows2013/Polycode.rc


+ 4 - 2
IDE/Build/Windows2013/Polycode.vcxproj

@@ -52,6 +52,7 @@
     <ClCompile Include="..\..\Contents\Source\ToolWindows.cpp" />
     <ClCompile Include="..\..\Contents\Source\TrackballCamera.cpp" />
     <ClCompile Include="..\..\Contents\Source\TransformGizmo.cpp" />
+    <ClCompile Include="..\WindowsShared\PolycodeWinIDEView.cpp" />
     <ClCompile Include="main.cpp" />
   </ItemGroup>
   <ItemGroup>
@@ -89,6 +90,7 @@
     <ClInclude Include="..\..\Contents\Include\ToolWindows.h" />
     <ClInclude Include="..\..\Contents\Include\TrackballCamera.h" />
     <ClInclude Include="..\..\Contents\Include\TransformGizmo.h" />
+    <ClInclude Include="..\WindowsShared\PolycodeWinIDEView.h" />
     <ClInclude Include="resource.h" />
   </ItemGroup>
   <ItemGroup>
@@ -185,7 +187,7 @@
       <PrecompiledHeader>
       </PrecompiledHeader>
       <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>USE_POLYCODEUI_MENUBAR;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
     </ClCompile>
     <Link>
@@ -219,7 +221,7 @@
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>USE_POLYCODEUI_MENUBAR;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>

+ 6 - 0
IDE/Build/Windows2013/Polycode.vcxproj.filters

@@ -111,6 +111,9 @@
     <ClCompile Include="..\..\Contents\Source\EntityEditorTreeView.cpp">
       <Filter>Source</Filter>
     </ClCompile>
+    <ClCompile Include="..\WindowsShared\PolycodeWinIDEView.cpp">
+      <Filter>Source</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\Contents\Include\ExampleBrowserWindow.h">
@@ -216,6 +219,9 @@
     <ClInclude Include="..\..\Contents\Include\EntityEditorTreeView.h">
       <Filter>Include</Filter>
     </ClInclude>
+    <ClInclude Include="..\WindowsShared\PolycodeWinIDEView.h">
+      <Filter>Include</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="Polycode.rc" />

+ 11 - 4
IDE/Build/Windows2013/main.cpp

@@ -1,12 +1,14 @@
 #include <Polycode.h>
 #include "PolycodeIDEApp.h"
-#include "PolycodeView.h"
+#include "PolycodeWinIDEView.h"
 #include "windows.h"
 #include "resource.h"
 #include <Shlobj.h>
 #include <Shlwapi.h>
 #include <shellapi.h>
 
+extern PolycodeIDEApp *globalApp;
+
 using namespace Polycode;
 
 void registerFileType(String extension, String progId, String app, String defaultIcon, String desc) {
@@ -73,9 +75,11 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi
 	PathRemoveFileSpec( FilePath );    
 	SetCurrentDirectory( FilePath );
 
-	PolycodeView *view = new PolycodeView(hInstance, nCmdShow, L"Polycode", true, false);
+	PolycodeWinIDEView *view = new PolycodeWinIDEView(hInstance, nCmdShow, L"Polycode", true, false);
 	PolycodeIDEApp *app = new PolycodeIDEApp(view);
 
+	globalApp = app;
+
 	if(fileName != "") {
 		app->openProject(fileName);
 	}
@@ -89,8 +93,11 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi
 	MSG Msg;
 	do {
 		if(PeekMessage(&Msg, NULL, 0,0,PM_REMOVE)) {
-			TranslateMessage(&Msg);
-			DispatchMessage(&Msg);
+
+			if (!TranslateAccelerator(view->hwnd, view->haccel, &Msg)) {
+				TranslateMessage(&Msg);
+				DispatchMessage(&Msg);
+			}
 		}
 		if(((Win32Core*)app->core)->hasCopyDataString) {
 			app->openProject(((Win32Core*)app->core)->copyDataString);

BIN
IDE/Build/Windows2013/resource.h


+ 316 - 0
IDE/Build/WindowsShared/PolycodeWinIDEView.cpp

@@ -0,0 +1,316 @@
+
+#include "PolycodeWinIDEView.h"
+#include "PolyWinCore.h"
+#include "PolyCoreServices.h"
+#include "PolyCoreInput.h"
+#include "PolyRenderer.h"
+#include <io.h>
+#include <fcntl.h>
+#include <ios>
+#include "resource.h"
+#include "PolycodeIDEApp.h"
+
+using namespace Polycode;
+
+Win32Core *core = NULL;
+PolycodeIDEApp *globalApp = NULL;
+
+static void OpenConsole()
+{
+    int outHandle, errHandle, inHandle;
+    FILE *outFile, *errFile, *inFile;
+    AllocConsole();
+    CONSOLE_SCREEN_BUFFER_INFO coninfo;
+    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
+    coninfo.dwSize.Y = 9999;
+    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
+
+    outHandle = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
+    errHandle = _open_osfhandle((long)GetStdHandle(STD_ERROR_HANDLE),_O_TEXT);
+    inHandle = _open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE),_O_TEXT );
+
+    outFile = _fdopen(outHandle, "w" );
+    errFile = _fdopen(errHandle, "w");
+    inFile =  _fdopen(inHandle, "r");
+
+    *stdout = *outFile;
+    *stderr = *errFile;
+    *stdin = *inFile;
+
+    setvbuf( stdout, NULL, _IONBF, 0 );
+    setvbuf( stderr, NULL, _IONBF, 0 );
+    setvbuf( stdin, NULL, _IONBF, 0 );
+
+    std::ios::sync_with_stdio();
+
+}
+
+LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+	int nWidth, nHeight;
+	bool useDefault = false;
+
+	if(!core)
+		return DefWindowProc(hWnd, message, wParam, lParam);
+
+	switch (message)
+	{
+		case WM_COMMAND:
+			switch (LOWORD(wParam))
+			{
+				case ID_FILE_NEW_FILE:
+					globalApp->newFile();
+				break;
+				case ID_FILE_NEW_PROJECT:
+					globalApp->newProject();
+				break;
+				case ID_FILE_NEW_FOLDER:
+					globalApp->newGroup();
+				break;
+				case ID_FILE_OPEN_PROJECT:
+					globalApp->openProject();
+					break;
+				case ID_FILE_CLOSE_FILE:
+					globalApp->closeFile();
+					break;
+				case ID_FILE_CLOSE_PROJECT:
+					globalApp->closeProject();
+					break;
+				case ID_FILE_REMOVE_FILE:
+					globalApp->removeFile();
+					break;
+				case ID_FILE_REFRESH_PROJECT:
+					globalApp->refreshProject();
+					break;
+				case ID_FILE_SAVE_FILE:
+					globalApp->saveFile();
+					break;
+				case ID_FILE_BROWSE_EXAMPLES:
+					globalApp->browseExamples();
+					break;
+				case ID_FILE_EXIT:
+				{
+					 globalApp->saveConfigFile();
+					 bool retVal = globalApp->quitApp();
+					 if (retVal) {
+						 core->Shutdown();
+						 useDefault = true;
+					 }
+				}
+				break;
+
+				case ID_EDIT_UNDO:
+					core->dispatchEvent(new Event(), Core::EVENT_UNDO);
+					break;
+				case ID_EDIT_REDO:
+					core->dispatchEvent(new Event(), Core::EVENT_REDO);
+					break;
+				case ID_EDIT_CUT:
+					core->dispatchEvent(new Event(), Core::EVENT_CUT);
+					break;
+				case ID_EDIT_COPY:
+					core->dispatchEvent(new Event(), Core::EVENT_COPY);
+					break;
+				case ID_EDIT_PASTE:
+					core->dispatchEvent(new Event(), Core::EVENT_PASTE);
+					break;
+				case ID_EDIT_SELECT_ALL:
+					core->dispatchEvent(new Event(), Core::EVENT_SELECT_ALL);
+					break;
+				case ID_EDIT_FIND:
+					globalApp->findText();
+					break;
+				case ID_EDIT_PREFERENCES:
+					globalApp->showSettings();
+				break;
+
+
+				case ID_VIEW_CREATE_TAB:
+					globalApp->createNewTab();
+					break;
+				case ID_VIEW_SELECT_NEXT_TAB:
+					globalApp->showNextTab();
+					break;
+				case ID_VIEW_SELECT_PREV_TAB:
+					globalApp->showPreviousTab();
+					break;
+				case ID_VIEW_CLOSE_TAB:
+					globalApp->closeTab();
+					break;
+				case ID_VIEW_TOGGLE_CONSOLE:
+					globalApp->toggleConsole();
+					break;
+
+				case ID_PROJECT_RUN:
+					globalApp->runProject();
+					break;
+				case ID_PROJECT_EXPORT:
+					globalApp->exportProject();
+					break;
+	
+				case ID_HELP_ABOUT:
+					globalApp->showAbout();
+					break;
+				case ID_HELP_REFERENCE:
+					globalApp->openDocs(); 
+					break;
+			}
+		break;
+	case WM_COPYDATA:
+	{
+		COPYDATASTRUCT *cp = (COPYDATASTRUCT*)lParam;
+		wchar_t *stringData = (wchar_t*)cp->lpData;
+		core->copyDataString = String(stringData);
+		core->hasCopyDataString = true;
+	}
+	break;
+	case WM_SIZE:
+		nWidth = LOWORD(lParam); 
+		nHeight = HIWORD(lParam);
+		if(core) {
+			core->handleViewResize(nWidth, nHeight);
+		}
+	break;
+
+	case WM_MOUSEMOVE:
+		if(core)
+			core->handleMouseMove(lParam,wParam);
+	break;
+
+	case WM_MOUSEWHEEL:
+		if(core)
+			core->handleMouseWheel(lParam,wParam);
+	break;
+
+	case WM_LBUTTONDOWN:
+		if(core)
+			core->handleMouseDown(CoreInput::MOUSE_BUTTON1, lParam,wParam);
+	break;
+	case WM_LBUTTONUP:
+		if(core)
+			core->handleMouseUp(CoreInput::MOUSE_BUTTON1, lParam,wParam);
+	break;
+
+	case WM_RBUTTONDOWN:
+		if(core)
+			core->handleMouseDown(CoreInput::MOUSE_BUTTON2, lParam,wParam);
+	break;
+	case WM_RBUTTONUP:
+		if(core)
+			core->handleMouseUp(CoreInput::MOUSE_BUTTON2, lParam,wParam);
+	break;
+
+#ifndef NO_TOUCH_API
+	case WM_TOUCH:
+		if(core) {
+			if(core->isMultiTouchEnabled()) {
+				core->handleTouchEvent(lParam, wParam);
+			}
+		}
+	break;
+#endif
+
+	case WM_MBUTTONDOWN:
+		if(core)
+			core->handleMouseDown(CoreInput::MOUSE_BUTTON3, lParam,wParam);
+	break;
+	case WM_MBUTTONUP:
+		if(core)
+			core->handleMouseUp(CoreInput::MOUSE_BUTTON3, lParam,wParam);
+	break;
+	case WM_KEYDOWN:
+	case WM_SYSKEYDOWN:
+		if(core) {
+				wchar_t unicodeChar = 0;
+				MSG m;
+				m.hwnd = hWnd;
+				m.message = message;
+				m.wParam = wParam;
+				m.lParam = lParam;
+				m.time = 0;
+				if ( PeekMessage(&m, hWnd, 0, WM_USER, PM_NOREMOVE) && (m.message == WM_CHAR) ) {
+					GetMessage(&m, hWnd, 0, WM_USER);
+			    		unicodeChar = (wchar_t)m.wParam;
+				}
+
+			core->handleKeyDown(lParam,wParam, unicodeChar);
+		}
+	break;
+	case WM_KEYUP:
+	case WM_SYSKEYUP:
+		if(core)
+			core->handleKeyUp(lParam,wParam);
+	break;
+	case WM_CLOSE:
+	{
+		globalApp->saveConfigFile();
+		bool retVal = globalApp->quitApp();
+		if (retVal) {
+			core->Shutdown();
+			useDefault = true;
+		}
+	}
+	break;
+	case WM_DESTROY:
+		PostQuitMessage(0);
+		break;
+	default:
+		useDefault = true;
+		break;
+	}
+	
+	if (useDefault)
+		return DefWindowProc(hWnd, message, wParam, lParam);
+	else
+		return 0;
+}
+
+
+PolycodeWinIDEView::PolycodeWinIDEView(HINSTANCE hInstance, int nCmdShow, LPCTSTR windowTitle, bool resizable, bool showDebugConsole) : PolycodeViewBase() {
+
+	/*
+	typedef BOOL(WINAPI *SetProcessDPIAwarePtr)(VOID);
+	SetProcessDPIAwarePtr set_process_dpi_aware_func = GetProcAddress(GetModuleHandleA("user32.dll"), "SetProcessDPIAware");
+	if (set_process_dpi_aware_func) {
+		set_process_dpi_aware_func();
+	}
+	*/
+	WNDCLASSEX wcex;
+
+	wcex.cbSize = sizeof(WNDCLASSEX);
+	wcex.style			= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
+	wcex.lpfnWndProc	= WndProc;
+	wcex.cbClsExtra		= 0;
+	wcex.cbWndExtra		= 0;
+	wcex.hInstance		= hInstance;
+	wcex.hIcon			= LoadIcon(hInstance, IDI_APPLICATION);
+	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
+	wcex.hbrBackground	= NULL;
+	wcex.lpszMenuName = MAKEINTRESOURCE(IDR_POLYCODEMENU);
+	wcex.lpszClassName	= L"POLYCODEAPPLICATION";
+	wcex.hIconSm		= LoadIcon(hInstance, IDI_APPLICATION);
+
+	RegisterClassEx(&wcex);
+
+	if(resizable) {
+		hwnd = CreateWindowEx(WS_EX_APPWINDOW, L"POLYCODEAPPLICATION", windowTitle, WS_OVERLAPPEDWINDOW|WS_SYSMENU, 0, 0, 640, 480, NULL, NULL, hInstance, NULL);
+	} else {
+		hwnd = CreateWindowEx(WS_EX_APPWINDOW, L"POLYCODEAPPLICATION", windowTitle, WS_OVERLAPPED|WS_SYSMENU, 0, 0, 640, 480, NULL, NULL, hInstance, NULL);
+	}
+
+  windowData = (void*)&hwnd;
+
+   ShowWindow(hwnd, nCmdShow);
+   UpdateWindow(hwnd);
+
+   haccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(POLYCODE_ACCELERATORS));
+
+   if(showDebugConsole) {
+		OpenConsole();
+   }
+
+}
+
+PolycodeWinIDEView::~PolycodeWinIDEView() {
+
+}

+ 24 - 0
IDE/Build/WindowsShared/PolycodeWinIDEView.h

@@ -0,0 +1,24 @@
+#pragma once
+
+#include <winsock2.h>
+#include <windows.h>
+#include "PolyCore.h"
+#include "PolycodeWinIDEView.h"
+
+using namespace Polycode;
+
+class PolycodeIDEApp;
+
+namespace Polycode {
+
+class _PolyExport PolycodeWinIDEView : public PolycodeViewBase {
+public:
+	PolycodeWinIDEView(HINSTANCE hInstance, int nCmdShow, LPCTSTR windowTitle, bool resizable = false, bool showDebugConsole = false);
+	~PolycodeWinIDEView();
+
+	HWND hwnd;
+	HACCEL haccel;
+
+};
+
+}

+ 1 - 1
IDE/Contents/Include/PolycodeIDEApp.h

@@ -52,7 +52,7 @@ using namespace Polycode;
 
 class PolycodeIDEApp : public EventDispatcher {
 public:
-	PolycodeIDEApp(PolycodeView *view);
+	PolycodeIDEApp(PolycodeViewBase *view);
 	~PolycodeIDEApp();
 	
 	void handleEvent(Event *event);	

+ 1 - 1
IDE/Contents/Source/PolycodeIDEApp.cpp

@@ -31,7 +31,7 @@ PolycodeClipboard *globalClipboard;
 PolycodeEditorManager *globalEditorManager;
 Scene *globalScene;
 
-PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
+PolycodeIDEApp::PolycodeIDEApp(PolycodeViewBase *view) : EventDispatcher() {
 	core = new POLYCODE_CORE(view, 1100, 700,false,false, 0, 0,60, -1, true);
 //	core->pauseOnLoseFocus = true;
     

+ 48 - 46
IDE/Contents/Source/TransformGizmo.cpp

@@ -716,52 +716,54 @@ void TransformGizmo::handleEvent(Event *event) {
 	
 	if(event->getDispatcher() == coreInput) {
         
-        if(event->getEventCode() == InputEvent::EVENT_KEYDOWN) {
-            InputEvent *inputEvent = (InputEvent*) event;
-            switch(inputEvent->key) {
-                case KEY_s:
-                {
-                    transforming = true;
-                    previousMode = mode;
-                    mode = TRANSFORM_SCALE_VIEW;
-                    setTransformPlaneFromView();
-                    startingPoint = getTransformPlanePosition();
-                    
-                }
-                break;
-                case KEY_r:
-                {
-                    previousMode = mode;
-                    mode = TRANSFORM_ROTATE_VIEW;
-                    transforming = true;
-                    setTransformPlaneFromView();
-                    transformConstraint = transformPlane;
-                    if(gizmoMode == GIZMO_MODE_2D) {
-                        transformConstraint = transformConstraint * -1.0;
-                    }
-                    startingAngle = getTransformPlaneAngle();
-                }
-                break;
-                case KEY_g:
-                {
-                    previousMode = mode;
-                    mode = TRANSFORM_MOVE_VIEW;
-                    transforming = true;
-                    setTransformPlaneFromView();
-                    startingPoint = getTransformPlanePosition();
-                }
-                break;
-                case KEY_ESCAPE:
-                {
-                    if(mode == TRANSFORM_SCALE_VIEW || mode == TRANSFORM_ROTATE_VIEW || mode == TRANSFORM_MOVE_VIEW) {
-                        dispatchEndEvent();
-                        mode = previousMode;
-                    }                    
-                    transforming = false;
-                    firstMove = true;
-                }
-                break;
-            }
+		if (!coreInput->getKeyState(KEY_LCTRL) && !coreInput->getKeyState(KEY_RCTRL) && !coreInput->getKeyState(KEY_LALT) && !coreInput->getKeyState(KEY_RALT)) {
+			if (event->getEventCode() == InputEvent::EVENT_KEYDOWN) {
+				InputEvent *inputEvent = (InputEvent*)event;
+				switch (inputEvent->key) {
+				case KEY_s:
+				{
+							  transforming = true;
+							  previousMode = mode;
+							  mode = TRANSFORM_SCALE_VIEW;
+							  setTransformPlaneFromView();
+							  startingPoint = getTransformPlanePosition();
+
+				}
+					break;
+				case KEY_r:
+				{
+							  previousMode = mode;
+							  mode = TRANSFORM_ROTATE_VIEW;
+							  transforming = true;
+							  setTransformPlaneFromView();
+							  transformConstraint = transformPlane;
+							  if (gizmoMode == GIZMO_MODE_2D) {
+								  transformConstraint = transformConstraint * -1.0;
+							  }
+							  startingAngle = getTransformPlaneAngle();
+				}
+					break;
+				case KEY_g:
+				{
+							  previousMode = mode;
+							  mode = TRANSFORM_MOVE_VIEW;
+							  transforming = true;
+							  setTransformPlaneFromView();
+							  startingPoint = getTransformPlanePosition();
+				}
+					break;
+				case KEY_ESCAPE:
+				{
+								   if (mode == TRANSFORM_SCALE_VIEW || mode == TRANSFORM_ROTATE_VIEW || mode == TRANSFORM_MOVE_VIEW) {
+									   dispatchEndEvent();
+									   mode = previousMode;
+								   }
+								   transforming = false;
+								   firstMove = true;
+				}
+					break;
+				}
+			}
         }
         
         if(transforming) {