Component Tree: restore expanded nodes after search query is cancelled
This commit is contained in:
parent
4a942a9810
commit
e25a1feb25
|
@ -251,6 +251,20 @@ wxDataViewItem CMP_TREE_MODEL_ADAPTER_BASE::FindItem( const LIB_ID& aLibId )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned int CMP_TREE_MODEL_ADAPTER_BASE::GetChildren(
|
||||||
|
wxDataViewItem const& aItem,
|
||||||
|
wxDataViewItemArray& aChildren ) const
|
||||||
|
{
|
||||||
|
auto node = ( aItem.IsOk() ? ToNode( aItem ) : &m_tree );
|
||||||
|
|
||||||
|
if( node->Type != CMP_TREE_NODE::TYPE::LIBID
|
||||||
|
|| ( m_show_units && node->Type == CMP_TREE_NODE::TYPE::LIBID ) )
|
||||||
|
return IntoArray( *node, aChildren );
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool CMP_TREE_MODEL_ADAPTER_BASE::HasContainerColumns( wxDataViewItem const& aItem ) const
|
bool CMP_TREE_MODEL_ADAPTER_BASE::HasContainerColumns( wxDataViewItem const& aItem ) const
|
||||||
{
|
{
|
||||||
return IsContainer( aItem );
|
return IsContainer( aItem );
|
||||||
|
@ -282,20 +296,6 @@ wxDataViewItem CMP_TREE_MODEL_ADAPTER_BASE::GetParent( wxDataViewItem const& aIt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned int CMP_TREE_MODEL_ADAPTER_BASE::GetChildren(
|
|
||||||
wxDataViewItem const& aItem,
|
|
||||||
wxDataViewItemArray& aChildren ) const
|
|
||||||
{
|
|
||||||
auto node = ( aItem.IsOk() ? ToNode( aItem ) : &m_tree );
|
|
||||||
|
|
||||||
if( node->Type != CMP_TREE_NODE::TYPE::LIBID
|
|
||||||
|| ( m_show_units && node->Type == CMP_TREE_NODE::TYPE::LIBID ) )
|
|
||||||
return IntoArray( *node, aChildren );
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CMP_TREE_MODEL_ADAPTER_BASE::GetValue(
|
void CMP_TREE_MODEL_ADAPTER_BASE::GetValue(
|
||||||
wxVariant& aVariant,
|
wxVariant& aVariant,
|
||||||
wxDataViewItem const& aItem,
|
wxDataViewItem const& aItem,
|
||||||
|
|
|
@ -241,6 +241,15 @@ public:
|
||||||
*/
|
*/
|
||||||
wxDataViewItem FindItem( const LIB_ID& aLibId );
|
wxDataViewItem FindItem( const LIB_ID& aLibId );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Populate a list of all the children of an item
|
||||||
|
*
|
||||||
|
* @return number of children
|
||||||
|
*/
|
||||||
|
virtual unsigned int GetChildren(
|
||||||
|
wxDataViewItem const& aItem,
|
||||||
|
wxDataViewItemArray& aChildren ) const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static wxDataViewItem ToItem( CMP_TREE_NODE const* aNode );
|
static wxDataViewItem ToItem( CMP_TREE_NODE const* aNode );
|
||||||
static CMP_TREE_NODE const* ToNode( wxDataViewItem aItem );
|
static CMP_TREE_NODE const* ToNode( wxDataViewItem aItem );
|
||||||
|
@ -271,15 +280,6 @@ protected:
|
||||||
*/
|
*/
|
||||||
virtual wxDataViewItem GetParent( wxDataViewItem const& aItem ) const override;
|
virtual wxDataViewItem GetParent( wxDataViewItem const& aItem ) const override;
|
||||||
|
|
||||||
/**
|
|
||||||
* Populate a list of all the children of an item
|
|
||||||
*
|
|
||||||
* @return number of children
|
|
||||||
*/
|
|
||||||
virtual unsigned int GetChildren(
|
|
||||||
wxDataViewItem const& aItem,
|
|
||||||
wxDataViewItemArray& aChildren ) const override;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the number of columns in the model
|
* Return the number of columns in the model
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -41,7 +41,8 @@ COMPONENT_TREE::COMPONENT_TREE( wxWindow* aParent, SYMBOL_LIB_TABLE* aSymLibTabl
|
||||||
m_sym_lib_table( aSymLibTable ),
|
m_sym_lib_table( aSymLibTable ),
|
||||||
m_adapter( aAdapter ),
|
m_adapter( aAdapter ),
|
||||||
m_query_ctrl( nullptr ),
|
m_query_ctrl( nullptr ),
|
||||||
m_details_ctrl( nullptr )
|
m_details_ctrl( nullptr ),
|
||||||
|
m_filtering( false )
|
||||||
{
|
{
|
||||||
// create space for context menu pointers, INVALID is the max value
|
// create space for context menu pointers, INVALID is the max value
|
||||||
m_menus.resize( CMP_TREE_NODE::TYPE::INVALID + 1 );
|
m_menus.resize( CMP_TREE_NODE::TYPE::INVALID + 1 );
|
||||||
|
@ -164,9 +165,24 @@ void COMPONENT_TREE::postSelectEvent()
|
||||||
|
|
||||||
void COMPONENT_TREE::onQueryText( wxCommandEvent& aEvent )
|
void COMPONENT_TREE::onQueryText( wxCommandEvent& aEvent )
|
||||||
{
|
{
|
||||||
|
// Store the state
|
||||||
|
if( !m_filtering )
|
||||||
|
{
|
||||||
|
m_selection = m_tree_ctrl->GetSelection();
|
||||||
|
saveExpandFlag();
|
||||||
|
}
|
||||||
|
|
||||||
m_adapter->UpdateSearchString( m_query_ctrl->GetLineText( 0 ) );
|
m_adapter->UpdateSearchString( m_query_ctrl->GetLineText( 0 ) );
|
||||||
|
m_filtering = !m_query_ctrl->IsEmpty();
|
||||||
postPreselectEvent();
|
postPreselectEvent();
|
||||||
|
|
||||||
|
// Restore the state
|
||||||
|
if( !m_filtering )
|
||||||
|
{
|
||||||
|
selectIfValid( m_selection );
|
||||||
|
restoreExpandFlag();
|
||||||
|
}
|
||||||
|
|
||||||
// Required to avoid interaction with SetHint()
|
// Required to avoid interaction with SetHint()
|
||||||
// See documentation for wxTextEntry::SetHint
|
// See documentation for wxTextEntry::SetHint
|
||||||
aEvent.Skip();
|
aEvent.Skip();
|
||||||
|
@ -260,5 +276,32 @@ void COMPONENT_TREE::onContextMenu( wxDataViewEvent& aEvent )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void COMPONENT_TREE::saveExpandFlag()
|
||||||
|
{
|
||||||
|
wxDataViewItemArray items;
|
||||||
|
m_adapter->GetChildren( wxDataViewItem( nullptr ), items );
|
||||||
|
m_expanded.clear();
|
||||||
|
|
||||||
|
for( const auto& item : items )
|
||||||
|
{
|
||||||
|
if( m_tree_ctrl->IsExpanded( item ) )
|
||||||
|
m_expanded.push_back( item );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void COMPONENT_TREE::restoreExpandFlag()
|
||||||
|
{
|
||||||
|
m_tree_ctrl->Freeze();
|
||||||
|
|
||||||
|
for( const auto& item : m_expanded )
|
||||||
|
{
|
||||||
|
m_tree_ctrl->Expand( item );
|
||||||
|
}
|
||||||
|
|
||||||
|
m_tree_ctrl->Thaw();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
wxDEFINE_EVENT( COMPONENT_PRESELECTED, wxCommandEvent );
|
wxDEFINE_EVENT( COMPONENT_PRESELECTED, wxCommandEvent );
|
||||||
wxDEFINE_EVENT( COMPONENT_SELECTED, wxCommandEvent );
|
wxDEFINE_EVENT( COMPONENT_SELECTED, wxCommandEvent );
|
||||||
|
|
|
@ -114,8 +114,18 @@ protected:
|
||||||
void onPreselect( wxCommandEvent& aEvent );
|
void onPreselect( wxCommandEvent& aEvent );
|
||||||
void onContextMenu( wxDataViewEvent& aEvent );
|
void onContextMenu( wxDataViewEvent& aEvent );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store the list of expanded nodes in the tree widget.
|
||||||
|
*/
|
||||||
|
void saveExpandFlag();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restore the expanded nodes in the tree widget.
|
||||||
|
*/
|
||||||
|
void restoreExpandFlag();
|
||||||
|
|
||||||
SYMBOL_LIB_TABLE* m_sym_lib_table;
|
SYMBOL_LIB_TABLE* m_sym_lib_table;
|
||||||
CMP_TREE_MODEL_ADAPTER::PTR m_adapter;
|
CMP_TREE_MODEL_ADAPTER_BASE::PTR m_adapter;
|
||||||
|
|
||||||
wxTextCtrl* m_query_ctrl;
|
wxTextCtrl* m_query_ctrl;
|
||||||
wxDataViewCtrl* m_tree_ctrl;
|
wxDataViewCtrl* m_tree_ctrl;
|
||||||
|
@ -126,6 +136,12 @@ protected:
|
||||||
|
|
||||||
///> Flag indicating whether a right-click context menu is active
|
///> Flag indicating whether a right-click context menu is active
|
||||||
bool m_menuActive;
|
bool m_menuActive;
|
||||||
|
|
||||||
|
bool m_filtering;
|
||||||
|
|
||||||
|
///> List of expanded nodes
|
||||||
|
std::vector<wxDataViewItem> m_expanded;
|
||||||
|
wxDataViewItem m_selection;
|
||||||
};
|
};
|
||||||
|
|
||||||
///> Custom event sent when a new component is preselected
|
///> Custom event sent when a new component is preselected
|
||||||
|
|
Loading…
Reference in New Issue