diff --git a/common/draw_panel_gal.cpp b/common/draw_panel_gal.cpp
index a07283a1ac..8622de7ca4 100644
--- a/common/draw_panel_gal.cpp
+++ b/common/draw_panel_gal.cpp
@@ -116,6 +116,12 @@ EDA_DRAW_PANEL_GAL::EDA_DRAW_PANEL_GAL( wxWindow* aParentWindow, wxWindowID aWin
wxEVT_MIDDLE_UP,
wxEVT_MIDDLE_DOWN,
wxEVT_MIDDLE_DCLICK,
+ wxEVT_AUX1_UP,
+ wxEVT_AUX1_DOWN,
+ wxEVT_AUX1_DCLICK,
+ wxEVT_AUX2_UP,
+ wxEVT_AUX2_DOWN,
+ wxEVT_AUX2_DCLICK,
wxEVT_MOTION,
wxEVT_MOUSEWHEEL,
wxEVT_CHAR,
diff --git a/common/gal/cairo/cairo_gal.cpp b/common/gal/cairo/cairo_gal.cpp
index 9814233798..d5361d4476 100644
--- a/common/gal/cairo/cairo_gal.cpp
+++ b/common/gal/cairo/cairo_gal.cpp
@@ -1329,6 +1329,12 @@ CAIRO_GAL::CAIRO_GAL( GAL_DISPLAY_OPTIONS& aDisplayOptions, wxWindow* aParent,
Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) );
Connect( wxEVT_RIGHT_UP, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) );
Connect( wxEVT_RIGHT_DCLICK, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) );
+ Connect( wxEVT_AUX1_DOWN, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) );
+ Connect( wxEVT_AUX1_UP, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) );
+ Connect( wxEVT_AUX1_DCLICK, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) );
+ Connect( wxEVT_AUX2_DOWN, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) );
+ Connect( wxEVT_AUX2_UP, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) );
+ Connect( wxEVT_AUX2_DCLICK, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) );
Connect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) );
#if defined _WIN32 || defined _WIN64
Connect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) );
diff --git a/common/gal/opengl/opengl_gal.cpp b/common/gal/opengl/opengl_gal.cpp
index bf79cd90eb..a797fdd9db 100644
--- a/common/gal/opengl/opengl_gal.cpp
+++ b/common/gal/opengl/opengl_gal.cpp
@@ -256,6 +256,12 @@ OPENGL_GAL::OPENGL_GAL( GAL_DISPLAY_OPTIONS& aDisplayOptions, wxWindow* aParent,
Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) );
Connect( wxEVT_RIGHT_UP, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) );
Connect( wxEVT_RIGHT_DCLICK, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) );
+ Connect( wxEVT_AUX1_DOWN, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) );
+ Connect( wxEVT_AUX1_UP, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) );
+ Connect( wxEVT_AUX1_DCLICK, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) );
+ Connect( wxEVT_AUX2_DOWN, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) );
+ Connect( wxEVT_AUX2_UP, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) );
+ Connect( wxEVT_AUX2_DCLICK, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) );
Connect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) );
#if wxCHECK_VERSION( 3, 1, 0 ) || defined( USE_OSX_MAGNIFY_EVENT )
Connect( wxEVT_MAGNIFY, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) );
diff --git a/common/tool/tool_dispatcher.cpp b/common/tool/tool_dispatcher.cpp
index f84f8b524d..d49883d476 100644
--- a/common/tool/tool_dispatcher.cpp
+++ b/common/tool/tool_dispatcher.cpp
@@ -113,6 +113,12 @@ struct TOOL_DISPATCHER::BUTTON_STATE
case BUT_RIGHT:
return mouseState.RightIsDown();
+ case BUT_AUX1:
+ return mouseState.Aux1IsDown();
+
+ case BUT_AUX2:
+ return mouseState.Aux2IsDown();
+
default:
assert( false );
break;
@@ -138,6 +144,10 @@ TOOL_DISPATCHER::TOOL_DISPATCHER( TOOL_MANAGER* aToolMgr ) :
wxEVT_RIGHT_UP, wxEVT_RIGHT_DCLICK ) );
m_buttons.push_back( new BUTTON_STATE( BUT_MIDDLE, wxEVT_MIDDLE_DOWN,
wxEVT_MIDDLE_UP, wxEVT_MIDDLE_DCLICK ) );
+ m_buttons.push_back( new BUTTON_STATE( BUT_AUX1, wxEVT_AUX1_DOWN,
+ wxEVT_AUX1_UP, wxEVT_AUX1_DCLICK ) );
+ m_buttons.push_back( new BUTTON_STATE( BUT_AUX2, wxEVT_AUX2_DOWN,
+ wxEVT_AUX2_UP, wxEVT_AUX2_DCLICK ) );
ResetState();
}
@@ -311,10 +321,11 @@ static bool isKeyModifierOnly( int aKeyCode )
static bool isMouseClick( wxEventType type )
{
- return type == wxEVT_LEFT_DOWN || type == wxEVT_LEFT_UP || type == wxEVT_MIDDLE_DOWN
- || type == wxEVT_MIDDLE_UP || type == wxEVT_RIGHT_DOWN || type == wxEVT_RIGHT_UP
- || type == wxEVT_LEFT_DCLICK || type == wxEVT_MIDDLE_DCLICK
- || type == wxEVT_RIGHT_DCLICK;
+ return type == wxEVT_LEFT_DOWN || type == wxEVT_LEFT_UP || type == wxEVT_LEFT_DCLICK
+ || type == wxEVT_MIDDLE_DOWN || type == wxEVT_MIDDLE_UP || type == wxEVT_MIDDLE_DCLICK
+ || type == wxEVT_RIGHT_DOWN || type == wxEVT_RIGHT_UP || type == wxEVT_RIGHT_DCLICK
+ || type == wxEVT_AUX1_DOWN || type == wxEVT_AUX1_UP || type == wxEVT_AUX1_DCLICK
+ || type == wxEVT_AUX2_DOWN || type == wxEVT_AUX2_UP || type == wxEVT_AUX2_DCLICK;
}
diff --git a/common/tool/tool_event.cpp b/common/tool/tool_event.cpp
index 55059a08e0..4b46e63c17 100644
--- a/common/tool/tool_event.cpp
+++ b/common/tool/tool_event.cpp
@@ -136,6 +136,8 @@ const std::string TOOL_EVENT::Format() const
{ BUT_LEFT, "left" },
{ BUT_RIGHT, "right" },
{ BUT_MIDDLE, "middle" },
+ { BUT_AUX1, "aux1" },
+ { BUT_AUX2, "aux2" },
{ 0, "" }
};
diff --git a/common/widgets/wx_aui_utils.cpp b/common/widgets/wx_aui_utils.cpp
index b9656f8b02..5ba6a06788 100644
--- a/common/widgets/wx_aui_utils.cpp
+++ b/common/widgets/wx_aui_utils.cpp
@@ -32,7 +32,10 @@ void SetAuiPaneSize( wxAuiManager& aManager, wxAuiPaneInfo& aPane, int aWidth, i
aManager.Update();
// now make it resizable again
- aPane.MinSize( minSize.x, minSize.y );
aPane.Resizable();
aManager.Update();
+
+ // Note: DO NOT call m_auimgr.Update() anywhere after this; it will nuke the size
+ // back to minimum.
+ aPane.MinSize( minSize.x, minSize.y );
}
diff --git a/eeschema/dialogs/panel_eeschema_editing_options.cpp b/eeschema/dialogs/panel_eeschema_editing_options.cpp
index 9e4d9b428b..b195ec83ed 100644
--- a/eeschema/dialogs/panel_eeschema_editing_options.cpp
+++ b/eeschema/dialogs/panel_eeschema_editing_options.cpp
@@ -65,7 +65,6 @@ void PANEL_EESCHEMA_EDITING_OPTIONS::loadEEschemaSettings( EESCHEMA_SETTINGS* aC
m_choiceLineMode->SetSelection( aCfg->m_Drawing.line_mode );
m_footprintPreview->SetValue( aCfg->m_Appearance.footprint_preview );
- m_navigatorStaysOpen->SetValue( aCfg->m_Appearance.navigator_stays_open );
m_checkAutoplaceFields->SetValue( aCfg->m_AutoplaceFields.enable );
m_checkAutoplaceJustify->SetValue( aCfg->m_AutoplaceFields.allow_rejustify );
@@ -103,7 +102,6 @@ bool PANEL_EESCHEMA_EDITING_OPTIONS::TransferDataFromWindow()
cfg->m_Drawing.line_mode = m_choiceLineMode->GetSelection();
cfg->m_Appearance.footprint_preview = m_footprintPreview->GetValue();
- cfg->m_Appearance.navigator_stays_open = m_navigatorStaysOpen->GetValue();
cfg->m_AutoplaceFields.enable = m_checkAutoplaceFields->GetValue();
cfg->m_AutoplaceFields.allow_rejustify = m_checkAutoplaceJustify->GetValue();
diff --git a/eeschema/dialogs/panel_eeschema_editing_options_base.cpp b/eeschema/dialogs/panel_eeschema_editing_options_base.cpp
index d86eb258b3..fad8954ad4 100644
--- a/eeschema/dialogs/panel_eeschema_editing_options_base.cpp
+++ b/eeschema/dialogs/panel_eeschema_editing_options_base.cpp
@@ -268,10 +268,6 @@ PANEL_EESCHEMA_EDITING_OPTIONS_BASE::PANEL_EESCHEMA_EDITING_OPTIONS_BASE( wxWind
m_footprintPreview = new wxCheckBox( sbSizer6->GetStaticBox(), wxID_ANY, _("Show footprint previews in Symbol Chooser"), wxDefaultPosition, wxDefaultSize, 0 );
sbSizer6->Add( m_footprintPreview, 0, wxRIGHT|wxLEFT, 5 );
- m_navigatorStaysOpen = new wxCheckBox( sbSizer6->GetStaticBox(), wxID_ANY, _("Keep hierarchy navigator open"), wxDefaultPosition, wxDefaultSize, 0 );
- m_navigatorStaysOpen->SetValue(true);
- sbSizer6->Add( m_navigatorStaysOpen, 0, wxALL, 5 );
-
bRightColumn->Add( sbSizer6, 1, wxEXPAND|wxALL, 5 );
diff --git a/eeschema/dialogs/panel_eeschema_editing_options_base.fbp b/eeschema/dialogs/panel_eeschema_editing_options_base.fbp
index fcfa9c6ef8..8f32b8f7e5 100644
--- a/eeschema/dialogs/panel_eeschema_editing_options_base.fbp
+++ b/eeschema/dialogs/panel_eeschema_editing_options_base.fbp
@@ -2870,71 +2870,6 @@
-
diff --git a/eeschema/dialogs/panel_eeschema_editing_options_base.h b/eeschema/dialogs/panel_eeschema_editing_options_base.h
index 763fc4c881..424333f887 100644
--- a/eeschema/dialogs/panel_eeschema_editing_options_base.h
+++ b/eeschema/dialogs/panel_eeschema_editing_options_base.h
@@ -80,7 +80,6 @@ class PANEL_EESCHEMA_EDITING_OPTIONS_BASE : public RESETTABLE_PANEL
wxStaticText* m_labelIncrementLabel;
wxSpinCtrl* m_spinLabelRepeatStep;
wxCheckBox* m_footprintPreview;
- wxCheckBox* m_navigatorStaysOpen;
public:
diff --git a/eeschema/eeschema_config.cpp b/eeschema/eeschema_config.cpp
index f8887f2c2b..95c6f07e54 100644
--- a/eeschema/eeschema_config.cpp
+++ b/eeschema/eeschema_config.cpp
@@ -35,6 +35,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -143,6 +144,8 @@ void SCH_EDIT_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
// For now, axes are forced off in Eeschema even if turned on in config
eeconfig()->m_Window.grid.axes_enabled = false;
+ m_showHierarchy = eeconfig()->m_AuiPanels.show_schematic_hierarchy;
+
SCH_BASE_FRAME::LoadSettings( eeconfig() );
GetRenderSettings()->m_ShowPinsElectricalType = false;
@@ -155,7 +158,11 @@ void SCH_EDIT_FRAME::SaveSettings( APP_SETTINGS_BASE* aCfg )
// TODO(JE) do we need to keep m_userUnits around?
if( eeconfig() )
+ {
eeconfig()->m_System.units = static_cast( m_userUnits );
+ eeconfig()->m_AuiPanels.show_schematic_hierarchy = m_showHierarchy;
+ eeconfig()->m_AuiPanels.left_panel_width = m_hierarchy->GetSize().x;
+ }
}
diff --git a/eeschema/eeschema_settings.cpp b/eeschema/eeschema_settings.cpp
index 91754a6dad..18b0d015c7 100644
--- a/eeschema/eeschema_settings.cpp
+++ b/eeschema/eeschema_settings.cpp
@@ -88,9 +88,6 @@ EESCHEMA_SETTINGS::EESCHEMA_SETTINGS() :
m_params.emplace_back( new PARAM( "appearance.footprint_preview",
&m_Appearance.footprint_preview, true ) );
- m_params.emplace_back( new PARAM( "appearance.navigator_stays_open",
- &m_Appearance.navigator_stays_open, false ) );
-
m_params.emplace_back( new PARAM( "appearance.print_sheet_reference",
&m_Appearance.print_sheet_reference, true ) );
@@ -125,6 +122,12 @@ EESCHEMA_SETTINGS::EESCHEMA_SETTINGS() :
new PARAM( "appearance.show_sheet_filename_case_sensitivity_dialog",
&m_Appearance.show_sheet_filename_case_sensitivity_dialog, true ) );
+ m_params.emplace_back( new PARAM( "aui.show_schematic_hierarchy",
+ &m_AuiPanels.show_schematic_hierarchy, true ) );
+
+ m_params.emplace_back( new PARAM( "aui.left_panel_width",
+ &m_AuiPanels.left_panel_width, -1 ) );
+
m_params.emplace_back( new PARAM( "autoplace_fields.enable",
&m_AutoplaceFields.enable, true ) );
diff --git a/eeschema/eeschema_settings.h b/eeschema/eeschema_settings.h
index 0e0b7bd127..bfc03c4f99 100644
--- a/eeschema/eeschema_settings.h
+++ b/eeschema/eeschema_settings.h
@@ -51,7 +51,6 @@ public:
wxString edit_label_visible_columns;
int erc_severities;
bool footprint_preview;
- bool navigator_stays_open;
bool print_sheet_reference;
wxString default_font;
bool show_hidden_pins;
@@ -65,6 +64,12 @@ public:
bool show_sheet_filename_case_sensitivity_dialog;
};
+ struct AUI_PANELS
+ {
+ int left_panel_width;
+ bool show_schematic_hierarchy;
+ };
+
struct AUTOPLACE_FIELDS
{
bool enable;
@@ -255,6 +260,8 @@ public:
AUTOPLACE_FIELDS m_AutoplaceFields;
+ AUI_PANELS m_AuiPanels;
+
DRAWING m_Drawing;
INPUT m_Input;
diff --git a/eeschema/files-io.cpp b/eeschema/files-io.cpp
index 5c021a11b9..c8544e7964 100644
--- a/eeschema/files-io.cpp
+++ b/eeschema/files-io.cpp
@@ -54,6 +54,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -518,6 +519,7 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector& aFileSet, in
UpdateHierarchyNavigator();
UpdateTitle();
+ m_toolManager->GetTool()->ResetHistory();
wxFileName fn = Prj().AbsolutePath( GetScreen()->GetFileName() );
diff --git a/eeschema/hierarch.cpp b/eeschema/hierarch.cpp
index 8de2227043..d1c9417aab 100644
--- a/eeschema/hierarch.cpp
+++ b/eeschema/hierarch.cpp
@@ -23,29 +23,21 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include
-#include
-#include
#include
-#include
#include
#include
#include
#include
#include
#include
-#include
#include
#include
-#include
#include
-#include "eeschema_settings.h"
+#include
#include
-class HIERARCHY_NAVIG_DLG;
-
/**
* Store an SCH_SHEET_PATH of each sheet in hierarchy.
@@ -61,105 +53,12 @@ public:
}
};
+
// Need to use wxRTTI macros in order for OnCompareItems to work properly
// See: https://docs.wxwidgets.org/3.1/classwx_tree_ctrl.html#ab90a465793c291ca7aa827a576b7d146
wxIMPLEMENT_ABSTRACT_CLASS( HIERARCHY_TREE, wxTreeCtrl );
-HIERARCHY_TREE::HIERARCHY_TREE( HIERARCHY_NAVIG_DLG* parent ) :
- wxTreeCtrl( (wxWindow*) parent, wxID_ANY, wxDefaultPosition, wxDefaultSize,
- wxTR_HAS_BUTTONS, wxDefaultValidator, wxT( "HierachyTreeCtrl" ) )
-{
- m_parent = parent;
-
- // Make an image list containing small icons
- // All icons are expected having the same size.
- wxBitmap tree_nosel_bm( KiBitmap( BITMAPS::tree_nosel ) );
- imageList = new wxImageList( tree_nosel_bm.GetWidth(), tree_nosel_bm.GetHeight(), true, 2 );
-
- imageList->Add( tree_nosel_bm );
- imageList->Add( KiBitmap( BITMAPS::tree_sel ) );
-
- AssignImageList( imageList );
-}
-
-
-HIERARCHY_NAVIG_DLG::HIERARCHY_NAVIG_DLG( SCH_EDIT_FRAME* aParent ) :
- DIALOG_SHIM( aParent, wxID_ANY, _( "Navigator" ), wxDefaultPosition, wxDefaultSize,
- wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER, HIERARCHY_NAVIG_DLG_WNAME )
-{
- wxASSERT( dynamic_cast< SCH_EDIT_FRAME* >( aParent ) );
-
- m_SchFrameEditor = aParent;
- m_currSheet = aParent->GetCurrentSheet();
- m_Tree = new HIERARCHY_TREE( this );
- m_nbsheets = 1;
-
- // root is the link to the main sheet.
- wxTreeItemId root = m_Tree->AddRoot( getRootString(), 0, 1 );
- m_Tree->SetItemBold( root, true );
-
- m_list.push_back( &m_SchFrameEditor->Schematic().Root() );
- m_Tree->SetItemData( root, new TreeItemData( m_list ) );
-
- if( m_SchFrameEditor->GetCurrentSheet().Last() == &m_SchFrameEditor->Schematic().Root() )
- m_Tree->SelectItem( root );
-
- buildHierarchyTree( &m_list, &root );
-
- m_Tree->ExpandAll();
-
- // This bloc gives a good size to the dialog, better than the default "best" size,
- // the first time the dialog is opened, during a session
- wxRect itemrect;
- wxSize tree_size;
-
- m_Tree->GetBoundingRect( root, itemrect );
-
- // Set dialog window size to be large enough
- tree_size.x = itemrect.GetWidth() + 20;
- tree_size.x = std::max( tree_size.x, 250 );
-
- // Readjust the size of the frame to an optimal value.
- tree_size.y = m_nbsheets * itemrect.GetHeight();
-
- if( m_nbsheets < 2 )
- tree_size.y += 10; // gives a better look for small trees
-
- SetClientSize( tree_size );
-
- // manage the ESC key to close the dialog, because there is no Cancel button
- // in dialog
- m_Tree->Connect( wxEVT_CHAR, wxKeyEventHandler( HIERARCHY_TREE::onChar ) );
-
- // Manage double click on a selection, or the enter key:
- Bind( wxEVT_TREE_ITEM_ACTIVATED, &HIERARCHY_NAVIG_DLG::onSelectSheetPath, this );
- // Manage a simple click on a selection, if the selection changes
- Bind( wxEVT_TREE_SEL_CHANGED, &HIERARCHY_NAVIG_DLG::onSelectSheetPath, this );
-
- // Connect close event for the dialog:
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( HIERARCHY_NAVIG_DLG::OnCloseNav ) );
-}
-
-
-HIERARCHY_NAVIG_DLG::~HIERARCHY_NAVIG_DLG()
-{
- Unbind( wxEVT_TREE_ITEM_ACTIVATED, &HIERARCHY_NAVIG_DLG::onSelectSheetPath, this );
- Unbind( wxEVT_TREE_SEL_CHANGED, &HIERARCHY_NAVIG_DLG::onSelectSheetPath, this );
- m_Tree->Disconnect( wxEVT_CHAR, wxKeyEventHandler( HIERARCHY_TREE::onChar ) );
- Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( HIERARCHY_NAVIG_DLG::OnCloseNav ) );
-}
-
-
-void HIERARCHY_TREE::onChar( wxKeyEvent& event )
-{
- if( event.GetKeyCode() == WXK_ESCAPE )
- m_parent->Close( true );
- else
- event.Skip();
-}
-
-
int HIERARCHY_TREE::OnCompareItems( const wxTreeItemId& item1, const wxTreeItemId& item2 )
{
SCH_SHEET_PATH* item1Path = &static_cast( GetItemData( item1 ) )->m_SheetPath;
@@ -169,10 +68,42 @@ int HIERARCHY_TREE::OnCompareItems( const wxTreeItemId& item1, const wxTreeItemI
}
-void HIERARCHY_NAVIG_DLG::buildHierarchyTree( SCH_SHEET_PATH* aList, wxTreeItemId* aPreviousmenu )
+HIERARCHY_NAVIG_PANEL::HIERARCHY_NAVIG_PANEL( SCH_EDIT_FRAME* aParent ) : WX_PANEL( aParent )
{
- wxCHECK_RET( m_nbsheets < NB_MAX_SHEET, "Maximum number of sheets exceeded." );
+ wxASSERT( dynamic_cast( aParent ) );
+ m_frame = aParent;
+
+ wxBoxSizer* sizer = new wxBoxSizer( wxVERTICAL );
+ SetSizer( sizer );
+ m_tree = new HIERARCHY_TREE( this );
+
+ // Make an image list containing small icons
+ // All icons are expected having the same size.
+ wxBitmap tree_nosel_bm( KiBitmap( BITMAPS::tree_nosel ) );
+ wxImageList* imageList =
+ new wxImageList( tree_nosel_bm.GetWidth(), tree_nosel_bm.GetHeight(), true, 2 );
+
+ imageList->Add( tree_nosel_bm );
+ imageList->Add( KiBitmap( BITMAPS::tree_sel ) );
+
+ m_tree->AssignImageList( imageList );
+
+ sizer->Add( m_tree, 1, wxEXPAND, wxBORDER_NONE, 0 );
+
+ UpdateHierarchyTree();
+}
+
+
+HIERARCHY_NAVIG_PANEL::~HIERARCHY_NAVIG_PANEL()
+{
+ Unbind( wxEVT_TREE_ITEM_ACTIVATED, &HIERARCHY_NAVIG_PANEL::onSelectSheetPath, this );
+ Unbind( wxEVT_TREE_SEL_CHANGED, &HIERARCHY_NAVIG_PANEL::onSelectSheetPath, this );
+}
+
+
+void HIERARCHY_NAVIG_PANEL::buildHierarchyTree( SCH_SHEET_PATH* aList, const wxTreeItemId& aParent )
+{
std::vector sheetChildren;
aList->LastScreen()->GetSheets( &sheetChildren );
@@ -183,86 +114,87 @@ void HIERARCHY_NAVIG_DLG::buildHierarchyTree( SCH_SHEET_PATH* aList, wxTreeItemI
wxString sheetName = formatPageString( sheet->GetFields()[SHEETNAME].GetShownText(),
sheet->GetPageNumber( *aList ) );
- m_nbsheets++;
- wxTreeItemId menu;
- menu = m_Tree->AppendItem( *aPreviousmenu, sheetName, 0, 1 );
- m_Tree->SetItemData( menu, new TreeItemData( *aList ) );
+ wxTreeItemId child = m_tree->AppendItem( aParent, sheetName, 0, 1 );
+ m_tree->SetItemData( child, new TreeItemData( *aList ) );
- if( *aList == m_currSheet )
- {
- m_Tree->EnsureVisible( menu );
- m_Tree->SelectItem( menu );
- }
-
- buildHierarchyTree( aList, &menu );
+ buildHierarchyTree( aList, child );
aList->pop_back();
-
- if( m_nbsheets >= NB_MAX_SHEET )
- break;
}
- m_Tree->SortChildren( *aPreviousmenu );
+ m_tree->SortChildren( aParent );
}
-void HIERARCHY_NAVIG_DLG::UpdateHierarchyTree()
+void HIERARCHY_NAVIG_PANEL::UpdateHierarchySelection()
+{
+ std::function selectSheet = [&]( const wxTreeItemId& id )
+ {
+ wxCHECK_RET( id.IsOk(), wxT( "Invalid tree item" ) );
+
+ TreeItemData* itemData = static_cast( m_tree->GetItemData( id ) );
+ if( itemData->m_SheetPath == m_frame->GetCurrentSheet() )
+ {
+ m_tree->EnsureVisible( id );
+ m_tree->SelectItem( id );
+ }
+
+ wxTreeItemIdValue cookie;
+ wxTreeItemId child = m_tree->GetFirstChild( id, cookie );
+ while( child.IsOk() )
+ {
+ selectSheet( child );
+ child = m_tree->GetNextChild( id, cookie );
+ }
+ };
+
+ selectSheet( m_tree->GetRootItem() );
+}
+
+
+void HIERARCHY_NAVIG_PANEL::UpdateHierarchyTree()
{
Freeze();
// Disable selection events
- Unbind( wxEVT_TREE_ITEM_ACTIVATED, &HIERARCHY_NAVIG_DLG::onSelectSheetPath, this );
- Unbind( wxEVT_TREE_SEL_CHANGED, &HIERARCHY_NAVIG_DLG::onSelectSheetPath, this );
-
- m_currSheet = m_SchFrameEditor->GetCurrentSheet();
- m_Tree->DeleteAllItems();
- m_nbsheets = 1;
-
- wxTreeItemId root = m_Tree->AddRoot( getRootString(), 0, 1 );
- m_Tree->SetItemBold( root, true );
+ Unbind( wxEVT_TREE_ITEM_ACTIVATED, &HIERARCHY_NAVIG_PANEL::onSelectSheetPath, this );
+ Unbind( wxEVT_TREE_SEL_CHANGED, &HIERARCHY_NAVIG_PANEL::onSelectSheetPath, this );
m_list.clear();
- m_list.push_back( &m_SchFrameEditor->Schematic().Root() );
- m_Tree->SetItemData( root, new TreeItemData( m_list ) );
+ m_list.push_back( &m_frame->Schematic().Root() );
- if( m_SchFrameEditor->GetCurrentSheet().Last() == &m_SchFrameEditor->Schematic().Root() )
- m_Tree->SelectItem( root );
+ m_tree->DeleteAllItems();
- buildHierarchyTree( &m_list, &root );
- m_Tree->ExpandAll();
+ wxTreeItemId root = m_tree->AddRoot( getRootString(), 0, 1 );
+ m_tree->SetItemBold( root, true );
+ m_tree->SetItemData( root, new TreeItemData( m_list ) );
+
+ buildHierarchyTree( &m_list, root );
+ UpdateHierarchySelection();
+
+ m_tree->ExpandAll();
// Enable selection events
- Bind( wxEVT_TREE_ITEM_ACTIVATED, &HIERARCHY_NAVIG_DLG::onSelectSheetPath, this );
- Bind( wxEVT_TREE_SEL_CHANGED, &HIERARCHY_NAVIG_DLG::onSelectSheetPath, this );
+ Bind( wxEVT_TREE_ITEM_ACTIVATED, &HIERARCHY_NAVIG_PANEL::onSelectSheetPath, this );
+ Bind( wxEVT_TREE_SEL_CHANGED, &HIERARCHY_NAVIG_PANEL::onSelectSheetPath, this );
Thaw();
}
-void HIERARCHY_NAVIG_DLG::onSelectSheetPath( wxTreeEvent& event )
+void HIERARCHY_NAVIG_PANEL::onSelectSheetPath( wxTreeEvent& event )
{
- m_SchFrameEditor->GetToolManager()->RunAction( ACTIONS::cancelInteractive, true );
- m_SchFrameEditor->GetToolManager()->RunAction( EE_ACTIONS::clearSelection, true );
+ wxTreeItemId itemSel = m_tree->GetSelection();
+ TreeItemData* itemData = static_cast( m_tree->GetItemData( itemSel ) );
- wxTreeItemId itemSel = m_Tree->GetSelection();
- TreeItemData* itemData = static_cast( m_Tree->GetItemData( itemSel ) );
-
- // Store the current zoom level into the current screen before switching
- m_SchFrameEditor->GetScreen()->m_LastZoomLevel =
- m_SchFrameEditor->GetCanvas()->GetView()->GetScale();
-
- m_SchFrameEditor->SetCurrentSheet( itemData->m_SheetPath );
- m_SchFrameEditor->DisplayCurrentSheet();
-
- EESCHEMA_SETTINGS* appSettings = static_cast( Kiface().KifaceSettings() );
-
- if( !appSettings->m_Appearance.navigator_stays_open )
- Close( true );
+ SetCursor( wxCURSOR_ARROWWAIT );
+ m_frame->GetToolManager()->RunAction( EE_ACTIONS::changeSheet, true, &itemData->m_SheetPath );
+ SetCursor( wxCURSOR_ARROW );
}
-wxString HIERARCHY_NAVIG_DLG::getRootString()
+wxString HIERARCHY_NAVIG_PANEL::getRootString()
{
- SCH_SHEET* rootSheet = &m_SchFrameEditor->Schematic().Root();
+ SCH_SHEET* rootSheet = &m_frame->Schematic().Root();
SCH_SHEET_PATH rootPath;
rootPath.push_back( rootSheet );
@@ -270,50 +202,7 @@ wxString HIERARCHY_NAVIG_DLG::getRootString()
}
-wxString HIERARCHY_NAVIG_DLG::formatPageString( const wxString& aName, const wxString& aPage )
+wxString HIERARCHY_NAVIG_PANEL::formatPageString( const wxString& aName, const wxString& aPage )
{
return aName + wxT( " " ) + wxString::Format( _( "(page %s)" ), aPage );
}
-
-
-void HIERARCHY_NAVIG_DLG::OnCloseNav( wxCloseEvent& event )
-{
- Destroy();
-}
-
-
-void SCH_EDIT_FRAME::DisplayCurrentSheet()
-{
- m_toolManager->RunAction( ACTIONS::cancelInteractive, true );
- m_toolManager->RunAction( EE_ACTIONS::clearSelection, true );
- SCH_SCREEN* screen = GetCurrentSheet().LastScreen();
-
- wxASSERT( screen );
-
- SetScreen( screen );
-
- // update the References
- GetCurrentSheet().UpdateAllScreenReferences();
- SetSheetNumberAndCount();
-
- if( !screen->m_zoomInitialized )
- {
- initScreenZoom();
- }
- else
- {
- // Set zoom to last used in this screen
- GetCanvas()->GetView()->SetScale( GetScreen()->m_LastZoomLevel );
- RedrawScreen( (wxPoint) GetScreen()->m_ScrollCenter, false );
- }
-
- UpdateTitle();
-
- HardRedraw(); // Ensure all items are redrawn (especially the drawing-sheet items)
-
- SCH_EDITOR_CONTROL* editTool = m_toolManager->GetTool();
- TOOL_EVENT dummy;
- editTool->UpdateNetHighlighting( dummy );
-
- UpdateHierarchyNavigator();
-}
diff --git a/eeschema/hierarch.h b/eeschema/hierarch.h
index 5f2ea06f2f..3685e49423 100644
--- a/eeschema/hierarch.h
+++ b/eeschema/hierarch.h
@@ -3,7 +3,8 @@
*
* Copyright (C) 2004 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2008 Wayne Stambaugh
- * Copyright (C) 2004-2021 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2022 Mike Williams
+ * Copyright (C) 2004-2022 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -31,25 +32,29 @@
#include
#include // wxRTTI macros
#include
+#include
-// The window name of the hierarchy navigator, used to find it
-#define HIERARCHY_NAVIG_DLG_WNAME "hierarchy_navig_dlg"
class SCH_EDIT_FRAME;
class SCH_SHEET_PATH;
-class HIERARCHY_NAVIG_DLG;
+class HIERARCHY_NAVIG_PANEL;
+
/**
- * Handle hierarchy tree control.
+ * Navigation hierarchy tree control.
+ *
+ * wxTreeCtrl must be subclassed to implement the OnCompareItems method
+ * to sort according to page numbers.
*/
class HIERARCHY_TREE : public wxTreeCtrl
{
public:
- HIERARCHY_TREE( HIERARCHY_NAVIG_DLG* parent );
-
- // Closes the dialog on escape key
- void onChar( wxKeyEvent& event );
+ HIERARCHY_TREE( HIERARCHY_NAVIG_PANEL* parent ) :
+ wxTreeCtrl( (wxWindow*) parent, wxID_ANY, wxDefaultPosition, wxDefaultSize,
+ wxTR_HAS_BUTTONS, wxDefaultValidator, wxT( "HierachyTreeCtrl" ) )
+ {
+ }
int OnCompareItems( const wxTreeItemId& item1, const wxTreeItemId& item2 ) override;
@@ -57,25 +62,26 @@ private:
// Need to use wxRTTI macros in order for OnCompareItems to work properly
// See: https://docs.wxwidgets.org/3.1/classwx_tree_ctrl.html#ab90a465793c291ca7aa827a576b7d146
wxDECLARE_ABSTRACT_CLASS( HIERARCHY_TREE );
-
- HIERARCHY_NAVIG_DLG* m_parent;
- wxImageList* imageList;
};
-class HIERARCHY_NAVIG_DLG : public DIALOG_SHIM
+
+class HIERARCHY_NAVIG_PANEL : public WX_PANEL
{
public:
- HIERARCHY_NAVIG_DLG( SCH_EDIT_FRAME* aParent );
+ HIERARCHY_NAVIG_PANEL( SCH_EDIT_FRAME* aParent );
- ~HIERARCHY_NAVIG_DLG();
-
- void OnCloseNav( wxCloseEvent& event );
+ ~HIERARCHY_NAVIG_PANEL();
/**
* Update the hierarchical tree of the schematic.
*/
void UpdateHierarchyTree();
+ /**
+ * Updates the tree's selection to match current page
+ */
+ void UpdateHierarchySelection();
+
private:
/**
* Create the hierarchical tree of the schematic.
@@ -85,7 +91,7 @@ private:
* @param[in] aList is the #SCH_SHEET_PATH list to explore.
* @param aPreviousmenu is the wxTreeItemId used as parent to add sub items.
*/
- void buildHierarchyTree( SCH_SHEET_PATH* aList, wxTreeItemId* aPreviousmenu );
+ void buildHierarchyTree( SCH_SHEET_PATH* aList, const wxTreeItemId& aParent );
/**
* Open the selected sheet and display the corresponding screen when a tree item is
@@ -103,11 +109,9 @@ private:
*/
wxString formatPageString( const wxString& aName, const wxString& aPage );
- SCH_SHEET_PATH m_currSheet;
SCH_SHEET_PATH m_list;
- SCH_EDIT_FRAME* m_SchFrameEditor;
- HIERARCHY_TREE* m_Tree;
- int m_nbsheets;
+ SCH_EDIT_FRAME* m_frame;
+ HIERARCHY_TREE* m_tree;
};
#endif // HIERARCH_H
diff --git a/eeschema/menubar.cpp b/eeschema/menubar.cpp
index 8ffaf7619d..975f563a80 100644
--- a/eeschema/menubar.cpp
+++ b/eeschema/menubar.cpp
@@ -167,8 +167,12 @@ void SCH_EDIT_FRAME::ReCreateMenuBar()
ACTION_MENU* viewMenu = new ACTION_MENU( false, selTool );
viewMenu->Add( ACTIONS::showSymbolBrowser );
- viewMenu->Add( EE_ACTIONS::navigateHierarchy );
- viewMenu->Add( EE_ACTIONS::leaveSheet );
+ viewMenu->Add( EE_ACTIONS::showHierarchy, ACTION_MENU::CHECK );
+ viewMenu->Add( EE_ACTIONS::navigateBack );
+ viewMenu->Add( EE_ACTIONS::navigateUp );
+ viewMenu->Add( EE_ACTIONS::navigateForward );
+ viewMenu->Add( EE_ACTIONS::navigatePrevious );
+ viewMenu->Add( EE_ACTIONS::navigateNext );
viewMenu->AppendSeparator();
viewMenu->Add( ACTIONS::zoomInCenter );
diff --git a/eeschema/sch_edit_frame.cpp b/eeschema/sch_edit_frame.cpp
index cd7e168845..446edae52f 100644
--- a/eeschema/sch_edit_frame.cpp
+++ b/eeschema/sch_edit_frame.cpp
@@ -84,6 +84,7 @@
#include
#include
#include
+#include
#include
#include
@@ -220,6 +221,7 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
m_schematic = new SCHEMATIC( nullptr );
m_showBorderAndTitleBlock = true; // true to show sheet references
+ m_showHierarchy = true;
m_supportsAutoSave = true;
m_aboutTitle = _( "KiCad Schematic Editor" );
@@ -250,6 +252,8 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
ReCreateVToolbar();
ReCreateOptToolbar();
+ m_hierarchy = new HIERARCHY_NAVIG_PANEL( this );
+
// Initialize common print setup dialog settings.
m_pageSetupData.GetPrintData().SetPrintMode( wxPRINT_MODE_PRINTER );
m_pageSetupData.GetPrintData().SetQuality( wxPRINT_QUALITY_MEDIUM );
@@ -262,7 +266,12 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" )
.Top().Layer( 6 ) );
m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" )
- .Left().Layer( 3 ) );
+ .Left().Layer( 4 ) );
+ m_auimgr.AddPane( m_hierarchy, EDA_PANE().Palette().Name( "SchematicHierarchy" )
+ .Caption( _("Schematic Hierarchy") )
+ .Left().Layer( 3 )
+ .MinSize(120, -1)
+ .BestSize(200, -1));
m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( "ToolsToolbar" )
.Right().Layer( 2 ) );
m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" )
@@ -279,6 +288,12 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
initScreenZoom();
+ wxAuiPaneInfo& hierarchy = m_auimgr.GetPane( "SchematicHierarchy" );
+ hierarchy.Show( m_showHierarchy );
+
+ if( eeconfig() && ( eeconfig()->m_AuiPanels.left_panel_width > 0 ) )
+ SetAuiPaneSize( m_auimgr, hierarchy, eeconfig()->m_AuiPanels.left_panel_width, -1 );
+
// This is used temporarily to fix a client size issue on GTK that causes zoom to fit
// to calculate the wrong zoom size. See SCH_EDIT_FRAME::onSize().
Bind( wxEVT_SIZE, &SCH_EDIT_FRAME::onSize, this );
@@ -297,6 +312,7 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
DefaultExecFlags();
UpdateTitle();
+ m_toolManager->GetTool()->ResetHistory();
// Default shutdown reason until a file is loaded
KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New schematic file is unsaved" ) );
@@ -346,6 +362,8 @@ SCH_EDIT_FRAME::~SCH_EDIT_FRAME()
wxLogError( wxT( "Settings exception '%s' occurred." ), exc.what() );
}
}
+
+ delete m_hierarchy;
}
@@ -397,6 +415,13 @@ void SCH_EDIT_FRAME::setupUIConditions()
( !GetScreen()->Items().empty() || !SELECTION_CONDITIONS::Idle( aSel ) );
};
+ auto hierarchyNavigatorCond =
+ [ this ] ( const SELECTION& aSel )
+ {
+ return m_auimgr.GetPane( "SchematicHierarchy" ).IsShown();
+ };
+
+
#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
#define CHECK( x ) ACTION_CONDITIONS().Check( x )
@@ -404,6 +429,8 @@ void SCH_EDIT_FRAME::setupUIConditions()
mgr->SetConditions( ACTIONS::undo, ENABLE( cond.UndoAvailable() ) );
mgr->SetConditions( ACTIONS::redo, ENABLE( cond.RedoAvailable() ) );
+ mgr->SetConditions( EE_ACTIONS::showHierarchy, CHECK( hierarchyNavigatorCond ) );
+
mgr->SetConditions( ACTIONS::toggleGrid, CHECK( cond.GridVisible() ) );
mgr->SetConditions( ACTIONS::toggleCursorStyle, CHECK( cond.FullscreenCursor() ) );
mgr->SetConditions( ACTIONS::millimetersUnits,
@@ -493,10 +520,39 @@ void SCH_EDIT_FRAME::setupUIConditions()
auto belowRootSheetCondition =
[this]( const SELECTION& aSel )
{
- return GetCurrentSheet().Last() != &Schematic().Root();
+ return m_toolManager->GetTool()->CanGoUp();
+ };
+
+ auto navHistoryHasForward =
+ [this]( const SELECTION& aSel )
+ {
+ return m_toolManager->GetTool()->CanGoForward();
+ };
+
+ auto navHistoryHasBackward =
+ [this]( const SELECTION& aSel )
+ {
+ return m_toolManager->GetTool()->CanGoBack();
+ };
+
+ auto navSchematicHasPreviousSheet =
+ [this]( const SELECTION& aSel )
+ {
+ return m_toolManager->GetTool()->CanGoPrevious();
+ };
+
+ auto navSchematicHasNextSheet =
+ [this]( const SELECTION& aSel )
+ {
+ return m_toolManager->GetTool()->CanGoNext();
};
mgr->SetConditions( EE_ACTIONS::leaveSheet, ENABLE( belowRootSheetCondition ) );
+ mgr->SetConditions( EE_ACTIONS::navigateUp, ENABLE( belowRootSheetCondition ) );
+ mgr->SetConditions( EE_ACTIONS::navigateForward, ENABLE( navHistoryHasForward ) );
+ mgr->SetConditions( EE_ACTIONS::navigateBack, ENABLE( navHistoryHasBackward ) );
+ mgr->SetConditions( EE_ACTIONS::navigatePrevious, ENABLE( navSchematicHasPreviousSheet ) );
+ mgr->SetConditions( EE_ACTIONS::navigateNext, ENABLE( navSchematicHasNextSheet ) );
mgr->SetConditions( EE_ACTIONS::remapSymbols, ENABLE( remapSymbolsCondition ) );
mgr->SetConditions( EE_ACTIONS::toggleHiddenPins, CHECK( showHiddenPinsCond ) );
mgr->SetConditions( EE_ACTIONS::toggleHiddenFields, CHECK( showHiddenFieldsCond ) );
@@ -776,9 +832,6 @@ void SCH_EDIT_FRAME::doCloseWindow()
m_findReplaceDialog = nullptr;
}
- if( FindHierarchyNavigator() )
- FindHierarchyNavigator()->Close( true );
-
if( Kiway().Player( FRAME_SIMULATOR, false ) )
Prj().GetProjectFile().m_SchematicSettings->m_NgspiceSimulatorSettings->SaveToFile();
@@ -939,30 +992,10 @@ void SCH_EDIT_FRAME::OnUpdatePCB( wxCommandEvent& event )
}
-HIERARCHY_NAVIG_DLG* SCH_EDIT_FRAME::FindHierarchyNavigator()
+void SCH_EDIT_FRAME::UpdateHierarchyNavigator()
{
- wxWindow* navigator = wxWindow::FindWindowByName( HIERARCHY_NAVIG_DLG_WNAME );
-
- return static_cast< HIERARCHY_NAVIG_DLG* >( navigator );
-}
-
-
-void SCH_EDIT_FRAME::UpdateHierarchyNavigator( bool aForceUpdate )
-{
- if( aForceUpdate )
- {
- if( FindHierarchyNavigator() )
- FindHierarchyNavigator()->Close();
-
- HIERARCHY_NAVIG_DLG* hierarchyDialog = new HIERARCHY_NAVIG_DLG( this );
-
- hierarchyDialog->Show( true );
- }
- else
- {
- if( FindHierarchyNavigator() )
- FindHierarchyNavigator()->UpdateHierarchyTree();
- }
+ m_toolManager->GetTool()->CleanHistory();
+ m_hierarchy->UpdateHierarchyTree();
}
@@ -1827,3 +1860,40 @@ void SCH_EDIT_FRAME::UpdateItem( EDA_ITEM* aItem, bool isAddOrDelete, bool aUpda
if( SCH_ITEM* sch_item = dynamic_cast( aItem ) )
sch_item->ClearCaches();
}
+
+
+void SCH_EDIT_FRAME::DisplayCurrentSheet()
+{
+ m_toolManager->RunAction( ACTIONS::cancelInteractive, true );
+ m_toolManager->RunAction( EE_ACTIONS::clearSelection, true );
+ SCH_SCREEN* screen = GetCurrentSheet().LastScreen();
+
+ wxASSERT( screen );
+
+ SetScreen( screen );
+
+ // update the References
+ GetCurrentSheet().UpdateAllScreenReferences();
+ SetSheetNumberAndCount();
+
+ if( !screen->m_zoomInitialized )
+ {
+ initScreenZoom();
+ }
+ else
+ {
+ // Set zoom to last used in this screen
+ GetCanvas()->GetView()->SetScale( GetScreen()->m_LastZoomLevel );
+ RedrawScreen( (wxPoint) GetScreen()->m_ScrollCenter, false );
+ }
+
+ UpdateTitle();
+
+ HardRedraw(); // Ensure all items are redrawn (especially the drawing-sheet items)
+
+ SCH_EDITOR_CONTROL* editTool = m_toolManager->GetTool();
+ TOOL_EVENT dummy;
+ editTool->UpdateNetHighlighting( dummy );
+
+ m_hierarchy->UpdateHierarchySelection();
+}
diff --git a/eeschema/sch_edit_frame.h b/eeschema/sch_edit_frame.h
index 1e62a76da9..563789d6ff 100644
--- a/eeschema/sch_edit_frame.h
+++ b/eeschema/sch_edit_frame.h
@@ -59,7 +59,7 @@ class SCHEMATIC;
class DIALOG_SCH_FIND;
class wxFindReplaceData;
class RESCUER;
-class HIERARCHY_NAVIG_DLG;
+class HIERARCHY_NAVIG_PANEL;
// @todo Move this to transform alone with all of the transform manipulation code.
/// enum used in RotationMiroir()
@@ -232,16 +232,9 @@ public:
void ShowFindReplaceDialog( bool aReplace );
/**
- * Run the Hierarchy Navigator dialog.
- * @param aForceUpdate: When true, creates a new dialog. And if a dialog
- * already exist, it destroys it first.
+ * Update the hierarchy navigation tree and history
*/
- void UpdateHierarchyNavigator( bool aForceUpdate = false );
-
- /**
- * @return a reference to the Hierarchy Navigator dialog if exists, or nullptr.
- */
- HIERARCHY_NAVIG_DLG* FindHierarchyNavigator();
+ void UpdateHierarchyNavigator();
void ShowFindReplaceStatus( const wxString& aMsg, int aStatusTime );
void ClearFindReplaceStatus();
@@ -834,6 +827,12 @@ public:
*/
virtual void CheckForAutoSaveFile( const wxFileName& aFileName ) override;
+
+ /**
+ * Toggle the show/hide state of the left side schematic navigation panel
+ */
+ void ToggleSchematicHierarchy();
+
DECLARE_EVENT_TABLE()
protected:
@@ -940,6 +939,9 @@ private:
///< to call a custom net list generator.
DIALOG_SCH_FIND* m_findReplaceDialog;
+
+ HIERARCHY_NAVIG_PANEL* m_hierarchy;
+ bool m_showHierarchy;
};
diff --git a/eeschema/sch_screen.h b/eeschema/sch_screen.h
index 408be8ffdd..4703597fba 100644
--- a/eeschema/sch_screen.h
+++ b/eeschema/sch_screen.h
@@ -73,9 +73,6 @@ enum SCH_LINE_TEST_T
};
-/// Max number of sheets in a hierarchy project
-#define NB_MAX_SHEET 500
-
struct PICKED_SYMBOL
{
LIB_ID LibId;
diff --git a/eeschema/toolbars_sch_editor.cpp b/eeschema/toolbars_sch_editor.cpp
index 7bddc4a6f2..97596b12a6 100644
--- a/eeschema/toolbars_sch_editor.cpp
+++ b/eeschema/toolbars_sch_editor.cpp
@@ -30,11 +30,13 @@
#include
#include
#include
+#include
#include
#include
#include
#include
#include
+#include
/* Create the main Horizontal Toolbar for the schematic editor
*/
@@ -89,8 +91,9 @@ void SCH_EDIT_FRAME::ReCreateHToolbar()
m_mainToolBar->Add( ACTIONS::zoomTool, ACTION_TOOLBAR::TOGGLE, ACTION_TOOLBAR::CANCEL );
m_mainToolBar->AddScaledSeparator( this );
- m_mainToolBar->Add( EE_ACTIONS::navigateHierarchy );
- m_mainToolBar->Add( EE_ACTIONS::leaveSheet );
+ m_mainToolBar->Add( EE_ACTIONS::navigateBack );
+ m_mainToolBar->Add( EE_ACTIONS::navigateUp );
+ m_mainToolBar->Add( EE_ACTIONS::navigateForward );
m_mainToolBar->AddScaledSeparator( this );
m_mainToolBar->Add( EE_ACTIONS::rotateCCW );
@@ -217,3 +220,22 @@ void SCH_EDIT_FRAME::ReCreateOptToolbar()
m_optionsToolBar->KiRealize();
}
+
+
+void SCH_EDIT_FRAME::ToggleSchematicHierarchy()
+{
+ EESCHEMA_SETTINGS* cfg = dynamic_cast( Kiface().KifaceSettings() );
+ wxAuiPaneInfo& hierarchy = m_auimgr.GetPane( "SchematicHierarchy" );
+
+ // show auxiliary Vertical layers and visibility manager toolbar
+ m_showHierarchy = !m_showHierarchy;
+ hierarchy.Show( m_showHierarchy );
+
+ if( m_showHierarchy && cfg )
+ SetAuiPaneSize( m_auimgr, hierarchy, cfg->m_AuiPanels.left_panel_width, -1 );
+ else
+ {
+ cfg->m_AuiPanels.left_panel_width = m_hierarchy->GetSize().x;
+ m_auimgr.Update();
+ }
+}
diff --git a/eeschema/tools/ee_actions.cpp b/eeschema/tools/ee_actions.cpp
index c85520a12c..eee05877ad 100644
--- a/eeschema/tools/ee_actions.cpp
+++ b/eeschema/tools/ee_actions.cpp
@@ -728,6 +728,11 @@ TOOL_ACTION EE_ACTIONS::showPythonConsole( "eeschema.EditorControl.showPythonCon
// SCH_NAVIGATE_TOOL
//
+TOOL_ACTION EE_ACTIONS::changeSheet( "eeschema.NavigateTool.changeSheet",
+ AS_GLOBAL, 0, "",
+ _( "Enter Sheet" ), _( "Change to provided sheet's contents in the schematic editor" ),
+ BITMAPS::enter_sheet );
+
TOOL_ACTION EE_ACTIONS::enterSheet( "eeschema.NavigateTool.enterSheet",
AS_GLOBAL, 0, "",
_( "Enter Sheet" ), _( "Display the selected sheet's contents in the schematic editor" ),
@@ -739,8 +744,38 @@ TOOL_ACTION EE_ACTIONS::leaveSheet( "eeschema.NavigateTool.leaveSheet",
_( "Leave Sheet" ), _( "Display the parent sheet in the schematic editor" ),
BITMAPS::leave_sheet );
-TOOL_ACTION EE_ACTIONS::navigateHierarchy( "eeschema.NavigateTool.navigateHierarchy",
- AS_GLOBAL, 0, "",
+TOOL_ACTION EE_ACTIONS::navigateUp( "eeschema.NavigateTool.up",
+ AS_GLOBAL, MD_ALT + WXK_UP, "",
+ _( "Navigate Up" ), _( "Navigate up one sheet in the hierarchy" ),
+ BITMAPS::up );
+
+TOOL_ACTION EE_ACTIONS::navigateBack( "eeschema.NavigateTool.back",
+ AS_GLOBAL,
+ MD_ALT + WXK_LEFT, "",
+ _( "Navigate Back" ), _( "Move forward in sheet navigation history" ),
+ BITMAPS::left );
+
+TOOL_ACTION EE_ACTIONS::navigateForward( "eeschema.NavigateTool.forward",
+ AS_GLOBAL,
+ MD_ALT + WXK_RIGHT, "",
+ _( "Navigate Forward" ), _( "Move backward in sheet navigation history" ),
+ BITMAPS::right );
+
+TOOL_ACTION EE_ACTIONS::navigatePrevious( "eeschema.NavigateTool.previous",
+ AS_GLOBAL,
+ WXK_PAGEUP, "",
+ _( "Previous Sheet" ), _( "Move to previous sheet by number" ),
+ BITMAPS::left );
+
+TOOL_ACTION EE_ACTIONS::navigateNext( "eeschema.NavigateTool.next",
+ AS_GLOBAL,
+ WXK_PAGEDOWN, "",
+ _( "Next Sheet" ), _( "Move to next sheet by number" ),
+ BITMAPS::right );
+
+TOOL_ACTION EE_ACTIONS::showHierarchy( "eeschema.EditorTool.showHierarchy",
+ AS_GLOBAL,
+ MD_CTRL + 'H', "",
_( "Hierarchy Navigator" ), _( "Show schematic sheet hierarchy" ),
BITMAPS::hierarchy_nav );
diff --git a/eeschema/tools/ee_actions.h b/eeschema/tools/ee_actions.h
index 68f7f2ccef..1533d16f38 100644
--- a/eeschema/tools/ee_actions.h
+++ b/eeschema/tools/ee_actions.h
@@ -88,6 +88,7 @@ public:
static TOOL_ACTION placeGlobalLabel;
static TOOL_ACTION placeHierLabel;
static TOOL_ACTION drawSheet;
+ static TOOL_ACTION importSingleSheetPin;
static TOOL_ACTION importSheetPin;
static TOOL_ACTION placeSchematicText;
static TOOL_ACTION drawTextBox;
@@ -189,11 +190,16 @@ public:
static TOOL_ACTION updateSymbolFields;
// Hierarchy navigation
+ static TOOL_ACTION changeSheet;
static TOOL_ACTION enterSheet;
static TOOL_ACTION leaveSheet;
- static TOOL_ACTION navigateHierarchy;
+ static TOOL_ACTION navigateUp;
+ static TOOL_ACTION navigateForward;
+ static TOOL_ACTION navigateBack;
+ static TOOL_ACTION navigatePrevious;
+ static TOOL_ACTION navigateNext;
+ static TOOL_ACTION showHierarchy;
static TOOL_ACTION hypertextCommand;
- static TOOL_ACTION importSingleSheetPin;
// Global edit tools
static TOOL_ACTION cleanupSheetPins;
diff --git a/eeschema/tools/ee_selection_tool.cpp b/eeschema/tools/ee_selection_tool.cpp
index e035370ba3..c45aab1e92 100644
--- a/eeschema/tools/ee_selection_tool.cpp
+++ b/eeschema/tools/ee_selection_tool.cpp
@@ -535,6 +535,14 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent )
}
}
}
+ else if( evt->IsMouseDown( BUT_AUX1 ) )
+ {
+ m_toolMgr->RunAction( EE_ACTIONS::navigateBack, true );
+ }
+ else if( evt->IsMouseDown( BUT_AUX2 ) )
+ {
+ m_toolMgr->RunAction( EE_ACTIONS::navigateForward, true );
+ }
else if( evt->Category() == TC_COMMAND && evt->Action() == TA_CHOICE_MENU_CHOICE )
{
m_disambiguateTimer.Stop();
diff --git a/eeschema/tools/sch_editor_control.cpp b/eeschema/tools/sch_editor_control.cpp
index 0550b62681..c35e7a9f8f 100644
--- a/eeschema/tools/sch_editor_control.cpp
+++ b/eeschema/tools/sch_editor_control.cpp
@@ -57,6 +57,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -316,13 +317,6 @@ int SCH_EDITOR_CONTROL::FindAndReplace( const TOOL_EVENT& aEvent )
}
-int SCH_EDITOR_CONTROL::NavigateHierarchy( const TOOL_EVENT& aEvent )
-{
- m_frame->UpdateHierarchyNavigator( true );
- return 0;
-}
-
-
int SCH_EDITOR_CONTROL::UpdateFind( const TOOL_EVENT& aEvent )
{
wxFindReplaceData& data = m_frame->GetFindReplaceData();
@@ -2112,43 +2106,9 @@ int SCH_EDITOR_CONTROL::ShowBusManager( const TOOL_EVENT& aEvent )
}
-int SCH_EDITOR_CONTROL::EnterSheet( const TOOL_EVENT& aEvent )
+int SCH_EDITOR_CONTROL::ShowHierarchy( const TOOL_EVENT& aEvent )
{
- EE_SELECTION_TOOL* selTool = m_toolMgr->GetTool();
- const EE_SELECTION& selection = selTool->RequestSelection( EE_COLLECTOR::SheetsOnly );
-
- if( selection.GetSize() == 1 )
- {
- SCH_SHEET* sheet = (SCH_SHEET*) selection.Front();
-
- m_toolMgr->RunAction( ACTIONS::cancelInteractive, true );
- m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
-
- // Store the current zoom level into the current screen before switching
- m_frame->GetScreen()->m_LastZoomLevel = m_frame->GetCanvas()->GetView()->GetScale();
-
- m_frame->GetCurrentSheet().push_back( sheet );
- m_frame->DisplayCurrentSheet();
- }
-
- return 0;
-}
-
-
-int SCH_EDITOR_CONTROL::LeaveSheet( const TOOL_EVENT& aEvent )
-{
- if( m_frame->GetCurrentSheet().Last() != &m_frame->Schematic().Root() )
- {
- m_toolMgr->RunAction( ACTIONS::cancelInteractive, true );
- m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
-
- // Store the current zoom level into the current screen before switching
- m_frame->GetScreen()->m_LastZoomLevel = m_frame->GetCanvas()->GetView()->GetScale();
-
- m_frame->GetCurrentSheet().pop_back();
- m_frame->DisplayCurrentSheet();
- }
-
+ getEditFrame()->ToggleSchematicHierarchy();
return 0;
}
@@ -2424,10 +2384,7 @@ void SCH_EDITOR_CONTROL::setTransitions()
Go( &SCH_EDITOR_CONTROL::DrawSheetOnClipboard, EE_ACTIONS::drawSheetOnClipboard.MakeEvent() );
Go( &SCH_EDITOR_CONTROL::ShowBusManager, EE_ACTIONS::showBusManager.MakeEvent() );
-
- Go( &SCH_EDITOR_CONTROL::EnterSheet, EE_ACTIONS::enterSheet.MakeEvent() );
- Go( &SCH_EDITOR_CONTROL::LeaveSheet, EE_ACTIONS::leaveSheet.MakeEvent() );
- Go( &SCH_EDITOR_CONTROL::NavigateHierarchy, EE_ACTIONS::navigateHierarchy.MakeEvent() );
+ Go( &SCH_EDITOR_CONTROL::ShowHierarchy, EE_ACTIONS::showHierarchy.MakeEvent() );
Go( &SCH_EDITOR_CONTROL::ToggleHiddenPins, EE_ACTIONS::toggleHiddenPins.MakeEvent() );
Go( &SCH_EDITOR_CONTROL::ToggleHiddenFields, EE_ACTIONS::toggleHiddenFields.MakeEvent() );
diff --git a/eeschema/tools/sch_editor_control.h b/eeschema/tools/sch_editor_control.h
index a862cce861..955104d86b 100644
--- a/eeschema/tools/sch_editor_control.h
+++ b/eeschema/tools/sch_editor_control.h
@@ -132,10 +132,7 @@ public:
int DrawSheetOnClipboard( const TOOL_EVENT& aEvent );
int ShowBusManager( const TOOL_EVENT& aEvent );
-
- int EnterSheet( const TOOL_EVENT& aEvent );
- int LeaveSheet( const TOOL_EVENT& aEvent );
- int NavigateHierarchy( const TOOL_EVENT& aEvent );
+ int ShowHierarchy( const TOOL_EVENT& aEvent );
int ToggleHiddenPins( const TOOL_EVENT& aEvent );
int ToggleHiddenFields( const TOOL_EVENT& aEvent );
diff --git a/eeschema/tools/sch_navigate_tool.cpp b/eeschema/tools/sch_navigate_tool.cpp
index 954e48de1a..8ec2d4f789 100644
--- a/eeschema/tools/sch_navigate_tool.cpp
+++ b/eeschema/tools/sch_navigate_tool.cpp
@@ -28,10 +28,28 @@
#include
-int SCH_NAVIGATE_TOOL::NavigateHierarchy( const TOOL_EVENT& aEvent )
+void SCH_NAVIGATE_TOOL::ResetHistory()
{
- m_frame->UpdateHierarchyNavigator( true );
- return 0;
+ m_navHistory.clear();
+ m_navHistory.push_back( m_frame->GetCurrentSheet() );
+ m_navIndex = m_navHistory.begin();
+}
+
+
+void SCH_NAVIGATE_TOOL::CleanHistory()
+{
+ SCH_SHEET_LIST sheets = m_frame->Schematic().GetSheets();
+
+ // Search through our history, and removing any entries
+ // that the no longer point to a sheet on the schematic
+ auto entry = m_navHistory.begin();
+ while( entry != m_navHistory.end() )
+ {
+ if( std::find( sheets.begin(), sheets.end(), *entry ) != sheets.end() )
+ ++entry;
+ else
+ entry = m_navHistory.erase( entry );
+ }
}
@@ -48,35 +66,125 @@ int SCH_NAVIGATE_TOOL::HypertextCommand( const TOOL_EVENT& aEvent )
{
if( sheet.GetPageNumber() == *aPage )
{
- m_frame->GetToolManager()->RunAction( ACTIONS::cancelInteractive, true );
- m_frame->GetToolManager()->RunAction( EE_ACTIONS::clearSelection, true );
-
- m_frame->SetCurrentSheet( sheet );
- m_frame->DisplayCurrentSheet();
-
+ changeSheet( sheet );
return;
}
}
};
if( *page == "HYPERTEXT_BACK" )
- {
- if( m_hypertextStack.size() > 0 )
- {
- goToPage( &m_hypertextStack.top() );
- m_hypertextStack.pop();
- }
- }
+ Back( aEvent );
else
- {
- m_hypertextStack.push( m_frame->GetCurrentSheet().GetPageNumber() );
goToPage( page );
+
+ return 0;
+}
+
+
+int SCH_NAVIGATE_TOOL::Up( const TOOL_EVENT& aEvent )
+{
+ // Checks for CanGoUp()
+ LeaveSheet( aEvent );
+ return 0;
+}
+
+
+int SCH_NAVIGATE_TOOL::Forward( const TOOL_EVENT& aEvent )
+{
+ if( CanGoForward() )
+ {
+ m_navIndex++;
+
+ m_frame->GetToolManager()->RunAction( ACTIONS::cancelInteractive, true );
+ m_frame->GetToolManager()->RunAction( EE_ACTIONS::clearSelection, true );
+
+ m_frame->SetCurrentSheet( *m_navIndex );
+ m_frame->DisplayCurrentSheet();
}
return 0;
}
+int SCH_NAVIGATE_TOOL::Back( const TOOL_EVENT& aEvent )
+{
+ if( CanGoBack() )
+ {
+ m_navIndex--;
+
+ m_frame->GetToolManager()->RunAction( ACTIONS::cancelInteractive, true );
+ m_frame->GetToolManager()->RunAction( EE_ACTIONS::clearSelection, true );
+
+ m_frame->SetCurrentSheet( *m_navIndex );
+ m_frame->DisplayCurrentSheet();
+ }
+
+ return 0;
+}
+
+
+int SCH_NAVIGATE_TOOL::Previous( const TOOL_EVENT& aEvent )
+{
+ if( CanGoPrevious() )
+ changeSheet( m_frame->Schematic().GetSheets().at(
+ m_frame->GetCurrentSheet().GetVirtualPageNumber() - 2 ) );
+
+ return 0;
+}
+
+
+int SCH_NAVIGATE_TOOL::Next( const TOOL_EVENT& aEvent )
+{
+ if( CanGoNext() )
+ changeSheet( m_frame->Schematic().GetSheets().at(
+ m_frame->GetCurrentSheet().GetVirtualPageNumber() ) );
+
+ return 0;
+}
+
+
+bool SCH_NAVIGATE_TOOL::CanGoBack()
+{
+ return m_navIndex != m_navHistory.begin();
+}
+
+
+bool SCH_NAVIGATE_TOOL::CanGoForward()
+{
+ return m_navIndex != --m_navHistory.end();
+}
+
+
+bool SCH_NAVIGATE_TOOL::CanGoUp()
+{
+ return m_frame->GetCurrentSheet().Last() != &m_frame->Schematic().Root();
+}
+
+
+bool SCH_NAVIGATE_TOOL::CanGoPrevious()
+{
+ return m_frame->GetCurrentSheet().GetVirtualPageNumber() > 1;
+}
+
+
+bool SCH_NAVIGATE_TOOL::CanGoNext()
+{
+ return m_frame->GetCurrentSheet().GetVirtualPageNumber()
+ < (int) m_frame->Schematic().GetSheets().size();
+}
+
+
+int SCH_NAVIGATE_TOOL::ChangeSheet( const TOOL_EVENT& aEvent )
+{
+ SCH_SHEET_PATH* path = aEvent.Parameter();
+ wxCHECK( path, 0 );
+
+ changeSheet( *path );
+
+ return 0;
+}
+
+
int SCH_NAVIGATE_TOOL::EnterSheet( const TOOL_EVENT& aEvent )
{
EE_SELECTION_TOOL* selTool = m_toolMgr->GetTool();
@@ -84,13 +192,10 @@ int SCH_NAVIGATE_TOOL::EnterSheet( const TOOL_EVENT& aEvent )
if( selection.GetSize() == 1 )
{
- SCH_SHEET* sheet = (SCH_SHEET*) selection.Front();
+ SCH_SHEET_PATH pushed = m_frame->GetCurrentSheet();
+ pushed.push_back( (SCH_SHEET*) selection.Front() );
- m_toolMgr->RunAction( ACTIONS::cancelInteractive, true );
- m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
-
- m_frame->GetCurrentSheet().push_back( sheet );
- m_frame->DisplayCurrentSheet();
+ changeSheet( pushed );
}
return 0;
@@ -99,13 +204,12 @@ int SCH_NAVIGATE_TOOL::EnterSheet( const TOOL_EVENT& aEvent )
int SCH_NAVIGATE_TOOL::LeaveSheet( const TOOL_EVENT& aEvent )
{
- if( m_frame->GetCurrentSheet().Last() != &m_frame->Schematic().Root() )
+ if( CanGoUp() )
{
- m_toolMgr->RunAction( ACTIONS::cancelInteractive, true );
- m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
+ SCH_SHEET_PATH popped = m_frame->GetCurrentSheet();
+ popped.pop_back();
- m_frame->GetCurrentSheet().pop_back();
- m_frame->DisplayCurrentSheet();
+ changeSheet( popped );
}
return 0;
@@ -114,8 +218,40 @@ int SCH_NAVIGATE_TOOL::LeaveSheet( const TOOL_EVENT& aEvent )
void SCH_NAVIGATE_TOOL::setTransitions()
{
+ Go( &SCH_NAVIGATE_TOOL::ChangeSheet, EE_ACTIONS::changeSheet.MakeEvent() );
Go( &SCH_NAVIGATE_TOOL::EnterSheet, EE_ACTIONS::enterSheet.MakeEvent() );
Go( &SCH_NAVIGATE_TOOL::LeaveSheet, EE_ACTIONS::leaveSheet.MakeEvent() );
- Go( &SCH_NAVIGATE_TOOL::NavigateHierarchy, EE_ACTIONS::navigateHierarchy.MakeEvent() );
Go( &SCH_NAVIGATE_TOOL::HypertextCommand, EE_ACTIONS::hypertextCommand.MakeEvent() );
+
+ Go( &SCH_NAVIGATE_TOOL::Up, EE_ACTIONS::navigateUp.MakeEvent() );
+ Go( &SCH_NAVIGATE_TOOL::Forward, EE_ACTIONS::navigateForward.MakeEvent() );
+ Go( &SCH_NAVIGATE_TOOL::Back, EE_ACTIONS::navigateBack.MakeEvent() );
+
+ Go( &SCH_NAVIGATE_TOOL::Previous, EE_ACTIONS::navigatePrevious.MakeEvent() );
+ Go( &SCH_NAVIGATE_TOOL::Next, EE_ACTIONS::navigateNext.MakeEvent() );
+}
+
+
+void SCH_NAVIGATE_TOOL::pushToHistory( SCH_SHEET_PATH aPath )
+{
+ if( CanGoForward() )
+ m_navHistory.erase( std::next( m_navIndex ), m_navHistory.end() );
+
+ m_navHistory.push_back( aPath );
+ m_navIndex = --m_navHistory.end();
+}
+
+
+void SCH_NAVIGATE_TOOL::changeSheet( SCH_SHEET_PATH aPath )
+{
+ m_frame->GetToolManager()->RunAction( ACTIONS::cancelInteractive, true );
+ m_frame->GetToolManager()->RunAction( EE_ACTIONS::clearSelection, true );
+
+ // Store the current zoom level into the current screen before switching
+ m_frame->GetScreen()->m_LastZoomLevel = m_frame->GetCanvas()->GetView()->GetScale();
+
+ pushToHistory( aPath );
+
+ m_frame->SetCurrentSheet( aPath );
+ m_frame->DisplayCurrentSheet();
}
diff --git a/eeschema/tools/sch_navigate_tool.h b/eeschema/tools/sch_navigate_tool.h
index 58773c331d..fad9b54961 100644
--- a/eeschema/tools/sch_navigate_tool.h
+++ b/eeschema/tools/sch_navigate_tool.h
@@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2019 CERN
- * Copyright (C) 2019-2021 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2019-2022 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -38,23 +38,51 @@ class SCH_EDIT_FRAME;
class SCH_NAVIGATE_TOOL : public wxEvtHandler, public EE_TOOL_BASE
{
public:
- SCH_NAVIGATE_TOOL() :
- EE_TOOL_BASE( "eeschema.NavigateTool" )
- { }
+ SCH_NAVIGATE_TOOL() : EE_TOOL_BASE( "eeschema.NavigateTool" ) {}
~SCH_NAVIGATE_TOOL() { }
+ ///< Reset navigation history. Must be done when schematic changes
+ void ResetHistory();
+ ///< Remove deleted pages from history. Must be done when schematic
+ // hierarchy changes.
+ void CleanHistory();
+
+ ///< Enter sheet provided in aEvent
+ int ChangeSheet( const TOOL_EVENT& aEvent );
+ ///< Enter selected sheet
int EnterSheet( const TOOL_EVENT& aEvent );
+ ///< Return to parent sheet. Synonymous with Up
int LeaveSheet( const TOOL_EVENT& aEvent );
- int NavigateHierarchy( const TOOL_EVENT& aEvent );
+ ///< Navigate up in sheet hierarchy
+ int Up( const TOOL_EVENT& aEvent );
+ ///< Navigate forward in sheet history
+ int Forward( const TOOL_EVENT& aEvent );
+ ///< Navigate back in sheet history
+ int Back( const TOOL_EVENT& aEvent );
+ ///< Navigate to previous sheet by numeric sheet number
+ int Previous( const TOOL_EVENT& aEvent );
+ ///< Navigate to next sheet by numeric sheet number
+ int Next( const TOOL_EVENT& aEvent );
int HypertextCommand( const TOOL_EVENT& aEvent );
+ bool CanGoBack();
+ bool CanGoForward();
+ bool CanGoUp();
+ bool CanGoPrevious();
+ bool CanGoNext();
+
private:
///< Set up handlers for various events.
void setTransitions() override;
+ ///< Clear history after this nav index and pushes aPath to history
+ void pushToHistory( SCH_SHEET_PATH aPath );
+ ///< Change current sheet to aPath and handle history, zooming, etc.
+ void changeSheet( SCH_SHEET_PATH aPath );
private:
- std::stack m_hypertextStack;
+ std::list m_navHistory;
+ std::list::iterator m_navIndex;
};
diff --git a/include/tool/tool_dispatcher.h b/include/tool/tool_dispatcher.h
index f7c9d81c96..da725552df 100644
--- a/include/tool/tool_dispatcher.h
+++ b/include/tool/tool_dispatcher.h
@@ -77,9 +77,6 @@ public:
OPT GetToolEvent( wxKeyEvent* aKeyEvent, bool* aSpecialKeyFlag );
private:
- ///< Number of mouse buttons that is handled in events.
- static const int MouseButtonCount = 3;
-
///< The time threshold for a mouse button press that distinguishes between a single mouse
///< click and a beginning of drag event (expressed in milliseconds).
static const int DragTimeThreshold = 300;
diff --git a/include/tool/tool_event.h b/include/tool/tool_event.h
index 601977e977..022f33b491 100644
--- a/include/tool/tool_event.h
+++ b/include/tool/tool_event.h
@@ -126,7 +126,9 @@ enum TOOL_MOUSE_BUTTONS
BUT_LEFT = 0x1,
BUT_RIGHT = 0x2,
BUT_MIDDLE = 0x4,
- BUT_BUTTON_MASK = BUT_LEFT | BUT_RIGHT | BUT_MIDDLE,
+ BUT_AUX1 = 0x8,
+ BUT_AUX2 = 0x10,
+ BUT_BUTTON_MASK = BUT_LEFT | BUT_RIGHT | BUT_MIDDLE | BUT_AUX1 | BUT_AUX2,
BUT_ANY = 0xffffffff
};
diff --git a/pcbnew/footprint_edit_frame.cpp b/pcbnew/footprint_edit_frame.cpp
index 601e5561ca..ed5221ef88 100644
--- a/pcbnew/footprint_edit_frame.cpp
+++ b/pcbnew/footprint_edit_frame.cpp
@@ -245,24 +245,10 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
FinishAUIInitialization();
+ wxAuiPaneInfo& treePane = m_auimgr.GetPane( "Footprints" );
+
if( m_editorSettings->m_LibWidth > 0 )
- {
- wxAuiPaneInfo& treePane = m_auimgr.GetPane( "Footprints" );
-
- // wxAUI hack: force width by setting MinSize() and then Fixed()
- // thanks to ZenJu http://trac.wxwidgets.org/ticket/13180
- treePane.MinSize( m_editorSettings->m_LibWidth, -1 );
- treePane.Fixed();
- m_auimgr.Update();
-
- // now make it resizable again
- treePane.Resizable();
- m_auimgr.Update();
-
- // Note: DO NOT call m_auimgr.Update() anywhere after this; it will nuke the size
- // back to minimum.
- treePane.MinSize( 250, -1 );
- }
+ SetAuiPaneSize( m_auimgr, treePane, m_editorSettings->m_LibWidth, -1 );
// Apply saved visibility stuff at the end
FOOTPRINT_EDITOR_SETTINGS* cfg = GetSettings();
@@ -357,7 +343,14 @@ void FOOTPRINT_EDIT_FRAME::ToggleSearchTree()
{
wxAuiPaneInfo& treePane = m_auimgr.GetPane( m_treePane );
treePane.Show( !IsSearchTreeShown() );
- m_auimgr.Update();
+
+ if( IsSearchTreeShown() )
+ SetAuiPaneSize( m_auimgr, treePane, m_editorSettings->m_LibWidth, -1 );
+ else
+ {
+ m_editorSettings->m_LibWidth = m_treePane->GetSize().x;
+ m_auimgr.Update();
+ }
}