Changeset 1533

Show
Ignore:
Timestamp:
01/26/10 13:38:55 (3 years ago)
Author:
wolke
Message:

add "edit note length Pattern Editor" to undo stack

Location:
branches/undo
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • branches/undo/gui/src/PatternEditor/DrumPatternEditor.cpp

    r1532 r1533  
    102102                m_pPattern = NULL; 
    103103        } 
     104        __selectedPatternNumber = nSelectedPatternNumber; 
    104105 
    105106 
     
    162163 
    163164        if (ev->button() == Qt::LeftButton ) { 
    164                 SE_addNoteAction *action = new SE_addNoteAction( nColumn, row ); 
     165                SE_addNoteAction *action = new SE_addNoteAction( nColumn, row, __selectedPatternNumber ); 
    165166                HydrogenApp::get_instance()->m_undoStack->push( action ); 
    166167        } 
     
    182183 
    183184                if ( Preferences::get_instance()->__rightclickedpattereditor == 1){ 
    184                         SE_addNoteRightClickAction *action = new SE_addNoteRightClickAction( nColumn, row ); 
     185                        SE_addNoteRightClickAction *action = new SE_addNoteRightClickAction( nColumn, row, __selectedPatternNumber ); 
    185186                        HydrogenApp::get_instance()->m_undoStack->push( action ); 
    186187                        return; 
     
    232233                __nColumn = nColumn; 
    233234                __row = row; 
     235                __oldLength = m_pDraggedNote->get_length(); 
    234236                 
    235237                AudioEngine::get_instance()->unlock(); 
     
    237239} 
    238240 
    239 void DrumPatternEditor::addOrDeleteNoteAction( int nColumn, int row ) 
    240 { 
     241void DrumPatternEditor::addOrDeleteNoteAction( int nColumn, int row, int selectedPatternNumber ) 
     242{ 
     243 
     244 
     245        Hydrogen *pEngine = Hydrogen::get_instance(); 
     246        PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); 
     247        H2Core::Pattern *pPattern; 
     248 
     249        if ( ( selectedPatternNumber != -1 ) && ( (uint)selectedPatternNumber < pPatternList->get_size() ) ) { 
     250                pPattern = pPatternList->get( selectedPatternNumber ); 
     251        } 
     252        else { 
     253                pPattern = NULL; 
     254        } 
     255 
     256 
    241257        Song *pSong = Hydrogen::get_instance()->getSong(); 
    242258        int nInstruments = pSong->get_instrument_list()->get_size(); 
     
    249265        bool bNoteAlreadyExist = false; 
    250266        std::multimap <int, Note*>::iterator pos; 
    251         for ( pos = m_pPattern->note_map.lower_bound( nColumn ); pos != m_pPattern->note_map.upper_bound( nColumn ); ++pos ) { 
     267        for ( pos = pPattern->note_map.lower_bound( nColumn ); pos != pPattern->note_map.upper_bound( nColumn ); ++pos ) { 
    252268                Note *pNote = pos->second; 
    253269                assert( pNote ); 
     
    256272                        bNoteAlreadyExist = true; 
    257273                        delete pNote; 
    258                         m_pPattern->note_map.erase( pos ); 
     274                        pPattern->note_map.erase( pos ); 
    259275                        break; 
    260276                } 
     
    271287                Note *pNote = new Note( pSelectedInstrument, nPosition, fVelocity, fPan_L, fPan_R, nLength, fPitch ); 
    272288                pNote->set_noteoff( false ); 
    273                 m_pPattern->note_map.insert( std::make_pair( nPosition, pNote ) ); 
     289                pPattern->note_map.insert( std::make_pair( nPosition, pNote ) ); 
    274290 
    275291                // hear note 
     
    298314 
    299315 
    300 void DrumPatternEditor::addNoteRightClickAction( int nColumn, int row ) 
    301 { 
     316void DrumPatternEditor::addNoteRightClickAction( int nColumn, int row, int selectedPatternNumber ) 
     317{ 
     318 
     319        Hydrogen *pEngine = Hydrogen::get_instance(); 
     320        PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); 
     321 
     322        H2Core::Pattern *pPattern; 
     323        if ( (selectedPatternNumber != -1) && ( (uint)selectedPatternNumber < pPatternList->get_size() ) ) { 
     324                pPattern = pPatternList->get( selectedPatternNumber ); 
     325        } 
     326        else { 
     327                pPattern = NULL; 
     328        } 
    302329 
    303330        Song *pSong = Hydrogen::get_instance()->getSong(); 
     
    322349 
    323350         
    324         m_pPattern->note_map.insert( std::make_pair( nPosition, poffNote ) ); 
     351        pPattern->note_map.insert( std::make_pair( nPosition, poffNote ) ); 
    325352 
    326353        pSong->__is_modified = true; 
     
    351378                return; 
    352379        } 
     380 
     381        if (m_bRightBtnPressed && m_pDraggedNote && ( Preferences::get_instance()->__rightclickedpattereditor == 0 ) ) { 
     382                if ( m_pDraggedNote->get_noteoff() ) return; 
     383 
     384                SE_editNoteLenghtAction *action = new SE_editNoteLenghtAction( m_pDraggedNote->get_position(),  m_pDraggedNote->get_position(), __row, m_pDraggedNote->get_length(),__oldLength, __selectedPatternNumber); 
     385                HydrogenApp::get_instance()->m_undoStack->push( action ); 
     386        } 
     387} 
     388 
     389 
     390void DrumPatternEditor::editNoteLenghtAction( int nColumn, int nRealColumn, int row, int length, int selectedPatternNumber ) 
     391{ 
     392        Hydrogen *pEngine = Hydrogen::get_instance(); 
     393        PatternList *pPatternList = pEngine->getSong()->get_pattern_list(); 
     394 
     395        H2Core::Pattern *pPattern; 
     396        if ( (selectedPatternNumber != -1) && ( (uint)selectedPatternNumber < pPatternList->get_size() ) ) { 
     397                pPattern = pPatternList->get( selectedPatternNumber ); 
     398        } 
     399        else { 
     400                pPattern = NULL; 
     401        } 
     402 
     403        Note *pDraggedNote; 
     404        Song *pSong = pEngine->getSong(); 
     405        int nInstruments = pSong->get_instrument_list()->get_size(); 
     406 
     407        Instrument *pSelectedInstrument = pSong->get_instrument_list()->get( row ); 
     408 
     409        AudioEngine::get_instance()->lock( RIGHT_HERE ); 
     410 
     411        std::multimap <int, Note*>::iterator pos; 
     412        for ( pos = pPattern->note_map.lower_bound( nColumn ); pos != pPattern->note_map.upper_bound( nColumn ); ++pos ) { 
     413                Note *pNote = pos->second; 
     414                assert( pNote ); 
     415 
     416                if ( pNote->get_instrument() == pSelectedInstrument ) { 
     417                        pDraggedNote = pNote; 
     418                        break; 
     419                } 
     420        } 
     421        if ( !pDraggedNote ) { 
     422                for ( pos = pPattern->note_map.lower_bound( nRealColumn ); pos != pPattern->note_map.upper_bound( nRealColumn ); ++pos ) { 
     423                        Note *pNote = pos->second; 
     424                        assert( pNote ); 
     425 
     426                        if ( pNote->get_instrument() == pSelectedInstrument ) { 
     427                                pDraggedNote = pNote; 
     428                                break; 
     429                        } 
     430                } 
     431 
     432 
     433        } 
     434        // potrei essere sulla coda di una nota precedente.. 
     435        for ( int nCol = 0; unsigned(nCol) < nRealColumn; ++nCol ) { 
     436                if ( pDraggedNote ) break; 
     437                for ( pos = pPattern->note_map.lower_bound( nCol ); pos != pPattern->note_map.upper_bound( nCol ); ++pos ) { 
     438                        Note *pNote = pos->second; 
     439                        assert( pNote ); 
     440 
     441                        if ( pNote->get_instrument() == pSelectedInstrument 
     442                        && ( (nRealColumn <= pNote->get_position() + pNote->get_length() ) 
     443                        && nRealColumn >= pNote->get_position() ) ){ 
     444                                pDraggedNote = pNote; 
     445                                break; 
     446                        } 
     447                } 
     448        } 
     449 
     450        pDraggedNote->set_length( length ); 
     451        AudioEngine::get_instance()->unlock(); 
     452        update( 0, 0, width(), height() ); 
     453        m_pPatternEditorPanel->getVelocityEditor()->updateEditor(); 
     454        m_pPatternEditorPanel->getPanEditor()->updateEditor(); 
     455        m_pPatternEditorPanel->getLeadLagEditor()->updateEditor(); 
     456        m_pPatternEditorPanel->getNoteKeyEditor()->updateEditor(); 
     457 
    353458} 
    354459 
  • branches/undo/gui/src/PatternEditor/DrumPatternEditor.h

    r1532 r1533  
    6565                virtual void selectedInstrumentChangedEvent(); 
    6666                //~ Implements EventListener interface 
    67                 void addOrDeleteNoteAction( int __nColumn, int __nRow ); 
    68                 void addNoteRightClickAction( int nColumn, int nRow ); 
     67                void addOrDeleteNoteAction( int __nColumn, int __nRow, int  selectedPatternNumber); 
     68                void addNoteRightClickAction( int nColumn, int nRow, int selectedPatternNumber ); 
     69                void editNoteLenghtAction( int nColumn, int nRealColumn, int row, int length, int selectedPatternNumber ); 
    6970 
    7071        public slots: 
     
    108109                int __nColumn; 
    109110                int __row; 
     111                int __oldLength; 
     112                int __selectedPatternNumber; 
    110113}; 
    111114 
  • branches/undo/gui/src/UndoActions.h

    r1532 r1533  
    457457{ 
    458458public: 
    459         SE_addNoteAction( int nColumn, int nRow ){ 
     459        SE_addNoteAction( int nColumn, int nRow, int selectedPatternNumber ){ 
    460460        setText( QString( "Add Note ( %1, %2 )" ).arg( nColumn ).arg( nRow ) ); 
    461461        //setText("add Pattern"); 
    462462        __nColumn = nColumn; 
    463463        __nRow = nRow; 
     464        __selectedPatternNumber = selectedPatternNumber; 
    464465        } 
    465466        virtual void undo() 
     
    467468                qDebug() << "Add note Undo "; 
    468469                HydrogenApp* h2app = HydrogenApp::get_instance(); 
    469                 h2app->getPatternEditorPanel()->getDrumPatternEditor()->addOrDeleteNoteAction( __nColumn, __nRow ); 
     470                h2app->getPatternEditorPanel()->getDrumPatternEditor()->addOrDeleteNoteAction( __nColumn, __nRow, __selectedPatternNumber ); 
    470471        } 
    471472        virtual void redo() 
     
    473474                qDebug() << "Add Note Redo " ; 
    474475                HydrogenApp* h2app = HydrogenApp::get_instance(); 
    475                 h2app->getPatternEditorPanel()->getDrumPatternEditor()->addOrDeleteNoteAction( __nColumn, __nRow ); 
     476                h2app->getPatternEditorPanel()->getDrumPatternEditor()->addOrDeleteNoteAction( __nColumn, __nRow, __selectedPatternNumber ); 
    476477        } 
    477478private: 
    478479        int __nColumn; 
    479480        int __nRow; 
     481        int __selectedPatternNumber; 
    480482}; 
    481483 
     
    484486{ 
    485487public: 
    486         SE_addNoteRightClickAction( int nColumn, int nRow ){ 
     488        SE_addNoteRightClickAction( int nColumn, int nRow, int selectedPatternNumber ){ 
    487489        setText( QString( "Add off note Note ( %1, %2 )" ).arg( nColumn ).arg( nRow ) ); 
    488490        //setText("add Pattern"); 
    489491        __nColumn = nColumn; 
    490492        __nRow = nRow; 
     493        __selectedPatternNumber = selectedPatternNumber; 
    491494        } 
    492495        virtual void undo() 
     
    494497                qDebug() << "Add off note Note Undo "; 
    495498                HydrogenApp* h2app = HydrogenApp::get_instance(); 
    496                 h2app->getPatternEditorPanel()->getDrumPatternEditor()->addOrDeleteNoteAction( __nColumn, __nRow ); 
     499                h2app->getPatternEditorPanel()->getDrumPatternEditor()->addOrDeleteNoteAction( __nColumn, __nRow, __selectedPatternNumber ); 
    497500        } 
    498501        virtual void redo() 
     
    500503                qDebug() << "Add off note Note Redo " ; 
    501504                HydrogenApp* h2app = HydrogenApp::get_instance(); 
    502                 h2app->getPatternEditorPanel()->getDrumPatternEditor()->addNoteRightClickAction( __nColumn, __nRow ); 
     505                h2app->getPatternEditorPanel()->getDrumPatternEditor()->addNoteRightClickAction( __nColumn, __nRow, __selectedPatternNumber ); 
    503506        } 
    504507private: 
    505508        int __nColumn; 
    506509        int __nRow; 
     510        int __selectedPatternNumber; 
     511}; 
     512 
     513class SE_editNoteLenghtAction : public QUndoCommand 
     514{ 
     515public: 
     516        SE_editNoteLenghtAction( int nColumn, int nRealColumn, int row, int length, int oldLength, int selectedPatternNumber ){ 
     517        setText( QString( "Change note length" ) ); 
     518        __nColumn = nColumn; 
     519        __nRealColumn = nRealColumn; 
     520        __row = row; 
     521        __length = length; 
     522        __oldLength = oldLength; 
     523        __selectedPatternNumber = selectedPatternNumber; 
     524        } 
     525        virtual void undo() 
     526        { 
     527                qDebug() << "Change note length Undo "; 
     528                HydrogenApp* h2app = HydrogenApp::get_instance(); 
     529                h2app->getPatternEditorPanel()->getDrumPatternEditor()->editNoteLenghtAction( __nColumn,  __nRealColumn, __row, __oldLength, __selectedPatternNumber ); 
     530        } 
     531        virtual void redo() 
     532        { 
     533                qDebug() << "Change note length Redo " ; 
     534                HydrogenApp* h2app = HydrogenApp::get_instance(); 
     535                h2app->getPatternEditorPanel()->getDrumPatternEditor()->editNoteLenghtAction( __nColumn,  __nRealColumn, __row, __length, __selectedPatternNumber ); 
     536        } 
     537private: 
     538        int __nColumn; 
     539        int __nRealColumn; 
     540        int __row; 
     541        int __oldLength; 
     542        int __length; 
     543        int __selectedPatternNumber; 
    507544}; 
    508545#endif // UNDOACTIONS_H 
  • branches/undo/undo_implementation_todo

    r1532 r1533  
    2323 + Add/Remove note Pattern Editor                               | Done 
    2424 + Add/Remove noteoff note Pattern Editor                       | Done 
    25  + Edit note length Pattern Editor (right cklicking)            | ---- 
     25 + Edit note length Pattern Editor (right cklicking)            | Done 
    2626 + Add/Remove note Piano Roll Editor                            | ---- 
    2727 + Add/Remove noteoff note Piano Roll Editor                    | ----