Selaa lähdekoodia

UI Module classes will not delete children if ownsChildren is set to true, added setOwnsChildrenRecursive method to Entity, cleanup when closing screen editor, font editor and image editors in the IDE, fixed some memory leaks

Ivan Safrin 12 vuotta sitten
vanhempi
sitoutus
5e02a65ab5

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

@@ -205,7 +205,9 @@ namespace Polycode {
 			* If set to true, will automatically delete children upon destruction. (defaults to false).
 			* If set to true, will automatically delete children upon destruction. (defaults to false).
 			*/ 
 			*/ 
 			bool ownsChildren;										
 			bool ownsChildren;										
+			
 				
 				
+			void setOwnsChildrenRecursive(bool val);
 			//@}
 			//@}
 			// ----------------------------------------------------------------------------------------------------------------
 			// ----------------------------------------------------------------------------------------------------------------
 				
 				

+ 7 - 0
Core/Contents/Source/PolyEntity.cpp

@@ -125,6 +125,13 @@ void Entity::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) {
 	}
 	}
 }
 }
 
 
+void Entity::setOwnsChildrenRecursive(bool val) {
+	ownsChildren = val;
+	for(int i=0; i < children.size(); i++) {
+		children[i]->setOwnsChildrenRecursive(val);
+	}
+}
+
 std::vector<Entity*> Entity::getEntitiesByTag(String tag, bool recursive) {
 std::vector<Entity*> Entity::getEntitiesByTag(String tag, bool recursive) {
 
 
 	std::vector<Entity*> retVector;
 	std::vector<Entity*> retVector;

+ 0 - 1
Core/Contents/Source/PolySound.cpp

@@ -127,7 +127,6 @@ Number Sound::getPitch() {
 }
 }
 
 
 Sound::~Sound() {
 Sound::~Sound() {
-	Logger::log("destroying sound...\n");
 	alDeleteSources(1,&soundSource);
 	alDeleteSources(1,&soundSource);
 	checkALError("destroying sound");
 	checkALError("destroying sound");
 	alDeleteBuffers(1, &buffer);
 	alDeleteBuffers(1, &buffer);

+ 0 - 5
IDE/Contents/Include/PolycodeScreenEditor.h

@@ -245,9 +245,6 @@ class PolycodeScreenEditorMain : public UIElement {
 		ScreenShape *placingShape;	
 		ScreenShape *placingShape;	
 		Vector2 placingAnchor;
 		Vector2 placingAnchor;
 		
 		
-		UIColorBox *entityColorBox;
-		UIWindow *entityInfoWindow;
-		
 		ScreenShape *screenPreviewShape;
 		ScreenShape *screenPreviewShape;
 		
 		
 		Vector2 dragOffset;
 		Vector2 dragOffset;
@@ -283,8 +280,6 @@ class PolycodeScreenEditorMain : public UIElement {
 		ScreenEntity *toolPalette;
 		ScreenEntity *toolPalette;
 		ScreenShape *toolPaletteBg;
 		ScreenShape *toolPaletteBg;
 		
 		
-		UIButton *resetZoom;
-		
 		UIImageButton *arrowToolButton;
 		UIImageButton *arrowToolButton;
 		UIImageButton *shapeToolButton;
 		UIImageButton *shapeToolButton;
 		UIImageButton *zoomToolButton;
 		UIImageButton *zoomToolButton;

+ 8 - 1
IDE/Contents/Source/PolycodeFontEditor.cpp

@@ -27,7 +27,14 @@ PolycodeFontEditor::PolycodeFontEditor() : PolycodeEditor(true){
 }
 }
 
 
 PolycodeFontEditor::~PolycodeFontEditor() {
 PolycodeFontEditor::~PolycodeFontEditor() {
-	
+	delete grid;
+	delete bg;
+	delete anchor;
+	delete editorLabel;
+	delete editorLabel2;
+	delete editorLabel3;
+	delete editorLabel4;
+	delete editorLabel5;				
 }
 }
 
 
 bool PolycodeFontEditor::openFile(OSFileEntry filePath) {
 bool PolycodeFontEditor::openFile(OSFileEntry filePath) {

+ 6 - 1
IDE/Contents/Source/PolycodeImageEditor.cpp

@@ -27,7 +27,12 @@ PolycodeImageEditor::PolycodeImageEditor() : PolycodeEditor(true){
 }
 }
 
 
 PolycodeImageEditor::~PolycodeImageEditor() {
 PolycodeImageEditor::~PolycodeImageEditor() {
-	
+	delete grid;
+	delete editorImage;
+	delete leftShape;
+	delete rightShape;
+	delete topShape;
+	delete bottomShape;
 }
 }
 
 
 bool PolycodeImageEditor::openFile(OSFileEntry filePath) {
 bool PolycodeImageEditor::openFile(OSFileEntry filePath) {

+ 7 - 28
IDE/Contents/Source/PolycodeScreenEditor.cpp

@@ -416,21 +416,6 @@ PolycodeScreenEditorMain::PolycodeScreenEditorMain() {
 	
 	
 	CoreServices::getInstance()->getRenderer()->setTextureFilteringMode(Renderer::TEX_FILTERING_NEAREST);
 	CoreServices::getInstance()->getRenderer()->setTextureFilteringMode(Renderer::TEX_FILTERING_NEAREST);
 	
 	
-	entityInfoWindow = new UIWindow("Selected entity", 140, 100);
-	addChild(entityInfoWindow);	
-	entityInfoWindow->setPosition(15,15);
-	entityInfoWindow->enabled = false;
-	
-	ScreenLabel *label2 = new ScreenLabel(L"Entity color:", fontSize, fontName, Label::ANTIALIAS_FULL);
-	entityInfoWindow->addChild(label2);
-	label2->setPosition(padding, entityInfoWindow->topPadding+20);
-/*
-	entityColorBox = new UIColorBox(Color(1.0, 1.0, 1.0, 0.0), 30,30);
-	entityColorBox->setPosition(label2->getPosition().x, label2->getPosition().y+label2->getHeight());
-	entityInfoWindow->addChild(entityColorBox);		
-	entityColorBox->addEventListener(this, UIEvent::CHANGE_EVENT);
-	*/
-
 	viewOptions = new ScreenEntity();
 	viewOptions = new ScreenEntity();
 	addChild(viewOptions);
 	addChild(viewOptions);
 	viewOptions->processInputEvents = true;
 	viewOptions->processInputEvents = true;
@@ -778,6 +763,8 @@ void PolycodeScreenEditorMain::setGrid(int gridSize) {
 
 
 PolycodeScreenEditorMain::~PolycodeScreenEditorMain() {
 PolycodeScreenEditorMain::~PolycodeScreenEditorMain() {
 
 
+	CoreServices::getInstance()->getCore()->getInput()->removeAllHandlersForListener(this);
+	setOwnsChildrenRecursive(true);
 }
 }
 
 
 
 
@@ -1884,18 +1871,7 @@ void PolycodeScreenEditorMain::handleEvent(Event *event) {
 			setMode(MODE_ENTITY);
 			setMode(MODE_ENTITY);
 		}
 		}
 	}
 	}
-	
-	if(event->getDispatcher() == entityColorBox  && event->getEventType() == "UIEvent") {
-		switch (event->getEventCode()) {
-			case UIEvent::CHANGE_EVENT:
-				if(selectedEntity) {
-					selectedEntity->setColor(entityColorBox->getSelectedColor());
-				}
-			break;
-		}
-		return;
-	}
-	
+		
 	if(currentLayer) {
 	if(currentLayer) {
 		for(int i=0; i < currentLayer->getNumChildren(); i++) {
 		for(int i=0; i < currentLayer->getNumChildren(); i++) {
 			ScreenEntity* childEntity = (ScreenEntity*) currentLayer->getChildAtIndex(i);
 			ScreenEntity* childEntity = (ScreenEntity*) currentLayer->getChildAtIndex(i);
@@ -2454,7 +2430,10 @@ void PolycodeScreenEditor::handleEvent(Event *event) {
 }
 }
 
 
 PolycodeScreenEditor::~PolycodeScreenEditor() {
 PolycodeScreenEditor::~PolycodeScreenEditor() {
-	
+	delete mainSizer;
+	delete propSizer;
+	delete treeView;
+	delete editorMain;
 }
 }
 
 
 void PolycodeScreenEditorMain::applyEditorProperties(ScreenEntity *entity) {
 void PolycodeScreenEditorMain::applyEditorProperties(ScreenEntity *entity) {

+ 14 - 11
Modules/Contents/UI/Source/PolyUIBox.cpp

@@ -85,7 +85,9 @@ UIBox::UIBox(String imageFile, Number t, Number r, Number b, Number l, Number bo
 	this->t = t;
 	this->t = t;
 	this->r = r;
 	this->r = r;
 	this->b = b;
 	this->b = b;
-	this->l = l;	
+	this->l = l;
+	
+	ownsChildren = true;	
 }
 }
 
 
 void UIBox::resizeBox(Number newWidth, Number newHeight) {
 void UIBox::resizeBox(Number newWidth, Number newHeight) {
@@ -111,14 +113,15 @@ void UIBox::resizeBox(Number newWidth, Number newHeight) {
 }
 }
 
 
 UIBox::~UIBox() {
 UIBox::~UIBox() {
-	delete tlImage;
-	delete trImage;		
-	delete blImage;		
-	delete brImage;					
-	delete centerImage;		
-	delete tImage;
-	delete rImage;
-	delete bImage;
-	delete lImage;		
-
+	if(!ownsChildren) {
+		delete tlImage;
+		delete trImage;		
+		delete blImage;		
+		delete brImage;					
+		delete centerImage;		
+		delete tImage;
+		delete rImage;
+		delete bImage;
+		delete lImage;		
+	}
 }
 }

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

@@ -97,9 +97,11 @@ void UIButton::Update() {
 
 
 UIButton::~UIButton() {
 UIButton::~UIButton() {
 	coreInput->removeAllHandlersForListener(this);
 	coreInput->removeAllHandlersForListener(this);
-	delete buttonRect;
-	delete buttonFocusedRect;
-	delete buttonLabel;
+	if(!ownsChildren) {
+		delete buttonRect;
+		delete buttonFocusedRect;
+		delete buttonLabel;
+	}
 }
 }
 		
 		
 void UIButton::handleEvent(Event *event) {
 void UIButton::handleEvent(Event *event) {

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

@@ -74,9 +74,11 @@ String UICheckBox::getCaptionLabel() {
 }
 }
 
 
 UICheckBox::~UICheckBox() {
 UICheckBox::~UICheckBox() {
-	delete buttonImageChecked;
-	delete buttonImageUnchecked;
-	delete captionLabel;
+	if(!ownsChildren) {
+		delete buttonImageChecked;
+		delete buttonImageUnchecked;
+		delete captionLabel;
+	}
 }
 }
 
 
 bool UICheckBox::isChecked() {
 bool UICheckBox::isChecked() {

+ 5 - 3
Modules/Contents/UI/Source/PolyUIColorBox.cpp

@@ -456,9 +456,11 @@ Color UIColorBox::getSelectedColor() {
 UIColorBox::~UIColorBox() {
 UIColorBox::~UIColorBox() {
 	colorPicker->removeAllHandlersForListener(this);
 	colorPicker->removeAllHandlersForListener(this);
 	
 	
-	delete bgImage;
-	delete colorShape;
-	delete frameImage;
+	if(!ownsChildren) {
+		delete bgImage;
+		delete colorShape;
+		delete frameImage;
+	}
 }
 }
 
 
 void UIColorBox::setBoxColor(Color newColor) {
 void UIColorBox::setBoxColor(Color newColor) {

+ 5 - 3
Modules/Contents/UI/Source/PolyUIComboBox.cpp

@@ -104,9 +104,11 @@ UIComboBox::~UIComboBox() {
 	for(int c = 0; c < items.size(); c++)
 	for(int c = 0; c < items.size(); c++)
 		delete items[c];
 		delete items[c];
 	
 	
-	delete dropDownImage;
-	delete bgBox;
-	delete selectedLabel;
+	if(!ownsChildren) {
+		delete dropDownImage;
+		delete bgBox;
+		delete selectedLabel;
+	}
 }
 }
 
 
 void UIComboBox::clearItems() {
 void UIComboBox::clearItems() {

+ 15 - 11
Modules/Contents/UI/Source/PolyUIFileDialog.cpp

@@ -301,14 +301,16 @@ void UIFileDialog::handleEvent(Event *event) {
 }
 }
 
 
 UIFileDialog::~UIFileDialog() {
 UIFileDialog::~UIFileDialog() {
-	delete okButton;
-	delete cancelButton;
-	delete newFolderButton;
-	delete scrollContainer;
-	delete createFolderWindow;
-	delete entryHolder;
-	for(int i=0; i < sideBarEntries.size(); i++) {
-		delete sideBarEntries[i];
+	if(!ownsChildren) {
+		delete okButton;
+		delete cancelButton;
+		delete newFolderButton;
+		delete scrollContainer;
+		delete createFolderWindow;
+		delete entryHolder;
+		for(int i=0; i < sideBarEntries.size(); i++) {
+			delete sideBarEntries[i];
+		}
 	}
 	}
 }
 }
 
 
@@ -330,7 +332,9 @@ CreateFolderWindow::CreateFolderWindow() : UIWindow("New folder name", 290, 80)
 }
 }
 
 
 CreateFolderWindow::~CreateFolderWindow() {
 CreateFolderWindow::~CreateFolderWindow() {
-	delete cancelButton;
-	delete okButton;
-	delete nameInput;
+	if(!ownsChildren) {
+		delete cancelButton;
+		delete okButton;
+		delete nameInput;
+	}
 }
 }

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

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

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

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

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

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

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

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

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

@@ -180,11 +180,15 @@ void UIMenu::handleEvent(Event *event) {
 
 
 
 
 UIMenu::~UIMenu() {
 UIMenu::~UIMenu() {
+	CoreServices::getInstance()->getCore()->getInput()->removeAllHandlersForListener(this);
+	
 	for(int c = 0; c < items.size(); c++)
 	for(int c = 0; c < items.size(); c++)
 		delete items[c];
 		delete items[c];
 	
 	
-	delete dropDownBox;
-	delete selectorBox;
+	if(!ownsChildren) {
+		delete dropDownBox;
+		delete selectorBox;
+	}
 	
 	
 	CoreServices::getInstance()->getCore()->getInput()->removeAllHandlersForListener(this);
 	CoreServices::getInstance()->getCore()->getInput()->removeAllHandlersForListener(this);
 }
 }

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

@@ -172,7 +172,9 @@ void UIMenuBar::handleEvent(Event *event) {
 }
 }
 
 
 UIMenuBar::~UIMenuBar() {
 UIMenuBar::~UIMenuBar() {
-	delete bgShape;
+	if(!ownsChildren) {
+		delete bgShape;
+	}
 }
 }
 
 
 void UIMenuBar::Resize(Number width, Number height) {
 void UIMenuBar::Resize(Number width, Number height) {

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

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

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

@@ -77,7 +77,7 @@ UITextInput::UITextInput(bool multiLine, Number width, Number height) : UIElemen
 	
 	
 	linesContainer = new ScreenEntity();	
 	linesContainer = new ScreenEntity();	
 	linesContainer->processInputEvents = true;
 	linesContainer->processInputEvents = true;
-	
+	linesContainer->ownsChildren = true;
 	lineSpacing = conf->getNumericValue("Polycode", "textEditLineSpacing");
 	lineSpacing = conf->getNumericValue("Polycode", "textEditLineSpacing");
 	
 	
 	st = conf->getNumericValue("Polycode", "textBgSkinT");
 	st = conf->getNumericValue("Polycode", "textBgSkinT");
@@ -1355,15 +1355,14 @@ void UITextInput::Update() {
 
 
 UITextInput::~UITextInput() {
 UITextInput::~UITextInput() {
 	core->removeAllHandlersForListener(this);
 	core->removeAllHandlersForListener(this);
-	delete linesContainer;
-	delete inputRect;
-	delete lineNumberBg;
-	delete lineNumberAnchor;
-	delete selectorRectTop;
-	delete selectorRectMiddle;
-	delete selectorRectBottom;
-	delete blinkerRect;
 	delete blinkTimer;
 	delete blinkTimer;
+
+	linesContainer->ownsChildren = true;
+	if(!ownsChildren) {
+		delete linesContainer;
+		delete inputRect;
+		delete lineNumberBg;
+	}
 }
 }
 
 
 void UITextInput::readjustBuffer() {
 void UITextInput::readjustBuffer() {

+ 7 - 5
Modules/Contents/UI/Source/PolyUITree.cpp

@@ -286,11 +286,13 @@ void UITree::toggleCollapsed() {
 UITree::~UITree() {
 UITree::~UITree() {
 	clearTree();
 	clearTree();
 	
 	
-	delete textLabel;
-	delete bgBox;
-	delete selection;
-	delete arrowIconImage;
-	delete iconImage;
+	if(!ownsChildren) {
+		delete textLabel;
+		delete bgBox;
+		delete selection;
+		delete arrowIconImage;
+		delete iconImage;
+	}
 }
 }
 
 
 void UITree::clearTree() {
 void UITree::clearTree() {

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

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

+ 6 - 4
Modules/Contents/UI/Source/PolyUIVSizer.cpp

@@ -78,10 +78,12 @@ UIVSizer::~UIVSizer() {
 	
 	
 	if (ownsChildren)
 	if (ownsChildren)
 		childElements->ownsChildren = true;
 		childElements->ownsChildren = true;
-	delete childElements;
-	
-	delete separatorBgShape;
-	delete separatorHitShape;
+		
+	if(!ownsChildren) {
+		delete childElements;	
+		delete separatorBgShape;
+		delete separatorHitShape;
+	}
 }
 }
 
 
 void UIVSizer::handleEvent(Event *event) {
 void UIVSizer::handleEvent(Event *event) {

+ 7 - 5
Modules/Contents/UI/Source/PolyUIWindow.cpp

@@ -111,11 +111,13 @@ void UIWindow::setWindowSize(Number w, Number h) {
 }
 }
 
 
 UIWindow::~UIWindow() {
 UIWindow::~UIWindow() {
-	delete windowTween;
-	delete windowRect;
-	delete titlebarRect;
-	delete titleLabel;
-	delete closeBtn;
+	if(!ownsChildren) {
+		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) {