X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/32b8ec418aee4e38877d4cb79e2984c766dcc358..d8eff331e23435d9d8d6483a40f6fd9997a13f87:/samples/widgets/gauge.cpp diff --git a/samples/widgets/gauge.cpp b/samples/widgets/gauge.cpp index 3075d39b81..011702d0c3 100644 --- a/samples/widgets/gauge.cpp +++ b/samples/widgets/gauge.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Program: wxWindows Widgets Sample +// Program: wxWidgets Widgets Sample // Name: gauge.cpp // Purpose: Part of the widgets sample showing wxGauge // Author: Vadim Zeitlin @@ -29,6 +29,7 @@ #include "wx/log.h" #include "wx/timer.h" + #include "wx/bitmap.h" #include "wx/button.h" #include "wx/checkbox.h" #include "wx/combobox.h" @@ -41,7 +42,7 @@ #include "wx/sizer.h" #include "widgets.h" - +#if wxUSE_GAUGE #include "icons/gauge.xpm" // ---------------------------------------------------------------------------- @@ -51,8 +52,9 @@ // control ids enum { - GaugePage_Reset = 100, + GaugePage_Reset = wxID_HIGHEST, GaugePage_Progress, + GaugePage_IndeterminateProgress, GaugePage_Clear, GaugePage_SetValue, GaugePage_SetRange, @@ -60,6 +62,7 @@ enum GaugePage_ValueText, GaugePage_RangeText, GaugePage_Timer, + GaugePage_IndeterminateTimer, GaugePage_Gauge }; @@ -70,13 +73,20 @@ enum class GaugeWidgetsPage : public WidgetsPage { public: - GaugeWidgetsPage(wxNotebook *notebook, wxImageList *imaglist); + GaugeWidgetsPage(WidgetsBookCtrl *book, wxImageList *imaglist); virtual ~GaugeWidgetsPage(); + virtual wxControl *GetWidget() const { return m_gauge; } + virtual void RecreateWidget() { CreateGauge(); } + + // lazy creation of the content + virtual void CreateContent(); + protected: // event handlers void OnButtonReset(wxCommandEvent& event); void OnButtonProgress(wxCommandEvent& event); + void OnButtonIndeterminateProgress(wxCommandEvent& event); void OnButtonClear(wxCommandEvent& event); void OnButtonSetValue(wxCommandEvent& event); void OnButtonSetRange(wxCommandEvent& event); @@ -90,6 +100,7 @@ protected: void OnUpdateUICurValueText(wxUpdateUIEvent& event); void OnProgressTimer(wxTimerEvent& event); + void OnIndeterminateProgressTimer(wxTimerEvent& event); // reset the gauge parameters void Reset(); @@ -97,8 +108,11 @@ protected: // (re)create the gauge void CreateGauge(); + // start progress timer + void StartTimer(wxButton*); + // stop the progress timer - void StopTimer(); + void StopTimer(wxButton*); // the gauge range unsigned long m_range; @@ -122,8 +136,8 @@ protected: wxTimer *m_timer; private: - DECLARE_EVENT_TABLE(); - DECLARE_WIDGETS_PAGE(GaugeWidgetsPage); + DECLARE_EVENT_TABLE() + DECLARE_WIDGETS_PAGE(GaugeWidgetsPage) }; // ---------------------------------------------------------------------------- @@ -133,6 +147,7 @@ private: BEGIN_EVENT_TABLE(GaugeWidgetsPage, WidgetsPage) EVT_BUTTON(GaugePage_Reset, GaugeWidgetsPage::OnButtonReset) EVT_BUTTON(GaugePage_Progress, GaugeWidgetsPage::OnButtonProgress) + EVT_BUTTON(GaugePage_IndeterminateProgress, GaugeWidgetsPage::OnButtonIndeterminateProgress) EVT_BUTTON(GaugePage_Clear, GaugeWidgetsPage::OnButtonClear) EVT_BUTTON(GaugePage_SetValue, GaugeWidgetsPage::OnButtonSetValue) EVT_BUTTON(GaugePage_SetRange, GaugeWidgetsPage::OnButtonSetRange) @@ -143,24 +158,29 @@ BEGIN_EVENT_TABLE(GaugeWidgetsPage, WidgetsPage) EVT_UPDATE_UI(GaugePage_CurValueText, GaugeWidgetsPage::OnUpdateUICurValueText) - EVT_CHECKBOX(-1, GaugeWidgetsPage::OnCheckOrRadioBox) - EVT_RADIOBOX(-1, GaugeWidgetsPage::OnCheckOrRadioBox) + EVT_CHECKBOX(wxID_ANY, GaugeWidgetsPage::OnCheckOrRadioBox) + EVT_RADIOBOX(wxID_ANY, GaugeWidgetsPage::OnCheckOrRadioBox) EVT_TIMER(GaugePage_Timer, GaugeWidgetsPage::OnProgressTimer) + EVT_TIMER(GaugePage_IndeterminateTimer, GaugeWidgetsPage::OnIndeterminateProgressTimer) END_EVENT_TABLE() // ============================================================================ // implementation // ============================================================================ -IMPLEMENT_WIDGETS_PAGE(GaugeWidgetsPage, _T("Gauge")); +#if defined(__WXUNIVERSAL__) + #define FAMILY_CTRLS UNIVERSAL_CTRLS +#else + #define FAMILY_CTRLS NATIVE_CTRLS +#endif -GaugeWidgetsPage::GaugeWidgetsPage(wxNotebook *notebook, - wxImageList *imaglist) - : WidgetsPage(notebook) -{ - imaglist->Add(wxBitmap(gauge_xpm)); +IMPLEMENT_WIDGETS_PAGE(GaugeWidgetsPage, wxT("Gauge"), FAMILY_CTRLS ); +GaugeWidgetsPage::GaugeWidgetsPage(WidgetsBookCtrl *book, + wxImageList *imaglist) + :WidgetsPage(book, imaglist, gauge_xpm) +{ // init everything m_range = 100; @@ -171,58 +191,65 @@ GaugeWidgetsPage::GaugeWidgetsPage(wxNotebook *notebook, m_gauge = (wxGauge *)NULL; m_sizerGauge = (wxSizer *)NULL; +} +void GaugeWidgetsPage::CreateContent() +{ wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL); // left pane - wxStaticBox *box = new wxStaticBox(this, -1, _T("&Set style")); + wxStaticBox *box = new wxStaticBox(this, wxID_ANY, wxT("&Set style")); wxSizer *sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL); - m_chkVert = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Vertical")); - m_chkSmooth = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Smooth")); + m_chkVert = CreateCheckBoxAndAddToSizer(sizerLeft, wxT("&Vertical")); + m_chkSmooth = CreateCheckBoxAndAddToSizer(sizerLeft, wxT("&Smooth")); sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer - wxButton *btn = new wxButton(this, GaugePage_Reset, _T("&Reset")); + wxButton *btn = new wxButton(this, GaugePage_Reset, wxT("&Reset")); sizerLeft->Add(btn, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 15); // middle pane - wxStaticBox *box2 = new wxStaticBox(this, -1, _T("&Change gauge value")); + wxStaticBox *box2 = new wxStaticBox(this, wxID_ANY, wxT("&Change gauge value")); wxSizer *sizerMiddle = new wxStaticBoxSizer(box2, wxVERTICAL); wxTextCtrl *text; - wxSizer *sizerRow = CreateSizerWithTextAndLabel(_T("Current value"), + wxSizer *sizerRow = CreateSizerWithTextAndLabel(wxT("Current value"), GaugePage_CurValueText, &text); - text->SetEditable(FALSE); + text->SetEditable(false); sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); sizerRow = CreateSizerWithTextAndButton(GaugePage_SetValue, - _T("Set &value"), + wxT("Set &value"), GaugePage_ValueText, &m_textValue); sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); sizerRow = CreateSizerWithTextAndButton(GaugePage_SetRange, - _T("Set &range"), + wxT("Set &range"), GaugePage_RangeText, &m_textRange); - m_textRange->SetValue(wxString::Format(_T("%lu"), m_range)); + m_textRange->SetValue( wxString::Format(wxT("%lu"), m_range) ); sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); - btn = new wxButton(this, GaugePage_Progress, _T("Simulate &progress")); + btn = new wxButton(this, GaugePage_Progress, wxT("Simulate &progress")); + sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5); + + btn = new wxButton(this, GaugePage_IndeterminateProgress, + wxT("Simulate &indeterminate job")); sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5); - btn = new wxButton(this, GaugePage_Clear, _T("&Clear")); + btn = new wxButton(this, GaugePage_Clear, wxT("&Clear")); sizerMiddle->Add(btn, 0, wxALL | wxGROW, 5); // right pane wxSizer *sizerRight = new wxBoxSizer(wxHORIZONTAL); m_gauge = new wxGauge(this, GaugePage_Gauge, m_range); sizerRight->Add(m_gauge, 1, wxCENTRE | wxALL, 5); - sizerRight->SetMinSize(250, 0); + sizerRight->SetMinSize(150, 0); m_sizerGauge = sizerRight; // save it to modify it later // the 3 panes panes compose the window @@ -233,10 +260,7 @@ GaugeWidgetsPage::GaugeWidgetsPage(wxNotebook *notebook, // final initializations Reset(); - SetAutoLayout(TRUE); SetSizer(sizerTop); - - sizerTop->Fit(this); } GaugeWidgetsPage::~GaugeWidgetsPage() @@ -250,13 +274,13 @@ GaugeWidgetsPage::~GaugeWidgetsPage() void GaugeWidgetsPage::Reset() { - m_chkVert->SetValue(FALSE); - m_chkSmooth->SetValue(FALSE); + m_chkVert->SetValue(false); + m_chkSmooth->SetValue(false); } void GaugeWidgetsPage::CreateGauge() { - int flags = 0; + int flags = ms_defaultFlags; if ( m_chkVert->GetValue() ) flags |= wxGA_VERTICAL; @@ -271,7 +295,7 @@ void GaugeWidgetsPage::CreateGauge() { val = m_gauge->GetValue(); - m_sizerGauge->Remove(m_gauge); + m_sizerGauge->Detach( m_gauge ); delete m_gauge; } @@ -279,7 +303,7 @@ void GaugeWidgetsPage::CreateGauge() wxDefaultPosition, wxDefaultSize, flags); m_gauge->SetValue(val); - + if ( flags & wxGA_VERTICAL ) m_sizerGauge->Add(m_gauge, 0, wxGROW | wxALL, 5); else @@ -288,6 +312,46 @@ void GaugeWidgetsPage::CreateGauge() m_sizerGauge->Layout(); } +void GaugeWidgetsPage::StartTimer(wxButton *clicked) +{ + static const int INTERVAL = 300; + + wxLogMessage(wxT("Launched progress timer (interval = %d ms)"), INTERVAL); + + m_timer = new wxTimer(this, + clicked->GetId() == GaugePage_Progress ? GaugePage_Timer : GaugePage_IndeterminateTimer); + m_timer->Start(INTERVAL); + + clicked->SetLabel(wxT("&Stop timer")); + + if (clicked->GetId() == GaugePage_Progress) + FindWindow(GaugePage_IndeterminateProgress)->Disable(); + else + FindWindow(GaugePage_Progress)->Disable(); +} + +void GaugeWidgetsPage::StopTimer(wxButton *clicked) +{ + wxCHECK_RET( m_timer, wxT("shouldn't be called") ); + + m_timer->Stop(); + delete m_timer; + m_timer = NULL; + + if (clicked->GetId() == GaugePage_Progress) + { + clicked->SetLabel(wxT("Simulate &progress")); + FindWindow(GaugePage_IndeterminateProgress)->Enable(); + } + else + { + clicked->SetLabel(wxT("Simulate indeterminate job")); + FindWindow(GaugePage_Progress)->Enable(); + } + + wxLogMessage(wxT("Progress finished.")); +} + // ---------------------------------------------------------------------------- // event handlers // ---------------------------------------------------------------------------- @@ -301,23 +365,31 @@ void GaugeWidgetsPage::OnButtonReset(wxCommandEvent& WXUNUSED(event)) void GaugeWidgetsPage::OnButtonProgress(wxCommandEvent& event) { + wxButton *b = (wxButton *)event.GetEventObject(); if ( !m_timer ) { - static const int INTERVAL = 300; - - wxLogMessage(_T("Launched progress timer (interval = %d ms)"), INTERVAL); + StartTimer(b); + } + else // stop the running timer + { + StopTimer(b); - m_timer = new wxTimer(this, GaugePage_Timer); - m_timer->Start(INTERVAL); + wxLogMessage(wxT("Stopped the timer.")); + } +} - wxButton *btn = (wxButton *)event.GetEventObject(); - btn->SetLabel(_T("&Stop timer")); +void GaugeWidgetsPage::OnButtonIndeterminateProgress(wxCommandEvent& event) +{ + wxButton *b = (wxButton *)event.GetEventObject(); + if ( !m_timer ) + { + StartTimer(b); } else // stop the running timer { - StopTimer(); + StopTimer(b); - wxLogMessage(_T("Stopped the timer.")); + wxLogMessage(wxT("Stopped the timer.")); } } @@ -332,6 +404,7 @@ void GaugeWidgetsPage::OnButtonSetRange(wxCommandEvent& WXUNUSED(event)) if ( !m_textRange->GetValue().ToULong(&val) ) return; + m_range = val; m_gauge->SetRange(val); } @@ -361,7 +434,7 @@ void GaugeWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event) event.Enable( m_chkVert->GetValue() || m_chkSmooth->GetValue() ); } -void GaugeWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& event) +void GaugeWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event)) { CreateGauge(); } @@ -375,28 +448,22 @@ void GaugeWidgetsPage::OnProgressTimer(wxTimerEvent& WXUNUSED(event)) } else // reached the end { - StopTimer(); + wxButton *btn = (wxButton *)FindWindow(GaugePage_Progress); + wxCHECK_RET( btn, wxT("no progress button?") ); + + StopTimer(btn); } } -void GaugeWidgetsPage::OnUpdateUICurValueText(wxUpdateUIEvent& event) +void GaugeWidgetsPage::OnIndeterminateProgressTimer(wxTimerEvent& WXUNUSED(event)) { - event.SetText( wxString::Format(_T("%d"), m_gauge->GetValue())); + m_gauge->Pulse(); } -void GaugeWidgetsPage::StopTimer() +void GaugeWidgetsPage::OnUpdateUICurValueText(wxUpdateUIEvent& event) { - wxCHECK_RET( m_timer, _T("shouldn't be called") ); - - m_timer->Stop(); - delete m_timer; - m_timer = NULL; - - wxButton *btn = (wxButton *)FindWindow(GaugePage_Progress); - wxCHECK_RET( btn, _T("no progress button?") ); - - btn->SetLabel(_T("Simulate &progress")); - - wxLogMessage(_T("Progress finished.")); + event.SetText( wxString::Format(wxT("%d"), m_gauge->GetValue())); } +#endif + // wxUSE_GAUGE