From 9f7ca3444b8e82e504b7e13b6602b70481d40eaa Mon Sep 17 00:00:00 2001 From: charras Date: Fri, 10 Apr 2009 13:39:03 +0000 Subject: [PATCH] eeschema: Viewlib: listboxes for lib or component selection are now resizable --- CHANGELOG.txt | 6 + eeschema/dialog_eeschema_config.cpp | 10 +- eeschema/viewlib_frame.cpp | 267 +++++++++++++++++++++------- include/id.h | 4 +- include/wxEeschemaStruct.h | 24 ++- 5 files changed, 235 insertions(+), 76 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 3eb79c1eed..5866268292 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -4,6 +4,12 @@ KiCad ChangeLog 2009 Please add newer entries at the top, list the date and your name with email address. +2009-apr-10 UPDATE Jean-Pierre Charras +================================================================================ +++eeschema: + Viewlib: listboxes for lib or component selection are now resizable + + 2009-apr-07 UPDATE Jean-Pierre Charras ================================================================================ ++pcbnew: diff --git a/eeschema/dialog_eeschema_config.cpp b/eeschema/dialog_eeschema_config.cpp index 6e50c49d06..76a1f3176f 100644 --- a/eeschema/dialog_eeschema_config.cpp +++ b/eeschema/dialog_eeschema_config.cpp @@ -109,7 +109,7 @@ void DIALOG_EESCHEMA_CONFIG::Init() NetlistNameItems.Add( wxT( "OrcadPcb2" ) ); NetlistNameItems.Add( wxT( "CadStar" ) ); NetlistNameItems.Add( wxT( "Spice" ) ); - + // Add extra neltlist format (using external converter) msg = ReturnUserNetlistTypeName( true ); while( !msg.IsEmpty() ) @@ -145,9 +145,13 @@ void DIALOG_EESCHEMA_CONFIG::OnOkClick( wxCommandEvent& event ) g_NetFormat = m_NetFormatBox->GetSelection() + NET_TYPE_PCBNEW; // Set new default path lib - g_UserLibDirBuffer = m_LibDirCtrl->GetValue(); + if ( g_UserLibDirBuffer != m_LibDirCtrl->GetValue() ) + { + g_UserLibDirBuffer = m_LibDirCtrl->GetValue(); + m_LibListChanged = true; + } - // Set new active lib list + // Set new active library list if the list of default path was modified if( m_LibListChanged ) { // Recreate lib list diff --git a/eeschema/viewlib_frame.cpp b/eeschema/viewlib_frame.cpp index 9965fb56d7..2c784506b5 100644 --- a/eeschema/viewlib_frame.cpp +++ b/eeschema/viewlib_frame.cpp @@ -17,23 +17,28 @@ /* class WinEDA_ViewlibFrame */ /*****************************/ BEGIN_EVENT_TABLE( WinEDA_ViewlibFrame, WinEDA_DrawFrame ) - EVT_CLOSE( WinEDA_ViewlibFrame::OnCloseWindow ) - EVT_SIZE( WinEDA_ViewlibFrame::OnSize ) - EVT_ACTIVATE( WinEDA_DrawFrame::OnActivate ) +/* Window events */ +EVT_CLOSE( WinEDA_ViewlibFrame::OnCloseWindow ) +EVT_SIZE( WinEDA_ViewlibFrame::OnSize ) +EVT_ACTIVATE( WinEDA_DrawFrame::OnActivate ) - EVT_TOOL_RANGE( ID_LIBVIEW_START_H_TOOL, ID_LIBVIEW_END_H_TOOL, - WinEDA_ViewlibFrame::Process_Special_Functions ) +/* Sash drag events */ +EVT_SASH_DRAGGED( ID_LIBVIEW_LIBWINDOW, WinEDA_ViewlibFrame::OnSashDrag ) +EVT_SASH_DRAGGED( ID_LIBVIEW_CMPWINDOW, WinEDA_ViewlibFrame::OnSashDrag ) - EVT_TOOL_RANGE( ID_ZOOM_IN, ID_ZOOM_PAGE, WinEDA_ViewlibFrame::OnZoom ) - EVT_TOOL( ID_LIBVIEW_CMP_EXPORT_TO_SCHEMATIC, - WinEDA_ViewlibFrame::ExportToSchematicLibraryPart ) +/* Toolbar events */ +EVT_TOOL_RANGE( ID_LIBVIEW_START_H_TOOL, ID_LIBVIEW_END_H_TOOL, + WinEDA_ViewlibFrame::Process_Special_Functions ) +EVT_TOOL_RANGE( ID_ZOOM_IN, ID_ZOOM_PAGE, WinEDA_ViewlibFrame::OnZoom ) +EVT_TOOL( ID_LIBVIEW_CMP_EXPORT_TO_SCHEMATIC, + WinEDA_ViewlibFrame::ExportToSchematicLibraryPart ) +EVT_KICAD_CHOICEBOX( ID_LIBVIEW_SELECT_PART_NUMBER, + WinEDA_ViewlibFrame::Process_Special_Functions ) - EVT_KICAD_CHOICEBOX( ID_LIBVIEW_SELECT_PART_NUMBER, - WinEDA_ViewlibFrame::Process_Special_Functions ) - - EVT_LISTBOX( ID_LIBVIEW_LIB_LIST, WinEDA_ViewlibFrame::ClickOnLibList ) - EVT_LISTBOX( ID_LIBVIEW_CMP_LIST, WinEDA_ViewlibFrame::ClickOnCmpList ) +/* listbox events */ +EVT_LISTBOX( ID_LIBVIEW_LIB_LIST, WinEDA_ViewlibFrame::ClickOnLibList ) +EVT_LISTBOX( ID_LIBVIEW_CMP_LIST, WinEDA_ViewlibFrame::ClickOnCmpList ) END_EVENT_TABLE() @@ -42,16 +47,17 @@ END_EVENT_TABLE() * The library viewer does not have any menus so add an accelerator table to * the main frame. */ -static wxAcceleratorEntry accels[] = { - wxAcceleratorEntry( wxACCEL_NORMAL, WXK_F1, ID_POPUP_ZOOM_IN ), - wxAcceleratorEntry( wxACCEL_NORMAL, WXK_F2, ID_POPUP_ZOOM_OUT ), +static wxAcceleratorEntry accels[] = +{ + wxAcceleratorEntry( wxACCEL_NORMAL, WXK_F1, ID_ZOOM_IN ), + wxAcceleratorEntry( wxACCEL_NORMAL, WXK_F2, ID_ZOOM_OUT ), wxAcceleratorEntry( wxACCEL_NORMAL, WXK_F3, ID_ZOOM_REDRAW ), - wxAcceleratorEntry( wxACCEL_NORMAL, WXK_F4, ID_POPUP_ZOOM_CENTER ) + wxAcceleratorEntry( wxACCEL_NORMAL, WXK_F4, ID_ZOOM_PAGE ) }; -#define ACCEL_TABLE_CNT ( sizeof( accels ) / sizeof( wxAcceleratorEntry ) ) - +#define ACCEL_TABLE_CNT ( sizeof( accels ) / sizeof( wxAcceleratorEntry ) ) +#define EXTRA_BORDER_SIZE 2 /******************************************************************************/ WinEDA_ViewlibFrame::WinEDA_ViewlibFrame( wxWindow* father, LibraryStruct* Library, @@ -63,46 +69,74 @@ WinEDA_ViewlibFrame::WinEDA_ViewlibFrame( wxWindow* father, wxAcceleratorTable table( ACCEL_TABLE_CNT, accels ); m_FrameName = wxT( "ViewlibFrame" ); + m_ConfigPath = wxT( "LibraryViewer" ); // Give an icon SetIcon( wxIcon( library_browse_xpm ) ); - m_CmpList = NULL; - m_LibList = NULL; - m_Semaphore = semaphore; + m_CmpList = NULL; + m_LibList = NULL; + m_LibListWindow = NULL; + m_CmpListWindow = NULL; + m_Semaphore = semaphore; if( m_Semaphore ) SetWindowStyle( GetWindowStyle() | wxSTAY_ON_TOP ); SetBaseScreen( new SCH_SCREEN() ); GetScreen()->m_Center = true; // set to true to have the coordinates origine -0,0) centered on screen - - if( Library == NULL ) - { - m_LibListSize.x = 150; // Width of library list - m_LibListSize.y = -1; - m_LibList = new wxListBox( this, ID_LIBVIEW_LIB_LIST, wxPoint( 0, 0 ), - m_LibListSize, 0, NULL, wxLB_HSCROLL ); - m_LibList->SetFont( *g_DialogFont ); - m_LibList->SetBackgroundColour( wxColour( 255, 255, 255 ) ); // Library background listbox color (white) - m_LibList->SetForegroundColour( wxColour( 0, 0, 0 ) ); // Library foreground listbox color (black) - } - else - g_CurrentViewLibraryName = Library->m_Name; - - m_CmpListSize.x = 150; // Width of component list - m_CmpListSize.y = -1; - m_CmpList = new wxListBox( this, ID_LIBVIEW_CMP_LIST, - wxPoint( m_LibListSize.x, 0 ), - m_CmpListSize, 0, NULL, wxLB_HSCROLL ); - m_CmpList->SetFont( *g_DialogFont ); - m_CmpList->SetBackgroundColour( wxColour( 255, 255, 255 ) ); // Component background listbox color (white) - m_CmpList->SetForegroundColour( wxColour( 0, 0, 0 ) ); // Component foreground listbox color (black) - LoadSettings(); SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y ); + ReCreateHToolbar(); ReCreateVToolbar(); + + wxSize size = GetClientSize(); + size.y -= m_MsgFrameHeight + 2; + + m_LibListSize.y = size.y; + + wxPoint win_pos( 0, 0 ); + if( Library == NULL ) + { + // Creates the libraries window display + m_LibListWindow = + new wxSashLayoutWindow( this, ID_LIBVIEW_LIBWINDOW, win_pos, m_LibListSize, + wxCLIP_CHILDREN | wxSW_3D, wxT( + "LibWindow" ) ); + m_LibListWindow->SetOrientation( wxLAYOUT_VERTICAL ); + m_LibListWindow->SetAlignment( wxLAYOUT_LEFT ); + m_LibListWindow->SetSashVisible( wxSASH_RIGHT, TRUE ); + m_LibListWindow->SetExtraBorderSize( EXTRA_BORDER_SIZE ); + m_LibList = new wxListBox( m_LibListWindow, ID_LIBVIEW_LIB_LIST, wxPoint( 0, 0 ), + m_LibListWindow->GetClientSize() - wxSize(EXTRA_BORDER_SIZE*2,0), + 0, NULL, wxLB_HSCROLL ); + m_LibList->SetFont( *g_DialogFont ); + } + else + { + g_CurrentViewLibraryName = Library->m_Name; + m_LibListSize.x = 0; + } + + // Creates the component window display + m_CmpListSize.y = size.y; + win_pos.x = m_LibListSize.x; + win_pos.y = 0; + m_CmpListWindow = new wxSashLayoutWindow( this, ID_LIBVIEW_CMPWINDOW, + win_pos, m_CmpListSize, + wxCLIP_CHILDREN | wxSW_3D, wxT( "CmpWindow" ) ); + m_CmpListWindow->SetOrientation( wxLAYOUT_VERTICAL ); + +// m_CmpListWindow->SetAlignment( wxLAYOUT_LEFT ); + m_CmpListWindow->SetSashVisible( wxSASH_RIGHT, TRUE ); + m_CmpListWindow->SetExtraBorderSize( EXTRA_BORDER_SIZE ); + m_CmpList = new wxListBox( m_CmpListWindow, ID_LIBVIEW_CMP_LIST, + wxPoint( 0, 0 ), + m_CmpListWindow->GetClientSize() - wxSize(EXTRA_BORDER_SIZE*2,0), + 0, NULL, wxLB_HSCROLL ); + m_CmpList->SetFont( *g_DialogFont ); + if( m_LibList ) ReCreateListLib(); DisplayLibInfos(); @@ -137,17 +171,56 @@ void WinEDA_ViewlibFrame::OnCloseWindow( wxCloseEvent& Event ) } +/****************************************************/ +void WinEDA_ViewlibFrame::OnSashDrag( wxSashEvent& event ) +/****************************************************/ + +/* Resize sub windows when dragging a sash window border + */ +{ + if( event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE ) + return; + + m_LibListSize.y = GetClientSize().y - m_MsgFrameHeight; + m_CmpListSize.y = m_LibListSize.y; + + switch( event.GetId() ) + { + case ID_LIBVIEW_LIBWINDOW: + if( m_LibListWindow ) + { + m_LibListSize.x = event.GetDragRect().width; + m_LibListWindow->SetSize( m_LibListSize ); + m_CmpListWindow->SetPosition( wxPoint( m_LibListSize.x, 0 ) ); + } + break; + + case ID_LIBVIEW_CMPWINDOW: + m_CmpListSize.x = event.GetDragRect().width; + m_CmpListWindow->SetSize( m_CmpListSize ); + break; + } + + // Now, we must recalculate the position and size of subwindows + wxSizeEvent SizeEv; + OnSize( SizeEv ); + + // Ensure the panel is always redrawn (sometimes some garbage remains): + DrawPanel->Refresh(); +} + + /*****************************************************/ void WinEDA_ViewlibFrame::OnSize( wxSizeEvent& SizeEv ) /*****************************************************/ { - wxSize size; + wxSize clientsize; wxSize maintoolbar_size; wxSize Vtoolbar_size; - GetClientSize( &size.x, &size.y ); - m_FrameSize = size; - size.y -= m_MsgFrameHeight; + clientsize = GetClientSize(); + m_FrameSize = clientsize; + clientsize.y -= m_MsgFrameHeight; if( m_HToolBar ) { @@ -157,32 +230,37 @@ void WinEDA_ViewlibFrame::OnSize( wxSizeEvent& SizeEv ) if( m_VToolBar ) { Vtoolbar_size = m_VToolBar->GetSize(); - m_VToolBar->SetSize( size.x - maintoolbar_size.y, 0, -1, size.y ); + m_VToolBar->SetSize( clientsize.x - maintoolbar_size.y, 0, -1, clientsize.y ); } if( MsgPanel ) { - MsgPanel->SetSize( 0, size.y, size.x, m_MsgFrameHeight ); + MsgPanel->SetSize( 0, clientsize.y, clientsize.x, m_MsgFrameHeight ); } if( DrawPanel ) { DrawPanel->SetSize( m_LibListSize.x + m_CmpListSize.x, 0, - size.x - Vtoolbar_size.x - m_LibListSize.x - m_CmpListSize.x, - size.y ); + clientsize.x - Vtoolbar_size.x - m_LibListSize.x - m_CmpListSize.x, + clientsize.y ); } - if( m_LibList ) + if( m_LibList && m_LibListWindow ) { - m_LibListSize.y = size.y; - m_LibList->SetSize( 0, 0, m_LibListSize.x, m_LibListSize.y ); + m_LibListSize.y = clientsize.y - 2; + m_LibListWindow->SetSize( m_LibListSize ); + m_LibList->SetSize( m_LibListWindow->GetClientSize() - wxSize(EXTRA_BORDER_SIZE*2,0) ); } - if( m_CmpList ) + if( m_CmpList && m_CmpListWindow ) { - m_CmpListSize.y = size.y; - m_CmpList->SetSize( m_LibListSize.x, 0, m_CmpListSize.x, m_CmpListSize.y ); + m_CmpListSize.y = clientsize.y - 2; + m_CmpListWindow->SetSize( m_CmpListSize ); + m_CmpListWindow->SetPosition( wxPoint( m_LibListSize.x, 0 ) ); + m_CmpList->SetSize( m_CmpListWindow->GetClientSize() - wxSize(EXTRA_BORDER_SIZE*2,0) ); } + + SizeEv.Skip(); } @@ -195,7 +273,7 @@ int WinEDA_ViewlibFrame::BestZoom() EDA_LibComponentStruct* CurrentLibEntry = NULL; CurrentLibEntry = FindLibPart( g_CurrentViewComponentName.GetData(), - g_CurrentViewLibraryName.GetData(), FIND_ROOT ); + g_CurrentViewLibraryName.GetData(), FIND_ROOT ); if( CurrentLibEntry == NULL ) { @@ -208,11 +286,11 @@ int WinEDA_ViewlibFrame::BestZoom() EDA_Rect BoundaryBox = CurrentLibEntry->GetBoundaryBox( g_ViewUnit, g_ViewConvert ); itemsize = BoundaryBox.GetSize(); - size = DrawPanel->GetClientSize(); - size -= wxSize( 100, 100 ); // reserve a 100 mils margin - ii = itemsize.x / size.x; - jj = itemsize.y / size.y; - bestzoom = MAX( ii, jj ) + 1; + size = DrawPanel->GetClientSize(); + size -= wxSize( 100, 100 ); // reserve a 100 mils margin + ii = itemsize.x / size.x; + jj = itemsize.y / size.y; + bestzoom = MAX( ii, jj ) + 1; GetScreen()->m_Curseur = BoundaryBox.Centre(); @@ -265,7 +343,10 @@ void WinEDA_ViewlibFrame::ReCreateListLib() void WinEDA_ViewlibFrame::ReCreateListCmp() /***********************************************/ { - int ii; + if( m_CmpList == NULL ) + return; + + int ii; EDA_LibComponentStruct* LibEntry = NULL; LibraryStruct* Library = FindLibrary( g_CurrentViewLibraryName.GetData() ); @@ -339,3 +420,57 @@ void WinEDA_ViewlibFrame::ExportToSchematicLibraryPart( wxCommandEvent& event ) g_CurrentViewComponentName.Empty(); Close( TRUE ); } + + +#define LIBLIST_WIDTH_KEY wxT("Liblist_width") +#define CMPLIST_WIDTH_KEY wxT("Cmplist_width") +/** + * Load library viewer frame specific configuration settings. + * + * Don't forget to call this base method from any derived classes or the + * settings will not get loaded. + */ +void WinEDA_ViewlibFrame::LoadSettings( ) +{ + wxConfig* cfg ; + + WinEDA_DrawFrame::LoadSettings(); + + wxConfigPathChanger cpc( wxGetApp().m_EDA_Config, m_ConfigPath ); + cfg = wxGetApp().m_EDA_Config; + + m_LibListSize.x = 150; // default width of libs list + m_CmpListSize.x = 150; // default width of component list + + cfg->Read( LIBLIST_WIDTH_KEY, &m_LibListSize.x ); + cfg->Read( CMPLIST_WIDTH_KEY, &m_CmpListSize.x ); + + // set parameters to a resonnable value + if ( m_LibListSize.x > m_FrameSize.x/2 ) + m_LibListSize.x = m_FrameSize.x/2; + + if ( m_CmpListSize.x > m_FrameSize.x/2 ) + m_CmpListSize.x = m_FrameSize.x/2; +} + + +/** + * Save library viewer frame specific configuration settings. + * + * Don't forget to call this base method from any derived classes or the + * settings will not get saved. + */ +void WinEDA_ViewlibFrame::SaveSettings() +{ + wxConfig* cfg; + + WinEDA_DrawFrame::SaveSettings(); + + wxConfigPathChanger cpc( wxGetApp().m_EDA_Config, m_ConfigPath ); + cfg = wxGetApp().m_EDA_Config; + + if ( m_LibListSize.x ) + cfg->Write( LIBLIST_WIDTH_KEY, m_LibListSize.x ); + cfg->Write( CMPLIST_WIDTH_KEY, m_CmpListSize.x ); +} + diff --git a/include/id.h b/include/id.h index dad65a150b..96484c7715 100644 --- a/include/id.h +++ b/include/id.h @@ -392,8 +392,8 @@ enum main_id { ID_LIBVIEW_SELECT_PART_NUMBER, ID_LIBVIEW_LIB_LIST, ID_LIBVIEW_CMP_LIST, - ID_LIBVIEW_UNUSED0, - ID_LIBVIEW_UNUSED1, + ID_LIBVIEW_LIBWINDOW, + ID_LIBVIEW_CMPWINDOW, ID_LIBVIEW_UNUSED3, ID_LIBVIEW_UNUSED4, ID_LIBVIEW_CMP_EXPORT_TO_SCHEMATIC, // Used in Htoolbar, specific function diff --git a/include/wxEeschemaStruct.h b/include/wxEeschemaStruct.h index cd1ffca9a9..b4dbbabad7 100644 --- a/include/wxEeschemaStruct.h +++ b/include/wxEeschemaStruct.h @@ -495,17 +495,27 @@ protected: }; +/************************************************************************************************/ +/************************************************************************************************/ class LibraryStruct; class WinEDA_ViewlibFrame : public WinEDA_DrawFrame { -public: +private: WinEDAChoiceBox* SelpartBox; - wxListBox* m_LibList; - wxSize m_LibListSize; - wxListBox* m_CmpList; - wxSize m_CmpListSize; + // List of libraries (for selection + wxSashLayoutWindow* m_LibListWindow; // The redimensionnable window to display the lib list + wxListBox* m_LibList; // The list of libs + wxSize m_LibListSize; // size of the window + + // List of components in the selected library + wxSashLayoutWindow* m_CmpListWindow; // The redimensionnable window to display the component list + wxListBox* m_CmpList; // The list of components + wxSize m_CmpListSize; // size of the window + + // Flags wxSemaphore* m_Semaphore; // != NULL if the frame must emulate a modal dialog + wxString m_ConfigPath; // subpath for configuartion public: WinEDA_ViewlibFrame( wxWindow* father, @@ -515,6 +525,7 @@ public: ~WinEDA_ViewlibFrame(); void OnSize( wxSizeEvent& event ); + void OnSashDrag( wxSashEvent& event ); void ReCreateListLib(); void ReCreateListCmp(); void Process_Special_Functions( wxCommandEvent& event ); @@ -532,6 +543,9 @@ public: void GeneralControle( wxDC* DC, wxPoint MousePositionInPixels ); + void LoadSettings(); + void SaveSettings(); + private: void SelectCurrentLibrary(); void SelectAndViewLibraryPart( int option );