Преглед изворни кода

OS-specific shortcut keys and core shortcut events

Ivan Safrin пре 13 година
родитељ
комит
f8dc3922a7

+ 2 - 0
Core/Contents/Include/PolyCocoaCore.h

@@ -153,6 +153,8 @@ namespace Polycode {
 				
 		vector<GamepadDeviceEntry*> gamepads;
 		unsigned int nextDeviceID;
+		
+		bool checkSpecialKeyEvents(PolyKEY key);		
 				
 	protected:	
 		PolycodeView *glView;

+ 17 - 8
Core/Contents/Include/PolyCore.h

@@ -30,14 +30,6 @@ THE SOFTWARE.
 #include "PolyCoreServices.h"
 #include "PolyThreaded.h"
 
-#define CURSOR_ARROW 0
-#define CURSOR_TEXT 1
-#define CURSOR_POINTER 2
-#define CURSOR_CROSSHAIR 3
-#define CURSOR_RESIZE_LEFT_RIGHT 4
-#define CURSOR_RESIZE_UP_DOWN 5
-#define CURSOR_OPEN_HAND 6
-
 long getThreadID();
 
 namespace Polycode {
@@ -310,6 +302,13 @@ namespace Polycode {
 		static const int EVENT_CORE_RESIZE = 0;		
 		static const int EVENT_LOST_FOCUS = 1;
 		static const int EVENT_GAINED_FOCUS = 2;
+
+		static const int EVENT_UNDO = 3;
+		static const int EVENT_REDO = 4;
+		static const int EVENT_COPY = 5;
+		static const int EVENT_CUT = 6;
+		static const int EVENT_SELECT_ALL = 7;
+		static const int EVENT_PASTE = 8;
 		
 		virtual String executeExternalCommand(String command, String args, String inDirectory) = 0;
 		
@@ -333,9 +332,19 @@ namespace Polycode {
 		
 		void removeThread(Threaded *thread);
 		
+		static const int CURSOR_ARROW = 0;
+		static const int CURSOR_TEXT = 1;
+		static const int CURSOR_POINTER = 2;
+		static const int CURSOR_CROSSHAIR = 3;
+		static const int CURSOR_RESIZE_LEFT_RIGHT = 4;
+		static const int CURSOR_RESIZE_UP_DOWN = 5;
+		static const int CURSOR_OPEN_HAND = 6;		
+		
 				
 	protected:	
 	
+		virtual bool checkSpecialKeyEvents(PolyKEY key) { return false; }
+	
 		void loseFocus();
 		void gainFocus();
 		

+ 38 - 1
Core/Contents/Source/PolyCocoaCore.mm

@@ -360,6 +360,42 @@ void CocoaCore::warpCursor(int x, int y) {
 	lastMouseY = y;
 }
 
+
+bool CocoaCore::checkSpecialKeyEvents(PolyKEY key) {
+	
+	if(key == KEY_a && (input->getKeyState(KEY_LSUPER) || input->getKeyState(KEY_RSUPER))) {
+		dispatchEvent(new Event(), Core::EVENT_SELECT_ALL);
+		return true;
+	}
+	
+	if(key == KEY_c && (input->getKeyState(KEY_LSUPER) || input->getKeyState(KEY_RSUPER))) {
+		dispatchEvent(new Event(), Core::EVENT_COPY);
+		return true;
+	}
+	
+	if(key == KEY_x && (input->getKeyState(KEY_LSUPER) || input->getKeyState(KEY_RSUPER))) {
+		dispatchEvent(new Event(), Core::EVENT_CUT);
+		return true;
+	}
+	
+	if(key == KEY_z  && (input->getKeyState(KEY_LSUPER) || input->getKeyState(KEY_RSUPER))) {
+		dispatchEvent(new Event(), Core::EVENT_UNDO);
+		return true;
+	}
+	
+	if(key == KEY_z  && (input->getKeyState(KEY_LSUPER) || input->getKeyState(KEY_RSUPER)) && (input->getKeyState(KEY_LSHIFT) || input->getKeyState(KEY_RSHIFT))) {
+		dispatchEvent(new Event(), Core::EVENT_REDO);
+		return true;
+	}
+	
+	if(key == KEY_v && (input->getKeyState(KEY_LSUPER) || input->getKeyState(KEY_RSUPER))) {
+		dispatchEvent(new Event(), Core::EVENT_PASTE);
+		return true;
+	}
+	return false;
+}
+
+
 void CocoaCore::checkEvents() {
 	lockMutex(eventMutex);
 	CocoaEvent event;
@@ -387,7 +423,8 @@ void CocoaCore::checkEvents() {
 						input->setMouseButtonState(event.mouseButton, false, getTicks());
 						break;
 					case InputEvent::EVENT_KEYDOWN:
-						input->setKeyState(event.keyCode, event.unicodeChar, true, getTicks());
+						if(!checkSpecialKeyEvents(event.keyCode))
+							input->setKeyState(event.keyCode, event.unicodeChar, true, getTicks());
 						break;
 					case InputEvent::EVENT_KEYUP:
 						input->setKeyState(event.keyCode, event.unicodeChar, false, getTicks());

+ 6 - 6
IDE/Contents/Source/PolycodeScreenEditor.cpp

@@ -862,7 +862,7 @@ void PolycodeScreenEditorMain::syncTransformToSelected() {
 void PolycodeScreenEditorMain::updateCursor() {
 	switch(mode) {
 		case MODE_SELECT:
-			CoreServices::getInstance()->getCore()->setCursor(CURSOR_ARROW);
+			CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_ARROW);
 		break;
 		case MODE_IMAGE:
 		case MODE_TEXT:		
@@ -873,16 +873,16 @@ void PolycodeScreenEditorMain::updateCursor() {
 		case MODE_LINK:
 		case MODE_SPRITE:	
 		case MODE_PARTICLES:				
-			CoreServices::getInstance()->getCore()->setCursor(CURSOR_CROSSHAIR);
+			CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_CROSSHAIR);
 		break;
 		case MODE_ZOOM:
-			CoreServices::getInstance()->getCore()->setCursor(CURSOR_CROSSHAIR);		
+			CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_CROSSHAIR);		
 		break;
 		case MODE_PAN:
-			CoreServices::getInstance()->getCore()->setCursor(CURSOR_OPEN_HAND);		
+			CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_OPEN_HAND);		
 		break;
 		default:
-			CoreServices::getInstance()->getCore()->setCursor(CURSOR_ARROW);		
+			CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_ARROW);		
 		break;
 	}
 }
@@ -1827,7 +1827,7 @@ void PolycodeScreenEditorMain::handleEvent(Event *event) {
 				handleMouseUp(inputEvent->mousePosition);
 			break;
 			case InputEvent::EVENT_MOUSEOUT:
-				CoreServices::getInstance()->getCore()->setCursor(CURSOR_ARROW);
+				CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_ARROW);
 			break;
 			case InputEvent::EVENT_MOUSEMOVE:
 			{

+ 3 - 1
Modules/Contents/UI/Include/PolyUITextInput.h

@@ -259,7 +259,9 @@ namespace Polycode {
 			vector<String> lines;
 						
 			vector<ScreenLabel*> bufferLines;
-			vector<ScreenLabel*> numberLines;			
+			vector<ScreenLabel*> numberLines;
+			
+			Core *core;
 			
 	};
 }

+ 2 - 2
Modules/Contents/UI/Source/PolyUIHSizer.cpp

@@ -100,10 +100,10 @@ void UIHSizer::handleEvent(Event *event) {
 			break;
 			case InputEvent::EVENT_MOUSEMOVE:			
 			case InputEvent::EVENT_MOUSEOVER:
-				CoreServices::getInstance()->getCore()->setCursor(CURSOR_RESIZE_LEFT_RIGHT);
+				CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_RESIZE_LEFT_RIGHT);
 			break;
 			case InputEvent::EVENT_MOUSEOUT:
-				CoreServices::getInstance()->getCore()->setCursor(CURSOR_ARROW);
+				CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_ARROW);
 			break;							
 		}
 	}

