From 9bb93497dd0717876e1dfac3b2031cd904af7cb0 Mon Sep 17 00:00:00 2001 From: Colin McEwan Date: Sun, 9 May 2021 22:57:02 +0100 Subject: [PATCH 1/2] Remove temp pattern list read/writes for undo actions --- data/doc | 2 +- src/core/Basics/Song.cpp | 119 --------------------- src/core/Basics/Song.h | 3 - src/gui/src/SongEditor/SongEditor.cpp | 91 +++++++--------- src/gui/src/SongEditor/SongEditor.h | 4 +- src/gui/src/SongEditor/SongEditorPanel.cpp | 35 +++--- src/gui/src/SongEditor/SongEditorPanel.h | 1 - src/gui/src/UndoActions.h | 65 ++++------- 8 files changed, 81 insertions(+), 239 deletions(-) diff --git a/data/doc b/data/doc index a4a06c1891..d0195235b9 160000 --- a/data/doc +++ b/data/doc @@ -1 +1 @@ -Subproject commit a4a06c1891027a597c1453cf75de38132fd694f8 +Subproject commit d0195235b984d5eba388fc1bc58dd611cbe37a65 diff --git a/src/core/Basics/Song.cpp b/src/core/Basics/Song.cpp index 666f4a356a..8dbe718a8e 100644 --- a/src/core/Basics/Song.cpp +++ b/src/core/Basics/Song.cpp @@ -309,125 +309,6 @@ void Song::clearMissingSamples() { } } -void Song::readTempPatternList( const QString& sFilename ) -{ - XMLDoc doc; - if( !doc.read( sFilename ) ) { - return; - } - XMLNode root = doc.firstChildElement( "sequence" ); - if ( root.isNull() ) { - ERRORLOG( "sequence node not found" ); - return; - } - - XMLNode virtualsNode = root.firstChildElement( "virtuals" ); - if ( !virtualsNode.isNull() ) { - XMLNode virtualNode = virtualsNode.firstChildElement( "virtual" ); - while ( !virtualNode.isNull() ) { - QString patternName = virtualNode.read_attribute( "pattern", nullptr, false, false ); - XMLNode patternNode = virtualNode.firstChildElement( "pattern" ); - Pattern* pPattern = nullptr; - while ( !patternName.isEmpty() && !patternNode.isNull() ) { - QString virtualName = patternNode.read_text( false ); - if ( !virtualName.isEmpty() ) { - Pattern* pVirtualPattern = nullptr; - for ( unsigned i = 0; i < getPatternList()->size(); i++ ) { - Pattern* pat = getPatternList()->get( i ); - if ( pPattern == nullptr && pat->get_name() == patternName ) { - pPattern = pat; - } - if ( pVirtualPattern == nullptr && pat->get_name() == virtualName ) { - pVirtualPattern = pat; - } - if ( pPattern != nullptr && pVirtualPattern != nullptr) { - break; - } - } - if ( pPattern == nullptr ) { - ERRORLOG( QString( "Invalid pattern name %1" ).arg( patternName ) ); - } - if ( pVirtualPattern == nullptr ) { - ERRORLOG( QString( "Invalid virtual pattern name %1" ).arg( virtualName ) ); - } - if ( pPattern != nullptr && pVirtualPattern != nullptr ) { - pPattern->virtual_patterns_add( pVirtualPattern ); - } - } - patternNode = patternNode.nextSiblingElement( "pattern" ); - } - virtualNode = virtualNode.nextSiblingElement( "virtual" ); - } - } else { - WARNINGLOG( "no virtuals node not found" ); - } - - getPatternList()->flattened_virtual_patterns_compute(); - getPatternGroupVector()->clear(); - - XMLNode sequenceNode = root.firstChildElement( "groups" ); - if ( !sequenceNode.isNull() ) { - XMLNode groupNode = sequenceNode.firstChildElement( "group" ); - while ( !groupNode.isNull() ) { - PatternList* patternSequence = new PatternList(); - XMLNode patternNode = groupNode.firstChildElement( "pattern" ); - while ( !patternNode.isNull() ) { - QString patternName = patternNode.read_text( false ); - if( !patternName.isEmpty() ) { - Pattern* p = nullptr; - for ( unsigned i = 0; i < getPatternList()->size(); i++ ) { - Pattern* pat = getPatternList()->get( i ); - if ( pat->get_name() == patternName ) { - p = pat; - break; - } - } - if ( p == nullptr ) { - ERRORLOG( QString( "Invalid pattern name %1" ).arg( patternName ) ); - } else { - patternSequence->add( p ); - } - } - patternNode = patternNode.nextSiblingElement( "pattern" ); - } - getPatternGroupVector()->push_back( patternSequence ); - groupNode = groupNode.nextSiblingElement( "group" ); - } - } else { - WARNINGLOG( "no sequence node not found" ); - } -} - -bool Song::writeTempPatternList( const QString& sFilename ) -{ - XMLDoc doc; - XMLNode root = doc.set_root( "sequence" ); - - XMLNode virtualPatternListNode = root.createNode( "virtuals" ); - for ( unsigned i = 0; i < getPatternList()->size(); i++ ) { - Pattern *pPattern = getPatternList()->get( i ); - if ( !pPattern->get_virtual_patterns()->empty() ) { - XMLNode node = virtualPatternListNode.createNode( "virtual" ); - node.write_attribute( "pattern", pPattern->get_name() ); - for ( Pattern::virtual_patterns_it_t virtIter = pPattern->get_virtual_patterns()->begin(); virtIter != pPattern->get_virtual_patterns()->end(); ++virtIter ) { - node.write_string( "pattern", (*virtIter)->get_name() ); - } - } - } - - XMLNode patternSequenceNode = root.createNode( "groups" ); - for ( unsigned i = 0; i < getPatternGroupVector()->size(); i++ ) { - XMLNode node = patternSequenceNode.createNode( "group" ); - PatternList *pList = ( *getPatternGroupVector() )[i]; - for ( unsigned j = 0; j < pList->size(); j++ ) { - Pattern *pPattern = pList->get( j ); - node.write_string( "pattern", pPattern->get_name() ); - } - } - - return doc.write( sFilename ); -} - QString Song::copyInstrumentLineToString( int nSelectedPattern, int nSelectedInstrument ) { Instrument *pInstr = getInstrumentList()->get( nSelectedInstrument ); diff --git a/src/core/Basics/Song.h b/src/core/Basics/Song.h index f1ddc2ec7a..3c12976e0e 100644 --- a/src/core/Basics/Song.h +++ b/src/core/Basics/Song.h @@ -151,9 +151,6 @@ class Song : public H2Core::Object DrumkitComponent* getComponent( int nID ) const; - void readTempPatternList( const QString& sFilename ); - bool writeTempPatternList( const QString& sFilename ); - QString copyInstrumentLineToString( int nSelectedPattern, int selectedInstrument ); bool pasteInstrumentLineFromString( const QString& sSerialized, int nSelectedPattern, int nSelectedInstrument, std::list& pPatterns ); diff --git a/src/gui/src/SongEditor/SongEditor.cpp b/src/gui/src/SongEditor/SongEditor.cpp index 20ee3f0638..744895d004 100644 --- a/src/gui/src/SongEditor/SongEditor.cpp +++ b/src/gui/src/SongEditor/SongEditor.cpp @@ -1126,31 +1126,6 @@ QRect SongEditor::getKeyboardCursorRect() { QSize( m_nGridWidth, m_nGridHeight -1 ) ); } -void SongEditor::clearThePatternSequenceVector( QString filename ) -{ - Hydrogen *engine = Hydrogen::get_instance(); - - m_pAudioEngine->lock( RIGHT_HERE ); - - Song *song = engine->getSong(); - - //before deleting the sequence, write a temp sequence file to disk - song->writeTempPatternList( filename ); - - std::vector *pPatternGroupsVect = song->getPatternGroupVector(); - for (uint i = 0; i < pPatternGroupsVect->size(); i++) { - PatternList *pPatternList = (*pPatternGroupsVect)[i]; - pPatternList->clear(); - delete pPatternList; - } - pPatternGroupsVect->clear(); - - song->setIsModified( true ); - m_pAudioEngine->unlock(); - m_bSequenceChanged = true; - update(); -} - void SongEditor::updateEditorandSetTrue() { Hydrogen::get_instance()->getSong()->setIsModified( true ); @@ -1542,8 +1517,8 @@ void SongEditorPatternList::patternPopup_load() { Hydrogen *engine = Hydrogen::get_instance(); int nSelectedPattern = engine->getSelectedPatternNumber(); - Song *song = engine->getSong(); - Pattern *pattern = song->getPatternList()->get( nSelectedPattern ); + Song *pSong = engine->getSong(); + Pattern *pPattern = pSong->getPatternList()->get( nSelectedPattern ); QFileDialog fd(this); fd.setFileMode( QFileDialog::ExistingFile ); @@ -1556,19 +1531,22 @@ void SongEditorPatternList::patternPopup_load() } QString patternPath = fd.selectedFiles().first(); - QString prevPatternPath = Files::savePatternTmp( pattern->get_name(), pattern, song, engine->getCurrentDrumkitName() ); + QString prevPatternPath = Files::savePatternTmp( pPattern->get_name(), pPattern, pSong, engine->getCurrentDrumkitName() ); if ( prevPatternPath.isEmpty() ) { QMessageBox::warning( this, "Hydrogen", tr("Could not save pattern to temporary directory.") ); return; } - LocalFileMng fileMng; - QString sequencePath = Filesystem::tmp_file_path( "SEQ.xml" ); - if ( !song->writeTempPatternList( sequencePath ) ) { - QMessageBox::warning( this, "Hydrogen", tr("Could not export sequence.") ); - return; + + std::vector< QPoint > deleteCells; + auto pColumns = pSong->getPatternGroupVector(); + for ( int nColumn = 0; nColumn < pColumns->size(); nColumn++ ) { + PatternList *pColumn = ( *pColumns )[ nColumn ]; + if ( pColumn->index( pPattern ) != -1 ) { + deleteCells.push_back( QPoint( nColumn, nSelectedPattern ) ); + } } - SE_loadPatternAction *action = new SE_loadPatternAction( patternPath, prevPatternPath, sequencePath, nSelectedPattern, false ); + SE_loadPatternAction *action = new SE_loadPatternAction( patternPath, prevPatternPath, deleteCells, nSelectedPattern, false ); HydrogenApp *hydrogenApp = HydrogenApp::get_instance(); hydrogenApp->m_pUndoStack->push( action ); } @@ -1689,29 +1667,30 @@ void SongEditorPatternList::revertPatternPropertiesDialogSettings(QString oldPat void SongEditorPatternList::patternPopup_delete() { Song *pSong = m_pHydrogen->getSong(); - int patternPosition = m_pHydrogen->getSelectedPatternNumber(); - Pattern *pattern = pSong->getPatternList()->get( patternPosition ); + int nPatternPosition = m_pHydrogen->getSelectedPatternNumber(); + Pattern *pPattern = pSong->getPatternList()->get( nPatternPosition ); - QString patternPath = Files::savePatternTmp( pattern->get_name(), pattern, pSong, m_pHydrogen->getCurrentDrumkitName() ); - if ( patternPath.isEmpty() ) { + QString sPatternPath = Files::savePatternTmp( pPattern->get_name(), pPattern, pSong, m_pHydrogen->getCurrentDrumkitName() ); + if ( sPatternPath.isEmpty() ) { QMessageBox::warning( this, "Hydrogen", tr("Could not save pattern to temporary directory.") ); return; } - LocalFileMng fileMng; - QString sequencePath = Filesystem::tmp_file_path( "SEQ.xml" ); - if ( !pSong->writeTempPatternList( sequencePath ) ) { - QMessageBox::warning( this, "Hydrogen", tr("Could not export sequence.") ); - return; - } - SE_deletePatternFromListAction *action = new SE_deletePatternFromListAction( patternPath , sequencePath, patternPosition ); - HydrogenApp *hydrogenApp = HydrogenApp::get_instance(); - hydrogenApp->m_pUndoStack->push( action ); + std::vector< QPoint > deleteCells; + auto pColumns = pSong->getPatternGroupVector(); + for ( int nColumn = 0; nColumn < pColumns->size(); nColumn++ ) { + PatternList *pColumn = ( *pColumns )[ nColumn ]; + if ( pColumn->index( pPattern ) != -1 ) { + deleteCells.push_back( QPoint( nColumn, nPatternPosition ) ); + } + } + HydrogenApp::get_instance()->m_pUndoStack + ->push( new SE_deletePatternFromListAction( sPatternPath, deleteCells, nPatternPosition ) ); } -void SongEditorPatternList::deletePatternFromList( QString patternFilename, QString sequenceFileName, int patternPosition ) +void SongEditorPatternList::deletePatternFromList( QString patternFilename, int patternPosition ) { if ( m_pHydrogen->getSong()->getMode() == Song::PATTERN_MODE ) { m_pHydrogen->sequencer_setNextPattern( -1 ); @@ -1781,7 +1760,7 @@ void SongEditorPatternList::deletePatternFromList( QString patternFilename, QStr } -void SongEditorPatternList::restoreDeletedPatternsFromList( QString patternFilename, QString sequenceFileName, int patternPosition ) +void SongEditorPatternList::restoreDeletedPatternsFromList( QString patternFilename, int patternPosition ) { Hydrogen *engine = Hydrogen::get_instance(); Song *pSong = engine->getSong(); @@ -2027,7 +2006,19 @@ void SongEditorPatternList::dropEvent(QDropEvent *event) QString sequenceFilename = Filesystem::tmp_file_path( "SEQ.xml" ); bool drag = false; if( QString( tokens.at(0) ).contains( "drag pattern" )) drag = true; - SE_loadPatternAction *pAction = new SE_loadPatternAction( sPatternName, oldPatternName, sequenceFilename, nTargetPattern, drag ); + + std::vector< QPoint > deleteCells; + if ( ! drag ) { + auto pColumns = pSong->getPatternGroupVector(); + for ( int nColumn = 0; nColumn < pColumns->size(); nColumn++ ) { + PatternList *pColumn = ( *pColumns )[ nColumn ]; + if ( pColumn->index( pPattern ) != -1 ) { + deleteCells.push_back( QPoint( nColumn, nTargetPattern ) ); + } + } + } + + SE_loadPatternAction *pAction = new SE_loadPatternAction( sPatternName, oldPatternName, deleteCells, nTargetPattern, drag ); pHydrogenApp->m_pUndoStack->push( pAction ); } diff --git a/src/gui/src/SongEditor/SongEditor.h b/src/gui/src/SongEditor/SongEditor.h index 84dcadc91c..77e4d37129 100644 --- a/src/gui/src/SongEditor/SongEditor.h +++ b/src/gui/src/SongEditor/SongEditor.h @@ -246,8 +246,8 @@ class SongEditorPatternList : public QWidget, public H2Core::Object, public Even void updateEditor(); void createBackground(); void movePatternLine( int, int ); - void deletePatternFromList( QString patternFilename, QString sequenceFileName, int patternPosition ); - void restoreDeletedPatternsFromList( QString patternFilename, QString sequenceFileName, int patternPosition ); + void deletePatternFromList( QString patternFilename, int patternPosition ); + void restoreDeletedPatternsFromList( QString patternFilename, int patternPosition ); void acceptPatternPropertiesDialogSettings( QString newPatternName, QString newPatternInfo, QString newPatternCategory, int patternNr ); void revertPatternPropertiesDialogSettings(QString oldPatternName, QString oldPatternInfo, QString oldPatternCategory, int patternNr); void loadPatternAction( QString filename, int position); diff --git a/src/gui/src/SongEditor/SongEditorPanel.cpp b/src/gui/src/SongEditor/SongEditorPanel.cpp index c336c8d661..c3ed53c738 100644 --- a/src/gui/src/SongEditor/SongEditorPanel.cpp +++ b/src/gui/src/SongEditor/SongEditorPanel.cpp @@ -662,32 +662,25 @@ void SongEditorPanel::clearSequence( Button* btn) if ( res == 1 ) { return; } - - QString filename = Filesystem::tmp_file_path( "SEQ.xml" ); - SE_deletePatternSequenceAction *pAction = new SE_deletePatternSequenceAction( filename ); - HydrogenApp *pH2App = HydrogenApp::get_instance(); - - pH2App->m_pUndoStack->push( pAction ); -} - -void SongEditorPanel::restoreGroupVector( QString filename ) -{ - //clear the old sequese - std::vector *pPatternGroupsVect = Hydrogen::get_instance()->getSong()->getPatternGroupVector(); - for (uint i = 0; i < pPatternGroupsVect->size(); i++) { - PatternList *pPatternList = (*pPatternGroupsVect)[i]; - pPatternList->clear(); - delete pPatternList; + // Find and delete all pattern cells. + std::vector< QPoint > deleteCells, mergeCells, addCells; + Song *pSong = Hydrogen::get_instance()->getSong(); + std::vector< PatternList* > *pColumns = pSong->getPatternGroupVector(); + PatternList *pPatternList = pSong->getPatternList(); + for ( int nColumn = 0 ; nColumn < pColumns->size(); nColumn++ ) { + PatternList *pColumn = pColumns->at( nColumn ); + for ( int n = 0; n < pColumn->size(); n++ ) { + deleteCells.push_back( QPoint( nColumn, pPatternList->index( pColumn->get( n ) ) ) ); + } } - pPatternGroupsVect->clear(); - Hydrogen::get_instance()->getSong()->readTempPatternList( filename ); - m_pSongEditor->updateEditorandSetTrue(); - updateAll(); + HydrogenApp *pH2App = HydrogenApp::get_instance(); + pH2App->m_pUndoStack->push( new SE_modifyPatternCellsAction( addCells, deleteCells, mergeCells, + tr( "Delete %1 pattern cells" ) + .arg( deleteCells.size() ) ) ); } - void SongEditorPanel::resyncExternalScrollBar() { int nGridHeight = m_pPatternList->getGridHeight(); diff --git a/src/gui/src/SongEditor/SongEditorPanel.h b/src/gui/src/SongEditor/SongEditorPanel.h index 285c4cb818..65c8c82dee 100644 --- a/src/gui/src/SongEditor/SongEditorPanel.h +++ b/src/gui/src/SongEditor/SongEditorPanel.h @@ -66,7 +66,6 @@ class SongEditorPanel : public QWidget, public EventListener, public H2Core::Obj // Implements EventListener interface virtual void selectedPatternChangedEvent() override; - void restoreGroupVector( QString filename ); //~ Implements EventListener interface ///< an empty new pattern will be added to pattern list at idx void insertPattern( int idx, H2Core::Pattern* pPattern ); diff --git a/src/gui/src/UndoActions.h b/src/gui/src/UndoActions.h index 0b1bd3d1bf..6661cc3b5a 100644 --- a/src/gui/src/UndoActions.h +++ b/src/gui/src/UndoActions.h @@ -80,7 +80,6 @@ class SE_deletePatternAction : public QUndoCommand unsigned __nColumnIndex; }; - class SE_movePatternListItemAction : public QUndoCommand { public: @@ -106,58 +105,36 @@ class SE_movePatternListItemAction : public QUndoCommand int __nTargetPattern; }; - -class SE_deletePatternSequenceAction : public QUndoCommand -{ -public: - explicit SE_deletePatternSequenceAction( QString pFilename ){ - setText( QObject::tr( "Delete complete pattern-sequence" ) ); - __pFilename = pFilename ; - } - virtual void undo() - { - //qDebug() << "Delete complete pattern-sequence undo"; - HydrogenApp* h2app = HydrogenApp::get_instance(); - h2app->getSongEditorPanel()->restoreGroupVector( __pFilename ); - } - - virtual void redo() - { - //qDebug() << "Delete complete pattern-sequence redo " ; - HydrogenApp* h2app = HydrogenApp::get_instance(); - h2app->getSongEditorPanel()->getSongEditor()->clearThePatternSequenceVector( __pFilename ); - } -private: - QString __pFilename; -}; - class SE_deletePatternFromListAction : public QUndoCommand { public: - SE_deletePatternFromListAction( QString patternFilename , QString sequenceFileName, int patternPosition ){ + SE_deletePatternFromListAction( QString patternFilename , std::vector< QPoint > &deleteCells, int patternPosition ){ setText( QObject::tr( "Delete pattern from list" ) ); __patternFilename = patternFilename; - __sequenceFileName = sequenceFileName; + __deleteCells = deleteCells; __patternPosition = patternPosition; } virtual void undo() { //qDebug() << "Delete pattern from list undo"; - HydrogenApp* h2app = HydrogenApp::get_instance(); - h2app->getSongEditorPanel()->getSongEditorPatternList()->restoreDeletedPatternsFromList( __patternFilename, __sequenceFileName, __patternPosition ); - h2app->getSongEditorPanel()->restoreGroupVector( __sequenceFileName ); - h2app->getSongEditorPanel()->getSongEditor()->updateEditorandSetTrue(); + SongEditorPanel* pPanel = HydrogenApp::get_instance()->getSongEditorPanel(); + std::vector< QPoint > empty; + pPanel->getSongEditorPatternList()->restoreDeletedPatternsFromList( __patternFilename, __patternPosition ); + pPanel->getSongEditor()->modifyPatternCellsAction( __deleteCells, empty, empty ); + pPanel->getSongEditor()->updateEditorandSetTrue(); } virtual void redo() { //qDebug() << "Delete pattern from list redo" ; - HydrogenApp* h2app = HydrogenApp::get_instance(); - h2app->getSongEditorPanel()->getSongEditorPatternList()->deletePatternFromList( __patternFilename, __sequenceFileName, __patternPosition ); + SongEditorPanel* pPanel = HydrogenApp::get_instance()->getSongEditorPanel(); + std::vector< QPoint > empty; + pPanel->getSongEditor()->modifyPatternCellsAction( empty, __deleteCells, empty ); + pPanel->getSongEditorPatternList()->deletePatternFromList( __patternFilename, __patternPosition ); } private: QString __patternFilename; - QString __sequenceFileName; + std::vector< QPoint > __deleteCells; int __patternPosition; }; @@ -259,11 +236,11 @@ class SE_insertPatternAction : public QUndoCommand class SE_loadPatternAction : public QUndoCommand { public: - SE_loadPatternAction( QString patternName, QString oldPatternName, QString sequenceFileName, int patternPosition, bool dragFromList){ + SE_loadPatternAction( QString patternName, QString oldPatternName, std::vector< QPoint > &deleteCells, int patternPosition, bool dragFromList){ setText( QObject::tr( "Load/drag pattern" ) ); __patternName = patternName; __oldPatternName = oldPatternName; - __sequenceFileName = sequenceFileName; + __deleteCells = deleteCells; __patternPosition = patternPosition; __dragFromList = dragFromList; } @@ -272,13 +249,14 @@ class SE_loadPatternAction : public QUndoCommand //qDebug() << "Load/drag pattern undo" << __dragFromList; HydrogenApp* h2app = HydrogenApp::get_instance(); if( __dragFromList ){ - h2app->getSongEditorPanel()->getSongEditorPatternList()->deletePatternFromList( __oldPatternName, __sequenceFileName, __patternPosition ); + h2app->getSongEditorPanel()->getSongEditorPatternList()->deletePatternFromList( __oldPatternName, __patternPosition ); }else { - h2app->getSongEditorPanel()->getSongEditorPatternList()->restoreDeletedPatternsFromList( __oldPatternName, __sequenceFileName, __patternPosition ); + h2app->getSongEditorPanel()->getSongEditorPatternList()->restoreDeletedPatternsFromList( __oldPatternName, __patternPosition ); h2app->getSongEditorPanel()->deletePattern( __patternPosition +1 ); } - h2app->getSongEditorPanel()->restoreGroupVector( __sequenceFileName ); + std::vector< QPoint > empty; + h2app->getSongEditorPanel()->getSongEditor()->modifyPatternCellsAction( __deleteCells, empty, empty ); h2app->getSongEditorPanel()->getSongEditor()->updateEditorandSetTrue(); } @@ -287,14 +265,17 @@ class SE_loadPatternAction : public QUndoCommand //qDebug() << "Load/drag pattern redo" << __dragFromList << __patternPosition; HydrogenApp* h2app = HydrogenApp::get_instance(); if(!__dragFromList){ - h2app->getSongEditorPanel()->getSongEditorPatternList()->deletePatternFromList( __oldPatternName, __sequenceFileName, __patternPosition ); + h2app->getSongEditorPanel()->getSongEditorPatternList()->deletePatternFromList( __oldPatternName, __patternPosition ); } + std::vector< QPoint > empty; + + h2app->getSongEditorPanel()->getSongEditor()->modifyPatternCellsAction( empty, __deleteCells, empty ); h2app->getSongEditorPanel()->getSongEditorPatternList()->loadPatternAction( __patternName, __patternPosition ); } private: QString __patternName; QString __oldPatternName; - QString __sequenceFileName; + std::vector< QPoint > __deleteCells; int __patternPosition; bool __dragFromList; }; From 60d32be2a9cd03c3dd924579daa3392067c89151 Mon Sep 17 00:00:00 2001 From: Colin McEwan Date: Sun, 9 May 2021 23:00:12 +0100 Subject: [PATCH 2/2] Undo doc change --- data/doc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/doc b/data/doc index d0195235b9..a4a06c1891 160000 --- a/data/doc +++ b/data/doc @@ -1 +1 @@ -Subproject commit d0195235b984d5eba388fc1bc58dd611cbe37a65 +Subproject commit a4a06c1891027a597c1453cf75de38132fd694f8