From ef5c69167a493683c81d44cf752fc141dcf174de Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Mon, 13 May 2019 21:42:40 +0100 Subject: [PATCH] Start moving some LibEdit and SchEdit menubar menus to actions. Also includes a bunch of bug fixes that got intermingled. Fixes: lp:1828826 * https://bugs.launchpad.net/kicad/+bug/1828826 Fixes: lp:1828826 * https://bugs.launchpad.net/kicad/+bug/1828826 Fixes: lp:1828793 * https://bugs.launchpad.net/kicad/+bug/1828793 --- common/legacy_gal/eda_draw_frame.cpp | 35 +-- common/tool/actions.cpp | 52 +++- common/tool/common_tools.cpp | 77 +++++- common/tool/conditional_menu.cpp | 65 +++-- common/tool/context_menu.cpp | 60 ++--- common/tool/tool_dispatcher.cpp | 18 +- common/tool/tool_event.cpp | 6 +- common/tool/tool_manager.cpp | 17 +- common/tool/tool_menu.cpp | 27 +-- eeschema/ee_hotkeys.cpp | 2 + eeschema/eeschema_id.h | 34 --- eeschema/hierarch.cpp | 11 +- eeschema/libedit/lib_edit_frame.h | 2 + eeschema/libedit/toolbars_libedit.cpp | 11 + eeschema/menubar.cpp | 270 ++++++--------------- eeschema/sch_base_frame.h | 2 +- eeschema/sch_edit_frame.cpp | 27 +-- eeschema/sch_edit_frame.h | 6 +- eeschema/toolbars_sch_editor.cpp | 30 ++- eeschema/tools/ee_actions.cpp | 23 +- eeschema/tools/ee_actions.h | 6 +- eeschema/tools/ee_selection_tool.cpp | 23 +- eeschema/tools/ee_selection_tool.h | 2 + eeschema/tools/lib_drawing_tools.cpp | 8 +- eeschema/tools/lib_move_tool.cpp | 2 +- eeschema/tools/sch_drawing_tools.cpp | 12 +- eeschema/tools/sch_edit_tool.cpp | 6 +- eeschema/tools/sch_editor_control.cpp | 43 ++++ eeschema/tools/sch_editor_control.h | 4 + eeschema/tools/sch_move_tool.cpp | 2 +- eeschema/tools/sch_wire_bus_tool.cpp | 6 +- gerbview/hotkeys.h | 3 +- gerbview/tools/gerbview_selection_tool.cpp | 2 +- include/draw_frame.h | 2 +- include/hotkeys_basic.h | 1 + include/tool/actions.h | 10 + include/tool/common_tools.h | 7 + include/tool/conditional_menu.h | 102 ++++---- include/tool/context_menu.h | 14 +- include/tool/tool_action.h | 9 - include/tool/tool_dispatcher.h | 3 - include/tool/tool_event.h | 4 +- include/tool/tool_manager.h | 11 +- include/tool/tool_menu.h | 7 +- pagelayout_editor/hotkeys.h | 3 +- pcbnew/hotkeys.h | 1 - pcbnew/pcb_edit_frame.h | 2 +- pcbnew/toolbars_update_user_interface.cpp | 6 +- pcbnew/tools/pad_tool.cpp | 2 +- pcbnew/tools/pcb_editor_control.cpp | 13 +- pcbnew/tools/placement_tool.cpp | 12 +- pcbnew/tools/selection_tool.cpp | 4 +- 52 files changed, 543 insertions(+), 564 deletions(-) diff --git a/common/legacy_gal/eda_draw_frame.cpp b/common/legacy_gal/eda_draw_frame.cpp index 99c406760f..7f35ed0137 100644 --- a/common/legacy_gal/eda_draw_frame.cpp +++ b/common/legacy_gal/eda_draw_frame.cpp @@ -110,10 +110,6 @@ BEGIN_EVENT_TABLE( EDA_DRAW_FRAME, KIWAY_PLAYER ) EVT_UPDATE_UI( wxID_UNDO, EDA_DRAW_FRAME::OnUpdateUndo ) EVT_UPDATE_UI( wxID_REDO, EDA_DRAW_FRAME::OnUpdateRedo ) - EVT_UPDATE_UI( ID_TB_OPTIONS_SHOW_GRID, EDA_DRAW_FRAME::OnUpdateGrid ) - EVT_UPDATE_UI( ID_TB_OPTIONS_SELECT_CURSOR, EDA_DRAW_FRAME::OnUpdateCrossHairStyle ) - EVT_UPDATE_UI_RANGE( ID_TB_OPTIONS_SELECT_UNIT_MM, ID_TB_OPTIONS_SELECT_UNIT_INCH, - EDA_DRAW_FRAME::OnUpdateUnits ) END_EVENT_TABLE() @@ -323,6 +319,7 @@ void EDA_DRAW_FRAME::SkipNextLeftButtonReleaseEvent() void EDA_DRAW_FRAME::OnToggleGridState( wxCommandEvent& aEvent ) { + // JEY TODO: obsolete when everything moves to COMMON_TOOLS SetGridVisibility( !IsGridVisible() ); if( IsGalCanvasActive() ) @@ -363,6 +360,7 @@ void EDA_DRAW_FRAME::OnSelectUnits( wxCommandEvent& aEvent ) void EDA_DRAW_FRAME::OnToggleCrossHairStyle( wxCommandEvent& aEvent ) { + // JEY TODO: obsolete when everything moves to COMMON_TOOLS auto& galOpts = GetGalDisplayOptions(); galOpts.m_fullscreenCursor = !galOpts.m_fullscreenCursor; @@ -387,29 +385,10 @@ void EDA_DRAW_FRAME::OnUpdateRedo( wxUpdateUIEvent& aEvent ) } -void EDA_DRAW_FRAME::OnUpdateUnits( wxUpdateUIEvent& aEvent ) -{ - bool enable; - - enable = ( ((aEvent.GetId() == ID_TB_OPTIONS_SELECT_UNIT_MM) && (m_UserUnits == MILLIMETRES)) - || ((aEvent.GetId() == ID_TB_OPTIONS_SELECT_UNIT_INCH) && (m_UserUnits == INCHES)) ); - - aEvent.Check( enable ); - DisplayUnitsMsg(); -} - - -void EDA_DRAW_FRAME::OnUpdateGrid( wxUpdateUIEvent& aEvent ) -{ - wxString tool_tip = IsGridVisible() ? _( "Hide grid" ) : _( "Show grid" ); - - aEvent.Check( IsGridVisible() ); - m_optionsToolBar->SetToolShortHelp( ID_TB_OPTIONS_SHOW_GRID, tool_tip ); -} - - void EDA_DRAW_FRAME::OnUpdateSelectGrid( wxUpdateUIEvent& aEvent ) { + // JEY TODO: obsolete when everything moves to COMMON_TOOLS + // No need to update the grid select box if it doesn't exist or the grid setting change // was made using the select box. if( m_gridSelectBox == NULL || m_auxiliaryToolBar == NULL ) @@ -431,12 +410,6 @@ void EDA_DRAW_FRAME::OnUpdateSelectGrid( wxUpdateUIEvent& aEvent ) } -void EDA_DRAW_FRAME::OnUpdateCrossHairStyle( wxUpdateUIEvent& aEvent ) -{ - aEvent.Check( GetGalDisplayOptions().m_fullscreenCursor ); -} - - void EDA_DRAW_FRAME::ReCreateAuxiliaryToolbar() { } diff --git a/common/tool/actions.cpp b/common/tool/actions.cpp index 1240836e65..89af26bfb6 100644 --- a/common/tool/actions.cpp +++ b/common/tool/actions.cpp @@ -10,38 +10,49 @@ TOOL_ACTION ACTIONS::cancelInteractive( "common.Interactive.cancel", _( "Cancel" ), _( "Cancel current tool" ), cancel_xpm, AF_NONE ); +TOOL_ACTION ACTIONS::updateMenu( "common.Interactive.updateMenu", + AS_GLOBAL, 0, "", "" ); // This is an internal event + // View Controls TOOL_ACTION ACTIONS::zoomRedraw( "common.Control.zoomRedraw", AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_ZOOM_REDRAW ), - _( "Refresh View" ), "", zoom_redraw_xpm ); + _( "Refresh View" ), "", + zoom_redraw_xpm ); TOOL_ACTION ACTIONS::zoomIn( "common.Control.zoomIn", AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_ZOOM_IN ), - _( "Zoom In" ), "", zoom_in_xpm ); + _( "Zoom In" ), "", + zoom_in_xpm ); TOOL_ACTION ACTIONS::zoomOut( "common.Control.zoomOut", AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_ZOOM_OUT ), - _( "Zoom Out" ), "", zoom_out_xpm ); + _( "Zoom Out" ), "", + zoom_out_xpm ); TOOL_ACTION ACTIONS::zoomInCenter( "common.Control.zoomInCenter", AS_GLOBAL, 0, - "", "" ); + _( "Zoom In" ), "", + zoom_in_xpm ); TOOL_ACTION ACTIONS::zoomOutCenter( "common.Control.zoomOutCenter", AS_GLOBAL, 0, - "", "" ); + _( "Zoom Out" ), "", + zoom_out_xpm ); TOOL_ACTION ACTIONS::zoomCenter( "common.Control.zoomCenter", AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_ZOOM_CENTER ), - _( "Center" ), "", zoom_center_on_screen_xpm ); + _( "Center" ), "", + zoom_center_on_screen_xpm ); TOOL_ACTION ACTIONS::zoomFitScreen( "common.Control.zoomFitScreen", AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_ZOOM_AUTO ), - _( "Zoom Auto" ), "", zoom_fit_in_page_xpm ); + _( "Zoom to Fit" ), "", + zoom_fit_in_page_xpm ); TOOL_ACTION ACTIONS::zoomTool( "common.Control.zoomTool", AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_ZOOM_SELECTION ), - _( "Zoom to Selection" ), "", NULL, AF_ACTIVATE ); + _( "Zoom to Selection" ), "", + zoom_area_xpm, AF_ACTIVATE ); TOOL_ACTION ACTIONS::zoomPreset( "common.Control.zoomPreset", AS_GLOBAL, 0, @@ -140,6 +151,31 @@ TOOL_ACTION ACTIONS::gridPreset( "common.Control.gridPreset", AS_GLOBAL, 0, "", "" ); +TOOL_ACTION ACTIONS::toggleGrid( "common.Control.toggleGrid", + AS_GLOBAL, 0, + _( "Show Grid" ), _( "Display grid dots or lines in the edit window" ), + grid_xpm ); + +TOOL_ACTION ACTIONS::gridProperties( "common.Control.gridProperties", + AS_GLOBAL, 0, + _( "Grid Properties..." ), _( "Set grid dimensions" ), + grid_xpm ); + +TOOL_ACTION ACTIONS::imperialUnits( "common.Control.imperialUnits", + AS_GLOBAL, 0, + _( "Imperial" ), _( "Use inches and mils" ), + unit_inch_xpm ); + +TOOL_ACTION ACTIONS::metricUnits( "common.Control.metricUnits", + AS_GLOBAL, 0, + _( "Metric" ), _( "Use millimeters" ), + unit_mm_xpm ); + +TOOL_ACTION ACTIONS::toggleUnits( "common.Control.toggleUnits", + AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_SWITCH_UNITS ), + _( "Switch units" ), _( "Switch between inches and millimeters" ), + unit_mm_xpm ); + // System-wide selection Events diff --git a/common/tool/common_tools.cpp b/common/tool/common_tools.cpp index b8cc661e23..d5d5ebfd9f 100644 --- a/common/tool/common_tools.cpp +++ b/common/tool/common_tools.cpp @@ -35,10 +35,16 @@ #include -static TOOL_ACTION ACT_toggleCursor( "common.Control.toggleCursor", +TOOL_ACTION ACTIONS::toggleCursor( "common.Control.toggleCursor", AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_TOGGLE_CURSOR ), - _( "Toggle Always Show Cursor" ), - _( "Toggle display of the cursor, even when not in an interactive tool" ) ); + _( "Always Show Cursor" ), + _( "Switch whether the cursor is displayed even when not in an editing tool" ) ); + + +TOOL_ACTION ACTIONS::toggleCursorStyle( "common.Control.toggleCursorStyle", + AS_GLOBAL, 0, + _( "Full-Window Crosshairs" ), + _( "Switch display of full-window crosshairs" ) ); COMMON_TOOLS::COMMON_TOOLS() : @@ -394,6 +400,52 @@ int COMMON_TOOLS::doGridPreset( int idx ) } +int COMMON_TOOLS::ToggleGrid( const TOOL_EVENT& aEvent ) +{ + m_frame->SetGridVisibility( !m_frame->IsGridVisible() ); + + m_frame->GetGalCanvas()->GetGAL()->SetGridVisibility( m_frame->IsGridVisible() ); + getView()->MarkTargetDirty( KIGFX::TARGET_NONCACHED ); + m_frame->GetGalCanvas()->Refresh(); + + return 0; +} + + +int COMMON_TOOLS::MetricUnits( const TOOL_EVENT& aEvent ) +{ + wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED ); + + cmd.SetId( ID_TB_OPTIONS_SELECT_UNIT_MM ); + m_frame->ProcessEvent( cmd ); + + return 0; +} + + +int COMMON_TOOLS::ImperialUnits( const TOOL_EVENT& aEvent ) +{ + wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED ); + + cmd.SetId( ID_TB_OPTIONS_SELECT_UNIT_INCH ); + m_frame->ProcessEvent( cmd ); + + return 0; +} + + +int COMMON_TOOLS::ToggleUnits( const TOOL_EVENT& aEvent ) +{ + wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED ); + + cmd.SetId( ( m_frame->GetUserUnits() == INCHES) ? ID_TB_OPTIONS_SELECT_UNIT_MM + : ID_TB_OPTIONS_SELECT_UNIT_INCH ); + m_frame->ProcessEvent( cmd ); + + return 0; +} + + int COMMON_TOOLS::ToggleCursor( const TOOL_EVENT& aEvent ) { auto& galOpts = m_frame->GetGalDisplayOptions(); @@ -405,6 +457,17 @@ int COMMON_TOOLS::ToggleCursor( const TOOL_EVENT& aEvent ) } +int COMMON_TOOLS::ToggleCursorStyle( const TOOL_EVENT& aEvent ) +{ + KIGFX::GAL_DISPLAY_OPTIONS& galOpts = m_frame->GetGalDisplayOptions(); + + galOpts.m_fullscreenCursor = !galOpts.m_fullscreenCursor; + galOpts.NotifyChanged(); + + return 0; +} + + void COMMON_TOOLS::setTransitions() { // Cursor control @@ -441,8 +504,14 @@ void COMMON_TOOLS::setTransitions() Go( &COMMON_TOOLS::GridNext, ACTIONS::gridNext.MakeEvent() ); Go( &COMMON_TOOLS::GridPrev, ACTIONS::gridPrev.MakeEvent() ); Go( &COMMON_TOOLS::GridPreset, ACTIONS::gridPreset.MakeEvent() ); + Go( &COMMON_TOOLS::ToggleGrid, ACTIONS::toggleGrid.MakeEvent() ); - Go( &COMMON_TOOLS::ToggleCursor, ACT_toggleCursor.MakeEvent() ); + Go( &COMMON_TOOLS::ImperialUnits, ACTIONS::imperialUnits.MakeEvent() ); + Go( &COMMON_TOOLS::MetricUnits, ACTIONS::metricUnits.MakeEvent() ); + Go( &COMMON_TOOLS::ToggleUnits, ACTIONS::toggleUnits.MakeEvent() ); + + Go( &COMMON_TOOLS::ToggleCursor, ACTIONS::toggleCursor.MakeEvent() ); + Go( &COMMON_TOOLS::ToggleCursorStyle, ACTIONS::toggleCursorStyle.MakeEvent() ); } diff --git a/common/tool/conditional_menu.cpp b/common/tool/conditional_menu.cpp index c1d360dbb5..55295b4ca7 100644 --- a/common/tool/conditional_menu.cpp +++ b/common/tool/conditional_menu.cpp @@ -2,6 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2015 CERN + * Copyright (C) 2015-2019 KiCad Developers, see CHANGELOG.txt for contributors. * @author Maciej Suminski * * This program is free software; you can redistribute it and/or @@ -25,18 +26,35 @@ #include #include + +CONTEXT_MENU* CONDITIONAL_MENU::create() const +{ + CONDITIONAL_MENU* clone = new CONDITIONAL_MENU( m_isContextMenu, m_tool ); + clone->m_entries = m_entries; + return clone; +} + + void CONDITIONAL_MENU::AddItem( const TOOL_ACTION& aAction, const SELECTION_CONDITION& aCondition, int aOrder ) { assert( aAction.GetId() > 0 ); // Check if action was previously registered in ACTION_MANAGER - addEntry( ENTRY( &aAction, aCondition, aOrder ) ); + addEntry( ENTRY( &aAction, aCondition, aOrder, false ) ); } -void CONDITIONAL_MENU::AddMenu( CONTEXT_MENU* aMenu, bool aExpand, - const SELECTION_CONDITION& aCondition, int aOrder ) +void CONDITIONAL_MENU::AddCheckItem( const TOOL_ACTION& aAction, + const SELECTION_CONDITION& aCondition, int aOrder ) { - addEntry( ENTRY( aMenu, aExpand, aCondition, aOrder ) ); + assert( aAction.GetId() > 0 ); // Check if action was previously registered in ACTION_MANAGER + addEntry( ENTRY( &aAction, aCondition, aOrder, true ) ); +} + + +void CONDITIONAL_MENU::AddMenu( CONTEXT_MENU* aMenu, const SELECTION_CONDITION& aCondition, + int aOrder ) +{ + addEntry( ENTRY( aMenu, aCondition, aOrder ) ); } @@ -46,50 +64,49 @@ void CONDITIONAL_MENU::AddSeparator( const SELECTION_CONDITION& aCondition, int } -CONTEXT_MENU* CONDITIONAL_MENU::Generate( SELECTION& aSelection ) +void CONDITIONAL_MENU::Evaluate( SELECTION& aSelection ) { - CONTEXT_MENU* m_menu = new CONTEXT_MENU; - m_menu->SetTool( m_tool ); + Clear(); - for( std::list::iterator it = m_entries.begin(); it != m_entries.end(); ++it ) + for( const ENTRY& entry : m_entries ) { - const SELECTION_CONDITION& cond = it->Condition(); + const SELECTION_CONDITION& cond = entry.Condition(); + bool result; + wxMenuItem* menuItem = nullptr; try { - if( !cond( aSelection ) ) - continue; + result = cond( aSelection ); } catch( std::exception& ) { continue; } - switch( it->Type() ) + if( m_isContextMenu && !result ) + continue; + + switch( entry.Type() ) { case ENTRY::ACTION: - m_menu->Add( *it->Action() ); + menuItem = Add( *entry.Action(), entry.IsCheckmarkEntry() ); break; - case ENTRY::MENU: - m_menu->Add( it->Menu(), it->Expand() ); + menuItem = Add( entry.Menu() ); break; - - case ENTRY::WXITEM: - m_menu->Append( it->wxItem() ); - break; - case ENTRY::SEPARATOR: - m_menu->AppendSeparator(); + menuItem = AppendSeparator(); break; - default: assert( false ); break; } - } - return m_menu; + if( entry.IsCheckmarkEntry() ) + menuItem->Check( result ); + else + menuItem->Enable( result ); + } } diff --git a/common/tool/context_menu.cpp b/common/tool/context_menu.cpp index 3f33643838..97c822a56b 100644 --- a/common/tool/context_menu.cpp +++ b/common/tool/context_menu.cpp @@ -2,6 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2013-2017 CERN + * Copyright (C) 2013-2019 KiCad Developers, see CHANGELOG.txt for contributors. * @author Tomasz Wlostowski * @author Maciej Suminski * @@ -23,6 +24,8 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ +#include +#include #include #include #include @@ -30,11 +33,16 @@ #include #include -#include + using namespace std::placeholders; + CONTEXT_MENU::CONTEXT_MENU() : - m_titleDisplayed( false ), m_selected( -1 ), m_tool( nullptr ), m_icon( nullptr ) + m_Dirty( true ), + m_titleDisplayed( false ), + m_selected( -1 ), + m_tool( nullptr ), + m_icon( nullptr ) { setupEvents(); } @@ -47,7 +55,6 @@ CONTEXT_MENU::~CONTEXT_MENU() menu->SetParent( nullptr ); CONTEXT_MENU* parent = dynamic_cast( GetParent() ); - wxASSERT( parent || !GetParent() ); if( parent ) parent->m_submenus.remove( this ); @@ -80,6 +87,7 @@ void CONTEXT_MENU::SetIcon( const BITMAP_OPAQUE* aIcon ) void CONTEXT_MENU::setupEvents() { + Connect( wxEVT_MENU_OPEN, wxMenuEventHandler( CONTEXT_MENU::onMenuEvent ), NULL, this ); Connect( wxEVT_MENU_HIGHLIGHT, wxMenuEventHandler( CONTEXT_MENU::onMenuEvent ), NULL, this ); Connect( wxEVT_COMMAND_MENU_SELECTED, wxMenuEventHandler( CONTEXT_MENU::onMenuEvent ), NULL, this ); } @@ -148,13 +156,14 @@ wxMenuItem* CONTEXT_MENU::Add( const wxString& aLabel, int aId, const BITMAP_OPA } -wxMenuItem* CONTEXT_MENU::Add( const TOOL_ACTION& aAction ) +wxMenuItem* CONTEXT_MENU::Add( const TOOL_ACTION& aAction, bool aIsCheckmarkEntry ) { /// ID numbers for tool actions need to have a value higher than ACTION_ID const BITMAP_OPAQUE* icon = aAction.GetIcon(); wxMenuItem* item = new wxMenuItem( this, getMenuId( aAction ), aAction.GetMenuItem(), - aAction.GetDescription(), wxITEM_NORMAL ); + aAction.GetDescription(), + aIsCheckmarkEntry ? wxITEM_CHECK : wxITEM_NORMAL ); set_wxMenuIcon( item, icon ); @@ -165,38 +174,24 @@ wxMenuItem* CONTEXT_MENU::Add( const TOOL_ACTION& aAction ) } -std::list CONTEXT_MENU::Add( CONTEXT_MENU* aMenu, bool aExpand ) +wxMenuItem* CONTEXT_MENU::Add( CONTEXT_MENU* aMenu ) { - std::list items; CONTEXT_MENU* menuCopy = aMenu->Clone(); m_submenus.push_back( menuCopy ); - if( aExpand ) + wxASSERT_MSG( !menuCopy->m_title.IsEmpty(), "Set a title for CONTEXT_MENU using SetTitle()" ); + + if( aMenu->m_icon ) { - for( int i = 0; i < (int) aMenu->GetMenuItemCount(); ++i ) - { - wxMenuItem* item = aMenu->FindItemByPosition( i ); - items.push_back( appendCopy( item ) ); - } + wxMenuItem* newItem = new wxMenuItem( this, -1, menuCopy->m_title ); + set_wxMenuIcon( newItem, aMenu->m_icon ); + newItem->SetSubMenu( menuCopy ); + return Append( newItem ); } else { - wxASSERT_MSG( !menuCopy->m_title.IsEmpty(), "Set a title for CONTEXT_MENU using SetTitle()" ); - - if( aMenu->m_icon ) - { - wxMenuItem* newItem = new wxMenuItem( this, -1, menuCopy->m_title ); - set_wxMenuIcon( newItem, aMenu->m_icon ); - newItem->SetSubMenu( menuCopy ); - items.push_back( Append( newItem ) ); - } - else - { - items.push_back( AppendSubMenu( menuCopy, menuCopy->m_title ) ); - } + return AppendSubMenu( menuCopy, menuCopy->m_title ); } - - return items; } @@ -326,10 +321,17 @@ void CONTEXT_MENU::onMenuEvent( wxMenuEvent& aEvent ) wxEventType type = aEvent.GetEventType(); + if( type == wxEVT_MENU_OPEN && m_Dirty ) + { + getToolManager()->RunAction( ACTIONS::updateMenu, true, this ); + aEvent.Skip(); + return; + } + // When the currently chosen item in the menu is changed, an update event is issued. // For example, the selection tool can use this to dynamically highlight the current item // from selection clarification popup. - if( type == wxEVT_MENU_HIGHLIGHT ) + else if( type == wxEVT_MENU_HIGHLIGHT ) evt = TOOL_EVENT( TC_COMMAND, TA_CONTEXT_MENU_UPDATE, aEvent.GetId() ); // One of menu entries was selected.. diff --git a/common/tool/tool_dispatcher.cpp b/common/tool/tool_dispatcher.cpp index 54fe1bac56..c0e0639274 100644 --- a/common/tool/tool_dispatcher.cpp +++ b/common/tool/tool_dispatcher.cpp @@ -2,8 +2,8 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2013 CERN + * Copyright (C) 2013-2019 KiCad Developers, see CHANGELOG.txt for contributors. * @author Tomasz Wlostowski - * Last changes: 2018 * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -470,7 +470,7 @@ void TOOL_DISPATCHER::DispatchWxEvent( wxEvent& aEvent ) aEvent.Skip(); #endif - updateUI( aEvent ); + m_toolMgr->UpdateUI(); } @@ -483,19 +483,7 @@ void TOOL_DISPATCHER::DispatchWxCommand( wxCommandEvent& aEvent ) else aEvent.Skip(); - updateUI( aEvent ); + m_toolMgr->UpdateUI(); } -void TOOL_DISPATCHER::updateUI( wxEvent& aEvent ) -{ - // TODO I don't feel it is the right place for updating UI, - // but at the moment I cannot think of a better one.. - - auto frame = dynamic_cast( m_toolMgr->GetEditFrame() ); - if( frame ) - { - frame->UpdateStatusBar(); - frame->SyncMenusAndToolbars( aEvent ); - } -} diff --git a/common/tool/tool_event.cpp b/common/tool/tool_event.cpp index 630942e43b..0ff32d6c9c 100644 --- a/common/tool/tool_event.cpp +++ b/common/tool/tool_event.cpp @@ -164,15 +164,13 @@ const std::string TOOL_EVENT_LIST::Format() const bool TOOL_EVENT::IsClick( int aButtonMask ) const { - return IsAction( &ACTIONS::cursorClick ) - || ( m_actions == TA_MOUSE_CLICK && ( m_mouseButtons & aButtonMask ) == aButtonMask ); + return m_actions == TA_MOUSE_CLICK && ( m_mouseButtons & aButtonMask ) == aButtonMask; } bool TOOL_EVENT::IsDblClick( int aButtonMask ) const { - return IsAction( &ACTIONS::cursorDblClick ) - || ( m_actions == TA_MOUSE_DBLCLICK && ( m_mouseButtons & aButtonMask ) == aButtonMask ); + return m_actions == TA_MOUSE_DBLCLICK && ( m_mouseButtons & aButtonMask ) == aButtonMask; } diff --git a/common/tool/tool_manager.cpp b/common/tool/tool_manager.cpp index 938967ba8d..5269a6c27f 100644 --- a/common/tool/tool_manager.cpp +++ b/common/tool/tool_manager.cpp @@ -303,6 +303,7 @@ void TOOL_MANAGER::RunAction( const TOOL_ACTION& aAction, bool aNow, void* aPara TOOL_STATE* current = m_activeState; processEvent( event ); setActiveState( current ); + UpdateUI(); } else { @@ -696,8 +697,6 @@ void TOOL_MANAGER::dispatchContextMenu( const TOOL_EVENT& aEvent ) // Display a copy of menu std::unique_ptr menu( m->Clone() ); - // Run update handlers on the created copy - menu->UpdateAll(); m_menuOwner = toolId; m_menuActive = true; @@ -860,7 +859,7 @@ TOOL_ID TOOL_MANAGER::MakeToolId( const std::string& aToolName ) void TOOL_MANAGER::SetEnvironment( EDA_ITEM* aModel, KIGFX::VIEW* aView, - KIGFX::VIEW_CONTROLS* aViewControls, wxWindow* aFrame ) + KIGFX::VIEW_CONTROLS* aViewControls, EDA_DRAW_FRAME* aFrame ) { m_model = aModel; m_view = aView; @@ -965,3 +964,15 @@ bool TOOL_MANAGER::IsToolActive( TOOL_ID aId ) const auto it = m_toolIdIndex.find( aId ); return !it->second->idle; } + + +void TOOL_MANAGER::UpdateUI() +{ + EDA_DRAW_FRAME* frame = GetEditFrame(); + + if( frame ) + { + frame->UpdateStatusBar(); + frame->SyncMenusAndToolbars(); + } +} diff --git a/common/tool/tool_menu.cpp b/common/tool/tool_menu.cpp index fd3c4e73d6..1e4259e47f 100644 --- a/common/tool/tool_menu.cpp +++ b/common/tool/tool_menu.cpp @@ -1,7 +1,7 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2017 KiCad Developers, see CHANGELOG.txt for contributors. + * Copyright (C) 2017-2019 KiCad Developers, see CHANGELOG.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 @@ -22,12 +22,9 @@ */ #include - #include #include - #include - #include #include #include @@ -35,7 +32,7 @@ TOOL_MENU::TOOL_MENU( TOOL_INTERACTIVE& aTool ) : - m_menu( &aTool ), + m_menu( true, &aTool ), m_tool( aTool ) { } @@ -61,26 +58,22 @@ void TOOL_MENU::AddSubMenu( std::shared_ptr aSubMenu ) void TOOL_MENU::ShowContextMenu( SELECTION& aSelection ) { - m_contextMenu = std::unique_ptr( m_menu.Generate( aSelection ) ); - - if( m_contextMenu->GetMenuItemCount() > 0 ) - m_tool.SetContextMenu( m_contextMenu.get(), CMENU_NOW ); + m_menu.Evaluate( aSelection ); + m_menu.UpdateAll(); + m_menu.m_Dirty = false; + m_tool.SetContextMenu( &m_menu, CMENU_NOW ); } void TOOL_MENU::ShowContextMenu() { - SELECTION dummySelection; - - ShowContextMenu( dummySelection ); + m_menu.m_Dirty = true; + m_tool.SetContextMenu( &m_menu, CMENU_NOW ); } void TOOL_MENU::CloseContextMenu( OPT_TOOL_EVENT& evt ) { - // m_contextMenu can be null here, that's OK - if( evt->Parameter() == m_contextMenu.get() ) - m_contextMenu = nullptr; } @@ -98,7 +91,7 @@ void TOOL_MENU::AddStandardSubMenus( EDA_DRAW_FRAME* aFrame ) if( aFrame ) { - m_menu.AddMenu( createOwnSubMenu( aFrame ).get(), false, S_C::ShowAlways, 1000 ); - m_menu.AddMenu( createOwnSubMenu( aFrame ).get(), false, S_C::ShowAlways, 1000 ); + m_menu.AddMenu( createOwnSubMenu( aFrame ).get(), S_C::ShowAlways, 1000 ); + m_menu.AddMenu( createOwnSubMenu( aFrame ).get(), S_C::ShowAlways, 1000 ); } } diff --git a/eeschema/ee_hotkeys.cpp b/eeschema/ee_hotkeys.cpp index 13f452c2f8..101c36a2ce 100644 --- a/eeschema/ee_hotkeys.cpp +++ b/eeschema/ee_hotkeys.cpp @@ -121,6 +121,8 @@ static EDA_HOTKEY HkZoomOut( _HKI( "Zoom Out" ), HK_ZOOM_OUT, GR_KB_CTRL + '-', ID_KEY_ZOOM_OUT ); #endif +static EDA_HOTKEY HkSwitchUnits( _HKI( "Switch Units" ), HK_SWITCH_UNITS, 'U' + GR_KB_CTRL ); + static EDA_HOTKEY HkHelp( _HKI( "List Hotkeys" ), HK_HELP, GR_KB_CTRL + WXK_F1 ); static EDA_HOTKEY HkPreferences( _HKI( "Preferences" ), HK_PREFERENCES, GR_KB_CTRL + ',', wxID_PREFERENCES ); diff --git a/eeschema/eeschema_id.h b/eeschema/eeschema_id.h index 9415e069d6..2caa913868 100644 --- a/eeschema/eeschema_id.h +++ b/eeschema/eeschema_id.h @@ -99,30 +99,7 @@ enum id_eeschema_frm ID_SCHEMATIC_DELETE_ITEM_BUTT, ID_SCHEMATIC_VERTICAL_TOOLBAR_END, - // Schematic editor menu place IDs (equivalent to vertical toolbar IDs - // for submenus. - // On Windows we cannot use the same ID for 2 items in the same frame. - // Usually it creates issues (wxASSERTS, item not displayed, ...) - ID_SCHEMATIC_PLACE_MENU_START, - ID_MENU_PLACE_COMPONENT, - ID_MENU_PLACE_POWER_BUTT, - ID_MENU_BUS_BUTT, - ID_MENU_WIRE_BUTT, - ID_MENU_BUSTOBUS_ENTRY_BUTT, - ID_MENU_WIRETOBUS_ENTRY_BUTT, - ID_MENU_LABEL_BUTT, - ID_MENU_GLABEL_BUTT, - ID_MENU_HIERLABEL_BUTT, - ID_MENU_IMPORT_HLABEL_BUTT, - ID_MENU_SHEET_PIN_BUTT, - ID_MENU_NOCONN_BUTT, - ID_MENU_JUNCTION_BUTT, - ID_MENU_SHEET_SYMBOL_BUTT, - ID_MENU_TEXT_COMMENT_BUTT, - ID_MENU_LINE_COMMENT_BUTT, - ID_MENU_ADD_IMAGE_BUTT, ID_MENU_DELETE_ITEM_BUTT, - ID_SCHEMATIC_PLACE_MENU_END, // Toolbar options id: ID_TB_OPTIONS_HIDDEN_PINS, @@ -211,17 +188,6 @@ enum id_eeschema_frm ID_LIBEDIT_EXPORT_BODY_BUTT, ID_LIBEDIT_DELETE_ITEM_BUTT, - /* Library editor context menu IDs */ - ID_POPUP_LIBEDIT_PIN_GLOBAL_CHANGE_ITEM, - ID_POPUP_LIBEDIT_PIN_GLOBAL_CHANGE_PINSIZE_ITEM, - ID_POPUP_LIBEDIT_PIN_GLOBAL_CHANGE_PINNAMESIZE_ITEM, - ID_POPUP_LIBEDIT_PIN_GLOBAL_CHANGE_PINNUMSIZE_ITEM, - ID_POPUP_LIBEDIT_BODY_EDIT_ITEM, - ID_POPUP_LIBEDIT_DELETE_ITEM, - ID_POPUP_LIBEDIT_MODIFY_ITEM, - ID_POPUP_LIBEDIT_FIELD_EDIT_ITEM, - ID_POPUP_LIBEDIT_DELETE_CURRENT_POLY_SEGMENT, - /* Library editor toolbar options IDs */ ID_LIBEDIT_SHOW_ELECTRICAL_TYPE, ID_LIBEDIT_SHOW_HIDE_SEARCH_TREE, diff --git a/eeschema/hierarch.cpp b/eeschema/hierarch.cpp index ed5a8a4c26..ddc410b40b 100644 --- a/eeschema/hierarch.cpp +++ b/eeschema/hierarch.cpp @@ -29,17 +29,16 @@ #include #include #include - #include #include #include #include - #include #include #include #include -#include +#include +//#include #include #include @@ -130,12 +129,14 @@ private: }; -void SCH_EDIT_FRAME::InstallHierarchyFrame( wxCommandEvent& event ) +int SCH_EDITOR_CONTROL::NavigateHierarchy( const TOOL_EVENT& aEvent ) { - HIERARCHY_NAVIG_DLG* treeframe = new HIERARCHY_NAVIG_DLG( this ); + HIERARCHY_NAVIG_DLG* treeframe = new HIERARCHY_NAVIG_DLG( m_frame ); treeframe->ShowQuasiModal(); treeframe->Destroy(); + + return 0; } diff --git a/eeschema/libedit/lib_edit_frame.h b/eeschema/libedit/lib_edit_frame.h index 80a6e0c311..d669efd383 100644 --- a/eeschema/libedit/lib_edit_frame.h +++ b/eeschema/libedit/lib_edit_frame.h @@ -557,6 +557,8 @@ public: void ShowChangedLanguage() override; + void SyncMenusAndToolbars() override; + virtual void SetScreen( BASE_SCREEN* aScreen ) override; virtual const BOX2I GetDocumentExtents() const override; diff --git a/eeschema/libedit/toolbars_libedit.cpp b/eeschema/libedit/toolbars_libedit.cpp index 04cf146e8c..361ecffdcb 100644 --- a/eeschema/libedit/toolbars_libedit.cpp +++ b/eeschema/libedit/toolbars_libedit.cpp @@ -235,3 +235,14 @@ void LIB_EDIT_FRAME::ReCreateOptToolbar() m_optionsToolBar->Realize(); } + + +void LIB_EDIT_FRAME::SyncMenusAndToolbars() +{ + m_optionsToolBar->ToggleTool( ID_TB_OPTIONS_SHOW_GRID, IsGridVisible() ); + m_optionsToolBar->ToggleTool( ID_TB_OPTIONS_SELECT_UNIT_MM, GetUserUnits() != INCHES ); + m_optionsToolBar->ToggleTool( ID_TB_OPTIONS_SELECT_UNIT_INCH, GetUserUnits() == INCHES ); + + KIGFX::GAL_DISPLAY_OPTIONS& galOpts = GetGalDisplayOptions(); + m_optionsToolBar->ToggleTool( ID_TB_OPTIONS_SELECT_CURSOR, galOpts.m_fullscreenCursor ); +} diff --git a/eeschema/menubar.cpp b/eeschema/menubar.cpp index 3cb3cb3ab6..127dcc31e8 100644 --- a/eeschema/menubar.cpp +++ b/eeschema/menubar.cpp @@ -23,15 +23,14 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ -/** - * @file eeschema/menubar.cpp - * @brief (Re)Create the main menubar for the schematic frame - */ - #include #include #include +#include +#include +#include +#include #include "eeschema_id.h" #include "general.h" @@ -39,10 +38,12 @@ #include "ee_hotkeys.h" #include "sch_edit_frame.h" +class CONDITIONAL_MENU; + // helper functions that build specific submenus: // Build the place submenu -static void preparePlaceMenu( wxMenu* aParentMenu ); +static void preparePlaceMenu( CONDITIONAL_MENU* aParentMenu, EE_SELECTION_TOOL* selTool ); // Build the files menu. Because some commands are available only if // Eeschemat is run outside a project (run alone), aIsOutsideProject is false @@ -62,7 +63,7 @@ static void prepareHelpMenu( wxMenu* aParentMenu ); static void prepareEditMenu( wxMenu* aParentMenu ); // Build the view menu -static void prepareViewMenu( wxMenu* aParentMenu ); +static void prepareViewMenu( CONDITIONAL_MENU* aParentMenu, EE_SELECTION_TOOL* selTool ); // Build the preferences menu static void preparePreferencesMenu( SCH_EDIT_FRAME* aFrame, wxMenu* aParentMenu ); @@ -70,6 +71,7 @@ static void preparePreferencesMenu( SCH_EDIT_FRAME* aFrame, wxMenu* aParentMenu void SCH_EDIT_FRAME::ReCreateMenuBar() { + EE_SELECTION_TOOL* selTool = m_toolManager->GetTool(); // wxWidgets handles the Mac Application menu behind the scenes, but that means // we always have to start from scratch with a new wxMenuBar. wxMenuBar* oldMenuBar = GetMenuBar(); @@ -87,12 +89,12 @@ void SCH_EDIT_FRAME::ReCreateMenuBar() prepareEditMenu( editMenu ); // Menu View: - wxMenu* viewMenu = new wxMenu; - prepareViewMenu( viewMenu ); + CONDITIONAL_MENU* viewMenu = new CONDITIONAL_MENU( false, selTool ); + prepareViewMenu( viewMenu, selTool ); // Menu place: - wxMenu* placeMenu = new wxMenu; - preparePlaceMenu( placeMenu ); + CONDITIONAL_MENU* placeMenu = new CONDITIONAL_MENU( false, selTool ); + preparePlaceMenu( placeMenu, selTool ); // Menu Inspect: wxMenu* inspectMenu = new wxMenu; @@ -125,102 +127,60 @@ void SCH_EDIT_FRAME::ReCreateMenuBar() } -void prepareViewMenu( wxMenu* aParentMenu ) +void prepareViewMenu( CONDITIONAL_MENU* aParentMenu, EE_SELECTION_TOOL* selTool ) { - wxString text; + SCH_EDIT_FRAME* frame = static_cast( selTool->GetManager()->GetEditFrame() ); - AddMenuItem( aParentMenu, - ID_TO_LIBVIEW, - _( "Symbol Library &Browser" ), HELP_RUN_LIB_VIEWER, - KiBitmap( library_browse_xpm ) ); + auto belowRootSheetCondition = [] ( const SELECTION& aSel ) { + return g_CurrentSheet->Last() != g_RootSheet; + }; - AddMenuItem( aParentMenu, - ID_HIERARCHY, - _( "Show &Hierarchical Navigator" ), - _( "Navigate schematic hierarchy" ), - KiBitmap( hierarchy_nav_xpm ) ); + auto gridShownCondition = [ frame ] ( const SELECTION& aSel ) { + return frame->IsGridVisible(); + }; - text = AddHotkeyName( _( "&Leave Sheet" ), g_Schematic_Hotkeys_Descr, HK_LEAVE_SHEET ); - AddMenuItem( aParentMenu, - ID_SCH_LEAVE_SHEET, text, - _( "Return to parent schematic sheet" ), - KiBitmap( leave_sheet_xpm ) ); + auto imperialUnitsCondition = [ frame ] ( const SELECTION& aSel ) { + return frame->GetUserUnits() == INCHES; + }; - aParentMenu->AppendSeparator(); + auto metricUnitsCondition = [ frame ] ( const SELECTION& aSel ) { + return frame->GetUserUnits() == MILLIMETRES; + }; - /** - * Important Note for ZOOM IN and ZOOM OUT commands from menubar: - * we cannot add hotkey shortcut here, because the hotkey HK_ZOOM_IN and HK_ZOOM_OUT - * events(default = WXK_F1 and WXK_F2) are *NOT* equivalent to this menu command: - * zoom in and out from hotkeys are equivalent to the pop up menu zoom - * From here, zooming is made around the screen center - * From hotkeys, zooming is made around the mouse cursor position - * (obviously not possible from the toolbar or menubar command) - * - * in others words HK_ZOOM_IN and HK_ZOOM_OUT *are NOT* accelerators - * for Zoom in and Zoom out sub menus - * SO WE ADD THE NAME OF THE CORRESPONDING HOTKEY AS A COMMENT, NOT AS A SHORTCUT - * using in AddHotkeyName call the option "false" (not a shortcut) - */ + auto fullCrosshairCondition = [ frame ] ( const SELECTION& aSel ) { + return frame->GetGalDisplayOptions().m_fullscreenCursor; + }; - text = AddHotkeyName( _( "Zoom &In" ), g_Schematic_Hotkeys_Descr, - HK_ZOOM_IN, IS_ACCELERATOR ); // add an accelerator, not a shortcut - AddMenuItem( aParentMenu, ID_ZOOM_IN, text, HELP_ZOOM_IN, KiBitmap( zoom_in_xpm ) ); + auto hiddenPinsCondition = [ frame ] ( const SELECTION& aSel ) { + return frame->GetShowAllPins(); + }; - text = AddHotkeyName( _( "Zoom &Out" ), g_Schematic_Hotkeys_Descr, - HK_ZOOM_OUT, IS_ACCELERATOR ); // add accelerator, not a shortcut - AddMenuItem( aParentMenu, ID_ZOOM_OUT, text, HELP_ZOOM_OUT, KiBitmap( zoom_out_xpm ) ); + aParentMenu->AddItem( EE_ACTIONS::showLibraryBrowser, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( EE_ACTIONS::navigateHierarchy, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( EE_ACTIONS::leaveSheet, belowRootSheetCondition ); - text = AddHotkeyName( _( "&Zoom to Fit" ), g_Schematic_Hotkeys_Descr, HK_ZOOM_AUTO ); + aParentMenu->AddSeparator(); + aParentMenu->AddItem( ACTIONS::zoomInCenter, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( ACTIONS::zoomOutCenter, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( ACTIONS::zoomFitScreen, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( ACTIONS::zoomTool, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( ACTIONS::zoomRedraw, EE_CONDITIONS::ShowAlways ); - AddMenuItem( aParentMenu, ID_ZOOM_PAGE, text, - HELP_ZOOM_FIT, KiBitmap( zoom_fit_in_page_xpm ) ); - - text = AddHotkeyName( _( "Zoom to Selection" ), g_Eeschema_Hotkeys_Descr, HK_ZOOM_SELECTION ); - - AddMenuItem( aParentMenu, ID_ZOOM_SELECTION, text, KiBitmap( zoom_area_xpm ) ); - - text = AddHotkeyName( _( "&Redraw" ), g_Schematic_Hotkeys_Descr, HK_ZOOM_REDRAW ); - - AddMenuItem( aParentMenu, ID_ZOOM_REDRAW, text, - HELP_ZOOM_REDRAW, KiBitmap( zoom_redraw_xpm ) ); - - aParentMenu->AppendSeparator(); - - AddMenuItem( aParentMenu, ID_TB_OPTIONS_SHOW_GRID, - _( "Show &Grid" ), wxEmptyString, - KiBitmap( grid_xpm ), wxITEM_CHECK ); - - AddMenuItem( aParentMenu, ID_GRID_SETTINGS, - _( "Grid Settings..." ), wxEmptyString, - KiBitmap( grid_xpm ) ); + aParentMenu->AddSeparator(); + aParentMenu->AddCheckItem( ACTIONS::toggleGrid, gridShownCondition ); + aParentMenu->AddItem( ACTIONS::gridProperties, EE_CONDITIONS::ShowAlways ); // Units submenu - wxMenu* unitsSubMenu = new wxMenu; - AddMenuItem( unitsSubMenu, ID_TB_OPTIONS_SELECT_UNIT_INCH, - _( "&Imperial" ), _( "Use imperial units" ), - KiBitmap( unit_inch_xpm ), wxITEM_RADIO ); + CONDITIONAL_MENU* unitsSubMenu = new CONDITIONAL_MENU( false, selTool ); + unitsSubMenu->SetTitle( _( "&Units" ) ); + unitsSubMenu->AddCheckItem( ACTIONS::imperialUnits, imperialUnitsCondition ); + unitsSubMenu->AddCheckItem( ACTIONS::metricUnits, metricUnitsCondition ); + aParentMenu->AddMenu( unitsSubMenu ); - AddMenuItem( unitsSubMenu, ID_TB_OPTIONS_SELECT_UNIT_MM, - _( "&Metric" ), _( "Use metric units" ), - KiBitmap( unit_mm_xpm ), wxITEM_RADIO ); + aParentMenu->AddCheckItem( ACTIONS::toggleCursorStyle, fullCrosshairCondition ); - AddMenuItem( aParentMenu, unitsSubMenu, - -1, _( "&Units" ), - _( "Select which units are displayed" ), - KiBitmap( unit_mm_xpm ) ); - - AddMenuItem( aParentMenu, ID_TB_OPTIONS_SELECT_CURSOR, - _( "Full &Window Crosshair" ), - _( "Change cursor shape" ), - KiBitmap( cursor_shape_xpm ), wxITEM_CHECK ); - - aParentMenu->AppendSeparator(); - - AddMenuItem( aParentMenu, ID_TB_OPTIONS_HIDDEN_PINS, - _( "Show Hidden &Pins" ), - wxEmptyString, - KiBitmap( hidden_pin_xpm ), wxITEM_CHECK ); + aParentMenu->AddSeparator(); + aParentMenu->AddCheckItem( EE_ACTIONS::toggleHiddenPins, hiddenPinsCondition ); #ifdef __APPLE__ aParentMenu->AppendSeparator(); @@ -228,113 +188,29 @@ void prepareViewMenu( wxMenu* aParentMenu ) } -void preparePlaceMenu( wxMenu* aParentMenu ) +void preparePlaceMenu( CONDITIONAL_MENU* aParentMenu, EE_SELECTION_TOOL* selTool ) { - wxString text; + aParentMenu->AddItem( EE_ACTIONS::placeSymbol, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( EE_ACTIONS::placePower, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( EE_ACTIONS::drawWire, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( EE_ACTIONS::drawBus, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( EE_ACTIONS::placeBusWireEntry, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( EE_ACTIONS::placeBusBusEntry, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( EE_ACTIONS::placeNoConnect, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( EE_ACTIONS::placeJunction, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( EE_ACTIONS::placeLabel, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( EE_ACTIONS::placeGlobalLabel, EE_CONDITIONS::ShowAlways ); - text = AddHotkeyName( _( "&Symbol" ), g_Schematic_Hotkeys_Descr, - HK_ADD_NEW_COMPONENT, IS_ACCELERATOR ); // add an accelerator, not a shortcut - AddMenuItem( aParentMenu, ID_MENU_PLACE_COMPONENT, text, - HELP_PLACE_COMPONENTS, - KiBitmap( add_component_xpm ) ); + aParentMenu->AddSeparator(); + aParentMenu->AddItem( EE_ACTIONS::placeHierarchicalLabel, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( EE_ACTIONS::drawSheet, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( EE_ACTIONS::importSheetPin, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( EE_ACTIONS::placeSheetPin, EE_CONDITIONS::ShowAlways ); - text = AddHotkeyName( _( "&Power Port" ), g_Schematic_Hotkeys_Descr, - HK_ADD_NEW_POWER, IS_ACCELERATOR ); // add an accelerator, not a shortcut - AddMenuItem( aParentMenu, ID_MENU_PLACE_POWER_BUTT, text, - HELP_PLACE_POWERPORT, - KiBitmap( add_power_xpm ) ); - - text = AddHotkeyName( _( "&Wire" ), g_Schematic_Hotkeys_Descr, - HK_BEGIN_WIRE, IS_ACCELERATOR ); // add an accelerator, not a shortcut - AddMenuItem( aParentMenu, ID_MENU_WIRE_BUTT, text, - HELP_PLACE_WIRE, - KiBitmap( add_line_xpm ) ); - - text = AddHotkeyName( _( "&Bus" ), g_Schematic_Hotkeys_Descr, - HK_BEGIN_BUS, IS_ACCELERATOR ); // add an accelerator, not a shortcut - AddMenuItem( aParentMenu, ID_MENU_BUS_BUTT, text, - HELP_PLACE_BUS, - KiBitmap( add_bus_xpm ) ); - - text = AddHotkeyName( _( "Wire to Bus &Entry" ), g_Schematic_Hotkeys_Descr, - HK_ADD_WIRE_ENTRY, IS_ACCELERATOR ); // add an accelerator, not a shortcut - AddMenuItem( aParentMenu, ID_MENU_WIRETOBUS_ENTRY_BUTT, text, - HELP_PLACE_WIRE2BUS_ENTRY, - KiBitmap( add_line2bus_xpm ) ); - - text = AddHotkeyName( _( "Bus &to Bus Entry" ), g_Schematic_Hotkeys_Descr, - HK_ADD_BUS_ENTRY, IS_ACCELERATOR ); // add an accelerator, not a shortcut - AddMenuItem( aParentMenu, ID_MENU_BUSTOBUS_ENTRY_BUTT, text, - HELP_PLACE_BUS2BUS_ENTRY, - KiBitmap( add_bus2bus_xpm ) ); - - text = AddHotkeyName( _( "&No Connect Flag" ), g_Schematic_Hotkeys_Descr, - HK_ADD_NOCONN_FLAG, IS_ACCELERATOR ); // add an accelerator, not a shortcut - AddMenuItem( aParentMenu, ID_MENU_NOCONN_BUTT, text, HELP_PLACE_NC_FLAG, KiBitmap( noconn_xpm ) ); - - text = AddHotkeyName( _( "&Junction" ), g_Schematic_Hotkeys_Descr, - HK_ADD_JUNCTION, IS_ACCELERATOR ); // add an accelerator, not a shortcut - AddMenuItem( aParentMenu, ID_MENU_JUNCTION_BUTT, text, - HELP_PLACE_JUNCTION, - KiBitmap( add_junction_xpm ) ); - - text = AddHotkeyName( _( "&Label" ), g_Schematic_Hotkeys_Descr, - HK_ADD_LABEL, IS_ACCELERATOR ); // add an accelerator, not a shortcut - AddMenuItem( aParentMenu, ID_MENU_LABEL_BUTT, text, - HELP_PLACE_NETLABEL, - KiBitmap( add_line_label_xpm ) ); - - text = AddHotkeyName( _( "Gl&obal Label" ), g_Schematic_Hotkeys_Descr, - HK_ADD_GLABEL, IS_ACCELERATOR ); // add an accelerator, not a shortcut - AddMenuItem( aParentMenu, ID_MENU_GLABEL_BUTT, text, - HELP_PLACE_GLOBALLABEL, - KiBitmap( add_glabel_xpm ) ); - - aParentMenu->AppendSeparator(); - - text = AddHotkeyName( _( "&Hierarchical Label" ), g_Schematic_Hotkeys_Descr, - HK_ADD_HLABEL, IS_ACCELERATOR ); // add an accelerator, not a shortcut - AddMenuItem( aParentMenu, ID_MENU_HIERLABEL_BUTT, - text, HELP_PLACE_HIER_LABEL, - KiBitmap( add_hierarchical_label_xpm ) ); - - - text = AddHotkeyName( _( "Hierar&chical Sheet" ), g_Schematic_Hotkeys_Descr, - HK_ADD_HIER_SHEET, IS_ACCELERATOR ); // add an accelerator, not a shortcut - AddMenuItem( aParentMenu, ID_MENU_SHEET_SYMBOL_BUTT, text, - HELP_PLACE_SHEET, - KiBitmap( add_hierarchical_subsheet_xpm ) ); - - AddMenuItem( aParentMenu, - ID_MENU_IMPORT_HLABEL_BUTT, - _( "I&mport Hierarchical Label" ), - HELP_IMPORT_SHEETPIN, - KiBitmap( import_hierarchical_label_xpm ) ); - - AddMenuItem( aParentMenu, - ID_MENU_SHEET_PIN_BUTT, - _( "Hierarchical Pi&n to Sheet" ), - HELP_PLACE_SHEETPIN, - KiBitmap( add_hierar_pin_xpm ) ); - - aParentMenu->AppendSeparator(); - - text = AddHotkeyName( _( "Graphic Pol&yline" ), g_Schematic_Hotkeys_Descr, - HK_ADD_GRAPHIC_POLYLINE, IS_ACCELERATOR ); // add an accelerator, not a shortcut - AddMenuItem( aParentMenu, ID_MENU_LINE_COMMENT_BUTT, text, - HELP_PLACE_GRAPHICLINES, - KiBitmap( add_dashed_line_xpm ) ); - - text = AddHotkeyName( _( "&Graphic Text" ), g_Schematic_Hotkeys_Descr, - HK_ADD_GRAPHIC_TEXT, IS_ACCELERATOR ); // add an accelerator, not a shortcut - AddMenuItem( aParentMenu, ID_MENU_TEXT_COMMENT_BUTT, text, - HELP_PLACE_GRAPHICTEXTS, - KiBitmap( text_xpm ) ); - - // Add graphic image - AddMenuItem( aParentMenu, ID_MENU_ADD_IMAGE_BUTT, _( "&Image" ), - HELP_PLACE_GRAPHICIMAGES, - KiBitmap( image_xpm ) ); + aParentMenu->AddSeparator(); + aParentMenu->AddItem( EE_ACTIONS::drawLines, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( EE_ACTIONS::placeSchematicText, EE_CONDITIONS::ShowAlways ); + aParentMenu->AddItem( EE_ACTIONS::placeImage, EE_CONDITIONS::ShowAlways ); } diff --git a/eeschema/sch_base_frame.h b/eeschema/sch_base_frame.h index d2e35f6b3e..6367e73771 100644 --- a/eeschema/sch_base_frame.h +++ b/eeschema/sch_base_frame.h @@ -330,7 +330,6 @@ public: */ virtual void OnModify() {} -protected: /** * Open the library viewer only to browse library contents. * If the viewed is already opened from this, raise the viewer @@ -338,6 +337,7 @@ protected: */ void OnOpenLibraryViewer( wxCommandEvent& event ); +protected: /** * Saves Symbol Library Tables to disk. * diff --git a/eeschema/sch_edit_frame.cpp b/eeschema/sch_edit_frame.cpp index 003ca94535..d4e4a31969 100644 --- a/eeschema/sch_edit_frame.cpp +++ b/eeschema/sch_edit_frame.cpp @@ -242,7 +242,6 @@ BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, EDA_DRAW_FRAME ) EVT_MENU( ID_PREFERENCES_CONFIGURE_PATHS, SCH_EDIT_FRAME::OnConfigurePaths ) EVT_TOOL( ID_RUN_LIBRARY, SCH_EDIT_FRAME::OnOpenLibraryEditor ) - EVT_TOOL( ID_TO_LIBVIEW, SCH_EDIT_FRAME::OnOpenLibraryViewer ) EVT_TOOL( ID_RESCUE_CACHED, SCH_EDIT_FRAME::OnRescueProject ) EVT_MENU( ID_REMAP_SYMBOLS, SCH_EDIT_FRAME::OnRemapSymbols ) EVT_MENU( ID_EDIT_COMPONENTS_TO_SYMBOLS_LIB_ID, SCH_EDIT_FRAME::OnEditComponentSymbolsId ) @@ -253,7 +252,6 @@ BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, EDA_DRAW_FRAME ) EVT_TOOL( ID_RUN_CVPCB, SCH_EDIT_FRAME::OnOpenCvpcb ) EVT_TOOL( ID_SHEET_SET, EDA_DRAW_FRAME::Process_PageSettings ) - EVT_TOOL( ID_HIERARCHY, SCH_EDIT_FRAME::InstallHierarchyFrame ) EVT_TOOL( wxID_UNDO, SCH_EDIT_FRAME::GetSchematicFromUndoList ) EVT_TOOL( wxID_REDO, SCH_EDIT_FRAME::GetSchematicFromRedoList ) EVT_TOOL( ID_GET_ANNOTATE, SCH_EDIT_FRAME::OnAnnotate ) @@ -287,8 +285,6 @@ BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, EDA_DRAW_FRAME ) /* Handle user interface update events. */ EVT_UPDATE_UI( wxID_PASTE, SCH_EDIT_FRAME::OnUpdatePaste ) - EVT_UPDATE_UI( ID_TB_OPTIONS_HIDDEN_PINS, SCH_EDIT_FRAME::OnUpdateHiddenPins ) - EVT_UPDATE_UI( ID_TB_OPTIONS_BUS_WIRES_ORIENT, SCH_EDIT_FRAME::OnUpdateBusOrientation ) EVT_UPDATE_UI( ID_NO_TOOL_SELECTED, SCH_EDIT_FRAME::OnUpdateSelectTool ) EVT_UPDATE_UI( ID_HIGHLIGHT_BUTT, SCH_EDIT_FRAME::OnUpdateSelectTool ) EVT_UPDATE_UI( ID_ZOOM_SELECTION, SCH_EDIT_FRAME::OnUpdateSelectTool ) @@ -356,6 +352,7 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ): if( m_canvas ) m_canvas->SetEnableBlockCommands( true ); + setupTools(); ReCreateMenuBar(); ReCreateHToolbar(); ReCreateVToolbar(); @@ -378,7 +375,6 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ): m_auimgr.Update(); - setupTools(); GetToolManager()->RunAction( "common.Control.gridPreset", true, m_LastGridSizeId ); GetToolManager()->RunAction( "common.Control.zoomFitScreen", true ); @@ -765,27 +761,6 @@ void SCH_EDIT_FRAME::OnUpdatePaste( wxUpdateUIEvent& event ) } -void SCH_EDIT_FRAME::OnUpdateBusOrientation( wxUpdateUIEvent& aEvent ) -{ - wxString tool_tip = GetForceHVLines() ? - _( "Draw wires and buses in any direction" ) : - _( "Draw horizontal and vertical wires and buses only" ); - - aEvent.Check( GetForceHVLines() ); - m_optionsToolBar->SetToolShortHelp( ID_TB_OPTIONS_BUS_WIRES_ORIENT, tool_tip ); -} - - -void SCH_EDIT_FRAME::OnUpdateHiddenPins( wxUpdateUIEvent& aEvent ) -{ - wxString tool_tip = m_showAllPins ? _( "Do not show hidden pins" ) : - _( "Show hidden pins" ); - - aEvent.Check( m_showAllPins ); - m_optionsToolBar->SetToolShortHelp( ID_TB_OPTIONS_HIDDEN_PINS, tool_tip ); -} - - void SCH_EDIT_FRAME::OnUpdateSave( wxUpdateUIEvent& aEvent ) { SCH_SHEET_LIST sheetList( g_RootSheet ); diff --git a/eeschema/sch_edit_frame.h b/eeschema/sch_edit_frame.h index f7d18db348..de040a35a7 100644 --- a/eeschema/sch_edit_frame.h +++ b/eeschema/sch_edit_frame.h @@ -823,7 +823,6 @@ private: /* User interface update event handlers. */ void OnUpdatePaste( wxUpdateUIEvent& event ); - void OnUpdateHiddenPins( wxUpdateUIEvent& event ); void OnUpdateBusOrientation( wxUpdateUIEvent& event ); void OnUpdateSelectTool( wxUpdateUIEvent& aEvent ); void OnUpdateSave( wxUpdateUIEvent& aEvent ); @@ -859,9 +858,6 @@ private: */ void NormalizeSchematicOnFirstLoad( bool recalculateConnections ); - // Hierarchical Sheet & PinSheet - void InstallHierarchyFrame( wxCommandEvent& event ); - public: /** * Change a text type to another one. @@ -1196,6 +1192,8 @@ public: void ShowChangedLanguage() override; + void SyncMenusAndToolbars() override; + virtual void SetScreen( BASE_SCREEN* aScreen ) override; virtual const BOX2I GetDocumentExtents() const override; diff --git a/eeschema/toolbars_sch_editor.cpp b/eeschema/toolbars_sch_editor.cpp index eed4d30b37..51f842d84e 100644 --- a/eeschema/toolbars_sch_editor.cpp +++ b/eeschema/toolbars_sch_editor.cpp @@ -37,9 +37,9 @@ #include #include #include - +#include #include - +#include /* Create the main Horizontal Toolbar for the schematic editor */ @@ -317,15 +317,7 @@ void SCH_EDIT_FRAME::OnSelectOptionToolbar( wxCommandEvent& event ) switch( id ) { case ID_TB_OPTIONS_HIDDEN_PINS: - { - m_showAllPins = !m_showAllPins; - - auto painter = static_cast( GetCanvas()->GetView()->GetPainter() ); - painter->GetSettings()->m_ShowHiddenPins = m_showAllPins; - - GetCanvas()->GetView()->UpdateAllItems( KIGFX::REPAINT ); - GetCanvas()->Refresh(); - } + m_toolManager->RunAction( EE_ACTIONS::toggleHiddenPins, true ); break; case ID_TB_OPTIONS_BUS_WIRES_ORIENT: @@ -337,3 +329,19 @@ void SCH_EDIT_FRAME::OnSelectOptionToolbar( wxCommandEvent& event ) break; } } + + +void SCH_EDIT_FRAME::SyncMenusAndToolbars() +{ + m_optionsToolBar->ToggleTool( ID_TB_OPTIONS_SHOW_GRID, IsGridVisible() ); + m_optionsToolBar->ToggleTool( ID_TB_OPTIONS_SELECT_UNIT_MM, GetUserUnits() != INCHES ); + m_optionsToolBar->ToggleTool( ID_TB_OPTIONS_SELECT_UNIT_INCH, GetUserUnits() == INCHES ); + + KIGFX::GAL_DISPLAY_OPTIONS& galOpts = GetGalDisplayOptions(); + m_optionsToolBar->ToggleTool( ID_TB_OPTIONS_SELECT_CURSOR, galOpts.m_fullscreenCursor ); + + m_optionsToolBar->ToggleTool( ID_TB_OPTIONS_HIDDEN_PINS, GetShowAllPins() ); + m_optionsToolBar->ToggleTool( ID_TB_OPTIONS_BUS_WIRES_ORIENT, GetForceHVLines() ); + + m_optionsToolBar->Refresh(); +} diff --git a/eeschema/tools/ee_actions.cpp b/eeschema/tools/ee_actions.cpp index a3297ba444..f0213433e0 100644 --- a/eeschema/tools/ee_actions.cpp +++ b/eeschema/tools/ee_actions.cpp @@ -58,77 +58,66 @@ OPT EE_ACTIONS::TranslateLegacyId( int aId ) case ID_ZOOM_SELECTION: return ACTIONS::zoomTool.MakeEvent(); + case ID_HIERARCHY: + return EE_ACTIONS::navigateHierarchy.MakeEvent(); + + case ID_TO_LIBVIEW: + return EE_ACTIONS::showLibraryBrowser.MakeEvent(); + case ID_HIGHLIGHT_BUTT: return EE_ACTIONS::highlightNetCursor.MakeEvent(); case ID_HIGHLIGHT_NET: return EE_ACTIONS::highlightNet.MakeEvent(); - case ID_MENU_PLACE_COMPONENT: case ID_SCH_PLACE_COMPONENT: return EE_ACTIONS::placeSymbol.MakeEvent(); - case ID_MENU_PLACE_POWER_BUTT: case ID_PLACE_POWER_BUTT: return EE_ACTIONS::placePower.MakeEvent(); - case ID_MENU_WIRE_BUTT: case ID_WIRE_BUTT: return EE_ACTIONS::drawWire.MakeEvent(); - case ID_MENU_BUS_BUTT: case ID_BUS_BUTT: return EE_ACTIONS::drawBus.MakeEvent(); - case ID_MENU_NOCONN_BUTT: case ID_NOCONN_BUTT: return EE_ACTIONS::placeNoConnect.MakeEvent(); - case ID_MENU_JUNCTION_BUTT: case ID_JUNCTION_BUTT: return EE_ACTIONS::placeJunction.MakeEvent(); - case ID_MENU_WIRETOBUS_ENTRY_BUTT: case ID_WIRETOBUS_ENTRY_BUTT: return EE_ACTIONS::placeBusWireEntry.MakeEvent(); - case ID_MENU_BUSTOBUS_ENTRY_BUTT: case ID_BUSTOBUS_ENTRY_BUTT: return EE_ACTIONS::placeBusBusEntry.MakeEvent(); - case ID_MENU_LABEL_BUTT: case ID_LABEL_BUTT: return EE_ACTIONS::placeLabel.MakeEvent(); - case ID_MENU_GLABEL_BUTT: case ID_GLOBALLABEL_BUTT: return EE_ACTIONS::placeGlobalLabel.MakeEvent(); - case ID_MENU_HIERLABEL_BUTT: case ID_HIERLABEL_BUTT: return EE_ACTIONS::placeHierarchicalLabel.MakeEvent(); - case ID_MENU_SHEET_PIN_BUTT: case ID_SHEET_PIN_BUTT: return EE_ACTIONS::placeSheetPin.MakeEvent(); - case ID_MENU_IMPORT_HLABEL_BUTT: case ID_IMPORT_HLABEL_BUTT: return EE_ACTIONS::importSheetPin.MakeEvent(); - case ID_MENU_SHEET_SYMBOL_BUTT: case ID_SHEET_SYMBOL_BUTT: return EE_ACTIONS::drawSheet.MakeEvent(); - case ID_MENU_TEXT_COMMENT_BUTT: case ID_TEXT_COMMENT_BUTT: return EE_ACTIONS::placeSchematicText.MakeEvent(); - case ID_MENU_LINE_COMMENT_BUTT: case ID_LINE_COMMENT_BUTT: return EE_ACTIONS::drawLines.MakeEvent(); - case ID_MENU_ADD_IMAGE_BUTT: case ID_ADD_IMAGE_BUTT: return EE_ACTIONS::placeImage.MakeEvent(); diff --git a/eeschema/tools/ee_actions.h b/eeschema/tools/ee_actions.h index 8f805f9833..67a14aacb7 100644 --- a/eeschema/tools/ee_actions.h +++ b/eeschema/tools/ee_actions.h @@ -148,6 +148,7 @@ public: static TOOL_ACTION showDatasheet; static TOOL_ACTION showMarkerInfo; static TOOL_ACTION editWithSymbolEditor; + static TOOL_ACTION showLibraryBrowser; /// Clipboard static TOOL_ACTION cut; @@ -157,10 +158,9 @@ public: // Miscellaneous static TOOL_ACTION enterSheet; static TOOL_ACTION leaveSheet; + static TOOL_ACTION navigateHierarchy; static TOOL_ACTION cleanupSheetPins; - static TOOL_ACTION switchCursor; - static TOOL_ACTION switchUnits; - static TOOL_ACTION updateUnits; + static TOOL_ACTION toggleHiddenPins; static TOOL_ACTION symbolProperties; static TOOL_ACTION pinTable; static TOOL_ACTION deleteItemCursor; diff --git a/eeschema/tools/ee_selection_tool.cpp b/eeschema/tools/ee_selection_tool.cpp index 07579aa74d..dd81bf63e6 100644 --- a/eeschema/tools/ee_selection_tool.cpp +++ b/eeschema/tools/ee_selection_tool.cpp @@ -204,8 +204,8 @@ bool EE_SELECTION_TOOL::Init() return m_isLibEdit; }; - auto belowRootSheetCondition = [] ( const SELECTION& aSel ) { - return g_CurrentSheet->Last() != g_RootSheet; + auto belowRootSheetCondition = [this] ( const SELECTION& aSel ) { + return !m_isLibEdit && g_CurrentSheet->Last() != g_RootSheet; }; auto& menu = m_menu.GetMenu(); @@ -275,6 +275,21 @@ void EE_SELECTION_TOOL::Reset( RESET_REASON aReason ) } +int EE_SELECTION_TOOL::UpdateMenu( const TOOL_EVENT& aEvent ) +{ + CONTEXT_MENU* actionMenu = aEvent.Parameter(); + CONDITIONAL_MENU* conditionalMenu = dynamic_cast( actionMenu ); + + if( conditionalMenu ) + conditionalMenu->Evaluate( m_selection ); + + if( actionMenu ) + actionMenu->UpdateAll(); + + return 0; +} + + int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) { // Main loop: keep receiving events @@ -326,7 +341,7 @@ int EE_SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) } if( !selectionCancelled ) - m_menu.ShowContextMenu( m_selection ); + m_menu.ShowContextMenu(); } // double click? Display the properties window @@ -1140,6 +1155,8 @@ bool EE_SELECTION_TOOL::selectionContains( const VECTOR2I& aPoint ) const void EE_SELECTION_TOOL::setTransitions() { + Go( &EE_SELECTION_TOOL::UpdateMenu, ACTIONS::updateMenu.MakeEvent() ); + Go( &EE_SELECTION_TOOL::Main, EE_ACTIONS::selectionActivate.MakeEvent() ); Go( &EE_SELECTION_TOOL::SelectNode, EE_ACTIONS::selectNode.MakeEvent() ); Go( &EE_SELECTION_TOOL::SelectConnection, EE_ACTIONS::selectConnection.MakeEvent() ); diff --git a/eeschema/tools/ee_selection_tool.h b/eeschema/tools/ee_selection_tool.h index 2d54b94f2b..2815dc415a 100644 --- a/eeschema/tools/ee_selection_tool.h +++ b/eeschema/tools/ee_selection_tool.h @@ -66,6 +66,8 @@ public: /// @copydoc TOOL_BASE::Reset() void Reset( RESET_REASON aReason ) override; + int UpdateMenu( const TOOL_EVENT& aEvent ); + /** * Function Main() * diff --git a/eeschema/tools/lib_drawing_tools.cpp b/eeschema/tools/lib_drawing_tools.cpp index 63c8852adc..68a196727f 100644 --- a/eeschema/tools/lib_drawing_tools.cpp +++ b/eeschema/tools/lib_drawing_tools.cpp @@ -250,7 +250,7 @@ int LIB_DRAWING_TOOLS::doTwoClickPlace( KICAD_T aType ) if( !item ) m_toolMgr->VetoContextMenuMouseWarp(); - m_menu.ShowContextMenu( m_selectionTool->GetSelection() ); + m_menu.ShowContextMenu(); } else if( item && ( evt->IsAction( &EE_ACTIONS::refreshPreview ) || evt->IsMotion() ) ) @@ -384,7 +384,7 @@ int LIB_DRAWING_TOOLS::DrawShape( const TOOL_EVENT& aEvent ) if( !item ) m_toolMgr->VetoContextMenuMouseWarp(); - m_menu.ShowContextMenu( m_selectionTool->GetSelection() ); + m_menu.ShowContextMenu(); } // Enable autopanning and cursor capture only when there is a shape being drawn @@ -436,9 +436,7 @@ int LIB_DRAWING_TOOLS::PlaceAnchor( const TOOL_EVENT& aEvent ) } else if( evt->IsClick( BUT_RIGHT ) ) { - SELECTION emptySelection; - - m_menu.ShowContextMenu( emptySelection ); + m_menu.ShowContextMenu(); } } diff --git a/eeschema/tools/lib_move_tool.cpp b/eeschema/tools/lib_move_tool.cpp index adb1a97cc6..ae02037799 100644 --- a/eeschema/tools/lib_move_tool.cpp +++ b/eeschema/tools/lib_move_tool.cpp @@ -242,7 +242,7 @@ int LIB_MOVE_TOOL::Main( const TOOL_EVENT& aEvent ) // else if( evt->IsClick( BUT_RIGHT ) ) { - m_menu.ShowContextMenu( selection ); + m_menu.ShowContextMenu(); } //------------------------------------------------------------------------ // Handle drop diff --git a/eeschema/tools/sch_drawing_tools.cpp b/eeschema/tools/sch_drawing_tools.cpp index d2de9d0224..f5a36f5bad 100644 --- a/eeschema/tools/sch_drawing_tools.cpp +++ b/eeschema/tools/sch_drawing_tools.cpp @@ -311,7 +311,7 @@ int SCH_DRAWING_TOOLS::doPlaceComponent( SCH_COMPONENT* aComponent, SCHLIB_FILTE if( !aComponent ) m_toolMgr->VetoContextMenuMouseWarp(); - m_menu.ShowContextMenu( m_selectionTool->GetSelection() ); + m_menu.ShowContextMenu(); } else if( evt->Category() == TC_COMMAND && evt->Action() == TA_CONTEXT_MENU_CHOICE ) { @@ -445,7 +445,7 @@ int SCH_DRAWING_TOOLS::PlaceImage( const TOOL_EVENT& aEvent ) if( !image ) m_toolMgr->VetoContextMenuMouseWarp(); - m_menu.ShowContextMenu( m_selectionTool->GetSelection() ); + m_menu.ShowContextMenu(); } else if( image && ( evt->IsAction( &EE_ACTIONS::refreshPreview ) || evt->IsMotion() ) ) @@ -553,9 +553,7 @@ int SCH_DRAWING_TOOLS::doSingleClickPlace( KICAD_T aType ) } else if( evt->IsClick( BUT_RIGHT ) ) { - SELECTION emptySelection; - - m_menu.ShowContextMenu( emptySelection ); + m_menu.ShowContextMenu(); } } @@ -705,7 +703,7 @@ int SCH_DRAWING_TOOLS::doTwoClickPlace( KICAD_T aType ) if( !item ) m_toolMgr->VetoContextMenuMouseWarp(); - m_menu.ShowContextMenu( m_selectionTool->GetSelection() ); + m_menu.ShowContextMenu(); } else if( item && TOOL_EVT_UTILS::IsSelectionEvent( evt.get() ) ) { @@ -815,7 +813,7 @@ int SCH_DRAWING_TOOLS::DrawSheet( const TOOL_EVENT& aEvent ) if( !sheet ) m_toolMgr->VetoContextMenuMouseWarp(); - m_menu.ShowContextMenu( m_selectionTool->GetSelection() ); + m_menu.ShowContextMenu(); } // Enable autopanning and cursor capture only when there is a sheet to be placed diff --git a/eeschema/tools/sch_edit_tool.cpp b/eeschema/tools/sch_edit_tool.cpp index 01c12b4ceb..97e98f87ae 100644 --- a/eeschema/tools/sch_edit_tool.cpp +++ b/eeschema/tools/sch_edit_tool.cpp @@ -376,7 +376,7 @@ bool SCH_EDIT_TOOL::Init() std::shared_ptr symUnitMenu = std::make_shared(); symUnitMenu->SetTool( this ); m_menu.AddSubMenu( symUnitMenu ); - moveMenu.AddMenu( symUnitMenu.get(), false, EE_CONDITIONS::SingleMultiUnitSymbol, 1 ); + moveMenu.AddMenu( symUnitMenu.get(), EE_CONDITIONS::SingleMultiUnitSymbol, 1 ); moveMenu.AddSeparator( EE_CONDITIONS::IdleSelection ); moveMenu.AddItem( EE_ACTIONS::cut, EE_CONDITIONS::IdleSelection ); @@ -403,7 +403,7 @@ bool SCH_EDIT_TOOL::Init() std::shared_ptr symUnitMenu2 = std::make_shared(); symUnitMenu2->SetTool( drawingTools ); drawingTools->GetToolMenu().AddSubMenu( symUnitMenu2 ); - drawMenu.AddMenu( symUnitMenu2.get(), false, EE_CONDITIONS::SingleMultiUnitSymbol, 1 ); + drawMenu.AddMenu( symUnitMenu2.get(), EE_CONDITIONS::SingleMultiUnitSymbol, 1 ); drawMenu.AddItem( EE_ACTIONS::editWithSymbolEditor, singleComponentCondition && EE_CONDITIONS::Idle, 200 ); @@ -438,7 +438,7 @@ bool SCH_EDIT_TOOL::Init() std::shared_ptr symUnitMenu3 = std::make_shared(); symUnitMenu3->SetTool( m_selectionTool ); m_selectionTool->GetToolMenu().AddSubMenu( symUnitMenu3 ); - selToolMenu.AddMenu( symUnitMenu3.get(), false, EE_CONDITIONS::SingleMultiUnitSymbol, 1 ); + selToolMenu.AddMenu( symUnitMenu3.get(), EE_CONDITIONS::SingleMultiUnitSymbol, 1 ); selToolMenu.AddItem( EE_ACTIONS::editWithSymbolEditor, singleComponentCondition && EE_CONDITIONS::Idle, 200 ); diff --git a/eeschema/tools/sch_editor_control.cpp b/eeschema/tools/sch_editor_control.cpp index 2d27db79d3..40966f8b1a 100644 --- a/eeschema/tools/sch_editor_control.cpp +++ b/eeschema/tools/sch_editor_control.cpp @@ -48,6 +48,7 @@ #include #include #include +#include #include "sch_wire_bus_tool.h" TOOL_ACTION EE_ACTIONS::refreshPreview( "eeschema.EditorControl.refreshPreview", @@ -91,6 +92,11 @@ TOOL_ACTION EE_ACTIONS::editWithSymbolEditor( "eeschema.EditorControl.editWithSy _( "Edit with Symbol Editor" ), _( "Open the symbol editor to edit the symbol" ), libedit_xpm ); +TOOL_ACTION EE_ACTIONS::showLibraryBrowser( "eeschema.EditorControl.showLibraryBrowser", + AS_GLOBAL, 0, + _( "Symbol Library Browser" ), "", + library_browse_xpm ); + TOOL_ACTION EE_ACTIONS::enterSheet( "eeschema.EditorControl.enterSheet", AS_GLOBAL, 0, _( "Enter Sheet" ), _( "Display the selected sheet's contents in the Eeschema window" ), @@ -101,11 +107,21 @@ TOOL_ACTION EE_ACTIONS::leaveSheet( "eeschema.EditorControl.leaveSheet", _( "Leave Sheet" ), _( "Display the parent sheet in the Eeschema window" ), leave_sheet_xpm ); +TOOL_ACTION EE_ACTIONS::navigateHierarchy( "eeschema.EditorControl.navigateHierarchy", + AS_GLOBAL, 0, + _( "Show Hierarchy Navigator" ), "", + hierarchy_nav_xpm ); + TOOL_ACTION EE_ACTIONS::explicitCrossProbe( "eeschema.EditorControl.explicitCrossProbe", AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_SELECT_ITEMS_ON_PCB ), _( "Highlight on PCB" ), _( "Highlight corresponding items in PCBNew" ), select_same_sheet_xpm ); +TOOL_ACTION EE_ACTIONS::toggleHiddenPins( "eeschema.EditorControl.showHiddenPins", + AS_GLOBAL, 0, + _( "Show Hidden Pins" ), "", + hidden_pin_xpm ); + SCH_EDITOR_CONTROL::SCH_EDITOR_CONTROL() : EE_TOOL_BASE( "eeschema.EditorControl" ) @@ -662,6 +678,15 @@ int SCH_EDITOR_CONTROL::EditWithSymbolEditor( const TOOL_EVENT& aEvent ) } +int SCH_EDITOR_CONTROL::ShowLibraryBrowser( const TOOL_EVENT& aEvent ) +{ + wxCommandEvent dummy; + m_frame->OnOpenLibraryViewer( dummy ); + + return 0; +} + + int SCH_EDITOR_CONTROL::EnterSheet( const TOOL_EVENT& aEvent ) { EE_SELECTION_TOOL* selTool = m_toolMgr->GetTool(); @@ -689,6 +714,20 @@ int SCH_EDITOR_CONTROL::LeaveSheet( const TOOL_EVENT& aEvent ) } +int SCH_EDITOR_CONTROL::ToggleHiddenPins( const TOOL_EVENT& aEvent ) +{ + m_frame->SetShowAllPins( !m_frame->GetShowAllPins() ); + + auto painter = static_cast( getView()->GetPainter() ); + painter->GetSettings()->m_ShowHiddenPins = m_frame->GetShowAllPins(); + + getView()->UpdateAllItems( KIGFX::REPAINT ); + m_frame->GetCanvas()->Refresh(); + + return 0; +} + + void SCH_EDITOR_CONTROL::setTransitions() { /* @@ -718,7 +757,11 @@ void SCH_EDITOR_CONTROL::setTransitions() Go( &SCH_EDITOR_CONTROL::Paste, EE_ACTIONS::paste.MakeEvent() ); Go( &SCH_EDITOR_CONTROL::EditWithSymbolEditor, EE_ACTIONS::editWithSymbolEditor.MakeEvent() ); + Go( &SCH_EDITOR_CONTROL::ShowLibraryBrowser, EE_ACTIONS::showLibraryBrowser.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::ToggleHiddenPins, EE_ACTIONS::toggleHiddenPins.MakeEvent() ); } diff --git a/eeschema/tools/sch_editor_control.h b/eeschema/tools/sch_editor_control.h index bdf9149fb0..cb841c6dfc 100644 --- a/eeschema/tools/sch_editor_control.h +++ b/eeschema/tools/sch_editor_control.h @@ -75,9 +75,13 @@ public: int Paste( const TOOL_EVENT& aEvent ); int EditWithSymbolEditor( const TOOL_EVENT& aEvent ); + int ShowLibraryBrowser( const TOOL_EVENT& aEvent ); int EnterSheet( const TOOL_EVENT& aEvent ); int LeaveSheet( const TOOL_EVENT& aEvent ); + int NavigateHierarchy( const TOOL_EVENT& aEvent ); + + int ToggleHiddenPins( const TOOL_EVENT& aEvent ); private: ///> copy selection to clipboard diff --git a/eeschema/tools/sch_move_tool.cpp b/eeschema/tools/sch_move_tool.cpp index a22f0e43ce..be19fc653a 100644 --- a/eeschema/tools/sch_move_tool.cpp +++ b/eeschema/tools/sch_move_tool.cpp @@ -374,7 +374,7 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent ) // else if( evt->IsClick( BUT_RIGHT ) ) { - m_menu.ShowContextMenu( selection ); + m_menu.ShowContextMenu(); } //------------------------------------------------------------------------ // Handle drop diff --git a/eeschema/tools/sch_wire_bus_tool.cpp b/eeschema/tools/sch_wire_bus_tool.cpp index 2b076acdf1..f7c05db4c3 100644 --- a/eeschema/tools/sch_wire_bus_tool.cpp +++ b/eeschema/tools/sch_wire_bus_tool.cpp @@ -235,7 +235,7 @@ bool SCH_WIRE_BUS_TOOL::Init() std::shared_ptr busUnfoldMenu = std::make_shared(); busUnfoldMenu->SetTool( this ); m_menu.AddSubMenu( busUnfoldMenu ); - ctxMenu.AddMenu( busUnfoldMenu.get(), false, EE_CONDITIONS::Idle, 10 ); + ctxMenu.AddMenu( busUnfoldMenu.get(), EE_CONDITIONS::Idle, 10 ); ctxMenu.AddSeparator( wireOrBusTool && EE_CONDITIONS::Idle, 100 ); ctxMenu.AddItem( EE_ACTIONS::addJunction, wireOrBusTool && EE_CONDITIONS::Idle, 100 ); @@ -257,7 +257,7 @@ bool SCH_WIRE_BUS_TOOL::Init() std::shared_ptr selBusUnfoldMenu = std::make_shared(); selBusUnfoldMenu->SetTool( m_selectionTool ); m_selectionTool->GetToolMenu().AddSubMenu( selBusUnfoldMenu ); - selToolMenu.AddMenu( selBusUnfoldMenu.get(), false, busSelection && EE_CONDITIONS::Idle, 100 ); + selToolMenu.AddMenu( selBusUnfoldMenu.get(), busSelection && EE_CONDITIONS::Idle, 100 ); return true; } @@ -764,7 +764,7 @@ int SCH_WIRE_BUS_TOOL::doDrawSegments( int aType, SCH_LINE* aSegment ) if( !aSegment ) m_toolMgr->VetoContextMenuMouseWarp(); - m_menu.ShowContextMenu( m_selectionTool->GetSelection() ); + m_menu.ShowContextMenu(); } else if( evt->Category() == TC_COMMAND && evt->Action() == TA_CONTEXT_MENU_CHOICE ) { diff --git a/gerbview/hotkeys.h b/gerbview/hotkeys.h index 3b6d6ec003..ba8e52582b 100644 --- a/gerbview/hotkeys.h +++ b/gerbview/hotkeys.h @@ -35,8 +35,7 @@ // see also enum common_hotkey_id_command in hotkeys_basic.h // for shared hotkeys id enum hotkey_id_command { - HK_SWITCH_UNITS = HK_COMMON_END, - HK_GBR_LINES_DISPLAY_MODE, + HK_GBR_LINES_DISPLAY_MODE = HK_COMMON_END, HK_GBR_FLASHED_DISPLAY_MODE, HK_GBR_POLYGON_DISPLAY_MODE, HK_GBR_NEGATIVE_DISPLAY_ONOFF, diff --git a/gerbview/tools/gerbview_selection_tool.cpp b/gerbview/tools/gerbview_selection_tool.cpp index 62c41f0a14..f8cb16fdb3 100644 --- a/gerbview/tools/gerbview_selection_tool.cpp +++ b/gerbview/tools/gerbview_selection_tool.cpp @@ -163,7 +163,7 @@ bool GERBVIEW_SELECTION_TOOL::Init() auto& menu = m_menu.GetMenu(); - menu.AddMenu( selectMenu.get(), false ); + menu.AddMenu( selectMenu.get() ); menu.AddSeparator( SELECTION_CONDITIONS::ShowAlways, 1000 ); m_menu.AddStandardSubMenus( getEditFrame() ); diff --git a/include/draw_frame.h b/include/draw_frame.h index d103e0202f..c0b7ee0de3 100644 --- a/include/draw_frame.h +++ b/include/draw_frame.h @@ -947,7 +947,7 @@ public: * Update the toolbars and menus (mostly settings/check buttons/checkboxes) * with the current controller state */ - virtual void SyncMenusAndToolbars( wxEvent& aEvent ) {}; + virtual void SyncMenusAndToolbars() {}; bool GetShowAxis() const { return m_showAxis; } bool GetShowGridAxis() const { return m_showGridAxis; } diff --git a/include/hotkeys_basic.h b/include/hotkeys_basic.h index 6257179bcf..a40ec0ff1b 100644 --- a/include/hotkeys_basic.h +++ b/include/hotkeys_basic.h @@ -277,6 +277,7 @@ enum common_hotkey_id_command { HK_SWITCH_GRID_TO_FASTGRID2, HK_SWITCH_GRID_TO_NEXT, HK_SWITCH_GRID_TO_PREVIOUS, + HK_SWITCH_UNITS, HK_HELP, HK_ZOOM_IN, HK_ZOOM_OUT, diff --git a/include/tool/actions.h b/include/tool/actions.h index 765cabfc0f..e4ff6dda94 100644 --- a/include/tool/actions.h +++ b/include/tool/actions.h @@ -46,6 +46,7 @@ public: // Generic actions static TOOL_ACTION cancelInteractive; + static TOOL_ACTION updateMenu; // View controls static TOOL_ACTION zoomRedraw; @@ -58,6 +59,8 @@ public: static TOOL_ACTION zoomPreset; static TOOL_ACTION zoomTool; static TOOL_ACTION centerContents; + static TOOL_ACTION toggleCursor; + static TOOL_ACTION toggleCursorStyle; /// Cursor control with keyboard static TOOL_ACTION cursorUp; @@ -87,6 +90,13 @@ public: static TOOL_ACTION gridSetOrigin; static TOOL_ACTION gridResetOrigin; static TOOL_ACTION gridPreset; + static TOOL_ACTION toggleGrid; + static TOOL_ACTION gridProperties; + + // Units + static TOOL_ACTION imperialUnits; + static TOOL_ACTION metricUnits; + static TOOL_ACTION toggleUnits; /** * Function TranslateLegacyId() diff --git a/include/tool/common_tools.h b/include/tool/common_tools.h index 826df337ce..2cb7d1a419 100644 --- a/include/tool/common_tools.h +++ b/include/tool/common_tools.h @@ -59,11 +59,18 @@ public: // Cursor control int CursorControl( const TOOL_EVENT& aEvent ); int ToggleCursor( const TOOL_EVENT& aEvent ); + int ToggleCursorStyle( const TOOL_EVENT& aEvent ); + + // Units control + int ImperialUnits( const TOOL_EVENT& aEvent ); + int MetricUnits( const TOOL_EVENT& aEvent ); + int ToggleUnits( const TOOL_EVENT& aEvent ); // Grid control int GridNext( const TOOL_EVENT& aEvent ); int GridPrev( const TOOL_EVENT& aEvent ); int GridPreset( const TOOL_EVENT& aEvent ); + int ToggleGrid( const TOOL_EVENT& aEvent ); ///> Sets up handlers for various events. void setTransitions() override; diff --git a/include/tool/conditional_menu.h b/include/tool/conditional_menu.h index 868c9a2c63..4ccca98cb4 100644 --- a/include/tool/conditional_menu.h +++ b/include/tool/conditional_menu.h @@ -25,24 +25,31 @@ #ifndef CONDITIONAL_MENU_H #define CONDITIONAL_MENU_H -#include "selection_conditions.h" +#include +#include #include #include + class SELECTION_TOOL; class TOOL_ACTION; class TOOL_INTERACTIVE; -class CONTEXT_MENU; -class CONDITIONAL_MENU + +class CONDITIONAL_MENU : public CONTEXT_MENU { public: ///> Constant to indicate that we do not care about an ENTRY location in the menu. static const int ANY_ORDER = -1; - CONDITIONAL_MENU( TOOL_INTERACTIVE* aTool ) : - m_tool( aTool ) - {} + + CONDITIONAL_MENU( bool isContextMenu, TOOL_INTERACTIVE* aTool ) : + m_isContextMenu( isContextMenu ) + { + m_tool = aTool; + } + + CONTEXT_MENU* create() const override; /** * Function AddItem() @@ -53,10 +60,21 @@ public: * @param aOrder determines location of the added item, higher numbers are put on the bottom. * You may use ANY_ORDER here if you think it does not matter. */ - void AddItem( const TOOL_ACTION& aAction, - const SELECTION_CONDITION& aCondition = SELECTION_CONDITIONS::ShowAlways, + void AddItem( const TOOL_ACTION& aAction, const SELECTION_CONDITION& aCondition, int aOrder = ANY_ORDER ); + /** + * Function AddCheckItem() + * + * Adds a checked menu entry to run a TOOL_ACTION on selected items. + * @param aAction is a menu entry to be added. + * @param aCondition is a condition that has to be fulfilled to check the menu entry. + * @param aOrder determines location of the added item, higher numbers are put on the bottom. + * You may use ANY_ORDER here if you think it does not matter. + */ + void AddCheckItem( const TOOL_ACTION& aAction, const SELECTION_CONDITION& aCondition, + int aOrder = ANY_ORDER ); + /** * Function AddMenu() * @@ -69,7 +87,7 @@ public: * @param aOrder determines location of the added menu, higher numbers are put on the bottom. * You may use ANY_ORDER here if you think it does not matter. */ - void AddMenu( CONTEXT_MENU* aMenu, bool aExpand = false, + void AddMenu( CONTEXT_MENU* aMenu, const SELECTION_CONDITION& aCondition = SELECTION_CONDITIONS::ShowAlways, int aOrder = ANY_ORDER ); @@ -85,55 +103,49 @@ public: int aOrder = ANY_ORDER ); /** - * Function Generate() + * Function Evaluate() * - * Generates a context menu that contains only entries that are satisfying assigned conditions. - * @param aSelection is selection for which the conditions are checked against. - * @return Menu filtered by the entry conditions. + * Updates the contents of the menu based on the supplied conditions. */ - CONTEXT_MENU* Generate( SELECTION& aSelection ); + void Evaluate( SELECTION& aSelection ); private: ///> Helper class to organize menu entries. class ENTRY { public: - ENTRY( const TOOL_ACTION* aAction, - const SELECTION_CONDITION& aCondition = SELECTION_CONDITIONS::ShowAlways, - int aOrder = ANY_ORDER ) : - m_type( ACTION ), m_condition( aCondition ), m_order( aOrder ), m_expand( false ) + ENTRY( const TOOL_ACTION* aAction, SELECTION_CONDITION aCondition, int aOrder, + bool aCheckmark ) : + m_type( ACTION ), + m_condition( aCondition ), + m_order( aOrder ), + m_isCheckmarkEntry( aCheckmark ) { m_data.action = aAction; } - ENTRY( CONTEXT_MENU* aMenu, bool aExpand = false, - const SELECTION_CONDITION& aCondition = SELECTION_CONDITIONS::ShowAlways, - int aOrder = ANY_ORDER ) : - m_type( MENU ), m_condition( aCondition ), m_order( aOrder ), m_expand( aExpand ) + ENTRY( CONTEXT_MENU* aMenu, SELECTION_CONDITION aCondition, int aOrder ) : + m_type( MENU ), + m_condition( aCondition ), + m_order( aOrder ), + m_isCheckmarkEntry( false ) { m_data.menu = aMenu; } - ENTRY( wxMenuItem* aItem, const SELECTION_CONDITION& aCondition = SELECTION_CONDITIONS::ShowAlways, - int aOrder = ANY_ORDER ) : - m_type( WXITEM ), m_condition( aCondition ), m_order( aOrder ), m_expand( false ) - { - m_data.wxItem = aItem; - } - // Separator - ENTRY( const SELECTION_CONDITION& aCondition = SELECTION_CONDITIONS::ShowAlways, - int aOrder = ANY_ORDER ) : - m_type( SEPARATOR ), m_condition( aCondition ), m_order( aOrder ), m_expand( false ) + ENTRY( SELECTION_CONDITION aCondition, int aOrder ) : + m_type( SEPARATOR ), + m_condition( aCondition ), + m_order( aOrder ), + m_isCheckmarkEntry( false ) { - m_data.wxItem = NULL; } ///> Possible entry types. enum ENTRY_TYPE { ACTION, MENU, - WXITEM, SEPARATOR }; @@ -154,16 +166,9 @@ private: return m_data.menu; } - inline wxMenuItem* wxItem() const + inline bool IsCheckmarkEntry() const { - assert( m_type == WXITEM ); - return m_data.wxItem; - } - - inline bool Expand() const - { - assert( m_type == MENU ); - return m_expand; + return m_isCheckmarkEntry; } inline const SELECTION_CONDITION& Condition() const @@ -187,7 +192,6 @@ private: union { const TOOL_ACTION* action; CONTEXT_MENU* menu; - wxMenuItem* wxItem; } m_data; ///> Condition to be fulfilled to show the entry in menu. @@ -196,18 +200,18 @@ private: ///> Order number, the higher the number the lower position it takes it is in the menu. int m_order; - ///> CONTEXT_MENU expand flag - bool m_expand; + bool m_isCheckmarkEntry; }; ///> Inserts the entry, preserving the requested order. void addEntry( ENTRY aEntry ); + ///> Context menus include only items that resolve to true; + ///> Regular menus enable only menu items that resolve to true. + bool m_isContextMenu; + ///> List of all menu entries. std::list m_entries; - - ///> tool owning the menu - TOOL_INTERACTIVE* m_tool; }; #endif /* CONDITIONAL_MENU_H */ diff --git a/include/tool/context_menu.h b/include/tool/context_menu.h index d9dae24a10..4ce761e827 100644 --- a/include/tool/context_menu.h +++ b/include/tool/context_menu.h @@ -89,17 +89,15 @@ public: * a TOOL_EVENT command containing name of the action is sent. * @param aAction is the action to be added to menu entry. */ - wxMenuItem* Add( const TOOL_ACTION& aAction ); + wxMenuItem* Add( const TOOL_ACTION& aAction, bool aIsCheckmarkEntry = false ); /** * Function Add() * Adds a context menu as a submenu. The difference between this function and wxMenu::AppendSubMenu() * is the capability to handle icons. * @param aMenu is the submenu to be added. - * @param aExpand allows one to add all entries from the menu as individual - * entries rather than add everything as a submenu. */ - std::list Add( CONTEXT_MENU* aMenu, bool aExpand = false ); + wxMenuItem* Add( CONTEXT_MENU* aMenu ); /** * Function Clear() @@ -144,6 +142,10 @@ public: */ CONTEXT_MENU* Clone() const; +public: + ///> Menu requires updating before display. + bool m_Dirty; + protected: ///> Returns an instance of this class. It has to be overridden in inheriting classes. virtual CONTEXT_MENU* create() const; @@ -180,7 +182,7 @@ protected: */ void copyFrom( const CONTEXT_MENU& aMenu ); -private: +protected: /** * Function appendCopy * Appends a copy of wxMenuItem. @@ -219,7 +221,7 @@ private: TOOL_INTERACTIVE* m_tool; ///> Menu items with ID higher than that are considered TOOL_ACTIONs - static const int ACTION_ID = 2000; + static const int ACTION_ID = 10000; ///> Associates tool actions with menu item IDs. Non-owning. std::map m_toolActions; diff --git a/include/tool/tool_action.h b/include/tool/tool_action.h index 81d9ba2c17..84796f15a2 100644 --- a/include/tool/tool_action.h +++ b/include/tool/tool_action.h @@ -87,19 +87,10 @@ public: return m_id; } - /** - * Function HasHotKey() - * Checks if the action has a hot key assigned. - * - * @return True if there is a hot key assigned, false otherwise. - */ - /** * Function MakeEvent() * Returns the event associated with the action (i.e. the event that will be sent after * activating the action). - * - * @return The event associated with the action. */ TOOL_EVENT MakeEvent() const { diff --git a/include/tool/tool_dispatcher.h b/include/tool/tool_dispatcher.h index df02563768..b1249304cb 100644 --- a/include/tool/tool_dispatcher.h +++ b/include/tool/tool_dispatcher.h @@ -115,9 +115,6 @@ private: return mods; } - ///> Redraws the status bar and message panel, synchronizes menus and toolbars. - void updateUI( wxEvent& aEvent ); - ///> Stores all the informations regarding a mouse button state. struct BUTTON_STATE; diff --git a/include/tool/tool_event.h b/include/tool/tool_event.h index b2134e61bb..84cbbc1ba6 100644 --- a/include/tool/tool_event.h +++ b/include/tool/tool_event.h @@ -244,7 +244,7 @@ public: ///> Returns if it this event has a valid position (true for mouse events) bool HasPosition() const { - return m_category == TC_MOUSE; + return m_category == TC_MOUSE || m_category == TC_COMMAND; } ///> Returns information about difference between current mouse cursor position and the place @@ -434,7 +434,7 @@ private: /** * Ensure that the event is a type that has a position before returning a - * position, otherwise return a mull-constructed position. + * position, otherwise return a null-constructed position. * Used to defend the position accessors from runtime access when the event * does not have a valid position. * diff --git a/include/tool/tool_manager.h b/include/tool/tool_manager.h index 3c529dbd00..eef38c8d1d 100644 --- a/include/tool/tool_manager.h +++ b/include/tool/tool_manager.h @@ -246,7 +246,7 @@ public: * when the board is set up. */ void SetEnvironment( EDA_ITEM* aModel, KIGFX::VIEW* aView, - KIGFX::VIEW_CONTROLS* aViewControls, wxWindow* aFrame ); + KIGFX::VIEW_CONTROLS* aViewControls, EDA_DRAW_FRAME* aFrame ); /* Accessors for the environment objects (view, model, etc.) */ KIGFX::VIEW* GetView() const @@ -264,7 +264,7 @@ public: return m_model; } - inline wxWindow* GetEditFrame() const + inline EDA_DRAW_FRAME* GetEditFrame() const { return m_editFrame; } @@ -324,6 +324,11 @@ public: void RunMainStack( TOOL_BASE* aTool, std::function aFunc ); + /** + * Synchronizes toolbars. + */ + void UpdateUI(); + /** * Pauses execution of a given tool until one or more events matching aConditions arrives. * The pause/resume operation is done through COROUTINE object. @@ -531,7 +536,7 @@ private: EDA_ITEM* m_model; KIGFX::VIEW* m_view; KIGFX::VIEW_CONTROLS* m_viewControls; - wxWindow* m_editFrame; + EDA_DRAW_FRAME* m_editFrame; /// Queue that stores events to be processed at the end of the event processing cycle. std::list m_eventQueue; diff --git a/include/tool/tool_menu.h b/include/tool/tool_menu.h index 5cfe088989..1e48e0be87 100644 --- a/include/tool/tool_menu.h +++ b/include/tool/tool_menu.h @@ -150,15 +150,10 @@ private: } /** - * The conditional model of the menu displayed by the tool + * The conditional menu displayed by the tool */ CONDITIONAL_MENU m_menu; - /** - * The actual menu displayed by the tool - */ - std::unique_ptr m_contextMenu; - /** * The tool that owns this menu */ diff --git a/pagelayout_editor/hotkeys.h b/pagelayout_editor/hotkeys.h index 404051eb19..ba0f48f3f2 100644 --- a/pagelayout_editor/hotkeys.h +++ b/pagelayout_editor/hotkeys.h @@ -35,8 +35,7 @@ // see also enum common_hotkey_id_command in hotkeys_basic.h // for shared hotkeys id enum hotkey_id_command { - HK_SWITCH_UNITS = HK_COMMON_END, - HK_MOVE_ITEM, + HK_MOVE_ITEM = HK_COMMON_END, HK_MOVE_START_POINT, HK_MOVE_END_POINT, HK_PLACE_ITEM, diff --git a/pcbnew/hotkeys.h b/pcbnew/hotkeys.h index cda79b37b5..0526ded1b1 100644 --- a/pcbnew/hotkeys.h +++ b/pcbnew/hotkeys.h @@ -64,7 +64,6 @@ enum hotkey_id_command { HK_ADD_MICROVIA, HK_SWITCH_TRACK_POSTURE, HK_DRAG_TRACK_KEEP_SLOPE, - HK_SWITCH_UNITS, HK_SWITCH_TRACK_DISPLAY_MODE, HK_3D_VIEWER, HK_FIND_ITEM, diff --git a/pcbnew/pcb_edit_frame.h b/pcbnew/pcb_edit_frame.h index 80cbc33480..f471a0095f 100644 --- a/pcbnew/pcb_edit_frame.h +++ b/pcbnew/pcb_edit_frame.h @@ -1733,7 +1733,7 @@ public: */ void CommonSettingsChanged() override; - void SyncMenusAndToolbars( wxEvent& aEvent ) override; + void SyncMenusAndToolbars() override; DECLARE_EVENT_TABLE() }; diff --git a/pcbnew/toolbars_update_user_interface.cpp b/pcbnew/toolbars_update_user_interface.cpp index 50278d4634..f401c2f59c 100644 --- a/pcbnew/toolbars_update_user_interface.cpp +++ b/pcbnew/toolbars_update_user_interface.cpp @@ -188,10 +188,10 @@ void PCB_EDIT_FRAME::OnUpdateMuWaveToolbar( wxUpdateUIEvent& aEvent ) } -void PCB_EDIT_FRAME::SyncMenusAndToolbars( wxEvent& aEvent ) +void PCB_EDIT_FRAME::SyncMenusAndToolbars() { - auto displOpts = (PCB_DISPLAY_OPTIONS*)GetDisplayOptions(); - auto menuBar = GetMenuBar(); + PCB_DISPLAY_OPTIONS* displOpts = (PCB_DISPLAY_OPTIONS*) GetDisplayOptions(); + wxMenuBar* menuBar = GetMenuBar(); m_optionsToolBar->ToggleTool( ID_TB_OPTIONS_SHOW_ZONES, false ); m_optionsToolBar->ToggleTool( ID_TB_OPTIONS_SHOW_ZONES_DISABLE, false ); diff --git a/pcbnew/tools/pad_tool.cpp b/pcbnew/tools/pad_tool.cpp index 9a4e413ec5..af289f2f7f 100644 --- a/pcbnew/tools/pad_tool.cpp +++ b/pcbnew/tools/pad_tool.cpp @@ -191,7 +191,7 @@ bool PAD_TOOL::Init() ( SELECTION_CONDITIONS::HasType( PCB_PAD_T ) || SELECTION_CONDITIONS::Count( 0 ) ); - menu.AddMenu( contextMenu.get(), false, showCond, 1000 ); + menu.AddMenu( contextMenu.get(), showCond, 1000 ); // we need a separator only when the selection is empty auto separatorCond = canShowMenuCond && SELECTION_CONDITIONS::Count( 0 ); diff --git a/pcbnew/tools/pcb_editor_control.cpp b/pcbnew/tools/pcb_editor_control.cpp index 24be9be775..d2e330a704 100644 --- a/pcbnew/tools/pcb_editor_control.cpp +++ b/pcbnew/tools/pcb_editor_control.cpp @@ -312,11 +312,8 @@ bool PCB_EDITOR_CONTROL::Init() toolMenu.AddSubMenu( zoneMenu ); toolMenu.AddSubMenu( lockMenu ); - menu.AddMenu( zoneMenu.get(), false, - SELECTION_CONDITIONS::OnlyType( PCB_ZONE_AREA_T ), 200 ); - - menu.AddMenu( lockMenu.get(), false, - SELECTION_CONDITIONS::OnlyTypes( GENERAL_COLLECTOR::LockableItems ), 200 ); + menu.AddMenu( zoneMenu.get(), SELECTION_CONDITIONS::OnlyType( PCB_ZONE_AREA_T ), 200 ); + menu.AddMenu( lockMenu.get(), SELECTION_CONDITIONS::OnlyTypes( GENERAL_COLLECTOR::LockableItems ), 200 ); } DRAWING_TOOL* drawingTool = m_toolMgr->GetTool(); @@ -338,7 +335,7 @@ bool PCB_EDITOR_CONTROL::Init() }; }; - menu.AddMenu( zoneMenu.get(), false, toolActiveFunctor( DRAWING_TOOL::MODE::ZONE ), 200 ); + menu.AddMenu( zoneMenu.get(), toolActiveFunctor( DRAWING_TOOL::MODE::ZONE ), 200 ); } m_ratsnestTimer.SetOwner( this ); @@ -508,7 +505,7 @@ int PCB_EDITOR_CONTROL::PlaceModule( const TOOL_EVENT& aEvent ) else if( evt->IsClick( BUT_RIGHT ) ) { - m_menu.ShowContextMenu( selTool->GetSelection() ); + m_menu.ShowContextMenu(); } else if( module && evt->IsMotion() ) @@ -664,7 +661,7 @@ int PCB_EDITOR_CONTROL::PlaceTarget( const TOOL_EVENT& aEvent ) else if( evt->IsClick( BUT_RIGHT ) ) { - m_menu.ShowContextMenu( selTool->GetSelection() ); + m_menu.ShowContextMenu(); } else if( evt->IsMotion() ) diff --git a/pcbnew/tools/placement_tool.cpp b/pcbnew/tools/placement_tool.cpp index 5267bd7885..f96e5ecbd9 100644 --- a/pcbnew/tools/placement_tool.cpp +++ b/pcbnew/tools/placement_tool.cpp @@ -94,13 +94,9 @@ ALIGN_DISTRIBUTE_TOOL::~ALIGN_DISTRIBUTE_TOOL() bool ALIGN_DISTRIBUTE_TOOL::Init() { // Find the selection tool, so they can cooperate - m_selectionTool = static_cast( m_toolMgr->FindTool( "pcbnew.InteractiveSelection" ) ); + m_selectionTool = m_toolMgr->GetTool(); - if( !m_selectionTool ) - { - DisplayError( NULL, _( "pcbnew.InteractiveSelection tool is not available" ) ); - return false; - } + wxASSERT_MSG( m_selectionTool, _( "pcbnew.InteractiveSelection tool is not available" ) ); m_frame = getEditFrame(); @@ -120,8 +116,8 @@ bool ALIGN_DISTRIBUTE_TOOL::Init() m_placementMenu->Add( PCB_ACTIONS::distributeHorizontally ); m_placementMenu->Add( PCB_ACTIONS::distributeVertically ); - m_selectionTool->GetToolMenu().GetMenu().AddMenu( m_placementMenu, false, - SELECTION_CONDITIONS::MoreThan( 1 ) ); + CONDITIONAL_MENU& selToolMenu = m_selectionTool->GetToolMenu().GetMenu(); + selToolMenu.AddMenu( m_placementMenu, SELECTION_CONDITIONS::MoreThan( 1 ) ); return true; } diff --git a/pcbnew/tools/selection_tool.cpp b/pcbnew/tools/selection_tool.cpp index bd612ae2be..fad2032078 100644 --- a/pcbnew/tools/selection_tool.cpp +++ b/pcbnew/tools/selection_tool.cpp @@ -229,7 +229,7 @@ bool SELECTION_TOOL::Init() auto& menu = m_menu.GetMenu(); - menu.AddMenu( selectMenu.get(), false, SELECTION_CONDITIONS::NotEmpty ); + menu.AddMenu( selectMenu.get(), SELECTION_CONDITIONS::NotEmpty ); menu.AddSeparator( SELECTION_CONDITIONS::NotEmpty, 1000 ); if( frame ) @@ -310,7 +310,7 @@ int SELECTION_TOOL::Main( const TOOL_EVENT& aEvent ) } if( !selectionCancelled ) - m_menu.ShowContextMenu( m_selection ); + m_menu.ShowContextMenu(); } // double click? Display the properties window