X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5e173f35d2a8177371d13d059d9f897e2c4f98be..6344162a81f74b3fbab0803405eebc0c0b83e797:/samples/widgets/slider.cpp diff --git a/samples/widgets/slider.cpp b/samples/widgets/slider.cpp index 7c51fdf16c..b0f1fa8d3e 100644 --- a/samples/widgets/slider.cpp +++ b/samples/widgets/slider.cpp @@ -28,6 +28,7 @@ #ifndef WX_PRECOMP #include "wx/log.h" + #include "wx/bitmap.h" #include "wx/button.h" #include "wx/checkbox.h" #include "wx/radiobox.h" @@ -36,10 +37,14 @@ #include "wx/textctrl.h" #endif +#if wxUSE_TOOLTIPS + #include "wx/tooltip.h" +#endif + #include "wx/sizer.h" #include "widgets.h" - +#if wxUSE_SLIDER #include "icons/slider.xpm" // ---------------------------------------------------------------------------- @@ -49,20 +54,32 @@ // control ids enum { - SliderPage_Reset = 100, + SliderPage_Reset = wxID_HIGHEST, SliderPage_Clear, SliderPage_SetValue, SliderPage_SetMinAndMax, SliderPage_SetTickFreq, + SliderPage_SetThumbLen, SliderPage_CurValueText, SliderPage_ValueText, SliderPage_MinText, SliderPage_MaxText, SliderPage_TickFreqText, - SliderPage_OtherSide, + SliderPage_ThumbLenText, + SliderPage_RadioSides, + SliderPage_BothSides, SliderPage_Slider }; +// sides radiobox values +enum +{ + StaticSides_Top, + StaticSides_Bottom, + StaticSides_Left, + StaticSides_Right +}; + // ---------------------------------------------------------------------------- // SliderWidgetsPage // ---------------------------------------------------------------------------- @@ -80,15 +97,18 @@ protected: void OnButtonSetValue(wxCommandEvent& event); void OnButtonSetMinAndMax(wxCommandEvent& event); void OnButtonSetTickFreq(wxCommandEvent& event); + void OnButtonSetThumbLen(wxCommandEvent& event); void OnCheckOrRadioBox(wxCommandEvent& event); - void OnSlider(wxCommandEvent& event); + void OnSlider(wxScrollEvent& event); - void OnUpdateUIOtherSide(wxUpdateUIEvent& event); void OnUpdateUIValueButton(wxUpdateUIEvent& event); void OnUpdateUIMinMaxButton(wxUpdateUIEvent& event); void OnUpdateUITickFreq(wxUpdateUIEvent& event); + void OnUpdateUIThumbLen(wxUpdateUIEvent& event); + void OnUpdateUIRadioSides(wxUpdateUIEvent& event); + void OnUpdateUIBothSides(wxUpdateUIEvent& event); void OnUpdateUIResetButton(wxUpdateUIEvent& event); @@ -103,6 +123,9 @@ protected: // set the tick frequency from the text field value void DoSetTickFreq(); + // set the thumb len from the text field value + void DoSetThumbLen(); + // is this slider value in range? bool IsValidValue(int val) const { return (val >= m_min) && (val <= m_max); } @@ -115,9 +138,11 @@ protected: // the check/radio boxes for styles wxCheckBox *m_chkLabels, - *m_chkOtherSide, *m_chkVert, - *m_chkTicks; + *m_chkTicks, + *m_chkBothSides; + + wxRadioBox *m_radioSides; // the slider itself and the sizer it is in wxSlider *m_slider; @@ -127,7 +152,8 @@ protected: wxTextCtrl *m_textValue, *m_textMin, *m_textMax, - *m_textTickFreq; + *m_textTickFreq, + *m_textThumbLen; private: DECLARE_EVENT_TABLE() @@ -143,19 +169,21 @@ BEGIN_EVENT_TABLE(SliderWidgetsPage, WidgetsPage) EVT_BUTTON(SliderPage_SetValue, SliderWidgetsPage::OnButtonSetValue) EVT_BUTTON(SliderPage_SetMinAndMax, SliderWidgetsPage::OnButtonSetMinAndMax) EVT_BUTTON(SliderPage_SetTickFreq, SliderWidgetsPage::OnButtonSetTickFreq) - - EVT_UPDATE_UI(SliderPage_OtherSide, SliderWidgetsPage::OnUpdateUIOtherSide) + EVT_BUTTON(SliderPage_SetThumbLen, SliderWidgetsPage::OnButtonSetThumbLen) EVT_UPDATE_UI(SliderPage_SetValue, SliderWidgetsPage::OnUpdateUIValueButton) EVT_UPDATE_UI(SliderPage_SetMinAndMax, SliderWidgetsPage::OnUpdateUIMinMaxButton) EVT_UPDATE_UI(SliderPage_SetTickFreq, SliderWidgetsPage::OnUpdateUITickFreq) + EVT_UPDATE_UI(SliderPage_SetThumbLen, SliderWidgetsPage::OnUpdateUIThumbLen) EVT_UPDATE_UI(SliderPage_TickFreqText, SliderWidgetsPage::OnUpdateUITickFreq) + EVT_UPDATE_UI(SliderPage_RadioSides, SliderWidgetsPage::OnUpdateUIRadioSides) + EVT_UPDATE_UI(SliderPage_BothSides, SliderWidgetsPage::OnUpdateUIBothSides) EVT_UPDATE_UI(SliderPage_Reset, SliderWidgetsPage::OnUpdateUIResetButton) EVT_UPDATE_UI(SliderPage_CurValueText, SliderWidgetsPage::OnUpdateUICurValueText) - EVT_SLIDER(SliderPage_Slider, SliderWidgetsPage::OnSlider) + EVT_COMMAND_SCROLL(SliderPage_Slider, SliderWidgetsPage::OnSlider) EVT_CHECKBOX(-1, SliderWidgetsPage::OnCheckOrRadioBox) EVT_RADIOBOX(-1, SliderWidgetsPage::OnCheckOrRadioBox) @@ -180,7 +208,9 @@ SliderWidgetsPage::SliderWidgetsPage(wxNotebook *notebook, m_chkVert = m_chkTicks = m_chkLabels = - m_chkOtherSide = (wxCheckBox *)NULL; + m_chkBothSides = (wxCheckBox *)NULL; + + m_radioSides = (wxRadioBox *)NULL; m_slider = (wxSlider *)NULL; m_sizerSlider = (wxSizer *)NULL; @@ -194,12 +224,23 @@ SliderWidgetsPage::SliderWidgetsPage(wxNotebook *notebook, m_chkVert = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Vertical")); m_chkTicks = CreateCheckBoxAndAddToSizer(sizerLeft, _T("Show &ticks")); m_chkLabels = CreateCheckBoxAndAddToSizer(sizerLeft, _T("Show &labels")); - m_chkOtherSide = CreateCheckBoxAndAddToSizer - ( - sizerLeft, - _T("On &other side"), - SliderPage_OtherSide - ); + static const wxString sides[] = + { + _T("top"), + _T("bottom"), + _T("left"), + _T("right"), + }; + m_radioSides = new wxRadioBox(this, SliderPage_RadioSides, _T("&Ticks/Labels"), + wxDefaultPosition, wxDefaultSize, + WXSIZEOF(sides), sides, + 1, wxRA_SPECIFY_COLS); + sizerLeft->Add(m_radioSides, 0, wxGROW | wxALL, 5); + m_chkBothSides = CreateCheckBoxAndAddToSizer + (sizerLeft, _T("&Both sides"), SliderPage_BothSides); +#if wxUSE_TOOLTIPS + m_chkBothSides->SetToolTip( _T("\"Both sides\" is only supported \nin Win95 and Universal") ); +#endif // wxUSE_TOOLTIPS sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer @@ -232,8 +273,8 @@ SliderWidgetsPage::SliderWidgetsPage(wxNotebook *notebook, m_textMax = new wxTextCtrl(this, SliderPage_MaxText, _T("")); sizerRow->Add(m_textMax, 1, wxLEFT | wxALIGN_CENTRE_VERTICAL, 5); - m_textMin->SetValue(wxString::Format(_T("%lu"), m_min)); - m_textMax->SetValue(wxString::Format(_T("%lu"), m_max)); + m_textMin->SetValue( wxString::Format(_T("%d"), m_min) ); + m_textMax->SetValue( wxString::Format(_T("%d"), m_max) ); sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); @@ -246,9 +287,16 @@ SliderWidgetsPage::SliderWidgetsPage(wxNotebook *notebook, sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); + sizerRow = CreateSizerWithTextAndButton(SliderPage_SetThumbLen, + _T("Thumb &lenght"), + SliderPage_ThumbLenText, + &m_textThumbLen); + + sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); + // right pane wxSizer *sizerRight = new wxBoxSizer(wxHORIZONTAL); - sizerRight->SetMinSize(250, 0); + sizerRight->SetMinSize(150, 40); m_sizerSlider = sizerRight; // save it to modify it later Reset(); @@ -256,7 +304,7 @@ SliderWidgetsPage::SliderWidgetsPage(wxNotebook *notebook, // the 3 panes panes compose the window sizerTop->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10); - sizerTop->Add(sizerMiddle, 1, wxGROW | wxALL, 10); + sizerTop->Add(sizerMiddle, 0, wxGROW | wxALL, 10); sizerTop->Add(sizerRight, 1, wxGROW | (wxALL & ~wxRIGHT), 10); // final initializations @@ -276,10 +324,12 @@ SliderWidgetsPage::~SliderWidgetsPage() void SliderWidgetsPage::Reset() { - m_chkLabels->SetValue(TRUE); - m_chkTicks->SetValue(FALSE); m_chkVert->SetValue(FALSE); - m_chkOtherSide->SetValue(FALSE); + m_chkTicks->SetValue(TRUE); + m_chkLabels->SetValue(TRUE); + m_chkBothSides->SetValue(FALSE); + + m_radioSides->SetSelection(StaticSides_Top); } void SliderWidgetsPage::CreateSlider() @@ -295,11 +345,6 @@ void SliderWidgetsPage::CreateSlider() if ( m_chkLabels->GetValue() ) { flags |= wxSL_LABELS; - - if ( m_chkOtherSide->GetValue() ) - flags |= isVert ? wxSL_RIGHT : wxSL_BOTTOM; - else - flags |= isVert ? wxSL_LEFT : wxSL_TOP; } if ( m_chkTicks->GetValue() ) @@ -307,6 +352,30 @@ void SliderWidgetsPage::CreateSlider() flags |= wxSL_AUTOTICKS; } + switch ( m_radioSides->GetSelection() ) + { + case StaticSides_Top: + flags |= wxSL_TOP; + break; + case StaticSides_Left: + flags |= wxSL_LEFT; + break; + case StaticSides_Bottom: + flags |= wxSL_BOTTOM; + break; + case StaticSides_Right: + flags |= wxSL_RIGHT; + break; + default: + wxFAIL_MSG(_T("unexpected radiobox selection")); + // fall through + } + + if ( m_chkBothSides->GetValue() ) + { + flags |= wxSL_BOTH; + } + int val = m_min; if ( m_slider ) { @@ -316,13 +385,13 @@ void SliderWidgetsPage::CreateSlider() val = valOld; } - m_sizerSlider->Remove(m_slider); + m_sizerSlider->Detach( m_slider ); if ( m_sizerSlider->GetChildren().GetCount() ) { // we have 2 spacers, remove them too - m_sizerSlider->Remove((int)0); - m_sizerSlider->Remove((int)0); + m_sizerSlider->Remove( 0 ); + m_sizerSlider->Remove( 0 ); } delete m_slider; @@ -365,6 +434,19 @@ void SliderWidgetsPage::DoSetTickFreq() m_slider->SetTickFreq(freq, 0 /* unused */); } +void SliderWidgetsPage::DoSetThumbLen() +{ + long len; + if ( !m_textThumbLen->GetValue().ToLong(&len) ) + { + wxLogWarning(_T("Invalid slider thumb lenght")); + + return; + } + + m_slider->SetThumbLength(len); +} + // ---------------------------------------------------------------------------- // event handlers // ---------------------------------------------------------------------------- @@ -381,6 +463,11 @@ void SliderWidgetsPage::OnButtonSetTickFreq(wxCommandEvent& WXUNUSED(event)) DoSetTickFreq(); } +void SliderWidgetsPage::OnButtonSetThumbLen(wxCommandEvent& WXUNUSED(event)) +{ + DoSetThumbLen(); +} + void SliderWidgetsPage::OnButtonSetMinAndMax(wxCommandEvent& WXUNUSED(event)) { long minNew, @@ -427,6 +514,12 @@ void SliderWidgetsPage::OnUpdateUITickFreq(wxUpdateUIEvent& event) (freq > 0) && (freq <= m_max - m_min) ); } +void SliderWidgetsPage::OnUpdateUIThumbLen(wxUpdateUIEvent& event) +{ + long val; + event.Enable( m_textThumbLen->GetValue().ToLong(&val)); +} + void SliderWidgetsPage::OnUpdateUIMinMaxButton(wxUpdateUIEvent& event) { long mn, mx; @@ -438,9 +531,9 @@ void SliderWidgetsPage::OnUpdateUIMinMaxButton(wxUpdateUIEvent& event) void SliderWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event) { event.Enable( m_chkVert->GetValue() || + !m_chkTicks->GetValue() || !m_chkLabels->GetValue() || - m_chkOtherSide->GetValue() || - m_chkTicks->GetValue() ); + m_chkBothSides->GetValue() ); } void SliderWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& event) @@ -450,21 +543,65 @@ void SliderWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& event) void SliderWidgetsPage::OnUpdateUICurValueText(wxUpdateUIEvent& event) { - event.SetText( wxString::Format(_T("%d"), m_slider->GetValue())); + event.SetText( wxString::Format(_T("%d"), m_slider->GetValue()) ); } -void SliderWidgetsPage::OnUpdateUIOtherSide(wxUpdateUIEvent& event) +void SliderWidgetsPage::OnUpdateUIRadioSides(wxUpdateUIEvent& event) { - event.Enable( m_chkLabels->GetValue() ); + event.Enable( m_chkLabels->GetValue() || m_chkTicks->GetValue() ); } -void SliderWidgetsPage::OnSlider(wxCommandEvent& event) +void SliderWidgetsPage::OnUpdateUIBothSides(wxUpdateUIEvent& event) { - int value = event.GetInt(); +#if defined(__WIN95__) || defined(__WXUNIVERSAL__) + event.Enable( m_chkTicks->GetValue() ); +#else + event.Enable( FALSE ); +#endif // defined(__WIN95__) || defined(__WXUNIVERSAL__) +} + +void SliderWidgetsPage::OnSlider(wxScrollEvent& event) +{ + wxASSERT_MSG( event.GetInt() == m_slider->GetValue(), + wxT("slider value should be the same") ); - wxASSERT_MSG( value == m_slider->GetValue(), - _T("slider value should be the same") ); + wxEventType eventType = event.GetEventType(); - wxLogMessage(_T("Slider value changed, now %d"), value); + /* + This array takes the EXACT order of the declarations in + include/wx/event.h + (section "wxScrollBar and wxSlider event identifiers") + */ + static const wxChar *eventNames[] = + { + wxT("wxEVT_SCROLL_TOP"), + wxT("wxEVT_SCROLL_BOTTOM"), + wxT("wxEVT_SCROLL_LINEUP"), + wxT("wxEVT_SCROLL_LINEDOWN"), + wxT("wxEVT_SCROLL_PAGEUP"), + wxT("wxEVT_SCROLL_PAGEDOWN"), + wxT("wxEVT_SCROLL_THUMBTRACK"), + wxT("wxEVT_SCROLL_THUMBRELEASE"), + wxT("wxEVT_SCROLL_ENDSCROLL") + }; + + int index = eventType - wxEVT_SCROLL_TOP; + + /* + If this assert is triggered, there is an unknown slider event which + should be added to the above eventNames array. + */ + wxASSERT_MSG(index >= 0 && (size_t)index < WXSIZEOF(eventNames), + wxT("Unknown slider event") ); + + + static int s_numSliderEvents = 0; + + wxLogMessage(wxT("Slider event #%d: %s (pos = %d)"), + s_numSliderEvents++, + eventNames[index], + event.GetPosition()); } +#endif + // wxUSE_SLIDER