2424
2525OPENMPT_NAMESPACE_BEGIN
2626
27+ static void PopulateSampleLengthUnitComboBox (CComboBox &comboBox, SampleLengthUnit unit)
28+ {
29+ comboBox.SetItemData (comboBox.AddString (_T (" samples" )), static_cast <DWORD_PTR >(SampleLengthUnit::Samples));
30+ comboBox.SetItemData (comboBox.AddString (_T (" ms" )), static_cast <DWORD_PTR >(SampleLengthUnit::Milliseconds));
31+ comboBox.SetCurSel (static_cast <int >(unit));
32+ }
2733
2834// ////////////////////////////////////////////////////////////////////////
2935// Sample amplification dialog
@@ -577,9 +583,7 @@ BOOL AddSilenceDlg::OnInitDialog()
577583 CComboBox *box = static_cast <CComboBox *>(GetDlgItem (IDC_COMBO1 ));
578584 if (box)
579585 {
580- box->AddString (_T (" samples" ));
581- box->AddString (_T (" ms" ));
582- box->SetCurSel (m_unit);
586+ PopulateSampleLengthUnitComboBox (*box, m_unit);
583587 if (m_sampleRate == 0 )
584588 {
585589 // Can't do any conversions if samplerate is unknown
@@ -607,7 +611,7 @@ BOOL AddSilenceDlg::OnInitDialog()
607611void AddSilenceDlg::OnOK ()
608612{
609613 m_numSamples = GetDlgItemInt (IDC_EDIT_ADDSILENCE , nullptr , FALSE );
610- if (m_unit == kMilliseconds )
614+ if (m_unit == SampleLengthUnit::Milliseconds )
611615 {
612616 m_numSamples = Util::muldivr_unsigned (m_numSamples, m_sampleRate, 1000 );
613617 }
@@ -648,13 +652,14 @@ void AddSilenceDlg::OnEditModeChanged()
648652
649653void AddSilenceDlg::OnUnitChanged ()
650654{
651- const auto unit = static_cast <Unit>(static_cast <CComboBox*>(GetDlgItem (IDC_COMBO1 ))->GetCurSel ());
655+ CComboBox *box = static_cast <CComboBox *>(GetDlgItem (IDC_COMBO1 ));
656+ const auto unit = static_cast <SampleLengthUnit>(box->GetItemData (box->GetCurSel ()));
652657 if (m_unit == unit)
653658 return ;
654659
655660 m_unit = unit;
656661 SmpLength duration = GetDlgItemInt (IDC_EDIT_ADDSILENCE );
657- if (m_unit == kSamples )
662+ if (m_unit == SampleLengthUnit::Samples )
658663 {
659664 // Convert from milliseconds
660665 duration = Util::muldivr_unsigned (duration, m_sampleRate, 1000 );
@@ -681,42 +686,144 @@ AddSilenceDlg::AddSilenceOptions AddSilenceDlg::GetEditMode() const
681686// ///////////////////////////////////////////////////////////////////////
682687// Sample grid dialog
683688
689+ BEGIN_MESSAGE_MAP (CSampleGridDlg, DialogBase)
690+ ON_CBN_SELCHANGE (IDC_COMBO1 , &CSampleGridDlg::OnUnitChanged)
691+ ON_EN_SETFOCUS(IDC_EDIT1 , &CSampleGridDlg::OnSegmentsFocus)
692+ ON_EN_SETFOCUS(IDC_EDIT2 , &CSampleGridDlg::OnSpacingFocus)
693+ ON_EN_CHANGE(IDC_EDIT1 , &CSampleGridDlg::OnSegmentsChanged)
694+ ON_EN_CHANGE(IDC_EDIT2 , &CSampleGridDlg::OnSpacingChanged)
695+ END_MESSAGE_MAP()
696+
697+
684698void CSampleGridDlg::DoDataExchange(CDataExchange* pDX)
685699{
686700 DialogBase::DoDataExchange (pDX);
687701 // {{AFX_DATA_MAP(CSampleGridDlg)
688- DDX_Control (pDX, IDC_EDIT1 , m_EditSegments);
689702 DDX_Control (pDX, IDC_SPIN1 , m_SpinSegments);
703+ DDX_Control (pDX, IDC_SPIN2 , m_SpinSpacing);
704+ DDX_Control (pDX, IDC_COMBO1 , m_ComboUnit);
690705 // }}AFX_DATA_MAP
691706}
692707
693708
694- CSampleGridDlg::CSampleGridDlg (CWnd* parent, SmpLength nSegments, SmpLength nMaxSegments )
709+ CSampleGridDlg::CSampleGridDlg (CWnd * parent, SampleGridMode mode, double segments, double spacing, SampleLengthUnit unit, SmpLength maxSegments, uint32 sampleRate )
695710 : DialogBase{IDD_SAMPLE_GRID_SIZE , parent}
696- , m_nSegments{nSegments}
697- , m_nMaxSegments{nMaxSegments}
711+ , m_mode{mode}
712+ , m_maxSegments{maxSegments}
713+ , m_segments{std::max (segments, 2.0 )}
714+ , m_spacing{spacing}
715+ , m_unit{unit}
716+ , m_sampleRate{sampleRate > 0 ? sampleRate : 8363u }
698717{
699718}
700719
701720
702721BOOL CSampleGridDlg::OnInitDialog ()
703722{
704723 DialogBase::OnInitDialog ();
705- m_SpinSegments.SetRange32 (0 , m_nMaxSegments);
706- m_SpinSegments.SetPos (m_nSegments);
707- SetDlgItemInt (IDC_EDIT1 , m_nSegments, FALSE );
708- GetDlgItem (IDC_EDIT1 )->SetFocus ();
709- return TRUE ;
724+
725+ PopulateSampleLengthUnitComboBox (m_ComboUnit, m_unit);
726+
727+ m_SpinSegments.SetRange32 (1 , m_maxSegments);
728+ m_SpinSegments.SetPos32 (mpt::saturate_round<int32>(m_segments));
729+ m_EditSegments.SubclassDlgItem (IDC_EDIT1 , this );
730+ m_EditSegments.AllowFractions (true );
731+ m_EditSegments.AllowNegative (false );
732+ m_EditSegments.SetDecimalValue (m_segments);
733+
734+ m_SpinSpacing.SetRange32 (0 , m_maxSegments);
735+ m_SpinSpacing.SetPos32 (mpt::saturate_round<int32>(m_spacing));
736+ m_EditSpacing.SubclassDlgItem (IDC_EDIT2 , this );
737+ m_EditSpacing.AllowFractions (true );
738+ m_EditSpacing.AllowNegative (false );
739+ m_EditSpacing.SetDecimalValue (m_spacing);
740+
741+ int radioChoice = IDC_RADIO1 ;
742+ switch (m_mode)
743+ {
744+ case SampleGridMode::NoGrid:
745+ case SampleGridMode::DivideIntoSegments:
746+ radioChoice = IDC_RADIO2 ;
747+ GotoDlgCtrl (&m_EditSegments);
748+ break ;
749+ case SampleGridMode::DivideEveryN:
750+ radioChoice = IDC_RADIO3 ;
751+ GotoDlgCtrl (&m_EditSpacing);
752+ break ;
753+ }
754+ CheckRadioButton (IDC_RADIO1 , IDC_RADIO3 , radioChoice);
755+
756+ m_locked = false ;
757+ return FALSE ;
710758}
711759
712760
713761void CSampleGridDlg::OnOK ()
714762{
715- m_nSegments = GetDlgItemInt (IDC_EDIT1 , NULL , FALSE );
763+ if (IsDlgButtonChecked (IDC_RADIO1 ))
764+ {
765+ m_mode = SampleGridMode::NoGrid;
766+ } else if (IsDlgButtonChecked (IDC_RADIO2 ))
767+ {
768+ m_mode = SampleGridMode::DivideIntoSegments;
769+ m_EditSegments.GetDecimalValue (m_segments);
770+ if (m_segments < 1.0 )
771+ {
772+ MessageBeep (MB_ICONWARNING );
773+ m_EditSegments.SetFocus ();
774+ return ;
775+ }
776+ } else if (IsDlgButtonChecked (IDC_RADIO3 ))
777+ {
778+ m_mode = SampleGridMode::DivideEveryN;
779+ m_EditSpacing.GetDecimalValue (m_spacing);
780+ m_unit = static_cast <SampleLengthUnit>(m_ComboUnit.GetItemData (m_ComboUnit.GetCurSel ()));
781+
782+ double effectiveSamples = m_spacing;
783+ if (m_unit == SampleLengthUnit::Milliseconds)
784+ effectiveSamples *= m_sampleRate / 1000.0 ;
785+
786+ if (effectiveSamples < 1.0 )
787+ {
788+ MessageBeep (MB_ICONWARNING );
789+ m_EditSpacing.SetFocus ();
790+ return ;
791+ }
792+ }
716793 DialogBase::OnOK ();
717794}
718795
719796
797+ void CSampleGridDlg::OnUnitChanged ()
798+ {
799+ const auto newUnit = static_cast <SampleLengthUnit>(m_ComboUnit.GetItemData (m_ComboUnit.GetCurSel ()));
800+ if (newUnit == m_unit)
801+ return ;
802+
803+ double val = 0.0 ;
804+ m_EditSpacing.GetDecimalValue (val);
805+ if (newUnit == SampleLengthUnit::Milliseconds)
806+ val *= 1000.0 / m_sampleRate;
807+ else
808+ val *= m_sampleRate / 1000.0 ;
809+ m_unit = newUnit;
810+ m_locked = true ;
811+ m_EditSpacing.SetDecimalValue (val);
812+ m_locked = false ;
813+
814+ CheckRadioButton (IDC_RADIO1 , IDC_RADIO3 , IDC_RADIO3 );
815+ }
816+
817+
818+ void CSampleGridDlg::OnEditChanged (int radio, bool onlyMouse)
819+ {
820+ if (m_locked || m_lastInputDevice == InputDevice::Unknown)
821+ return ;
822+ if (!onlyMouse || m_lastInputDevice == InputDevice::Mouse)
823+ CheckRadioButton (IDC_RADIO1 , IDC_RADIO3 , IDC_RADIO1 + radio);
824+ }
825+
826+
720827// ///////////////////////////////////////////////////////////////////////
721828// Sample cross-fade dialog
722829
0 commit comments