From: <sag...@us...> - 2010-07-23 22:44:44
|
Revision: 658 http://modplug.svn.sourceforge.net/modplug/?rev=658&view=rev Author: saga-games Date: 2010-07-23 22:44:37 +0000 (Fri, 23 Jul 2010) Log Message: ----------- [Fix] Treeview: Deleting a sample from the treeview and then applying undo for this sample in the sample editor crashed OpenMPT. Modified Paths: -------------- trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/View_tre.cpp Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2010-07-18 23:05:20 UTC (rev 657) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2010-07-23 22:44:37 UTC (rev 658) @@ -1683,8 +1683,8 @@ if ((m_dwBeginSel >= m_dwEndSel) || (m_dwEndSel - m_dwBeginSel + 4 >= len)) { - if (MessageBox("Remove this sample ?", "Remove Sample", MB_YESNOCANCEL | MB_ICONQUESTION) != IDYES) return; - pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_delete, 0, pSmp->nLength); + if (MessageBox("Remove this sample?", "Remove Sample", MB_YESNOCANCEL | MB_ICONQUESTION) != IDYES) return; + pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); BEGIN_CRITICAL(); pSndFile->DestroySample(m_nSample); END_CRITICAL(); @@ -2081,12 +2081,12 @@ void CViewSample::OnChar(UINT /*nChar*/, UINT, UINT /*nFlags*/) -//----------------------------------------------------- +//------------------------------------------------------------- { } void CViewSample::PlayNote(UINT note, const uint32 nStartPos) -//------------------------------------------------------------ +//----------------------------------------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = GetDocument(); @@ -2567,7 +2567,7 @@ } LRESULT CViewSample::OnCustomKeyMsg(WPARAM wParam, LPARAM /*lParam*/) -//--------------------------------------------------------------- +//------------------------------------------------------------------- { if (wParam == kcNull) return NULL; @@ -2608,12 +2608,12 @@ case kcNoteCut: PlayNote(NOTE_NOTECUT); return wParam; } - if (wParam>=kcSampStartNotes && wParam<=kcSampEndNotes) + if (wParam >= kcSampStartNotes && wParam <= kcSampEndNotes) { - PlayNote(wParam-kcSampStartNotes+1+pMainFrm->GetBaseOctave()*12); + PlayNote(wParam - kcSampStartNotes + 1 + pMainFrm->GetBaseOctave() * 12); return wParam; } - if (wParam>=kcSampStartNoteStops && wParam<=kcSampEndNoteStops) + if (wParam >= kcSampStartNoteStops && wParam <= kcSampEndNoteStops) { m_dwStatus &= ~SMPSTATUS_KEYDOWN; return wParam; Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2010-07-18 23:05:20 UTC (rev 657) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2010-07-23 22:44:37 UTC (rev 658) @@ -1403,14 +1403,15 @@ case MODITEM_SEQUENCE: if (pModDoc && pSndFile) { - wsprintf(s, _T("Delete sequence %d?"), modItemID & 0xFFFF); + wsprintf(s, _T("Remove sequence %d?"), modItemID); if(MessageBox(s, _T("Confirmation"), MB_YESNO | MB_DEFBUTTON2) == IDNO) break; - pSndFile->Order.RemoveSequence((SEQUENCEINDEX)(modItemID & 0xFFFF)); + pSndFile->Order.RemoveSequence((SEQUENCEINDEX)(modItemID)); pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, NULL); } break; case MODITEM_ORDER: + // might be slightly annoying to ask for confirmation here, and it's rather easy to restore the orderlist anyway. if ((pModDoc) && (pModDoc->RemoveOrder((SEQUENCEINDEX)(modItemID >> 16), (ORDERINDEX)(modItemID & 0xFFFF)))) { pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, NULL); @@ -1418,27 +1419,28 @@ break; case MODITEM_PATTERN: - wsprintf(s, _T("Delete pattern %d?"), modItemID & 0xFFFF); - if(MessageBox(s, _T("Confirmation"), MB_YESNO | MB_DEFBUTTON2) == IDNO) break; - if ((pModDoc) && (pModDoc->RemovePattern((PATTERNINDEX)modItemID))) + wsprintf(s, _T("Remove pattern %d?"), modItemID); + if (pModDoc == nullptr || MessageBox(s, _T("Confirmation"), MB_YESNO | MB_DEFBUTTON2) == IDNO) break; + if (pModDoc->RemovePattern((PATTERNINDEX)modItemID)) { pModDoc->UpdateAllViews(NULL, (UINT(modItemID) << HINT_SHIFT_PAT) | HINT_PATTERNDATA|HINT_PATNAMES); } break; case MODITEM_SAMPLE: - wsprintf(s, _T("Delete sample %d?"), modItemID & 0xFFFF); - if(MessageBox(s, _T("Confirmation"), MB_YESNO | MB_DEFBUTTON2) == IDNO) break; - if ((pModDoc) && (pModDoc->RemoveSample((SAMPLEINDEX)modItemID))) + wsprintf(s, _T("Remove sample %d?"), modItemID); + if (pModDoc == nullptr || MessageBox(s, _T("Confirmation"), MB_YESNO | MB_DEFBUTTON2) == IDNO) break; + pModDoc->GetSampleUndo()->PrepareUndo((SAMPLEINDEX)modItemID, sundo_replace); + if (pModDoc->RemoveSample((SAMPLEINDEX)modItemID)) { pModDoc->UpdateAllViews(NULL, (UINT(modItemID) << HINT_SHIFT_SMP) | HINT_SMPNAMES|HINT_SAMPLEDATA|HINT_SAMPLEINFO); } break; case MODITEM_INSTRUMENT: - wsprintf(s, _T("Delete instrument %d?"), modItemID & 0xFFFF); - if(MessageBox(s, _T("Confirmation"), MB_YESNO | MB_DEFBUTTON2) == IDNO) break; - if ((pModDoc) && (pModDoc->RemoveInstrument((INSTRUMENTINDEX)modItemID))) + wsprintf(s, _T("Remove instrument %d?"), modItemID); + if (pModDoc == nullptr || MessageBox(s, _T("Confirmation"), MB_YESNO | MB_DEFBUTTON2) == IDNO) break; + if (pModDoc->RemoveInstrument((INSTRUMENTINDEX)modItemID)) { pModDoc->UpdateAllViews(NULL, (UINT(modItemID) << HINT_SHIFT_INS) | HINT_MODTYPE|HINT_ENVELOPE|HINT_INSTRUMENT); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |