You can subscribe to this list here.
2006 |
Jan
|
Feb
|
Mar
(1) |
Apr
(1) |
May
|
Jun
(1) |
Jul
|
Aug
(10) |
Sep
|
Oct
|
Nov
|
Dec
(3) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(1) |
Feb
(2) |
Mar
(3) |
Apr
(2) |
May
(10) |
Jun
(2) |
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
(3) |
Dec
|
2008 |
Jan
(6) |
Feb
(4) |
Mar
(5) |
Apr
(2) |
May
(1) |
Jun
(1) |
Jul
(4) |
Aug
(6) |
Sep
(2) |
Oct
(9) |
Nov
(1) |
Dec
(4) |
2009 |
Jan
(9) |
Feb
(2) |
Mar
(2) |
Apr
(2) |
May
(6) |
Jun
(18) |
Jul
(33) |
Aug
(39) |
Sep
(33) |
Oct
(24) |
Nov
(23) |
Dec
(22) |
2010 |
Jan
(29) |
Feb
(32) |
Mar
(51) |
Apr
(17) |
May
(31) |
Jun
(21) |
Jul
(32) |
Aug
(28) |
Sep
(35) |
Oct
(27) |
Nov
(11) |
Dec
(13) |
2011 |
Jan
(14) |
Feb
(13) |
Mar
(27) |
Apr
(27) |
May
(28) |
Jun
(20) |
Jul
(43) |
Aug
(52) |
Sep
(66) |
Oct
(61) |
Nov
(11) |
Dec
(8) |
2012 |
Jan
(20) |
Feb
(30) |
Mar
(38) |
Apr
(21) |
May
(33) |
Jun
(21) |
Jul
(25) |
Aug
(9) |
Sep
(24) |
Oct
(42) |
Nov
(27) |
Dec
(41) |
2013 |
Jan
(20) |
Feb
(35) |
Mar
(156) |
Apr
(298) |
May
(258) |
Jun
(201) |
Jul
(105) |
Aug
(60) |
Sep
(193) |
Oct
(245) |
Nov
(280) |
Dec
(194) |
2014 |
Jan
(63) |
Feb
(202) |
Mar
(200) |
Apr
(23) |
May
(53) |
Jun
(105) |
Jul
(18) |
Aug
(26) |
Sep
(110) |
Oct
(187) |
Nov
(97) |
Dec
(74) |
2015 |
Jan
(45) |
Feb
(55) |
Mar
(116) |
Apr
(116) |
May
(193) |
Jun
(164) |
Jul
(50) |
Aug
(111) |
Sep
(98) |
Oct
(71) |
Nov
(103) |
Dec
(63) |
2016 |
Jan
(33) |
Feb
(101) |
Mar
(182) |
Apr
(139) |
May
(140) |
Jun
(103) |
Jul
(165) |
Aug
(286) |
Sep
(208) |
Oct
(127) |
Nov
(97) |
Dec
(54) |
2017 |
Jan
(64) |
Feb
(335) |
Mar
(202) |
Apr
(212) |
May
(139) |
Jun
(127) |
Jul
(294) |
Aug
(154) |
Sep
(170) |
Oct
(152) |
Nov
(156) |
Dec
(62) |
2018 |
Jan
(168) |
Feb
(237) |
Mar
(196) |
Apr
(174) |
May
(174) |
Jun
(161) |
Jul
(127) |
Aug
(88) |
Sep
(149) |
Oct
(66) |
Nov
(52) |
Dec
(135) |
2019 |
Jan
(146) |
Feb
(126) |
Mar
(104) |
Apr
(58) |
May
(60) |
Jun
(28) |
Jul
(197) |
Aug
(129) |
Sep
(141) |
Oct
(148) |
Nov
(63) |
Dec
(100) |
2020 |
Jan
(74) |
Feb
(37) |
Mar
(59) |
Apr
(154) |
May
(194) |
Jun
(133) |
Jul
(313) |
Aug
(197) |
Sep
(49) |
Oct
(162) |
Nov
(143) |
Dec
(57) |
2021 |
Jan
(120) |
Feb
(107) |
Mar
(314) |
Apr
(157) |
May
(524) |
Jun
(169) |
Jul
(72) |
Aug
(133) |
Sep
(135) |
Oct
(146) |
Nov
(198) |
Dec
(325) |
2022 |
Jan
(409) |
Feb
(249) |
Mar
(138) |
Apr
(95) |
May
(102) |
Jun
(221) |
Jul
(66) |
Aug
(120) |
Sep
(192) |
Oct
(131) |
Nov
(53) |
Dec
(171) |
2023 |
Jan
(357) |
Feb
(82) |
Mar
(168) |
Apr
(218) |
May
(196) |
Jun
(86) |
Jul
(115) |
Aug
(49) |
Sep
(190) |
Oct
(102) |
Nov
(45) |
Dec
(76) |
2024 |
Jan
(86) |
Feb
(50) |
Mar
(324) |
Apr
(209) |
May
(197) |
Jun
(232) |
Jul
(194) |
Aug
(247) |
Sep
(219) |
Oct
(266) |
Nov
(328) |
Dec
(304) |
2025 |
Jan
(191) |
Feb
(115) |
Mar
(137) |
Apr
(32) |
May
(126) |
Jun
(403) |
Jul
(202) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <sv...@op...> - 2024-11-21 13:33:45
|
Author: sagamusix Date: Thu Nov 21 14:33:33 2024 New Revision: 22255 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22255 Log: [Mod] Tree view: Gray out "Open with Explorer" item for modules that have not been saved yet. Modified: trunk/OpenMPT/mptrack/View_tre.cpp Modified: trunk/OpenMPT/mptrack/View_tre.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp Wed Nov 20 22:32:04 2024 (r22254) +++ trunk/OpenMPT/mptrack/View_tre.cpp Thu Nov 21 14:33:33 2024 (r22255) @@ -3053,7 +3053,7 @@ AppendMenu(hMenu, MF_STRING, defaultID, ih->GetKeyTextFromCommand(kcTreeViewOpen, _T("&View"))); AppendMenu(hMenu, MF_STRING, ID_MODTREE_CLOSE, _T("&Close")); AppendMenu(hMenu, MF_STRING, ID_MODTREE_RENAME, ih->GetKeyTextFromCommand(kcTreeViewRename, _T("Re&name"))); - AppendMenu(hMenu, MF_STRING, ID_MODTREE_OPENITEM, _T("&Open in Explorer")); + AppendMenu(hMenu, MF_STRING | ((!modDoc || modDoc->GetPathNameMpt().empty()) ? MF_GRAYED : 0), ID_MODTREE_OPENITEM, _T("&Open in Explorer")); break; case MODITEM_COMMENTS: |
From: <sv...@op...> - 2024-11-20 21:32:18
|
Author: sagamusix Date: Wed Nov 20 22:32:04 2024 New Revision: 22254 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22254 Log: [Imp] Channel Manager Dialog: Add tooltips. Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp trunk/OpenMPT/mptrack/ChannelManagerDlg.h Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp ============================================================================== --- trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp Wed Nov 20 22:07:34 2024 (r22253) +++ trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp Wed Nov 20 22:32:04 2024 (r22254) @@ -33,23 +33,25 @@ ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() ON_WM_LBUTTONDOWN() + ON_WM_LBUTTONDBLCLK() ON_WM_RBUTTONUP() ON_WM_RBUTTONDOWN() + ON_WM_RBUTTONDBLCLK() ON_WM_MBUTTONDOWN() ON_WM_CLOSE() - ON_COMMAND(IDC_BUTTON1, &CChannelManagerDlg::OnApply) - ON_COMMAND(IDC_BUTTON2, &CChannelManagerDlg::OnClose) - ON_COMMAND(IDC_BUTTON3, &CChannelManagerDlg::OnSelectAll) - ON_COMMAND(IDC_BUTTON4, &CChannelManagerDlg::OnInvert) - ON_COMMAND(IDC_BUTTON5, &CChannelManagerDlg::OnAction1) - ON_COMMAND(IDC_BUTTON6, &CChannelManagerDlg::OnAction2) - ON_COMMAND(IDC_BUTTON7, &CChannelManagerDlg::OnStore) - ON_COMMAND(IDC_BUTTON8, &CChannelManagerDlg::OnRestore) - ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &CChannelManagerDlg::OnTabSelchange) - - ON_WM_LBUTTONDBLCLK() - ON_WM_RBUTTONDBLCLK() + ON_COMMAND(IDC_BUTTON1, &CChannelManagerDlg::OnApply) + ON_COMMAND(IDC_BUTTON2, &CChannelManagerDlg::OnClose) + ON_COMMAND(IDC_BUTTON3, &CChannelManagerDlg::OnSelectAll) + ON_COMMAND(IDC_BUTTON4, &CChannelManagerDlg::OnInvert) + ON_COMMAND(IDC_BUTTON5, &CChannelManagerDlg::OnAction1) + ON_COMMAND(IDC_BUTTON6, &CChannelManagerDlg::OnAction2) + ON_COMMAND(IDC_BUTTON7, &CChannelManagerDlg::OnStore) + ON_COMMAND(IDC_BUTTON8, &CChannelManagerDlg::OnRestore) + + ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &CChannelManagerDlg::OnTabSelchange) + ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CChannelManagerDlg::OnToolTipText) + END_MESSAGE_MAP() CChannelManagerDlg * CChannelManagerDlg::sharedInstance_ = nullptr; @@ -171,6 +173,7 @@ m_buttonHeight = HighDPISupport::ScalePixels(CM_BT_HEIGHT, m_hWnd); ::ShowWindow(::GetDlgItem(m_hWnd, IDC_BUTTON1), SW_HIDE); + EnableToolTips(); ResetState(true, true, true, true); @@ -186,6 +189,62 @@ } +INT_PTR CChannelManagerDlg::OnToolHitTest(CPoint point, TOOLINFO *pTI) const +{ + CRect rect; + pTI->hwnd = m_hWnd; + pTI->uId = ButtonHit(point, &rect); + pTI->rect = rect; + pTI->lpszText = LPSTR_TEXTCALLBACK; + if(pTI->uId == CHANNELINDEX_INVALID) + return -1; + return pTI->uId; +} + + +BOOL CChannelManagerDlg::OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *) +{ + TOOLTIPTEXT *pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); + if((pTTT->uFlags & TTF_IDISHWND) || !m_ModDoc || pNMHDR->idFrom >= m_states.size()) + return FALSE; + + CString text; + const CHANNELINDEX chn = m_states[pNMHDR->idFrom].sourceChn; + const auto &chnSettings = m_ModDoc->GetSoundFile().ChnSettings[chn]; + if(!chnSettings.szName.empty()) + text = MPT_CFORMAT("{}: {}")(chn + 1, mpt::ToWin(m_ModDoc->GetSoundFile().GetCharsetInternal(), chnSettings.szName)); + else + text = MPT_CFORMAT("Channel {}")(chn + 1); + + switch(m_currentTab) + { + case kSoloMute: + text += chnSettings.dwFlags[CHN_MUTE] ? _T(" (Muted)") : _T(" (Unmuted)"); + break; + case kRecordSelect: + switch(m_ModDoc->GetChannelRecordGroup(chn)) + { + case RecordGroup::NoGroup: text += _T(" (No Record Group)"); break; + case RecordGroup::Group1: text += _T(" (Record Group 1)"); break; + case RecordGroup::Group2: text += _T(" (Record Group 2)"); break; + } + break; + case kPluginState: + text += chnSettings.dwFlags[CHN_NOFX] ? _T(" (Plugins Bypassed)") : _T(" (Plugins Enabled)"); + break; + case kReorderRemove: + if(m_states[pNMHDR->idFrom].removed) + text += _T(" (Marked for Removal)"); + break; + case kNumTabs: + MPT_ASSERT_NOTREACHED(); + break; + } + mpt::String::WriteCStringBuf(pTTT->szText) = text; + return TRUE; +} + + void CChannelManagerDlg::OnApply() { if(!m_ModDoc) return; Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.h ============================================================================== --- trunk/OpenMPT/mptrack/ChannelManagerDlg.h Wed Nov 20 22:07:34 2024 (r22253) +++ trunk/OpenMPT/mptrack/ChannelManagerDlg.h Wed Nov 20 22:32:04 2024 (r22254) @@ -98,9 +98,11 @@ //{{AFX_VIRTUAL(CChannelManagerDlg) BOOL OnInitDialog() override; + void OnDPIChanged() override; + INT_PTR OnToolHitTest(CPoint point, TOOLINFO *pTI) const override; //}}AFX_VIRTUAL //{{AFX_MSG(CChannelManagerDlg) - void OnDPIChanged() override; + afx_msg BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *); afx_msg void OnApply(); afx_msg void OnClose(); afx_msg void OnSelectAll(); |
From: <sv...@op...> - 2024-11-20 21:07:44
|
Author: sagamusix Date: Wed Nov 20 22:07:34 2024 New Revision: 22253 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22253 Log: [Imp] MIDI Mapping Dialog: Improve sizing behaviour. Modified: trunk/OpenMPT/mptrack/mptrack.rc Modified: trunk/OpenMPT/mptrack/mptrack.rc ============================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc Wed Nov 20 22:04:32 2024 (r22252) +++ trunk/OpenMPT/mptrack/mptrack.rc Wed Nov 20 22:07:34 2024 (r22253) @@ -3590,24 +3590,24 @@ IDD_MIDIPARAMCONTROL AFX_DIALOG_LAYOUT BEGIN 0, + 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 50, 0, + 50, 0, 0, 0, + 50, 0, 50, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, + 0, 0, 50, 0, + 50, 0, 0, 0, + 50, 0, 50, 0, + 100, 0, 0, 0, + 100, 0, 0, 0, + 100, 0, 0, 0, 0, 0, 100, 100, 100, 0, 0, 100, 100, 100, 0, 0 |
From: <sv...@op...> - 2024-11-20 21:04:47
|
Author: sagamusix Date: Wed Nov 20 22:04:32 2024 New Revision: 22252 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22252 Log: [Imp] Make tooltips on disabled controls work regardless of z-order of surrounding group boxes. They were no longer working in the general tab (lower half) and sample tab (upper half) due to some recent dialog restructuring. Now we can put them in the correct logical tab order, which should help with accessibility. [Ref] Tooltip retrieval code no longer needs to make assumptions about the size of the provided char array - we directly return CStrings now. Modified: trunk/OpenMPT/mptrack/Childfrm.cpp trunk/OpenMPT/mptrack/Childfrm.h trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Ctrl_gen.h trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_ins.h trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_pat.h trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Ctrl_smp.h trunk/OpenMPT/mptrack/DialogBase.cpp trunk/OpenMPT/mptrack/DialogBase.h trunk/OpenMPT/mptrack/Globals.cpp trunk/OpenMPT/mptrack/Globals.h trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/View_gen.h trunk/OpenMPT/mptrack/WindowMessages.h trunk/OpenMPT/mptrack/mptrack.rc Modified: trunk/OpenMPT/mptrack/Childfrm.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Childfrm.cpp Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/Childfrm.cpp Wed Nov 20 22:04:32 2024 (r22252) @@ -49,8 +49,6 @@ ON_MESSAGE(WM_DPICHANGED_AFTERPARENT, &CChildFrame::OnDPIChangedAfterParent) ON_MESSAGE(WM_MOD_CHANGEVIEWCLASS, &CChildFrame::OnChangeViewClass) ON_MESSAGE(WM_MOD_INSTRSELECTED, &CChildFrame::OnInstrumentSelected) - // toolbar "tooltip" notification - ON_NOTIFY_EX_RANGE(TTN_NEEDTEXT, 0, 0xFFFF, &CChildFrame::OnToolTipText) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -375,44 +373,6 @@ } -BOOL CChildFrame::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult) -{ - auto pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); - TCHAR szFullText[256] = _T(""); - CString strTipText; - - UINT_PTR nID = pNMHDR->idFrom; - if (pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - nID = static_cast<UINT_PTR>(::GetDlgCtrlID(reinterpret_cast<HWND>(nID))); - } - - if ((nID >= 1000) && (nID < 65536) && (m_hWndCtrl) && (::SendMessage(m_hWndCtrl, WM_MOD_GETTOOLTIPTEXT, nID, (LPARAM)szFullText))) - { - strTipText = szFullText; - } else - { - // allow top level routing frame to handle the message - if (GetRoutingFrame() != NULL) return FALSE; - if (nID != 0) // will be zero on a separator - { - AfxLoadString((UINT)nID, szFullText); - // this is the command id, not the button index - AfxExtractSubString(strTipText, szFullText, 1, _T('\n')); - } - } - mpt::String::WriteCStringBuf(pTTT->szText) = strTipText; - *pResult = 0; - - // bring the tooltip window above other popup windows - ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, - SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); - - return TRUE; // message was handled -} - - LRESULT CChildFrame::OnChangeViewClass(WPARAM wParam, LPARAM lParam) { CModControlDlg *pDlg = (CModControlDlg *)lParam; Modified: trunk/OpenMPT/mptrack/Childfrm.h ============================================================================== --- trunk/OpenMPT/mptrack/Childfrm.h Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/Childfrm.h Wed Nov 20 22:04:32 2024 (r22252) @@ -159,7 +159,6 @@ afx_msg void OnMDIActivate(BOOL bActivate, CWnd *pActivateWnd, CWnd *pDeactivateWnd); afx_msg LRESULT OnChangeViewClass(WPARAM, LPARAM lParam); afx_msg LRESULT OnInstrumentSelected(WPARAM, LPARAM lParam); - afx_msg BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp Wed Nov 20 22:04:32 2024 (r22252) @@ -695,49 +695,50 @@ } -BOOL CCtrlGeneral::GetToolTipText(UINT uId, LPTSTR pszText) +CString CCtrlGeneral::GetToolTipText(UINT uId) { - const TCHAR moreRecentMixModeNote[] = _T("Use a more recent mixmode to see dB offsets."); - if ((pszText) && (uId)) + CString s; + if(uId) { + const TCHAR moreRecentMixModeNote[] = _T("Use a more recent mixmode to see dB offsets."); const bool displayDBValues = m_sndFile.GetPlayConfig().getDisplayDBValues(); const CWnd *wnd = GetDlgItem(uId); const bool isEnabled = wnd ? (wnd->IsWindowEnabled() != FALSE) : true; // nullptr check is for a Wine bug workaround (https://bugs.openmpt.org/view.php?id=1553) - mpt::tstring notAvailable; + CString notAvailable; if(!isEnabled) - notAvailable = MPT_TFORMAT("Feature is not available in the {} format.")(mpt::ToWin(m_sndFile.GetModSpecifications().GetFileExtensionUpper())); + notAvailable = MPT_CFORMAT("Feature is not available in the {} format.")(mpt::ToWin(m_sndFile.GetModSpecifications().GetFileExtensionUpper())); switch(uId) { case IDC_BUTTON_MODTYPE: - _tcscpy(pszText, _T("Song Properties")); + s = _T("Song Properties"); { const auto keyText = CMainFrame::GetInputHandler()->m_activeCommandSet->GetKeyTextFromCommand(kcViewSongProperties, 0); if (!keyText.IsEmpty()) - _tcscat(pszText, MPT_TFORMAT(" ({})")(keyText).c_str()); + s += MPT_CFORMAT(" ({})")(keyText); } - return TRUE; + break; case IDC_BUTTON1: if(isEnabled) - _tcscpy(pszText, _T("Click button multiple times to tap in the desired tempo.")); + s = _T("Click button multiple times to tap in the desired tempo."); else - _tcscpy(pszText, notAvailable.c_str()); - return TRUE; + s = notAvailable; + break; case IDC_SLIDER_SAMPLEPREAMP: - _tcscpy(pszText, displayDBValues ? CModDoc::LinearToDecibels(m_sndFile.m_nSamplePreAmp, m_sndFile.GetPlayConfig().getNormalSamplePreAmp()).GetString() : moreRecentMixModeNote); - return TRUE; + s = displayDBValues ? CModDoc::LinearToDecibels(m_sndFile.m_nSamplePreAmp, m_sndFile.GetPlayConfig().getNormalSamplePreAmp()).GetString() : moreRecentMixModeNote; + break; case IDC_SLIDER_VSTIVOL: if(isEnabled) - _tcscpy(pszText, displayDBValues ? CModDoc::LinearToDecibels(m_sndFile.m_nVSTiVolume, m_sndFile.GetPlayConfig().getNormalVSTiVol()).GetString() : moreRecentMixModeNote); + s = displayDBValues ? CModDoc::LinearToDecibels(m_sndFile.m_nVSTiVolume, m_sndFile.GetPlayConfig().getNormalVSTiVol()).GetString() : moreRecentMixModeNote; else - _tcscpy(pszText, notAvailable.c_str()); - return TRUE; + s = notAvailable; + break; case IDC_SLIDER_GLOBALVOL: if(isEnabled) - _tcscpy(pszText, displayDBValues ? CModDoc::LinearToDecibels(m_sndFile.m_PlayState.m_nGlobalVolume, m_sndFile.GetPlayConfig().getNormalGlobalVol()).GetString() : moreRecentMixModeNote); + s = displayDBValues ? CModDoc::LinearToDecibels(m_sndFile.m_PlayState.m_nGlobalVolume, m_sndFile.GetPlayConfig().getNormalGlobalVol()).GetString() : moreRecentMixModeNote; else - _tcscpy(pszText, notAvailable.c_str()); - return TRUE; + s = notAvailable; + break; case IDC_SLIDER_SONGTEMPO: case IDC_EDIT_ARTIST: case IDC_EDIT_TEMPO: @@ -747,11 +748,11 @@ case IDC_EDIT_VSTIVOL: if(isEnabled) break; - _tcscpy(pszText, notAvailable.c_str()); - return TRUE; + s = notAvailable; + break; } } - return FALSE; + return s; } Modified: trunk/OpenMPT/mptrack/Ctrl_gen.h ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.h Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/Ctrl_gen.h Wed Nov 20 22:04:32 2024 (r22252) @@ -75,7 +75,7 @@ CRuntimeClass *GetAssociatedViewClass() override; void OnActivatePage(LPARAM) override; void OnDeactivatePage() override; - BOOL GetToolTipText(UINT uId, LPTSTR pszText) override; + CString GetToolTipText(UINT uId) override; //}}AFX_VIRTUAL protected: Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp Wed Nov 20 22:04:32 2024 (r22252) @@ -1757,27 +1757,24 @@ } -BOOL CCtrlInstruments::GetToolTipText(UINT uId, LPTSTR pszText) +CString CCtrlInstruments::GetToolTipText(UINT uId) { - //Note: pszText points to a TCHAR array of length 256 (see CChildFrame::OnToolTipText). - //Note2: If there's problems in getting tooltips showing for certain tools, - // setting the tab order may have effect. - if ((pszText) && (uId)) + CString s; + if(uId) { CWnd *wnd = GetDlgItem(uId); bool isEnabled = wnd != nullptr && wnd->IsWindowEnabled() != FALSE; if(!isEnabled && !m_sndFile.GetNumInstruments()) { - _tcscpy(pszText, _T("Create a new instrument to enable instrument mode.")); - return TRUE; + s = _T("Create a new instrument to enable instrument mode."); + return s; } ModInstrument *pIns = m_sndFile.Instruments[m_nInstrument]; if(pIns == nullptr) - return FALSE; + return s; const auto plusMinus = mpt::ToWin(mpt::Charset::UTF8, "\xC2\xB1"); - const TCHAR *s = nullptr; CommandID cmd = kcNull; switch(uId) { @@ -1792,36 +1789,33 @@ if(isEnabled) { const CModSpecifications& specs = m_sndFile.GetModSpecifications(); - wsprintf(pszText, _T("Tempo Range: %u - %u"), specs.GetTempoMin().GetInt(), specs.GetTempoMax().GetInt()); + s = MPT_CFORMAT("Tempo Range: {} - {}")(specs.GetTempoMin().GetInt(), specs.GetTempoMax().GetInt()); } else { - _tcscpy(pszText, _T("Only available in MPTM format")); + s = _T("Only available in MPTM format"); } - return TRUE; - + break; case IDC_EDIT7: // Fade Out if(!pIns->nFadeOut) - _tcscpy(pszText, _T("Fade disabled")); + s =_T("Fade disabled"); else - wsprintf(pszText, _T("%u ticks (Higher value <-> Faster fade out)"), 0x8000 / pIns->nFadeOut); - return TRUE; - + s = MPT_CFORMAT("{} ticks (Higher value <-> Faster fade out)")(0x8000 / pIns->nFadeOut); + break; case IDC_EDIT8: // Global volume if(isEnabled) - _tcscpy(pszText, CModDoc::LinearToDecibels(GetDlgItemInt(IDC_EDIT8), 64.0)); + s = CModDoc::LinearToDecibels(GetDlgItemInt(IDC_EDIT8), 64.0); else - _tcscpy(pszText, _T("Only available in IT / MPTM format")); - return TRUE; - + s = _T("Only available in IT / MPTM format"); + break; case IDC_EDIT9: // Panning if(isEnabled) - _tcscpy(pszText, CModDoc::PanningToString(pIns->nPan, 128)); + s = CModDoc::PanningToString(pIns->nPan, 128); else - _tcscpy(pszText, _T("Only available in IT / MPTM format")); - return TRUE; + s = _T("Only available in IT / MPTM format"); + break; #ifndef NO_PLUGINS case IDC_EDIT10: @@ -1834,79 +1828,68 @@ { int32 prog = pIns->nMidiProgram - 1; if(pIns->wMidiBank > 1) prog += 128 * (pIns->wMidiBank - 1); - _tcscpy(pszText, plugin.pMixPlugin->GetFormattedProgramName(prog)); + s = plugin.pMixPlugin->GetFormattedProgramName(prog); } } - return TRUE; + break; #endif // NO_PLUGINS case IDC_PLUGIN_VELOCITYSTYLE: case IDC_PLUGIN_VOLUMESTYLE: // Plugin volume handling - if(pIns->nMixPlug < 1) return FALSE; + if(pIns->nMixPlug < 1) + return s; if(m_sndFile.m_playBehaviour[kMIDICCBugEmulation]) { velocityStyle.EnableWindow(FALSE); m_CbnPluginVolumeHandling.EnableWindow(FALSE); - _tcscpy(pszText, _T("To enable, clear Plugin volume command bug emulation flag from Song Properties")); - return TRUE; + s = _T("To enable, clear Plugin volume command bug emulation flag from Song Properties"); } else { if(uId == IDC_PLUGIN_VELOCITYSTYLE) - { - _tcscpy(pszText, _T("Volume commands (vxx) next to a note are sent as note velocity instead.")); - return TRUE; - } - return FALSE; + s = _T("Volume commands (vxx) next to a note are sent as note velocity instead."); } - + break; case IDC_COMBO5: // MIDI Channel s = _T("Mapped: MIDI channel corresponds to pattern channel modulo 16"); break; - case IDC_SLIDER1: if(isEnabled) - wsprintf(pszText, _T("%s%d%% volume variation"), plusMinus.c_str(), pIns->nVolSwing); + s = MPT_CFORMAT("{}{}% volume variation")(plusMinus, pIns->nVolSwing); else - _tcscpy(pszText, _T("Only available in IT / MPTM format")); - return TRUE; - + s = _T("Only available in IT / MPTM format"); + break; case IDC_SLIDER2: if(isEnabled) - wsprintf(pszText, _T("%s%d panning variation"), plusMinus.c_str(), pIns->nPanSwing); + s = MPT_CFORMAT("{}{} panning variation")(plusMinus, pIns->nPanSwing); else - _tcscpy(pszText, _T("Only available in IT / MPTM format")); - return TRUE; - + s = _T("Only available in IT / MPTM format"); + break; case IDC_SLIDER3: if(isEnabled) - wsprintf(pszText, _T("%u"), pIns->GetCutoff()); + s = mpt::cfmt::val(pIns->GetCutoff()); else - _tcscpy(pszText, _T("Only available in IT / MPTM format")); - return TRUE; - + s = _T("Only available in IT / MPTM format"); + break; case IDC_SLIDER4: if(isEnabled) - wsprintf(pszText, _T("%u (%i dB)"), pIns->GetResonance(), Util::muldivr(pIns->GetResonance(), 24, 128)); + s = MPT_CFORMAT("{} ({} dB)")(pIns->GetResonance(), Util::muldivr(pIns->GetResonance(), 24, 128)); else - _tcscpy(pszText, _T("Only available in IT / MPTM format")); - return TRUE; - + s = _T("Only available in IT / MPTM format"); + break; case IDC_SLIDER6: if(isEnabled) - wsprintf(pszText, _T("%s%d cutoff variation"), plusMinus.c_str(), pIns->nCutSwing); + s = MPT_CFORMAT("{}{} cutoff variation")(plusMinus, pIns->nCutSwing); else - _tcscpy(pszText, _T("Only available in MPTM format")); - return TRUE; - + s = _T("Only available in MPTM format"); + break; case IDC_SLIDER7: if(isEnabled) - wsprintf(pszText, _T("%s%d resonance variation"), plusMinus.c_str(), pIns->nResSwing); + s = MPT_CFORMAT("{}{} resonance variation")(plusMinus, pIns->nResSwing); else - _tcscpy(pszText, _T("Only available in MPTM format")); - return TRUE; - + s = _T("Only available in MPTM format"); + break; case IDC_PITCHWHEELDEPTH: s = _T("Set this to the actual Pitch Wheel Depth used in your plugin on this channel."); break; @@ -1939,19 +1922,14 @@ } - if(s != nullptr) + if(cmd != kcNull) { - _tcscpy(pszText, s); - if(cmd != kcNull) - { - auto keyText = CMainFrame::GetInputHandler()->m_activeCommandSet->GetKeyTextFromCommand(cmd, 0); - if (!keyText.IsEmpty()) - _tcscat(pszText, MPT_TFORMAT(" ({})")(keyText).c_str()); - } - return TRUE; + auto keyText = CMainFrame::GetInputHandler()->m_activeCommandSet->GetKeyTextFromCommand(cmd, 0); + if (!keyText.IsEmpty()) + s += MPT_CFORMAT(" ({})")(keyText); } } - return FALSE; + return s; } Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.h Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/Ctrl_ins.h Wed Nov 20 22:04:32 2024 (r22252) @@ -147,7 +147,7 @@ void OnDeactivatePage() override; void UpdateView(UpdateHint hint, CObject *pObj = nullptr) override; LRESULT OnModCtrlMsg(WPARAM wParam, LPARAM lParam) override; - BOOL GetToolTipText(UINT uId, LPTSTR pszText) override; + CString GetToolTipText(UINT uId) override; BOOL PreTranslateMessage(MSG* pMsg) override; //}}AFX_VIRTUAL protected: Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp Wed Nov 20 22:04:32 2024 (r22252) @@ -85,7 +85,6 @@ ON_EN_CHANGE(IDC_EDIT_SEQNUM, &CCtrlPatterns::OnSequenceNumChanged) ON_NOTIFY(TBN_DROPDOWN, IDC_TOOLBAR1, &CCtrlPatterns::OnTbnDropDownToolBar) ON_UPDATE_COMMAND_UI(IDC_PATTERN_RECORD, &CCtrlPatterns::OnUpdateRecord) - ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CCtrlPatterns::OnToolTipText) //}}AFX_MSG_MAP ON_WM_MOUSEWHEEL() END_MESSAGE_MAP() @@ -1331,30 +1330,9 @@ } -BOOL CCtrlPatterns::OnToolTip(UINT /*id*/, NMHDR *pNMHDR, LRESULT * /*pResult*/) +CString CCtrlPatterns::GetToolTipText(UINT id) { - TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; - UINT_PTR nID = pNMHDR->idFrom; - if(pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - nID = ::GetDlgCtrlID((HWND)nID); - if(nID) - { - pTTT->lpszText = MAKEINTRESOURCE(nID); - pTTT->hinst = AfxGetResourceHandle(); - return TRUE; - } - } - - return FALSE; -} - - -BOOL CCtrlPatterns::GetToolTipText(UINT id, LPTSTR str) -{ - CString fmt; - const TCHAR *s = nullptr; + CString s; CommandID cmd = kcNull; switch(id) { @@ -1370,9 +1348,9 @@ case ID_PATTERN_MIDIMACRO: s = _T("Zxx Macro Configuration"); cmd = kcShowMacroConfig; break; case ID_PATTERN_CHORDEDIT: s = _T("Chord Editor"); cmd = kcChordEditor; break; case ID_EDIT_UNDO: - fmt = _T("Undo"); + s = _T("Undo"); if(m_modDoc.GetPatternUndo().CanUndo()) - fmt += _T(" ") + m_modDoc.GetPatternUndo().GetUndoName(); + s += _T(" ") + m_modDoc.GetPatternUndo().GetUndoName(); cmd = kcEditUndo; break; case ID_PATTERN_PROPERTIES: s = _T("Pattern Properties"); cmd = kcShowPatternProperties; break; @@ -1381,20 +1359,15 @@ case ID_OVERFLOWPASTE: s = _T("Toggle Overflow Paste"); cmd = kcToggleOverflowPaste; break; case IDC_PATTERN_LOOP: s = _T("Toggle Loop Pattern"); cmd = kcChangeLoopStatus; break; case IDC_PATTERN_FOLLOWSONG: s = _T("Toggle Follow Song"); cmd = kcToggleFollowSong; break; - default: - return FALSE; } - if(s != nullptr) - fmt = s; if(cmd != kcNull) { auto keyText = CMainFrame::GetInputHandler()->m_activeCommandSet->GetKeyTextFromCommand(cmd, 0); if(!keyText.IsEmpty()) - fmt += MPT_CFORMAT(" ({})")(keyText); + s += MPT_CFORMAT(" ({})")(keyText); } - _tcscpy(str, fmt.GetString()); - return TRUE; + return s; } Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.h Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/Ctrl_pat.h Wed Nov 20 22:04:32 2024 (r22252) @@ -223,7 +223,7 @@ LRESULT OnModCtrlMsg(WPARAM wParam, LPARAM lParam) override; void OnActivatePage(LPARAM) override; void OnDeactivatePage() override; - BOOL GetToolTipText(UINT, LPTSTR) override; + CString GetToolTipText(UINT id) override; void OnDPIChanged() override; //}}AFX_VIRTUAL protected: @@ -281,7 +281,6 @@ public: afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt); afx_msg void OnXButtonUp(UINT nFlags, UINT nButton, CPoint point); - afx_msg BOOL OnToolTip(UINT id, NMHDR *pTTTStruct, LRESULT *pResult); }; OPENMPT_NAMESPACE_END Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp Wed Nov 20 22:04:32 2024 (r22252) @@ -530,12 +530,12 @@ } -BOOL CCtrlSamples::GetToolTipText(UINT uId, LPTSTR pszText) +CString CCtrlSamples::GetToolTipText(UINT uId) { - if ((pszText) && (uId)) + CString s; + if(uId) { UINT val = GetDlgItemInt(uId); - const TCHAR *s = nullptr; CommandID cmd = kcNull; switch(uId) { @@ -559,19 +559,19 @@ case IDC_EDIT8: // Volume to dB if(IsOPLInstrument()) - _tcscpy(pszText, (mpt::tfmt::fix((static_cast<int32>(val) - 64) * 0.75, 2) + _T(" dB")).c_str()); + s = mpt::cfmt::fix((static_cast<int32>(val) - 64) * 0.75, 2) + _T(" dB"); else - _tcscpy(pszText, CModDoc::LinearToDecibels(val, 64.0)); - return TRUE; + s = CModDoc::LinearToDecibels(val, 64.0); + break; case IDC_EDIT9: // Panning if(m_nSample) { const ModSample &sample = m_sndFile.GetSample(m_nSample); - _tcscpy(pszText, CModDoc::PanningToString(sample.nPan, 128)); + s = CModDoc::PanningToString(sample.nPan, 128); } - return TRUE; + break; case IDC_EDIT5: case IDC_SPIN5: @@ -583,14 +583,12 @@ if(sample.uFlags[CHN_ADLIB]) { // Translate to actual note frequency - _tcscpy(pszText, MPT_TFORMAT("{}Hz")(mpt::tfmt::flt(freqHz * (261.625 / 8363.0), 6)).c_str()); - return TRUE; + s = MPT_CFORMAT("{}Hz")(mpt::tfmt::flt(freqHz * (261.625 / 8363.0), 6)); } if(m_sndFile.UseFinetuneAndTranspose()) { // Transpose + Finetune to Frequency - _tcscpy(pszText, MPT_TFORMAT("{}Hz")(freqHz).c_str()); - return TRUE; + s = MPT_CFORMAT("{}Hz")(freqHz); } } break; @@ -618,35 +616,33 @@ ticks = val; } if(ticks >= 0) - _stprintf(pszText, _T("%d ticks"), ticks); + s = MPT_CFORMAT("{} ticks")(ticks); else - _tcscpy(pszText, _T("No Vibrato")); + s = _T("No Vibrato"); } - return TRUE; + break; case IDC_EDIT15: // Vibrato Depth if(!(m_sndFile.GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_XM))) - _tcscpy(pszText, _T("Only available in IT / MPTM / XM format")); + s = _T("Only available in IT / MPTM / XM format"); else - _stprintf(pszText, _T("%u cents"), Util::muldivr_unsigned(val, 100, 64)); - return TRUE; + s = MPT_CFORMAT("{} cents")(Util::muldivr_unsigned(val, 100, 64)); + break; case IDC_EDIT16: // Vibrato Rate if(!(m_sndFile.GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_XM))) { s = _T("Only available in IT / MPTM / XM format"); - break; } else if(val == 0) { s = _T("Stopped"); - break; } else { const double ticksPerCycle = 256.0 / val; const uint32 ticksPerBeat = std::max(1u, m_sndFile.m_PlayState.m_nCurrentRowsPerBeat * m_sndFile.m_PlayState.m_nMusicSpeed); - _stprintf(pszText, _T("%.2f beats per cycle (%.2f ticks)"), ticksPerCycle / ticksPerBeat, ticksPerCycle); + s = MPT_CFORMAT("{} beats per cycle ({} ticks)")(mpt::cfmt::flt(ticksPerCycle / ticksPerBeat, 3), mpt::cfmt::flt(ticksPerCycle, 3)); } - return TRUE; + break; case IDC_CHECK1: case IDC_EDIT3: @@ -665,19 +661,14 @@ s = _T("Keep a reference to the original waveform instead of saving it in the module."); break; } - if(s != nullptr) + if(cmd != kcNull) { - _tcscpy(pszText, s); - if(cmd != kcNull) - { - auto keyText = CMainFrame::GetInputHandler()->m_activeCommandSet->GetKeyTextFromCommand(cmd, 0); - if (!keyText.IsEmpty()) - _tcscat(pszText, MPT_TFORMAT(" ({})")(keyText).c_str()); - } - return TRUE; + auto keyText = CMainFrame::GetInputHandler()->m_activeCommandSet->GetKeyTextFromCommand(cmd, 0); + if (!keyText.IsEmpty()) + s += MPT_CFORMAT(" ({})")(keyText); } } - return FALSE; + return s; } Modified: trunk/OpenMPT/mptrack/Ctrl_smp.h ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.h Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/Ctrl_smp.h Wed Nov 20 22:04:32 2024 (r22252) @@ -96,7 +96,7 @@ void OnDeactivatePage() override; void UpdateView(UpdateHint hint, CObject *pObj = nullptr) override; LRESULT OnModCtrlMsg(WPARAM wParam, LPARAM lParam) override; - BOOL GetToolTipText(UINT uId, LPTSTR pszText) override; + CString GetToolTipText(UINT uId) override; BOOL PreTranslateMessage(MSG* pMsg) override; void OnDPIChanged() override; //}}AFX_VIRTUAL Modified: trunk/OpenMPT/mptrack/DialogBase.cpp ============================================================================== --- trunk/OpenMPT/mptrack/DialogBase.cpp Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/DialogBase.cpp Wed Nov 20 22:04:32 2024 (r22252) @@ -79,4 +79,25 @@ } +INT_PTR DialogBase::OnToolHitTest(CPoint point, TOOLINFO *pTI) const +{ + INT_PTR nHit = CDialog::OnToolHitTest(point, pTI); + if(nHit >= 0 && pTI && (pTI->uFlags & TTF_IDISHWND)) + { + // Workaround to get tooltips even for disabled controls inside group boxes that are positioned in the "correct" tab order position. + // For some reason doesn't work for enabled controls (probably because pTI->hwnd then doesn't point at the active control under the cursor), + // so we use the default code path there, which works just fine. + HWND child = reinterpret_cast<HWND>(pTI->uId); + if(!::IsWindowEnabled(child)) + { + pTI->uId = nHit; + pTI->uFlags &= ~TTF_IDISHWND; + ::GetWindowRect(child, &pTI->rect); + ScreenToClient(&pTI->rect); + } + } + return nHit; +} + + OPENMPT_NAMESPACE_END Modified: trunk/OpenMPT/mptrack/DialogBase.h ============================================================================== --- trunk/OpenMPT/mptrack/DialogBase.h Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/DialogBase.h Wed Nov 20 22:04:32 2024 (r22252) @@ -22,6 +22,7 @@ BOOL OnInitDialog() override; BOOL PreTranslateMessage(MSG *pMsg) override; + INT_PTR OnToolHitTest(CPoint point, TOOLINFO *pTI) const override; static bool HandleGlobalKeyMessage(const MSG &msg); Modified: trunk/OpenMPT/mptrack/Globals.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Globals.cpp Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/Globals.cpp Wed Nov 20 22:04:32 2024 (r22252) @@ -27,6 +27,8 @@ #include "TrackerSettings.h" #include "../soundlib/mod_specifications.h" +#include <afxpriv.h> + OPENMPT_NAMESPACE_BEGIN @@ -151,29 +153,41 @@ } -INT_PTR CModControlDlg::OnToolHitTest(CPoint point, TOOLINFO *pTI) const +BOOL CModControlDlg::OnToolTipText(UINT /*nID*/, NMHDR *pNMHDR, LRESULT *pResult) { - INT_PTR nHit = DialogBase::OnToolHitTest(point, pTI); - if ((nHit >= 0) && (pTI)) + auto pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); + CString strTipText; + + UINT_PTR nID = pNMHDR->idFrom; + if(pTTT->uFlags & TTF_IDISHWND) + { + // idFrom is actually the HWND of the tool + nID = static_cast<UINT_PTR>(::GetDlgCtrlID(reinterpret_cast<HWND>(nID))); + } + + if(nID >= 1000 && nID < 65536) { - if ((pTI->lpszText == LPSTR_TEXTCALLBACK) && (pTI->hwnd == m_hWnd)) + strTipText = GetToolTipText(static_cast<UINT>(nID)); + } else + { + // allow top level routing frame to handle the message + if(GetRoutingFrame() != nullptr) + return FALSE; + if(nID != 0) // will be zero on a separator { - CFrameWnd *pMDIParent = GetParentFrame(); - if (pMDIParent) pTI->hwnd = pMDIParent->m_hWnd; + TCHAR szFullText[256] = _T(""); + AfxLoadString(static_cast<UINT>(nID), szFullText, static_cast<UINT>(std::size(szFullText))); + // this is the command id, not the button index + AfxExtractSubString(strTipText, szFullText, 1, _T('\n')); } } - return nHit; -} + mpt::String::WriteCStringBuf(pTTT->szText) = strTipText; + *pResult = 0; + // bring the tooltip window above other popup windows + ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER); -BOOL CModControlDlg::OnToolTipText(UINT nID, NMHDR *pNMHDR, LRESULT *pResult) -{ - CChildFrame *pChildFrm = (CChildFrame *)GetParentFrame(); - if(pChildFrm) - return pChildFrm->OnToolTipText(nID, pNMHDR, pResult); - if(pResult) - *pResult = 0; - return FALSE; + return TRUE; // message was handled } @@ -233,7 +247,6 @@ ON_NOTIFY(TCN_SELCHANGE, IDC_TABCTRL1, &CModControlView::OnTabSelchange) ON_MESSAGE(WM_MOD_ACTIVATEVIEW, &CModControlView::OnActivateModView) ON_MESSAGE(WM_MOD_CTRLMSG, &CModControlView::OnModCtrlMsg) - ON_MESSAGE(WM_MOD_GETTOOLTIPTEXT, &CModControlView::OnGetToolTipText) ON_COMMAND(ID_EDIT_CUT, &CModControlView::OnEditCut) ON_COMMAND(ID_EDIT_COPY, &CModControlView::OnEditCopy) ON_COMMAND(ID_EDIT_PASTE, &CModControlView::OnEditPaste) @@ -561,15 +574,6 @@ } -LRESULT CModControlView::OnGetToolTipText(WPARAM uId, LPARAM pszText) -{ - CModControlDlg *pActiveDlg = GetCurrentControlDlg(); - if(!pActiveDlg) - return 0; - return static_cast<LRESULT>(pActiveDlg->GetToolTipText(static_cast<UINT>(uId), reinterpret_cast<LPTSTR>(pszText))); -} - - void CModControlView::SampleChanged(SAMPLEINDEX smp) { const CModDoc *modDoc = GetDocument(); Modified: trunk/OpenMPT/mptrack/Globals.h ============================================================================== --- trunk/OpenMPT/mptrack/Globals.h Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/Globals.h Wed Nov 20 22:04:32 2024 (r22252) @@ -88,8 +88,7 @@ virtual void OnActivatePage(LPARAM) {} virtual void OnDeactivatePage() {} BOOL OnInitDialog() override; - INT_PTR OnToolHitTest(CPoint point, TOOLINFO *pTI) const override; - virtual BOOL GetToolTipText(UINT, LPTSTR) { return FALSE; } + virtual CString GetToolTipText(UINT) { return {}; } //}}AFX_VIRTUAL //{{AFX_MSG(CModControlDlg) afx_msg void OnSize(UINT nType, int cx, int cy); @@ -179,7 +178,6 @@ afx_msg void OnSwitchToView(); afx_msg LRESULT OnActivateModView(WPARAM, LPARAM); afx_msg LRESULT OnModCtrlMsg(WPARAM wParam, LPARAM lParam); - afx_msg LRESULT OnGetToolTipText(WPARAM, LPARAM); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; @@ -215,6 +213,7 @@ public: //{{AFX_VIRTUAL(CModScrollView) void OnInitialUpdate() override; + BOOL PreTranslateMessage(MSG *pMsg) override; void OnDraw(CDC *) override {} void OnPrepareDC(CDC *, CPrintInfo *) override {} void OnUpdate(CView *pSender, LPARAM lHint, CObject *pHint) override; @@ -223,7 +222,6 @@ virtual LRESULT OnModViewMsg(WPARAM wParam, LPARAM lParam); virtual BOOL OnDragonDrop(BOOL, const DRAGONDROP *) { return FALSE; } virtual LRESULT OnPlayerNotify(Notification *) { return 0; } - BOOL PreTranslateMessage(MSG *pMsg) override; //}}AFX_VIRTUAL CModControlDlg *GetControlDlg() { return static_cast<CModControlView *>(CWnd::FromHandle(m_hWndCtrl))->GetCurrentControlDlg(); } Modified: trunk/OpenMPT/mptrack/View_gen.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/View_gen.cpp Wed Nov 20 22:04:32 2024 (r22252) @@ -1756,6 +1756,27 @@ } +INT_PTR CViewGlobals::OnToolHitTest(CPoint point, TOOLINFO *pTI) const +{ + INT_PTR nHit = CFormView::OnToolHitTest(point, pTI); + if(nHit >= 0 && pTI && (pTI->uFlags & TTF_IDISHWND)) + { + // Workaround to get tooltips even for disabled controls inside group boxes that are positioned in the "correct" tab order position. + // For some reason doesn't work for enabled controls (probably because pTI->hwnd then doesn't point at the active control under the cursor), + // so we use the default code path there, which works just fine. + HWND child = reinterpret_cast<HWND>(pTI->uId); + if(!::IsWindowEnabled(child)) + { + pTI->uId = nHit; + pTI->uFlags &= ~TTF_IDISHWND; + ::GetWindowRect(child, &pTI->rect); + ScreenToClient(&pTI->rect); + } + } + return nHit; +} + + BOOL CViewGlobals::OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult) { auto pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); Modified: trunk/OpenMPT/mptrack/View_gen.h ============================================================================== --- trunk/OpenMPT/mptrack/View_gen.h Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/View_gen.h Wed Nov 20 22:04:32 2024 (r22252) @@ -74,6 +74,7 @@ void OnInitialUpdate() override; void DoDataExchange(CDataExchange *pDX) override; void OnUpdate(CView *pSender, LPARAM lHint, CObject *pHint) override; + INT_PTR OnToolHitTest(CPoint point, TOOLINFO *pTI) const override; void UpdateView(UpdateHint hint, CObject *pObj = nullptr); LRESULT OnModViewMsg(WPARAM, LPARAM); Modified: trunk/OpenMPT/mptrack/WindowMessages.h ============================================================================== --- trunk/OpenMPT/mptrack/WindowMessages.h Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/WindowMessages.h Wed Nov 20 22:04:32 2024 (r22252) @@ -25,7 +25,6 @@ WM_MOD_CTRLMSG, WM_MOD_VIEWMSG, WM_MOD_MIDIMSG, - WM_MOD_GETTOOLTIPTEXT, WM_MOD_DRAGONDROPPING, WM_MOD_KBDNOTIFY, WM_MOD_INSTRSELECTED, Modified: trunk/OpenMPT/mptrack/mptrack.rc ============================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc Wed Nov 20 21:46:40 2024 (r22251) +++ trunk/OpenMPT/mptrack/mptrack.rc Wed Nov 20 22:04:32 2024 (r22252) @@ -1411,6 +1411,7 @@ PUSHBUTTON "Type EXT, ## channels",IDC_BUTTON_MODTYPE,192,3,162,12 LTEXT "Resampling:",IDC_STATIC,192,20,54,8 COMBOBOX IDC_COMBO1,246,18,108,90,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + GROUPBOX "",IDC_STATIC,1,30,96,88,0,WS_EX_TRANSPARENT LTEXT "Initial Tempo",IDC_STATIC,5,42,49,12 CONTROL "",IDC_SLIDER_SONGTEMPO,"msctls_trackbar32",TBS_VERT | TBS_BOTH | TBS_NOTICKS,11,50,15,50 EDITTEXT IDC_EDIT_TEMPO,5,101,43,12,ES_AUTOHSCROLL | ES_NUMBER @@ -1419,11 +1420,13 @@ LTEXT "Ticks/Row:",IDC_STATIC,54,90,36,8 EDITTEXT IDC_EDIT_SPEED,54,101,36,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Spin1",IDC_SPIN_SPEED,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,82,82,11,14 + GROUPBOX "",IDC_STATIC,96,30,67,88,0,WS_EX_TRANSPARENT LTEXT "Restart Position",IDC_STATIC,102,42,60,8 EDITTEXT IDC_EDIT_RESTARTPOS,102,54,36,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Spin1",IDC_SPIN_RESTARTPOS,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,132,54,11,14 CONTROL "Loop Song",IDC_CHECK_LOOPSONG,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,102,90,54,10 CTEXT "Not saved in song!",IDC_STATIC,96,102,66,12 + GROUPBOX "",IDC_STATIC,162,30,192,88,0,WS_EX_TRANSPARENT CTEXT "Initial Global Volume",IDC_STATIC,165,42,69,8 CONTROL "",IDC_SLIDER_GLOBALVOL,"msctls_trackbar32",TBS_VERT | TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS,181,50,24,50 EDITTEXT IDC_EDIT_GLOBALVOL,174,100,36,12,ES_AUTOHSCROLL | ES_NUMBER @@ -1438,9 +1441,6 @@ CONTROL "",IDC_SPIN_SAMPLEPA,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,325,97,11,14 CONTROL "",IDC_VUMETER_LEFT,"Static",SS_BLACKRECT | SS_SUNKEN,360,3,15,115 CONTROL "",IDC_VUMETER_RIGHT,"Static",SS_BLACKRECT | SS_SUNKEN,378,3,15,115 - GROUPBOX "",IDC_STATIC,1,30,96,88 - GROUPBOX "",IDC_STATIC,96,30,67,88 - GROUPBOX "",IDC_STATIC,162,30,192,88 END IDD_CONTROL_COMMENTS DIALOGEX 0, 0, 435, 119 @@ -1493,7 +1493,7 @@ CTEXT "File",IDC_STATIC,276,26,23,13,SS_CENTERIMAGE | NOT WS_GROUP,WS_EX_STATICEDGE EDITTEXT IDC_SAMPLE_FILENAME,299,26,72,13,ES_AUTOHSCROLL CONTROL "&Keep Sample Data on Disk",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,379,27,150,10 - GROUPBOX "",IDC_STATIC,3,22,101,78 + GROUPBOX "",IDC_STATIC,3,22,101,78,0,WS_EX_TRANSPARENT LTEXT "Default &Volume",IDC_STATIC,8,32,56,8 EDITTEXT IDC_EDIT7,64,30,36,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Spin1",IDC_SPIN7,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,94,29,11,11 @@ -1508,7 +1508,7 @@ CONTROL "Spin1",IDC_SPIN5,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,94,69,11,11 LTEXT "Trans&pose",IDC_TEXT6,8,86,45,8 COMBOBOX IDC_COMBO_BASENOTE,55,83,45,89,CBS_DROPDOWNLIST | WS_VSCROLL - GROUPBOX "&Loop",IDC_STATIC,109,43,79,57 + GROUPBOX "&Loop",IDC_STATIC,109,43,79,57,0,WS_EX_TRANSPARENT LTEXT "Type",IDC_STATIC,114,57,17,8 COMBOBOX IDC_COMBO1,137,54,45,46,CBS_DROPDOWNLIST | WS_TABSTOP LTEXT "Start",IDC_STATIC,114,73,16,8 @@ -1517,7 +1517,7 @@ LTEXT "End",IDC_STATIC,114,86,14,8 EDITTEXT IDC_EDIT2,137,83,45,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Spin1",IDC_SPIN2,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,176,84,11,11 - GROUPBOX "&Sustain Loop",IDC_STATIC,192,43,79,57 + GROUPBOX "&Sustain Loop",IDC_STATIC,192,43,79,57,0,WS_EX_TRANSPARENT LTEXT "Type",IDC_STATIC,196,57,17,8 COMBOBOX IDC_COMBO2,219,54,45,46,CBS_DROPDOWNLIST | WS_TABSTOP LTEXT "Start",IDC_STATIC,196,73,16,8 @@ -1526,7 +1526,7 @@ LTEXT "End",IDC_STATIC,196,86,14,8 EDITTEXT IDC_EDIT4,219,83,45,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Spin1",IDC_SPIN4,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,260,83,11,11 - GROUPBOX "",IDC_STATIC,276,43,96,57 + GROUPBOX "",IDC_STATIC,276,43,96,57,0,WS_EX_TRANSPARENT LTEXT "&Auto-Vibrato",IDC_STATIC,282,50,41,8 COMBOBOX IDC_COMBO3,282,59,47,70,CBS_DROPDOWNLIST | WS_TABSTOP LTEXT "&Depth",IDC_STATIC,334,50,20,8 @@ -1538,7 +1538,7 @@ LTEXT "&Rate",IDC_STATIC,328,74,16,8 EDITTEXT IDC_EDIT16,328,83,38,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Rate",IDC_SPIN13,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,360,83,11,11 - GROUPBOX "Pitch Shifting / &Time Stretching",IDC_GROUPBOX_PITCH_TIME,379,41,180,59 + GROUPBOX "Pitch Shifting / &Time Stretching",IDC_GROUPBOX_PITCH_TIME,379,41,180,59,0,WS_EX_TRANSPARENT CONTROL "Lo-&Fi Mode",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,487,54,66,11 LTEXT "Pitch",IDC_TEXT_PITCH,385,56,42,8 COMBOBOX IDC_COMBO4,427,54,54,61,CBS_DROPDOWN | WS_VSCROLL | WS_GROUP | WS_TABSTOP @@ -1552,7 +1552,7 @@ PUSHBUTTON "Process",IDC_BUTTON1,487,82,66,14 END -IDD_CONTROL_INSTRUMENTS DIALOGEX 0, 0, 536, 170 +IDD_CONTROL_INSTRUMENTS DIALOGEX 0, 0, 542, 170 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -1562,6 +1562,7 @@ EDITTEXT IDC_SAMPLE_NAME,149,7,151,12,ES_AUTOHSCROLL CTEXT "File",IDC_STATIC,307,7,35,12,SS_CENTERIMAGE,WS_EX_STATICEDGE EDITTEXT IDC_SAMPLE_FILENAME,342,7,105,12,ES_AUTOHSCROLL + GROUPBOX "General",IDC_STATIC,3,27,123,141,0,WS_EX_TRANSPARENT CTEXT "Global &Volume",IDC_STATIC,8,36,72,12,SS_CENTERIMAGE,WS_EX_STATICEDGE EDITTEXT IDC_EDIT8,84,36,37,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Spin1",IDC_SPIN8,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,112,40,8,10 @@ -1571,17 +1572,20 @@ CONTROL "Set &Pan",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,12,72,66,10 EDITTEXT IDC_EDIT9,84,70,37,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_SPIN9,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,112,74,8,11 + GROUPBOX "Pitch/Pan Separation",IDC_STATIC,3,88,123,80,0,WS_EX_TRANSPARENT CTEXT "S&ep",IDC_STATIC,8,99,20,13,SS_CENTERIMAGE,WS_EX_STATICEDGE EDITTEXT IDC_EDIT15,30,99,30,13,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Spin1",IDC_SPIN12,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,54,102,11,11 CTEXT "Cen&tre",IDC_STATIC,62,99,26,13,SS_CENTERIMAGE,WS_EX_STATICEDGE COMBOBOX IDC_COMBO4,90,99,31,91,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Sample Quality",IDC_STATIC,3,118,123,50 CTEXT "Rampi&ng",IDC_STATIC,7,133,39,13,SS_CENTERIMAGE,WS_EX_STATICEDGE CONTROL "",IDC_SLIDER5,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS,47,135,36,10 EDITTEXT IDC_EDIT2,85,133,36,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,116,133,8,12 CTEXT "Resamplin&g",IDC_STATIC,7,151,39,13,SS_CENTERIMAGE,WS_EX_STATICEDGE COMBOBOX IDC_COMBO9,50,151,71,81,CBS_DROPDOWNLIST | WS_TABSTOP + GROUPBOX "Filter",IDC_STATIC,131,27,104,141,0,WS_EX_TRANSPARENT CONTROL "&Reso",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,136,37,33,10 CONTROL "Slider2",IDC_SLIDER4,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS | WS_DISABLED | WS_TABSTOP,168,37,64,10 CONTROL "&Cutoff",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,136,52,35,10 @@ -1589,6 +1593,7 @@ RTEXT "--",IDC_FILTERTEXT,166,62,65,8 CTEXT "&Mode",IDC_STATIC,135,70,23,13,SS_CENTERIMAGE,WS_EX_STATICEDGE COMBOBOX IDC_FILTERMODE,163,70,69,42,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Random Variation",IDC_STATIC,131,88,104,80,0,WS_EX_TRANSPARENT CTEXT "V&olume",IDC_STATIC,136,99,33,13,SS_CENTERIMAGE,WS_EX_STATICEDGE CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS | WS_TABSTOP,172,101,60,10 CTEXT "P&anning",IDC_STATIC,136,116,33,13,SS_CENTERIMAGE,WS_EX_STATICEDGE @@ -1597,12 +1602,14 @@ CONTROL "",IDC_SLIDER6,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS | WS_TABSTOP,172,135,60,10 CTEXT "R&eso",IDC_STATIC,136,151,33,13,SS_CENTERIMAGE,WS_EX_STATICEDGE CONTROL "",IDC_SLIDER7,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS | WS_TABSTOP,172,152,60,10 + GROUPBOX "New Note Action",IDC_STATIC,240,27,122,60,0,WS_EX_TRANSPARENT CTEXT "Acti&on",IDC_STATIC,246,36,59,13,SS_CENTERIMAGE,WS_EX_STATICEDGE COMBOBOX IDC_COMBO1,308,36,50,54,CBS_DROPDOWNLIST | WS_TABSTOP CTEXT "&Duplicate Check",IDC_STATIC,246,53,59,13,SS_CENTERIMAGE,WS_EX_STATICEDGE COMBOBOX IDC_COMBO2,308,53,50,69,CBS_DROPDOWNLIST | WS_TABSTOP CTEXT "Dupl&icate Action",IDC_STATIC,246,70,59,13,SS_CENTERIMAGE,WS_EX_STATICEDGE COMBOBOX IDC_COMBO3,308,70,50,54,CBS_DROPDOWNLIST | WS_TABSTOP + GROUPBOX "Plugin / MIDI",IDC_STATIC,240,88,228,80,0,WS_EX_TRANSPARENT COMBOBOX IDC_COMBO6,246,99,72,127,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Editor",IDC_INSVIEWPLG,321,99,37,13,0,WS_EX_STATICEDGE CTEXT "MIDI &Channel",IDC_STATIC,246,116,72,12,SS_CENTERIMAGE,WS_EX_STATICEDGE @@ -1613,27 +1620,20 @@ CTEXT "MIDI &Bank",IDC_STATIC,245,152,72,12,SS_CENTERIMAGE,WS_EX_STATICEDGE EDITTEXT IDC_EDIT11,321,152,37,12,ES_AUTOHSCROLL CONTROL "",IDC_SPIN11,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,351,153,8,11 - CTEXT "P. &Bend Range",IDC_STATIC,366,99,52,12,SS_CENTERIMAGE,WS_EX_STATICEDGE - EDITTEXT IDC_PITCHWHEELDEPTH,420,99,36,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Pitch &Bend Range",IDC_STATIC,366,99,60,12,SS_CENTERIMAGE + EDITTEXT IDC_PITCHWHEELDEPTH,428,99,36,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | WS_TABSTOP,444,102,11,11 - CTEXT "Volume Command &Handling",IDC_STATIC,366,116,90,10,SS_CENTERIMAGE,WS_EX_STATICEDGE - COMBOBOX IDC_PLUGIN_VOLUMESTYLE,366,128,90,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Volume Command &Handling",IDC_STATIC,366,116,96,10,SS_CENTERIMAGE + COMBOBOX IDC_PLUGIN_VOLUMESTYLE,366,128,96,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "&Volume commands with note are Velocities",IDC_PLUGIN_VELOCITYSTYLE, - "Button",BS_AUTOCHECKBOX | BS_VCENTER | BS_MULTILINE | BS_FLAT | WS_TABSTOP,366,141,90,24 - COMBOBOX IDC_COMBOTUNING,368,38,88,48,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "&Loop Tempo:",IDC_CHECK_PITCHTEMPOLOCK,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,369,70,51,8 - EDITTEXT IDC_EDIT_PITCHTEMPOLOCK,426,68,30,12,ES_AUTOHSCROLL | ES_NUMBER - GROUPBOX "Sample &Map",IDC_STATIC,466,27,62,141 - CONTROL "",IDC_NOTEMAP,"Static",SS_GRAYRECT | SS_NOTIFY | WS_TABSTOP,466,37,62,131,WS_EX_CLIENTEDGE - GROUPBOX "General",IDC_STATIC,3,27,123,141 - GROUPBOX "Pitch/Pan Separation",IDC_STATIC,3,88,123,80 - GROUPBOX "Sample Quality",IDC_STATIC,3,118,123,50 - GROUPBOX "Filter",IDC_STATIC,131,27,104,141 - GROUPBOX "Random Variation",IDC_STATIC,131,88,104,80 - GROUPBOX "New Note Action",IDC_STATIC,240,27,122,60 - GROUPBOX "Plugin / MIDI",IDC_STATIC,240,88,222,80 - GROUPBOX "Alternative Tuning",IDC_STATIC,364,27,98,28 - GROUPBOX "Pitch/Tempo Lock",IDC_STATIC,364,57,98,30 + "Button",BS_AUTOCHECKBOX | BS_VCENTER | BS_MULTILINE | BS_FLAT | WS_TABSTOP,366,141,96,24 + GROUPBOX "Alternative Tuning",IDC_STATIC,364,27,104,28,0,WS_EX_TRANSPARENT + COMBOBOX IDC_COMBOTUNING,368,38,94,48,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Pitch/Tempo Lock",IDC_STATIC,364,57,104,30 + CONTROL "&Loop Tempo:",IDC_CHECK_PITCHTEMPOLOCK,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,369,70,57,8 + EDITTEXT IDC_EDIT_PITCHTEMPOLOCK,434,68,30,12,ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "Sample &Map",IDC_STATIC,474,27,62,141 + CONTROL "",IDC_NOTEMAP,"Static",SS_GRAYRECT | SS_NOTIFY | WS_TABSTOP,474,37,62,131,WS_EX_CLIENTEDGE END IDD_MODDOC_MODTYPE DIALOGEX 0, 0, 262, 287 @@ -1643,8 +1643,10 @@ BEGIN DEFPUSHBUTTON "OK",IDOK,204,6,50,14 PUSHBUTTON "Cancel",IDCANCEL,204,24,50,14 + GROUPBOX "Type",IDC_FRAME_MODTYPE,6,6,192,30,0,WS_EX_TRANSPARENT COMBOBOX IDC_COMBO1,12,18,108,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_COMBO2,126,18,66,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Playback",IDC_FRAME_MODFLAGS,6,42,246,54,0,WS_EX_TRANSPARENT CONTROL "&Linear Frequency Slides",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,54,108,10 CONTROL "&Old Effects (IT)",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,54,108,10 CONTROL "Fast &Volume Slides (S3M)",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,66,108,10 @@ -1652,8 +1654,14 @@ CONTROL "&ProTracker 1/2 Mode (MOD)",IDC_CHECK_PT1X,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,78,108,10 CONTROL "Extended &filter range",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,78,108,10 CONTROL "&Amiga Frequency Limits",IDC_CHECK_AMIGALIMITS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,78,108,10 + GROUPBOX "Extended Playback Options (OpenMPT only)",IDC_FRAME_MPTEXT,6,102,246,72,0,WS_EX_TRANSPARENT LTEXT "&Mix Levels:",IDC_TEXT_MIXMODE,12,116,48,8 COMBOBOX IDC_COMBO_MIXLEVELS,60,114,108,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "",IDC_STATIC2,12,132,210,18 + ICON "",IDC_STATIC1,222,132,20,20,SS_CENTERIMAGE | SS_REALSIZEIMAGE + PUSHBUTTON "&Set Defaults",IDC_BUTTON3,12,156,72,12 + PUSHBUTTON "&Edit Compatibility Settings",IDC_BUTTON2,96,156,102,12 + GROUPBOX "Tempo",IDC_FRAME_TEMPOMODE,6,180,246,48,0,WS_EX_TRANSPARENT LTEXT "&Tempo Mode:",IDC_TEXT_TEMPOMODE,12,196,48,8 COMBOBOX IDC_COMBO_TEMPOMODE,62,194,82,77,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Configure S&wing",IDC_BUTTON1,62,212,82,12 @@ -1661,19 +1669,11 @@ EDITTEXT IDC_ROWSPERBEAT,150,194,24,12,ES_AUTOHSCROLL | ES_NUMBER LTEXT "Rows per measure",IDC_TEXT_ROWSPERMEASURE,180,212,66,8 EDITTEXT IDC_ROWSPERMEASURE,150,212,24,12,ES_AUTOHSCROLL | ES_NUMBER + GROUPBOX "Version Info",IDC_FRAME_MPTVERSION,6,234,246,48,0,WS_EX_TRANSPARENT RTEXT "Created with:",IDC_TEXT_CREATEDWITH,12,250,60,8 EDITTEXT IDC_EDIT_CREATEDWITH,78,247,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE RTEXT "Last saved with:",IDC_TEXT_SAVEDWITH,12,266,60,8 EDITTEXT IDC_EDIT_SAVEDWITH,78,266,166,13,ES_AUTOHSCROLL | ES_READONLY,WS_EX_STATICEDGE - GROUPBOX "Type",IDC_FRAME_MODTYPE,6,6,192,30 - GROUPBOX "Playback",IDC_FRAME_MODFLAGS,6,42,246,54 - GROUPBOX "Extended Playback Options (OpenMPT only)",IDC_FRAME_MPTEXT,6,102,246,72 - GROUPBOX "Tempo",IDC_FRAME_TEMPOMODE,6,180,246,48 - GROUPBOX "Version Info",IDC_FRAME_MPTVERSION,6,234,246,48 - PUSHBUTTON "&Edit Compatibility Settings",IDC_BUTTON2,96,156,102,12 - LTEXT "",IDC_STATIC2,12,132,210,18 - ICON "",IDC_STATIC1,222,132,20,20,SS_CENTERIMAGE | SS_REALSIZEIMAGE - PUSHBUTTON "&Set Defaults",IDC_BUTTON3,12,156,72,12 END IDD_REMOVECHANNELS DIALOGEX 0, 0, 171, 221 @@ -2391,7 +2391,7 @@ IDD_CONTROL_INSTRUMENTS, DIALOG BEGIN - RIGHTMARGIN, 500 + RIGHTMARGIN, 506 BOTTOMMARGIN, 165 END @@ -3346,6 +3346,7 @@ CAPTION "MIDI Mapping" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN + GROUPBOX "Current Mapping",IDC_STATIC,5,5,391,91 CONTROL "&Active",IDC_CHECKACTIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,18,48,10 CONTROL "&Capture",IDC_CHECKCAPTURE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,66,18,48,10 CONTROL "Pattern &Record",IDC_CHECK_PATRECORD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,114,18,65,10 @@ -3366,7 +3367,6 @@ CONTROL "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,102,385,120 CONTROL "",IDC_SPINMOVEMAPPING,"msctls_updown32",0x0,390,102,11,120 DEFPUSHBUTTON "Close",IDOK,342,228,60,14 - GROUPBOX "Current Mapping",IDC_STATIC,5,5,391,91 END IDD_TUNING DIALOGEX 0, 0, 495, 231 @@ -3607,10 +3607,10 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 100, 100, 100, 0, 0, 100, - 100, 100, 0, 0, - 0, 0, 0, 0 + 100, 100, 0, 0 END |
From: <sv...@op...> - 2024-11-20 20:46:52
|
Author: sagamusix Date: Wed Nov 20 21:46:40 2024 New Revision: 22251 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22251 Log: [Imp] DBM / IMF / MED: When merging pattern commands, allow to move offset to volume column at the expense of a lower offset resolution. Slightly improves playback of ShowMeLove.med (https://www.un4seen.com/forum/?topic=15448.msg144136#msg144136). Modified: trunk/OpenMPT/soundlib/Load_dbm.cpp trunk/OpenMPT/soundlib/Load_imf.cpp trunk/OpenMPT/soundlib/Load_med.cpp trunk/OpenMPT/soundlib/ModSample.cpp trunk/OpenMPT/soundlib/modcommand.cpp trunk/OpenMPT/soundlib/modcommand.h Modified: trunk/OpenMPT/soundlib/Load_dbm.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_dbm.cpp Tue Nov 19 22:29:05 2024 (r22250) +++ trunk/OpenMPT/soundlib/Load_dbm.cpp Wed Nov 20 21:46:40 2024 (r22251) @@ -109,7 +109,7 @@ void ConvertToMPT(ModSample &mptSmp) const { - mptSmp.Initialize(); + mptSmp.Initialize(MOD_TYPE_DBM); mptSmp.nVolume = std::min(static_cast<uint16>(volume), uint16(64)) * 4u; mptSmp.nC5Speed = Util::muldivr(sampleRate, 8303, 8363); @@ -581,7 +581,7 @@ cmd1 = CMD_NONE; } - const auto lostCommand = m.FillInTwoCommands(cmd1, param1, cmd2, param2); + const auto lostCommand = m.FillInTwoCommands(cmd1, param1, cmd2, param2, true); if(ModCommand::IsGlobalCommand(lostCommand.first, lostCommand.second)) lostGlobalCommands.insert(lostGlobalCommands.begin(), lostCommand); // Insert at front so that the last command of same type "wins" Modified: trunk/OpenMPT/soundlib/Load_imf.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_imf.cpp Tue Nov 19 22:29:05 2024 (r22250) +++ trunk/OpenMPT/soundlib/Load_imf.cpp Wed Nov 20 21:46:40 2024 (r22251) @@ -190,7 +190,7 @@ // Convert an IMFSample to OpenMPT's internal sample representation. void ConvertToMPT(ModSample &mptSmp) const { - mptSmp.Initialize(); + mptSmp.Initialize(MOD_TYPE_IMF); mptSmp.filename = mpt::String::ReadBuf(mpt::String::nullTerminated, filename); mptSmp.nLength = length; @@ -536,7 +536,7 @@ const auto [e1c, e1d, e2c, e2d] = patternChunk.ReadArray<uint8, 4>(); // Command 1, Data 1, Command 2, Data 2 const auto [command1, param1] = TranslateIMFEffect(e1c, e1d); const auto [command2, param2] = TranslateIMFEffect(e2c, e2d); - m.FillInTwoCommands(command1, param1, command2, param2); + m.FillInTwoCommands(command1, param1, command2, param2, true); } else if(mask & 0xC0) { // There's one effect, just stick it in the effect column (unless it's a volume command) Modified: trunk/OpenMPT/soundlib/Load_med.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp Tue Nov 19 22:29:05 2024 (r22250) +++ trunk/OpenMPT/soundlib/Load_med.cpp Wed Nov 20 21:46:40 2024 (r22251) @@ -668,7 +668,7 @@ if(oldCmd.first != CMD_NONE && m->command != oldCmd.first) { if(!ModCommand::CombineEffects(m->command, m->param, oldCmd.first, oldCmd.second) && m->volcmd == VOLCMD_NONE) - m->FillInTwoCommands(m->command, m->param, oldCmd.first, oldCmd.second); + m->FillInTwoCommands(m->command, m->param, oldCmd.first, oldCmd.second, true); // Reset X-Param to 8-bit value if this cell was overwritten with a "useful" effect if(row > 0 && oldCmd.first == CMD_XPARAM && m->command != CMD_XPARAM) pattern.GetpModCommand(row - 1, chn)->param = Util::MaxValueOfType(m->param); Modified: trunk/OpenMPT/soundlib/ModSample.cpp ============================================================================== --- trunk/OpenMPT/soundlib/ModSample.cpp Tue Nov 19 22:29:05 2024 (r22250) +++ trunk/OpenMPT/soundlib/ModSample.cpp Wed Nov 20 21:46:40 2024 (r22251) @@ -155,7 +155,16 @@ rootNote = 0; filename = ""; - RemoveAllCuePoints(); + if(type & (MOD_TYPE_DBM | MOD_TYPE_IMF | MOD_TYPE_MED)) + { + for(SmpLength i = 1; i < 10; i++) + { + cues[i - 1] = Util::muldiv_unsigned(i, 255 * 256, 9); + } + } else + { + RemoveAllCuePoints(); + } } Modified: trunk/OpenMPT/soundlib/modcommand.cpp ============================================================================== --- trunk/OpenMPT/soundlib/modcommand.cpp Tue Nov 19 22:29:05 2024 (r22250) +++ trunk/OpenMPT/soundlib/modcommand.cpp Wed Nov 20 21:46:40 2024 (r22251) @@ -1394,7 +1394,7 @@ } -std::pair<EffectCommand, ModCommand::PARAM> ModCommand::FillInTwoCommands(EffectCommand effect1, uint8 param1, EffectCommand effect2, uint8 param2) +std::pair<EffectCommand, ModCommand::PARAM> ModCommand::FillInTwoCommands(EffectCommand effect1, uint8 param1, EffectCommand effect2, uint8 param2, bool allowLowResOffset) { if(effect1 == effect2) { @@ -1451,6 +1451,12 @@ std::swap(effect1, effect2); std::swap(param1, param2); } + if(effect2 == CMD_OFFSET && (allowLowResOffset || param2 == 0)) + { + SetVolumeCommand(VOLCMD_OFFSET, static_cast<ModCommand::VOL>(param2 ? std::max(param2 * 9 / 255, 1) : 0)); + SetEffectCommand(effect1, param1); + return {CMD_NONE, ModCommand::PARAM(0)}; + } SetVolumeCommand(VOLCMD_NONE, 0); SetEffectCommand(effect2, param2); return {effect1, param1}; Modified: trunk/OpenMPT/soundlib/modcommand.h ============================================================================== --- trunk/OpenMPT/soundlib/modcommand.h Tue Nov 19 22:29:05 2024 (r22250) +++ trunk/OpenMPT/soundlib/modcommand.h Wed Nov 20 21:46:40 2024 (r22251) @@ -241,7 +241,7 @@ // Try to convert a an effect into a volume column effect. Returns converted effect on success. [[nodiscard]] static std::pair<VolumeCommand, VOL> ConvertToVolCommand(const EffectCommand effect, PARAM param, bool force); // Takes two "normal" effect commands and converts them to volume column + effect column commands. Returns the dropped command + param (CMD_NONE if nothing had to be dropped). - std::pair<EffectCommand, PARAM> FillInTwoCommands(EffectCommand effect1, uint8 param1, EffectCommand effect2, uint8 param2); + std::pair<EffectCommand, PARAM> FillInTwoCommands(EffectCommand effect1, uint8 param1, EffectCommand effect2, uint8 param2, bool allowLowResOffset = false); // Try to combine two commands into one. Returns true on success and the combined command is placed in eff1 / param1. static bool CombineEffects(EffectCommand &eff1, uint8 ¶m1, EffectCommand &eff2, uint8 ¶m2); |
From: <sv...@op...> - 2024-11-19 21:29:18
|
Author: sagamusix Date: Tue Nov 19 22:29:05 2024 New Revision: 22250 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22250 Log: [Fix] MED: 7-bit volume doesn't apply to just any file with a BlockInfo. Maybe it's actually the 2nd command level extension that should enable it instead... Fixes ShowMeLove.med (https://www.un4seen.com/forum/?topic=15448.msg144136#msg144136). Modified: trunk/OpenMPT/soundlib/Load_med.cpp Modified: trunk/OpenMPT/soundlib/Load_med.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp Tue Nov 19 20:41:40 2024 (r22249) +++ trunk/OpenMPT/soundlib/Load_med.cpp Tue Nov 19 22:29:05 2024 (r22250) @@ -1620,7 +1620,6 @@ numRows = patHeader.numRows + 1; if(patHeader.blockInfoOffset) { - vol7bit = true; auto offset = file.GetPosition(); file.Seek(patHeader.blockInfoOffset); MMDBlockInfo blockInfo; @@ -1645,6 +1644,7 @@ && file.Seek(blockInfo.cmdExtTableOffset) && file.Seek(file.ReadUint32BE())) { + vol7bit = true; cmdExt = file.ReadChunk(numTracks * numRows * (1 + numPages)); } |
From: <sv...@op...> - 2024-11-19 19:41:51
|
Author: sagamusix Date: Tue Nov 19 20:41:40 2024 New Revision: 22249 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22249 Log: [Mod] Autosave: Don't use relative paths for external samples when autosaving to a user-specified folder. Prerequisite for https://bugs.openmpt.org/view.php?id=1837 Modified: trunk/OpenMPT/common/mptPathString.cpp trunk/OpenMPT/mptrack/AutoSaver.cpp trunk/OpenMPT/test/test.cpp Modified: trunk/OpenMPT/common/mptPathString.cpp ============================================================================== --- trunk/OpenMPT/common/mptPathString.cpp Tue Nov 19 20:24:00 2024 (r22248) +++ trunk/OpenMPT/common/mptPathString.cpp Tue Nov 19 20:41:40 2024 (r22249) @@ -55,7 +55,7 @@ using namespace path_literals; using char_type = RawPathString::value_type; mpt::PathString result = path; - if(path.empty()) + if(path.empty() || relativeTo.empty()) { return result; } @@ -79,7 +79,7 @@ using namespace path_literals; using char_type = RawPathString::value_type; mpt::PathString result = path; - if(path.empty()) + if(path.empty() || relativeTo.empty()) { return result; } Modified: trunk/OpenMPT/mptrack/AutoSaver.cpp ============================================================================== --- trunk/OpenMPT/mptrack/AutoSaver.cpp Tue Nov 19 20:24:00 2024 (r22248) +++ trunk/OpenMPT/mptrack/AutoSaver.cpp Tue Nov 19 20:41:40 2024 (r22249) @@ -141,7 +141,7 @@ { mpt::PathString name = GetBasePath(modDoc, true) + GetBaseName(modDoc); const CString timeStamp = CTime::GetCurrentTime().Format(_T(".AutoSave.%Y%m%d.%H%M%S.")); - name += mpt::PathString::FromCString(timeStamp); //append backtup tag + timestamp + name += mpt::PathString::FromCString(timeStamp); // Append backtup tag + timestamp name += mpt::PathString::FromUnicode(modDoc.GetSoundFile().GetModSpecifications().GetFileExtension()); return name; } @@ -167,8 +167,8 @@ case MOD_TYPE_MOD: success = sndFile.SaveMod(f); break; case MOD_TYPE_S3M: success = sndFile.SaveS3M(f); break; case MOD_TYPE_XM: success = sndFile.SaveXM(f); break; - case MOD_TYPE_IT: success = sndFile.SaveIT(f, fileName); break; - case MOD_TYPE_MPT: success = sndFile.SaveIT(f, fileName); break; + case MOD_TYPE_IT: success = sndFile.SaveIT(f, GetUseOriginalPath() ? fileName : mpt::PathString{}); break; + case MOD_TYPE_MPT: success = sndFile.SaveIT(f, GetUseOriginalPath() ? fileName : mpt::PathString{}); break; default: // nothing break; Modified: trunk/OpenMPT/test/test.cpp ============================================================================== --- trunk/OpenMPT/test/test.cpp Tue Nov 19 20:24:00 2024 (r22248) +++ trunk/OpenMPT/test/test.cpp Tue Nov 19 20:41:40 2024 (r22249) @@ -2406,6 +2406,8 @@ VERIFY_EQUAL(mpt::RelativePathToAbsolute(P_("\\foo"), exePath), P_("C:\\foo")); VERIFY_EQUAL(mpt::AbsolutePathToRelative(P_("\\\\server\\path\\file"), exePath), P_("\\\\server\\path\\file")); VERIFY_EQUAL(mpt::RelativePathToAbsolute(P_("\\\\server\\path\\file"), exePath), P_("\\\\server\\path\\file")); + VERIFY_EQUAL(mpt::AbsolutePathToRelative(P_("C:\\OpenMPT"), mpt::PathString{}), P_("C:\\OpenMPT")); + VERIFY_EQUAL(mpt::RelativePathToAbsolute(P_("C:\\OpenMPT"), mpt::PathString{}), P_("C:\\OpenMPT")); #endif #ifdef MODPLUG_TRACKER |
From: <sv...@op...> - 2024-11-19 19:24:17
|
Author: sagamusix Date: Tue Nov 19 20:24:00 2024 New Revision: 22248 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22248 Log: [Mod] Tree view: Explicitly avoid opening an empty path name when choosing "Open in Explorer". It doesn't do anything, but still better to explicitly document the possibility of the path being empty. Modified: trunk/OpenMPT/mptrack/View_tre.cpp Modified: trunk/OpenMPT/mptrack/View_tre.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp Tue Nov 19 19:26:05 2024 (r22247) +++ trunk/OpenMPT/mptrack/View_tre.cpp Tue Nov 19 20:24:00 2024 (r22248) @@ -1826,7 +1826,8 @@ switch(modItem.type) { case MODITEM_HDR_SONG: - CTrackApp::OpenDirectory(GetDocumentFromItem(hItem)->GetPathNameMpt()); + if(const auto pathName = GetDocumentFromItem(hItem)->GetPathNameMpt(); !pathName.empty()) + CTrackApp::OpenDirectory(pathName); break; case MODITEM_INSLIB_SONG: theApp.OpenDocumentFile(InsLibGetFullPath(hItem).ToCString()); |
From: <sv...@op...> - 2024-11-19 18:26:12
|
Author: sagamusix Date: Tue Nov 19 19:26:05 2024 New Revision: 22247 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22247 Log: [Fix] Compile fix for libopenmpt. Modified: trunk/OpenMPT/libopenmpt/libopenmpt_ext_impl.cpp Modified: trunk/OpenMPT/libopenmpt/libopenmpt_ext_impl.cpp ============================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_ext_impl.cpp Tue Nov 19 19:23:18 2024 (r22246) +++ trunk/OpenMPT/libopenmpt/libopenmpt_ext_impl.cpp Tue Nov 19 19:26:05 2024 (r22247) @@ -169,11 +169,11 @@ if ( volume < 0.0 || volume > 1.0 ) { throw openmpt::exception("invalid global volume"); } - m_sndFile->m_PlayState.m_nGlobalVolume = mpt::saturate_round<uint32_t>( volume * MAX_GLOBAL_VOLUME ); + m_sndFile->m_PlayState.m_nGlobalVolume = mpt::saturate_round<uint32_t>( volume * OpenMPT::MAX_GLOBAL_VOLUME ); } double module_ext_impl::get_global_volume( ) const { - return m_sndFile->m_PlayState.m_nGlobalVolume / static_cast<double>( MAX_GLOBAL_VOLUME ); + return m_sndFile->m_PlayState.m_nGlobalVolume / static_cast<double>( OpenMPT::MAX_GLOBAL_VOLUME ); } void module_ext_impl::set_channel_volume( std::int32_t channel, double volume ) { |
From: <sv...@op...> - 2024-11-19 18:23:34
|
Author: sagamusix Date: Tue Nov 19 19:23:18 2024 New Revision: 22246 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22246 Log: Merged revision(s) 22245 from trunk/OpenMPT: [Imp] Tree view: Add option to open modules and instrument library entries in Explorer (https://bugs.openmpt.org/view.php?id=677). ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/mptrack/Mptrack.cpp branches/OpenMPT-1.31/mptrack/Mptrack.h branches/OpenMPT-1.31/mptrack/View_tre.cpp Modified: branches/OpenMPT-1.31/mptrack/Mptrack.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/Mptrack.cpp Tue Nov 19 19:22:58 2024 (r22245) +++ branches/OpenMPT-1.31/mptrack/Mptrack.cpp Tue Nov 19 19:23:18 2024 (r22246) @@ -2436,7 +2436,7 @@ return OpenURL(mpt::PathString::FromUnicode(url)); } -bool CTrackApp::OpenURL(const mpt::PathString &lpszURL) +bool CTrackApp::OpenURL(const mpt::PathString &lpszURL, const mpt::tstring ¶m) { if(!lpszURL.empty() && theApp.m_pMainWnd) { @@ -2444,8 +2444,8 @@ theApp.m_pMainWnd->m_hWnd, _T("open"), lpszURL.AsNative().c_str(), - NULL, - NULL, + param.empty() ? nullptr : param.c_str(), + nullptr, SW_SHOW)) >= 32) { return true; @@ -2454,6 +2454,14 @@ return false; } +bool CTrackApp::OpenDirectory(const mpt::PathString &directory) +{ + if(mpt::native_fs{}.is_file(directory)) + return OpenURL(P_("explorer.exe"), MPT_TFORMAT("/select,\"{}\"")(directory.AsNative())); + else + return OpenURL(directory); +} + CString CTrackApp::GetResamplingModeName(ResamplingMode mode, int length, bool addTaps) { Modified: branches/OpenMPT-1.31/mptrack/Mptrack.h ============================================================================== --- branches/OpenMPT-1.31/mptrack/Mptrack.h Tue Nov 19 19:22:58 2024 (r22245) +++ branches/OpenMPT-1.31/mptrack/Mptrack.h Tue Nov 19 19:23:18 2024 (r22246) @@ -205,9 +205,9 @@ static bool OpenURL(const std::string &url); // UTF8 static bool OpenURL(const CString &url); static bool OpenURL(const mpt::ustring &url); - static bool OpenURL(const mpt::PathString &lpszURL); + static bool OpenURL(const mpt::PathString &lpszURL, const mpt::tstring ¶m = {}); static bool OpenFile(const mpt::PathString &file) { return OpenURL(file); }; - static bool OpenDirectory(const mpt::PathString &directory) { return OpenURL(directory); }; + static bool OpenDirectory(const mpt::PathString &directory); // Retrieve the user-supplied MIDI port name for a MIDI input or output port. mpt::ustring GetFriendlyMIDIPortName(const mpt::ustring &deviceName, bool isInputPort, bool addDeviceName = true); Modified: branches/OpenMPT-1.31/mptrack/View_tre.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/View_tre.cpp Tue Nov 19 19:22:58 2024 (r22245) +++ branches/OpenMPT-1.31/mptrack/View_tre.cpp Tue Nov 19 19:23:18 2024 (r22246) @@ -1791,13 +1791,18 @@ switch(modItem.type) { + case MODITEM_HDR_SONG: + CTrackApp::OpenDirectory(GetDocumentFromItem(hItem)->GetPathNameMpt()); + break; case MODITEM_INSLIB_SONG: theApp.OpenDocumentFile(InsLibGetFullPath(hItem).ToCString()); break; case MODITEM_HDR_INSTRUMENTLIB: - CTrackApp::OpenDirectory(m_InstrLibPath); + CTrackApp::OpenDirectory(m_InstrLibPath + m_SongFileName); break; case MODITEM_INSLIB_FOLDER: + case MODITEM_INSLIB_INSTRUMENT: + case MODITEM_INSLIB_SAMPLE: // Open path in Explorer CTrackApp::OpenDirectory(InsLibGetFullPath(hItem)); break; @@ -3001,6 +3006,7 @@ AppendMenu(hMenu, MF_STRING, defaultID, ih->GetKeyTextFromCommand(kcTreeViewOpen, _T("&View"))); AppendMenu(hMenu, MF_STRING, ID_MODTREE_CLOSE, _T("&Close")); AppendMenu(hMenu, MF_STRING, ID_MODTREE_RENAME, ih->GetKeyTextFromCommand(kcTreeViewRename, _T("Re&name"))); + AppendMenu(hMenu, MF_STRING, ID_MODTREE_OPENITEM, _T("&Open in Explorer")); break; case MODITEM_COMMENTS: @@ -3068,7 +3074,7 @@ AppendMenu(hMenu, MF_STRING, ID_MODTREE_RENAME, ih->GetKeyTextFromCommand(kcTreeViewRename, _T("Re&name Sample"))); if(modDoc && !modDoc->GetNumInstruments()) { - AppendMenu(hMenu, MF_SEPARATOR, NULL, _T("")); + AppendMenu(hMenu, MF_SEPARATOR, 0, _T("")); AppendMenu(hMenu, (modDoc->IsSampleMuted((SAMPLEINDEX)modItemID) ? MF_CHECKED : 0) | MF_STRING, ID_MODTREE_MUTE, _T("&Mute Sample")); AppendMenu(hMenu, MF_STRING, ID_MODTREE_SOLO, _T("S&olo Sample")); AppendMenu(hMenu, MF_STRING, ID_MODTREE_UNMUTEALL, _T("&Unmute all")); @@ -3100,7 +3106,7 @@ if(menuForThisSample || anyPath || anyModified) { - AppendMenu(hMenu, MF_SEPARATOR, NULL, _T("")); + AppendMenu(hMenu, MF_SEPARATOR, 0, _T("")); if(menuForThisSample) AppendMenu(hMenu, MF_STRING | ((sndFile->GetType() == MOD_TYPE_MPT || hasPath) ? 0 : MF_GRAYED), ID_MODTREE_SETPATH, _T("Set P&ath")); if(menuForThisSample) AppendMenu(hMenu, MF_STRING | ((hasPath && sample.HasSampleData() && sample.uFlags[SMP_MODIFIED]) ? 0 : MF_GRAYED), ID_MODTREE_SAVEITEM, _T("&Save")); if(anyModified) AppendMenu(hMenu, MF_STRING, ID_MODTREE_SAVEALL, _T("&Save All")); @@ -3121,7 +3127,7 @@ AppendMenu(hMenu, MF_STRING, ID_MODTREE_RENAME, ih->GetKeyTextFromCommand(kcTreeViewRename, _T("Re&name Instrument"))); if(modDoc) { - AppendMenu(hMenu, MF_SEPARATOR, NULL, _T("")); + AppendMenu(hMenu, MF_SEPARATOR, 0, _T("")); AppendMenu(hMenu, (modDoc->IsInstrumentMuted((INSTRUMENTINDEX)modItemID) ? MF_CHECKED : 0) | MF_STRING, ID_MODTREE_MUTE, _T("&Mute Instrument")); AppendMenu(hMenu, MF_STRING, ID_MODTREE_SOLO, _T("S&olo Instrument")); AppendMenu(hMenu, MF_STRING, ID_MODTREE_UNMUTEALL, _T("&Unmute all")); @@ -3154,7 +3160,7 @@ AppendMenu(hMenu, MF_STRING, defaultID, ih->GetKeyTextFromCommand(kcTreeViewOpen, _T("&Map Instrument"))); AppendMenu(hMenu, MF_STRING, ID_MODTREE_PLAY, ih->GetKeyTextFromCommand(kcTreeViewPlay, _T("&Play Instrument"))); AppendMenu(hMenu, MF_STRING, ID_MODTREE_REMOVE, _T("&Unmap Instrument")); - AppendMenu(hMenu, MF_SEPARATOR, NULL, _T("")); + AppendMenu(hMenu, MF_SEPARATOR, 0, _T("")); [[fallthrough]]; case MODITEM_HDR_MIDILIB: case MODITEM_HDR_MIDIGROUP: @@ -3194,7 +3200,7 @@ AppendMenu(hMenu, MF_STRING, defaultID, ih->GetKeyTextFromCommand(kcTreeViewOpen, _T("&Browse Song..."))); AppendMenu(hMenu, MF_STRING, ID_MODTREE_OPENITEM, _T("&Edit Song")); hSubMenu = AddLibraryFindAndSortMenus(hMenu); - AppendMenu(hMenu, MF_SEPARATOR, NULL, _T("")); + AppendMenu(hMenu, MF_SEPARATOR, 0, _T("")); AppendMenu(hMenu, MF_STRING, ID_MODTREE_REMOVE, ih->GetKeyTextFromCommand(kcTreeViewDelete, _T("&Delete"))); break; @@ -3207,6 +3213,8 @@ } else { AppendMenu(hMenu, MF_STRING, ID_MODTREE_PLAY, ih->GetKeyTextFromCommand(kcTreeViewPlay, _T("&Play File"))); + AppendMenu(hMenu, MF_SEPARATOR, 0, _T("")); + AppendMenu(hMenu, MF_STRING, ID_MODTREE_OPENITEM, _T("&Open in Explorer")); AppendMenu(hMenu, MF_STRING, ID_MODTREE_REMOVE, ih->GetKeyTextFromCommand(kcTreeViewDelete, _T("&Delete"))); } hSubMenu = AddLibraryFindAndSortMenus(hMenu); @@ -3236,7 +3244,7 @@ || (modItem.type == MODITEM_HDR_INSTRUMENTLIB)) { if(addSeparator || defaultID) - AppendMenu(hMenu, MF_SEPARATOR, NULL, _T("")); + AppendMenu(hMenu, MF_SEPARATOR, 0, _T("")); AppendMenu(hMenu, TrackerSettings::Instance().showDirsInSampleBrowser ? (MF_STRING|MF_CHECKED) : MF_STRING, ID_MODTREE_SHOWDIRS, _T("Show &Directories in Sample Browser")); AppendMenu(hMenu, (m_showAllFiles) ? (MF_STRING|MF_CHECKED) : MF_STRING, ID_MODTREE_SHOWALLFILES, _T("Show &All Files")); AppendMenu(hMenu, (m_showAllFiles) ? MF_STRING : (MF_STRING|MF_CHECKED), ID_MODTREE_SOUNDFILESONLY, _T("Show &Sound Files")); @@ -3244,7 +3252,7 @@ } if(addSeparator || defaultID) - AppendMenu(hMenu, MF_SEPARATOR, NULL, _T("")); + AppendMenu(hMenu, MF_SEPARATOR, 0, _T("")); AppendMenu(hMenu, MF_STRING, ID_MODTREE_REFRESH, _T("&Refresh")); TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x + 4, pt.y, 0, m_hWnd, NULL); @@ -3779,7 +3787,7 @@ std::vector<INSTRUMENTINDEX> newOrder = GenerateInsertVector<INSTRUMENTINDEX>(sndFile.GetNumInstruments(), modItemID, static_cast<INSTRUMENTINDEX>(insert ? 0 : modItemID), 1); if(modDoc.ReArrangeInstruments(newOrder) != INSTRUMENTINDEX_INVALID) { - modDoc.UpdateAllViews(NULL, InstrumentHint().Info().Envelope().Names()); + modDoc.UpdateAllViews(nullptr, InstrumentHint().Info().Envelope().Names()); modDoc.UpdateAllViews(nullptr, PatternHint().Data()); modDoc.SetModified(); } else @@ -3848,7 +3856,7 @@ SAMPLEINDEX smpID = static_cast<SAMPLEINDEX>(modItem.val1); pModDoc->SaveSample(smpID); if(pModDoc) - pModDoc->UpdateAllViews(NULL, SampleHint(smpID).Info()); + pModDoc->UpdateAllViews(nullptr, SampleHint(smpID).Info()); OnRefreshTree(); } } @@ -3889,7 +3897,7 @@ { pModDoc->SetModified(); } - pModDoc->UpdateAllViews(NULL, SampleHint(smpID).Info().Data().Names()); + pModDoc->UpdateAllViews(nullptr, SampleHint(smpID).Info().Data().Names()); } OnRefreshTree(); @@ -4028,7 +4036,7 @@ if(stgm.hGlobal == NULL) return FALSE; hDropInfo = (HDROP)stgm.hGlobal; - nFiles = DragQueryFile(hDropInfo, (UINT)-1, NULL, 0); + nFiles = DragQueryFile(hDropInfo, (UINT)-1, nullptr, 0); if(nFiles) { UINT size = ::DragQueryFile(hDropInfo, 0, nullptr, 0) + 1; @@ -4601,7 +4609,7 @@ void CModTree::OnDropFiles(HDROP hDropInfo) { bool refreshDLS = false; - const UINT nFiles = ::DragQueryFile(hDropInfo, (UINT)-1, NULL, 0); + const UINT nFiles = ::DragQueryFile(hDropInfo, (UINT)-1, nullptr, 0); CMainFrame::GetMainFrame()->SetForegroundWindow(); for(UINT f = 0; f < nFiles; f++) { |
From: <sv...@op...> - 2024-11-19 18:23:07
|
Author: sagamusix Date: Tue Nov 19 19:22:58 2024 New Revision: 22245 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22245 Log: [Imp] Tree view: Add option to open modules and instrument library entries in Explorer (https://bugs.openmpt.org/view.php?id=677). Modified: trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/View_tre.cpp Modified: trunk/OpenMPT/mptrack/Mptrack.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp Tue Nov 19 19:15:56 2024 (r22244) +++ trunk/OpenMPT/mptrack/Mptrack.cpp Tue Nov 19 19:22:58 2024 (r22245) @@ -2441,7 +2441,7 @@ return OpenURL(mpt::PathString::FromUnicode(url)); } -bool CTrackApp::OpenURL(const mpt::PathString &lpszURL) +bool CTrackApp::OpenURL(const mpt::PathString &lpszURL, const mpt::tstring ¶m) { if(!lpszURL.empty() && theApp.m_pMainWnd) { @@ -2449,8 +2449,8 @@ theApp.m_pMainWnd->m_hWnd, _T("open"), lpszURL.AsNative().c_str(), - NULL, - NULL, + param.empty() ? nullptr : param.c_str(), + nullptr, SW_SHOW)) >= 32) { return true; @@ -2459,6 +2459,14 @@ return false; } +bool CTrackApp::OpenDirectory(const mpt::PathString &directory) +{ + if(mpt::native_fs{}.is_file(directory)) + return OpenURL(P_("explorer.exe"), MPT_TFORMAT("/select,\"{}\"")(directory.AsNative())); + else + return OpenURL(directory); +} + CString CTrackApp::GetResamplingModeName(ResamplingMode mode, int length, bool addTaps) { Modified: trunk/OpenMPT/mptrack/Mptrack.h ============================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h Tue Nov 19 19:15:56 2024 (r22244) +++ trunk/OpenMPT/mptrack/Mptrack.h Tue Nov 19 19:22:58 2024 (r22245) @@ -204,9 +204,9 @@ static bool OpenURL(const std::string &url); // UTF8 static bool OpenURL(const CString &url); static bool OpenURL(const mpt::ustring &url); - static bool OpenURL(const mpt::PathString &lpszURL); + static bool OpenURL(const mpt::PathString &lpszURL, const mpt::tstring ¶m = {}); static bool OpenFile(const mpt::PathString &file) { return OpenURL(file); }; - static bool OpenDirectory(const mpt::PathString &directory) { return OpenURL(directory); }; + static bool OpenDirectory(const mpt::PathString &directory); // Retrieve the user-supplied MIDI port name for a MIDI input or output port. mpt::ustring GetFriendlyMIDIPortName(const mpt::ustring &deviceName, bool isInputPort, bool addDeviceName = true); Modified: trunk/OpenMPT/mptrack/View_tre.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp Tue Nov 19 19:15:56 2024 (r22244) +++ trunk/OpenMPT/mptrack/View_tre.cpp Tue Nov 19 19:22:58 2024 (r22245) @@ -1825,13 +1825,18 @@ switch(modItem.type) { + case MODITEM_HDR_SONG: + CTrackApp::OpenDirectory(GetDocumentFromItem(hItem)->GetPathNameMpt()); + break; case MODITEM_INSLIB_SONG: theApp.OpenDocumentFile(InsLibGetFullPath(hItem).ToCString()); break; case MODITEM_HDR_INSTRUMENTLIB: - CTrackApp::OpenDirectory(m_InstrLibPath); + CTrackApp::OpenDirectory(m_InstrLibPath + m_SongFileName); break; case MODITEM_INSLIB_FOLDER: + case MODITEM_INSLIB_INSTRUMENT: + case MODITEM_INSLIB_SAMPLE: // Open path in Explorer CTrackApp::OpenDirectory(InsLibGetFullPath(hItem)); break; @@ -3047,6 +3052,7 @@ AppendMenu(hMenu, MF_STRING, defaultID, ih->GetKeyTextFromCommand(kcTreeViewOpen, _T("&View"))); AppendMenu(hMenu, MF_STRING, ID_MODTREE_CLOSE, _T("&Close")); AppendMenu(hMenu, MF_STRING, ID_MODTREE_RENAME, ih->GetKeyTextFromCommand(kcTreeViewRename, _T("Re&name"))); + AppendMenu(hMenu, MF_STRING, ID_MODTREE_OPENITEM, _T("&Open in Explorer")); break; case MODITEM_COMMENTS: @@ -3114,7 +3120,7 @@ AppendMenu(hMenu, MF_STRING, ID_MODTREE_RENAME, ih->GetKeyTextFromCommand(kcTreeViewRename, _T("Re&name Sample"))); if(modDoc && !modDoc->GetNumInstruments()) { - AppendMenu(hMenu, MF_SEPARATOR, NULL, _T("")); + AppendMenu(hMenu, MF_SEPARATOR, 0, _T("")); AppendMenu(hMenu, (modDoc->IsSampleMuted((SAMPLEINDEX)modItemID) ? MF_CHECKED : 0) | MF_STRING, ID_MODTREE_MUTE, _T("&Mute Sample")); AppendMenu(hMenu, MF_STRING, ID_MODTREE_SOLO, _T("S&olo Sample")); AppendMenu(hMenu, MF_STRING, ID_MODTREE_UNMUTEALL, _T("&Unmute all")); @@ -3146,7 +3152,7 @@ if(menuForThisSample || anyPath || anyModified) { - AppendMenu(hMenu, MF_SEPARATOR, NULL, _T("")); + AppendMenu(hMenu, MF_SEPARATOR, 0, _T("")); if(menuForThisSample) AppendMenu(hMenu, MF_STRING | ((sndFile->GetType() == MOD_TYPE_MPT || hasPath) ? 0 : MF_GRAYED), ID_MODTREE_SETPATH, _T("Set P&ath")); if(menuForThisSample) AppendMenu(hMenu, MF_STRING | ((hasPath && sample.HasSampleData() && sample.uFlags[SMP_MODIFIED]) ? 0 : MF_GRAYED), ID_MODTREE_SAVEITEM, _T("&Save")); if(anyModified) AppendMenu(hMenu, MF_STRING, ID_MODTREE_SAVEALL, _T("&Save All")); @@ -3167,7 +3173,7 @@ AppendMenu(hMenu, MF_STRING, ID_MODTREE_RENAME, ih->GetKeyTextFromCommand(kcTreeViewRename, _T("Re&name Instrument"))); if(modDoc) { - AppendMenu(hMenu, MF_SEPARATOR, NULL, _T("")); + AppendMenu(hMenu, MF_SEPARATOR, 0, _T("")); AppendMenu(hMenu, (modDoc->IsInstrumentMuted((INSTRUMENTINDEX)modItemID) ? MF_CHECKED : 0) | MF_STRING, ID_MODTREE_MUTE, _T("&Mute Instrument")); AppendMenu(hMenu, MF_STRING, ID_MODTREE_SOLO, _T("S&olo Instrument")); AppendMenu(hMenu, MF_STRING, ID_MODTREE_UNMUTEALL, _T("&Unmute all")); @@ -3200,7 +3206,7 @@ AppendMenu(hMenu, MF_STRING, defaultID, ih->GetKeyTextFromCommand(kcTreeViewOpen, _T("&Map Instrument"))); AppendMenu(hMenu, MF_STRING, ID_MODTREE_PLAY, ih->GetKeyTextFromCommand(kcTreeViewPlay, _T("&Play Instrument"))); AppendMenu(hMenu, MF_STRING, ID_MODTREE_REMOVE, _T("&Unmap Instrument")); - AppendMenu(hMenu, MF_SEPARATOR, NULL, _T("")); + AppendMenu(hMenu, MF_SEPARATOR, 0, _T("")); [[fallthrough]]; case MODITEM_HDR_MIDILIB: case MODITEM_HDR_MIDIGROUP: @@ -3240,7 +3246,7 @@ AppendMenu(hMenu, MF_STRING, defaultID, ih->GetKeyTextFromCommand(kcTreeViewOpen, _T("&Browse Song..."))); AppendMenu(hMenu, MF_STRING, ID_MODTREE_OPENITEM, _T("&Edit Song")); hSubMenu = AddLibraryFindAndSortMenus(hMenu); - AppendMenu(hMenu, MF_SEPARATOR, NULL, _T("")); + AppendMenu(hMenu, MF_SEPARATOR, 0, _T("")); AppendMenu(hMenu, MF_STRING, ID_MODTREE_REMOVE, ih->GetKeyTextFromCommand(kcTreeViewDelete, _T("&Delete"))); break; @@ -3253,6 +3259,8 @@ } else { AppendMenu(hMenu, MF_STRING, ID_MODTREE_PLAY, ih->GetKeyTextFromCommand(kcTreeViewPlay, _T("&Play File"))); + AppendMenu(hMenu, MF_SEPARATOR, 0, _T("")); + AppendMenu(hMenu, MF_STRING, ID_MODTREE_OPENITEM, _T("&Open in Explorer")); AppendMenu(hMenu, MF_STRING, ID_MODTREE_REMOVE, ih->GetKeyTextFromCommand(kcTreeViewDelete, _T("&Delete"))); } hSubMenu = AddLibraryFindAndSortMenus(hMenu); @@ -3285,7 +3293,7 @@ || (modItem.type == MODITEM_HDR_INSTRUMENTLIB)) { if(addSeparator || defaultID) - AppendMenu(hMenu, MF_SEPARATOR, NULL, _T("")); + AppendMenu(hMenu, MF_SEPARATOR, 0, _T("")); AppendMenu(hMenu, TrackerSettings::Instance().showDirsInSampleBrowser ? (MF_STRING|MF_CHECKED) : MF_STRING, ID_MODTREE_SHOWDIRS, _T("Show &Directories in Sample Browser")); AppendMenu(hMenu, (m_showAllFiles) ? (MF_STRING|MF_CHECKED) : MF_STRING, ID_MODTREE_SHOWALLFILES, _T("Show &All Files")); AppendMenu(hMenu, (m_showAllFiles) ? MF_STRING : (MF_STRING|MF_CHECKED), ID_MODTREE_SOUNDFILESONLY, _T("Show &Sound Files")); @@ -3293,7 +3301,7 @@ } if(addSeparator || defaultID) - AppendMenu(hMenu, MF_SEPARATOR, NULL, _T("")); + AppendMenu(hMenu, MF_SEPARATOR, 0, _T("")); AppendMenu(hMenu, MF_STRING, ID_MODTREE_REFRESH, _T("&Refresh")); TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x + 4, pt.y, 0, m_hWnd, NULL); @@ -3835,7 +3843,7 @@ std::vector<INSTRUMENTINDEX> newOrder = GenerateInsertVector<INSTRUMENTINDEX>(sndFile.GetNumInstruments(), modItemID, static_cast<INSTRUMENTINDEX>(insert ? 0 : modItemID), 1); if(modDoc.ReArrangeInstruments(newOrder) != INSTRUMENTINDEX_INVALID) { - modDoc.UpdateAllViews(NULL, InstrumentHint().Info().Envelope().Names()); + modDoc.UpdateAllViews(nullptr, InstrumentHint().Info().Envelope().Names()); modDoc.UpdateAllViews(nullptr, PatternHint().Data()); modDoc.SetModified(); } else @@ -3904,7 +3912,7 @@ SAMPLEINDEX smpID = static_cast<SAMPLEINDEX>(modItem.val1); pModDoc->SaveSample(smpID); if(pModDoc) - pModDoc->UpdateAllViews(NULL, SampleHint(smpID).Info()); + pModDoc->UpdateAllViews(nullptr, SampleHint(smpID).Info()); OnRefreshTree(); } } @@ -3945,7 +3953,7 @@ { pModDoc->SetModified(); } - pModDoc->UpdateAllViews(NULL, SampleHint(smpID).Info().Data().Names()); + pModDoc->UpdateAllViews(nullptr, SampleHint(smpID).Info().Data().Names()); } OnRefreshTree(); @@ -4086,7 +4094,7 @@ if(stgm.hGlobal == NULL) return FALSE; hDropInfo = (HDROP)stgm.hGlobal; - nFiles = DragQueryFile(hDropInfo, (UINT)-1, NULL, 0); + nFiles = DragQueryFile(hDropInfo, (UINT)-1, nullptr, 0); if(nFiles) { UINT size = ::DragQueryFile(hDropInfo, 0, nullptr, 0) + 1; @@ -4679,7 +4687,7 @@ void CModTree::OnDropFiles(HDROP hDropInfo) { bool refreshDLS = false; - const UINT nFiles = ::DragQueryFile(hDropInfo, (UINT)-1, NULL, 0); + const UINT nFiles = ::DragQueryFile(hDropInfo, (UINT)-1, nullptr, 0); CMainFrame::GetMainFrame()->SetForegroundWindow(); for(UINT f = 0; f < nFiles; f++) { |
From: <sv...@op...> - 2024-11-19 18:16:08
|
Author: sagamusix Date: Tue Nov 19 19:15:56 2024 New Revision: 22244 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22244 Log: [Fix] Use inline instead of static. Modified: trunk/OpenMPT/soundlib/Snd_defs.h Modified: trunk/OpenMPT/soundlib/Snd_defs.h ============================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h Tue Nov 19 19:13:09 2024 (r22243) +++ trunk/OpenMPT/soundlib/Snd_defs.h Tue Nov 19 19:15:56 2024 (r22244) @@ -333,8 +333,8 @@ #define SNDMIX_MUTECHNMODE 0x100000 // Notes are not played on muted channels -static constexpr uint32 MAX_GLOBAL_VOLUME = 256; -static constexpr uint32 MAX_PREAMP = 2000; +inline constexpr uint32 MAX_GLOBAL_VOLUME = 256; +inline constexpr uint32 MAX_PREAMP = 2000; // When to execute a position override event enum class OrderTransitionMode : uint8 |
From: <sv...@op...> - 2024-11-19 18:13:15
|
Author: sagamusix Date: Tue Nov 19 19:13:09 2024 New Revision: 22243 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22243 Log: [Ref] Use new MAX_PREAMP constant in GUI too. Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp Tue Nov 19 19:12:48 2024 (r22242) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp Tue Nov 19 19:13:09 2024 (r22243) @@ -575,8 +575,8 @@ m_EditVSTiVol.GetWindowText(s, mpt::saturate_cast<int>(std::size(s))); if (s[0]) { - UINT n = mpt::parse<UINT>(s); - Limit(n, 0u, 2000u); + uint32 n = mpt::parse<uint32>(s); + Limit(n, uint32(0), MAX_PREAMP); if (n != m_sndFile.m_nVSTiVolume) { m_editsLocked = true; @@ -599,8 +599,8 @@ m_EditSamplePA.GetWindowText(s, mpt::saturate_cast<int>(std::size(s))); if (s[0]) { - UINT n = mpt::parse<UINT>(s); - Limit(n, 0u, 2000u); + uint32 n = mpt::parse<uint32>(s); + Limit(n, uint32(0), MAX_PREAMP); if (n != m_sndFile.m_nSamplePreAmp) { m_editsLocked = true; |
From: <sv...@op...> - 2024-11-19 18:13:04
|
Author: sagamusix Date: Tue Nov 19 19:12:48 2024 New Revision: 22242 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22242 Log: [Ref] Silence warning. Modified: trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/Sndfile.cpp Modified: trunk/OpenMPT/soundlib/Snd_defs.h ============================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h Tue Nov 19 18:57:55 2024 (r22241) +++ trunk/OpenMPT/soundlib/Snd_defs.h Tue Nov 19 19:12:48 2024 (r22242) @@ -333,7 +333,8 @@ #define SNDMIX_MUTECHNMODE 0x100000 // Notes are not played on muted channels -#define MAX_GLOBAL_VOLUME 256u +static constexpr uint32 MAX_GLOBAL_VOLUME = 256; +static constexpr uint32 MAX_PREAMP = 2000; // When to execute a position override event enum class OrderTransitionMode : uint8 Modified: trunk/OpenMPT/soundlib/Sndfile.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp Tue Nov 19 18:57:55 2024 (r22241) +++ trunk/OpenMPT/soundlib/Sndfile.cpp Tue Nov 19 19:12:48 2024 (r22242) @@ -673,8 +673,8 @@ LimitMax(m_nDefaultRowsPerBeat, MAX_ROWS_PER_BEAT); LimitMax(m_nDefaultRowsPerMeasure, MAX_ROWS_PER_BEAT); LimitMax(m_nDefaultGlobalVolume, MAX_GLOBAL_VOLUME); - LimitMax(m_nSamplePreAmp, 2000); - LimitMax(m_nVSTiVolume, 2000); + LimitMax(m_nSamplePreAmp, MAX_PREAMP); + LimitMax(m_nVSTiVolume, MAX_PREAMP); if(!m_tempoSwing.empty()) m_tempoSwing.resize(m_nDefaultRowsPerBeat); |
From: <sv...@op...> - 2024-11-19 17:58:31
|
Author: sagamusix Revision: 22241 Property Name: svn:log Action: modified Property diff: --- old property value +++ new property value @@ -1,2 +1,2 @@ -[Fix] Also limit sample pre-amp to 2000 for formats where we retrieve it through other means than OpenMPT song extensions (e.g. MO3). -[Fix] Sanitize sample length and loop points for missing external samples as well. Otherwise invalid values might be used during seeking. \ No newline at end of file +[Fix] Also limit sample pre-amp to 2000 for formats where we retrieve it through other means than OpenMPT song extensions (e.g. MO3). Found with afl++ + ubsan. +[Fix] Sanitize sample length and loop points for missing external samples as well. Otherwise invalid values might be used during seeking. Found with afl++ + ubsan. \ No newline at end of file |
From: <sv...@op...> - 2024-11-19 17:58:01
|
Author: sagamusix Date: Tue Nov 19 18:57:55 2024 New Revision: 22241 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22241 Log: [Fix] Also limit sample pre-amp to 2000 for formats where we retrieve it through other means than OpenMPT song extensions (e.g. MO3). [Fix] Sanitize sample length and loop points for missing external samples as well. Otherwise invalid values might be used during seeking. Modified: trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Sndfile.cpp Modified: trunk/OpenMPT/soundlib/Load_it.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp Tue Nov 19 18:55:27 2024 (r22240) +++ trunk/OpenMPT/soundlib/Load_it.cpp Tue Nov 19 18:57:55 2024 (r22241) @@ -2664,11 +2664,6 @@ m_nMixLevels = MixLevels::Original; //m_dwCreatedWithVersion //m_dwLastSavedWithVersion - LimitMax(m_nSamplePreAmp, 2000u); - LimitMax(m_nVSTiVolume, 2000u); - LimitMax(m_nDefaultGlobalVolume, MAX_GLOBAL_VOLUME); - LimitMax(m_nDefaultRowsPerBeat, MAX_ROWS_PER_BEAT); - LimitMax(m_nDefaultRowsPerMeasure, MAX_ROWS_PER_BEAT); return true; } Modified: trunk/OpenMPT/soundlib/Sndfile.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp Tue Nov 19 18:55:27 2024 (r22240) +++ trunk/OpenMPT/soundlib/Sndfile.cpp Tue Nov 19 18:57:55 2024 (r22241) @@ -610,6 +610,8 @@ for(SAMPLEINDEX nSmp = 1; nSmp <= m_nSamples; nSmp++) { ModSample &sample = Samples[nSmp]; + LimitMax(sample.nLength, MAX_SAMPLE_LENGTH); + sample.SanitizeLoops(); #ifdef MPT_EXTERNAL_SAMPLES if(SampleHasPath(nSmp) && (loadFlags & loadSampleData)) @@ -671,6 +673,8 @@ LimitMax(m_nDefaultRowsPerBeat, MAX_ROWS_PER_BEAT); LimitMax(m_nDefaultRowsPerMeasure, MAX_ROWS_PER_BEAT); LimitMax(m_nDefaultGlobalVolume, MAX_GLOBAL_VOLUME); + LimitMax(m_nSamplePreAmp, 2000); + LimitMax(m_nVSTiVolume, 2000); if(!m_tempoSwing.empty()) m_tempoSwing.resize(m_nDefaultRowsPerBeat); |
From: <sv...@op...> - 2024-11-19 17:55:38
|
Author: sagamusix Date: Tue Nov 19 18:55:27 2024 New Revision: 22240 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22240 Log: Merged revision(s) 22239 from trunk/OpenMPT: [Imp] Instrument tab: Show tooltips for disabled envelope toolbar buttons, and show the button name in the toolbar. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/mptrack/View_ins.cpp Modified: branches/OpenMPT-1.31/mptrack/View_ins.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/View_ins.cpp Tue Nov 19 18:55:01 2024 (r22239) +++ branches/OpenMPT-1.31/mptrack/View_ins.cpp Tue Nov 19 18:55:27 2024 (r22240) @@ -786,7 +786,7 @@ GetWindowRect(&rcWnd); for(UINT i = 0; i < ENV_LEFTBAR_BUTTONS; i++) { - if(!(m_NcButtonState[i] & NCBTNS_DISABLED) && GetNcButtonRect(i, rect)) + if(GetNcButtonRect(i, rect)) { rect.OffsetRect(rcWnd.left, rcWnd.top); if(rect.PtInRect(point)) @@ -836,7 +836,7 @@ case ID_ENVELOPE_LOAD: case ID_ENVELOPE_SAVE: if(GetInstrumentPtr() == nullptr) dwStyle |= NCBTNS_DISABLED; break; } - if (m_nBtnMouseOver == i) + if (m_nBtnMouseOver == i && !(m_NcButtonState[i] & NCBTNS_DISABLED)) { dwStyle |= NCBTNS_MOUSEOVER; if (m_dwStatus & INSSTATUS_NCLBTNDOWN) dwStyle |= NCBTNS_PUSHED; @@ -1400,7 +1400,7 @@ void CViewInstrument::OnNcLButtonDown(UINT uFlags, CPoint point) { - if(m_nBtnMouseOver < ENV_LEFTBAR_BUTTONS) + if(m_nBtnMouseOver < ENV_LEFTBAR_BUTTONS && !(m_NcButtonState[m_nBtnMouseOver] & NCBTNS_DISABLED)) { m_dwStatus |= INSSTATUS_NCLBTNDOWN; if(cLeftBarButtons[m_nBtnMouseOver] != ID_SEPARATOR) @@ -2852,7 +2852,11 @@ pTI->hwnd = m_hWnd; pTI->uId = buttonID; pTI->rect = ncRect; - CString text = LoadResourceString(buttonID); + CString text; + if(m_NcButtonState[ncButton] & NCBTNS_DISABLED) + text = MPT_CFORMAT("Feature is not available in the {} format.")(mpt::ToCString(GetDocument()->GetSoundFile().GetModSpecifications().GetFileExtensionUpper())); + else + text = LoadResourceString(buttonID); CommandID cmd = kcNull; switch(buttonID) @@ -2873,7 +2877,7 @@ case ID_ENVELOPE_LOAD: cmd = kcInstrumentEnvelopeLoad; break; case ID_ENVELOPE_SAVE: cmd = kcInstrumentEnvelopeSave; break; } - if(cmd != kcNull) + if(cmd != kcNull && !(m_NcButtonState[ncButton] & NCBTNS_DISABLED)) { auto keyText = CMainFrame::GetInputHandler()->m_activeCommandSet->GetKeyTextFromCommand(cmd, 0); if(!keyText.IsEmpty()) |
From: <sv...@op...> - 2024-11-19 17:55:13
|
Author: sagamusix Date: Tue Nov 19 18:55:01 2024 New Revision: 22239 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22239 Log: [Imp] Instrument tab: Show tooltips for disabled envelope toolbar buttons, and show the button name in the toolbar. Modified: trunk/OpenMPT/mptrack/View_ins.cpp Modified: trunk/OpenMPT/mptrack/View_ins.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp Tue Nov 19 18:44:01 2024 (r22238) +++ trunk/OpenMPT/mptrack/View_ins.cpp Tue Nov 19 18:55:01 2024 (r22239) @@ -786,7 +786,7 @@ GetWindowRect(&rcWnd); for(UINT i = 0; i < ENV_LEFTBAR_BUTTONS; i++) { - if(!(m_NcButtonState[i] & NCBTNS_DISABLED) && GetNcButtonRect(i, rect)) + if(GetNcButtonRect(i, rect)) { rect.OffsetRect(rcWnd.left, rcWnd.top); if(rect.PtInRect(point)) @@ -836,7 +836,7 @@ case ID_ENVELOPE_LOAD: case ID_ENVELOPE_SAVE: if(GetInstrumentPtr() == nullptr) dwStyle |= NCBTNS_DISABLED; break; } - if (m_nBtnMouseOver == i) + if (m_nBtnMouseOver == i && !(m_NcButtonState[i] & NCBTNS_DISABLED)) { dwStyle |= NCBTNS_MOUSEOVER; if (m_dwStatus & INSSTATUS_NCLBTNDOWN) dwStyle |= NCBTNS_PUSHED; @@ -1400,7 +1400,7 @@ void CViewInstrument::OnNcLButtonDown(UINT uFlags, CPoint point) { - if(m_nBtnMouseOver < ENV_LEFTBAR_BUTTONS) + if(m_nBtnMouseOver < ENV_LEFTBAR_BUTTONS && !(m_NcButtonState[m_nBtnMouseOver] & NCBTNS_DISABLED)) { m_dwStatus |= INSSTATUS_NCLBTNDOWN; if(cLeftBarButtons[m_nBtnMouseOver] != ID_SEPARATOR) @@ -2857,7 +2857,11 @@ pTI->hwnd = m_hWnd; pTI->uId = buttonID; pTI->rect = ncRect; - CString text = LoadResourceString(buttonID); + CString text; + if(m_NcButtonState[ncButton] & NCBTNS_DISABLED) + text = MPT_CFORMAT("Feature is not available in the {} format.")(mpt::ToCString(GetDocument()->GetSoundFile().GetModSpecifications().GetFileExtensionUpper())); + else + text = LoadResourceString(buttonID); CommandID cmd = kcNull; switch(buttonID) @@ -2878,7 +2882,7 @@ case ID_ENVELOPE_LOAD: cmd = kcInstrumentEnvelopeLoad; break; case ID_ENVELOPE_SAVE: cmd = kcInstrumentEnvelopeSave; break; } - if(cmd != kcNull) + if(cmd != kcNull && !(m_NcButtonState[ncButton] & NCBTNS_DISABLED)) { auto keyText = CMainFrame::GetInputHandler()->m_activeCommandSet->GetKeyTextFromCommand(cmd, 0); if(!keyText.IsEmpty()) |
From: <sv...@op...> - 2024-11-19 17:44:13
|
Author: sagamusix Date: Tue Nov 19 18:44:01 2024 New Revision: 22238 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22238 Log: Merged revision(s) 22237 from trunk/OpenMPT: [Imp] Instrument tab: When moving the last envelope point, avoid it snapping back quickly when moving backwards (https://bugs.openmpt.org/view.php?id=297). ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/mptrack/View_ins.cpp branches/OpenMPT-1.31/mptrack/View_ins.h Modified: branches/OpenMPT-1.31/mptrack/View_ins.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/View_ins.cpp Tue Nov 19 18:43:06 2024 (r22237) +++ branches/OpenMPT-1.31/mptrack/View_ins.cpp Tue Nov 19 18:44:01 2024 (r22238) @@ -173,9 +173,9 @@ if(pModDoc) { SIZE sizeTotal, sizePage, sizeLine; - uint32 maxTick = EnvGetTick(EnvGetLastPoint()); + uint32 maxTick = std::max(EnvGetTick(EnvGetLastPoint()), m_maxTickDrag); - sizeTotal.cx = mpt::saturate_round<int>((maxTick + 2) * m_zoom); + sizeTotal.cx = mpt::saturate_round<int>((maxTick + 8) * m_zoom); sizeTotal.cy = 1; sizeLine.cx = mpt::saturate_round<int>(m_zoom); sizeLine.cy = 2; @@ -1480,6 +1480,7 @@ { // Ctrl pressed -> move tail of envelope changed = EnvSetValue(m_nDragItem - 1, nTick, nVal, CMainFrame::GetInputHandler()->CtrlPressed()); + m_maxTickDrag = std::max(m_maxTickDrag, EnvGetTick(EnvGetLastPoint())); } else { int nPoint = ScreenToPoint(pt.x, pt.y); @@ -1659,6 +1660,7 @@ if(rect.PtInRect(pt)) { m_nDragItem = i + 1; + m_maxTickDrag = EnvGetTick(EnvGetLastPoint()); break; } } @@ -1727,6 +1729,11 @@ void CViewInstrument::OnLButtonUp(UINT, CPoint) { m_mouseMoveModified = false; + if(m_maxTickDrag) + { + m_maxTickDrag = 0; + UpdateScrollSize(); + } if(m_dwStatus & INSSTATUS_SPLITCURSOR) { m_dwStatus &= ~INSSTATUS_SPLITCURSOR; Modified: branches/OpenMPT-1.31/mptrack/View_ins.h ============================================================================== --- branches/OpenMPT-1.31/mptrack/View_ins.h Tue Nov 19 18:43:06 2024 (r22237) +++ branches/OpenMPT-1.31/mptrack/View_ins.h Tue Nov 19 18:44:01 2024 (r22238) @@ -58,6 +58,7 @@ float m_zoom = 4; int m_envPointSize = 4; + uint32 m_maxTickDrag = 0; // Maximum tick for scroll size during envelope node dragging bool m_bGrid = true; bool m_bGridForceRedraw = false; |
From: <sv...@op...> - 2024-11-19 17:43:20
|
Author: sagamusix Date: Tue Nov 19 18:43:06 2024 New Revision: 22237 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22237 Log: [Imp] Instrument tab: When moving the last envelope point, avoid it snapping back quickly when moving backwards (https://bugs.openmpt.org/view.php?id=297). Modified: trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_ins.h Modified: trunk/OpenMPT/mptrack/View_ins.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp Tue Nov 19 09:47:36 2024 (r22236) +++ trunk/OpenMPT/mptrack/View_ins.cpp Tue Nov 19 18:43:06 2024 (r22237) @@ -171,9 +171,9 @@ if(pModDoc) { SIZE sizeTotal, sizePage, sizeLine; - uint32 maxTick = EnvGetTick(EnvGetLastPoint()); + uint32 maxTick = std::max(EnvGetTick(EnvGetLastPoint()), m_maxTickDrag); - sizeTotal.cx = mpt::saturate_round<int>((maxTick + 2) * m_zoom); + sizeTotal.cx = mpt::saturate_round<int>((maxTick + 8) * m_zoom); sizeTotal.cy = 1; sizeLine.cx = mpt::saturate_round<int>(m_zoom); sizeLine.cy = 2; @@ -1480,6 +1480,7 @@ { // Ctrl pressed -> move tail of envelope changed = EnvSetValue(m_nDragItem - 1, nTick, nVal, CInputHandler::CtrlPressed()); + m_maxTickDrag = std::max(m_maxTickDrag, EnvGetTick(EnvGetLastPoint())); } else { int nPoint = ScreenToPoint(pt.x, pt.y); @@ -1659,6 +1660,7 @@ if(rect.PtInRect(pt)) { m_nDragItem = i + 1; + m_maxTickDrag = EnvGetTick(EnvGetLastPoint()); break; } } @@ -1727,6 +1729,11 @@ void CViewInstrument::OnLButtonUp(UINT, CPoint) { m_mouseMoveModified = false; + if(m_maxTickDrag) + { + m_maxTickDrag = 0; + UpdateScrollSize(); + } if(m_dwStatus & INSSTATUS_SPLITCURSOR) { m_dwStatus &= ~INSSTATUS_SPLITCURSOR; Modified: trunk/OpenMPT/mptrack/View_ins.h ============================================================================== --- trunk/OpenMPT/mptrack/View_ins.h Tue Nov 19 09:47:36 2024 (r22236) +++ trunk/OpenMPT/mptrack/View_ins.h Tue Nov 19 18:43:06 2024 (r22237) @@ -60,6 +60,7 @@ float m_zoom = 4; int m_envPointSize = 4; + uint32 m_maxTickDrag = 0; // Maximum tick for scroll size during envelope node dragging bool m_bGrid = true; bool m_bGridForceRedraw = false; |
From: <sv...@op...> - 2024-11-19 08:47:47
|
Author: manx Date: Tue Nov 19 09:47:36 2024 New Revision: 22236 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22236 Log: [Imp] build: CI: GitHub: macOS: Add XCode 16.2. Modified: trunk/OpenMPT/.github/workflows/macOS-Autotools.yml trunk/OpenMPT/.github/workflows/macOS-Makefile.yml Modified: trunk/OpenMPT/.github/workflows/macOS-Autotools.yml ============================================================================== --- trunk/OpenMPT/.github/workflows/macOS-Autotools.yml Tue Nov 19 09:25:42 2024 (r22235) +++ trunk/OpenMPT/.github/workflows/macOS-Autotools.yml Tue Nov 19 09:47:36 2024 (r22236) @@ -12,6 +12,7 @@ fail-fast: false matrix: include: + - { host: macos-15, compiler: '16.2' } - { host: macos-15, compiler: '16.1' } - { host: macos-15, compiler: '16.0' } - { host: macos-14, compiler: '15.4' } Modified: trunk/OpenMPT/.github/workflows/macOS-Makefile.yml ============================================================================== --- trunk/OpenMPT/.github/workflows/macOS-Makefile.yml Tue Nov 19 09:25:42 2024 (r22235) +++ trunk/OpenMPT/.github/workflows/macOS-Makefile.yml Tue Nov 19 09:47:36 2024 (r22236) @@ -13,6 +13,28 @@ fail-fast: false matrix: include: + - { host: macos-15, compiler: '16.2', arch: '' , target: '' , deps: sys , check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: arm64 , target: '' , deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: x86_64, target: '' , deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: arm64 , target: '' , deps: small, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: x86_64, target: '' , deps: small, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: arm64 , target: '15.2' , deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: x86_64, target: '15.2' , deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: arm64 , target: '15.1' , deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: x86_64, target: '15.1' , deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: arm64 , target: '15' , deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: x86_64, target: '15' , deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: arm64 , target: '14' , deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: x86_64, target: '14' , deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: arm64 , target: '13' , deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: x86_64, target: '13' , deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: arm64 , target: '12' , deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: x86_64, target: '12' , deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: arm64 , target: '11' , deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: x86_64, target: '11' , deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: x86_64, target: '10.15', deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: x86_64, target: '10.14', deps: local, check: true , ancient: false } + - { host: macos-15, compiler: '16.2', arch: x86_64, target: '10.13', deps: local, check: true , ancient: false } - { host: macos-15, compiler: '16.1', arch: '' , target: '' , deps: sys , check: true , ancient: false } - { host: macos-15, compiler: '16.1', arch: arm64 , target: '' , deps: local, check: true , ancient: false } - { host: macos-15, compiler: '16.1', arch: x86_64, target: '' , deps: local, check: true , ancient: false } |
From: <sv...@op...> - 2024-11-19 08:25:48
|
Author: sagamusix Date: Tue Nov 19 09:25:42 2024 New Revision: 22235 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22235 Log: [Fix] Another compile fix for retro builds. Modified: trunk/OpenMPT/mptrack/CommandSet.h Modified: trunk/OpenMPT/mptrack/CommandSet.h ============================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h Tue Nov 19 09:14:04 2024 (r22234) +++ trunk/OpenMPT/mptrack/CommandSet.h Tue Nov 19 09:25:42 2024 (r22235) @@ -1274,7 +1274,7 @@ // Communication KeyCombination GetKey(CommandID cmd, UINT key) const { return m_commands[cmd].kcList[key]; } - mpt::span<const KeyCombination> GetKeyChoices(CommandID cmd) const { return m_commands[cmd].kcList; } + mpt::span<const KeyCombination> GetKeyChoices(CommandID cmd) const { return mpt::as_span(m_commands[cmd].kcList); } bool IsHidden(UINT c) const { return m_commands[c].IsHidden(); } int GetKeyListSize(CommandID cmd) const { return (cmd != kcNull) ? static_cast<int>(m_commands[cmd].kcList.size()) : 0; } CString GetCommandText(CommandID cmd) const { return m_commands[cmd].Message; } |
From: <sv...@op...> - 2024-11-19 08:14:11
|
Author: sagamusix Date: Tue Nov 19 09:14:04 2024 New Revision: 22234 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22234 Log: [Fix] Compile fix for retro builds. Modified: trunk/OpenMPT/mptrack/CommandSet.h Modified: trunk/OpenMPT/mptrack/CommandSet.h ============================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h Mon Nov 18 23:43:26 2024 (r22233) +++ trunk/OpenMPT/mptrack/CommandSet.h Tue Nov 19 09:14:04 2024 (r22234) @@ -1274,7 +1274,7 @@ // Communication KeyCombination GetKey(CommandID cmd, UINT key) const { return m_commands[cmd].kcList[key]; } - std::span<const KeyCombination> GetKeyChoices(CommandID cmd) const { return m_commands[cmd].kcList; } + mpt::span<const KeyCombination> GetKeyChoices(CommandID cmd) const { return m_commands[cmd].kcList; } bool IsHidden(UINT c) const { return m_commands[c].IsHidden(); } int GetKeyListSize(CommandID cmd) const { return (cmd != kcNull) ? static_cast<int>(m_commands[cmd].kcList.size()) : 0; } CString GetCommandText(CommandID cmd) const { return m_commands[cmd].Message; } |
From: <sv...@op...> - 2024-11-18 22:43:39
|
Author: sagamusix Date: Mon Nov 18 23:43:26 2024 New Revision: 22233 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22233 Log: [Imp] Keyboard config: Turn awkward Yes/No buttons for Repeat Notes on Hold into an auto-updating checkbox. Modified: trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/KeyConfigDlg.cpp trunk/OpenMPT/mptrack/KeyConfigDlg.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h Modified: trunk/OpenMPT/mptrack/CommandSet.h ============================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h Mon Nov 18 23:15:33 2024 (r22232) +++ trunk/OpenMPT/mptrack/CommandSet.h Mon Nov 18 23:43:26 2024 (r22233) @@ -1274,6 +1274,7 @@ // Communication KeyCombination GetKey(CommandID cmd, UINT key) const { return m_commands[cmd].kcList[key]; } + std::span<const KeyCombination> GetKeyChoices(CommandID cmd) const { return m_commands[cmd].kcList; } bool IsHidden(UINT c) const { return m_commands[c].IsHidden(); } int GetKeyListSize(CommandID cmd) const { return (cmd != kcNull) ? static_cast<int>(m_commands[cmd].kcList.size()) : 0; } CString GetCommandText(CommandID cmd) const { return m_commands[cmd].Message; } Modified: trunk/OpenMPT/mptrack/KeyConfigDlg.cpp ============================================================================== --- trunk/OpenMPT/mptrack/KeyConfigDlg.cpp Mon Nov 18 23:15:33 2024 (r22232) +++ trunk/OpenMPT/mptrack/KeyConfigDlg.cpp Mon Nov 18 23:43:26 2024 (r22233) @@ -148,8 +148,7 @@ ON_COMMAND(IDC_CHECKKEYDOWN, &COptionsKeyboard::OnCheck) ON_COMMAND(IDC_CHECKKEYHOLD, &COptionsKeyboard::OnCheck) ON_COMMAND(IDC_CHECKKEYUP, &COptionsKeyboard::OnCheck) - ON_COMMAND(IDC_NOTESREPEAT, &COptionsKeyboard::OnNotesRepeat) - ON_COMMAND(IDC_NONOTESREPEAT, &COptionsKeyboard::OnNoNotesRepeat) + ON_COMMAND(IDC_NOTESREPEAT, &COptionsKeyboard::OnToggleNotesRepeat) ON_COMMAND(IDC_RESTORE_KEYMAP, &COptionsKeyboard::OnRestoreDefaultKeymap) ON_COMMAND(ID_KEYPRESET_MPT, &COptionsKeyboard::OnRestoreMPTKeymap) ON_COMMAND(ID_KEYPRESET_IT, &COptionsKeyboard::OnRestoreITKeymap) @@ -537,10 +536,8 @@ if(searchByKey) { addKey = false; - int numChoices = m_localCmdSet->GetKeyListSize(com); - for(int choice = 0; choice < numChoices; choice++) + for(const KeyCombination &kc : m_localCmdSet->GetKeyChoices(com)) { - const KeyCombination &kc = m_localCmdSet->GetKey(com, choice); if(kc.KeyCode() == m_eFindHotKey.code && kc.Modifier() == m_eFindHotKey.mod) { addKey = true; @@ -779,7 +776,6 @@ void COptionsKeyboard::OnRestoreKeyChoice() { - KeyCombination kc; CommandID cmd = m_curCommand; CInputHandler *ih = CMainFrame::GetInputHandler(); @@ -796,14 +792,14 @@ // Restore the defaults for this key mpt::heap_value<CCommandSet> defaultSet; defaultSet->LoadDefaultKeymap(); - for(int i = 0; i < defaultSet->GetKeyListSize(cmd); i++) + for(const KeyCombination &kc : defaultSet->GetKeyChoices(cmd)) { - m_localCmdSet->Add(defaultSet->GetKey(cmd, i), cmd, true, m_curKeyChoice); + m_localCmdSet->Add(kc, cmd, true, m_curKeyChoice); } } else { // Restore current key combination choice for currently selected command. - kc = ih->m_activeCommandSet->GetKey(cmd, m_curKeyChoice); + KeyCombination kc = ih->m_activeCommandSet->GetKey(cmd, m_curKeyChoice); m_localCmdSet->Remove(m_curKeyChoice, cmd); UpdateWarning(m_localCmdSet->Add(kc, cmd, true, m_curKeyChoice)); } @@ -1057,17 +1053,10 @@ } -void COptionsKeyboard::OnNotesRepeat() +void COptionsKeyboard::OnToggleNotesRepeat() { - m_localCmdSet->QuickChange_NotesRepeat(true); - ForceUpdateGUI(); -} - - -void COptionsKeyboard::OnNoNotesRepeat() -{ - m_localCmdSet->QuickChange_NotesRepeat(false); - ForceUpdateGUI(); + m_localCmdSet->QuickChange_NotesRepeat(IsDlgButtonChecked(IDC_NOTESREPEAT) != BST_CHECKED); + ForceUpdateGUI(true); } @@ -1088,10 +1077,33 @@ if(const auto cmd = static_cast<CommandID>(m_lbnCommandKeys.GetItemData(i)); cmd != kcNull) m_lbnCommandKeys.SetItemText(i, 1, m_localCmdSet->GetKeyTextFromCommand(cmd)); } + UpdateNoteRepeatCheckbox(); } else if(m_curCommand != kcNull) { m_lbnCommandKeys.SetItemText(m_lbnCommandKeys.GetSelectionMark(), 1, m_localCmdSet->GetKeyTextFromCommand(m_curCommand)); + if(mpt::is_in_range(m_curCommand, kcVPStartNotes, kcVPEndNotes)) + UpdateNoteRepeatCheckbox(); + } +} + + +void COptionsKeyboard::UpdateNoteRepeatCheckbox() +{ + UINT state = uint32_max; + for(CommandID cmd = kcVPStartNotes; cmd <= kcVPEndNotes && state != BST_INDETERMINATE; cmd = static_cast<CommandID>(cmd + 1)) + { + for(auto &kc : m_localCmdSet->GetKeyChoices(cmd)) + { + const bool repeat = (kc.EventType() & kKeyEventRepeat); + if(repeat && (state == uint32_max || state == BST_CHECKED)) + state = BST_CHECKED; + else if(!repeat && (state == uint32_max || state == BST_UNCHECKED)) + state = BST_UNCHECKED; + else + state = BST_INDETERMINATE; + } } + CheckDlgButton(IDC_NOTESREPEAT, state); } Modified: trunk/OpenMPT/mptrack/KeyConfigDlg.h ============================================================================== --- trunk/OpenMPT/mptrack/KeyConfigDlg.h Mon Nov 18 23:15:33 2024 (r22232) +++ trunk/OpenMPT/mptrack/KeyConfigDlg.h Mon Nov 18 23:43:26 2024 (r22233) @@ -103,6 +103,7 @@ void DefineCommandCategories(); void ForceUpdateGUI(bool updateAllKeys = false); + void UpdateNoteRepeatCheckbox(); void InsertGroup(const TCHAR *title, int groupId); void UpdateShortcutList(int category = -1); void UpdateCategory(); @@ -131,8 +132,7 @@ afx_msg void OnChordWaitTimeChanged(); afx_msg void OnSettingsChanged() { SetModified(TRUE); } afx_msg void OnCheck() { OnSetKeyChoice(&m_eCustHotKey); }; - afx_msg void OnNotesRepeat(); - afx_msg void OnNoNotesRepeat(); + afx_msg void OnToggleNotesRepeat(); afx_msg void OnListenForKeys(); afx_msg void OnDeleteKeyChoice(); afx_msg void OnRestoreKeyChoice(); Modified: trunk/OpenMPT/mptrack/mptrack.rc ============================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc Mon Nov 18 23:15:33 2024 (r22232) +++ trunk/OpenMPT/mptrack/mptrack.rc Mon Nov 18 23:43:26 2024 (r22233) @@ -1266,9 +1266,7 @@ CONTROL "On Key Up",IDC_CHECKKEYUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,138,206,54,8 ICON "",IDC_STATIC1,12,223,20,20,SS_CENTERIMAGE | SS_REALSIZEIMAGE | NOT WS_VISIBLE LTEXT "No conflicts found.",IDC_KEYREPORT,26,224,254,13 - LTEXT "Repeat notes on hold?",IDC_STATIC,6,248,84,8 - PUSHBUTTON "Yes",IDC_NOTESREPEAT,90,246,24,12 - PUSHBUTTON "No",IDC_NONOTESREPEAT,120,246,24,12 + CONTROL "Repeat Note Keys on Hold",IDC_NOTESREPEAT,"Button",BS_3STATE | WS_TABSTOP,6,246,144,12 LTEXT "Chord detect interval (ms):",IDC_STATIC,156,248,94,8 EDITTEXT IDC_CHORDDETECTWAITTIME,252,246,30,12,ES_AUTOHSCROLL | ES_NUMBER PUSHBUTTON "&Import Key Map...",IDC_LOAD,6,264,72,13 Modified: trunk/OpenMPT/mptrack/resource.h ============================================================================== --- trunk/OpenMPT/mptrack/resource.h Mon Nov 18 23:15:33 2024 (r22232) +++ trunk/OpenMPT/mptrack/resource.h Mon Nov 18 23:43:26 2024 (r22233) @@ -662,8 +662,6 @@ #define IDC_FINDHOTKEY_LABEL 2107 #define IDC_NOTESREPEAT 2108 #define IDC_REMCHANSLIST 2108 -#define IDC_NOTESREPEAT2 2109 -#define IDC_NONOTESREPEAT 2109 #define IDC_EFFECTLETTERSIT 2110 #define IDC_INSVIEWPLG 2110 #define IDC_EFFECTLETTERSXM 2111 |
From: <sv...@op...> - 2024-11-18 22:15:40
|
Author: sagamusix Date: Mon Nov 18 23:15:33 2024 New Revision: 22232 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22232 Log: [Fix] I3DL2Reverb: Avoid NaNs in room filter calculation. Found with afl++ + ubsan. Modified: trunk/OpenMPT/soundlib/plugins/dmo/I3DL2Reverb.cpp Modified: trunk/OpenMPT/soundlib/plugins/dmo/I3DL2Reverb.cpp ============================================================================== --- trunk/OpenMPT/soundlib/plugins/dmo/I3DL2Reverb.cpp Mon Nov 18 22:40:48 2024 (r22231) +++ trunk/OpenMPT/soundlib/plugins/dmo/I3DL2Reverb.cpp Mon Nov 18 23:15:33 2024 (r22232) @@ -505,7 +505,7 @@ m_roomFilter = 0.0f; } else { - float freq = std::cos(HFReference() * (2.0f * mpt::numbers::pi_v<float>) / m_effectiveSampleRate); + float freq = std::min(std::cos(HFReference() * (2.0f * mpt::numbers::pi_v<float>) / m_effectiveSampleRate), 0.9999f); float roomFilter = (freq * (roomHF + roomHF) - 2.0f + std::sqrt(freq * (roomHF * roomHF * freq * 4.0f) + roomHF * 8.0f - roomHF * roomHF * 4.0f - roomHF * freq * 8.0f)) / (roomHF + roomHF - 2.0f); m_roomFilter = Clamp(roomFilter, 0.0f, 1.0f); } |