Kaynağa Gözat

Rewrite of ALL the destructors in the UI module; destructor safety in Polycore Tween object.

mcc 13 yıl önce
ebeveyn
işleme
73035453bb

+ 3 - 1
Core/Contents/Source/PolyTween.cpp

@@ -65,7 +65,9 @@ void Tween::setSpeed(Number speed) {
 Tween::~Tween() {
 Tween::~Tween() {
 	tweenTimer->removeEventListener(this, 0);
 	tweenTimer->removeEventListener(this, 0);
 	delete tweenTimer;
 	delete tweenTimer;
-	CoreServices::getInstance()->getTweenManager()->removeTween(this);	
+	
+	deleteOnComplete = false; // Prevent loop when we removeTween in next line.
+	CoreServices::getInstance()->getTweenManager()->removeTween(this);
 }
 }
 
 
 bool Tween::isComplete() {
 bool Tween::isComplete() {

+ 2 - 0
Modules/Contents/UI/Include/PolyUIColorBox.h

@@ -85,6 +85,8 @@ namespace Polycode {
 			UIHSlider *alphaSlider;
 			UIHSlider *alphaSlider;
 			
 			
 			ScreenShape *mainColorRect;
 			ScreenShape *mainColorRect;
+			
+			vector<ScreenLabel *> junkLabels; // Kept only to delete
 	};
 	};
 
 
 	class _PolyExport UIColorBox : public UIElement {
 	class _PolyExport UIColorBox : public UIElement {

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

@@ -55,7 +55,6 @@ namespace Polycode {
 			
 			
 		protected:
 		protected:
 		
 		
-			ScreenImage *dropDownImage;
 			Number menuItemHeight;
 			Number menuItemHeight;
 			Number menuWidth;
 			Number menuWidth;
 			
 			

+ 3 - 0
Modules/Contents/UI/Include/PolyUIWindow.h

@@ -71,5 +71,8 @@ namespace Polycode {
 			UIImageButton *closeBtn;
 			UIImageButton *closeBtn;
 			UIBox *windowRect;
 			UIBox *windowRect;
 			ScreenShape *titlebarRect;
 			ScreenShape *titlebarRect;
+		
+			bool tweenClosing;
+			void resetTween();
 	};
 	};
 }
 }

+ 3 - 1
Modules/Contents/UI/Source/PolyUIButton.cpp

@@ -91,7 +91,9 @@ void UIButton::Update() {
 }
 }
 
 
 UIButton::~UIButton() {
 UIButton::~UIButton() {
-
+	delete buttonRect;
+	delete buttonFocusedRect;
+	delete buttonLabel;
 }
 }
 		
 		
 void UIButton::handleEvent(Event *event) {
 void UIButton::handleEvent(Event *event) {

+ 5 - 4
Modules/Contents/UI/Source/PolyUICheckBox.cpp

@@ -38,9 +38,9 @@ UICheckBox::UICheckBox(String caption, bool checked) : UIElement() {
 	String uncheckImage = conf->getStringValue("Polycode", "uiCheckBoxUncheckedImage");
 	String uncheckImage = conf->getStringValue("Polycode", "uiCheckBoxUncheckedImage");
 	Number checkboxTextOffsetX = conf->getNumericValue("Polycode", "uiCheckBoxLabelOffsetX");
 	Number checkboxTextOffsetX = conf->getNumericValue("Polycode", "uiCheckBoxLabelOffsetX");
 	Number checkboxTextOffsetY = conf->getNumericValue("Polycode", "uiCheckBoxLabelOffsetY");
 	Number checkboxTextOffsetY = conf->getNumericValue("Polycode", "uiCheckBoxLabelOffsetY");
-		
+	
 	this->checked = checked;
 	this->checked = checked;
-		
+	
 	buttonImageChecked = new ScreenImage(checkImage);
 	buttonImageChecked = new ScreenImage(checkImage);
 	buttonImageChecked->visible = checked;
 	buttonImageChecked->visible = checked;
 
 
@@ -67,7 +67,6 @@ UICheckBox::UICheckBox(String caption, bool checked) : UIElement() {
 	
 	
 	height = buttonImageUnchecked->getHeight();
 	height = buttonImageUnchecked->getHeight();
 	width = buttonImageUnchecked->getWidth() + captionLabel->getWidth() + checkboxTextOffsetX;
 	width = buttonImageUnchecked->getWidth() + captionLabel->getWidth() + checkboxTextOffsetX;
-	
 }
 }
 
 
 String UICheckBox::getCaptionLabel() {
 String UICheckBox::getCaptionLabel() {
@@ -75,7 +74,9 @@ String UICheckBox::getCaptionLabel() {
 }
 }
 
 
 UICheckBox::~UICheckBox() {
 UICheckBox::~UICheckBox() {
-
+	delete buttonImageChecked;
+	delete buttonImageUnchecked;
+	delete captionLabel;
 }
 }
 
 
 bool UICheckBox::isChecked() {
 bool UICheckBox::isChecked() {

+ 22 - 1
Modules/Contents/UI/Source/PolyUIColorBox.cpp

@@ -95,6 +95,7 @@ UIColorPicker::UIColorPicker() : UIWindow(L"", 300, 240) {
 	ScreenLabel *label = new ScreenLabel(L"R:", fontSize, fontName);
 	ScreenLabel *label = new ScreenLabel(L"R:", fontSize, fontName);
 	label->setPosition(hueFrame->getPosition().x+hueFrame->getWidth() + 15, topPadding+padding + 3);
 	label->setPosition(hueFrame->getPosition().x+hueFrame->getWidth() + 15, topPadding+padding + 3);
 	addChild(label);
 	addChild(label);
+	junkLabels.push_back(label);
 	
 	
 	rTextInput = new UITextInput(false, 40, 12);
 	rTextInput = new UITextInput(false, 40, 12);
 	rTextInput->setPosition(hueFrame->getPosition().x+hueFrame->getWidth() + 30, topPadding+padding);
 	rTextInput->setPosition(hueFrame->getPosition().x+hueFrame->getWidth() + 30, topPadding+padding);
@@ -104,6 +105,7 @@ UIColorPicker::UIColorPicker() : UIWindow(L"", 300, 240) {
 	label = new ScreenLabel(L"G:", fontSize, fontName);
 	label = new ScreenLabel(L"G:", fontSize, fontName);
 	label->setPosition(hueFrame->getPosition().x+hueFrame->getWidth() + 15, topPadding+padding + 33);
 	label->setPosition(hueFrame->getPosition().x+hueFrame->getWidth() + 15, topPadding+padding + 33);
 	addChild(label);
 	addChild(label);
+	junkLabels.push_back(label);
 	
 	
 	gTextInput = new UITextInput(false, 40, 12);
 	gTextInput = new UITextInput(false, 40, 12);
 	gTextInput->setPosition(hueFrame->getPosition().x+hueFrame->getWidth() + 30, topPadding+padding + 30);
 	gTextInput->setPosition(hueFrame->getPosition().x+hueFrame->getWidth() + 30, topPadding+padding + 30);
@@ -113,6 +115,7 @@ UIColorPicker::UIColorPicker() : UIWindow(L"", 300, 240) {
 	label = new ScreenLabel(L"B:", fontSize, fontName);
 	label = new ScreenLabel(L"B:", fontSize, fontName);
 	label->setPosition(hueFrame->getPosition().x+hueFrame->getWidth() + 15, topPadding+padding + 63);
 	label->setPosition(hueFrame->getPosition().x+hueFrame->getWidth() + 15, topPadding+padding + 63);
 	addChild(label);
 	addChild(label);
+	junkLabels.push_back(label);
 	
 	
 	bTextInput = new UITextInput(false, 40, 12);
 	bTextInput = new UITextInput(false, 40, 12);
 	bTextInput->setPosition(hueFrame->getPosition().x+hueFrame->getWidth() + 30, topPadding+padding + 60);
 	bTextInput->setPosition(hueFrame->getPosition().x+hueFrame->getWidth() + 30, topPadding+padding + 60);
@@ -122,6 +125,7 @@ UIColorPicker::UIColorPicker() : UIWindow(L"", 300, 240) {
 	label = new ScreenLabel(L"A:", fontSize, fontName);
 	label = new ScreenLabel(L"A:", fontSize, fontName);
 	label->setPosition(hueFrame->getPosition().x+hueFrame->getWidth() + 15, topPadding+padding + 93);
 	label->setPosition(hueFrame->getPosition().x+hueFrame->getWidth() + 15, topPadding+padding + 93);
 	addChild(label);
 	addChild(label);
+	junkLabels.push_back(label);
 	
 	
 	aTextInput = new UITextInput(false, 40, 12);
 	aTextInput = new UITextInput(false, 40, 12);
 	aTextInput->setPosition(hueFrame->getPosition().x+hueFrame->getWidth() + 30, topPadding+padding + 90);
 	aTextInput->setPosition(hueFrame->getPosition().x+hueFrame->getWidth() + 30, topPadding+padding + 90);
@@ -339,7 +343,20 @@ void UIColorPicker::setHue(Number hueNum) {
 }
 }
 
 
 UIColorPicker::~UIColorPicker() {
 UIColorPicker::~UIColorPicker() {
-
+	delete mainBg;
+	delete mainFrame;
+	delete alphaSlider;
+	delete mainColorRect;
+	delete hueFrame;
+	delete hueSelector;
+	delete mainSelector;
+	delete rTextInput;
+	delete gTextInput;
+	delete bTextInput;
+	delete aTextInput;
+	
+	for(int c = 0; c < junkLabels.size(); c++)
+		delete junkLabels[c];
 }
 }
 
 
 void UIColorPicker::Update() {
 void UIColorPicker::Update() {
@@ -428,6 +445,10 @@ Color UIColorBox::getSelectedColor() {
 
 
 UIColorBox::~UIColorBox() {
 UIColorBox::~UIColorBox() {
 	colorPicker->removeAllHandlersForListener(this);
 	colorPicker->removeAllHandlersForListener(this);
+	
+	delete bgImage;
+	delete colorShape;
+	delete frameImage;
 }
 }
 
 
 void UIColorBox::setBoxColor(Color newColor) {
 void UIColorBox::setBoxColor(Color newColor) {

+ 6 - 1
Modules/Contents/UI/Source/PolyUIComboBox.cpp

@@ -101,7 +101,12 @@ UIComboBox::UIComboBox(UIGlobalMenu *globalMenu, Number comboWidth) : UIElement(
 }
 }
 
 
 UIComboBox::~UIComboBox() {
 UIComboBox::~UIComboBox() {
-
+	for(int c = 0; c < items.size(); c++)
+		delete items[c];
+	
+	delete dropDownImage;
+	delete bgBox;
+	delete selectedLabel;
 }
 }
 
 
 void UIComboBox::clearItems() {
 void UIComboBox::clearItems() {

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

@@ -172,5 +172,6 @@ void UIHScrollBar::handleEvent(Event *event) {
 
 
 
 
 UIHScrollBar::~UIHScrollBar() {
 UIHScrollBar::~UIHScrollBar() {
-	
+	delete bgBox;
+	delete handleBox;
 }
 }

+ 8 - 1
Modules/Contents/UI/Source/PolyUIHSizer.cpp

@@ -74,7 +74,14 @@ UIHSizer::UIHSizer(Number width, Number height, Number mainWidth, bool leftSizer
 }
 }
 
 
 UIHSizer::~UIHSizer() {
 UIHSizer::~UIHSizer() {
-
+	coreInput->removeAllHandlersForListener(this);
+	
+	if (ownsChildren)
+		childElements->ownsChildren = true;
+	delete childElements;
+	
+	delete separatorBgShape;
+	delete separatorHitShape;
 }
 }
 
 
 void UIHSizer::handleEvent(Event *event) {
 void UIHSizer::handleEvent(Event *event) {

+ 3 - 1
Modules/Contents/UI/Source/PolyUIHSlider.cpp

@@ -78,7 +78,9 @@ UIHSlider::UIHSlider(Number start, Number end, Number width) : UIElement() {
 }
 }
 
 
 UIHSlider::~UIHSlider() {
 UIHSlider::~UIHSlider() {
-
+	delete bgRect;
+	delete gripRect;
+	delete bgHitBox;
 }
 }
 
 
 void UIHSlider::setSliderValue(Number val) {
 void UIHSlider::setSliderValue(Number val) {

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

@@ -76,5 +76,6 @@ void UIImageButton::handleEvent(Event *event) {
 }
 }
 
 
 UIImageButton::~UIImageButton() {
 UIImageButton::~UIImageButton() {
-
+	delete buttonImage;
+	delete buttonRect;
 }
 }

+ 7 - 3
Modules/Contents/UI/Source/PolyUIMenu.cpp

@@ -47,12 +47,10 @@ UIMenuItem::UIMenuItem(String label, String _id, void *data, Number comboWidth,
 	
 	
 	this->_id = _id;
 	this->_id = _id;
 	this->data = data;
 	this->data = data;
-
-
 }
 }
 
 
 UIMenuItem::~UIMenuItem() {
 UIMenuItem::~UIMenuItem() {
-		
+	delete itemLabel;
 }
 }
 
 
 UIMenu::UIMenu(Number menuWidth) : UIElement() {
 UIMenu::UIMenu(Number menuWidth) : UIElement() {
@@ -178,6 +176,12 @@ void UIMenu::handleEvent(Event *event) {
 
 
 
 
 UIMenu::~UIMenu() {
 UIMenu::~UIMenu() {
+	for(int c = 0; c < items.size(); c++)
+		delete items[c];
+	
+	delete dropDownBox;
+	delete selectorBox;
+	
 	CoreServices::getInstance()->getCore()->getInput()->removeAllHandlersForListener(this);
 	CoreServices::getInstance()->getCore()->getInput()->removeAllHandlersForListener(this);
 }
 }
 
 

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

@@ -191,5 +191,6 @@ void UIScrollContainer::handleEvent(Event *event) {
 }
 }
 
 
 UIScrollContainer::~UIScrollContainer() {
 UIScrollContainer::~UIScrollContainer() {
-	
+	delete vScrollBar;
+	delete hScrollBar;
 }
 }

+ 9 - 1
Modules/Contents/UI/Source/PolyUITextInput.cpp

@@ -1363,7 +1363,15 @@ void UITextInput::Update() {
 }
 }
 
 
 UITextInput::~UITextInput() {
 UITextInput::~UITextInput() {
-
+	delete linesContainer;
+	delete inputRect;
+	delete lineNumberBg;
+	delete lineNumberAnchor;
+	delete selectorRectTop;
+	delete selectorRectMiddle;
+	delete selectorRectBottom;
+	delete blinkerRect;
+	delete blinkTimer;
 }
 }
 
 
 void UITextInput::readjustBuffer() {
 void UITextInput::readjustBuffer() {

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

@@ -249,14 +249,14 @@ void UITree::clearSelection(UITree *selectedNode) {
 
 
 void UITree::refreshTree() {
 void UITree::refreshTree() {
 	if(collapsed) {
 	if(collapsed) {
-		new Tween(&handleRotation, Tween::EASE_IN_QUAD, handleRotation, 0, 0.2f);
+		new Tween(&handleRotation, Tween::EASE_IN_QUAD, handleRotation, 0, 0.2f, false, true);
 		for(int i=0; i < treeChildren.size(); i++) {
 		for(int i=0; i < treeChildren.size(); i++) {
 			treeChildren[i]->visible = false;
 			treeChildren[i]->visible = false;
 			treeChildren[i]->enabled = false;			
 			treeChildren[i]->enabled = false;			
 		}
 		}
 		treeHeight = 0;
 		treeHeight = 0;
 	} else {
 	} else {
-		new Tween(&handleRotation, Tween::EASE_IN_QUAD, handleRotation, 90, 0.2f);
+		new Tween(&handleRotation, Tween::EASE_IN_QUAD, handleRotation, 90, 0.2f, false, true);
 		int offset = cellHeight;
 		int offset = cellHeight;
 		for(int i=0; i < treeChildren.size(); i++) {
 		for(int i=0; i < treeChildren.size(); i++) {
 			treeChildren[i]->visible = true;
 			treeChildren[i]->visible = true;
@@ -286,6 +286,12 @@ void UITree::toggleCollapsed() {
 
 
 UITree::~UITree() {
 UITree::~UITree() {
 	clearTree();
 	clearTree();
+	
+	delete textLabel;
+	delete bgBox;
+	delete selection;
+	delete arrowIconImage;
+	delete iconImage;
 }
 }
 
 
 void UITree::clearTree() {
 void UITree::clearTree() {

+ 4 - 1
Modules/Contents/UI/Source/PolyUITreeContainer.cpp

@@ -91,5 +91,8 @@ UITree *UITreeContainer::getRootNode() {
 }
 }
 
 
 UITreeContainer::~UITreeContainer() {
 UITreeContainer::~UITreeContainer() {
-	
+	delete bgBox;
+	delete scrollChild;
+	delete rootNode;
+	delete mainContainer;
 }
 }

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

@@ -205,5 +205,6 @@ void UIVScrollBar::handleEvent(Event *event) {
 	
 	
 
 
 UIVScrollBar::~UIVScrollBar() {
 UIVScrollBar::~UIVScrollBar() {
-	
+	delete bgBox;
+	delete handleBox;
 }
 }

+ 8 - 1
Modules/Contents/UI/Source/PolyUIVSizer.cpp

@@ -74,7 +74,14 @@ UIVSizer::UIVSizer(Number width, Number height, Number mainHeight, bool topSizer
 }
 }
 
 
 UIVSizer::~UIVSizer() {
 UIVSizer::~UIVSizer() {
-
+	coreInput->removeAllHandlersForListener(this);
+	
+	if (ownsChildren)
+		childElements->ownsChildren = true;
+	delete childElements;
+	
+	delete separatorBgShape;
+	delete separatorHitShape;
 }
 }
 
 
 void UIVSizer::handleEvent(Event *event) {
 void UIVSizer::handleEvent(Event *event) {

+ 26 - 17
Modules/Contents/UI/Source/PolyUIWindow.cpp

@@ -30,8 +30,7 @@
 using namespace Polycode;
 using namespace Polycode;
 
 
 
 
-UIWindow::UIWindow(String windowName, Number width, Number height) : ScreenEntity() {
-	
+UIWindow::UIWindow(String windowName, Number width, Number height) : ScreenEntity(), windowTween(NULL) {
 	closeOnEscape = false;
 	closeOnEscape = false;
 	
 	
 	snapToPixels = true;
 	snapToPixels = true;
@@ -112,11 +111,14 @@ void UIWindow::setWindowSize(Number w, Number h) {
 }
 }
 
 
 UIWindow::~UIWindow() {
 UIWindow::~UIWindow() {
-
+	delete windowTween;
+	delete windowRect;
+	delete titlebarRect;
+	delete titleLabel;
+	delete closeBtn;
 }
 }
 
 
 void UIWindow::onKeyDown(PolyKEY key, wchar_t charCode) {
 void UIWindow::onKeyDown(PolyKEY key, wchar_t charCode) {
-	
 	if(key == KEY_TAB) {
 	if(key == KEY_TAB) {
 		if(hasFocus) {
 		if(hasFocus) {
 			focusNextChild();
 			focusNextChild();
@@ -152,20 +154,24 @@ void UIWindow::onMouseDown(Number x, Number y) {
 }
 }
 
 
 void UIWindow::showWindow() {
 void UIWindow::showWindow() {
-//	if(!visible) {
-		enabled = true;
-		visible = true;
-		windowTween = new Tween(&color.a, Tween::EASE_IN_QUAD, 0.0f, 1.0f, 0.01f);
-//	}
+	if (windowTween)
+		delete windowTween;
+
+	enabled = true;
+	visible = true;
+	tweenClosing = false;
+	windowTween = new Tween(&color.a, Tween::EASE_IN_QUAD, 0.0f, 1.0f, 0.01f, false, true);
+	windowTween->addEventListener(this, Event::COMPLETE_EVENT);
 }
 }
 
 
 void UIWindow::hideWindow() {
 void UIWindow::hideWindow() {
-//	if(visible) {
-		windowTween = new Tween(&color.a, Tween::EASE_IN_QUAD, 1.0f, 0.0f, 0.01f);
-		windowTween->addEventListener(this, Event::COMPLETE_EVENT);
-//	}
-}
+	if (windowTween)
+		delete windowTween;
 
 
+	tweenClosing = true;
+	windowTween = new Tween(&color.a, Tween::EASE_IN_QUAD, 1.0f, 0.0f, 0.01f, false, true);
+	windowTween->addEventListener(this, Event::COMPLETE_EVENT);
+}
 
 
 void UIWindow::handleEvent(Event *event) {
 void UIWindow::handleEvent(Event *event) {
 	if(event->getDispatcher() == titlebarRect) {
 	if(event->getDispatcher() == titlebarRect) {
@@ -185,8 +191,11 @@ void UIWindow::handleEvent(Event *event) {
 		dispatchEvent(new UIEvent(), UIEvent::CLOSE_EVENT);
 		dispatchEvent(new UIEvent(), UIEvent::CLOSE_EVENT);
 	}
 	}
 	if(event->getDispatcher() == windowTween) {
 	if(event->getDispatcher() == windowTween) {
-		visible = false;
-		enabled = false;		
-		windowTween->removeEventListener(this, Event::COMPLETE_EVENT);
+		if (tweenClosing) {
+			visible = false;
+			enabled = false;
+		}
+		
+		windowTween = NULL;
 	}
 	}
 }
 }