/* * WelcomeDialog.cpp * ----------------- * Purpose: "First run" OpenMPT welcome 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 "WelcomeDialog.h" #include "resource.h" #include "Mainfrm.h" #include "../common/mptStringBuffer.h" #include "InputHandler.h" #include "CommandSet.h" #include "SelectPluginDialog.h" #include "UpdateCheck.h" OPENMPT_NAMESPACE_BEGIN BEGIN_MESSAGE_MAP(WelcomeDlg, CDialog) ON_COMMAND(IDC_BUTTON1, &WelcomeDlg::OnOptions) ON_COMMAND(IDC_BUTTON2, &WelcomeDlg::OnScanPlugins) END_MESSAGE_MAP() WelcomeDlg::WelcomeDlg(CWnd *parent) { Create(IDD_WECLOME, parent); CenterWindow(parent); } static mpt::PathString GetFullKeyPath(const char *keyFile) { return theApp.GetInstallPkgPath() + P_("extraKeymaps\\") + mpt::PathString::FromUTF8(keyFile) + P_(".mkb"); } BOOL WelcomeDlg::OnInitDialog() { CDialog::OnInitDialog(); #ifdef MPT_WITH_VST HKEY hkEnum = NULL; TCHAR str[MAX_PATH]; DWORD datasize = sizeof(str); DWORD datatype = REG_SZ; if(RegOpenKey(HKEY_LOCAL_MACHINE, _T("Software\\VST"), &hkEnum) == ERROR_SUCCESS && RegQueryValueEx(hkEnum, _T("VSTPluginsPath"), 0, &datatype, (LPBYTE)str, &datasize) == ERROR_SUCCESS) { m_vstPath = mpt::PathString::FromNative(ParseMaybeNullTerminatedStringFromBufferWithSizeInBytes(str, datasize)); } else if(SHGetSpecialFolderPath(0, str, CSIDL_PROGRAM_FILES, FALSE)) { m_vstPath = mpt::PathString::FromNative(ParseMaybeNullTerminatedStringFromBufferWithSizeInBytes(str, datasize)) + P_("\\Steinberg\\VstPlugins\\"); if(!m_vstPath.IsDirectory()) { m_vstPath = mpt::PathString(); } } SetDlgItemText(IDC_EDIT2, mpt::ToCString(TrackerSettings::Instance().defaultArtist)); if(!m_vstPath.empty()) { SetDlgItemText(IDC_EDIT1, m_vstPath.AsNative().c_str()); if(TrackerSettings::Instance().PathPlugins.GetDefaultDir().empty()) { TrackerSettings::Instance().PathPlugins.SetDefaultDir(m_vstPath); } } else #endif // MPT_WITH_VST { SetDlgItemText(IDC_EDIT1, _T("No plugin path found!")); GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE); } const char *keyFile = nullptr; const TCHAR *keyFileName = nullptr; const uint16 language = LOWORD(GetKeyboardLayout(0)), primaryLang = language & 0x3FF; CComboBox *combo = (CComboBox *)GetDlgItem(IDC_COMBO1); combo->AddString(_T("OpenMPT / Chromatic (Default)")); combo->SetCurSel(0); switch(primaryLang) { case LANG_GERMAN: keyFile = "DE_jojo"; keyFileName = _T("German"); break; case LANG_SPANISH: // Spanish latin-american keymap, so we ignore Spain. if(language != SUBLANG_SPANISH_MODERN && language != SUBLANG_SPANISH) { keyFile = "es-LA_mpt_(jmkz)"; keyFileName = _T("Spanish"); } break; case LANG_FRENCH: keyFile = "FR_mpt_(legovitch)"; keyFileName = _T("French"); break; case LANG_NORWEGIAN: keyFile = "NO_mpt_classic_(rakib)"; keyFileName = _T("Norwegian"); break; } if(keyFile != nullptr) { if(GetFullKeyPath(keyFile).IsFile()) { int i = combo->AddString(_T("OpenMPT / Chromatic (") + CString(keyFileName) + _T(")")); combo->SetItemDataPtr(i, (void *)keyFile); combo->SetCurSel(i); // As this is presented as the default, load it right now, even if the user closes the dialog through the close button auto cmdSet = std::make_unique(); cmdSet->LoadFile(GetFullKeyPath(keyFile)); CMainFrame::GetInputHandler()->SetNewCommandSet(cmdSet.get()); } } combo->SetItemDataPtr(combo->AddString(_T("Impulse Tracker")), (void*)("US_mpt-it2_classic")); combo->SetItemDataPtr(combo->AddString(_T("FastTracker 2")), (void*)("US_mpt-ft2_classic")); CheckDlgButton(IDC_CHECK1, BST_CHECKED); CheckDlgButton(IDC_CHECK3, BST_CHECKED); #if defined(MPT_ENABLE_UPDATE) GetDlgItem(IDC_STATIC_WELCOME_STATISTICS)->SetWindowText(mpt::ToCString(mpt::String::Replace(CUpdateCheck::GetStatisticsUserInformation(false), U_("\n"), U_(" ")))); #endif // MPT_ENABLE_UPDATE CheckDlgButton(IDC_CHECK2, (TrackerSettings::Instance().patternFont.Get().name == PATTERNFONT_LARGE) ? BST_CHECKED : BST_UNCHECKED); ShowWindow(SW_SHOW); return TRUE; } void WelcomeDlg::OnOptions() { OnOK(); CMainFrame::GetMainFrame()->PostMessage(WM_COMMAND, ID_VIEW_OPTIONS); } void WelcomeDlg::OnScanPlugins() { #ifdef MPT_WITH_VST CSelectPluginDlg::ScanPlugins(m_vstPath, this); #endif // MPT_WITH_VST } void WelcomeDlg::OnOK() { CDialog::OnOK(); #if defined(MPT_ENABLE_UPDATE) bool runUpdates = IsDlgButtonChecked(IDC_CHECK1) != BST_UNCHECKED; TrackerSettings::Instance().UpdateIntervalDays = (runUpdates ? 7 : -1); TrackerSettings::Instance().UpdateStatistics = (IsDlgButtonChecked(IDC_CHECK3) != BST_UNCHECKED); TrackerSettings::Instance().UpdateShowUpdateHint = false; TrackerSettings::Instance().UpdateStatisticsConsentAsked = true; CString artistName; GetDlgItemText(IDC_EDIT2, artistName); TrackerSettings::Instance().defaultArtist = mpt::ToUnicode(artistName); #endif // MPT_ENABLE_UPDATE if(IsDlgButtonChecked(IDC_CHECK2) != BST_UNCHECKED) { FontSetting font = TrackerSettings::Instance().patternFont; font.name = PATTERNFONT_LARGE; TrackerSettings::Instance().patternFont = font; } CComboBox *combo = (CComboBox *)GetDlgItem(IDC_COMBO1); const char *keyFile = static_cast(combo->GetItemDataPtr(combo->GetCurSel())); auto cmdSet = std::make_unique(); if(keyFile != nullptr) cmdSet->LoadFile(GetFullKeyPath(keyFile)); else cmdSet->LoadDefaultKeymap(); CMainFrame::GetInputHandler()->SetNewCommandSet(cmdSet.get()); #if defined(MPT_ENABLE_UPDATE) if(runUpdates) { CUpdateCheck::DoAutoUpdateCheck(); } #endif // MPT_ENABLE_UPDATE CMainFrame::GetMainFrame()->PostMessage(WM_MOD_INVALIDATEPATTERNS, HINT_MPTOPTIONS); DestroyWindow(); } void WelcomeDlg::OnCancel() { CDialog::OnCancel(); DestroyWindow(); } OPENMPT_NAMESPACE_END