Commit 992cc5f1 authored by HennerZeller's avatar HennerZeller Committed by jean-pierre charras

Eeschema: * Preselect the currently chosen component in the browser when...

Eeschema:  * Preselect the currently chosen component in the browser when pressing the thumbnail view.
* Various smallish documentation updates in the component chooser area.
parent c7e794dc
...@@ -206,6 +206,9 @@ void COMPONENT_TREE_SEARCH_CONTAINER::AddAliasList( const wxString& aNodeName, ...@@ -206,6 +206,9 @@ void COMPONENT_TREE_SEARCH_CONTAINER::AddAliasList( const wxString& aNodeName,
LIB_ALIAS* COMPONENT_TREE_SEARCH_CONTAINER::GetSelectedAlias( int* aUnit ) LIB_ALIAS* COMPONENT_TREE_SEARCH_CONTAINER::GetSelectedAlias( int* aUnit )
{ {
if( tree == NULL )
return NULL;
const wxTreeItemId& select_id = tree->GetSelection(); const wxTreeItemId& select_id = tree->GetSelection();
BOOST_FOREACH( TREE_NODE* node, nodes ) BOOST_FOREACH( TREE_NODE* node, nodes )
......
...@@ -97,7 +97,7 @@ public: ...@@ -97,7 +97,7 @@ public:
/** Function GetSelectedAlias /** Function GetSelectedAlias
* *
* @param if not-NULL, the selected sub-unit is set here. * @param if not-NULL, the selected sub-unit is set here.
* @return the selected alias or NULL if there is none. * @return the selected alias or NULL if there is none, or there is no tree.
*/ */
LIB_ALIAS* GetSelectedAlias( int* aUnit ); LIB_ALIAS* GetSelectedAlias( int* aUnit );
......
...@@ -57,16 +57,15 @@ DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxStr ...@@ -57,16 +57,15 @@ DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxStr
} }
// After this dialog is done: return the alias that has been selected, or an DIALOG_CHOOSE_COMPONENT::~DIALOG_CHOOSE_COMPONENT()
// empty string if there is none.
wxString DIALOG_CHOOSE_COMPONENT::GetSelectedAliasName( int* aUnit ) const
{ {
LIB_ALIAS *alias = m_search_container->GetSelectedAlias( aUnit ); m_search_container->SetTree( NULL );
}
if( alias )
return alias->GetName();
return wxEmptyString; LIB_ALIAS* DIALOG_CHOOSE_COMPONENT::GetSelectedAlias( int* aUnit ) const
{
return m_search_container->GetSelectedAlias( aUnit );
} }
...@@ -178,7 +177,7 @@ void DIALOG_CHOOSE_COMPONENT::OnInterceptTreeEnter( wxKeyEvent& aEvent ) ...@@ -178,7 +177,7 @@ void DIALOG_CHOOSE_COMPONENT::OnInterceptTreeEnter( wxKeyEvent& aEvent )
// Pressing 'Enter' within a tree will also call OnDoubleClickTreeActivation(), // Pressing 'Enter' within a tree will also call OnDoubleClickTreeActivation(),
// but since this is not due to the double-click and we have no way of knowing that it is // but since this is not due to the double-click and we have no way of knowing that it is
// not, we need to intercept the 'Enter' key before that to know that it is time to exit. // not, we need to intercept the 'Enter' key before that to know that it is time to exit.
if ( aEvent.GetKeyCode() == WXK_RETURN ) if( aEvent.GetKeyCode() == WXK_RETURN )
EndModal( wxID_OK ); // Dialog is done. EndModal( wxID_OK ); // Dialog is done.
else else
aEvent.Skip(); // Let tree handle that key for navigation. aEvent.Skip(); // Let tree handle that key for navigation.
......
...@@ -27,27 +27,39 @@ ...@@ -27,27 +27,39 @@
#include <dialog_choose_component_base.h> #include <dialog_choose_component_base.h>
class COMPONENT_TREE_SEARCH_CONTAINER; class COMPONENT_TREE_SEARCH_CONTAINER;
class LIB_ALIAS;
class LIB_COMPONENT; class LIB_COMPONENT;
class wxTreeItemId; class wxTreeItemId;
class DIALOG_CHOOSE_COMPONENT : public DIALOG_CHOOSE_COMPONENT_BASE class DIALOG_CHOOSE_COMPONENT : public DIALOG_CHOOSE_COMPONENT_BASE
{ {
public: public:
/**
* Create dialog to choose component.
*
* @param aParent Parent window.
* @param aTitle Dialog title.
* @param aSearchContainer The tree selection search container. Needs to be pre-populated
* This dialog does not take over ownership of this object.
* @param aDeMorganConvert preferred deMorgan conversion (TODO: should happen in dialog)
*/
DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxString& aTitle, DIALOG_CHOOSE_COMPONENT( wxWindow* aParent, const wxString& aTitle,
COMPONENT_TREE_SEARCH_CONTAINER* aSearch_container, COMPONENT_TREE_SEARCH_CONTAINER* aSearchContainer,
int aDeMorganConvert ); int aDeMorganConvert );
virtual ~DIALOG_CHOOSE_COMPONENT();
/** Function GetSelectedAliasName /** Function GetSelectedAlias
* To be called after this dialog returns from ShowModal(). * To be called after this dialog returns from ShowModal().
* *
* @param aUnit if not NULL, the selected unit is filled in here. * @param aUnit if not NULL, the selected unit is filled in here.
* @return the alias that has been selected, or an empty string if there is none. * @return the alias that has been selected, or NULL if there is none.
*/ */
wxString GetSelectedAliasName( int* aUnit ) const; LIB_ALIAS* GetSelectedAlias( int* aUnit ) const;
/** Function IsExternalBrowserSelected /** Function IsExternalBrowserSelected
* *
* @return true, iff the browser pressed the browsing button. * @return true, iff the user pressed the thumbnail view of the component to
* launch the component browser.
*/ */
bool IsExternalBrowserSelected() const { return m_external_browser_requested; } bool IsExternalBrowserSelected() const { return m_external_browser_requested; }
......
...@@ -52,8 +52,8 @@ ...@@ -52,8 +52,8 @@
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
// TODO(hzeller): would be good if we could give a pre-selected component. wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( LIB_ALIAS* aPreselectedAlias,
wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( void ) int* aUnit, int* aConvert )
{ {
wxSemaphore semaphore( 0, 1 ); wxSemaphore semaphore( 0, 1 );
wxString cmpname; wxString cmpname;
...@@ -65,6 +65,20 @@ wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( void ) ...@@ -65,6 +65,20 @@ wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( void )
viewlibFrame = new LIB_VIEW_FRAME( this, NULL, &semaphore, viewlibFrame = new LIB_VIEW_FRAME( this, NULL, &semaphore,
KICAD_DEFAULT_DRAWFRAME_STYLE | wxFRAME_FLOAT_ON_PARENT ); KICAD_DEFAULT_DRAWFRAME_STYLE | wxFRAME_FLOAT_ON_PARENT );
if ( aPreselectedAlias )
{
viewlibFrame->SetSelectedLibrary( aPreselectedAlias->GetLibraryName() );
viewlibFrame->SetSelectedComponent( aPreselectedAlias->GetName() );
}
if( aUnit && *aUnit > 0 )
viewlibFrame->SetUnit( *aUnit );
if( aConvert && *aConvert > 0 )
viewlibFrame->SetConvert( *aConvert );
viewlibFrame->Refresh();
// Show the library viewer frame until it is closed // Show the library viewer frame until it is closed
// Wait for viewer closing event: // Wait for viewer closing event:
while( semaphore.TryWait() == wxSEMA_BUSY ) while( semaphore.TryWait() == wxSEMA_BUSY )
...@@ -74,6 +88,13 @@ wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( void ) ...@@ -74,6 +88,13 @@ wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( void )
} }
cmpname = viewlibFrame->GetSelectedComponent(); cmpname = viewlibFrame->GetSelectedComponent();
if( aUnit )
*aUnit = viewlibFrame->GetUnit();
if( aConvert )
*aConvert = viewlibFrame->GetConvert();
viewlibFrame->Destroy(); viewlibFrame->Destroy();
return cmpname; return cmpname;
...@@ -125,18 +146,13 @@ wxString SCH_BASE_FRAME::SelectComponentFromLibrary( const wxString& aLibname, ...@@ -125,18 +146,13 @@ wxString SCH_BASE_FRAME::SelectComponentFromLibrary( const wxString& aLibname,
if( dlg.ShowModal() == wxID_CANCEL ) if( dlg.ShowModal() == wxID_CANCEL )
return wxEmptyString; return wxEmptyString;
wxString cmpName = dlg.GetSelectedAliasName( aUnit ); wxString cmpName;
LIB_ALIAS* const alias = dlg.GetSelectedAlias( aUnit );
if( dlg.IsExternalBrowserSelected() ) if ( alias )
{ cmpName = alias->GetName();
cmpName = SelectComponentFromLibBrowser(); // Would be good if we could pre-select.
if( aUnit )
*aUnit = LIB_VIEW_FRAME::GetUnit();
if( aConvert ) if( dlg.IsExternalBrowserSelected() ) // User requested big component browser.
*aConvert = LIB_VIEW_FRAME::GetConvert(); cmpName = SelectComponentFromLibBrowser( alias, aUnit, aConvert);
}
if ( !cmpName.empty() ) if ( !cmpName.empty() )
{ {
......
...@@ -402,12 +402,16 @@ void LIB_VIEW_FRAME::ClickOnLibList( wxCommandEvent& event ) ...@@ -402,12 +402,16 @@ void LIB_VIEW_FRAME::ClickOnLibList( wxCommandEvent& event )
if( ii < 0 ) if( ii < 0 )
return; return;
wxString name = m_libList->GetString( ii ); SetSelectedLibrary( m_libList->GetString( ii ) );
}
if( m_libraryName == name ) void LIB_VIEW_FRAME::SetSelectedLibrary( const wxString& aLibraryName )
{
if( m_libraryName == aLibraryName )
return; return;
m_libraryName = name; m_libraryName = aLibraryName;
ReCreateListCmp(); ReCreateListCmp();
m_canvas->Refresh(); m_canvas->Refresh();
DisplayLibInfos(); DisplayLibInfos();
...@@ -422,11 +426,15 @@ void LIB_VIEW_FRAME::ClickOnCmpList( wxCommandEvent& event ) ...@@ -422,11 +426,15 @@ void LIB_VIEW_FRAME::ClickOnCmpList( wxCommandEvent& event )
if( ii < 0 ) if( ii < 0 )
return; return;
wxString name = m_cmpList->GetString( ii ); SetSelectedComponent( m_cmpList->GetString( ii ) );
}
if( m_entryName.CmpNoCase( name ) != 0 )
void LIB_VIEW_FRAME::SetSelectedComponent( const wxString& aComponentName )
{
if( m_entryName.CmpNoCase( aComponentName ) != 0 )
{ {
m_entryName = name; m_entryName = aComponentName;
DisplayLibInfos(); DisplayLibInfos();
m_unit = 1; m_unit = 1;
m_convert = 1; m_convert = 1;
...@@ -436,6 +444,7 @@ void LIB_VIEW_FRAME::ClickOnCmpList( wxCommandEvent& event ) ...@@ -436,6 +444,7 @@ void LIB_VIEW_FRAME::ClickOnCmpList( wxCommandEvent& event )
} }
} }
void LIB_VIEW_FRAME::DClickOnCmpList( wxCommandEvent& event ) void LIB_VIEW_FRAME::DClickOnCmpList( wxCommandEvent& event )
{ {
if( m_semaphore ) if( m_semaphore )
...@@ -480,10 +489,10 @@ void LIB_VIEW_FRAME::LoadSettings( ) ...@@ -480,10 +489,10 @@ void LIB_VIEW_FRAME::LoadSettings( )
cfg->Read( CMPLIST_WIDTH_KEY, &m_cmpListWidth, 100 ); cfg->Read( CMPLIST_WIDTH_KEY, &m_cmpListWidth, 100 );
// Set parameters to a reasonable value. // Set parameters to a reasonable value.
if ( m_libListWidth > m_FrameSize.x/2 ) if( m_libListWidth > m_FrameSize.x/2 )
m_libListWidth = m_FrameSize.x/2; m_libListWidth = m_FrameSize.x/2;
if ( m_cmpListWidth > m_FrameSize.x/2 ) if( m_cmpListWidth > m_FrameSize.x/2 )
m_cmpListWidth = m_FrameSize.x/2; m_cmpListWidth = m_FrameSize.x/2;
} }
......
...@@ -47,29 +47,6 @@ class CMP_LIBRARY; ...@@ -47,29 +47,6 @@ class CMP_LIBRARY;
*/ */
class LIB_VIEW_FRAME : public SCH_BASE_FRAME class LIB_VIEW_FRAME : public SCH_BASE_FRAME
{ {
private:
wxComboBox* m_selpartBox;
// List of libraries (for selection )
wxListBox* m_libList; // The list of libs
int m_libListWidth; // Last width of the window
// List of components in the selected library
wxListBox* m_cmpList; // The list of components
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
protected:
static wxString m_libraryName;
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_convert;
public: public:
LIB_VIEW_FRAME( SCH_BASE_FRAME* aParent, CMP_LIBRARY* aLibrary = NULL, LIB_VIEW_FRAME( SCH_BASE_FRAME* aParent, CMP_LIBRARY* aLibrary = NULL,
wxSemaphore* aSemaphore = NULL, wxSemaphore* aSemaphore = NULL,
...@@ -134,11 +111,26 @@ public: ...@@ -134,11 +111,26 @@ public:
*/ */
void SaveSettings(); void SaveSettings();
wxString& GetEntryName( void ) const { return m_entryName; } /**
wxString& GetSelectedComponent( void ) const { return m_exportToEeschemaCmpName; } * Set the selected library in the library window.
*
* @param aLibName name of the library to be selected.
*/
void SetSelectedLibrary( const wxString& aLibName );
/**
* Set the selected component.
*
* @param the alias name of the component to be selected.
*/
void SetSelectedComponent( const wxString& aComponentName );
const wxString& GetSelectedComponent( void ) const { return m_exportToEeschemaCmpName; }
void SetUnit( int aUnit ) { m_unit = aUnit; }
int GetUnit( void ) { return m_unit; }
static int GetUnit( void ) { return m_unit; } void SetConvert( int aConvert ) { m_convert = aConvert; }
static int GetConvert( void ) { return m_convert; } int GetConvert( void ) { return m_convert; }
private: private:
/** /**
...@@ -160,6 +152,33 @@ private: ...@@ -160,6 +152,33 @@ private:
bool OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu ); bool OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu );
void DClickOnCmpList( wxCommandEvent& event ); void DClickOnCmpList( wxCommandEvent& event );
wxComboBox* m_selpartBox;
// List of libraries (for selection )
wxListBox* m_libList; // The list of libs
int m_libListWidth; // Last width of the window
// List of components in the selected library
wxListBox* m_cmpList; // The list of components
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
// TODO(hzeller): looks like these members were chosen to be static to survive different
// instances of this browser and communicate it to the next instance. This looks like an
// ugly hack, and should be solved differently.
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_exportToEeschemaCmpName; // When the viewer is used to select a component
// in schematic, the selected component is here
static int m_unit;
static int m_convert;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };
......
...@@ -31,7 +31,7 @@ class PAGE_INFO; ...@@ -31,7 +31,7 @@ class PAGE_INFO;
class TITLE_BLOCK; class TITLE_BLOCK;
class LIB_VIEW_FRAME; class LIB_VIEW_FRAME;
class LIB_EDIT_FRAME; class LIB_EDIT_FRAME;
class LIB_ALIAS;
/** /**
* Class SCH_BASE_FRAME * Class SCH_BASE_FRAME
...@@ -80,9 +80,15 @@ protected: ...@@ -80,9 +80,15 @@ protected:
* Calls the library viewer to select component to import into schematic. * Calls the library viewer to select component to import into schematic.
* if the library viewer is currently running, it is closed and reopened * if the library viewer is currently running, it is closed and reopened
* in modal mode. * in modal mode.
* @param aPreslectedAlias Preselected component alias. NULL if none.
* @param aUnit Pointer to Unit-number. Input is the pre-selected unit, output
* is the finally selected unit by the user. Can be NULL.
* @param aConvert Pointer to deMorgan conversion. Input is what is pre-selected,
* output is the finally selected deMorgan type by the user.
* @return the component name * @return the component name
*/ */
wxString SelectComponentFromLibBrowser( void ); wxString SelectComponentFromLibBrowser( LIB_ALIAS* aPreselectedAlias,
int* aUnit, int* aConvert );
/** /**
* Function SelectComponentFromLib * Function SelectComponentFromLib
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment