More modern toolset context menu work.

Text/label type changes and bus entry shape changes.  And some
context menu bug fixing.
This commit is contained in:
Jeff Young 2019-04-29 18:50:46 +01:00
parent ddbd92c274
commit 902be18a04
22 changed files with 382 additions and 478 deletions

View File

@ -28,7 +28,7 @@
#include <tool/tool_event.h> #include <tool/tool_event.h>
#include <tool/tool_action.h> #include <tool/tool_action.h>
#include <tool/tool_manager.h> #include <tool/tool_manager.h>
#include <tool/actions.h>
struct FlagString struct FlagString
{ {
@ -160,3 +160,21 @@ const std::string TOOL_EVENT_LIST::Format() const
return s; return s;
} }
bool TOOL_EVT_UTILS::IsCancelInteractive( const TOOL_EVENT& aEvt )
{
return aEvt.IsAction( &ACTIONS::cancelInteractive )
|| aEvt.IsActivate()
|| aEvt.IsCancel();
}
bool TOOL_EVT_UTILS::IsSelectionEvent( const TOOL_EVENT& aEvt )
{
return aEvt.Matches( EVENTS::ClearedEvent )
|| aEvt.Matches( EVENTS::UnselectedEvent )
|| aEvt.Matches( EVENTS::SelectedEvent );
}

View File

@ -61,14 +61,11 @@ void TOOL_MENU::AddSubMenu( std::shared_ptr<CONTEXT_MENU> aSubMenu )
void TOOL_MENU::ShowContextMenu( SELECTION& aSelection ) void TOOL_MENU::ShowContextMenu( SELECTION& aSelection )
{ {
m_contextMenu = std::unique_ptr<CONTEXT_MENU>( m_contextMenu = std::unique_ptr<CONTEXT_MENU>( m_menu.Generate( aSelection ) );
m_menu.Generate( aSelection ) );
if( m_contextMenu->GetMenuItemCount() > 0 ) if( m_contextMenu->GetMenuItemCount() > 0 )
{
m_tool.SetContextMenu( m_contextMenu.get(), CMENU_NOW ); m_tool.SetContextMenu( m_contextMenu.get(), CMENU_NOW );
} }
}
void TOOL_MENU::ShowContextMenu() void TOOL_MENU::ShowContextMenu()
@ -83,10 +80,8 @@ void TOOL_MENU::CloseContextMenu( OPT_TOOL_EVENT& evt )
{ {
// m_contextMenu can be null here, that's OK // m_contextMenu can be null here, that's OK
if( evt->Parameter<CONTEXT_MENU*>() == m_contextMenu.get() ) if( evt->Parameter<CONTEXT_MENU*>() == m_contextMenu.get() )
{
m_contextMenu = nullptr; m_contextMenu = nullptr;
} }
}
// This makes the factory functions a bit less verbose // This makes the factory functions a bit less verbose

View File

@ -142,7 +142,6 @@ set( EESCHEMA_SRCS
block.cpp block.cpp
bus_alias.cpp bus_alias.cpp
bus-wire-junction.cpp bus-wire-junction.cpp
busentry.cpp
class_libentry.cpp class_libentry.cpp
class_library.cpp class_library.cpp
cmp_library_keywords.cpp cmp_library_keywords.cpp

View File

@ -452,23 +452,3 @@ SCH_JUNCTION* SCH_EDIT_FRAME::AddJunction( const wxPoint& aPosition, bool aAppen
} }
SCH_NO_CONNECT* SCH_EDIT_FRAME::AddNoConnect( const wxPoint& aPosition )
{
SCH_NO_CONNECT* no_connect = new SCH_NO_CONNECT( aPosition );
SetRepeatItem( no_connect );
AddToScreen( no_connect );
SchematicCleanUp();
TestDanglingEnds();
OnModify();
auto view = GetCanvas()->GetView();
view->ClearPreview();
view->ShowPreview( false );
view->ClearHiddenFlags();
SaveCopyInUndoList( no_connect, UR_NEW );
return no_connect;
}

View File

@ -1,82 +0,0 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2008-2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 2004-2011 KiCad Developers, see change_log.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
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file busentry.cpp
* @brief Code to handle manipulation of bus entry objects.
*/
#include <fctsys.h>
#include <gr_basic.h>
#include <sch_draw_panel.h>
#include <sch_edit_frame.h>
#include <sch_bus_entry.h>
static int s_LastShape = '\\';
SCH_BUS_BUS_ENTRY* SCH_EDIT_FRAME::CreateBusBusEntry()
{
// Create and place a new bus entry at cursor position
SCH_BUS_BUS_ENTRY* busEntry = new SCH_BUS_BUS_ENTRY( GetCrossHairPosition(), s_LastShape );
busEntry->SetFlags( IS_NEW );
GetScreen()->SetCurItem( busEntry );
AddItemToScreen( busEntry );
return busEntry;
}
SCH_BUS_WIRE_ENTRY* SCH_EDIT_FRAME::CreateBusWireEntry()
{
// Create and place a new bus entry at cursor position
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( GetCrossHairPosition(), s_LastShape );
busEntry->SetFlags( IS_NEW );
GetScreen()->SetCurItem( busEntry );
AddItemToScreen( busEntry );
return busEntry;
}
/* set the shape of BusEntry (shape = / or \ )
*/
void SCH_EDIT_FRAME::SetBusEntryShape( wxDC* DC, SCH_BUS_ENTRY_BASE* BusEntry, char entry_shape )
{
if( BusEntry == NULL )
return;
/* Put old item in undo list if it is not currently in edit */
if( BusEntry->GetEditFlags() == 0 )
SaveCopyInUndoList( BusEntry, UR_CHANGED );
s_LastShape = entry_shape == '/' ? '/' : '\\';
BusEntry->SetBusEntryShape( s_LastShape );
TestDanglingEnds();
RefreshItem( BusEntry );
OnModify( );
}

View File

