X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9dd96c0f6d5da873324f4013252061c69ed0d61c..f4f5d5697dc5e34a5582061dbd857d1cd4326f91:/samples/widgets/slider.cpp diff --git a/samples/widgets/slider.cpp b/samples/widgets/slider.cpp index e2c586cbc4..cf2af01598 100644 --- a/samples/widgets/slider.cpp +++ b/samples/widgets/slider.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Program: wxWindows Widgets Sample +// Program: wxWidgets Widgets Sample // Name: slider.cpp // Purpose: Part of the widgets sample showing wxSlider // Author: Vadim Zeitlin @@ -24,10 +24,13 @@ #pragma hdrstop #endif +#if wxUSE_SLIDER + // for all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/log.h" + #include "wx/bitmap.h" #include "wx/button.h" #include "wx/checkbox.h" #include "wx/radiobox.h" @@ -43,6 +46,7 @@ #include "wx/sizer.h" #include "widgets.h" + #include "icons/slider.xpm" // ---------------------------------------------------------------------------- @@ -56,12 +60,16 @@ enum SliderPage_Clear, SliderPage_SetValue, SliderPage_SetMinAndMax, + SliderPage_SetLineSize, + SliderPage_SetPageSize, SliderPage_SetTickFreq, SliderPage_SetThumbLen, SliderPage_CurValueText, SliderPage_ValueText, SliderPage_MinText, SliderPage_MaxText, + SliderPage_LineSizeText, + SliderPage_PageSizeText, SliderPage_TickFreqText, SliderPage_ThumbLenText, SliderPage_RadioSides, @@ -72,10 +80,10 @@ enum // sides radiobox values enum { - StaticSides_Top, - StaticSides_Bottom, - StaticSides_Left, - StaticSides_Right + SliderTicks_Top, + SliderTicks_Bottom, + SliderTicks_Left, + SliderTicks_Right }; // ---------------------------------------------------------------------------- @@ -85,8 +93,14 @@ enum class SliderWidgetsPage : public WidgetsPage { public: - SliderWidgetsPage(wxNotebook *notebook, wxImageList *imaglist); - virtual ~SliderWidgetsPage(); + SliderWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist); + virtual ~SliderWidgetsPage(){}; + + virtual wxControl *GetWidget() const { return m_slider; } + virtual void RecreateWidget() { CreateSlider(); } + + // lazy creation of the content + virtual void CreateContent(); protected: // event handlers @@ -94,6 +108,8 @@ protected: void OnButtonClear(wxCommandEvent& event); void OnButtonSetValue(wxCommandEvent& event); void OnButtonSetMinAndMax(wxCommandEvent& event); + void OnButtonSetLineSize(wxCommandEvent& event); + void OnButtonSetPageSize(wxCommandEvent& event); void OnButtonSetTickFreq(wxCommandEvent& event); void OnButtonSetThumbLen(wxCommandEvent& event); @@ -103,6 +119,8 @@ protected: void OnUpdateUIValueButton(wxUpdateUIEvent& event); void OnUpdateUIMinMaxButton(wxUpdateUIEvent& event); + void OnUpdateUILineSize(wxUpdateUIEvent& event); + void OnUpdateUIPageSize(wxUpdateUIEvent& event); void OnUpdateUITickFreq(wxUpdateUIEvent& event); void OnUpdateUIThumbLen(wxUpdateUIEvent& event); void OnUpdateUIRadioSides(wxUpdateUIEvent& event); @@ -118,6 +136,12 @@ protected: // (re)create the slider void CreateSlider(); + // set the line size from the text field value + void DoSetLineSize(); + + // set the page size from the text field value + void DoSetPageSize(); + // set the tick frequency from the text field value void DoSetTickFreq(); @@ -136,7 +160,7 @@ protected: // the check/radio boxes for styles wxCheckBox *m_chkLabels, - *m_chkVert, + *m_chkInverse, *m_chkTicks, *m_chkBothSides; @@ -150,6 +174,8 @@ protected: wxTextCtrl *m_textValue, *m_textMin, *m_textMax, + *m_textLineSize, + *m_textPageSize, *m_textTickFreq, *m_textThumbLen; @@ -166,14 +192,17 @@ BEGIN_EVENT_TABLE(SliderWidgetsPage, WidgetsPage) EVT_BUTTON(SliderPage_Reset, SliderWidgetsPage::OnButtonReset) EVT_BUTTON(SliderPage_SetValue, SliderWidgetsPage::OnButtonSetValue) EVT_BUTTON(SliderPage_SetMinAndMax, SliderWidgetsPage::OnButtonSetMinAndMax) + EVT_BUTTON(SliderPage_SetLineSize, SliderWidgetsPage::OnButtonSetLineSize) + EVT_BUTTON(SliderPage_SetPageSize, SliderWidgetsPage::OnButtonSetPageSize) EVT_BUTTON(SliderPage_SetTickFreq, SliderWidgetsPage::OnButtonSetTickFreq) EVT_BUTTON(SliderPage_SetThumbLen, SliderWidgetsPage::OnButtonSetThumbLen) EVT_UPDATE_UI(SliderPage_SetValue, SliderWidgetsPage::OnUpdateUIValueButton) EVT_UPDATE_UI(SliderPage_SetMinAndMax, SliderWidgetsPage::OnUpdateUIMinMaxButton) + EVT_UPDATE_UI(SliderPage_SetLineSize, SliderWidgetsPage::OnUpdateUILineSize) + EVT_UPDATE_UI(SliderPage_SetPageSize, SliderWidgetsPage::OnUpdateUIPageSize) 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) @@ -183,27 +212,31 @@ BEGIN_EVENT_TABLE(SliderWidgetsPage, WidgetsPage) EVT_COMMAND_SCROLL(SliderPage_Slider, SliderWidgetsPage::OnSlider) - EVT_CHECKBOX(-1, SliderWidgetsPage::OnCheckOrRadioBox) - EVT_RADIOBOX(-1, SliderWidgetsPage::OnCheckOrRadioBox) + EVT_CHECKBOX(wxID_ANY, SliderWidgetsPage::OnCheckOrRadioBox) + EVT_RADIOBOX(wxID_ANY, SliderWidgetsPage::OnCheckOrRadioBox) END_EVENT_TABLE() // ============================================================================ // implementation // ============================================================================ -IMPLEMENT_WIDGETS_PAGE(SliderWidgetsPage, _T("Slider")); +#if defined(__WXUNIVERSAL__) + #define FAMILY_CTRLS UNIVERSAL_CTRLS +#else + #define FAMILY_CTRLS NATIVE_CTRLS +#endif -SliderWidgetsPage::SliderWidgetsPage(wxNotebook *notebook, - wxImageList *imaglist) - : WidgetsPage(notebook) -{ - imaglist->Add(wxBitmap(slider_xpm)); +IMPLEMENT_WIDGETS_PAGE(SliderWidgetsPage, _T("Slider"), FAMILY_CTRLS ); +SliderWidgetsPage::SliderWidgetsPage(WidgetsBookCtrl *book, + wxImageList *imaglist) + : WidgetsPage(book, imaglist, slider_xpm) +{ // init everything m_min = 0; m_max = 100; - m_chkVert = + m_chkInverse = m_chkTicks = m_chkLabels = m_chkBothSides = (wxCheckBox *)NULL; @@ -212,14 +245,17 @@ SliderWidgetsPage::SliderWidgetsPage(wxNotebook *notebook, m_slider = (wxSlider *)NULL; m_sizerSlider = (wxSizer *)NULL; +} +void SliderWidgetsPage::CreateContent() +{ wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL); // left pane - wxStaticBox *box = new wxStaticBox(this, -1, _T("&Set style")); + wxStaticBox *box = new wxStaticBox(this, wxID_ANY, _T("&Set style")); wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL); - m_chkVert = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Vertical")); + m_chkInverse = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Inverse")); m_chkTicks = CreateCheckBoxAndAddToSizer(sizerLeft, _T("Show &ticks")); m_chkLabels = CreateCheckBoxAndAddToSizer(sizerLeft, _T("Show &labels")); static const wxString sides[] = @@ -246,14 +282,14 @@ SliderWidgetsPage::SliderWidgetsPage(wxNotebook *notebook, sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15); // middle pane - wxStaticBox *box2 = new wxStaticBox(this, -1, _T("&Change slider value")); + wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY, _T("&Change slider value")); wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL); wxTextCtrl *text; wxSizer *sizerRow = CreateSizerWithTextAndLabel(_T("Current value"), SliderPage_CurValueText, &text); - text->SetEditable(FALSE); + text->SetEditable(false); sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); @@ -268,7 +304,7 @@ SliderWidgetsPage::SliderWidgetsPage(wxNotebook *notebook, SliderPage_MinText, &m_textMin); - m_textMax = new wxTextCtrl(this, SliderPage_MaxText, _T("")); + m_textMax = new wxTextCtrl(this, SliderPage_MaxText, wxEmptyString); sizerRow->Add(m_textMax, 1, wxLEFT | wxALIGN_CENTRE_VERTICAL, 5); m_textMin->SetValue( wxString::Format(_T("%d"), m_min) ); @@ -276,6 +312,20 @@ SliderWidgetsPage::SliderWidgetsPage(wxNotebook *notebook, sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); + sizerRow = CreateSizerWithTextAndButton(SliderPage_SetLineSize, + _T("Li&ne size"), + SliderPage_LineSizeText, + &m_textLineSize); + + sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); + + sizerRow = CreateSizerWithTextAndButton(SliderPage_SetPageSize, + _T("P&age size"), + SliderPage_PageSizeText, + &m_textPageSize); + + sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); + sizerRow = CreateSizerWithTextAndButton(SliderPage_SetTickFreq, _T("Tick &frequency"), SliderPage_TickFreqText, @@ -286,7 +336,7 @@ SliderWidgetsPage::SliderWidgetsPage(wxNotebook *notebook, sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); sizerRow = CreateSizerWithTextAndButton(SliderPage_SetThumbLen, - _T("Thumb &lenght"), + _T("Thumb &length"), SliderPage_ThumbLenText, &m_textThumbLen); @@ -300,20 +350,16 @@ SliderWidgetsPage::SliderWidgetsPage(wxNotebook *notebook, Reset(); CreateSlider(); + m_textLineSize->SetValue(wxString::Format(_T("%d"), m_slider->GetLineSize())); + m_textPageSize->SetValue(wxString::Format(_T("%d"), m_slider->GetPageSize())); + // the 3 panes panes compose the window sizerTop->Add(sizerLeft, 0, wxGROW | (wxALL & ~wxLEFT), 10); sizerTop->Add(sizerMiddle, 0, wxGROW | wxALL, 10); sizerTop->Add(sizerRight, 1, wxGROW | (wxALL & ~wxRIGHT), 10); // final initializations - SetAutoLayout(TRUE); SetSizer(sizerTop); - - sizerTop->Fit(this); -} - -SliderWidgetsPage::~SliderWidgetsPage() -{ } // ---------------------------------------------------------------------------- @@ -322,23 +368,22 @@ SliderWidgetsPage::~SliderWidgetsPage() void SliderWidgetsPage::Reset() { - m_chkVert->SetValue(FALSE); - m_chkTicks->SetValue(TRUE); - m_chkLabels->SetValue(TRUE); - m_chkBothSides->SetValue(FALSE); + m_chkInverse->SetValue(false); + m_chkTicks->SetValue(true); + m_chkLabels->SetValue(true); + m_chkBothSides->SetValue(false); - m_radioSides->SetSelection(StaticSides_Top); + m_radioSides->SetSelection(SliderTicks_Top); } void SliderWidgetsPage::CreateSlider() { - int flags = 0; + int flags = ms_defaultFlags; - bool isVert = m_chkVert->GetValue(); - if ( isVert ) - flags |= wxSL_VERTICAL; - else - flags |= wxSL_HORIZONTAL; + if ( m_chkInverse->GetValue() ) + { + flags |= wxSL_INVERSE; + } if ( m_chkLabels->GetValue() ) { @@ -352,18 +397,22 @@ void SliderWidgetsPage::CreateSlider() switch ( m_radioSides->GetSelection() ) { - case StaticSides_Top: + case SliderTicks_Top: flags |= wxSL_TOP; break; - case StaticSides_Left: + + case SliderTicks_Left: flags |= wxSL_LEFT; break; - case StaticSides_Bottom: + + case SliderTicks_Bottom: flags |= wxSL_BOTTOM; break; - case StaticSides_Right: + + case SliderTicks_Right: flags |= wxSL_RIGHT; break; + default: wxFAIL_MSG(_T("unexpected radiobox selection")); // fall through @@ -400,7 +449,7 @@ void SliderWidgetsPage::CreateSlider() wxDefaultPosition, wxDefaultSize, flags); - if ( isVert ) + if ( m_slider->HasFlag(wxSL_VERTICAL) ) { m_sizerSlider->Add(0, 0, 1); m_sizerSlider->Add(m_slider, 0, wxGROW | wxALL, 5); @@ -419,6 +468,42 @@ void SliderWidgetsPage::CreateSlider() m_sizerSlider->Layout(); } +void SliderWidgetsPage::DoSetLineSize() +{ + long lineSize; + if ( !m_textLineSize->GetValue().ToLong(&lineSize) ) + { + wxLogWarning(_T("Invalid slider line size")); + + return; + } + + m_slider->SetLineSize(lineSize); + + if ( m_slider->GetLineSize() != lineSize ) + { + wxLogWarning(_T("Invalid line size in slider.")); + } +} + +void SliderWidgetsPage::DoSetPageSize() +{ + long pageSize; + if ( !m_textPageSize->GetValue().ToLong(&pageSize) ) + { + wxLogWarning(_T("Invalid slider page size")); + + return; + } + + m_slider->SetPageSize(pageSize); + + if ( m_slider->GetPageSize() != pageSize ) + { + wxLogWarning(_T("Invalid page size in slider.")); + } +} + void SliderWidgetsPage::DoSetTickFreq() { long freq; @@ -437,7 +522,7 @@ void SliderWidgetsPage::DoSetThumbLen() long len; if ( !m_textThumbLen->GetValue().ToLong(&len) ) { - wxLogWarning(_T("Invalid slider thumb lenght")); + wxLogWarning(_T("Invalid slider thumb length")); return; } @@ -456,6 +541,16 @@ void SliderWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event)) CreateSlider(); } +void SliderWidgetsPage::OnButtonSetLineSize(wxCommandEvent& WXUNUSED(event)) +{ + DoSetLineSize(); +} + +void SliderWidgetsPage::OnButtonSetPageSize(wxCommandEvent& WXUNUSED(event)) +{ + DoSetPageSize(); +} + void SliderWidgetsPage::OnButtonSetTickFreq(wxCommandEvent& WXUNUSED(event)) { DoSetTickFreq(); @@ -483,6 +578,12 @@ void SliderWidgetsPage::OnButtonSetMinAndMax(wxCommandEvent& WXUNUSED(event)) m_max = maxNew; m_slider->SetRange(minNew, maxNew); + + if ( m_slider->GetMin() != m_min || + m_slider->GetMax() != m_max ) + { + wxLogWarning(_T("Invalid range in slider.")); + } } void SliderWidgetsPage::OnButtonSetValue(wxCommandEvent& WXUNUSED(event)) @@ -504,6 +605,20 @@ void SliderWidgetsPage::OnUpdateUIValueButton(wxUpdateUIEvent& event) event.Enable( m_textValue->GetValue().ToLong(&val) && IsValidValue(val) ); } +void SliderWidgetsPage::OnUpdateUILineSize(wxUpdateUIEvent& event) +{ + long lineSize; + event.Enable( m_textLineSize->GetValue().ToLong(&lineSize) && + (lineSize > 0) && (lineSize <= m_max - m_min) ); +} + +void SliderWidgetsPage::OnUpdateUIPageSize(wxUpdateUIEvent& event) +{ + long pageSize; + event.Enable( m_textPageSize->GetValue().ToLong(&pageSize) && + (pageSize > 0) && (pageSize <= m_max - m_min) ); +} + void SliderWidgetsPage::OnUpdateUITickFreq(wxUpdateUIEvent& event) { long freq; @@ -528,13 +643,14 @@ void SliderWidgetsPage::OnUpdateUIMinMaxButton(wxUpdateUIEvent& event) void SliderWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event) { - event.Enable( m_chkVert->GetValue() || + event.Enable( m_chkInverse->GetValue() || !m_chkTicks->GetValue() || !m_chkLabels->GetValue() || - m_chkBothSides->GetValue() ); + m_chkBothSides->GetValue() || + m_radioSides->GetSelection() != SliderTicks_Top ); } -void SliderWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& event) +void SliderWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event)) { CreateSlider(); } @@ -551,11 +667,11 @@ void SliderWidgetsPage::OnUpdateUIRadioSides(wxUpdateUIEvent& event) void SliderWidgetsPage::OnUpdateUIBothSides(wxUpdateUIEvent& event) { -#if defined(__WIN95__) || defined(__WXUNIVERSAL__) +#if defined(__WXMSW__) || defined(__WXUNIVERSAL__) event.Enable( m_chkTicks->GetValue() ); #else - event.Enable( FALSE ); -#endif // defined(__WIN95__) || defined(__WXUNIVERSAL__) + event.Enable( false ); +#endif // defined(__WXMSW__) || defined(__WXUNIVERSAL__) } void SliderWidgetsPage::OnSlider(wxScrollEvent& event) @@ -580,7 +696,7 @@ void SliderWidgetsPage::OnSlider(wxScrollEvent& event) wxT("wxEVT_SCROLL_PAGEDOWN"), wxT("wxEVT_SCROLL_THUMBTRACK"), wxT("wxEVT_SCROLL_THUMBRELEASE"), - wxT("wxEVT_SCROLL_ENDSCROLL") + wxT("wxEVT_SCROLL_CHANGED") }; int index = eventType - wxEVT_SCROLL_TOP; @@ -595,9 +711,11 @@ void SliderWidgetsPage::OnSlider(wxScrollEvent& event) static int s_numSliderEvents = 0; - wxLogMessage(wxT("Slider event #%d: %s (pos = %d)"), + wxLogMessage(wxT("Slider event #%d: %s (pos = %d, int value = %d)"), s_numSliderEvents++, eventNames[index], - event.GetPosition()); + event.GetPosition(), + event.GetInt()); } +#endif // wxUSE_SLIDER