Avoid collapsing component chooser column widths to zero

Fixes: lp:1670762
* https://bugs.launchpad.net/kicad/+bug/1670762
This commit is contained in:
Chris Pavlina 2017-03-07 14:59:20 -05:00
parent 11f4622ea5
commit 36e400ec5b
2 changed files with 47 additions and 11 deletions

View File

@ -198,10 +198,14 @@ void CMP_TREE_MODEL_ADAPTER::AttachTo( wxDataViewCtrl* aDataViewCtrl )
aDataViewCtrl->SetIndent( kDataViewIndent );
aDataViewCtrl->AssociateModel( this );
aDataViewCtrl->ClearColumns();
m_col_part = aDataViewCtrl->AppendTextColumn( _( "Part" ), 0, wxDATAVIEW_CELL_INERT,
ColWidth( m_tree, 0 ) );
m_col_desc = aDataViewCtrl->AppendTextColumn( _( "Description" ), 1, wxDATAVIEW_CELL_INERT,
ColWidth( m_tree, 1 ) );
wxString part_head = _( "Part" );
wxString desc_head = _( "Desc" );
m_col_part = aDataViewCtrl->AppendTextColumn( part_head, 0, wxDATAVIEW_CELL_INERT,
ColWidth( m_tree, 0, part_head ) );
m_col_desc = aDataViewCtrl->AppendTextColumn( desc_head, 1, wxDATAVIEW_CELL_INERT,
ColWidth( m_tree, 1, desc_head ) );
aDataViewCtrl->Thaw();
}
@ -317,18 +321,22 @@ int CMP_TREE_MODEL_ADAPTER::Compare(
}
int CMP_TREE_MODEL_ADAPTER::ColWidth( CMP_TREE_NODE& aNode, int aCol )
int CMP_TREE_MODEL_ADAPTER::ColWidth( CMP_TREE_NODE& aTree, int aCol, wxString const& aHeading )
{
const int indent = aCol ? 0 : kDataViewIndent;
int max_width = aNode.Score > 0 ? WidthFor( aNode, aCol ) : 0;
for( auto& node: aNode.Children )
int min_width = WidthFor( aHeading, aCol );
int width = std::max( aTree.Score > 0 ? WidthFor( aTree, aCol ) : 0, min_width );
if( aTree.Score > 0 )
{
if( aNode.Score > 0 )
max_width = std::max( max_width, ColWidth( *node, aCol ) + indent );
for( auto& node: aTree.Children )
{
width = std::max( width, ColWidth( *node, aCol, aHeading ) + indent );
}
}
return max_width;
return width;
}
@ -352,6 +360,24 @@ int CMP_TREE_MODEL_ADAPTER::WidthFor( CMP_TREE_NODE& aNode, int aCol )
}
int CMP_TREE_MODEL_ADAPTER::WidthFor( wxString const& aHeading, int aCol )
{
static std::vector<int> widths;
for( int i = (int) widths.size(); i <= aCol; ++i )
{
widths.push_back( 0 );
}
if( widths[aCol] == 0 )
{
widths[aCol] = m_widget->GetTextExtent( aHeading ).x;
}
return widths[aCol];
}
bool CMP_TREE_MODEL_ADAPTER::ShowResults()
{
return FindAndExpand( m_tree,

View File

@ -322,8 +322,12 @@ private:
/**
* Compute the width required for the given column of a node and its
* children.
*
* @param aNode - root node of the tree
* @param aCol - column number
* @param aHeading - heading text, to set the minimum width
*/
int ColWidth( CMP_TREE_NODE& aNode, int aCol );
int ColWidth( CMP_TREE_NODE& aTree, int aCol, wxString const& aHeading );
/**
* Return the width required to display a single row's aCol text.
@ -332,6 +336,12 @@ private:
*/
int WidthFor( CMP_TREE_NODE& aNode, int aCol );
/**
* Return the width required to display a column's heading. This is
* cached by column number for the same reason as the width per cell.
*/
int WidthFor( wxString const& aHeading, int aCol );
/**
* Find any results worth highlighting and expand them, according to given
* criteria (f(CMP_TREE_NODE const*) -> bool)