Browse Source

Merge pull request #303 from TheCosmotect/projbrowser-selection

Arrow-key nav/selection no longer opens files as a side-effect in PolycodeProjectBrowser
Ivan Safrin 12 years ago
parent
commit
e35f53bb64

+ 19 - 3
IDE/Contents/Source/PolycodeIDEApp.cpp

@@ -183,6 +183,8 @@ PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 
 
 	needsRedraw = false;
 	needsRedraw = false;
 	lastConnected = false;
 	lastConnected = false;
+	
+	CoreServices::getInstance()->getCore()->getInput()->addEventListener(this, InputEvent::EVENT_KEYDOWN);
 }
 }
 
 
 void PolycodeIDEApp::renameFile() {
 void PolycodeIDEApp::renameFile() {
@@ -606,7 +608,8 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 		}
 		}
 		
 		
 		if(event->getEventCode() == Event::CHANGE_EVENT) {
 		if(event->getEventCode() == Event::CHANGE_EVENT) {
-			BrowserUserData *selectedData = frame->getProjectBrowser()->getSelectedData();
+			PolycodeProjectBrowser *pb = frame->getProjectBrowser();
+			BrowserUserData *selectedData = pb->getSelectedData();
 						
 						
 			if(selectedData->type == 3) {
 			if(selectedData->type == 3) {
 				projectManager->activeFolder = selectedData->parentProject->getRootFolder();
 				projectManager->activeFolder = selectedData->parentProject->getRootFolder();
@@ -629,7 +632,8 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 			if(selectedData->type == 0)
 			if(selectedData->type == 0)
 				return;			
 				return;			
 			
 			
-			if(selectedData) {
+			// don't open the editor if the selection was made by UITreeContainer arrow-key navigation
+			if (selectedData && pb->treeContainer->getRootNode()->getSelectedNode()->isSelectedByKey() == false) {
 				openFile(selectedData->fileEntry);
 				openFile(selectedData->fileEntry);
 			}
 			}
 		}
 		}
@@ -781,7 +785,19 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 			
 			
 			frame->hideModal();			
 			frame->hideModal();			
 		}
 		}
-	}	
+	}
+	
+	// open an editor/file if project browser has focus and user hits enter or right-arrow key
+	if (event->getDispatcher() == CoreServices::getInstance()->getCore()->getInput()) {
+		if (event->getEventCode() == InputEvent::EVENT_KEYDOWN && frame->getProjectBrowser()->treeContainer->hasFocus) {
+			InputEvent *inEvent = (InputEvent*)event;
+			if (inEvent->keyCode() == KEY_RETURN || inEvent->keyCode() == KEY_RIGHT) {
+				BrowserUserData *selectedData = frame->getProjectBrowser()->getSelectedData();
+				if (selectedData)
+					openFile(selectedData->fileEntry);
+			}
+		}
+	}
 }
 }
 
 
 void PolycodeIDEApp::saveConfigFile() {
 void PolycodeIDEApp::saveConfigFile() {

+ 5 - 1
Modules/Contents/UI/Include/PolyUITree.h

@@ -54,7 +54,7 @@ namespace Polycode {
 			void setUserData(void *data);
 			void setUserData(void *data);
 			UITree *getSelectedNode();
 			UITree *getSelectedNode();
 			void setIcon(String iconFile);
 			void setIcon(String iconFile);
-			void setSelected();
+			void setSelected(bool byKey=false);
 			
 			
 			void setLabelText(const String &text);
 			void setLabelText(const String &text);
 			
 			
@@ -74,6 +74,8 @@ namespace Polycode {
 			UITree *getPrevSibling();
 			UITree *getPrevSibling();
 			UITree *getNextSibling();
 			UITree *getNextSibling();
 			Number getCellHeight() { return cellHeight; }
 			Number getCellHeight() { return cellHeight; }
+
+			bool isSelectedByKey() { return selectedByKey; }
 		
 		
 		private:
 		private:
 
 
@@ -104,5 +106,7 @@ namespace Polycode {
 			int size;
 			int size;
 			Number cellHeight;
 			Number cellHeight;
 			Number cellPadding;
 			Number cellPadding;
+
+			bool selectedByKey;
 	};
 	};
 }
 }

+ 1 - 2
Modules/Contents/UI/Include/PolyUITreeContainer.h

@@ -47,9 +47,8 @@ namespace Polycode {
 		 * Scrolls the container to show a specified node.
 		 * Scrolls the container to show a specified node.
 		 * @param node The tree node to scroll to or show.
 		 * @param node The tree node to scroll to or show.
 		 * @param showAtTop If true, show the node at the top of the container. If false, show it at the bottom.
 		 * @param showAtTop If true, show the node at the top of the container. If false, show it at the bottom.
-		 * @param select If true (default), select the node. If false, don't.
 		 */
 		 */
-		void scrollToNode(UITree *node, bool showAtTop, bool select=true);
+		void scrollToNode(UITree *node, bool showAtTop);
 		
 		
 	protected:
 	protected:
 		bool keyNavigable;
 		bool keyNavigable;

+ 2 - 1
Modules/Contents/UI/Source/PolyUITree.cpp

@@ -145,7 +145,8 @@ void UITree::removeTreeChild(UITree *child) {
 	}
 	}
 }
 }
 
 