@ -22,11 +22,6 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
/**
* @file edit_label.cpp
* @brief Label, global label and text creation and editing.
*/
#include <fctsys.h> #include <fctsys.h>
#include <gr_basic.h> #include <gr_basic.h>
#include <base_struct.h> #include <base_struct.h>
@ -35,10 +30,12 @@
#include <confirm.h> #include <confirm.h>
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <kicad_device_context.h> #include <kicad_device_context.h>
#include <tool/tool_manager.h>
#include <tools/sch_actions.h>
#include <general.h> #include <general.h>
#include <sch_text.h> #include <sch_text.h>
#include <eeschema_id.h> #include <eeschema_id.h>
#include <sch_view.h>
static PINSHEETLABEL_SHAPE lastGlobalLabelShape = NET_INPUT; static PINSHEETLABEL_SHAPE lastGlobalLabelShape = NET_INPUT;
@ -104,163 +101,77 @@ SCH_TEXT* SCH_EDIT_FRAME::CreateNewText( int aType )
/* /*
* OnConvertTextType is a command event handler to change a text type to another one. * ConvertTextType changes a text from one type to another. It creates a new text of the
* The new text, label, hierarchical label, or global label is created from the old text * appropriate type and deletes the old one.
* The old text is deleted.
* A tricky case is when the 'old" text is being edited (i.e. moving)
* because we must create a new text, and prepare the undo/redo command data for this
* change and the current move/edit command
*/ */
void SCH_EDIT_FRAME::OnConvertTextType( wxCommandEvent& aEvent ) void SCH_EDIT_FRAME::ConvertTextType( SCH_TEXT* aText, KICAD_T aType )
{ {
SCH_SCREEN* screen = GetScreen(); SCH_SCREEN* screen = GetScreen();
SCH_TEXT* text = (SCH_TEXT*) screen->GetCurItem(); bool selected = aText->IsSelected();
wxCHECK_RET( (text != NULL) && text->CanIncrementLabel(), "Cannot convert text type." ); wxCHECK_RET( aText->CanIncrementLabel(), "Cannot convert text type." );
KICAD_T type; if( aText->Type() == aType )
switch( aEvent.GetId() )
{
case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_LABEL:
type = SCH_LABEL_T;
break;
case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_GLABEL:
type = SCH_GLOBAL_LABEL_T;
break;
case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL:
type = SCH_HIER_LABEL_T;
break;
case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT:
type = SCH_TEXT_T;
break;
default:
wxFAIL_MSG( wxString::Format( "Invalid text type command ID %d.", aEvent.GetId() ) );
return;
}
if( text->Type() == type )
return; return;
SCH_TEXT* newtext = nullptr; SCH_TEXT* newtext = nullptr;
const wxPoint& position = text->GetPosition(); const wxPoint& position = aText->GetPosition();
const wxString txt = text->GetText(); const wxString txt = aText->GetText();
switch( type ) switch( aType )
{ {
case SCH_LABEL_T: case SCH_LABEL_T: newtext = new SCH_LABEL( position, txt ); break;
newtext = new SCH_LABEL( position, txt ); case SCH_GLOBAL_LABEL_T: newtext = new SCH_GLOBALLABEL( position, txt ); break;
break; case SCH_HIER_LABEL_T: newtext = new SCH_HIERLABEL( position, txt ); break;
case SCH_TEXT_T: newtext = new SCH_TEXT( position, txt ); break;
case SCH_GLOBAL_LABEL_T:
newtext = new SCH_GLOBALLABEL( position, txt );
break;
case SCH_HIER_LABEL_T:
newtext = new SCH_HIERLABEL( position, txt );
break;
case SCH_TEXT_T:
newtext = new SCH_TEXT( position, txt );
break;
default: default:
wxASSERT_MSG( false, wxString::Format( "Invalid text type: %d.", type ) ); wxASSERT_MSG( false, wxString::Format( "Invalid text type: %d.", aType ) );
return; return;
} }
/* Copy the old text item settings to the new one. Justifications are not copied because // Copy the old text item settings to the new one. Justifications are not copied
* they are not used in labels. Justifications will be set to default value in the new // because they are not used in labels. Justifications will be set to default value
* text item type. // in the new text item type.
*/ //
newtext->SetFlags( text->GetFlags() ); newtext->SetFlags( aText->GetEditFlags() );
newtext->SetShape( text->GetShape() ); newtext->SetShape( aText->GetShape() );
newtext->SetLabelSpinStyle( text->GetLabelSpinStyle() ); newtext->SetLabelSpinStyle( aText->GetLabelSpinStyle() );
newtext->SetTextSize( text->GetTextSize() ); newtext->SetTextSize( aText->GetTextSize() );
newtext->SetThickness( text->GetThickness() ); newtext->SetThickness( aText->GetThickness() );
newtext->SetItalic( text->IsItalic() ); newtext->SetItalic( aText->IsItalic() );
newtext->SetBold( text->IsBold() ); newtext->SetBold( aText->IsBold() );
newtext->SetIsDangling( text->IsDangling() ); newtext->SetIsDangling( aText->IsDangling() );
/* Save the new text in undo list if the old text was not itself a "new created text" if( selected )
* In this case, the old text is already in undo list as a deleted item. m_toolManager->RunAction( SCH_ACTIONS::unselectItem, true, aText );
* Of course if the old text was a "new created text" the new text will be
* put in undo list later, at the end of the current command (if not aborted)
*/
m_canvas->CrossHairOff(); // Erase schematic cursor if( !aText->IsNew() )
// For an exiting item (i.e. already in list):
// replace the existing item by the new text in list
for( SCH_ITEM* item = screen->GetDrawItems(); item != NULL; item = item->Next() )
{ {
if( item == text ) SaveCopyInUndoList( aText, UR_DELETED );
{ SaveCopyInUndoList( newtext, UR_NEW, true );
RemoveFromScreen( text );
RemoveFromScreen( aText );
AddToScreen( newtext ); AddToScreen( newtext );
break;
}
} }
SetRepeatItem( NULL ); if( selected )
OnModify(); m_toolManager->RunAction( SCH_ACTIONS::selectItem, true, newtext );
m_canvas->CrossHairOn( ); // redraw schematic cursor
// if the old item is the current schematic item, replace it by the new text: // if the old item is the current schematic item, replace it by the new text:
if( screen->GetCurItem() == text ) if( screen->GetCurItem() == aText )
screen->SetCurItem( newtext ); screen->SetCurItem( newtext );
if( text->IsNew() ) SetRepeatItem( nullptr );
{
// if the previous text is new, no undo command to prepare here
// just delete this previous text.
delete text;
return;
}
// previous text is not new and we replace text by new text. delete aText;
// So this is equivalent to delete text and add newtext
// If text if being currently edited (i.e. moved)
// we also save the initial copy of text, and prepare undo command for new text modifications.
// we must save it as modified text,if it is currently edited, then save as deleted text,
// and replace text with newtext
PICKED_ITEMS_LIST pickList;
ITEM_PICKER picker( text, UR_CHANGED );
if( text->GetEditFlags() ) OnModify();
{
// text is being edited, save initial text for undo command
picker.SetLink( GetUndoItem() );
pickList.PushItem( picker );
// the owner of undoItem is no more "this", it is now "picker":
SetUndoItem( NULL );
// save current newtext copy for undo/abort current command
SetUndoItem( newtext );
}
// Prepare undo command for delete old text
picker.SetStatus( UR_DELETED );
picker.SetLink( NULL );
pickList.PushItem( picker );
// Prepare undo command for new text
picker.SetStatus( UR_NEW );
picker.SetItem(newtext);
pickList.PushItem( picker );
SaveCopyInUndoList( pickList, UR_UNSPECIFIED );
} }
/* Function to increment bus label members numbers, /*
* i.e. when a text is ending with a number, adds * Function to increment bus label numbers. Adds aIncrement to labels which end in numbers.
* aIncrement to this number
*/ */
void IncrementLabelMember( wxString& name, int aIncrement ) void IncrementLabelMember( wxString& name, int aIncrement )
{ {

View File

@ -135,8 +135,6 @@ enum id_eeschema_frm
ID_POPUP_SCH_BEGIN_LINES, ID_POPUP_SCH_BEGIN_LINES,
ID_POPUP_SCH_DELETE_CONNECTION, ID_POPUP_SCH_DELETE_CONNECTION,
ID_POPUP_SCH_DELETE_NODE, ID_POPUP_SCH_DELETE_NODE,
ID_POPUP_SCH_ENTRY_SELECT_SLASH,
ID_POPUP_SCH_ENTRY_SELECT_ANTISLASH,
ID_POPUP_SCH_INIT_CMP, ID_POPUP_SCH_INIT_CMP,
@ -171,13 +169,6 @@ enum id_eeschema_frm
ID_POPUP_SCH_SELECT_UNIT_CMP_MAX = ID_POPUP_SCH_SELECT_UNIT1 ID_POPUP_SCH_SELECT_UNIT_CMP_MAX = ID_POPUP_SCH_SELECT_UNIT1
+ MAX_UNIT_COUNT_PER_PACKAGE, + MAX_UNIT_COUNT_PER_PACKAGE,
// Change text type context menu command IDs.
ID_POPUP_SCH_CHANGE_TYPE_TEXT,
ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_LABEL,
ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_GLABEL,
ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL,
ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT,
ID_SELECT_ITEM_START, ID_SELECT_ITEM_START,
ID_SELECT_ITEM_END = ID_SELECT_ITEM_START + MAX_SELECT_ITEM_IDS, ID_SELECT_ITEM_END = ID_SELECT_ITEM_START + MAX_SELECT_ITEM_IDS,

View File

@ -58,16 +58,9 @@
static void AddMenusForWire( wxMenu* PopMenu, SCH_LINE* Wire, SCH_EDIT_FRAME* frame ); static void AddMenusForWire( wxMenu* PopMenu, SCH_LINE* Wire, SCH_EDIT_FRAME* frame );
static void AddMenusForBus( wxMenu* PopMenu, SCH_LINE* Bus, SCH_EDIT_FRAME* frame ); static void AddMenusForBus( wxMenu* PopMenu, SCH_LINE* Bus, SCH_EDIT_FRAME* frame );
static void AddMenusForHierchicalSheet( wxMenu* PopMenu, SCH_SHEET* Sheet ); static void AddMenusForHierchicalSheet( wxMenu* PopMenu, SCH_SHEET* Sheet );
static void AddMenusForText( wxMenu* PopMenu, SCH_TEXT* Text );
static void AddMenusForLabel( wxMenu* PopMenu, SCH_LABEL* Label );
static void AddMenusForGLabel( wxMenu* PopMenu, SCH_GLOBALLABEL* GLabel );
static void AddMenusForHLabel( wxMenu* PopMenu, SCH_HIERLABEL* GLabel );
static void AddMenusForEditComponent( wxMenu* PopMenu, SCH_COMPONENT* Component,
SYMBOL_LIB_TABLE* aLibs );
static void AddMenusForComponent( wxMenu* PopMenu, SCH_COMPONENT* Component, static void AddMenusForComponent( wxMenu* PopMenu, SCH_COMPONENT* Component,
SYMBOL_LIB_TABLE* aLibs ); SYMBOL_LIB_TABLE* aLibs );
static void AddMenusForMarkers( wxMenu* aPopMenu, SCH_MARKER* aMarker, SCH_EDIT_FRAME* aFrame ); static void AddMenusForMarkers( wxMenu* aPopMenu, SCH_MARKER* aMarker, SCH_EDIT_FRAME* aFrame );
static void AddMenusForBusEntry( wxMenu* aPopMenu, SCH_BUS_ENTRY_BASE * aBusEntry );
bool SCH_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu ) bool SCH_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
@ -134,31 +127,10 @@ bool SCH_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
addJunctionMenuEntries( PopMenu, (SCH_JUNCTION*) item ); addJunctionMenuEntries( PopMenu, (SCH_JUNCTION*) item );
break; break;
case SCH_BUS_BUS_ENTRY_T:
case SCH_BUS_WIRE_ENTRY_T:
AddMenusForBusEntry( PopMenu, static_cast<SCH_BUS_ENTRY_BASE*>( item ) );
break;
case SCH_MARKER_T: case SCH_MARKER_T:
AddMenusForMarkers( PopMenu, (SCH_MARKER*) item, this ); AddMenusForMarkers( PopMenu, (SCH_MARKER*) item, this );
break; break;
case SCH_TEXT_T:
AddMenusForText( PopMenu, (SCH_TEXT*) item );
break;
case SCH_LABEL_T:
AddMenusForLabel( PopMenu, (SCH_LABEL*) item );
break;
case SCH_GLOBAL_LABEL_T:
AddMenusForGLabel( PopMenu, (SCH_GLOBALLABEL*) item );
break;
case SCH_HIER_LABEL_T:
AddMenusForHLabel( PopMenu, (SCH_HIERLABEL*) item );
break;
case SCH_COMPONENT_T: case SCH_COMPONENT_T:
AddMenusForComponent( PopMenu, (SCH_COMPONENT*) item, Prj().SchSymbolLibTable() ); AddMenusForComponent( PopMenu, (SCH_COMPONENT*) item, Prj().SchSymbolLibTable() );
break; break;
@ -187,12 +159,6 @@ bool SCH_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
void AddMenusForComponent( wxMenu* PopMenu, SCH_COMPONENT* Component, SYMBOL_LIB_TABLE* aLibs ) void AddMenusForComponent( wxMenu* PopMenu, SCH_COMPONENT* Component, SYMBOL_LIB_TABLE* aLibs )
{
AddMenusForEditComponent( PopMenu, Component, aLibs );
}
void AddMenusForEditComponent( wxMenu* PopMenu, SCH_COMPONENT* Component, SYMBOL_LIB_TABLE* aLibs )
{ {
wxString msg; wxString msg;
LIB_PART* part = NULL; LIB_PART* part = NULL;
@ -250,79 +216,6 @@ void AddMenusForEditComponent( wxMenu* PopMenu, SCH_COMPONENT* Component, SYMBOL
} }
void AddMenusForGLabel( wxMenu* PopMenu, SCH_GLOBALLABEL* GLabel )
{
wxMenu* menu_change_type = new wxMenu;
wxString msg;
// add menu change type text (to label, glabel, text):
AddMenuItem( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL,
_( "Change to Hierarchical Label" ), KiBitmap( label2glabel_xpm ) );
AddMenuItem( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_LABEL,
_( "Change to Label" ), KiBitmap( glabel2label_xpm ) );
AddMenuItem( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT,
_( "Change to Text" ), KiBitmap( glabel2text_xpm ) );
AddMenuItem( PopMenu, menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT,
_( "Change Type" ), KiBitmap( gl_change_xpm ) );
}
void AddMenusForHLabel( wxMenu* PopMenu, SCH_HIERLABEL* HLabel )
{
wxMenu* menu_change_type = new wxMenu;
wxString msg;
// add menu change type text (to label, glabel, text):
AddMenuItem( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_LABEL,
_( "Change to Label" ), KiBitmap( glabel2label_xpm ) );
AddMenuItem( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT,
_( "Change to Text" ), KiBitmap( glabel2text_xpm ) );
AddMenuItem( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_GLABEL,
_( "Change to Global Label" ), KiBitmap( label2glabel_xpm ) );
AddMenuItem( PopMenu, menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT,
_( "Change Type" ), KiBitmap( gl_change_xpm ) );
}
void AddMenusForLabel( wxMenu* PopMenu, SCH_LABEL* Label )
{
wxMenu* menu_change_type = new wxMenu;
wxString msg;
// add menu change type text (to label, glabel, text):
AddMenuItem( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL,
_( "Change to Hierarchical Label" ), KiBitmap( label2glabel_xpm ) );
AddMenuItem( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT,
_( "Change to Text" ), KiBitmap( label2text_xpm ) );
AddMenuItem( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_GLABEL,
_( "Change to Global Label" ), KiBitmap( label2glabel_xpm ) );
AddMenuItem( PopMenu, menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT,
_( "Change Type" ), KiBitmap( gl_change_xpm ) );
}
void AddMenusForText( wxMenu* PopMenu, SCH_TEXT* Text )
{
wxString msg;
wxMenu* menu_change_type = new wxMenu;
/* add menu change type text (to label, glabel, text),
* but only if this is a single line text
*/
if( Text->GetText().Find( wxT( "\n" ) ) == wxNOT_FOUND )
{
AddMenuItem( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_LABEL,
_( "Change to Label" ), KiBitmap( label2text_xpm ) );
AddMenuItem( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL,
_( "Change to Hierarchical Label" ), KiBitmap( label2glabel_xpm ) );
AddMenuItem( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_GLABEL,
_( "Change to Global Label" ), KiBitmap( label2glabel_xpm ) );
AddMenuItem( PopMenu, menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT,
_( "Change Type" ), KiBitmap( gl_change_xpm ) );
}
}
void SCH_EDIT_FRAME::addJunctionMenuEntries( wxMenu* aMenu, SCH_JUNCTION* aJunction ) void SCH_EDIT_FRAME::addJunctionMenuEntries( wxMenu* aMenu, SCH_JUNCTION* aJunction )
{ {
wxString msg; wxString msg;
@ -455,14 +348,3 @@ void AddMenusForMarkers( wxMenu* aPopMenu, SCH_MARKER* aMarker, SCH_EDIT_FRAME*
} }
void AddMenusForBusEntry( wxMenu* aPopMenu, SCH_BUS_ENTRY_BASE* aBusEntry )
{
wxString msg;
if( aBusEntry->GetBusEntryShape() == '\\' )
AddMenuItem( aPopMenu, ID_POPUP_SCH_ENTRY_SELECT_SLASH,
_( "Set Bus Entry Shape /" ), KiBitmap( change_entry_orient_xpm ) );
else
AddMenuItem( aPopMenu, ID_POPUP_SCH_ENTRY_SELECT_ANTISLASH,
_( "Set Bus Entry Shape \\" ), KiBitmap( change_entry_orient_xpm ) );
}

View File

@ -288,8 +288,6 @@ BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, EDA_DRAW_FRAME )
SCH_EDIT_FRAME::Process_Special_Functions ) SCH_EDIT_FRAME::Process_Special_Functions )
EVT_MENU_RANGE( ID_POPUP_SCH_SELECT_UNIT1, ID_POPUP_SCH_SELECT_UNIT_CMP_MAX, EVT_MENU_RANGE( ID_POPUP_SCH_SELECT_UNIT1, ID_POPUP_SCH_SELECT_UNIT_CMP_MAX,
SCH_EDIT_FRAME::OnSelectUnit ) SCH_EDIT_FRAME::OnSelectUnit )
EVT_MENU_RANGE( ID_POPUP_SCH_CHANGE_TYPE_TEXT, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT,
SCH_EDIT_FRAME::OnConvertTextType )
/* Handle user interface update events. */ /* Handle user interface update events. */
EVT_UPDATE_UI( wxID_PASTE, SCH_EDIT_FRAME::OnUpdatePaste ) EVT_UPDATE_UI( wxID_PASTE, SCH_EDIT_FRAME::OnUpdatePaste )

