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_action.h>
#include <tool/tool_manager.h>
#include <tool/actions.h>
struct FlagString
{
@ -160,3 +160,21 @@ const std::string TOOL_EVENT_LIST::Format() const
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,13 +61,10 @@ void TOOL_MENU::AddSubMenu( std::shared_ptr<CONTEXT_MENU> aSubMenu )
void TOOL_MENU::ShowContextMenu( SELECTION& aSelection )
{
m_contextMenu = std::unique_ptr<CONTEXT_MENU>(
m_menu.Generate( aSelection ) );
m_contextMenu = std::unique_ptr<CONTEXT_MENU>( m_menu.Generate( aSelection ) );
if( m_contextMenu->GetMenuItemCount() > 0 )
{
m_tool.SetContextMenu( m_contextMenu.get(), CMENU_NOW );
}
}
@ -83,9 +80,7 @@ void TOOL_MENU::CloseContextMenu( OPT_TOOL_EVENT& evt )
{
// m_contextMenu can be null here, that's OK
if( evt->Parameter<CONTEXT_MENU*>() == m_contextMenu.get() )
{
m_contextMenu = nullptr;
}
}

View File

@ -142,7 +142,6 @@ set( EESCHEMA_SRCS
block.cpp
bus_alias.cpp
bus-wire-junction.cpp
busentry.cpp
class_libentry.cpp
class_library.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
*/
/**
* @file edit_label.cpp
* @brief Label, global label and text creation and editing.
*/
#include <fctsys.h>
#include <gr_basic.h>
#include <base_struct.h>
@ -35,10 +30,12 @@
#include <confirm.h>
#include <sch_edit_frame.h>
#include <kicad_device_context.h>
#include <tool/tool_manager.h>
#include <tools/sch_actions.h>
#include <general.h>
#include <sch_text.h>
#include <eeschema_id.h>
#include <sch_view.h>
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.
* The new text, label, hierarchical label, or global label is created from the old text
* 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
* ConvertTextType changes a text from one type to another. It creates a new text of the
* appropriate type and deletes the old one.
*/
void SCH_EDIT_FRAME::OnConvertTextType( wxCommandEvent& aEvent )
void SCH_EDIT_FRAME::ConvertTextType( SCH_TEXT* aText, KICAD_T aType )
{
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;
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 )
if( aText->Type() == aType )
return;
SCH_TEXT* newtext = nullptr;
const wxPoint& position = text->GetPosition();
const wxString txt = text->GetText();
const wxPoint& position = aText->GetPosition();
const wxString txt = aText->GetText();
switch( type )
switch( aType )
{
case SCH_LABEL_T:
newtext = new SCH_LABEL( 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;
case SCH_LABEL_T: newtext = new SCH_LABEL( 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:
wxASSERT_MSG( false, wxString::Format( "Invalid text type: %d.", type ) );
wxASSERT_MSG( false, wxString::Format( "Invalid text type: %d.", aType ) );
return;
}
/* Copy the old text item settings to the new one. Justifications are not copied because
* they are not used in labels. Justifications will be set to default value in the new
* text item type.
*/
newtext->SetFlags( text->GetFlags() );
newtext->SetShape( text->GetShape() );
newtext->SetLabelSpinStyle( text->GetLabelSpinStyle() );
newtext->SetTextSize( text->GetTextSize() );
newtext->SetThickness( text->GetThickness() );
newtext->SetItalic( text->IsItalic() );
newtext->SetBold( text->IsBold() );
newtext->SetIsDangling( text->IsDangling() );
// Copy the old text item settings to the new one. Justifications are not copied
// because they are not used in labels. Justifications will be set to default value
// in the new text item type.
//
newtext->SetFlags( aText->GetEditFlags() );
newtext->SetShape( aText->GetShape() );
newtext->SetLabelSpinStyle( aText->GetLabelSpinStyle() );
newtext->SetTextSize( aText->GetTextSize() );
newtext->SetThickness( aText->GetThickness() );
newtext->SetItalic( aText->IsItalic() );
newtext->SetBold( aText->IsBold() );
newtext->SetIsDangling( aText->IsDangling() );
/* Save the new text in undo list if the old text was not itself a "new created text"
* In this case, the old text is already in undo list as a deleted item.
* 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)
*/
if( selected )
m_toolManager->RunAction( SCH_ACTIONS::unselectItem, true, aText );
m_canvas->CrossHairOff(); // Erase schematic cursor
// 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( !aText->IsNew() )
{
if( item == text )
{
RemoveFromScreen( text );
SaveCopyInUndoList( aText, UR_DELETED );
SaveCopyInUndoList( newtext, UR_NEW, true );
RemoveFromScreen( aText );
AddToScreen( newtext );
break;
}
}
SetRepeatItem( NULL );
OnModify();
m_canvas->CrossHairOn( ); // redraw schematic cursor
if( selected )
m_toolManager->RunAction( SCH_ACTIONS::selectItem, true, newtext );
// 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 );
if( text->IsNew() )
{
// if the previous text is new, no undo command to prepare here
// just delete this previous text.
delete text;
return;
}
SetRepeatItem( nullptr );
// previous text is not new and we replace text by new text.
// 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 );
delete aText;
if( text->GetEditFlags() )
{
// 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 );
OnModify();
}
/* Function to increment bus label members numbers,
* i.e. when a text is ending with a number, adds
* aIncrement to this number
/*
* Function to increment bus label numbers. Adds aIncrement to labels which end in numbers.
*/
void IncrementLabelMember( wxString& name, int aIncrement )
{

View File

@ -135,8 +135,6 @@ enum id_eeschema_frm
ID_POPUP_SCH_BEGIN_LINES,
ID_POPUP_SCH_DELETE_CONNECTION,
ID_POPUP_SCH_DELETE_NODE,
ID_POPUP_SCH_ENTRY_SELECT_SLASH,
ID_POPUP_SCH_ENTRY_SELECT_ANTISLASH,
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
+ 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_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 AddMenusForBus( wxMenu* PopMenu, SCH_LINE* Bus, SCH_EDIT_FRAME* frame );
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,
SYMBOL_LIB_TABLE* aLibs );
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 )
@ -134,31 +127,10 @@ bool SCH_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
addJunctionMenuEntries( PopMenu, (SCH_JUNCTION*) item );
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:
AddMenusForMarkers( PopMenu, (SCH_MARKER*) item, this );
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:
AddMenusForComponent( PopMenu, (SCH_COMPONENT*) item, Prj().SchSymbolLibTable() );
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 )
{
AddMenusForEditComponent( PopMenu, Component, aLibs );
}
void AddMenusForEditComponent( wxMenu* PopMenu, SCH_COMPONENT* Component, SYMBOL_LIB_TABLE* aLibs )
{
wxString msg;
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 )
{
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 )
EVT_MENU_RANGE( ID_POPUP_SCH_SELECT_UNIT1, ID_POPUP_SCH_SELECT_UNIT_CMP_MAX,
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. */
EVT_UPDATE_UI( wxID_PASTE, SCH_EDIT_FRAME::OnUpdatePaste )

View File

@ -741,13 +741,9 @@ public:
*/
bool AskToSaveChanges();
SCH_NO_CONNECT* AddNoConnect( const wxPoint& aPosition );
SCH_JUNCTION* AddJunction( const wxPoint& aPosition, bool aAppendToUndo = false,
bool aFinal = true );
SCH_BUS_WIRE_ENTRY* CreateBusWireEntry();
SCH_BUS_BUS_ENTRY* CreateBusBusEntry();
SCH_TEXT* CreateNewText( int aType );
/**
@ -872,9 +868,6 @@ private:
*/
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
* (Intended to be called only on file load)
@ -887,14 +880,6 @@ private:
*/
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.
*/
@ -904,6 +889,14 @@ private:
void InstallHierarchyFrame( wxPoint& pos );
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
*/

View File

@ -188,6 +188,7 @@ public:
*
* @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(); }
LIB_ITEM* GetCurLibItem() const { return (LIB_ITEM*) BASE_SCREEN::GetCurItem(); }

View File

@ -63,8 +63,6 @@
switch( id )
{
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_RESIZE_SHEET:
case ID_POPUP_IMPORT_HLABEL_TO_SHEETPIN:
@ -98,16 +96,6 @@
SetRepeatItem( NULL );
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:
if( m_canvas->IsMouseCaptured() )
{

View File

@ -33,6 +33,11 @@
#include <tools/sch_edit_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 )
{
switch( aId )

View File

@ -31,6 +31,8 @@
class TOOL_EVENT;
class TOOL_MANAGER;
extern char g_lastBusEntryShape;
/**
* Class SCH_ACTIONS
*
@ -135,6 +137,12 @@ public:
static TOOL_ACTION addJunction;
static TOOL_ACTION addLabel;
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
static TOOL_ACTION cut;

View File

@ -188,6 +188,7 @@ TOOL_ACTION SCH_ACTIONS::addGlobalLabel( "eeschema.InteractiveEditing.addGlobalL
SCH_DRAWING_TOOL::SCH_DRAWING_TOOL() :
TOOL_INTERACTIVE( "eeschema.InteractiveDrawing" ),
m_selectionTool( nullptr ),
m_view( nullptr ),
m_controls( nullptr ),
m_frame( nullptr ),
@ -205,6 +206,7 @@ SCH_DRAWING_TOOL::~SCH_DRAWING_TOOL()
bool SCH_DRAWING_TOOL::Init()
{
m_frame = getEditFrame<SCH_EDIT_FRAME>();
m_selectionTool = m_toolMgr->GetTool<SCH_SELECTION_TOOL>();
auto activeToolCondition = [ this ] ( const SELECTION& aSel ) {
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 ) );
if( evt->IsAction( &ACTIONS::cancelInteractive ) || evt->IsActivate() || evt->IsCancel() )
if( TOOL_EVT_UTILS::IsCancelInteractive( evt.get() ) )
{
if( aComponent )
{
@ -430,6 +432,8 @@ int SCH_DRAWING_TOOL::doPlaceComponent( SCH_COMPONENT* aComponent, SCHLIB_FILTER
m_view->ClearPreview();
m_view->AddToPreview( aComponent->Clone() );
m_toolMgr->RunAction( SCH_ACTIONS::selectItem, true, aComponent );
m_controls->SetCursorPosition( cursorPos, false );
}
else
@ -443,12 +447,11 @@ int SCH_DRAWING_TOOL::doPlaceComponent( SCH_COMPONENT* aComponent, SCHLIB_FILTER
}
else if( evt->IsClick( BUT_RIGHT ) )
{
SELECTION selection;
// Warp after context menu only if dragging...
if( !aComponent )
m_toolMgr->VetoContextMenuMouseWarp();
if( aComponent )
selection.Add( aComponent );
m_menu.ShowContextMenu( selection );
m_menu.ShowContextMenu( m_selectionTool->GetSelection() );
}
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 ) );
if( evt->IsAction( &ACTIONS::cancelInteractive ) || evt->IsActivate() || evt->IsCancel() )
if( TOOL_EVT_UTILS::IsCancelInteractive( evt.get() ) )
{
if( image )
{
@ -569,12 +572,11 @@ int SCH_DRAWING_TOOL::PlaceImage( const TOOL_EVENT& aEvent )
}
else if( evt->IsClick( BUT_RIGHT ) )
{
SELECTION selection;
// Warp after context menu only if dragging...
if( !image )
m_toolMgr->VetoContextMenuMouseWarp();
if( image )
selection.Add( image );
m_menu.ShowContextMenu( selection );
m_menu.ShowContextMenu( m_selectionTool->GetSelection() );
}
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 ) );
if( evt->IsAction( &ACTIONS::cancelInteractive ) || evt->IsActivate() || evt->IsCancel() )
if( TOOL_EVT_UTILS::IsCancelInteractive( evt.get() ) )
{
break;
}
@ -647,18 +649,35 @@ int SCH_DRAWING_TOOL::doSingleClickPlace( KICAD_T aType )
{
switch( aType )
{
case SCH_NO_CONNECT_T: item = m_frame->AddNoConnect( cursorPos ); break;
case SCH_JUNCTION_T: item = m_frame->AddJunction( cursorPos ); break;
case SCH_BUS_WIRE_ENTRY_T: item = m_frame->CreateBusWireEntry(); break;
case SCH_BUS_BUS_ENTRY_T: item = m_frame->CreateBusBusEntry(); break;
default: wxFAIL_MSG( "doSingleClickPlace(): unknown type" );
case SCH_NO_CONNECT_T:
item = new SCH_NO_CONNECT( cursorPos );
break;
case SCH_JUNCTION_T:
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 )
{
item->SetFlags( IS_NEW );
m_frame->AddItemToScreen( item );
m_frame->SaveCopyInUndoList( item, UR_NEW );
m_frame->SetRepeatItem( item );
m_frame->GetScreen()->SetCurItem( item );
m_frame->SchematicCleanUp();
m_frame->TestDanglingEnds();
m_frame->OnModify();
}
}
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 )
{
SCH_SELECTION_TOOL* selTool = m_toolMgr->GetTool<SCH_SELECTION_TOOL>();
VECTOR2I cursorPos = m_controls->GetCursorPosition();
SCH_ITEM* item = nullptr;
@ -734,7 +752,7 @@ int SCH_DRAWING_TOOL::doTwoClickPlace( KICAD_T aType )
{
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 )
{
@ -753,6 +771,7 @@ int SCH_DRAWING_TOOL::doTwoClickPlace( KICAD_T aType )
}
else if( evt->IsClick( BUT_LEFT ) )
{
// First click creates...
if( !item )
{
m_frame->SetRepeatItem( NULL );
@ -773,7 +792,8 @@ int SCH_DRAWING_TOOL::doTwoClickPlace( KICAD_T aType )
item = m_frame->CreateNewText( LAYER_NOTES );
break;
case SCH_SHEET_PIN_T:
item = selTool->SelectPoint( cursorPos, SCH_COLLECTOR::SheetsAndSheetLabels );
item = m_selectionTool->SelectPoint( cursorPos, SCH_COLLECTOR::SheetsAndSheetLabels );
if( item )
{
if( m_frame->GetToolId() == ID_IMPORT_HLABEL_BUTT )
@ -792,6 +812,9 @@ int SCH_DRAWING_TOOL::doTwoClickPlace( KICAD_T aType )
if( item )
{
m_toolMgr->RunAction( SCH_ACTIONS::selectItem, true, item );
// JEY TODO: this should be handled by selection event....
MSG_PANEL_ITEMS items;
item->GetMsgPanelInfo( m_frame->GetUserUnits(), items );
m_frame->SetMsgPanel( items );
@ -803,6 +826,8 @@ int SCH_DRAWING_TOOL::doTwoClickPlace( KICAD_T aType )
m_controls->SetCursorPosition( cursorPos, false );
}
// ... and second click places:
else
{
m_view->ClearPreview();
@ -814,12 +839,25 @@ int SCH_DRAWING_TOOL::doTwoClickPlace( KICAD_T aType )
}
else if( evt->IsClick( BUT_RIGHT ) )
{
SELECTION selection;
// Warp after context menu only if dragging...
if( !item )
m_toolMgr->VetoContextMenuMouseWarp();
if( item )
selection.Add( item );
m_menu.ShowContextMenu( m_selectionTool->GetSelection() );
}
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() ) )
{
@ -1116,7 +1154,7 @@ int SCH_DRAWING_TOOL::doDrawSegments( int aType, SCH_LINE* aSegment )
{
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 )
{
@ -1167,12 +1205,11 @@ int SCH_DRAWING_TOOL::doDrawSegments( int aType, SCH_LINE* aSegment )
}
else if( evt->IsClick( BUT_RIGHT ) )
{
SELECTION selection;
// Warp after context menu only if dragging...
if( !aSegment )
m_toolMgr->VetoContextMenuMouseWarp();
if( aSegment )
selection.Add( aSegment );
m_menu.ShowContextMenu( selection );
m_menu.ShowContextMenu( m_selectionTool->GetSelection() );
}
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 ) );
if( evt->IsAction( &ACTIONS::cancelInteractive ) || evt->IsActivate() || evt->IsCancel() )
if( TOOL_EVT_UTILS::IsCancelInteractive( evt.get() ) )
{
m_view->ClearPreview();
@ -1560,8 +1597,11 @@ int SCH_DRAWING_TOOL::doDrawSheet( SCH_SHEET *aSheet )
}
else if( evt->IsClick( BUT_RIGHT ) )
{
// JEY TODO
// m_menu.ShowContextMenu();
// Warp after context menu only if dragging...
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

View File

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

View File

@ -39,6 +39,7 @@
#include <sch_view.h>
#include <sch_line.h>
#include <sch_item_struct.h>
#include <sch_bus_entry.h>
#include <sch_edit_frame.h>
#include <list_operations.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" ),
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",
AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_DELETE ),
_( "Delete" ), _( "Deletes selected item(s)" ),
@ -169,6 +200,52 @@ bool SCH_EDIT_TOOL::Init()
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 )
&& SELECTION_CONDITIONS::Count( 1 );
@ -194,17 +271,17 @@ bool SCH_EDIT_TOOL::Init()
ctxMenu.AddItem( ACTIONS::cancelInteractive, activeToolCondition, 1 );
ctxMenu.AddSeparator( SELECTION_CONDITIONS::NotEmpty );
ctxMenu.AddItem( SCH_ACTIONS::rotateCCW, SELECTION_CONDITIONS::NotEmpty );
ctxMenu.AddItem( SCH_ACTIONS::rotateCW, SELECTION_CONDITIONS::NotEmpty );
ctxMenu.AddItem( SCH_ACTIONS::mirrorX, SELECTION_CONDITIONS::NotEmpty );
ctxMenu.AddItem( SCH_ACTIONS::mirrorY, SELECTION_CONDITIONS::NotEmpty );
ctxMenu.AddItem( SCH_ACTIONS::rotateCCW, orientatableCondition );
ctxMenu.AddItem( SCH_ACTIONS::rotateCW, orientatableCondition );
ctxMenu.AddItem( SCH_ACTIONS::mirrorX, orientatableCondition );
ctxMenu.AddItem( SCH_ACTIONS::mirrorY, orientatableCondition );
ctxMenu.AddItem( SCH_ACTIONS::duplicate, SELECTION_CONDITIONS::NotEmpty );
ctxMenu.AddItem( SCH_ACTIONS::doDelete, SELECTION_CONDITIONS::NotEmpty );
ctxMenu.AddItem( SCH_ACTIONS::properties, SELECTION_CONDITIONS::Count( 1 ) );
ctxMenu.AddItem( SCH_ACTIONS::editReference, 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.AddItem( SCH_ACTIONS::cut, SELECTION_CONDITIONS::NotEmpty );
@ -218,15 +295,21 @@ bool SCH_EDIT_TOOL::Init()
CONDITIONAL_MENU& drawingMenu = drawingTool->GetToolMenu().GetMenu();
ctxMenu.AddSeparator( SELECTION_CONDITIONS::NotEmpty, 200 );
drawingMenu.AddItem( SCH_ACTIONS::rotateCCW, SELECTION_CONDITIONS::NotEmpty, 200 );
drawingMenu.AddItem( SCH_ACTIONS::rotateCW, SELECTION_CONDITIONS::NotEmpty, 200 );
drawingMenu.AddItem( SCH_ACTIONS::mirrorX, SELECTION_CONDITIONS::NotEmpty, 200 );
drawingMenu.AddItem( SCH_ACTIONS::mirrorY, SELECTION_CONDITIONS::NotEmpty, 200 );
drawingMenu.AddItem( SCH_ACTIONS::rotateCCW, orientatableCondition, 200 );
drawingMenu.AddItem( SCH_ACTIONS::rotateCW, orientatableCondition, 200 );
drawingMenu.AddItem( SCH_ACTIONS::mirrorX, orientatableCondition, 200 );
drawingMenu.AddItem( SCH_ACTIONS::mirrorY, orientatableCondition, 200 );
drawingMenu.AddItem( SCH_ACTIONS::properties, SELECTION_CONDITIONS::Count( 1 ), 200 );
drawingMenu.AddItem( SCH_ACTIONS::editReference, 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
//
@ -234,19 +317,25 @@ bool SCH_EDIT_TOOL::Init()
selToolMenu.AddItem( SCH_ACTIONS::move, 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::rotateCW, SELECTION_CONDITIONS::NotEmpty, 200 );
selToolMenu.AddItem( SCH_ACTIONS::mirrorX, SELECTION_CONDITIONS::NotEmpty, 200 );
selToolMenu.AddItem( SCH_ACTIONS::mirrorY, SELECTION_CONDITIONS::NotEmpty, 200 );
selToolMenu.AddItem( SCH_ACTIONS::rotateCCW, orientatableCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::rotateCW, orientatableCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::mirrorX, orientatableCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::mirrorY, orientatableCondition, 200 );
selToolMenu.AddItem( SCH_ACTIONS::duplicate, 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::editReference, 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::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.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 )
restore_state = true;
@ -449,7 +538,7 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
break;
}
// Dispatch TOOL_ACTIONs
// Handle TOOL_ACTION special cases
else if( evt->Category() == TC_COMMAND )
{
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 )
{
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::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 ShowDatasheet( const TOOL_EVENT& aEvent );
int ChangeShape( const TOOL_EVENT& aEvent );
int ChangeTextType( const TOOL_EVENT& aEvent );
/**
* Function DoDelete()
*

View File

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

View File

@ -610,6 +610,7 @@ private:
std::deque<TOOL_EVENT> m_events;
};
inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& aEventA, const TOOL_EVENT& aEventB )
{
TOOL_EVENT_LIST l;
@ -620,6 +621,7 @@ inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& aEventA, const TOOL_E
return l;
}
inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& aEvent,
const TOOL_EVENT_LIST& aEventList )
{
@ -629,4 +631,34 @@ inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& aEvent,
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

View File

@ -1,7 +1,7 @@
/*
* 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
* modify it under the terms of the GNU General Public License
@ -22,17 +22,9 @@
*/
#include <tools/tool_event_utils.h>
#include <tools/pcb_actions.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 )
{

View File

@ -40,15 +40,6 @@ class PCB_BASE_EDIT_FRAME;
*/
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()
*