Merge branch 'aui-delete-tool'

Provide work around for surprising behaviour of
wxAuiToolBar::DeleteTool().

Closes https://github.com/wxWidgets/wxWidgets/pull/1758
This commit is contained in:
Vadim Zeitlin
2020-03-15 17:10:41 +01:00
3 changed files with 111 additions and 50 deletions

View File

@@ -1165,15 +1165,7 @@ void wxAuiToolBar::Clear()
bool wxAuiToolBar::DeleteTool(int tool_id)
{
int idx = GetToolIndex(tool_id);
if (idx >= 0 && idx < (int)m_items.GetCount())
{
m_items.RemoveAt(idx);
Realize();
return true;
}
return false;
return DeleteByIndex(GetToolIndex(tool_id));
}
bool wxAuiToolBar::DeleteByIndex(int idx)
@@ -1188,6 +1180,22 @@ bool wxAuiToolBar::DeleteByIndex(int idx)
return false;
}
bool wxAuiToolBar::DestroyTool(int tool_id)
{
return DestroyToolByIndex(GetToolIndex(tool_id));
}
bool wxAuiToolBar::DestroyToolByIndex(int idx)
{
if ( idx < 0 || static_cast<unsigned>(idx) >= m_items.GetCount() )
return false;
if ( wxWindow* window = m_items[idx].GetWindow() )
window->Destroy();
return DeleteByIndex(idx);
}
wxControl* wxAuiToolBar::FindControl(int id)
{
@@ -1946,14 +1954,14 @@ bool wxAuiToolBar::RealizeHelper(wxClientDC& dc, bool horizontal)
for (i = 0, count = m_items.GetCount(); i < count; ++i)
{
wxAuiToolBarItem& item = m_items.Item(i);
wxSizerItem* m_sizerItem = NULL;
wxSizerItem* sizerItem = NULL;
switch (item.m_kind)
{
case wxITEM_LABEL:
{
wxSize size = m_art->GetLabelSize(dc, this, item);
m_sizerItem = sizer->Add(size.x + (m_toolBorderPadding*2),
sizerItem = sizer->Add(size.x + (m_toolBorderPadding*2),
size.y + (m_toolBorderPadding*2),
item.m_proportion,
item.m_alignment);
@@ -1970,7 +1978,7 @@ bool wxAuiToolBar::RealizeHelper(wxClientDC& dc, bool horizontal)
case wxITEM_RADIO:
{
wxSize size = m_art->GetToolSize(dc, this, item);
m_sizerItem = sizer->Add(size.x + (m_toolBorderPadding*2),
sizerItem = sizer->Add(size.x + (m_toolBorderPadding*2),
size.y + (m_toolBorderPadding*2),
0,
item.m_alignment);
@@ -1986,9 +1994,9 @@ bool wxAuiToolBar::RealizeHelper(wxClientDC& dc, bool horizontal)
case wxITEM_SEPARATOR:
{
if (horizontal)
m_sizerItem = sizer->Add(separatorSize, 1, 0, wxEXPAND);
sizerItem = sizer->Add(separatorSize, 1, 0, wxEXPAND);
else
m_sizerItem = sizer->Add(1, separatorSize, 0, wxEXPAND);
sizerItem = sizer->Add(1, separatorSize, 0, wxEXPAND);
// add tool packing
if (i+1 < count)
@@ -2001,14 +2009,13 @@ bool wxAuiToolBar::RealizeHelper(wxClientDC& dc, bool horizontal)
case wxITEM_SPACER:
if (item.m_proportion > 0)
m_sizerItem = sizer->AddStretchSpacer(item.m_proportion);
sizerItem = sizer->AddStretchSpacer(item.m_proportion);
else
m_sizerItem = sizer->Add(item.m_spacerPixels, 1);
sizerItem = sizer->Add(item.m_spacerPixels, 1);
break;
case wxITEM_CONTROL:
{
//m_sizerItem = sizer->Add(item.m_window, item.m_proportion, wxEXPAND);
wxSizerItem* ctrl_m_sizerItem;
wxBoxSizer* vert_sizer = new wxBoxSizer(wxVERTICAL);
@@ -2024,7 +2031,7 @@ bool wxAuiToolBar::RealizeHelper(wxClientDC& dc, bool horizontal)
}
m_sizerItem = sizer->Add(vert_sizer, item.m_proportion, wxEXPAND);
sizerItem = sizer->Add(vert_sizer, item.m_proportion, wxEXPAND);
wxSize min_size = item.m_minSize;
@@ -2038,7 +2045,7 @@ bool wxAuiToolBar::RealizeHelper(wxClientDC& dc, bool horizontal)
if (min_size.IsFullySpecified())
{
m_sizerItem->SetMinSize(min_size);
sizerItem->SetMinSize(min_size);
ctrl_m_sizerItem->SetMinSize(min_size);
}
@@ -2050,7 +2057,7 @@ bool wxAuiToolBar::RealizeHelper(wxClientDC& dc, bool horizontal)
}
}
item.m_sizerItem = m_sizerItem;
item.m_sizerItem = sizerItem;
}
// add "right" padding