View File

@ -741,13 +741,9 @@ public:
*/ */
bool AskToSaveChanges(); bool AskToSaveChanges();
SCH_NO_CONNECT* AddNoConnect( const wxPoint& aPosition );
SCH_JUNCTION* AddJunction( const wxPoint& aPosition, bool aAppendToUndo = false, SCH_JUNCTION* AddJunction( const wxPoint& aPosition, bool aAppendToUndo = false,
bool aFinal = true ); bool aFinal = true );
SCH_BUS_WIRE_ENTRY* CreateBusWireEntry();
SCH_BUS_BUS_ENTRY* CreateBusBusEntry();
SCH_TEXT* CreateNewText( int aType ); SCH_TEXT* CreateNewText( int aType );
/** /**
@ -872,9 +868,6 @@ private:
*/ */
void UpdateTitle(); void UpdateTitle();
// Bus Entry
void SetBusEntryShape( wxDC* DC, SCH_BUS_ENTRY_BASE* BusEntry, char entry_shape );
/** /**
* Checks all wires and adds any junctions that are missing * Checks all wires and adds any junctions that are missing
* (Intended to be called only on file load) * (Intended to be called only on file load)
@ -887,14 +880,6 @@ private:
*/ */
void NormalizeSchematicOnFirstLoad(); void NormalizeSchematicOnFirstLoad();
/**
* Command event handler to change a text type to another one.
*
* The new text, label, hierarchical label, or global label is created from the old text
* and the old text object is deleted.
*/
void OnConvertTextType( wxCommandEvent& aEvent );
/** /**
* Erase the last segment at the current mouse position. * Erase the last segment at the current mouse position.
*/ */
@ -904,6 +889,14 @@ private:
void InstallHierarchyFrame( wxPoint& pos ); void InstallHierarchyFrame( wxPoint& pos );
public: public:
/**
* Change a text type to another one.
*
* The new text, label, hierarchical label, or global label is created from the old text
* and the old text object is deleted.
*/
void ConvertTextType( SCH_TEXT* aText, KICAD_T aType );
/** /**
* Launches the "Edit Text/Label" dialog * Launches the "Edit Text/Label" dialog
*/ */