+ 36 - 40
Modules/Contents/UI/Source/PolyUITextInput.cpp

@@ -184,6 +184,14 @@ UITextInput::UITextInput(bool multiLine, Number width, Number height) : UIElemen
 	checkBufferLines();
 	
 	insertLine(true);
+	
+	core = CoreServices::getInstance()->getCore();
+	core->addEventListener(this, Core::EVENT_COPY);
+	core->addEventListener(this, Core::EVENT_PASTE);
+	core->addEventListener(this, Core::EVENT_CUT);
+	core->addEventListener(this, Core::EVENT_UNDO);
+	core->addEventListener(this, Core::EVENT_REDO);
+	core->addEventListener(this, Core::EVENT_SELECT_ALL);	
 }
 
 void UITextInput::checkBufferLines() {
@@ -1068,43 +1076,6 @@ void UITextInput::onKeyDown(PolyKEY key, wchar_t charCode) {
 //	Logger::log("UCHAR: %d\n", charCode);	
 	
 	CoreInput *input = CoreServices::getInstance()->getCore()->getInput();	
-
-	if(key == KEY_a && (input->getKeyState(KEY_LSUPER) || input->getKeyState(KEY_RSUPER))) {
-		selectAll();
-		return;
-	}
-
-	if(key == KEY_c && (input->getKeyState(KEY_LSUPER) || input->getKeyState(KEY_RSUPER))) {
-		Copy();
-		return;
-	}
-
-	if(key == KEY_x && (input->getKeyState(KEY_LSUPER) || input->getKeyState(KEY_RSUPER))) {
-		Cut();
-		return;
-	}
-	
-	if(key == KEY_z  && (input->getKeyState(KEY_LSUPER) || input->getKeyState(KEY_RSUPER))) {
-		Undo();
-		return;
-	}
-
-	if(key == KEY_z  && (input->getKeyState(KEY_LSUPER) || input->getKeyState(KEY_RSUPER)) && (input->getKeyState(KEY_LSHIFT) || input->getKeyState(KEY_RSHIFT))) {
-		Redo();
-		return;
-	}
-
-
-	if(key == KEY_y  && (input->getKeyState(KEY_LSUPER) || input->getKeyState(KEY_RSUPER))) {
-		Redo();
-		return;
-	}
-
-	if(key == KEY_v && (input->getKeyState(KEY_LSUPER) || input->getKeyState(KEY_RSUPER))) {
-		Paste();
-		return;
-	}	
-	
 	
 	if(key == KEY_LEFT) {
 		if(input->getKeyState(KEY_LSUPER) || input->getKeyState(KEY_RSUPER)) {
@@ -1364,6 +1335,7 @@ void UITextInput::Update() {
 }
 
 UITextInput::~UITextInput() {
+	core->removeAllHandlersForListener(this);
 	delete linesContainer;
 	delete inputRect;
 	delete lineNumberBg;
@@ -1411,6 +1383,30 @@ void UITextInput::readjustBuffer() {
 		
 void UITextInput::handleEvent(Event *event) {
 
+	if(event->getDispatcher() == core) {
+		switch(event->getEventCode()) {
+			case Core::EVENT_UNDO:
+				Undo();
+			break;
+			case Core::EVENT_REDO:
+				Redo();
+			break;
+			case Core::EVENT_COPY:
+				Copy();
+			break;
+			case Core::EVENT_CUT:
+				Cut();
+			break;
+			case Core::EVENT_PASTE:
+				Paste();
+			break;
+			case Core::EVENT_SELECT_ALL:
+				selectAll();
+			break;
+			
+		}
+	}
+
 	if(event->getDispatcher() == scrollContainer) {
 		if(event->getEventCode() == Event::CHANGE_EVENT) {
 			applySyntaxFormatting();
@@ -1435,16 +1431,16 @@ void UITextInput::handleEvent(Event *event) {
 				selectWordAtCaret();
 			break;
 			case InputEvent::EVENT_MOUSEMOVE:
-				CoreServices::getInstance()->getCore()->setCursor(CURSOR_TEXT);			
+				CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_TEXT);			
 				if(draggingSelection) {
 					dragSelectionTo(((InputEvent*)event)->mousePosition.x, ((InputEvent*)event)->mousePosition.y - linesContainer->getPosition().y);		
 				}
 			break;
 			case InputEvent::EVENT_MOUSEOVER:
-				CoreServices::getInstance()->getCore()->setCursor(CURSOR_TEXT);
+				CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_TEXT);
 			break;
 			case InputEvent::EVENT_MOUSEOUT:
-				CoreServices::getInstance()->getCore()->setCursor(CURSOR_ARROW);
+				CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_ARROW);
 			break;				
 		}
 	}

+ 2 - 2
Modules/Contents/UI/Source/PolyUIVSizer.cpp

@@ -100,10 +100,10 @@ void UIVSizer::handleEvent(Event *event) {
 			break;
 			case InputEvent::EVENT_MOUSEMOVE:			
 			case InputEvent::EVENT_MOUSEOVER:
-				CoreServices::getInstance()->getCore()->setCursor(CURSOR_RESIZE_UP_DOWN);
+				CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_RESIZE_UP_DOWN);
 			break;
 			case InputEvent::EVENT_MOUSEOUT:
-				CoreServices::getInstance()->getCore()->setCursor(CURSOR_ARROW);
+				CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_ARROW);
 			break;							
 		}
 	}