From: <sag...@us...> - 2010-03-26 13:23:10
|
Revision: 551 http://modplug.svn.sourceforge.net/modplug/?rev=551&view=rev Author: saga-games Date: 2010-03-26 13:23:03 +0000 (Fri, 26 Mar 2010) Log Message: ----------- [New] Treeview: Sequences can now be copied to other modules by simply dragging the sequence header into the the other module's sequence header. Does only work between two different modules, not within the same module. [Ref] Minor refacotring; AddSequence() now returns the new sequence index for ease of use. Modified Paths: -------------- trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/View_tre.h trunk/OpenMPT/soundlib/ModSequence.cpp trunk/OpenMPT/soundlib/ModSequence.h Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2010-03-25 22:36:06 UTC (rev 550) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2010-03-26 13:23:03 UTC (rev 551) @@ -1770,8 +1770,7 @@ ORDERINDEX startOrd = nOrd; modified = true; - m_SndFile.Order.AddSequence(false); - SEQUENCEINDEX newSeq = m_SndFile.Order.GetNumSequences() - 1; + SEQUENCEINDEX newSeq = m_SndFile.Order.AddSequence(false); m_SndFile.Order.SetSequence(newSeq); // resize new seqeuence if necessary Modified: trunk/OpenMPT/mptrack/Mptrack.h =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h 2010-03-25 22:36:06 UTC (rev 550) +++ trunk/OpenMPT/mptrack/Mptrack.h 2010-03-26 13:23:03 UTC (rev 551) @@ -96,6 +96,7 @@ DRAGONDROP_PATTERN, // | Pattern from a song | Pattern # | NULL | DRAGONDROP_ORDER, // | Pattern index in a song | Order # | NULL | DRAGONDROP_SONG, // | Song file (mod/s3m/xm/it) | 0 | pszFileName | + DRAGONDROP_SEQUENCE // | Sequence (a set of orders) | Sequence # | NULL | }; Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2010-03-25 22:36:06 UTC (rev 550) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2010-03-26 13:23:03 UTC (rev 551) @@ -1940,6 +1940,11 @@ pdropinfo->dwDropType = DRAGONDROP_INSTRUMENT; break; + case MODITEM_SEQUENCE: + case MODITEM_HDR_ORDERS: + pdropinfo->dwDropType = DRAGONDROP_SEQUENCE; + break; + case MODITEM_INSLIB_SAMPLE: case MODITEM_INSLIB_INSTRUMENT: if (m_szSongName[0]) @@ -2000,7 +2005,7 @@ } -BOOL CModTree::CanDrop(HTREEITEM hItem, BOOL bDoDrop) +bool CModTree::CanDrop(HTREEITEM hItem, bool bDoDrop) //--------------------------------------------------- { const uint64 modItemDrop = GetModItem(hItem); @@ -2010,14 +2015,18 @@ const uint32 modItemDragType = GetModItemType(m_qwItemDrag); const uint32 modItemDragID = GetModItemID(m_qwItemDrag); - PMODTREEDOCINFO pInfo = DocInfo[m_nDocNdx]; - CModDoc *pModDoc = (pInfo) ? pInfo->pModDoc : NULL; + const PMODTREEDOCINFO pInfoDrag = DocInfo[m_nDragDocNdx]; + const PMODTREEDOCINFO pInfoDrop = DocInfo[m_nDocNdx]; + CModDoc *pModDoc = (pInfoDrop) ? pInfoDrop->pModDoc : nullptr; + CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : nullptr; + switch(modItemDropType) { case MODITEM_ORDER: case MODITEM_SEQUENCE: - if ((modItemDragType == MODITEM_ORDER) && (pModDoc) && (m_nDocNdx == m_nDragDocNdx)) + if ((modItemDragType == MODITEM_ORDER) && (pModDoc) && (pSndFile) && (m_nDocNdx == m_nDragDocNdx)) { + // drop an order somewhere if (bDoDrop) { SEQUENCEINDEX nSeqFrom = (SEQUENCEINDEX)(modItemDragID >> 16), nSeqTo = (SEQUENCEINDEX)(modItemDropID >> 16); @@ -2026,7 +2035,7 @@ { // drop on sequence -> attach nSeqTo = (SEQUENCEINDEX)(modItemDropID & 0xFFFF); - nOrdTo = pModDoc->GetSoundFile()->Order.GetSequence(nSeqTo).GetLengthTailTrimmed(); + nOrdTo = pSndFile->Order.GetSequence(nSeqTo).GetLengthTailTrimmed(); } if (nSeqFrom != nSeqTo || nOrdFrom != nOrdTo) @@ -2037,9 +2046,36 @@ } } } - return TRUE; + return true; } break; + case MODITEM_HDR_ORDERS: + // Drop your sequences here. + // At the moment, only dropping sequences into another module is possible. + if((modItemDragType == MODITEM_SEQUENCE || modItemDragType == MODITEM_HDR_ORDERS) && pSndFile && pSndFile->GetType() == MOD_TYPE_MPT && pInfoDrag && pModDoc != pInfoDrag->pModDoc) + { + if(bDoDrop) + { + // copy mod sequence over. + CModDoc *pDragDoc = pInfoDrag->pModDoc; + if(pDragDoc == nullptr) return false; + CSoundFile *pDragSndFile = pDragDoc->GetSoundFile(); + if(pDragSndFile == nullptr) return false; + const SEQUENCEINDEX nOrigSeq = (SEQUENCEINDEX)modItemDragID; + const ModSequence *pOrigSeq = &(pDragSndFile->Order.GetSequence(nOrigSeq)); + if(pOrigSeq == nullptr) return false; + + pSndFile->Order.AddSequence(false); + pSndFile->Order.resize(pOrigSeq->GetLength(), pSndFile->Order.GetInvalidPatIndex()); + for(ORDERINDEX nOrd = 0; nOrd < pOrigSeq->GetLengthTailTrimmed(); nOrd++) + { + pSndFile->Order[nOrd] = pDragSndFile->Order.GetSequence(nOrigSeq)[nOrd]; + } + pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, NULL); + pModDoc->SetModified(); + } + return true; + } case MODITEM_SAMPLE: break; case MODITEM_INSTRUMENT: @@ -2058,11 +2094,11 @@ else SetMidiPercussion((DWORD)modItemDropID, szFullPath); } - return TRUE; + return true; } break; } - return FALSE; + return false; } @@ -2170,12 +2206,12 @@ } -void CModTree::OnBeginDrag(HTREEITEM hItem, BOOL bLeft, LRESULT *pResult) +void CModTree::OnBeginDrag(HTREEITEM hItem, bool bLeft, LRESULT *pResult) //----------------------------------------------------------------------- { if (!(m_dwStatus & TREESTATUS_DRAGGING)) { - BOOL bDrag = FALSE; + bool bDrag = false; m_hDropWnd = NULL; m_hItemDrag = hItem; @@ -2191,15 +2227,25 @@ case MODITEM_PATTERN: case MODITEM_SAMPLE: case MODITEM_INSTRUMENT: + case MODITEM_SEQUENCE: case MODITEM_MIDIINSTRUMENT: case MODITEM_MIDIPERCUSSION: case MODITEM_INSLIB_SAMPLE: case MODITEM_INSLIB_INSTRUMENT: case MODITEM_INSLIB_SONG: - bDrag = TRUE; + bDrag = true; break; + case MODITEM_HDR_ORDERS: + // can we drag an order header? (only in MPTM format and if there's only one sequence) + { + CModDoc *pModDoc = DocInfo[m_nDragDocNdx]->pModDoc; + CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : nullptr; + if(pSndFile && pSndFile->GetType() == MOD_TYPE_MPT && pSndFile->Order.GetNumSequences() == 1) + bDrag = true; + } + break; default: - if (m_qwItemDrag & 0x8000) bDrag = TRUE; + if (m_qwItemDrag & 0x8000) bDrag = true; } if (bDrag) { @@ -2218,7 +2264,7 @@ if (pnmhdr) { LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)pnmhdr; - OnBeginDrag(pnmtv->itemNew.hItem, FALSE, pResult); + OnBeginDrag(pnmtv->itemNew.hItem, false, pResult); } } @@ -2229,7 +2275,7 @@ if (pnmhdr) { LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)pnmhdr; - OnBeginDrag(pnmtv->itemNew.hItem, TRUE, pResult); + OnBeginDrag(pnmtv->itemNew.hItem, true, pResult); } } @@ -2616,7 +2662,7 @@ if (rect.PtInRect(point)) { m_hDropWnd = m_hWnd; - BOOL bCanDrop = CanDrop( HitTest(point, &flags), FALSE); + bool bCanDrop = CanDrop( HitTest(point, &flags), false); SetCursor((bCanDrop) ? CMainFrame::curDragging : CMainFrame::curNoDrop2); } else { Modified: trunk/OpenMPT/mptrack/View_tre.h =================================================================== --- trunk/OpenMPT/mptrack/View_tre.h 2010-03-25 22:36:06 UTC (rev 550) +++ trunk/OpenMPT/mptrack/View_tre.h 2010-03-26 13:23:03 UTC (rev 551) @@ -158,7 +158,7 @@ VOID RemoveDocument(CModDoc *pModDoc); VOID UpdateView(UINT nDocNdx, DWORD dwHint); VOID OnUpdate(CModDoc *pModDoc, DWORD dwHint, CObject *pHint); - BOOL CanDrop(HTREEITEM hItem, BOOL bDoDrop); + bool CanDrop(HTREEITEM hItem, bool bDoDrop); VOID UpdatePlayPos(CModDoc *pModDoc, PMPTNOTIFICATION pNotify); bool IsItemExpanded(HTREEITEM hItem); @@ -188,7 +188,7 @@ afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnRButtonUp(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point); - afx_msg void OnBeginDrag(HTREEITEM, BOOL bLeft, LRESULT *pResult); + afx_msg void OnBeginDrag(HTREEITEM, bool bLeft, LRESULT *pResult); afx_msg void OnBeginLDrag(LPNMHDR, LRESULT *pResult); afx_msg void OnBeginRDrag(LPNMHDR, LRESULT *pResult); afx_msg void OnEndDrag(DWORD dwMask); Modified: trunk/OpenMPT/soundlib/ModSequence.cpp =================================================================== --- trunk/OpenMPT/soundlib/ModSequence.cpp 2010-03-25 22:36:06 UTC (rev 550) +++ trunk/OpenMPT/soundlib/ModSequence.cpp 2010-03-26 13:23:03 UTC (rev 551) @@ -291,9 +291,11 @@ } -void ModSequenceSet::AddSequence(bool bDuplicate) -//----------------------------------------------- +SEQUENCEINDEX ModSequenceSet::AddSequence(bool bDuplicate) +//-------------------------------------------------------- { + if(GetNumSequences() == MAX_SEQUENCES) + return SEQUENCEINDEX_INVALID; m_Sequences.push_back(ModSequence(*m_pSndFile, s_nCacheSize)); if (bDuplicate) { @@ -301,6 +303,7 @@ m_Sequences.back().m_sName = ""; // Don't copy sequence name. } SetSequence(GetNumSequences() - 1); + return GetNumSequences() - 1; } Modified: trunk/OpenMPT/soundlib/ModSequence.h =================================================================== --- trunk/OpenMPT/soundlib/ModSequence.h 2010-03-25 22:36:06 UTC (rev 550) +++ trunk/OpenMPT/soundlib/ModSequence.h 2010-03-26 13:23:03 UTC (rev 551) @@ -133,7 +133,7 @@ const ModSequence& GetSequence(SEQUENCEINDEX nSeq); SEQUENCEINDEX GetNumSequences() const {return static_cast<SEQUENCEINDEX>(m_Sequences.size());} void SetSequence(SEQUENCEINDEX); // Sets working sequence. - void AddSequence(bool bDuplicate = true); // Adds new sequence. If bDuplicate is true, new sequence is a duplicate of the old one. + SEQUENCEINDEX AddSequence(bool bDuplicate = true); // Adds new sequence. If bDuplicate is true, new sequence is a duplicate of the old one. Returns the ID of the new sequence. void RemoveSequence() {RemoveSequence(GetCurrentSequenceIndex());} void RemoveSequence(SEQUENCEINDEX); // Removes given sequence SEQUENCEINDEX GetCurrentSequenceIndex() const {return m_nCurrentSeq;} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |