From: <sag...@us...> - 2015-06-16 13:06:41
|
Revision: 5325 http://sourceforge.net/p/modplug/code/5325 Author: saga-games Date: 2015-06-16 13:06:34 +0000 (Tue, 16 Jun 2015) Log Message: ----------- [Fix] Pattern tab: Don't let the prev/next pattern display get confused when follow song is enabled and the user clicks on an invalid pattern index in the order list. [Fix] Pattern tab: Properly show prev/next patterns when jumping around in the order list with follow song disabled. Modified Paths: -------------- trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2015-06-16 11:03:37 UTC (rev 5324) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2015-06-16 13:06:34 UTC (rev 5325) @@ -361,7 +361,8 @@ } else { if(pTuning) - { // Drawing custom note names + { + // Drawing custom note names std::string noteStr = pTuning->GetNoteName(static_cast<CTuning::NOTEINDEXTYPE>(note-NOTE_MIDDLEC)); if(noteStr.size() < 3) noteStr.resize(3, ' '); @@ -369,11 +370,11 @@ DrawLetter(x, y, noteStr[0], pfnt->nNoteWidth / 2, 0); DrawLetter(x + pfnt->nNoteWidth / 2, y, noteStr[1], pfnt->nNoteWidth / 2, 0); DrawLetter(x + pfnt->nNoteWidth, y, noteStr[2], pfnt->nOctaveWidth, 0); - } - else //Original + } else { - UINT o = (note-1) / 12; //Octave - UINT n = (note-1) % 12; //Note + // Original + UINT o = (note - NOTE_MIN) / 12; //Octave + UINT n = (note - NOTE_MIN) % 12; //Note m_Dib.TextBlt(x, y, pfnt->nNoteWidth, pfnt->spacingY, xsrc, ysrc+(n+1)*pfnt->spacingY, pfnt->dib); if(o <= 9) m_Dib.TextBlt(x+pfnt->nNoteWidth, y, pfnt->nOctaveWidth, pfnt->spacingY, @@ -577,6 +578,12 @@ } ypaint += m_szHeader.cy; + ORDERINDEX curOrder; + if(IsLiveRecord() && m_nPlayOrd < sndFile.Order.size()) + curOrder = m_nPlayOrd; + else + curOrder = static_cast<ORDERINDEX>(SendCtrlMessage(CTRLMSG_GETCURRENTORDER)); + if (m_nMidRow) { if (yofs >= m_nMidRow) @@ -590,13 +597,12 @@ // Display previous pattern if (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_SHOWPREVIOUS) { - const ORDERINDEX startOrder = static_cast<ORDERINDEX>(SendCtrlMessage(CTRLMSG_GETCURRENTORDER)); - if(startOrder > 0) + if(curOrder > 0) { - ORDERINDEX prevOrder = sndFile.Order.GetPreviousOrderIgnoringSkips(startOrder); + ORDERINDEX prevOrder = sndFile.Order.GetPreviousOrderIgnoringSkips(curOrder); //Skip +++ items - if(startOrder < sndFile.Order.size() && sndFile.Order[startOrder] == m_nPattern) + if(curOrder < sndFile.Order.size() && sndFile.Order[curOrder] == m_nPattern) { nPrevPat = sndFile.Order[prevOrder]; } @@ -639,14 +645,12 @@ if ((nVisRows > 0) && (m_nMidRow)) { PATTERNINDEX nNextPat = PATTERNINDEX_INVALID; - const ORDERINDEX startOrder= static_cast<ORDERINDEX>(SendCtrlMessage(CTRLMSG_GETCURRENTORDER)); - - ORDERINDEX nNextOrder = sndFile.Order.GetNextOrderIgnoringSkips(startOrder); - if(nNextOrder == startOrder) nNextOrder = ORDERINDEX_INVALID; + ORDERINDEX nNextOrder = sndFile.Order.GetNextOrderIgnoringSkips(curOrder); + if(nNextOrder == curOrder) nNextOrder = ORDERINDEX_INVALID; //Ignore skip items(+++) from sequence. const ORDERINDEX ordCount = sndFile.Order.GetLength(); - if(nNextOrder < ordCount && sndFile.Order[startOrder] == m_nPattern) + if(nNextOrder < ordCount && sndFile.Order[curOrder] == m_nPattern) { nNextPat = sndFile.Order[nNextOrder]; } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2015-06-16 11:03:37 UTC (rev 5324) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2015-06-16 13:06:34 UTC (rev 5325) @@ -66,7 +66,7 @@ ON_WM_DESTROY() ON_MESSAGE(WM_MOD_KEYCOMMAND, OnCustomKeyMsg) //rewbs.customKeys ON_MESSAGE(WM_MOD_MIDIMSG, OnMidiMsg) - ON_MESSAGE(WM_MOD_RECORDPARAM, OnRecordPlugParamChange) + ON_MESSAGE(WM_MOD_RECORDPARAM, OnRecordPlugParamChange) ON_COMMAND(ID_EDIT_CUT, OnEditCut) ON_COMMAND(ID_EDIT_COPY, OnEditCopy) ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) @@ -183,6 +183,7 @@ memset(splitActiveNoteChannel, 0xFF, sizeof(splitActiveNoteChannel)); memset(activeNoteChannel, 0xFF, sizeof(activeNoteChannel)); m_nPlayPat = PATTERNINDEX_INVALID; + m_nPlayOrd = ORDERINDEX_INVALID; m_nPlayRow = 0; m_nPlayTick = 0; m_nMidRow = 0; @@ -613,21 +614,29 @@ } -bool CViewPattern::SetPlayCursor(PATTERNINDEX nPat, ROWINDEX nRow) -//---------------------------------------------------------------- +bool CViewPattern::SetPlayCursor(ORDERINDEX ord, PATTERNINDEX pat, ROWINDEX row) +//------------------------------------------------------------------------------ { - PATTERNINDEX nOldPat = m_nPlayPat; - ROWINDEX nOldRow = m_nPlayRow; + ORDERINDEX oldOrd = m_nPlayOrd; + PATTERNINDEX oldPat = m_nPlayPat; + ROWINDEX oldRow = m_nPlayRow; - if ((nPat == m_nPlayPat) && (nRow == m_nPlayRow)) + if (ord == m_nPlayOrd && pat == m_nPlayPat && row == m_nPlayRow) return true; - m_nPlayPat = nPat; - m_nPlayRow = nRow; - if (nOldPat == m_nPattern) - InvalidateRow(nOldRow); - if (m_nPlayPat == m_nPattern) - InvalidateRow(m_nPlayRow); + m_nPlayOrd = ord; + m_nPlayPat = pat; + m_nPlayRow = row; + if (oldOrd != m_nPlayOrd) + { + InvalidatePattern(true); + } else + { + if (oldPat == m_nPattern) + InvalidateRow(oldRow); + if (m_nPlayPat == m_nPattern) + InvalidateRow(m_nPlayRow); + } return true; } @@ -3775,7 +3784,7 @@ updateOrderList = false; } } - SetPlayCursor(nPat, nRow); + SetPlayCursor(nOrd, nPat, nRow); m_nPlayTick = pnotify->tick; } } @@ -3790,7 +3799,7 @@ MemsetZero(ChnVUMeters); // Also zero all non-visible VU meters if((m_Status & (psFollowSong | psDragActive)) == psFollowSong) { - SetPlayCursor(PATTERNINDEX_INVALID, ROWINDEX_INVALID); + SetPlayCursor(ORDERINDEX_INVALID, PATTERNINDEX_INVALID, ROWINDEX_INVALID); } } @@ -4156,7 +4165,7 @@ return m_nPattern; case VIEWMSG_SETCURRENTPATTERN: - if (m_nPattern != (UINT)lParam) SetCurrentPattern(lParam); + SetCurrentPattern(lParam); break; case VIEWMSG_GETCURRENTPOS: Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2015-06-16 11:03:37 UTC (rev 5324) +++ trunk/OpenMPT/mptrack/View_pat.h 2015-06-16 13:06:34 UTC (rev 5325) @@ -163,8 +163,9 @@ UINT m_nMidRow, m_nSpacing, m_nAccelChar, m_nLastPlayedRow, m_nLastPlayedOrder; FlagSet<PatternStatus> m_Status; ROWINDEX m_nPlayRow; - UINT m_nPlayTick; + uint32 m_nPlayTick; PATTERNINDEX m_nPattern, m_nPlayPat; + ORDERINDEX m_nPlayOrd; int32 m_nTransposeAmount; int m_nXScroll, m_nYScroll; @@ -269,7 +270,7 @@ // This should be used instead of consecutive calls to SetCurrentRow() then SetCurrentColumn() bool SetCursorPosition(const PatternCursor &cursor, bool wrap = false); bool DragToSel(const PatternCursor &cursor, bool scrollHorizontal, bool scrollVertical, bool noMove = false); - bool SetPlayCursor(PATTERNINDEX nPat, ROWINDEX nRow); + bool SetPlayCursor(ORDERINDEX ord, PATTERNINDEX pat, ROWINDEX row); bool UpdateScrollbarPositions(bool updateHorizontalScrollbar = true); BYTE EnterNote(UINT nNote, UINT nIns=0, BOOL bCheck=FALSE, int vol=-1, BOOL bMultiCh=FALSE); bool ShowEditWindow(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |