Browse Source

Sprite remove and rename, sprite state remove and rename

Ivan Safrin 11 years ago
parent
commit
dc9b0be826

File diff suppressed because it is too large
+ 3 - 3
IDE/Assets/ide_icons.ai


+ 10 - 0
IDE/Contents/Include/PolycodeSpriteEditor.h

@@ -87,11 +87,13 @@ class SpriteState {
 class Sprite {
     public:
         Sprite(String name);
+        ~Sprite();
     
         String getName();
         void setName(String name);
     
         void addSpriteState(SpriteState *state);
+        void removeSpriteState(SpriteState *state);
     
         unsigned int getNumStates();
         SpriteState *getState(unsigned int index);
@@ -113,6 +115,8 @@ class SpriteSet {
         void addSpriteEntry(Sprite *newEntry);
         unsigned int getNumSpriteEntries() const;
         Sprite *getSpriteEntry(unsigned int index) const;
+        void removeSprite(Sprite *sprite);
+    
     
         // frame manipulation
         void addSpriteFrame(const SpriteFrame &frame);
@@ -323,6 +327,9 @@ class SpriteBrowser : public UIElement {
         UITreeContainer *spriteTreeView;
         UIImageButton *newSpriteButton;
         UIImageButton *removeSpriteButton;
+        UIImageButton *moreButton;
+    
+        UIMenu *spriteMoreMenu;
 };
 
 
@@ -390,6 +397,7 @@ class SpriteStateBrowser : public UIElement {
     
         UIImageButton *newStateButton;
         UIImageButton *removeStateButton;
+        UIImageButton *moreButton;
     
 };
 
@@ -456,6 +464,8 @@ class SpriteStateEditor : public UIElement {
         SpriteSet *spriteSet;
         SpriteState *selectedState;
     
+        UIMenu *stateMoreMenu;
+    
         SpriteStateBrowser *stateBrowser;
     
         Sprite *spriteSetEntry;

BIN
IDE/Contents/Resources/ImagesRetina/spriteEditor/button_more.png


+ 0 - 8
IDE/Contents/Source/PolycodeIDEApp.cpp

@@ -916,7 +916,6 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 						editor->saveFile();
 						closeFile();
 					}
-					frame->yesNoCancelPopup->action = "";
 					frame->hideModal();					
 				}
 				break;
@@ -927,7 +926,6 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 						editor->setHasChanges(false);
 						closeFile();
 					}
-					frame->yesNoCancelPopup->action = "";					
 					frame->hideModal();
 				}
 				break;
@@ -948,7 +946,6 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 							editorManager->setCurrentEditor(NULL);
 						}						
 					}
-					frame->yesNoCancelPopup->action = "";
 					frame->hideModal();
 					if(quitApp()) {
 						core->Shutdown();
@@ -967,7 +964,6 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 							editorManager->setCurrentEditor(NULL);
 						}						
 					}
-					frame->yesNoCancelPopup->action = "";					
 					frame->hideModal();
 					if(quitApp()) {
 						core->Shutdown();
@@ -990,7 +986,6 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 				case UIEvent::CANCEL_EVENT:
 					break;
 			}
-			frame->yesNoCancelPopup->action = "";
 			frame->hideModal();
 		}
 		
@@ -1006,7 +1001,6 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 				case UIEvent::CANCEL_EVENT:
 					break;
 			}
-			frame->yesNoCancelPopup->action = "";
 			frame->hideModal();
 		}
 	} else if(event->getDispatcher() == frame->yesNoPopup) {
@@ -1016,7 +1010,6 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 			}
 			
 			frame->hideModal();
-			frame->yesNoPopup->action = "";		
 		}
 	
 		if(event->getEventType() == "UIEvent" && event->getEventCode() == UIEvent::OK_EVENT) {
@@ -1030,7 +1023,6 @@ void PolycodeIDEApp::handleEvent(Event *event) {
 			}
 			
 			frame->hideModal();
-			frame->yesNoPopup->action = "";
 		}
 	}
 	

+ 189 - 26
IDE/Contents/Source/PolycodeSpriteEditor.cpp

