Created
February 24, 2013 22:23
-
-
Save maddievision/5025982 to your computer and use it in GitHub Desktop.
Full song copy/paste
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Index: OpenMPT/mptrack/CommandSet.cpp | |
=================================================================== | |
--- OpenMPT/mptrack/CommandSet.cpp (revision 1533) | |
+++ OpenMPT/mptrack/CommandSet.cpp (working copy) | |
@@ -650,6 +650,8 @@ | |
DefineKeyCommand(kcToggleNoteOffRecordPC, 1895, _T("Toggle Note Off record (PC keyboard)")); | |
DefineKeyCommand(kcToggleNoteOffRecordMIDI, 1896, _T("Toggle Note Off record (MIDI)")); | |
DefineKeyCommand(kcFindInstrument, 1897, _T("Pick up nearest instrument number")); | |
+ DefineKeyCommand(kcEditCopyAllPatterns, 1898, _T("Copy Song")); | |
+ DefineKeyCommand(kcEditPasteAllPatterns, 1899, _T("Paste Song")); | |
// Add new key commands here. | |
Index: OpenMPT/mptrack/CommandSet.h | |
=================================================================== | |
--- OpenMPT/mptrack/CommandSet.h (revision 1533) | |
+++ OpenMPT/mptrack/CommandSet.h (working copy) | |
@@ -98,7 +98,9 @@ | |
kcEditUndo=kcStartEditCommands, | |
kcEditCut, | |
kcEditCopy, | |
+ kcEditCopyAllPatterns, | |
kcEditPaste, | |
+ kcEditPasteAllPatterns, | |
kcEditMixPaste, | |
kcEditMixPasteITStyle, | |
kcEditPasteFlood, | |
@@ -1107,6 +1109,7 @@ | |
kcChnSettingsClose, | |
kcEndChnSettingsCommands = kcChnSettingsClose, | |
+ | |
kcNumCommands, | |
}; | |
Index: OpenMPT/mptrack/Globals.cpp | |
=================================================================== | |
--- OpenMPT/mptrack/Globals.cpp (revision 1533) | |
+++ OpenMPT/mptrack/Globals.cpp (working copy) | |
@@ -197,7 +197,9 @@ | |
ON_MESSAGE(WM_MOD_GETTOOLTIPTEXT, OnGetToolTipText) | |
ON_COMMAND(ID_EDIT_CUT, OnEditCut) | |
ON_COMMAND(ID_EDIT_COPY, OnEditCopy) | |
+ ON_COMMAND(ID_EDIT_COPY_ALL_PATTERNS, OnEditCopyAllPatterns) | |
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) | |
+ ON_COMMAND(ID_EDIT_PASTE_ALL_PATTERNS, OnEditPasteAllPatterns) | |
ON_COMMAND(ID_EDIT_MIXPASTE, OnEditMixPaste) | |
ON_COMMAND(ID_EDIT_MIXPASTE_ITSTYLE, OnEditMixPasteITStyle) | |
ON_COMMAND(ID_EDIT_FIND, OnEditFind) | |
Index: OpenMPT/mptrack/Globals.h | |
=================================================================== | |
--- OpenMPT/mptrack/Globals.h (revision 1533) | |
+++ OpenMPT/mptrack/Globals.h (working copy) | |
@@ -79,6 +79,8 @@ | |
afx_msg void OnEditCut() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_CUT, 0); } //rewbs.customKeys | |
afx_msg void OnEditCopy() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_COPY, 0); } //rewbs.customKeys | |
+ afx_msg void OnEditCopyAllPatterns() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_COPY_ALL_PATTERNS, 0); } //rewbs.customKeys | |
+ afx_msg void OnEditPasteAllPatterns() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_PASTE_ALL_PATTERNS, 0); } //rewbs.customKeys | |
afx_msg void OnEditPaste() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_PASTE, 0); } //rewbs.customKeys | |
afx_msg void OnEditMixPaste() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_MIXPASTE, 0); } //rewbs.mixPaste | |
afx_msg void OnEditMixPasteITStyle() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_MIXPASTE_ITSTYLE, 0); } | |
@@ -168,6 +170,8 @@ | |
afx_msg void OnTabSelchange(NMHDR* pNMHDR, LRESULT* pResult); | |
afx_msg void OnEditCut() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_CUT, 0); } | |
afx_msg void OnEditCopy() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_COPY, 0); } | |
+ afx_msg void OnEditCopyAllPatterns() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_COPY_ALL_PATTERNS, 0); } | |
+ afx_msg void OnEditPasteAllPatterns() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_PASTE_ALL_PATTERNS, 0); } | |
afx_msg void OnEditPaste() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_PASTE, 0); } | |
afx_msg void OnEditMixPaste() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_MIXPASTE, 0); } //rewbs.mixPaste | |
afx_msg void OnEditMixPasteITStyle() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_MIXPASTE_ITSTYLE, 0); } | |
Index: OpenMPT/mptrack/InputHandler.cpp | |
=================================================================== | |
--- OpenMPT/mptrack/InputHandler.cpp (revision 1533) | |
+++ OpenMPT/mptrack/InputHandler.cpp (working copy) | |
@@ -516,7 +516,9 @@ | |
case ID_EDIT_UNDO: s="&Undo\t"; c = kcEditUndo; break; | |
case ID_EDIT_CUT: s="Cu&t\t"; c = kcEditCut; break; | |
case ID_EDIT_COPY: s="&Copy\t"; c = kcEditCopy; break; | |
+ case ID_EDIT_COPY_ALL_PATTERNS: s="Copy Song\t"; c = kcEditCopyAllPatterns; break; | |
case ID_EDIT_PASTE: s="&Paste\t"; c = kcEditPaste; break; | |
+ case ID_EDIT_PASTE_ALL_PATTERNS: s="Paste Song\t"; c = kcEditPasteAllPatterns; break; | |
case ID_EDIT_SELECT_ALL: s="Select &All\t"; c = kcEditSelectAll; break; | |
case ID_EDIT_CLEANUP: s="C&leanup"; break; | |
case ID_EDIT_FIND: s="&Find / Replace\t"; c = kcEditFind; break; | |
@@ -592,7 +594,9 @@ | |
pMenu->ModifyMenu(ID_EDIT_UNDO, MF_BYCOMMAND | MF_STRING, ID_EDIT_UNDO, GetMenuText(ID_EDIT_UNDO)); | |
pMenu->ModifyMenu(ID_EDIT_CUT, MF_BYCOMMAND | MF_STRING, ID_EDIT_CUT, GetMenuText(ID_EDIT_CUT)); | |
pMenu->ModifyMenu(ID_EDIT_COPY, MF_BYCOMMAND | MF_STRING, ID_EDIT_COPY, GetMenuText(ID_EDIT_COPY)); | |
+ pMenu->ModifyMenu(ID_EDIT_COPY_ALL_PATTERNS, MF_BYCOMMAND | MF_STRING, ID_EDIT_COPY_ALL_PATTERNS, GetMenuText(ID_EDIT_COPY_ALL_PATTERNS)); | |
pMenu->ModifyMenu(ID_EDIT_PASTE, MF_BYCOMMAND | MF_STRING, ID_EDIT_PASTE, GetMenuText(ID_EDIT_PASTE)); | |
+ pMenu->ModifyMenu(ID_EDIT_PASTE_ALL_PATTERNS, MF_BYCOMMAND | MF_STRING, ID_EDIT_PASTE_ALL_PATTERNS, GetMenuText(ID_EDIT_PASTE_ALL_PATTERNS)); | |
pMenu->ModifyMenu(ID_EDIT_PASTE_SPECIAL, MF_BYCOMMAND | MF_STRING, ID_EDIT_PASTE_SPECIAL, GetMenuText(ID_EDIT_PASTE_SPECIAL)); | |
pMenu->ModifyMenu(ID_EDIT_MIXPASTE_ITSTYLE, MF_BYCOMMAND | MF_STRING, ID_EDIT_MIXPASTE_ITSTYLE, GetMenuText(ID_EDIT_MIXPASTE_ITSTYLE)); | |
pMenu->ModifyMenu(ID_EDIT_PASTEFLOOD, MF_BYCOMMAND | MF_STRING, ID_EDIT_PASTEFLOOD, GetMenuText(ID_EDIT_PASTEFLOOD)); | |
Index: OpenMPT/mptrack/mptrack.rc | |
=================================================================== | |
--- OpenMPT/mptrack/mptrack.rc (revision 1533) | |
+++ OpenMPT/mptrack/mptrack.rc (working copy) | |
@@ -1981,7 +1981,9 @@ | |
MENUITEM SEPARATOR | |
MENUITEM "Cu&t\tCtrl+X", ID_EDIT_CUT | |
MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY | |
+ MENUITEM "Copy Song", ID_EDIT_COPY_ALL_PATTERNS | |
MENUITEM "&Paste\tCtrl+V", ID_EDIT_PASTE | |
+ MENUITEM "Paste Song", ID_EDIT_PASTE_ALL_PATTERNS | |
POPUP "Paste &Special" | |
BEGIN | |
MENUITEM "&Mix Paste\tCtrl+M", ID_EDIT_PASTE_SPECIAL | |
@@ -2231,9 +2233,11 @@ | |
ID_EDIT_CLEAR "Erase the selection\nErase" | |
ID_EDIT_CLEAR_ALL "Erase everything\nErase All" | |
ID_EDIT_COPY "Copy the selection and put it on the Clipboard\nCopy" | |
+ ID_EDIT_COPY_ALL_PATTERNS "Copy the entire song (except instruments and samples) onto the Clipboard\nCopy" | |
ID_EDIT_CUT "Cut the selection and put it on the Clipboard\nCut" | |
ID_EDIT_FIND "Find the specified text\nFind" | |
ID_EDIT_PASTE "Insert Clipboard contents\nPaste" | |
+ ID_EDIT_PASTE_ALL_PATTERNS "Paste entire song (except instruments and samples) from the Clipboard\nPaste" | |
ID_EDIT_PASTE_SPECIAL "Mix Clipboard contents\nPaste" | |
ID_EDIT_REPEAT "Repeat the last action\nRepeat" | |
ID_EDIT_REPLACE "Replace specific text with different text\nReplace" | |
Index: OpenMPT/mptrack/PatternClipboard.cpp | |
=================================================================== | |
--- OpenMPT/mptrack/PatternClipboard.cpp (revision 1533) | |
+++ OpenMPT/mptrack/PatternClipboard.cpp (working copy) | |
@@ -40,14 +40,13 @@ | |
return format; | |
} | |
- | |
-// Copy a pattern selection to both the system clipboard and the internal clipboard. | |
-bool PatternClipboard::Copy(CSoundFile &sndFile, PATTERNINDEX pattern, PatternRect selection) | |
+// Generate pattern text data for the system clipboard and the internal clipboard. | |
+CString PatternClipboard::GetPatternText(CSoundFile &sndFile, PATTERNINDEX pattern, PatternRect selection) | |
//------------------------------------------------------------------------------------------- | |
{ | |
if(!sndFile.Patterns.IsValidPat(pattern)) | |
{ | |
- return false; | |
+ return ""; | |
} | |
if(selection.GetStartColumn() == PatternCursor::paramColumn) | |
@@ -182,6 +181,16 @@ | |
data.Append("\r\n"); | |
} | |
+ return data; | |
+ | |
+} | |
+ | |
+// Copy a pattern selection to both the system clipboard and the internal clipboard. | |
+bool PatternClipboard::Copy(CSoundFile &sndFile, PATTERNINDEX pattern, PatternRect selection) | |
+//------------------------------------------------------------------------------------------- | |
+{ | |
+ CString data = GetPatternText(sndFile,pattern,selection); | |
+ | |
activeClipboard = 0; | |
if(clipboardSize > 0) | |
@@ -199,7 +208,28 @@ | |
} | |
+// Assign text to both system and internal clipboard. | |
+bool PatternClipboard::SetClipboard(CString data) | |
+//------------------------------------------------------------------------------------------- | |
+{ | |
+ activeClipboard = 0; | |
+ if(clipboardSize > 0) | |
+ { | |
+ // Copy to internal clipboard | |
+ if(clipboards.size() == clipboardSize) | |
+ { | |
+ clipboards.pop_back(); | |
+ } | |
+ | |
+ clipboards.push_front(PatternClipboardElement(data)); | |
+ } | |
+ | |
+ return ToSystemClipboard(data); | |
+ | |
+} | |
+ | |
+ | |
// Try pasting a pattern selection from the system clipboard. | |
bool PatternClipboard::Paste(CSoundFile &sndFile, PATTERNINDEX pattern, const PatternCursor &pastePos, PasteModes mode) | |
//--------------------------------------------------------------------------------------------------------------------- | |
Index: OpenMPT/mptrack/PatternClipboard.h | |
=================================================================== | |
--- OpenMPT/mptrack/PatternClipboard.h (revision 1533) | |
+++ OpenMPT/mptrack/PatternClipboard.h (working copy) | |
@@ -60,8 +60,12 @@ | |
PatternClipboard() : activeClipboard(0) { }; | |
+ // Generate pattern text for both the system clipboard and the internal clipboard | |
+ CString GetPatternText(CSoundFile &sndFile, PATTERNINDEX pattern, PatternRect selection); | |
// Copy a pattern selection to both the system clipboard and the internal clipboard. | |
bool Copy(CSoundFile &sndFile, PATTERNINDEX pattern, PatternRect selection); | |
+ // Assign text to both system and internal clipboard. | |
+ bool SetClipboard(CString data); | |
// Try pasting a pattern selection from the system clipboard. | |
bool Paste(CSoundFile &sndFile, PATTERNINDEX pattern, const PatternCursor &pastePos, PasteModes mode); | |
// Try pasting a pattern selection from an internal clipboard. | |
@@ -79,11 +83,12 @@ | |
// Remove all clipboard contents. | |
void Clear(); | |
+ // Perform the pasting operation. | |
+ bool HandlePaste(CSoundFile &sndFile, PATTERNINDEX pattern, const PatternCursor &pastePos, PasteModes mode, const CString &data); | |
+ | |
protected: | |
CString GetFileExtension(const char *ext) const; | |
- // Perform the pasting operation. | |
- bool HandlePaste(CSoundFile &sndFile, PATTERNINDEX pattern, const PatternCursor &pastePos, PasteModes mode, const CString &data); | |
// Keep the number of clipboards consistent with the maximum number of allowed clipboards. | |
void RestrictClipboardSize(); | |
Index: OpenMPT/mptrack/resource.h | |
=================================================================== | |
--- OpenMPT/mptrack/resource.h (revision 1533) | |
+++ OpenMPT/mptrack/resource.h (working copy) | |
@@ -1213,7 +1213,8 @@ | |
#define ID_SAMPLE_MONOCONVERT_RIGHT 44607 | |
#define ID_SAMPLE_MONOCONVERT_SPLIT 44608 | |
#define ID_SETQUANTIZE 44609 | |
- | |
+#define ID_EDIT_COPY_ALL_PATTERNS 46002 | |
+#define ID_EDIT_PASTE_ALL_PATTERNS 46003 | |
// Next default values for new objects | |
// | |
#ifdef APSTUDIO_INVOKED | |
Index: OpenMPT/mptrack/View_pat.cpp | |
=================================================================== | |
--- OpenMPT/mptrack/View_pat.cpp (revision 1533) | |
+++ OpenMPT/mptrack/View_pat.cpp (working copy) | |
@@ -67,6 +67,8 @@ | |
ON_MESSAGE(WM_MOD_RECORDPARAM, OnRecordPlugParamChange) | |
ON_COMMAND(ID_EDIT_CUT, OnEditCut) | |
ON_COMMAND(ID_EDIT_COPY, OnEditCopy) | |
+ ON_COMMAND(ID_EDIT_COPY_ALL_PATTERNS, OnEditCopyAllPatterns) | |
+ ON_COMMAND(ID_EDIT_PASTE_ALL_PATTERNS, OnEditPasteAllPatterns) | |
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) | |
ON_COMMAND(ID_EDIT_MIXPASTE, OnEditMixPaste) | |
ON_COMMAND(ID_EDIT_MIXPASTE_ITSTYLE,OnEditMixPasteITStyle) | |
@@ -1113,7 +1115,274 @@ | |
OnClearSelection(false); | |
} | |
+static LPCSTR pszSongHdr = "Modplug Tracker Song Data\r\n"; | |
+static LPCSTR pszSongFmt = "%u,%u,%u,%u,%u,%u,%u\r\n"; | |
+static LPCSTR pszPatFmt = "%u,%u,%u\r\n"; | |
+void CViewPattern::OnEditCopyAllPatterns() | |
+//----------------------------- | |
+{ | |
+ CModDoc *pModDoc = GetDocument(); | |
+ const CSoundFile *pSndFile = GetSoundFile(); | |
+ | |
+ if (pModDoc && pSndFile != nullptr) | |
+ { | |
+ BeginWaitCursor(); | |
+ CString data; | |
+ | |
+ data = pszSongHdr; | |
+ int channelCount = pSndFile->GetNumChannels() ; | |
+ int orderCount = pSndFile->Order.GetLength(); | |
+ int patternCount = pSndFile->Patterns.GetNumPatterns(); | |
+ data.AppendFormat(pszSongFmt,channelCount,orderCount,patternCount,pSndFile->m_nDefaultSpeed,pSndFile->m_nDefaultTempo,pSndFile->m_nDefaultRowsPerBeat,pSndFile->m_nDefaultRowsPerMeasure); | |
+ data.Append(pSndFile->GetTitle()); | |
+ data.Append("\r\n"); | |
+ for (int i = 0; i < channelCount; i++) { | |
+ if (i > 0) data.AppendChar(','); | |
+ data.AppendFormat("%u", pSndFile->ChnSettings[i].nVolume); | |
+ } | |
+ data.Append("\r\n"); | |
+ for (int i = 0; i < channelCount; i++) { | |
+ if (i > 0) data.AppendChar(','); | |
+ data.AppendFormat("%u", pSndFile->ChnSettings[i].nPan); | |
+ } | |
+ data.Append("\r\n"); | |
+ for (int i = 0; i < channelCount; i++) { | |
+ if (i > 0) data.AppendChar(','); | |
+ data.AppendFormat("%u", pModDoc->IsChannelMuted(i) ? 0 : 1); | |
+ } | |
+ data.Append("\r\n"); | |
+ for (int i = 0; i < channelCount; i++) { | |
+ if (i > 0) data.AppendChar(','); | |
+ data.AppendFormat("%u", pSndFile->ChnSettings[i].dwFlags.test(CHN_SURROUND) ? 1 : 0); | |
+ } | |
+ data.Append("\r\n"); | |
+ for (int i = 0; i < channelCount; i++) { | |
+ data.Append(pSndFile->ChnSettings[i].szName); | |
+ data.Append("\r\n"); | |
+ } | |
+ for (int i = 0; i < orderCount; i++) { | |
+ if (i > 0) data.AppendChar(','); | |
+ data.AppendFormat("%u", pSndFile->Order[i]); | |
+ } | |
+ data.Append("\r\n"); | |
+ for (int i = 0; i < patternCount; i++) { | |
+ int rowCount = pSndFile->Patterns[i].GetNumRows(); | |
+ data.AppendFormat(pszPatFmt,rowCount,pSndFile->Patterns[i].GetRowsPerBeat(),pSndFile->Patterns[i].GetRowsPerMeasure()); | |
+ data.Append(pSndFile->Patterns[i].GetName()); | |
+ data.Append("\r\n"); | |
+ PatternRect selection = PatternRect(PatternCursor(0), PatternCursor(rowCount - 1, channelCount - 1, PatternCursor::lastColumn)); | |
+ data.Append( | |
+ GetPatternClipboard().GetPatternText(*GetSoundFile(), i, selection) | |
+ ); | |
+ } | |
+ GetPatternClipboard().SetClipboard(data); | |
+ EndWaitCursor(); | |
+ } | |
+} | |
+ | |
+ | |
+//HEADER | |
+//{songFmt} channels,orders,patterns,speed,tempo,rpb,rpm | |
+//songtitle | |
+//channelvolumes,... | |
+//channelpans,... | |
+//channeltitles (one line each) | |
+//orderlist,... | |
+//PATTERNS (for each): | |
+//{patFmt} rows,rpb,rpm | |
+//patternText | |
+ | |
+void CViewPattern::OnEditPasteAllPatterns() | |
+//----------------------------- | |
+{ | |
+ | |
+ CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); | |
+ CModDoc *pModDoc = GetDocument(); | |
+ CSoundFile *pSndFile = GetSoundFile(); | |
+ | |
+ if (!pMainFrm) return; | |
+ BeginWaitCursor(); | |
+ if (!pMainFrm->OpenClipboard()) | |
+ { | |
+ EndWaitCursor(); | |
+ return; | |
+ } | |
+ HGLOBAL hCpy = ::GetClipboardData(CF_TEXT); | |
+ LPCSTR p; | |
+ if ((hCpy) && ((p = (LPSTR)GlobalLock(hCpy)) != NULL)) | |
+ { | |
+ UINT nChannels,nOrders,nPatterns,nSpeed,nTempo,nRpb,nRpm; | |
+ UINT nRows; | |
+ DWORD dwMemSize = GlobalSize(hCpy), dwPos = strlen(pszSongHdr); | |
+ char cTitle[64]; | |
+ char rowLine[4096]; | |
+ if (pModDoc && pSndFile != nullptr) | |
+ { | |
+ BeginWaitCursor(); | |
+ | |
+ DWORD dwPos = strlen(pszSongHdr); | |
+ if ((dwMemSize > dwPos) && (!_strnicmp(p, pszSongHdr, dwPos - 2))) | |
+ { | |
+ | |
+ sscanf(p + dwPos, pszSongFmt, &nChannels, &nOrders, &nPatterns, &nSpeed, &nTempo, &nRpb, &nRpm); | |
+ while ((dwPos < dwMemSize) && (p[dwPos] != '\r') && (p[dwPos] != '\n')) dwPos++; | |
+ dwPos += 2; | |
+ if (p[dwPos] == '\r') { | |
+ cTitle[0] = '\0'; | |
+ } | |
+ else { | |
+ sscanf(p + dwPos, "%[^\r]\r\n", cTitle); | |
+ } | |
+ while ((dwPos < dwMemSize) && (p[dwPos] != '\r') && (p[dwPos] != '\n')) dwPos++; | |
+ | |
+ pSndFile->SetTitle(cTitle,strlen(cTitle)); | |
+ | |
+ pSndFile->m_nDefaultSpeed = nSpeed; | |
+ pSndFile->m_nDefaultTempo = nTempo; | |
+ pSndFile->m_nDefaultRowsPerBeat = nRpb; | |
+ pSndFile->m_nDefaultRowsPerMeasure = nRpm; | |
+ | |
+ pSndFile->m_nChannels = nChannels; | |
+ | |
+ for (int i = 0; i < nChannels; i++) { | |
+ while ((dwPos < dwMemSize) && ((p[dwPos] < '0') || (p[dwPos] > '9'))) dwPos++; | |
+ if (dwPos >= dwMemSize) break; | |
+ int n1 = atoi(p+dwPos); | |
+ pSndFile->ChnSettings[i].nVolume = n1; | |
+ if ((i+1) < nChannels) { | |
+ while ((dwPos < dwMemSize) && (p[dwPos] != ',')) dwPos++; | |
+ } | |
+ if (dwPos >= dwMemSize) break; | |
+ } | |
+ | |
+ while ((dwPos < dwMemSize) && (p[dwPos] != '\r') && (p[dwPos] != '\n')) dwPos++; | |
+ for (int i = 0; i < nChannels; i++) { | |
+ while ((dwPos < dwMemSize) && ((p[dwPos] < '0') || (p[dwPos] > '9'))) dwPos++; | |
+ if (dwPos >= dwMemSize) break; | |
+ int n1 = atoi(p+dwPos); | |
+ pSndFile->ChnSettings[i].nPan = n1; | |
+ if ((i+1) < nChannels) { | |
+ while ((dwPos < dwMemSize) && (p[dwPos] != ',')) dwPos++; | |
+ } | |
+ if (dwPos >= dwMemSize) break; | |
+ } | |
+ | |
+ while ((dwPos < dwMemSize) && (p[dwPos] != '\r') && (p[dwPos] != '\n')) dwPos++; | |
+ for (int i = 0; i < nChannels; i++) { | |
+ while ((dwPos < dwMemSize) && ((p[dwPos] < '0') || (p[dwPos] > '9'))) dwPos++; | |
+ if (dwPos >= dwMemSize) break; | |
+ int n1 = atoi(p+dwPos); | |
+ pSndFile->ChnSettings[i].dwFlags.set(CHN_MUTE, n1 == 0); | |
+ if ((i+1) < nChannels) { | |
+ while ((dwPos < dwMemSize) && (p[dwPos] != ',')) dwPos++; | |
+ } | |
+ if (dwPos >= dwMemSize) break; | |
+ } | |
+ | |
+ while ((dwPos < dwMemSize) && (p[dwPos] != '\r') && (p[dwPos] != '\n')) dwPos++; | |
+ for (int i = 0; i < nChannels; i++) { | |
+ while ((dwPos < dwMemSize) && ((p[dwPos] < '0') || (p[dwPos] > '9'))) dwPos++; | |
+ if (dwPos >= dwMemSize) break; | |
+ int n1 = atoi(p+dwPos); | |
+ pSndFile->ChnSettings[i].dwFlags.set(CHN_SURROUND, n1 == 1); | |
+ if ((i+1) < nChannels) { | |
+ while ((dwPos < dwMemSize) && (p[dwPos] != ',')) dwPos++; | |
+ } | |
+ if (dwPos >= dwMemSize) break; | |
+ } | |
+ | |
+ while ((dwPos < dwMemSize) && (p[dwPos] != '\r') && (p[dwPos] != '\n')) dwPos++; | |
+ for (int i = 0; i < nChannels; i++) { | |
+ dwPos += 2; | |
+ if (p[dwPos] == '\r') { | |
+ cTitle[0] = '\0'; | |
+ } | |
+ else { | |
+ sscanf(p + dwPos, "%[^\r]\r\n", cTitle); | |
+ } | |
+ strcpy(pSndFile->ChnSettings[i].szName,cTitle); | |
+ while ((dwPos < dwMemSize) && (p[dwPos] != '\r') && (p[dwPos] != '\n')) dwPos++; | |
+ } | |
+ | |
+ | |
+ | |
+ | |
+ | |
+ pSndFile->Order.clear(); | |
+ while ((dwPos < dwMemSize) && (p[dwPos] != '\r') && (p[dwPos] != '\n')) dwPos++; | |
+ for (int i = 0; i < nOrders; i++) { | |
+ while ((dwPos < dwMemSize) && ((p[dwPos] < '0') || (p[dwPos] > '9'))) dwPos++; | |
+ if (dwPos >= dwMemSize) break; | |
+ int n1 = atoi(p+dwPos); | |
+ pSndFile->Order.Append(n1); | |
+ if ((i+1) < nOrders) { | |
+ while ((dwPos < dwMemSize) && (p[dwPos] != ',')) dwPos++; | |
+ } | |
+ if (dwPos >= dwMemSize) break; | |
+ } | |
+ | |
+ | |
+ | |
+ pSndFile->Patterns.ClearPatterns(); | |
+ | |
+ CString data; | |
+ while ((dwPos < dwMemSize) && (p[dwPos] != '\r') && (p[dwPos] != '\n')) dwPos++; | |
+ dwPos += 2; | |
+ for (int i = 0; i < nPatterns; i++) { | |
+ sscanf(p + dwPos, pszPatFmt, &nRows, &nRpb, &nRpm); | |
+ while ((dwPos < dwMemSize) && (p[dwPos] != '\r') && (p[dwPos] != '\n')) dwPos++; | |
+ dwPos += 2; | |
+ if (p[dwPos] == '\r') { | |
+ cTitle[0] = '\0'; | |
+ } | |
+ else { | |
+ sscanf(p + dwPos, "%[^\r]\r\n", cTitle); | |
+ } | |
+ | |
+ pSndFile->Patterns.Insert(nRows); | |
+ pSndFile->Patterns[i].SetName(cTitle); | |
+ pSndFile->Patterns[i].SetSignature(nRpb,nRpm); | |
+ while ((dwPos < dwMemSize) && (p[dwPos] != '\r') && (p[dwPos] != '\n')) dwPos++; | |
+ dwPos += 2; | |
+ int lnLimit = nRows + 1; | |
+ int lnCount = 0; | |
+ DWORD dwStart = dwPos; | |
+ memset(rowLine,0,4096); | |
+ data = ""; | |
+ while (dwPos < dwMemSize && lnCount < lnLimit) { | |
+ if (p[dwPos] == '\n') { | |
+ lnCount++; | |
+ dwPos++; | |
+ memcpy(rowLine,p + dwStart,dwPos - dwStart ); | |
+ data.Append(rowLine); | |
+ printf("StrLen %d Line: %s\n",strlen(rowLine),rowLine); | |
+ dwStart = dwPos; | |
+ memset(rowLine,0,4096); | |
+ } | |
+ else { | |
+ dwPos++; | |
+ } | |
+ } | |
+ | |
+ GetPatternClipboard().HandlePaste(*GetSoundFile(),i,PatternCursor(0),PatternClipboard::pmOverwrite,data); | |
+ } | |
+ | |
+ pSndFile->SetCurrentOrder(0); | |
+ pSndFile->SetCurrentPos(0); | |
+ EndWaitCursor(); | |
+ GlobalUnlock(hCpy); | |
+ CloseClipboard(); | |
+ GetDocument()->SetModified(); | |
+ GetDocument()->UpdateAllViews(NULL, 0xFFFFF, NULL); | |
+ //InvalidatePattern(false); | |
+ | |
+ } | |
+ EndWaitCursor(); | |
+ } | |
+ } | |
+} | |
+ | |
void CViewPattern::OnEditCopy() | |
//----------------------------- | |
{ | |
@@ -4340,6 +4609,8 @@ | |
case kcEditFindNext: OnEditFindNext(); return wParam; | |
case kcEditCut: OnEditCut(); return wParam; | |
case kcEditCopy: OnEditCopy(); return wParam; | |
+ case kcEditCopyAllPatterns: OnEditCopyAllPatterns(); return wParam; | |
+ case kcEditPasteAllPatterns: OnEditPasteAllPatterns(); return wParam; | |
case kcCopyAndLoseSelection: | |
{ | |
OnEditCopy(); | |
@@ -6001,7 +6272,9 @@ | |
HMENU pasteSpecialMenu = ::CreatePopupMenu(); | |
AppendMenu(hMenu, MF_STRING, ID_EDIT_CUT, "Cut\t" + ih->GetKeyTextFromCommand(kcEditCut)); | |
AppendMenu(hMenu, MF_STRING, ID_EDIT_COPY, "Copy\t" + ih->GetKeyTextFromCommand(kcEditCopy)); | |
+ AppendMenu(hMenu, MF_STRING, ID_EDIT_COPY_ALL_PATTERNS, "Copy Song\t" + ih->GetKeyTextFromCommand(kcEditCopyAllPatterns)); | |
AppendMenu(hMenu, MF_STRING, ID_EDIT_PASTE, "Paste\t" + ih->GetKeyTextFromCommand(kcEditPaste)); | |
+ AppendMenu(hMenu, MF_STRING, ID_EDIT_PASTE_ALL_PATTERNS, "Paste Song\t" + ih->GetKeyTextFromCommand(kcEditPasteAllPatterns)); | |
AppendMenu(hMenu, MF_POPUP, reinterpret_cast<UINT_PTR>(pasteSpecialMenu), "Paste Special"); | |
AppendMenu(pasteSpecialMenu, MF_STRING, ID_EDIT_MIXPASTE, "Mix Paste\t" + ih->GetKeyTextFromCommand(kcEditMixPaste)); | |
AppendMenu(pasteSpecialMenu, MF_STRING, ID_EDIT_MIXPASTE_ITSTYLE, "Mix Paste (IT Style)\t" + ih->GetKeyTextFromCommand(kcEditMixPasteITStyle)); | |
@@ -6684,6 +6957,7 @@ | |
bool CViewPattern::PastePattern(PATTERNINDEX nPattern, const PatternCursor &pastePos, PatternClipboard::PasteModes mode) | |
//---------------------------------------------------------------------------------------------------------------------- | |
{ | |
+ | |
BeginWaitCursor(); | |
bool result = GetPatternClipboard().Paste(*GetSoundFile(), nPattern, pastePos, mode); | |
EndWaitCursor(); | |
Index: OpenMPT/mptrack/View_pat.h | |
=================================================================== | |
--- OpenMPT/mptrack/View_pat.h (revision 1533) | |
+++ OpenMPT/mptrack/View_pat.h (working copy) | |
@@ -334,8 +334,9 @@ | |
afx_msg void OnKillFocus(CWnd *pNewWnd); | |
afx_msg void OnEditCut(); | |
afx_msg void OnEditCopy(); | |
- | |
+ afx_msg void OnEditCopyAllPatterns(); | |
afx_msg void OnEditPaste() { ExecutePaste(PatternClipboard::pmOverwrite); }; | |
+ afx_msg void OnEditPasteAllPatterns(); | |
afx_msg void OnEditMixPaste() { ExecutePaste(PatternClipboard::pmMixPaste); }; | |
afx_msg void OnEditMixPasteITStyle() { ExecutePaste(PatternClipboard::pmMixPasteIT); }; | |
afx_msg void OnEditPasteFlood() { ExecutePaste(PatternClipboard::pmPasteFlood); }; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment