More Eeschema schematic item move code unification.

* Tweak move item to support moving schematic sheet pin objects.
* Change schematic sheet pin set position to constrain position within
  the parent sheet.
* Schematic sheet pin moving now handled by unified move code.
* Remove old schematic sheet pin move code.
* Add custom client data object for passing hot key information to
  command event handlers.
* Fix a bug that prevented changes to schematic sheet pin objects from
  being undone.
This commit is contained in:
Wayne Stambaugh 2011-10-21 09:59:15 -04:00
parent 4c063574ae
commit 78377058c9
10 changed files with 175 additions and 147 deletions

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2006 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2011 Kicad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2011 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
@ -97,7 +97,7 @@ void SCH_ITEM::Place( SCH_EDIT_FRAME* aFrame, wxDC* aDC )
m_Flags = 0;
screen->SetModify();
screen->SetCurItem( NULL );
aFrame->DrawPanel->SetMouseCapture( NULL, NULL );
aFrame->DrawPanel->EndMouseCapture();
if( aDC )
{

View File

@ -496,19 +496,32 @@ static void abortMoveItem( EDA_DRAW_PANEL* aPanel, wxDC* aDC )
delete item;
item = NULL;
}
else // Move command on an existing text item, restore the values of the original.
else
{
SCH_ITEM* olditem = parent->GetUndoItem();
screen->SetCurItem( item );
SCH_ITEM* oldItem = parent->GetUndoItem();
wxCHECK_RET( olditem != NULL && item->Type() == olditem->Type(),
SCH_ITEM* currentItem;
// Items that are children of other objects are undone by swapping the contents
// of the parent items.
if( item->Type() == SCH_SHEET_PIN_T )
{
currentItem = (SCH_ITEM*) item->GetParent();
}
else
{
currentItem = item;
}
screen->SetCurItem( currentItem );
wxCHECK_RET( oldItem != NULL && currentItem->Type() == oldItem->Type(),
wxT( "Cannot restore undefined or bad last schematic item." ) );
// Never delete existing item, because it can be referenced by an undo/redo command
// Just restore its data
item->SwapData( olditem );
item->ClearFlags();
currentItem->SwapData( oldItem );
currentItem->ClearFlags();
}
aPanel->Refresh();
@ -546,12 +559,20 @@ void SCH_EDIT_FRAME::MoveItem( SCH_ITEM* aItem, wxDC* aDC )
m_itemToRepeat = NULL;
if( !aItem->IsNew() )
SetUndoItem( aItem );
{
if( (aItem->Type() == SCH_SHEET_PIN_T) )
SetUndoItem( (SCH_ITEM*) aItem->GetParent() );
else
SetUndoItem( aItem );
}
aItem->SetFlags( IS_MOVED );
DrawPanel->CrossHairOff( aDC );
GetScreen()->SetCrossHairPosition( aItem->GetPosition() );
if( (aItem->Type() != SCH_SHEET_PIN_T) )
GetScreen()->SetCrossHairPosition( aItem->GetPosition() );
DrawPanel->MoveCursorToCrossHair();
OnModify();

View File

@ -572,7 +572,7 @@ void SCH_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition,
case HK_ROTATE: // Component or other schematic item rotation
if ( screen->m_BlockLocate.m_State != STATE_NO_BLOCK )//allows bloc operation on hotkey
{
HandleBlockEndByPopUp(BLOCK_ROTATE, aDC );
HandleBlockEndByPopUp( BLOCK_ROTATE, aDC );
break;
}
@ -731,18 +731,8 @@ void SCH_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition,
break;
case HK_MOVE_COMPONENT_OR_ITEM: // Start move schematic item.
if( itemInEdit )
break;
if( aItem == NULL )
{
aItem = LocateAndShowItem( aPosition, SCH_COLLECTOR::MovableItems,
hotKey->m_Idcommand );
if( aItem == NULL )
break;
}
cmd.SetInt( aHotKey );
cmd.SetClientData( new EDA_HOTKEY_CLIENT_DATA( aPosition ) );
cmd.SetId( hotKey->m_IdMenuEvent );
wxPostEvent( this, cmd );
break;

View File

@ -920,7 +920,7 @@ void SCH_SHEET::Resize( const wxSize& aSize )
/* Move the sheet labels according to the new sheet size. */
BOOST_FOREACH( SCH_SHEET_PIN& label, m_pins )
{
label.ConstraintOnEdge( label.m_Pos );
label.ConstrainOnEdge( label.m_Pos );
}
}

View File

@ -132,11 +132,11 @@ public:
int GetEdge() const;
/**
* Function ConstraintOnEdge
* Function ConstrainOnEdge
* is used to adjust label position to edge based on proximity to vertical / horizontal edge
* of the parent sheet.
*/
void ConstraintOnEdge( wxPoint Pos );
void ConstrainOnEdge( wxPoint Pos );
/**
* Get the parent sheet object of this sheet pin.
@ -221,6 +221,12 @@ public:
virtual wxString GetSelectMenuText() const;
virtual BITMAP_DEF GetMenuImage() const { return add_hierar_pin_xpm; }
private:
virtual void doSetPosition( const wxPoint& aPosition )
{
ConstrainOnEdge( aPosition );
}
};

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2006 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2011 Kicad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 1992-2011 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
@ -43,14 +43,14 @@
#include "kicad_string.h"
/* m_Edge define on which edge the pin is positionned:
/* m_Edge define on which edge the pin is positioned:
*
* 0: pin on left side
* 1: pin on right side
* 2: pin on top side
* 3: pin on bottom side
* for compatibility reasons, this does not follow same values as text
* ortientation.
* orientation.
*/
SCH_SHEET_PIN::SCH_SHEET_PIN( SCH_SHEET* parent, const wxPoint& pos, const wxString& text ) :
@ -60,10 +60,12 @@ SCH_SHEET_PIN::SCH_SHEET_PIN( SCH_SHEET* parent, const wxPoint& pos, const wxStr
wxASSERT( parent );
m_Layer = LAYER_SHEETLABEL;
m_Pos = pos;
if( parent->IsVerticalOrientation() )
SetEdge( 2 );
else
SetEdge( 0 );
m_Shape = NET_INPUT;
m_IsDangling = true;
m_Number = 2;
@ -141,26 +143,20 @@ void SCH_SHEET_PIN::Place( SCH_EDIT_FRAME* aFrame, wxDC* aDC )
wxCHECK_RET( (sheet != NULL) && (sheet->Type() == SCH_SHEET_T),
wxT( "Cannot place sheet pin in invalid schematic sheet object." ) );
int flags = m_Flags;
m_Flags = 0;
if( flags & IS_NEW )
if( IsNew() )
{
aFrame->SaveCopyInUndoList( sheet, UR_CHANGED );
sheet->AddPin( this );
}
else // pin sheet was existing and only moved
else // Sheet pin already existed and was only moved.
{
wxPoint tmp = m_Pos;
m_Pos = aFrame->GetLastSheetPinPosition();
SetEdge( aFrame->GetLastSheetPinEdge() );
aFrame->SaveCopyInUndoList( sheet, UR_CHANGED );
m_Pos = tmp;
aFrame->SaveUndoItemInUndoList( sheet );
}
ConstraintOnEdge( aFrame->GetScreen()->GetCrossHairPosition() );
ClearFlags();
sheet->Draw( aFrame->DrawPanel, aDC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE );
// Make sure we don't call the abort move function.
aFrame->DrawPanel->SetMouseCapture( NULL, NULL );
aFrame->DrawPanel->EndMouseCapture();
}
@ -205,7 +201,7 @@ int SCH_SHEET_PIN::GetEdge() const
}
void SCH_SHEET_PIN::ConstraintOnEdge( wxPoint Pos )
void SCH_SHEET_PIN::ConstrainOnEdge( wxPoint Pos )
{
SCH_SHEET* Sheet = (SCH_SHEET*) GetParent();
@ -224,8 +220,10 @@ void SCH_SHEET_PIN::ConstraintOnEdge( wxPoint Pos )
}
m_Pos.y = Pos.y;
if( m_Pos.y < Sheet->m_Pos.y )
m_Pos.y = Sheet->m_Pos.y;
if( m_Pos.y > (Sheet->m_Pos.y + Sheet->m_Size.y) )
m_Pos.y = Sheet->m_Pos.y + Sheet->m_Size.y;
}

View File

