bool CFrameAction::SaveState(CMainFrame *pMainFrm) { // Perform action CFrameEditor *pFrameEditor = pMainFrm->GetFrameEditor(); CFamiTrackerView *pView = (CFamiTrackerView*)pMainFrm->GetActiveView(); CFamiTrackerDoc *pDocument = pView->GetDocument(); m_iUndoFramePos = pView->GetSelectedFrame(); m_iUndoChannelPos = pView->GetSelectedChannel(); switch (m_iAction) { case ACT_ADD: if (!pDocument->InsertFrame(m_iUndoFramePos + 1)) return false; pDocument->UpdateAllViews(NULL, CHANGED_FRAMES); break; case ACT_REMOVE: SaveFrame(pDocument); if (!pDocument->RemoveFrame(m_iUndoFramePos)) return false; pDocument->UpdateAllViews(NULL, CHANGED_FRAMES); break; case ACT_DUPLICATE: if (!pDocument->DuplicateFrame(m_iUndoFramePos)) return false; pDocument->UpdateAllViews(NULL, CHANGED_FRAMES); break; case ACT_DUPLICATE_PATTERNS: if (!pDocument->DuplicatePatterns(m_iUndoFramePos + 1)) return false; pDocument->UpdateAllViews(NULL, CHANGED_FRAMES); break; case ACT_CHANGE_COUNT: m_iUndoFrameCount = pDocument->GetFrameCount(); pDocument->SetFrameCount(m_iNewFrameCount); pDocument->UpdateAllViews(NULL, CHANGED_FRAMES); break; case ACT_SET_PATTERN: m_iOldPattern = pDocument->GetPatternAtFrame(m_iUndoFramePos, m_iUndoChannelPos); pDocument->SetPatternAtFrame(m_iUndoFramePos, m_iUndoChannelPos, m_iNewPattern); pDocument->UpdateAllViews(NULL, CHANGED_PATTERN); break; case ACT_SET_PATTERN_ALL: { int Channels = pDocument->GetAvailableChannels(); for (int i = 0; i < Channels; ++i) { m_iPatterns[i] = pDocument->GetPatternAtFrame(m_iUndoFramePos, i); pDocument->SetPatternAtFrame(m_iUndoFramePos, i, m_iNewPattern); } pDocument->UpdateAllViews(NULL, CHANGED_PATTERN); } break; case ACT_CHANGE_PATTERN: { m_iOldPattern = pDocument->GetPatternAtFrame(m_iUndoFramePos, m_iUndoChannelPos); int NewPattern = m_iOldPattern + m_iPatternDelta; if (NewPattern < 0) NewPattern = 0; if (NewPattern >= MAX_FRAMES) NewPattern = MAX_FRAMES - 1; if (NewPattern == m_iOldPattern) return false; pDocument->SetPatternAtFrame(m_iUndoFramePos, m_iUndoChannelPos, NewPattern); pDocument->UpdateAllViews(NULL, CHANGED_PATTERN); } break; case ACT_CHANGE_PATTERN_ALL: { int Channels = pDocument->GetAvailableChannels(); for (int i = 0; i < Channels; ++i) { m_iPatterns[i] = pDocument->GetPatternAtFrame(m_iUndoFramePos, i); if (m_iPatterns[i] + m_iPatternDelta < 0 || m_iPatterns[i] + m_iPatternDelta >= MAX_FRAMES) return false; } for (int i = 0; i < Channels; ++i) pDocument->SetPatternAtFrame(m_iUndoFramePos, i, m_iPatterns[i] + m_iPatternDelta); pDocument->UpdateAllViews(NULL, CHANGED_PATTERN); } break; case ACT_MOVE_DOWN: if (!pDocument->MoveFrameDown(m_iUndoFramePos)) return false; pView->SelectFrame(m_iUndoFramePos + 1); pDocument->UpdateAllViews(NULL, CHANGED_FRAMES); break; case ACT_MOVE_UP: if (!pDocument->MoveFrameUp(m_iUndoFramePos)) return false; pView->SelectFrame(m_iUndoFramePos - 1); pDocument->UpdateAllViews(NULL, CHANGED_FRAMES); break; case ACT_PASTE: SaveFrame(pDocument); { int Channels = pDocument->GetAvailableChannels(); for (int i = 0; i < Channels; ++i) pDocument->SetPatternAtFrame(m_iUndoFramePos, i, m_iPasteData[i]); } pDocument->UpdateAllViews(NULL, CHANGED_PATTERN); break; } return true; }
void CFrameAction::Redo(CMainFrame *pMainFrm) { // Redo action CFamiTrackerView *pView = (CFamiTrackerView*)pMainFrm->GetActiveView(); CFamiTrackerDoc *pDocument = pView->GetDocument(); switch (m_iAction) { case ACT_ADD: pDocument->InsertFrame(m_iUndoFramePos + 1); pDocument->UpdateAllViews(NULL, CHANGED_FRAMES); break; case ACT_REMOVE: pDocument->RemoveFrame(m_iUndoFramePos); pDocument->UpdateAllViews(NULL, CHANGED_FRAMES); break; case ACT_DUPLICATE: pDocument->DuplicateFrame(m_iUndoFramePos); pDocument->UpdateAllViews(NULL, CHANGED_FRAMES); break; case ACT_DUPLICATE_PATTERNS: pDocument->DuplicatePatterns(m_iUndoFramePos + 1); pDocument->UpdateAllViews(NULL, CHANGED_FRAMES); break; case ACT_CHANGE_COUNT: pDocument->SetFrameCount(m_iNewFrameCount); pDocument->UpdateAllViews(NULL, CHANGED_FRAMES); break; case ACT_SET_PATTERN: pDocument->SetPatternAtFrame(m_iUndoFramePos, m_iUndoChannelPos, m_iNewPattern); pDocument->UpdateAllViews(NULL, CHANGED_PATTERN); pMainFrm->UpdateControls(); break; case ACT_SET_PATTERN_ALL: { int Channels = pDocument->GetAvailableChannels(); for (int i = 0; i < Channels; ++i) { pDocument->SetPatternAtFrame(m_iUndoFramePos, i, m_iNewPattern); } pDocument->UpdateAllViews(NULL, CHANGED_PATTERN); } break; case ACT_CHANGE_PATTERN: pDocument->SetPatternAtFrame(m_iUndoFramePos, m_iUndoChannelPos, m_iOldPattern + m_iPatternDelta); pDocument->UpdateAllViews(NULL, CHANGED_PATTERN); break; case ACT_CHANGE_PATTERN_ALL: { int Channels = pDocument->GetAvailableChannels(); for (int i = 0; i < Channels; ++i) { pDocument->SetPatternAtFrame(m_iUndoFramePos, i, m_iPatterns[i] + m_iPatternDelta); } pDocument->UpdateAllViews(NULL, CHANGED_PATTERN); } break; case ACT_MOVE_DOWN: pDocument->MoveFrameDown(m_iUndoFramePos); pDocument->UpdateAllViews(NULL, CHANGED_FRAMES); break; case ACT_MOVE_UP: pDocument->MoveFrameUp(m_iUndoFramePos); pDocument->UpdateAllViews(NULL, CHANGED_FRAMES); break; case ACT_PASTE: { int Channels = pDocument->GetAvailableChannels(); for (int i = 0; i < Channels; ++i) pDocument->SetPatternAtFrame(m_iUndoFramePos, i, m_iPasteData[i]); } pDocument->UpdateAllViews(NULL, CHANGED_PATTERN); break; } pView->SelectFrame(m_iRedoFramePos); pView->SelectChannel(m_iRedoChannelPos); }