X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cdb11cb99e14b18bc284fce01ccbd18fa9c56cb7..16519fd473f79954ba503dfa74a5cc4544391846:/src/univ/toolbar.cpp diff --git a/src/univ/toolbar.cpp b/src/univ/toolbar.cpp index ccdff2fd2c..7f81f0daa8 100644 --- a/src/univ/toolbar.cpp +++ b/src/univ/toolbar.cpp @@ -424,6 +424,29 @@ bool wxToolBar::Realize() m_needsLayout = true; DoLayout(); + // the first item in the radio group is checked by default to be consistent + // with wxGTK and the menu radio items + int radioGroupCount = 0; + + for ( wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst(); + node; + node = node->GetNext() ) + { + wxToolBarTool *tool = (wxToolBarTool*) node->GetData(); + + if ( !tool->IsButton() || tool->GetKind() != wxITEM_RADIO ) + { + radioGroupCount = 0; + continue; + } + + bool toggle = !radioGroupCount++; + if ( tool->Toggle(toggle) ) + { + DoToggleTool(tool, toggle); + } + } + SetInitialSize(wxDefaultSize); return true; @@ -564,13 +587,7 @@ void wxToolBar::DoSetSize(int x, int y, int width, int height, int sizeFlags) // otherwise the toolbar can be shown incorrectly if ( old_width != width || old_height != height ) { - // But before we send the size event check it - // we have a frame that is not being deleted. - wxFrame *frame = wxDynamicCast(GetParent(), wxFrame); - if ( frame && !frame->IsBeingDeleted() ) - { - frame->SendSizeEvent(); - } + SendSizeEventToParent(); } } @@ -674,26 +691,26 @@ void wxToolBar::DoDraw(wxControlRenderer *renderer) { label = tool->GetLabel(); bitmap = tool->GetBitmap(); + + if ( !bitmap.IsOk() ) + { + // it's better not to draw anything than to assert inside + // drawing code as this results in an almost guaranteed crash + // as we're likely to be called by a paint event handler and so + // the assert is going to be triggered again and again and ... + continue; + } } //else: leave both the label and the bitmap invalid to draw a separator if ( !tool->IsControl() ) { - int tbStyle = 0; - if(HasFlag(wxTB_TEXT)) - { + int tbStyle = HasFlag(wxTB_VERTICAL) ? wxTB_VERTICAL : wxTB_HORIZONTAL; + if ( HasFlag(wxTB_TEXT) ) tbStyle |= wxTB_TEXT; - } - if(HasFlag(wxTB_VERTICAL)) - { - tbStyle |= wxTB_VERTICAL; - } - else - { - tbStyle |= wxTB_HORIZONTAL; - } - rend->DrawToolBarButton(dc, label, bitmap, rectTool, flags, tool->GetStyle(), tbStyle); + rend->DrawToolBarButton(dc, label, bitmap, rectTool, flags, + tool->GetStyle(), tbStyle); } else // control { @@ -721,18 +738,6 @@ bool wxToolBar::PerformAction(const wxControlAction& action, PerformAction( wxACTION_BUTTON_CLICK, numArg ); - // Write by Danny Raynor to change state again. - // Check button still pressed or not - if ( tool->CanBeToggled() && tool->IsToggled() ) - { - tool->Toggle(false); - } - - if( tool->IsInverted() ) - { - PerformAction( wxACTION_TOOLBAR_RELEASE, numArg ); - } - // Set mouse leave toolbar button range (If still in the range, // toolbar button would get focus again PerformAction( wxACTION_TOOLBAR_LEAVE, numArg ); @@ -751,7 +756,10 @@ bool wxToolBar::PerformAction(const wxControlAction& action, wxASSERT_MSG( tool->IsInverted(), _T("release unpressed button?") ); - tool->Invert(); + if(tool->IsInverted()) + { + tool->Invert(); + } RefreshTool( tool ); } @@ -760,7 +768,15 @@ bool wxToolBar::PerformAction(const wxControlAction& action, bool isToggled; if ( tool->CanBeToggled() ) { - tool->Toggle(); + if ( tool->IsButton() && tool->GetKind() == wxITEM_RADIO ) + { + UnToggleRadioGroup(tool); + tool->Toggle(true); + } + else + { + tool->Toggle(); + } RefreshTool( tool );