@ -35,6 +35,7 @@
#include "eda_doc.h"
#include "wxEeschemaStruct.h"
#include "kicad_device_context.h"
#include "hotkeys_basic.h"
#include "general.h"
#include "eeschema_id.h"
@ -492,8 +493,28 @@ void SCH_EDIT_FRAME::OnMoveItem( wxCommandEvent& aEvent )
SCH_SCREEN* screen = GetScreen();
SCH_ITEM* item = screen->GetCurItem();
wxLogDebug( wxT( "Command member m_commandInt = %d." ), aEvent.GetInt() );
if( item == NULL )
return;
{
// If we didn't get here by a hot key, then something has gone wrong.
if( aEvent.GetInt() == 0 )
return;
EDA_HOTKEY_CLIENT_DATA* data = (EDA_HOTKEY_CLIENT_DATA*) aEvent.GetClientData();
wxCHECK_RET( data != NULL, wxT( "Invalid hot key client data." ) );
item = LocateAndShowItem( data->GetPosition(), SCH_COLLECTOR::MovableItems,
aEvent.GetInt() );
aEvent.SetClientData( NULL );
delete data;
// Exit if no item found at the current location or the item is already being edited.
if( (item == NULL) || (item->GetFlags() != 0) )
return;
}
INSTALL_UNBUFFERED_DC( dc, DrawPanel );
@ -510,6 +531,7 @@ void SCH_EDIT_FRAME::OnMoveItem( wxCommandEvent& aEvent )
case SCH_HIERARCHICAL_LABEL_T:
case SCH_TEXT_T:
case SCH_COMPONENT_T:
case SCH_SHEET_PIN_T:
MoveItem( item, &dc );
break;
@ -525,10 +547,6 @@ void SCH_EDIT_FRAME::OnMoveItem( wxCommandEvent& aEvent )
MoveField( (SCH_FIELD*) item, &dc );
break;
case SCH_SHEET_PIN_T:
MoveSheetPin( (SCH_SHEET_PIN*) item, &dc );
break;
case SCH_MARKER_T:
default:
wxFAIL_MSG( wxString::Format( wxT( "Cannot move item type %s" ),

View File

@ -1,3 +1,28 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2007 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2011 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
* 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 sheetlab.cpp
* @brief Create and edit the SCH_SHEET_PIN items.
@ -21,71 +46,6 @@
int SCH_EDIT_FRAME::m_lastSheetPinType = NET_INPUT;
wxSize SCH_EDIT_FRAME::m_lastSheetPinTextSize( DEFAULT_SIZE_TEXT, DEFAULT_SIZE_TEXT );
wxPoint SCH_EDIT_FRAME::m_lastSheetPinPosition;
int SCH_EDIT_FRAME::m_lastSheetPinEdge;
/* Called when aborting a move pinsheet label
* delete a new pin sheet label, or restire its old position
*/
static void abortSheetPinMove( EDA_DRAW_PANEL* aPanel, wxDC* aDC )
{
wxCHECK_RET( (aPanel != NULL) && (aDC != NULL), wxT( "Invalid panel or device context." ) );
SCH_EDIT_FRAME* frame = (SCH_EDIT_FRAME*) aPanel->GetParent();
SCH_SHEET_PIN* sheetPin = (SCH_SHEET_PIN*) aPanel->GetScreen()->GetCurItem();
wxCHECK_RET( (frame != NULL) && (sheetPin != NULL) && (sheetPin->Type() == SCH_SHEET_PIN_T),
wxT( "Invalid frame or sheet pin." ) );
sheetPin->Draw( aPanel, aDC, wxPoint( 0, 0 ), g_XorMode );
if( sheetPin->IsNew() )
{
SAFE_DELETE( sheetPin );
}
else
{
// Restore edge position:
sheetPin->m_Pos = frame->GetLastSheetPinPosition();
sheetPin->SetEdge( frame->GetLastSheetPinEdge() );
sheetPin->Draw( aPanel, aDC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE );
sheetPin->ClearFlags();
}
aPanel->GetScreen()->SetCurItem( NULL );
}
static void moveSheetPin( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition,
bool aErase )
{
SCH_SHEET_PIN* sheetPin = (SCH_SHEET_PIN*) aPanel->GetScreen()->GetCurItem();
if( sheetPin == NULL || sheetPin->Type() != SCH_SHEET_PIN_T )
return;
if( aErase )
sheetPin->Draw( aPanel, aDC, wxPoint( 0, 0 ), g_XorMode );
sheetPin->ConstraintOnEdge( aPanel->GetScreen()->GetCrossHairPosition() );
sheetPin->Draw( aPanel, aDC, wxPoint( 0, 0 ), g_XorMode );
}
void SCH_EDIT_FRAME::MoveSheetPin( SCH_SHEET_PIN* aSheetPin, wxDC* aDC )
{
wxCHECK_RET( (aSheetPin != NULL) && (aSheetPin->Type() == SCH_SHEET_PIN_T),
wxT( "Cannot move invalid schematic sheet pin object." ) );
m_lastSheetPinTextSize = aSheetPin->m_Size;
m_lastSheetPinType = aSheetPin->m_Shape;
m_lastSheetPinPosition = aSheetPin->m_Pos;
m_lastSheetPinEdge = aSheetPin->GetEdge();
aSheetPin->SetFlags( IS_MOVED );
DrawPanel->SetMouseCapture( moveSheetPin, abortSheetPinMove );
moveSheetPin( DrawPanel, aDC, wxDefaultPosition, true );
}
int SCH_EDIT_FRAME::EditSheetPin( SCH_SHEET_PIN* aSheetPin, wxDC* aDC )
@ -117,6 +77,12 @@ int SCH_EDIT_FRAME::EditSheetPin( SCH_SHEET_PIN* aSheetPin, wxDC* aDC )
if( aDC )
aSheetPin->Draw( DrawPanel, aDC, wxPoint( 0, 0 ), g_XorMode );
if( !aSheetPin->IsNew() )
{
SaveCopyInUndoList( (SCH_ITEM*) aSheetPin->GetParent(), UR_CHANGED );
GetScreen()->SetCurItem( NULL );
}
aSheetPin->m_Text = dlg.GetLabelName();
aSheetPin->m_Size.y = ReturnValueFromString( g_UserUnit, dlg.GetTextHeight(), m_InternalUnits );
aSheetPin->m_Size.x = ReturnValueFromString( g_UserUnit, dlg.GetTextWidth(), m_InternalUnits );
@ -147,12 +113,10 @@ SCH_SHEET_PIN* SCH_EDIT_FRAME::CreateSheetPin( SCH_SHEET* aSheet, wxDC* aDC )
return NULL;
}
GetScreen()->SetCurItem( sheetPin );
m_lastSheetPinType = sheetPin->m_Shape;
m_lastSheetPinTextSize = sheetPin->m_Size;
DrawPanel->SetMouseCapture( moveSheetPin, abortSheetPinMove );
moveSheetPin( DrawPanel, aDC, wxDefaultPosition, false );
MoveItem( (SCH_ITEM*) sheetPin, aDC );
OnModify();
return sheetPin;
@ -190,17 +154,12 @@ SCH_SHEET_PIN* SCH_EDIT_FRAME::ImportSheetPin( SCH_SHEET* aSheet, wxDC* aDC )
return NULL;
}
OnModify();
SaveCopyInUndoList( aSheet, UR_CHANGED );
sheetPin = new SCH_SHEET_PIN( aSheet, wxPoint( 0, 0 ), label->m_Text );
sheetPin->SetFlags( IS_NEW );
sheetPin->m_Size = m_lastSheetPinTextSize;
m_lastSheetPinType = sheetPin->m_Shape = label->m_Shape;
GetScreen()->SetCurItem( sheetPin );
DrawPanel->SetMouseCapture( moveSheetPin, abortSheetPinMove );
moveSheetPin( DrawPanel, aDC, wxDefaultPosition, false );
MoveItem( (SCH_ITEM*) sheetPin, aDC );
return sheetPin;
}