-void UITree::setSelected() {
+void UITree::setSelected(bool byKey) {
+	selectedByKey = byKey;
 	selected = true;
 	selected = true;
 	refreshTree();
 	refreshTree();
 	if(parent == NULL) {
 	if(parent == NULL) {

+ 8 - 15
Modules/Contents/UI/Source/PolyUITreeContainer.cpp

@@ -167,9 +167,9 @@ void UITreeContainer::onKeyDown(PolyKEY key, wchar_t charCode) {
 					for (int i=0; i < parent->getNumTreeChildren(); i++) {
 					for (int i=0; i < parent->getNumTreeChildren(); i++) {
 						if (parent->getTreeChild(i) == currentSelection) {
 						if (parent->getTreeChild(i) == currentSelection) {
 							if (i == 0)
 							if (i == 0)
-								parent->setSelected();
+								parent->setSelected(true);
 							else
 							else
-								findLastOpenNode((parent->getTreeChild(i-1)))->setSelected();
+								findLastOpenNode((parent->getTreeChild(i-1)))->setSelected(true);
 							scrollDir = UP;
 							scrollDir = UP;
 							break;
 							break;
 						}
 						}
@@ -185,7 +185,7 @@ void UITreeContainer::onKeyDown(PolyKEY key, wchar_t charCode) {
 					parent = getRootNode();
 					parent = getRootNode();
 
 
 				if (currentSelection->hasTreeChildren() && !currentSelection->isCollapsed()) {
 				if (currentSelection->hasTreeChildren() && !currentSelection->isCollapsed()) {
-					currentSelection->getTreeChild(0)->setSelected();
+					currentSelection->getTreeChild(0)->setSelected(true);
 					scrollDir = DOWN;
 					scrollDir = DOWN;
 				}
 				}
 				else {
 				else {
@@ -194,9 +194,9 @@ void UITreeContainer::onKeyDown(PolyKEY key, wchar_t charCode) {
 							if (i == parent->getNumTreeChildren()-1) {
 							if (i == parent->getNumTreeChildren()-1) {
 								UITree *psib = findNextParentSibling(parent);
 								UITree *psib = findNextParentSibling(parent);
 								if (psib)
 								if (psib)
-									psib->setSelected();
+									psib->setSelected(true);
 							} else {
 							} else {
-								parent->getTreeChild(i+1)->setSelected();
+								parent->getTreeChild(i+1)->setSelected(true);
 							}
 							}
 							scrollDir = DOWN;
 							scrollDir = DOWN;
 							break;
 							break;
@@ -209,7 +209,7 @@ void UITreeContainer::onKeyDown(PolyKEY key, wchar_t charCode) {
 				if (currentSelection->hasTreeChildren() && !currentSelection->isCollapsed())
 				if (currentSelection->hasTreeChildren() && !currentSelection->isCollapsed())
 					currentSelection->toggleCollapsed();
 					currentSelection->toggleCollapsed();
 				else if (parent) {
 				else if (parent) {
-					parent->setSelected();
+					parent->setSelected(true);
 					scrollDir = UP;
 					scrollDir = UP;
 				}
 				}
 			}
 			}
@@ -218,15 +218,11 @@ void UITreeContainer::onKeyDown(PolyKEY key, wchar_t charCode) {
 				if (currentSelection->hasTreeChildren()) {
 				if (currentSelection->hasTreeChildren()) {
 					if (currentSelection->isCollapsed())
 					if (currentSelection->isCollapsed())
 						currentSelection->toggleCollapsed();
 						currentSelection->toggleCollapsed();
-					else {
-						currentSelection->getTreeChild(0)->setSelected();
-						scrollDir = DOWN;
-					}
 				}
 				}
 			}
 			}
 			
 			
 			if (scrollDir != NONE)
 			if (scrollDir != NONE)
-				scrollToNode(getRootNode()->getSelectedNode(), (scrollDir == UP) ? true : false, false);
+				scrollToNode(getRootNode()->getSelectedNode(), (scrollDir == UP) ? true : false);
 		}
 		}
 		//
 		//
 		// END KEYBOARD NAV STUFF
 		// END KEYBOARD NAV STUFF
@@ -234,7 +230,7 @@ void UITreeContainer::onKeyDown(PolyKEY key, wchar_t charCode) {
 	}
 	}
 }
 }
 
 
-void UITreeContainer::scrollToNode(UITree *node, bool showAtTop, bool select) {
+void UITreeContainer::scrollToNode(UITree *node, bool showAtTop) {
 	
 	
 	Number nodeY = node->getScreenPosition().y - getRootNode()->getScreenPosition().y;
 	Number nodeY = node->getScreenPosition().y - getRootNode()->getScreenPosition().y;
 	Number contentHeight = mainContainer->getContentSize().y;
 	Number contentHeight = mainContainer->getContentSize().y;
@@ -242,9 +238,6 @@ void UITreeContainer::scrollToNode(UITree *node, bool showAtTop, bool select) {
 	Number viewTop = (contentHeight - mainContainer->getHeight()) * mainContainer->getVScrollBar()->getScrollValue();
 	Number viewTop = (contentHeight - mainContainer->getHeight()) * mainContainer->getVScrollBar()->getScrollValue();
 	Number viewBottom = viewTop + mainContainer->getHeight();
 	Number viewBottom = viewTop + mainContainer->getHeight();
 	
 	
-	if (select)
-		node->setSelected();
-	
 	if (nodeY < viewTop || nodeY+node->getCellHeight() > viewBottom) {
 	if (nodeY < viewTop || nodeY+node->getCellHeight() > viewBottom) {
 		if (showAtTop)
 		if (showAtTop)
 			mainContainer->scrollVertical((nodeY-viewTop) / scrollHeight);
 			mainContainer->scrollVertical((nodeY-viewTop) / scrollHeight);