View File

@ -188,6 +188,7 @@ public:
* *
* @return SCH_ITEM* - the one selected, or NULL. * @return SCH_ITEM* - the one selected, or NULL.
*/ */
// JEY TODO: these should go away: if the selection contains one item then it's the curItem...
SCH_ITEM* GetCurItem() const { return (SCH_ITEM*) BASE_SCREEN::GetCurItem(); } SCH_ITEM* GetCurItem() const { return (SCH_ITEM*) BASE_SCREEN::GetCurItem(); }
LIB_ITEM* GetCurLibItem() const { return (LIB_ITEM*) BASE_SCREEN::GetCurItem(); } LIB_ITEM* GetCurLibItem() const { return (LIB_ITEM*) BASE_SCREEN::GetCurItem(); }

View File

@ -63,8 +63,6 @@
switch( id ) switch( id )
{ {
case ID_POPUP_CANCEL_CURRENT_COMMAND: case ID_POPUP_CANCEL_CURRENT_COMMAND:
case ID_POPUP_SCH_ENTRY_SELECT_SLASH:
case ID_POPUP_SCH_ENTRY_SELECT_ANTISLASH:
case ID_POPUP_SCH_CLEANUP_SHEET: case ID_POPUP_SCH_CLEANUP_SHEET:
case ID_POPUP_SCH_RESIZE_SHEET: case ID_POPUP_SCH_RESIZE_SHEET:
case ID_POPUP_IMPORT_HLABEL_TO_SHEETPIN: case ID_POPUP_IMPORT_HLABEL_TO_SHEETPIN:
@ -98,16 +96,6 @@
SetRepeatItem( NULL ); SetRepeatItem( NULL );
break; break;
case ID_POPUP_SCH_ENTRY_SELECT_SLASH:
m_canvas->MoveCursorToCrossHair();
SetBusEntryShape( nullptr, dynamic_cast<SCH_BUS_ENTRY_BASE*>( item ), '/' );
break;
case ID_POPUP_SCH_ENTRY_SELECT_ANTISLASH:
m_canvas->MoveCursorToCrossHair();
SetBusEntryShape( nullptr, dynamic_cast<SCH_BUS_ENTRY_BASE*>( item ), '\\' );
break;
case ID_POPUP_CANCEL_CURRENT_COMMAND: case ID_POPUP_CANCEL_CURRENT_COMMAND:
if( m_canvas->IsMouseCaptured() ) if( m_canvas->IsMouseCaptured() )
{ {

View File

@ -33,6 +33,11 @@
#include <tools/sch_edit_tool.h> #include <tools/sch_edit_tool.h>
#include <tool/zoom_tool.h> #include <tool/zoom_tool.h>
char g_lastBusEntryShape = '/';
// JEY TODO: IDs that only appear in popup menus don't need to be here....
OPT<TOOL_EVENT> SCH_ACTIONS::TranslateLegacyId( int aId ) OPT<TOOL_EVENT> SCH_ACTIONS::TranslateLegacyId( int aId )
{ {
switch( aId ) switch( aId )

View File

@ -31,6 +31,8 @@
class TOOL_EVENT; class TOOL_EVENT;
class TOOL_MANAGER; class TOOL_MANAGER;
extern char g_lastBusEntryShape;
/** /**
* Class SCH_ACTIONS * Class SCH_ACTIONS
* *
@ -135,6 +137,12 @@ public:
static TOOL_ACTION addJunction; static TOOL_ACTION addJunction;
static TOOL_ACTION addLabel; static TOOL_ACTION addLabel;
static TOOL_ACTION addGlobalLabel; static TOOL_ACTION addGlobalLabel;
static TOOL_ACTION toShapeSlash;
static TOOL_ACTION toShapeBackslash;
static TOOL_ACTION toLabel;
static TOOL_ACTION toHLabel;
static TOOL_ACTION toGLabel;
static TOOL_ACTION toText;
/// Clipboard /// Clipboard
static TOOL_ACTION cut; static TOOL_ACTION cut;

View File

@ -188,6 +188,7 @@ TOOL_ACTION SCH_ACTIONS::addGlobalLabel( "eeschema.InteractiveEditing.addGlobalL
SCH_DRAWING_TOOL::SCH_DRAWING_TOOL() : SCH_DRAWING_TOOL::SCH_DRAWING_TOOL() :
TOOL_INTERACTIVE( "eeschema.InteractiveDrawing" ), TOOL_INTERACTIVE( "eeschema.InteractiveDrawing" ),
m_selectionTool( nullptr ),
m_view( nullptr ), m_view( nullptr ),
m_controls( nullptr ), m_controls( nullptr ),
m_frame( nullptr ), m_frame( nullptr ),
@ -205,6 +206,7 @@ SCH_DRAWING_TOOL::~SCH_DRAWING_TOOL()
bool SCH_DRAWING_TOOL::Init() bool SCH_DRAWING_TOOL::Init()
{ {
m_frame = getEditFrame<SCH_EDIT_FRAME>(); m_frame = getEditFrame<SCH_EDIT_FRAME>();
m_selectionTool = m_toolMgr->GetTool<SCH_SELECTION_TOOL>();
auto activeToolCondition = [ this ] ( const SELECTION& aSel ) { auto activeToolCondition = [ this ] ( const SELECTION& aSel ) {
return ( m_frame->GetToolId() != ID_NO_TOOL_SELECTED ); return ( m_frame->GetToolId() != ID_NO_TOOL_SELECTED );
@ -362,7 +364,7 @@ int SCH_DRAWING_TOOL::doPlaceComponent( SCH_COMPONENT* aComponent, SCHLIB_FILTER
{ {
cursorPos = m_controls->GetCursorPosition( !evt->Modifier( MD_ALT ) ); cursorPos = m_controls->GetCursorPosition( !evt->Modifier( MD_ALT ) );
if( evt->IsAction( &ACTIONS::cancelInteractive ) || evt->IsActivate() || evt->IsCancel() ) if( TOOL_EVT_UTILS::IsCancelInteractive( evt.get() ) )
{ {
if( aComponent ) if( aComponent )
{ {
@ -430,6 +432,8 @@ int SCH_DRAWING_TOOL::doPlaceComponent( SCH_COMPONENT* aComponent, SCHLIB_FILTER
m_view->ClearPreview(); m_view->ClearPreview();
m_view->AddToPreview( aComponent->Clone() ); m_view->AddToPreview( aComponent->Clone() );
m_toolMgr->RunAction( SCH_ACTIONS::selectItem, true, aComponent );
m_controls->SetCursorPosition( cursorPos, false ); m_controls->SetCursorPosition( cursorPos, false );
} }
else else
@ -443,12 +447,11 @@ int SCH_DRAWING_TOOL::doPlaceComponent( SCH_COMPONENT* aComponent, SCHLIB_FILTER
} }
else if( evt->IsClick( BUT_RIGHT ) ) else if( evt->IsClick( BUT_RIGHT ) )
{ {
SELECTION selection; // Warp after context menu only if dragging...
if( !aComponent )
m_toolMgr->VetoContextMenuMouseWarp();
if( aComponent ) m_menu.ShowContextMenu( m_selectionTool->GetSelection() );
selection.Add( aComponent );
m_menu.ShowContextMenu( selection );
} }
else if( aComponent && ( evt->IsAction( &SCH_ACTIONS::refreshPreview ) || evt->IsMotion() ) ) else if( aComponent && ( evt->IsAction( &SCH_ACTIONS::refreshPreview ) || evt->IsMotion() ) )
{ {
@ -495,7 +498,7 @@ int SCH_DRAWING_TOOL::PlaceImage( const TOOL_EVENT& aEvent )
{ {
cursorPos = m_controls->GetCursorPosition( !evt->Modifier( MD_ALT ) ); cursorPos = m_controls->GetCursorPosition( !evt->Modifier( MD_ALT ) );
if( evt->IsAction( &ACTIONS::cancelInteractive ) || evt->IsActivate() || evt->IsCancel() ) if( TOOL_EVT_UTILS::IsCancelInteractive( evt.get() ) )
{ {
if( image ) if( image )
{ {
@ -569,12 +572,11 @@ int SCH_DRAWING_TOOL::PlaceImage( const TOOL_EVENT& aEvent )
} }
else if( evt->IsClick( BUT_RIGHT ) ) else if( evt->IsClick( BUT_RIGHT ) )
{ {
SELECTION selection; // Warp after context menu only if dragging...
if( !image )
m_toolMgr->VetoContextMenuMouseWarp();
if( image ) m_menu.ShowContextMenu( m_selectionTool->GetSelection() );
selection.Add( image );
m_menu.ShowContextMenu( selection );
} }
else if( image && ( evt->IsAction( &SCH_ACTIONS::refreshPreview ) || evt->IsMotion() ) ) else if( image && ( evt->IsAction( &SCH_ACTIONS::refreshPreview ) || evt->IsMotion() ) )
{ {
@ -635,7 +637,7 @@ int SCH_DRAWING_TOOL::doSingleClickPlace( KICAD_T aType )
{ {
wxPoint cursorPos = (wxPoint)m_controls->GetCursorPosition( !evt->Modifier( MD_ALT ) ); wxPoint cursorPos = (wxPoint)m_controls->GetCursorPosition( !evt->Modifier( MD_ALT ) );
if( evt->IsAction( &ACTIONS::cancelInteractive ) || evt->IsActivate() || evt->IsCancel() ) if( TOOL_EVT_UTILS::IsCancelInteractive( evt.get() ) )
{ {
break; break;
} }
@ -647,18 +649,35 @@ int SCH_DRAWING_TOOL::doSingleClickPlace( KICAD_T aType )
{ {
switch( aType ) switch( aType )
{ {
case SCH_NO_CONNECT_T: item = m_frame->AddNoConnect( cursorPos ); break; case SCH_NO_CONNECT_T:
case SCH_JUNCTION_T: item = m_frame->AddJunction( cursorPos ); break; item = new SCH_NO_CONNECT( cursorPos );
case SCH_BUS_WIRE_ENTRY_T: item = m_frame->CreateBusWireEntry(); break; break;
case SCH_BUS_BUS_ENTRY_T: item = m_frame->CreateBusBusEntry(); break; case SCH_JUNCTION_T:
default: wxFAIL_MSG( "doSingleClickPlace(): unknown type" ); item = m_frame->AddJunction( cursorPos );
break;
case SCH_BUS_WIRE_ENTRY_T:
item = new SCH_BUS_WIRE_ENTRY( cursorPos, g_lastBusEntryShape );
break;
case SCH_BUS_BUS_ENTRY_T:
item = new SCH_BUS_BUS_ENTRY( cursorPos, g_lastBusEntryShape );
break;
default:
wxFAIL_MSG( "doSingleClickPlace(): unknown type" );
} }
} }
if( item ) if( item )
{ {
item->SetFlags( IS_NEW );
m_frame->AddItemToScreen( item );
m_frame->SaveCopyInUndoList( item, UR_NEW );
m_frame->SetRepeatItem( item ); m_frame->SetRepeatItem( item );
m_frame->GetScreen()->SetCurItem( item ); m_frame->GetScreen()->SetCurItem( item );
m_frame->SchematicCleanUp();
m_frame->TestDanglingEnds();
m_frame->OnModify();
} }
} }
else if( evt->IsClick( BUT_RIGHT ) ) else if( evt->IsClick( BUT_RIGHT ) )
@ -719,7 +738,6 @@ int SCH_DRAWING_TOOL::PlaceSchematicText( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOL::doTwoClickPlace( KICAD_T aType ) int SCH_DRAWING_TOOL::doTwoClickPlace( KICAD_T aType )
{ {
SCH_SELECTION_TOOL* selTool = m_toolMgr->GetTool<SCH_SELECTION_TOOL>();
VECTOR2I cursorPos = m_controls->GetCursorPosition(); VECTOR2I cursorPos = m_controls->GetCursorPosition();
SCH_ITEM* item = nullptr; SCH_ITEM* item = nullptr;
@ -734,7 +752,7 @@ int SCH_DRAWING_TOOL::doTwoClickPlace( KICAD_T aType )
{ {
cursorPos = m_controls->GetCursorPosition( !evt->Modifier( MD_ALT ) ); cursorPos = m_controls->GetCursorPosition( !evt->Modifier( MD_ALT ) );
if( evt->IsAction( &ACTIONS::cancelInteractive ) || evt->IsActivate() || evt->IsCancel() ) if( TOOL_EVT_UTILS::IsCancelInteractive( evt.get() ) )
{ {
if( item ) if( item )
{ {
@ -753,6 +771,7 @@ int SCH_DRAWING_TOOL::doTwoClickPlace( KICAD_T aType )
} }
else if( evt->IsClick( BUT_LEFT ) ) else if( evt->IsClick( BUT_LEFT ) )
{ {
// First click creates...
if( !item ) if( !item )
{ {
m_frame->SetRepeatItem( NULL ); m_frame->SetRepeatItem( NULL );
@ -773,7 +792,8 @@ int SCH_DRAWING_TOOL::doTwoClickPlace( KICAD_T aType )
item = m_frame->CreateNewText( LAYER_NOTES ); item = m_frame->CreateNewText( LAYER_NOTES );
break; break;
case SCH_SHEET_PIN_T: case SCH_SHEET_PIN_T:
item = selTool->SelectPoint( cursorPos, SCH_COLLECTOR::SheetsAndSheetLabels ); item = m_selectionTool->SelectPoint( cursorPos, SCH_COLLECTOR::SheetsAndSheetLabels );
if( item ) if( item )
{ {
if( m_frame->GetToolId() == ID_IMPORT_HLABEL_BUTT ) if( m_frame->GetToolId() == ID_IMPORT_HLABEL_BUTT )
@ -792,6 +812,9 @@ int SCH_DRAWING_TOOL::doTwoClickPlace( KICAD_T aType )
if( item ) if( item )
{ {
m_toolMgr->RunAction( SCH_ACTIONS::selectItem, true, item );
// JEY TODO: this should be handled by selection event....
MSG_PANEL_ITEMS items; MSG_PANEL_ITEMS items;
item->GetMsgPanelInfo( m_frame->GetUserUnits(), items ); item->GetMsgPanelInfo( m_frame->GetUserUnits(), items );
m_frame->SetMsgPanel( items ); m_frame->SetMsgPanel( items );
@ -803,6 +826,8 @@ int SCH_DRAWING_TOOL::doTwoClickPlace( KICAD_T aType )
m_controls->SetCursorPosition( cursorPos, false ); m_controls->SetCursorPosition( cursorPos, false );
} }
// ... and second click places:
else else
{ {
m_view->ClearPreview(); m_view->ClearPreview();
@ -814,12 +839,25 @@ int SCH_DRAWING_TOOL::doTwoClickPlace( KICAD_T aType )
} }
else if( evt->IsClick( BUT_RIGHT ) ) else if( evt->IsClick( BUT_RIGHT ) )
{ {
SELECTION selection; // Warp after context menu only if dragging...
if( !item )
m_toolMgr->VetoContextMenuMouseWarp();
if( item ) m_menu.ShowContextMenu( m_selectionTool->GetSelection() );
selection.Add( item ); }
else if( TOOL_EVT_UTILS::IsSelectionEvent( evt.get() ) )
{
// This happens if our text was replaced out from under us by CovertTextType()
SELECTION& selection = m_selectionTool->GetSelection();
m_menu.ShowContextMenu( selection ); if( selection.GetSize() == 1 )
{
item = (SCH_ITEM*) selection.GetItem( 0 );
m_view->ClearPreview();
m_view->AddToPreview( item->Clone() );
}
else
item = nullptr;
} }
else if( item && ( evt->IsAction( &SCH_ACTIONS::refreshPreview ) || evt->IsMotion() ) ) else if( item && ( evt->IsAction( &SCH_ACTIONS::refreshPreview ) || evt->IsMotion() ) )
{ {
@ -1116,7 +1154,7 @@ int SCH_DRAWING_TOOL::doDrawSegments( int aType, SCH_LINE* aSegment )
{ {
wxPoint cursorPos = (wxPoint)m_controls->GetCursorPosition( !evt->Modifier( MD_ALT ) ); wxPoint cursorPos = (wxPoint)m_controls->GetCursorPosition( !evt->Modifier( MD_ALT ) );
if( evt->IsAction( &ACTIONS::cancelInteractive ) || evt->IsActivate() || evt->IsCancel() ) if( TOOL_EVT_UTILS::IsCancelInteractive( evt.get() ) )
{ {
if( aSegment || m_busUnfold.in_progress ) if( aSegment || m_busUnfold.in_progress )
{ {
@ -1167,12 +1205,11 @@ int SCH_DRAWING_TOOL::doDrawSegments( int aType, SCH_LINE* aSegment )
} }
else if( evt->IsClick( BUT_RIGHT ) ) else if( evt->IsClick( BUT_RIGHT ) )
{ {
SELECTION selection; // Warp after context menu only if dragging...
if( !aSegment )
m_toolMgr->VetoContextMenuMouseWarp();
if( aSegment ) m_menu.ShowContextMenu( m_selectionTool->GetSelection() );
selection.Add( aSegment );
m_menu.ShowContextMenu( selection );
} }
else if( evt->IsClick( BUT_LEFT ) || ( aSegment && evt->IsDblClick( BUT_LEFT ) ) ) else if( evt->IsClick( BUT_LEFT ) || ( aSegment && evt->IsDblClick( BUT_LEFT ) ) )
{ {
@ -1451,7 +1488,7 @@ int SCH_DRAWING_TOOL::doDrawSheet( SCH_SHEET *aSheet )
{ {
wxPoint cursorPos = (wxPoint)m_controls->GetCursorPosition( !evt->Modifier( MD_ALT ) ); wxPoint cursorPos = (wxPoint)m_controls->GetCursorPosition( !evt->Modifier( MD_ALT ) );
if( evt->IsAction( &ACTIONS::cancelInteractive ) || evt->IsActivate() || evt->IsCancel() ) if( TOOL_EVT_UTILS::IsCancelInteractive( evt.get() ) )
{ {
m_view->ClearPreview(); m_view->ClearPreview();
@ -1560,8 +1597,11 @@ int SCH_DRAWING_TOOL::doDrawSheet( SCH_SHEET *aSheet )
} }
else if( evt->IsClick( BUT_RIGHT ) ) else if( evt->IsClick( BUT_RIGHT ) )
{ {
// JEY TODO // Warp after context menu only if dragging...
// m_menu.ShowContextMenu(); if( !aSheet )
m_toolMgr->VetoContextMenuMouseWarp();
m_menu.ShowContextMenu( m_selectionTool->GetSelection() );
} }
// Enable autopanning and cursor capture only when there is a sheet to be placed // Enable autopanning and cursor capture only when there is a sheet to be placed

View File

@ -35,6 +35,7 @@ class SCH_BUS_WIRE_ENTRY;
class SCH_LABEL; class SCH_LABEL;
class SCHLIB_FILTER; class SCHLIB_FILTER;
class SCH_EDIT_FRAME; class SCH_EDIT_FRAME;
class SCH_SELECTION_TOOL;
/// Collection of data related to the bus unfolding tool /// Collection of data related to the bus unfolding tool
@ -121,6 +122,7 @@ private:
void setTransitions() override; void setTransitions() override;
private: private:
SCH_SELECTION_TOOL* m_selectionTool;
KIGFX::SCH_VIEW* m_view; KIGFX::SCH_VIEW* m_view;
KIGFX::VIEW_CONTROLS* m_controls; KIGFX::VIEW_CONTROLS* m_controls;
SCH_EDIT_FRAME* m_frame; SCH_EDIT_FRAME* m_frame;
@ -128,7 +130,6 @@ private:
/// Data related to bus unfolding tool. /// Data related to bus unfolding tool.
BUS_UNFOLDING_T m_busUnfold; BUS_UNFOLDING_T m_busUnfold;
/// Menu model displayed by the tool.
TOOL_MENU m_menu; TOOL_MENU m_menu;
}; };

View File

@ -39,6 +39,7 @@
#include <sch_view.h> #include <sch_view.h>
#include <sch_line.h> #include <sch_line.h>
#include <sch_item_struct.h> #include <sch_item_struct.h>
#include <sch_bus_entry.h>
#include <sch_edit_frame.h> #include <sch_edit_frame.h>
#include <list_operations.h> #include <list_operations.h>
#include <eeschema_id.h> #include <eeschema_id.h>
@ -115,6 +116,36 @@ TOOL_ACTION SCH_ACTIONS::showDatasheet( "eeschema.InteractiveEdit.showDatasheet"
_( "Show Datasheet" ), _( "Opens the datasheet in a browser" ), _( "Show Datasheet" ), _( "Opens the datasheet in a browser" ),
datasheet_xpm ); datasheet_xpm );
TOOL_ACTION SCH_ACTIONS::toShapeSlash( "eeschema.InteractiveEdit.toShapeSlash",
AS_GLOBAL, 0,
_( "Set Bus Entry Shape /" ), _( "Change the bus entry shape to /" ),
change_entry_orient_xpm );
TOOL_ACTION SCH_ACTIONS::toShapeBackslash( "eeschema.InteractiveEdit.toShapeBackslash",
AS_GLOBAL, 0,
_( "Set Bus Entry Shape \\" ), _( "Change the bus entry shape to \\" ),
change_entry_orient_xpm );
TOOL_ACTION SCH_ACTIONS::toLabel( "eeschema.InteractiveEdit.toLabel",
AS_GLOBAL, 0,
_( "Change to Label" ), _( "Change existing item to a label" ),
add_line_label_xpm );
TOOL_ACTION SCH_ACTIONS::toHLabel( "eeschema.InteractiveEdit.toHLabel",
AS_GLOBAL, 0,
_( "Change to Hierarchical Label" ), _( "Change existing item to a hierarchical label" ),
add_hierarchical_label_xpm );
TOOL_ACTION SCH_ACTIONS::toGLabel( "eeschema.InteractiveEdit.toGLabel",
AS_GLOBAL, 0,
_( "Change to Global Label" ), _( "Change existing item to a global label" ),
add_glabel_xpm );
TOOL_ACTION SCH_ACTIONS::toText( "eeschema.InteractiveEdit.toText",
AS_GLOBAL, 0,
_( "Change to Text" ), _( "Change existing item to a text comment" ),
text_xpm );
TOOL_ACTION SCH_ACTIONS::doDelete( "eeschema.InteractiveEdit.doDelete", TOOL_ACTION SCH_ACTIONS::doDelete( "eeschema.InteractiveEdit.doDelete",
AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_DELETE ), AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_DELETE ),
_( "Delete" ), _( "Deletes selected item(s)" ), _( "Delete" ), _( "Deletes selected item(s)" ),
@ -169,6 +200,52 @@ bool SCH_EDIT_TOOL::Init()
return ( m_frame->GetToolId() == ID_NO_TOOL_SELECTED ); return ( m_frame->GetToolId() == ID_NO_TOOL_SELECTED );
}; };
auto orientatableCondition = [] ( const SELECTION& aSel ) {
if( aSel.Empty() )
return false;
if( aSel.GetSize() > 1 )
return true;
switch( static_cast<EDA_ITEM*>( aSel.GetItem( 0 ) )->Type() )
{
case SCH_MARKER_T:
case SCH_JUNCTION_T:
case SCH_NO_CONNECT_T:
case SCH_BUS_WIRE_ENTRY_T:
case SCH_BUS_BUS_ENTRY_T:
case SCH_LINE_T:
case SCH_SHEET_PIN_T:
case SCH_PIN_T:
return false;
default:
return true;
}
};
auto toLabelCondition = SELECTION_CONDITIONS::Count( 1 )
&& ( SELECTION_CONDITIONS::HasType( SCH_GLOBAL_LABEL_T )
|| SELECTION_CONDITIONS::HasType( SCH_HIER_LABEL_T )
|| SELECTION_CONDITIONS::HasType( SCH_TEXT_T ) );
auto toHLabelCondition = SELECTION_CONDITIONS::Count( 1 )
&& ( SELECTION_CONDITIONS::HasType( SCH_LABEL_T )
|| SELECTION_CONDITIONS::HasType( SCH_GLOBAL_LABEL_T )
|| SELECTION_CONDITIONS::HasType( SCH_TEXT_T ) );
auto toGLabelCondition = SELECTION_CONDITIONS::Count( 1 )
&& ( SELECTION_CONDITIONS::HasType( SCH_LABEL_T )
|| SELECTION_CONDITIONS::HasType( SCH_HIER_LABEL_T )
|| SELECTION_CONDITIONS::HasType( SCH_TEXT_T ) );
auto toTextlCondition = SELECTION_CONDITIONS::Count( 1 )
&& ( SELECTION_CONDITIONS::HasType( SCH_LABEL_T )
|| SELECTION_CONDITIONS::HasType( SCH_GLOBAL_LABEL_T )
|| SELECTION_CONDITIONS::HasType( SCH_HIER_LABEL_T ) );
auto entryCondition = SELECTION_CONDITIONS::HasType( SCH_BUS_WIRE_ENTRY_T )
|| SELECTION_CONDITIONS::HasType( SCH_BUS_BUS_ENTRY_T );
auto singleComponentCondition = SELECTION_CONDITIONS::OnlyType( SCH_COMPONENT_T ) auto singleComponentCondition = SELECTION_CONDITIONS::OnlyType( SCH_COMPONENT_T )
&& SELECTION_CONDITIONS::Count( 1 ); && SELECTION_CONDITIONS::Count( 1 );
@ -194,17 +271,17 @@ bool SCH_EDIT_TOOL::Init()
ctxMenu.AddItem( ACTIONS::cancelInteractive, activeToolCondition, 1 ); ctxMenu.AddItem( ACTIONS::cancelInteractive, activeToolCondition, 1 );
ctxMenu.AddSeparator( SELECTION_CONDITIONS::NotEmpty ); ctxMenu.AddSeparator( SELECTION_CONDITIONS::NotEmpty );
ctxMenu.AddItem( SCH_ACTIONS::rotateCCW, SELECTION_CONDITIONS::NotEmpty ); ctxMenu.AddItem( SCH_ACTIONS::rotateCCW, orientatableCondition );
ctxMenu.AddItem( SCH_ACTIONS::rotateCW, SELECTION_CONDITIONS::NotEmpty ); ctxMenu.AddItem( SCH_ACTIONS::rotateCW, orientatableCondition );
ctxMenu.AddItem( SCH_ACTIONS::mirrorX, SELECTION_CONDITIONS::NotEmpty ); ctxMenu.AddItem( SCH_ACTIONS::mirrorX, orientatableCondition );
ctxMenu.AddItem( SCH_ACTIONS::mirrorY, SELECTION_CONDITIONS::NotEmpty ); ctxMenu.AddItem( SCH_ACTIONS::mirrorY, orientatableCondition );
ctxMenu.AddItem( SCH_ACTIONS::duplicate, SELECTION_CONDITIONS::NotEmpty ); ctxMenu.AddItem( SCH_ACTIONS::duplicate, SELECTION_CONDITIONS::NotEmpty );
ctxMenu.AddItem( SCH_ACTIONS::doDelete, SELECTION_CONDITIONS::NotEmpty ); ctxMenu.AddItem( SCH_ACTIONS::doDelete, SELECTION_CONDITIONS::NotEmpty );
ctxMenu.AddItem( SCH_ACTIONS::properties, SELECTION_CONDITIONS::Count( 1 ) ); ctxMenu.AddItem( SCH_ACTIONS::properties, SELECTION_CONDITIONS::Count( 1 ) );
ctxMenu.AddItem( SCH_ACTIONS::editReference, singleComponentCondition ); ctxMenu.AddItem( SCH_ACTIONS::editReference, singleComponentCondition );
ctxMenu.AddItem( SCH_ACTIONS::editValue, singleComponentCondition ); ctxMenu.AddItem( SCH_ACTIONS::editValue, singleComponentCondition );
ctxMenu.AddItem( SCH_ACTIONS::editReference, singleComponentCondition ); ctxMenu.AddItem( SCH_ACTIONS::editFootprint, singleComponentCondition );
ctxMenu.AddSeparator( SELECTION_CONDITIONS::NotEmpty ); ctxMenu.AddSeparator( SELECTION_CONDITIONS::NotEmpty );
ctxMenu.AddItem( SCH_ACTIONS::cut, SELECTION_CONDITIONS::NotEmpty ); ctxMenu.AddItem( SCH_ACTIONS::cut, SELECTION_CONDITIONS::NotEmpty );
@ -218,15 +295,21 @@ bool SCH_EDIT_TOOL::Init()
CONDITIONAL_MENU& drawingMenu = drawingTool->GetToolMenu().GetMenu(); CONDITIONAL_MENU& drawingMenu = drawingTool->GetToolMenu().GetMenu();
ctxMenu.AddSeparator( SELECTION_CONDITIONS::NotEmpty, 200 ); ctxMenu.AddSeparator( SELECTION_CONDITIONS::NotEmpty, 200 );
drawingMenu.AddItem( SCH_ACTIONS::rotateCCW, SELECTION_CONDITIONS::NotEmpty, 200 ); drawingMenu.AddItem( SCH_ACTIONS::rotateCCW, orientatableCondition, 200 );
drawingMenu.AddItem( SCH_ACTIONS::rotateCW, SELECTION_CONDITIONS::NotEmpty, 200 ); drawingMenu.AddItem( SCH_ACTIONS::rotateCW, orientatableCondition, 200 );
drawingMenu.AddItem( SCH_ACTIONS::mirrorX, SELECTION_CONDITIONS::NotEmpty, 200 ); drawingMenu.AddItem( SCH_ACTIONS::mirrorX, orientatableCondition, 200 );
drawingMenu.AddItem( SCH_ACTIONS::mirrorY, SELECTION_CONDITIONS::NotEmpty, 200 ); drawingMenu.AddItem( SCH_ACTIONS::mirrorY, orientatableCondition, 200 );
drawingMenu.AddItem( SCH_ACTIONS::properties, SELECTION_CONDITIONS::Count( 1 ), 200 ); drawingMenu.AddItem( SCH_ACTIONS::properties, SELECTION_CONDITIONS::Count( 1 ), 200 );
drawingMenu.AddItem( SCH_ACTIONS::editReference, singleComponentCondition, 200 ); drawingMenu.AddItem( SCH_ACTIONS::editReference, singleComponentCondition, 200 );
drawingMenu.AddItem( SCH_ACTIONS::editValue, singleComponentCondition, 200 ); drawingMenu.AddItem( SCH_ACTIONS::editValue, singleComponentCondition, 200 );
drawingMenu.AddItem( SCH_ACTIONS::editReference, singleComponentCondition, 200 ); drawingMenu.AddItem( SCH_ACTIONS::editFootprint, singleComponentCondition, 200 );
drawingMenu.AddItem( SCH_ACTIONS::toShapeSlash, entryCondition, 200 );
drawingMenu.AddItem( SCH_ACTIONS::toShapeBackslash, entryCondition, 200 );
drawingMenu.AddItem( SCH_ACTIONS::toLabel, toLabelCondition, 200 );
drawingMenu.AddItem( SCH_ACTIONS::toHLabel, toHLabelCondition, 200 );
drawingMenu.AddItem( SCH_ACTIONS::toGLabel, toGLabelCondition, 200 );
drawingMenu.AddItem( SCH_ACTIONS::toText, toTextlCondition, 200 );
// Add editing actions to the selection tool menu // Add editing actions to the selection tool menu
// //
@ -234,19 +317,25 @@ bool SCH_EDIT_TOOL::Init()
selToolMenu.AddItem( SCH_ACTIONS::move, SELECTION_CONDITIONS::NotEmpty, 200 ); selToolMenu.AddItem( SCH_ACTIONS::move, SELECTION_CONDITIONS::NotEmpty, 200 );
selToolMenu.AddItem( SCH_ACTIONS::drag, SELECTION_CONDITIONS::NotEmpty, 200 ); selToolMenu.AddItem( SCH_ACTIONS::drag, SELECTION_CONDITIONS::NotEmpty, 200 );
selToolMenu.AddItem( SCH_ACTIONS::rotateCCW, SELECTION_CONDITIONS::NotEmpty, 200 ); selToolMenu.AddItem( SCH_ACTIONS::rotateCCW, orientatableCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::rotateCW, SELECTION_CONDITIONS::NotEmpty, 200 ); selToolMenu.AddItem( SCH_ACTIONS::rotateCW, orientatableCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::mirrorX, SELECTION_CONDITIONS::NotEmpty, 200 ); selToolMenu.AddItem( SCH_ACTIONS::mirrorX, orientatableCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::mirrorY, SELECTION_CONDITIONS::NotEmpty, 200 ); selToolMenu.AddItem( SCH_ACTIONS::mirrorY, orientatableCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::duplicate, SELECTION_CONDITIONS::NotEmpty, 200 ); selToolMenu.AddItem( SCH_ACTIONS::duplicate, SELECTION_CONDITIONS::NotEmpty, 200 );
selToolMenu.AddItem( SCH_ACTIONS::doDelete, SELECTION_CONDITIONS::NotEmpty, 200 ); selToolMenu.AddItem( SCH_ACTIONS::doDelete, SELECTION_CONDITIONS::NotEmpty, 200 );
selToolMenu.AddItem( SCH_ACTIONS::properties, SELECTION_CONDITIONS::Count( 1 ), 200 ); selToolMenu.AddItem( SCH_ACTIONS::properties, SELECTION_CONDITIONS::Count( 1 ), 200 );
selToolMenu.AddItem( SCH_ACTIONS::editReference, singleSymbolCondition, 200 ); selToolMenu.AddItem( SCH_ACTIONS::editReference, singleSymbolCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::editValue, singleSymbolCondition, 200 ); selToolMenu.AddItem( SCH_ACTIONS::editValue, singleSymbolCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::editReference, singleSymbolCondition, 200 ); selToolMenu.AddItem( SCH_ACTIONS::editFootprint, singleSymbolCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::autoplaceFields, singleComponentCondition, 200 ); selToolMenu.AddItem( SCH_ACTIONS::autoplaceFields, singleComponentCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::showDatasheet, singleSymbolCondition, 200 ); selToolMenu.AddItem( SCH_ACTIONS::showDatasheet, singleSymbolCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::toShapeSlash, entryCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::toShapeBackslash, entryCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::toLabel, toLabelCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::toHLabel, toHLabelCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::toGLabel, toGLabelCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::toText, toTextlCondition, 200 );
selToolMenu.AddSeparator( SELECTION_CONDITIONS::NotEmpty, 200 ); selToolMenu.AddSeparator( SELECTION_CONDITIONS::NotEmpty, 200 );
selToolMenu.AddItem( SCH_ACTIONS::cut, SELECTION_CONDITIONS::NotEmpty, 200 ); selToolMenu.AddItem( SCH_ACTIONS::cut, SELECTION_CONDITIONS::NotEmpty, 200 );
@ -435,7 +524,7 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
} }
} }
else if( evt->IsAction( &ACTIONS::cancelInteractive ) || evt->IsCancel() || evt->IsActivate() ) else if( TOOL_EVT_UTILS::IsCancelInteractive( evt.get() ) )
{ {
if( m_moveInProgress ) if( m_moveInProgress )
restore_state = true; restore_state = true;
@ -449,7 +538,7 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
break; break;
} }
// Dispatch TOOL_ACTIONs // Handle TOOL_ACTION special cases
else if( evt->Category() == TC_COMMAND ) else if( evt->Category() == TC_COMMAND )
{ {
if( evt->IsAction( &SCH_ACTIONS::doDelete ) ) if( evt->IsAction( &SCH_ACTIONS::doDelete ) )
@ -1308,6 +1397,69 @@ int SCH_EDIT_TOOL::Properties( const TOOL_EVENT& aEvent )
} }
int SCH_EDIT_TOOL::ChangeShape( const TOOL_EVENT& aEvent )
{
SELECTION selection = m_selectionTool->GetSelection();
char shape;
if( aEvent.IsAction( &SCH_ACTIONS::toShapeSlash ) )
shape = '/';
else if( aEvent.IsAction( &SCH_ACTIONS::toShapeBackslash ) )
shape = '\\';
else
return 0;
for( int i = 0; i < selection.GetSize(); ++i )
{
SCH_BUS_ENTRY_BASE* entry = dynamic_cast<SCH_BUS_ENTRY_BASE*>( selection.GetItem( i ) );
if( entry )
{
if( entry->GetEditFlags() == 0 )
m_frame->SaveCopyInUndoList( entry, UR_CHANGED );
entry->SetBusEntryShape( shape );
m_frame->TestDanglingEnds();
updateView( entry );
m_frame->OnModify( );
}
}
g_lastBusEntryShape = shape;
return 0;
}
int SCH_EDIT_TOOL::ChangeTextType( const TOOL_EVENT& aEvent )
{
SELECTION selection = m_selectionTool->GetSelection();
KICAD_T type;
if( aEvent.IsAction( &SCH_ACTIONS::toLabel ) )
type = SCH_LABEL_T;
else if( aEvent.IsAction( &SCH_ACTIONS::toHLabel ) )
type = SCH_HIER_LABEL_T;
else if( aEvent.IsAction( &SCH_ACTIONS::toGLabel ) )
type = SCH_GLOBAL_LABEL_T;
else if( aEvent.IsAction( &SCH_ACTIONS::toText ) )
type = SCH_TEXT_T;
else
return 0;
for( int i = 0; i < selection.GetSize(); ++i )
{
SCH_TEXT* text = dynamic_cast<SCH_TEXT*>( selection.GetItem( i ) );
if( text )
m_frame->ConvertTextType( text, type );
}
return 0;
}
void SCH_EDIT_TOOL::updateView( EDA_ITEM* aItem ) void SCH_EDIT_TOOL::updateView( EDA_ITEM* aItem )
{ {
KICAD_T itemType = aItem->Type(); KICAD_T itemType = aItem->Type();
@ -1350,4 +1502,10 @@ void SCH_EDIT_TOOL::setTransitions()
Go( &SCH_EDIT_TOOL::AutoplaceFields, SCH_ACTIONS::autoplaceFields.MakeEvent() ); Go( &SCH_EDIT_TOOL::AutoplaceFields, SCH_ACTIONS::autoplaceFields.MakeEvent() );
Go( &SCH_EDIT_TOOL::ShowDatasheet, SCH_ACTIONS::showDatasheet.MakeEvent() ); Go( &SCH_EDIT_TOOL::ShowDatasheet, SCH_ACTIONS::showDatasheet.MakeEvent() );
Go( &SCH_EDIT_TOOL::ChangeShape, SCH_ACTIONS::toShapeSlash.MakeEvent() );
Go( &SCH_EDIT_TOOL::ChangeShape, SCH_ACTIONS::toShapeBackslash.MakeEvent() );
Go( &SCH_EDIT_TOOL::ChangeTextType, SCH_ACTIONS::toLabel.MakeEvent() );
Go( &SCH_EDIT_TOOL::ChangeTextType, SCH_ACTIONS::toHLabel.MakeEvent() );
Go( &SCH_EDIT_TOOL::ChangeTextType, SCH_ACTIONS::toGLabel.MakeEvent() );
Go( &SCH_EDIT_TOOL::ChangeTextType, SCH_ACTIONS::toText.MakeEvent() );
} }

View File

@ -69,6 +69,9 @@ public:
int AutoplaceFields( const TOOL_EVENT& aEvent ); int AutoplaceFields( const TOOL_EVENT& aEvent );
int ShowDatasheet( const TOOL_EVENT& aEvent ); int ShowDatasheet( const TOOL_EVENT& aEvent );
int ChangeShape( const TOOL_EVENT& aEvent );
int ChangeTextType( const TOOL_EVENT& aEvent );
/** /**
* Function DoDelete() * Function DoDelete()
* *

View File

@ -77,7 +77,7 @@ int SCH_PICKER_TOOL::Main( const TOOL_EVENT& aEvent )
setControls(); setControls();
} }
else if( evt->IsAction( &ACTIONS::cancelInteractive ) || evt->IsActivate() || evt->IsCancel() ) else if( TOOL_EVT_UTILS::IsCancelInteractive( evt.get() ) )
{ {
if( m_cancelHandler ) if( m_cancelHandler )
{ {

View File

@ -610,6 +610,7 @@ private:
std::deque<TOOL_EVENT> m_events; std::deque<TOOL_EVENT> m_events;
}; };
inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& aEventA, const TOOL_EVENT& aEventB ) inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& aEventA, const TOOL_EVENT& aEventB )
{ {
TOOL_EVENT_LIST l; TOOL_EVENT_LIST l;
@ -620,6 +621,7 @@ inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& aEventA, const TOOL_E
return l; return l;
} }
inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& aEvent, inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& aEvent,
const TOOL_EVENT_LIST& aEventList ) const TOOL_EVENT_LIST& aEventList )
{ {
@ -629,4 +631,34 @@ inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& aEvent,
return l; return l;
} }
/**
* Namespace TOOL_EVT_UTILS
*
* Utility functions for dealing with various tool events. These are
* free functions, so they interface with any classes exclusively via
* the public interfaces, so they don't need to be subsumed into the
* "helped" classes.
*/
namespace TOOL_EVT_UTILS
{
/**
* Function IsCancelInteractive()
*
* @return true if this event should restart/end an ongoing interactive
* tool's event loop (eg esc key, click cancel, start different
* tool)
*/
bool IsCancelInteractive( const TOOL_EVENT& aEvt );
/**
* Function IsSelectionEvent()
*
* Indicates an selection-changed notification event.
*/
bool IsSelectionEvent( const TOOL_EVENT& aEvt );
}
#endif #endif

View File

@ -1,7 +1,7 @@
/* /*
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* Copyright (C) 2017 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2019 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -22,17 +22,9 @@
*/ */
#include <tools/tool_event_utils.h> #include <tools/tool_event_utils.h>
#include <tools/pcb_actions.h> #include <tools/pcb_actions.h>
#include <pcb_base_edit_frame.h> #include <pcb_base_edit_frame.h>
bool TOOL_EVT_UTILS::IsCancelInteractive( const TOOL_EVENT& aEvt )
{
return aEvt.IsAction( &ACTIONS::cancelInteractive )
|| aEvt.IsActivate()
|| aEvt.IsCancel();
}
bool TOOL_EVT_UTILS::IsRotateToolEvt( const TOOL_EVENT& aEvt ) bool TOOL_EVT_UTILS::IsRotateToolEvt( const TOOL_EVENT& aEvt )
{ {

View File

@ -40,15 +40,6 @@ class PCB_BASE_EDIT_FRAME;
*/ */
namespace TOOL_EVT_UTILS namespace TOOL_EVT_UTILS
{ {
/**
* Function IsCancelInteractive()
*
* @return true if this event should restart/end an ongoing interactive
* tool's event loop (eg esc key, click cancel, start different
* tool)
*/
bool IsCancelInteractive( const TOOL_EVENT& aEvt );
/** /**
* Function isRotateToolEvt() * Function isRotateToolEvt()
* *