View File

@ -1,3 +1,26 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* 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 hotkeys_basic.h
* @brief Some functions to handle hotkeys in KiCad
@ -12,8 +35,20 @@
class EDA_DRAW_FRAME;
/* Class to handle hotkey commands. hotkeys have a default value
* This class allows the real key code changed by user(from a key code list file)
/* Identifiers (tags) in key code configuration file (or section names)
* .m_SectionTag member of a EDA_HOTKEY_CONFIG
*/
extern wxString g_CommonSectionTag;
extern wxString g_SchematicSectionTag;
extern wxString g_LibEditSectionTag;
extern wxString g_BoardEditorSectionTag;
extern wxString g_ModuleEditSectionTag;
/**
* class EDA_HOTKEY
* is a class to handle hot key commands. Hot keys have a default value.
* This class allows the real key code changed by user(from a key code list file)
*/
class EDA_HOTKEY
{
@ -49,31 +84,42 @@ public:
const wchar_t* m_Comment; // Will be printed in the config file only.
};
/* Identifiers (tags) in key code configuration file (or section names)
* .m_SectionTag member of a EDA_HOTKEY_CONFIG
/**
* Class EDA_HOTKEY_CLIENT_DATA
* provides client data member for hotkeys to include in command events generated
* by the hot key.
*/
extern wxString g_CommonSectionTag;
extern wxString g_SchematicSectionTag;
extern wxString g_LibEditSectionTag;
extern wxString g_BoardEditorSectionTag;
extern wxString g_ModuleEditSectionTag;
class EDA_HOTKEY_CLIENT_DATA : public wxClientData
{
//< Logical position of the mouse cursor when the hot key was pressed.
wxPoint m_position;
public:
EDA_HOTKEY_CLIENT_DATA( const wxPoint& aPosition = wxDefaultPosition ) :
m_position( aPosition ) {}
void SetPosition( const wxPoint& aPosition ) { m_position = aPosition; }
wxPoint GetPosition() { return m_position; }
};
/* Functions:
*/
void AddHotkeyConfigMenu( wxMenu* menu );
void HandleHotkeyConfigMenuSelection( EDA_DRAW_FRAME* frame, int id );
void AddHotkeyConfigMenu( wxMenu* menu );
void HandleHotkeyConfigMenuSelection( EDA_DRAW_FRAME* frame, int id );
/**
* Function ReturnKeyNameFromKeyCode
* return the key name from the key code
* Only some wxWidgets key values are handled for function key ( see
* * Only some wxWidgets key values are handled for function key ( see
* s_Hotkey_Name_List[] )
* @param aKeycode = key code (ascii value, or wxWidgets value for function keys)
* @param aIsFound = a pointer to a bool to return true if found, or false. an be NULL default)
* @return the key name in a wxString
*/
wxString ReturnKeyNameFromKeyCode( int aKeycode, bool * aIsFound = NULL );
wxString ReturnKeyNameFromKeyCode( int aKeycode, bool * aIsFound = NULL );
/**
* Function ReturnKeyNameFromCommandId
@ -82,9 +128,10 @@ wxString ReturnKeyNameFromKeyCode( int aKeycode, bool * aIsFound = NULL )
* @param aCommandId = Command Id value
* @return the key name in a wxString
*/
wxString ReturnKeyNameFromCommandId( EDA_HOTKEY** aList, int aCommandId );
wxString ReturnKeyNameFromCommandId( EDA_HOTKEY** aList, int aCommandId );
/**
* Function ReturnKeyCodeFromKeyName
* return the key code from its key name
* Only some wxWidgets key values are handled for function key

View File

@ -146,7 +146,6 @@ private:
static int m_lastSheetPinType; ///< Last sheet pin type.
static wxSize m_lastSheetPinTextSize; ///< Last sheet pin text size.
static wxPoint m_lastSheetPinPosition; ///< Last sheet pin position.
static int m_lastSheetPinEdge; ///< Last sheet edge a sheet pin was placed.
protected:
TEMPLATES m_TemplateFieldNames;
@ -773,8 +772,6 @@ public:
wxPoint GetLastSheetPinPosition() const { return m_lastSheetPinPosition; }
int GetLastSheetPinEdge() const { return m_lastSheetPinEdge; }
private:
void StartMoveSheet( SCH_SHEET* sheet, wxDC* DC );
@ -796,14 +793,6 @@ private:
*/
int EditSheetPin( SCH_SHEET_PIN* aSheetPin, wxDC* aDC );
/**
* Function MoveSheetPin
* moves \a aSheetPin within it's parent sheet object.
* @param aSheetPin The sheet pin item to move.
* @param aDC The device context to draw on.
*/
void MoveSheetPin( SCH_SHEET_PIN* aSheetPin, wxDC* aDC );
/**
* Function ImportSheetPin
* automatically creates a sheet pin from the hierarchical labels in the schematic