mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-14 10:13:19 +02:00
eeschema: Add option for renaming sheets in the Hierarchy tree view
This commit is contained in:
parent
8a1347d2c8
commit
61be2ea048
@ -27,6 +27,7 @@
|
|||||||
#include <sch_edit_frame.h>
|
#include <sch_edit_frame.h>
|
||||||
#include <sch_sheet.h>
|
#include <sch_sheet.h>
|
||||||
#include <sch_sheet_path.h>
|
#include <sch_sheet_path.h>
|
||||||
|
#include <sch_commit.h>
|
||||||
#include <schematic.h>
|
#include <schematic.h>
|
||||||
#include <tool/tool_manager.h>
|
#include <tool/tool_manager.h>
|
||||||
#include <tools/ee_actions.h>
|
#include <tools/ee_actions.h>
|
||||||
@ -47,11 +48,7 @@ class TREE_ITEM_DATA : public wxTreeItemData
|
|||||||
public:
|
public:
|
||||||
SCH_SHEET_PATH m_SheetPath;
|
SCH_SHEET_PATH m_SheetPath;
|
||||||
|
|
||||||
TREE_ITEM_DATA( SCH_SHEET_PATH& sheet ) :
|
TREE_ITEM_DATA( SCH_SHEET_PATH& sheet ) : wxTreeItemData(), m_SheetPath( sheet ) {}
|
||||||
wxTreeItemData()
|
|
||||||
{
|
|
||||||
m_SheetPath = sheet;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -110,8 +107,8 @@ HIERARCHY_PANE::HIERARCHY_PANE( SCH_EDIT_FRAME* aParent ) :
|
|||||||
Bind( wxEVT_TREE_SEL_CHANGED, &HIERARCHY_PANE::onSelectSheetPath, this );
|
Bind( wxEVT_TREE_SEL_CHANGED, &HIERARCHY_PANE::onSelectSheetPath, this );
|
||||||
Bind( wxEVT_TREE_ITEM_RIGHT_CLICK, &HIERARCHY_PANE::onTreeItemRightClick, this );
|
Bind( wxEVT_TREE_ITEM_RIGHT_CLICK, &HIERARCHY_PANE::onTreeItemRightClick, this );
|
||||||
Bind( wxEVT_CHAR_HOOK, &HIERARCHY_PANE::onCharHook, this );
|
Bind( wxEVT_CHAR_HOOK, &HIERARCHY_PANE::onCharHook, this );
|
||||||
|
m_tree->Bind( wxEVT_TREE_END_LABEL_EDIT, &HIERARCHY_PANE::onTreeEditFinished, this );
|
||||||
m_tree->Bind( wxEVT_RIGHT_UP, &HIERARCHY_PANE::onRightClick, this );
|
m_tree->Bind( wxEVT_RIGHT_UP, &HIERARCHY_PANE::onRightClick, this );
|
||||||
|
|
||||||
m_events_bound = true;
|
m_events_bound = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,6 +119,7 @@ HIERARCHY_PANE::~HIERARCHY_PANE()
|
|||||||
Unbind( wxEVT_TREE_SEL_CHANGED, &HIERARCHY_PANE::onSelectSheetPath, this );
|
Unbind( wxEVT_TREE_SEL_CHANGED, &HIERARCHY_PANE::onSelectSheetPath, this );
|
||||||
Unbind( wxEVT_TREE_ITEM_RIGHT_CLICK, &HIERARCHY_PANE::onTreeItemRightClick, this );
|
Unbind( wxEVT_TREE_ITEM_RIGHT_CLICK, &HIERARCHY_PANE::onTreeItemRightClick, this );
|
||||||
Unbind( wxEVT_CHAR_HOOK, &HIERARCHY_PANE::onCharHook, this );
|
Unbind( wxEVT_CHAR_HOOK, &HIERARCHY_PANE::onCharHook, this );
|
||||||
|
m_tree->Unbind( wxEVT_TREE_END_LABEL_EDIT, &HIERARCHY_PANE::onTreeEditFinished, this );
|
||||||
m_tree->Unbind( wxEVT_RIGHT_UP, &HIERARCHY_PANE::onRightClick, this );
|
m_tree->Unbind( wxEVT_RIGHT_UP, &HIERARCHY_PANE::onRightClick, this );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,8 +134,9 @@ void HIERARCHY_PANE::buildHierarchyTree( SCH_SHEET_PATH* aList, const wxTreeItem
|
|||||||
SCH_SHEET* sheet = static_cast<SCH_SHEET*>( aItem );
|
SCH_SHEET* sheet = static_cast<SCH_SHEET*>( aItem );
|
||||||
aList->push_back( sheet );
|
aList->push_back( sheet );
|
||||||
|
|
||||||
wxString sheetName = formatPageString( sheet->GetFields()[SHEETNAME].GetShownText( false ),
|
wxString sheetNameBase = sheet->GetFields()[SHEETNAME].GetShownText( false );
|
||||||
aList->GetPageNumber() );
|
wxString sheetName = formatPageString( sheetNameBase, aList->GetPageNumber() );
|
||||||
|
wxString sheetNumber = aList->GetPageNumber();
|
||||||
wxTreeItemId child = m_tree->AppendItem( aParent, sheetName, 0, 1 );
|
wxTreeItemId child = m_tree->AppendItem( aParent, sheetName, 0, 1 );
|
||||||
m_tree->SetItemData( child, new TREE_ITEM_DATA( *aList ) );
|
m_tree->SetItemData( child, new TREE_ITEM_DATA( *aList ) );
|
||||||
|
|
||||||
@ -326,7 +325,6 @@ void HIERARCHY_PANE::onSelectSheetPath( wxTreeEvent& aEvent )
|
|||||||
SetCursor( wxCURSOR_ARROW );
|
SetCursor( wxCURSOR_ARROW );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void HIERARCHY_PANE::UpdateLabelsHierarchyTree()
|
void HIERARCHY_PANE::UpdateLabelsHierarchyTree()
|
||||||
{
|
{
|
||||||
// Update the labels of the hierarchical tree of the schematic.
|
// Update the labels of the hierarchical tree of the schematic.
|
||||||
@ -337,8 +335,8 @@ void HIERARCHY_PANE::UpdateLabelsHierarchyTree()
|
|||||||
[&]( const wxTreeItemId& id )
|
[&]( const wxTreeItemId& id )
|
||||||
{
|
{
|
||||||
TREE_ITEM_DATA* itemData = static_cast<TREE_ITEM_DATA*>( m_tree->GetItemData( id ) );
|
TREE_ITEM_DATA* itemData = static_cast<TREE_ITEM_DATA*>( m_tree->GetItemData( id ) );
|
||||||
SCH_SHEET* sheet = itemData->m_SheetPath.Last();
|
SCH_SHEET* sheet = itemData->m_SheetPath.Last();
|
||||||
wxString sheetNameLabel =
|
wxString sheetNameLabel =
|
||||||
formatPageString( sheet->GetFields()[SHEETNAME].GetShownText( false ),
|
formatPageString( sheet->GetFields()[SHEETNAME].GetShownText( false ),
|
||||||
itemData->m_SheetPath.GetPageNumber() );
|
itemData->m_SheetPath.GetPageNumber() );
|
||||||
|
|
||||||
@ -393,16 +391,24 @@ void HIERARCHY_PANE::onRightClick( wxTreeItemId aItem )
|
|||||||
|
|
||||||
if( itemData )
|
if( itemData )
|
||||||
{
|
{
|
||||||
ctxMenu.Append( 1, _( "Edit Page Number" ) );
|
ctxMenu.Append( EDIT_PAGE_NUMBER, _( "Edit Page Number" ) );
|
||||||
|
// The root item cannot be renamed
|
||||||
|
if( m_tree->GetRootItem() != aItem.GetID() )
|
||||||
|
{
|
||||||
|
ctxMenu.Append( RENAME, _( "Rename" ), _( "Change name of this sheet" ) );
|
||||||
|
}
|
||||||
|
|
||||||
ctxMenu.AppendSeparator();
|
ctxMenu.AppendSeparator();
|
||||||
}
|
}
|
||||||
|
ctxMenu.Append( EXPAND_ALL, ACTIONS::expandAll.GetMenuItem() );
|
||||||
|
ctxMenu.Append( COLLAPSE_ALL, ACTIONS::collapseAll.GetMenuItem() );
|
||||||
|
|
||||||
ctxMenu.Append( 2, ACTIONS::expandAll.GetMenuItem() );
|
|
||||||
ctxMenu.Append( 3, ACTIONS::collapseAll.GetMenuItem() );
|
|
||||||
|
|
||||||
switch( GetPopupMenuSelectionFromUser( ctxMenu ) )
|
int selected = GetPopupMenuSelectionFromUser( ctxMenu );
|
||||||
|
|
||||||
|
switch( selected )
|
||||||
{
|
{
|
||||||
case 1:
|
case EDIT_PAGE_NUMBER:
|
||||||
{
|
{
|
||||||
wxString msg;
|
wxString msg;
|
||||||
wxString sheetPath = itemData->m_SheetPath.PathHumanReadable( false, true );
|
wxString sheetPath = itemData->m_SheetPath.PathHumanReadable( false, true );
|
||||||
@ -439,17 +445,65 @@ void HIERARCHY_PANE::onRightClick( wxTreeItemId aItem )
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 2:
|
case EXPAND_ALL:
|
||||||
m_tree->ExpandAll();
|
m_tree->ExpandAll();
|
||||||
break;
|
break;
|
||||||
|
case COLLAPSE_ALL:
|
||||||
case 3:
|
|
||||||
m_tree->CollapseAll();
|
m_tree->CollapseAll();
|
||||||
break;
|
break;
|
||||||
|
case RENAME:
|
||||||
|
m_tree->SetItemText( aItem, itemData->m_SheetPath.Last()->GetName() );
|
||||||
|
m_tree->EditLabel( aItem );
|
||||||
|
setIdenticalSheetsHighlighted( itemData->m_SheetPath );
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void HIERARCHY_PANE::onTreeEditFinished( wxTreeEvent& event )
|
||||||
|
{
|
||||||
|
TREE_ITEM_DATA* data = static_cast<TREE_ITEM_DATA*>( m_tree->GetItemData( event.GetItem() ) );
|
||||||
|
wxString newName = event.GetLabel();
|
||||||
|
|
||||||
|
if( !newName.IsEmpty() )
|
||||||
|
{
|
||||||
|
// The editor holds only the page name as a text, while normally
|
||||||
|
// the tree items displaying it suffixed with the page number
|
||||||
|
if( data->m_SheetPath.Last()->GetName() != newName )
|
||||||
|
{
|
||||||
|
const SCH_SHEET* parentSheet =
|
||||||
|
data->m_SheetPath.GetSheet( data->m_SheetPath.size() - 2 );
|
||||||
|
|
||||||
|
if( parentSheet )
|
||||||
|
{
|
||||||
|
SCH_COMMIT commit( m_frame );
|
||||||
|
commit.Modify( &data->m_SheetPath.Last()->GetFields()[SHEETNAME],
|
||||||
|
parentSheet->GetScreen() );
|
||||||
|
|
||||||
|
data->m_SheetPath.Last()->SetName( newName );
|
||||||
|
|
||||||
|
renameIdenticalSheets( data->m_SheetPath, newName, &commit );
|
||||||
|
|
||||||
|
if( !commit.Empty() )
|
||||||
|
commit.Push( _( "Renaming sheet" ) );
|
||||||
|
|
||||||
|
if( data->m_SheetPath == m_frame->GetCurrentSheet() )
|
||||||
|
{
|
||||||
|
m_frame->OnPageSettingsChange();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_tree->SetItemText( event.GetItem(), formatPageString( data->m_SheetPath.Last()->GetName(),
|
||||||
|
data->m_SheetPath.GetPageNumber() ) );
|
||||||
|
setIdenticalSheetsHighlighted( data->m_SheetPath, false );
|
||||||
|
// The event needs to be rejected otherwise the SetItemText call above
|
||||||
|
// will be ineffective (the treeview item will hold the editor's content)
|
||||||
|
event.Veto();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void HIERARCHY_PANE::onCharHook( wxKeyEvent& aKeyStroke )
|
void HIERARCHY_PANE::onCharHook( wxKeyEvent& aKeyStroke )
|
||||||
{
|
{
|
||||||
int hotkey = aKeyStroke.GetKeyCode();
|
int hotkey = aKeyStroke.GetKeyCode();
|
||||||
@ -475,6 +529,10 @@ void HIERARCHY_PANE::onCharHook( wxKeyEvent& aKeyStroke )
|
|||||||
m_tree->CollapseAll();
|
m_tree->CollapseAll();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
aKeyStroke.Skip();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -492,3 +550,72 @@ wxString HIERARCHY_PANE::formatPageString( const wxString& aName, const wxString
|
|||||||
{
|
{
|
||||||
return aName + wxT( " " ) + wxString::Format( _( "(page %s)" ), aPage );
|
return aName + wxT( " " ) + wxString::Format( _( "(page %s)" ), aPage );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HIERARCHY_PANE::setIdenticalSheetsHighlighted( const SCH_SHEET_PATH& path, bool highLighted )
|
||||||
|
{
|
||||||
|
std::function<void( const wxTreeItemId& )> recursiveDescent = [&]( const wxTreeItemId& id )
|
||||||
|
{
|
||||||
|
wxCHECK_RET( id.IsOk(), wxT( "Invalid tree item" ) );
|
||||||
|
|
||||||
|
TREE_ITEM_DATA* itemData = static_cast<TREE_ITEM_DATA*>( m_tree->GetItemData( id ) );
|
||||||
|
|
||||||
|
if( itemData->m_SheetPath.Cmp( path ) != 0 && itemData->m_SheetPath.Last() == path.Last() )
|
||||||
|
{
|
||||||
|
wxFont font = m_tree->GetItemFont( id );
|
||||||
|
font.SetUnderlined( highLighted );
|
||||||
|
m_tree->SetItemFont( id, font );
|
||||||
|
}
|
||||||
|
|
||||||
|
wxTreeItemIdValue cookie;
|
||||||
|
wxTreeItemId child = m_tree->GetFirstChild( id, cookie );
|
||||||
|
|
||||||
|
while( child.IsOk() )
|
||||||
|
{
|
||||||
|
recursiveDescent( child );
|
||||||
|
child = m_tree->GetNextChild( id, cookie );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
recursiveDescent( m_tree->GetRootItem() );
|
||||||
|
}
|
||||||
|
|
||||||
|
void HIERARCHY_PANE::renameIdenticalSheets( const SCH_SHEET_PATH& renamedSheet,
|
||||||
|
const wxString newName, SCH_COMMIT* commit )
|
||||||
|
{
|
||||||
|
std::function<void( const wxTreeItemId& )> recursiveDescent = [&]( const wxTreeItemId& id )
|
||||||
|
{
|
||||||
|
wxCHECK_RET( id.IsOk(), wxT( "Invalid tree item" ) );
|
||||||
|
|
||||||
|
TREE_ITEM_DATA* data = static_cast<TREE_ITEM_DATA*>( m_tree->GetItemData( id ) );
|
||||||
|
|
||||||
|
const SCH_SHEET* parentSheet = data->m_SheetPath.GetSheet( data->m_SheetPath.size() - 2 );
|
||||||
|
|
||||||
|
if( parentSheet && data->m_SheetPath.Cmp( renamedSheet ) != 0
|
||||||
|
&& data->m_SheetPath.Last() == renamedSheet.Last() )
|
||||||
|
{
|
||||||
|
commit->Modify( &data->m_SheetPath.Last()->GetFields()[SHEETNAME],
|
||||||
|
parentSheet->GetScreen() );
|
||||||
|
|
||||||
|
data->m_SheetPath.Last()->SetName( newName );
|
||||||
|
|
||||||
|
if( data->m_SheetPath == m_frame->GetCurrentSheet() )
|
||||||
|
{
|
||||||
|
m_frame->OnPageSettingsChange();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_tree->SetItemText( id, formatPageString( data->m_SheetPath.Last()->GetName(),
|
||||||
|
data->m_SheetPath.GetPageNumber() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
wxTreeItemIdValue cookie;
|
||||||
|
wxTreeItemId child = m_tree->GetFirstChild( id, cookie );
|
||||||
|
|
||||||
|
while( child.IsOk() )
|
||||||
|
{
|
||||||
|
recursiveDescent( child );
|
||||||
|
child = m_tree->GetNextChild( id, cookie );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
recursiveDescent( m_tree->GetRootItem() );
|
||||||
|
}
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#include "widgets/wx_panel.h"
|
#include "widgets/wx_panel.h"
|
||||||
|
|
||||||
|
|
||||||
|
class SCH_COMMIT;
|
||||||
class SCH_EDIT_FRAME;
|
class SCH_EDIT_FRAME;
|
||||||
class SCH_SHEET_PATH;
|
class SCH_SHEET_PATH;
|
||||||
|
|
||||||
@ -51,7 +52,8 @@ class HIERARCHY_TREE : public wxTreeCtrl
|
|||||||
public:
|
public:
|
||||||
HIERARCHY_TREE( HIERARCHY_PANE* parent ) :
|
HIERARCHY_TREE( HIERARCHY_PANE* parent ) :
|
||||||
wxTreeCtrl( (wxWindow*) parent, wxID_ANY, wxDefaultPosition, wxDefaultSize,
|
wxTreeCtrl( (wxWindow*) parent, wxID_ANY, wxDefaultPosition, wxDefaultSize,
|
||||||
wxTR_HAS_BUTTONS, wxDefaultValidator, wxT( "HierachyTreeCtrl" ) )
|
wxTR_HAS_BUTTONS | wxTR_EDIT_LABELS, wxDefaultValidator,
|
||||||
|
wxT( "HierachyTreeCtrl" ) )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,6 +69,14 @@ private:
|
|||||||
class HIERARCHY_PANE : public WX_PANEL
|
class HIERARCHY_PANE : public WX_PANEL
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
enum ContextMenuAction
|
||||||
|
{
|
||||||
|
EDIT_PAGE_NUMBER,
|
||||||
|
EXPAND_ALL,
|
||||||
|
COLLAPSE_ALL,
|
||||||
|
RENAME
|
||||||
|
};
|
||||||
|
|
||||||
HIERARCHY_PANE( SCH_EDIT_FRAME* aParent );
|
HIERARCHY_PANE( SCH_EDIT_FRAME* aParent );
|
||||||
|
|
||||||
~HIERARCHY_PANE();
|
~HIERARCHY_PANE();
|
||||||
@ -109,6 +119,8 @@ private:
|
|||||||
void onRightClick( wxMouseEvent& aEvent );
|
void onRightClick( wxMouseEvent& aEvent );
|
||||||
void onRightClick( wxTreeItemId aItem );
|
void onRightClick( wxTreeItemId aItem );
|
||||||
void onCharHook( wxKeyEvent& aKeyStroke );
|
void onCharHook( wxKeyEvent& aKeyStroke );
|
||||||
|
void onTreeRightClick( wxTreeEvent& event );
|
||||||
|
void onTreeEditFinished( wxTreeEvent& event );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return String with page number in parenthesis
|
* @return String with page number in parenthesis
|
||||||
@ -120,6 +132,18 @@ private:
|
|||||||
*/
|
*/
|
||||||
wxString formatPageString( const wxString& aName, const wxString& aPage );
|
wxString formatPageString( const wxString& aName, const wxString& aPage );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When renaming the sheets in tree it is helpful to highlight
|
||||||
|
* the identical sheets which got renamed by renaming the current sheet.
|
||||||
|
*/
|
||||||
|
void setIdenticalSheetsHighlighted( const SCH_SHEET_PATH& path, bool highLighted = true );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename all sheets in a hierarchial desing which has the same source renamed sheet
|
||||||
|
*/
|
||||||
|
void renameIdenticalSheets( const SCH_SHEET_PATH& renamedSheet, const wxString newName,
|
||||||
|
SCH_COMMIT* commit );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SCH_SHEET_PATH m_list;
|
SCH_SHEET_PATH m_list;
|
||||||
SCH_EDIT_FRAME* m_frame;
|
SCH_EDIT_FRAME* m_frame;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user