📄 changetempo.cpp
字号:
this->SetAutoLayout(true); this->SetSizer(pBoxSizer_Dialog); pBoxSizer_Dialog->Fit(this); pBoxSizer_Dialog->SetSizeHints(this);}bool ChangeTempoDialog::Validate(){ return true; }bool ChangeTempoDialog::TransferDataToWindow(){ m_bLoopDetect = true; // percent change controls this->Update_Text_PercentChange(); this->Update_Slider_PercentChange(); // from/to BPM controls wxString str; if (m_pTextCtrl_FromBPM) { if (m_FromBPM != 0) str.Printf(wxT("%d"), m_FromBPM); else str = wxT(""); m_pTextCtrl_FromBPM->SetValue(str); } if (m_pTextCtrl_ToBPM) { if (m_ToBPM != 0) str.Printf(wxT("%d"), m_ToBPM); else str = wxT(""); m_pTextCtrl_ToBPM->SetValue(str); } // from/to Length controls if (m_pTextCtrl_FromLength) { str.Printf(wxT("%.2f"), m_FromLength); m_pTextCtrl_FromLength->SetValue(str); m_pTextCtrl_FromLength->Enable(false); // Disable because the value comes from the user selection. } if (m_pTextCtrl_ToLength) { str.Printf(wxT("%.2f"), m_ToLength); m_pTextCtrl_ToLength->SetValue(str); } m_bLoopDetect = false; return true;}bool ChangeTempoDialog::TransferDataFromWindow(){ wxString str; // percent change controls if (m_pTextCtrl_PercentChange) { str = m_pTextCtrl_PercentChange->GetValue(); double newValue = 0; str.ToDouble(&newValue); m_PercentChange = newValue; } // Ignore Slider_PercentChange because TextCtrl_PercentChange // always tracks it & is more precise (decimal points). // from/to BPM controls long newLong; if (m_pTextCtrl_FromBPM) { str = m_pTextCtrl_FromBPM->GetValue(); str.ToLong(&newLong); m_FromBPM = (unsigned int)(newLong); } if (m_pTextCtrl_ToBPM) { str = m_pTextCtrl_ToBPM->GetValue(); str.ToLong(&newLong); m_ToBPM = (unsigned int)(newLong); } // from/to Length controls // Don't do m_pTextCtrl_ToLength. It's disabled. if (m_pTextCtrl_ToLength) { str = m_pTextCtrl_ToLength->GetValue(); str.ToLong(&newLong); m_ToLength = (int)(newLong); } return true;}// handler implementations for ChangeTempoDialogvoid ChangeTempoDialog::OnText_PercentChange(wxCommandEvent & event){ if (m_bLoopDetect) return; if (m_pTextCtrl_PercentChange) { wxString str = m_pTextCtrl_PercentChange->GetValue(); double newValue = 0; str.ToDouble(&newValue); m_PercentChange = newValue; m_bLoopDetect = true; this->Update_Slider_PercentChange(); this->Update_Text_ToBPM(); this->Update_Text_ToLength(); m_bLoopDetect = false; FindWindow(wxID_OK)->Enable(m_PercentChange > -100.0); }}void ChangeTempoDialog::OnSlider_PercentChange(wxCommandEvent & event){ if (m_bLoopDetect) return; if (m_pSlider_PercentChange) { m_PercentChange = (double)(m_pSlider_PercentChange->GetValue()); // Warp positive values to actually go up faster & further than negatives. if (m_PercentChange > 0.0) m_PercentChange = pow(m_PercentChange, PERCENTCHANGE_SLIDER_WARP); m_bLoopDetect = true; this->Update_Text_PercentChange(); this->Update_Text_ToBPM(); this->Update_Text_ToLength(); m_bLoopDetect = false; }}void ChangeTempoDialog::OnText_FromBPM(wxCommandEvent & event){ if (m_bLoopDetect) return; if (m_pTextCtrl_FromBPM) { wxString str = m_pTextCtrl_FromBPM->GetValue(); long newValue; str.ToLong(&newValue); m_FromBPM = (unsigned int)(newValue); m_bLoopDetect = true; this->Update_Text_ToBPM(); m_bLoopDetect = false; }}void ChangeTempoDialog::OnText_ToBPM(wxCommandEvent & event){ if (m_bLoopDetect) return; if (m_pTextCtrl_ToBPM) { wxString str = m_pTextCtrl_ToBPM->GetValue(); long newValue; str.ToLong(&newValue); m_ToBPM = (unsigned int)(newValue); m_bLoopDetect = true; // If FromBPM has already been set, then there's a new percent change. if (m_FromBPM != 0) { m_PercentChange = (((double)(m_ToBPM) * 100.0) / (double)(m_FromBPM)) - 100.0; this->Update_Text_PercentChange(); this->Update_Slider_PercentChange(); this->Update_Text_ToLength(); } m_bLoopDetect = false; }}void ChangeTempoDialog::OnText_ToLength(wxCommandEvent & event){ if (m_bLoopDetect) return; if (m_pTextCtrl_ToLength) { wxString str = m_pTextCtrl_ToLength->GetValue(); double newValue = 0; str.ToDouble(&newValue); m_ToLength = newValue; m_PercentChange = ((m_FromLength * 100.0) / m_ToLength) - 100.0; m_bLoopDetect = true; this->Update_Text_PercentChange(); this->Update_Slider_PercentChange(); this->Update_Text_ToBPM(); m_bLoopDetect = false; }}void ChangeTempoDialog::OnPreview(wxCommandEvent &event){ TransferDataFromWindow(); // Save & restore parameters around Preview, because we didn't do OK. double oldPercentChange = m_pEffect->m_PercentChange; m_pEffect->m_PercentChange = m_PercentChange; m_pEffect->Preview(); m_pEffect->m_PercentChange = oldPercentChange;}void ChangeTempoDialog::OnOk(wxCommandEvent & event){ TransferDataFromWindow(); if (Validate()) EndModal(true); else event.Skip();}void ChangeTempoDialog::OnCancel(wxCommandEvent & event){ EndModal(false);}// helper fnsvoid ChangeTempoDialog::Update_Text_PercentChange(){ if (m_pTextCtrl_PercentChange) { wxString str; str.Printf(wxT("%.3f"), m_PercentChange); m_pTextCtrl_PercentChange->SetValue(str); }}void ChangeTempoDialog::Update_Slider_PercentChange(){ if (m_pSlider_PercentChange) { double unwarped = m_PercentChange; if (unwarped > 0.0) // Un-warp values above zero to actually go up to PERCENTCHANGE_MAX. unwarped = pow(m_PercentChange, (1.0 / PERCENTCHANGE_SLIDER_WARP)); // Add 0.5 to unwarped so trunc -> round. m_pSlider_PercentChange->SetValue((int)(unwarped + 0.5)); }}void ChangeTempoDialog::Update_Text_ToBPM() // Use m_FromBPM & m_PercentChange to set new m_ToBPM & control.{ // Update ToBPM iff FromBPM has been set. if (m_FromBPM == 0) return; m_ToBPM = (unsigned int)((((double)(m_FromBPM) * (100.0 + m_PercentChange)) / 100.0) + 0.5); // Add 0.5 so trunc -> round. if (m_pTextCtrl_ToBPM) { wxString str; str.Printf(wxT("%d"), m_ToBPM); m_pTextCtrl_ToBPM->SetValue(str); }}void ChangeTempoDialog::Update_Text_ToLength() // Use m_FromLength & m_PercentChange to set new m_ToLength & control.{ m_ToLength = (m_FromLength * 100.0) / (100.0 + m_PercentChange); if (m_pTextCtrl_ToLength) { wxString str; str.Printf(wxT("%.2f"), m_ToLength); m_pTextCtrl_ToLength->SetValue(str); }}#endif // USE_SOUNDTOUCH// Indentation settings for Vim and Emacs and unique identifier for Arch, a// version control system. Please do not modify past this point.//// Local Variables:// c-basic-offset: 3// indent-tabs-mode: nil// End://// vim: et sts=3 sw=3// arch-tag: 1a049a55-47b1-44d3-ba79-bb925f8e7b93
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -