Upstream merge.

This commit is contained in:
Maciej Suminski 2014-05-05 10:51:31 +02:00
commit 9536ed811d
131 changed files with 1319 additions and 1083 deletions

View File

@ -80,7 +80,7 @@ public:
EDA_3D_CANVAS( EDA_3D_FRAME* parent, int* attribList = 0 ); EDA_3D_CANVAS( EDA_3D_FRAME* parent, int* attribList = 0 );
~EDA_3D_CANVAS(); ~EDA_3D_CANVAS();
EDA_3D_FRAME* Parent() { return (EDA_3D_FRAME*)GetParent(); } EDA_3D_FRAME* Parent() const { return static_cast<EDA_3D_FRAME*>( GetParent() ); }
BOARD* GetBoard() { return Parent()->GetBoard(); } BOARD* GetBoard() { return Parent()->GetBoard(); }

View File

@ -81,7 +81,7 @@ public:
m_auimgr.UnInit(); m_auimgr.UnInit();
}; };
PCB_BASE_FRAME* Parent() { return (PCB_BASE_FRAME*)GetParent(); } PCB_BASE_FRAME* Parent() const { return (PCB_BASE_FRAME*)GetParent(); }
BOARD* GetBoard(); BOARD* GetBoard();

View File

@ -14,7 +14,7 @@ set( BITMAP2COMPONENT_SRCS
) )
set_source_files_properties( ../common/single_top.cpp PROPERTIES set_source_files_properties( ../common/single_top.cpp PROPERTIES
COMPILE_DEFINITIONS "TOP_FRAME=0" COMPILE_DEFINITIONS "TOP_FRAME=FRAME_BM2CMP"
) )
set_source_files_properties( bitmap2cmp_gui.cpp PROPERTIES set_source_files_properties( bitmap2cmp_gui.cpp PROPERTIES
COMPILE_DEFINITIONS "COMPILING_DLL" COMPILE_DEFINITIONS "COMPILING_DLL"

View File

@ -46,7 +46,7 @@
#include <menus_helpers.h> #include <menus_helpers.h>
#include <boost/version.hpp> #include <boost/version.hpp>
#include <typeinfo>
/// The default auto save interval is 10 minutes. /// The default auto save interval is 10 minutes.
#define DEFAULT_AUTO_SAVE_INTERVAL 600 #define DEFAULT_AUTO_SAVE_INTERVAL 600
@ -151,6 +151,19 @@ bool EDA_BASE_FRAME::ProcessEvent( wxEvent& aEvent )
} }
bool EDA_BASE_FRAME::Enable( bool enable )
{
// so we can do logging of this state change:
#if defined(DEBUG)
const char* type_id = typeid( *this ).name();
printf( "wxFrame %s: %s\n", type_id, enable ? "enabled" : "disabled" );
#endif
return wxFrame::Enable( enable );
}
void EDA_BASE_FRAME::onAutoSaveTimer( wxTimerEvent& aEvent ) void EDA_BASE_FRAME::onAutoSaveTimer( wxTimerEvent& aEvent )
{ {
if( !doAutoSave() ) if( !doAutoSave() )
@ -169,12 +182,8 @@ void EDA_BASE_FRAME::ReCreateMenuBar()
} }
void EDA_BASE_FRAME::SetLanguage( wxCommandEvent& event ) void EDA_BASE_FRAME::ShowChangedLanguage()
{ {
int id = event.GetId();
Pgm().SetLanguageIdentifier( id );
Pgm().SetLanguage();
ReCreateMenuBar(); ReCreateMenuBar();
GetMenuBar()->Refresh(); GetMenuBar()->Refresh();
} }
@ -717,27 +726,3 @@ void EDA_BASE_FRAME::CheckForAutoSaveFile( const wxFileName& aFileName,
} }
} }
void EDA_BASE_FRAME::SetModalMode( bool aModal )
{
// Disable all other windows
#if wxCHECK_VERSION(2, 9, 4)
if( IsTopLevel() )
{
wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst();
while( node )
{
wxWindow* win = node->GetData();
if( win != this )
win->Enable( !aModal );
node = node->GetNext();
}
}
#else
// Deprecated since wxWidgets 2.9.4
MakeModal( aModal );
#endif
}

View File

@ -122,6 +122,7 @@ EDA_COLOR_T ColorMix( EDA_COLOR_T aColor1, EDA_COLOR_T aColor2 )
// First easy thing: a black gives always the other colour // First easy thing: a black gives always the other colour
if( aColor1 == BLACK ) if( aColor1 == BLACK )
return aColor2; return aColor2;
if( aColor2 == BLACK) if( aColor2 == BLACK)
return aColor1; return aColor1;

View File

@ -25,17 +25,45 @@
#include <dialog_shim.h> #include <dialog_shim.h>
#include <kiway_player.h> #include <kiway_player.h>
#include <wx/evtloop.h>
/*
Quasi-Modal Mode Explained:
The gtk calls in wxDialog::ShowModal() cause event routing problems if that
modal dialog then tries to use KIWAY_PLAYER::ShowModal(). The latter shows up
and mostly works but does not respond to the window decoration close button.
There is no way to get around this without reversing the gtk calls temporarily.
Quasi-Modal mode is our own almost modal mode which disables only the parent
of the DIALOG_SHIM, leaving other frames operable and while staying captured in the
nested event loop. This avoids the gtk calls and leaves event routing pure
and sufficient to operate the KIWAY_PLAYER::ShowModal() properly. When using
ShowQuasiModal() you have to use EndQuasiModal() in your dialogs and not
EndModal(). There is also IsQuasiModal() but its value can only be true
when the nested event loop is active. Do not mix the modal and quasi-modal
functions. Use one set or the other.
You might find this behavior preferable over a pure modal mode, and it was said
that only the Mac has this natively, but now other platforms have something
similar. You CAN use it anywhere for any dialog. But you MUST use it when
you want to use KIWAY_PLAYER::ShowModal() from a dialog event.
*/
DIALOG_SHIM::DIALOG_SHIM( wxWindow* aParent, wxWindowID id, const wxString& title, DIALOG_SHIM::DIALOG_SHIM( wxWindow* aParent, wxWindowID id, const wxString& title,
const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : const wxPoint& pos, const wxSize& size, long style, const wxString& name ) :
wxDialog( aParent, id, title, pos, size, style, name ), wxDialog( aParent, id, title, pos, size, style, name ),
KIWAY_HOLDER( 0 ) KIWAY_HOLDER( 0 ),
m_qmodal_loop( 0 ),
m_qmodal_showing( false )
{ {
// pray that aParent is either a KIWAY_PLAYER or DIALOG_SHIM derivation. // pray that aParent is either a KIWAY_PLAYER or DIALOG_SHIM derivation.
KIWAY_HOLDER* h = dynamic_cast<KIWAY_HOLDER*>( aParent ); KIWAY_HOLDER* h = dynamic_cast<KIWAY_HOLDER*>( aParent );
wxASSERT_MSG( h, wxASSERT_MSG( h,
wxT( "DIALOG_SHIM's parent not derived from KIWAY_PLAYER nor DIALOG_SHIM" ) ); wxT( "DIALOG_SHIM's parent is NULL or not derived from KIWAY_PLAYER nor DIALOG_SHIM" ) );
if( h ) if( h )
SetKiway( this, &h->Kiway() ); SetKiway( this, &h->Kiway() );
@ -46,6 +74,14 @@ DIALOG_SHIM::DIALOG_SHIM( wxWindow* aParent, wxWindowID id, const wxString& titl
} }
DIALOG_SHIM::~DIALOG_SHIM()
{
// if the dialog is quasi-modal, this will end its event loop
if( IsQuasiModal() )
EndQuasiModal( wxID_CANCEL );
}
// our hashtable is an implementation secret, don't need or want it in a header file // our hashtable is an implementation secret, don't need or want it in a header file
#include <hashtables.h> #include <hashtables.h>
#include <base_struct.h> // EDA_RECT #include <base_struct.h> // EDA_RECT
@ -92,6 +128,169 @@ bool DIALOG_SHIM::Show( bool show )
} }
bool DIALOG_SHIM::Enable( bool enable )
{
// so we can do logging of this state change:
#if defined(DEBUG)
const char* type_id = typeid( *this ).name();
printf( "wxDialog %s: %s\n", type_id, enable ? "enabled" : "disabled" );
#endif
return wxDialog::Enable( enable );
}
#if !wxCHECK_VERSION( 2, 9, 4 )
wxWindow* DIALOG_SHIM::CheckIfCanBeUsedAsParent( wxWindow* parent ) const
{
if ( !parent )
return NULL;
extern WXDLLIMPEXP_DATA_BASE(wxList) wxPendingDelete;
if ( wxPendingDelete.Member(parent) || parent->IsBeingDeleted() )
{
// this window is being deleted and we shouldn't create any children
// under it
return NULL;
}
if ( parent->GetExtraStyle() & wxWS_EX_TRANSIENT )
{
// this window is not being deleted yet but it's going to disappear
// soon so still don't parent this window under it
return NULL;
}
if ( !parent->IsShownOnScreen() )
{
// using hidden parent won't work correctly neither
return NULL;
}
// FIXME-VC6: this compiler requires an explicit const cast or it fails
// with error C2446
if ( const_cast<const wxWindow *>(parent) == this )
{
// not sure if this can really happen but it doesn't hurt to guard
// against this clearly invalid situation
return NULL;
}
return parent;
}
wxWindow* DIALOG_SHIM::GetParentForModalDialog(wxWindow *parent, long style) const
{
// creating a parent-less modal dialog will result (under e.g. wxGTK2)
// in an unfocused dialog, so try to find a valid parent for it unless we
// were explicitly asked not to
if ( style & wxDIALOG_NO_PARENT )
return NULL;
// first try the given parent
if ( parent )
parent = CheckIfCanBeUsedAsParent(wxGetTopLevelParent(parent));
// then the currently active window
if ( !parent )
parent = CheckIfCanBeUsedAsParent(
wxGetTopLevelParent(wxGetActiveWindow()));
// and finally the application main window
if ( !parent )
parent = CheckIfCanBeUsedAsParent(wxTheApp->GetTopWindow());
return parent;
}
#endif
int DIALOG_SHIM::ShowQuasiModal()
{
// toggle a window's "enable" status to disabled, then enabled on exit.
// exception safe.
struct ENABLE_DISABLE
{
wxWindow* m_win;
ENABLE_DISABLE( wxWindow* aWindow ) : m_win( aWindow ) { if( m_win ) m_win->Disable(); }
~ENABLE_DISABLE()
{
if( m_win )
{
m_win->Enable();
m_win->SetFocus(); // let's focus back on the parent window
}
}
};
// This is an exception safe way to zero a pointer before returning.
// Yes, even though DismissModal() clears this first normally, this is
// here in case there's an exception before the dialog is dismissed.
struct NULLER
{
void*& m_what;
NULLER( void*& aPtr ) : m_what( aPtr ) {}
~NULLER() { m_what = 0; } // indeed, set it to NULL on destruction
} clear_this( (void*&) m_qmodal_loop );
// release the mouse if it's currently captured as the window having it
// will be disabled when this dialog is shown -- but will still keep the
// capture making it impossible to do anything in the modal dialog itself
wxWindow* win = wxWindow::GetCapture();
if( win )
win->ReleaseMouse();
wxWindow* parent = GetParentForModalDialog( GetParent(), GetWindowStyle() );
ENABLE_DISABLE toggle( parent ); // quasi-modal: disable only my "optimal" parent
Show( true );
m_qmodal_showing = true;
WX_EVENT_LOOP event_loop;
#if wxCHECK_VERSION( 2, 9, 4 ) // 2.9.4 is only approximate.
// new code needs this, old code does it in wxEventLoop::Run() and cannot
// tolerate it here. Where that boundary is as a version number, I don't know.
// A closer look at the subversion repo for wx would tell.
wxEventLoopActivator event_loop_stacker( &event_loop );
#endif
m_qmodal_loop = &event_loop;
event_loop.Run();
return GetReturnCode();
}
void DIALOG_SHIM::EndQuasiModal( int retCode )
{
SetReturnCode( retCode );
if( !IsQuasiModal() )
{
wxFAIL_MSG( wxT( "either DIALOG_SHIM::EndQuasiModal called twice or ShowQuasiModal wasn't called" ) );
return;
}
m_qmodal_showing = false;
if( m_qmodal_loop )
{
m_qmodal_loop->Exit();
m_qmodal_loop = NULL;
}
Show( false );
}
#if DLGSHIM_USE_SETFOCUS #if DLGSHIM_USE_SETFOCUS
static bool findWindowRecursively( const wxWindowList& children, const wxWindow* wanted ) static bool findWindowRecursively( const wxWindowList& children, const wxWindow* wanted )

View File

@ -589,12 +589,6 @@ bool EDA_DRAW_FRAME::HandleBlockEnd( wxDC* DC )
} }
void EDA_DRAW_FRAME::SetLanguage( wxCommandEvent& event )
{
EDA_BASE_FRAME::SetLanguage( event );
}
void EDA_DRAW_FRAME::UpdateStatusBar() void EDA_DRAW_FRAME::UpdateStatusBar()
{ {
wxString Line; wxString Line;

View File

@ -165,7 +165,7 @@ EDA_DRAW_PANEL::~EDA_DRAW_PANEL()
} }
EDA_DRAW_FRAME* EDA_DRAW_PANEL::GetParent() EDA_DRAW_FRAME* EDA_DRAW_PANEL::GetParent() const
{ {
wxWindow* mom = wxScrolledWindow::GetParent(); wxWindow* mom = wxScrolledWindow::GetParent();
return (EDA_DRAW_FRAME*) mom; return (EDA_DRAW_FRAME*) mom;

View File

@ -62,6 +62,7 @@ const char* EndsWithRev( const char* start, const char* tail, char separator )
} }
#if 0 // Not used
int RevCmp( const char* s1, const char* s2 ) int RevCmp( const char* s1, const char* s2 )
{ {
int r = strncmp( s1, s2, 3 ); int r = strncmp( s1, s2, 3 );
@ -76,6 +77,7 @@ int RevCmp( const char* s1, const char* s2 )
return -(rnum1 - rnum2); // swap the sign, higher revs first return -(rnum1 - rnum2); // swap the sign, higher revs first
} }
#endif
//----<Policy and field test functions>------------------------------------- //----<Policy and field test functions>-------------------------------------
@ -116,7 +118,7 @@ void FPID::clear()
} }
int FPID::Parse( const std::string& aId ) int FPID::Parse( const UTF8& aId )
{ {
clear(); clear();
@ -171,12 +173,6 @@ int FPID::Parse( const std::string& aId )
} }
int FPID::Parse( const wxString& aId )
{
return Parse( std::string( TO_UTF8( aId ) ) );
}
FPID::FPID( const std::string& aId ) throw( PARSE_ERROR ) FPID::FPID( const std::string& aId ) throw( PARSE_ERROR )
{ {
int offset = Parse( aId ); int offset = Parse( aId );
@ -194,14 +190,14 @@ FPID::FPID( const std::string& aId ) throw( PARSE_ERROR )
FPID::FPID( const wxString& aId ) throw( PARSE_ERROR ) FPID::FPID( const wxString& aId ) throw( PARSE_ERROR )
{ {
std::string id = TO_UTF8( aId ); UTF8 id = aId;
int offset = Parse( id ); int offset = Parse( id );
if( offset != -1 ) if( offset != -1 )
{ {
THROW_PARSE_ERROR( _( "Illegal character found in FPID string" ), THROW_PARSE_ERROR( _( "Illegal character found in FPID string" ),
wxString::FromUTF8( id.c_str() ), aId,
id.c_str(), id.c_str(),
0, 0,
offset ); offset );
@ -209,7 +205,7 @@ FPID::FPID( const wxString& aId ) throw( PARSE_ERROR )
} }
int FPID::SetLibNickname( const std::string& aLogical ) int FPID::SetLibNickname( const UTF8& aLogical )
{ {
int offset = okLogical( aLogical ); int offset = okLogical( aLogical );
@ -222,13 +218,7 @@ int FPID::SetLibNickname( const std::string& aLogical )
} }
int FPID::SetLibNickname( const wxString& aLogical ) int FPID::SetFootprintName( const UTF8& aFootprintName )
{
return SetLibNickname( std::string( TO_UTF8( aLogical ) ) );
}
int FPID::SetFootprintName( const std::string& aFootprintName )
{ {
int separation = int( aFootprintName.find_first_of( "/" ) ); int separation = int( aFootprintName.find_first_of( "/" ) );
@ -246,13 +236,7 @@ int FPID::SetFootprintName( const std::string& aFootprintName )
} }
int FPID::SetFootprintName( const wxString& aFootprintName ) int FPID::SetRevision( const UTF8& aRevision )
{
return SetFootprintName( std::string( TO_UTF8( aFootprintName ) ) );
}
int FPID::SetRevision( const std::string& aRevision )
{ {
int offset = okRevision( aRevision ); int offset = okRevision( aRevision );
@ -301,8 +285,10 @@ UTF8 FPID::GetFootprintNameAndRev() const
} }
UTF8 FPID::Format( const std::string& aLogicalLib, const std::string& aFootprintName, #if 0 // this is broken, it does not output aFootprintName for some reason
const std::string& aRevision )
UTF8 FPID::Format( const UTF8& aLogicalLib, const UTF8& aFootprintName,
const UTF8& aRevision )
throw( PARSE_ERROR ) throw( PARSE_ERROR )
{ {
UTF8 ret; UTF8 ret;
@ -344,6 +330,7 @@ UTF8 FPID::Format( const std::string& aLogicalLib, const std::string& aFootprint
return ret; return ret;
} }
#endif
int FPID::compare( const FPID& aFPID ) const int FPID::compare( const FPID& aFPID ) const

View File

@ -28,9 +28,12 @@
#include <kiway.h> #include <kiway.h>
#include <kiway_player.h> #include <kiway_player.h>
#include <kiway_express.h> #include <kiway_express.h>
#include <pgm_base.h>
#include <config.h> #include <config.h>
#include <wx/debug.h> #include <id.h>
#include <wx/stdpaths.h> #include <wx/stdpaths.h>
#include <wx/debug.h>
KIFACE* KIWAY::m_kiface[KIWAY_FACE_COUNT]; KIFACE* KIWAY::m_kiface[KIWAY_FACE_COUNT];
@ -38,22 +41,24 @@ int KIWAY::m_kiface_version[KIWAY_FACE_COUNT];
KIWAY::KIWAY( PGM_BASE* aProgram, wxFrame* aTop ): KIWAY::KIWAY( PGM_BASE* aProgram, int aCtlBits, wxFrame* aTop ):
m_program( aProgram ), m_program( aProgram ),
m_ctl( aCtlBits ),
m_top( 0 ) m_top( 0 )
{ {
SetTop( aTop ); // hook playerDestroyHandler() into aTop. SetTop( aTop ); // hook player_destroy_handler() into aTop.
memset( m_player, 0, sizeof( m_player ) ); memset( m_player, 0, sizeof( m_player ) );
} }
// Any event types derived from wxCommandEvt, like wxWindowDestroyEvent, are // Any event types derived from wxCommandEvt, like wxWindowDestroyEvent, are
// propogated upwards to parent windows if not handled below. Therefor the // propogated upwards to parent windows if not handled below. Therefor the
// m_top window should receive all wxWindowDestroyEvents originating from // m_top window should receive all wxWindowDestroyEvents originating from
// KIWAY_PLAYERs. It does anyways, but now playerDestroyHandler eavesdrops // KIWAY_PLAYERs. It does anyways, but now player_destroy_handler eavesdrops
// on that event stream looking for KIWAY_PLAYERs being closed. // on that event stream looking for KIWAY_PLAYERs being closed.
void KIWAY::playerDestroyHandler( wxWindowDestroyEvent& event ) void KIWAY::player_destroy_handler( wxWindowDestroyEvent& event )
{ {
wxWindow* w = event.GetWindow(); wxWindow* w = event.GetWindow();
@ -62,7 +67,7 @@ void KIWAY::playerDestroyHandler( wxWindowDestroyEvent& event )
// if destroying one of our flock, then mark it as deceased. // if destroying one of our flock, then mark it as deceased.
if( (wxWindow*) m_player[i] == w ) if( (wxWindow*) m_player[i] == w )
{ {
// DBG(printf( "%s: marking m_player[%d] as destroyed\n", __func__, i );) DBG(printf( "%s: marking m_player[%d] as destroyed\n", __func__, i );)
m_player[i] = 0; m_player[i] = 0;
} }
} }
@ -73,12 +78,12 @@ void KIWAY::SetTop( wxFrame* aTop )
{ {
if( m_top ) if( m_top )
{ {
m_top->Disconnect( wxEVT_DESTROY, wxWindowDestroyEventHandler( KIWAY::playerDestroyHandler ), NULL, this ); m_top->Disconnect( wxEVT_DESTROY, wxWindowDestroyEventHandler( KIWAY::player_destroy_handler ), NULL, this );
} }
if( aTop ) if( aTop )
{ {
aTop->Connect( wxEVT_DESTROY, wxWindowDestroyEventHandler( KIWAY::playerDestroyHandler ), NULL, this ); aTop->Connect( wxEVT_DESTROY, wxWindowDestroyEventHandler( KIWAY::player_destroy_handler ), NULL, this );
} }
m_top = aTop; m_top = aTop;
@ -96,8 +101,8 @@ const wxString KIWAY::dso_full_path( FACE_T aFaceId )
case FACE_CVPCB: name = KIFACE_PREFIX wxT( "cvpcb" ); break; case FACE_CVPCB: name = KIFACE_PREFIX wxT( "cvpcb" ); break;
case FACE_GERBVIEW: name = KIFACE_PREFIX wxT( "gerbview" ); break; case FACE_GERBVIEW: name = KIFACE_PREFIX wxT( "gerbview" ); break;
case FACE_PL_EDITOR: name = KIFACE_PREFIX wxT( "pl_editor" ); break; case FACE_PL_EDITOR: name = KIFACE_PREFIX wxT( "pl_editor" ); break;
case FACE_PCB_CALCULATOR: name = KIFACE_PREFIX wxT( "pcb_calculator" ); break;
// case FACE_PCB_CALCULATOR: who knows. case FACE_BMP2CMP: name = KIFACE_PREFIX wxT( "bitmap2component" ); break;
default: default:
wxASSERT_MSG( 0, wxT( "caller has a bug, passed a bad aFaceId" ) ); wxASSERT_MSG( 0, wxT( "caller has a bug, passed a bad aFaceId" ) );
@ -172,7 +177,7 @@ KIFACE* KIWAY::KiFACE( FACE_T aFaceId, bool doLoad )
// Give the DSO a single chance to do its "process level" initialization. // Give the DSO a single chance to do its "process level" initialization.
// "Process level" specifically means stay away from any projects in there. // "Process level" specifically means stay away from any projects in there.
if( kiface->OnKifaceStart( m_program, KFCTL_PROJECT_SUITE ) ) if( kiface->OnKifaceStart( m_program, m_ctl ) )
{ {
// Tell dso's wxDynamicLibrary destructor not to Unload() the program image. // Tell dso's wxDynamicLibrary destructor not to Unload() the program image.
(void) dso.Detach(); (void) dso.Detach();
@ -214,12 +219,14 @@ KIWAY::FACE_T KIWAY::KifaceType( FRAME_T aFrameType )
case FRAME_SCH: case FRAME_SCH:
case FRAME_SCH_LIB_EDITOR: case FRAME_SCH_LIB_EDITOR:
case FRAME_SCH_VIEWER: case FRAME_SCH_VIEWER:
case FRAME_SCH_VIEWER_MODAL:
return FACE_SCH; return FACE_SCH;
case FRAME_PCB: case FRAME_PCB:
case FRAME_PCB_MODULE_EDITOR: case FRAME_PCB_MODULE_EDITOR:
case FRAME_PCB_MODULE_VIEWER: case FRAME_PCB_MODULE_VIEWER:
case FRAME_PCB_FOOTPRINT_WIZARD: case FRAME_PCB_MODULE_VIEWER_MODAL:
case FRAME_PCB_FOOTPRINT_WIZARD_MODAL:
case FRAME_PCB_DISPLAY3D: case FRAME_PCB_DISPLAY3D:
return FACE_PCB; return FACE_PCB;
@ -233,6 +240,12 @@ KIWAY::FACE_T KIWAY::KifaceType( FRAME_T aFrameType )
case FRAME_PL_EDITOR: case FRAME_PL_EDITOR:
return FACE_PL_EDITOR; return FACE_PL_EDITOR;
case FRAME_CALC:
return FACE_PCB_CALCULATOR;
case FRAME_BM2CMP:
return FACE_BMP2CMP;
default: default:
return FACE_T( -1 ); return FACE_T( -1 );
} }
@ -266,7 +279,12 @@ KIWAY_PLAYER* KIWAY::Player( FRAME_T aFrameType, bool doCreate )
if( kiface ) if( kiface )
{ {
KIWAY_PLAYER* frame = (KIWAY_PLAYER*) kiface->CreateWindow( m_top, aFrameType, this, KFCTL_PROJECT_SUITE ); KIWAY_PLAYER* frame = (KIWAY_PLAYER*) kiface->CreateWindow(
m_top,
aFrameType,
this,
m_ctl // questionable need, these same flags where passed to the KIFACE::OnKifaceStart()
);
wxASSERT( frame ); wxASSERT( frame );
return m_player[aFrameType] = frame; return m_player[aFrameType] = frame;
@ -327,6 +345,39 @@ void KIWAY::ExpressMail( FRAME_T aDestination,
} }
void KIWAY::SetLanguage( int aLanguage )
{
Pgm().SetLanguageIdentifier( aLanguage );
Pgm().SetLanguage();
#if 1
// This is a risky hack that goes away if we allow the language to be
// set only from the top most frame if !Kiface.IsSingle()
// Only for the C++ project manager, and not for the python one and not for
// single_top do we look for the EDA_BASE_FRAME as the top level window.
// For single_top this is not needed because that window is registered in
// the array below.
if( m_ctl & KFCTL_CPP_PROJECT_SUITE )
{
EDA_BASE_FRAME* top = (EDA_BASE_FRAME*) m_top;
if( top )
top->ShowChangedLanguage();
}
#endif
for( unsigned i=0; i < DIM( m_player ); ++i )
{
KIWAY_PLAYER* frame = m_player[i];
if( frame )
{
frame->ShowChangedLanguage();
}
}
}
bool KIWAY::ProcessEvent( wxEvent& aEvent ) bool KIWAY::ProcessEvent( wxEvent& aEvent )
{ {
KIWAY_EXPRESS* mail = dynamic_cast<KIWAY_EXPRESS*>( &aEvent ); KIWAY_EXPRESS* mail = dynamic_cast<KIWAY_EXPRESS*>( &aEvent );
@ -351,3 +402,14 @@ bool KIWAY::ProcessEvent( wxEvent& aEvent )
return false; return false;
} }
void KIWAY::OnKiwayEnd()
{
for( unsigned i=0; i < DIM( m_kiface ); ++i )
{
if( m_kiface[i] )
m_kiface[i]->OnKifaceEnd();
}
}

View File

@ -1,29 +1,53 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2014 KiCad Developers, see CHANGELOG.TXT for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* 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
*/
#include <kiway_player.h> #include <kiway_player.h>
#include <kiway_express.h> #include <kiway_express.h>
#include <kiway.h>
#include <id.h>
#include <macros.h>
#include <typeinfo> #include <typeinfo>
#include <wx/utils.h>
#include <wx/evtloop.h>
BEGIN_EVENT_TABLE( KIWAY_PLAYER, EDA_BASE_FRAME ) BEGIN_EVENT_TABLE( KIWAY_PLAYER, EDA_BASE_FRAME )
/* have not been able to get this to work yet:
EVT_KIWAY_EXPRESS( KIWAY_PLAYER::kiway_express ) EVT_KIWAY_EXPRESS( KIWAY_PLAYER::kiway_express )
Use Connect() in constructor until this can be sorted out. EVT_MENU_RANGE( ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, KIWAY_PLAYER::language_change )
OK the problem is KIWAY_PLAYER::wxEVENT_ID not being unique accross all link images.
*/
END_EVENT_TABLE() END_EVENT_TABLE()
KIWAY_PLAYER::KIWAY_PLAYER( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType, KIWAY_PLAYER::KIWAY_PLAYER( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType,
const wxString& aTitle, const wxPoint& aPos, const wxSize& aSize, const wxString& aTitle, const wxPoint& aPos, const wxSize& aSize,
long aStyle, const wxString& aWdoName ) : long aStyle, const wxString& aWdoName ) :
EDA_BASE_FRAME( aParent, aFrameType, aTitle, aPos, aSize, aStyle, aWdoName ), EDA_BASE_FRAME( aParent, aFrameType, aTitle, aPos, aSize, aStyle, aWdoName ),
KIWAY_HOLDER( aKiway ) KIWAY_HOLDER( aKiway ),
m_modal( false ),
m_modal_loop( 0 )
{ {
DBG( printf("KIWAY_EXPRESS::wxEVENT_ID:%d\n", KIWAY_EXPRESS::wxEVENT_ID );) // DBG( printf("KIWAY_EXPRESS::wxEVENT_ID:%d\n", KIWAY_EXPRESS::wxEVENT_ID );)
Connect( KIWAY_EXPRESS::wxEVENT_ID, wxKiwayExressHandler( KIWAY_PLAYER::kiway_express ) );
} }
@ -31,10 +55,96 @@ KIWAY_PLAYER::KIWAY_PLAYER( wxWindow* aParent, wxWindowID aId, const wxString& a
const wxPoint& aPos, const wxSize& aSize, long aStyle, const wxPoint& aPos, const wxSize& aSize, long aStyle,
const wxString& aWdoName ) : const wxString& aWdoName ) :
EDA_BASE_FRAME( aParent, (FRAME_T) aId, aTitle, aPos, aSize, aStyle, aWdoName ), EDA_BASE_FRAME( aParent, (FRAME_T) aId, aTitle, aPos, aSize, aStyle, aWdoName ),
KIWAY_HOLDER( 0 ) KIWAY_HOLDER( 0 ),
m_modal( false ),
m_modal_loop( 0 )
{ {
DBG( printf("KIWAY_EXPRESS::wxEVENT_ID:%d\n", KIWAY_EXPRESS::wxEVENT_ID );) // DBG( printf("KIWAY_EXPRESS::wxEVENT_ID:%d\n", KIWAY_EXPRESS::wxEVENT_ID );)
Connect( KIWAY_EXPRESS::wxEVENT_ID, wxKiwayExressHandler( KIWAY_PLAYER::kiway_express ) ); }
KIWAY_PLAYER::~KIWAY_PLAYER(){}
void KIWAY_PLAYER::KiwayMailIn( KIWAY_EXPRESS& aEvent )
{
// override this in derived classes.
}
bool KIWAY_PLAYER::ShowModal( wxString* aResult )
{
wxASSERT_MSG( IsModal(), wxT( "ShowModal() shouldn't be called on non-modal frame" ) );
/*
This function has a nice interface but a necessarily unsightly implementation.
Now the implementation is encapsulated, localizing future changes.
It works in tandem with DismissModal(). But only ShowModal() is in the
vtable and therefore cross-module capable.
*/
// This is an exception safe way to zero a pointer before returning.
// Yes, even though DismissModal() clears this first normally, this is
// here in case there's an exception before the dialog is dismissed.
struct NULLER
{
void*& m_what;
NULLER( void*& aPtr ) : m_what( aPtr ) {}
~NULLER() { m_what = 0; } // indeed, set it to NULL on destruction
} clear_this( (void*&) m_modal_loop );
// exception safe way to disable all frames except the modal one,
// re-enables only those that were disabled on exit
wxWindowDisabler toggle( this );
Show( true );
WX_EVENT_LOOP event_loop;
#if wxCHECK_VERSION( 2, 9, 4 ) // 2.9.4 is only approximate.
// new code needs this, old code does it in wxEventLoop::Run() and cannot
// tolerate it here. Where that boundary is as a version number, I don't know.
// A closer look at the subversion repo for wx would tell.
wxEventLoopActivator event_loop_stacker( &event_loop );
#endif
m_modal_loop = &event_loop;
event_loop.Run();
if( aResult )
*aResult = m_modal_string;
DBG(printf( "~%s: aResult:'%s' ret:%d\n",
__func__, TO_UTF8( m_modal_string ), m_modal_ret_val );)
return m_modal_ret_val;
}
bool KIWAY_PLAYER::IsDismissed()
{
bool ret = !m_modal_loop;
DBG(printf( "%s: ret:%d\n", __func__, ret );)
return ret;
}
void KIWAY_PLAYER::DismissModal( bool aRetVal, const wxString& aResult )
{
m_modal_ret_val = aRetVal;
m_modal_string = aResult;
if( m_modal_loop )
{
m_modal_loop->Exit();
m_modal_loop = 0; // this marks it as dismissed.
}
Show( false );
} }
@ -44,15 +154,18 @@ void KIWAY_PLAYER::kiway_express( KIWAY_EXPRESS& aEvent )
#if defined(DEBUG) #if defined(DEBUG)
const char* class_name = typeid( this ).name(); const char* class_name = typeid( this ).name();
printf( "%s: cmd:%d pay:'%s'\n", class_name, printf( "%s: received cmd:%d pay:'%s'\n", class_name,
aEvent.GetEventType(), aEvent.GetPayload().c_str() ); aEvent.Command(), aEvent.GetPayload().c_str() );
#endif #endif
KiwayMailIn( aEvent ); // call the virtual, overload in derived. KiwayMailIn( aEvent ); // call the virtual, override in derived.
} }
void KIWAY_PLAYER::KiwayMailIn( KIWAY_EXPRESS& aEvent ) void KIWAY_PLAYER::language_change( wxCommandEvent& event )
{ {
// overload this. int id = event.GetId();
// tell all the KIWAY_PLAYERs about the language change.
Kiway().SetLanguage( id );
} }

View File

@ -192,7 +192,7 @@ void WS_DRAW_ITEM_TEXT::DrawWsItem( EDA_RECT* aClipBox, wxDC* aDC )
} }
// return true if the point aPosition is on the text // return true if the point aPosition is on the text
bool WS_DRAW_ITEM_TEXT::HitTest( const wxPoint& aPosition) bool WS_DRAW_ITEM_TEXT::HitTest( const wxPoint& aPosition) const
{ {
return EDA_TEXT::TextHitTest( aPosition, 0 ); return EDA_TEXT::TextHitTest( aPosition, 0 );
} }
@ -221,7 +221,7 @@ void WS_DRAW_ITEM_POLYGON::DrawWsItem( EDA_RECT* aClipBox, wxDC* aDC )
// return true if the point aPosition is inside one of polygons // return true if the point aPosition is inside one of polygons
#include <polygon_test_point_inside.h> #include <polygon_test_point_inside.h>
bool WS_DRAW_ITEM_POLYGON::HitTest( const wxPoint& aPosition) bool WS_DRAW_ITEM_POLYGON::HitTest( const wxPoint& aPosition) const
{ {
return TestPointInsidePolygon( &m_Corners[0], return TestPointInsidePolygon( &m_Corners[0],
m_Corners.size(), aPosition ); m_Corners.size(), aPosition );
@ -249,7 +249,7 @@ void WS_DRAW_ITEM_RECT::DrawWsItem( EDA_RECT* aClipBox, wxDC* aDC )
} }
// return true if the point aPosition is on the rect outline // return true if the point aPosition is on the rect outline
bool WS_DRAW_ITEM_RECT::HitTest( const wxPoint& aPosition) bool WS_DRAW_ITEM_RECT::HitTest( const wxPoint& aPosition) const
{ {
int dist = GetPenWidth()/2; int dist = GetPenWidth()/2;
wxPoint start = GetStart(); wxPoint start = GetStart();
@ -316,7 +316,7 @@ void WS_DRAW_ITEM_LINE::DrawWsItem( EDA_RECT* aClipBox, wxDC* aDC )
} }
// return true if the point aPosition is on the text // return true if the point aPosition is on the text
bool WS_DRAW_ITEM_LINE::HitTest( const wxPoint& aPosition) bool WS_DRAW_ITEM_LINE::HitTest( const wxPoint& aPosition) const
{ {
return TestSegmentHit( aPosition, GetStart(), GetEnd(), GetPenWidth()/2 ); return TestSegmentHit( aPosition, GetStart(), GetEnd(), GetPenWidth()/2 );
} }
@ -394,9 +394,9 @@ void WS_DRAW_ITEM_BITMAP::DrawWsItem( EDA_RECT* aClipBox, wxDC* aDC )
* Virtual function * Virtual function
* return true if the point aPosition is on bitmap * return true if the point aPosition is on bitmap
*/ */
bool WS_DRAW_ITEM_BITMAP::HitTest( const wxPoint& aPosition) bool WS_DRAW_ITEM_BITMAP::HitTest( const wxPoint& aPosition) const
{ {
WORKSHEET_DATAITEM_BITMAP* parent = (WORKSHEET_DATAITEM_BITMAP*)GetParent(); const WORKSHEET_DATAITEM_BITMAP* parent = static_cast<const WORKSHEET_DATAITEM_BITMAP*>( GetParent() );
if( parent->m_ImageBitmap == NULL ) if( parent->m_ImageBitmap == NULL )
return false; return false;

View File

@ -622,7 +622,7 @@ bool PGM_BASE::SetLanguage( bool first_time )
void PGM_BASE::SetLanguageIdentifier( int menu_id ) void PGM_BASE::SetLanguageIdentifier( int menu_id )
{ {
wxLogDebug( wxT( "Select language ID %d from %zd possible languages." ), wxLogDebug( wxT( "Select language ID %d from %d possible languages." ),
menu_id, DIM( s_Languages ) ); menu_id, DIM( s_Languages ) );
for( unsigned ii = 0; ii < DIM( s_Languages ); ii++ ) for( unsigned ii = 0; ii < DIM( s_Languages ); ii++ )

View File

@ -60,9 +60,9 @@ void PROJECT::SetProjectFullName( const wxString& aFullPathAndName )
wxASSERT( m_project_name.GetName() == NAMELESS_PROJECT || m_project_name.IsAbsolute() ); wxASSERT( m_project_name.GetName() == NAMELESS_PROJECT || m_project_name.IsAbsolute() );
#if 0 #if 0
wxASSERT( m_project_name.GetExt() == wxT( ".pro" ) ) wxASSERT( m_project_name.GetExt() == ProjectFileExtension )
#else #else
m_project_name.SetExt( wxT( ".pro" ) ); m_project_name.SetExt( ProjectFileExtension );
#endif #endif
// until multiple projects are in play, set an environment variable for the // until multiple projects are in play, set an environment variable for the
@ -269,19 +269,21 @@ wxConfigBase* PROJECT::configCreate( const SEARCH_STACK& aSList, const wxString&
// No suitable pro file was found, either does not exist, or is too old. // No suitable pro file was found, either does not exist, or is too old.
// Use the template kicad.pro file. Find it by using caller's SEARCH_STACK. // Use the template kicad.pro file. Find it by using caller's SEARCH_STACK.
wxString templateFile = wxT( "kicad." ) + ProjectFileExtension;
wxString kicad_pro_template = aSList.FindValidPath( wxT( "kicad.pro" ) ); wxString kicad_pro_template = aSList.FindValidPath( templateFile );
if( !kicad_pro_template ) if( !kicad_pro_template )
{ {
wxLogDebug( wxT( "Template file <kicad.pro> not found using search paths." ) ); wxLogDebug( wxT( "Template file <%s> not found using search paths." ),
GetChars( templateFile ) );
wxFileName templ( wxStandardPaths::Get().GetDocumentsDir(), wxFileName templ( wxStandardPaths::Get().GetDocumentsDir(),
wxT( "kicad" ), ProjectFileExtension ); wxT( "kicad" ), ProjectFileExtension );
if( !templ.IsFileReadable() ) if( !templ.IsFileReadable() )
{ {
wxString msg = wxString::Format( _( "Unable to find kicad.pro template file." ) ); wxString msg = wxString::Format( _( "Unable to find %s template config file." ),
GetChars( templateFile ) );
DisplayError( NULL, msg ); DisplayError( NULL, msg );
@ -291,8 +293,12 @@ wxConfigBase* PROJECT::configCreate( const SEARCH_STACK& aSList, const wxString&
kicad_pro_template = templ.GetFullPath(); kicad_pro_template = templ.GetFullPath();
} }
// copy the template to cur_pro_fn, and open it at that destination. // The project config file is not found (happens for new projects,
wxCopyFile( kicad_pro_template, cur_pro_fn ); // or if the schematic editor is run outside an existing project
// In this case the default template (kicad.pro) is used
cur_pro_fn = kicad_pro_template;
wxLogDebug( wxT( "Use template file '%s' as project file." ), GetChars( cur_pro_fn ) );
cfg = new wxFileConfig( wxEmptyString, wxEmptyString, cur_pro_fn, wxEmptyString ); cfg = new wxFileConfig( wxEmptyString, wxEmptyString, cur_pro_fn, wxEmptyString );
cfg->DontCreateOnDemand(); cfg->DontCreateOnDemand();

View File

@ -121,7 +121,7 @@ static const wxString dso_full_path( const wxString& aAbsoluteArgv0 )
// Only a single KIWAY is supported in this single_top top level component, // Only a single KIWAY is supported in this single_top top level component,
// which is dedicated to loading only a single DSO. // which is dedicated to loading only a single DSO.
KIWAY Kiway( &Pgm() ); KIWAY Kiway( &Pgm(), KFCTL_STANDALONE );
// implement a PGM_BASE and a wxApp side by side: // implement a PGM_BASE and a wxApp side by side:
@ -225,82 +225,6 @@ struct APP_SINGLE_TOP : public wxApp
IMPLEMENT_APP( APP_SINGLE_TOP ); IMPLEMENT_APP( APP_SINGLE_TOP );
/**
* Function get_kiface_getter
* returns a KIFACE_GETTER_FUNC for the current process's main implementation
* link image.
*
* @param aDSOName is an absolute full path to the DSO to load and find
* KIFACE_GETTER_FUNC within.
*
* @return KIFACE_GETTER_FUNC* - a pointer to a function which can be called to
* get the KIFACE or NULL if the getter func was not found. If not found,
* it is possibly not version compatible since the lookup is done by name and
* the name contains the API version.
*/
static KIFACE_GETTER_FUNC* get_kiface_getter( const wxString& aDSOName )
{
#if defined(BUILD_KIWAY_DLL)
// Remember single_top only knows about a single DSO. Using an automatic
// with a defeated destructor, see Detach() below, so that the DSO program
// image stays in RAM until process termination, and specifically
// beyond the point in time at which static destructors are run. Otherwise
// a static wxDynamicLibrary's destructor might create an out of sequence
// problem. This was never detected, so it's only a preventative strategy.
wxDynamicLibrary dso;
void* addr = NULL;
if( !dso.Load( aDSOName, wxDL_VERBATIM | wxDL_NOW ) )
{
// Failure: error reporting UI was done via wxLogSysError().
// No further reporting required here.
}
else if( ( addr = dso.GetSymbol( wxT( KIFACE_INSTANCE_NAME_AND_VERSION ) ) ) == NULL )
{
// Failure: error reporting UI was done via wxLogSysError().
// No further reporting required here.
}
else
{
// Tell dso's wxDynamicLibrary destructor not to Unload() the program image.
(void) dso.Detach();
return (KIFACE_GETTER_FUNC*) addr;
}
// There is a file installation bug. We only look for KIFACE_I's which we know
// to exist, and we did not find one. If we do not find one, this is an
// installation bug.
wxString msg = wxString::Format( wxT(
"Fatal Installation Bug\nmissing file:\n'%s'\n\nargv[0]:\n'%s'" ),
GetChars( aDSOName ),
GetChars( wxStandardPaths::Get().GetExecutablePath() )
);
// This is a fatal error, one from which we cannot recover, nor do we want
// to protect against in client code which would require numerous noisy
// tests in numerous places. So we inform the user that the installation
// is bad. This exception will likely not get caught until way up in the
// wxApp derivative, at which point the process will exit gracefully.
THROW_IO_ERROR( msg );
#else
return &KIFACE_GETTER;
#endif
}
static KIFACE* kiface;
static int kiface_version;
bool PGM_SINGLE_TOP::OnPgmInit( wxApp* aWxApp ) bool PGM_SINGLE_TOP::OnPgmInit( wxApp* aWxApp )
{ {
// first thing: set m_wx_app // first thing: set m_wx_app
@ -321,44 +245,27 @@ bool PGM_SINGLE_TOP::OnPgmInit( wxApp* aWxApp )
if( !initPgm() ) if( !initPgm() )
return false; return false;
wxString dname = dso_full_path( absoluteArgv0 ); #if !defined(BUILD_KIWAY_DLL)
// Get the getter, it is statically linked into this binary image.
KIFACE_GETTER_FUNC* getter = &KIFACE_GETTER;
// Get the getter. int kiface_version;
KIFACE_GETTER_FUNC* getter = get_kiface_getter( dname );
if( !getter )
{
// get_kiface_getter() failed & already showed the UI message.
// Return failure without any further UI.
return false;
}
// Get the KIFACE. // Get the KIFACE.
kiface = getter( &kiface_version, KIFACE_VERSION, this ); KIFACE* kiface = getter( &kiface_version, KIFACE_VERSION, this );
// KIFACE_GETTER_FUNC function comment (API) says the non-NULL is unconditional. // Trick the KIWAY into thinking it loaded a KIFACE, by recording the KIFACE
wxASSERT_MSG( kiface, wxT( "attempted DSO has a bug, failed to return a KIFACE*" ) ); // in the KIWAY. It needs to be there for KIWAY::OnKiwayEnd() anyways.
Kiway.set_kiface( KIWAY::KifaceType( TOP_FRAME ), kiface );
// Give the DSO a single chance to do its "process level" initialization.
// "Process level" specifically means stay away from any projects in there.
if( !kiface->OnKifaceStart( this, KFCTL_STANDALONE ) )
return false;
// Use KIFACE to create a top window that the KIFACE knows about.
// TOP_FRAME is passed on compiler command line from CMake, and is one of
// the types in FRAME_T.
// KIFACE::CreateWindow() is a virtual so we don't need to link to it.
// Remember its in the *.kiface DSO.
#if 0
// this pulls in EDA_DRAW_FRAME type info, which we don't want in
// the single_top link image.
KIWAY_PLAYER* frame = dynamic_cast<KIWAY_PLAYER*>( kiface->CreateWindow(
NULL, TOP_FRAME, &Kiway, KFCTL_STANDALONE ) );
#else
KIWAY_PLAYER* frame = (KIWAY_PLAYER*) kiface->CreateWindow(
NULL, TOP_FRAME, &Kiway, KFCTL_STANDALONE );
#endif #endif
// Use KIWAY to create a top window, which registers its existence also.
// "TOP_FRAME" is a macro that is passed on compiler command line from CMake,
// and is one of the types in FRAME_T.
KIWAY_PLAYER* frame = Kiway.Player( TOP_FRAME, true );
Kiway.SetTop( frame );
App().SetTopWindow( frame ); // wxApp gets a face. App().SetTopWindow( frame ); // wxApp gets a face.
// Open project or file specified on the command line: // Open project or file specified on the command line:
@ -454,8 +361,7 @@ bool PGM_SINGLE_TOP::OnPgmInit( wxApp* aWxApp )
void PGM_SINGLE_TOP::OnPgmExit() void PGM_SINGLE_TOP::OnPgmExit()
{ {
if( kiface ) Kiway.OnKiwayEnd();
kiface->OnKifaceEnd();
saveCommonSettings(); saveCommonSettings();

View File

@ -76,8 +76,6 @@ BEGIN_EVENT_TABLE( CVPCB_MAINFRAME, EDA_BASE_FRAME )
EVT_MENU( ID_CVPCB_LIB_TABLE_EDIT, CVPCB_MAINFRAME::OnEditFootprintLibraryTable ) EVT_MENU( ID_CVPCB_LIB_TABLE_EDIT, CVPCB_MAINFRAME::OnEditFootprintLibraryTable )
EVT_MENU_RANGE( ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, CVPCB_MAINFRAME::SetLanguage )
// Toolbar events // Toolbar events
EVT_TOOL( ID_CVPCB_QUIT, CVPCB_MAINFRAME::OnQuit ) EVT_TOOL( ID_CVPCB_QUIT, CVPCB_MAINFRAME::OnQuit )
EVT_TOOL( ID_CVPCB_READ_INPUT_NETLIST, CVPCB_MAINFRAME::LoadNetList ) EVT_TOOL( ID_CVPCB_READ_INPUT_NETLIST, CVPCB_MAINFRAME::LoadNetList )
@ -558,12 +556,6 @@ void CVPCB_MAINFRAME::DisplayModule( wxCommandEvent& event )
} }
void CVPCB_MAINFRAME::SetLanguage( wxCommandEvent& event )
{
EDA_BASE_FRAME::SetLanguage( event );
}
void CVPCB_MAINFRAME::DisplayDocFile( wxCommandEvent& event ) void CVPCB_MAINFRAME::DisplayDocFile( wxCommandEvent& event )
{ {
GetAssociatedDocument( this, m_DocModulesFileName, &Kiface().KifaceSearch() ); GetAssociatedDocument( this, m_DocModulesFileName, &Kiface().KifaceSearch() );

View File

@ -123,12 +123,6 @@ public:
void ChangeFocus( bool aMoveRight ); void ChangeFocus( bool aMoveRight );
/**
* Function SetLanguage
* is called on a language menu selection.
*/
void SetLanguage( wxCommandEvent& event );
void ToFirstNA( wxCommandEvent& event ); void ToFirstNA( wxCommandEvent& event );
void ToPreviousNA( wxCommandEvent& event ); void ToPreviousNA( wxCommandEvent& event );

View File

@ -52,7 +52,7 @@ public:
int GetSelection(); int GetSelection();
void OnSize( wxSizeEvent& event ); void OnSize( wxSizeEvent& event );
virtual CVPCB_MAINFRAME* GetParent(); virtual CVPCB_MAINFRAME* GetParent() const;
}; };

View File

@ -79,7 +79,7 @@ int ITEMS_LISTBOX_BASE::GetSelection()
} }
CVPCB_MAINFRAME* ITEMS_LISTBOX_BASE::GetParent() CVPCB_MAINFRAME* ITEMS_LISTBOX_BASE::GetParent() const
{ {
return (CVPCB_MAINFRAME*) wxListView::GetParent(); return (CVPCB_MAINFRAME*) wxListView::GetParent();
} }

View File

@ -654,14 +654,14 @@ public:
*/ */
void SetPartCount( int count ); void SetPartCount( int count );
int GetPartCount() { return m_unitCount; } int GetPartCount() const { return m_unitCount; }
/** /**
* Function IsMulti * Function IsMulti
* @return true if the component has multiple parts per package. * @return true if the component has multiple parts per package.
* When happens, the reference has a sub reference ti identify part * When happens, the reference has a sub reference ti identify part
*/ */
bool IsMulti() { return m_unitCount > 1; } bool IsMulti() const { return m_unitCount > 1; }
/** /**
* Function SubReference * Function SubReference

View File

@ -30,6 +30,7 @@
#include <fctsys.h> #include <fctsys.h>
#include <pgm_base.h> #include <pgm_base.h>
#include <kiway.h>
#include <gr_basic.h> #include <gr_basic.h>
#include <class_drawpanel.h> #include <class_drawpanel.h>
#include <confirm.h> #include <confirm.h>
@ -147,10 +148,10 @@ void SCH_EDIT_FRAME::EditComponent( SCH_COMPONENT* aComponent )
// make sure the chipnameTextCtrl is wide enough to hold any unusually long chip names: // make sure the chipnameTextCtrl is wide enough to hold any unusually long chip names:
EnsureTextCtrlWidth( dlg->chipnameTextCtrl ); EnsureTextCtrlWidth( dlg->chipnameTextCtrl );
dlg->ShowModal(); dlg->ShowQuasiModal();
m_canvas->MoveCursorToCrossHair();
m_canvas->SetIgnoreMouseEvents( false ); m_canvas->SetIgnoreMouseEvents( false );
m_canvas->MoveCursorToCrossHair();
dlg->Destroy(); dlg->Destroy();
} }
@ -213,7 +214,7 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnListItemSelected( wxListEvent& event
void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnCancelButtonClick( wxCommandEvent& event ) void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnCancelButtonClick( wxCommandEvent& event )
{ {
EndModal( 1 ); EndQuasiModal( 1 );
} }
@ -378,7 +379,7 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnOKButtonClick( wxCommandEvent& event
m_Parent->GetScreen()->TestDanglingEnds(); m_Parent->GetScreen()->TestDanglingEnds();
m_Parent->GetCanvas()->Refresh( true ); m_Parent->GetCanvas()->Refresh( true );
EndModal( 0 ); EndQuasiModal( 0 );
} }
@ -435,8 +436,36 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::deleteFieldButtonHandler( wxCommandEven
void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::showButtonHandler( wxCommandEvent& event ) void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::showButtonHandler( wxCommandEvent& event )
{ {
#if 0
wxString datasheet_uri = fieldValueTextCtrl->GetValue(); wxString datasheet_uri = fieldValueTextCtrl->GetValue();
::wxLaunchDefaultBrowser( datasheet_uri ); ::wxLaunchDefaultBrowser( datasheet_uri );
#else
unsigned fieldNdx = getSelectedFieldNdx();
if( fieldNdx == DATASHEET )
{
wxString datasheet_uri = fieldValueTextCtrl->GetValue();
::wxLaunchDefaultBrowser( datasheet_uri );
}
else if( fieldNdx == FOOTPRINT )
{
// pick a footprint using the footprint picker.
wxString fpid;
KIWAY_PLAYER* frame = Kiway().Player( FRAME_PCB_MODULE_VIEWER_MODAL, true );
if( frame->ShowModal( &fpid ) )
{
printf( "%s: %s\n", __func__, TO_UTF8( fpid ) );
fieldValueTextCtrl->SetValue( fpid );
}
frame->Destroy();
}
#endif
} }
@ -733,7 +762,16 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::copySelectedFieldToPanel()
fieldValueTextCtrl->SetValue( field.GetText() ); fieldValueTextCtrl->SetValue( field.GetText() );
m_show_datasheet_button->Enable( fieldNdx == DATASHEET ); m_show_datasheet_button->Enable( fieldNdx == DATASHEET || fieldNdx == FOOTPRINT );
if( fieldNdx == DATASHEET )
m_show_datasheet_button->SetLabel( _( "Show in Browser" ) );
else if( fieldNdx == FOOTPRINT )
m_show_datasheet_button->SetLabel( _( "Assign Footprint" ) );
else
m_show_datasheet_button->SetLabel( wxEmptyString );
m_show_datasheet_button->Enable( fieldNdx == DATASHEET || fieldNdx == FOOTPRINT );
// For power symbols, the value is NOR editable, because value and pin // For power symbols, the value is NOR editable, because value and pin
// name must be same and can be edited only in library editor // name must be same and can be edited only in library editor
@ -975,5 +1013,5 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::SetInitCmp( wxCommandEvent& event )
m_Parent->OnModify(); m_Parent->OnModify();
m_Cmp->Draw( m_Parent->GetCanvas(), &dc, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE ); m_Cmp->Draw( m_Parent->GetCanvas(), &dc, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE );
EndModal( 1 ); EndQuasiModal( 1 );
} }

View File

@ -36,11 +36,11 @@
#include <eda_dde.h> #include <eda_dde.h>
#include <wxEeschemaStruct.h> #include <wxEeschemaStruct.h>
#include <libeditframe.h> #include <libeditframe.h>
#include <viewlib_frame.h>
#include <eda_text.h> #include <eda_text.h>
#include <general.h> #include <general.h>
#include <class_libentry.h> #include <class_libentry.h>
//#include <sch_junction.h>
#include <hotkeys.h> #include <hotkeys.h>
#include <dialogs/dialog_color_config.h> #include <dialogs/dialog_color_config.h>
#include <transform.h> #include <transform.h>
@ -105,6 +105,15 @@ static struct IFACE : public KIFACE_I
} }
break; break;
case FRAME_SCH_VIEWER:
case FRAME_SCH_VIEWER_MODAL:
{
LIB_VIEW_FRAME* frame = new LIB_VIEW_FRAME( aKiway, aParent, FRAME_T( aClassId ) );
return frame;
}
break;
default: default:
return NULL; return NULL;
} }

View File

@ -118,7 +118,10 @@ EDA_COLOR_T GetInvisibleItemColor()
void LIB_EDIT_FRAME::InstallConfigFrame( wxCommandEvent& event ) void LIB_EDIT_FRAME::InstallConfigFrame( wxCommandEvent& event )
{ {
InvokeEeschemaConfig( (SCH_EDIT_FRAME *)GetParent(), this ); SCH_EDIT_FRAME* frame = (SCH_EDIT_FRAME*) Kiway().Player( FRAME_SCH, false );
wxASSERT( frame );
InvokeEeschemaConfig( frame, this );
} }
@ -134,12 +137,14 @@ void LIB_EDIT_FRAME::Process_Config( wxCommandEvent& event )
{ {
int id = event.GetId(); int id = event.GetId();
wxFileName fn; wxFileName fn;
SCH_EDIT_FRAME* schFrame = ( SCH_EDIT_FRAME* ) GetParent();
SCH_EDIT_FRAME* schFrame = (SCH_EDIT_FRAME*) Kiway().Player( FRAME_SCH, false );
wxASSERT( schFrame );
switch( id ) switch( id )
{ {
case ID_CONFIG_SAVE: case ID_CONFIG_SAVE:
schFrame->SaveProjectSettings( false ); schFrame->SaveProjectSettings( true );
break; break;
case ID_CONFIG_READ: case ID_CONFIG_READ:
@ -205,7 +210,7 @@ void SCH_EDIT_FRAME::Process_Config( wxCommandEvent& event )
switch( id ) switch( id )
{ {
case ID_CONFIG_SAVE: case ID_CONFIG_SAVE:
SaveProjectSettings( false ); SaveProjectSettings( true );
break; break;
case ID_CONFIG_READ: case ID_CONFIG_READ:
@ -454,8 +459,8 @@ void SCH_EDIT_FRAME::SaveProjectSettings( bool aAskForSave )
if( aAskForSave ) if( aAskForSave )
{ {
wxFileDialog dlg( this, _( "Save Project File" ), wxFileDialog dlg( this, _( "Save Project File" ),
fn.GetPath(), fn.GetFullName(), fn.GetPath(), fn.GetFullPath(),
ProjectFileWildcard, wxFD_SAVE | wxFD_CHANGE_DIR ); ProjectFileWildcard, wxFD_SAVE );
if( dlg.ShowModal() == wxID_CANCEL ) if( dlg.ShowModal() == wxID_CANCEL )
return; return;

View File

@ -30,6 +30,7 @@
#include <fctsys.h> #include <fctsys.h>
#include <pgm_base.h> #include <pgm_base.h>
#include <kiway.h>
#include <gr_basic.h> #include <gr_basic.h>
#include <class_drawpanel.h> #include <class_drawpanel.h>
#include <confirm.h> #include <confirm.h>
@ -55,16 +56,12 @@
wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( LIB_ALIAS* aPreselectedAlias, wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( LIB_ALIAS* aPreselectedAlias,
int* aUnit, int* aConvert ) int* aUnit, int* aConvert )
{ {
wxSemaphore semaphore( 0, 1 ); // Close any open non-modal Lib browser, and open a new one, in "modal" mode:
wxString cmpname; LIB_VIEW_FRAME* viewlibFrame = (LIB_VIEW_FRAME*) Kiway().Player( FRAME_SCH_VIEWER, false );
// Close the current Lib browser, if open, and open a new one, in "modal" mode:
LIB_VIEW_FRAME* viewlibFrame = LIB_VIEW_FRAME::GetActiveLibraryViewer( this );
if( viewlibFrame ) if( viewlibFrame )
viewlibFrame->Destroy(); viewlibFrame->Destroy();
viewlibFrame = new LIB_VIEW_FRAME( &Kiway(), this, NULL, &semaphore, viewlibFrame = (LIB_VIEW_FRAME*) Kiway().Player( FRAME_SCH_VIEWER_MODAL, true );
KICAD_DEFAULT_DRAWFRAME_STYLE | wxFRAME_FLOAT_ON_PARENT );
if( aPreselectedAlias ) if( aPreselectedAlias )
{ {
@ -80,27 +77,23 @@ wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( LIB_ALIAS* aPreselectedA
viewlibFrame->Refresh(); viewlibFrame->Refresh();
// Show the library viewer frame until it is closed wxString cmpname;
// Wait for viewer closing event:
while( semaphore.TryWait() == wxSEMA_BUSY ) if( viewlibFrame->ShowModal( &cmpname ) )
{ {
wxYield();
wxMilliSleep( 50 );
}
cmpname = viewlibFrame->GetSelectedComponent();
if( aUnit ) if( aUnit )
*aUnit = viewlibFrame->GetUnit(); *aUnit = viewlibFrame->GetUnit();
if( aConvert ) if( aConvert )
*aConvert = viewlibFrame->GetConvert(); *aConvert = viewlibFrame->GetConvert();
}
viewlibFrame->Destroy(); viewlibFrame->Destroy();
return cmpname; return cmpname;
} }
wxString SCH_BASE_FRAME::SelectComponentFromLibrary( const wxString& aLibname, wxString SCH_BASE_FRAME::SelectComponentFromLibrary( const wxString& aLibname,
wxArrayString& aHistoryList, wxArrayString& aHistoryList,
int& aHistoryLastUnit, int& aHistoryLastUnit,

View File

@ -171,7 +171,7 @@ bool LIB_ARC::Load( LINE_READER& aLineReader, wxString& aErrorMsg )
} }
bool LIB_ARC::HitTest( const wxPoint& aRefPoint ) bool LIB_ARC::HitTest( const wxPoint& aRefPoint ) const
{ {
int mindist = GetPenSize() / 2; int mindist = GetPenSize() / 2;
@ -183,7 +183,7 @@ bool LIB_ARC::HitTest( const wxPoint& aRefPoint )
} }
bool LIB_ARC::HitTest( wxPoint aPosition, int aThreshold, const TRANSFORM& aTransform ) bool LIB_ARC::HitTest( const wxPoint &aPosition, int aThreshold, const TRANSFORM& aTransform ) const
{ {
if( aThreshold < 0 ) if( aThreshold < 0 )

View File

@ -100,9 +100,9 @@ public:
bool Load( LINE_READER& aLineReader, wxString& aErrorMsg ); bool Load( LINE_READER& aLineReader, wxString& aErrorMsg );
bool HitTest( const wxPoint& aPosition ); bool HitTest( const wxPoint& aPosition ) const;
bool HitTest( wxPoint aPosition, int aThreshold, const TRANSFORM& aTransform ); bool HitTest( const wxPoint& aPosition, int aThreshold, const TRANSFORM& aTransform ) const;
const EDA_RECT GetBoundingBox() const; // Virtual const EDA_RECT GetBoundingBox() const; // Virtual

View File

@ -345,7 +345,7 @@ void LIB_BEZIER::drawGraphic( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint&
} }
bool LIB_BEZIER::HitTest( const wxPoint& aRefPos ) bool LIB_BEZIER::HitTest( const wxPoint& aRefPos ) const
{ {
int mindist = GetPenSize() / 2; int mindist = GetPenSize() / 2;
@ -357,7 +357,7 @@ bool LIB_BEZIER::HitTest( const wxPoint& aRefPos )
} }
bool LIB_BEZIER::HitTest( wxPoint aPosRef, int aThreshold, const TRANSFORM& aTransform ) bool LIB_BEZIER::HitTest( const wxPoint &aPosRef, int aThreshold, const TRANSFORM& aTransform ) const
{ {
wxPoint ref, start, end; wxPoint ref, start, end;

View File

@ -72,9 +72,9 @@ public:
*/ */
unsigned GetCornerCount() const { return m_PolyPoints.size(); } unsigned GetCornerCount() const { return m_PolyPoints.size(); }
bool HitTest( const wxPoint& aPosition ); bool HitTest( const wxPoint& aPosition ) const;
bool HitTest( wxPoint aPosRef, int aThreshold, const TRANSFORM& aTransform ); bool HitTest( const wxPoint& aPosRef, int aThreshold, const TRANSFORM& aTransform ) const;
const EDA_RECT GetBoundingBox() const; // Virtual const EDA_RECT GetBoundingBox() const; // Virtual

View File

@ -87,7 +87,7 @@ bool LIB_CIRCLE::Load( LINE_READER& aLineReader, wxString& aErrorMsg )
} }
bool LIB_CIRCLE::HitTest( const wxPoint& aPosRef ) bool LIB_CIRCLE::HitTest( const wxPoint& aPosRef ) const
{ {
int mindist = GetPenSize() / 2; int mindist = GetPenSize() / 2;
@ -99,7 +99,7 @@ bool LIB_CIRCLE::HitTest( const wxPoint& aPosRef )
} }
bool LIB_CIRCLE::HitTest( wxPoint aPosRef, int aThreshold, const TRANSFORM& aTransform ) bool LIB_CIRCLE::HitTest( const wxPoint &aPosRef, int aThreshold, const TRANSFORM& aTransform ) const
{ {
if( aThreshold < 0 ) if( aThreshold < 0 )
aThreshold = GetPenSize() / 2; aThreshold = GetPenSize() / 2;

View File

@ -61,9 +61,9 @@ public:
bool Load( LINE_READER& aLineReader, wxString& aErrorMsg ); bool Load( LINE_READER& aLineReader, wxString& aErrorMsg );
bool HitTest( const wxPoint& aPosition ); bool HitTest( const wxPoint& aPosition ) const;
bool HitTest( wxPoint aPosRef, int aThreshold, const TRANSFORM& aTransform ); bool HitTest( const wxPoint& aPosRef, int aThreshold, const TRANSFORM& aTransform ) const;
int GetPenSize( ) const; int GetPenSize( ) const;

View File

@ -237,12 +237,12 @@ public:
virtual bool Load( LINE_READER& aLine, wxString& aErrorMsg ) = 0; virtual bool Load( LINE_READER& aLine, wxString& aErrorMsg ) = 0;
LIB_COMPONENT* GetParent() LIB_COMPONENT* GetParent() const
{ {
return (LIB_COMPONENT *)m_Parent; return (LIB_COMPONENT *)m_Parent;
} }
virtual bool HitTest( const wxPoint& aPosition ) virtual bool HitTest( const wxPoint& aPosition ) const
{ {
return EDA_ITEM::HitTest( aPosition ); return EDA_ITEM::HitTest( aPosition );
} }
@ -255,7 +255,7 @@ public:
* @param aTransform The transform matrix. * @param aTransform The transform matrix.
* @return True if the point \a aPosition is near this object * @return True if the point \a aPosition is near this object
*/ */
virtual bool HitTest( wxPoint aPosition, int aThreshold, const TRANSFORM& aTransform ) = 0; virtual bool HitTest( const wxPoint &aPosition, int aThreshold, const TRANSFORM& aTransform ) const = 0;
/** /**
* @return the boundary box for this, in library coordinates * @return the boundary box for this, in library coordinates

View File

@ -320,7 +320,7 @@ void LIB_FIELD::drawGraphic( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& a
} }
bool LIB_FIELD::HitTest( const wxPoint& aPosition ) bool LIB_FIELD::HitTest( const wxPoint& aPosition ) const
{ {
// Because HitTest is mainly used to select the field // Because HitTest is mainly used to select the field
// return always false if this field is void // return always false if this field is void
@ -331,49 +331,37 @@ bool LIB_FIELD::HitTest( const wxPoint& aPosition )
} }
bool LIB_FIELD::HitTest( wxPoint aPosition, int aThreshold, const TRANSFORM& aTransform ) bool LIB_FIELD::HitTest( const wxPoint &aPosition, int aThreshold, const TRANSFORM& aTransform ) const
{ {
if( aThreshold < 0 ) if( aThreshold < 0 )
aThreshold = 0; aThreshold = 0;
int extraCharCount = 0; // Build a temporary copy of the text for hit testing
EDA_TEXT tmp_text( *this );
// Reference designator text has one or 2 additional character (displays // Reference designator text has one or 2 additional character (displays
// U? or U?A) // U? or U?A)
if( m_id == REFERENCE ) if( m_id == REFERENCE )
{ {
extraCharCount++; wxString extended_text = tmp_text.GetText();
m_Text.Append('?'); extended_text.Append('?');
LIB_COMPONENT* parent = (LIB_COMPONENT*)m_Parent; const LIB_COMPONENT* parent = static_cast<const LIB_COMPONENT*>( m_Parent );
if ( parent && ( parent->GetPartCount() > 1 ) ) if ( parent && ( parent->GetPartCount() > 1 ) )
{ extended_text.Append('A');
m_Text.Append('A'); tmp_text.SetText( extended_text );
extraCharCount++;
}
} }
wxPoint physicalpos = aTransform.TransformCoordinate( m_Pos ); tmp_text.SetTextPosition( aTransform.TransformCoordinate( m_Pos ) );
wxPoint tmp = m_Pos;
m_Pos = physicalpos;
/* The text orientation may need to be flipped if the /* The text orientation may need to be flipped if the
* transformation matrix causes xy axes to be flipped. * transformation matrix causes xy axes to be flipped.
* this simple algo works only for schematic matrix (rot 90 or/and mirror) * this simple algo works only for schematic matrix (rot 90 or/and mirror)
*/ */
int t1 = ( aTransform.x1 != 0 ) ^ ( m_Orient != 0 ); int t1 = ( aTransform.x1 != 0 ) ^ ( m_Orient != 0 );
int orient = t1 ? TEXT_ORIENT_HORIZ : TEXT_ORIENT_VERT; tmp_text.SetOrientation( t1 ? TEXT_ORIENT_HORIZ : TEXT_ORIENT_VERT );
EXCHG( m_Orient, orient );
bool hit = TextHitTest( aPosition ); return tmp_text.TextHitTest( aPosition );
EXCHG( m_Orient, orient );
m_Pos = tmp;
while( extraCharCount-- )
m_Text.RemoveLast( );
return hit;
} }

View File

@ -151,7 +151,7 @@ public:
* Function IsVoid * Function IsVoid
* @return true if the field value is void (no text in this field) * @return true if the field value is void (no text in this field)
*/ */
bool IsVoid() bool IsVoid() const
{ {
return m_Text.IsEmpty(); return m_Text.IsEmpty();
} }
@ -169,9 +169,9 @@ public:
void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList ); void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList );
bool HitTest( const wxPoint& aPosition ); bool HitTest( const wxPoint& aPosition ) const;
bool HitTest( wxPoint aPosition, int aThreshold, const TRANSFORM& aTransform ); bool HitTest( const wxPoint &aPosition, int aThreshold, const TRANSFORM& aTransform ) const;
void operator=( const LIB_FIELD& field ) void operator=( const LIB_FIELD& field )
{ {

View File

@ -525,13 +525,13 @@ void LIB_PIN::EnableEditMode( bool enable, bool editPinByPin )
} }
bool LIB_PIN::HitTest( const wxPoint& aPosition ) bool LIB_PIN::HitTest( const wxPoint& aPosition ) const
{ {
return HitTest( aPosition, 0, DefaultTransform ); return HitTest( aPosition, 0, DefaultTransform );
} }
bool LIB_PIN::HitTest( wxPoint aPosition, int aThreshold, const TRANSFORM& aTransform ) bool LIB_PIN::HitTest( const wxPoint &aPosition, int aThreshold, const TRANSFORM& aTransform ) const
{ {
if( aThreshold < 0 ) if( aThreshold < 0 )
aThreshold = 0; aThreshold = 0;

View File

@ -131,9 +131,9 @@ public:
bool Load( LINE_READER& aLineReader, wxString& aErrorMsg ); bool Load( LINE_READER& aLineReader, wxString& aErrorMsg );
bool HitTest( const wxPoint& aPosition ); bool HitTest( const wxPoint& aPosition ) const;
bool HitTest( wxPoint aPosRef, int aThreshold, const TRANSFORM& aTransform ); bool HitTest( const wxPoint &aPosRef, int aThreshold, const TRANSFORM& aTransform ) const;
void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList ); void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList );

View File

@ -321,7 +321,7 @@ void LIB_POLYLINE::drawGraphic( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint
} }
bool LIB_POLYLINE::HitTest( const wxPoint& aPosition ) bool LIB_POLYLINE::HitTest( const wxPoint& aPosition ) const
{ {
int mindist = GetPenSize() / 2; int mindist = GetPenSize() / 2;
@ -333,7 +333,7 @@ bool LIB_POLYLINE::HitTest( const wxPoint& aPosition )
} }
bool LIB_POLYLINE::HitTest( wxPoint aPosition, int aThreshold, const TRANSFORM& aTransform ) bool LIB_POLYLINE::HitTest( const wxPoint &aPosition, int aThreshold, const TRANSFORM& aTransform ) const
{ {
wxPoint ref, start, end; wxPoint ref, start, end;

View File

@ -74,9 +74,9 @@ public:
*/ */
unsigned GetCornerCount() const { return m_PolyPoints.size(); } unsigned GetCornerCount() const { return m_PolyPoints.size(); }
bool HitTest( const wxPoint& aPosition ); bool HitTest( const wxPoint& aPosition ) const;
bool HitTest( wxPoint aPosition, int aThreshold, const TRANSFORM& aTransform ); bool HitTest( const wxPoint &aPosition, int aThreshold, const TRANSFORM& aTransform ) const;
const EDA_RECT GetBoundingBox() const; // Virtual const EDA_RECT GetBoundingBox() const; // Virtual

View File

@ -267,7 +267,7 @@ const EDA_RECT LIB_RECTANGLE::GetBoundingBox() const
} }
bool LIB_RECTANGLE::HitTest( const wxPoint& aPosition ) bool LIB_RECTANGLE::HitTest( const wxPoint& aPosition ) const
{ {
int mindist = ( GetPenSize() / 2 ) + 1; int mindist = ( GetPenSize() / 2 ) + 1;
@ -279,7 +279,7 @@ bool LIB_RECTANGLE::HitTest( const wxPoint& aPosition )
} }
bool LIB_RECTANGLE::HitTest( wxPoint aPosition, int aThreshold, const TRANSFORM& aTransform ) bool LIB_RECTANGLE::HitTest( const wxPoint &aPosition, int aThreshold, const TRANSFORM& aTransform ) const
{ {
if( aThreshold < 0 ) if( aThreshold < 0 )
aThreshold = GetPenSize() / 2; aThreshold = GetPenSize() / 2;

View File

@ -65,9 +65,9 @@ public:
bool Load( LINE_READER& aLineReader, wxString& aErrorMsg ); bool Load( LINE_READER& aLineReader, wxString& aErrorMsg );
bool HitTest( const wxPoint& aPosition ); bool HitTest( const wxPoint& aPosition ) const;
bool HitTest( wxPoint aPosRef, int aThreshold, const TRANSFORM& aTransform ); bool HitTest( const wxPoint &aPosRef, int aThreshold, const TRANSFORM& aTransform ) const;
int GetPenSize( ) const; int GetPenSize( ) const;

View File

@ -185,32 +185,27 @@ bool LIB_TEXT::Load( LINE_READER& aLineReader, wxString& errorMsg )
} }
bool LIB_TEXT::HitTest( const wxPoint& aPosition ) bool LIB_TEXT::HitTest( const wxPoint& aPosition ) const
{ {
return HitTest( aPosition, 0, DefaultTransform ); return HitTest( aPosition, 0, DefaultTransform );
} }
bool LIB_TEXT::HitTest( wxPoint aPosition, int aThreshold, const TRANSFORM& aTransform ) bool LIB_TEXT::HitTest( const wxPoint &aPosition, int aThreshold, const TRANSFORM& aTransform ) const
{ {
if( aThreshold < 0 ) if( aThreshold < 0 )
aThreshold = 0; aThreshold = 0;
wxPoint physicalpos = aTransform.TransformCoordinate( m_Pos ); EDA_TEXT tmp_text( *this );
wxPoint tmp = m_Pos; tmp_text.SetTextPosition( aTransform.TransformCoordinate( m_Pos ) );
m_Pos = physicalpos;
/* The text orientation may need to be flipped if the /* The text orientation may need to be flipped if the
* transformation matrix causes xy axes to be flipped. * transformation matrix causes xy axes to be flipped.
* this simple algo works only for schematic matrix (rot 90 or/and mirror) * this simple algo works only for schematic matrix (rot 90 or/and mirror)
*/ */
int t1 = ( aTransform.x1 != 0 ) ^ ( m_Orient != 0 ); int t1 = ( aTransform.x1 != 0 ) ^ ( m_Orient != 0 );
int orient = t1 ? TEXT_ORIENT_HORIZ : TEXT_ORIENT_VERT; tmp_text.SetOrientation( t1 ? TEXT_ORIENT_HORIZ : TEXT_ORIENT_VERT );
EXCHG( m_Orient, orient ); return tmp_text.TextHitTest( aPosition );
bool hit = TextHitTest( aPosition );
EXCHG( m_Orient, orient );
m_Pos = tmp;
return hit;
} }

View File

@ -82,11 +82,11 @@ public:
bool Load( LINE_READER& aLineReader, wxString& aErrorMsg ); bool Load( LINE_READER& aLineReader, wxString& aErrorMsg );
bool HitTest( const wxPoint& aPosition ); bool HitTest( const wxPoint& aPosition ) const;
bool HitTest( wxPoint aPosition, int aThreshold, const TRANSFORM& aTransform ); bool HitTest( const wxPoint &aPosition, int aThreshold, const TRANSFORM& aTransform ) const;
bool HitTest( EDA_RECT& aRect ) bool HitTest( const EDA_RECT& aRect ) const
{ {
return TextHitTest( aRect ); return TextHitTest( aRect );
} }

View File

@ -99,7 +99,7 @@ BEGIN_EVENT_TABLE( LIB_EDIT_FRAME, EDA_DRAW_FRAME )
EVT_SIZE( LIB_EDIT_FRAME::OnSize ) EVT_SIZE( LIB_EDIT_FRAME::OnSize )
EVT_ACTIVATE( LIB_EDIT_FRAME::OnActivate ) EVT_ACTIVATE( LIB_EDIT_FRAME::OnActivate )
/* Main horizontal toolbar. */ // Main horizontal toolbar.
EVT_TOOL( ID_LIBEDIT_SAVE_CURRENT_LIB, LIB_EDIT_FRAME::OnSaveActiveLibrary ) EVT_TOOL( ID_LIBEDIT_SAVE_CURRENT_LIB, LIB_EDIT_FRAME::OnSaveActiveLibrary )
EVT_TOOL( ID_LIBEDIT_SELECT_CURRENT_LIB, LIB_EDIT_FRAME::Process_Special_Functions ) EVT_TOOL( ID_LIBEDIT_SELECT_CURRENT_LIB, LIB_EDIT_FRAME::Process_Special_Functions )
EVT_TOOL( ID_LIBEDIT_DELETE_PART, LIB_EDIT_FRAME::DeleteOnePart ) EVT_TOOL( ID_LIBEDIT_DELETE_PART, LIB_EDIT_FRAME::DeleteOnePart )
@ -125,12 +125,12 @@ BEGIN_EVENT_TABLE( LIB_EDIT_FRAME, EDA_DRAW_FRAME )
EVT_COMBOBOX( ID_LIBEDIT_SELECT_PART_NUMBER, LIB_EDIT_FRAME::OnSelectPart ) EVT_COMBOBOX( ID_LIBEDIT_SELECT_PART_NUMBER, LIB_EDIT_FRAME::OnSelectPart )
EVT_COMBOBOX( ID_LIBEDIT_SELECT_ALIAS, LIB_EDIT_FRAME::OnSelectAlias ) EVT_COMBOBOX( ID_LIBEDIT_SELECT_ALIAS, LIB_EDIT_FRAME::OnSelectAlias )
/* Right vertical toolbar. */ // Right vertical toolbar.
EVT_TOOL( ID_NO_TOOL_SELECTED, LIB_EDIT_FRAME::OnSelectTool ) EVT_TOOL( ID_NO_TOOL_SELECTED, LIB_EDIT_FRAME::OnSelectTool )
EVT_TOOL_RANGE( ID_LIBEDIT_PIN_BUTT, ID_LIBEDIT_DELETE_ITEM_BUTT, EVT_TOOL_RANGE( ID_LIBEDIT_PIN_BUTT, ID_LIBEDIT_DELETE_ITEM_BUTT,
LIB_EDIT_FRAME::OnSelectTool ) LIB_EDIT_FRAME::OnSelectTool )
/* menubar commands */ // menubar commands
EVT_MENU( wxID_EXIT, LIB_EDIT_FRAME::CloseWindow ) EVT_MENU( wxID_EXIT, LIB_EDIT_FRAME::CloseWindow )
EVT_MENU( ID_LIBEDIT_SAVE_CURRENT_LIB_AS, LIB_EDIT_FRAME::OnSaveActiveLibrary ) EVT_MENU( ID_LIBEDIT_SAVE_CURRENT_LIB_AS, LIB_EDIT_FRAME::OnSaveActiveLibrary )
EVT_MENU( ID_LIBEDIT_GEN_PNG_FILE, LIB_EDIT_FRAME::OnPlotCurrentComponent ) EVT_MENU( ID_LIBEDIT_GEN_PNG_FILE, LIB_EDIT_FRAME::OnPlotCurrentComponent )
@ -152,9 +152,7 @@ BEGIN_EVENT_TABLE( LIB_EDIT_FRAME, EDA_DRAW_FRAME )
EVT_MENU_RANGE( ID_PREFERENCES_HOTKEY_START, ID_PREFERENCES_HOTKEY_END, EVT_MENU_RANGE( ID_PREFERENCES_HOTKEY_START, ID_PREFERENCES_HOTKEY_END,
LIB_EDIT_FRAME::Process_Config ) LIB_EDIT_FRAME::Process_Config )
EVT_MENU_RANGE( ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, LIB_EDIT_FRAME::SetLanguage ) // Context menu events and commands.
/* Context menu events and commands. */
EVT_MENU( ID_LIBEDIT_EDIT_PIN, LIB_EDIT_FRAME::OnEditPin ) EVT_MENU( ID_LIBEDIT_EDIT_PIN, LIB_EDIT_FRAME::OnEditPin )
EVT_MENU( ID_LIBEDIT_ROTATE_ITEM, LIB_EDIT_FRAME::OnRotateItem ) EVT_MENU( ID_LIBEDIT_ROTATE_ITEM, LIB_EDIT_FRAME::OnRotateItem )
@ -165,7 +163,7 @@ BEGIN_EVENT_TABLE( LIB_EDIT_FRAME, EDA_DRAW_FRAME )
EVT_MENU_RANGE( ID_POPUP_GENERAL_START_RANGE, ID_POPUP_GENERAL_END_RANGE, EVT_MENU_RANGE( ID_POPUP_GENERAL_START_RANGE, ID_POPUP_GENERAL_END_RANGE,
LIB_EDIT_FRAME::Process_Special_Functions ) LIB_EDIT_FRAME::Process_Special_Functions )
/* Update user interface elements. */ // Update user interface elements.
EVT_UPDATE_UI( ExportPartId, LIB_EDIT_FRAME::OnUpdateEditingPart ) EVT_UPDATE_UI( ExportPartId, LIB_EDIT_FRAME::OnUpdateEditingPart )
EVT_UPDATE_UI( CreateNewLibAndSavePartId, LIB_EDIT_FRAME::OnUpdateEditingPart ) EVT_UPDATE_UI( CreateNewLibAndSavePartId, LIB_EDIT_FRAME::OnUpdateEditingPart )
EVT_UPDATE_UI( ID_LIBEDIT_SAVE_CURRENT_PART, LIB_EDIT_FRAME::OnUpdateEditingPart ) EVT_UPDATE_UI( ID_LIBEDIT_SAVE_CURRENT_PART, LIB_EDIT_FRAME::OnUpdateEditingPart )
@ -193,7 +191,7 @@ LIB_EDIT_FRAME::LIB_EDIT_FRAME( KIWAY* aKiway, SCH_EDIT_FRAME* aParent ) :
SCH_BASE_FRAME( aKiway, aParent, FRAME_SCH_LIB_EDITOR, _( "Library Editor" ), SCH_BASE_FRAME( aKiway, aParent, FRAME_SCH_LIB_EDITOR, _( "Library Editor" ),
wxDefaultPosition, wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE, GetLibEditFrameName() ) wxDefaultPosition, wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE, GetLibEditFrameName() )
{ {
wxASSERT( aParent ); // LIB_EDIT_FRAME needs a parent, since it peeks up there. wxASSERT( aParent );
m_FrameName = GetLibEditFrameName(); m_FrameName = GetLibEditFrameName();
m_showAxis = true; // true to draw axis m_showAxis = true; // true to draw axis
@ -204,6 +202,7 @@ LIB_EDIT_FRAME::LIB_EDIT_FRAME( KIWAY* aKiway, SCH_EDIT_FRAME* aParent ) :
m_tempCopyComponent = NULL; m_tempCopyComponent = NULL;
m_HotkeysZoomAndGridList = s_Libedit_Hokeys_Descr; m_HotkeysZoomAndGridList = s_Libedit_Hokeys_Descr;
m_editPinsPerPartOrConvert = false; m_editPinsPerPartOrConvert = false;
// Initialize grid id to the default value 50 mils: // Initialize grid id to the default value 50 mils:
m_LastGridSizeId = ID_POPUP_GRID_LEVEL_50 - ID_POPUP_GRID_LEVEL_1000; m_LastGridSizeId = ID_POPUP_GRID_LEVEL_50 - ID_POPUP_GRID_LEVEL_1000;
@ -293,12 +292,6 @@ const wxChar* LIB_EDIT_FRAME::GetLibEditFrameName()
} }
LIB_EDIT_FRAME* LIB_EDIT_FRAME::GetActiveLibraryEditor()
{
return (LIB_EDIT_FRAME*) wxWindow::FindWindowByName(GetLibEditFrameName());
}
void LIB_EDIT_FRAME::LoadSettings( wxConfigBase* aCfg ) void LIB_EDIT_FRAME::LoadSettings( wxConfigBase* aCfg )
{ {
#if 0 // original #if 0 // original
@ -765,8 +758,8 @@ void LIB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
DefaultTransform ); DefaultTransform );
m_drawItem->SetFlags( oldFlags ); m_drawItem->SetFlags( oldFlags );
m_lastDrawItem = NULL; m_lastDrawItem = NULL;
break;
} }
break;
case ID_POPUP_LIBEDIT_DELETE_ITEM: case ID_POPUP_LIBEDIT_DELETE_ITEM:
if( m_drawItem ) if( m_drawItem )
@ -918,17 +911,6 @@ void LIB_EDIT_FRAME::EnsureActiveLibExists()
} }
void LIB_EDIT_FRAME::SetLanguage( wxCommandEvent& event )
{
EDA_BASE_FRAME::SetLanguage( event );
SCH_EDIT_FRAME *parent = (SCH_EDIT_FRAME *)GetParent();
// Call parent->EDA_BASE_FRAME::SetLanguage and NOT
// parent->SetLanguage because parent->SetLanguage call
// LIB_EDIT_FRAME::SetLanguage
parent->EDA_BASE_FRAME::SetLanguage( event );
}
void LIB_EDIT_FRAME::TempCopyComponent() void LIB_EDIT_FRAME::TempCopyComponent()
{ {
if( m_tempCopyComponent ) if( m_tempCopyComponent )

View File

@ -133,13 +133,6 @@ public:
*/ */
static const wxChar* GetLibEditFrameName(); static const wxChar* GetLibEditFrameName();
/**
* Function GetActiveLibraryEditor (static)
* @return a reference to the current opened Library editor
* or NULL if no Library editor currently opened
*/
static LIB_EDIT_FRAME* GetActiveLibraryEditor();
void ReCreateMenuBar(); void ReCreateMenuBar();
/** /**
@ -149,12 +142,6 @@ public:
*/ */
static void EnsureActiveLibExists(); static void EnsureActiveLibExists();
/**
* Function SetLanguage
* is called on a language menu selection
*/
void SetLanguage( wxCommandEvent& event );
void InstallConfigFrame( wxCommandEvent& event ); void InstallConfigFrame( wxCommandEvent& event );
void InstallDimensionsDialog( wxCommandEvent& event ); void InstallDimensionsDialog( wxCommandEvent& event );
void OnColorConfig( wxCommandEvent& aEvent ); void OnColorConfig( wxCommandEvent& aEvent );

View File

@ -26,6 +26,7 @@
#include <viewlib_frame.h> #include <viewlib_frame.h>
#include <libeditframe.h> #include <libeditframe.h>
#include <base_units.h> #include <base_units.h>
#include <kiway.h>
SCH_BASE_FRAME::SCH_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent, SCH_BASE_FRAME::SCH_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent,
@ -40,12 +41,10 @@ SCH_BASE_FRAME::SCH_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent,
void SCH_BASE_FRAME::OnOpenLibraryViewer( wxCommandEvent& event ) void SCH_BASE_FRAME::OnOpenLibraryViewer( wxCommandEvent& event )
{ {
LIB_VIEW_FRAME* viewlibFrame = LIB_VIEW_FRAME::GetActiveLibraryViewer( this ); LIB_VIEW_FRAME* viewlibFrame = (LIB_VIEW_FRAME*) Kiway().Player( FRAME_SCH_VIEWER, true );
if( viewlibFrame )
viewlibFrame->Show( true ); viewlibFrame->Show( true );
else viewlibFrame->Raise();
new LIB_VIEW_FRAME( &Kiway(), this );
} }

View File

@ -210,7 +210,7 @@ public:
wxString GetSheetPath() const { return m_sheetPath; } wxString GetSheetPath() const { return m_sheetPath; }
SCH_ITEM* GetParent() { return m_parent; } SCH_ITEM* GetParent() const { return m_parent; }
}; };

View File

@ -96,8 +96,6 @@ BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, EDA_DRAW_FRAME )
EVT_MENU( ID_COLORS_SETUP, SCH_EDIT_FRAME::OnColorConfig ) EVT_MENU( ID_COLORS_SETUP, SCH_EDIT_FRAME::OnColorConfig )
EVT_TOOL( wxID_PREFERENCES, SCH_EDIT_FRAME::OnSetOptions ) EVT_TOOL( wxID_PREFERENCES, SCH_EDIT_FRAME::OnSetOptions )
EVT_MENU_RANGE( ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, SCH_EDIT_FRAME::SetLanguage )
EVT_TOOL( ID_TO_LIBRARY, SCH_EDIT_FRAME::OnOpenLibraryEditor ) EVT_TOOL( ID_TO_LIBRARY, SCH_EDIT_FRAME::OnOpenLibraryEditor )
EVT_TOOL( ID_POPUP_SCH_CALL_LIBEDIT_AND_LOAD_CMP, SCH_EDIT_FRAME::OnOpenLibraryEditor ) EVT_TOOL( ID_POPUP_SCH_CALL_LIBEDIT_AND_LOAD_CMP, SCH_EDIT_FRAME::OnOpenLibraryEditor )
EVT_TOOL( ID_TO_LIBVIEW, SCH_EDIT_FRAME::OnOpenLibraryViewer ) EVT_TOOL( ID_TO_LIBVIEW, SCH_EDIT_FRAME::OnOpenLibraryViewer )
@ -442,14 +440,21 @@ void SCH_EDIT_FRAME::SaveUndoItemInUndoList( SCH_ITEM* aItem )
void SCH_EDIT_FRAME::OnCloseWindow( wxCloseEvent& aEvent ) void SCH_EDIT_FRAME::OnCloseWindow( wxCloseEvent& aEvent )
{ {
LIB_EDIT_FRAME * libeditFrame = LIB_EDIT_FRAME::GetActiveLibraryEditor();; if( Kiface().IsSingle() )
{
LIB_EDIT_FRAME* libeditFrame = (LIB_EDIT_FRAME*) Kiway().Player( FRAME_SCH_LIB_EDITOR, false );
if( libeditFrame && !libeditFrame->Close() ) // Can close component editor? if( libeditFrame && !libeditFrame->Close() ) // Can close component editor?
return; return;
LIB_VIEW_FRAME* viewlibFrame = LIB_VIEW_FRAME::GetActiveLibraryViewer( this ); LIB_VIEW_FRAME* viewlibFrame = (LIB_VIEW_FRAME*) Kiway().Player( FRAME_SCH_VIEWER, false );
if( viewlibFrame && !viewlibFrame->Close() ) // Can close component viewer? if( viewlibFrame && !viewlibFrame->Close() ) // Can close component viewer?
return; return;
viewlibFrame = (LIB_VIEW_FRAME*) Kiway().Player( FRAME_SCH_VIEWER_MODAL, false );
if( viewlibFrame && !viewlibFrame->Close() ) // Can close modal component viewer?
return;
}
SCH_SHEET_LIST SheetList; SCH_SHEET_LIST SheetList;
if( SheetList.IsModified() ) if( SheetList.IsModified() )
@ -829,7 +834,7 @@ void SCH_EDIT_FRAME::OnOpenLibraryEditor( wxCommandEvent& event )
{ {
SCH_ITEM* item = GetScreen()->GetCurItem(); SCH_ITEM* item = GetScreen()->GetCurItem();
if( (item == NULL) || (item->GetFlags() != 0) || ( item->Type() != SCH_COMPONENT_T ) ) if( !item || (item->GetFlags() != 0) || ( item->Type() != SCH_COMPONENT_T ) )
{ {
wxMessageBox( _( "Error: not a component or no component" ) ); wxMessageBox( _( "Error: not a component or no component" ) );
return; return;
@ -838,9 +843,21 @@ void SCH_EDIT_FRAME::OnOpenLibraryEditor( wxCommandEvent& event )
component = (SCH_COMPONENT*) item; component = (SCH_COMPONENT*) item;
} }
// @todo: should be changed to use Kiway().Player()? LIB_EDIT_FRAME* libeditFrame = (LIB_EDIT_FRAME*) Kiway().Player( FRAME_SCH_LIB_EDITOR, false );
if( !libeditFrame )
{
libeditFrame = (LIB_EDIT_FRAME*) Kiway().Player( FRAME_SCH_LIB_EDITOR, true );
libeditFrame->Show( true );
}
else
{
// if( libeditFrame->IsIconized() )
// libeditFrame->Iconize( false );
}
LIB_EDIT_FRAME* libeditFrame = LIB_EDIT_FRAME::GetActiveLibraryEditor();; libeditFrame->Raise();
#if 0
if( libeditFrame ) if( libeditFrame )
{ {
if( libeditFrame->IsIconized() ) if( libeditFrame->IsIconized() )
@ -855,6 +872,8 @@ void SCH_EDIT_FRAME::OnOpenLibraryEditor( wxCommandEvent& event )
wxWindow* w = kf.CreateWindow( this, FRAME_SCH_LIB_EDITOR, &Kiway(), kf.StartFlags() ); wxWindow* w = kf.CreateWindow( this, FRAME_SCH_LIB_EDITOR, &Kiway(), kf.StartFlags() );
libeditFrame = dynamic_cast<LIB_EDIT_FRAME*>( w ); libeditFrame = dynamic_cast<LIB_EDIT_FRAME*>( w );
} }
#endif
if( component ) if( component )
{ {
@ -875,16 +894,6 @@ void SCH_EDIT_FRAME::OnExit( wxCommandEvent& event )
} }
void SCH_EDIT_FRAME::SetLanguage( wxCommandEvent& event )
{
EDA_BASE_FRAME::SetLanguage( event );
LIB_EDIT_FRAME * libeditFrame = LIB_EDIT_FRAME::GetActiveLibraryEditor();;
if( libeditFrame )
libeditFrame->EDA_BASE_FRAME::SetLanguage( event );
}
void SCH_EDIT_FRAME::OnPrint( wxCommandEvent& event ) void SCH_EDIT_FRAME::OnPrint( wxCommandEvent& event )
{ {
wxFileName fn; wxFileName fn;

View File

@ -116,9 +116,8 @@ void LIB_VIEW_FRAME::ReCreateHToolbar()
_( "View component documents" ) ); _( "View component documents" ) );
m_mainToolBar->EnableTool( ID_LIBVIEW_VIEWDOC, false ); m_mainToolBar->EnableTool( ID_LIBVIEW_VIEWDOC, false );
if( m_semaphore ) if( IsModal() )
{ {
// The library browser is called from a "load component" command
m_mainToolBar->AddSeparator(); m_mainToolBar->AddSeparator();
m_mainToolBar->AddTool( ID_LIBVIEW_CMP_EXPORT_TO_SCHEMATIC, m_mainToolBar->AddTool( ID_LIBVIEW_CMP_EXPORT_TO_SCHEMATIC,
wxEmptyString, KiBitmap( export_xpm ), wxEmptyString, KiBitmap( export_xpm ),
@ -130,11 +129,11 @@ void LIB_VIEW_FRAME::ReCreateHToolbar()
m_mainToolBar->Realize(); m_mainToolBar->Realize();
} }
if( (m_libraryName != wxEmptyString) && (m_entryName != wxEmptyString) ) if( m_libraryName.size() && m_entryName.size() )
{ {
lib = CMP_LIBRARY::FindLibrary( m_libraryName ); lib = CMP_LIBRARY::FindLibrary( m_libraryName );
if( lib != NULL ) if( lib )
{ {
component = lib->FindComponent( m_entryName ); component = lib->FindComponent( m_entryName );
@ -161,7 +160,6 @@ void LIB_VIEW_FRAME::ReCreateHToolbar()
m_mainToolBar->ToggleTool( ID_LIBVIEW_DE_MORGAN_CONVERT_BUTT, false ); m_mainToolBar->ToggleTool( ID_LIBVIEW_DE_MORGAN_CONVERT_BUTT, false );
} }
int parts_count = 1; int parts_count = 1;
if( component ) if( component )
@ -171,8 +169,7 @@ void LIB_VIEW_FRAME::ReCreateHToolbar()
for( ii = 0; ii < parts_count; ii++ ) for( ii = 0; ii < parts_count; ii++ )
{ {
wxString msg; wxString msg = wxString::Format( _( "Unit %c" ), 'A' + ii );
msg.Printf( _( "Unit %c" ), 'A' + ii );
m_selpartBox->Append( msg ); m_selpartBox->Append( msg );
} }

View File

@ -47,28 +47,25 @@
*/ */
wxString LIB_VIEW_FRAME::m_libraryName; wxString LIB_VIEW_FRAME::m_libraryName;
wxString LIB_VIEW_FRAME::m_entryName; wxString LIB_VIEW_FRAME::m_entryName;
int LIB_VIEW_FRAME::m_unit = 1; int LIB_VIEW_FRAME::m_unit = 1;
int LIB_VIEW_FRAME::m_convert = 1; int LIB_VIEW_FRAME::m_convert = 1;
/// When the viewer is used to select a component in schematic, the selected component is here.
wxString LIB_VIEW_FRAME::m_exportToEeschemaCmpName;
BEGIN_EVENT_TABLE( LIB_VIEW_FRAME, EDA_DRAW_FRAME ) BEGIN_EVENT_TABLE( LIB_VIEW_FRAME, EDA_DRAW_FRAME )
/* Window events */ // Window events
EVT_CLOSE( LIB_VIEW_FRAME::OnCloseWindow ) EVT_CLOSE( LIB_VIEW_FRAME::OnCloseWindow )
EVT_SIZE( LIB_VIEW_FRAME::OnSize ) EVT_SIZE( LIB_VIEW_FRAME::OnSize )
EVT_ACTIVATE( LIB_VIEW_FRAME::OnActivate ) EVT_ACTIVATE( LIB_VIEW_FRAME::OnActivate )
/* Toolbar events */ // Toolbar events
EVT_TOOL_RANGE( ID_LIBVIEW_NEXT, ID_LIBVIEW_DE_MORGAN_CONVERT_BUTT, EVT_TOOL_RANGE( ID_LIBVIEW_NEXT, ID_LIBVIEW_DE_MORGAN_CONVERT_BUTT,
LIB_VIEW_FRAME::Process_Special_Functions ) LIB_VIEW_FRAME::Process_Special_Functions )
EVT_TOOL( ID_LIBVIEW_CMP_EXPORT_TO_SCHEMATIC, LIB_VIEW_FRAME::ExportToSchematicLibraryPart ) EVT_TOOL( ID_LIBVIEW_CMP_EXPORT_TO_SCHEMATIC, LIB_VIEW_FRAME::ExportToSchematicLibraryPart )
EVT_COMBOBOX( ID_LIBVIEW_SELECT_PART_NUMBER, LIB_VIEW_FRAME::Process_Special_Functions ) EVT_COMBOBOX( ID_LIBVIEW_SELECT_PART_NUMBER, LIB_VIEW_FRAME::Process_Special_Functions )
/* listbox events */ // listbox events
EVT_LISTBOX( ID_LIBVIEW_LIB_LIST, LIB_VIEW_FRAME::ClickOnLibList ) EVT_LISTBOX( ID_LIBVIEW_LIB_LIST, LIB_VIEW_FRAME::ClickOnLibList )
EVT_LISTBOX( ID_LIBVIEW_CMP_LIST, LIB_VIEW_FRAME::ClickOnCmpList ) EVT_LISTBOX( ID_LIBVIEW_CMP_LIST, LIB_VIEW_FRAME::ClickOnCmpList )
EVT_LISTBOX_DCLICK( ID_LIBVIEW_CMP_LIST, LIB_VIEW_FRAME::DClickOnCmpList ) EVT_LISTBOX_DCLICK( ID_LIBVIEW_CMP_LIST, LIB_VIEW_FRAME::DClickOnCmpList )
@ -95,11 +92,20 @@ static wxAcceleratorEntry accels[] =
#define ACCEL_TABLE_CNT ( sizeof( accels ) / sizeof( wxAcceleratorEntry ) ) #define ACCEL_TABLE_CNT ( sizeof( accels ) / sizeof( wxAcceleratorEntry ) )
#define LIB_VIEW_FRAME_NAME wxT( "ViewlibFrame" ) #define LIB_VIEW_FRAME_NAME wxT( "ViewlibFrame" )
LIB_VIEW_FRAME::LIB_VIEW_FRAME( KIWAY* aKiway, SCH_BASE_FRAME* aParent, LIB_VIEW_FRAME::LIB_VIEW_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType,
CMP_LIBRARY* aLibrary, wxSemaphore* aSemaphore, long aStyle ) : CMP_LIBRARY* aLibrary ) :
SCH_BASE_FRAME( aKiway, aParent, FRAME_SCH_VIEWER, _( "Library Browser" ), SCH_BASE_FRAME( aKiway, aParent, aFrameType, _( "Library Browser" ),
wxDefaultPosition, wxDefaultSize, aStyle, GetLibViewerFrameName() ) wxDefaultPosition, wxDefaultSize,
aFrameType==FRAME_SCH_VIEWER ?
KICAD_DEFAULT_DRAWFRAME_STYLE :
KICAD_DEFAULT_DRAWFRAME_STYLE | wxFRAME_FLOAT_ON_PARENT,
GetLibViewerFrameName() )
{ {
wxASSERT( aFrameType==FRAME_SCH_VIEWER || aFrameType==FRAME_SCH_VIEWER_MODAL );
if( aFrameType == FRAME_SCH_VIEWER_MODAL )
SetModal( true );
wxAcceleratorTable table( ACCEL_TABLE_CNT, accels ); wxAcceleratorTable table( ACCEL_TABLE_CNT, accels );
m_FrameName = GetLibViewerFrameName(); m_FrameName = GetLibViewerFrameName();
@ -114,12 +120,6 @@ LIB_VIEW_FRAME::LIB_VIEW_FRAME( KIWAY* aKiway, SCH_BASE_FRAME* aParent,
m_HotkeysZoomAndGridList = s_Viewlib_Hokeys_Descr; m_HotkeysZoomAndGridList = s_Viewlib_Hokeys_Descr;
m_cmpList = NULL; m_cmpList = NULL;
m_libList = NULL; m_libList = NULL;
m_semaphore = aSemaphore;
if( m_semaphore )
SetModalMode( true );
m_exportToEeschemaCmpName.Empty();
SetScreen( new SCH_SCREEN() ); SetScreen( new SCH_SCREEN() );
GetScreen()->m_Center = true; // Axis origin centered on screen. GetScreen()->m_Center = true; // Axis origin centered on screen.
@ -139,7 +139,7 @@ LIB_VIEW_FRAME::LIB_VIEW_FRAME( KIWAY* aKiway, SCH_BASE_FRAME* aParent,
wxPoint win_pos( 0, 0 ); wxPoint win_pos( 0, 0 );
if( aLibrary == NULL ) if( !aLibrary )
{ {
// Creates the libraries window display // Creates the libraries window display
m_libList = new wxListBox( this, ID_LIBVIEW_LIB_LIST, m_libList = new wxListBox( this, ID_LIBVIEW_LIB_LIST,
@ -243,25 +243,19 @@ const wxChar* LIB_VIEW_FRAME::GetLibViewerFrameName()
} }
LIB_VIEW_FRAME* LIB_VIEW_FRAME::GetActiveLibraryViewer( const wxWindow* aParent )
{
return (LIB_VIEW_FRAME*) wxWindow::FindWindowByName( GetLibViewerFrameName(), aParent );
}
void LIB_VIEW_FRAME::OnCloseWindow( wxCloseEvent& Event ) void LIB_VIEW_FRAME::OnCloseWindow( wxCloseEvent& Event )
{ {
if( m_semaphore ) if( !IsModal() )
{
m_semaphore->Post();
// This window will be destroyed by the calling function,
// if needed
SetModalMode( false );
}
else
{ {
Destroy(); Destroy();
} }
else if( !IsDismissed() )
{
// only dismiss modal frame if not already dismissed.
DismissModal( false );
// Modal frame will be destroyed by the calling function.
}
} }
@ -289,6 +283,7 @@ double LIB_VIEW_FRAME::BestZoom()
* search for line static const int VIEWPORT_EXTENT = 1000; * search for line static const int VIEWPORT_EXTENT = 1000;
* and replace by static const int VIEWPORT_EXTENT = 10000; * and replace by static const int VIEWPORT_EXTENT = 10000;
*/ */
LIB_COMPONENT* component = NULL; LIB_COMPONENT* component = NULL;
double bestzoom = 16.0; // default value for bestzoom double bestzoom = 16.0; // default value for bestzoom
CMP_LIBRARY* lib = CMP_LIBRARY::FindLibrary( m_libraryName ); CMP_LIBRARY* lib = CMP_LIBRARY::FindLibrary( m_libraryName );
@ -344,8 +339,8 @@ void LIB_VIEW_FRAME::ReCreateListLib()
} }
else else
{ {
/* If not found, clear current library selection because it can be // If not found, clear current library selection because it can be
* deleted after a config change. */ // deleted after a config change.
m_libraryName = wxEmptyString; m_libraryName = wxEmptyString;
m_entryName = wxEmptyString; m_entryName = wxEmptyString;
m_unit = 1; m_unit = 1;
@ -417,6 +412,7 @@ void LIB_VIEW_FRAME::SetSelectedLibrary( const wxString& aLibraryName )
m_canvas->Refresh(); m_canvas->Refresh();
DisplayLibInfos(); DisplayLibInfos();
ReCreateHToolbar(); ReCreateHToolbar();
// Ensure the corresponding line in m_libList is selected // Ensure the corresponding line in m_libList is selected
// (which is not necessary the case if SetSelectedLibrary is called // (which is not necessary the case if SetSelectedLibrary is called
// by an other caller than ClickOnLibList. // by an other caller than ClickOnLibList.
@ -440,8 +436,9 @@ void LIB_VIEW_FRAME::SetSelectedComponent( const wxString& aComponentName )
if( m_entryName.CmpNoCase( aComponentName ) != 0 ) if( m_entryName.CmpNoCase( aComponentName ) != 0 )
{ {
m_entryName = aComponentName; m_entryName = aComponentName;
// Ensure the corresponding line in m_cmpList is selected // Ensure the corresponding line in m_cmpList is selected
// (which is not necessary the case if SetSelectedComponent is called // (which is not necessarily the case if SetSelectedComponent is called
// by another caller than ClickOnCmpList. // by another caller than ClickOnCmpList.
m_cmpList->SetStringSelection( aComponentName, true ); m_cmpList->SetStringSelection( aComponentName, true );
DisplayLibInfos(); DisplayLibInfos();
@ -456,14 +453,21 @@ void LIB_VIEW_FRAME::SetSelectedComponent( const wxString& aComponentName )
void LIB_VIEW_FRAME::DClickOnCmpList( wxCommandEvent& event ) void LIB_VIEW_FRAME::DClickOnCmpList( wxCommandEvent& event )
{ {
if( m_semaphore ) if( IsModal() )
{ {
ExportToSchematicLibraryPart( event ); ExportToSchematicLibraryPart( event );
// The schematic editor might not be the parent of the library viewer.
// It could be a python window.
SCH_EDIT_FRAME* schframe = dynamic_cast<SCH_EDIT_FRAME*>( GetParent() );
if( schframe )
{
// Prevent the double click from being as a single click in the parent // Prevent the double click from being as a single click in the parent
// window which would cause the part to be parked rather than staying // window which would cause the part to be parked rather than staying
// in drag mode. // in drag mode.
((SCH_BASE_FRAME*) GetParent())->SkipNextLeftButtonReleaseEvent(); schframe->SkipNextLeftButtonReleaseEvent();
}
} }
} }
@ -473,9 +477,17 @@ void LIB_VIEW_FRAME::ExportToSchematicLibraryPart( wxCommandEvent& event )
int ii = m_cmpList->GetSelection(); int ii = m_cmpList->GetSelection();
if( ii >= 0 ) if( ii >= 0 )
m_exportToEeschemaCmpName = m_cmpList->GetString( ii ); {
wxString part_name = m_cmpList->GetString( ii );
// a selection was made, pass true
DismissModal( true, part_name );
}
else else
m_exportToEeschemaCmpName.Empty(); {
// no selection was made, pass false
DismissModal( false );
}
Close( true ); Close( true );
} }
@ -524,10 +536,6 @@ void LIB_VIEW_FRAME::OnActivate( wxActivateEvent& event )
{ {
EDA_DRAW_FRAME::OnActivate( event ); EDA_DRAW_FRAME::OnActivate( event );
// Ensure we do not have old selection:
if( m_FrameIsActive )
m_exportToEeschemaCmpName.Empty();
if( m_libList ) if( m_libList )
ReCreateListLib(); ReCreateListLib();

View File

@ -38,7 +38,6 @@
class wxSashLayoutWindow; class wxSashLayoutWindow;
class wxListBox; class wxListBox;
class wxSemaphore;
class CMP_LIBRARY; class CMP_LIBRARY;
@ -48,9 +47,14 @@ class CMP_LIBRARY;
class LIB_VIEW_FRAME : public SCH_BASE_FRAME class LIB_VIEW_FRAME : public SCH_BASE_FRAME
{ {
public: public:
LIB_VIEW_FRAME( KIWAY* aKiway, SCH_BASE_FRAME* aParent,
CMP_LIBRARY* aLibrary = NULL, wxSemaphore* aSemaphore = NULL, /**
long aStyle = KICAD_DEFAULT_DRAWFRAME_STYLE ); * Constructor
* @param aFrameType must be given either FRAME_SCH_LIB_VIEWER or
* FRAME_SCH_LIB_VIEWER_MODAL
*/
LIB_VIEW_FRAME( KIWAY* aKiway, wxWindow* aParent,
FRAME_T aFrameType, CMP_LIBRARY* aLibrary = NULL );
~LIB_VIEW_FRAME(); ~LIB_VIEW_FRAME();
@ -61,13 +65,6 @@ public:
*/ */
static const wxChar* GetLibViewerFrameName(); static const wxChar* GetLibViewerFrameName();
/**
* Function GetActiveLibraryViewer (static)
* @return a reference to the current opened Library viewer
* or NULL if no Library viewer currently opened
*/
static LIB_VIEW_FRAME* GetActiveLibraryViewer( const wxWindow* aParent );
void OnSize( wxSizeEvent& event ); void OnSize( wxSizeEvent& event );
/** /**
@ -109,7 +106,6 @@ public:
* @param the alias name of the component to be selected. * @param the alias name of the component to be selected.
*/ */
void SetSelectedComponent( const wxString& aComponentName ); void SetSelectedComponent( const wxString& aComponentName );
const wxString& GetSelectedComponent( void ) const { return m_exportToEeschemaCmpName; }
void SetUnit( int aUnit ) { m_unit = aUnit; } void SetUnit( int aUnit ) { m_unit = aUnit; }
int GetUnit( void ) { return m_unit; } int GetUnit( void ) { return m_unit; }
@ -147,8 +143,6 @@ private:
wxListBox* m_cmpList; // The list of components wxListBox* m_cmpList; // The list of components
int m_cmpListWidth; // Last width of the window int m_cmpListWidth; // Last width of the window
// Flags
wxSemaphore* m_semaphore; // != NULL if the frame must emulate a modal dialog
wxString m_configPath; // subpath for configuration wxString m_configPath; // subpath for configuration
// TODO(hzeller): looks like these members were chosen to be static to survive different // TODO(hzeller): looks like these members were chosen to be static to survive different
@ -156,11 +150,8 @@ private:
// ugly hack, and should be solved differently. // ugly hack, and should be solved differently.
static wxString m_libraryName; static wxString m_libraryName;
// TODO(hzeller): figure out what the difference between these is and the motivation to
// have this distinction. Shouldn't these essentially be the same ?
static wxString m_entryName; static wxString m_entryName;
static wxString m_exportToEeschemaCmpName; // When the viewer is used to select a component
// in schematic, the selected component is here
static int m_unit; static int m_unit;
static int m_convert; static int m_convert;

View File

@ -148,7 +148,7 @@ public:
* Function GetParent * Function GetParent
* @return the GERBVIEW_FRAME parent of this GERBER_IMAGE * @return the GERBVIEW_FRAME parent of this GERBER_IMAGE
*/ */
GERBVIEW_FRAME* GetParent() GERBVIEW_FRAME* GetParent() const
{ {
return m_Parent; return m_Parent;
} }

View File

@ -131,7 +131,7 @@ wxPoint GERBER_DRAW_ITEM::GetABPosition( const wxPoint& aXYPosition ) const
} }
wxPoint GERBER_DRAW_ITEM::GetXYPosition( const wxPoint& aABPosition ) wxPoint GERBER_DRAW_ITEM::GetXYPosition( const wxPoint& aABPosition ) const
{ {
// do the inverse transform made by GetABPosition // do the inverse transform made by GetABPosition
wxPoint xyPos = aABPosition; wxPoint xyPos = aABPosition;
@ -577,7 +577,7 @@ void GERBER_DRAW_ITEM::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList )
} }
bool GERBER_DRAW_ITEM::HitTest( const wxPoint& aRefPos ) bool GERBER_DRAW_ITEM::HitTest( const wxPoint& aRefPos ) const
{ {
// calculate aRefPos in XY gerber axis: // calculate aRefPos in XY gerber axis:
wxPoint ref_pos = GetXYPosition( aRefPos ); wxPoint ref_pos = GetXYPosition( aRefPos );
@ -592,7 +592,7 @@ bool GERBER_DRAW_ITEM::HitTest( const wxPoint& aRefPos )
} }
bool GERBER_DRAW_ITEM::HitTest( EDA_RECT& aRefArea ) bool GERBER_DRAW_ITEM::HitTest( const EDA_RECT& aRefArea ) const
{ {
wxPoint pos = GetABPosition( m_Start ); wxPoint pos = GetABPosition( m_Start );

View File

@ -209,7 +209,7 @@ public:
* @param aABPosition = position in A,B plotter axis * @param aABPosition = position in A,B plotter axis
* @return const wxPoint - The given position in X,Y axis. * @return const wxPoint - The given position in X,Y axis.
*/ */
wxPoint GetXYPosition( const wxPoint& aABPosition ); wxPoint GetXYPosition( const wxPoint& aABPosition ) const;
/** /**
* Function GetDcodeDescr * Function GetDcodeDescr
@ -255,7 +255,7 @@ public:
* @param aRefPos a wxPoint to test * @param aRefPos a wxPoint to test
* @return bool - true if a hit, else false * @return bool - true if a hit, else false
*/ */
bool HitTest( const wxPoint& aRefPos ); bool HitTest( const wxPoint& aRefPos ) const;
/** /**
* Function HitTest (overloaded) * Function HitTest (overloaded)
@ -264,7 +264,7 @@ public:
* @param aRefArea a wxPoint to test * @param aRefArea a wxPoint to test
* @return bool - true if a hit, else false * @return bool - true if a hit, else false
*/ */
bool HitTest( EDA_RECT& aRefArea ); bool HitTest( const EDA_RECT& aRefArea ) const;
/** /**
* Function GetClass * Function GetClass

View File

@ -52,8 +52,6 @@ BEGIN_EVENT_TABLE( GERBVIEW_FRAME, EDA_DRAW_FRAME )
GERBVIEW_FRAME::OnSelectOptionToolbar ) GERBVIEW_FRAME::OnSelectOptionToolbar )
EVT_MENU( wxID_PREFERENCES, GERBVIEW_FRAME::InstallGerberOptionsDialog ) EVT_MENU( wxID_PREFERENCES, GERBVIEW_FRAME::InstallGerberOptionsDialog )
EVT_MENU_RANGE( ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, EDA_DRAW_FRAME::SetLanguage )
// menu Postprocess // menu Postprocess
EVT_MENU( ID_GERBVIEW_SHOW_LIST_DCODES, GERBVIEW_FRAME::Process_Special_Functions ) EVT_MENU( ID_GERBVIEW_SHOW_LIST_DCODES, GERBVIEW_FRAME::Process_Special_Functions )
EVT_MENU( ID_GERBVIEW_SHOW_SOURCE, GERBVIEW_FRAME::OnShowGerberSourceFile ) EVT_MENU( ID_GERBVIEW_SHOW_SOURCE, GERBVIEW_FRAME::OnShowGerberSourceFile )
@ -209,9 +207,6 @@ void GERBVIEW_FRAME::Process_Special_Functions( wxCommandEvent& event )
} }
/* Selects the active DCode for the current active layer.
* Items using this DCode are hightlighted
*/
void GERBVIEW_FRAME::OnSelectActiveDCode( wxCommandEvent& event ) void GERBVIEW_FRAME::OnSelectActiveDCode( wxCommandEvent& event )
{ {
GERBER_IMAGE* gerber_image = g_GERBER_List[getActiveLayer()]; GERBER_IMAGE* gerber_image = g_GERBER_List[getActiveLayer()];
@ -228,10 +223,7 @@ void GERBVIEW_FRAME::OnSelectActiveDCode( wxCommandEvent& event )
} }
} }
/* Selects the active layer:
* - if a file is loaded, it is loaded in this layer
* _ this layer is displayed on top of other layers
*/
void GERBVIEW_FRAME::OnSelectActiveLayer( wxCommandEvent& event ) void GERBVIEW_FRAME::OnSelectActiveLayer( wxCommandEvent& event )
{ {
LAYER_NUM layer = getActiveLayer(); LAYER_NUM layer = getActiveLayer();
@ -246,9 +238,6 @@ void GERBVIEW_FRAME::OnSelectActiveLayer( wxCommandEvent& event )
} }
/* Call preferred editor to show (and edit) the gerber source file
* loaded in the active layer
*/
void GERBVIEW_FRAME::OnShowGerberSourceFile( wxCommandEvent& event ) void GERBVIEW_FRAME::OnShowGerberSourceFile( wxCommandEvent& event )
{ {
LAYER_NUM layer = getActiveLayer(); LAYER_NUM layer = getActiveLayer();
@ -275,9 +264,6 @@ void GERBVIEW_FRAME::OnShowGerberSourceFile( wxCommandEvent& event )
} }
/* Function OnSelectDisplayMode: called to select display mode
* (fast display, or exact mode with stacked images or with transparency
*/
void GERBVIEW_FRAME::OnSelectDisplayMode( wxCommandEvent& event ) void GERBVIEW_FRAME::OnSelectDisplayMode( wxCommandEvent& event )
{ {
int oldMode = GetDisplayMode(); int oldMode = GetDisplayMode();
@ -301,20 +287,20 @@ void GERBVIEW_FRAME::OnSelectDisplayMode( wxCommandEvent& event )
m_canvas->Refresh(); m_canvas->Refresh();
} }
void GERBVIEW_FRAME::OnQuit( wxCommandEvent& event ) void GERBVIEW_FRAME::OnQuit( wxCommandEvent& event )
{ {
Close( true ); Close( true );
} }
/**
* Function SetLanguage void GERBVIEW_FRAME::ShowChangedLanguage()
* called on a language menu selection
* Update Layer manager title and tabs texts
*/
void GERBVIEW_FRAME::SetLanguage( wxCommandEvent& event )
{ {
EDA_DRAW_FRAME::SetLanguage( event ); // call my base class
EDA_DRAW_FRAME::ShowChangedLanguage();
m_LayersManager->SetLayersManagerTabsText(); m_LayersManager->SetLayersManagerTabsText();
wxAuiPaneInfo& pane_info = m_auimgr.GetPane( m_LayersManager ); wxAuiPaneInfo& pane_info = m_auimgr.GetPane( m_LayersManager );
pane_info.Caption( _( "Visibles" ) ); pane_info.Caption( _( "Visibles" ) );
m_auimgr.Update(); m_auimgr.Update();
@ -322,14 +308,12 @@ void GERBVIEW_FRAME::SetLanguage( wxCommandEvent& event )
ReFillLayerWidget(); ReFillLayerWidget();
} }
/**
* Function OnSelectOptionToolbar
* called to validate current choices
*/
void GERBVIEW_FRAME::OnSelectOptionToolbar( wxCommandEvent& event ) void GERBVIEW_FRAME::OnSelectOptionToolbar( wxCommandEvent& event )
{ {
int id = event.GetId(); int id = event.GetId();
bool state; bool state;
switch( id ) switch( id )
{ {
case ID_MENU_GERBVIEW_SHOW_HIDE_LAYERS_MANAGER_DIALOG: case ID_MENU_GERBVIEW_SHOW_HIDE_LAYERS_MANAGER_DIALOG:
@ -374,6 +358,7 @@ void GERBVIEW_FRAME::OnSelectOptionToolbar( wxCommandEvent& event )
break; break;
case ID_TB_OPTIONS_SHOW_LAYERS_MANAGER_VERTICAL_TOOLBAR: case ID_TB_OPTIONS_SHOW_LAYERS_MANAGER_VERTICAL_TOOLBAR:
// show/hide auxiliary Vertical layers and visibility manager toolbar // show/hide auxiliary Vertical layers and visibility manager toolbar
m_show_layer_manager_tools = state; m_show_layer_manager_tools = state;
m_auimgr.GetPane( wxT( "m_LayersManagerToolBar" ) ).Show( m_show_layer_manager_tools ); m_auimgr.GetPane( wxT( "m_LayersManagerToolBar" ) ).Show( m_show_layer_manager_tools );

View File

@ -462,11 +462,7 @@ public:
void SaveSettings( wxConfigBase* aCfg ); // override virtual void SaveSettings( wxConfigBase* aCfg ); // override virtual
/** void ShowChangedLanguage(); // override EDA_BASE_FRAME virtual
* Function SetLanguage
* called on a language menu selection
*/
virtual void SetLanguage( wxCommandEvent& event );
void Process_Special_Functions( wxCommandEvent& event ); void Process_Special_Functions( wxCommandEvent& event );
void OnSelectOptionToolbar( wxCommandEvent& event ); void OnSelectOptionToolbar( wxCommandEvent& event );

View File

@ -456,14 +456,10 @@ public:
* Function HitTest * Function HitTest
* tests if \a aPosition is contained within or on the bounding area of an item. * tests if \a aPosition is contained within or on the bounding area of an item.
* *
* @note This function cannot be const because some of the derive objects perform
* intermediate calculations which change object members. Make sure derived
* objects do not declare this as const.
*
* @param aPosition A reference to a wxPoint object containing the coordinates to test. * @param aPosition A reference to a wxPoint object containing the coordinates to test.
* @return True if \a aPosition is within or on the item bounding area. * @return True if \a aPosition is within or on the item bounding area.
*/ */
virtual bool HitTest( const wxPoint& aPosition ) virtual bool HitTest( const wxPoint& aPosition ) const
{ {
return false; // derived classes should override this function return false; // derived classes should override this function
} }

View File

@ -252,7 +252,7 @@ public:
*/ */
wxString GetLayerName() const; wxString GetLayerName() const;
virtual bool HitTest( const wxPoint& aPosition ) virtual bool HitTest( const wxPoint& aPosition ) const
{ {
return EDA_ITEM::HitTest( aPosition ); return EDA_ITEM::HitTest( aPosition );
} }

View File

@ -123,7 +123,7 @@ public:
BASE_SCREEN* GetScreen(); BASE_SCREEN* GetScreen();
EDA_DRAW_FRAME* GetParent(); EDA_DRAW_FRAME* GetParent() const;
void OnPaint( wxPaintEvent& event ); void OnPaint( wxPaintEvent& event );

View File

@ -35,6 +35,14 @@
#define DLGSHIM_USE_SETFOCUS 0 #define DLGSHIM_USE_SETFOCUS 0
#endif #endif
#if wxCHECK_VERSION( 2, 9, 4 )
#define WX_EVENT_LOOP wxGUIEventLoop
#else
#define WX_EVENT_LOOP wxEventLoop
#endif
class WX_EVENT_LOOP;
/** /**
* Class DIALOG_SHIM * Class DIALOG_SHIM
@ -56,12 +64,32 @@ public:
const wxString& name = wxDialogNameStr const wxString& name = wxDialogNameStr
); );
bool Show( bool show ); // overload wxDialog::Show ~DIALOG_SHIM();
int ShowQuasiModal(); // disable only the parent window, otherwise modal.
void EndQuasiModal( int retCode ); // End quasi-modal mode
bool IsQuasiModal() { return m_qmodal_showing; }
bool Show( bool show ); // override wxDialog::Show
bool Enable( bool enable ); // override wxDialog::Enable virtual
protected: protected:
#if !wxCHECK_VERSION( 2, 9, 4 )
wxWindow* CheckIfCanBeUsedAsParent( wxWindow* parent ) const;
wxWindow* GetParentForModalDialog( wxWindow *parent, long style ) const;
#endif
std::string m_hash_key; // alternate for class_map when classname re-used. std::string m_hash_key; // alternate for class_map when classname re-used.
// variables for quasi-modal behavior support, only used by a few derivatives.
WX_EVENT_LOOP* m_qmodal_loop; // points to nested event_loop, NULL means not qmodal and dismissed
bool m_qmodal_showing;
#if DLGSHIM_USE_SETFOCUS #if DLGSHIM_USE_SETFOCUS
private: private:
void onInit( wxInitDialogEvent& aEvent ); void onInit( wxInitDialogEvent& aEvent );

View File

@ -281,13 +281,6 @@ public:
void EraseMsgBox(); void EraseMsgBox();
void Process_PageSettings( wxCommandEvent& event ); void Process_PageSettings( wxCommandEvent& event );
/**
* Function SetLanguage
* called on a language menu selection
* when using a derived function, do not forget to call this one
*/
virtual void SetLanguage( wxCommandEvent& event );
virtual void ReCreateHToolbar() = 0; virtual void ReCreateHToolbar() = 0;
virtual void ReCreateVToolbar() = 0; virtual void ReCreateVToolbar() = 0;
virtual void ReCreateMenuBar(); virtual void ReCreateMenuBar();

View File

@ -80,9 +80,7 @@ public:
* @return int - minus 1 (i.e. -1) means success, >= 0 indicates the character offset into * @return int - minus 1 (i.e. -1) means success, >= 0 indicates the character offset into
* aId at which an error was detected. * aId at which an error was detected.
*/ */
int Parse( const std::string& aId ); int Parse( const UTF8& aId );
int Parse( const wxString& aId );
/** /**
* Function GetLibNickname * Function GetLibNickname
@ -100,9 +98,7 @@ public:
* into the parameter at which an error was detected, usually because it * into the parameter at which an error was detected, usually because it
* contained '/' or ':'. * contained '/' or ':'.
*/ */
int SetLibNickname( const std::string& aNickname ); int SetLibNickname( const UTF8& aNickname );
int SetLibNickname( const wxString& aNickname );
/** /**
* Function GetFootprintName * Function GetFootprintName
@ -114,11 +110,9 @@ public:
* Function SetFootprintName * Function SetFootprintName
* overrides the footprint name portion of the FPID to @a aFootprintName * overrides the footprint name portion of the FPID to @a aFootprintName
*/ */
int SetFootprintName( const std::string& aFootprintName ); int SetFootprintName( const UTF8& aFootprintName );
int SetFootprintName( const wxString& aFootprintName ); int SetRevision( const UTF8& aRevision );
int SetRevision( const std::string& aRevision );
const UTF8& GetRevision() const { return revision; } const UTF8& GetRevision() const { return revision; }
@ -136,10 +130,10 @@ public:
* aLibNickname, aFootprintName, and aRevision. * aLibNickname, aFootprintName, and aRevision.
* *
* @throw PARSE_ERROR if any of the pieces are illegal. * @throw PARSE_ERROR if any of the pieces are illegal.
*/ static UTF8 Format( const UTF8& aLibNickname, const UTF8& aFootprintName,
static UTF8 Format( const std::string& aLibNickname, const std::string& aFootprintName, const UTF8& aRevision = "" )
const std::string& aRevision )
throw( PARSE_ERROR ); throw( PARSE_ERROR );
*/
/** /**
* Function IsValid * Function IsValid

View File

@ -11,22 +11,35 @@ enum FRAME_T
FRAME_SCH, FRAME_SCH,
FRAME_SCH_LIB_EDITOR, FRAME_SCH_LIB_EDITOR,
FRAME_SCH_VIEWER, FRAME_SCH_VIEWER,
FRAME_SCH_VIEWER_MODAL,
FRAME_PCB, FRAME_PCB,
FRAME_PCB_MODULE_EDITOR, FRAME_PCB_MODULE_EDITOR,
FRAME_PCB_MODULE_VIEWER, FRAME_PCB_MODULE_VIEWER,
FRAME_PCB_FOOTPRINT_WIZARD, FRAME_PCB_MODULE_VIEWER_MODAL,
FRAME_PCB_FOOTPRINT_WIZARD_MODAL,
FRAME_PCB_DISPLAY3D, FRAME_PCB_DISPLAY3D,
FRAME_CVPCB, FRAME_CVPCB,
FRAME_CVPCB_DISPLAY, FRAME_CVPCB_DISPLAY,
FRAME_GERBER, FRAME_GERBER,
KIWAY_PLAYER_COUNT, // counts subset of FRAME_T's tracked in class KIWAY
KICAD_MAIN_FRAME_T = KIWAY_PLAYER_COUNT,
FRAME_PL_EDITOR, FRAME_PL_EDITOR,
//TEXT_EDITOR_FRAME_T,
FRAME_BM2CMP,
FRAME_CALC,
KIWAY_PLAYER_COUNT, // counts subset of FRAME_T's which are KIWAY_PLAYER derivatives
// C++ project manager is not a KIWAY_PLAYER
KICAD_MAIN_FRAME_T = KIWAY_PLAYER_COUNT,
FRAME_T_COUNT FRAME_T_COUNT
}; };
//TEXT_EDITOR_FRAME_T,
#endif // FRAME_T_H_ #endif // FRAME_T_H_

View File

@ -58,7 +58,7 @@ public:
} }
VTBL_ENTRY wxWindow* CreateWindow( wxWindow* aParent, VTBL_ENTRY wxWindow* CreateWindow( wxWindow* aParent,
int aClassId, KIWAY* aKIWAY, int aCtlBits ) = 0; int aClassId, KIWAY* aKIWAY, int aCtlBits = 0 ) = 0;
VTBL_ENTRY void* IfaceOrAddress( int aDataId ) = 0; VTBL_ENTRY void* IfaceOrAddress( int aDataId ) = 0;

View File

@ -150,7 +150,8 @@ struct KIFACE
// this interface. // this interface.
#define KFCTL_STANDALONE (1<<0) ///< Am running as a standalone Top. #define KFCTL_STANDALONE (1<<0) ///< Am running as a standalone Top.
#define KFCTL_PROJECT_SUITE (1<<1) ///< Am running under a project mgr, possibly with others #define KFCTL_CPP_PROJECT_SUITE (1<<1) ///< Am running under C++ project mgr, possibly with others
#define KFCTL_PY_PROJECT_SUITE (1<<2) ///< Am running under python project mgr, possibly with others
/** /**
@ -201,7 +202,7 @@ struct KIFACE
* not contained in the caller's link image. * not contained in the caller's link image.
*/ */
VTBL_ENTRY wxWindow* CreateWindow( wxWindow* aParent, int aClassId, VTBL_ENTRY wxWindow* CreateWindow( wxWindow* aParent, int aClassId,
KIWAY* aKIWAY, int aCtlBits ) = 0; KIWAY* aKIWAY, int aCtlBits = 0 ) = 0;
/** /**
* Function IfaceOrAddress * Function IfaceOrAddress
@ -249,6 +250,7 @@ struct KIFACE
*/ */
class KIWAY : public wxEvtHandler class KIWAY : public wxEvtHandler
{ {
friend class PGM_SINGLE_TOP; // can use set_kiface()
public: public:
/// Known KIFACE implementations /// Known KIFACE implementations
@ -257,16 +259,12 @@ public:
FACE_SCH, ///< eeschema DSO FACE_SCH, ///< eeschema DSO
FACE_PCB, ///< pcbnew DSO FACE_PCB, ///< pcbnew DSO
FACE_CVPCB, FACE_CVPCB,
/// count of those above here, which is the subset managed in a KIWAY.
KIWAY_FACE_COUNT,
FACE_BMP2CMP = KIWAY_FACE_COUNT,
FACE_GERBVIEW, FACE_GERBVIEW,
FACE_PL_EDITOR, FACE_PL_EDITOR,
FACE_PCB_CALCULATOR, FACE_PCB_CALCULATOR,
FACE_BMP2CMP,
FACE_COUNT KIWAY_FACE_COUNT
}; };
/** /**
@ -325,7 +323,14 @@ public:
*/ */
VTBL_ENTRY bool PlayersClose( bool doForce ); VTBL_ENTRY bool PlayersClose( bool doForce );
VTBL_ENTRY void ExpressMail( FRAME_T aDestination, MAIL_T aCommand, const std::string& aPayload, wxWindow* aSource=NULL ); /**
* Function ExpressMail
* send aPayload to aDestination from aSource. Recipient receives this in its
* KIWAY_PLAYER::KiwayMailIn() function and can efficiently switch() based on
* aCommand in there.
*/
VTBL_ENTRY void ExpressMail( FRAME_T aDestination, MAIL_T aCommand,
const std::string& aPayload, wxWindow* aSource = NULL );
/** /**
* Function Prj * Function Prj
@ -335,11 +340,26 @@ public:
*/ */
VTBL_ENTRY PROJECT& Prj() const; VTBL_ENTRY PROJECT& Prj() const;
KIWAY( PGM_BASE* aProgram, wxFrame* aTop = NULL ); /**
* Function SetLanguage
* changes the language and then calls ShowChangedLanguage() on all KIWAY_PLAYERs.
*/
VTBL_ENTRY void SetLanguage( int aLanguage );
/// In case aTop may not be known at time of KIWAY construction: KIWAY( PGM_BASE* aProgram, int aCtlBits, wxFrame* aTop = NULL );
/**
* Function SetTop
* tells this KIWAY about the top most frame in the program and optionally
* allows it to play the role of one of the KIWAY_PLAYERs if launched from
* single_top.cpp.
*
* @param aTop is the top most wxFrame in the entire program.
*/
void SetTop( wxFrame* aTop ); void SetTop( wxFrame* aTop );
void OnKiwayEnd();
bool ProcessEvent( wxEvent& aEvent ); // overload virtual bool ProcessEvent( wxEvent& aEvent ); // overload virtual
private: private:
@ -348,12 +368,23 @@ private:
static const wxString dso_full_path( FACE_T aFaceId ); static const wxString dso_full_path( FACE_T aFaceId );
/// hooked into m_top in SetTop(), marks child frame as closed. /// hooked into m_top in SetTop(), marks child frame as closed.
void playerDestroyHandler( wxWindowDestroyEvent& event ); void player_destroy_handler( wxWindowDestroyEvent& event );
bool set_kiface( FACE_T aFaceType, KIFACE* aKiface )
{
if( unsigned( aFaceType ) < unsigned( KIWAY_FACE_COUNT ) )
{
m_kiface[aFaceType] = aKiface;
return true;
}
return false;
}
static KIFACE* m_kiface[KIWAY_FACE_COUNT]; static KIFACE* m_kiface[KIWAY_FACE_COUNT];
static int m_kiface_version[KIWAY_FACE_COUNT]; static int m_kiface_version[KIWAY_FACE_COUNT];
PGM_BASE* m_program; PGM_BASE* m_program;
int m_ctl;
wxFrame* m_top; wxFrame* m_top;
KIWAY_PLAYER* m_player[KIWAY_PLAYER_COUNT]; // from frame_type.h KIWAY_PLAYER* m_player[KIWAY_PLAYER_COUNT]; // from frame_type.h

View File

@ -35,6 +35,8 @@ class PROJECT;
struct KIFACE; struct KIFACE;
class KIFACE_I; class KIFACE_I;
#define VTBL_ENTRY virtual
/** /**
* Class KIWAY_HOLDER * Class KIWAY_HOLDER
@ -86,6 +88,15 @@ private:
class KIWAY_EXPRESS; class KIWAY_EXPRESS;
#if wxCHECK_VERSION( 2, 9, 4 )
#define WX_EVENT_LOOP wxGUIEventLoop
#else
#define WX_EVENT_LOOP wxEventLoop
#endif
class WX_EVENT_LOOP;
/** /**
* Class KIWAY_PLAYER * Class KIWAY_PLAYER
* is a wxFrame capable of the OpenProjectFiles function, meaning it can load * is a wxFrame capable of the OpenProjectFiles function, meaning it can load
@ -110,6 +121,9 @@ public:
const wxPoint& aPos, const wxSize& aSize, long aStyle, const wxPoint& aPos, const wxSize& aSize, long aStyle,
const wxString& aWdoName = wxFrameNameStr ); const wxString& aWdoName = wxFrameNameStr );
~KIWAY_PLAYER();
//----<Cross Module API>-----------------------------------------------------
// For the aCtl argument of OpenProjectFiles() // For the aCtl argument of OpenProjectFiles()
#define KICTL_OPEN_APPEND (1<<0) ///< append the data file, rather than replace #define KICTL_OPEN_APPEND (1<<0) ///< append the data file, rather than replace
@ -149,7 +163,7 @@ public:
* *
* @return bool - true if all requested files were opened OK, else false. * @return bool - true if all requested files were opened OK, else false.
*/ */
virtual bool OpenProjectFiles( const std::vector<wxString>& aFileList, int aCtl = 0 ) VTBL_ENTRY bool OpenProjectFiles( const std::vector<wxString>& aFileList, int aCtl = 0 )
{ {
// overload me for your wxFrame type. // overload me for your wxFrame type.
@ -161,6 +175,25 @@ public:
return false; return false;
} }
/**
* Function ShowModal
* puts up this wxFrame as if it were a modal dialog, with all other instantiated
* wxFrames disabled until this KIWAY_PLAYER derivative calls DismissModal().
* That is, behavior is similar to a modal dialog window. Not all KIWAY_PLAYERs
* use this interface, so don't call this unless the implementation knows how
* to call DismissModal() on a button click or double click or some special
* event which ends the modal behavior.
*
* @param aResult if not NULL, indicates a place to put a resultant string.
*
* @return bool - true if frame implementation called KIWAY_PLAYER::DismissModal()
* with aRetVal of true.
*/
VTBL_ENTRY bool ShowModal( wxString* aResult = NULL );
//----</Cross Module API>----------------------------------------------------
/** /**
* Function KiwayMailIn * Function KiwayMailIn
* receives KIWAY_EXPRESS messages from other players. Merely override it * receives KIWAY_EXPRESS messages from other players. Merely override it
@ -168,12 +201,37 @@ public:
*/ */
virtual void KiwayMailIn( KIWAY_EXPRESS& aEvent ); virtual void KiwayMailIn( KIWAY_EXPRESS& aEvent );
DECLARE_EVENT_TABLE() protected:
//private: bool IsModal() { return m_modal; }
void SetModal( bool IsModal ) { m_modal = IsModal; }
/// event handler, routes to virtual KiwayMailIn() /**
* Function IsDismissed
* returns false only if both the frame is acting in modal mode and it has not been
* dismissed yet with DismissModal(). IOW, it will return true if the dialog is
* not modal or if it is modal and has been dismissed.
*/
bool IsDismissed();
void DismissModal( bool aRetVal, const wxString& aResult = wxEmptyString );
/// event handler, routes to derivative specific virtual KiwayMailIn()
void kiway_express( KIWAY_EXPRESS& aEvent ); void kiway_express( KIWAY_EXPRESS& aEvent );
/**
* Function language_change
* is an event handler called on a language menu selection.
*/
void language_change( wxCommandEvent& event );
// variables for modal behavior support, only used by a few derivatives.
bool m_modal; // true if frame is intended to be modal, not modeless
WX_EVENT_LOOP* m_modal_loop; // points to nested event_loop, NULL means not modal and dismissed
wxString m_modal_string;
bool m_modal_ret_val; // true if a selection was made
DECLARE_EVENT_TABLE()
}; };

View File

@ -291,7 +291,10 @@ public:
bool IsConnected( const wxPoint& aPoint ) const; bool IsConnected( const wxPoint& aPoint ) const;
/** @copydoc EDA_ITEM::HitTest(const wxPoint&) */ /** @copydoc EDA_ITEM::HitTest(const wxPoint&) */
virtual bool HitTest( const wxPoint& aPosition ) { return HitTest( aPosition, 0 ); } virtual bool HitTest( const wxPoint& aPosition ) const
{
return HitTest( aPosition, 0 );
}
/** /**
* Function HitTest * Function HitTest

View File

@ -59,7 +59,7 @@ public:
EDA_COLOR_T GetColor() const { return m_color; } EDA_COLOR_T GetColor() const { return m_color; }
WS_DRAW_TYPE GetType() const { return m_type; }; WS_DRAW_TYPE GetType() const { return m_type; };
WORKSHEET_DATAITEM* GetParent() { return m_parent; } WORKSHEET_DATAITEM* GetParent() const { return m_parent; }
/** The function to draw a WS_DRAW_ITEM /** The function to draw a WS_DRAW_ITEM
*/ */
@ -69,7 +69,7 @@ public:
* Abstract function: should exist for derived items * Abstract function: should exist for derived items
* return true if the point aPosition is on the item * return true if the point aPosition is on the item
*/ */
virtual bool HitTest( const wxPoint& aPosition) = 0; virtual bool HitTest( const wxPoint& aPosition) const = 0;
/** /**
* Abstract function: should exist for derived items * Abstract function: should exist for derived items
@ -124,7 +124,7 @@ public:
* Virtual function * Virtual function
* return true if the point aPosition is on the line * return true if the point aPosition is on the line
*/ */
virtual bool HitTest( const wxPoint& aPosition); virtual bool HitTest( const wxPoint& aPosition) const;
/** /**
* return true if the point aPosition is on the starting point of this item. * return true if the point aPosition is on the starting point of this item.
@ -174,7 +174,7 @@ public:
* Virtual function * Virtual function
* return true if the point aPosition is inside one polygon * return true if the point aPosition is inside one polygon
*/ */
virtual bool HitTest( const wxPoint& aPosition); virtual bool HitTest( const wxPoint& aPosition) const;
/** /**
* return true if the point aPosition is on the starting point of this item. * return true if the point aPosition is on the starting point of this item.
@ -202,7 +202,7 @@ public:
* Virtual function * Virtual function
* return true if the point aPosition is on one edge of the rectangle * return true if the point aPosition is on one edge of the rectangle
*/ */
virtual bool HitTest( const wxPoint& aPosition); virtual bool HitTest( const wxPoint& aPosition) const;
/** /**
* return true if the point aPosition is on the starting point of this item. * return true if the point aPosition is on the starting point of this item.
@ -239,7 +239,7 @@ public:
* Virtual function * Virtual function
* return true if the point aPosition is on the text * return true if the point aPosition is on the text
*/ */
virtual bool HitTest( const wxPoint& aPosition); virtual bool HitTest( const wxPoint& aPosition) const;
/** /**
* return true if the point aPosition is on the starting point of this item. * return true if the point aPosition is on the starting point of this item.
@ -274,7 +274,7 @@ public:
* Virtual function * Virtual function
* return true if the point aPosition is on bitmap * return true if the point aPosition is on bitmap
*/ */
virtual bool HitTest( const wxPoint& aPosition); virtual bool HitTest( const wxPoint& aPosition) const;
/** /**
* return true if the point aPosition is on the reference point of this item. * return true if the point aPosition is on the reference point of this item.

View File

@ -813,12 +813,6 @@ private:
void OnUpdateBusOrientation( wxUpdateUIEvent& event ); void OnUpdateBusOrientation( wxUpdateUIEvent& event );
void OnUpdateSelectTool( wxUpdateUIEvent& aEvent ); void OnUpdateSelectTool( wxUpdateUIEvent& aEvent );
/**
* Function SetLanguage
* called on a language menu selection
*/
void SetLanguage( wxCommandEvent& event );
/** /**
* Function UpdateTitle * Function UpdateTitle
* sets the main window title bar text. * sets the main window title bar text.

View File

@ -1664,11 +1664,7 @@ public:
*/ */
MODULE* Genere_Self( wxDC* DC ); MODULE* Genere_Self( wxDC* DC );
/** void ShowChangedLanguage(); // override EDA_BASE_FRAME virtual
* Function SetLanguage
* called on a language menu selection
*/
virtual void SetLanguage( wxCommandEvent& event );
/** /**
* Function UpdateTitle * Function UpdateTitle

View File

@ -190,7 +190,9 @@ public:
* @warning If you override this function in a derived class, make sure you call * @warning If you override this function in a derived class, make sure you call
* down to this or the auto save feature will be disabled. * down to this or the auto save feature will be disabled.
*/ */
bool ProcessEvent( wxEvent& aEvent ); // overload wxFrame::ProcessEvent() bool ProcessEvent( wxEvent& aEvent ); // override wxFrame::ProcessEvent()
bool Enable( bool enable ); // override wxFrame::Enable virtual
void SetAutoSaveInterval( int aInterval ) { m_autoSaveInterval = aInterval; } void SetAutoSaveInterval( int aInterval ) { m_autoSaveInterval = aInterval; }
@ -302,13 +304,6 @@ public:
*/ */
void ExportHotkeyConfigToFile( struct EDA_HOTKEY_CONFIG* aDescList ); void ExportHotkeyConfigToFile( struct EDA_HOTKEY_CONFIG* aDescList );
/**
* Function SetLanguage
* called on a language menu selection
* when using a derived function, do not forget to call this one
*/
virtual void SetLanguage( wxCommandEvent& event );
/** /**
* Function GetFileFromHistory * Function GetFileFromHistory
* fetches the file name from the file history list. * fetches the file name from the file history list.
@ -380,17 +375,10 @@ public:
void CheckForAutoSaveFile( const wxFileName& aFileName, const wxString& aBackupFileExtension ); void CheckForAutoSaveFile( const wxFileName& aFileName, const wxString& aBackupFileExtension );
/** /**
* Function SetModalMode * Function ShowChangedLanguage
* Disable or enable all other windows, to emulate a dialog behavior * redraws the menus and what not in current language.
* Useful when the frame is used to show and selec items
* (see FOOTPRINT_VIEWER_FRAME and LIB_VIEW_FRAME)
*
* @param aModal = true to disable all other opened windows (i.e.
* this windows is in dialog mode
* = false to enable other windows
* This function is analog to MakeModal( aModal ), deprecated since wxWidgets 2.9.4
*/ */
void SetModalMode( bool aModal ); virtual void ShowChangedLanguage();
}; };
@ -415,7 +403,6 @@ public:
* then after a //==// break has additional calls to anchor toolbars in a way that matches * then after a //==// break has additional calls to anchor toolbars in a way that matches
* present functionality. * present functionality.
*/ */
class EDA_PANEINFO : public wxAuiPaneInfo class EDA_PANEINFO : public wxAuiPaneInfo
{ {

View File

@ -17,7 +17,7 @@ private:
public: public:
TREE_PROJECT_FRAME* GetParent() TREE_PROJECT_FRAME* GetParent() const
{ {
return m_Parent; return m_Parent;
} }

View File

@ -197,6 +197,8 @@ bool PGM_KICAD::OnPgmInit( wxApp* aWxApp )
void PGM_KICAD::OnPgmExit() void PGM_KICAD::OnPgmExit()
{ {
Kiway.OnKiwayEnd();
saveCommonSettings(); saveCommonSettings();
// write common settings to disk, and destroy everything in PGM_KICAD, // write common settings to disk, and destroy everything in PGM_KICAD,
@ -253,7 +255,7 @@ void PGM_KICAD::destroy()
} }
KIWAY Kiway( &Pgm() ); KIWAY Kiway( &Pgm(), KFCTL_CPP_PROJECT_SUITE );
/** /**

View File

@ -140,6 +140,8 @@ public:
private: private:
int m_leftWinWidth; int m_leftWinWidth;
void language_change( wxCommandEvent& event );
public: public:
KICAD_MANAGER_FRAME( wxWindow* parent, const wxString& title, KICAD_MANAGER_FRAME( wxWindow* parent, const wxString& title,
const wxPoint& pos, const wxSize& size ); const wxPoint& pos, const wxSize& size );
@ -202,7 +204,6 @@ public:
*/ */
void ClearMsg(); void ClearMsg();
void SetLanguage( wxCommandEvent& event );
void OnRefresh( wxCommandEvent& event ); void OnRefresh( wxCommandEvent& event );
void OnSelectDefaultPdfBrowser( wxCommandEvent& event ); void OnSelectDefaultPdfBrowser( wxCommandEvent& event );
void OnSelectPreferredPdfBrowser( wxCommandEvent& event ); void OnSelectPreferredPdfBrowser( wxCommandEvent& event );

View File

@ -361,6 +361,14 @@ void KICAD_MANAGER_FRAME::OnRefresh( wxCommandEvent& event )
} }
void KICAD_MANAGER_FRAME::language_change( wxCommandEvent& event )
{
int id = event.GetId();
Kiway.SetLanguage( id );
}
void KICAD_MANAGER_FRAME::ClearMsg() void KICAD_MANAGER_FRAME::ClearMsg()
{ {
m_MessagesBox->Clear(); m_MessagesBox->Clear();

View File

@ -33,20 +33,20 @@
#include <menus_helpers.h> #include <menus_helpers.h>
#include <tree_project_frame.h> #include <tree_project_frame.h>
/* Menubar and toolbar event table */ // Menubar and toolbar event table
BEGIN_EVENT_TABLE( KICAD_MANAGER_FRAME, EDA_BASE_FRAME ) BEGIN_EVENT_TABLE( KICAD_MANAGER_FRAME, EDA_BASE_FRAME )
/* Window events */ // Window events
EVT_SIZE( KICAD_MANAGER_FRAME::OnSize ) EVT_SIZE( KICAD_MANAGER_FRAME::OnSize )
EVT_CLOSE( KICAD_MANAGER_FRAME::OnCloseWindow ) EVT_CLOSE( KICAD_MANAGER_FRAME::OnCloseWindow )
/* Toolbar events */ // Toolbar events
EVT_TOOL( ID_NEW_PROJECT, KICAD_MANAGER_FRAME::OnLoadProject ) EVT_TOOL( ID_NEW_PROJECT, KICAD_MANAGER_FRAME::OnLoadProject )
EVT_TOOL( ID_NEW_PROJECT_FROM_TEMPLATE, KICAD_MANAGER_FRAME::OnLoadProject ) EVT_TOOL( ID_NEW_PROJECT_FROM_TEMPLATE, KICAD_MANAGER_FRAME::OnLoadProject )
EVT_TOOL( ID_LOAD_PROJECT, KICAD_MANAGER_FRAME::OnLoadProject ) EVT_TOOL( ID_LOAD_PROJECT, KICAD_MANAGER_FRAME::OnLoadProject )
EVT_TOOL( ID_SAVE_PROJECT, KICAD_MANAGER_FRAME::OnSaveProject ) EVT_TOOL( ID_SAVE_PROJECT, KICAD_MANAGER_FRAME::OnSaveProject )
EVT_TOOL( ID_SAVE_AND_ZIP_FILES, KICAD_MANAGER_FRAME::OnArchiveFiles ) EVT_TOOL( ID_SAVE_AND_ZIP_FILES, KICAD_MANAGER_FRAME::OnArchiveFiles )
/* Menu events */ // Menu events
EVT_MENU( ID_SAVE_PROJECT, KICAD_MANAGER_FRAME::OnSaveProject ) EVT_MENU( ID_SAVE_PROJECT, KICAD_MANAGER_FRAME::OnSaveProject )
EVT_MENU( wxID_EXIT, KICAD_MANAGER_FRAME::OnExit ) EVT_MENU( wxID_EXIT, KICAD_MANAGER_FRAME::OnExit )
EVT_MENU( ID_TO_EDITOR, KICAD_MANAGER_FRAME::OnOpenTextEditor ) EVT_MENU( ID_TO_EDITOR, KICAD_MANAGER_FRAME::OnOpenTextEditor )
@ -63,8 +63,9 @@ BEGIN_EVENT_TABLE( KICAD_MANAGER_FRAME, EDA_BASE_FRAME )
EVT_MENU( wxID_INDEX, KICAD_MANAGER_FRAME::GetKicadHelp ) EVT_MENU( wxID_INDEX, KICAD_MANAGER_FRAME::GetKicadHelp )
EVT_MENU( wxID_ABOUT, KICAD_MANAGER_FRAME::GetKicadAbout ) EVT_MENU( wxID_ABOUT, KICAD_MANAGER_FRAME::GetKicadAbout )
/* Range menu events */ // Range menu events
EVT_MENU_RANGE( ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, KICAD_MANAGER_FRAME::SetLanguage ) EVT_MENU_RANGE( ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, KICAD_MANAGER_FRAME::language_change )
EVT_MENU_RANGE( wxID_FILE1, wxID_FILE9, KICAD_MANAGER_FRAME::OnFileHistory ) EVT_MENU_RANGE( wxID_FILE1, wxID_FILE9, KICAD_MANAGER_FRAME::OnFileHistory )
// Special functions // Special functions
@ -72,7 +73,7 @@ BEGIN_EVENT_TABLE( KICAD_MANAGER_FRAME, EDA_BASE_FRAME )
EVT_MENU( ID_INIT_WATCHED_PATHS, KICAD_MANAGER_FRAME::OnChangeWatchedPaths ) EVT_MENU( ID_INIT_WATCHED_PATHS, KICAD_MANAGER_FRAME::OnChangeWatchedPaths )
#endif #endif
/* Button events */ // Button events
EVT_BUTTON( ID_TO_PCB, KICAD_MANAGER_FRAME::OnRunPcbNew ) EVT_BUTTON( ID_TO_PCB, KICAD_MANAGER_FRAME::OnRunPcbNew )
EVT_BUTTON( ID_TO_CVPCB, KICAD_MANAGER_FRAME::OnRunCvpcb ) EVT_BUTTON( ID_TO_CVPCB, KICAD_MANAGER_FRAME::OnRunCvpcb )
EVT_BUTTON( ID_TO_EESCHEMA, KICAD_MANAGER_FRAME::OnRunEeschema ) EVT_BUTTON( ID_TO_EESCHEMA, KICAD_MANAGER_FRAME::OnRunEeschema )

View File

@ -88,8 +88,3 @@ void KICAD_MANAGER_FRAME::OnSelectPreferredPdfBrowser( wxCommandEvent& event )
Pgm().WritePdfBrowserInfos(); Pgm().WritePdfBrowserInfos();
} }
void KICAD_MANAGER_FRAME::SetLanguage( wxCommandEvent& event )
{
EDA_BASE_FRAME::SetLanguage( event );
}

View File

@ -70,12 +70,8 @@ BEGIN_EVENT_TABLE( PL_EDITOR_FRAME, EDA_DRAW_FRAME )
EVT_MENU( wxID_EXIT, PL_EDITOR_FRAME::OnQuit ) EVT_MENU( wxID_EXIT, PL_EDITOR_FRAME::OnQuit )
// menu Preferences // menu Preferences
EVT_MENU_RANGE( ID_PREFERENCES_HOTKEY_START, ID_PREFERENCES_HOTKEY_END, EVT_MENU_RANGE( ID_PREFERENCES_HOTKEY_START, ID_PREFERENCES_HOTKEY_END, PL_EDITOR_FRAME::Process_Config )
PL_EDITOR_FRAME::Process_Config ) EVT_MENU( ID_MENU_PL_EDITOR_SELECT_PREFERED_EDITOR, EDA_BASE_FRAME::OnSelectPreferredEditor )
EVT_MENU_RANGE( ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END,
EDA_DRAW_FRAME::SetLanguage )
EVT_MENU( ID_MENU_PL_EDITOR_SELECT_PREFERED_EDITOR,
EDA_BASE_FRAME::OnSelectPreferredEditor )
EVT_MENU( wxID_PREFERENCES, PL_EDITOR_FRAME::Process_Config ) EVT_MENU( wxID_PREFERENCES, PL_EDITOR_FRAME::Process_Config )
EVT_MENU( ID_MENU_SWITCH_BGCOLOR, PL_EDITOR_FRAME::Process_Config ) EVT_MENU( ID_MENU_SWITCH_BGCOLOR, PL_EDITOR_FRAME::Process_Config )
EVT_MENU( ID_MENU_GRID_ONOFF, PL_EDITOR_FRAME::Process_Config ) EVT_MENU( ID_MENU_GRID_ONOFF, PL_EDITOR_FRAME::Process_Config )
@ -473,15 +469,6 @@ void PL_EDITOR_FRAME::OnQuit( wxCommandEvent& event )
Close( true ); Close( true );
} }
/**
* Function SetLanguage
* called on a language menu selection
* Update Layer manager title and tabs texts
*/
void PL_EDITOR_FRAME::SetLanguage( wxCommandEvent& event )
{
EDA_DRAW_FRAME::SetLanguage( event );
}
void PL_EDITOR_FRAME::ToPlotter(wxCommandEvent& event) void PL_EDITOR_FRAME::ToPlotter(wxCommandEvent& event)
{ {

View File

@ -198,12 +198,6 @@ public:
void SaveSettings( wxConfigBase* aCfg ); // override virtual void SaveSettings( wxConfigBase* aCfg ); // override virtual
/**
* Function SetLanguage
* called on a language menu selection
*/
virtual void SetLanguage( wxCommandEvent& event );
void Process_Special_Functions( wxCommandEvent& event ); void Process_Special_Functions( wxCommandEvent& event );
void OnSelectOptionToolbar( wxCommandEvent& event ); void OnSelectOptionToolbar( wxCommandEvent& event );

View File

@ -75,7 +75,7 @@ if( USE_KIWAY_DLLS )
${PCB_CALCULATOR_RESOURCES} ${PCB_CALCULATOR_RESOURCES}
) )
set_source_files_properties( ../common/single_top.cpp PROPERTIES set_source_files_properties( ../common/single_top.cpp PROPERTIES
COMPILE_DEFINITIONS "TOP_FRAME=0;BUILD_KIWAY_DLL" COMPILE_DEFINITIONS "TOP_FRAME=FRAME_CALC;BUILD_KIWAY_DLL"
) )
target_link_libraries( pcb_calculator target_link_libraries( pcb_calculator
#singletop # replaces common, giving us restrictive control and link warnings. #singletop # replaces common, giving us restrictive control and link warnings.
@ -93,7 +93,6 @@ if( USE_KIWAY_DLLS )
add_library( pcb_calculator_kiface MODULE add_library( pcb_calculator_kiface MODULE
pcb_calculator.cpp pcb_calculator.cpp
${PCB_CALCULATOR_SRCS} ${PCB_CALCULATOR_SRCS}
# ${PCB_CALCULATOR_RESOURCES}
) )
set_target_properties( pcb_calculator_kiface PROPERTIES set_target_properties( pcb_calculator_kiface PROPERTIES
OUTPUT_NAME pcb_calculator OUTPUT_NAME pcb_calculator

View File

@ -134,6 +134,7 @@ PCB_CALCULATOR_FRAME::~PCB_CALCULATOR_FRAME()
this->Freeze(); this->Freeze();
} }
void PCB_CALCULATOR_FRAME::OnClosePcbCalc( wxCloseEvent& event ) void PCB_CALCULATOR_FRAME::OnClosePcbCalc( wxCloseEvent& event )
{ {
if( m_RegulatorListChanged ) if( m_RegulatorListChanged )

View File

@ -306,7 +306,7 @@ static void DrawMovingBlockOutlines( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wx
bool aErase ) bool aErase )
{ {
BASE_SCREEN* screen = aPanel->GetScreen(); BASE_SCREEN* screen = aPanel->GetScreen();
FOOTPRINT_EDIT_FRAME* moduleEditFrame = FOOTPRINT_EDIT_FRAME::GetActiveFootprintEditor( aPanel->GetParent() ); FOOTPRINT_EDIT_FRAME* moduleEditFrame = dynamic_cast<FOOTPRINT_EDIT_FRAME*>( aPanel->GetParent() );
wxASSERT( moduleEditFrame ); wxASSERT( moduleEditFrame );
MODULE* currentModule = moduleEditFrame->GetBoard()->m_Modules; MODULE* currentModule = moduleEditFrame->GetBoard()->m_Modules;

View File

@ -403,7 +403,7 @@ void DIMENSION::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList )
} }
bool DIMENSION::HitTest( const wxPoint& aPosition ) bool DIMENSION::HitTest( const wxPoint& aPosition ) const
{ {
if( m_Text.TextHitTest( aPosition ) ) if( m_Text.TextHitTest( aPosition ) )
return true; return true;

View File

@ -208,7 +208,7 @@ public:
void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList ); void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList );
bool HitTest( const wxPoint& aPosition ); bool HitTest( const wxPoint& aPosition ) const;
/** @copydoc BOARD_ITEM::HitTest(const EDA_RECT& aRect, /** @copydoc BOARD_ITEM::HitTest(const EDA_RECT& aRect,
* bool aContained = true, int aAccuracy ) const * bool aContained = true, int aAccuracy ) const

View File

@ -475,7 +475,7 @@ const EDA_RECT DRAWSEGMENT::GetBoundingBox() const
} }
bool DRAWSEGMENT::HitTest( const wxPoint& aPosition ) bool DRAWSEGMENT::HitTest( const wxPoint& aPosition ) const
{ {
switch( m_Shape ) switch( m_Shape )
{ {

View File

@ -179,7 +179,7 @@ public:
virtual const EDA_RECT GetBoundingBox() const; virtual const EDA_RECT GetBoundingBox() const;
virtual bool HitTest( const wxPoint& aPosition ); virtual bool HitTest( const wxPoint& aPosition ) const;
/** @copydoc BOARD_ITEM::HitTest(const EDA_RECT& aRect, /** @copydoc BOARD_ITEM::HitTest(const EDA_RECT& aRect,
* bool aContained = true, int aAccuracy ) const * bool aContained = true, int aAccuracy ) const

View File

@ -74,7 +74,7 @@ public:
return m_item; return m_item;
} }
bool HitTest( const wxPoint& aPosition ) bool HitTest( const wxPoint& aPosition ) const
{ {
return HitTestMarker( aPosition ); return HitTestMarker( aPosition );
} }

View File

@ -158,7 +158,7 @@ void PCB_TARGET::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, GR_DRAWMODE mode_color,
} }
bool PCB_TARGET::HitTest( const wxPoint& aPosition ) bool PCB_TARGET::HitTest( const wxPoint& aPosition ) const
{ {
int dX = aPosition.x - m_Pos.x; int dX = aPosition.x - m_Pos.x;
int dY = aPosition.y - m_Pos.y; int dY = aPosition.y - m_Pos.y;

View File

@ -82,7 +82,7 @@ public:
void Draw( EDA_DRAW_PANEL* panel, wxDC* DC, void Draw( EDA_DRAW_PANEL* panel, wxDC* DC,
GR_DRAWMODE aDrawMode, const wxPoint& offset = ZeroOffset ); GR_DRAWMODE aDrawMode, const wxPoint& offset = ZeroOffset );
bool HitTest( const wxPoint& aPosition ); bool HitTest( const wxPoint& aPosition ) const;
/** @copydoc BOARD_ITEM::HitTest(const EDA_RECT& aRect, /** @copydoc BOARD_ITEM::HitTest(const EDA_RECT& aRect,
* bool aContained = true, int aAccuracy ) const * bool aContained = true, int aAccuracy ) const

View File

@ -549,7 +549,7 @@ void MODULE::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList )
} }
bool MODULE::HitTest( const wxPoint& aPosition ) bool MODULE::HitTest( const wxPoint& aPosition ) const
{ {
if( m_BoundaryBox.Contains( aPosition ) ) if( m_BoundaryBox.Contains( aPosition ) )
return true; return true;

View File

@ -324,7 +324,7 @@ public:
void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList ); void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList );
bool HitTest( const wxPoint& aPosition ); bool HitTest( const wxPoint& aPosition ) const;
/** @copydoc BOARD_ITEM::HitTest(const EDA_RECT& aRect, /** @copydoc BOARD_ITEM::HitTest(const EDA_RECT& aRect,
* bool aContained = true, int aAccuracy ) const * bool aContained = true, int aAccuracy ) const

View File

@ -637,7 +637,7 @@ bool D_PAD::IsOnLayer( LAYER_NUM aLayer ) const
} }
bool D_PAD::HitTest( const wxPoint& aPosition ) bool D_PAD::HitTest( const wxPoint& aPosition ) const
{ {
int dx, dy; int dx, dy;

View File

@ -341,7 +341,7 @@ public:
* Function GetBoundingRadius * Function GetBoundingRadius
* returns the radius of a minimum sized circle which fully encloses this pad. * returns the radius of a minimum sized circle which fully encloses this pad.
*/ */
int GetBoundingRadius() int GetBoundingRadius() const
{ {
// Any member function which would affect this calculation should set // Any member function which would affect this calculation should set
// m_boundingRadius to -1 to re-trigger the calculation from here. // m_boundingRadius to -1 to re-trigger the calculation from here.
@ -368,7 +368,7 @@ public:
bool IsOnLayer( LAYER_NUM aLayer ) const; bool IsOnLayer( LAYER_NUM aLayer ) const;
bool HitTest( const wxPoint& aPosition ); bool HitTest( const wxPoint& aPosition ) const;
wxString GetClass() const wxString GetClass() const
{ {
@ -450,7 +450,8 @@ private:
*/ */
int boundingRadius() const; int boundingRadius() const;
int m_boundingRadius; ///< radius of the circle containing the pad shape // Actually computed and cached on demand by the accessor
mutable int m_boundingRadius; ///< radius of the circle containing the pad shape
/// Pad name (4 char) or a long identifier (used in pad name /// Pad name (4 char) or a long identifier (used in pad name
/// comparisons because this is faster than string comparison) /// comparisons because this is faster than string comparison)

View File

@ -76,7 +76,7 @@ public:
void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList ); void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList );
bool HitTest( const wxPoint& aPosition ) bool HitTest( const wxPoint& aPosition ) const
{ {
return TextHitTest( aPosition ); return TextHitTest( aPosition );
} }

View File

@ -163,7 +163,7 @@ void TEXTE_MODULE::SetLocalCoord()
RotatePoint( &m_Pos0.x, &m_Pos0.y, -angle ); RotatePoint( &m_Pos0.x, &m_Pos0.y, -angle );
} }
bool TEXTE_MODULE::HitTest( const wxPoint& aPosition ) bool TEXTE_MODULE::HitTest( const wxPoint& aPosition ) const
{ {
wxPoint rel_pos; wxPoint rel_pos;
EDA_RECT area = GetTextBox( -1, -1 ); EDA_RECT area = GetTextBox( -1, -1 );
@ -455,6 +455,9 @@ void TEXTE_MODULE::ViewGetLayers( int aLayers[], int& aCount ) const
case LAYER_N_FRONT: case LAYER_N_FRONT:
aLayers[0] = ITEM_GAL_LAYER( MOD_TEXT_FR_VISIBLE ); // how about SILKSCREEN_N_FRONT? aLayers[0] = ITEM_GAL_LAYER( MOD_TEXT_FR_VISIBLE ); // how about SILKSCREEN_N_FRONT?
break; break;
default:
wxFAIL_MSG( wxT( "Can't tell text layer" ) );
} }
break; break;
} }

View File

@ -150,7 +150,7 @@ public:
void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList ); void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList );
bool HitTest( const wxPoint& aPosition ); bool HitTest( const wxPoint& aPosition ) const;
wxString GetClass() const wxString GetClass() const
{ {

View File

@ -1236,7 +1236,7 @@ bool TRACK::HitTest( const wxPoint& aPosition )
return TestSegmentHit( aPosition, m_Start, m_End, m_Width / 2 ); return TestSegmentHit( aPosition, m_Start, m_End, m_Width / 2 );
} }
bool VIA::HitTest( const wxPoint& aPosition ) bool VIA::HitTest( const wxPoint& aPosition ) const
{ {
int max_dist = m_Width / 2; int max_dist = m_Width / 2;

View File

@ -401,7 +401,7 @@ public:
const wxPoint& GetPosition() const { return m_Start; } // was overload const wxPoint& GetPosition() const { return m_Start; } // was overload
void SetPosition( const wxPoint& aPoint ) { m_Start = aPoint; m_End = aPoint; } // was overload void SetPosition( const wxPoint& aPoint ) { m_Start = aPoint; m_End = aPoint; } // was overload
virtual bool HitTest( const wxPoint& aPosition ); virtual bool HitTest( const wxPoint& aPosition ) const;
virtual bool HitTest( const EDA_RECT& aRect, bool aContained = true, int aAccuracy = 0 ) const; virtual bool HitTest( const EDA_RECT& aRect, bool aContained = true, int aAccuracy = 0 ) const;

View File

@ -440,37 +440,42 @@ int ZONE_CONTAINER::GetThermalReliefCopperBridge( D_PAD* aPad ) const
} }
bool ZONE_CONTAINER::HitTest( const wxPoint& aPosition ) bool ZONE_CONTAINER::HitTest( const wxPoint& aPosition ) const
{ {
if( HitTestForCorner( aPosition ) ) if( HitTestForCorner( aPosition ) >= 0 )
return true; return true;
if( HitTestForEdge( aPosition ) ) if( HitTestForEdge( aPosition ) >= 0 )
return true; return true;
return false; return false;
} }
void ZONE_CONTAINER::SetSelectedCorner( const wxPoint& aPosition )
{
m_CornerSelection = HitTestForCorner( aPosition );
if( m_CornerSelection < 0 )
m_CornerSelection = HitTestForEdge( aPosition );
}
// Zones outlines have no thickness, so it Hit Test functions // Zones outlines have no thickness, so it Hit Test functions
// we must have a default distance between the test point // we must have a default distance between the test point
// and a corner or a zone edge: // and a corner or a zone edge:
#define MAX_DIST_IN_MM 0.25 #define MAX_DIST_IN_MM 0.25
bool ZONE_CONTAINER::HitTestForCorner( const wxPoint& refPos ) int ZONE_CONTAINER::HitTestForCorner( const wxPoint& refPos ) const
{ {
int distmax = Millimeter2iu( MAX_DIST_IN_MM ); int distmax = Millimeter2iu( MAX_DIST_IN_MM );
m_CornerSelection = m_Poly->HitTestForCorner( refPos, distmax ); return m_Poly->HitTestForCorner( refPos, distmax );
return m_CornerSelection >= 0;
} }
bool ZONE_CONTAINER::HitTestForEdge( const wxPoint& refPos ) int ZONE_CONTAINER::HitTestForEdge( const wxPoint& refPos ) const
{ {
int distmax = Millimeter2iu( MAX_DIST_IN_MM ); int distmax = Millimeter2iu( MAX_DIST_IN_MM );
m_CornerSelection = m_Poly->HitTestForEdge( refPos, distmax ); return m_Poly->HitTestForEdge( refPos, distmax );
return m_CornerSelection >= 0;
} }
@ -700,25 +705,23 @@ void ZONE_CONTAINER::Move( const wxPoint& offset )
} }
void ZONE_CONTAINER::MoveEdge( const wxPoint& offset ) void ZONE_CONTAINER::MoveEdge( const wxPoint& offset, int aEdge )
{ {
int ii = m_CornerSelection;
// Move the start point of the selected edge: // Move the start point of the selected edge:
SetCornerPosition( ii, GetCornerPosition( ii ) + offset ); SetCornerPosition( aEdge, GetCornerPosition( aEdge ) + offset );
// Move the end point of the selected edge: // Move the end point of the selected edge:
if( m_Poly->m_CornersList.IsEndContour( ii ) || ii == GetNumCorners() - 1 ) if( m_Poly->m_CornersList.IsEndContour( aEdge ) || aEdge == GetNumCorners() - 1 )
{ {
int icont = m_Poly->GetContour( ii ); int icont = m_Poly->GetContour( aEdge );
ii = m_Poly->GetContourStart( icont ); aEdge = m_Poly->GetContourStart( icont );
} }
else else
{ {
ii++; aEdge++;
} }
SetCornerPosition( ii, GetCornerPosition( ii ) + offset ); SetCornerPosition( aEdge, GetCornerPosition( aEdge ) + offset );
m_Poly->Hatch(); m_Poly->Hatch();
} }

View File

@ -217,6 +217,10 @@ public:
int GetSelectedCorner() const { return m_CornerSelection; } int GetSelectedCorner() const { return m_CornerSelection; }
void SetSelectedCorner( int aCorner ) { m_CornerSelection = aCorner; } void SetSelectedCorner( int aCorner ) { m_CornerSelection = aCorner; }
///
// Like HitTest but selects the current corner to be operated on
void SetSelectedCorner( const wxPoint& aPosition );
int GetLocalFlags() const { return m_localFlgs; } int GetLocalFlags() const { return m_localFlgs; }
void SetLocalFlags( int aFlags ) { m_localFlgs = aFlags; } void SetLocalFlags( int aFlags ) { m_localFlgs = aFlags; }
@ -234,7 +238,7 @@ public:
* @param aRefPos A wxPoint to test * @param aRefPos A wxPoint to test
* @return bool - true if a hit, else false * @return bool - true if a hit, else false
*/ */
virtual bool HitTest( const wxPoint& aPosition ); virtual bool HitTest( const wxPoint& aPosition ) const;
/** /**
* Function HitTest * Function HitTest
@ -342,7 +346,7 @@ public:
* @return true if found * @return true if found
* @param refPos : A wxPoint to test * @param refPos : A wxPoint to test
*/ */
bool HitTestForCorner( const wxPoint& refPos ); int HitTestForCorner( const wxPoint& refPos ) const;
/** /**
* Function HitTestForEdge * Function HitTestForEdge
@ -351,7 +355,7 @@ public:
* @return true if found * @return true if found
* @param refPos : A wxPoint to test * @param refPos : A wxPoint to test
*/ */
bool HitTestForEdge( const wxPoint& refPos ); int HitTestForEdge( const wxPoint& refPos ) const;
/** @copydoc BOARD_ITEM::HitTest(const EDA_RECT& aRect, /** @copydoc BOARD_ITEM::HitTest(const EDA_RECT& aRect,
* bool aContained = true, int aAccuracy ) const * bool aContained = true, int aAccuracy ) const
@ -387,10 +391,11 @@ public:
/** /**
* Function MoveEdge * Function MoveEdge
* Move the outline Edge. m_CornerSelection is the start point of the outline edge * Move the outline Edge
* @param offset = moving vector * @param offset = moving vector
* @param aEdge = start point of the outline edge
*/ */
void MoveEdge( const wxPoint& offset ); void MoveEdge( const wxPoint& offset, int aEdge );
/** /**
* Function Rotate * Function Rotate

View File

@ -204,7 +204,7 @@ bool TRACKS_CLEANER::clean_vias()
// Correct via m_End defects (if any), should never happen // Correct via m_End defects (if any), should never happen
if( via->GetStart() != via->GetEnd() ) if( via->GetStart() != via->GetEnd() )
{ {
wxFAIL_MSG( "Via with mismatching ends" ); wxFAIL_MSG( wxT( "Via with mismatching ends" ) );
via->SetEnd( via->GetStart() ); via->SetEnd( via->GetStart() );
} }

View File

@ -35,6 +35,7 @@
#include <pcbnew_id.h> #include <pcbnew_id.h>
#include <class_board.h> #include <class_board.h>
#include <class_module.h> #include <class_module.h>
#include <class_zone.h>
#include <pcbnew.h> #include <pcbnew.h>
#include <protos.h> #include <protos.h>
@ -160,8 +161,9 @@ BOARD_ITEM* PCB_BASE_FRAME::PcbGeneralLocateAndDisplay( int aHotKeyCode )
(*m_Collector)[i]->Show( 0, std::cout ); (*m_Collector)[i]->Show( 0, std::cout );
#endif #endif
/* Remove redundancies: sometime, zones are found twice, /* Remove redundancies: sometime, legacy zones are found twice,
* because zones can be filled by overlapping segments (this is a fill option) * because zones can be filled by overlapping segments (this is a fill option)
* Trigger the selection of the current edge for new-style zones
*/ */
time_t timestampzone = 0; time_t timestampzone = 0;
@ -169,9 +171,9 @@ BOARD_ITEM* PCB_BASE_FRAME::PcbGeneralLocateAndDisplay( int aHotKeyCode )
{ {
item = (*m_Collector)[ii]; item = (*m_Collector)[ii];
if( item->Type() != PCB_ZONE_T ) switch( item->Type() )
continue; {
case PCB_ZONE_T:
// Found a TYPE ZONE // Found a TYPE ZONE
if( item->GetTimeStamp() == timestampzone ) // Remove it, redundant, zone already found if( item->GetTimeStamp() == timestampzone ) // Remove it, redundant, zone already found
{ {
@ -182,6 +184,20 @@ BOARD_ITEM* PCB_BASE_FRAME::PcbGeneralLocateAndDisplay( int aHotKeyCode )
{ {
timestampzone = item->GetTimeStamp(); timestampzone = item->GetTimeStamp();
} }
break;
case PCB_ZONE_AREA_T:
{
/* We need to do the selection now because the menu text
* depends on it */
ZONE_CONTAINER *zone = static_cast<ZONE_CONTAINER*>( item );
zone->SetSelectedCorner( RefPos( true ) );
}
break;
default:
break;
}
} }
if( m_Collector->GetCount() <= 1 ) if( m_Collector->GetCount() <= 1 )

Some files were not shown because too many files have changed in this diff Show More