@@ -63,6 +63,11 @@ void SceneSpriteRewrite::setSprite(Sprite *spriteEntry) {
 
 void SceneSpriteRewrite::setSpriteState(SpriteState *spriteState) {
     currentSpriteState = spriteState;
+    
+    if(!currentSpriteState) {
+        return;
+    }
+    
     Vector2 bBox = spriteState->getBoundingBox();
     setLocalBoundingBox(bBox.x / spriteState->getPixelsPerUnit(), bBox.y / spriteState->getPixelsPerUnit(), 0.001);
 }
@@ -124,7 +129,7 @@ SpriteState::SpriteState(SpriteSet *spriteSet, String name) {
 
 void SpriteState::setBoundingBox(Vector2 boundingBox) {
     this->boundingBox = boundingBox;
-    rebuildStateMeshes();    
+    rebuildStateMeshes();
 }
 
 Vector2 SpriteState::getBoundingBox() {
@@ -295,6 +300,21 @@ Sprite::Sprite(String name) {
     this->name = name;
 }
 
+void Sprite::removeSpriteState(SpriteState *state) {
+    for(int i=0; i < states.size(); i++) {
+        if(states[i] == state) {
+            states.erase(states.begin() + i);
+            return;
+        }
+    }
+}
+
+Sprite::~Sprite() {
+    for(int i=0; i < states.size(); i++) {
+        delete states[i];
+    }
+}
+
 String Sprite::getName() {
     return name;
 }
@@ -318,6 +338,15 @@ void SpriteSet::removeFrameByID(unsigned int frameID) {
     }
 }
 
+void SpriteSet::removeSprite(Sprite *sprite) {
+    for(int i=0; i < sprites.size(); i++) {
+        if(sprites[i] == sprite) {
+            sprites.erase(sprites.begin()+i);
+            return;
+        }
+    }
+}
+
 Texture *SpriteSet::loadTexture(String imageFileName) {
     Texture *spriteTexture = Services()->getMaterialManager()->createTextureFromFile(imageFileName, true, Services()->getMaterialManager()->mipmapsDefault);
     setTexture(spriteTexture);
@@ -1238,6 +1267,10 @@ SpriteBrowser::SpriteBrowser(SpriteSet *spriteSet) : UIElement () {
     removeSpriteButton = new UIImageButton("spriteEditor/button_remove.png", 1.0, 24, 24);
     addChild(removeSpriteButton);
     removeSpriteButton->addEventListener(this, UIEvent::CLICK_EVENT);
+
+    moreButton = new UIImageButton("spriteEditor/button_more.png", 1.0, 24, 24);
+    addChild(moreButton);
+    moreButton->addEventListener(this, UIEvent::CLICK_EVENT);
     
     
     spriteTreeView = new UITreeContainer("boxIcon.png", "All Sprites", 10, 10);
@@ -1247,14 +1280,66 @@ SpriteBrowser::SpriteBrowser(SpriteSet *spriteSet) : UIElement () {
     spriteTreeView->getRootNode()->toggleCollapsed();
     
     spriteTreeView->getRootNode()->addEventListener(this, UITreeEvent::SELECTED_EVENT);
+    
+	globalFrame->textInputPopup->addEventListener(this, UIEvent::OK_EVENT);
+	globalFrame->yesNoPopup->addEventListener(this, UIEvent::OK_EVENT);
 }
 
 void SpriteBrowser::handleEvent(Event *event) {
     if(event->getDispatcher() == newSpriteButton) {
-        Sprite *newEntry = new Sprite("New Sprite");
-        spriteSet->addSpriteEntry(newEntry);
-        refreshSprites();
-    } else if(event->getDispatcher() ==   spriteTreeView->getRootNode()) {
+		globalFrame->textInputPopup->action = "newSprite";
+		globalFrame->textInputPopup->setCaption("New sprite name");
+		globalFrame->textInputPopup->setValue("New Sprite");
+		globalFrame->showModal(globalFrame->textInputPopup);
+    } else if(event->getDispatcher() == globalFrame->textInputPopup) {
+        if(event->getEventCode() == UIEvent::OK_EVENT) {
+            if(globalFrame->textInputPopup->action == "newSprite") {
+                Sprite *newEntry = new Sprite(globalFrame->textInputPopup->getValue());
+                
+                SpriteState *defaultState = new SpriteState(spriteSet, "default");
+                newEntry->addSpriteState(defaultState);
+                
+                spriteSet->addSpriteEntry(newEntry);
+                selectedEntry = newEntry;
+                refreshSprites();
+            } else if(globalFrame->textInputPopup->action == "renameSprite") {
+                selectedEntry->setName(globalFrame->textInputPopup->getValue());
+                refreshSprites();
+            }
+        }
+    } else if(event->getDispatcher() == globalFrame->yesNoPopup) {
+        if(event->getEventCode() == UIEvent::OK_EVENT) {
+            if(globalFrame->yesNoPopup->action == "removeSprite") {
+                if(selectedEntry) {
+                    spriteSet->removeSprite(selectedEntry);
+                    selectedEntry = NULL;
+                    refreshSprites();
+                    dispatchEvent(new Event(), Event::CHANGE_EVENT);
+                }
+            }
+        }
+    } else if(event->getDispatcher() == removeSpriteButton) {
+        if(selectedEntry) {
+            globalFrame->yesNoPopup->setCaption("Are you sure you want to remove sprite \""+selectedEntry->getName()+"\"?");
+            globalFrame->yesNoPopup->action = "removeSprite";
+            globalFrame->showModal(globalFrame->yesNoPopup);
+
+        }
+    } else if(event->getDispatcher() == moreButton) {
+        spriteMoreMenu = globalMenu->showMenuAtMouse(100.0);
+        spriteMoreMenu->addOption("Rename", "rename");
+        spriteMoreMenu->fitToScreenVertical();
+        spriteMoreMenu->addEventListener(this, UIEvent::OK_EVENT);
+    } else if(event->getDispatcher() == spriteMoreMenu) {
+        if(selectedEntry) {
+            if(spriteMoreMenu->getSelectedItem()->getMenuItemID() == "rename") {
+                globalFrame->textInputPopup->action = "renameSprite";
+                globalFrame->textInputPopup->setCaption("New sprite name");
+                globalFrame->textInputPopup->setValue(selectedEntry->getName());
+                globalFrame->showModal(globalFrame->textInputPopup);
+            }
+        }
+    } else if(event->getDispatcher() == spriteTreeView->getRootNode()) {
         selectedEntry = (Sprite*) spriteTreeView->getRootNode()->getSelectedNode()->getUserData();
         if(selectedEntry) {
             dispatchEvent(new Event(), Event::CHANGE_EVENT);
@@ -1270,7 +1355,10 @@ void SpriteBrowser::refreshSprites() {
     spriteTreeView->getRootNode()->clearTree();
     for(int i=0; i < spriteSet->getNumSpriteEntries(); i++) {
         Sprite *spriteEntry = spriteSet->getSpriteEntry(i);
-        spriteTreeView->getRootNode()->addTreeChild("treeIcons/sprite.png", spriteEntry->getName(), (void*)spriteEntry);
+        UITree *treeNode = spriteTreeView->getRootNode()->addTreeChild("treeIcons/sprite.png", spriteEntry->getName(), (void*)spriteEntry);
+        if(spriteEntry == selectedEntry) {
+            treeNode->setSelected();
+        }
     }
 }
 
@@ -1280,9 +1368,10 @@ SpriteBrowser::~SpriteBrowser() {
 
 void SpriteBrowser::Resize(Number width, Number height) {
     headerBg->Resize(width, 30.0);
-    
-    removeSpriteButton->setPosition(width - 30.0, 3.0);
-    newSpriteButton->setPosition(width - 56.0, 3.0);
+
+    moreButton->setPosition(width - 30.0, 3.0);
+    removeSpriteButton->setPosition(width - 56.0, 3.0);
+    newSpriteButton->setPosition(width - 82.0, 3.0);
     
     spriteTreeView->Resize(width, height-30);
 }
@@ -1413,11 +1502,16 @@ void SpriteStateEditorDetails::Update() {
 }
 
 void SpriteStateEditorDetails::setSpriteState(SpriteState *state) {
+    if(!state) {
+        visible = false;
+        enabled = false;
+        editBar->setSpriteState(state);
+        return;
+    }
     visible = true;
     enabled = true;
     spriteState = state;
     editBar->setSpriteState(state);
-    
     refreshState();
 }
 
@@ -1480,8 +1574,10 @@ void SpriteStateEditBar::clearBar() {
 
 void SpriteStateEditBar::setSpriteState(SpriteState *state) {
     spriteState = state;
-    state->rebuildStateMeshes();
-    refreshBar();
+    if(state) {
+        state->rebuildStateMeshes();
+        refreshBar();
+    }
     
 }
 
@@ -2010,6 +2106,9 @@ SpriteStateBrowser::SpriteStateBrowser() : UIElement() {
     addChild(removeStateButton);
     removeStateButton->addEventListener(this, UIEvent::CLICK_EVENT);
     
+    moreButton = new UIImageButton("spriteEditor/button_more.png", 1.0, 24, 24);
+    addChild(moreButton);
+    moreButton->addEventListener(this, UIEvent::CLICK_EVENT);
     
 }
 
@@ -2020,9 +2119,10 @@ SpriteStateBrowser::~SpriteStateBrowser() {
 void SpriteStateBrowser::Resize(Number width, Number height) {
     headerBg->Resize(width, 30.0);
     stateTreeView->Resize(width, height-30.0);
-    
-    removeStateButton->setPosition(width - 30.0, 3.0);
-    newStateButton->setPosition(width - 56.0, 3.0);
+
+    moreButton->setPosition(width - 30.0, 3.0);
+    removeStateButton->setPosition(width - 56.0, 3.0);
+    newStateButton->setPosition(width - 82.0, 3.0);
 }
 
 SpriteStateEditor::SpriteStateEditor(SpriteSet *spriteSet) : UIElement() {
@@ -2040,9 +2140,15 @@ SpriteStateEditor::SpriteStateEditor(SpriteSet *spriteSet) : UIElement() {
     newStateButton = stateBrowser->newStateButton;
     newStateButton->addEventListener(this, UIEvent::CLICK_EVENT);
     
+    stateBrowser->removeStateButton->addEventListener(this, UIEvent::CLICK_EVENT);
+    stateBrowser->moreButton->addEventListener(this, UIEvent::CLICK_EVENT);
+    
     stateTreeView = stateBrowser->stateTreeView;
     stateTreeView->getRootNode()->addEventListener(this, UITreeEvent::SELECTED_EVENT);
     
+	globalFrame->textInputPopup->addEventListener(this, UIEvent::OK_EVENT);
+	globalFrame->yesNoPopup->addEventListener(this, UIEvent::OK_EVENT);
+    
     selectedState = NULL;
     
     visible = false;
@@ -2059,25 +2165,78 @@ SpriteStateEditorDetails *SpriteStateEditor::getDetailsEditor() {
 
 void SpriteStateEditor::setSpriteEntry(Sprite *entry) {
     
+    if(!entry) {
+        visible = false;
+        enabled = false;
+        return;
+    }
+    
     visible = true;
     enabled = true;
 
     spriteSetEntry = entry;
+    
     refreshStates();
+    
+    if(entry->getNumStates() > 0) {
+        stateBrowser->stateTreeView->getRootNode()->getTreeChild(0)->setSelected();
+    }
+    
 }
 
 void SpriteStateEditor::handleEvent(Event *event) {
     if(event->getDispatcher() == newStateButton) {
         
-        String newStateName = "New State";
-        if(spriteSetEntry->getNumStates() == 0) {
-            newStateName = "default";
+        globalFrame->textInputPopup->action = "newState";
+		globalFrame->textInputPopup->setCaption("New state name");
+		globalFrame->textInputPopup->setValue("New State");
+        globalFrame->showModal(globalFrame->textInputPopup);
+        
+    } else if(event->getDispatcher() == globalFrame->textInputPopup) {
+        if(event->getEventCode() == UIEvent::OK_EVENT) {
+            if(globalFrame->textInputPopup->action == "newState") {
+                SpriteState *newState = new SpriteState(spriteSet, globalFrame->textInputPopup->getValue());
+                spriteSetEntry->addSpriteState(newState);
+                refreshStates();
+            } else if(globalFrame->textInputPopup->action == "renameState") {
+                selectedState->setName(globalFrame->textInputPopup->getValue());
+                refreshStates();
+            }
+        }
+    } else if(event->getDispatcher() == globalFrame->yesNoPopup) {
+        if(event->getEventCode() == UIEvent::OK_EVENT) {
+            if(globalFrame->yesNoPopup->action == "removeState") {
+                if(selectedState) {
+                    spriteSetEntry->removeSpriteState(selectedState);
+                    delete selectedState;
+                    selectedState = NULL;
+                    stateDetails->setSpriteState(NULL);
+                    refreshStates();
+                    dispatchEvent(new Event(), Event::CHANGE_EVENT);
+                }
+            }
+        }
+    } else if(event->getDispatcher() == stateBrowser->removeStateButton) {
+        if(selectedState) {
+            globalFrame->yesNoPopup->setCaption("Are you sure you want to remove state \""+selectedState->getName()+"\"?");
+            globalFrame->yesNoPopup->action = "removeState";
+            globalFrame->showModal(globalFrame->yesNoPopup);
+            
+        }
+    } else if(event->getDispatcher() == stateBrowser->moreButton) {
+        stateMoreMenu = globalMenu->showMenuAtMouse(100.0);
+        stateMoreMenu->addOption("Rename", "rename");
+        stateMoreMenu->fitToScreenVertical();
+        stateMoreMenu->addEventListener(this, UIEvent::OK_EVENT);
+    } else if(event->getDispatcher() == stateMoreMenu) {
+        if(selectedState) {
+            if(stateMoreMenu->getSelectedItem()->getMenuItemID() == "rename") {
+                globalFrame->textInputPopup->action = "renameState";
+                globalFrame->textInputPopup->setCaption("New state name");
+                globalFrame->textInputPopup->setValue(selectedState->getName());
+                globalFrame->showModal(globalFrame->textInputPopup);
+            }
         }
-        
-        SpriteState *newState = new SpriteState(spriteSet, newStateName);
-        spriteSetEntry->addSpriteState(newState);
-        
-        refreshStates();
         
     } else if(event->getDispatcher() == stateTreeView->getRootNode()) {
         selectedState = (SpriteState*) stateTreeView->getRootNode()->getSelectedNode()->getUserData();
@@ -2094,7 +2253,10 @@ void SpriteStateEditor::refreshStates() {
     
     for(int i=0; i < spriteSetEntry->getNumStates(); i++) {
         SpriteState *state = spriteSetEntry->getState(i);
-        stateTreeView->getRootNode()->addTreeChild("treeIcons/state.png", state->getName(), (void*) state);
+        UITree *newNode = stateTreeView->getRootNode()->addTreeChild("treeIcons/state.png", state->getName(), (void*) state);
+        if(state == selectedState) {
+            newNode->setSelected();
+        }
     }
 }
 
@@ -2204,8 +2366,9 @@ PolycodeSpriteEditor::PolycodeSpriteEditor() : PolycodeEditor(true){
 
 void PolycodeSpriteEditor::handleEvent(Event *event) {
     if(event->getDispatcher() == spriteBrowser) {
-        stateEditor->setSpriteEntry(spriteBrowser->getSelectedSpriteEntry());
-        spritePreview->getSceneSprite()->setSprite(spriteBrowser->getSelectedSpriteEntry());
+        Sprite *selectedSprite = spriteBrowser->getSelectedSpriteEntry();
+        stateEditor->setSpriteEntry(selectedSprite);
+        spritePreview->getSceneSprite()->setSprite(selectedSprite);
     } else if(event->getDispatcher() == addFramesButton) {
         SpriteState *spriteState = stateEditor->getDetailsEditor()->getSpriteState();
         bool generateBBox = false;

Some files were not shown because too many files changed in this diff