#include "MusicEditor.h" #include "MusicPicker.h" #include "Song.h" #include "BorderPanel.h" #include "labels.h" #include "SelectionManager.h" #include "musicPlayer.h" #include "minorGems/util/log/AppLog.h" // from musicPlayer.cpp extern char noteToggles[PARTS][S][N][N]; extern int partLengths[PARTS]; extern MusicPicker *mainMusicPicker; extern int gameWidth, gameHeight; extern TextGL *largeTextFixed; template <> void SizeLimitedVector::deleteElementOfType( Music inElement ) { // no delete necessary } MusicEditor::MusicEditor( ScreenGL *inScreen ) : Editor( inScreen ), mUndoStack( MAX_UNDOS, false ) { mCloseButton->setToolTip( "tip_closeEdit_music" ); mSidePanel->add( mainMusicPicker ); mainMusicPicker->addActionListener( this ); mNoteDisplay = new NoteGridDisplay( 8, gameWidth - 48 - N * W ); mMainPanel->add( mNoteDisplay ); mNoteDisplay->addActionListener( this ); EightPixelLabel *fieldLabel = new EightPixelLabel( 150, 54, "musicName" ); mMainPanel->add( fieldLabel ); int fieldHeight = 8; int fieldWidth = 8 * 10; const char *defaultText = "default"; mNameField = new TextFieldGL( 150, 43, fieldWidth, fieldHeight, 1, defaultText, largeTextFixed, new Color( 0.75, 0.75, 0.75 ), new Color( 0.75, 0.75, 0.75 ), new Color( 0.15, 0.15, 0.15 ), new Color( 0.75, 0.75, 0.75 ), 10, false ); mMainPanel->add( mNameField ); mNameField->setFocus( true ); //mNameField->lockFocus( true ); mNameField->setCursorPosition( strlen( defaultText ) ); mNameField->addActionListener( this ); // center add button double gridEdge = 8 + N * W; double extra = gameHeight - gridEdge; // center it vertically on music picker double addY = mainMusicPicker->getAnchorY() + mainMusicPicker->getHeight() - 15; double sideButtonsX = gridEdge + (extra - 16) / 2; mAddButton = new AddButtonGL( sideButtonsX, addY, 16, 16 ); mMainPanel->add( mAddButton ); mAddButton->addActionListener( this ); mAddButton->setToolTip( "tip_addMusic" ); mAddAction = false; double miniButtonSize = P + 4; mMiniViewButton = new SpriteButtonGL( NULL, 1, gridEdge + ( extra - miniButtonSize ) / 2, addY - 24, miniButtonSize, miniButtonSize ); mMainPanel->add( mMiniViewButton ); mTransformToolSet = new TransformToolSet( sideButtonsX, mMiniViewButton->getAnchorY() - 4 - 100 ) ; mMainPanel->add( mTransformToolSet ); mTransformToolSet->addActionListener( this ); double undoButtonY = gameWidth - ( 48 + N * W ); mUndoButton = new UndoButtonGL( sideButtonsX, undoButtonY, 16, 16 ); mMainPanel->add( mUndoButton ); mUndoButton->addActionListener( this ); mUndoButton->setEnabled( false ); mRedoButton = new RedoButtonGL( sideButtonsX, undoButtonY + 19, 16, 16 ); mMainPanel->add( mRedoButton ); mRedoButton->addActionListener( this ); mRedoButton->setEnabled( false ); setMusicToEdit( mainMusicPicker->getSelectedResource() ); postConstruction(); } MusicEditor::~MusicEditor() { mSidePanel->remove( mainMusicPicker ); } void MusicEditor::setMusicToEdit( Music inMusic ) { mMusicToEdit = inMusic; for( int y=0; ysetText( name ); mNameField->setCursorPosition( strlen( name ) ); delete [] name; } void MusicEditor::refreshMiniView() { // don't use cached version mMiniViewButton->setSprite( mMusicToEdit.getSprite( false, false ) ); } void MusicEditor::actionPerformed( GUIComponent *inTarget ) { // superclass Editor::actionPerformed( inTarget ); if( inTarget == mainMusicPicker ) { if( ! mAddAction && ! mainMusicPicker->wasLastActionFromPress() ) { // will change music mUndoStack.push_back( mMusicToEdit ); mUndoButton->setEnabled( true ); setMusicToEdit( mainMusicPicker->getSelectedResource() ); // new branch... "redo" future now impossible mRedoStack.deleteAll(); mRedoButton->setEnabled( false ); } } else if( inTarget == mNameField ) { mUndoStack.push_back( mMusicToEdit ); mUndoButton->setEnabled( true ); // new branch... "redo" future now impossible mRedoStack.deleteAll(); mRedoButton->setEnabled( false ); mMusicToEdit.editMusicName( mNameField->getText() ); } else if( inTarget == mAddButton ) { addMusic(); } else if( inTarget == mUndoButton ) { int lastIndex = mUndoStack.size() - 1; Music last = *( mUndoStack.getElement( lastIndex ) ); mUndoStack.deleteElement( lastIndex ); if( mUndoStack.size() == 0 ) { mUndoButton->setEnabled( false ); } mRedoStack.push_back( mMusicToEdit ); mRedoButton->setEnabled( true ); setMusicToEdit( last ); } else if( inTarget == mRedoButton ) { int nextIndex = mRedoStack.size() - 1; Music next = *( mRedoStack.getElement( nextIndex ) ); mRedoStack.deleteElement( nextIndex ); if( mRedoStack.size() == 0 ) { mRedoButton->setEnabled( false ); } mUndoStack.push_back( mMusicToEdit ); mUndoButton->setEnabled( true ); setMusicToEdit( next ); } else if( inTarget == mTransformToolSet ) { mUndoStack.push_back( mMusicToEdit ); mUndoButton->setEnabled( true ); // new branch... "redo" future now impossible mRedoStack.deleteAll(); mRedoButton->setEnabled( false ); char oldToggles[N][N]; for( int y=0; ygetLastPressed() ) { case flipH: { for( int y=0; ymLastActionPress ) { // note grid has changed, // but our music object hasn't been touched yet, so we can // still save it as an undo point mUndoStack.push_back( mMusicToEdit ); mUndoButton->setEnabled( true ); // new branch... "redo" future now impossible mRedoStack.deleteAll(); mRedoButton->setEnabled( false ); } // copy changes into our object for( int y=0; yresetColumnGlow(); // silence our extra part (only plays when editor open partLengths[SI] = 0; } void MusicEditor::addMusic() { mAddAction = true; mMusicToEdit.finishEdit(); mainMusicPicker->setSelectedResource( mMusicToEdit, true ); mAddAction = false; }