Przeglądaj źródła

Added support for context menus in UITextInput, added context menu for text inputs in the IDE

Ivan Safrin 12 lat temu
rodzic
commit
009e198e25

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

@@ -72,7 +72,8 @@ PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 	willRunProject = false;
 
 	globalMenu	= new UIGlobalMenu();
-		
+	UITextInput::setMenuSingleton(globalMenu);
+			
 	printf("creating font editor\n"); 
 	
 	Screen *screen = new Screen();	

+ 9 - 2
Modules/Contents/UI/Include/PolyUITextInput.h

@@ -29,6 +29,7 @@
 #include "PolyScreenEntity.h"
 #include "PolyUIEvent.h"
 #include "PolyUIBox.h"
+#include "PolyUIMenu.h"
 #include "PolyUIElement.h"
 #include "PolyTimer.h"
 #include "PolyCoreInput.h"
@@ -359,9 +360,13 @@ namespace Polycode {
             void convertIndentToTabs();
             void convertIndentToSpaces();
 			
-			void doMultilineResize();			
+			void doMultilineResize();
+						
+			static void setMenuSingleton(UIGlobalMenu *_globalMenu);
+					
+		protected:
 		
-		protected:		
+			static UIGlobalMenu *globalMenuSingleton;
 		
 			void readjustBuffer(int lineStart=0, int lineEnd=-1);
 			void updateWordWrap(int lineStart, int lineEnd);
@@ -490,6 +495,8 @@ namespace Polycode {
 			Number sb;
 			Number sl;
 			
+			UIMenu *contextMenu;
+			
 			Vector2 selectionDragMouse;
 		
 			Number caretImagePosition;

+ 1 - 0
Modules/Contents/UI/Source/PolyUIMenu.cpp

@@ -207,6 +207,7 @@ void UIMenu::handleEvent(Event *event) {
 			break;
 			case InputEvent::EVENT_MOUSEMOVE:
 			{
+				CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_ARROW);				
 				InputEvent *inputEvent = (InputEvent*) event;
 				selectedOffset = floor(((inputEvent->getMousePosition().y-selectorPadding)-paddingY)/menuItemHeight);
 					

+ 43 - 8
Modules/Contents/UI/Source/PolyUITextInput.cpp

@@ -30,6 +30,12 @@
 
 using namespace Polycode;
 
+UIGlobalMenu* UITextInput::globalMenuSingleton = NULL;
+
+void UITextInput::setMenuSingleton(UIGlobalMenu *_globalMenu) {
+	globalMenuSingleton = _globalMenu;
+}
+
 UITextInput::UITextInput(bool multiLine, Number width, Number height) : UIElement(width, height) {
 	this->multiLine = multiLine;
 	processInputEvents = true;
@@ -2415,6 +2421,20 @@ void UITextInput::readjustBuffer(int lineStart, int lineEnd) {
 
 void UITextInput::handleEvent(Event *event) {
 
+	if(event->getDispatcher() == contextMenu) {
+		UIMenuItem *item = contextMenu->getSelectedItem();
+		if(item->_id == "copy") {
+			Copy();
+		} else if(item->_id == "cut") {
+			Cut();
+		} else if(item->_id == "paste") {
+			Paste();
+		} else if(item->_id == "select_all") {
+			selectAll();
+		}
+	}
+
+
 	if(event->getDispatcher() == core && hasFocus) {
 		switch(event->getEventCode()) {
 			case Core::EVENT_UNDO:
@@ -2447,16 +2467,31 @@ void UITextInput::handleEvent(Event *event) {
 
 	if(event->getDispatcher() == inputRect) {
 		switch(event->getEventCode()) {
-			case InputEvent::EVENT_MOUSEDOWN:
-				if(parentEntity) {
-					((ScreenEntity*)parentEntity)->focusChild(this);
+			case InputEvent::EVENT_MOUSEDOWN:			
+				if(((InputEvent*)event)->getMouseButton() == CoreInput::MOUSE_BUTTON2) {
+					if(globalMenuSingleton) {
+						contextMenu = globalMenuSingleton->showMenuAtMouse(100);
+
+						contextMenu->addOption("Copy", "copy");
+						contextMenu->addOption("Cut", "cut");
+						contextMenu->addOption("Paste", "paste");
+						contextMenu->addDivider();
+						contextMenu->addOption("Select All", "select_all");	
+						contextMenu->fitToScreenVertical();
+						contextMenu->addEventListener(this, UIEvent::OK_EVENT);
+						return;						
+					}
 				} else {
-					hasFocus = true;
+					if(parentEntity) {
+						((ScreenEntity*)parentEntity)->focusChild(this);
+					} else {
+						hasFocus = true;
+					}
+					setCaretToMouse(((InputEvent*)event)->mousePosition.x, ((InputEvent*)event)->mousePosition.y - linesContainer->getPosition().y);
+					selectionDragMouse = ((InputEvent*)event)->mousePosition;				
+					dragMouseStart = ((InputEvent*)event)->mousePosition;
+					draggingSelection = true;
 				}
-				setCaretToMouse(((InputEvent*)event)->mousePosition.x, ((InputEvent*)event)->mousePosition.y - linesContainer->getPosition().y);
-				selectionDragMouse = ((InputEvent*)event)->mousePosition;				
-				dragMouseStart = ((InputEvent*)event)->mousePosition;
-				draggingSelection = true;
 			break;
 			case InputEvent::EVENT_MOUSEUP:
 				draggingSelection = false;