Le 12/09/2018 à 17:01, Jeff Young a écrit : > I just pushed a fix for a segfault while routing. > (https://bugs.launchpad.net/kicad/+bug/1792037) > > Cheers, > Jeff.
Hi Jeff, Attached 2 other patches for Eeschema GAL. The first allows switching between Cairo and Opengl. The second fixes Zoom issues (with hotkeys and popup menu). I am seeing an other annoying issue: the scroll bars are not shown in Gal Canvas (both in Eeschema and Pcbnew), but I have no idea why they are not displayed (although they are displayed in the pad properties dialog). Perhaps a GAL guru could have a look into this issue. I also saw a few minor other issues, depending on the selected canvas. Cheers, -- Jean-Pierre CHARRAS
From 57be4f24ad098a97fdbff920d43ca6f3b7fb6c64 Mon Sep 17 00:00:00 2001 From: jean-pierre charras <[email protected]> Date: Mon, 10 Sep 2018 15:37:28 +0200 Subject: [PATCH 1/2] add option to switch between opengl and cairo in eeschema (step 1) --- common/draw_panel_gal.cpp | 4 +-- common/gal/cairo/cairo_gal.cpp | 8 +++-- common/gal/opengl/opengl_gal.cpp | 11 ++++-- common/legacy_gal/eda_draw_frame.cpp | 11 +++--- eeschema/hotkeys.cpp | 19 +++++++++- eeschema/hotkeys.h | 4 ++- eeschema/menubar.cpp | 14 ++++++++ eeschema/onrightclick.cpp | 2 +- eeschema/sch_base_frame.cpp | 54 +++++++++++++++++++++++++--- eeschema/sch_base_frame.h | 12 +++++++ eeschema/sch_draw_panel.cpp | 20 +++++++---- eeschema/sch_edit_frame.cpp | 5 +++ eeschema/sch_preview_panel.cpp | 8 +++-- include/class_draw_panel_gal.h | 4 +-- include/draw_frame.h | 5 +-- pcbnew/pcb_draw_panel_gal.cpp | 1 + 16 files changed, 147 insertions(+), 35 deletions(-) diff --git a/common/draw_panel_gal.cpp b/common/draw_panel_gal.cpp index 9d49ff26c..adb45b0db 100644 --- a/common/draw_panel_gal.cpp +++ b/common/draw_panel_gal.cpp @@ -360,7 +360,7 @@ bool EDA_DRAW_PANEL_GAL::SwitchBackend( GAL_TYPE aGalType ) break; default: - assert( false ); + wxASSERT( false ); // warn about unhandled GAL canvas type, but continue with the fallback option case GAL_TYPE_NONE: @@ -383,7 +383,7 @@ bool EDA_DRAW_PANEL_GAL::SwitchBackend( GAL_TYPE aGalType ) // from the defaults m_options.NotifyChanged(); - assert( new_gal ); + wxASSERT( new_gal ); delete m_gal; m_gal = new_gal; diff --git a/common/gal/cairo/cairo_gal.cpp b/common/gal/cairo/cairo_gal.cpp index b5f3e4f67..d9834b469 100644 --- a/common/gal/cairo/cairo_gal.cpp +++ b/common/gal/cairo/cairo_gal.cpp @@ -351,7 +351,11 @@ void CAIRO_GAL::DrawCurve( const VECTOR2D& aStartPoint, const VECTOR2D& aControl void CAIRO_GAL::DrawBitmap( const BITMAP_BASE& aBitmap ) { int ppi = aBitmap.GetPPI(); - double worldIU_per_mm = 1/(worldUnitLength/2.54)/1000; + // We have to calculate the pixel size in users units to draw the image. + // worldUnitLength is the user unit in GAL unit value + // (GAL unit = 0.1 inch in nanometer = 2.54/1000 in mm). + // worldUnitLength * 1000 / 2.54 is the user unit in mm + double worldIU_per_mm = 1/( worldUnitLength / 0.00254 ); double pix_size_iu = worldIU_per_mm * ( 25.4 / ppi ); int w = aBitmap.GetSizePixels().x; int h = aBitmap.GetSizePixels().y; @@ -1202,5 +1206,5 @@ unsigned int CAIRO_GAL::getNewGroupNumber() void CAIRO_GAL::EnableDepthTest( bool aEnabled ) { - + } diff --git a/common/gal/opengl/opengl_gal.cpp b/common/gal/opengl/opengl_gal.cpp index 409047bca..62c567d52 100644 --- a/common/gal/opengl/opengl_gal.cpp +++ b/common/gal/opengl/opengl_gal.cpp @@ -1001,8 +1001,15 @@ void OPENGL_GAL::DrawBitmap( const BITMAP_BASE& aBitmap ) { int ppi = aBitmap.GetPPI(); - double w = (double) aBitmap.GetSizePixels().x / (double) ppi / worldUnitLength * 10.0; // no idea where the factor 10 comes from... - double h = (double) aBitmap.GetSizePixels().y / (double) ppi / worldUnitLength * 10.0; + // We have to calculate the pixel size in users units to draw the image. + // worldUnitLength is the user unit in GAL unit value + // (GAL unit = 2.54/1e9 in meter). + // worldUnitLength * 1000 / 2.54 is the user unit in mm + double worldIU_per_mm = 1.0 / ( worldUnitLength / 0.00254 ); + double pix_size_iu = worldIU_per_mm * ( 25.4 / ppi ); + + double w = (double) aBitmap.GetSizePixels().x * pix_size_iu; + double h = (double) aBitmap.GetSizePixels().y * pix_size_iu; auto xform = currentManager->GetTransformation(); diff --git a/common/legacy_gal/eda_draw_frame.cpp b/common/legacy_gal/eda_draw_frame.cpp index fa4fbb50f..75fd45c7e 100644 --- a/common/legacy_gal/eda_draw_frame.cpp +++ b/common/legacy_gal/eda_draw_frame.cpp @@ -221,16 +221,13 @@ EDA_DRAW_FRAME::EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent, m_FramePos.x = m_FramePos.y = 0; m_FrameSize.y -= m_MsgFrameHeight; - printf("calling createCanvas\n"); - createCanvas(); - printf("Canvas %p\n", m_canvas); - m_messagePanel = new EDA_MSG_PANEL( this, -1, wxPoint( 0, m_FrameSize.y ), wxSize( m_FrameSize.x, m_MsgFrameHeight ) ); m_messagePanel->SetBackgroundColour( COLOR4D( LIGHTGRAY ).ToColour() ); } + EDA_DRAW_FRAME::~EDA_DRAW_FRAME() { delete m_socketServer; @@ -652,7 +649,7 @@ void EDA_DRAW_FRAME::SetNoToolSelected() // Change GAL canvas cursor if requested. if( IsGalCanvasActive() ) defaultCursor = GetGalCanvas()->GetDefaultCursor(); - + SetToolID( ID_NO_TOOL_SELECTED, defaultCursor, wxEmptyString ); } @@ -1045,7 +1042,7 @@ void EDA_DRAW_FRAME::UseGalCanvas( bool aEnable ) GetGalCanvas()->SetEvtHandlerEnabled( aEnable ); - + // Reset current tool on switch(); SetNoToolSelected(); @@ -1067,7 +1064,7 @@ bool EDA_DRAW_FRAME::SwitchCanvas( EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType ) } -EDA_DRAW_PANEL_GAL::GAL_TYPE EDA_DRAW_FRAME::LoadCanvasTypeSetting() +EDA_DRAW_PANEL_GAL::GAL_TYPE EDA_DRAW_FRAME::LoadCanvasTypeSetting() { EDA_DRAW_PANEL_GAL::GAL_TYPE canvasType = EDA_DRAW_PANEL_GAL::GAL_TYPE_NONE; wxConfigBase* cfg = Kiface().KifaceSettings(); diff --git a/eeschema/hotkeys.cpp b/eeschema/hotkeys.cpp index 6e0ce204f..b6c43f3d0 100644 --- a/eeschema/hotkeys.cpp +++ b/eeschema/hotkeys.cpp @@ -237,6 +237,18 @@ static EDA_HOTKEY HkEditCut( _HKI( "Cut" ), HK_EDIT_CUT, GR_KB_CTRL + 'X', (int) static EDA_HOTKEY HkEditCopy( _HKI( "Copy" ), HK_EDIT_COPY, GR_KB_CTRL + 'C', (int) wxID_COPY ); static EDA_HOTKEY HkEditPaste( _HKI( "Paste" ), HK_EDIT_PASTE, GR_KB_CTRL + 'V', (int) wxID_PASTE ); +static EDA_HOTKEY HkCanvasOpenGL( _HKI( "Switch to Modern Toolset with hardware-accelerated graphics (recommended)" ), + HK_CANVAS_OPENGL, +#ifdef __WXMAC__ + GR_KB_ALT + +#endif + WXK_F11, ID_MENU_CANVAS_OPENGL ); +static EDA_HOTKEY HkCanvasCairo( _HKI( "Switch to Modern Toolset with software graphics (fall-back)" ), + HK_CANVAS_CAIRO, +#ifdef __WXMAC__ + GR_KB_ALT + +#endif + WXK_F12, ID_MENU_CANVAS_CAIRO ); // List of common hotkey descriptors static EDA_HOTKEY* common_Hotkey_List[] = @@ -314,6 +326,8 @@ static EDA_HOTKEY* schematic_Hotkey_List[] = &HkLeaveSheet, &HkDeleteNode, &HkHighlightConnection, + &HkCanvasCairo, + &HkCanvasOpenGL, NULL }; @@ -616,12 +630,15 @@ bool SCH_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, case HK_ROTATE: // Rotate schematic item. case HK_EDIT_COMPONENT_WITH_LIBEDIT: // Call Libedit and load the current component case HK_AUTOPLACE_FIELDS: // Autoplace all fields around component + case HK_CANVAS_CAIRO: + case HK_CANVAS_OPENGL: { - // force a new item search on hot keys at current position, + // force a new item search on hot keys at current position, // if there is no currently edited item, // to avoid using a previously selected item if( ! itemInEdit ) screen->SetCurItem( NULL ); + EDA_HOTKEY_CLIENT_DATA data( aPosition ); cmd.SetInt( hotKey->m_Idcommand ); cmd.SetClientObject( &data ); diff --git a/eeschema/hotkeys.h b/eeschema/hotkeys.h index 6b497ec6d..2d00cd353 100644 --- a/eeschema/hotkeys.h +++ b/eeschema/hotkeys.h @@ -77,7 +77,9 @@ enum hotkey_id_commnand { HK_DELETE_NODE, HK_AUTOPLACE_FIELDS, HK_UPDATE_PCB_FROM_SCH, - HK_SELECT_ITEMS_ON_PCB + HK_SELECT_ITEMS_ON_PCB, + HK_CANVAS_OPENGL, + HK_CANVAS_CAIRO, }; // List of hotkey descriptors for Eeschema diff --git a/eeschema/menubar.cpp b/eeschema/menubar.cpp index e3bea4742..fe8efc114 100644 --- a/eeschema/menubar.cpp +++ b/eeschema/menubar.cpp @@ -664,6 +664,20 @@ static void preparePreferencesMenu( SCH_EDIT_FRAME* aFrame, wxMenu* aParentMenu aParentMenu->AppendSeparator(); + wxString text = AddHotkeyName( _( "Modern Toolset (&Accelerated)" ), g_Eeschema_Hokeys_Descr, + HK_CANVAS_OPENGL ); + AddMenuItem( aParentMenu, ID_MENU_CANVAS_OPENGL, text, + _( "Use Modern Toolset with hardware-accelerated graphics (recommended)" ), + KiBitmap( tools_xpm ), wxITEM_RADIO ); + + text = AddHotkeyName( _( "Modern Toolset (Fallba&ck)" ), g_Eeschema_Hokeys_Descr, + HK_CANVAS_CAIRO ); + AddMenuItem( aParentMenu, ID_MENU_CANVAS_CAIRO, text, + _( "Use Modern Toolset with software graphics (fall-back)" ), + KiBitmap( tools_xpm ), wxITEM_RADIO ); + + aParentMenu->AppendSeparator(); + // Import/export AddMenuItem( aParentMenu, ID_CONFIG_SAVE, _( "&Save Project File..." ), _( "Save project preferences into a project file" ), diff --git a/eeschema/onrightclick.cpp b/eeschema/onrightclick.cpp index 39b44de45..73c8656e8 100644 --- a/eeschema/onrightclick.cpp +++ b/eeschema/onrightclick.cpp @@ -143,7 +143,7 @@ bool SCH_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu ) item = LocateAndShowItem( aPosition, SCH_COLLECTOR::AllItemsButPins, 0, &actionCancelled ); printf("Locateandshow %d %d item %p type %d\n", aPosition.x, aPosition.y, - item, item ? item->Type() : 0 ); fflush(0); + item, item ? item->Type() : 0 ); fflush(0); // If the clarify item selection context menu is aborted, don't show the context menu. if( item == NULL && actionCancelled ) diff --git a/eeschema/sch_base_frame.cpp b/eeschema/sch_base_frame.cpp index df780456d..b355eea69 100644 --- a/eeschema/sch_base_frame.cpp +++ b/eeschema/sch_base_frame.cpp @@ -91,6 +91,10 @@ SCH_BASE_FRAME::SCH_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent, EDA_DRAW_FRAME( aKiway, aParent, aWindowType, aTitle, aPosition, aSize, aStyle, aFrameName ) { + printf("calling createCanvas\n"); + createCanvas(); + printf("Canvas %p\n", m_canvas); + m_zoomLevelCoeff = 11.0; // Adjusted to roughly displays zoom level = 1 // when the screen shows a 1:1 image // obviously depends on the monitor, @@ -100,12 +104,48 @@ SCH_BASE_FRAME::SCH_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent, } - SCH_BASE_FRAME::~SCH_BASE_FRAME() { } +void SCH_BASE_FRAME::OnUpdateSwitchCanvas( wxUpdateUIEvent& aEvent ) +{ + wxMenuBar* menuBar = GetMenuBar(); + EDA_DRAW_PANEL_GAL* gal_canvas = GetGalCanvas(); + EDA_DRAW_PANEL_GAL::GAL_TYPE canvasType = gal_canvas->GetBackend(); + + struct { int menuId; int galType; } menuList[] = + { + { ID_MENU_CANVAS_OPENGL, EDA_DRAW_PANEL_GAL::GAL_TYPE_OPENGL }, + { ID_MENU_CANVAS_CAIRO, EDA_DRAW_PANEL_GAL::GAL_TYPE_CAIRO }, + }; + + for( auto ii: menuList ) + { + wxMenuItem* item = menuBar->FindItem( ii.menuId ); + if( ii.galType == canvasType ) + { + item->Check( true ); + } + } +} + + +void SCH_BASE_FRAME::OnSwitchCanvas( wxCommandEvent& aEvent ) +{ + auto new_type = EDA_DRAW_PANEL_GAL::GAL_TYPE_OPENGL; + + if( aEvent.GetId() == ID_MENU_CANVAS_CAIRO ) + new_type = EDA_DRAW_PANEL_GAL::GAL_TYPE_CAIRO; + + if( m_canvasType == new_type ) + return; + + GetGalCanvas()->SwitchBackend( new_type ); +} + + void SCH_BASE_FRAME::OnOpenLibraryViewer( wxCommandEvent& event ) { LIB_VIEW_FRAME* viewlibFrame = (LIB_VIEW_FRAME*) Kiway().Player( FRAME_SCH_VIEWER, true ); @@ -554,11 +594,17 @@ bool SCH_BASE_FRAME::HandleBlockBegin( wxDC* aDC, EDA_KEY aKey, const wxPoint& a return true; } - -void EDA_DRAW_FRAME::createCanvas() +void SCH_BASE_FRAME::createCanvas() { + EDA_DRAW_PANEL_GAL::GAL_TYPE canvasType = LoadCanvasTypeSetting(); + + // Allows only a CAIRO or OPENGL canvas: + if( canvasType != EDA_DRAW_PANEL_GAL::GAL_TYPE_OPENGL && + canvasType != EDA_DRAW_PANEL_GAL::GAL_TYPE_CAIRO ) + canvasType = EDA_DRAW_PANEL_GAL::GAL_TYPE_OPENGL; + m_canvas = new SCH_DRAW_PANEL( this, wxID_ANY, wxPoint( 0, 0 ), m_FrameSize, - m_galDisplayOptions, EDA_DRAW_PANEL_GAL::GAL_TYPE_OPENGL ); + GetGalDisplayOptions(), canvasType ); m_useSingleCanvasPane = true; diff --git a/eeschema/sch_base_frame.h b/eeschema/sch_base_frame.h index fca8e7094..ceba7b5ef 100644 --- a/eeschema/sch_base_frame.h +++ b/eeschema/sch_base_frame.h @@ -102,11 +102,23 @@ public: virtual ~SCH_BASE_FRAME(); + void createCanvas(); + SCH_DRAW_PANEL* GetCanvas() const override; SCH_SCREEN* GetScreen() const override; KIGFX::SCH_RENDER_SETTINGS* GetRenderSettings(); + /** + * switches currently used canvas ( Cairo / OpenGL). + */ + void OnSwitchCanvas( wxCommandEvent& aEvent ); + + /** + * Update UI called when switches currently used canvas (Cairo / OpenGL). + */ + void OnUpdateSwitchCanvas( wxUpdateUIEvent& aEvent ); + /** * @return the increment value of the position of an item * for the repeat command diff --git a/eeschema/sch_draw_panel.cpp b/eeschema/sch_draw_panel.cpp index 348f54ca2..4aa36700e 100644 --- a/eeschema/sch_draw_panel.cpp +++ b/eeschema/sch_draw_panel.cpp @@ -60,6 +60,9 @@ BEGIN_EVENT_TABLE( SCH_DRAW_PANEL, wxScrolledWindow ) // EVT_MENU_RANGE( ID_PAN_UP, ID_PAN_RIGHT, EDA_DRAW_PANEL::OnPan ) END_EVENT_TABLE() +// define our user unit value for GAL ( given in GAL unit = 2.54/(IU per meter)) +// TODO: move in a header common to sch_preview_panel.cpp +#define IU_2_GAL_WORLD_UNIT 2.54/(IU_PER_MM*1000) SCH_DRAW_PANEL::SCH_DRAW_PANEL( wxWindow* aParentWindow, wxWindowID aWindowId, const wxPoint& aPosition, const wxSize& aSize, @@ -74,16 +77,15 @@ SCH_DRAW_PANEL::SCH_DRAW_PANEL( wxWindow* aParentWindow, wxWindowID aWindowId, m_defaultCursor = m_currentCursor = wxCURSOR_ARROW; m_showCrossHair = true; #endif - m_view = new KIGFX::SCH_VIEW( true ); m_view->SetGAL( m_gal ); - m_gal->SetWorldUnitLength( 0.01 ); // 1 unit = 0.01 inch + m_gal->SetWorldUnitLength( IU_2_GAL_WORLD_UNIT ); m_painter.reset( new KIGFX::SCH_PAINTER( m_gal ) ); m_view->SetPainter( m_painter.get() ); - m_view->SetScaleLimits( 2000000.0, 0.002 ); + m_view->SetScaleLimits( 2000.0, 0.002 ); m_view->SetMirror( false, false ); setDefaultLayerOrder(); @@ -134,7 +136,7 @@ SCH_DRAW_PANEL::SCH_DRAW_PANEL( wxWindow* aParentWindow, wxWindowID aWindowId, m_doubleClickInterval = 250; - m_gal->SetGridColor( COLOR4D(0.0, 0.0, 0.0, 1.0) ); + m_gal->SetGridColor( GetLayerColor( LAYER_SCHEMATIC_GRID ) ); m_gal->SetCursorColor( COLOR4D(0.0, 0.0, 0.0, 1.0) ); m_viewControls->SetSnapping( true ); @@ -195,8 +197,12 @@ void SCH_DRAW_PANEL::setDefaultLayerOrder() bool SCH_DRAW_PANEL::SwitchBackend( GAL_TYPE aGalType ) { + VECTOR2D grid_size = m_gal->GetGridSize(); bool rv = EDA_DRAW_PANEL_GAL::SwitchBackend( aGalType ); setDefaultLayerDeps(); + m_gal->SetWorldUnitLength( IU_2_GAL_WORLD_UNIT ); + m_gal->SetGridSize( grid_size ); + m_gal->SetGridColor( GetLayerColor( LAYER_SCHEMATIC_GRID ) ); return rv; } @@ -375,6 +381,7 @@ void SCH_DRAW_PANEL::OnMouseEvent( wxMouseEvent& event ) if( event.MiddleIsDown() ) { +/* Not used in GAL canvas wxPoint currentPosition = event.GetPosition(); double scale = GetParent()->GetScreen()->GetScalingFactor(); @@ -384,6 +391,8 @@ void SCH_DRAW_PANEL::OnMouseEvent( wxMouseEvent& event ) KiROUND( (double) ( m_PanStartEventPosition.y - currentPosition.y ) / scale ); GetParent()->RedrawScreen( wxPoint( x, y ), false ); +*/ + return; } // Calling the general function on mouse changes (and pseudo key commands) @@ -679,7 +688,6 @@ void SCH_DRAW_PANEL::onPaint( wxPaintEvent& aEvent ) { if( m_painter ) static_cast<KIGFX::SCH_PAINTER*>(m_painter.get())->GetSettings()->ImportLegacyColors( nullptr ); - + EDA_DRAW_PANEL_GAL::onPaint( aEvent ); } - \ No newline at end of file diff --git a/eeschema/sch_edit_frame.cpp b/eeschema/sch_edit_frame.cpp index fc0fc873e..e28435f74 100644 --- a/eeschema/sch_edit_frame.cpp +++ b/eeschema/sch_edit_frame.cpp @@ -320,6 +320,9 @@ BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, EDA_DRAW_FRAME ) EVT_MENU_RANGE( ID_POPUP_START_RANGE, ID_POPUP_END_RANGE, SCH_EDIT_FRAME::Process_Special_Functions ) + EVT_MENU( ID_MENU_CANVAS_CAIRO, SCH_EDIT_FRAME::OnSwitchCanvas ) + EVT_MENU( ID_MENU_CANVAS_OPENGL, SCH_EDIT_FRAME::OnSwitchCanvas ) + // Tools and buttons options toolbar EVT_TOOL( ID_TB_OPTIONS_HIDDEN_PINS, SCH_EDIT_FRAME::OnSelectOptionToolbar ) EVT_TOOL( ID_TB_OPTIONS_BUS_WIRES_ORIENT, SCH_EDIT_FRAME::OnSelectOptionToolbar ) @@ -347,6 +350,8 @@ BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, EDA_DRAW_FRAME ) EVT_UPDATE_UI( ID_UPDATE_ONE_SHEET, SCH_EDIT_FRAME::OnUpdateSaveSheet ) EVT_UPDATE_UI( ID_POPUP_SCH_LEAVE_SHEET, SCH_EDIT_FRAME::OnUpdateHierarchySheet ) EVT_UPDATE_UI( ID_REMAP_SYMBOLS, SCH_EDIT_FRAME::OnUpdateRemapSymbols ) + EVT_UPDATE_UI( ID_MENU_CANVAS_CAIRO, SCH_EDIT_FRAME::OnUpdateSwitchCanvas ) + EVT_UPDATE_UI( ID_MENU_CANVAS_OPENGL, SCH_EDIT_FRAME::OnUpdateSwitchCanvas ) /* Search dialog events. */ EVT_FIND_CLOSE( wxID_ANY, SCH_EDIT_FRAME::OnFindDialogClose ) diff --git a/eeschema/sch_preview_panel.cpp b/eeschema/sch_preview_panel.cpp index 3d7162938..0d9b46b79 100644 --- a/eeschema/sch_preview_panel.cpp +++ b/eeschema/sch_preview_panel.cpp @@ -40,6 +40,9 @@ using namespace std::placeholders; +// define our user unit value for GAL ( given in GAL unit = 2.54/(IU per meter)) +// TODO: move in a header common to sch_draw_panel.cpp +#define IU_2_GAL_WORLD_UNIT 2.54/(IU_PER_MM*1000) SCH_PREVIEW_PANEL::SCH_PREVIEW_PANEL( wxWindow* aParentWindow, wxWindowID aWindowId, const wxPoint& aPosition, const wxSize& aSize, @@ -50,12 +53,12 @@ SCH_PREVIEW_PANEL::SCH_PREVIEW_PANEL( wxWindow* aParentWindow, wxWindowID aWindo m_view = new KIGFX::SCH_VIEW( true ); m_view->SetGAL( m_gal ); - m_gal->SetWorldUnitLength( 0.01 ); // 1 unit = 0.01 inch + m_gal->SetWorldUnitLength( IU_2_GAL_WORLD_UNIT ); m_painter.reset( new KIGFX::SCH_PAINTER( m_gal ) ); m_view->SetPainter( m_painter.get() ); - m_view->SetScaleLimits( 2000000.0, 0.002 ); + m_view->SetScaleLimits( 20000.0, 0.002 ); m_view->SetMirror( false, false ); setDefaultLayerOrder(); @@ -139,4 +142,3 @@ void SCH_PREVIEW_PANEL::onPaint( wxPaintEvent& aEvent ) if( IsShown() ) EDA_DRAW_PANEL_GAL::onPaint( aEvent ); } - \ No newline at end of file diff --git a/include/class_draw_panel_gal.h b/include/class_draw_panel_gal.h index 2626c4bc7..ded6c7499 100644 --- a/include/class_draw_panel_gal.h +++ b/include/class_draw_panel_gal.h @@ -162,7 +162,7 @@ public: virtual void GetMsgPanelInfo( EDA_UNITS_T aUnits, std::vector<MSG_PANEL_ITEM>& aList ) { - assert( false ); + wxASSERT( false ); } /** @@ -210,7 +210,7 @@ public: * Set the current cursor shape for this panel */ virtual void SetCurrentCursor( int aCursor ); - + /** * Function GetDefaultCursor * @return the default cursor shape diff --git a/include/draw_frame.h b/include/draw_frame.h index e5c000d34..d110cd2b5 100644 --- a/include/draw_frame.h +++ b/include/draw_frame.h @@ -78,10 +78,9 @@ class EDA_DRAW_FRAME : public KIWAY_PLAYER ///< GAL display options - this is the frame's interface to setting GAL display options KIGFX::GAL_DISPLAY_OPTIONS m_galDisplayOptions; - bool m_useSingleCanvasPane; - protected: + bool m_useSingleCanvasPane; wxSocketServer* m_socketServer; std::vector<wxSocketBase*> m_sockets; ///< interprocess communication @@ -221,8 +220,6 @@ protected: ///> Key in KifaceSettings to store the canvas type. static const wxChar CANVAS_TYPE_KEY[]; - void createCanvas(); - public: EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType, diff --git a/pcbnew/pcb_draw_panel_gal.cpp b/pcbnew/pcb_draw_panel_gal.cpp index a7510666f..292ab94fb 100644 --- a/pcbnew/pcb_draw_panel_gal.cpp +++ b/pcbnew/pcb_draw_panel_gal.cpp @@ -394,6 +394,7 @@ bool PCB_DRAW_PANEL_GAL::SwitchBackend( GAL_TYPE aGalType ) { bool rv = EDA_DRAW_PANEL_GAL::SwitchBackend( aGalType ); setDefaultLayerDeps(); + m_gal->SetWorldUnitLength( 2.54/(IU_PER_MM*1000) ); // world unit is in internal units per inch * 1000 return rv; } -- 2.17.0.windows.1
From 73922406082b48b763b96b8b251bf9221eb140c4 Mon Sep 17 00:00:00 2001 From: jean-pierre charras <[email protected]> Date: Fri, 14 Sep 2018 10:15:10 +0200 Subject: [PATCH 2/2] Fix zoom issues in Eeschema (F1 to F4 and popup zoom commands) Fix also not saving the Gal Canvas type on eeschema exit. --- common/legacy_gal/eda_draw_frame.cpp | 102 +++++++++++++++++++-------- eeschema/sch_base_frame.cpp | 4 +- eeschema/sch_draw_panel.cpp | 15 +--- include/draw_frame.h | 18 ++++- include/legacy_gal/class_drawpanel.h | 52 +++++++------- 5 files changed, 122 insertions(+), 69 deletions(-) diff --git a/common/legacy_gal/eda_draw_frame.cpp b/common/legacy_gal/eda_draw_frame.cpp index 75fd45c7e..9d8718c52 100644 --- a/common/legacy_gal/eda_draw_frame.cpp +++ b/common/legacy_gal/eda_draw_frame.cpp @@ -237,7 +237,7 @@ EDA_DRAW_FRAME::~EDA_DRAW_FRAME() socket->Destroy(); } - if( m_canvasTypeDirty ) + if( m_canvasTypeDirty ) // the canvas type has changed: save the new type saveCanvasTypeSetting( m_canvasType ); delete m_actions; @@ -1076,7 +1076,7 @@ EDA_DRAW_PANEL_GAL::GAL_TYPE EDA_DRAW_FRAME::LoadCanvasTypeSetting() if( canvasType < EDA_DRAW_PANEL_GAL::GAL_TYPE_NONE || canvasType >= EDA_DRAW_PANEL_GAL::GAL_TYPE_LAST ) { - assert( false ); + wxASSERT( false ); canvasType = EDA_DRAW_PANEL_GAL::GAL_TYPE_NONE; } @@ -1089,7 +1089,7 @@ bool EDA_DRAW_FRAME::saveCanvasTypeSetting( EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvas if( aCanvasType < EDA_DRAW_PANEL_GAL::GAL_TYPE_NONE || aCanvasType >= EDA_DRAW_PANEL_GAL::GAL_TYPE_LAST ) { - assert( false ); + wxASSERT( false ); return false; } @@ -1364,9 +1364,9 @@ void EDA_DRAW_FRAME::OnZoom( wxCommandEvent& event ) return; int id = event.GetId(); - bool zoom_at_cursor = false; - BASE_SCREEN* screen = GetScreen(); - wxPoint center = GetScrollCenterPosition(); + bool warp_cursor = false; + VECTOR2D cpos = GetCrossHairPosition();//GetGalCanvas()->GetViewControls()->GetCursorPosition(); + wxPoint zoom_center( (int)cpos.x, (int)cpos.y ); if ( id == ID_KEY_ZOOM_IN ) { @@ -1382,39 +1382,27 @@ void EDA_DRAW_FRAME::OnZoom( wxCommandEvent& event ) switch( id ) { case ID_OFFCENTER_ZOOM_IN: - center = m_canvas->ToDeviceXY( GetCrossHairPosition() ); - - if( screen->SetPreviousZoom() ) - RedrawScreen2( center ); + SetPreviousZoomAndRedraw( zoom_center,warp_cursor ); break; case ID_POPUP_ZOOM_IN: - zoom_at_cursor = true; - center = GetCrossHairPosition(); - - // fall thru + warp_cursor = true; + // fall thru case ID_VIEWER_ZOOM_IN: case ID_ZOOM_IN: - if( screen->SetPreviousZoom() ) - RedrawScreen( center, zoom_at_cursor ); + SetPreviousZoomAndRedraw( zoom_center,warp_cursor ); break; case ID_OFFCENTER_ZOOM_OUT: - center = m_canvas->ToDeviceXY( GetCrossHairPosition() ); - - if( screen->SetNextZoom() ) - RedrawScreen2( center ); + SetNextZoomAndRedraw( zoom_center, warp_cursor ); break; case ID_POPUP_ZOOM_OUT: - zoom_at_cursor = true; - center = GetCrossHairPosition(); - - // fall thru + warp_cursor = true; + // fall thru case ID_VIEWER_ZOOM_OUT: case ID_ZOOM_OUT: - if( screen->SetNextZoom() ) - RedrawScreen( center, zoom_at_cursor ); + SetNextZoomAndRedraw( zoom_center, warp_cursor ); break; case ID_VIEWER_ZOOM_REDRAW: @@ -1425,8 +1413,8 @@ void EDA_DRAW_FRAME::OnZoom( wxCommandEvent& event ) break; case ID_POPUP_ZOOM_CENTER: - center = GetCrossHairPosition(); - RedrawScreen( center, true ); + GetGalCanvas()->GetView()->SetScale( GetGalCanvas()->GetView()->GetScale(), zoom_center ); + GetGalCanvas()->GetViewControls()->CenterOnCursor(); break; case ID_POPUP_ZOOM_PAGE: @@ -1462,6 +1450,64 @@ void EDA_DRAW_FRAME::SetPrevZoom() } +void EDA_DRAW_FRAME::SetNextZoomAndRedraw( const wxPoint& aCenterPoint, bool aWarpPointer ) +{ + double zoom = GetGalCanvas()->GetLegacyZoom(); + zoom *= 1.3; + + // Now look for the next closest menu step + std::vector<double>& zoomList = GetScreen()->m_ZoomList; + int idx; + + for( idx = 0; idx < (int)zoomList.size(); ++idx ) + { + if( zoomList[idx] > zoom ) + break; + } + + if( idx >= (int)zoomList.size() ) + return; + + VECTOR2D cpos = GetGalCanvas()->GetViewControls()->GetCursorPosition(); + wxPoint center( (int)cpos.x, (int)cpos.y ); + + if( m_zoomSelectBox ) + m_zoomSelectBox->SetSelection( idx ); + + if( GetScreen()->SetZoom( GetScreen()->m_ZoomList[idx] ) ) + RedrawScreen( aCenterPoint, true ); +} + + +void EDA_DRAW_FRAME::SetPreviousZoomAndRedraw( const wxPoint& aCenterPoint, bool aWarpPointer ) +{ + double zoom = GetGalCanvas()->GetLegacyZoom(); + zoom /= 1.3; + + // Now look for the next closest menu step + std::vector<double>& zoomList = GetScreen()->m_ZoomList; + int idx; + + for( idx = zoomList.size() - 1; idx >= 0; --idx ) + { + if( zoomList[idx] < zoom ) + break; + } + + if( idx < 0 ) + return; + + VECTOR2D cpos = GetGalCanvas()->GetViewControls()->GetCursorPosition(); + wxPoint center( (int)cpos.x, (int)cpos.y ); + + if( m_zoomSelectBox ) + m_zoomSelectBox->SetSelection( idx ); + + if( GetScreen()->SetZoom( GetScreen()->m_ZoomList[idx] ) ) + RedrawScreen( aCenterPoint, aWarpPointer ); +} + + void EDA_DRAW_FRAME::SetPresetZoom( int aIndex ) { BASE_SCREEN* screen = GetScreen(); diff --git a/eeschema/sch_base_frame.cpp b/eeschema/sch_base_frame.cpp index b355eea69..3a71df32b 100644 --- a/eeschema/sch_base_frame.cpp +++ b/eeschema/sch_base_frame.cpp @@ -143,6 +143,8 @@ void SCH_BASE_FRAME::OnSwitchCanvas( wxCommandEvent& aEvent ) return; GetGalCanvas()->SwitchBackend( new_type ); + m_canvasTypeDirty = true; // force saving new canvas type in config + m_canvasType = new_type; } @@ -461,7 +463,7 @@ void SCH_BASE_FRAME::RedrawScreen( const wxPoint& aCenterPoint, bool aWarpPointe GetCanvas()->GetView()->SetScale( scale ); if( aWarpPointer ) - GetCanvas()->GetViewControls()->WarpCursor( aCenterPoint ); + GetCanvas()->GetViewControls()->CenterOnCursor(); GetCanvas()->Refresh(); } diff --git a/eeschema/sch_draw_panel.cpp b/eeschema/sch_draw_panel.cpp index 4aa36700e..95d593664 100644 --- a/eeschema/sch_draw_panel.cpp +++ b/eeschema/sch_draw_panel.cpp @@ -40,10 +40,9 @@ using namespace std::placeholders; - // Events used by EDA_DRAW_PANEL // GAL TODO: some (most?) of these need to be implemented... -BEGIN_EVENT_TABLE( SCH_DRAW_PANEL, wxScrolledWindow ) +BEGIN_EVENT_TABLE( SCH_DRAW_PANEL, wxScrolledCanvas ) // EVT_LEAVE_WINDOW( EDA_DRAW_PANEL::OnMouseLeaving ) // EVT_ENTER_WINDOW( EDA_DRAW_PANEL::OnMouseEntering ) // EVT_MOUSEWHEEL( EDA_DRAW_PANEL::OnMouseWheel ) @@ -381,17 +380,7 @@ void SCH_DRAW_PANEL::OnMouseEvent( wxMouseEvent& event ) if( event.MiddleIsDown() ) { -/* Not used in GAL canvas - wxPoint currentPosition = event.GetPosition(); - - double scale = GetParent()->GetScreen()->GetScalingFactor(); - int x = m_PanStartCenter.x + - KiROUND( (double) ( m_PanStartEventPosition.x - currentPosition.x ) / scale ); - int y = m_PanStartCenter.y + - KiROUND( (double) ( m_PanStartEventPosition.y - currentPosition.y ) / scale ); - - GetParent()->RedrawScreen( wxPoint( x, y ), false ); -*/ + // already managed by EDA_DRAW_PANEL_GAL mouse event handler. return; } diff --git a/include/draw_frame.h b/include/draw_frame.h index d110cd2b5..11cfff0dc 100644 --- a/include/draw_frame.h +++ b/include/draw_frame.h @@ -72,7 +72,6 @@ class EDA_DRAW_FRAME : public KIWAY_PLAYER BASE_SCREEN* m_currentScreen; ///< current used SCREEN bool m_snapToGrid; ///< Indicates if cursor should be snapped to grid. - bool m_galCanvasActive; ///< whether to use new GAL engine EDA_DRAW_PANEL_GAL* m_galCanvas; @@ -80,6 +79,7 @@ class EDA_DRAW_FRAME : public KIWAY_PLAYER KIGFX::GAL_DISPLAY_OPTIONS m_galDisplayOptions; protected: + bool m_galCanvasActive; ///< whether to use new GAL engine bool m_useSingleCanvasPane; wxSocketServer* m_socketServer; @@ -651,12 +651,28 @@ public: */ void SetNextZoom(); + /** + * changes the zoom to the next one available redraws the screen + * and warp the mouse pointer on request. + * @param aCenterPoint is the reference point for zooming + * @param aWarpPointer = true to move the pointer to the aCenterPoint + */ + void SetNextZoomAndRedraw( const wxPoint& aCenterPoint, bool aWarpPointer ); + /** * Function SetPrevZoom() * changes the zoom to the previous one available. */ void SetPrevZoom(); + /** + * changes the zoom to the previous one available redraws the screen + * and warp the mouse pointer on request. + * @param aCenterPoint is the reference point for zooming + * @param aWarpPointer = true to move the pointer to the aCenterPoint + */ + void SetPreviousZoomAndRedraw( const wxPoint& aCenterPoint, bool aWarpPointer ); + /** * Function SetPresetZoom() * changes zoom to one of the preset values. diff --git a/include/legacy_gal/class_drawpanel.h b/include/legacy_gal/class_drawpanel.h index 0f2ef13d5..c0564d04a 100644 --- a/include/legacy_gal/class_drawpanel.h +++ b/include/legacy_gal/class_drawpanel.h @@ -94,7 +94,7 @@ public: * A way to pass info to draw functions. * this is just an accessor to the GetDisplayOptions() parent frame function. */ - virtual void* GetDisplayOptions() { printf("Unimplemented\n"); assert(false); return nullptr; }; + virtual void* GetDisplayOptions() { printf("EDA_DRAW_PANEL:Unimplemented\n"); wxASSERT(false); return nullptr; }; virtual BASE_SCREEN* GetScreen() = 0; @@ -143,7 +143,7 @@ public: * X and Y axis * X and Y auxiliary axis */ - virtual void DrawBackGround( wxDC* DC ) { printf("Unimplemented\n"); }; + virtual void DrawBackGround( wxDC* DC ) { printf("EDA_DRAW_PANEL:Unimplemented1\n"); }; /** * Function DrawGrid @@ -153,7 +153,7 @@ public: * @see EDA_DRAW_FRAME::GetGridColor() for the color of the grid. * @param aDC The device context to draw the grid. */ - virtual void DrawGrid( wxDC* aDC ) { printf("Unimplemented\n"); }; + virtual void DrawGrid( wxDC* aDC ) { printf("EDA_DRAW_PANEL:Unimplemented2\n"); }; /** * Function DrawAuxiliaryAxis @@ -162,7 +162,7 @@ public: * @param aDC = current Device Context * @param aDrawMode = draw mode (GR_COPY, GR_OR ..) */ - virtual void DrawAuxiliaryAxis( wxDC* aDC, GR_DRAWMODE aDrawMode ) { printf("Unimplemented\n");}; + virtual void DrawAuxiliaryAxis( wxDC* aDC, GR_DRAWMODE aDrawMode ) { printf("EDA_DRAW_PANEL:Unimplemented2\n");}; /** * Function DrawGridAxis @@ -172,7 +172,7 @@ public: * @param aDrawMode = draw mode (GR_COPY, GR_OR ..) * @param aGridOrigin = the absolute coordinate of grid origin for snap. */ - virtual void DrawGridAxis( wxDC* aDC, GR_DRAWMODE aDrawMode, const wxPoint& aGridOrigin ) { printf("Unimplemented\n"); }; + virtual void DrawGridAxis( wxDC* aDC, GR_DRAWMODE aDrawMode, const wxPoint& aGridOrigin ) { printf("EDA_DRAW_PANEL:Unimplemented4\n"); }; /** * Function DeviceToLogical @@ -184,7 +184,7 @@ public: * @param aDC The device context used for the conversion. * @return A rectangle converted to drawing units. */ - virtual wxRect DeviceToLogical( const wxRect& aRect, wxDC& aDC ) { printf("Unimplemented\n");assert(false); return wxRect(); }; + virtual wxRect DeviceToLogical( const wxRect& aRect, wxDC& aDC ) { printf("EDA_DRAW_PANEL:Unimplemented5\n");wxASSERT(false); return wxRect(); }; /* Mouse and keys events */ @@ -198,13 +198,13 @@ public: *</p> */ - virtual void EraseScreen( wxDC* DC ) { printf("Unimplemented\n"); };; + virtual void EraseScreen( wxDC* DC ) { printf("EDA_DRAW_PANEL:Unimplemented6\n"); };; - virtual void SetZoom( double mode ) { printf("Unimplemented\n"); };; - virtual double GetZoom() { printf("Unimplemented\n"); return 1.0; };; + virtual void SetZoom( double mode ) { printf("EDA_DRAW_PANEL:Unimplemented7\n"); };; + virtual double GetZoom() { printf("EDA_DRAW_PANEL:Unimplemented8\n"); return 1.0; };; - //virtual void SetGrid( const wxRealPoint& size ) { printf("Unimplemented\n"); };; - //virtual wxRealPoint GetGrid() { printf("Unimplemented\n"); return wxRealPoint(1.0, 1.0); };; + //virtual void SetGrid( const wxRealPoint& size ) { printf("EDA_DRAW_PANEL:Unimplemented\n"); };; + //virtual wxRealPoint GetGrid() { printf("EDA_DRAW_PANEL:Unimplemented\n"); return wxRealPoint(1.0, 1.0); };; /** @@ -213,7 +213,7 @@ public: * @return true if \a aPosition is visible on the screen. * false if \a aPosition is not visible on the screen. */ - virtual bool IsPointOnDisplay( const wxPoint& aPosition ) { printf("Unimplemented\n"); return false; };; + virtual bool IsPointOnDisplay( const wxPoint& aPosition ) { printf("EDA_DRAW_PANEL:Unimplemented9\n"); return false; };; /** * Function SetClipBox @@ -231,9 +231,9 @@ public: * @param aRect The clip rectangle in device units or NULL for the entire visible area * of the screen. */ - virtual void SetClipBox( wxDC& aDC, const wxRect* aRect = NULL ) { printf("Unimplemented\n"); };; + virtual void SetClipBox( wxDC& aDC, const wxRect* aRect = NULL ) { printf("EDA_DRAW_PANEL:Unimplemented10\n"); };; - virtual void ReDraw( wxDC* aDC, bool aEraseBackground = true ) { printf("Unimplemented\n"); };; + virtual void ReDraw( wxDC* aDC, bool aEraseBackground = true ) { printf("EDA_DRAW_PANEL:Unimplemented11\n"); };; /** * Function RefreshDrawingRect @@ -242,7 +242,7 @@ public: * @param aRect The rectangle to repaint. * @param aEraseBackground Erases the background if true. */ - virtual void RefreshDrawingRect( const EDA_RECT& aRect, bool aEraseBackground = true ) { printf("Unimplemented\n"); };; + virtual void RefreshDrawingRect( const EDA_RECT& aRect, bool aEraseBackground = true ) { printf("EDA_DRAW_PANEL:Unimplemented12\n"); };; /// @copydoc wxWindow::Refresh() //virtual void Refresh( bool eraseBackground = true, const wxRect* rect = NULL ); @@ -251,32 +251,32 @@ public: * Function GetScreenCenterLogicalPosition * @return The current screen center position in logical (drawing) units. */ - virtual wxPoint GetScreenCenterLogicalPosition() { printf("Unimplemented\n"); return wxPoint(0, 0); };; + virtual wxPoint GetScreenCenterLogicalPosition() { printf("EDA_DRAW_PANEL:Unimplemented13\n"); return wxPoint(0, 0); };; /** * Function MoveCursorToCrossHair * warps the cursor to the current cross hair position. */ - virtual void MoveCursorToCrossHair() { printf("Unimplemented\n"); };; + virtual void MoveCursorToCrossHair() { printf("EDA_DRAW_PANEL:Unimplemented14\n"); };; /** * Function ToDeviceXY * transforms logical to device coordinates */ - virtual wxPoint ToDeviceXY( const wxPoint& pos ) { printf("Unimplemented\n"); return wxPoint(0, 0); };; + virtual wxPoint ToDeviceXY( const wxPoint& pos ) { printf("EDA_DRAW_PANEL:Unimplemented15\n"); return wxPoint(0, 0); };; /** * Function ToLogicalXY * transforms device to logical coordinates */ - virtual wxPoint ToLogicalXY( const wxPoint& pos ) { printf("Unimplemented\n"); return wxPoint(0, 0); };; + virtual wxPoint ToLogicalXY( const wxPoint& pos ) { printf("EDA_DRAW_PANEL:Unimplemented16\n"); return wxPoint(0, 0); };; /** * Function MoveCursor * moves the mouse pointer to \a aPosition in logical (drawing) units. * @param aPosition The position in logical units to move the cursor. */ - virtual void MoveCursor( const wxPoint& aPosition ) { printf("Unimplemented\n"); };; + virtual void MoveCursor( const wxPoint& aPosition ) { printf("EDA_DRAW_PANEL:Unimplemented17\n"); };; /* Cursor functions */ /** @@ -291,13 +291,13 @@ public: * @param aDC - the device context to draw the cursor * @param aColor - the color to draw the cursor */ - virtual void DrawCrossHair( wxDC* aDC=nullptr, COLOR4D aColor = COLOR4D::WHITE ) { printf("Unimplemented\n"); };; + virtual void DrawCrossHair( wxDC* aDC=nullptr, COLOR4D aColor = COLOR4D::WHITE ) { printf("EDA_DRAW_PANEL:Unimplemented18\n"); };; // Hide the cross hair. - virtual void CrossHairOff( wxDC* DC=nullptr ) { printf("Unimplemented\n"); };; + virtual void CrossHairOff( wxDC* DC=nullptr ) { printf("EDA_DRAW_PANEL:Unimplemented19\n"); };; // Show the cross hair. - virtual void CrossHairOn( wxDC* DC=nullptr ) { printf("Unimplemented\n"); };; + virtual void CrossHairOn( wxDC* DC=nullptr ) { printf("EDA_DRAW_PANEL:Unimplemented20\n"); };; /** * Function SetMouseCapture @@ -332,7 +332,7 @@ public: */ virtual void EndMouseCapture( int aId = -1, int aCursorId = -1, const wxString& aTitle = wxEmptyString, - bool aCallEndFunc = true ) { printf("Unimplemented\n"); assert(false); };; + bool aCallEndFunc = true ) { printf("EDA_DRAW_PANEL:Unimplemented21\n"); wxASSERT(false); };; inline bool IsMouseCaptured() const { return m_mouseCaptureCallback != NULL; } @@ -346,7 +346,7 @@ public: * @param aErase True indicates the item being drawn should be erase before drawing * it a \a aPosition. */ - virtual void CallMouseCapture( wxDC* aDC, const wxPoint& aPosition, bool aErase ) { printf("Unimplemented\n"); assert(false); };; + virtual void CallMouseCapture( wxDC* aDC, const wxPoint& aPosition, bool aErase ) { printf("EDA_DRAW_PANEL:Unimplemented22\n"); wxASSERT(false); };; /** * Function CallEndMouseCapture @@ -354,7 +354,7 @@ public: * * @param aDC A point to a wxDC object to perform any drawing upon. */ - virtual void CallEndMouseCapture( wxDC* aDC ) { printf("Unimplemented\n"); assert(false); };; + virtual void CallEndMouseCapture( wxDC* aDC ) { printf("EDA_DRAW_PANEL:Unimplemented23\n"); wxASSERT(false); };; virtual void Refresh( bool eraseBackground = true, const wxRect* rect = NULL ) {} -- 2.17.0.windows.1
_______________________________________________ Mailing list: https://launchpad.net/~kicad-developers Post to : [email protected] Unsubscribe : https://launchpad.net/~kicad-developers More help : https://help.launchpad.net/ListHelp

