From: <sag...@us...> - 2010-11-07 16:07:45
|
Revision: 758 http://modplug.svn.sourceforge.net/modplug/?rev=758&view=rev Author: saga-games Date: 2010-11-07 16:07:38 +0000 (Sun, 07 Nov 2010) Log Message: ----------- [New] VST: Experimental support for load/save dialogs. Loading multiple files and the directory selector don't work yet. Modified Paths: -------------- trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/Vstplug.h Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2010-11-06 16:10:57 UTC (rev 757) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2010-11-07 16:07:38 UTC (rev 758) @@ -82,6 +82,7 @@ //------------------------------------ { m_pVstHead = NULL; + m_szHostBuffer = nullptr; //m_bNeedIdle = FALSE; //rewbs.VSTCompliance - now member of plugin class CSoundFile::gpMixPluginCreateProc = CreateMixPluginProc; EnumerateDirectXDMOs(); @@ -92,6 +93,11 @@ //------------------------------------- { CSoundFile::gpMixPluginCreateProc = NULL; + if(m_szHostBuffer != nullptr) + { + delete[] m_szHostBuffer; + m_szHostBuffer = nullptr; + } while (m_pVstHead) { PVSTPLUGINLIB p = m_pVstHead; @@ -946,11 +952,13 @@ //"asyncProcessing", //"offline", //"supportShell" - if ((strcmp((char*)ptr,"sendVstEvents")==0 || - strcmp((char*)ptr,"sendVstMidiEvent")==0 || - strcmp((char*)ptr,"sendVstTimeInfo")==0 || - strcmp((char*)ptr,"supplyIdle")==0 || - strcmp((char*)ptr,"sizeWindow")==0)) + if ((strcmp((char*)ptr,"sendVstEvents") == 0 || + strcmp((char*)ptr,"sendVstMidiEvent") == 0 || + strcmp((char*)ptr,"sendVstTimeInfo") == 0 || + strcmp((char*)ptr,"supplyIdle") == 0 || + strcmp((char*)ptr,"sizeWindow") == 0 || + strcmp((char*)ptr,"openFileSelector") == 0 + )) return HostCanDo; else return HostCanNotDo; @@ -997,59 +1005,12 @@ Log("VST plugin to host: End Edit\n"); break; // open a fileselector window with VstFileSelect* in <ptr> - case audioMasterOpenFileSelector: - { - /* - VstFileSelect *pFileSel = (VstFileSelect *)ptr; - ASSERT(false); - - if(pFileSel->command != kVstDirectorySelect) - { - std::string extensions; - for(size_t i = 0; i < pFileSel->nbFileTypes; i++) - { - VstFileType *pType = &(pFileSel->fileTypes[i]); - extensions += pType->name; - extensions += "|"; -#if (defined(WIN32) || defined(WINDOWS)) - extensions += "*."; - extensions += pType->dosType; -#elif defined(MAC) - extensions += "*"; - extensions += pType->macType; -#elif defined(UNIX) - extensions += "*."; - extensions += pType->unixType; -#else - #error Platform-specific code missing -#endif - extensions += "|"; - } - - FileDlgResult files = CTrackApp::ShowOpenSaveFileDialog( - pFileSel->command == kVstFileSave ? false : true, - "", "", extensions, pFileSel->initialPath, - pFileSel->command == kVstMultipleFilesLoad - ); - if(files.abort) - return 0; - // todo: retrieve filenames etc. - //strcpy(pFileSel->returnPath, files.first_file.c_str()); - //pFileSel->sizeReturnPath = files.first_file.length(); - return 1; - - } else */ - { - Log("VST plugin to host: Get Directory\n"); - } - } - break; - + case audioMasterOpenFileSelector: //---from here VST 2.2 extension opcodes------------------------------------------------------ // close a fileselector operation with VstFileSelect* in <ptr>: Must be always called after an open ! case audioMasterCloseFileSelector: - Log("VST plugin to host: Close File Selector\n"); - break; + return VstFileSelector(opcode == audioMasterCloseFileSelector, (VstFileSelect *)ptr); + // open an editor for audio (defined by XML text in ptr) case audioMasterEditFile: Log("VST plugin to host: Edit File\n"); @@ -1073,8 +1034,109 @@ //end rewbs. VSTCompliance: +// Helper function for file selection dialog stuff. +long CVstPluginManager::VstFileSelector(const bool destructor, VstFileSelect *pFileSel) +//------------------------------------------------------------------------------------- +{ + if(!destructor) + { + if(pFileSel == nullptr) + { + return 0; + } + + if(pFileSel->command != kVstDirectorySelect) + { + std::string extensions, workingDir; + for(size_t i = 0; i < pFileSel->nbFileTypes; i++) + { + VstFileType *pType = &(pFileSel->fileTypes[i]); + extensions += pType->name; + extensions += "|"; +#if (defined(WIN32) || defined(WINDOWS)) + extensions += "*."; + extensions += pType->dosType; +#elif defined(MAC) + extensions += "*"; + extensions += pType->macType; +#elif defined(UNIX) + extensions += "*."; + extensions += pType->unixType; +#else +#error Platform-specific code missing +#endif + extensions += "|"; + } + + if(pFileSel->initialPath != nullptr) + { + workingDir = pFileSel->initialPath; + } else + { + // Plugins are probably looking for presets...? + workingDir = ""; //CMainFrame::GetWorkingDirectory(DIR_PLUGINPRESETS); + } + + FileDlgResult files = CTrackApp::ShowOpenSaveFileDialog( + (pFileSel->command == kVstFileSave ? false : true), + "", "", extensions, workingDir, + (pFileSel->command == kVstMultipleFilesLoad ? true : false) + ); + + pFileSel->nbReturnPath = 0; + + if(files.abort) + { + return 0; + } + + if(pFileSel->command == kVstMultipleFilesLoad) + { + // TODO: multiple paths + Log("VST plugin to host: Multiple files\n"); + return 0; + } else + { + if(pFileSel->returnPath == nullptr) + { + // Provide some memory for the return path. + if(m_szHostBuffer != nullptr) + { + delete[] m_szHostBuffer; + } + pFileSel->sizeReturnPath = _MAX_PATH; + m_szHostBuffer = new char[_MAX_PATH]; + if(m_szHostBuffer == nullptr) + { + return 0; + } + pFileSel->returnPath = m_szHostBuffer; + } + strncpy(pFileSel->returnPath, files.first_file.c_str(), pFileSel->sizeReturnPath - 1); + pFileSel->nbReturnPath = 1; + } + return 1; + + } else + { + Log("VST plugin to host: Get Directory\n"); + return 0; + } + } else + { + Log("VST plugin to host: Close File Selector\n"); + if(m_szHostBuffer != nullptr) + { + delete[] m_szHostBuffer; + m_szHostBuffer = nullptr; + } + return 1; + } +} + + void CVstPluginManager::ReportPlugException(LPCSTR format,...) -//----------------------------------------------------------- +//------------------------------------------------------------ { CHAR cBuf[1024]; va_list va; Modified: trunk/OpenMPT/mptrack/Vstplug.h =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.h 2010-11-06 16:10:57 UTC (rev 757) +++ trunk/OpenMPT/mptrack/Vstplug.h 2010-11-07 16:07:38 UTC (rev 758) @@ -246,10 +246,14 @@ protected: long VstCallback(AEffect *effect, long opcode, long index, long value, void *ptr, float opt); + long VstFileSelector(const bool destructor, VstFileSelect *pFileSel); static long VSTCALLBACK MasterCallBack(AEffect *effect, long opcode, long index, long value, void *ptr, float opt); static BOOL __cdecl CreateMixPluginProc(PSNDMIXPLUGIN, CSoundFile*); VstTimeInfo timeInfo; //rewbs.VSTcompliance +protected: + char *m_szHostBuffer; // host's buffer for file select dialog + public: static char s_szHostProductString[64]; static char s_szHostVendorString[64]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-11-07 16:37:29
|
Revision: 759 http://modplug.svn.sourceforge.net/modplug/?rev=759&view=rev Author: saga-games Date: 2010-11-07 16:37:22 +0000 (Sun, 07 Nov 2010) Log Message: ----------- [Mod] Pattern Editor: Using the Goto Dialog should now update channel parameters and set the elapsed time. (http://bugs.openmpt.org/view.php?id=28) [Ref] Misc unimportant stuff (URLs, missing newlines, const modifiers) [Mod] OpenMPT: Version is now 1.19.00.12 Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2010-11-07 16:07:38 UTC (rev 758) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2010-11-07 16:37:22 UTC (rev 759) @@ -2771,7 +2771,7 @@ void CMainFrame::OnReportBug() //---------------------------- { - CTrackApp::OpenURL("http://openmpt.com/bugreport/"); + CTrackApp::OpenURL("http://bugs.openmpt.org/"); return; } //end rewbs.reportBug Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2010-11-07 16:07:38 UTC (rev 758) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2010-11-07 16:37:22 UTC (rev 759) @@ -3271,8 +3271,8 @@ * - allowMultiSelect: allow the user to select multiple files? (will be ignored if load == false) * - filterIndex: pointer to a variable holding the index of the last extension filter used. */ -FileDlgResult CTrackApp::ShowOpenSaveFileDialog(bool load, std::string defaultExtension, std::string defaultFilename, std::string extFilter, std::string workingDirectory, bool allowMultiSelect, int *filterIndex) -//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +FileDlgResult CTrackApp::ShowOpenSaveFileDialog(const bool load, const std::string defaultExtension, const std::string defaultFilename, const std::string extFilter, const std::string workingDirectory, const bool allowMultiSelect, int *filterIndex) +//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- { FileDlgResult result; result.workingDirectory = workingDirectory; @@ -3282,16 +3282,13 @@ result.abort = true; // we can't save multiple files. - if(!load) - { - allowMultiSelect = false; - } + const bool multiSelect = allowMultiSelect && load; // First, set up the dialog... CFileDialog dlg(load ? TRUE : FALSE, defaultExtension.empty() ? NULL : defaultExtension.c_str(), defaultFilename.empty() ? NULL : defaultFilename.c_str(), - load ? (OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | (allowMultiSelect ? OFN_ALLOWMULTISELECT : 0)) + load ? (OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | (multiSelect ? OFN_ALLOWMULTISELECT : 0)) : (OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN), extFilter.empty() ? NULL : extFilter.c_str(), theApp.m_pMainWnd); @@ -3301,7 +3298,7 @@ dlg.m_ofn.nFilterIndex = (DWORD)(*filterIndex); vector<TCHAR> filenameBuffer; - if (allowMultiSelect) + if(multiSelect) { const size_t bufferSize = 2048; // Note: This is possibly the maximum buffer size in MFC 7(this note was written November 2006). filenameBuffer.resize(bufferSize, 0); @@ -3322,7 +3319,7 @@ if(filterIndex != nullptr) *filterIndex = dlg.m_ofn.nFilterIndex; - if(allowMultiSelect) + if(multiSelect) { // multiple files might have been selected POSITION pos = dlg.GetStartPosition(); Modified: trunk/OpenMPT/mptrack/Mptrack.h =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h 2010-11-07 16:07:38 UTC (rev 758) +++ trunk/OpenMPT/mptrack/Mptrack.h 2010-11-07 16:37:22 UTC (rev 759) @@ -190,7 +190,7 @@ static BOOL AddDLSBank(LPCSTR); static BOOL OpenURL(LPCSTR lpszURL); - static FileDlgResult ShowOpenSaveFileDialog(bool load, std::string defaultExtension, std::string defaultFilename, std::string extFilter, std::string workingDirectory = "", bool allowMultiSelect = false, int *filterIndex = nullptr); + static FileDlgResult ShowOpenSaveFileDialog(const bool load, const std::string defaultExtension, const std::string defaultFilename, const std::string extFilter, const std::string workingDirectory = "", const bool allowMultiSelect = false, int *filterIndex = nullptr); public: CDocTemplate *GetModDocTemplate() const { return m_pModTemplate; } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2010-11-07 16:07:38 UTC (rev 758) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2010-11-07 16:37:22 UTC (rev 759) @@ -1723,35 +1723,36 @@ return; - if (!m_pGotoWnd) { + if (!m_pGotoWnd) + { m_pGotoWnd = new CPatternGotoDialog(this); //if (m_pGotoWnd) m_pGotoWnd->SetParent(this/*, GetDocument()*/); } - if (m_pGotoWnd) { + if (m_pGotoWnd) + { CSoundFile* pSndFile = pModDoc->GetSoundFile(); UINT nCurrentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); UINT nCurrentChannel = ((m_dwCursor & 0xFFFF) >> 3) + 1; m_pGotoWnd->UpdatePos(m_nRow, nCurrentChannel, m_nPattern, nCurrentOrder, pSndFile); - if (m_pGotoWnd->DoModal() == IDOK) { + if (m_pGotoWnd->DoModal() == IDOK) + { //Position should be valididated. - if (m_pGotoWnd->m_nPattern != m_nPattern) { + if (m_pGotoWnd->m_nPattern != m_nPattern) SetCurrentPattern(m_pGotoWnd->m_nPattern); - } - if (m_pGotoWnd->m_nOrder != nCurrentOrder) { + if (m_pGotoWnd->m_nOrder != nCurrentOrder) SendCtrlMessage(CTRLMSG_SETCURRENTORDER, m_pGotoWnd->m_nOrder); - } - if (m_pGotoWnd->m_nChannel != nCurrentChannel) { + if (m_pGotoWnd->m_nChannel != nCurrentChannel) SetCurrentColumn((m_pGotoWnd->m_nChannel-1) << 3); - } - if (m_pGotoWnd->m_nRow != m_nRow) { + if (m_pGotoWnd->m_nRow != m_nRow) SetCurrentRow(m_pGotoWnd->m_nRow); - } + + pModDoc->SetElapsedTime(m_pGotoWnd->m_nOrder, m_pGotoWnd->m_nRow); } } return; Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-11-07 16:07:38 UTC (rev 758) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-11-07 16:37:22 UTC (rev 759) @@ -185,7 +185,8 @@ m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("OpenMPT 1.17RC2"), mixLevels_117RC2); m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("OpenMPT 1.17RC1"), mixLevels_117RC1); m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("Original (MPT 1.16)"), mixLevels_original); - m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("Compatible"), mixLevels_compatible); //m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("Test"), mixLevels_Test); + m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("Compatible"), mixLevels_compatible); + //m_PlugMixBox.SetItemData(m_PlugMixBox.AddString("Test"), mixLevels_Test); switch(m_pSndFile->m_nMixLevels) { //case mixLevels_Test: m_PlugMixBox.SetCurSel(5); break; Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2010-11-07 16:07:38 UTC (rev 758) +++ trunk/OpenMPT/mptrack/version.h 2010-11-07 16:37:22 UTC (rev 759) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 19 #define VER_MINOR 00 -#define VER_MINORMINOR 11 +#define VER_MINORMINOR 12 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-11-16 21:39:31
|
Revision: 762 http://modplug.svn.sourceforge.net/modplug/?rev=762&view=rev Author: saga-games Date: 2010-11-16 21:39:23 +0000 (Tue, 16 Nov 2010) Log Message: ----------- [Mod] Changes to keymap file handling: The active keymap is now always saved to Keybindings.mkb (in either %APPDATA%\OpenMPT or the executable's directory). Any other keymaps are now only overwritten when using the "Save as" function. This behaviour is backwards-compatible when using several versions of OpenMPT 1.18+ next to each other, since the INI setting is cleared when exiting OpenMPT, so it just defaults to Keybindings.mkb in older versions. Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/InputHandler.cpp trunk/OpenMPT/mptrack/InputHandler.h trunk/OpenMPT/mptrack/KeyConfigDlg.cpp trunk/OpenMPT/mptrack/KeyConfigDlg.h trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2010-11-13 22:03:04 UTC (rev 761) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2010-11-16 21:39:23 UTC (rev 762) @@ -1504,7 +1504,7 @@ if(fileVersion > KEYMAP_VERSION) { CString err; - err.Format("Key binding file %s has version %d. Your version of OpenMPT only supports loading files up to version %d.", szFilename, fileVersion, KEYMAP_VERSION); + err.Format("Key binding file has version %d. Your version of OpenMPT only supports loading files up to version %d.", szFilename, fileVersion, KEYMAP_VERSION); errText += err + "\n"; Log(err); } @@ -1548,7 +1548,7 @@ errorCount++; CString err; if (errorCount<10) { - err.Format("Line %d in key binding file %s was not understood.", l, szFilename); + err.Format("Line %d was not understood.", l, szFilename); errText += err + "\n"; Log(err); } else if (errorCount==10) { @@ -1567,7 +1567,13 @@ l++; } - if(s_bShowErrorOnUnknownKeybinding && !errText.IsEmpty()) ::MessageBox(NULL, errText, "", MB_ICONEXCLAMATION|MB_OK); + if(s_bShowErrorOnUnknownKeybinding && !errText.IsEmpty()) + { + CString err; + err.Format("The following problems have been encountered while trying to load the key binding file %s:\n", szFilename); + errText = err + errText; + ::MessageBox(NULL, errText, "", MB_ICONEXCLAMATION|MB_OK); + } if(fileVersion < KEYMAP_VERSION) UpgradeKeymap(pTempCS, fileVersion); Modified: trunk/OpenMPT/mptrack/InputHandler.cpp =================================================================== --- trunk/OpenMPT/mptrack/InputHandler.cpp 2010-11-13 22:03:04 UTC (rev 761) +++ trunk/OpenMPT/mptrack/InputHandler.cpp 2010-11-16 21:39:23 UTC (rev 762) @@ -61,6 +61,8 @@ if (bSuccess == false) AfxMessageBox(IDS_UNABLE_TO_LOAD_KEYBINDINGS, MB_ICONERROR); } + // We will only overwrite the default Keybindings.mkb file from now on. + _tcscpy(CMainFrame::m_szKbdFile, sDefaultPath); //Get Keymap activeCommandSet->GenKeyMap(keyMap); @@ -73,9 +75,7 @@ m_bBypass = false; modifierMask=0; m_bNoAltMenu = true; - m_bAutoSave = true; - } CInputHandler::~CInputHandler(void) { Modified: trunk/OpenMPT/mptrack/InputHandler.h =================================================================== --- trunk/OpenMPT/mptrack/InputHandler.h 2010-11-13 22:03:04 UTC (rev 761) +++ trunk/OpenMPT/mptrack/InputHandler.h 2010-11-16 21:39:23 UTC (rev 762) @@ -87,7 +87,6 @@ void UpdateMainMenu(); void SetNewCommandSet(CCommandSet * newSet); bool noAltMenu(); - bool m_bAutoSave; bool SetXMEffects(void); bool SetITEffects(void); }; Modified: trunk/OpenMPT/mptrack/KeyConfigDlg.cpp =================================================================== --- trunk/OpenMPT/mptrack/KeyConfigDlg.cpp 2010-11-13 22:03:04 UTC (rev 761) +++ trunk/OpenMPT/mptrack/KeyConfigDlg.cpp 2010-11-16 21:39:23 UTC (rev 762) @@ -116,10 +116,8 @@ DDX_Control(pDX, IDC_CHECKKEYDOWN, m_bKeyDown); DDX_Control(pDX, IDC_CHECKKEYHOLD, m_bKeyHold); DDX_Control(pDX, IDC_CHECKKEYUP, m_bKeyUp); - DDX_Control(pDX, IDC_KEYMAPFILE, m_eKeyFile); DDX_Control(pDX, IDC_DEBUGSAVE, m_bDebugSave); - DDX_Control(pDX, IDC_AUTOSAVE, m_bAutoSave); } @@ -160,8 +158,6 @@ m_eReport.FmtLines(TRUE); m_eReport.SetWindowText("Log:\r\n"); - m_bAutoSave.SetCheck(CMainFrame::GetInputHandler()->m_bAutoSave); - CString s; s.Format("%d", CMainFrame::gnAutoChordWaitTime); m_eChordWaitTime.SetWindowText(s); @@ -341,7 +337,6 @@ void COptionsKeyboard::UpdateDialog() //----------------------------------- { - m_eKeyFile.SetWindowText(CMainFrame::m_szKbdFile); OnCategorySelChanged(); // Fills command list and automatically selects first command. OnCommandKeySelChanged(); // Fills command key choice list for that command and automatically selects first choice. } @@ -623,21 +618,12 @@ void COptionsKeyboard::OnOK() //--------------------------- { - CString cs; - m_eKeyFile.GetWindowText(cs); - strcpy(CMainFrame::m_szKbdFile, cs); CMainFrame::GetInputHandler()->SetNewCommandSet(plocalCmdSet); + CString cs; m_eChordWaitTime.GetWindowText(cs); CMainFrame::gnAutoChordWaitTime = atoi(cs); - if (m_bAutoSave.GetCheck()) - plocalCmdSet->SaveFile(CMainFrame::m_szKbdFile, m_bDebugSave.GetCheck()); - - CMainFrame::GetInputHandler()->m_bAutoSave = m_bAutoSave.GetCheck(); - - - CPropertyPage::OnOK(); } @@ -659,7 +645,7 @@ m_sFullPathName = files.first_file.c_str(); plocalCmdSet->LoadFile(m_sFullPathName); ForceUpdateGUI(); - TentativeSetToDefaultFile(m_sFullPathName); + //TentativeSetToDefaultFile(m_sFullPathName); } void COptionsKeyboard::OnSave() @@ -672,7 +658,7 @@ m_sFullPathName = files.first_file.c_str(); plocalCmdSet->SaveFile(m_sFullPathName, m_bDebugSave.GetCheck()); - TentativeSetToDefaultFile(m_sFullPathName); + //TentativeSetToDefaultFile(m_sFullPathName); } bool COptionsKeyboard::TentativeSetToDefaultFile(CString m_sFullPathName) Modified: trunk/OpenMPT/mptrack/KeyConfigDlg.h =================================================================== --- trunk/OpenMPT/mptrack/KeyConfigDlg.h 2010-11-13 22:03:04 UTC (rev 761) +++ trunk/OpenMPT/mptrack/KeyConfigDlg.h 2010-11-16 21:39:23 UTC (rev 762) @@ -89,7 +89,7 @@ CButton m_bKeyDown, m_bKeyHold, m_bKeyUp; CButton m_bnReset; CCustEdit m_eCustHotKey; - CEdit m_eReport, m_eKeyFile, m_eChordWaitTime; + CEdit m_eReport, m_eChordWaitTime; UINT m_nKeyboardCfg; int m_nCurHotKey, m_nCurCategory, m_nCurKeyChoice; CString m_sFullPathName; @@ -99,7 +99,6 @@ bool m_bChoiceModified; CButton m_bDebugSave; - CButton m_bAutoSave; void ForceUpdateGUI(); bool TentativeSetToDefaultFile(CString); Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2010-11-13 22:03:04 UTC (rev 761) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2010-11-16 21:39:23 UTC (rev 762) @@ -945,6 +945,10 @@ } // Save Settings SaveIniSettings(); + if(m_InputHandler && m_InputHandler->activeCommandSet) + { + m_InputHandler->activeCommandSet->SaveFile(m_szKbdFile, false); + } EndWaitCursor(); CMDIFrameWnd::OnClose(); @@ -1033,12 +1037,8 @@ WritePrivateProfileString("Paths", m_szDirectoryToSettingsName[i], szPath, iniFile); } - _tcscpy(szPath, m_szKbdFile); - if(bConvertPaths) - { - AbsolutePathToRelative(szPath); - } - WritePrivateProfileString("Paths", "Key_Config_File", szPath, iniFile); + // Obsolete, since we always write to Keybindings.mkb now. Older versions of OpenMPT 1.18+ will look for this file if this entry is missing, so this is kind of backwards compatible. + WritePrivateProfileString("Paths", "Key_Config_File", NULL, iniFile); WritePrivateProfileLong("Effects", "XBassDepth", CSoundFile::m_nXBassDepth, iniFile); WritePrivateProfileLong("Effects", "XBassRange", CSoundFile::m_nXBassRange, iniFile); Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2010-11-13 22:03:04 UTC (rev 761) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2010-11-16 21:39:23 UTC (rev 762) @@ -662,6 +662,9 @@ } #ifdef WIN32 // Legacy stuff +// Move a config file called sFileName from the App's directory (or one of its sub directories specified by sSubDir) to +// %APPDATA%. If specified, it will be renamed to sNewFileName. Existing files are never overwritten. +// Returns true on success. bool CTrackApp::MoveConfigFile(TCHAR sFileName[_MAX_PATH], TCHAR sSubDir[_MAX_PATH], TCHAR sNewFileName[_MAX_PATH]) //----------------------------------------------------------------------------------------------------------------- { @@ -682,8 +685,7 @@ if(PathFileExists(sNewPath) == 0 && PathFileExists(sOldPath) != 0) { - MoveFile(sOldPath, sNewPath); - return true; + return (MoveFile(sOldPath, sNewPath) != 0); } return false; } @@ -728,56 +730,16 @@ strcat(m_szConfigDirectory, "\\OpenMPT\\"); // Path doesn't exist yet, so it has to be created - bool justCreated = false; if(PathIsDirectory(m_szConfigDirectory) == 0) { CreateDirectory(m_szConfigDirectory, 0); - justCreated = true; } #ifdef WIN32 // Legacy stuff - - bool movedKeyboardFiles = false; - // Move files if necessary. - movedKeyboardFiles = MoveConfigFile("default.mkb", "", "Keybindings.mkb"); - movedKeyboardFiles |= MoveConfigFile("Keybindings.mkb"); - - // Check the old ini settings - if(justCreated && movedKeyboardFiles) - { - TCHAR szOldPath[_MAX_PATH], szTestPath[_MAX_PATH]; - - GetPrivateProfileString("Paths", "Key_Config_File", szOldPath, szOldPath, INIBUFFERSIZE, m_szConfigFileName); - _strlwr(szOldPath); // compare all in lower case - - bool overwritePath = false; - strcpy(szTestPath, m_szExePath); - strcat(szTestPath, "default.mkb"); - _strlwr(szTestPath); - overwritePath = (strcmp(szTestPath, szOldPath) == 0); - - if(overwritePath == false) - { - strcpy(szTestPath, m_szExePath); - strcat(szTestPath, "Keybindings.mkb"); - _strlwr(szTestPath); - overwritePath = (strcmp(szTestPath, szOldPath) == 0); - } - - if(overwritePath) - { - // if old INI entry points to a file that's going to be moved, change it. - strcpy(szTestPath, m_szConfigDirectory); - strcat(szTestPath, "Keybindings.mkb"); - WritePrivateProfileString("Paths", "Key_Config_File", szTestPath, m_szConfigFileName); - } - - } - // Move some more files + // Move the config files if they're still in the old place. MoveConfigFile("mptrack.ini"); MoveConfigFile("plugin.cache"); MoveConfigFile("mpt_intl.ini"); - #endif // WIN32 Legacy Stuff } Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2010-11-13 22:03:04 UTC (rev 761) +++ trunk/OpenMPT/mptrack/mptrack.rc 2010-11-16 21:39:23 UTC (rev 762) @@ -346,12 +346,12 @@ END IDD_OPTIONS_KEYBOARD DIALOGEX 0, 0, 272, 279 -STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Keyboard" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN COMBOBOX IDC_KEYCATEGORY,5,16,130,204,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LISTBOX IDC_COMMAND_LIST,5,32,130,242,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + LISTBOX IDC_COMMAND_LIST,5,32,130,238,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_CHOICECOMBO,147,16,79,51,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP EDITTEXT IDC_CUSTHOTKEY,163,31,98,13,ES_AUTOHSCROLL CONTROL "On Key Down",IDC_CHECKKEYDOWN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,44,66,14 @@ -359,27 +359,24 @@ CONTROL "On Key Up",IDC_CHECKKEYUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,147,68,66,8 PUSHBUTTON "Restore",IDC_RESTORE,217,46,43,13 PUSHBUTTON "Delete",IDC_DELETE,217,64,43,13 - EDITTEXT IDC_KEYREPORT,141,94,125,70,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL - PUSHBUTTON "Y",IDC_NOTESREPEAT,235,176,12,9 - PUSHBUTTON "N",IDC_NONOTESREPEAT,251,176,12,9 - EDITTEXT IDC_CHORDDETECTWAITTIME,235,189,28,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT + EDITTEXT IDC_KEYREPORT,138,94,128,98,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL + PUSHBUTTON "Y",IDC_NOTESREPEAT,234,207,12,9 + PUSHBUTTON "N",IDC_NONOTESREPEAT,250,207,12,9 + EDITTEXT IDC_CHORDDETECTWAITTIME,234,220,24,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT PUSHBUTTON "it",IDC_EFFECTLETTERSIT,103,184,12,9,NOT WS_VISIBLE PUSHBUTTON "xm",IDC_EFFECTLETTERSXM,119,184,12,9,NOT WS_VISIBLE - PUSHBUTTON "Load Keys...",IDC_LOAD,145,221,54,13 - PUSHBUTTON "Save Keys As...",IDC_SAVE,205,221,54,13 + PUSHBUTTON "Load Keys...",IDC_LOAD,144,252,54,13 + PUSHBUTTON "Save Keys As...",IDC_SAVE,204,252,54,13 CONTROL "Debug Save",IDC_DEBUGSAVE,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,59,199,56,10 - EDITTEXT IDC_KEYMAPFILE,145,249,114,13,ES_AUTOHSCROLL LTEXT "Select category:",IDC_STATIC,7,5,74,11 PUSHBUTTON "Set",IDC_SET,225,45,43,13,NOT WS_VISIBLE GROUPBOX "Key setup for this command ",IDC_STATIC,139,5,127,75 LTEXT "Key:",IDC_STATIC,147,33,16,8 - GROUPBOX "Misc",IDC_STATIC,139,167,126,40 - GROUPBOX "Multi Config Handling",IDC_STATIC,139,209,126,66 - LTEXT "Repeat notes on hold?",IDC_STATIC,143,176,74,11 + GROUPBOX "Misc",IDC_STATIC,138,198,126,37 + GROUPBOX "Multi Config Handling",IDC_STATIC,138,240,126,31 + LTEXT "Repeat notes on hold?",IDC_STATIC,142,207,74,11 LTEXT "Effect letters like:",IDC_STATIC,11,185,73,11,NOT WS_VISIBLE - LTEXT "Chord detect interval (ms):",IDC_STATIC,143,190,88,11 - CONTROL "Save to this file on OK/Apply?",IDC_AUTOSAVE,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,153,262,106,10 - LTEXT "Config to load on startup:",IDC_STATIC,145,239,80,8 + LTEXT "Chord detect interval (ms):",IDC_STATIC,142,222,88,11 LTEXT "Log:",IDC_STATIC,141,84,19,10 PUSHBUTTON "Clear Log",IDC_CLEARLOG,227,85,37,9 END @@ -763,8 +760,8 @@ EDITTEXT IDC_EDIT_LOG,6,7,234,96,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY | WS_VSCROLL END -IDD_REMOVECHANNELS DIALOGEX 0, 0, 171, 220 -STYLE DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +IDD_REMOVECHANNELS DIALOGEX 0, 0, 171, 221 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Remove Channels" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -772,7 +769,7 @@ PUSHBUTTON "Cancel",IDCANCEL,114,198,50,14 LISTBOX IDC_REMCHANSLIST,6,36,156,156,LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP LTEXT "Channels:",IDC_QUESTION1,6,6,157,18 - LTEXT "Detected unused channels are already selected",IDC_STATIC,6,24,159,10 + LTEXT "Detected unused channels are already selected",IDC_STATIC,4,24,159,10 END IDD_VIEW_GLOBALS DIALOGEX 0, 0, 471, 337 @@ -1636,7 +1633,7 @@ IDD_REMOVECHANNELS, DIALOG BEGIN RIGHTMARGIN, 163 - BOTTOMMARGIN, 218 + BOTTOMMARGIN, 219 END IDD_VIEW_GLOBALS, DIALOG @@ -1912,7 +1909,7 @@ MENUITEM "Import &MIDI Library...", ID_IMPORT_MIDILIB MENUITEM "Add Sound &Bank...", ID_ADD_SOUNDBANK MENUITEM SEPARATOR - MENUITEM "Recent File", ID_FILE_MRU_FILE1, GRAYED + MENUITEM "Recent File", ID_FILE_MRU_FILE1 MENUITEM SEPARATOR MENUITEM "E&xit", ID_APP_EXIT END Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2010-11-13 22:03:04 UTC (rev 761) +++ trunk/OpenMPT/mptrack/resource.h 2010-11-16 21:39:23 UTC (rev 762) @@ -645,7 +645,6 @@ #define IDC_LIST6 2076 #define IDC_KEYBOARD1 2078 #define IDC_SPLASH 2079 -#define IDC_HOTKEY1 2080 #define IDC_TREEVIEW 2081 #define IDC_COMMANDKEY 2081 #define IDC_VUMETER_LEFT 2082 @@ -655,63 +654,33 @@ #define IDC_COMBO7 2085 #define IDC_TREE1 2086 #define IDC_VISSTATUS 2087 -#define IDC_CHECK130 2088 -#define IDC_CHECK131 2089 -#define IDC_CHECK132 2090 #define IDC_CHOICECOMBO 2090 -#define IDC_CHECK133 2091 -#define IDC_CHECK134 2092 #define IDC_CHOICECOMBO2 2092 #define IDC_KEYCATEGORY 2092 -#define IDC_CHECK135 2093 -#define IDC_CHECK136 2094 #define IDC_CHECKKEYDOWN 2094 -#define IDC_CHECK137 2095 #define IDC_CHECKKEYHOLD 2095 -#define IDC_CHECK138 2096 #define IDC_CHECKKEYUP 2096 -#define IDC_CHECK139 2097 #define IDC_DEBUGSAVE 2097 -#define IDC_CHECK140 2098 #define IDC_CUSTHOTKEY 2098 -#define IDC_CHECK141 2099 #define IDC_SET 2099 -#define IDC_CHECK142 2100 #define IDC_RESTORE 2100 -#define IDC_CHECK143 2101 #define IDC_DELETE 2101 -#define IDC_CHECK144 2102 #define IDC_SAVE 2102 -#define IDC_CHECK145 2103 #define IDC_LOAD 2103 -#define IDC_CHECK146 2104 -#define IDC_AUTOSAVE 2104 -#define IDC_CHECK147 2105 #define IDC_KEYREPORT 2105 -#define IDC_CHECK148 2106 -#define IDC_KEYMAPFILE 2106 -#define IDC_CHECK149 2107 #define IDC_BROWSEKEYCONF 2107 #define IDC_CLEARLOG 2107 -#define IDC_CHECK150 2108 #define IDC_NOTESREPEAT 2108 #define IDC_REMCHANSLIST 2108 -#define IDC_CHECK151 2109 #define IDC_NOTESREPEAT2 2109 #define IDC_NONOTESREPEAT 2109 -#define IDC_CHECK152 2110 #define IDC_EFFECTLETTERSIT 2110 #define IDC_INSVIEWPLG 2110 -#define IDC_CHECK153 2111 #define IDC_EFFECTLETTERSXM 2111 #define IDC_PARAMLABEL 2111 -#define IDC_CHECK154 2112 #define IDC_PARAMLIST 2112 -#define IDC_CHECK155 2113 #define IDC_PARAMVALUETEXT 2113 -#define IDC_CHECK156 2114 #define IDC_PARAMVALUESLIDE 2114 -#define IDC_CHECK157 2115 #define IDC_PARAMLABEL2 2115 #define IDC_VISFILLBLANKS 2115 #define IDC_CHECK158 2116 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-11-27 23:28:46
|
Revision: 766 http://modplug.svn.sourceforge.net/modplug/?rev=766&view=rev Author: saga-games Date: 2010-11-27 23:28:39 +0000 (Sat, 27 Nov 2010) Log Message: ----------- [Imp] VST File Selector code should now work (hopefully). Borrowed some logic from Psycle. Modified Paths: -------------- trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/Vstplug.h Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2010-11-20 21:11:32 UTC (rev 765) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2010-11-27 23:28:39 UTC (rev 766) @@ -82,7 +82,6 @@ //------------------------------------ { m_pVstHead = NULL; - m_szHostBuffer = nullptr; //m_bNeedIdle = FALSE; //rewbs.VSTCompliance - now member of plugin class CSoundFile::gpMixPluginCreateProc = CreateMixPluginProc; EnumerateDirectXDMOs(); @@ -93,11 +92,6 @@ //------------------------------------- { CSoundFile::gpMixPluginCreateProc = NULL; - if(m_szHostBuffer != nullptr) - { - delete[] m_szHostBuffer; - m_szHostBuffer = nullptr; - } while (m_pVstHead) { PVSTPLUGINLIB p = m_pVstHead; @@ -1009,7 +1003,7 @@ //---from here VST 2.2 extension opcodes------------------------------------------------------ // close a fileselector operation with VstFileSelect* in <ptr>: Must be always called after an open ! case audioMasterCloseFileSelector: - return VstFileSelector(opcode == audioMasterCloseFileSelector, (VstFileSelect *)ptr); + return VstFileSelector(opcode == audioMasterCloseFileSelector, (VstFileSelect *)ptr, effect); // open an editor for audio (defined by XML text in ptr) case audioMasterEditFile: @@ -1035,18 +1029,21 @@ // Helper function for file selection dialog stuff. -long CVstPluginManager::VstFileSelector(const bool destructor, VstFileSelect *pFileSel) -//------------------------------------------------------------------------------------- +long CVstPluginManager::VstFileSelector(const bool destructor, VstFileSelect *pFileSel, const AEffect *effect) +//------------------------------------------------------------------------------------------------------------ { + if(pFileSel == nullptr) + { + return 0; + } + if(!destructor) { - if(pFileSel == nullptr) - { - return 0; - } + pFileSel->nbReturnPath = 0; if(pFileSel->command != kVstDirectorySelect) { + // Plugin wants to load or save a file. std::string extensions, workingDir; for(size_t i = 0; i < pFileSel->nbFileTypes; i++) { @@ -1083,8 +1080,6 @@ (pFileSel->command == kVstMultipleFilesLoad ? true : false) ); - pFileSel->nbReturnPath = 0; - if(files.abort) { return 0; @@ -1092,43 +1087,114 @@ if(pFileSel->command == kVstMultipleFilesLoad) { - // TODO: multiple paths - Log("VST plugin to host: Multiple files\n"); - return 0; + // Multiple paths + pFileSel->nbReturnPath = files.filenames.size(); + pFileSel->returnMultiplePaths = new char *[pFileSel->nbReturnPath]; + for(size_t i = 0; i < files.filenames.size(); i++) + { + char *fname = new char[files.filenames[i].length() + 1]; + strcpy(fname, files.filenames[i].c_str()); + pFileSel->returnMultiplePaths[i] = fname; + } + return 1; } else { - if(pFileSel->returnPath == nullptr) + // Single path + if(pFileSel->returnPath == nullptr || pFileSel->sizeReturnPath == 0) { + // Provide some memory for the return path. - if(m_szHostBuffer != nullptr) + pFileSel->sizeReturnPath = files.first_file.length(); + pFileSel->returnPath = new char[pFileSel->sizeReturnPath + 1]; + if(pFileSel->returnPath == nullptr) { - delete[] m_szHostBuffer; - } - pFileSel->sizeReturnPath = _MAX_PATH; - m_szHostBuffer = new char[_MAX_PATH]; - if(m_szHostBuffer == nullptr) - { return 0; } - pFileSel->returnPath = m_szHostBuffer; + pFileSel->returnPath[pFileSel->sizeReturnPath] = '\0'; + pFileSel->reserved = 1; + } else + { + pFileSel->reserved = 0; } - strncpy(pFileSel->returnPath, files.first_file.c_str(), pFileSel->sizeReturnPath - 1); + strncpy(pFileSel->returnPath, files.first_file.c_str(), pFileSel->sizeReturnPath); pFileSel->nbReturnPath = 1; } return 1; } else { - Log("VST plugin to host: Get Directory\n"); - return 0; + // Plugin wants a directory + + char szInitPath[_MAX_PATH]; + MemsetZero(szInitPath); + if(pFileSel->initialPath) + { + strncpy(szInitPath, pFileSel->initialPath, _MAX_PATH - 1); + } + + char szBuffer[_MAX_PATH]; + MemsetZero(szBuffer); + + BROWSEINFO bi; + MemsetZero(bi); + bi.hwndOwner = CMainFrame::GetMainFrame()->m_hWnd; + bi.lpszTitle = pFileSel->title; + bi.pszDisplayName = szInitPath; + bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI; + LPITEMIDLIST pid = SHBrowseForFolder(&bi); + if(pid != NULL && SHGetPathFromIDList(pid, szBuffer)) + { + if(!memcmp(&(effect->uniqueID), "rTSV", 4) && pFileSel->returnPath != nullptr && pFileSel->sizeReturnPath == 0) + { + // old versions of reViSiT (which still relied on the host's file selection code) seem to be dodgy. + // They report a path size of 0, but when using an own buffer, they will crash. + // So we'll just assume that reViSiT can handle long enough (_MAX_PATH) paths here. + pFileSel->sizeReturnPath = strlen(szBuffer); + pFileSel->returnPath[pFileSel->sizeReturnPath] = '\0'; + } + if(pFileSel->returnPath == nullptr || pFileSel->sizeReturnPath == 0) + { + // Provide some memory for the return path. + pFileSel->sizeReturnPath = strlen(szBuffer); + pFileSel->returnPath = new char[pFileSel->sizeReturnPath + 1]; + if(pFileSel->returnPath == nullptr) + { + return 0; + } + pFileSel->returnPath[pFileSel->sizeReturnPath] = '\0'; + pFileSel->reserved = 1; + } else + { + pFileSel->reserved = 0; + } + strncpy(pFileSel->returnPath, szBuffer, pFileSel->sizeReturnPath); + pFileSel->nbReturnPath = 1; + return 1; + } else + { + return 0; + } } } else { - Log("VST plugin to host: Close File Selector\n"); - if(m_szHostBuffer != nullptr) + // Close file selector - delete allocated strings. + if(pFileSel->command == kVstMultipleFilesLoad && pFileSel->returnMultiplePaths != nullptr) { - delete[] m_szHostBuffer; - m_szHostBuffer = nullptr; + for(size_t i = 0; i < pFileSel->nbReturnPath; i++) + { + if(pFileSel->returnMultiplePaths[i] != nullptr) + { + delete[] pFileSel->returnMultiplePaths[i]; + } + } + delete[] pFileSel->returnMultiplePaths; + } else + { + if(pFileSel->reserved == 1 && pFileSel->returnPath != nullptr) + { + delete[] pFileSel->returnPath; + pFileSel->returnPath = nullptr; + } } return 1; } Modified: trunk/OpenMPT/mptrack/Vstplug.h =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.h 2010-11-20 21:11:32 UTC (rev 765) +++ trunk/OpenMPT/mptrack/Vstplug.h 2010-11-27 23:28:39 UTC (rev 766) @@ -246,14 +246,11 @@ protected: long VstCallback(AEffect *effect, long opcode, long index, long value, void *ptr, float opt); - long VstFileSelector(const bool destructor, VstFileSelect *pFileSel); + long VstFileSelector(const bool destructor, VstFileSelect *pFileSel, const AEffect *effect); static long VSTCALLBACK MasterCallBack(AEffect *effect, long opcode, long index, long value, void *ptr, float opt); static BOOL __cdecl CreateMixPluginProc(PSNDMIXPLUGIN, CSoundFile*); VstTimeInfo timeInfo; //rewbs.VSTcompliance -protected: - char *m_szHostBuffer; // host's buffer for file select dialog - public: static char s_szHostProductString[64]; static char s_szHostVendorString[64]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-12-02 22:53:00
|
Revision: 767 http://modplug.svn.sourceforge.net/modplug/?rev=767&view=rev Author: saga-games Date: 2010-12-02 22:52:54 +0000 (Thu, 02 Dec 2010) Log Message: ----------- [New] Pattern Editor: Clicking and dragging the row numbers selects the whole row now (Excel/Calc style) - see http://bugs.openmpt.org/view.php?id=45 Modified Paths: -------------- trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2010-11-27 23:28:39 UTC (rev 766) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2010-12-02 22:52:54 UTC (rev 767) @@ -987,10 +987,10 @@ void CViewPattern::OnLButtonDown(UINT nFlags, CPoint point) -//-------------------------------------------------- +//--------------------------------------------------------- { CModDoc *pModDoc = GetDocument(); - if (/*(m_bDragging) ||*/ (!pModDoc)) return; + if (/*(m_bDragging) ||*/ (pModDoc == nullptr) || (pModDoc->GetSoundFile() == nullptr)) return; SetFocus(); m_nDragItem = GetDragItem(point, &m_rcDragItem); m_bDragging = true; @@ -1049,7 +1049,20 @@ } } } + } else if ((point.x < m_szHeader.cx) && (point.y > m_szHeader.cy)) + { + // Mark row number => mark whole row (start) + InvalidateSelection(); + DWORD dwPoint = GetPositionFromPoint(point); + if((dwPoint >> 16) < pModDoc->GetSoundFile()->Patterns[m_nPattern].GetNumRows()) + { + m_dwBeginSel = m_dwStartSel = dwPoint; + m_dwEndSel = m_dwBeginSel | 0xFFFF; + SetCurSel(m_dwStartSel, m_dwEndSel); + m_dwStatus |= PATSTATUS_SELECTROW; + } } + if (m_nDragItem) { InvalidateRect(&m_rcDragItem, FALSE); @@ -1079,7 +1092,7 @@ m_bDragging = false; m_bInItemRect = false; ReleaseCapture(); - m_dwStatus &= ~PATSTATUS_MOUSEDRAGSEL; + m_dwStatus &= ~(PATSTATUS_MOUSEDRAGSEL|PATSTATUS_SELECTROW); // Drag & Drop Editing if (m_dwStatus & PATSTATUS_DRAGNDROPEDIT) { @@ -1303,8 +1316,14 @@ UpdateWindow(); } } - if (m_dwStatus & PATSTATUS_MOUSEDRAGSEL) + if ((m_dwStatus & PATSTATUS_SELECTROW) /*&& (point.x < m_szHeader.cx)*/ && (point.y > m_szHeader.cy)) { + // Mark row number => mark whole row (continue) + InvalidateSelection(); + m_dwEndSel = GetPositionFromPoint(point) | 0xFFFF; + SetCurSel(m_dwStartSel, m_dwEndSel); + } else if (m_dwStatus & PATSTATUS_MOUSEDRAGSEL) + { CModDoc *pModDoc = GetDocument(); DWORD dwPos = GetPositionFromPoint(point); if ((pModDoc) && (m_nPattern < pModDoc->GetSoundFile()->Patterns.Size())) Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2010-11-27 23:28:39 UTC (rev 766) +++ trunk/OpenMPT/mptrack/View_pat.h 2010-12-02 22:52:54 UTC (rev 767) @@ -14,21 +14,21 @@ #define DRAGITEM_PATTERNHEADER 0x020000 #define DRAGITEM_PLUGNAME 0x040000 //rewbs.patPlugName -#define PATSTATUS_MOUSEDRAGSEL 0x01 -#define PATSTATUS_KEYDRAGSEL 0x02 -#define PATSTATUS_FOCUS 0x04 -#define PATSTATUS_FOLLOWSONG 0x08 -#define PATSTATUS_RECORD 0x10 -#define PATSTATUS_DRAGHSCROLL 0x20 -#define PATSTATUS_DRAGVSCROLL 0x40 -#define PATSTATUS_VUMETERS 0x80 -#define PATSTATUS_CHORDPLAYING 0x100 -#define PATSTATUS_DRAGNDROPEDIT 0x200 -#define PATSTATUS_DRAGNDROPPING 0x400 -#define PATSTATUS_MIDISPACINGPENDING 0x800 -#define PATSTATUS_CTRLDRAGSEL 0x1000 -#define PATSTATUS_PLUGNAMESINHEADERS 0x2000 //rewbs.patPlugName -#define PATSTATUS_PATTERNLOOP 0x4000 +#define PATSTATUS_MOUSEDRAGSEL 0x01 // Creating a selection using the mouse +#define PATSTATUS_KEYDRAGSEL 0x02 // Creating a selection using shortcuts +#define PATSTATUS_FOCUS 0x04 // Is the pattern editor focussed +#define PATSTATUS_FOLLOWSONG 0x08 // Does the cursor follow playback +#define PATSTATUS_RECORD 0x10 // Recording enabled +#define PATSTATUS_DRAGHSCROLL 0x20 // Some weird dragging stuff (?) +#define PATSTATUS_DRAGVSCROLL 0x40 // Some weird dragging stuff (?) +#define PATSTATUS_VUMETERS 0x80 // Display channel VU meters? +#define PATSTATUS_CHORDPLAYING 0x100 // Is a chord playing? (pretty much unused) +#define PATSTATUS_DRAGNDROPEDIT 0x200 // Drag & Drop editing (?) +#define PATSTATUS_DRAGNDROPPING 0x400 // Dragging a selection around +#define PATSTATUS_MIDISPACINGPENDING 0x800 // Unused (?) +#define PATSTATUS_CTRLDRAGSEL 0x1000 // Creating a selection using Ctrl +#define PATSTATUS_PLUGNAMESINHEADERS 0x2000 // Show plugin names in channel headers //rewbs.patPlugName +#define PATSTATUS_SELECTROW 0x4000 // Selecting a whole pattern row by clicking the row numbers // Row Spacing #define MAX_SPACING 64 // MAX_PATTERN_ROWS This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-12-03 22:13:04
|
Revision: 769 http://modplug.svn.sourceforge.net/modplug/?rev=769&view=rev Author: saga-games Date: 2010-12-03 22:12:57 +0000 (Fri, 03 Dec 2010) Log Message: ----------- [New] Pattern Editor: New (experimental) Find/Replace mode: Find in pattern selection. [Ref] Refactored Find/Replace code to use a struct for all the Find/Replace data (to keep the CViewPattern class clean) [Mod] OpenMPT: Version is now 1.19.00.14 Modified Paths: -------------- trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2010-12-03 22:05:09 UTC (rev 768) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2010-12-03 22:12:57 UTC (rev 769) @@ -24,16 +24,16 @@ #pragma warning(disable:4244) //"conversion from 'type1' to 'type2', possible loss of data" +FindReplaceStruct CViewPattern::m_findReplace = +{ + {0,0,0,0,0,0}, {0,0,0,0,0,0}, + PATSEARCH_FULLSEARCH, PATSEARCH_REPLACEALL, + 0, 0, + 0, +}; + MODCOMMAND CViewPattern::m_cmdOld = {0,0,0,0,0,0}; -MODCOMMAND CViewPattern::m_cmdFind = {0,0,0,0,0,0}; -MODCOMMAND CViewPattern::m_cmdReplace = {0,0,0,0,0,0}; -DWORD CViewPattern::m_dwFindFlags = PATSEARCH_FULLSEARCH; -DWORD CViewPattern::m_dwReplaceFlags = PATSEARCH_REPLACEALL; -UINT CViewPattern::m_nFindMinChn = 0; -UINT CViewPattern::m_nFindMaxChn = 0; -signed char cInstrRelChange = 0; - IMPLEMENT_SERIAL(CViewPattern, CModScrollView, 0) BEGIN_MESSAGE_MAP(CViewPattern, CModScrollView) @@ -1690,44 +1690,50 @@ CFindReplaceTab pageReplace(IDD_EDIT_REPLACE, TRUE, pModDoc); CPropertySheet dlg("Find/Replace"); - pageFind.m_nNote = m_cmdFind.note; - pageFind.m_nInstr = m_cmdFind.instr; - pageFind.m_nVolCmd = m_cmdFind.volcmd; - pageFind.m_nVol = m_cmdFind.vol; - pageFind.m_nCommand = m_cmdFind.command; - pageFind.m_nParam = m_cmdFind.param; - pageFind.m_dwFlags = m_dwFindFlags; - pageFind.m_nMinChannel = m_nFindMinChn; - pageFind.m_nMaxChannel = m_nFindMaxChn; - pageReplace.m_nNote = m_cmdReplace.note; - pageReplace.m_nInstr = m_cmdReplace.instr; - pageReplace.m_nVolCmd = m_cmdReplace.volcmd; - pageReplace.m_nVol = m_cmdReplace.vol; - pageReplace.m_nCommand = m_cmdReplace.command; - pageReplace.m_nParam = m_cmdReplace.param; - pageReplace.m_dwFlags = m_dwReplaceFlags; - pageReplace.cInstrRelChange = m_cInstrRelChange; + pageFind.m_nNote = m_findReplace.cmdFind.note; + pageFind.m_nInstr = m_findReplace.cmdFind.instr; + pageFind.m_nVolCmd = m_findReplace.cmdFind.volcmd; + pageFind.m_nVol = m_findReplace.cmdFind.vol; + pageFind.m_nCommand = m_findReplace.cmdFind.command; + pageFind.m_nParam = m_findReplace.cmdFind.param; + pageFind.m_dwFlags = m_findReplace.dwFindFlags; + pageFind.m_nMinChannel = m_findReplace.nFindMinChn; + pageFind.m_nMaxChannel = m_findReplace.nFindMaxChn; + pageFind.m_bPatSel = (m_dwBeginSel != m_dwEndSel) ? true : false; + pageReplace.m_nNote = m_findReplace.cmdReplace.note; + pageReplace.m_nInstr = m_findReplace.cmdReplace.instr; + pageReplace.m_nVolCmd = m_findReplace.cmdReplace.volcmd; + pageReplace.m_nVol = m_findReplace.cmdReplace.vol; + pageReplace.m_nCommand = m_findReplace.cmdReplace.command; + pageReplace.m_nParam = m_findReplace.cmdReplace.param; + pageReplace.m_dwFlags = m_findReplace.dwReplaceFlags; + pageReplace.cInstrRelChange = m_findReplace.cInstrRelChange; + if(m_dwBeginSel != m_dwEndSel) + { + pageFind.m_dwFlags |= PATSEARCH_PATSELECTION; + pageFind.m_dwFlags &= ~PATSEARCH_FULLSEARCH; + } dlg.AddPage(&pageFind); dlg.AddPage(&pageReplace); if (dlg.DoModal() == IDOK) { - m_cmdFind.note = pageFind.m_nNote; - m_cmdFind.instr = pageFind.m_nInstr; - m_cmdFind.volcmd = pageFind.m_nVolCmd; - m_cmdFind.vol = pageFind.m_nVol; - m_cmdFind.command = pageFind.m_nCommand; - m_cmdFind.param = pageFind.m_nParam; - m_nFindMinChn = pageFind.m_nMinChannel; - m_nFindMaxChn = pageFind.m_nMaxChannel; - m_dwFindFlags = pageFind.m_dwFlags; - m_cmdReplace.note = pageReplace.m_nNote; - m_cmdReplace.instr = pageReplace.m_nInstr; - m_cmdReplace.volcmd = pageReplace.m_nVolCmd; - m_cmdReplace.vol = pageReplace.m_nVol; - m_cmdReplace.command = pageReplace.m_nCommand; - m_cmdReplace.param = pageReplace.m_nParam; - m_dwReplaceFlags = pageReplace.m_dwFlags; - m_cInstrRelChange = pageReplace.cInstrRelChange; + m_findReplace.cmdFind.note = pageFind.m_nNote; + m_findReplace.cmdFind.instr = pageFind.m_nInstr; + m_findReplace.cmdFind.volcmd = pageFind.m_nVolCmd; + m_findReplace.cmdFind.vol = pageFind.m_nVol; + m_findReplace.cmdFind.command = pageFind.m_nCommand; + m_findReplace.cmdFind.param = pageFind.m_nParam; + m_findReplace.nFindMinChn = pageFind.m_nMinChannel; + m_findReplace.nFindMaxChn = pageFind.m_nMaxChannel; + m_findReplace.dwFindFlags = pageFind.m_dwFlags; + m_findReplace.cmdReplace.note = pageReplace.m_nNote; + m_findReplace.cmdReplace.instr = pageReplace.m_nInstr; + m_findReplace.cmdReplace.volcmd = pageReplace.m_nVolCmd; + m_findReplace.cmdReplace.vol = pageReplace.m_nVol; + m_findReplace.cmdReplace.command = pageReplace.m_nCommand; + m_findReplace.cmdReplace.param = pageReplace.m_nParam; + m_findReplace.dwReplaceFlags = pageReplace.m_dwFlags; + m_findReplace.cInstrRelChange = pageReplace.cInstrRelChange; m_bContinueSearch = false; OnEditFindNext(); } @@ -1787,7 +1793,7 @@ BOOL bEffectEx; if (!pModDoc) return; - if (!(m_dwFindFlags & ~PATSEARCH_FULLSEARCH)) + if (!(m_findReplace.dwFindFlags & ~PATSEARCH_FULLSEARCH)) { PostMessage(WM_COMMAND, ID_EDIT_FIND); return; @@ -1796,19 +1802,23 @@ pSndFile = pModDoc->GetSoundFile(); nPatStart = m_nPattern; nPatEnd = m_nPattern+1; - if (m_dwFindFlags & PATSEARCH_FULLSEARCH) + if (m_findReplace.dwFindFlags & PATSEARCH_FULLSEARCH) { nPatStart = 0; nPatEnd = pSndFile->Patterns.Size(); + } else if(m_findReplace.dwFindFlags & PATSEARCH_PATSELECTION) + { + nPatStart = m_nPattern; + nPatEnd = nPatStart + 1; } if (m_bContinueSearch) { nPatStart = m_nPattern; } bEffectEx = FALSE; - if (m_dwFindFlags & PATSEARCH_COMMAND) + if (m_findReplace.dwFindFlags & PATSEARCH_COMMAND) { - UINT fxndx = pModDoc->GetIndexFromEffect(m_cmdFind.command, m_cmdFind.param); + UINT fxndx = pModDoc->GetIndexFromEffect(m_findReplace.cmdFind.command, m_findReplace.cmdFind.param); bEffectEx = pModDoc->IsExtendedEffect(fxndx); } for (UINT nPat=nPatStart; nPat<nPatEnd; nPat++) @@ -1824,42 +1834,51 @@ } for (; n<len; n++, m++) { - BOOL bFound = TRUE, bReplace = TRUE; + bool bFound = true, bReplace = true; - if (m_dwFindFlags & PATSEARCH_CHANNEL) + if (m_findReplace.dwFindFlags & PATSEARCH_CHANNEL) { - UINT ch = n % pSndFile->m_nChannels; - if ((ch < m_nFindMinChn) || (ch > m_nFindMaxChn)) bFound = FALSE; + // limit to given channels + const CHANNELINDEX ch = n % pSndFile->m_nChannels; + if ((ch < m_findReplace.nFindMinChn) || (ch > m_findReplace.nFindMaxChn)) bFound = false; } - if (((m_dwFindFlags & PATSEARCH_NOTE) && ((m->note != m_cmdFind.note) && ((m_cmdFind.note != CFindReplaceTab::findAny) || (!m->note) || (m->note & 0x80)))) - || ((m_dwFindFlags & PATSEARCH_INSTR) && (m->instr != m_cmdFind.instr)) - || ((m_dwFindFlags & PATSEARCH_VOLCMD) && (m->volcmd != m_cmdFind.volcmd)) - || ((m_dwFindFlags & PATSEARCH_VOLUME) && (m->vol != m_cmdFind.vol)) - || ((m_dwFindFlags & PATSEARCH_COMMAND) && (m->command != m_cmdFind.command)) - || ((m_dwFindFlags & PATSEARCH_PARAM) && (m->param != m_cmdFind.param))) + if (m_findReplace.dwFindFlags & PATSEARCH_PATSELECTION) { - bFound = FALSE; + // limit to pattern selection + const CHANNELINDEX ch = n % pSndFile->m_nChannels; + const ROWINDEX row = n / pSndFile->m_nChannels; + if ((ch < GetSelectionStartChan()) || (ch > GetSelectionEndChan())) bFound = false; + if ((row < GetSelectionStartRow()) || (row > GetSelectionEndRow())) bFound = false; + } + if (((m_findReplace.dwFindFlags & PATSEARCH_NOTE) && ((m->note != m_findReplace.cmdFind.note) && ((m_findReplace.cmdFind.note != CFindReplaceTab::findAny) || (!m->note) || (m->note & 0x80)))) + || ((m_findReplace.dwFindFlags & PATSEARCH_INSTR) && (m->instr != m_findReplace.cmdFind.instr)) + || ((m_findReplace.dwFindFlags & PATSEARCH_VOLCMD) && (m->volcmd != m_findReplace.cmdFind.volcmd)) + || ((m_findReplace.dwFindFlags & PATSEARCH_VOLUME) && (m->vol != m_findReplace.cmdFind.vol)) + || ((m_findReplace.dwFindFlags & PATSEARCH_COMMAND) && (m->command != m_findReplace.cmdFind.command)) + || ((m_findReplace.dwFindFlags & PATSEARCH_PARAM) && (m->param != m_findReplace.cmdFind.param))) + { + bFound = false; } else { - if (((m_dwFindFlags & (PATSEARCH_COMMAND|PATSEARCH_PARAM)) == PATSEARCH_COMMAND) && (bEffectEx)) + if (((m_findReplace.dwFindFlags & (PATSEARCH_COMMAND|PATSEARCH_PARAM)) == PATSEARCH_COMMAND) && (bEffectEx)) { - if ((m->param & 0xF0) != (m_cmdFind.param & 0xF0)) bFound = FALSE; + if ((m->param & 0xF0) != (m_findReplace.cmdFind.param & 0xF0)) bFound = false; } // Ignore modcommands with PC/PCS notes when searching from volume or effect column. if( (m->IsPcNote()) && - m_dwFindFlags & (PATSEARCH_VOLCMD|PATSEARCH_VOLUME|PATSEARCH_COMMAND|PATSEARCH_PARAM)) + m_findReplace.dwFindFlags & (PATSEARCH_VOLCMD|PATSEARCH_VOLUME|PATSEARCH_COMMAND|PATSEARCH_PARAM)) { - bFound = FALSE; + bFound = false; } } // Found! if (bFound) { - BOOL bUpdPos = TRUE; - if ((m_dwReplaceFlags & (PATSEARCH_REPLACEALL|PATSEARCH_REPLACE)) == (PATSEARCH_REPLACEALL|PATSEARCH_REPLACE)) bUpdPos = FALSE; + bool bUpdPos = true; + if ((m_findReplace.dwReplaceFlags & (PATSEARCH_REPLACEALL|PATSEARCH_REPLACE)) == (PATSEARCH_REPLACEALL|PATSEARCH_REPLACE)) bUpdPos = false; nFound++; if (bUpdPos) { @@ -1871,16 +1890,16 @@ SetCurrentRow(n / pSndFile->m_nChannels); } UINT ncurs = (n % pSndFile->m_nChannels) << 3; - if (!(m_dwFindFlags & PATSEARCH_NOTE)) + if (!(m_findReplace.dwFindFlags & PATSEARCH_NOTE)) { ncurs++; - if (!(m_dwFindFlags & PATSEARCH_INSTR)) + if (!(m_findReplace.dwFindFlags & PATSEARCH_INSTR)) { ncurs++; - if (!(m_dwFindFlags & (PATSEARCH_VOLCMD|PATSEARCH_VOLUME))) + if (!(m_findReplace.dwFindFlags & (PATSEARCH_VOLCMD|PATSEARCH_VOLUME))) { ncurs++; - if (!(m_dwFindFlags & PATSEARCH_COMMAND)) ncurs++; + if (!(m_findReplace.dwFindFlags & PATSEARCH_COMMAND)) ncurs++; } } } @@ -1888,77 +1907,77 @@ { SetCurrentColumn(ncurs); } - if (!(m_dwReplaceFlags & PATSEARCH_REPLACE)) goto EndSearch; - if (!(m_dwReplaceFlags & PATSEARCH_REPLACEALL)) + if (!(m_findReplace.dwReplaceFlags & PATSEARCH_REPLACE)) goto EndSearch; + if (!(m_findReplace.dwReplaceFlags & PATSEARCH_REPLACEALL)) { UINT ans = MessageBox("Replace this occurrence?", "Replace", MB_YESNOCANCEL); - if (ans == IDYES) bReplace = TRUE; else - if (ans == IDNO) bReplace = FALSE; else goto EndSearch; + if (ans == IDYES) bReplace = true; else + if (ans == IDNO) bReplace = false; else goto EndSearch; } if (bReplace) { pModDoc->GetPatternUndo()->PrepareUndo(nPat, n % pSndFile->m_nChannels, n / pSndFile->m_nChannels, 1, 1); - if ((m_dwReplaceFlags & PATSEARCH_NOTE)) + if ((m_findReplace.dwReplaceFlags & PATSEARCH_NOTE)) { // -1 octave - if (m_cmdReplace.note == CFindReplaceTab::replaceNoteMinusOctave) + if (m_findReplace.cmdReplace.note == CFindReplaceTab::replaceNoteMinusOctave) { if (m->note > 12) m->note -= 12; } else // +1 octave - if (m_cmdReplace.note == CFindReplaceTab::replaceNotePlusOctave) + if (m_findReplace.cmdReplace.note == CFindReplaceTab::replaceNotePlusOctave) { if (m->note <= NOTE_MAX - 12) m->note += 12; } else // Note-- - if (m_cmdReplace.note == CFindReplaceTab::replaceNoteMinusOne) + if (m_findReplace.cmdReplace.note == CFindReplaceTab::replaceNoteMinusOne) { if (m->note > 1) m->note--; } else // Note++ - if (m_cmdReplace.note == CFindReplaceTab::replaceNotePlusOne) + if (m_findReplace.cmdReplace.note == CFindReplaceTab::replaceNotePlusOne) { if (m->note < NOTE_MAX) m->note++; } else // Replace with another note { - // If we're going to remove a PC Note, wipe out the complete column. - if(m->IsPcNote() && !MODCOMMAND::IsPcNote(m_cmdReplace.note)) + // If we're going to remove a PC Note or replace a normal note by a PC note, wipe out the complete column. + if(m->IsPcNote() != MODCOMMAND::IsPcNote(m_findReplace.cmdReplace.note)) { m->Clear(); } - m->note = m_cmdReplace.note; + m->note = m_findReplace.cmdReplace.note; } } - if ((m_dwReplaceFlags & PATSEARCH_INSTR)) + if ((m_findReplace.dwReplaceFlags & PATSEARCH_INSTR)) { // Instr-- - if (m_cInstrRelChange == -1 && m->instr > 1) + if (m_findReplace.cInstrRelChange == -1 && m->instr > 1) m->instr--; // Instr++ - else if (m_cInstrRelChange == 1 && m->instr > 0 && m->instr < (MAX_INSTRUMENTS - 1)) + else if (m_findReplace.cInstrRelChange == 1 && m->instr > 0 && m->instr < (MAX_INSTRUMENTS - 1)) m->instr++; - else m->instr = m_cmdReplace.instr; + else m->instr = m_findReplace.cmdReplace.instr; } - if ((m_dwReplaceFlags & PATSEARCH_VOLCMD)) + if ((m_findReplace.dwReplaceFlags & PATSEARCH_VOLCMD)) { - m->volcmd = m_cmdReplace.volcmd; + m->volcmd = m_findReplace.cmdReplace.volcmd; } - if ((m_dwReplaceFlags & PATSEARCH_VOLUME)) + if ((m_findReplace.dwReplaceFlags & PATSEARCH_VOLUME)) { - m->vol = m_cmdReplace.vol; + m->vol = m_findReplace.cmdReplace.vol; } - if ((m_dwReplaceFlags & PATSEARCH_COMMAND)) + if ((m_findReplace.dwReplaceFlags & PATSEARCH_COMMAND)) { - m->command = m_cmdReplace.command; + m->command = m_findReplace.cmdReplace.command; } - if ((m_dwReplaceFlags & PATSEARCH_PARAM)) + if ((m_findReplace.dwReplaceFlags & PATSEARCH_PARAM)) { - if ((bEffectEx) && (!(m_dwReplaceFlags & PATSEARCH_COMMAND))) - m->param = (BYTE)((m->param & 0xF0) | (m_cmdReplace.param & 0x0F)); + if ((bEffectEx) && (!(m_findReplace.dwReplaceFlags & PATSEARCH_COMMAND))) + m->param = (BYTE)((m->param & 0xF0) | (m_findReplace.cmdReplace.param & 0x0F)); else - m->param = m_cmdReplace.param; + m->param = m_findReplace.cmdReplace.param; } pModDoc->SetModified(); if (bUpdPos) InvalidateRow(); @@ -1967,52 +1986,52 @@ } } EndSearch: - if (m_dwReplaceFlags & PATSEARCH_REPLACEALL) InvalidatePattern(); + if (m_findReplace.dwReplaceFlags & PATSEARCH_REPLACEALL) InvalidatePattern(); m_bContinueSearch = true; EndWaitCursor(); // Display search results - //m_dwReplaceFlags &= ~PATSEARCH_REPLACEALL; + //m_findReplace.dwReplaceFlags &= ~PATSEARCH_REPLACEALL; if (!nFound) { - if (m_dwFindFlags & PATSEARCH_NOTE) + if (m_findReplace.dwFindFlags & PATSEARCH_NOTE) { - wsprintf(szFind, "%s", GetNoteStr(m_cmdFind.note)); + wsprintf(szFind, "%s", GetNoteStr(m_findReplace.cmdFind.note)); } else strcpy(szFind, "???"); strcat(szFind, " "); - if (m_dwFindFlags & PATSEARCH_INSTR) + if (m_findReplace.dwFindFlags & PATSEARCH_INSTR) { - if (m_cmdFind.instr) - wsprintf(&szFind[strlen(szFind)], "%03d", m_cmdFind.instr); + if (m_findReplace.cmdFind.instr) + wsprintf(&szFind[strlen(szFind)], "%03d", m_findReplace.cmdFind.instr); else strcat(szFind, " .."); } else strcat(szFind, " ??"); strcat(szFind, " "); - if (m_dwFindFlags & PATSEARCH_VOLCMD) + if (m_findReplace.dwFindFlags & PATSEARCH_VOLCMD) { - if (m_cmdFind.volcmd) - wsprintf(&szFind[strlen(szFind)], "%c", gszVolCommands[m_cmdFind.volcmd]); + if (m_findReplace.cmdFind.volcmd) + wsprintf(&szFind[strlen(szFind)], "%c", gszVolCommands[m_findReplace.cmdFind.volcmd]); else strcat(szFind, "."); } else strcat(szFind, "?"); - if (m_dwFindFlags & PATSEARCH_VOLUME) + if (m_findReplace.dwFindFlags & PATSEARCH_VOLUME) { - wsprintf(&szFind[strlen(szFind)], "%02d", m_cmdFind.vol); + wsprintf(&szFind[strlen(szFind)], "%02d", m_findReplace.cmdFind.vol); } else strcat(szFind, "??"); strcat(szFind, " "); - if (m_dwFindFlags & PATSEARCH_COMMAND) + if (m_findReplace.dwFindFlags & PATSEARCH_COMMAND) { - if (m_cmdFind.command) + if (m_findReplace.cmdFind.command) { if (pSndFile->m_nType & (MOD_TYPE_S3M|MOD_TYPE_IT|MOD_TYPE_MPT)) - wsprintf(&szFind[strlen(szFind)], "%c", gszS3mCommands[m_cmdFind.command]); + wsprintf(&szFind[strlen(szFind)], "%c", gszS3mCommands[m_findReplace.cmdFind.command]); else - wsprintf(&szFind[strlen(szFind)], "%c", gszModCommands[m_cmdFind.command]); + wsprintf(&szFind[strlen(szFind)], "%c", gszModCommands[m_findReplace.cmdFind.command]); } else strcat(szFind, "."); } else strcat(szFind, "?"); - if (m_dwFindFlags & PATSEARCH_PARAM) + if (m_findReplace.dwFindFlags & PATSEARCH_PARAM) { - wsprintf(&szFind[strlen(szFind)], "%02X", m_cmdFind.param); + wsprintf(&szFind[strlen(szFind)], "%02X", m_findReplace.cmdFind.param); } else strcat(szFind, "??"); wsprintf(s, "Cannot find \"%s\"", szFind); MessageBox(s, "Find/Replace", MB_OK | MB_ICONINFORMATION); Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2010-12-03 22:05:09 UTC (rev 768) +++ trunk/OpenMPT/mptrack/View_pat.h 2010-12-03 22:12:57 UTC (rev 769) @@ -63,7 +63,16 @@ CHANNELINDEX nChn; }; +// Find/Replace data +struct FindReplaceStruct +{ + MODCOMMAND cmdFind, cmdReplace; + DWORD dwFindFlags, dwReplaceFlags; + CHANNELINDEX nFindMinChn, nFindMaxChn; + signed char cInstrRelChange; // relative instrument change (quick'n'dirty fix, this should be implemented in a less cryptic way) +}; + ////////////////////////////////////////////////////////////////// // Pattern editing class @@ -72,13 +81,6 @@ class CViewPattern: public CModScrollView //======================================= { -public: - // Find/Replace - static MODCOMMAND m_cmdFind, m_cmdReplace, m_cmdOld; - static DWORD m_dwFindFlags, m_dwReplaceFlags; - static UINT m_nFindMinChn, m_nFindMaxChn; - signed char m_cInstrRelChange; // relative instrument change (quick'n'dirty fix, this should be implemented in a less cryptic way) - protected: CFastBitmap m_Dib; CEditCommand *m_pEditWnd; @@ -102,6 +104,9 @@ UINT m_nLastPlayedChannel; //rewbs.customkeys bool m_bLastNoteEntryBlocked; + static MODCOMMAND m_cmdOld; // Quick cursor copy/paste data + static FindReplaceStruct m_findReplace; // Find/replace data + // -> CODE#0012 // -> DESC="midi keyboard split" BYTE activeNoteChannel[NOTE_MAX + 1]; Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-12-03 22:05:09 UTC (rev 768) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-12-03 22:12:57 UTC (rev 769) @@ -759,9 +759,18 @@ } else { if (m_dwFlags & PATSEARCH_CHANNEL) CheckDlgButton(IDC_CHECK7, MF_CHECKED); - CheckRadioButton(IDC_RADIO1, IDC_RADIO2, (m_dwFlags & PATSEARCH_FULLSEARCH) ? IDC_RADIO2 : IDC_RADIO1); - SetDlgItemInt(IDC_EDIT1, m_nMinChannel+1); - SetDlgItemInt(IDC_EDIT2, m_nMaxChannel+1); + int nButton = IDC_RADIO1; + if((m_dwFlags & PATSEARCH_FULLSEARCH)) + { + nButton = IDC_RADIO2; + } else if(/*(m_dwFlags & PATSEARCH_PATSELECTION) &&*/ m_bPatSel) + { + nButton = IDC_RADIO3; + } + CheckRadioButton(IDC_RADIO1, IDC_RADIO3, nButton); + GetDlgItem(IDC_RADIO3)->EnableWindow(m_bPatSel ? TRUE : FALSE); + SetDlgItemInt(IDC_EDIT1, m_nMinChannel + 1); + SetDlgItemInt(IDC_EDIT2, m_nMaxChannel + 1); } // Note if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO1)) != NULL) @@ -941,6 +950,7 @@ { if (IsDlgButtonChecked(IDC_CHECK7)) m_dwFlags |= PATSEARCH_CHANNEL; if (IsDlgButtonChecked(IDC_RADIO2)) m_dwFlags |= PATSEARCH_FULLSEARCH; + if (IsDlgButtonChecked(IDC_RADIO3)) m_dwFlags |= PATSEARCH_PATSELECTION; } // Note if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO1)) != NULL) Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2010-12-03 22:05:09 UTC (rev 768) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2010-12-03 22:12:57 UTC (rev 769) @@ -141,16 +141,17 @@ ///////////////////////////////////////////////////////////////////////// // Search/Replace -#define PATSEARCH_NOTE 0x01 -#define PATSEARCH_INSTR 0x02 -#define PATSEARCH_VOLCMD 0x04 -#define PATSEARCH_VOLUME 0x08 -#define PATSEARCH_COMMAND 0x10 -#define PATSEARCH_PARAM 0x20 -#define PATSEARCH_CHANNEL 0x40 -#define PATSEARCH_FULLSEARCH 0x100 -#define PATSEARCH_REPLACE 0x200 -#define PATSEARCH_REPLACEALL 0x400 +#define PATSEARCH_NOTE 0x01 // Search for note +#define PATSEARCH_INSTR 0x02 // Search for instrument +#define PATSEARCH_VOLCMD 0x04 // Search for volume effect +#define PATSEARCH_VOLUME 0x08 // Search for volume +#define PATSEARCH_COMMAND 0x10 // Search for effect +#define PATSEARCH_PARAM 0x20 // Search for effect parameter +#define PATSEARCH_CHANNEL 0x40 // Limit search to channels +#define PATSEARCH_FULLSEARCH 0x100 // Search whole song +#define PATSEARCH_PATSELECTION 0x200 // Search in current pattern selection +#define PATSEARCH_REPLACE 0x400 // Replace +#define PATSEARCH_REPLACEALL 0x800 // Replace all //========================================= class CFindReplaceTab: public CPropertyPage @@ -161,8 +162,10 @@ CModDoc *m_pModDoc; public: - UINT m_nNote, m_nInstr, m_nVolCmd, m_nVol, m_nCommand, m_nParam, m_nMinChannel, m_nMaxChannel; + UINT m_nNote, m_nInstr, m_nVolCmd, m_nVol, m_nCommand, m_nParam; + CHANNELINDEX m_nMinChannel, m_nMaxChannel; signed char cInstrRelChange; + bool m_bPatSel; DWORD m_dwFlags; enum findItem Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2010-12-03 22:05:09 UTC (rev 768) +++ trunk/OpenMPT/mptrack/mptrack.rc 2010-12-03 22:12:57 UTC (rev 769) @@ -871,8 +871,8 @@ CTEXT "Wet Dry Ratio",IDC_STATIC8,245,282,65,14,SS_CENTERIMAGE,WS_EX_STATICEDGE END -IDD_EDIT_FIND DIALOGEX 0, 0, 182, 145 -STYLE DS_SETFONT | WS_CHILD | WS_CAPTION +IDD_EDIT_FIND DIALOGEX 0, 0, 182, 161 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CAPTION CAPTION "Find" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -889,12 +889,13 @@ COMBOBOX IDC_COMBO5,13,92,94,71,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP CONTROL "Effect Data",IDC_CHECK6,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,117,78,52,10 COMBOBOX IDC_COMBO6,117,92,48,68,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP - CONTROL "Find in current pattern",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,6,117,88,10 - CONTROL "Find in the whole song",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,6,131,89,10 + CONTROL "Find in current pattern",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,6,120,96,8 + CONTROL "Find in the whole song",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,6,144,102,8 CONTROL "Only in channels",IDC_CHECK7,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,105,117,70,10 EDITTEXT IDC_EDIT1,117,130,22,12,ES_AUTOHSCROLL | ES_NUMBER CTEXT "to",IDC_STATIC,143,131,8,8 EDITTEXT IDC_EDIT2,155,130,22,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Find in current selection",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,6,132,102,8 END IDD_EDIT_REPLACE DIALOGEX 0, 0, 182, 145 @@ -1641,6 +1642,11 @@ BOTTOMMARGIN, 335 END + IDD_EDIT_FIND, DIALOG + BEGIN + BOTTOMMARGIN, 145 + END + IDD_PATTERN_PROPERTIES, DIALOG BEGIN LEFTMARGIN, 4 Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2010-12-03 22:05:09 UTC (rev 768) +++ trunk/OpenMPT/mptrack/version.h 2010-12-03 22:12:57 UTC (rev 769) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 19 #define VER_MINOR 00 -#define VER_MINORMINOR 13 +#define VER_MINORMINOR 14 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-12-04 20:07:21
|
Revision: 770 http://modplug.svn.sourceforge.net/modplug/?rev=770&view=rev Author: saga-games Date: 2010-12-04 20:07:14 +0000 (Sat, 04 Dec 2010) Log Message: ----------- [Mod] Undo steps have been increased from 100 to 1000. [Fix] Pattern Editor: Find/Replace in selection didn't work when not using "Replace All" (i.e. Finding didn't work at all) [Mod] Pattern Editor: "Replace All" just creates one undo point now. Modified Paths: -------------- trunk/OpenMPT/mptrack/Undo.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h Modified: trunk/OpenMPT/mptrack/Undo.h =================================================================== --- trunk/OpenMPT/mptrack/Undo.h 2010-12-03 22:12:57 UTC (rev 769) +++ trunk/OpenMPT/mptrack/Undo.h 2010-12-04 20:07:14 UTC (rev 770) @@ -9,7 +9,7 @@ #pragma once -#define MAX_UNDO_LEVEL 100 // 100 undo steps for each undo type! +#define MAX_UNDO_LEVEL 1000 // 1000 undo steps for each undo type! ///////////////////////////////////////////////////////////////////////////////////////// // Pattern Undo Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2010-12-03 22:12:57 UTC (rev 769) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2010-12-04 20:07:14 UTC (rev 770) @@ -30,6 +30,7 @@ PATSEARCH_FULLSEARCH, PATSEARCH_REPLACEALL, 0, 0, 0, + 0, 0, }; MODCOMMAND CViewPattern::m_cmdOld = {0,0,0,0,0,0}; @@ -1734,6 +1735,8 @@ m_findReplace.cmdReplace.param = pageReplace.m_nParam; m_findReplace.dwReplaceFlags = pageReplace.m_dwFlags; m_findReplace.cInstrRelChange = pageReplace.cInstrRelChange; + m_findReplace.dwBeginSel = m_dwBeginSel; + m_findReplace.dwEndSel = m_dwEndSel; m_bContinueSearch = false; OnEditFindNext(); } @@ -1847,8 +1850,9 @@ // limit to pattern selection const CHANNELINDEX ch = n % pSndFile->m_nChannels; const ROWINDEX row = n / pSndFile->m_nChannels; - if ((ch < GetSelectionStartChan()) || (ch > GetSelectionEndChan())) bFound = false; - if ((row < GetSelectionStartRow()) || (row > GetSelectionEndRow())) bFound = false; + + if ((ch < GetChanFromCursor(m_findReplace.dwBeginSel)) || (ch > GetChanFromCursor(m_findReplace.dwEndSel))) bFound = false; + if ((row < GetRowFromCursor(m_findReplace.dwBeginSel)) || (row > GetRowFromCursor(m_findReplace.dwEndSel))) bFound = false; } if (((m_findReplace.dwFindFlags & PATSEARCH_NOTE) && ((m->note != m_findReplace.cmdFind.note) && ((m_findReplace.cmdFind.note != CFindReplaceTab::findAny) || (!m->note) || (m->note & 0x80)))) || ((m_findReplace.dwFindFlags & PATSEARCH_INSTR) && (m->instr != m_findReplace.cmdFind.instr)) @@ -1880,6 +1884,7 @@ bool bUpdPos = true; if ((m_findReplace.dwReplaceFlags & (PATSEARCH_REPLACEALL|PATSEARCH_REPLACE)) == (PATSEARCH_REPLACEALL|PATSEARCH_REPLACE)) bUpdPos = false; nFound++; + if (bUpdPos) { // turn off "follow song" @@ -1889,6 +1894,7 @@ SetCurrentPattern(nPat); SetCurrentRow(n / pSndFile->m_nChannels); } + UINT ncurs = (n % pSndFile->m_nChannels) << 3; if (!(m_findReplace.dwFindFlags & PATSEARCH_NOTE)) { @@ -1916,7 +1922,9 @@ } if (bReplace) { - pModDoc->GetPatternUndo()->PrepareUndo(nPat, n % pSndFile->m_nChannels, n / pSndFile->m_nChannels, 1, 1); + // Just create one logic undo step when auto-replacing all occurences. + const bool linkUndoBuffer = (nFound > 1) && (m_findReplace.dwReplaceFlags & PATSEARCH_REPLACEALL) != 0; + pModDoc->GetPatternUndo()->PrepareUndo(nPat, n % pSndFile->m_nChannels, n / pSndFile->m_nChannels, 1, 1, linkUndoBuffer); if ((m_findReplace.dwReplaceFlags & PATSEARCH_NOTE)) { @@ -1986,7 +1994,16 @@ } } EndSearch: - if (m_findReplace.dwReplaceFlags & PATSEARCH_REPLACEALL) InvalidatePattern(); + if( m_findReplace.dwFindFlags & PATSEARCH_PATSELECTION) + { + // Restore original selection + m_dwBeginSel = m_findReplace.dwBeginSel; + m_dwEndSel = m_findReplace.dwEndSel; + InvalidatePattern(); + } else if (m_findReplace.dwReplaceFlags & PATSEARCH_REPLACEALL) + { + InvalidatePattern(); + } m_bContinueSearch = true; EndWaitCursor(); // Display search results Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2010-12-03 22:12:57 UTC (rev 769) +++ trunk/OpenMPT/mptrack/View_pat.h 2010-12-04 20:07:14 UTC (rev 770) @@ -66,10 +66,11 @@ // Find/Replace data struct FindReplaceStruct { - MODCOMMAND cmdFind, cmdReplace; - DWORD dwFindFlags, dwReplaceFlags; - CHANNELINDEX nFindMinChn, nFindMaxChn; - signed char cInstrRelChange; // relative instrument change (quick'n'dirty fix, this should be implemented in a less cryptic way) + MODCOMMAND cmdFind, cmdReplace; // Find/replace notes/instruments/effects + DWORD dwFindFlags, dwReplaceFlags; // PATSEARCH_XXX flags + CHANNELINDEX nFindMinChn, nFindMaxChn; // Find in these channels (if PATSEARCH_CHANNEL is set) + signed char cInstrRelChange; // relative instrument change (quick'n'dirty fix, this should be implemented in a less cryptic way) + DWORD dwBeginSel, dwEndSel; // Find in this selection (if PATSEARCH_PATSEL is set) }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-12-06 23:54:37
|
Revision: 771 http://modplug.svn.sourceforge.net/modplug/?rev=771&view=rev Author: saga-games Date: 2010-12-06 23:54:31 +0000 (Mon, 06 Dec 2010) Log Message: ----------- [Imp] Find/Replace: When changing the content of a combobox, the corresponding checkbox is now automatically checked. Likewise, the "Replace By" checkbox is checked if a checkbox or combobox on the "Replace" tab is enabled. Modified Paths: -------------- trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-12-04 20:07:14 UTC (rev 770) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-12-06 23:54:31 UTC (rev 771) @@ -730,7 +730,19 @@ // Find/Replace Dialog BEGIN_MESSAGE_MAP(CFindReplaceTab, CPropertyPage) + ON_CBN_SELCHANGE(IDC_COMBO1, OnNoteChanged) + ON_CBN_SELCHANGE(IDC_COMBO2, OnInstrChanged) + ON_CBN_SELCHANGE(IDC_COMBO3, OnVolCmdChanged) + ON_CBN_SELCHANGE(IDC_COMBO4, OnVolumeChanged) ON_CBN_SELCHANGE(IDC_COMBO5, OnEffectChanged) + ON_CBN_SELCHANGE(IDC_COMBO6, OnParamChanged) + ON_COMMAND(IDC_CHECK1, OnCheckNote) + ON_COMMAND(IDC_CHECK2, OnCheckInstr) + ON_COMMAND(IDC_CHECK3, OnCheckVolCmd) + ON_COMMAND(IDC_CHECK4, OnCheckVolume) + ON_COMMAND(IDC_CHECK5, OnCheckEffect) + ON_COMMAND(IDC_CHECK6, OnCheckParam) + ON_COMMAND(IDC_CHECK7, OnCheckChannelSearch) END_MESSAGE_MAP() @@ -880,14 +892,14 @@ break; } } - OnEffectChanged(); + ChangeEffect(); OnCheckChannelSearch(); return TRUE; } -void CFindReplaceTab::OnEffectChanged() -//------------------------------------- +void CFindReplaceTab::ChangeEffect() +//---------------------------------- { int fxndx = -1; CComboBox *combo; Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2010-12-04 20:07:14 UTC (rev 770) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2010-12-06 23:54:31 UTC (rev 771) @@ -188,13 +188,34 @@ // Make sure there's unused notes between NOTE_MAX and NOTE_MIN_SPECIAL. STATIC_ASSERT(NOTE_MIN_SPECIAL - 4 > NOTE_MAX); +protected: + void ChangeEffect(); + public: CFindReplaceTab(UINT nIDD, BOOL bReplaceTab, CModDoc *pModDoc):CPropertyPage(nIDD) { m_bReplace = bReplaceTab; m_pModDoc = pModDoc; } protected: virtual BOOL OnInitDialog(); virtual void OnOK(); - afx_msg void OnEffectChanged(); + + // When a combobox is focussed, check the corresponding checkbox. + void CheckOnChange(int nIDButton) { CheckDlgButton(nIDButton, BST_CHECKED); CheckReplace(nIDButton); }; + afx_msg void OnNoteChanged() { CheckOnChange(IDC_CHECK1); }; + afx_msg void OnInstrChanged() { CheckOnChange(IDC_CHECK2); }; + afx_msg void OnVolCmdChanged() { CheckOnChange(IDC_CHECK3); }; + afx_msg void OnVolumeChanged() { CheckOnChange(IDC_CHECK4); }; + afx_msg void OnEffectChanged() { CheckOnChange(IDC_CHECK5); ChangeEffect(); }; + afx_msg void OnParamChanged() { CheckOnChange(IDC_CHECK6); }; + // When a checkbox is checked, also check "Replace By". + afx_msg void OnCheckNote() { CheckReplace(IDC_CHECK1); }; + afx_msg void OnCheckInstr() { CheckReplace(IDC_CHECK2); }; + afx_msg void OnCheckVolCmd() { CheckReplace(IDC_CHECK3); }; + afx_msg void OnCheckVolume() { CheckReplace(IDC_CHECK4); }; + afx_msg void OnCheckEffect() { CheckReplace(IDC_CHECK5); }; + afx_msg void OnCheckParam() { CheckReplace(IDC_CHECK6); }; + // Check "Replace By" + afx_msg void CheckReplace(int nIDButton) { if(m_bReplace && IsDlgButtonChecked(nIDButton)) CheckDlgButton(IDC_CHECK7, BST_CHECKED); }; + afx_msg void OnCheckChannelSearch(); DECLARE_MESSAGE_MAP() }; @@ -392,9 +413,9 @@ addsilence_resize, // Resize sample }; -//=========================== +//================================== class CAddSilenceDlg: public CDialog -//=========================== +//================================== { protected: enmAddSilenceOptions GetEditMode(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-12-18 19:08:14
|
Revision: 774 http://modplug.svn.sourceforge.net/modplug/?rev=774&view=rev Author: saga-games Date: 2010-12-18 19:08:08 +0000 (Sat, 18 Dec 2010) Log Message: ----------- [Fix] VST Handling: Speaker arrangement is now sent to the plugins upon initialization. This fixes Voxengo SPAN 2 (a VST 2.4 plugin). Does this break other multichannel plugins? [Mod] OpenMPT: Version is now 1.19.00.16 Modified Paths: -------------- trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2010-12-18 19:06:01 UTC (rev 773) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2010-12-18 19:08:08 UTC (rev 774) @@ -1728,7 +1728,7 @@ void CVstPlugin::Initialize(CSoundFile* pSndFile) -//------------------------------------------- +//----------------------------------------------- { if (!m_pEvList) { @@ -1759,7 +1759,38 @@ m_bIsVst2 = (CVstPlugin::Dispatch(effGetVstVersion, 0,0, NULL, 0) >= 2) ? TRUE : FALSE; if (m_bIsVst2) { - // Dummy pin properies collection. + // Set VST speaker in/out setup to Stereo. Required for some plugins (possibly all VST 2.4+ plugins?) + // All this might get more interesting when adding sidechaining support... + VstSpeakerArrangement sa; + MemsetZero(sa); + sa.numChannels = 2; + sa.type = kSpeakerArrStereo; + for(int i = 0; i < ARRAYELEMCOUNT(sa.speakers); i++) + { + sa.speakers[i].azimuth = 0; + sa.speakers[i].elevation = 0; + sa.speakers[i].radius = 0; + sa.speakers[i].reserved = 0.0f; + // For now, only left and right speaker are used. + switch(i) + { + case 0: + sa.speakers[i].type = kSpeakerL; + strcpy(sa.speakers[i].name, "Left"); + break; + case 1: + sa.speakers[i].type = kSpeakerR; + strcpy(sa.speakers[i].name, "Right"); + break; + default: + sa.speakers[i].type = kSpeakerUndefined; + break; + } + } + // For now, input setup = output setup. + Dispatch(effSetSpeakerArrangement, 0, (LONG_PTR)(&sa), &sa, 0.0f); + + // Dummy pin properties collection. // We don't use them but some plugs might do inits in here. VstPinProperties tempPinProperties; Dispatch(effGetInputProperties, 0, 0, &tempPinProperties, 0); Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2010-12-18 19:06:01 UTC (rev 773) +++ trunk/OpenMPT/mptrack/version.h 2010-12-18 19:08:08 UTC (rev 774) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 19 #define VER_MINOR 00 -#define VER_MINORMINOR 15 +#define VER_MINORMINOR 16 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-12-19 17:50:47
|
Revision: 775 http://modplug.svn.sourceforge.net/modplug/?rev=775&view=rev Author: saga-games Date: 2010-12-19 17:50:40 +0000 (Sun, 19 Dec 2010) Log Message: ----------- [New] Sample Editor: The new "sample grid" feature can create equally-sized sample selections, so it is f.e. easy to split a sample into four equally-sized samples. Modified Paths: -------------- trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/View_smp.h trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/res/smptoolb.bmp trunk/OpenMPT/mptrack/resource.h Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2010-12-18 19:08:08 UTC (rev 774) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2010-12-19 17:50:40 UTC (rev 775) @@ -298,6 +298,7 @@ SIMAGE_DRAW, SIMAGE_RESIZE, SIMAGE_GENERATE, + SIMAGE_GRID, }; Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2010-12-18 19:08:08 UTC (rev 774) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2010-12-19 17:50:40 UTC (rev 775) @@ -31,7 +31,7 @@ // trimming will be done. This is the minimum value for // selection difference, so the minimum length of result // of trimming is nTrimLengthMin + 1. -const uint8 nTrimLengthMin = 16; +#define MIN_TRIM_LENGTH 16 const UINT cLeftBarButtons[SMP_LEFTBAR_BUTTONS] = { @@ -40,6 +40,9 @@ ID_SEPARATOR, ID_SAMPLE_DRAW, ID_SAMPLE_ADDSILENCE, + ID_SEPARATOR, + ID_SAMPLE_GRID, + ID_SEPARATOR, }; @@ -88,6 +91,7 @@ ON_COMMAND(ID_SAMPLE_ZOOMDOWN, OnZoomDown) ON_COMMAND(ID_SAMPLE_DRAW, OnDrawingToggle) ON_COMMAND(ID_SAMPLE_ADDSILENCE, OnAddSilence) + ON_COMMAND(ID_SAMPLE_GRID, OnChangeGridSize) ON_MESSAGE(WM_MOD_MIDIMSG, OnMidiMsg) ON_MESSAGE(WM_MOD_KEYCOMMAND, OnCustomKeyMsg) //rewbs.customKeys //}}AFX_MSG_MAP @@ -100,6 +104,7 @@ CViewSample::CViewSample() //------------------------ { + m_nGridSegments = 0; m_nSample = 1; m_nZoom = 0; m_nScrollPos = 0; @@ -225,12 +230,23 @@ void CViewSample::SetCurSel(DWORD nBegin, DWORD nEnd) //--------------------------------------------------- { + CSoundFile *pSndFile = (GetDocument()) ? GetDocument()->GetSoundFile() : nullptr; + if(pSndFile == nullptr) + return; + + // Snap to grid + if(m_nGridSegments > 0) + { + const float sampsPerSegment = (float)(pSndFile->Samples[m_nSample].nLength / m_nGridSegments); + nBegin = (DWORD)(floor((float)(nBegin / sampsPerSegment) + 0.5f) * sampsPerSegment); + nEnd = (DWORD)(floor((float)(nEnd / sampsPerSegment) + 0.5f) * sampsPerSegment); + } + if (nBegin > nEnd) { - DWORD tmp = nBegin; - nBegin = nEnd; - nEnd = tmp; + std::swap(nBegin, nEnd); } + if ((nBegin != m_dwBeginSel) || (nEnd != m_dwEndSel)) { RECT rect; @@ -272,23 +288,18 @@ s[0] = 0; if (m_dwEndSel > m_dwBeginSel) { - CModDoc *pModDoc = GetDocument(); wsprintf(s, "[%d,%d]", m_dwBeginSel, m_dwEndSel); - if (pModDoc) + LONG lSampleRate = pSndFile->Samples[m_nSample].nC5Speed; + if (pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - LONG lSampleRate = pSndFile->Samples[m_nSample].nC5Speed; - if (pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) - { - lSampleRate = CSoundFile::TransposeToFrequency(pSndFile->Samples[m_nSample].RelativeTone, pSndFile->Samples[m_nSample].nFineTune); - } - if (!lSampleRate) lSampleRate = 8363; - ULONG msec = ((ULONG)(m_dwEndSel - m_dwBeginSel) * 1000) / lSampleRate; - if (msec < 1000) - wsprintf(s+strlen(s), " (%lums)", msec); - else - wsprintf(s+strlen(s), " (%lu.%lus)", msec/1000, (msec/100) % 10); + lSampleRate = CSoundFile::TransposeToFrequency(pSndFile->Samples[m_nSample].RelativeTone, pSndFile->Samples[m_nSample].nFineTune); } + if (!lSampleRate) lSampleRate = 8363; + ULONG msec = ((ULONG)(m_dwEndSel - m_dwBeginSel) * 1000) / lSampleRate; + if (msec < 1000) + wsprintf(s+strlen(s), " (%lums)", msec); + else + wsprintf(s+strlen(s), " (%lu.%lus)", msec/1000, (msec/100) % 10); } pMainFrm->SetInfoText(s); } @@ -1009,6 +1020,7 @@ case ID_SAMPLE_ZOOMDOWN: nImage = SIMAGE_ZOOMDOWN; break; case ID_SAMPLE_DRAW: nImage = (dwStyle & NCBTNS_DISABLED) ? SIMAGE_NODRAW : SIMAGE_DRAW; break; case ID_SAMPLE_ADDSILENCE: nImage = SIMAGE_RESIZE; break; + case ID_SAMPLE_GRID: nImage = SIMAGE_GRID; break; } pDC->Draw3dRect(rect.left-1, rect.top-1, SMP_LEFTBAR_CXBTN+2, SMP_LEFTBAR_CYBTN+2, c3, c4); pDC->Draw3dRect(rect.left, rect.top, SMP_LEFTBAR_CXBTN, SMP_LEFTBAR_CYBTN, c1, c2); @@ -1481,7 +1493,7 @@ // "Trim" menu item is responding differently if there's no selection, // but a loop present: "trim around loop point"! (jojo in topic 2258) std::string sTrimMenuText = "Trim"; - bool bIsGrayed = ( (m_dwEndSel<=m_dwBeginSel) || (m_dwEndSel - m_dwBeginSel < nTrimLengthMin) + bool bIsGrayed = ( (m_dwEndSel<=m_dwBeginSel) || (m_dwEndSel - m_dwBeginSel < MIN_TRIM_LENGTH) || (m_dwEndSel - m_dwBeginSel == pSmp->nLength) ); @@ -1491,7 +1503,7 @@ sTrimMenuText += " around loop points"; // Check whether trim menu item can be enabled (loop not too short or long for trimming). if( (pSmp->nLoopEnd <= pSmp->nLength) && - (pSmp->nLoopEnd - pSmp->nLoopStart >= nTrimLengthMin) && + (pSmp->nLoopEnd - pSmp->nLoopStart >= MIN_TRIM_LENGTH) && (pSmp->nLoopEnd - pSmp->nLoopStart < pSmp->nLength) ) bIsGrayed = false; } @@ -2055,7 +2067,7 @@ UINT nStart = m_dwBeginSel; UINT nEnd = m_dwEndSel - m_dwBeginSel; - if ((pSmp->pSample) && (nStart+nEnd <= pSmp->nLength) && (nEnd >= nTrimLengthMin)) + if ((pSmp->pSample) && (nStart+nEnd <= pSmp->nLength) && (nEnd >= MIN_TRIM_LENGTH)) { pModDoc->GetSampleUndo()->PrepareUndo(m_nSample, sundo_replace); BEGIN_CRITICAL(); @@ -2355,7 +2367,7 @@ if(pSmp->uFlags & CHN_LOOP) { /* only update sample buffer if the loop is actually enabled - (resets sound without any reason otherwise) - bug report 1874 */ + (resets sound without any reason otherwise) - http://forum.openmpt.org/index.php?topic=1874.0 */ pModDoc->AdjustEndOfSample(m_nSample); } pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEINFO | HINT_SAMPLEDATA, NULL); @@ -2380,7 +2392,7 @@ if(pSmp->uFlags & CHN_LOOP) { /* only update sample buffer if the loop is actually enabled - (resets sound without any reason otherwise) - bug report 1874 */ + (resets sound without any reason otherwise) - http://forum.openmpt.org/index.php?topic=1874.0 */ pModDoc->AdjustEndOfSample(m_nSample); } pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEINFO | HINT_SAMPLEDATA, NULL); @@ -2703,3 +2715,15 @@ return CModScrollView::OnMouseWheel(nFlags, zDelta, pt); } + + +void CViewSample::OnChangeGridSize() +//---------------------------------- +{ + CSampleGridDlg dlg(this, m_nGridSegments, GetDocument()->GetSoundFile()->Samples[m_nSample].nLength); + if(dlg.DoModal() == IDOK) + { + m_nGridSegments = dlg.m_nSegments; + InvalidateSample(); + } +} Modified: trunk/OpenMPT/mptrack/View_smp.h =================================================================== --- trunk/OpenMPT/mptrack/View_smp.h 2010-12-18 19:08:08 UTC (rev 774) +++ trunk/OpenMPT/mptrack/View_smp.h 2010-12-19 17:50:40 UTC (rev 775) @@ -5,7 +5,7 @@ #define SMPSTATUS_KEYDOWN 0x02 #define SMPSTATUS_NCLBTNDOWN 0x04 -#define SMP_LEFTBAR_BUTTONS 5 +#define SMP_LEFTBAR_BUTTONS 8 //====================================== class CViewSample: public CModScrollView @@ -21,6 +21,7 @@ DWORD m_dwMenuParam; DWORD m_NcButtonState[SMP_LEFTBAR_BUTTONS]; DWORD m_dwNotifyPos[MAX_CHANNELS]; + int m_nGridSegments; bool m_bDrawingEnabled; // sample drawing mode enabled? CPoint m_lastDrawPoint; // for drawing horizontal lines @@ -123,6 +124,7 @@ afx_msg void OnZoomDown(); afx_msg void OnDrawingToggle(); afx_msg void OnAddSilence(); + afx_msg void OnChangeGridSize(); afx_msg LRESULT OnMidiMsg(WPARAM, LPARAM); afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); //rewbs.customKeys afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt); Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-12-18 19:08:08 UTC (rev 774) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-12-19 17:50:40 UTC (rev 775) @@ -526,7 +526,7 @@ strTipText = "Gxx and Exx/Fxx won't share effect memory. Gxx resets instrument envelopes."; break; case IDC_CHECK5: - strTipText = "The resonant filter's frequency range is incresed from about 4KHz to 10KHz."; + strTipText = "The resonant filter's frequency range is increased from about 4KHz to 10KHz."; break; case IDC_CHECK6: strTipText = "The instrument settings of the external ITI files will be ignored."; @@ -1873,6 +1873,39 @@ } +void CSampleGridDlg::DoDataExchange(CDataExchange* pDX) +//----------------------------------------------------- +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CSampleGridDlg) + DDX_Control(pDX, IDC_EDIT1, m_EditSegments); + DDX_Control(pDX, IDC_SPIN1, m_SpinSegments); + //}}AFX_DATA_MAP +} + + +BOOL CSampleGridDlg::OnInitDialog() +//--------------------------------- +{ + CDialog::OnInitDialog(); + m_SpinSegments.SetRange32(0, m_nMaxSegments); + m_SpinSegments.SetPos(m_nSegments); + SetDlgItemInt(IDC_EDIT1, m_nSegments, FALSE); + GetDlgItem(IDC_EDIT1)->SetFocus(); + return TRUE; +} + + +void CSampleGridDlg::OnOK() +//------------------------- +{ + m_nSegments = GetDlgItemInt(IDC_EDIT1, NULL, FALSE); + CDialog::OnOK(); +} + + + + //////////////////////////////////////////////////////////////////////////////// // Sound Bank Information Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2010-12-18 19:08:08 UTC (rev 774) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2010-12-19 17:50:40 UTC (rev 775) @@ -447,7 +447,28 @@ }; +//================================== +class CSampleGridDlg: public CDialog +//================================== +{ +public: + int m_nSegments, m_nMaxSegments; +protected: + CEdit m_EditSegments; + CSpinButtonCtrl m_SpinSegments; + +public: + CSampleGridDlg(CWnd *parent, int nSegments, int nMaxSegments) : CDialog(IDD_SAMPLE_GRID_SIZE, parent) { m_nSegments = nSegments; m_nMaxSegments = nMaxSegments; }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); + virtual BOOL OnInitDialog(); + virtual void OnOK(); +}; + + + //////////////////////////////////////////////////////////////////////// // Sound Banks Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2010-12-18 19:08:08 UTC (rev 774) +++ trunk/OpenMPT/mptrack/mptrack.rc 2010-12-19 17:50:40 UTC (rev 775) @@ -160,7 +160,20 @@ LTEXT "",IDC_TOTAL_EDIT_TIME,60,165,192,15 END +IDD_SAMPLE_GRID_SIZE DIALOGEX 0, 0, 154, 71 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Sample Grid Size" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + EDITTEXT IDC_EDIT1,66,6,42,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,102,6,11,14 + DEFPUSHBUTTON "&OK",IDOK,42,48,50,14 + PUSHBUTTON "&Cancel",IDCANCEL,96,48,50,14 + LTEXT "Input the number of grid segments, or input ""0"" to disable the grid.",IDC_STATIC,6,24,138,24 + LTEXT "Grid Segments:",IDC_STATIC,6,8,60,8 +END + ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO @@ -224,6 +237,14 @@ TOPMARGIN, 7 BOTTOMMARGIN, 178 END + + IDD_SAMPLE_GRID_SIZE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 147 + TOPMARGIN, 7 + BOTTOMMARGIN, 64 + END END #endif // APSTUDIO_INVOKED @@ -415,7 +436,7 @@ END IDD_OPTIONS_MIDI DIALOGEX 0, 0, 272, 281 -STYLE DS_SETFONT | DS_3DLOOK | WS_CHILD | WS_DISABLED | WS_CAPTION +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "MIDI" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -435,7 +456,7 @@ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,140,226,9 CONTROL "Pass MIDI to active instrument plugin (experimental)",IDC_MIDI_TO_PLUGIN, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,155,180,9 - CONTROL "Respond to play/continue/stop song messages (untested)",IDC_MIDIPLAYCONTROL, + CONTROL "Respond to play/continue/stop song messages",IDC_MIDIPLAYCONTROL, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,170,200,9 CONTROL "Continue song as soon as MIDI notes are being received",IDC_MIDIPLAYPATTERNONMIDIIN, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,185,195,10 Modified: trunk/OpenMPT/mptrack/res/smptoolb.bmp =================================================================== (Binary files differ) Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2010-12-18 19:08:08 UTC (rev 774) +++ trunk/OpenMPT/mptrack/resource.h 2010-12-19 17:50:40 UTC (rev 775) @@ -136,6 +136,7 @@ #define IDD_SAMPLE_GENERATOR 524 #define IDD_SAMPLE_GENERATOR_PRESETS 525 #define IDD_EDITHISTORY 526 +#define IDD_SAMPLE_GRID_SIZE 527 #define IDC_BUTTON1 1001 #define IDC_BUTTON2 1002 #define IDC_BUTTON3 1003 @@ -1185,14 +1186,15 @@ #define ID_ENVELOPE_ZOOM_OUT 60450 #define ID_PANIC 60451 #define ID_VIEW_EDITHISTORY 60452 +#define ID_SAMPLE_GRID 60453 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 -#define _APS_NEXT_RESOURCE_VALUE 527 -#define _APS_NEXT_COMMAND_VALUE 60453 +#define _APS_NEXT_RESOURCE_VALUE 528 +#define _APS_NEXT_COMMAND_VALUE 60454 #define _APS_NEXT_CONTROL_VALUE 2433 #define _APS_NEXT_SYMED_VALUE 901 #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-12-20 23:03:54
|
Revision: 776 http://modplug.svn.sourceforge.net/modplug/?rev=776&view=rev Author: saga-games Date: 2010-12-20 23:03:47 +0000 (Mon, 20 Dec 2010) Log Message: ----------- [Fix] Pattern Editor: Using Right-Click -> Change Plugin on PC notes did not work for plugin numbers that were higher than the highest instrument number. Modified Paths: -------------- trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2010-12-19 17:50:40 UTC (rev 775) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2010-12-20 23:03:47 UTC (rev 776) @@ -2566,47 +2566,7 @@ void CViewPattern::OnSetSelInstrument() //------------------------------------- { - CModDoc *pModDoc; - CSoundFile *pSndFile; - BYTE nIns = static_cast<BYTE>(GetCurrentInstrument()); - MODCOMMAND *p; - BOOL bModified; - - if (!nIns) return; - if ((pModDoc = GetDocument()) == NULL) return; - pSndFile = pModDoc->GetSoundFile(); - if(!pSndFile) return; - p = pSndFile->Patterns[m_nPattern]; - if (!p) return; - BeginWaitCursor(); - PrepareUndo(m_dwBeginSel, m_dwEndSel); - bModified = FALSE; - - //rewbs: re-written to work regardless of selection - UINT startRow = GetSelectionStartRow(); - UINT endRow = GetSelectionEndRow(); - UINT startChan = GetSelectionStartChan(); - UINT endChan = GetSelectionEndChan(); - - for (UINT r=startRow; r<endRow+1; r++) { - for (UINT c=startChan; c<endChan+1; c++) { - - p = pSndFile->Patterns[m_nPattern] + r * pSndFile->m_nChannels + c; - // If a note or an instr is present on the row, do the change, if required. - // Do not set instr if note and instr are both blank. - // Do set instr if note is a PC note and instr is blank. - if ( ((p->note > 0 && p->note < NOTE_MIN_SPECIAL) || p->IsPcNote() || p->instr) && (p->instr!=nIns) ) { - p->instr = nIns; - bModified = TRUE; - } - } - } - - if (bModified) { - pModDoc->SetModified(); - pModDoc->UpdateAllViews(NULL, HINT_PATTERNDATA | (m_nPattern << HINT_SHIFT_PAT), NULL); - } - EndWaitCursor(); + SetSelectionInstrument(GetCurrentInstrument()); } void CViewPattern::OnRemoveChannelDialog() @@ -4794,18 +4754,15 @@ void CViewPattern::OnSelectInstrument(UINT nID) //--------------------------------------------- { - UINT o_inst = GetCurrentInstrument(); - UINT n_inst = nID-ID_CHANGE_INSTRUMENT; + const UINT newIns = nID - ID_CHANGE_INSTRUMENT; - if (n_inst == 0) + if (newIns == 0) { RowMask sp = {0,1,0,0,0}; // Setup mask to only clear instrument data in OnClearSelection OnClearSelection(false, sp); // Clears instrument selection from pattern } else { - SendCtrlMessage(CTRLMSG_SETCURRENTINSTRUMENT, n_inst); - OnSetSelInstrument(); - SendCtrlMessage(CTRLMSG_SETCURRENTINSTRUMENT, o_inst); //Restoring old instrument. + SetSelectionInstrument(newIns); } } @@ -5620,3 +5577,51 @@ else return pSndFile->Patterns[m_nPattern].GetRowsPerMeasure(); } + + +void CViewPattern::SetSelectionInstrument(const INSTRUMENTINDEX nIns) +//------------------------------------------------------------------- +{ + CModDoc *pModDoc; + CSoundFile *pSndFile; + MODCOMMAND *p; + bool bModified = false; + + if (!nIns) return; + if ((pModDoc = GetDocument()) == nullptr) return; + pSndFile = pModDoc->GetSoundFile(); + if(!pSndFile) return; + p = pSndFile->Patterns[m_nPattern]; + if (!p) return; + BeginWaitCursor(); + PrepareUndo(m_dwBeginSel, m_dwEndSel); + + //rewbs: re-written to work regardless of selection + UINT startRow = GetSelectionStartRow(); + UINT endRow = GetSelectionEndRow(); + UINT startChan = GetSelectionStartChan(); + UINT endChan = GetSelectionEndChan(); + + for (UINT r=startRow; r<endRow+1; r++) + { + p = pSndFile->Patterns[m_nPattern] + r * pSndFile->m_nChannels + startChan; + for (UINT c = startChan; c < endChan + 1; c++, p++) + { + // If a note or an instr is present on the row, do the change, if required. + // Do not set instr if note and instr are both blank. + // Do set instr if note is a PC note and instr is blank. + if ( ((p->note > 0 && p->note < NOTE_MIN_SPECIAL) || p->IsPcNote() || p->instr) && (p->instr!=nIns) ) + { + p->instr = nIns; + bModified = true; + } + } + } + + if (bModified) + { + pModDoc->SetModified(); + pModDoc->UpdateAllViews(NULL, HINT_PATTERNDATA | (m_nPattern << HINT_SHIFT_PAT), NULL); + } + EndWaitCursor(); +} Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2010-12-19 17:50:40 UTC (rev 775) +++ trunk/OpenMPT/mptrack/View_pat.h 2010-12-20 23:03:47 UTC (rev 776) @@ -206,6 +206,7 @@ void SetSpacing(int n); void OnClearField(int, bool, bool=false); void InsertRows(UINT colmin, UINT colmax); + void SetSelectionInstrument(const INSTRUMENTINDEX nIns); //end rewbs.customKeys void TogglePluginEditor(int chan); //rewbs.patPlugName This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2010-12-23 23:06:23
|
Revision: 777 http://modplug.svn.sourceforge.net/modplug/?rev=777&view=rev Author: saga-games Date: 2010-12-23 23:06:16 +0000 (Thu, 23 Dec 2010) Log Message: ----------- [Fix] Note Properties: Changing values didn't create an undo point. (http://bugs.openmpt.org/view.php?id=56) Modified Paths: -------------- trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-12-20 23:03:47 UTC (rev 776) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-12-23 23:06:16 UTC (rev 777) @@ -1187,6 +1187,7 @@ m_pageNote = NULL; m_pageVolume = NULL; m_pageEffect = NULL; + m_bModified = false; } @@ -1301,6 +1302,11 @@ MODCOMMAND *m = pSndFile->Patterns[m_nPattern]+m_nRow*pSndFile->m_nChannels+m_nChannel; if ((m->note != note) || (m->instr != instr)) { + if(!m_bModified) // let's create just one undo step. + { + m_pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, m_nChannel, m_nRow, 1, 1); + m_bModified = true; + } m->note = note; m->instr = instr; m_Command = *m; @@ -1325,6 +1331,11 @@ MODCOMMAND *m = pSndFile->Patterns[m_nPattern]+m_nRow*pSndFile->m_nChannels+m_nChannel; if ((m->volcmd != volcmd) || (m->vol != vol)) { + if(!m_bModified) // let's create just one undo step. + { + m_pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, m_nChannel, m_nRow, 1, 1); + m_bModified = true; + } m->volcmd = volcmd; m->vol = vol; m_pModDoc->SetModified(); @@ -1359,6 +1370,11 @@ if ((m->command != command) || (m->param != param)) { + if(!m_bModified) // let's create just one undo step. + { + m_pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, m_nChannel, m_nRow, 1, 1); + m_bModified = true; + } m->command = command; m->param = param; m_pModDoc->SetModified(); @@ -1386,7 +1402,7 @@ //----------------------------------- { CPropertyPage::OnInitDialog(); - m_bInitialized = TRUE; + m_bInitialized = true; UpdateDialog(); return TRUE; } Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2010-12-20 23:03:47 UTC (rev 776) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2010-12-23 23:06:16 UTC (rev 777) @@ -255,10 +255,10 @@ protected: CModDoc *m_pModDoc; CEditCommand *m_pParent; - BOOL m_bInitialized; + bool m_bInitialized; public: - CPageEditCommand(CModDoc *pModDoc, CEditCommand *parent, UINT id):CPropertyPage(id) { m_pModDoc = pModDoc; m_pParent = parent; m_bInitialized = FALSE; } + CPageEditCommand(CModDoc *pModDoc, CEditCommand *parent, UINT id):CPropertyPage(id) { m_pModDoc = pModDoc; m_pParent = parent; m_bInitialized = false; } virtual ~CPageEditCommand() {} virtual BOOL OnInitDialog(); virtual void Init(MODCOMMAND&)=0; @@ -358,6 +358,7 @@ HWND m_hWndView; UINT m_nPattern, m_nRow, m_nChannel; MODCOMMAND m_Command; + bool m_bModified; public: CEditCommand(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-01-03 22:00:41
|
Revision: 784 http://modplug.svn.sourceforge.net/modplug/?rev=784&view=rev Author: saga-games Date: 2011-01-03 22:00:34 +0000 (Mon, 03 Jan 2011) Log Message: ----------- [Fix] Various actions in the instrument note map and envelope view should now also mark the instrument as modified. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_ins.h trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_ins.h Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2011-01-03 19:08:33 UTC (rev 783) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2011-01-03 22:00:34 UTC (rev 784) @@ -381,7 +381,7 @@ } if (bModified) { - m_pModDoc->SetModified(); + m_pParent->SetInstrumentModified(); InvalidateRect(NULL, FALSE); } } @@ -407,7 +407,7 @@ } if (bModified) { - m_pModDoc->SetModified(); + m_pParent->SetInstrumentModified(); InvalidateRect(NULL, FALSE); } } @@ -434,7 +434,7 @@ } if (bModified) { - m_pModDoc->SetModified(); + m_pParent->SetInstrumentModified(); InvalidateRect(NULL, FALSE); } } @@ -479,7 +479,7 @@ } if (bModified) { - m_pModDoc->SetModified(); + m_pParent->SetInstrumentModified(); InvalidateRect(NULL, FALSE); } } @@ -583,7 +583,7 @@ if (n != pIns->NoteMap[m_nNote]) { pIns->NoteMap[m_nNote] = n; - m_pModDoc->SetModified(); + m_pParent->SetInstrumentModified(); InvalidateRect(NULL, FALSE); } if (bOk) @@ -618,7 +618,7 @@ if (n != pIns->Keyboard[m_nNote]) { pIns->Keyboard[m_nNote] = n; - m_pModDoc->SetModified(); + m_pParent->SetInstrumentModified(); InvalidateRect(NULL, FALSE); PlayNote(m_nNote+1); } @@ -650,7 +650,7 @@ if (n != pIns->NoteMap[m_nNote]) { pIns->NoteMap[m_nNote] = n; - m_pModDoc->SetModified(); + m_pParent->SetInstrumentModified(); InvalidateRect(NULL, FALSE); } @@ -999,6 +999,7 @@ } } + BOOL CCtrlInstruments::SetCurrentInstrument(UINT nIns, BOOL bUpdNum) //------------------------------------------------------------------ { Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.h 2011-01-03 19:08:33 UTC (rev 783) +++ trunk/OpenMPT/mptrack/Ctrl_ins.h 2011-01-03 22:00:34 UTC (rev 784) @@ -113,6 +113,7 @@ virtual ~CCtrlInstruments(); public: + void SetInstrumentModified(const bool modified = true); BOOL SetCurrentInstrument(UINT nIns, BOOL bUpdNum=TRUE); BOOL OpenInstrument(LPCSTR lpszFileName); BOOL OpenInstrument(CSoundFile *pSndFile, UINT nInstr); @@ -120,9 +121,6 @@ VOID UpdateFilterText(); LONG* GetSplitPosRef() {return &CMainFrame::glInstrumentWindowHeight;} //rewbs.varWindowSize -protected: - void CCtrlInstruments::SetInstrumentModified(const bool modified); - public: //{{AFX_VIRTUAL(CCtrlInstruments) virtual BOOL OnInitDialog(); Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2011-01-03 19:08:33 UTC (rev 783) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2011-01-03 22:00:34 UTC (rev 784) @@ -160,6 +160,21 @@ } +// Set instrument (and moddoc) as modified. +void CViewInstrument::SetInstrumentModified() +//------------------------------------------- +{ + CModDoc *pModDoc = GetDocument(); + if(pModDoc == nullptr) return; +// -> CODE#0023 +// -> DESC="IT project files (.itp)" + pModDoc->m_bsInstrumentModified.set(m_nInstrument - 1, true); + pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_INSNAMES, this); +// -! NEW_FEATURE#0023 + pModDoc->SetModified(); +} + + BOOL CViewInstrument::SetCurrentInstrument(INSTRUMENTINDEX nIns, enmEnvelopeTypes nEnv) //------------------------------------------------------------------------------------- { @@ -1003,7 +1018,7 @@ envelope->nReleaseNode = ENV_RELEASE_NODE_UNSET; } - pModDoc->SetModified(); + SetInstrumentModified(); pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL); return true; } @@ -1070,7 +1085,7 @@ if (envelope->nSustainEnd >= i) envelope->nSustainEnd++; if (envelope->nReleaseNode >= i && envelope->nReleaseNode != ENV_RELEASE_NODE_UNSET) envelope->nReleaseNode++; - pModDoc->SetModified(); + SetInstrumentModified(); pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL); return i + 1; } @@ -1476,7 +1491,7 @@ CModDoc *pModDoc = GetDocument(); if(pModDoc) { - pModDoc->SetModified(); + SetInstrumentModified(); pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL); } UpdateWindow(); //rewbs: TODO - optimisation here so we don't redraw whole view. @@ -1729,7 +1744,7 @@ CModDoc *pModDoc = GetDocument(); if ((pModDoc) && (EnvSetLoop(!EnvGetLoop()))) { - pModDoc->SetModified(); + SetInstrumentModified(); pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL); UpdateNcButtonState(); } @@ -1742,7 +1757,7 @@ CModDoc *pModDoc = GetDocument(); if ((pModDoc) && (EnvSetSustain(!EnvGetSustain()))) { - pModDoc->SetModified(); + SetInstrumentModified(); pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL); UpdateNcButtonState(); } @@ -1755,7 +1770,7 @@ CModDoc *pModDoc = GetDocument(); if ((pModDoc) && (EnvSetCarry(!EnvGetCarry()))) { - pModDoc->SetModified(); + SetInstrumentModified(); UpdateNcButtonState(); } } @@ -1765,7 +1780,7 @@ { if(IsDragItemEnvPoint() && EnvToggleReleaseNode(m_nDragItem - 1)) { - if(GetDocument() != nullptr) GetDocument()->SetModified(); + SetInstrumentModified(); InvalidateRect(NULL, FALSE); } } @@ -1774,10 +1789,9 @@ void CViewInstrument::OnEnvVolChanged() //------------------------------------- { - CModDoc *pModDoc = GetDocument(); - if ((pModDoc) && (EnvSetVolEnv(!EnvGetVolEnv()))) + if (EnvSetVolEnv(!EnvGetVolEnv())) { - pModDoc->SetModified(); + SetInstrumentModified(); UpdateNcButtonState(); } } @@ -1786,10 +1800,9 @@ void CViewInstrument::OnEnvPanChanged() //------------------------------------- { - CModDoc *pModDoc = GetDocument(); - if ((pModDoc) && (EnvSetPanEnv(!EnvGetPanEnv()))) + if (EnvSetPanEnv(!EnvGetPanEnv())) { - pModDoc->SetModified(); + SetInstrumentModified(); UpdateNcButtonState(); } } @@ -1798,10 +1811,9 @@ void CViewInstrument::OnEnvPitchChanged() //--------------------------------------- { - CModDoc *pModDoc = GetDocument(); - if ((pModDoc) && (EnvSetPitchEnv(!EnvGetPitchEnv()))) + if (EnvSetPitchEnv(!EnvGetPitchEnv())) { - pModDoc->SetModified(); + SetInstrumentModified(); UpdateNcButtonState(); } } @@ -1810,10 +1822,9 @@ void CViewInstrument::OnEnvFilterChanged() //---------------------------------------- { - CModDoc *pModDoc = GetDocument(); - if ((pModDoc) && (EnvSetFilterEnv(!EnvGetFilterEnv()))) + if (EnvSetFilterEnv(!EnvGetFilterEnv())) { - pModDoc->SetModified(); + SetInstrumentModified(); UpdateNcButtonState(); } } @@ -2061,8 +2072,8 @@ } if (bUpdate) { + SetInstrumentModified(); pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_INSTRUMENT | HINT_ENVELOPE | HINT_INSNAMES, NULL); - pModDoc->SetModified(); } CMDIChildWnd *pMDIFrame = (CMDIChildWnd *)GetParentFrame(); if (pMDIFrame) @@ -2245,7 +2256,7 @@ CScaleEnvPointsDlg dlg(this, GetEnvelopePtr(), nOffset); if(dlg.DoModal()) { - pModDoc->SetModified(); + SetInstrumentModified(); pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL); } } @@ -2303,7 +2314,7 @@ return; pEnv->Ticks[m_nDragItem - 1]--; - GetDocument()->SetModified(); // sanity checks are done in GetEnvelopePtr() already + SetInstrumentModified(); InvalidateRect(NULL, FALSE); } @@ -2317,7 +2328,7 @@ return; pEnv->Ticks[m_nDragItem - 1]++; - GetDocument()->SetModified(); // sanity checks are done in GetEnvelopePtr() already + SetInstrumentModified(); InvalidateRect(NULL, FALSE); } @@ -2332,7 +2343,7 @@ else pEnv->Values[m_nDragItem - 1] = ENVELOPE_MAX; - GetDocument()->SetModified(); // sanity checks are done in GetEnvelopePtr() already + SetInstrumentModified(); InvalidateRect(NULL, FALSE); } @@ -2347,7 +2358,7 @@ else pEnv->Values[m_nDragItem - 1] = ENVELOPE_MIN; - GetDocument()->SetModified(); // sanity checks are done in GetEnvelopePtr() already + SetInstrumentModified(); InvalidateRect(NULL, FALSE); } @@ -2443,7 +2454,7 @@ if(EnvToggleReleaseNode(m_nDragItem - 1)) { CModDoc *pModDoc = GetDocument(); // sanity checks are done in GetEnvelopePtr() already - pModDoc->SetModified(); + SetInstrumentModified(); pModDoc->UpdateAllViews(NULL, (m_nInstrument << HINT_SHIFT_INS) | HINT_ENVELOPE, NULL); } } Modified: trunk/OpenMPT/mptrack/View_ins.h =================================================================== --- trunk/OpenMPT/mptrack/View_ins.h 2011-01-03 19:08:33 UTC (rev 783) +++ trunk/OpenMPT/mptrack/View_ins.h 2011-01-03 22:00:34 UTC (rev 784) @@ -116,6 +116,7 @@ //////////////////////// // Misc stuff void UpdateScrollSize(); + void SetInstrumentModified(); BOOL SetCurrentInstrument(INSTRUMENTINDEX nIns, enmEnvelopeTypes m_nEnv = ENV_VOLUME); MODINSTRUMENT *GetInstrumentPtr() const; INSTRUMENTENVELOPE *GetEnvelopePtr() const; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-01-16 21:41:16
|
Revision: 789 http://modplug.svn.sourceforge.net/modplug/?rev=789&view=rev Author: saga-games Date: 2011-01-16 21:41:10 +0000 (Sun, 16 Jan 2011) Log Message: ----------- [Imp] Paths to VST plugins in mptrack.ini and plugin.cache are now also relative in portable mode. [Mod] OpenMPT: Version is now 1.19.00.20 Modified Paths: -------------- trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2011-01-16 21:39:44 UTC (rev 788) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2011-01-16 21:41:10 UTC (rev 789) @@ -3048,7 +3048,7 @@ BOOL CTrackApp::InitializeDXPlugins() //----------------------------------- { - CHAR s[_MAX_PATH], tmp[32]; + TCHAR s[_MAX_PATH], tmp[32]; LONG nPlugins; m_pPluginManager = new CVstPluginManager; @@ -3071,7 +3071,11 @@ s[0] = 0; wsprintf(tmp, "Plugin%d", iPlug); GetPrivateProfileString("VST Plugins", tmp, "", s, sizeof(s), m_szConfigFileName); - if (s[0]) m_pPluginManager->AddPlugin(s, TRUE, true, &nonFoundPlugs); + if (s[0]) + { + CMainFrame::RelativePathToAbsolute(s); + m_pPluginManager->AddPlugin(s, TRUE, true, &nonFoundPlugs); + } } if(nonFoundPlugs.GetLength() > 0) { @@ -3085,7 +3089,7 @@ BOOL CTrackApp::UninitializeDXPlugins() //------------------------------------- { - CHAR s[_MAX_PATH], tmp[32]; + TCHAR s[_MAX_PATH], tmp[32]; PVSTPLUGINLIB pPlug; UINT iPlug; @@ -3099,6 +3103,10 @@ s[0] = 0; wsprintf(tmp, "Plugin%d", iPlug); strcpy(s, pPlug->szDllPath); + if(theApp.IsPortableMode()) + { + CMainFrame::AbsolutePathToRelative(s); + } WritePrivateProfileString("VST Plugins", tmp, s, m_szConfigFileName); iPlug++; } Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2011-01-16 21:39:44 UTC (rev 788) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2011-01-16 21:41:10 UTC (rev 789) @@ -189,6 +189,8 @@ PVSTPLUGINLIB CVstPluginManager::AddPlugin(LPCSTR pszDllPath, BOOL bCache, const bool checkFileExistence, CString* const errStr) //------------------------------------------------------------------------------------------------------------------------------ { + TCHAR szPath[_MAX_PATH]; + if(checkFileExistence && (PathFileExists(pszDllPath) == FALSE)) { if(errStr) @@ -207,8 +209,8 @@ // Look if the plugin info is stored in the PluginCache if (bCache) { - CString cacheSection = "PluginCache"; - CString cacheFile = theApp.GetPluginCacheFileName(); + const CString cacheSection = "PluginCache"; + const CString cacheFile = theApp.GetPluginCacheFileName(); char fileName[_MAX_PATH]; _splitpath(pszDllPath, NULL, NULL, fileName, NULL); @@ -216,8 +218,12 @@ if (IDs.GetLength() >= 16) { - CString fullPath = CMainFrame::GetPrivateProfileCString(cacheSection, IDs, "", cacheFile); - if ((fullPath) && (fullPath[0]) && (!lstrcmpi(fullPath, pszDllPath))) + // Get path from cache file + GetPrivateProfileString(cacheSection, IDs, "", szPath, CountOf(szPath) - 1, cacheFile); + SetNullTerminator(szPath); + CMainFrame::RelativePathToAbsolute(szPath); + + if ((szPath[0]) && (!lstrcmpi(szPath, pszDllPath))) { PVSTPLUGINLIB p = new VSTPLUGINLIB; if (!p) return NULL; @@ -352,6 +358,15 @@ CString IDs, flagsKey; IDs.Format("%08X%08X", p->dwPluginId1, p->dwPluginId2); flagsKey.Format("%s.Flags", IDs); + + _tcsncpy(szPath, pszDllPath, CountOf(szPath) - 1); + if(theApp.IsPortableMode()) + { + CMainFrame::AbsolutePathToRelative(szPath); + } + SetNullTerminator(szPath); + + WritePrivateProfileString(cacheSection, IDs, szPath, cacheFile); CMainFrame::WritePrivateProfileCString(cacheSection, IDs, pszDllPath, cacheFile); CMainFrame::WritePrivateProfileCString(cacheSection, p->szLibraryName, IDs, cacheFile); CMainFrame::WritePrivateProfileLong(cacheSection, flagsKey, p->bIsInstrument, cacheFile); Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-01-16 21:39:44 UTC (rev 788) +++ trunk/OpenMPT/mptrack/version.h 2011-01-16 21:41:10 UTC (rev 789) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 19 #define VER_MINOR 00 -#define VER_MINORMINOR 19 +#define VER_MINORMINOR 20 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-02-05 18:06:14
|
Revision: 794 http://modplug.svn.sourceforge.net/modplug/?rev=794&view=rev Author: saga-games Date: 2011-02-05 18:06:06 +0000 (Sat, 05 Feb 2011) Log Message: ----------- [Fix] When automatically entering note-offs in the pattern (MIDI or normal keyboard), keyboard split is now handled properly (apparently this broke some time after v1.18.03.00) [Mod] OpenMPT: Version is now 1.19.00.22 Modified Paths: -------------- trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-01-31 23:32:12 UTC (rev 793) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-02-05 18:06:06 UTC (rev 794) @@ -3242,8 +3242,8 @@ else nVol = (nVol + 3) / 4; //Value from [0,256] to [0,64] TempEnterNote(nNote, true, nVol); - // continue playing as soon as MIDI notes are being received (request 2813) - if(pSndFile->IsPaused() && CMainFrame::m_dwMidiSetup & MIDISETUP_PLAYPATTERNONMIDIIN) + // continue playing as soon as MIDI notes are being received (http://forum.openmpt.org/index.php?topic=2813.0) + if(pSndFile->IsPaused() && (CMainFrame::m_dwMidiSetup & MIDISETUP_PLAYPATTERNONMIDIIN)) pModDoc->OnPatternPlayNoLoop(); break; @@ -4025,7 +4025,7 @@ const UINT nTick = pSndFile->m_nTickCount; const PATTERNINDEX nPatPlayback = pSndFile->m_nPattern; - const bool isSplit = (note <= pModDoc->GetSplitKeyboardSettings()->splitNote); + const bool isSplit = (pModDoc->GetSplitKeyboardSettings()->IsSplitActive()) && (note <= pModDoc->GetSplitKeyboardSettings()->splitNote); UINT ins = 0; if (pModDoc) { @@ -4050,7 +4050,7 @@ } //Enter note off in pattern? - if ((note < 1) || (note > NOTE_MAX)) + if ((note < NOTE_MIN) || (note > NOTE_MAX)) return; if ((m_dwCursor & 7) > 1 && (bChordMode || !fromMidi)) return; @@ -4066,7 +4066,9 @@ activeNoteMap[note] = 0xFF; //unlock channel - if (!(CMainFrame::m_dwPatternSetup&PATTERN_KBDNOTEOFF || fromMidi)) { + if (!((CMainFrame::m_dwPatternSetup & PATTERN_KBDNOTEOFF) || fromMidi)) + { + // We don't want to write the note-off into the pattern if this feature is disabled and we're not recording from MIDI. return; } Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-01-31 23:32:12 UTC (rev 793) +++ trunk/OpenMPT/mptrack/version.h 2011-02-05 18:06:06 UTC (rev 794) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 19 #define VER_MINOR 00 -#define VER_MINORMINOR 21 +#define VER_MINORMINOR 22 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-02-11 22:45:35
|
Revision: 796 http://modplug.svn.sourceforge.net/modplug/?rev=796&view=rev Author: saga-games Date: 2011-02-11 22:45:26 +0000 (Fri, 11 Feb 2011) Log Message: ----------- [Imp] Pattern Editor: The dodgy note colour is now also customisable. Modified Paths: -------------- trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Moptions.cpp Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp 2011-02-08 11:09:20 UTC (rev 795) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp 2011-02-11 22:45:26 UTC (rev 796) @@ -135,7 +135,6 @@ b = hilightcolor(GetBValue(CMainFrame::rgbCustomColors[MODCOLOR_BACKHILIGHT]), GetBValue(CMainFrame::rgbCustomColors[MODCOLOR_BACKNORMAL])); m_Dib.SetColor(MODCOLOR_2NDHIGHLIGHT, RGB(r,g,b)); - m_Dib.SetColor(MODCOLOR_DODGY_COMMANDS, RGB(255, 0, 0)); m_Dib.SetBlendColor(CMainFrame::rgbCustomColors[MODCOLOR_BLENDCOLOR]); } Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2011-02-08 11:09:20 UTC (rev 795) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2011-02-11 22:45:26 UTC (rev 796) @@ -261,6 +261,8 @@ GetSysColor(COLOR_BTNSHADOW), GetSysColor(COLOR_BTNFACE), GetSysColor(COLOR_BTNHIGHLIGHT), // Blend colour GetSysColor(COLOR_BTNFACE), + // Dodgy commands + RGB(0xC0, 0x00, 0x00), }; // Directory Arrays (Default + Last) Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2011-02-08 11:09:20 UTC (rev 795) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2011-02-11 22:45:26 UTC (rev 796) @@ -152,10 +152,10 @@ MODCOLOR_SEPFACE, MODCOLOR_SEPHILITE, MODCOLOR_BLENDCOLOR, + MODCOLOR_DODGY_COMMANDS, MAX_MODCOLORS, - // Internal color codes + // Internal color codes (not saved to color preset files) MODCOLOR_2NDHIGHLIGHT, - MODCOLOR_DODGY_COMMANDS, MAX_MODPALETTECOLORS }; Modified: trunk/OpenMPT/mptrack/Moptions.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moptions.cpp 2011-02-08 11:09:20 UTC (rev 795) +++ trunk/OpenMPT/mptrack/Moptions.cpp 2011-02-11 22:45:26 UTC (rev 796) @@ -28,6 +28,7 @@ {"Play Cursor", 0, MODCOLOR_BACKPLAYCURSOR, MODCOLOR_TEXTPLAYCURSOR, 0, "Background:", "Foreground:", NULL}, {"Note Highlight", 0, MODCOLOR_NOTE, MODCOLOR_INSTRUMENT, MODCOLOR_VOLUME, "Note:", "Instrument:", "Volume:"}, {"Effect Highlight",0, MODCOLOR_PANNING, MODCOLOR_PITCH, MODCOLOR_GLOBALS, "Panning Effects:", "Pitch Effects:", "Global Effects:"}, + {"Invalid Commands",0, MODCOLOR_DODGY_COMMANDS, 0, 0, "Invalid Note:", NULL, NULL}, {"Channel Separator",0, MODCOLOR_SEPSHADOW, MODCOLOR_SEPFACE, MODCOLOR_SEPHILITE, "Shadow:", "Face:", "Highlight:"}, {"Next/Prev Pattern",0, MODCOLOR_BLENDCOLOR, 0, 0, "Blend color:", NULL, NULL}, {"Sample Editor", 1, MODCOLOR_SAMPLE, 0, 0, "Sample Data:", NULL, NULL}, @@ -397,6 +398,7 @@ CustomColors[MODCOLOR_SEPFACE] = GetSysColor(COLOR_BTNFACE); CustomColors[MODCOLOR_SEPHILITE] = GetSysColor(COLOR_BTNHIGHLIGHT); CustomColors[MODCOLOR_BLENDCOLOR] = GetSysColor(COLOR_BTNFACE); + CustomColors[MODCOLOR_DODGY_COMMANDS] = RGB(0xC0, 0x00, 0x00); OnPreviewChanged(); } @@ -429,6 +431,7 @@ CustomColors[MODCOLOR_SEPFACE] = RGB(0x40, 0x40, 0x80); CustomColors[MODCOLOR_SEPHILITE] = RGB(0x99, 0x99, 0xCC); CustomColors[MODCOLOR_BLENDCOLOR] = RGB(0x2E, 0x2E, 0x5A); + CustomColors[MODCOLOR_DODGY_COMMANDS] = RGB(0xC0, 0x40, 0x40); OnPreviewChanged(); } @@ -461,6 +464,7 @@ CustomColors[MODCOLOR_SEPFACE] = RGB(0x40, 0x68, 0x40); CustomColors[MODCOLOR_SEPHILITE] = RGB(0x94, 0xBC, 0x94); CustomColors[MODCOLOR_BLENDCOLOR] = RGB(0x00, 0x40, 0x00); + CustomColors[MODCOLOR_DODGY_COMMANDS] = RGB(0xFF, 0x80, 0x80); OnPreviewChanged(); } @@ -492,6 +496,7 @@ CustomColors[MODCOLOR_SEPFACE] = RGB(0xD6, 0xD0, 0xC6); CustomColors[MODCOLOR_SEPHILITE] = RGB(0xEC, 0xE8, 0xE1); CustomColors[MODCOLOR_BLENDCOLOR] = RGB(0xE1, 0xDB, 0xD0); + CustomColors[MODCOLOR_DODGY_COMMANDS] = RGB(0xC0, 0x00, 0x00); OnPreviewChanged(); } @@ -700,8 +705,8 @@ CHAR szPath[_MAX_PATH] = ""; BROWSEINFO bi; - GetDlgItemText(nID, szPath, sizeof(szPath)); - memset(&bi, 0, sizeof(bi)); + GetDlgItemText(nID, szPath, CountOf(szPath)); + MemsetZero(bi); bi.hwndOwner = m_hWnd; bi.lpszTitle = "Select a default folder..."; bi.pszDisplayName = szPath; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-02-14 18:33:23
|
Revision: 799 http://modplug.svn.sourceforge.net/modplug/?rev=799&view=rev Author: saga-games Date: 2011-02-14 18:33:16 +0000 (Mon, 14 Feb 2011) Log Message: ----------- [Mod] Pattern Editor: When removing a channel (via context menu) that contains no data in any pattern, no warning is shown anymore. [Ref] Added IsChannelUnued() to CModDoc, refactored CheckUnusedChannels(). Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_pat.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2011-02-12 20:40:27 UTC (rev 798) +++ trunk/OpenMPT/mptrack/Moddoc.h 2011-02-14 18:33:16 UTC (rev 799) @@ -340,6 +340,9 @@ // [in] bIncludeIndex: True to include instrument index in front of the instrument name, false otherwise. CString GetPatternViewInstrumentName(UINT nInstr, bool bEmptyInsteadOfNoName = false, bool bIncludeIndex = true) const; + // Check if a given channel contains data. + bool IsChannelUnused(CHANNELINDEX nChn) const; + // protected members protected: CSize m_szOldPatternScrollbarsPos; @@ -347,7 +350,7 @@ BOOL InitializeMod(); void* GetChildFrame(); //rewbs.customKeys - void CheckUnusedChannels(bool mask[MAX_BASECHANNELS], CHANNELINDEX maxRemoveCount = MAX_BASECHANNELS); + void CheckUnusedChannels(bool mask[MAX_BASECHANNELS], CHANNELINDEX maxRemoveCount = MAX_BASECHANNELS) const; // Overrides // ClassWizard generated virtual function overrides Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2011-02-12 20:40:27 UTC (rev 798) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2011-02-14 18:33:16 UTC (rev 799) @@ -197,7 +197,7 @@ { MODCOMMAND::INSTR instr = m.instr, newinstr = 0; MODCOMMAND::NOTE note = m.note, newnote = note; - if((note) && (note <= NOTE_MAX)) + if((note >= NOTE_MIN) && (note <= NOTE_MAX)) note--; else note = NOTE_MIDDLEC - 1; @@ -1231,33 +1231,48 @@ } -void CModDoc::CheckUnusedChannels(bool mask[MAX_BASECHANNELS], CHANNELINDEX maxRemoveCount) -//------------------------------------------------------------------------------------- +// Check which channels contain note data. maxRemoveCount specified how many empty channels are reported at max. +void CModDoc::CheckUnusedChannels(bool mask[MAX_BASECHANNELS], CHANNELINDEX maxRemoveCount) const +//----------------------------------------------------------------------------------------------- { // Checking for unused channels const int nChannels = m_SndFile.GetNumChannels(); for(int iRst = nChannels - 1; iRst >= 0; iRst--) { - mask[iRst] = true; - for (PATTERNINDEX ipat = 0; ipat < m_SndFile.Patterns.Size(); ipat++) if (m_SndFile.Patterns.IsValidPat(ipat)) + mask[iRst] = IsChannelUnused(iRst); + if(mask[iRst]) { - MODCOMMAND *p = m_SndFile.Patterns[ipat] + iRst; - UINT len = m_SndFile.Patterns[ipat].GetNumRows(); - for (UINT idata = 0; idata < len; idata++, p += m_SndFile.m_nChannels) + // Found enough empty channels yet? + if((--maxRemoveCount) == 0) break; + } + } +} + + +// Check if a given channel contains note data. +bool CModDoc::IsChannelUnused(CHANNELINDEX nChn) const +//---------------------------------------------------- +{ + const CHANNELINDEX nChannels = m_SndFile.GetNumChannels(); + if(nChn >= nChannels) + { + return true; + } + for(PATTERNINDEX nPat = 0; nPat < m_SndFile.Patterns.Size(); nPat++) + { + if(m_SndFile.Patterns.IsValidPat(nPat)) + { + const MODCOMMAND *p = m_SndFile.Patterns[nPat] + nChn; + for(ROWINDEX nRow = m_SndFile.Patterns[nPat].GetNumRows(); nRow > 0; nRow--, p += nChannels) { - if (!p->IsEmpty()) + if(!p->IsEmpty()) { - mask[iRst] = false; - break; + return false; } } - if (!mask[iRst]) break; } - if (mask[iRst]) - { - if ((--maxRemoveCount) == 0) break; - } } + return true; } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-02-12 20:40:27 UTC (rev 798) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-02-14 18:33:16 UTC (rev 799) @@ -2583,7 +2583,7 @@ { CModDoc *pModDoc = GetDocument(); CSoundFile* pSndFile; - if (pModDoc == 0 || (pSndFile = pModDoc->GetSoundFile()) == 0) return; + if (pModDoc == nullptr || (pSndFile = pModDoc->GetSoundFile()) == nullptr) return; if(pSndFile->m_nChannels <= pSndFile->GetModSpecifications().channelsMin) { @@ -2592,9 +2592,11 @@ } CHANNELINDEX nChn = GetChanFromCursor(m_nMenuParam); + const bool isEmpty = pModDoc->IsChannelUnused(nChn); + CString str; - str.Format("Remove channel %d?\nNote: Affects all patterns and no undo", nChn+1); - if(CMainFrame::GetMainFrame()->MessageBox(str , "Remove channel", MB_YESNO | MB_ICONQUESTION) == IDYES) + str.Format("Remove channel %d? This channel still contains note data!\nNote: Operation affects all patterns and has no undo", nChn + 1); + if(isEmpty || CMainFrame::GetMainFrame()->MessageBox(str , "Remove channel", MB_YESNO | MB_ICONQUESTION) == IDYES) { bool chnMask[MAX_BASECHANNELS]; for(CHANNELINDEX i = 0; i < MAX_BASECHANNELS; i++) {chnMask[i] = false;} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-02-26 19:22:35
|
Revision: 803 http://modplug.svn.sourceforge.net/modplug/?rev=803&view=rev Author: saga-games Date: 2011-02-26 19:22:28 +0000 (Sat, 26 Feb 2011) Log Message: ----------- [Fix] The EnergyXT GUI does now also work after closing and re-opening the VST editor. (tx Nahkranoth, http://forum.openmpt.org/index.php?topic=2307.0) [Fix] Pattern Editor: Automation data is not written to the pattern if the current module format does not support smooth midi macros. [Mod] OpenMPT: Version is now 1.19.00.26 Modified Paths: -------------- trunk/OpenMPT/mptrack/VSTEditor.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/VSTEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/VSTEditor.cpp 2011-02-20 15:28:53 UTC (rev 802) +++ trunk/OpenMPT/mptrack/VSTEditor.cpp 2011-02-26 19:22:28 UTC (rev 803) @@ -97,7 +97,7 @@ { #ifdef VST_LOG Log("CVstEditor::DoClose()\n"); -#endif +#endif // VST_LOG if ((m_pVstPlugin) && (m_hWnd)) { CRect rect; @@ -105,20 +105,23 @@ m_pVstPlugin->m_nEditorX = rect.left; m_pVstPlugin->m_nEditorY = rect.top; } + if (m_pVstPlugin) + { +#ifdef VST_LOG + Log("Dispatching effEditClose...\n"); +#endif // VST_LOG + m_pVstPlugin->Dispatch(effEditClose, 0, 0, NULL, 0); + } if (m_hWnd) { - #ifdef VST_LOG +#ifdef VST_LOG Log("Destroying window...\n"); - #endif +#endif // VST_LOG + // Initially, this was called before the last Dispatch() call. + // Now it's done after that call so that energyXT's GUI still works after re-opening the VST editor. + // Let's hope that other plugins don't break... DestroyWindow(); } - if (m_pVstPlugin) - { - #ifdef VST_LOG - Log("Dispatching effEditClose...\n"); - #endif - m_pVstPlugin->Dispatch(effEditClose, 0, 0, NULL, 0); - } } #endif // NO_VST Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-02-20 15:28:53 UTC (rev 802) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-02-26 19:22:28 UTC (rev 803) @@ -3065,11 +3065,13 @@ { CModDoc *pModDoc = GetDocument(); //if (!m_bRecord || !pModDoc) { - if (!IsEditingEnabled() || !pModDoc) { + if (!IsEditingEnabled() || !pModDoc) + { return 0; } CSoundFile *pSndFile = pModDoc->GetSoundFile(); - if (!pSndFile) { + if (!pSndFile) + { return 0; } @@ -3081,8 +3083,6 @@ if(bUsePlaybackPosition == true) SetEditPos(*pSndFile, nRow, nPattern, pSndFile->m_nRow, pSndFile->m_nPattern); - pModDoc->GetPatternUndo()->PrepareUndo(nPattern, nChn, nRow, 1, 1); - MODCOMMAND *pRow = pSndFile->Patterns[nPattern].GetpModCommand(nRow, nChn); // TODO: Is the right plugin active? Move to a chan with the right plug @@ -3098,10 +3098,12 @@ // only overwrite existing PC Notes if(pRow->IsEmpty() || pRow->IsPcNote()) { + pModDoc->GetPatternUndo()->PrepareUndo(nPattern, nChn, nRow, 1, 1); + pRow->Set(NOTE_PCS, plugSlot + 1, paramIndex, static_cast<uint16>(pPlug->GetParameter(paramIndex) * MODCOMMAND::maxColumnValue)); InvalidateRow(nRow); } - } else + } else if(pSndFile->GetModSpecifications().HasCommand(CMD_SMOOTHMIDI)) { // Other formats: Use MIDI macros @@ -3109,17 +3111,23 @@ long activePlugParam = -1; BYTE activeMacro = pSndFile->Chn[nChn].nActiveMacro; CString activeMacroString = &(pSndFile->m_MidiCfg.szMidiSFXExt[activeMacro*32]); - if (pModDoc->GetMacroType(activeMacroString) == sfx_plug) { + if (pModDoc->GetMacroType(activeMacroString) == sfx_plug) + { activePlugParam = pModDoc->MacroToPlugParam(activeMacroString); } //If the wrong macro is active, see if we can find the right one. //If we can, activate it for this chan by writing appropriate SFx command it. - if (activePlugParam != paramIndex) { + if (activePlugParam != paramIndex) + { int foundMacro = pModDoc->FindMacroForParam(paramIndex); - if (foundMacro >= 0) { + if (foundMacro >= 0) + { pSndFile->Chn[nChn].nActiveMacro = foundMacro; - if (pRow->command == 0 || pRow->command == CMD_SMOOTHMIDI || pRow->command == CMD_MIDI) { //we overwrite existing Zxx and \xx only. - pRow->command = (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT))?CMD_S3MCMDEX:CMD_MODCMDEX;; + if (pRow->command == CMD_NONE || pRow->command == CMD_SMOOTHMIDI || pRow->command == CMD_MIDI) //we overwrite existing Zxx and \xx only. + { + pModDoc->GetPatternUndo()->PrepareUndo(nPattern, nChn, nRow, 1, 1); + + pRow->command = (pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) ? CMD_S3MCMDEX : CMD_MODCMDEX;; pRow->param = 0xF0 + (foundMacro&0x0F); InvalidateRow(nRow); } @@ -3128,7 +3136,10 @@ } //Write the data, but we only overwrite if the command is a macro anyway. - if (pRow->command == CMD_NONE || pRow->command == CMD_SMOOTHMIDI || pRow->command == CMD_MIDI) { + if (pRow->command == CMD_NONE || pRow->command == CMD_SMOOTHMIDI || pRow->command == CMD_MIDI) + { + pModDoc->GetPatternUndo()->PrepareUndo(nPattern, nChn, nRow, 1, 1); + pRow->command = CMD_SMOOTHMIDI; pRow->param = pPlug->GetZxxParameter(paramIndex); InvalidateRow(nRow); Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-02-20 15:28:53 UTC (rev 802) +++ trunk/OpenMPT/mptrack/version.h 2011-02-26 19:22:28 UTC (rev 803) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 19 #define VER_MINOR 00 -#define VER_MINORMINOR 25 +#define VER_MINORMINOR 26 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-02-27 22:24:08
|
Revision: 806 http://modplug.svn.sourceforge.net/modplug/?rev=806&view=rev Author: saga-games Date: 2011-02-27 22:24:02 +0000 (Sun, 27 Feb 2011) Log Message: ----------- [Fix] Sample Undo didn't preserve the sample name. Modified Paths: -------------- trunk/OpenMPT/mptrack/Undo.cpp trunk/OpenMPT/mptrack/Undo.h Modified: trunk/OpenMPT/mptrack/Undo.cpp =================================================================== --- trunk/OpenMPT/mptrack/Undo.cpp 2011-02-27 17:20:20 UTC (rev 805) +++ trunk/OpenMPT/mptrack/Undo.cpp 2011-02-27 22:24:02 UTC (rev 806) @@ -251,6 +251,7 @@ // Save old sample header memcpy(&sUndo.OldSample, &pSndFile->Samples[nSmp], sizeof(MODSAMPLE)); + memcpy(sUndo.szOldName, pSndFile->m_szNames[nSmp], sizeof(sUndo.szOldName)); sUndo.nChangeType = nChangeType; if(nChangeType == sundo_replace) @@ -386,6 +387,7 @@ // Restore old sample header memcpy(&pSndFile->Samples[nSmp], &pUndo->OldSample, sizeof(MODSAMPLE)); pSndFile->Samples[nSmp].pSample = pCurrentSample; // select the "correct" old sample + memcpy(pSndFile->m_szNames[nSmp], pUndo->szOldName, sizeof(pUndo->szOldName)); if(pNewSample != nullptr) { Modified: trunk/OpenMPT/mptrack/Undo.h =================================================================== --- trunk/OpenMPT/mptrack/Undo.h 2011-02-27 17:20:20 UTC (rev 805) +++ trunk/OpenMPT/mptrack/Undo.h 2011-02-27 22:24:02 UTC (rev 806) @@ -82,6 +82,7 @@ struct SAMPLEUNDOBUFFER { MODSAMPLE OldSample; + CHAR szOldName[MAX_SAMPLENAME]; LPSTR SamplePtr; UINT nChangeStart, nChangeEnd; sampleUndoTypes nChangeType; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-03-07 00:22:00
|
Revision: 809 http://modplug.svn.sourceforge.net/modplug/?rev=809&view=rev Author: saga-games Date: 2011-03-07 00:21:50 +0000 (Mon, 07 Mar 2011) Log Message: ----------- [Ref] Moved code of various dialogs from dlg_misc.cpp to PatternEditorDialogs.cpp and SampleEditorDialogs.cpp (new files). Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/mptrack_08.vcproj Added Paths: ----------- trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp trunk/OpenMPT/mptrack/PatternEditorDialogs.h trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp trunk/OpenMPT/mptrack/SampleEditorDialogs.h Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2011-03-04 18:00:36 UTC (rev 808) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2011-03-07 00:21:50 UTC (rev 809) @@ -4,7 +4,7 @@ #include "childfrm.h" #include "moddoc.h" #include "globals.h" -#include "dlg_misc.h" +#include "PatternEditorDialogs.h" #include "ctrl_pat.h" #include "view_pat.h" #include "ChannelManagerDlg.h" Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2011-03-04 18:00:36 UTC (rev 808) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2011-03-07 00:21:50 UTC (rev 809) @@ -6,6 +6,7 @@ #include "globals.h" #include "ctrl_smp.h" #include "view_smp.h" +#include "SampleEditorDialogs.h" #include "dlg_misc.h" #include "PSRatioCalc.h" //rewbs.timeStretchMods #include "mpdlgs.h" Added: trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp =================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp (rev 0) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp 2011-03-07 00:21:50 UTC (rev 809) @@ -0,0 +1,1508 @@ +/* + * + * PatternEditorDialogs.cpp + * ------------------------ + * Purpose: Code for various dialogs that are used in the pattern editor + * Notes : (currently none) + * Authors: Olivier Lapicque + * OpenMPT Devs + * + */ + +#include "stdafx.h" +#include "mptrack.h" +#include "Mainfrm.h" +#include "PatternEditorDialogs.h" + + +// -> CODE#0010 +// -> DESC="add extended parameter mechanism to pattern effects" +void getXParam(BYTE command, UINT nPat, UINT nRow, UINT nChannel, CSoundFile *pSndFile, UINT * xparam, UINT * multiplier) +{ + if(xparam == NULL || multiplier == NULL) return; + + MODCOMMAND mca = MODCOMMAND::Empty(); + UINT i,xp = 0, ml = 1; + int nCmdRow = (int)nRow; + + // If the current command is a parameter extension command + if(command == CMD_XPARAM){ + + nCmdRow--; + + // Try to find previous command parameter to be extended + while(nCmdRow >= 0){ + i = nCmdRow * pSndFile->m_nChannels + nChannel; + mca = pSndFile->Patterns[nPat][i]; + if(mca.command == CMD_OFFSET || mca.command == CMD_PATTERNBREAK || mca.command == CMD_PATTERNBREAK) + break; + if(mca.command != CMD_XPARAM){ + nCmdRow = -1; + break; + } + nCmdRow--; + } + } + // Else if current row do not own any satisfying command parameter to extend, set return state + else if(command != CMD_OFFSET && command != CMD_PATTERNBREAK && command != CMD_TEMPO) nCmdRow = -1; + + // If an 'extendable' command parameter has been found, + if(nCmdRow >= 0){ + i = nCmdRow * pSndFile->m_nChannels + nChannel; + mca = pSndFile->Patterns[nPat][i]; + + // Find extension resolution (8 to 24 bits) + UINT n = 1; + while(n < 4 && nCmdRow+n < pSndFile->Patterns[nPat].GetNumRows()){ + i = (nCmdRow+n) * pSndFile->m_nChannels + nChannel; + if(pSndFile->Patterns[nPat][i].command != CMD_XPARAM) break; + n++; + } + + // Parameter extension found (above 8 bits non-standard parameters) + if(n > 1){ + // Limit offset command to 24 bits, other commands to 16 bits + n = mca.command == CMD_OFFSET ? n : (n > 2 ? 2 : n); + + // Compute extended value WITHOUT current row parameter value : this parameter + // is being currently edited (this is why this function is being called) so we + // only need to compute a multiplier so that we can add its contribution while + // its value is changed by user + for(UINT j = 0 ; j < n ; j++){ + i = (nCmdRow+j) * pSndFile->m_nChannels + nChannel; + mca = pSndFile->Patterns[nPat][i]; + + UINT k = 8*(n-j-1); + if(nCmdRow+j == nRow) ml = 1<<k; + else xp += (mca.param<<k); + } + } + // No parameter extension to perform (8 bits standard parameter), + // just care about offset command special case (16 bits, fake) + else if(mca.command == CMD_OFFSET) ml <<= 8; + } + + // Return x-parameter + *multiplier = ml; + *xparam = xp; +} +// -! NEW_FEATURE#0010 + + +////////////////////////////////////////////////////////////////////////////////////////// +// Find/Replace Dialog + +BEGIN_MESSAGE_MAP(CFindReplaceTab, CPropertyPage) + ON_CBN_SELCHANGE(IDC_COMBO1, OnNoteChanged) + ON_CBN_SELCHANGE(IDC_COMBO2, OnInstrChanged) + ON_CBN_SELCHANGE(IDC_COMBO3, OnVolCmdChanged) + ON_CBN_SELCHANGE(IDC_COMBO4, OnVolumeChanged) + ON_CBN_SELCHANGE(IDC_COMBO5, OnEffectChanged) + ON_CBN_SELCHANGE(IDC_COMBO6, OnParamChanged) + ON_COMMAND(IDC_CHECK1, OnCheckNote) + ON_COMMAND(IDC_CHECK2, OnCheckInstr) + ON_COMMAND(IDC_CHECK3, OnCheckVolCmd) + ON_COMMAND(IDC_CHECK4, OnCheckVolume) + ON_COMMAND(IDC_CHECK5, OnCheckEffect) + ON_COMMAND(IDC_CHECK6, OnCheckParam) + + ON_COMMAND(IDC_CHECK7, OnCheckChannelSearch) +END_MESSAGE_MAP() + + +BOOL CFindReplaceTab::OnInitDialog() +//---------------------------------- +{ + CHAR s[256]; + CComboBox *combo; + CSoundFile *pSndFile; + + CPropertyPage::OnInitDialog(); + if (!m_pModDoc) return TRUE; + pSndFile = m_pModDoc->GetSoundFile(); + // Search flags + if (m_dwFlags & PATSEARCH_NOTE) CheckDlgButton(IDC_CHECK1, MF_CHECKED); + if (m_dwFlags & PATSEARCH_INSTR) CheckDlgButton(IDC_CHECK2, MF_CHECKED); + if (m_dwFlags & PATSEARCH_VOLCMD) CheckDlgButton(IDC_CHECK3, MF_CHECKED); + if (m_dwFlags & PATSEARCH_VOLUME) CheckDlgButton(IDC_CHECK4, MF_CHECKED); + if (m_dwFlags & PATSEARCH_COMMAND) CheckDlgButton(IDC_CHECK5, MF_CHECKED); + if (m_dwFlags & PATSEARCH_PARAM) CheckDlgButton(IDC_CHECK6, MF_CHECKED); + if (m_bReplace) + { + if (m_dwFlags & PATSEARCH_REPLACE) CheckDlgButton(IDC_CHECK7, MF_CHECKED); + if (m_dwFlags & PATSEARCH_REPLACEALL) CheckDlgButton(IDC_CHECK8, MF_CHECKED); + } else + { + if (m_dwFlags & PATSEARCH_CHANNEL) CheckDlgButton(IDC_CHECK7, MF_CHECKED); + int nButton = IDC_RADIO1; + if((m_dwFlags & PATSEARCH_FULLSEARCH)) + { + nButton = IDC_RADIO2; + } else if(/*(m_dwFlags & PATSEARCH_PATSELECTION) &&*/ m_bPatSel) + { + nButton = IDC_RADIO3; + } + CheckRadioButton(IDC_RADIO1, IDC_RADIO3, nButton); + GetDlgItem(IDC_RADIO3)->EnableWindow(m_bPatSel ? TRUE : FALSE); + SetDlgItemInt(IDC_EDIT1, m_nMinChannel + 1); + SetDlgItemInt(IDC_EDIT2, m_nMaxChannel + 1); + } + // Note + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO1)) != NULL) + { + combo->InitStorage(150, 6); + combo->SetItemData(combo->AddString("..."), 0); + if (m_bReplace) + { + combo->SetItemData(combo->AddString("note-1"), replaceNoteMinusOne); + combo->SetItemData(combo->AddString("note+1"), replaceNotePlusOne); + combo->SetItemData(combo->AddString("-1 oct"), replaceNoteMinusOctave); + combo->SetItemData(combo->AddString("+1 oct"), replaceNotePlusOctave); + } else + { + combo->SetItemData(combo->AddString("any"), findAny); + } + AppendNotesToControlEx(*combo, pSndFile); + + UINT ncount = combo->GetCount(); + for (UINT i=0; i<ncount; i++) if (m_nNote == combo->GetItemData(i)) + { + combo->SetCurSel(i); + break; + } + } + // Instrument + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO2)) != NULL) + { + combo->SetItemData(combo->AddString(".."), 0); + if (m_bReplace) + { + combo->SetItemData(combo->AddString("ins-1"), replaceInstrumentMinusOne); + combo->SetItemData(combo->AddString("ins+1"), replaceInstrumentPlusOne); + } + for (UINT n=1; n<MAX_INSTRUMENTS; n++) + { + if (pSndFile->m_nInstruments) + { + wsprintf(s, "%03d:%s", n, (pSndFile->Instruments[n]) ? (LPCTSTR)pSndFile->GetInstrumentName(n) : ""); + } else + { + wsprintf(s, "%03d:%s", n, pSndFile->m_szNames[n]); + } + combo->SetItemData(combo->AddString(s), n); + } + UINT ncount = combo->GetCount(); + for (UINT i=0; i<ncount; i++) + { + if (m_nInstr == combo->GetItemData(i) || (cInstrRelChange == -1 && combo->GetItemData(i) == replaceInstrumentMinusOne) || (cInstrRelChange == 1 && combo->GetItemData(i) == replaceInstrumentPlusOne)) + { + combo->SetCurSel(i); + break; + } + } + } + // Volume Command + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO3)) != NULL) + { + combo->InitStorage(m_pModDoc->GetNumVolCmds(), 15); + combo->SetItemData(combo->AddString(" None"), (DWORD)-1); + UINT count = m_pModDoc->GetNumVolCmds(); + for (UINT n=0; n<count; n++) + { + m_pModDoc->GetVolCmdInfo(n, s); + if (s[0]) combo->SetItemData(combo->AddString(s), n); + } + combo->SetCurSel(0); + UINT fxndx = m_pModDoc->GetIndexFromVolCmd(m_nVolCmd); + for (UINT i=0; i<=count; i++) if (fxndx == combo->GetItemData(i)) + { + combo->SetCurSel(i); + break; + } + } + // Volume + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO4)) != NULL) + { + combo->InitStorage(64, 4); + for (UINT n=0; n<=64; n++) + { + wsprintf(s, "%02d", n); + combo->SetItemData(combo->AddString(s), n); + } + UINT ncount = combo->GetCount(); + for (UINT i=0; i<ncount; i++) if (m_nVol == combo->GetItemData(i)) + { + combo->SetCurSel(i); + break; + } + } + // Command + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO5)) != NULL) + { + combo->InitStorage(m_pModDoc->GetNumEffects(), 20); + combo->SetItemData(combo->AddString(" None"), (DWORD)-1); + UINT count = m_pModDoc->GetNumEffects(); + for (UINT n=0; n<count; n++) + { + m_pModDoc->GetEffectInfo(n, s, true); + if (s[0]) combo->SetItemData(combo->AddString(s), n); + } + combo->SetCurSel(0); + UINT fxndx = m_pModDoc->GetIndexFromEffect(m_nCommand, m_nParam); + for (UINT i=0; i<=count; i++) if (fxndx == combo->GetItemData(i)) + { + combo->SetCurSel(i); + break; + } + } + ChangeEffect(); + OnCheckChannelSearch(); + return TRUE; +} + + +void CFindReplaceTab::ChangeEffect() +//---------------------------------- +{ + int fxndx = -1; + CComboBox *combo; + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO5)) != NULL) + { + fxndx = combo->GetItemData(combo->GetCurSel()); + } + // Update Param range + if (((combo = (CComboBox *)GetDlgItem(IDC_COMBO6)) != NULL) && (m_pModDoc)) + { + UINT oldcount = combo->GetCount(); + UINT newcount = m_pModDoc->IsExtendedEffect(fxndx) ? 16 : 256; + if (oldcount != newcount) + { + CHAR s[16]; + int newpos; + if (oldcount) newpos = combo->GetCurSel() % newcount; else newpos = m_nParam % newcount; + combo->ResetContent(); + for (UINT i=0; i<newcount; i++) + { + wsprintf(s, (newcount == 256) ? "%02X" : "%X", i); + combo->SetItemData(combo->AddString(s), i); + } + combo->SetCurSel(newpos); + } + } +} + + +void CFindReplaceTab::OnCheckChannelSearch() +//------------------------------------------ +{ + if (!m_bReplace) + { + BOOL b = IsDlgButtonChecked(IDC_CHECK7); + ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT1), b); + ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT2), b); + } +} + + +void CFindReplaceTab::OnOK() +//-------------------------- +{ + CComboBox *combo; + + // Search flags + m_dwFlags = 0; + if (IsDlgButtonChecked(IDC_CHECK1)) m_dwFlags |= PATSEARCH_NOTE; + if (IsDlgButtonChecked(IDC_CHECK2)) m_dwFlags |= PATSEARCH_INSTR; + if (IsDlgButtonChecked(IDC_CHECK3)) m_dwFlags |= PATSEARCH_VOLCMD; + if (IsDlgButtonChecked(IDC_CHECK4)) m_dwFlags |= PATSEARCH_VOLUME; + if (IsDlgButtonChecked(IDC_CHECK5)) m_dwFlags |= PATSEARCH_COMMAND; + if (IsDlgButtonChecked(IDC_CHECK6)) m_dwFlags |= PATSEARCH_PARAM; + if (m_bReplace) + { + if (IsDlgButtonChecked(IDC_CHECK7)) m_dwFlags |= PATSEARCH_REPLACE; + if (IsDlgButtonChecked(IDC_CHECK8)) m_dwFlags |= PATSEARCH_REPLACEALL; + } else + { + if (IsDlgButtonChecked(IDC_CHECK7)) m_dwFlags |= PATSEARCH_CHANNEL; + if (IsDlgButtonChecked(IDC_RADIO2)) m_dwFlags |= PATSEARCH_FULLSEARCH; + if (IsDlgButtonChecked(IDC_RADIO3)) m_dwFlags |= PATSEARCH_PATSELECTION; + } + // Note + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO1)) != NULL) + { + m_nNote = combo->GetItemData(combo->GetCurSel()); + } + // Instrument + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO2)) != NULL) + { + m_nInstr = 0; + cInstrRelChange = 0; + switch(combo->GetItemData(combo->GetCurSel())) + { + case replaceInstrumentMinusOne: + cInstrRelChange = -1; + break; + case replaceInstrumentPlusOne: + cInstrRelChange = 1; + break; + default: + m_nInstr = combo->GetItemData(combo->GetCurSel()); + break; + } + } + // Volume Command + if (((combo = (CComboBox *)GetDlgItem(IDC_COMBO3)) != NULL) && (m_pModDoc)) + { + m_nVolCmd = m_pModDoc->GetVolCmdFromIndex(combo->GetItemData(combo->GetCurSel())); + } + // Volume + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO4)) != NULL) + { + m_nVol = combo->GetItemData(combo->GetCurSel()); + } + // Effect + int effectIndex = -1; + if (((combo = (CComboBox *)GetDlgItem(IDC_COMBO5)) != NULL) && (m_pModDoc)) + { + int n = -1; // unused parameter adjustment + effectIndex = combo->GetItemData(combo->GetCurSel()); + m_nCommand = m_pModDoc->GetEffectFromIndex(effectIndex, n); + } + // Param + m_nParam = 0; + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO6)) != NULL) + { + m_nParam = combo->GetItemData(combo->GetCurSel()); + + // Apply parameter value mask if required (e.g. SDx has mask D0). + if (effectIndex > -1) + { + m_nParam |= m_pModDoc->GetEffectMaskFromIndex(effectIndex); + } + } + // Min/Max channels + if (!m_bReplace) + { + m_nMinChannel = GetDlgItemInt(IDC_EDIT1) - 1; + m_nMaxChannel = GetDlgItemInt(IDC_EDIT2) - 1; + if (m_nMaxChannel < m_nMinChannel) m_nMaxChannel = m_nMinChannel; + } + CPropertyPage::OnOK(); +} + + +///////////////////////////////////////////////////////////////////////////////////////////// +// CPatternPropertiesDlg + +BEGIN_MESSAGE_MAP(CPatternPropertiesDlg, CDialog) + ON_COMMAND(IDC_BUTTON_HALF, OnHalfRowNumber) + ON_COMMAND(IDC_BUTTON_DOUBLE, OnDoubleRowNumber) + ON_COMMAND(IDC_CHECK1, OnOverrideSignature) +END_MESSAGE_MAP() + +BOOL CPatternPropertiesDlg::OnInitDialog() +//---------------------------------------- +{ + CComboBox *combo; + CDialog::OnInitDialog(); + combo = (CComboBox *)GetDlgItem(IDC_COMBO1); + const CSoundFile *pSndFile = (m_pModDoc) ? m_pModDoc->GetSoundFile() : nullptr; + if ((pSndFile) && (m_nPattern < pSndFile->Patterns.Size()) && (combo)) + { + CHAR s[256]; + UINT nrows = pSndFile->Patterns[m_nPattern].GetNumRows(); + + const CModSpecifications& specs = pSndFile->GetModSpecifications(); + for (UINT irow = specs.patternRowsMin; irow <= specs.patternRowsMax; irow++) + { + wsprintf(s, "%d", irow); + combo->AddString(s); + } + combo->SetCurSel(nrows - specs.patternRowsMin); + wsprintf(s, "Pattern #%d: %d row%s (%dK)", + m_nPattern, + pSndFile->Patterns[m_nPattern].GetNumRows(), + (pSndFile->Patterns[m_nPattern].GetNumRows() == 1) ? "" : "s", + (pSndFile->Patterns[m_nPattern].GetNumRows() * pSndFile->m_nChannels * sizeof(MODCOMMAND)) / 1024); + SetDlgItemText(IDC_TEXT1, s); + + // Window title + CHAR szName[MAX_PATTERNNAME + 2]; + pSndFile->GetPatternName(m_nPattern, szName, MAX_PATTERNNAME); + if(strlen(szName)) + { + strcat(szName, ")"); + } + wsprintf(s, "Pattern Properties for Pattern #%d%s%s", m_nPattern, strlen(szName) ? " (" : "", szName); + SetWindowText(s); + + // pattern time signature + const bool bOverride = pSndFile->Patterns[m_nPattern].GetOverrideSignature(); + UINT nRPB = pSndFile->Patterns[m_nPattern].GetRowsPerBeat(), nRPM = pSndFile->Patterns[m_nPattern].GetRowsPerMeasure(); + if(nRPB == 0 || !bOverride) nRPB = pSndFile->m_nDefaultRowsPerBeat; + if(nRPM == 0 || !bOverride) nRPM = pSndFile->m_nDefaultRowsPerMeasure; + + GetDlgItem(IDC_CHECK1)->EnableWindow(pSndFile->GetModSpecifications().hasPatternSignatures ? TRUE : FALSE); + CheckDlgButton(IDC_CHECK1, bOverride ? MF_CHECKED : MF_UNCHECKED); + SetDlgItemInt(IDC_EDIT_ROWSPERBEAT, nRPB, FALSE); + SetDlgItemInt(IDC_EDIT_ROWSPERMEASURE, nRPM, FALSE); + OnOverrideSignature(); + } + return TRUE; +} + + +void CPatternPropertiesDlg::OnHalfRowNumber() +//------------------------------------------- +{ + const CSoundFile *pSndFile = (m_pModDoc) ? m_pModDoc->GetSoundFile() : nullptr; + if(pSndFile == nullptr) + return; + + UINT nRows = GetDlgItemInt(IDC_COMBO1, NULL, FALSE); + nRows /= 2; + if(nRows < pSndFile->GetModSpecifications().patternRowsMin) + nRows = pSndFile->GetModSpecifications().patternRowsMin; + SetDlgItemInt(IDC_COMBO1, nRows, FALSE); +} + + +void CPatternPropertiesDlg::OnDoubleRowNumber() +//--------------------------------------------- +{ + const CSoundFile *pSndFile = (m_pModDoc) ? m_pModDoc->GetSoundFile() : nullptr; + if(pSndFile == nullptr) + return; + + UINT nRows = GetDlgItemInt(IDC_COMBO1, NULL, FALSE); + nRows *= 2; + if(nRows > pSndFile->GetModSpecifications().patternRowsMax) + nRows = pSndFile->GetModSpecifications().patternRowsMax; + SetDlgItemInt(IDC_COMBO1, nRows, FALSE); +} + + +void CPatternPropertiesDlg::OnOverrideSignature() +//----------------------------------------------- +{ + GetDlgItem(IDC_EDIT_ROWSPERBEAT)->EnableWindow(IsDlgButtonChecked(IDC_CHECK1)); + GetDlgItem(IDC_EDIT_ROWSPERMEASURE)->EnableWindow(IsDlgButtonChecked(IDC_CHECK1)); +} + + +void CPatternPropertiesDlg::OnOK() +//-------------------------------- +{ + CSoundFile *pSndFile = (m_pModDoc) ? m_pModDoc->GetSoundFile() : nullptr; + if(pSndFile) + { + // Update pattern signature if necessary + if(pSndFile->GetModSpecifications().hasPatternSignatures) + { + if(IsDlgButtonChecked(IDC_CHECK1)) // Enable signature + { + ROWINDEX nNewBeat = (ROWINDEX)GetDlgItemInt(IDC_EDIT_ROWSPERBEAT, NULL, FALSE), nNewMeasure = (ROWINDEX)GetDlgItemInt(IDC_EDIT_ROWSPERMEASURE, NULL, FALSE); + if(nNewBeat != pSndFile->Patterns[m_nPattern].GetRowsPerBeat() || nNewMeasure != pSndFile->Patterns[m_nPattern].GetRowsPerMeasure()) + { + if(!pSndFile->Patterns[m_nPattern].SetSignature(nNewBeat, nNewMeasure)) + { + MessageBox("Invalid time signature!", "Pattern Properties", MB_OK|MB_ICONEXCLAMATION); + GetDlgItem(IDC_EDIT_ROWSPERBEAT)->SetFocus(); + return; + } + m_pModDoc->SetModified(); + } + } else // Disable signature + { + if(pSndFile->Patterns[m_nPattern].GetOverrideSignature()) + { + pSndFile->Patterns[m_nPattern].RemoveSignature(); + m_pModDoc->SetModified(); + } + } + } + + UINT n = GetDlgItemInt(IDC_COMBO1, NULL, FALSE); + pSndFile->Patterns[m_nPattern].Resize(n); + } + CDialog::OnOK(); +} + + +//////////////////////////////////////////////////////////////////////////////////////////// +// CEditCommand + +BEGIN_MESSAGE_MAP(CEditCommand, CPropertySheet) + ON_WM_ACTIVATE() + ON_WM_CLOSE() + ON_WM_DESTROY() +END_MESSAGE_MAP() + + +CEditCommand::CEditCommand() +//-------------------------- +{ + m_pModDoc = NULL; + m_hWndView = NULL; + m_nPattern = 0; + m_nRow = 0; + m_nChannel = 0; + m_pageNote = NULL; + m_pageVolume = NULL; + m_pageEffect = NULL; + m_bModified = false; +} + + +BOOL CEditCommand::SetParent(CWnd *parent, CModDoc *pModDoc) +//---------------------------------------------------------- +{ + if ((!parent) || (!pModDoc)) return FALSE; + m_hWndView = parent->m_hWnd; + m_pModDoc = pModDoc; + m_pageNote = new CPageEditNote(m_pModDoc, this); + m_pageVolume = new CPageEditVolume(m_pModDoc, this); + m_pageEffect = new CPageEditEffect(m_pModDoc, this); + AddPage(m_pageNote); + AddPage(m_pageVolume); + AddPage(m_pageEffect); + if (!CPropertySheet::Create(parent, + WS_SYSMENU|WS_POPUP|WS_CAPTION, WS_EX_DLGMODALFRAME)) return FALSE; + ModifyStyleEx(0, WS_EX_TOOLWINDOW|WS_EX_PALETTEWINDOW, SWP_FRAMECHANGED); + return TRUE; +} + +void CEditCommand::OnDestroy() +//---------------------------- +{ + CPropertySheet::OnDestroy(); + + if (m_pageNote) { + m_pageNote->DestroyWindow(); + delete m_pageNote; + } + if (m_pageVolume) { + m_pageVolume->DestroyWindow(); + delete m_pageVolume; + } + if (m_pageEffect) { + m_pageEffect->DestroyWindow(); + delete m_pageEffect; + } +} + +BOOL CEditCommand::PreTranslateMessage(MSG *pMsg) +//----------------------------------------------- +{ + if ((pMsg) && (pMsg->message == WM_KEYDOWN)) + { + if ((pMsg->wParam == VK_ESCAPE) || (pMsg->wParam == VK_RETURN) || (pMsg->wParam == VK_APPS)) + { + OnClose(); + return TRUE; + } + } + return CPropertySheet::PreTranslateMessage(pMsg); +} + + +BOOL CEditCommand::ShowEditWindow(UINT nPat, DWORD dwCursor) +//---------------------------------------------------------- +{ + CHAR s[64]; + CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); + UINT nRow = dwCursor >> 16; + UINT nChannel = (dwCursor & 0xFFFF) >> 3; + + if ((nPat >= pSndFile->Patterns.Size()) || (!m_pModDoc) + || (nRow >= pSndFile->Patterns[nPat].GetNumRows()) || (nChannel >= pSndFile->m_nChannels) + || (!pSndFile->Patterns[nPat])) return FALSE; + m_Command = pSndFile->Patterns[nPat][nRow * pSndFile->m_nChannels + nChannel]; + m_nRow = nRow; + m_nChannel = nChannel; + m_nPattern = nPat; + // Init Pages + if (m_pageNote) m_pageNote->Init(m_Command); + if (m_pageVolume) m_pageVolume->Init(m_Command); + + // -> CODE#0010 + // -> DESC="add extended parameter mechanism to pattern effects" + // if (m_pageEffect) m_pageEffect->Init(m_Command); + if (m_pageEffect){ + UINT xp = 0, ml = 1; + getXParam(m_Command.command,nPat,nRow,nChannel,pSndFile,&xp,&ml); + m_pageEffect->Init(m_Command); + m_pageEffect->XInit(xp,ml); + } + // -! NEW_FEATURE#0010 + + // Update Window Title + wsprintf(s, "Note Properties - Row %d, Channel %d", m_nRow, m_nChannel+1); + SetTitle(s); + // Activate Page + UINT nPage = 2; + dwCursor &= 7; + if (dwCursor < 2) nPage = 0; + else if (dwCursor < 3) nPage = 1; + SetActivePage(nPage); + if (m_pageNote) m_pageNote->UpdateDialog(); + if (m_pageVolume) m_pageVolume->UpdateDialog(); + if (m_pageEffect) m_pageEffect->UpdateDialog(); + //ShowWindow(SW_SHOW); + ShowWindow(SW_RESTORE); + return TRUE; +} + + +void CEditCommand::UpdateNote(UINT note, UINT instr) +//-------------------------------------------------- +{ + CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); + if ((m_nPattern >= pSndFile->Patterns.Size()) || (!m_pModDoc) + || (m_nRow >= pSndFile->Patterns[m_nPattern].GetNumRows()) + || (m_nChannel >= pSndFile->m_nChannels) + || (!pSndFile->Patterns[m_nPattern])) return; + MODCOMMAND *m = pSndFile->Patterns[m_nPattern]+m_nRow*pSndFile->m_nChannels+m_nChannel; + if ((m->note != note) || (m->instr != instr)) + { + if(!m_bModified) // let's create just one undo step. + { + m_pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, m_nChannel, m_nRow, 1, 1); + m_bModified = true; + } + m->note = note; + m->instr = instr; + m_Command = *m; + m_pModDoc->SetModified(); + // -> CODE#0008 + // -> DESC"#define to set pattern max size (number of rows) limit (now set to 1024 instead of 256)" + // m_pModDoc->UpdateAllViews(NULL, (m_nRow << 24) | HINT_PATTERNROW, NULL); + m_pModDoc->UpdateAllViews(NULL, (m_nRow << HINT_SHIFT_ROW) | HINT_PATTERNROW, NULL); + // -! BEHAVIOUR_CHANGE#0008 + } +} + + +void CEditCommand::UpdateVolume(UINT volcmd, UINT vol) +//---------------------------------------------------- +{ + CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); + if ((m_nPattern >= pSndFile->Patterns.Size()) || (!m_pModDoc) + || (m_nRow >= pSndFile->Patterns[m_nPattern].GetNumRows()) + || (m_nChannel >= pSndFile->m_nChannels) + || (!pSndFile->Patterns[m_nPattern])) return; + MODCOMMAND *m = pSndFile->Patterns[m_nPattern]+m_nRow*pSndFile->m_nChannels+m_nChannel; + if ((m->volcmd != volcmd) || (m->vol != vol)) + { + if(!m_bModified) // let's create just one undo step. + { + m_pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, m_nChannel, m_nRow, 1, 1); + m_bModified = true; + } + m->volcmd = volcmd; + m->vol = vol; + m_pModDoc->SetModified(); + // -> CODE#0008 + // -> DESC"#define to set pattern max size (number of rows) limit (now set to 1024 instead of 256)" + // m_pModDoc->UpdateAllViews(NULL, (m_nRow << 24) | HINT_PATTERNROW, NULL); + m_pModDoc->UpdateAllViews(NULL, (m_nRow << HINT_SHIFT_ROW) | HINT_PATTERNROW, NULL); + // -! BEHAVIOUR_CHANGE#0008 + } +} + + +void CEditCommand::UpdateEffect(UINT command, UINT param) +//------------------------------------------------------- +{ + CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); + if ((m_nPattern >= pSndFile->Patterns.Size()) || (!m_pModDoc) + || (m_nRow >= pSndFile->Patterns[m_nPattern].GetNumRows()) + || (m_nChannel >= pSndFile->m_nChannels) + || (!pSndFile->Patterns[m_nPattern])) return; + MODCOMMAND *m = pSndFile->Patterns[m_nPattern]+m_nRow*pSndFile->m_nChannels+m_nChannel; + + // -> CODE#0010 + // -> DESC="add extended parameter mechanism to pattern effects" + if(command == CMD_OFFSET || command == CMD_PATTERNBREAK || command == CMD_TEMPO || command == CMD_XPARAM){ + UINT xp = 0, ml = 1; + getXParam(command,m_nPattern,m_nRow,m_nChannel,pSndFile,&xp,&ml); + m_pageEffect->XInit(xp,ml); + m_pageEffect->UpdateDialog(); + } + // -! NEW_FEATURE#0010 + + if ((m->command != command) || (m->param != param)) + { + if(!m_bModified) // let's create just one undo step. + { + m_pModDoc->GetPatternUndo()->PrepareUndo(m_nPattern, m_nChannel, m_nRow, 1, 1); + m_bModified = true; + } + m->command = command; + m->param = param; + m_pModDoc->SetModified(); + // -> CODE#0008 + // -> DESC"#define to set pattern max size (number of rows) limit (now set to 1024 instead of 256)" + // m_pModDoc->UpdateAllViews(NULL, (m_nRow << 24) | HINT_PATTERNROW, NULL); + m_pModDoc->UpdateAllViews(NULL, (m_nRow << HINT_SHIFT_ROW) | HINT_PATTERNROW, NULL); + // -! BEHAVIOUR_CHANGE#0008 + } +} + + +void CEditCommand::OnActivate(UINT nState, CWnd *pWndOther, BOOL bMinimized) +//-------------------------------------------------------------------------- +{ + CWnd::OnActivate(nState, pWndOther, bMinimized); + if (nState == WA_INACTIVE) ShowWindow(SW_HIDE); +} + + +////////////////////////////////////////////////////////////////////////////////////// +// CPageEditCommand + +BOOL CPageEditCommand::OnInitDialog() +//----------------------------------- +{ + CPropertyPage::OnInitDialog(); + m_bInitialized = true; + UpdateDialog(); + return TRUE; +} + + +////////////////////////////////////////////////////////////////////////////////////// +// CPageEditNote + +BEGIN_MESSAGE_MAP(CPageEditNote, CPageEditCommand) + ON_CBN_SELCHANGE(IDC_COMBO1, OnNoteChanged) + ON_CBN_SELCHANGE(IDC_COMBO2, OnInstrChanged) +END_MESSAGE_MAP() + + +void CPageEditNote::UpdateDialog() +//-------------------------------- +{ + char s[64]; + CComboBox *combo; + CSoundFile *pSndFile; + + if ((!m_bInitialized) || (!m_pModDoc)) return; + pSndFile = m_pModDoc->GetSoundFile(); + // Note + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO1)) != NULL) + { + combo->ResetContent(); + combo->SetItemData(combo->AddString("No note"), 0); + AppendNotesToControlEx(*combo, pSndFile, m_nInstr); + + if (NOTE_IS_VALID(m_nNote)) + { + // Normal note / no note + const MODCOMMAND::NOTE noteStart = (pSndFile != nullptr) ? pSndFile->GetModSpecifications().noteMin : 1; + combo->SetCurSel(m_nNote - (noteStart - 1)); + } + else + { + // Special notes + for(int i = combo->GetCount() - 1; i >= 0; --i) + { + if(combo->GetItemData(i) == m_nNote) + { + combo->SetCurSel(i); + break; + } + } + } + + } + // Instrument + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO2)) != NULL) + { + combo->ResetContent(); + + if(MODCOMMAND::IsPcNote(m_nNote)) + { + // control plugin param note + combo->SetItemData(combo->AddString("No Effect"), 0); + AddPluginNamesToCombobox(*combo, pSndFile->m_MixPlugins, false); + } else + { + // instrument / sample + combo->SetItemData(combo->AddString("No Instrument"), 0); + const UINT nmax = pSndFile->GetNumInstruments() ? pSndFile->GetNumInstruments() : pSndFile->GetNumSamples(); + for (UINT i = 1; i <= nmax; i++) + { + wsprintf(s, "%02d: ", i); + int k = strlen(s); + // instrument / sample + if (pSndFile->GetNumInstruments()) + { + if (pSndFile->Instruments[i]) + memcpy(s+k, pSndFile->Instruments[i]->name, 32); + } else + memcpy(s+k, pSndFile->m_szNames[i], MAX_SAMPLENAME); + s[k+32] = 0; + combo->SetItemData(combo->AddString(s), i); + } + } + combo->SetCurSel(m_nInstr); + } +} + + +void CPageEditNote::OnNoteChanged() +//--------------------------------- +{ + const bool bWasParamControl = MODCOMMAND::IsPcNote(m_nNote); + + CComboBox *combo; + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO1)) != NULL) + { + int n = combo->GetCurSel(); + if (n >= 0) m_nNote = combo->GetItemData(n); + } + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO2)) != NULL) + { + int n = combo->GetCurSel(); + if(n >= 0) + { + const UINT oldInstr = m_nInstr; + CSoundFile* pSndFile = m_pModDoc->GetSoundFile(); + m_nInstr = combo->GetItemData(n); + //Checking whether note names should be recreated. + if(pSndFile && pSndFile->Instruments[m_nInstr] && pSndFile->Instruments[oldInstr]) + { + if(pSndFile->Instruments[m_nInstr]->pTuning != pSndFile->Instruments[oldInstr]->pTuning) + UpdateDialog(); + } + } + } + const bool bIsNowParamControl = MODCOMMAND::IsPcNote(m_nNote); + if(bWasParamControl != bIsNowParamControl) + UpdateDialog(); + + if (m_pParent) m_pParent->UpdateNote(m_nNote, m_nInstr); +} + + +void CPageEditNote::OnInstrChanged() +//---------------------------------- +{ + OnNoteChanged(); +} + + +////////////////////////////////////////////////////////////////////////////////////// +// CPageEditVolume + +BEGIN_MESSAGE_MAP(CPageEditVolume, CPageEditCommand) + ON_WM_HSCROLL() + ON_CBN_SELCHANGE(IDC_COMBO1, OnVolCmdChanged) +END_MESSAGE_MAP() + + +void CPageEditVolume::UpdateDialog() +//---------------------------------- +{ + CComboBox *combo; + + if ((!m_bInitialized) || (!m_pModDoc)) return; + UpdateRanges(); + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO1)) != NULL) + { + CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); + if (pSndFile->m_nType == MOD_TYPE_MOD || m_bIsParamControl) + { + combo->EnableWindow(FALSE); + return; + } + combo->EnableWindow(TRUE); + combo->ResetContent(); + UINT count = m_pModDoc->GetNumVolCmds(); + combo->SetItemData(combo->AddString(" None"), (DWORD)-1); + combo->SetCurSel(0); + UINT fxndx = m_pModDoc->GetIndexFromVolCmd(m_nVolCmd); + for (UINT i=0; i<count; i++) + { + CHAR s[64]; + if (m_pModDoc->GetVolCmdInfo(i, s)) + { + int k = combo->AddString(s); + combo->SetItemData(k, i); + if (i == fxndx) combo->SetCurSel(k); + } + } + } +} + + +void CPageEditVolume::UpdateRanges() +//---------------------------------- +{ + CSliderCtrl *slider = (CSliderCtrl *)GetDlgItem(IDC_SLIDER1); + if ((slider) && (m_pModDoc)) + { + DWORD rangeMin = 0, rangeMax = 0; + LONG fxndx = m_pModDoc->GetIndexFromVolCmd(m_nVolCmd); + BOOL bOk = m_pModDoc->GetVolCmdInfo(fxndx, NULL, &rangeMin, &rangeMax); + if ((bOk) && (rangeMax > rangeMin)) + { + slider->EnableWindow(TRUE); + slider->SetRange(rangeMin, rangeMax); + UINT pos = m_nVolume; + if (pos < rangeMin) pos = rangeMin; + if (pos > rangeMax) pos = rangeMax; + slider->SetPos(pos); + } else + { + slider->EnableWindow(FALSE); + } + } +} + + +void CPageEditVolume::OnVolCmdChanged() +//------------------------------------- +{ + CComboBox *combo; + CSliderCtrl *slider; + if (((combo = (CComboBox *)GetDlgItem(IDC_COMBO1)) != NULL) && (m_pModDoc)) + { + int n = combo->GetCurSel(); + if (n >= 0) + { + UINT volcmd = m_pModDoc->GetVolCmdFromIndex(combo->GetItemData(n)); + if (volcmd != m_nVolCmd) + { + m_nVolCmd = volcmd; + UpdateRanges(); + } + } + } + if ((slider = (CSliderCtrl *)GetDlgItem(IDC_SLIDER1)) != NULL) + { + m_nVolume = slider->GetPos(); + } + if (m_pParent) m_pParent->UpdateVolume(m_nVolCmd, m_nVolume); +} + + +void CPageEditVolume::OnHScroll(UINT, UINT, CScrollBar *) +//------------------------------------------------------- +{ + OnVolCmdChanged(); +} + + +////////////////////////////////////////////////////////////////////////////////////// +// CPageEditEffect + +BEGIN_MESSAGE_MAP(CPageEditEffect, CPageEditCommand) + ON_WM_HSCROLL() + ON_CBN_SELCHANGE(IDC_COMBO1, OnCommandChanged) +END_MESSAGE_MAP() + + +void CPageEditEffect::UpdateDialog() +//---------------------------------- +{ + CHAR s[128]; + CComboBox *combo; + CSoundFile *pSndFile; + + if ((!m_pModDoc) || (!m_bInitialized)) return; + pSndFile = m_pModDoc->GetSoundFile(); + if ((combo = (CComboBox *)GetDlgItem(IDC_COMBO1)) != NULL) + { + combo->ResetContent(); + if(m_bIsParamControl) + { + // plugin param control note + AddPluginParameternamesToCombobox(*combo, pSndFile->m_MixPlugins[m_nPlugin]); + combo->SetCurSel(m_nPluginParam); + } else + { + // process as effect + UINT numfx = m_pModDoc->GetNumEffects(); + UINT fxndx = m_pModDoc->GetIndexFromEffect(m_nCommand, m_nParam); + combo->SetItemData(combo->AddString(" None"), (DWORD)-1); + if (!m_nCommand) combo->SetCurSel(0); + for (UINT i=0; i<numfx; i++) + { + if (m_pModDoc->GetEffectInfo(i, s, true)) + { + int k = combo->AddString(s); + combo->SetItemData(k, i); + if (i == fxndx) combo->SetCurSel(k); + } + } + } + } + UpdateRange(FALSE); +} + + +void CPageEditEffect::UpdateRange(BOOL bSet) +//------------------------------------------ +{ + CSliderCtrl *slider = (CSliderCtrl *)GetDlgItem(IDC_SLIDER1); + if ((slider) && (m_pModDoc)) + { + DWORD rangeMin = 0, rangeMax = 0; + LONG fxndx = m_pModDoc->GetIndexFromEffect(m_nCommand, m_nParam); + bool bEnable = ((fxndx >= 0) && (m_pModDoc->GetEffectInfo(fxndx, NULL, false, &rangeMin, &rangeMax))); + if (bEnable) + { + slider->EnableWindow(TRUE); + slider->SetPageSize(1); + slider->SetRange(rangeMin, rangeMax); + DWORD pos = m_pModDoc->MapValueToPos(fxndx, m_nParam); + if (pos > rangeMax) pos = rangeMin | (pos & 0x0F); + if (pos < rangeMin) pos = rangeMin; + if (pos > rangeMax) pos = rangeMax; + slider->SetPos(pos); + } else + { + slider->SetRange(0,0); + slider->EnableWindow(FALSE); + } + UpdateValue(bSet); + } +} + + +void CPageEditEffect::UpdateValue(BOOL bSet) +//------------------------------------------ +{ + if (m_pModDoc) + { + CHAR s[128] = ""; + LONG fxndx = m_pModDoc->GetIndexFromEffect(m_nCommand, m_nParam); + // -> CODE#0010 + // -> DESC="add extended parameter mechanism to pattern effects" + // if (fxndx >= 0) m_pModDoc->GetEffectNameEx(s, fxndx, m_nParam); + if (fxndx >= 0) m_pModDoc->GetEffectNameEx(s, fxndx, m_nParam * m_nMultiplier + m_nXParam); + // -! NEW_FEATURE#0010 + SetDlgItemText(IDC_TEXT1, s); + } + if ((m_pParent) && (bSet)) m_pParent->UpdateEffect(m_nCommand, m_nParam); +} + + +void CPageEditEffect::OnCommandChanged() +//-------------------------------------- +{ + CComboBox *combo; + + if (((combo = (CComboBox *)GetDlgItem(IDC_COMBO1)) != NULL) && (m_pModDoc)) + { + BOOL bSet = FALSE; + int n = combo->GetCurSel(); + if (n >= 0) + { + int param = -1, ndx = combo->GetItemData(n); + m_nCommand = (ndx >= 0) ? m_pModDoc->GetEffectFromIndex(ndx, param) : 0; + if (param >= 0) m_nParam = param; + bSet = TRUE; + } + UpdateRange(bSet); + } +} + + + +void CPageEditEffect::OnHScroll(UINT, UINT, CScrollBar *) +//------------------------------------------------------- +{ + CSliderCtrl *slider = (CSliderCtrl *)GetDlgItem(IDC_SLIDER1); + if ((slider) && (m_pModDoc)) + { + LONG fxndx = m_pModDoc->GetIndexFromEffect(m_nCommand, m_nParam); + if (fxndx >= 0) + { + int pos = slider->GetPos(); + UINT param = m_pModDoc->MapPosToValue(fxndx, pos); + if (param != m_nParam) + { + m_nParam = param; + UpdateValue(TRUE); + } + } + } +} + + +//////////////////////////////////////////////////////////////////////////////////////////// +// Chord Editor + +BEGIN_MESSAGE_MAP(CChordEditor, CDialog) + ON_MESSAGE(WM_MOD_KBDNOTIFY, OnKeyboardNotify) + ON_CBN_SELCHANGE(IDC_COMBO1, OnChordChanged) + ON_CBN_SELCHANGE(IDC_COMBO2, OnBaseNoteChanged) + ON_CBN_SELCHANGE(IDC_COMBO3, OnNote1Changed) + ON_CBN_SELCHANGE(IDC_COMBO4, OnNote2Changed) + ON_CBN_SELCHANGE(IDC_COMBO5, OnNote3Changed) +END_MESSAGE_MAP() + + +void CChordEditor::DoDataExchange(CDataExchange* pDX) +//--------------------------------------------------- +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CChordEditor) + DDX_Control(pDX, IDC_KEYBOARD1, m_Keyboard); + DDX_Control(pDX, IDC_COMBO1, m_CbnShortcut); + DDX_Control(pDX, IDC_COMBO2, m_CbnBaseNote); + DDX_Control(pDX, IDC_COMBO3, m_CbnNote1); + DDX_Control(pDX, IDC_COMBO4, m_CbnNote2); + DDX_Control(pDX, IDC_COMBO5, m_CbnNote3); + //}}AFX_DATA_MAP +} + + +BOOL CChordEditor::OnInitDialog() +//------------------------------- +{ + CMainFrame *pMainFrm; + CHAR s[128]; + + CDialog::OnInitDialog(); + m_Keyboard.Init(m_hWnd, 2); + pMainFrm = CMainFrame::GetMainFrame(); + if (!pMainFrm) return TRUE; + // Fills the shortcut key combo box + AppendNotesToControl(m_CbnShortcut, 0, 3*12-1); + + m_CbnShortcut.SetCurSel(0); + // Base Note combo box + AppendNotesToControl(m_CbnBaseNote, 0, 3*12-1); + + // Minor notes + for (int inotes=-1; inotes<24; inotes++) + { + if (inotes < 0) strcpy(s, "--"); else + if (inotes < 12) wsprintf(s, "%s", szNoteNames[inotes % 12]); + else wsprintf(s, "%s (+%d)", szNoteNames[inotes % 12], inotes / 12); + m_CbnNote1.AddString(s); + m_CbnNote2.AddString(s); + m_CbnNote3.AddString(s); + } + // Update Dialog + OnChordChanged(); + return TRUE; +} + + +LRESULT CChordEditor::OnKeyboardNotify(WPARAM wParam, LPARAM nKey) +//---------------------------------------------------------------- +{ + CMainFrame *pMainFrm; + MPTCHORD *pChords; + int chord; + + if (wParam != KBDNOTIFY_LBUTTONDOWN) return 0; + if ((pMainFrm = CMainFrame::GetMainFrame()) == NULL) return 0; + pChords = pMainFrm->GetChords(); + chord = m_CbnShortcut.GetCurSel(); + if (chord >= 0) chord = m_CbnShortcut.GetItemData(chord); + if ((chord < 0) || (chord >= 3*12)) chord = 0; + UINT cnote = NOTE_NONE; + pChords[chord].notes[0] = NOTE_NONE; + pChords[chord].notes[1] = NOTE_NONE; + pChords[chord].notes[2] = NOTE_NONE; + for (UINT i=0; i<2*12; i++) if (i != (UINT)(pChords[chord].key % 12)) + { + UINT n = m_Keyboard.GetFlags(i); + if (i == (UINT)nKey) n = (n) ? 0 : 1; + if (n) + { + if ((cnote < 3) || (i == (UINT)nKey)) + { + UINT k = (cnote < 3) ? cnote : 2; + pChords[chord].notes[k] = i+1; + if (cnote < 3) cnote++; + } + } + } + OnChordChanged(); + return 0; +} + + +void CChordEditor::OnChordChanged() +//--------------------------------- +{ + CMainFrame *pMainFrm; + MPTCHORD *pChords; + int chord; + + if ((pMainFrm = CMainFrame::GetMainFrame()) == NULL) return; + pChords = pMainFrm->GetChords(); + chord = m_CbnShortcut.GetCurSel(); + if (chord >= 0) chord = m_CbnShortcut.GetItemData(chord); + if ((chord < 0) || (chord >= 3*12)) chord = 0; + m_CbnBaseNote.SetCurSel(pChords[chord].key); + m_CbnNote1.SetCurSel(pChords[chord].notes[0]); + m_CbnNote2.SetCurSel(pChords[chord].notes[1]); + m_CbnNote3.SetCurSel(pChords[chord].notes[2]); + UpdateKeyboard(); +} + + +void CChordEditor::UpdateKeyboard() +//--------------------------------- +{ + CMainFrame *pMainFrm; + MPTCHORD *pChords; + int chord; + UINT note, octave; + + if ((pMainFrm = CMainFrame::GetMainFrame()) == NULL) return; + pChords = pMainFrm->GetChords(); + chord = m_CbnShortcut.GetCurSel(); + if (chord >= 0) chord = m_CbnShortcut.GetItemData(chord); + if ((chord < 0) || (chord >= 3*12)) chord = 0; + note = pChords[chord].key % 12; + octave = pChords[chord].key / 12; + for (UINT i=0; i<2*12; i++) + { + BOOL b = FALSE; + + if (i == note) b = TRUE; + if ((pChords[chord].notes[0]) && (i+1 == pChords[chord].notes[0])) b = TRUE; + if ((pChords[chord].notes[1]) && (i+1 == pChords[chord].notes[1])) b = TRUE; + if ((pChords[chord].notes[2]) && (i+1 == pChords[chord].notes[2])) b = TRUE; + m_Keyboard.SetFlags(i, (b) ? 1 : 0); + } + m_Keyboard.InvalidateRect(NULL, FALSE); +} + + +void CChordEditor::OnBaseNoteChanged() +//------------------------------------ +{ + CMainFrame *pMainFrm; + MPTCHORD *pChords; + + if ((pMainFrm = CMainFrame::GetMainFrame()) == NULL) return; + pChords = pMainFrm->GetChords(); + int chord = m_CbnShortcut.GetCurSel(); + if (chord >= 0) chord = m_CbnShortcut.GetItemData(chord); + if ((chord < 0) || (chord >= 3*12)) chord = 0; + int basenote = m_CbnBaseNote.GetCurSel(); + if (basenote >= 0) + { + pChords[chord].key = (BYTE)basenote; + UpdateKeyboard(); + } +} + + +void CChordEditor::OnNote1Changed() +//--------------------------------- +{ + CMainFrame *pMainFrm; + MPTCHORD *pChords; + + if ((pMainFrm = CMainFrame::GetMainFrame()) == NULL) return; + pChords = pMainFrm->GetChords(); + int chord = m_CbnShortcut.GetCurSel(); + if (chord >= 0) chord = m_CbnShortcut.GetItemData(chord); + if ((chord < 0) || (chord >= 3*12)) chord = 0; + int note = m_CbnNote1.GetCurSel(); + if (note >= 0) + { + pChords[chord].notes[0] = (BYTE)note; + UpdateKeyboard(); + } +} + + +void CChordEditor::OnNote2Changed() +//--------------------------------- +{ + CMainFrame *pMainFrm; + MPTCHORD *pChords; + + if ((pMainFrm = CMainFrame::GetMainFrame()) == NULL) return; + pChords = pMainFrm->GetChords(); + int chord = m_CbnShortcut.GetCurSel(); + if (chord >= 0) chord = m_CbnShortcut.GetItemData(chord); + if ((chord < 0) || (chord >= 3*12)) chord = 0; + int note = m_CbnNote2.GetCurSel(); + if (note >= 0) + { + pChords[chord].notes[1] = (BYTE)note; + UpdateKeyboard(); + } +} + + +void CChordEditor::OnNote3Changed() +//--------------------------------- +{ + CMainFrame *pMainFrm; + MPTCHORD *pChords; + + if ((pMainFrm = CMainFrame::GetMainFrame()) == NULL) return; + pChords = pMainFrm->GetChords(); + int chord = m_CbnShortcut.GetCurSel(); + if (chord >= 0) chord = m_CbnShortcut.GetItemData(chord); + if ((chord < 0) || (chord >= 3*12)) chord = 0; + int note = m_CbnNote3.GetCurSel(); + if (note >= 0) + { + pChords[chord].notes[2] = (BYTE)note; + UpdateKeyboard(); + } +} + + +//////////////////////////////////////////////////////////////////////////////////////////// +// Keyboard Split Settings (pattern editor) + +BEGIN_MESSAGE_MAP(CSplitKeyboadSettings, CDialog) + ON_CBN_SELCHANGE(IDC_COMBO_OCTAVEMODIFIER, OnOctaveModifierChanged) +END_MESSAGE_MAP() + + +void CSplitKeyboadSettings::DoDataExchange(CDataExchange* pDX) +//------------------------------------------------------------ +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CSplitKeyboadSettings) + DDX_Control(pDX, IDC_COMBO_SPLITINSTRUMENT, m_CbnSplitInstrument); + DDX_Control(pDX, IDC_COMBO_SPLITNOTE, m_CbnSplitNote); + DDX_Control(pDX, IDC_COMBO_OCTAVEMODIFIER, m_CbnOctaveModifier); + DDX_Control(pDX, IDC_COMBO_SPLITVOLUME, m_CbnSplitVolume); + //}}AFX_DATA_MAP +} + + +BOOL CSplitKeyboadSettings::OnInitDialog() +//---------------------------------------- +{ + if(!m_pSndFile || m_pSndFile->GetpModDoc() == nullptr) return FALSE; + + CDialog::OnInitDialog(); + + CHAR s[64]; + + // Split Notes + AppendNotesToControl(m_CbnSplitNote, 0, NOTE_MAX - 1); + m_CbnSplitNote.SetCurSel(m_pOptions->splitNote); + + // Octave modifier + for(int i = -SPLIT_OCTAVE_RANGE; i < SPLIT_OCTAVE_RANGE + 1; i++){ + wsprintf(s,i < 0 ? "Octave -%d" : i > 0 ? "Octave +%d" : "No Change", abs(i)); + int n = m_CbnOctaveModifier.AddString(s); + m_CbnOctaveModifier.SetItemData(n, i); + } + + m_CbnOctaveModifier.SetCurSel(m_pOptions->octaveModifier + SPLIT_OCTAVE_RANGE); + CheckDlgButton(IDC_PATTERN_OCTAVELINK, (m_pOptions->octaveLink && m_pOptions->octaveModifier != 0) ? MF_CHECKED : MF_UNCHECKED); + + // Volume + m_CbnSplitVolume.AddString("No Change"); + m_CbnSplitVolume.SetItemData(0, 0); + for(int i = 1; i <= 64 ; i++){ + wsprintf(s,"%d",i); + int n = m_CbnSplitVolume.AddString(s); + m_CbnSplitVolume.SetItemData(n, i); + } + m_CbnSplitVolume.SetCurSel(m_pOptions->splitVolume); + + // Instruments + m_CbnSplitInstrument.ResetContent(); + m_CbnSplitInstrument.SetItemData(m_CbnSplitInstrument.AddString("No Instrument"), 0); + + if (m_pSndFile->m_nInstruments) { + for (INSTRUMENTINDEX nIns = 1; nIns <= m_pSndFile->m_nInstruments; nIns++) + { + if (m_pSndFile->Instruments[nIns] == nullptr) + continue; + + CString displayName = m_pSndFile->GetpModDoc()->GetPatternViewInstrumentName(nIns); + int n = m_CbnSplitInstrument.AddString(displayName); + m_CbnSplitInstrument.SetItemData(n, nIns); + } + } else + { + for (SAMPLEINDEX nSmp = 1; nSmp <= m_pSndFile->m_nSamples; nSmp++) + { + if ((m_pSndFile->m_szNames[nSmp][0]) || (m_pSndFile->Samples[nSmp].pSample)) + { + wsprintf(s, "%02d: %s", nSmp, m_pSndFile->m_szNames[nSmp]); + int n = m_CbnSplitInstrument.AddString(s); + m_CbnSplitInstrument.SetItemData(n, nSmp); + } + } + } + m_CbnSplitInstrument.SetCurSel(m_pOptions->splitInstrument); + + return TRUE; +} + + +void CSplitKeyboadSettings::OnOK() +//-------------------------------- +{ + CDialog::OnOK(); + + m_pOptions->splitNote = m_CbnSplitNote.GetCurSel(); + m_pOptions->octaveModifier = m_CbnOctaveModifier.GetCurSel() - SPLIT_OCTAVE_RANGE; + m_pOptions->octaveLink = (IsDlgButtonChecked(IDC_PATTERN_OCTAVELINK) == TRUE) ? true : false; + m_pOptions->splitVolume = m_CbnSplitVolume.GetCurSel(); + m_pOptions->splitInstrument = m_CbnSplitInstrument.GetItemData(m_CbnSplitInstrument.GetCurSel()); +} + + +void CSplitKeyboadSettings::OnCancel() +//------------------------------------ +{ + CDialog::OnCancel(); +} + + +void CSplitKeyboadSettings::OnOctaveModifierChanged() +//--------------------------------------------------- +{ + CheckDlgButton(IDC_PATTERN_OCTAVELINK, (m_CbnOctaveModifier.GetCurSel() != 9) ? MF_CHECKED : MF_UNCHECKED); +} + + +/////////////////////////////////////////////////////////// +// Rename a channel from pattern editor + +BOOL CChannelRenameDlg::OnInitDialog() +//------------------------------------ +{ + CDialog::OnInitDialog(); + + CHAR s[32]; + wsprintf(s, "Set name for channel %d:", m_nChannel); + SetDlgItemText(IDC_STATIC_CHANNEL_NAME, s); + SetDlgItemText(IDC_EDIT_CHANNEL_NAME, m_sName); + ((CEdit*)(GetDlgItem(IDC_EDIT_CHANNEL_NAME)))->LimitText(MAX_CHANNELNAME - 1); + + return TRUE; +} + + +void CChannelRenameDlg::OnOK() +//---------------------------- +{ + CHAR sNewName[MAX_CHANNELNAME]; + GetDlgItemText(IDC_EDIT_CHANNEL_NAME, sNewName, MAX_CHANNELNAME); + if(!strcmp(sNewName, m_sName)) + { + bChanged = false; + CDialog::OnCancel(); + } else + { + strcpy(m_sName, sNewName); + bChanged = true; + CDialog::OnOK(); + } +} Added: trunk/OpenMPT/mptrack/PatternEditorDialogs.h =================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.h (rev 0) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.h 2011-03-07 00:21:50 UTC (rev 809) @@ -0,0 +1,356 @@ +/* + * PatternEditorDialogs.h + * ---------------------- + * Purpose: Header file for misc pattern editor dialog functionality + * Notes : (currently none) + * Authors: Olivier Lapicque + * OpenMPT Devs + */ + +#ifndef PATTERNEDITORDIALOGS_H +#define PATTERNEDITORDIALOGS_H +#pragma once + +#include "dlg_misc.h" // for keyboard control +#include "Moddoc.h" // for SplitKeyboardSettings + + +///////////////////////////////////////////////////////////////////////// +// Search/Replace + +#define PATSEARCH_NOTE 0x01 // Search for note +#define PATSEARCH_INSTR 0x02 // Search for instrument +#define PATSEARCH_VOLCMD 0x04 // Search for volume effect +#define PATSEARCH_VOLUME 0x08 // Search for volume +#define PATSEARCH_COMMAND 0x10 // Search for effect +#define PATSEARCH_PARAM 0x20 // Search for effect parameter +#define PATSEARCH_CHANNEL 0x40 // Limit search to channels +#define PATSEARCH_FULLSEARCH 0x100 // Search whole song +#define PATSEARCH_PATSELECTION 0x200 // Search in current pattern selection +#define PATSEARCH_REPLACE 0x400 // Replace +#define PATSEARCH_REPLACEALL 0x800 // Replace all + +//========================================= +class CFindReplaceTab: public CPropertyPage +//========================================= +{ +protected: + BOOL m_bReplace; + CModDoc *m_pModDoc; + +public: + UINT m_nNote, m_nInstr, m_nVolCmd, m_nVol, m_nCommand, m_nParam; + CHANNELINDEX m_nMinChannel, m_nMaxChannel; + signed char cInstrRelChange; + bool m_bPatSel; + DWORD m_dwFlags; + + enum findItem + { + findAny = NOTE_MIN_SPECIAL - 1 + }; + + + enum replaceItem + { + replaceNotePlusOne = NOTE_MAX + 1, + replaceNoteMinusOne = NOTE_MAX + 2, + replaceNotePlusOctave = NOTE_MAX + 3, + replaceNoteMinusOctave = NOTE_MAX + 4, + + replaceInstrumentPlusOne = MAX_INSTRUMENTS + 1, + replaceInstrumentMinusOne = MAX_INSTRUMENTS + 2, + }; + + // Make sure there's unused notes between NOTE_MAX and NOTE_MIN_SPECIAL. + STATIC_ASSERT(NOTE_MIN_SPECIAL - 4 > NOTE_MAX); + +protected: + void ChangeEffect(); + +public: + CFindReplaceTab(UINT nIDD, BOOL bReplaceTab, CModDoc *pModDoc):CPropertyPage(nIDD) { m_bReplace = bReplaceTab; m_pModDoc = pModDoc; } + +protected: + virtual BOOL OnInitDialog(); + virtual void OnOK(); + + // When a combobox is focussed, check the corresponding checkbox. + void CheckOnChange(int nIDButton) { CheckDlgButton(nIDButton, BST_CHECKED); CheckReplace(nIDButton); }; + afx_msg void OnNoteChanged() { CheckOnChange(IDC_CHECK1); }; + afx_msg void OnInstrChanged() { CheckOnChange(IDC_CHECK2); }; + afx_msg void OnVolCmdChanged() { CheckOnChange(IDC_CHECK3); }; + afx_msg void OnVolumeChanged() { CheckOnChange(IDC_CHECK4); }; + afx_msg void OnEffectChanged() { CheckOnChange(IDC_CHECK5); ChangeEffect(); }; + afx_msg void OnParamChanged() { CheckOnChange(IDC_CHECK6); }; + // When a checkbox is checked, also check "Replace By". + afx_msg void OnCheckNote() { CheckReplace(IDC_CHECK1); }; + afx_msg void OnCheckInstr() { CheckReplace(IDC_CHECK2); }; + afx_msg void OnCheckVolCmd() { CheckReplace(IDC_CHECK3); }; + afx_msg void OnCheckVolume() { CheckReplace(IDC_CHECK4); }; + afx_msg void OnCheckEffect() { CheckReplace(IDC_CHECK5); }; + afx_msg void OnCheckParam() { CheckReplace(IDC_CHECK6); }; + // Check "Replace By" + afx_msg void CheckReplace(int nIDButton) { if(m_bReplace && IsDlgButtonChecked(nIDButton)) CheckDlgButton(IDC_CHECK7, BST_CHECKED); }; + + afx_msg void OnCheckChannelSearch(); + DECLARE_MESSAGE_MAP() +}; + + +//========================================= +class CPatternPropertiesDlg: public CDialog +//========================================= +{ +protected: + CModDoc *m_pModDoc; + UINT m_nPattern; + +public: + CPatternPropertiesDlg(CModDoc *pModDoc, UINT nPat, CWnd *parent=NULL):CDialog(IDD_PATTERN_PROPERTIES, parent) { m_pModDoc = pModDoc; m_nPattern = nPat; } + +protected: + virtual BOOL OnInitDialog(); + virtual void OnOK(); + afx_msg void OnHalfRowNumber(); + afx_msg void OnDoubleRowNumber(); + afx_msg void OnOverrideSignature(); + DECLARE_MESSAGE_MAP() +}; + + +////////////////////////////////////////////////////////////////////////// +// Command Editing + +class CEditCommand; +class CPageEditCommand; + +//========================================== +class CPageEditCommand: public CPropertyPage +//========================================== +{ +protected: + CModDoc *m_pModDoc; + CEditCommand *m_pParent; + bool m_bInitialized; + +public: + CPageEditCommand(CModDoc *pModDoc, CEditCommand *parent, UINT id):CPropertyPage(id) { m_pModDoc = pModDoc; m_pParent = parent; m_bInitialized = false; } + virtual ~CPageEditCommand() {} + virtual BOOL OnInitDialog(); + virtual void Init(MODCOMMAND&)=0; + virtual void UpdateDialog() {} +}; + + +//========================================== +class CPageEditNote: public CPageEditCommand +//========================================== +{ +protected: + UINT m_nNote, m_nInstr; + +public: + CPageEditNote(CModDoc *pModDoc, CEditCommand *parent):CPageEditCommand(pModDoc, parent, IDD_PAGEEDITNOTE) {} + void Init(MODCOMMAND &m) { m_nNote = m.note; m_nInstr = m.instr; } + void UpdateDialog(); + +protected: + //{{AFX_MSG(CPageEditNote) + afx_msg void OnNoteChanged(); + afx_msg void OnInstrChanged(); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + + +//============================================ +class CPageEditVolume: public CPageEditCommand +//============================================ +{ +protected: + UINT m_nVolCmd, m_nVolume; + bool m_bIsParamControl; + +public: + CPageEditVolume(CModDoc *pModDoc, CEditCommand *parent):CPageEditCommand(pModDoc, parent, IDD_PAGEEDITVOLUME) {} + void Init(MODCOMMAND &m) { m_nVolCmd = m.volcmd; m_nVolume = m.vol; m_bIsParamControl = (m.IsPcNote()) ? true : false;} + void UpdateDialog(); + void UpdateRanges(); + +protected: + //{{AFX_MSG(CPageEditVolume) + afx_msg void OnVolCmdChanged(); + afx_msg void OnHScroll(UINT, UINT, CScrollBar *); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + + +//============================================ +class CPageEditEffect: public CPageEditCommand +//============================================ +{ +protected: + UINT m_nCommand, m_nParam, m_nPlugin; + UINT m_nPluginParam; + bool m_bIsParamControl; + // -> CODE#0010 + // -> DESC="add extended parameter mechanism to pattern effects" + UINT m_nXParam, m_nMultiplier; + // -! NEW_FEATURE#0010 + + MODCOMMAND* m_pModcommand; + +public: + CPageEditEffect(CModDoc *pModDoc, CEditCommand *parent):CPageEditCommand(pModDoc, parent, IDD_PAGEEDITEFFECT) {} + // -> CODE#0010 + // -> DESC="add extended parameter mechanism to pattern effects" + void Init(MODCOMMAND &m) { m_nCommand = m.command; m_nParam = m.param; m_pModcommand = &m; m_bIsParamControl = (m.IsPcNote()) ? true : false; m_nPlugin = m.instr; m_nPluginParam = MODCOMMAND::GetValueVolCol(m.volcmd, m.vol);} + void XInit(UINT xparam = 0, UINT multiplier = 1) { m_nXParam = xparam; m_nMultiplier = multiplier; } + // -! NEW_FEATURE#0010 + void UpdateDialog(); + void UpdateRange(BOOL bSet); + void UpdateValue(BOOL bSet); + +protected: + //{{AFX_MSG(CPageEditEffect) + afx_msg void OnCommandChanged(); + afx_msg void OnHScroll(UINT, UINT, CScrollBar *); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + + + +//======================================= +class CEditCommand: public CPropertySheet +//======================================= +{ +protected: + CPageEditNote *m_pageNote; + CPageEditVolume *m_pageVolume; + CPageEditEffect *m_pageEffect; + CModDoc *m_pModDoc; + HWND m_hWndView; + UINT m_nPattern, m_nRow, m_nChannel; + MODCOMMAND m_Command; + bool m_bModified; + +public: + CEditCommand(); + +public: + BOOL SetParent(CWnd *parent, CModDoc *pModDoc); + BOOL ShowEditWindow(UINT nPat, DWORD dwCursor); + // -> CODE#0010 + // -> DESC="add extended parameter mechanism to pattern effects" + void OnSelListChange(); + // -! NEW_FEATURE#0010 + void UpdateNote(UINT note, UINT instr); + void UpdateVolume(UINT volcmd, UINT vol); + void UpdateEffect(UINT command, UINT param); + +protected: + //{{AFX_VIRTUAL(CEditCommand) + virtual void OnOK() { ShowWindow(SW_HIDE); } + virtual void OnCancel() { ShowWindow(SW_HIDE); } + virtual BOOL PreTranslateMessage(MSG *pMsg); + //}}AFX_VIRTUAL + //{{AFX_MSG(CEditCommand) + afx_msg void OnActivate(UINT nState, CWnd *pWndOther, BOOL bMinimized); + afx_msg void OnClose() { ShowWindow(SW_HIDE); } + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +public: + afx_msg void OnDestroy(); +}; + + +///////////////////////////////////////////////////////////////////////// +// Chord Editor + +//================================ +class CChordEditor: public CDialog +//================================ +{ +protected: + CKeyboardControl m_Keyboard; + CComboBox m_CbnShortcut, m_CbnBaseNote, m_CbnNote1, m_CbnNote2, m_CbnNote3; + +public: + CChordEditor(CWnd *parent=NULL):CDialog(IDD_CHORDEDIT, parent) {} + +protected: + virtual void DoDataExchange(CDataExchange* pDX); + virtual BOOL OnInitDialog(); + void UpdateKeyboard(); + afx_msg LRESULT OnKeyboardNotify(WPARAM, LPARAM); + afx_msg void OnChordChanged(); + afx_msg void OnBaseNoteChanged(); + afx_msg void OnNote1Changed(); + afx_msg void OnNote2Changed(); + afx_msg void OnNote3Changed(); + DECLARE_MESSAGE_MAP() +}; + + +///////////////////////////////////////////////////////////////////////// +// Keyboard Split Settings (pattern editor) + +//========================================= +class CSplitKeyboadSettings: public CDialog +//========================================= +{ +protected: + CComboBox m_CbnSplitInstrument, m_CbnSplitNote, m_CbnOctaveModifier, m_CbnSplitVolume; + CSoundFile *m_pSndFile; + +public: + SplitKeyboardSettings *m_pOptions; + + CSplitKeyboadSettings(CWnd *parent, CSoundFile *pSndFile, SplitKeyboardSettings *pOptions):CDialog(IDD_KEYBOARD_SPLIT, parent) + { + m_pSndFile = pSndFile; + m_pOptions = pOptions; + } + +protected: + virtual void DoDataExchange(CDataExchange* pDX); + virtual BOOL OnInitDialog(); + virtual void OnOK(); + virtual void OnCancel(); + + afx_msg void OnOctaveModifierChanged(); + + DECLARE_MESSAGE_MAP() +}; + + +///////////////////////////////////////////////////////////////////////// +// Rename a channel from pattern editor + +//===================================== +class CChannelRenameDlg: public CDialog +//===================================== +{ +protected: + CHANNELINDEX m_nChannel; + +public: + CHAR m_sName[MAX_CHANNELNAME]; + bool bChanged; + +public: + CChannelRenameDlg(CWnd *parent, CHAR *sName, CHANNELINDEX nChannel) : CDialog(IDD_CHANNEL_NAME, parent) + { + strcpy(m_sName, sName); + m_nChannel = nChannel; + bChanged = false; + } + + virtual BOOL OnInitDialog(); + virtual void OnOK(); +}; + +#endif Added: trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp =================================================================== --- trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp (rev 0) +++ trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp 2011-03-07 00:21:50 UTC (rev 809) @@ -0,0 +1,172 @@ +/* + * + * SampleEditorDialogs.cpp + * ----------------------- + * Purpose: Code for various dialogs that are used in the sample editor + * Notes : (currently none) + * Authors: Olivier Lapicque + * OpenMPT Devs + * + */ + +#include "stdafx.h" +#include "mptrack.h" +#include "SampleEditorDialogs.h" + + +////////////////////////////////////////////////////////////////////////// +// Sample amplification dialog + +CAmpDlg::CAmpDlg(CWnd *parent, int16 nFactor, int16 nFactorMin, int16 nFactorMax) +//------------------------------------------------------------------------------- +: CDialog(IDD_SAMPLE_AMPLIFY, parent), m_nFactor(nFactor), +m_nFactorMin(nFactorMin), m_nFactorMax(nFactorMax), +m_bFadeIn(FALSE), m_bFadeOut(FALSE) +{} + +BOOL CAmpDlg::OnInitDialog() +//-------------------------- +{ + CDialog::OnInitDialog(); + CSpinButtonCtrl *spin = (CSpinButtonCtrl *)GetDlgItem(IDC_SPIN1); + if (spin) + { + spin->SetRange32(m_nFactorMin, m_nFactorMax); + spin->SetPos32(m_nFactor); + } + SetDlgItemInt(IDC_EDIT1, m_nFactor); + return TRUE; +} + + +void CAmpDlg::OnOK() +//------------------ +{ + const int nVal = static_cast<int>(GetDlgItemInt(IDC_EDIT1)); + if(nVal < m_nFactorMin || nVal > m_nFactorMax) + { + CString str; str.Format(GetStrI18N(__TEXT("Value should be within [%d, %d]")), m_nFactorMin, m_nFactorMax); + AfxMessageBox(str, MB_ICONINFORMATION); + return; + } + m_nFactor = static_cast<int16>(nVal); + m_bFadeIn = (IsDlgButtonChecked(IDC_CHECK1) != 0); + m_bFadeOut = (IsDlgButtonChecked(IDC_CHECK2) != 0); + CDialog::OnOK(); +} + + +///////////////////////////////////////////////////////////////////////// +// Add silence dialog - add silence to a sample + +BEGIN_MESSAGE_MAP(CAddSilenceDlg, CDialog) + ON_COMMAND(IDC_RADIO_ADDSILENCE_BEGIN, OnEditModeChanged) + ON_COMMAND(IDC_RADIO_ADDSILENCE_END, OnEditModeChanged) + ON_COMMAND(IDC_RADIO_RESIZETO, OnEditModeChanged) +END_MESSAGE_MAP() + + +BOOL CAddSilenceDlg::OnInitDialog() +//--------------------------------- +{ + CDialog::OnInitDialog(); + + CSpinButtonCtrl *spin = (CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_ADDSILENCE); + if (spin) + { + spin->SetRange(0, int16_max); + spin->SetPos(m_nSamples)... [truncated message content] |
From: <sag...@us...> - 2011-03-08 19:03:37
|
Revision: 814 http://modplug.svn.sourceforge.net/modplug/?rev=814&view=rev Author: saga-games Date: 2011-03-08 19:03:30 +0000 (Tue, 08 Mar 2011) Log Message: ----------- [Mod] Renamed "MPTM (experimental)" item in the "New" menu to "OpenMPT Module" [Imp] Added Mix Paste (IT Style) to the "Paste Special" menu [Imp] Special paste modes have been moved to a sub menu in the pattern editor's context menu, to save some space. Modified Paths: -------------- trunk/OpenMPT/mptrack/Globals.cpp trunk/OpenMPT/mptrack/Globals.h trunk/OpenMPT/mptrack/InputHandler.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h Modified: trunk/OpenMPT/mptrack/Globals.cpp =================================================================== --- trunk/OpenMPT/mptrack/Globals.cpp 2011-03-08 13:10:59 UTC (rev 813) +++ trunk/OpenMPT/mptrack/Globals.cpp 2011-03-08 19:03:30 UTC (rev 814) @@ -192,6 +192,7 @@ ON_COMMAND(ID_EDIT_COPY, OnEditCopy) ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) ON_COMMAND(ID_EDIT_MIXPASTE, OnEditMixPaste) + ON_COMMAND(ID_EDIT_MIXPASTE_ITSTYLE, OnEditMixPasteITStyle) ON_COMMAND(ID_EDIT_FIND, OnEditFind) ON_COMMAND(ID_EDIT_FINDNEXT, OnEditFindNext) ON_COMMAND(ID_CONTROLTAB, OnSwitchToView) Modified: trunk/OpenMPT/mptrack/Globals.h =================================================================== --- trunk/OpenMPT/mptrack/Globals.h 2011-03-08 13:10:59 UTC (rev 813) +++ trunk/OpenMPT/mptrack/Globals.h 2011-03-08 19:03:30 UTC (rev 814) @@ -80,7 +80,8 @@ afx_msg void OnEditCut() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_CUT, 0); } //rewbs.customKeys afx_msg void OnEditCopy() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_COPY, 0); } //rewbs.customKeys afx_msg void OnEditPaste() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_PASTE, 0); } //rewbs.customKeys - afx_msg void OnEditMixPaste() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_PASTE_SPECIAL, 0); } //rewbs.mixPaste + afx_msg void OnEditMixPaste() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_MIXPASTE, 0); } //rewbs.mixPaste + afx_msg void OnEditMixPasteITStyle() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_MIXPASTE_ITSTYLE, 0); } afx_msg void OnEditPasteFlood() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_PASTEFLOOD, 0); } afx_msg void OnEditPushForwardPaste() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_PUSHFORWARDPASTE, 0); } afx_msg void OnEditFind() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_FIND, 0); } //rewbs.customKeys @@ -171,7 +172,8 @@ afx_msg void OnEditCut() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_CUT, 0); } afx_msg void OnEditCopy() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_COPY, 0); } afx_msg void OnEditPaste() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_PASTE, 0); } - afx_msg void OnEditMixPaste() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_PASTE_SPECIAL, 0); } //rewbs.mixPaste + afx_msg void OnEditMixPaste() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_MIXPASTE, 0); } //rewbs.mixPaste + afx_msg void OnEditMixPasteITStyle() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_MIXPASTE_ITSTYLE, 0); } afx_msg void OnEditFind() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_FIND, 0); } afx_msg void OnEditFindNext() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_FINDNEXT, 0); } afx_msg void OnSwitchToView() { if (m_hWndView) ::PostMessage(m_hWndView, WM_MOD_VIEWMSG, VIEWMSG_SETFOCUS, 0); } Modified: trunk/OpenMPT/mptrack/InputHandler.cpp =================================================================== --- trunk/OpenMPT/mptrack/InputHandler.cpp 2011-03-08 13:10:59 UTC (rev 813) +++ trunk/OpenMPT/mptrack/InputHandler.cpp 2011-03-08 19:03:30 UTC (rev 814) @@ -447,6 +447,7 @@ case ID_EDIT_SPLITKEYBOARDSETTINGS: s="Split &Keyboard Settings\t"; c=kcShowSplitKeyboardSettings; break; // "Paste Special" sub menu case ID_EDIT_PASTE_SPECIAL: s="&Mix Paste\t"; c=kcEditMixPaste; break; + case ID_EDIT_MIXPASTE_ITSTYLE: s="&Mix Paste (IT Style)\t"; c=kcEditMixPasteITStyle; break; case ID_EDIT_PASTEFLOOD: s="Paste Fl&ood\t"; c=kcEditPasteFlood; break; case ID_EDIT_PUSHFORWARDPASTE: s="&Push Forward Paste\t"; c=kcEditPushForwardPaste; break; @@ -511,6 +512,7 @@ pMenu->ModifyMenu(ID_EDIT_COPY, MF_BYCOMMAND | MF_STRING, ID_EDIT_COPY, GetMenuText(ID_EDIT_COPY)); pMenu->ModifyMenu(ID_EDIT_PASTE, MF_BYCOMMAND | MF_STRING, ID_EDIT_PASTE, GetMenuText(ID_EDIT_PASTE)); pMenu->ModifyMenu(ID_EDIT_PASTE_SPECIAL, MF_BYCOMMAND | MF_STRING, ID_EDIT_PASTE_SPECIAL, GetMenuText(ID_EDIT_PASTE_SPECIAL)); + pMenu->ModifyMenu(ID_EDIT_MIXPASTE_ITSTYLE, MF_BYCOMMAND | MF_STRING, ID_EDIT_MIXPASTE_ITSTYLE, GetMenuText(ID_EDIT_MIXPASTE_ITSTYLE)); pMenu->ModifyMenu(ID_EDIT_PASTEFLOOD, MF_BYCOMMAND | MF_STRING, ID_EDIT_PASTEFLOOD, GetMenuText(ID_EDIT_PASTEFLOOD)); pMenu->ModifyMenu(ID_EDIT_PUSHFORWARDPASTE, MF_BYCOMMAND | MF_STRING, ID_EDIT_PUSHFORWARDPASTE, GetMenuText(ID_EDIT_PUSHFORWARDPASTE)); pMenu->ModifyMenu(ID_EDIT_SELECT_ALL, MF_BYCOMMAND | MF_STRING, ID_EDIT_SELECT_ALL, GetMenuText(ID_EDIT_SELECT_ALL)); Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-03-08 13:10:59 UTC (rev 813) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-03-08 19:03:30 UTC (rev 814) @@ -59,6 +59,7 @@ ON_COMMAND(ID_EDIT_COPY, OnEditCopy) ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) ON_COMMAND(ID_EDIT_MIXPASTE, OnEditMixPaste) + ON_COMMAND(ID_EDIT_MIXPASTE_ITSTYLE,OnEditMixPasteITStyle) ON_COMMAND(ID_EDIT_PASTEFLOOD, OnEditPasteFlood) ON_COMMAND(ID_EDIT_PUSHFORWARDPASTE,OnEditPushForwardPaste) ON_COMMAND(ID_EDIT_SELECT_ALL, OnEditSelectAll) @@ -5080,15 +5081,19 @@ bool CViewPattern::BuildEditCtxMenu(HMENU hMenu, CInputHandler* ih, CModDoc* pModDoc) //----------------------------------------------------------------------------------- { + HMENU pasteSpecialMenu = ::CreatePopupMenu(); AppendMenu(hMenu, MF_STRING, ID_EDIT_CUT, "Cut\t" + ih->GetKeyTextFromCommand(kcEditCut)); AppendMenu(hMenu, MF_STRING, ID_EDIT_COPY, "Copy\t" + ih->GetKeyTextFromCommand(kcEditCopy)); AppendMenu(hMenu, MF_STRING, ID_EDIT_PASTE, "Paste\t" + ih->GetKeyTextFromCommand(kcEditPaste)); - AppendMenu(hMenu, MF_STRING, ID_EDIT_MIXPASTE, "Mix Paste\t" + ih->GetKeyTextFromCommand(kcEditMixPaste)); - AppendMenu(hMenu, MF_STRING, ID_EDIT_PASTEFLOOD, "Paste Flood\t" + ih->GetKeyTextFromCommand(kcEditPasteFlood)); - AppendMenu(hMenu, MF_STRING, ID_EDIT_PUSHFORWARDPASTE, "Push Forward Paste\t" + ih->GetKeyTextFromCommand(kcEditPushForwardPaste)); + AppendMenu(hMenu, MF_POPUP, (UINT)pasteSpecialMenu, "Paste Special"); + AppendMenu(pasteSpecialMenu, MF_STRING, ID_EDIT_MIXPASTE, "Mix Paste\t" + ih->GetKeyTextFromCommand(kcEditMixPaste)); + AppendMenu(pasteSpecialMenu, MF_STRING, ID_EDIT_MIXPASTE_ITSTYLE, "Mix Paste (IT Style)\t" + ih->GetKeyTextFromCommand(kcEditMixPasteITStyle)); + AppendMenu(pasteSpecialMenu, MF_STRING, ID_EDIT_PASTEFLOOD, "Paste Flood\t" + ih->GetKeyTextFromCommand(kcEditPasteFlood)); + AppendMenu(pasteSpecialMenu, MF_STRING, ID_EDIT_PUSHFORWARDPASTE, "Push Forward Paste\t" + ih->GetKeyTextFromCommand(kcEditPushForwardPaste)); DWORD greyed = pModDoc->GetPatternUndo()->CanUndo()?FALSE:MF_GRAYED; - if (!greyed || !(CMainFrame::m_dwPatternSetup&PATTERN_OLDCTXMENUSTYLE)) { + if (!greyed || !(CMainFrame::m_dwPatternSetup & PATTERN_OLDCTXMENUSTYLE)) + { AppendMenu(hMenu, MF_STRING|greyed, ID_EDIT_UNDO, "Undo\t" + ih->GetKeyTextFromCommand(kcEditUndo)); } Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2011-03-08 13:10:59 UTC (rev 813) +++ trunk/OpenMPT/mptrack/mptrack.rc 2011-03-08 19:03:30 UTC (rev 814) @@ -1943,7 +1943,7 @@ MENUITEM "&S3M", ID_FILE_NEWS3M MENUITEM "M&OD", ID_FILE_NEWMOD MENUITEM "IT &Project", ID_NEW_ITPROJECT - MENUITEM "&MPTM (experimental)", ID_NEW_MPT + MENUITEM "Open&MPT Module", ID_NEW_MPT END MENUITEM "&Open...\tCtrl+O", 57601 MENUITEM "&Close", ID_FILE_CLOSE @@ -1982,6 +1982,7 @@ POPUP "Paste &Special" BEGIN MENUITEM "&Mix Paste\tCtrl+M", ID_EDIT_PASTE_SPECIAL + MENUITEM "Mix Paste (IT Style)", ID_EDIT_MIXPASTE_ITSTYLE MENUITEM "Paste &Flood", ID_EDIT_PASTEFLOOD MENUITEM "&Push Forward Paste", ID_EDIT_PUSHFORWARDPASTE END Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2011-03-08 13:10:59 UTC (rev 813) +++ trunk/OpenMPT/mptrack/resource.h 2011-03-08 19:03:30 UTC (rev 814) @@ -1183,6 +1183,7 @@ #define ID_VIEW_EDITHISTORY 60452 #define ID_SAMPLE_GRID 60453 #define ID_SAMPLE_QUICKFADE 60454 +#define ID_EDIT_MIXPASTE_ITSTYLE 60455 // Next default values for new objects // @@ -1190,7 +1191,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 529 -#define _APS_NEXT_COMMAND_VALUE 60455 +#define _APS_NEXT_COMMAND_VALUE 60456 #define _APS_NEXT_CONTROL_VALUE 2435 #define _APS_NEXT_SYMED_VALUE 901 #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-03-19 13:26:44
|
Revision: 816 http://modplug.svn.sourceforge.net/modplug/?rev=816&view=rev Author: saga-games Date: 2011-03-19 13:26:38 +0000 (Sat, 19 Mar 2011) Log Message: ----------- [Fix] VST: Fixed garbage characters in preset fields of plugins that don't return program names. [Fix] Comments Tab: When changing font size, the editor is now resized instantly. Modified Paths: -------------- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp trunk/OpenMPT/mptrack/Ctrl_com.cpp trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/Vstplug.h Modified: trunk/OpenMPT/mptrack/AbstractVstEditor.cpp =================================================================== --- trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2011-03-09 12:35:25 UTC (rev 815) +++ trunk/OpenMPT/mptrack/AbstractVstEditor.cpp 2011-03-19 13:26:38 UTC (rev 816) @@ -139,6 +139,7 @@ //TODO: exception handling if (!(m_pVstPlugin->SaveProgram(files.first_file.c_str()))) ::AfxMessageBox("Error saving preset."); + } VOID CAbstractVstEditor::OnRandomizePreset() @@ -172,25 +173,29 @@ void CAbstractVstEditor::UpdatePresetField() //------------------------------------------ { - - if(m_pVstPlugin->GetNumPrograms() > 0 && m_pMenu->GetMenuItemCount() < 5) + if(m_pVstPlugin->GetNumPrograms() > 0) { - m_pMenu->AppendMenu(MF_BYPOSITION, ID_VSTPRESETBACKWARDJUMP, TEXT("<<")); - m_pMenu->AppendMenu(MF_BYPOSITION, ID_PREVIOUSVSTPRESET, TEXT("<")); - m_pMenu->AppendMenu(MF_BYPOSITION, ID_NEXTVSTPRESET, TEXT(">")); - m_pMenu->AppendMenu(MF_BYPOSITION, ID_VSTPRESETFORWARDJUMP, TEXT(">>")); - m_pMenu->AppendMenu(MF_BYPOSITION|MF_DISABLED, 0, TEXT("")); + if(m_pMenu->GetMenuItemCount() < 5) + { + m_pMenu->AppendMenu(MF_BYPOSITION, ID_VSTPRESETBACKWARDJUMP, TEXT("<<")); + m_pMenu->AppendMenu(MF_BYPOSITION, ID_PREVIOUSVSTPRESET, TEXT("<")); + m_pMenu->AppendMenu(MF_BYPOSITION, ID_NEXTVSTPRESET, TEXT(">")); + m_pMenu->AppendMenu(MF_BYPOSITION, ID_VSTPRESETFORWARDJUMP, TEXT(">>")); + m_pMenu->AppendMenu(MF_BYPOSITION|MF_DISABLED, 0, TEXT("")); + } + long index = m_pVstPlugin->GetCurrentProgram(); + char name[266]; + char rawname[256]; + if(!m_pVstPlugin->GetProgramNameIndexed(index, -1, rawname)) + { + strcpy(rawname, ""); + } + SetNullTerminator(rawname); + CreateVerifiedProgramName(rawname, sizeof(rawname), name, sizeof(name), index); + + m_pMenu->ModifyMenu(8, MF_BYPOSITION, 0, name); } - long index = m_pVstPlugin->GetCurrentProgram(); - char name[266]; - char rawname[256]; - m_pVstPlugin->GetProgramNameIndexed(index, -1, rawname); - rawname[sizeof(rawname)-1] = 0; - CreateVerifiedProgramName(rawname, sizeof(rawname), name, sizeof(name), index); - - m_pMenu->ModifyMenu(8, MF_BYPOSITION, 0, name); - DrawMenuBar(); } @@ -255,7 +260,8 @@ //We handle keypresses before Windows has a chance to handle them (for alt etc..) if ( (!m_pVstPlugin->m_bPassKeypressesToPlug) && ((pMsg->message == WM_SYSKEYUP) || (pMsg->message == WM_KEYUP) || - (pMsg->message == WM_SYSKEYDOWN) || (pMsg->message == WM_KEYDOWN)) ) { + (pMsg->message == WM_SYSKEYDOWN) || (pMsg->message == WM_KEYDOWN)) ) + { CInputHandler* ih = (CMainFrame::GetMainFrame())->GetInputHandler(); @@ -267,13 +273,15 @@ InputTargetContext ctx = (InputTargetContext)(kCtxVSTGUI); // If we successfully mapped to a command and plug does not listen for keypresses, no need to pass message on. - if (ih->KeyEvent(ctx, nChar, nRepCnt, nFlags, kT, (CWnd*)this) != kcNull) { + if (ih->KeyEvent(ctx, nChar, nRepCnt, nFlags, kT, (CWnd*)this) != kcNull) + { return true; } // Don't forward key repeats if plug does not listen for keypresses // (avoids system beeps on note hold) - if (kT == kKeyEventRepeat) { + if (kT == kKeyEventRepeat) + { return true; } } @@ -361,7 +369,7 @@ if(!pModDoc || !pSndFile) return false; - if(pModDoc->GetSoundFile()->GetModSpecifications().instrumentsMax == 0 || + if(!m_pVstPlugin->isInstrument() || pModDoc->GetSoundFile()->GetModSpecifications().instrumentsMax == 0 || AfxMessageBox(_T("You need to assign an instrument to this plugin before you can play notes from here.\nCreate a new instrument and assign this plugin to the instrument?"), MB_YESNO | MB_ICONQUESTION) == IDNO) { return false; @@ -376,8 +384,8 @@ MODINSTRUMENT *pIns = pSndFile->Instruments[nIns]; m_nInstrument = nIns; - _snprintf(pIns->name, ARRAYELEMCOUNT(pIns->name) - 1, _T("%d: %s"), m_pVstPlugin->GetSlot() + 1, pSndFile->m_MixPlugins[m_pVstPlugin->GetSlot()].Info.szName); - strncpy(pIns->filename, pSndFile->m_MixPlugins[m_pVstPlugin->GetSlot()].Info.szLibraryName, ARRAYELEMCOUNT(pIns->filename) - 1); + _snprintf(pIns->name, CountOf(pIns->name) - 1, _T("%d: %s"), m_pVstPlugin->GetSlot() + 1, pSndFile->m_MixPlugins[m_pVstPlugin->GetSlot()].Info.szName); + strncpy(pIns->filename, pSndFile->m_MixPlugins[m_pVstPlugin->GetSlot()].Info.szLibraryName, CountOf(pIns->filename) - 1); pIns->nMixPlug = (PLUGINDEX)m_pVstPlugin->GetSlot() + 1; pIns->nMidiChannel = 1; // People will forget to change this anyway, so the following lines can lead to some bad surprises after re-opening the module. @@ -432,9 +440,12 @@ } for (long p=0; p<numProgs; p++) { - m_pVstPlugin->GetProgramNameIndexed(p, -1, sname); + if(!m_pVstPlugin->GetProgramNameIndexed(p, -1, sname)) + { + strcpy(sname, ""); + } + SetNullTerminator(sname); - sname[sizeof(sname)-1] = 0; CreateVerifiedProgramName(sname, sizeof(sname), s, sizeof(s), p); // Get menu item properties Modified: trunk/OpenMPT/mptrack/Ctrl_com.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_com.cpp 2011-03-09 12:35:25 UTC (rev 815) +++ trunk/OpenMPT/mptrack/Ctrl_com.cpp 2011-03-19 13:26:38 UTC (rev 816) @@ -96,7 +96,6 @@ if ((pHint == this) || (!m_pSndFile) || (!(dwHint & (HINT_MODCOMMENTS|HINT_MPTOPTIONS|HINT_MODTYPE)))) return; if (m_nLockCount) return; m_nLockCount++; - m_EditComments.SetRedraw(FALSE); HFONT newfont; if (CMainFrame::m_dwPatternSetup & PATTERN_LARGECOMMENTS) newfont = CMainFrame::GetLargeFixedFont(); @@ -106,7 +105,9 @@ { m_hFont = newfont; m_EditComments.SendMessage(WM_SETFONT, (WPARAM)newfont); + RecalcLayout(); } + m_EditComments.SetRedraw(FALSE); m_EditComments.SetSel(0, -1, TRUE); m_EditComments.ReplaceSel(""); if (m_pSndFile->m_lpszSongComments) Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2011-03-09 12:35:25 UTC (rev 815) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2011-03-19 13:26:38 UTC (rev 816) @@ -1507,7 +1507,11 @@ m_CbnPreset.SetItemData(m_CbnPreset.AddString(s2), 0); for (UINT i = 0; i < nProg; i++) { - pVstPlugin->GetProgramNameIndexed(i, 0, sname); + if(!pVstPlugin->GetProgramNameIndexed(i, 0, sname)) + { + strcpy(sname, ""); + } + SetNullTerminator(sname); if(sname[0] < ' ') { Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2011-03-09 12:35:25 UTC (rev 815) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2011-03-19 13:26:38 UTC (rev 816) @@ -2093,32 +2093,38 @@ bool success; //Collect required data - PlugParamIndex numParams = GetNumParameters(); long ID = GetUID(); long plugVersion = GetVersion(); - float *params = new float[numParams]; - GetParams(params, 0, numParams); - Cfxp* fxp = NULL; + Cfxp* fxp = nullptr; //Construct & save fxp + + // try chunk-based preset: if(m_pEffect->flags & effFlagsProgramChunks) - { // try chunk-based preset: + { void *chunk = NULL; long chunkSize = Dispatch(effGetChunk, 1,0, &chunk, 0); - if ((chunkSize > 8) && (chunk)) //If chunk is less that 8 bytes, the plug must be kidding. :) (e.g.: imageline sytrus) + if ((chunkSize > 8) && (chunk)) //If chunk is less than 8 bytes, the plug must be kidding. :) (e.g.: imageline sytrus) fxp = new Cfxp(ID, plugVersion, 1, chunkSize, chunk); } - if (fxp == NULL) - { // fall back on parameter based preset: + // fall back on parameter based preset: + if (fxp == nullptr) + { + //Collect required data + PlugParamIndex numParams = GetNumParameters(); + float *params = new float[numParams]; + GetParams(params, 0, numParams); + fxp = new Cfxp(ID, plugVersion, numParams, params); + + delete[] params; } success = fxp->Save(fileName); if (fxp) delete fxp; - delete[] params; return success; } @@ -2182,14 +2188,14 @@ return 0; } -long CVstPlugin::GetProgramNameIndexed(long index, long category, char *text) +bool CVstPlugin::GetProgramNameIndexed(long index, long category, char *text) //--------------------------------------------------------------------------- { if ((m_pEffect) && (m_pEffect->numPrograms > 0)) { - return Dispatch(effGetProgramNameIndexed, index, category, text, 0); + return (Dispatch(effGetProgramNameIndexed, index, category, text, 0) == 1); } - return 0; + return false; } @@ -2251,10 +2257,10 @@ pszName[0] = 0; if ((m_pEffect) && (m_pEffect->numParams > 0) && (nIndex < (UINT)m_pEffect->numParams)) { - CHAR s[64]; //Increased to 64 bytes since 32 bytes doesn't seem to suffice for all plugs. + CHAR s[64]; // Increased to 64 bytes since 32 bytes doesn't seem to suffice for all plugs. Kind of ridiculous if you consider that kVstMaxParamStrLen = 8... s[0] = 0; Dispatch(effGetParamName, nIndex, 0, s, 0); - s[min(sizeof(s)-1, cbSize-1)] = 0; + s[min(CountOf(s) - 1, cbSize - 1)] = 0; lstrcpyn(pszName, s, min(cbSize, sizeof(s))); } } @@ -2295,7 +2301,7 @@ } void CVstPlugin::Init(unsigned long /*nFreq*/, int /*bReset*/) -//---------------------------------------------------- +//------------------------------------------------------------ { } Modified: trunk/OpenMPT/mptrack/Vstplug.h =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.h 2011-03-09 12:35:25 UTC (rev 815) +++ trunk/OpenMPT/mptrack/Vstplug.h 2011-03-19 13:26:38 UTC (rev 816) @@ -109,7 +109,7 @@ PlugParamIndex GetNumParameters(); long GetCurrentProgram(); long GetNumProgramCategories(); //rewbs.VSTpresets - long GetProgramNameIndexed(long index, long category, char *text); //rewbs.VSTpresets + bool GetProgramNameIndexed(long index, long category, char *text); //rewbs.VSTpresets bool LoadProgram(CString fileName); bool SaveProgram(CString fileName); VstInt32 GetUID(); //rewbs.VSTpresets @@ -205,7 +205,7 @@ UINT GetNumCommands() {return 0;} VOID GetPluginType(LPSTR) {} PlugParamIndex GetNumPrograms() {return 0;} - long GetProgramNameIndexed(long, long, char*) {return 0;} + bool GetProgramNameIndexed(long, long, char*) {return 0;} VOID SetParameter(PlugParamIndex nIndex, PlugParamValue fValue) {} VOID GetParamLabel(UINT, LPSTR) {} VOID GetParamDisplay(UINT, LPSTR) {} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-03-19 13:56:10
|
Revision: 817 http://modplug.svn.sourceforge.net/modplug/?rev=817&view=rev Author: saga-games Date: 2011-03-19 13:56:03 +0000 (Sat, 19 Mar 2011) Log Message: ----------- [New] Pattern Editor: The new keyboard shortcuts "Select beat" and "Select measure" can be used to automatically extend the current selection to the beat / measure boundaries. Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/PatternEditorDialogs.h trunk/OpenMPT/mptrack/View_pat.cpp Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2011-03-19 13:26:38 UTC (rev 816) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2011-03-19 13:56:03 UTC (rev 817) @@ -604,6 +604,8 @@ DefineKeyCommand(kcViewEditHistory, 1855, kcVisible, kcNoDummy, _T("View Edit History")); DefineKeyCommand(kcSampleQuickFade, 1856, kcVisible, kcNoDummy, _T("Quick fade")); DefineKeyCommand(kcSampleXFade, 1857, kcVisible, kcNoDummy, _T("Crossfade sample loop")); + DefineKeyCommand(kcSelectBeat, 1858, kcVisible, kcNoDummy, _T("Select beat")); + DefineKeyCommand(kcSelectMeasure, 1859, kcVisible, kcNoDummy, _T("Select measure")); // Add new key commands here. #ifdef _DEBUG Modified: trunk/OpenMPT/mptrack/CommandSet.h =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h 2011-03-19 13:26:38 UTC (rev 816) +++ trunk/OpenMPT/mptrack/CommandSet.h 2011-03-19 13:56:03 UTC (rev 817) @@ -201,7 +201,9 @@ kcCopySelectWithSelect, kcCopySelectOffWithSelect, kcSelectColumn, - kcEndSelect=kcSelectColumn, + kcSelectBeat, + kcSelectMeasure, + kcEndSelect=kcSelectMeasure, kcStartPatternEditMisc, kcToggleFollowSong=kcStartPatternEditMisc, Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.h =================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.h 2011-03-19 13:26:38 UTC (rev 816) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.h 2011-03-19 13:56:03 UTC (rev 817) @@ -35,7 +35,7 @@ //========================================= { protected: - BOOL m_bReplace; + bool m_bReplace; // is this the replace tab? CModDoc *m_pModDoc; public: @@ -69,7 +69,7 @@ void ChangeEffect(); public: - CFindReplaceTab(UINT nIDD, BOOL bReplaceTab, CModDoc *pModDoc):CPropertyPage(nIDD) { m_bReplace = bReplaceTab; m_pModDoc = pModDoc; } + CFindReplaceTab(UINT nIDD, bool bReplaceTab, CModDoc *pModDoc):CPropertyPage(nIDD) { m_bReplace = bReplaceTab; m_pModDoc = pModDoc; } protected: virtual BOOL OnInitDialog(); Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-03-19 13:26:38 UTC (rev 816) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-03-19 13:56:03 UTC (rev 817) @@ -1694,8 +1694,8 @@ CModDoc *pModDoc = GetDocument(); if (pModDoc) { - CFindReplaceTab pageFind(IDD_EDIT_FIND, FALSE, pModDoc); - CFindReplaceTab pageReplace(IDD_EDIT_REPLACE, TRUE, pModDoc); + CFindReplaceTab pageFind(IDD_EDIT_FIND, false, pModDoc); + CFindReplaceTab pageReplace(IDD_EDIT_REPLACE, true, pModDoc); CPropertySheet dlg("Find/Replace"); pageFind.m_nNote = m_findReplace.cmdFind.note; @@ -3695,6 +3695,27 @@ case kcCopySelectOffWithNav: case kcCopySelectOff: m_dwStatus &= ~PATSTATUS_CTRLDRAGSEL; return wParam; + case kcSelectBeat: + case kcSelectMeasure: + // Select whole beat / measure + { + const ROWINDEX adjust = (wParam == kcSelectBeat) ? GetRowsPerBeat() : GetRowsPerMeasure(); + const ROWINDEX startRow = GetSelectionStartRow() - (GetSelectionStartRow() % adjust); // Snap to start of beat / measure of upper-left corner of current selection + const ROWINDEX endRow = GetSelectionEndRow() + adjust - (GetSelectionEndRow() % adjust) - 1; // Snap to end of beat / measure of lower-right corner of current selection + DWORD startMask = (GetSelectionStartChan() << 3), endMask = (GetSelectionEndChan() << 3); + if(m_dwBeginSel == m_dwEndSel) + { + endMask |= LAST_COLUMN; // Extend to param column; + } else + { + // Remember start / end column + startMask |= (m_dwBeginSel & 0x07); + endMask |= (m_dwEndSel & 0x07); + } + SetCurSel((startRow << 16) | startMask, (endRow << 16) | endMask); + } + return wParam; + case kcClearRow: OnClearField(-1, false); return wParam; case kcClearField: OnClearField(m_dwCursor & 0x07, false); return wParam; case kcClearFieldITStyle: OnClearField(m_dwCursor & 0x07, false, true); return wParam; @@ -4778,8 +4799,8 @@ if (newIns == 0) { - RowMask sp = {0,1,0,0,0}; // Setup mask to only clear instrument data in OnClearSelection - OnClearSelection(false, sp); // Clears instrument selection from pattern + RowMask sp = {false, true, false, false, false}; // Setup mask to only clear instrument data in OnClearSelection + OnClearSelection(false, sp); // Clears instrument selection from pattern } else { SetSelectionInstrument(newIns); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-03-19 16:37:17
|
Revision: 821 http://modplug.svn.sourceforge.net/modplug/?rev=821&view=rev Author: saga-games Date: 2011-03-19 16:37:10 +0000 (Sat, 19 Mar 2011) Log Message: ----------- [Imp] Pattern Editor: Select beat / measure behaves more intelligent now (selection extension to all channels) Modified Paths: -------------- trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-03-19 14:03:32 UTC (rev 820) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-03-19 16:37:10 UTC (rev 821) @@ -3697,24 +3697,7 @@ case kcSelectBeat: case kcSelectMeasure: - // Select whole beat / measure - { - const ROWINDEX adjust = (wParam == kcSelectBeat) ? GetRowsPerBeat() : GetRowsPerMeasure(); - const ROWINDEX startRow = GetSelectionStartRow() - (GetSelectionStartRow() % adjust); // Snap to start of beat / measure of upper-left corner of current selection - const ROWINDEX endRow = GetSelectionEndRow() + adjust - (GetSelectionEndRow() % adjust) - 1; // Snap to end of beat / measure of lower-right corner of current selection - DWORD startMask = (GetSelectionStartChan() << 3), endMask = (GetSelectionEndChan() << 3); - if(m_dwBeginSel == m_dwEndSel) - { - endMask |= LAST_COLUMN; // Extend to param column; - } else - { - // Remember start / end column - startMask |= (m_dwBeginSel & 0x07); - endMask |= (m_dwEndSel & 0x07); - } - SetCurSel((startRow << 16) | startMask, (endRow << 16) | endMask); - } - return wParam; + SelectBeatOrMeasure(wParam == kcSelectBeat); return wParam; case kcClearRow: OnClearField(-1, false); return wParam; case kcClearField: OnClearField(m_dwCursor & 0x07, false); return wParam; @@ -5671,3 +5654,44 @@ } EndWaitCursor(); } + + +// Select a whole beat (selectBeat = true) or measure. +void CViewPattern::SelectBeatOrMeasure(bool selectBeat) +//----------------------------------------------------- +{ + const ROWINDEX adjust = selectBeat ? GetRowsPerBeat() : GetRowsPerMeasure(); + + // Snap to start of beat / measure of upper-left corner of current selection + const ROWINDEX startRow = GetSelectionStartRow() - (GetSelectionStartRow() % adjust); + // Snap to end of beat / measure of lower-right corner of current selection + const ROWINDEX endRow = GetSelectionEndRow() + adjust - (GetSelectionEndRow() % adjust) - 1; + + DWORD startMask = (GetSelectionStartChan() << 3), endMask = (GetSelectionEndChan() << 3); + + if(m_dwBeginSel == m_dwEndSel) + { + // No selection has been made yet => expand selection to whole channel. + endMask |= LAST_COLUMN; // Extend to param column; + } else if(startRow == GetSelectionStartRow() && endRow == GetSelectionEndRow()) + { + // Whole beat or measure is already selected + if((m_dwBeginSel & 0x07) == 0 && (m_dwEndSel & 0x07) == LAST_COLUMN) + { + // Whole channel is already selected => expand selection to whole row. + startMask = 0; + endMask = 0xFFFF; + } else + { + // Channel is only partly selected => expand to whole channel first. + endMask |= LAST_COLUMN; // Extend to param column; + } + } + else + { + // Some arbitrary selection: Remember start / end column + startMask |= (m_dwBeginSel & 0x07); + endMask |= (m_dwEndSel & 0x07); + } + SetCurSel((startRow << 16) | startMask, (endRow << 16) | endMask); +} Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2011-03-19 14:03:32 UTC (rev 820) +++ trunk/OpenMPT/mptrack/View_pat.h 2011-03-19 16:37:10 UTC (rev 821) @@ -186,6 +186,7 @@ // -! NEW_FEATURE#0014// -> CODE#0012 BOOL ShowEditWindow(); UINT GetCurrentInstrument() const; + void SelectBeatOrMeasure(bool selectBeat); BOOL TransposeSelection(int transp); BOOL PrepareUndo(DWORD dwBegin, DWORD dwEnd); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sag...@us...> - 2011-03-26 13:07:50
|
Revision: 830 http://modplug.svn.sourceforge.net/modplug/?rev=830&view=rev Author: saga-games Date: 2011-03-26 13:07:43 +0000 (Sat, 26 Mar 2011) Log Message: ----------- [Fix] Sample Editor: Loop point controls also accept large numbers to be inputted manually. [Fix] Instrument Editor: Fadeout control also accepts large numbers to be inputted manually. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_ins.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/version.h Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2011-03-25 18:36:23 UTC (rev 829) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2011-03-26 13:07:43 UTC (rev 830) @@ -825,6 +825,7 @@ DDX_Control(pDX, IDC_COMBO6, m_CbnMixPlug); //rewbs.instroVSTi DDX_Control(pDX, IDC_COMBO9, m_CbnResampling); DDX_Control(pDX, IDC_FILTERMODE, m_CbnFilterMode); + DDX_Control(pDX, IDC_EDIT7, m_EditFadeOut); DDX_Control(pDX, IDC_SPIN7, m_SpinFadeOut); DDX_Control(pDX, IDC_SPIN8, m_SpinGlobalVol); DDX_Control(pDX, IDC_SPIN9, m_SpinPanning); @@ -1163,10 +1164,10 @@ m_EditName.SetLimitText(specs->instrNameLengthMax); m_EditFileName.SetLimitText(specs->instrFilenameLengthMax); - BOOL bITandMPT = ((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; + const BOOL bITandMPT = ((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; //rewbs.instroVSTi - BOOL bITandXM = ((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_XM)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; - bool bMPTOnly = ((m_pSndFile->m_nType == MOD_TYPE_MPT) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; + const BOOL bITandXM = ((m_pSndFile->m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_XM)) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; + const BOOL bMPTOnly = ((m_pSndFile->m_nType == MOD_TYPE_MPT) && (m_pSndFile->m_nInstruments)) ? TRUE : FALSE; ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT10), bITandXM); ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT11), bITandXM); ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT7), bITandXM); @@ -1180,11 +1181,10 @@ m_SpinMidiBK.EnableWindow(bITandXM); //rewbs.MidiBank //end rewbs.instroVSTi + const bool extendedFadeoutRange = (m_pSndFile->m_nType & MOD_TYPE_XM) != 0; m_SpinFadeOut.EnableWindow(bITandXM); - if(m_pSndFile->m_nType & MOD_TYPE_XM) - m_SpinFadeOut.SetRange(0, 32767); - else - m_SpinFadeOut.SetRange(0, 8192); + m_SpinFadeOut.SetRange(0, extendedFadeoutRange ? 32767 : 8192); + m_EditFadeOut.SetLimitText(extendedFadeoutRange ? 5 : 4); // Panning ranges (0...64 for IT, 0...256 for MPTM) m_SpinPanning.SetRange(0, (m_pModDoc->GetModType() & MOD_TYPE_IT) ? 64 : 256); @@ -1551,7 +1551,7 @@ { m_CbnPluginVelocityHandling.EnableWindow(FALSE); m_CbnPluginVolumeHandling.EnableWindow(FALSE); - wsprintf(pszText, "To enable, clear plugin volume command bug emulation flag from song properties"); + wsprintf(pszText, "To enable, clear Plugin volume command bug emulation flag from Song Properties"); return TRUE; } else @@ -1825,8 +1825,10 @@ MODINSTRUMENT *pIns = m_pSndFile->Instruments[m_nInstrument]; if ((!IsLocked()) && (pIns)) { + int minval = 0, maxval = 32767; + m_SpinFadeOut.GetRange(minval, maxval); int nVol = GetDlgItemInt(IDC_EDIT7); - nVol = CLAMP(nVol, 0, 32767); + nVol = CLAMP(nVol, minval, maxval); if(nVol != (int)pIns->nFadeOut) { Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.h 2011-03-25 18:36:23 UTC (rev 829) +++ trunk/OpenMPT/mptrack/Ctrl_ins.h 2011-03-26 13:07:43 UTC (rev 830) @@ -83,7 +83,7 @@ CSpinButtonCtrl m_SpinInstrument, m_SpinFadeOut, m_SpinGlobalVol, m_SpinPanning; CSpinButtonCtrl m_SpinMidiPR, m_SpinPPS, m_SpinMidiBK; CComboBox m_ComboNNA, m_ComboDCT, m_ComboDCA, m_ComboPPC, m_CbnMidiCh, m_CbnMixPlug, m_CbnResampling, m_CbnFilterMode, m_CbnPluginVelocityHandling, m_CbnPluginVolumeHandling; - CEdit m_EditName, m_EditFileName, m_EditGlobalVol, m_EditPanning, m_EditPPS; + CEdit m_EditName, m_EditFileName, m_EditGlobalVol, m_EditPanning, m_EditPPS, m_EditFadeOut; CButton m_CheckPanning, m_CheckCutOff, m_CheckResonance; CSliderCtrl m_SliderVolSwing, m_SliderPanSwing, m_SliderCutSwing, m_SliderResSwing, m_SliderCutOff, m_SliderResonance; Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2011-03-25 18:36:23 UTC (rev 829) +++ trunk/OpenMPT/mptrack/mptrack.rc 2011-03-26 13:07:43 UTC (rev 830) @@ -614,14 +614,14 @@ EDITTEXT IDC_SAMPLE_NAME,129,26,135,12,ES_AUTOHSCROLL EDITTEXT IDC_SAMPLE_FILENAME,292,26,72,13,ES_AUTOHSCROLL COMBOBOX IDC_COMBO1,130,54,45,46,CBS_DROPDOWNLIST | WS_TABSTOP - EDITTEXT IDC_EDIT1,130,70,45,12,ES_NUMBER + EDITTEXT IDC_EDIT1,130,70,45,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,169,69,11,11 - EDITTEXT IDC_EDIT2,130,83,45,12,ES_NUMBER + EDITTEXT IDC_EDIT2,130,83,45,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Spin1",IDC_SPIN2,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,169,84,11,11 COMBOBOX IDC_COMBO2,212,54,45,46,CBS_DROPDOWNLIST | WS_TABSTOP - EDITTEXT IDC_EDIT3,212,70,45,12,ES_NUMBER + EDITTEXT IDC_EDIT3,212,70,45,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Spin1",IDC_SPIN3,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,253,70,11,11 - EDITTEXT IDC_EDIT4,212,83,45,12,ES_NUMBER + EDITTEXT IDC_EDIT4,212,83,45,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Spin1",IDC_SPIN4,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,253,83,11,11 COMBOBOX IDC_COMBO3,275,59,47,70,CBS_DROPDOWNLIST | WS_TABSTOP EDITTEXT IDC_EDIT15,327,59,32,12,ES_NUMBER @@ -673,17 +673,17 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - EDITTEXT IDC_EDIT_INSTRUMENT,87,7,29,12,ES_AUTOHSCROLL | ES_NUMBER + EDITTEXT IDC_EDIT_INSTRUMENT,87,7,33,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Spin1",IDC_SPIN_INSTRUMENT,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS | WS_TABSTOP,111,8,11,11 EDITTEXT IDC_SAMPLE_NAME,131,6,151,12,ES_AUTOHSCROLL EDITTEXT IDC_SAMPLE_FILENAME,324,6,105,12,ES_AUTOHSCROLL - EDITTEXT IDC_EDIT8,87,36,34,12,ES_NUMBER + EDITTEXT IDC_EDIT8,84,36,37,12,ES_NUMBER CONTROL "Spin1",IDC_SPIN8,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,40,8,10 - EDITTEXT IDC_EDIT7,87,53,34,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN7,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,57,8,10 - CONTROL "Pan",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,55,71,29,10 - EDITTEXT IDC_EDIT9,87,70,34,12,ES_NUMBER - CONTROL "Spin1",IDC_SPIN9,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,74,8,11 + EDITTEXT IDC_EDIT7,84,53,37,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_SPIN7,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,57,8,10 + CONTROL "Set Pan",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,42,72,42,10 + EDITTEXT IDC_EDIT9,84,70,37,12,ES_NUMBER + CONTROL "",IDC_SPIN9,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,112,74,8,11 EDITTEXT IDC_EDIT15,33,99,27,13 CONTROL "Spin1",IDC_SPIN12,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,61,103,7,11 COMBOBOX IDC_COMBO4,95,99,27,91,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP @@ -742,7 +742,6 @@ CTEXT "Cutoff",IDC_STATIC,136,133,33,13,SS_CENTERIMAGE,WS_EX_STATICEDGE CTEXT "Reso",IDC_STATIC,136,151,33,13,SS_CENTERIMAGE,WS_EX_STATICEDGE CTEXT "Resampling",IDC_STATIC,7,151,39,13,SS_CENTERIMAGE,WS_EX_STATICEDGE - CONTROL "Highpass",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,181,19,45,10 CTEXT "Mode",IDC_STATIC,135,70,23,13,SS_CENTERIMAGE,WS_EX_STATICEDGE RTEXT "--",IDC_TEXT1,186,62,45,8 GROUPBOX "Pitch/Tempo Lock",IDC_STATIC,364,57,89,25 @@ -1159,7 +1158,7 @@ CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,59,126,83,18 LTEXT "High",IDC_STATIC,149,129,16,8 CTEXT "Pre-Amp",IDC_STATIC,197,78,35,8 - CONTROL "Slider2",IDC_SLIDER_PREAMP,"msctls_trackbar32",TBS_AUTOTICKS | TBS_VERT | TBS_BOTH | WS_TABSTOP,201,89,27,62 + CONTROL "Slider2",IDC_SLIDER_PREAMP,"msctls_trackbar32",TBS_AUTOTICKS | TBS_VERT | TBS_BOTH | TBS_TOOLTIPS | WS_TABSTOP,201,89,27,62 COMBOBOX IDC_COMBO5,133,62,64,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Reverse Stereo",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,133,80,62,10 CONTROL "Soft Panning",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,133,92,64,10 Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-03-25 18:36:23 UTC (rev 829) +++ trunk/OpenMPT/mptrack/version.h 2011-03-26 13:07:43 UTC (rev 830) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 19 #define VER_MINOR 00 -#define VER_MINORMINOR 30 +#define VER_MINORMINOR 31 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |