Display descriptions in second column of library trees.

Also fixes some bugs in how the columns are sized.

Fixes https://gitlab.com/kicad/code/kicad/issues/12090
This commit is contained in:
Jeff Young 2022-07-28 14:51:13 +01:00
parent ee8116e55f
commit 753f2f3e4c
8 changed files with 68 additions and 25 deletions

View File

@ -79,11 +79,11 @@ LIB_TREE_MODEL_ADAPTER::LIB_TREE_MODEL_ADAPTER( EDA_BASE_FRAME* aParent,
m_widget( nullptr )
{
// Default column widths
m_colWidths[PART_COL] = 360;
m_colWidths[NAME_COL] = 300;
m_colWidths[DESC_COL] = 2000;
APP_SETTINGS_BASE* cfg = Kiface().KifaceSettings();
m_colWidths[PART_COL] = cfg->m_LibTree.column_width;
m_colWidths[NAME_COL] = cfg->m_LibTree.column_width;
}
@ -96,7 +96,7 @@ void LIB_TREE_MODEL_ADAPTER::SaveColWidths()
if( m_widget )
{
APP_SETTINGS_BASE* cfg = Kiface().KifaceSettings();
cfg->m_LibTree.column_width = m_widget->GetColumn( PART_COL )->GetWidth();
cfg->m_LibTree.column_width = m_widget->GetColumn( NAME_COL )->GetWidth();
}
}
@ -236,28 +236,30 @@ void LIB_TREE_MODEL_ADAPTER::UpdateSearchString( const wxString& aSearch, bool a
void LIB_TREE_MODEL_ADAPTER::AttachTo( wxDataViewCtrl* aDataViewCtrl )
{
wxString partHead = _( "Item" );
wxString itemHead = _( "Item" );
wxString descHead = _( "Description" );
// The extent of the text doesn't take into account the space on either side
// in the header, so artificially pad it
wxSize partHeadMinWidth = KIUI::GetTextSize( partHead + "MMM", aDataViewCtrl );
wxSize itemHeadMinWidth = KIUI::GetTextSize( itemHead + wxT( "MMM" ), aDataViewCtrl );
wxSize descHeadMinWidth = KIUI::GetTextSize( descHead + wxT( "MMM" ), aDataViewCtrl );
// Ensure the part column is wider than the smallest allowable width
if( m_colWidths[PART_COL] < partHeadMinWidth.x )
m_colWidths[PART_COL] = partHeadMinWidth.x;
if( m_colWidths[NAME_COL] < itemHeadMinWidth.x )
m_colWidths[NAME_COL] = itemHeadMinWidth.x;
m_widget = aDataViewCtrl;
aDataViewCtrl->SetIndent( kDataViewIndent );
aDataViewCtrl->AssociateModel( this );
aDataViewCtrl->ClearColumns();
m_col_part = aDataViewCtrl->AppendTextColumn( partHead, PART_COL, wxDATAVIEW_CELL_INERT,
m_colWidths[PART_COL] );
m_col_part = aDataViewCtrl->AppendTextColumn( itemHead, NAME_COL, wxDATAVIEW_CELL_INERT,
m_colWidths[NAME_COL] );
m_col_desc = aDataViewCtrl->AppendTextColumn( descHead, DESC_COL, wxDATAVIEW_CELL_INERT,
m_colWidths[DESC_COL] );
m_col_part->SetMinWidth( partHeadMinWidth.x );
m_col_part->SetMinWidth( itemHeadMinWidth.x );
m_col_desc->SetMinWidth( descHeadMinWidth.x );
}
@ -350,7 +352,14 @@ unsigned int LIB_TREE_MODEL_ADAPTER::GetChildren( const wxDataViewItem& aItem,
void LIB_TREE_MODEL_ADAPTER::FinishTreeInitialization()
{
m_col_part->SetWidth( m_colWidths[PART_COL] );
m_col_part->SetWidth( m_colWidths[NAME_COL] );
m_col_desc->SetWidth( m_colWidths[DESC_COL] );
}
void LIB_TREE_MODEL_ADAPTER::OnSize( wxSizeEvent& aEvent )
{
m_colWidths[NAME_COL] = m_col_part->GetWidth();
m_col_desc->SetWidth( m_colWidths[DESC_COL] );
}
@ -369,14 +378,14 @@ void LIB_TREE_MODEL_ADAPTER::RefreshTree()
// GTK returns the displayed width of the column, which is not calculated immediately
if( descWidth > 0 )
{
m_colWidths[PART_COL] = partWidth;
m_colWidths[NAME_COL] = partWidth;
m_colWidths[DESC_COL] = descWidth;
}
m_colWidths[PART_COL] += walk;
m_colWidths[NAME_COL] += walk;
m_colWidths[DESC_COL] -= walk;
m_col_part->SetWidth( m_colWidths[PART_COL] );
m_col_part->SetWidth( m_colWidths[NAME_COL] );
m_col_desc->SetWidth( m_colWidths[DESC_COL] );
walk = -walk;
}

View File

@ -112,6 +112,7 @@ LIB_TREE::LIB_TREE( wxWindow* aParent, LIB_TABLE* aLibTable,
SetSizer( sizer );
m_tree_ctrl->Bind( wxEVT_SIZE, &LIB_TREE::onSize, this );
m_tree_ctrl->Bind( wxEVT_DATAVIEW_ITEM_ACTIVATED, &LIB_TREE::onTreeActivate, this );
m_tree_ctrl->Bind( wxEVT_DATAVIEW_SELECTION_CHANGED, &LIB_TREE::onTreeSelect, this );
m_tree_ctrl->Bind( wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, &LIB_TREE::onContextMenu, this );
@ -472,6 +473,12 @@ void LIB_TREE::onTreeActivate( wxDataViewEvent& aEvent )
}
void LIB_TREE::onSize( wxSizeEvent& aEvent )
{
m_adapter->OnSize( aEvent );
}
void LIB_TREE::onDetailsLink( wxHtmlLinkEvent& aEvent )
{
const wxHtmlLinkInfo& info = aEvent.GetLinkInfo();

View File

@ -194,10 +194,20 @@ void SYMBOL_TREE_MODEL_ADAPTER::GetValue( wxVariant& aVariant, wxDataViewItem co
LIB_TREE_NODE* node = ToNode( aItem );
wxASSERT( node );
if( aCol == 0 && node->m_Pinned )
aVariant = GetPinningSymbol() + UnescapeString( node->m_Name );
else
aVariant = UnescapeString( node->m_Name );
switch( aCol )
{
case NAME_COL:
if( node->m_Pinned )
aVariant = GetPinningSymbol() + UnescapeString( node->m_Name );
else
aVariant = UnescapeString( node->m_Name );
break;
case DESC_COL:
aVariant = node->m_Desc;
break;
}
}

View File

@ -222,7 +222,7 @@ void SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetValue( wxVariant& aVariant, wxDataVie
switch( aCol )
{
case 0:
case NAME_COL:
if( m_frame->GetCurSymbol() && m_frame->GetCurSymbol()->GetLibId() == node->m_LibId )
node->m_Name = m_frame->GetCurSymbol()->GetLibId().GetLibItemName();
@ -245,7 +245,7 @@ void SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetValue( wxVariant& aVariant, wxDataVie
break;
case 1:
case DESC_COL:
if( m_frame->GetCurSymbol() && m_frame->GetCurSymbol()->GetLibId() == node->m_LibId )
{
node->m_Desc = m_frame->GetCurSymbol()->GetDescription();
@ -294,7 +294,7 @@ bool SYMBOL_TREE_SYNCHRONIZING_ADAPTER::GetAttr( wxDataViewItem const& aItem, un
}
// The remaining attributes are only for the name column
if( aCol != 0 )
if( aCol != NAME_COL )
return false;
LIB_SYMBOL* curSymbol = m_frame->GetCurSymbol();

View File

@ -127,8 +127,8 @@ public:
*/
enum TREE_COLS
{
PART_COL = 0, ///< Part name column
DESC_COL, ///< Part description column
NAME_COL = 0, ///< Library or library item name column
DESC_COL, ///< Library or library description column
NUM_COLS ///< The number of tree columns
};
@ -207,6 +207,7 @@ public:
*/
void FinishTreeInitialization();
void OnSize( wxSizeEvent& aEvent );
/**
* Return the alias for the given item.
*

View File

@ -171,6 +171,7 @@ protected:
void onTreeSelect( wxDataViewEvent& aEvent );
void onTreeActivate( wxDataViewEvent& aEvent );
void onSize( wxSizeEvent& aEvent );
void onDetailsLink( wxHtmlLinkEvent& aEvent );
void onPreselect( wxCommandEvent& aEvent );

View File

@ -110,6 +110,21 @@ void FP_TREE_MODEL_ADAPTER::GetValue( wxVariant& aVariant, wxDataViewItem const&
aVariant = GetPinningSymbol() + node->m_Name;
else
aVariant = node->m_Name;
switch( aCol )
{
case NAME_COL:
if( node->m_Pinned )
aVariant = GetPinningSymbol() + UnescapeString( node->m_Name );
else
aVariant = UnescapeString( node->m_Name );
break;
case DESC_COL:
aVariant = node->m_Desc;
break;
}
}

View File

@ -180,7 +180,7 @@ void FP_TREE_SYNCHRONIZING_ADAPTER::GetValue( wxVariant& aVariant, wxDataViewIte
switch( aCol )
{
case 0:
case NAME_COL:
if( node->m_LibId == m_frame->GetLoadedFPID() && !m_frame->IsCurrentFPFromBoard() )
{
// Do not use GetLoadedFPID(); it returns m_footprintNameWhenLoaded.
@ -203,7 +203,7 @@ void FP_TREE_SYNCHRONIZING_ADAPTER::GetValue( wxVariant& aVariant, wxDataViewIte
break;
case 1:
case DESC_COL:
if( node->m_LibId == m_frame->GetLoadedFPID() && !m_frame->IsCurrentFPFromBoard() )
{
node->m_Desc = m_frame->GetBoard()->GetFirstFootprint()->GetDescription();