From: <sv...@op...> - 2024-08-03 12:44:11
|
Author: sagamusix Date: Sat Aug 3 14:43:58 2024 New Revision: 21317 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=21317 Log: [New] When increasing pattern size, there is now an option to repeat the exising pattern contents to the newly-added rows (https://bugs.openmpt.org/view.php?id=431). Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp trunk/OpenMPT/mptrack/mptrack.rc Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp ============================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Wed Jul 31 14:38:00 2024 (r21316) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Sat Aug 3 14:43:58 2024 (r21317) @@ -287,15 +287,16 @@ const ROWINDEX newSize = (ROWINDEX)GetDlgItemInt(IDC_COMBO1, NULL, FALSE); // Check if any pattern data would be removed. - bool resize = (newSize != sndFile.Patterns[m_nPattern].GetNumRows()); - bool resizeAtEnd = IsDlgButtonChecked(IDC_RADIO2) != BST_UNCHECKED; - if(newSize < sndFile.Patterns[m_nPattern].GetNumRows()) + const ROWINDEX oldSize = pattern.GetNumRows(); + bool resize = newSize != oldSize; + const bool resizeAtEnd = IsDlgButtonChecked(IDC_RADIO2) != BST_UNCHECKED; + if(newSize < pattern.GetNumRows()) { ROWINDEX firstRow = resizeAtEnd ? newSize : 0; - ROWINDEX lastRow = resizeAtEnd ? sndFile.Patterns[m_nPattern].GetNumRows() : sndFile.Patterns[m_nPattern].GetNumRows() - newSize; + ROWINDEX lastRow = resizeAtEnd ? oldSize : oldSize - newSize; for(ROWINDEX row = firstRow; row < lastRow; row++) { - if(!sndFile.Patterns[m_nPattern].IsEmptyRow(row)) + if(!pattern.IsEmptyRow(row)) { resize = (Reporting::Confirm(MPT_AFORMAT("Data at the {} of the pattern will be lost.\nDo you want to continue?")(resizeAtEnd ? "end" : "start"), "Shrink Pattern") == cnfYes); break; @@ -305,10 +306,25 @@ if(resize) { + const bool copyContents = (newSize > oldSize) && IsDlgButtonChecked(IDC_CHECK2) != BST_UNCHECKED; modDoc.BeginWaitCursor(); - modDoc.GetPatternUndo().PrepareUndo(m_nPattern, 0, 0, sndFile.Patterns[m_nPattern].GetNumChannels(), sndFile.Patterns[m_nPattern].GetNumRows(), "Resize"); + modDoc.GetPatternUndo().PrepareUndo(m_nPattern, 0, 0, sndFile.Patterns[m_nPattern].GetNumChannels(), oldSize, "Resize"); if(sndFile.Patterns[m_nPattern].Resize(newSize, true, resizeAtEnd)) { + if(copyContents) + { + const ROWINDEX copyRows = newSize - oldSize; + const ROWINDEX sourceBaseRow = resizeAtEnd ? 0 : copyRows; + const ROWINDEX baseOffset = resizeAtEnd ? 0 : (oldSize - copyRows % oldSize); + ROWINDEX destRow = resizeAtEnd ? oldSize : 0; + for(ROWINDEX row = 0; row < copyRows; row++, destRow++) + { + ROWINDEX sourceRow = sourceBaseRow + (baseOffset + row) % oldSize; + const auto sourceRowData = pattern.GetRow(sourceRow); + auto destRowData = pattern.GetRow(destRow); + std::copy(sourceRowData.begin(), sourceRowData.end(), destRowData.begin()); + } + } modDoc.SetModified(); } modDoc.EndWaitCursor(); Modified: trunk/OpenMPT/mptrack/mptrack.rc ============================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc Wed Jul 31 14:38:00 2024 (r21316) +++ trunk/OpenMPT/mptrack/mptrack.rc Sat Aug 3 14:43:58 2024 (r21317) @@ -1854,27 +1854,29 @@ CONTROL "Replace &All (No confirmation)",IDC_CHECK8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,126,186,10 END -IDD_PATTERN_PROPERTIES DIALOGEX 0, 0, 191, 149 +IDD_PATTERN_PROPERTIES DIALOGEX 0, 0, 191, 170 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Pattern Properties" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - LTEXT "Rows:",IDC_STATIC,6,6,108,8 + LTEXT "&Rows:",IDC_STATIC,6,6,108,8 COMBOBOX IDC_COMBO1,6,18,48,93,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&/2",IDC_BUTTON_HALF,60,18,18,12 PUSHBUTTON "&x2",IDC_BUTTON_DOUBLE,84,18,18,12 LTEXT "Remove rows from / Add rows at:",IDC_STATIC,6,36,126,8 CONTROL "&Top of Pattern",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,6,48,84,12 CONTROL "&Bottom of Pattern",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,90,48,84,12 - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,66,174,1 - CONTROL "Override &song signature:",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,72,108,12 - PUSHBUTTON "Configure S&wing",IDC_BUTTON1,114,72,66,12 - LTEXT "Rows per beat",IDC_STATIC,54,92,126,8 - EDITTEXT IDC_ROWSPERBEAT,18,90,30,12,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Rows per measure",IDC_STATIC,54,110,126,8 - EDITTEXT IDC_ROWSPERMEASURE,18,108,30,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,126,174,1 - LTEXT "Pattern Info",IDC_TEXT1,6,132,174,14 + CONTROL "Repeat pattern contents when &adding rows",IDC_CHECK2, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,66,168,10 + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,84,174,1 + CONTROL "Override &song signature:",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,90,108,12 + PUSHBUTTON "Configure S&wing",IDC_BUTTON1,114,90,66,12 + LTEXT "Rows per b&eat",IDC_STATIC,54,111,126,8 + EDITTEXT IDC_ROWSPERBEAT,18,108,30,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Rows per &measure",IDC_STATIC,54,128,126,8 + EDITTEXT IDC_ROWSPERMEASURE,18,127,30,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,144,174,1 + LTEXT "Pattern Info",IDC_TEXT1,6,151,174,14 DEFPUSHBUTTON "&OK",IDOK,132,6,50,14 PUSHBUTTON "&Cancel",IDCANCEL,132,24,50,14 END @@ -2429,7 +2431,7 @@ LEFTMARGIN, 4 RIGHTMARGIN, 187 TOPMARGIN, 4 - BOTTOMMARGIN, 145 + BOTTOMMARGIN, 166 END IDD_PATTERN_EDITCOMMAND, DIALOG |