From: Francesco Montorsi Date: Wed, 31 Dec 2008 17:07:30 +0000 (+0000) Subject: allow the user to pass NULL for the status widths; this was a feature supported by... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/54e18afcca6b75bfaf9dd1f12f4a255df8ae089d allow the user to pass NULL for the status widths; this was a feature supported by generic and MSW status bar but was not documented; document it; add menu item in the statbar sample for testing it git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57693 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/interface/wx/statusbr.h b/interface/wx/statusbr.h index d1f31573e9..96705fe378 100644 --- a/interface/wx/statusbr.h +++ b/interface/wx/statusbr.h @@ -112,6 +112,8 @@ public: /** Saves the current field text in a per field stack, and sets the field text to the string passed as argument. + + @see PopStatusText() */ void PushStatusText(const wxString& string, int field = 0); @@ -164,7 +166,7 @@ public: /** Sets the widths of the fields in the status line. There are two types of - fields: fixed widths one and variable width fields. For the fixed width fields + fields: @b fixed widths and @b variable width fields. For the fixed width fields you should specify their (constant) width in pixels. For the variable width fields, specify a negative number which indicates how the field should expand: the space left for all variable width fields is divided between them according @@ -182,6 +184,7 @@ public: Contains an array of n integers, each of which is either an absolute status field width in pixels if positive or indicates a variable width field if negative. + The special value @NULL means that all fields should get the same width. @remarks The widths of the variable fields are calculated from the total width of all fields, minus the sum of widths of the diff --git a/samples/statbar/statbar.cpp b/samples/statbar/statbar.cpp index 91cf5c9c90..ab73a3d4a0 100644 --- a/samples/statbar/statbar.cpp +++ b/samples/statbar/statbar.cpp @@ -49,16 +49,19 @@ #include "wx/datetime.h" #include "wx/numdlg.h" + // define this for the platforms which don't support wxBitmapButton (such as // Motif), else a wxBitmapButton will be used #ifdef __WXMOTIF__ + #define USE_STATIC_BITMAP +#endif + //#define USE_MDI_PARENT_FRAME 1 #ifdef USE_MDI_PARENT_FRAME #include "wx/mdi.h" #endif // USE_MDI_PARENT_FRAME - #define USE_STATIC_BITMAP -#endif + // ---------------------------------------------------------------------------- // resources @@ -150,6 +153,7 @@ class MyFrame : public wxMDIParentFrame void OnQuit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); + void OnResetFieldsWidth(wxCommandEvent& event); void OnSetStatusFields(wxCommandEvent& event); void OnRecreateStatusBar(wxCommandEvent& event); void OnSetStyleNormal(wxCommandEvent& event); @@ -163,6 +167,8 @@ private: StatBar_Custom, StatBar_Max } m_statbarKind; + + void OnUpdateResetFieldsWidth(wxUpdateUIEvent& event); void OnUpdateSetStatusFields(wxUpdateUIEvent& event); void OnUpdateStatusBarToggle(wxUpdateUIEvent& event); void OnUpdateSetStyleNormal(wxUpdateUIEvent& event); @@ -198,6 +204,7 @@ enum // menu items StatusBar_Quit = 1, StatusBar_SetFields, + StatusBar_ResetFieldsWidth, StatusBar_Recreate, StatusBar_About, StatusBar_Toggle, @@ -225,12 +232,15 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) #endif EVT_MENU(StatusBar_Quit, MyFrame::OnQuit) EVT_MENU(StatusBar_SetFields, MyFrame::OnSetStatusFields) + EVT_MENU(StatusBar_ResetFieldsWidth, MyFrame::OnResetFieldsWidth) EVT_MENU(StatusBar_Recreate, MyFrame::OnRecreateStatusBar) EVT_MENU(StatusBar_About, MyFrame::OnAbout) EVT_MENU(StatusBar_Toggle, MyFrame::OnStatusBarToggle) EVT_MENU(StatusBar_SetStyleNormal, MyFrame::OnSetStyleNormal) EVT_MENU(StatusBar_SetStyleFlat, MyFrame::OnSetStyleFlat) EVT_MENU(StatusBar_SetStyleRaised, MyFrame::OnSetStyleRaised) + + EVT_UPDATE_UI(StatusBar_ResetFieldsWidth, MyFrame::OnUpdateResetFieldsWidth) EVT_UPDATE_UI(StatusBar_Toggle, MyFrame::OnUpdateStatusBarToggle) EVT_UPDATE_UI(StatusBar_SetFields, MyFrame::OnUpdateSetStatusFields) EVT_UPDATE_UI(StatusBar_SetStyleNormal, MyFrame::OnUpdateSetStyleNormal) @@ -314,10 +324,6 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) wxMenu *statbarMenu = new wxMenu; statbarMenu->Append(StatusBar_SetFields, _T("&Set field count\tCtrl-C"), _T("Set the number of status bar fields")); - statbarMenu->Append(StatusBar_Toggle, _T("&Toggle Status Bar"), - _T("Toggle the status bar display"), true); - statbarMenu->Append(StatusBar_Recreate, _T("&Recreate\tCtrl-R"), - _T("Toggle status bar format")); wxMenu *statbarStyleMenu = new wxMenu; statbarStyleMenu->Append(StatusBar_SetStyleNormal, _T("&Normal"), _T("Sets the style of the first field to normal (sunken) look"), true); @@ -325,6 +331,15 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) statbarStyleMenu->Append(StatusBar_SetStyleRaised, _T("&Raised"), _T("Sets the style of the first field to raised look"), true); statbarMenu->Append(StatusBar_SetStyle, _T("Field style"), statbarStyleMenu); + statbarMenu->Append(StatusBar_ResetFieldsWidth, _T("Reset field widths"), + _T("Sets all fields to the same width")); + statbarMenu->AppendSeparator(); + + statbarMenu->Append(StatusBar_Toggle, _T("&Toggle Status Bar"), + _T("Toggle the status bar display"), true); + statbarMenu->Append(StatusBar_Recreate, _T("&Recreate\tCtrl-R"), + _T("Toggle status bar format")); + wxMenu *helpMenu = new wxMenu; helpMenu->Append(StatusBar_About, _T("&About...\tCtrl-A"), _T("Show about dialog")); @@ -453,6 +468,26 @@ void MyFrame::OnSetStatusFields(wxCommandEvent& WXUNUSED(event)) } } +void MyFrame::OnUpdateResetFieldsWidth(wxUpdateUIEvent& event) +{ + // only allow the settings of the number of status fields for the default + // status bar + wxStatusBar *sb = GetStatusBar(); + event.Enable(sb == m_statbarDefault); +} + +void MyFrame::OnResetFieldsWidth(wxCommandEvent& WXUNUSED(event)) +{ + wxStatusBar *pStat = GetStatusBar(); + if (pStat) + { + int n = pStat->GetFieldsCount(); + pStat->SetStatusWidths(n, NULL); + for (int i=0; iSetStatusText("same size", i); + } +} + void MyFrame::OnUpdateStatusBarToggle(wxUpdateUIEvent& event) { event.Check(GetStatusBar() != NULL); @@ -619,7 +654,8 @@ MyStatusBar::MyStatusBar(wxWindow *parent) m_timer.Start(1000); #endif - SetMinHeight(BITMAP_SIZE_Y); + SetMinHeight(120);//wxMax(m_statbmp->GetBestSize().GetHeight(), + // m_checkbox->GetBestSize().GetHeight())); UpdateClock(); } @@ -638,16 +674,16 @@ MyStatusBar::~MyStatusBar() #endif } +#define BMP_BUTTON_SIZE_X 10 +#define BMP_BUTTON_SIZE_Y 10 + wxBitmap MyStatusBar::CreateBitmapForButton(bool on) { - static const int BMP_BUTTON_SIZE_X = 10; - static const int BMP_BUTTON_SIZE_Y = 9; - - wxBitmap bitmap(BMP_BUTTON_SIZE_X, BMP_BUTTON_SIZE_Y); + wxBitmap bitmap(BMP_BUTTON_SIZE_X+1, BMP_BUTTON_SIZE_Y+1); wxMemoryDC dc; dc.SelectObject(bitmap); dc.SetBrush(on ? *wxGREEN_BRUSH : *wxRED_BRUSH); - dc.SetBackground(*wxLIGHT_GREY_BRUSH); + dc.SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT); dc.Clear(); dc.DrawEllipse(0, 0, BMP_BUTTON_SIZE_X, BMP_BUTTON_SIZE_Y); dc.SelectObject(wxNullBitmap); diff --git a/src/common/statbar.cpp b/src/common/statbar.cpp index a8ad8868c8..1bc31fd559 100644 --- a/src/common/statbar.cpp +++ b/src/common/statbar.cpp @@ -71,8 +71,6 @@ void wxStatusBarBase::SetFieldsCount(int number, const int *widths) { wxCHECK_RET( number > 0, _T("invalid field number in SetFieldsCount") ); - bool refresh = false; - if ( (size_t)number > m_panes.GetCount() ) { wxStatusBarPane newPane; @@ -88,31 +86,28 @@ void wxStatusBarBase::SetFieldsCount(int number, const int *widths) m_panes.RemoveAt(number, m_panes.GetCount()-number); } - refresh = true; - - if ( widths ) - { - SetStatusWidths(number, widths); - - // already done from SetStatusWidths() - refresh = false; - } - - if ( refresh ) - Refresh(); + // SetStatusWidths will automatically refresh + SetStatusWidths(number, widths); } void wxStatusBarBase::SetStatusWidths(int WXUNUSED_UNLESS_DEBUG(n), const int widths[]) { - wxCHECK_RET( widths, _T("NULL pointer in SetStatusWidths") ); - wxASSERT_MSG( (size_t)n == m_panes.GetCount(), _T("field number mismatch") ); - for ( size_t i = 0; i < m_panes.GetCount(); i++ ) - m_panes[i].nWidth = widths[i]; - - m_bSameWidthForAllPanes = false; + if (widths == NULL) + { + // special value meaning: override explicit pane widths and make them all + // of the same size + m_bSameWidthForAllPanes = true; + } + else + { + for ( size_t i = 0; i < m_panes.GetCount(); i++ ) + m_panes[i].nWidth = widths[i]; + + m_bSameWidthForAllPanes = false; + } // update the display after the widths changed Refresh(); diff --git a/src/generic/statusbr.cpp b/src/generic/statusbr.cpp index 72ac77fdcc..77616a02f1 100644 --- a/src/generic/statusbr.cpp +++ b/src/generic/statusbr.cpp @@ -176,24 +176,9 @@ void wxStatusBarGeneric::SetStatusWidths(int n, const int widths_field[]) // only set status widths when n == number of statuswindows wxCHECK_RET( (size_t)n == m_panes.GetCount(), _T("status bar field count mismatch") ); - // delete the old widths in any case - this function may be used to reset - // the widths to the default (all equal) - // MBN: this is incompatible with at least wxMSW and wxMAC and not - // documented, but let's keep it for now - m_bSameWidthForAllPanes = true; - // FM: what MBN's comment is saying is that allowing widths_field = NULL - // only for wxStatusBarGeneric is not documented... - // forget the old cached pixel widths m_widthsAbs.Empty(); - if ( !widths_field ) - { - // not an error, see the comment above - Refresh(); - return; - } - wxStatusBarBase::SetStatusWidths(n, widths_field); }