Skip to content

Instantly share code, notes, and snippets.

@maddievision
Created February 24, 2013 22:23
Show Gist options
  • Save maddievision/5025982 to your computer and use it in GitHub Desktop.
Save maddievision/5025982 to your computer and use it in GitHub Desktop.
Full song copy/paste
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