From: <sv...@op...> - 2024-10-26 15:15:51
|
Author: sagamusix Date: Sat Oct 26 17:15:39 2024 New Revision: 21980 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=21980 Log: [New] Comments tab: In addition to copying sample / instrument texts, they can now be pasted as well. Regular copy/paste shortcuts can now be used on the sample / instrument lists. Modified: trunk/OpenMPT/mptrack/Clipboard.h trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/mptrack/view_com.cpp trunk/OpenMPT/mptrack/view_com.h Modified: trunk/OpenMPT/mptrack/Clipboard.h ============================================================================== --- trunk/OpenMPT/mptrack/Clipboard.h Sat Oct 26 17:13:35 2024 (r21979) +++ trunk/OpenMPT/mptrack/Clipboard.h Sat Oct 26 17:15:39 2024 (r21980) @@ -40,7 +40,7 @@ bool IsValid() const { - return m_opened && m_hCpy && m_data.data(); + return m_opened && m_data.data(); } template<typename T> @@ -57,7 +57,15 @@ std::string_view GetString() const { if(m_data.data()) - return { mpt::byte_cast<const char *>(m_data.data()), m_data.size() }; + return {mpt::byte_cast<const char *>(m_data.data()), m_data.size()}; + else + return {}; + } + + std::wstring_view GetWideString() const + { + if(m_data.data() && m_clipFormat == CF_UNICODETEXT) + return {static_cast<const wchar_t *>(static_cast<const void *>(m_data.data())), m_data.size() / sizeof(wchar_t)}; else return {}; } Modified: trunk/OpenMPT/mptrack/resource.h ============================================================================== --- trunk/OpenMPT/mptrack/resource.h Sat Oct 26 17:13:35 2024 (r21979) +++ trunk/OpenMPT/mptrack/resource.h Sat Oct 26 17:15:39 2024 (r21980) @@ -1209,7 +1209,6 @@ #define ID_ENVELOPE_TOGGLERELEASENODE 43154 #define ID_ENVELOPE_SCALEPOINTS 43155 #define ID_VIEW_MIDIMAPPING 43156 -#define ID_COPY_ALL_NAMES 43157 #define ID_PATTERN_DELETEROWGLOBAL 43158 #define ID_PATTERN_INSERTROWGLOBAL 43159 #define ID_PATTERN_DELETEALLROWGLOBAL 43160 Modified: trunk/OpenMPT/mptrack/view_com.cpp ============================================================================== --- trunk/OpenMPT/mptrack/view_com.cpp Sat Oct 26 17:13:35 2024 (r21979) +++ trunk/OpenMPT/mptrack/view_com.cpp Sat Oct 26 17:15:39 2024 (r21980) @@ -20,6 +20,7 @@ #include "Mainfrm.h" #include "Moddoc.h" #include "Mptrack.h" +#include "Reporting.h" #include "resource.h" #include "TrackerSettings.h" #include "WindowMessages.h" @@ -86,17 +87,18 @@ //{{AFX_MSG_MAP(CViewComments) ON_WM_SIZE() ON_WM_DESTROY() - ON_MESSAGE(WM_MOD_KEYCOMMAND, &CViewComments::OnCustomKeyMsg) - ON_MESSAGE(WM_MOD_MIDIMSG, &CViewComments::OnMidiMsg) - ON_COMMAND(IDC_LIST_SAMPLES, &CViewComments::OnShowSamples) - ON_COMMAND(IDC_LIST_INSTRUMENTS, &CViewComments::OnShowInstruments) - ON_COMMAND(IDC_LIST_PATTERNS, &CViewComments::OnShowPatterns) - ON_COMMAND(ID_COPY_ALL_NAMES, &CViewComments::OnCopyNames) - ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_DETAILS, &CViewComments::OnEndLabelEdit) - ON_NOTIFY(LVN_BEGINLABELEDIT, IDC_LIST_DETAILS, &CViewComments::OnBeginLabelEdit) - ON_NOTIFY(NM_DBLCLK, IDC_LIST_DETAILS, &CViewComments::OnDblClickListItem) - ON_NOTIFY(NM_RCLICK, IDC_LIST_DETAILS, &CViewComments::OnRClickListItem) - ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST_DETAILS, &CViewComments::OnCustomDrawList) + ON_MESSAGE(WM_MOD_KEYCOMMAND, &CViewComments::OnCustomKeyMsg) + ON_MESSAGE(WM_MOD_MIDIMSG, &CViewComments::OnMidiMsg) + ON_COMMAND(IDC_LIST_SAMPLES, &CViewComments::OnShowSamples) + ON_COMMAND(IDC_LIST_INSTRUMENTS, &CViewComments::OnShowInstruments) + ON_COMMAND(IDC_LIST_PATTERNS, &CViewComments::OnShowPatterns) + ON_COMMAND(ID_EDIT_COPY, &CViewComments::OnCopyNames) + ON_COMMAND(ID_EDIT_PASTE, &CViewComments::OnPasteNames) + ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_DETAILS, &CViewComments::OnEndLabelEdit) + ON_NOTIFY(LVN_BEGINLABELEDIT, IDC_LIST_DETAILS, &CViewComments::OnBeginLabelEdit) + ON_NOTIFY(NM_DBLCLK, IDC_LIST_DETAILS, &CViewComments::OnDblClickListItem) + ON_NOTIFY(NM_RCLICK, IDC_LIST_DETAILS, &CViewComments::OnRClickListItem) + ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST_DETAILS, &CViewComments::OnCustomDrawList) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -256,6 +258,14 @@ { m_ItemList.EditLabel(item - 1); return wParam; + } else if(wParam == kcEditCopy) + { + OnCopyNames(); + return wParam; + } else if(wParam == kcEditPaste) + { + OnPasteNames(); + return wParam; } return kcNull; } @@ -681,8 +691,10 @@ void CViewComments::OnRClickListItem(NMHDR *, LRESULT *) { + const auto ih = CMainFrame::GetMainFrame()->GetInputHandler(); HMENU menu = ::CreatePopupMenu(); - ::AppendMenu(menu, MF_STRING, ID_COPY_ALL_NAMES, _T("&Copy Names")); + ::AppendMenu(menu, MF_STRING, ID_EDIT_COPY, ih->GetKeyTextFromCommand(kcEditCopy, _T("&Copy Names"))); + ::AppendMenu(menu, MF_STRING | (IsClipboardFormatAvailable(CF_UNICODETEXT) ? 0 : MF_DISABLED), ID_EDIT_PASTE, ih->GetKeyTextFromCommand(kcEditPaste, _T("&Paste Names"))); CPoint pt; ::GetCursorPos(&pt); ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, m_hWnd, NULL); @@ -745,4 +757,55 @@ } +void CViewComments::OnPasteNames() +{ + Clipboard clipboard(CF_UNICODETEXT); + if(!clipboard.IsValid()) + return; + + if(Reporting::Confirm(MPT_UFORMAT("Replace all {} names?")(m_nListId == IDC_LIST_INSTRUMENTS ? U_("instrument") : U_("sample"))) != cnfYes) + return; + + auto whitespace = mpt::default_whitespace<std::wstring>(); + whitespace.push_back(L'\0'); + const auto names = mpt::split(mpt::trim_right(std::wstring{clipboard.GetWideString()}, whitespace), std::wstring{L"\n"}); + + CSoundFile &sndFile = GetDocument()->GetSoundFile(); + const auto FormatName = [&](size_t index, size_t maxLength) + { + if(index >= names.size()) + return std::string{}; + return mpt::replace(mpt::ToCharset(sndFile.GetCharsetInternal(), names[index]), "\t", " ").substr(0, maxLength); + }; + + CriticalSection cs; + if(m_nListId == IDC_LIST_SAMPLES) + { + if(sndFile.GetNumSamples() < names.size()) + sndFile.m_nSamples = std::min(sndFile.GetModSpecifications().samplesMax, mpt::saturate_cast<SAMPLEINDEX>(names.size())); + + for(SAMPLEINDEX i = 1; i <= sndFile.GetNumSamples(); i++) + { + sndFile.m_szNames[i] = FormatName(i - 1, sndFile.GetModSpecifications().sampleNameLengthMax); + } + cs.Leave(); + GetDocument()->UpdateAllViews(SampleHint().Names()); + } else if(m_nListId == IDC_LIST_INSTRUMENTS) + { + if(sndFile.GetNumInstruments() < names.size()) + sndFile.m_nInstruments = std::min(sndFile.GetModSpecifications().instrumentsMax, mpt::saturate_cast<INSTRUMENTINDEX>(names.size())); + + for(INSTRUMENTINDEX i = 1; i <= sndFile.GetNumInstruments(); i++) + { + if(sndFile.Instruments[i] || sndFile.AllocateInstrument(i)) + sndFile.Instruments[i]->name = FormatName(i - 1, sndFile.GetModSpecifications().instrNameLengthMax); + } + cs.Leave(); + GetDocument()->UpdateAllViews(InstrumentHint().Names()); + } + + GetDocument()->SetModified(); +} + + OPENMPT_NAMESPACE_END Modified: trunk/OpenMPT/mptrack/view_com.h ============================================================================== --- trunk/OpenMPT/mptrack/view_com.h Sat Oct 26 17:13:35 2024 (r21979) +++ trunk/OpenMPT/mptrack/view_com.h Sat Oct 26 17:15:39 2024 (r21980) @@ -63,6 +63,7 @@ afx_msg void OnRClickListItem(NMHDR *, LRESULT *); afx_msg void OnCustomDrawList(NMHDR *pNMHDR, LRESULT *pResult); afx_msg void OnCopyNames(); + afx_msg void OnPasteNames(); afx_msg LRESULT OnMidiMsg(WPARAM midiData, LPARAM); afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); //}}AFX_MSG |