m_underMouse = false;
}
- wxToolBarTool(wxToolBar *tbar, wxControl *control)
- : wxToolBarToolBase(tbar, control)
+ wxToolBarTool(wxToolBar *tbar, wxControl *control, const wxString& label)
+ : wxToolBarToolBase(tbar, control, label)
{
// no position yet
m_x =
return false;
}
+ FixupStyle();
+
CreateInputHandler(wxINP_HANDLER_TOOLBAR);
- SetBestSize(size);
+ SetInitialSize(size);
return true;
}
clientData, shortHelp, longHelp);
}
-wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control)
+wxToolBarToolBase *
+wxToolBar::CreateTool(wxControl *control, const wxString& label)
{
- return new wxToolBarTool(this, control);
+ return new wxToolBarTool(this, control, label);
}
// ----------------------------------------------------------------------------
m_needsLayout = true;
DoLayout();
- SetBestSize(wxDefaultSize);
+ // 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;
}
// 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();
}
}
{
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
{
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 );
wxASSERT_MSG( tool->IsInverted(), _T("release unpressed button?") );
- tool->Invert();
+ if(tool->IsInverted())
+ {
+ tool->Invert();
+ }
RefreshTool( tool );
}
bool isToggled;
if ( tool->CanBeToggled() )
{
- tool->Toggle();
+ if ( tool->IsButton() && tool->GetKind() == wxITEM_RADIO )
+ {
+ UnToggleRadioGroup(tool);
+ tool->Toggle(true);
+ }
+ else
+ {
+ tool->Toggle();
+ }
RefreshTool( tool );