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

Add UIMenuDivider class and UIMenu::addDivider() method

- Added isSelectable() method to UIMenuItem to distinguish
  between things that can and can't be clicked (decorative
  vs. functional).
Nur Monson 12 лет назад
Родитель
Сommit
94c0728579
2 измененных файлов с 70 добавлено и 6 удалено
  1. 22 0
      Modules/Contents/UI/Include/PolyUIMenu.h
  2. 48 6
      Modules/Contents/UI/Source/PolyUIMenu.cpp

+ 22 - 0
Modules/Contents/UI/Include/PolyUIMenu.h

@@ -26,6 +26,7 @@
 #include "PolyUIBox.h"
 
 namespace Polycode {
+	class ScreenLine;
 
 	/**
 	 * An single selectable entry in an UIMenu
@@ -34,6 +35,8 @@ namespace Polycode {
 		public:
 			UIMenuItem(String label, String _id, void *data, Number comboWidth, Number comboHeight);
 			~UIMenuItem();
+
+			virtual bool isSelectable();
 			
 			/**
 			 * The user-data associated with this entry, as set in UIMenu::addOption()
@@ -54,10 +57,22 @@ namespace Polycode {
 			String _id;
 
 		protected:
+			UIMenuItem();
+
 			ScreenLabel *itemLabel;
 			friend class UIMenu;
 	};
 
+	class _PolyExport UIMenuDivider : public UIMenuItem {
+	public:
+		UIMenuDivider(Number comboWidth, Number comboHeight);
+		~UIMenuDivider();
+		bool isSelectable();
+
+	protected:
+		ScreenLine* line;
+	};
+
 	/** 
 	 * A dropdown menu.
 	 *
@@ -86,6 +101,13 @@ namespace Polycode {
 			 */
 			UIMenuItem *addOption(String label, String _id, void *data = NULL);
 
+			/**
+			 * Add a non-selectable entry to the dropdown
+			 * used to separate sections of the menu
+			 *
+			 */
+			UIMenuItem *addDivider();
+
 			/**
 			 * Returns the currently selected item.
 			 *

+ 48 - 6
Modules/Contents/UI/Source/PolyUIMenu.cpp

@@ -27,6 +27,7 @@
 #include "PolyCoreServices.h"
 #include "PolyCore.h"
 #include "PolyConfig.h"
+#include "PolyScreenLine.h"
 
 using namespace Polycode;
 
@@ -42,15 +43,43 @@ UIMenuItem::UIMenuItem(String label, String _id, void *data, Number comboWidth,
 	Number paddingY = conf->getNumericValue("Polycode", "uiMenuTextOffsetY");	
 
 	itemLabel = new ScreenLabel(label, fontSize, fontName);
-	itemLabel->setPosition(paddingX, floor(((comboHeight/2.0) - itemLabel->getHeight()/2.0) + paddingY));	
+	itemLabel->setPosition(paddingX, floor(((comboHeight/2.0) - itemLabel->getHeight()/2.0) + paddingY));
 	addChild(itemLabel);
 	
 	this->_id = _id;
 	this->data = data;
 }
 
+UIMenuItem::UIMenuItem() : UIElement(), data(NULL), itemLabel(NULL) {
+}
+
+bool UIMenuItem::isSelectable()
+{
+	return true;
+}
+
 UIMenuItem::~UIMenuItem() {
-	delete itemLabel;
+	if(itemLabel)
+		delete itemLabel;
+}
+
+UIMenuDivider::UIMenuDivider(Number comboWidth, Number comboHeight) : UIMenuItem() {
+	Config *conf    = CoreServices::getInstance()->getConfig();
+	Number paddingX = conf->getNumericValue("Polycode", "uiMenuSelectorPadding");
+
+	line = new ScreenLine(Vector2(paddingX, comboHeight/2.0), Vector2(comboWidth-paddingX, comboHeight/2.0));
+	line->setLineWidth(1.0);
+	line->setColor(Color(0.0, 0.0, 0.0, 0.7));
+	addChild(line);
+}
+
+UIMenuDivider::~UIMenuDivider() {
+	delete line;
+}
+
+bool UIMenuDivider::isSelectable()
+{
+	return false;
 }
 
 UIMenu::UIMenu(Number menuWidth) : UIElement() {
@@ -147,7 +176,8 @@ void UIMenu::fitToScreenVertical() {
 		}
 	}
 }
-				
+
+
 void UIMenu::handleEvent(Event *event) {
 
 	if(event->getDispatcher() == CoreServices::getInstance()->getCore()->getInput()) {
@@ -162,8 +192,8 @@ void UIMenu::handleEvent(Event *event) {
 		if((event->getEventCode() == InputEvent::EVENT_MOUSEDOWN || (event->getEventCode() == InputEvent::EVENT_MOUSEUP && initialMouse != inputEvent->getMousePosition())) && !ignoreMouse) {
 			if(selectorBox->visible) {
 				dispatchEvent(new UIEvent(), UIEvent::OK_EVENT);
-			} else {
-				dispatchEvent(new UIEvent(), UIEvent::CANCEL_EVENT);				
+			} else if(!dropDownBox->hitTest(inputEvent->getMousePosition())) {
+				dispatchEvent(new UIEvent(), UIEvent::CANCEL_EVENT);
 			}
 		}
 	}
@@ -180,7 +210,7 @@ void UIMenu::handleEvent(Event *event) {
 				InputEvent *inputEvent = (InputEvent*) event;
 				selectedOffset = floor(((inputEvent->getMousePosition().y-selectorPadding)-paddingY)/menuItemHeight);
 					
-				if(selectedOffset >= 0 && selectedOffset < items.size()) {
+				if(selectedOffset >= 0 && selectedOffset < items.size() && items[selectedOffset]->isSelectable()) {
 					selectorBox->visible = true;				
 					selectorBox->setPosition(paddingX,paddingY+(selectedOffset*menuItemHeight) - selectorPadding);
 				} else {
@@ -212,6 +242,18 @@ UIMenuItem *UIMenu::addOption(String label, String _id, void *data) {
 	return newItem;
 }
 
+UIMenuItem *UIMenu::addDivider()
+{
+	Number newItemHeight = menuItemHeight;
+	UIMenuItem *newItem = new UIMenuDivider(menuWidth, newItemHeight);
+	items.push_back(newItem);
+	dropDownBox->addChild(newItem);
+	newItem->setPosition(0, paddingY+nextItemHeight);
+	nextItemHeight += newItemHeight;
+	dropDownBox->resizeBox(menuWidth, nextItemHeight + (paddingY*2.0));
+	return newItem;
+}
+
 void UIMenu::Resize(Number width, Number height) {
 	UIElement::Resize(width, height);
 }