From: <sag...@us...> - 2013-12-23 22:56:26
|
Revision: 3521 http://sourceforge.net/p/modplug/code/3521 Author: saga-games Date: 2013-12-23 22:56:18 +0000 (Mon, 23 Dec 2013) Log Message: ----------- [Imp] Re-implement MRU list without MFC. This adds support for unicode paths and will hopefully get rid of the idiosyncratic behaviour that MFC's MRU list shows in some cases... [Imp] Change minimum width of help text in status bar a bit so that everything fits on the screen at 1024x768 (http://bugs.openmpt.org/view.php?id=458). Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/TrackerSettings.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/plugins/PluginManager.cpp Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2013-12-23 22:11:54 UTC (rev 3520) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2013-12-23 22:56:18 UTC (rev 3521) @@ -89,7 +89,6 @@ ON_UPDATE_COMMAND_UI(ID_INDICATOR_USER, OnUpdateUser) ON_UPDATE_COMMAND_UI(ID_INDICATOR_INFO, OnUpdateInfo) ON_UPDATE_COMMAND_UI(ID_INDICATOR_XINFO,OnUpdateXInfo) //rewbs.xinfo - ON_UPDATE_COMMAND_UI(ID_INDICATOR_CPU, OnUpdateCPU) ON_UPDATE_COMMAND_UI(IDD_TREEVIEW, OnUpdateControlBarMenu) ON_MESSAGE(WM_MOD_UPDATEPOSITION, OnUpdatePosition) ON_MESSAGE(WM_MOD_INVALIDATEPATTERNS, OnInvalidatePatterns) @@ -98,6 +97,9 @@ ON_COMMAND(ID_INTERNETUPDATE, OnInternetUpdate) ON_COMMAND(ID_HELP_SHOWSETTINGSFOLDER, OnShowSettingsFolder) ON_COMMAND(ID_HELPSHOW, OnHelp) + + ON_COMMAND_RANGE(ID_MRU_LIST_FIRST, ID_MRU_LIST_LAST, OnOpenMRUItem) + ON_UPDATE_COMMAND_UI(ID_MRU_LIST_FIRST, OnUpdateMRUItem) //}}AFX_MSG_MAP ON_WM_INITMENU() ON_WM_KILLFOCUS() //rewbs.fix3116 @@ -173,7 +175,6 @@ ID_INDICATOR_INFO, ID_INDICATOR_USER, ID_INDICATOR_TIME, - ID_INDICATOR_CPU }; @@ -183,7 +184,6 @@ CMainFrame::CMainFrame() //---------------------- { - m_NotifyTimer = 0; gpSoundDevice = NULL; @@ -271,6 +271,7 @@ CreateExampleModulesMenu(); CreateTemplateModulesMenu(); + UpdateMRUList(); } @@ -329,7 +330,7 @@ // Cursors curDragging = theApp.LoadCursor(IDC_DRAGGING); curArrow = theApp.LoadStandardCursor(IDC_ARROW); - curNoDrop = theApp.LoadCursor(IDC_NODROP); + curNoDrop = theApp.LoadStandardCursor(IDC_NO); curNoDrop2 = theApp.LoadCursor(IDC_NODRAG); curVSplit = theApp.LoadCursor(AFX_IDC_HSPLITBAR); // bitmaps @@ -344,6 +345,7 @@ if (!m_wndStatusBar.Create(this)) return -1; if (!m_wndTree.Create(this, IDD_TREEVIEW, CBRS_LEFT|CBRS_BORDER_RIGHT, IDD_TREEVIEW)) return -1; m_wndStatusBar.SetIndicators(indicators, CountOf(indicators)); + m_wndStatusBar.SetPaneInfo(0, ID_SEPARATOR, SBPS_STRETCH, 256); m_wndToolBar.Init(this); m_wndTree.RecalcLayout(); @@ -1745,6 +1747,7 @@ VOID CMainFrame::OnDocumentCreated(CModDoc *pModDoc) //-------------------------------------------------- { + UpdateMRUList(); m_wndTree.OnDocumentCreated(pModDoc); } @@ -2104,24 +2107,11 @@ } -void CMainFrame::OnUpdateCPU(CCmdUI *) -//------------------------------------- -{ -/* CString s; - double totalCPUPercent = m_dTotalCPU*100; - UINT intPart = static_cast<int>(totalCPUPercent); - UINT decPart = static_cast<int>(totalCPUPercent-intPart)*100; - s.Format("%d.%d%%", intPart, decPart); - m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_CPU), s, TRUE);*/ -} - -//rewbs.xinfo void CMainFrame::OnUpdateXInfo(CCmdUI *) //------------------------------------- { m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_XINFO), m_szXInfoText, TRUE); } -//end rewbs.xinfo void CMainFrame::OnPlayerPause() //------------------------------ @@ -2193,10 +2183,24 @@ //-------------------------------------- { OpenMenuItemFile(nId, false/*open example menu file*/); +} + +void CMainFrame::OnOpenMRUItem(UINT nId) +//-------------------------------------- +{ + mpt::PathString file = TrackerSettings::Instance().mruFiles[nId - ID_MRU_LIST_FIRST]; + theApp.OpenDocumentFile(file); } +void CMainFrame::OnUpdateMRUItem(CCmdUI *cmd) +//------------------------------------------- +{ + cmd->Enable(!TrackerSettings::Instance().mruFiles.empty()); +} + + LRESULT CMainFrame::OnInvalidatePatterns(WPARAM wParam, LPARAM) //------------------------------------------------------------- { @@ -2638,6 +2642,78 @@ } +void CMainFrame::UpdateMRUList() +//------------------------------ +{ + CMenu *pMenu = (CMainFrame::GetMainFrame())->GetMenu()->GetSubMenu(0); + static int firstMenu = -1; + if(firstMenu == -1) + { + int numMenus = pMenu->GetMenuItemCount(); + for(int i = 0; i < numMenus; i++) + { + if(pMenu->GetMenuItemID(i) == ID_MRU_LIST_FIRST) + { + firstMenu = i; + break; + } + } + } + + for(int i = ID_MRU_LIST_FIRST; i <= ID_MRU_LIST_LAST; i++) + { + pMenu->DeleteMenu(i, MF_BYCOMMAND); + } + + if(TrackerSettings::Instance().mruFiles.empty()) + { + // MFC will automatically ignore if we set MF_GRAYED here because of CFrameWnd::m_bAutoMenuEnable. + // So we will have to install a ON_UPDATE_COMMAND_UI callback... + pMenu->InsertMenu(firstMenu, MF_STRING | MF_BYPOSITION, ID_MRU_LIST_FIRST, _T("Recent File")); + } else + { + const std::wstring dir = TrackerDirectories::Instance().GetWorkingDirectory(DIR_MODS).ToWide(); + const size_t dirLength = dir.size(); + + for(size_t i = 0; i < TrackerSettings::Instance().mruFiles.size(); i++) + { + std::wstring s = StringifyW(i + 1) + L" "; + // Add mnemonics + if(i < 9) + { + s = L"&" + s; + } else if(i == 9) + { + s = L"1&0 "; + } + + std::wstring path = TrackerSettings::Instance().mruFiles[i].ToWide(); + if(!lstrcmpiW(dir.c_str(), path.substr(0, dirLength).c_str())) + { + // Only show filename + s += path.substr(dirLength); + } else if(path.length() <= 30) + { + s += path; + } else + { + // Shorten path + size_t start = path.find_first_of(L"\\/"); + size_t end = path.find_last_of(L"\\/"); + if(start != end) + { + s += path.substr(0, start + 1) + L"..." + path.substr(end); + } else + { + s += path; + } + } + ::InsertMenuW(pMenu->m_hMenu, firstMenu + i, MF_STRING | MF_BYPOSITION, ID_MRU_LIST_FIRST + i, s.c_str()); + } + } +} + + ///////////////////////////////////////////// //Misc helper functions ///////////////////////////////////////////// Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2013-12-23 22:11:54 UTC (rev 3520) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2013-12-23 22:56:18 UTC (rev 3521) @@ -468,6 +468,8 @@ /// Opens either template or example menu item. void OpenMenuItemFile(const UINT nId, const bool bTemplateFile); + void UpdateMRUList(); + // Implementation public: virtual ~CMainFrame(); @@ -492,21 +494,15 @@ afx_msg void OnTimer(UINT_PTR); afx_msg void OnSongProperties(); -// -> CODE#0002 -// -> DESC="list box to choose VST plugin presets (programs)" afx_msg void OnPluginManager(); -// -! NEW_FEATURE#0002 - - afx_msg void OnChannelManager(); afx_msg void OnClipboardManager(); afx_msg void OnUpdateTime(CCmdUI *pCmdUI); afx_msg void OnUpdateUser(CCmdUI *pCmdUI); afx_msg void OnUpdateInfo(CCmdUI *pCmdUI); - afx_msg void OnUpdateXInfo(CCmdUI *pCmdUI); //rewbs.xinfo - afx_msg void OnUpdateCPU(CCmdUI *pCmdUI); + afx_msg void OnUpdateXInfo(CCmdUI *pCmdUI); afx_msg void OnUpdateMidiRecord(CCmdUI *pCmdUI); afx_msg void OnPlayerPause(); afx_msg void OnMidiRecord(); @@ -514,11 +510,13 @@ afx_msg void OnNextOctave(); afx_msg void OnOctaveChanged(); afx_msg void OnPanic(); - afx_msg void OnReportBug(); //rewbs.customKeys + afx_msg void OnReportBug(); afx_msg BOOL OnInternetLink(UINT nID); afx_msg LRESULT OnUpdatePosition(WPARAM, LPARAM lParam); + afx_msg void OnOpenTemplateModule(UINT nId); afx_msg void OnExampleSong(UINT nId); - afx_msg void OnOpenTemplateModule(UINT nId); + afx_msg void OnOpenMRUItem(UINT nId); + afx_msg void OnUpdateMRUItem(CCmdUI *cmd); afx_msg LRESULT OnInvalidatePatterns(WPARAM, LPARAM); afx_msg LRESULT OnSpecialKey(WPARAM, LPARAM); afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2013-12-23 22:11:54 UTC (rev 3520) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2013-12-23 22:56:18 UTC (rev 3521) @@ -58,28 +58,46 @@ CDocument *CModDocTemplate::OpenDocumentFile(const mpt::PathString &filename, BOOL addToMru, BOOL makeVisible) //------------------------------------------------------------------------------------------------------------ { - if(!mpt::PathString::CompareNoCase(filename.GetFileExt(), MPT_PATHSTRING(".dll"))) { CVstPluginManager *pPluginManager = theApp.GetPluginManager(); - if(pPluginManager) + if(pPluginManager && pPluginManager->AddPlugin(filename) != nullptr) { - pPluginManager->AddPlugin(filename); - return NULL; + return nullptr; } } + // First, remove document from MRU list. + if(addToMru) + { + for(std::vector<mpt::PathString>::iterator i = TrackerSettings::Instance().mruFiles.begin(); i != TrackerSettings::Instance().mruFiles.end(); i++) + { + if(!mpt::PathString::CompareNoCase(*i, filename)) + { + TrackerSettings::Instance().mruFiles.erase(i); + break; + } + } + } + #if MPT_COMPILER_MSVC && MPT_MSVC_BEFORE(2010,0) CDocument *pDoc = CMultiDocTemplate::OpenDocumentFile(filename.empty() ? NULL : mpt::PathString::TunnelIntoCString(filename).GetString(), makeVisible); #else CDocument *pDoc = CMultiDocTemplate::OpenDocumentFile(filename.empty() ? NULL : mpt::PathString::TunnelIntoCString(filename).GetString(), addToMru, makeVisible); #endif if(pDoc) - { + { + if(addToMru) + { + TrackerSettings::Instance().mruFiles.insert(TrackerSettings::Instance().mruFiles.begin(), filename); + if(TrackerSettings::Instance().mruFiles.size() > TrackerSettings::Instance().mruListLength) + { + TrackerSettings::Instance().mruFiles.resize(TrackerSettings::Instance().mruListLength); + } + } CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); if (pMainFrm) pMainFrm->OnDocumentCreated(static_cast<CModDoc *>(pDoc)); - } - else //Case: pDoc == 0, opening document failed. + } else //Case: pDoc == 0, opening document failed. { if(!filename.empty()) { @@ -119,7 +137,7 @@ { return OpenDocumentFile(lpszFileName ? mpt::PathString::TunnelOutofCString(lpszFileName) : mpt::PathString()); } - virtual CDocument* OpenDocumentFile(const mpt::PathString &filename) + virtual CDocument* OpenDocumentFile(const mpt::PathString &filename) { return CDocManager::OpenDocumentFile(filename.empty() ? NULL : mpt::PathString::TunnelIntoCString(filename).GetString()); } @@ -811,9 +829,7 @@ m_pPluginCache = new IniFileSettingsContainer(m_szPluginCacheFileName); - int mruListLength = GetSettings().Read<int32>("Misc", "MRUListLength", 10); - Limit(mruListLength, 0, 15); - LoadStdProfileSettings((UINT)mruListLength); // Load standard INI file options (including MRU) + LoadStdProfileSettings(0); // Load standard INI file options (without MRU) // Register document templates m_pModTemplate = new CModDocTemplate( Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp 2013-12-23 22:11:54 UTC (rev 3520) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp 2013-12-23 22:56:18 UTC (rev 3521) @@ -197,6 +197,8 @@ , m_MayNormalizeSamplesOnLoad(conf, "Sample Editor", "MayNormalizeSamplesOnLoad", true) // Export , ExportDefaultToSoundcardSamplerate(conf, "Export", "DefaultToSoundcardSamplerate", true) + // MRU List + , mruListLength(conf, "Misc", "MRUListLength", 10) { // Effects #ifndef NO_DSP @@ -316,6 +318,21 @@ } + // MRU list + Limit(mruListLength, 0u, 32u); + mruFiles.reserve(mruListLength); + for(uint32 i = 0; i < mruListLength; i++) + { + char key[16]; + sprintf(key, "File%d", i); + + mpt::PathString path = theApp.RelativePathToAbsolute(conf.Read<mpt::PathString>("Recent File List", key, mpt::PathString())); + if(!path.empty()) + { + mruFiles.push_back(path); + } + } + // Fixups: // ------- @@ -808,6 +825,25 @@ conf.Write<std::string>("Zxx Macros", mpt::String::Format("Z%02X", izxx | 0x80), macros.szMidiZXXExt[izxx]); } + // MRU list + for(uint32 i = 0; i < (ID_MRU_LIST_LAST - ID_MRU_LIST_FIRST + 1); i++) + { + char key[16]; + sprintf(key, "File%d", i); + + if(i < mruFiles.size()) + { + mpt::PathString path = mruFiles[i]; + if(theApp.IsPortableMode()) + { + path = theApp.AbsolutePathToRelative(path); + } + conf.Write<mpt::PathString>("Recent File List", key, path); + } else + { + conf.Remove("Recent File List", key); + } + } } @@ -923,20 +959,24 @@ if(bStripFilename) { path = szFilenameFrom.GetDrive() + szFilenameFrom.GetDir(); - } - else + } else { path = szFilenameFrom; } - mpt::PathString szOldDir = directories[dir]; // for comparison + if(!path.HasTrailingSlash()) + { + path += MPT_PATHSTRING("\\"); + } + const mpt::PathString oldDir = directories[dir]; // for comparison + directories[dir] = path; // When updating default directory, also update the working directory. if(!path.empty() && directories == m_szDefaultDirectory) { - if(szOldDir != path) // update only if default directory has changed + if(oldDir != path) // update only if default directory has changed SetWorkingDirectory(path, dir); } } Modified: trunk/OpenMPT/mptrack/TrackerSettings.h =================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.h 2013-12-23 22:11:54 UTC (rev 3520) +++ trunk/OpenMPT/mptrack/TrackerSettings.h 2013-12-23 22:56:18 UTC (rev 3521) @@ -363,6 +363,9 @@ mpt::PathString m_szKbdFile; + Setting<uint32> mruListLength; + std::vector<mpt::PathString> mruFiles; + // Chords MPTChords Chords; Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2013-12-23 22:11:54 UTC (rev 3520) +++ trunk/OpenMPT/mptrack/mptrack.rc 2013-12-23 22:56:18 UTC (rev 3521) @@ -1967,7 +1967,7 @@ MENUITEM "Import &MIDI Library...", ID_IMPORT_MIDILIB MENUITEM "Add Sound &Bank...", ID_ADD_SOUNDBANK MENUITEM SEPARATOR - MENUITEM "Recent File", ID_FILE_MRU_FILE1 + MENUITEM "Recent File", ID_MRU_LIST_FIRST, GRAYED MENUITEM SEPARATOR MENUITEM "E&xit", ID_APP_EXIT END Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2013-12-23 22:11:54 UTC (rev 3520) +++ trunk/OpenMPT/mptrack/resource.h 2013-12-23 22:56:18 UTC (rev 3521) @@ -1206,6 +1206,8 @@ #define ID_SAMPLE_MONOCONVERT_SPLIT 44608 #define ID_SETQUANTIZE 44609 #define ID_PLUG_RECORD_MIDIOUT 44610 +#define ID_MRU_LIST_FIRST 44611 +#define ID_MRU_LIST_LAST 44642 // Next default values for new objects // @@ -1213,7 +1215,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 541 -#define _APS_NEXT_COMMAND_VALUE 44611 +#define _APS_NEXT_COMMAND_VALUE 44643 #define _APS_NEXT_CONTROL_VALUE 2462 #define _APS_NEXT_SYMED_VALUE 901 #endif Modified: trunk/OpenMPT/soundlib/plugins/PluginManager.cpp =================================================================== --- trunk/OpenMPT/soundlib/plugins/PluginManager.cpp 2013-12-23 22:11:54 UTC (rev 3520) +++ trunk/OpenMPT/soundlib/plugins/PluginManager.cpp 2013-12-23 22:56:18 UTC (rev 3521) @@ -480,10 +480,6 @@ { fullPath = theApp.GetAppDirPath() + MPT_PATHSTRING("Plugins\\"); } - if(!fullPath.HasTrailingSlash()) - { - fullPath += MPT_PATHSTRING("\\"); - } fullPath += mpt::PathString::FromUTF8(mixPlugin.GetLibraryName()) + MPT_PATHSTRING(".dll"); pFound = AddPlugin(fullPath); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |