From: <sag...@us...> - 2011-06-12 16:12:11
|
Revision: 897 http://modplug.svn.sourceforge.net/modplug/?rev=897&view=rev Author: saga-games Date: 2011-06-12 16:12:04 +0000 (Sun, 12 Jun 2011) Log Message: ----------- [Fix] Pattern Editor: When overwriting PC notes with normal notes, the pattern cell is now cleared properly. [Ref] GetNumChannels rocks. Modified Paths: -------------- trunk/OpenMPT/mptrack/Undo.cpp trunk/OpenMPT/mptrack/View_pat.cpp Modified: trunk/OpenMPT/mptrack/Undo.cpp =================================================================== --- trunk/OpenMPT/mptrack/Undo.cpp 2011-06-10 23:51:22 UTC (rev 896) +++ trunk/OpenMPT/mptrack/Undo.cpp 2011-06-12 16:12:04 UTC (rev 897) @@ -53,9 +53,9 @@ if (!pSndFile->Patterns.IsValidPat(pattern)) return false; nRows = pSndFile->Patterns[pattern].GetNumRows(); pPattern = pSndFile->Patterns[pattern]; - if ((firstRow >= nRows) || (numChns < 1) || (numRows < 1) || (firstChn >= pSndFile->m_nChannels)) return false; + if ((firstRow >= nRows) || (numChns < 1) || (numRows < 1) || (firstChn >= pSndFile->GetNumChannels())) return false; if (firstRow + numRows >= nRows) numRows = nRows - firstRow; - if (firstChn + numChns >= pSndFile->m_nChannels) numChns = pSndFile->m_nChannels - firstChn; + if (firstChn + numChns >= pSndFile->GetNumChannels()) numChns = pSndFile->GetNumChannels() - firstChn; pUndoData = new MODCOMMAND[numChns * numRows]; if (!pUndoData) return false; @@ -76,12 +76,12 @@ sUndo.numRows = numRows; sUndo.pbuffer = pUndoData; sUndo.linkToPrevious = linkToPrevious; - pPattern += firstChn + firstRow * pSndFile->m_nChannels; + pPattern += firstChn + firstRow * pSndFile->GetNumChannels(); for(ROWINDEX iy = 0; iy < numRows; iy++) { memcpy(pUndoData, pPattern, numChns * sizeof(MODCOMMAND)); pUndoData += numChns; - pPattern += pSndFile->m_nChannels; + pPattern += pSndFile->GetNumChannels(); } UndoBuffer.push_back(sUndo); @@ -129,18 +129,18 @@ nPattern = pUndo->pattern; nRows = pUndo->patternsize; - if(pUndo->firstChannel + pUndo->numChannels <= pSndFile->m_nChannels) + if(pUndo->firstChannel + pUndo->numChannels <= pSndFile->GetNumChannels()) { if((!pSndFile->Patterns[nPattern]) || (pSndFile->Patterns[nPattern].GetNumRows() < nRows)) { - MODCOMMAND *newPattern = CPattern::AllocatePattern(nRows, pSndFile->m_nChannels); + MODCOMMAND *newPattern = CPattern::AllocatePattern(nRows, pSndFile->GetNumChannels()); MODCOMMAND *oldPattern = pSndFile->Patterns[nPattern]; if (!newPattern) return PATTERNINDEX_INVALID; const ROWINDEX nOldRowCount = pSndFile->Patterns[nPattern].GetNumRows(); pSndFile->Patterns[nPattern].SetData(newPattern, nRows); if(oldPattern) { - memcpy(newPattern, oldPattern, pSndFile->m_nChannels * nOldRowCount * sizeof(MODCOMMAND)); + memcpy(newPattern, oldPattern, pSndFile->GetNumChannels() * nOldRowCount * sizeof(MODCOMMAND)); CPattern::FreePattern(oldPattern); } } @@ -148,11 +148,11 @@ pUndoData = pUndo->pbuffer; pPattern = pSndFile->Patterns[nPattern]; if (!pSndFile->Patterns[nPattern]) return PATTERNINDEX_INVALID; - pPattern += pUndo->firstChannel + (pUndo->firstRow * pSndFile->m_nChannels); + pPattern += pUndo->firstChannel + (pUndo->firstRow * pSndFile->GetNumChannels()); for(ROWINDEX iy = 0; iy < pUndo->numRows; iy++) { memcpy(pPattern, pUndoData, pUndo->numChannels * sizeof(MODCOMMAND)); - pPattern += pSndFile->m_nChannels; + pPattern += pSndFile->GetNumChannels(); pUndoData += pUndo->numChannels; } } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-06-10 23:51:22 UTC (rev 896) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-06-12 16:12:04 UTC (rev 897) @@ -986,10 +986,8 @@ // If invalidation on all columns is wanted, extent invalidation area. if(invalidateAllCols) - tmp += LAST_COLUMN - (tmp % 8); + tmp += LAST_COLUMN - GetColTypeFromCursor(tmp); - ASSERT(tmp % 8 <= LAST_COLUMN); - InvalidateArea(m_dwBeginSel, tmp); pModDoc->SetModified(); pModDoc->UpdateAllViews(this, HINT_PATTERNDATA | (m_nPattern << HINT_SHIFT_PAT), NULL); @@ -1191,11 +1189,12 @@ InvalidateRect(&m_rcDropItem, FALSE); const bool duplicate = (nFlags & MK_SHIFT) ? true : false; - vector<CHANNELINDEX> channels(pModDoc->GetNumChannels() + (duplicate ? 1 : 0), 0); + const CHANNELINDEX newChannels = pModDoc->GetNumChannels() + (duplicate ? 1 : 0); + vector<CHANNELINDEX> channels(newChannels, 0); CHANNELINDEX i = 0; bool modified = duplicate; - for(CHANNELINDEX nChn = 0; nChn < pModDoc->GetNumChannels() + (duplicate ? 1 : 0); nChn++) + for(CHANNELINDEX nChn = 0; nChn < newChannels; nChn++) { if(nChn == nTargetNo) { @@ -4397,8 +4396,16 @@ // If record is enabled, create undo point. if(bRecordEnabled) + { pModDoc->GetPatternUndo()->PrepareUndo(nPat, nChn, nRow, 1, 1); + } + // We're overwriting a PC note here. + if(pTarget->IsPcNote() && !MODCOMMAND::IsPcNote(note)) + { + newcmd.Clear(); + } + // -- write note and instrument data. const bool isSplit = HandleSplit(&newcmd, note); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |