/* * PathConfigDlg.cpp * ----------------- * Purpose: Default paths and auto save setup dialog. * Notes : (currently none) * Authors: OpenMPT Devs * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. */ #include "stdafx.h" #include "resource.h" #include "PathConfigDlg.h" #include "FileDialog.h" #include "Mainfrm.h" OPENMPT_NAMESPACE_BEGIN static constexpr std::pair PathSettings[] = { { &TrackerSettings::PathSongs, IDC_OPTIONS_DIR_MODS }, { &TrackerSettings::PathSamples, IDC_OPTIONS_DIR_SAMPS }, { &TrackerSettings::PathInstruments, IDC_OPTIONS_DIR_INSTS }, { &TrackerSettings::PathPlugins, IDC_OPTIONS_DIR_VSTS }, { &TrackerSettings::PathPluginPresets, IDC_OPTIONS_DIR_VSTPRESETS }, { &TrackerSettings::AutosavePath, IDC_AUTOSAVE_PATH }, }; IMPLEMENT_DYNAMIC(PathConfigDlg, CPropertyPage) PathConfigDlg::PathConfigDlg() : CPropertyPage(IDD_OPTIONS_AUTOSAVE) { } void PathConfigDlg::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(PathConfigDlg, CPropertyPage) // Paths ON_EN_CHANGE(IDC_OPTIONS_DIR_MODS, &PathConfigDlg::OnSettingsChanged) ON_EN_CHANGE(IDC_OPTIONS_DIR_SAMPS, &PathConfigDlg::OnSettingsChanged) ON_EN_CHANGE(IDC_OPTIONS_DIR_INSTS, &PathConfigDlg::OnSettingsChanged) ON_EN_CHANGE(IDC_OPTIONS_DIR_VSTPRESETS, &PathConfigDlg::OnSettingsChanged) ON_COMMAND(IDC_BUTTON_CHANGE_MODDIR, &PathConfigDlg::OnBrowseSongs) ON_COMMAND(IDC_BUTTON_CHANGE_SAMPDIR, &PathConfigDlg::OnBrowseSamples) ON_COMMAND(IDC_BUTTON_CHANGE_INSTRDIR, &PathConfigDlg::OnBrowseInstruments) ON_COMMAND(IDC_BUTTON_CHANGE_VSTDIR, &PathConfigDlg::OnBrowsePlugins) ON_COMMAND(IDC_BUTTON_CHANGE_VSTPRESETSDIR, &PathConfigDlg::OnBrowsePresets) // Autosave ON_COMMAND(IDC_CHECK1, &PathConfigDlg::OnSettingsChanged) ON_BN_CLICKED(IDC_AUTOSAVE_BROWSE, &PathConfigDlg::OnBrowseAutosavePath) ON_BN_CLICKED(IDC_AUTOSAVE_ENABLE, &PathConfigDlg::OnAutosaveEnable) ON_BN_CLICKED(IDC_AUTOSAVE_USEORIGDIR, &PathConfigDlg::OnAutosaveUseOrigDir) ON_BN_CLICKED(IDC_AUTOSAVE_USECUSTOMDIR, &PathConfigDlg::OnAutosaveUseOrigDir) ON_EN_UPDATE(IDC_AUTOSAVE_PATH, &PathConfigDlg::OnSettingsChanged) ON_EN_UPDATE(IDC_AUTOSAVE_HISTORY, &PathConfigDlg::OnSettingsChanged) ON_EN_UPDATE(IDC_AUTOSAVE_INTERVAL, &PathConfigDlg::OnSettingsChanged) END_MESSAGE_MAP() BOOL PathConfigDlg::OnInitDialog() { CPropertyPage::OnInitDialog(); const auto &settings = TrackerSettings::Instance(); // Default paths for(const auto & [path, id] : PathSettings) { SetDlgItemText(id, (settings.*path).GetDefaultDir().AsNative().c_str()); } // Autosave CheckDlgButton(IDC_CHECK1, settings.CreateBackupFiles ? BST_CHECKED : BST_UNCHECKED); static_cast(GetDlgItem(IDC_SPIN1))->SetRange32(1, int32_max); static_cast(GetDlgItem(IDC_SPIN2))->SetRange32(1, int32_max); CheckDlgButton(IDC_AUTOSAVE_ENABLE, settings.AutosaveEnabled ? BST_CHECKED : BST_UNCHECKED); SetDlgItemInt(IDC_AUTOSAVE_HISTORY, settings.AutosaveHistoryDepth); SetDlgItemInt(IDC_AUTOSAVE_INTERVAL, settings.AutosaveIntervalMinutes); CheckDlgButton(IDC_AUTOSAVE_USEORIGDIR, settings.AutosaveUseOriginalPath ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(IDC_AUTOSAVE_USECUSTOMDIR, settings.AutosaveUseOriginalPath ? BST_UNCHECKED : BST_CHECKED); //enable/disable stuff as appropriate OnAutosaveEnable(); OnAutosaveUseOrigDir(); return TRUE; } mpt::PathString PathConfigDlg::GetPath(int id) { return mpt::PathString::FromCString(GetWindowTextString(*GetDlgItem(id))).EnsureTrailingSlash(); } void PathConfigDlg::OnOK() { auto &settings = TrackerSettings::Instance(); // Default paths for(const auto &path : PathSettings) { (settings.*path.first).SetDefaultDir(GetPath(path.second)); } // Autosave settings.CreateBackupFiles = IsDlgButtonChecked(IDC_CHECK1) != BST_UNCHECKED; settings.AutosaveEnabled = (IsDlgButtonChecked(IDC_AUTOSAVE_ENABLE) != BST_UNCHECKED); settings.AutosaveHistoryDepth = (GetDlgItemInt(IDC_AUTOSAVE_HISTORY)); settings.AutosaveIntervalMinutes = (GetDlgItemInt(IDC_AUTOSAVE_INTERVAL)); settings.AutosaveUseOriginalPath = (IsDlgButtonChecked(IDC_AUTOSAVE_USEORIGDIR) == BST_CHECKED); CPropertyPage::OnOK(); } void PathConfigDlg::BrowseFolder(UINT nID) { const TCHAR *prompt = (nID == IDC_AUTOSAVE_PATH) ? _T("Select a folder to store autosaved files in...") : _T("Select a default folder..."); BrowseForFolder dlg(GetPath(nID), prompt); if(dlg.Show(this)) { SetDlgItemText(nID, dlg.GetDirectory().AsNative().c_str()); OnSettingsChanged(); } } void PathConfigDlg::OnAutosaveEnable() { BOOL enabled = IsDlgButtonChecked(IDC_AUTOSAVE_ENABLE); GetDlgItem(IDC_AUTOSAVE_INTERVAL)->EnableWindow(enabled); GetDlgItem(IDC_SPIN1)->EnableWindow(enabled); GetDlgItem(IDC_AUTOSAVE_HISTORY)->EnableWindow(enabled); GetDlgItem(IDC_SPIN2)->EnableWindow(enabled); GetDlgItem(IDC_AUTOSAVE_USEORIGDIR)->EnableWindow(enabled); GetDlgItem(IDC_AUTOSAVE_USECUSTOMDIR)->EnableWindow(enabled); GetDlgItem(IDC_AUTOSAVE_PATH)->EnableWindow(enabled); GetDlgItem(IDC_AUTOSAVE_BROWSE)->EnableWindow(enabled); OnSettingsChanged(); return; } void PathConfigDlg::OnAutosaveUseOrigDir() { if (IsDlgButtonChecked(IDC_AUTOSAVE_ENABLE)) { BOOL enabled = IsDlgButtonChecked(IDC_AUTOSAVE_USEORIGDIR); GetDlgItem(IDC_AUTOSAVE_PATH)->EnableWindow(!enabled); GetDlgItem(IDC_AUTOSAVE_BROWSE)->EnableWindow(!enabled); OnSettingsChanged(); } return; } void PathConfigDlg::OnSettingsChanged() { SetModified(TRUE); } BOOL PathConfigDlg::OnSetActive() { CMainFrame::m_nLastOptionsPage = OPTIONS_PAGE_PATHS; return CPropertyPage::OnSetActive(); } BOOL PathConfigDlg::OnKillActive() { mpt::PathString path = GetPath(IDC_AUTOSAVE_PATH); if (!path.IsDirectory() && IsDlgButtonChecked(IDC_AUTOSAVE_ENABLE) && !IsDlgButtonChecked(IDC_AUTOSAVE_USEORIGDIR)) { Reporting::Error("Backup path does not exist."); GetDlgItem(IDC_AUTOSAVE_PATH)->SetFocus(); return 0; } return CPropertyPage::OnKillActive(); } OPENMPT_NAMESPACE_END