ADDED: User viewports for 3D viewer.
Fixes https://gitlab.com/kicad/code/kicad/issues/5724
This commit is contained in:
parent
244042ce51
commit
bf71cada4e
|
@ -4,7 +4,7 @@
|
||||||
* Copyright (C) 2016 Mario Luzeiro <mrluzeiro@ua.pt>
|
* Copyright (C) 2016 Mario Luzeiro <mrluzeiro@ua.pt>
|
||||||
* Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
* Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||||
* Copyright (C) 2013 Wayne Stambaugh <stambaughw@gmail.com>
|
* Copyright (C) 2013 Wayne Stambaugh <stambaughw@gmail.com>
|
||||||
* Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 1992-2022 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -25,6 +25,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <wx/wupdlock.h>
|
#include <wx/wupdlock.h>
|
||||||
|
#include <wx/choice.h>
|
||||||
|
|
||||||
#include <bitmaps.h>
|
#include <bitmaps.h>
|
||||||
#include <eda_3d_viewer_frame.h>
|
#include <eda_3d_viewer_frame.h>
|
||||||
|
@ -50,6 +51,21 @@ void EDA_3D_VIEWER_FRAME::ReCreateMainToolbar()
|
||||||
m_mainToolBar->SetAuiManager( &m_auimgr );
|
m_mainToolBar->SetAuiManager( &m_auimgr );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_viewportsLabel = new wxStaticText( this, wxID_ANY, _( "Viewports (Alt+Tab):" ) );
|
||||||
|
m_viewportsLabel->Wrap( -1 );
|
||||||
|
|
||||||
|
m_cbViewports = new wxChoice( this, wxID_ANY );
|
||||||
|
|
||||||
|
for( std::pair<const wxString, VIEWPORT3D>& pair : m_viewports )
|
||||||
|
m_cbViewports->Append( pair.first, static_cast<void*>( &pair.second ) );
|
||||||
|
|
||||||
|
m_cbViewports->Append( wxT( "-----" ) );
|
||||||
|
m_cbViewports->Append( _( "Save viewport..." ) );
|
||||||
|
m_cbViewports->Append( _( "Delete viewport..." ) );
|
||||||
|
|
||||||
|
m_cbViewports->SetSelection( m_cbViewports->GetCount() - 3 );
|
||||||
|
m_lastSelectedViewport = nullptr;
|
||||||
|
|
||||||
// Set up toolbar
|
// Set up toolbar
|
||||||
m_mainToolBar->AddTool( ID_RELOAD3D_BOARD, wxEmptyString,
|
m_mainToolBar->AddTool( ID_RELOAD3D_BOARD, wxEmptyString,
|
||||||
KiScaledBitmap( BITMAPS::import3d, this ), _( "Reload board" ) );
|
KiScaledBitmap( BITMAPS::import3d, this ), _( "Reload board" ) );
|
||||||
|
@ -99,5 +115,11 @@ void EDA_3D_VIEWER_FRAME::ReCreateMainToolbar()
|
||||||
m_mainToolBar->Add( EDA_3D_ACTIONS::showSMD, ACTION_TOOLBAR::TOGGLE );
|
m_mainToolBar->Add( EDA_3D_ACTIONS::showSMD, ACTION_TOOLBAR::TOGGLE );
|
||||||
m_mainToolBar->Add( EDA_3D_ACTIONS::showVirtual, ACTION_TOOLBAR::TOGGLE );
|
m_mainToolBar->Add( EDA_3D_ACTIONS::showVirtual, ACTION_TOOLBAR::TOGGLE );
|
||||||
|
|
||||||
|
m_mainToolBar->AddScaledSeparator( this );
|
||||||
|
m_mainToolBar->AddControl( m_viewportsLabel );
|
||||||
|
m_mainToolBar->AddControl( m_cbViewports );
|
||||||
|
|
||||||
m_mainToolBar->KiRealize();
|
m_mainToolBar->KiRealize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,12 @@
|
||||||
#include <wx/wupdlock.h>
|
#include <wx/wupdlock.h>
|
||||||
#include <wx/clipbrd.h>
|
#include <wx/clipbrd.h>
|
||||||
#include <wx/filedlg.h>
|
#include <wx/filedlg.h>
|
||||||
|
#include <wx/choice.h>
|
||||||
|
#include <wx/dialog.h>
|
||||||
#include "eda_3d_viewer_frame.h"
|
#include "eda_3d_viewer_frame.h"
|
||||||
|
#include "eda_list_dialog.h"
|
||||||
|
#include "wx/generic/textdlgg.h"
|
||||||
|
#include <dialogs/eda_view_switcher.h>
|
||||||
#include <eda_3d_viewer_settings.h>
|
#include <eda_3d_viewer_settings.h>
|
||||||
#include <3d_viewer_id.h>
|
#include <3d_viewer_id.h>
|
||||||
#include <3d_viewer/tools/eda_3d_actions.h>
|
#include <3d_viewer/tools/eda_3d_actions.h>
|
||||||
|
@ -40,6 +45,7 @@
|
||||||
#include <gal/dpi_scaling.h>
|
#include <gal/dpi_scaling.h>
|
||||||
#include <pgm_base.h>
|
#include <pgm_base.h>
|
||||||
#include <project.h>
|
#include <project.h>
|
||||||
|
#include <project/project_file.h>
|
||||||
#include <settings/common_settings.h>
|
#include <settings/common_settings.h>
|
||||||
#include <settings/settings_manager.h>
|
#include <settings/settings_manager.h>
|
||||||
#include <tool/action_manager.h>
|
#include <tool/action_manager.h>
|
||||||
|
@ -73,8 +79,8 @@ BEGIN_EVENT_TABLE( EDA_3D_VIEWER_FRAME, EDA_BASE_FRAME )
|
||||||
EDA_3D_VIEWER_FRAME::Process_Special_Functions )
|
EDA_3D_VIEWER_FRAME::Process_Special_Functions )
|
||||||
|
|
||||||
EVT_MENU( wxID_CLOSE, EDA_3D_VIEWER_FRAME::Exit3DFrame )
|
EVT_MENU( wxID_CLOSE, EDA_3D_VIEWER_FRAME::Exit3DFrame )
|
||||||
EVT_MENU( ID_RENDER_CURRENT_VIEW, EDA_3D_VIEWER_FRAME::OnRenderEngineSelection )
|
EVT_MENU( ID_RENDER_CURRENT_VIEW, EDA_3D_VIEWER_FRAME::onRenderEngineSelection )
|
||||||
EVT_MENU( ID_DISABLE_RAY_TRACING, EDA_3D_VIEWER_FRAME::OnDisableRayTracing )
|
EVT_MENU( ID_DISABLE_RAY_TRACING, EDA_3D_VIEWER_FRAME::onDisableRayTracing )
|
||||||
|
|
||||||
EVT_CLOSE( EDA_3D_VIEWER_FRAME::OnCloseWindow )
|
EVT_CLOSE( EDA_3D_VIEWER_FRAME::OnCloseWindow )
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
@ -85,6 +91,8 @@ EDA_3D_VIEWER_FRAME::EDA_3D_VIEWER_FRAME( KIWAY* aKiway, PCB_BASE_FRAME* aParent
|
||||||
KIWAY_PLAYER( aKiway, aParent, FRAME_PCB_DISPLAY3D, aTitle, wxDefaultPosition,
|
KIWAY_PLAYER( aKiway, aParent, FRAME_PCB_DISPLAY3D, aTitle, wxDefaultPosition,
|
||||||
wxDefaultSize, style, QUALIFIED_VIEWER3D_FRAMENAME( aParent ) ),
|
wxDefaultSize, style, QUALIFIED_VIEWER3D_FRAMENAME( aParent ) ),
|
||||||
m_mainToolBar( nullptr ), m_canvas( nullptr ), m_currentCamera( m_trackBallCamera ),
|
m_mainToolBar( nullptr ), m_canvas( nullptr ), m_currentCamera( m_trackBallCamera ),
|
||||||
|
m_viewportsLabel( nullptr ),
|
||||||
|
m_cbViewports( nullptr ),
|
||||||
m_trackBallCamera( 2 * RANGE_SCALE_3D ), m_spaceMouse( nullptr )
|
m_trackBallCamera( 2 * RANGE_SCALE_3D ), m_spaceMouse( nullptr )
|
||||||
{
|
{
|
||||||
wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::EDA_3D_VIEWER_FRAME %s" ), aTitle );
|
wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::EDA_3D_VIEWER_FRAME %s" ), aTitle );
|
||||||
|
@ -113,6 +121,8 @@ EDA_3D_VIEWER_FRAME::EDA_3D_VIEWER_FRAME( KIWAY* aKiway, PCB_BASE_FRAME* aParent
|
||||||
LoadSettings( cfg );
|
LoadSettings( cfg );
|
||||||
loadCommonSettings();
|
loadCommonSettings();
|
||||||
|
|
||||||
|
SetUserViewports( Prj().GetProjectFile().m_Viewports3D );
|
||||||
|
|
||||||
// Create the manager
|
// Create the manager
|
||||||
m_toolManager = new TOOL_MANAGER;
|
m_toolManager = new TOOL_MANAGER;
|
||||||
m_toolManager->SetEnvironment( GetBoard(), nullptr, nullptr, cfg, this );
|
m_toolManager->SetEnvironment( GetBoard(), nullptr, nullptr, cfg, this );
|
||||||
|
@ -171,6 +181,13 @@ EDA_3D_VIEWER_FRAME::EDA_3D_VIEWER_FRAME( KIWAY* aKiway, PCB_BASE_FRAME* aParent
|
||||||
// in order to receive mouse events. Otherwise, the user has to click somewhere on
|
// in order to receive mouse events. Otherwise, the user has to click somewhere on
|
||||||
// the canvas before it will respond to mouse wheel events.
|
// the canvas before it will respond to mouse wheel events.
|
||||||
m_canvas->SetFocus();
|
m_canvas->SetFocus();
|
||||||
|
|
||||||
|
m_cbViewports->Connect( wxEVT_COMMAND_CHOICE_SELECTED,
|
||||||
|
wxCommandEventHandler( EDA_3D_VIEWER_FRAME::onViewportChanged ),
|
||||||
|
nullptr, this );
|
||||||
|
m_cbViewports->Connect( wxEVT_UPDATE_UI,
|
||||||
|
wxUpdateUIEventHandler( EDA_3D_VIEWER_FRAME::onUpdateViewportsCb ),
|
||||||
|
nullptr, this );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -183,6 +200,15 @@ EDA_3D_VIEWER_FRAME::~EDA_3D_VIEWER_FRAME()
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Prj().GetProjectFile().m_Viewports3D = GetUserViewports();
|
||||||
|
|
||||||
|
m_cbViewports->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED,
|
||||||
|
wxCommandEventHandler( EDA_3D_VIEWER_FRAME::onViewportChanged ),
|
||||||
|
nullptr, this );
|
||||||
|
m_cbViewports->Disconnect( wxEVT_UPDATE_UI,
|
||||||
|
wxUpdateUIEventHandler( EDA_3D_VIEWER_FRAME::onUpdateViewportsCb ),
|
||||||
|
nullptr, this );
|
||||||
|
|
||||||
m_canvas->SetEventDispatcher( nullptr );
|
m_canvas->SetEventDispatcher( nullptr );
|
||||||
|
|
||||||
m_auimgr.UnInit();
|
m_auimgr.UnInit();
|
||||||
|
@ -255,6 +281,45 @@ void EDA_3D_VIEWER_FRAME::setupUIConditions()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool EDA_3D_VIEWER_FRAME::TryBefore( wxEvent& aEvent )
|
||||||
|
{
|
||||||
|
static bool s_viewportSwitcherShown = false;
|
||||||
|
|
||||||
|
#ifdef __WXMAC__
|
||||||
|
wxKeyCode viewSwitchKey = WXK_ALT;
|
||||||
|
#else
|
||||||
|
wxKeyCode viewSwitchKey = WXK_WINDOWS_LEFT;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if( aEvent.GetEventType() != wxEVT_CHAR && aEvent.GetEventType() != wxEVT_CHAR_HOOK )
|
||||||
|
return wxFrame::TryBefore( aEvent );
|
||||||
|
|
||||||
|
if( !s_viewportSwitcherShown && wxGetKeyState( viewSwitchKey ) && wxGetKeyState( WXK_TAB ) )
|
||||||
|
{
|
||||||
|
if( this->IsActive() )
|
||||||
|
{
|
||||||
|
if( m_viewportMRU.size() > 0 )
|
||||||
|
{
|
||||||
|
EDA_VIEW_SWITCHER switcher( this, m_viewportMRU, viewSwitchKey );
|
||||||
|
|
||||||
|
s_viewportSwitcherShown = true;
|
||||||
|
switcher.ShowModal();
|
||||||
|
s_viewportSwitcherShown = false;
|
||||||
|
|
||||||
|
int idx = switcher.GetSelection();
|
||||||
|
|
||||||
|
if( idx >= 0 && idx < (int) m_viewportMRU.size() )
|
||||||
|
applyViewport( m_viewportMRU[idx] );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return wxFrame::TryBefore( aEvent );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void EDA_3D_VIEWER_FRAME::handleIconizeEvent( wxIconizeEvent& aEvent )
|
void EDA_3D_VIEWER_FRAME::handleIconizeEvent( wxIconizeEvent& aEvent )
|
||||||
{
|
{
|
||||||
KIWAY_PLAYER::handleIconizeEvent( aEvent );
|
KIWAY_PLAYER::handleIconizeEvent( aEvent );
|
||||||
|
@ -369,27 +434,192 @@ void EDA_3D_VIEWER_FRAME::Process_Special_Functions( wxCommandEvent &event )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void EDA_3D_VIEWER_FRAME::OnRenderEngineSelection( wxCommandEvent &event )
|
std::vector<VIEWPORT3D> EDA_3D_VIEWER_FRAME::GetUserViewports() const
|
||||||
{
|
{
|
||||||
RENDER_ENGINE old_engine = m_boardAdapter.m_Cfg->m_Render.engine;
|
std::vector<VIEWPORT3D> ret;
|
||||||
|
|
||||||
|
for( const std::pair<const wxString, VIEWPORT3D>& pair : m_viewports )
|
||||||
|
ret.emplace_back( pair.second );
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void EDA_3D_VIEWER_FRAME::SetUserViewports( std::vector<VIEWPORT3D>& aViewportList )
|
||||||
|
{
|
||||||
|
m_viewports.clear();
|
||||||
|
|
||||||
|
for( const VIEWPORT3D& viewport : aViewportList )
|
||||||
|
{
|
||||||
|
if( m_viewports.count( viewport.name ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
m_viewports[viewport.name] = viewport;
|
||||||
|
|
||||||
|
m_viewportMRU.Add( viewport.name );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void EDA_3D_VIEWER_FRAME::applyViewport( const wxString& aViewportName )
|
||||||
|
{
|
||||||
|
int idx = m_cbViewports->FindString( aViewportName );
|
||||||
|
|
||||||
|
if( idx >= 0 && m_cbViewports->GetSelection() != idx )
|
||||||
|
{
|
||||||
|
m_cbViewports->SetSelection( idx );
|
||||||
|
m_lastSelectedViewport = static_cast<VIEWPORT3D*>( m_cbViewports->GetClientData( idx ) );
|
||||||
|
|
||||||
|
m_currentCamera.SetViewMatrix( m_lastSelectedViewport->matrix );
|
||||||
|
|
||||||
|
if( m_boardAdapter.m_Cfg->m_Render.engine == RENDER_ENGINE::OPENGL )
|
||||||
|
m_canvas->Request_refresh();
|
||||||
|
else
|
||||||
|
m_canvas->RenderRaytracingRequest();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_cbViewports->SetSelection( -1 ); // separator
|
||||||
|
m_lastSelectedViewport = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void EDA_3D_VIEWER_FRAME::onViewportChanged( wxCommandEvent& aEvent )
|
||||||
|
{
|
||||||
|
int count = m_cbViewports->GetCount();
|
||||||
|
int index = m_cbViewports->GetSelection();
|
||||||
|
|
||||||
|
if( index >= 0 && index < count - 3 )
|
||||||
|
{
|
||||||
|
VIEWPORT3D* viewport = static_cast<VIEWPORT3D*>( m_cbViewports->GetClientData( index ) );
|
||||||
|
|
||||||
|
wxCHECK( viewport, /* void */ );
|
||||||
|
|
||||||
|
applyViewport( viewport->name );
|
||||||
|
|
||||||
|
if( !viewport->name.IsEmpty() )
|
||||||
|
{
|
||||||
|
m_viewportMRU.Remove( viewport->name );
|
||||||
|
m_viewportMRU.Insert( viewport->name, 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( index == count - 2 )
|
||||||
|
{
|
||||||
|
// Save current state to new preset
|
||||||
|
wxString name;
|
||||||
|
|
||||||
|
wxTextEntryDialog dlg( this, _( "Viewport name:" ), _( "Save Viewport" ), name );
|
||||||
|
|
||||||
|
if( dlg.ShowModal() != wxID_OK )
|
||||||
|
{
|
||||||
|
if( m_lastSelectedViewport )
|
||||||
|
m_cbViewports->SetStringSelection( m_lastSelectedViewport->name );
|
||||||
|
else
|
||||||
|
m_cbViewports->SetSelection( -1 );
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
name = dlg.GetValue();
|
||||||
|
bool exists = m_viewports.count( name );
|
||||||
|
|
||||||
|
if( !exists )
|
||||||
|
{
|
||||||
|
m_viewports[name] = VIEWPORT3D( name, m_currentCamera.GetViewMatrix() );
|
||||||
|
|
||||||
|
index = m_cbViewports->Insert( name, index-1, static_cast<void*>( &m_viewports[name] ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
index = m_cbViewports->FindString( name );
|
||||||
|
m_viewportMRU.Remove( name );
|
||||||
|
}
|
||||||
|
|
||||||
|
m_cbViewports->SetSelection( index );
|
||||||
|
m_viewportMRU.Insert( name, 0 );
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if( index == count - 1 )
|
||||||
|
{
|
||||||
|
// Delete an existing viewport
|
||||||
|
wxArrayString headers;
|
||||||
|
std::vector<wxArrayString> items;
|
||||||
|
|
||||||
|
headers.Add( _( "Viewports" ) );
|
||||||
|
|
||||||
|
for( std::pair<const wxString, VIEWPORT3D>& pair : m_viewports )
|
||||||
|
{
|
||||||
|
wxArrayString item;
|
||||||
|
item.Add( pair.first );
|
||||||
|
items.emplace_back( item );
|
||||||
|
}
|
||||||
|
|
||||||
|
EDA_LIST_DIALOG dlg( this, _( "Delete Viewport" ), headers, items );
|
||||||
|
dlg.SetListLabel( _( "Select viewport:" ) );
|
||||||
|
|
||||||
|
if( dlg.ShowModal() == wxID_OK )
|
||||||
|
{
|
||||||
|
wxString viewportName = dlg.GetTextSelection();
|
||||||
|
int idx = m_cbViewports->FindString( viewportName );
|
||||||
|
|
||||||
|
if( idx != wxNOT_FOUND )
|
||||||
|
{
|
||||||
|
m_viewports.erase( viewportName );
|
||||||
|
m_cbViewports->Delete( idx );
|
||||||
|
m_viewportMRU.Remove( viewportName );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( m_lastSelectedViewport )
|
||||||
|
m_cbViewports->SetStringSelection( m_lastSelectedViewport->name );
|
||||||
|
else
|
||||||
|
m_cbViewports->SetSelection( -1 );
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
passOnFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void EDA_3D_VIEWER_FRAME::onUpdateViewportsCb( wxUpdateUIEvent& aEvent )
|
||||||
|
{
|
||||||
|
int count = m_cbViewports->GetCount();
|
||||||
|
int index = m_cbViewports->GetSelection();
|
||||||
|
|
||||||
|
if( index >= 0 && index < count - 3 )
|
||||||
|
{
|
||||||
|
VIEWPORT3D* viewport = static_cast<VIEWPORT3D*>( m_cbViewports->GetClientData( index ) );
|
||||||
|
|
||||||
|
wxCHECK( viewport, /* void */ );
|
||||||
|
|
||||||
|
if( m_currentCamera.GetViewMatrix() != viewport->matrix )
|
||||||
|
m_cbViewports->SetSelection( -1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void EDA_3D_VIEWER_FRAME::onRenderEngineSelection( wxCommandEvent &event )
|
||||||
|
{
|
||||||
|
RENDER_ENGINE& engine = m_boardAdapter.m_Cfg->m_Render.engine;
|
||||||
|
RENDER_ENGINE old_engine = engine;
|
||||||
|
|
||||||
if( old_engine == RENDER_ENGINE::OPENGL )
|
if( old_engine == RENDER_ENGINE::OPENGL )
|
||||||
m_boardAdapter.m_Cfg->m_Render.engine = RENDER_ENGINE::RAYTRACING;
|
engine = RENDER_ENGINE::RAYTRACING;
|
||||||
else
|
else
|
||||||
m_boardAdapter.m_Cfg->m_Render.engine = RENDER_ENGINE::OPENGL;
|
engine = RENDER_ENGINE::OPENGL;
|
||||||
|
|
||||||
wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::OnRenderEngineSelection type %s " ),
|
wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::OnRenderEngineSelection type %s " ),
|
||||||
m_boardAdapter.m_Cfg->m_Render.engine == RENDER_ENGINE::RAYTRACING ?
|
engine == RENDER_ENGINE::RAYTRACING ? wxT( "raytracing" ) : wxT( "realtime" ) );
|
||||||
wxT( "raytracing" )
|
|
||||||
:
|
|
||||||
wxT( "realtime" ) );
|
|
||||||
|
|
||||||
if( old_engine != m_boardAdapter.m_Cfg->m_Render.engine )
|
if( old_engine != engine )
|
||||||
RenderEngineChanged();
|
RenderEngineChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void EDA_3D_VIEWER_FRAME::OnDisableRayTracing( wxCommandEvent& aEvent )
|
void EDA_3D_VIEWER_FRAME::onDisableRayTracing( wxCommandEvent& aEvent )
|
||||||
{
|
{
|
||||||
wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::%s disabling ray tracing." ),
|
wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::%s disabling ray tracing." ),
|
||||||
__WXFUNCTION__ );
|
__WXFUNCTION__ );
|
||||||
|
@ -435,6 +665,13 @@ void EDA_3D_VIEWER_FRAME::OnSetFocus( wxFocusEvent& aEvent )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void EDA_3D_VIEWER_FRAME::passOnFocus()
|
||||||
|
{
|
||||||
|
if( m_canvas )
|
||||||
|
m_canvas->SetFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void EDA_3D_VIEWER_FRAME::LoadSettings( APP_SETTINGS_BASE *aCfg )
|
void EDA_3D_VIEWER_FRAME::LoadSettings( APP_SETTINGS_BASE *aCfg )
|
||||||
{
|
{
|
||||||
EDA_BASE_FRAME::LoadSettings( aCfg );
|
EDA_BASE_FRAME::LoadSettings( aCfg );
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* Copyright (C) 2015-2016 Mario Luzeiro <mrluzeiro@ua.pt>
|
* Copyright (C) 2015-2016 Mario Luzeiro <mrluzeiro@ua.pt>
|
||||||
* Copyright (C) 2014 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
* Copyright (C) 2014 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||||
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@gmail.com>
|
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@gmail.com>
|
||||||
* Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 1992-2022 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -106,6 +106,9 @@ public:
|
||||||
|
|
||||||
EDA_3D_CANVAS* GetCanvas() { return m_canvas; }
|
EDA_3D_CANVAS* GetCanvas() { return m_canvas; }
|
||||||
|
|
||||||
|
std::vector<VIEWPORT3D> GetUserViewports() const;
|
||||||
|
void SetUserViewports( std::vector<VIEWPORT3D>& aViewportList );
|
||||||
|
|
||||||
void SaveSettings( APP_SETTINGS_BASE* aCfg ) override;
|
void SaveSettings( APP_SETTINGS_BASE* aCfg ) override;
|
||||||
void LoadSettings( APP_SETTINGS_BASE* aCfg ) override;
|
void LoadSettings( APP_SETTINGS_BASE* aCfg ) override;
|
||||||
|
|
||||||
|
@ -122,22 +125,26 @@ protected:
|
||||||
|
|
||||||
void handleIconizeEvent( wxIconizeEvent& aEvent ) override;
|
void handleIconizeEvent( wxIconizeEvent& aEvent ) override;
|
||||||
|
|
||||||
|
void applyViewport( const wxString& aViewportName );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// Called when user press the File->Exit
|
/// Called when user press the File->Exit
|
||||||
void Exit3DFrame( wxCommandEvent& event );
|
void Exit3DFrame( wxCommandEvent& event );
|
||||||
|
|
||||||
void OnCloseWindow( wxCloseEvent& event );
|
void OnCloseWindow( wxCloseEvent& event );
|
||||||
|
|
||||||
|
bool TryBefore( wxEvent& aEvent ) override;
|
||||||
|
|
||||||
void Process_Special_Functions( wxCommandEvent& event );
|
void Process_Special_Functions( wxCommandEvent& event );
|
||||||
|
|
||||||
void OnRenderEngineSelection( wxCommandEvent& event );
|
void onRenderEngineSelection( wxCommandEvent& event );
|
||||||
void OnDisableRayTracing( wxCommandEvent& aEvent );
|
void onDisableRayTracing( wxCommandEvent& aEvent );
|
||||||
|
void onViewportChanged( wxCommandEvent& aEvent );
|
||||||
|
void onUpdateViewportsCb( wxUpdateUIEvent& aEvent );
|
||||||
|
|
||||||
void OnActivate( wxActivateEvent& event );
|
void OnActivate( wxActivateEvent& event );
|
||||||
|
|
||||||
void OnSetFocus( wxFocusEvent& event );
|
void OnSetFocus( wxFocusEvent& event );
|
||||||
|
void passOnFocus();
|
||||||
void Install3DViewOptionDialog( wxCommandEvent& event );
|
|
||||||
|
|
||||||
void CreateMenuBar();
|
void CreateMenuBar();
|
||||||
void ReCreateMainToolbar();
|
void ReCreateMainToolbar();
|
||||||
|
@ -162,17 +169,24 @@ private:
|
||||||
*/
|
*/
|
||||||
void loadCommonSettings();
|
void loadCommonSettings();
|
||||||
|
|
||||||
wxFileName m_defaultSaveScreenshotFileName;
|
private:
|
||||||
|
wxFileName m_defaultSaveScreenshotFileName;
|
||||||
|
|
||||||
ACTION_TOOLBAR* m_mainToolBar;
|
ACTION_TOOLBAR* m_mainToolBar;
|
||||||
EDA_3D_CANVAS* m_canvas;
|
wxStaticText* m_viewportsLabel;
|
||||||
BOARD_ADAPTER m_boardAdapter;
|
wxChoice* m_cbViewports;
|
||||||
CAMERA& m_currentCamera;
|
EDA_3D_CANVAS* m_canvas;
|
||||||
TRACK_BALL m_trackBallCamera;
|
BOARD_ADAPTER m_boardAdapter;
|
||||||
|
CAMERA& m_currentCamera;
|
||||||
|
TRACK_BALL m_trackBallCamera;
|
||||||
|
|
||||||
bool m_disable_ray_tracing;
|
bool m_disable_ray_tracing;
|
||||||
|
|
||||||
NL_3D_VIEWER_PLUGIN* m_spaceMouse;
|
NL_3D_VIEWER_PLUGIN* m_spaceMouse;
|
||||||
|
|
||||||
|
std::map<wxString, VIEWPORT3D> m_viewports;
|
||||||
|
VIEWPORT3D* m_lastSelectedViewport;
|
||||||
|
wxArrayString m_viewportMRU;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trace mask used to enable or disable the trace output of this class.
|
* Trace mask used to enable or disable the trace output of this class.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2020 Jon Evans <jon@craftyjon.com>
|
* Copyright (C) 2020 Jon Evans <jon@craftyjon.com>
|
||||||
* Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2020-2022 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify it
|
* 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
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
#include <plugins/3dapi/xv3d_types.h>
|
#include <plugins/3dapi/xv3d_types.h>
|
||||||
#include <settings/app_settings.h>
|
#include <settings/app_settings.h>
|
||||||
#include <settings/parameters.h>
|
#include <settings/parameters.h>
|
||||||
|
#include "render_settings.h"
|
||||||
|
|
||||||
class EDA_3D_VIEWER_SETTINGS : public APP_SETTINGS_BASE
|
class EDA_3D_VIEWER_SETTINGS : public APP_SETTINGS_BASE
|
||||||
{
|
{
|
||||||
|
|
|
@ -11,6 +11,7 @@ include_directories(
|
||||||
3d_viewer
|
3d_viewer
|
||||||
${CMAKE_SOURCE_DIR}
|
${CMAKE_SOURCE_DIR}
|
||||||
${CMAKE_SOURCE_DIR}/include/gal/opengl
|
${CMAKE_SOURCE_DIR}/include/gal/opengl
|
||||||
|
${CMAKE_SOURCE_DIR}/common/dialogs
|
||||||
${INC_AFTER}
|
${INC_AFTER}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2020 Jon Evans <jon@craftyjon.com>
|
* Copyright (C) 2020 Jon Evans <jon@craftyjon.com>
|
||||||
* Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2020-2022 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify it
|
* 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
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
@ -187,6 +187,118 @@ void PARAM_VIEWPORT::jsonToViewports( const nlohmann::json& aJson )
|
||||||
if( viewport.contains( "h" ) )
|
if( viewport.contains( "h" ) )
|
||||||
v.rect.SetHeight( viewport.at( "h" ).get<double>() );
|
v.rect.SetHeight( viewport.at( "h" ).get<double>() );
|
||||||
|
|
||||||
|
m_viewports->emplace_back( v );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PARAM_VIEWPORT3D::PARAM_VIEWPORT3D( const std::string& aPath,
|
||||||
|
std::vector<VIEWPORT3D>* aViewportList ) :
|
||||||
|
PARAM_LAMBDA<nlohmann::json>( aPath,
|
||||||
|
std::bind( &PARAM_VIEWPORT3D::viewportsToJson, this ),
|
||||||
|
std::bind( &PARAM_VIEWPORT3D::jsonToViewports, this, _1 ),
|
||||||
|
{} ),
|
||||||
|
m_viewports( aViewportList )
|
||||||
|
{
|
||||||
|
wxASSERT( aViewportList );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
nlohmann::json PARAM_VIEWPORT3D::viewportsToJson()
|
||||||
|
{
|
||||||
|
nlohmann::json ret = nlohmann::json::array();
|
||||||
|
|
||||||
|
for( const VIEWPORT3D& viewport : *m_viewports )
|
||||||
|
{
|
||||||
|
nlohmann::json js = {
|
||||||
|
{ "name", viewport.name },
|
||||||
|
{ "xx", viewport.matrix[0].x },
|
||||||
|
{ "xy", viewport.matrix[0].y },
|
||||||
|
{ "xz", viewport.matrix[0].z },
|
||||||
|
{ "xw", viewport.matrix[0].w },
|
||||||
|
{ "yx", viewport.matrix[1].x },
|
||||||
|
{ "yy", viewport.matrix[1].y },
|
||||||
|
{ "yz", viewport.matrix[1].z },
|
||||||
|
{ "yw", viewport.matrix[1].w },
|
||||||
|
{ "zx", viewport.matrix[2].x },
|
||||||
|
{ "zy", viewport.matrix[2].y },
|
||||||
|
{ "zz", viewport.matrix[2].z },
|
||||||
|
{ "zw", viewport.matrix[2].w },
|
||||||
|
{ "wx", viewport.matrix[3].x },
|
||||||
|
{ "wy", viewport.matrix[3].y },
|
||||||
|
{ "wz", viewport.matrix[3].z },
|
||||||
|
{ "ww", viewport.matrix[3].w }
|
||||||
|
};
|
||||||
|
|
||||||
|
ret.push_back( js );
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PARAM_VIEWPORT3D::jsonToViewports( const nlohmann::json& aJson )
|
||||||
|
{
|
||||||
|
if( aJson.empty() || !aJson.is_array() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_viewports->clear();
|
||||||
|
|
||||||
|
for( const nlohmann::json& viewport : aJson )
|
||||||
|
{
|
||||||
|
if( viewport.contains( "name" ) )
|
||||||
|
{
|
||||||
|
VIEWPORT3D v( viewport.at( "name" ).get<wxString>() );
|
||||||
|
|
||||||
|
if( viewport.contains( "xx" ) )
|
||||||
|
v.matrix[0].x = viewport.at( "xx" ).get<double>();
|
||||||
|
|
||||||
|
if( viewport.contains( "xy" ) )
|
||||||
|
v.matrix[0].y = viewport.at( "xy" ).get<double>();
|
||||||
|
|
||||||
|
if( viewport.contains( "xz" ) )
|
||||||
|
v.matrix[0].z = viewport.at( "xz" ).get<double>();
|
||||||
|
|
||||||
|
if( viewport.contains( "xw" ) )
|
||||||
|
v.matrix[0].w = viewport.at( "xw" ).get<double>();
|
||||||
|
|
||||||
|
if( viewport.contains( "yx" ) )
|
||||||
|
v.matrix[1].x = viewport.at( "yx" ).get<double>();
|
||||||
|
|
||||||
|
if( viewport.contains( "yy" ) )
|
||||||
|
v.matrix[1].y = viewport.at( "yy" ).get<double>();
|
||||||
|
|
||||||
|
if( viewport.contains( "yz" ) )
|
||||||
|
v.matrix[1].z = viewport.at( "yz" ).get<double>();
|
||||||
|
|
||||||
|
if( viewport.contains( "yw" ) )
|
||||||
|
v.matrix[1].w = viewport.at( "yw" ).get<double>();
|
||||||
|
|
||||||
|
if( viewport.contains( "zx" ) )
|
||||||
|
v.matrix[2].x = viewport.at( "zx" ).get<double>();
|
||||||
|
|
||||||
|
if( viewport.contains( "zy" ) )
|
||||||
|
v.matrix[2].y = viewport.at( "zy" ).get<double>();
|
||||||
|
|
||||||
|
if( viewport.contains( "zz" ) )
|
||||||
|
v.matrix[2].z = viewport.at( "zz" ).get<double>();
|
||||||
|
|
||||||
|
if( viewport.contains( "zw" ) )
|
||||||
|
v.matrix[2].w = viewport.at( "zw" ).get<double>();
|
||||||
|
|
||||||
|
if( viewport.contains( "wx" ) )
|
||||||
|
v.matrix[3].x = viewport.at( "wx" ).get<double>();
|
||||||
|
|
||||||
|
if( viewport.contains( "wy" ) )
|
||||||
|
v.matrix[3].y = viewport.at( "wy" ).get<double>();
|
||||||
|
|
||||||
|
if( viewport.contains( "wz" ) )
|
||||||
|
v.matrix[3].z = viewport.at( "wz" ).get<double>();
|
||||||
|
|
||||||
|
if( viewport.contains( "ww" ) )
|
||||||
|
v.matrix[3].w = viewport.at( "ww" ).get<double>();
|
||||||
|
|
||||||
m_viewports->emplace_back( v );
|
m_viewports->emplace_back( v );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2020 CERN
|
* Copyright (C) 2020 CERN
|
||||||
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2021-2022 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
* @author Jon Evans <jon@craftyjon.com>
|
* @author Jon Evans <jon@craftyjon.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify it
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
|
@ -111,6 +111,8 @@ PROJECT_FILE::PROJECT_FILE( const wxString& aFullPath ) :
|
||||||
m_params.emplace_back( new PARAM_LAYER_PRESET( "board.layer_presets", &m_LayerPresets ) );
|
m_params.emplace_back( new PARAM_LAYER_PRESET( "board.layer_presets", &m_LayerPresets ) );
|
||||||
|
|
||||||
m_params.emplace_back( new PARAM_VIEWPORT( "board.viewports", &m_Viewports ) );
|
m_params.emplace_back( new PARAM_VIEWPORT( "board.viewports", &m_Viewports ) );
|
||||||
|
|
||||||
|
m_params.emplace_back( new PARAM_VIEWPORT3D( "board.3dviewports", &m_Viewports3D ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2020 Jon Evans <jon@craftyjon.com>
|
* Copyright (C) 2020 Jon Evans <jon@craftyjon.com>
|
||||||
* Copyright (C) 2020-2021 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2020-2022 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify it
|
* 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
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
@ -27,6 +27,7 @@
|
||||||
// Can be removed by refactoring PARAM_LAYER_PRESET
|
// Can be removed by refactoring PARAM_LAYER_PRESET
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
#include <math/box2.h>
|
#include <math/box2.h>
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This file contains data structures that are saved in the project file or project local settings
|
* This file contains data structures that are saved in the project file or project local settings
|
||||||
|
@ -212,4 +213,35 @@ private:
|
||||||
std::vector<VIEWPORT>* m_viewports;
|
std::vector<VIEWPORT>* m_viewports;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct VIEWPORT3D
|
||||||
|
{
|
||||||
|
VIEWPORT3D( const wxString& aName = wxEmptyString ) :
|
||||||
|
name( aName )
|
||||||
|
{ }
|
||||||
|
|
||||||
|
VIEWPORT3D( const wxString& aName, glm::mat4 aViewMatrix ) :
|
||||||
|
name( aName ),
|
||||||
|
matrix( aViewMatrix )
|
||||||
|
{ }
|
||||||
|
|
||||||
|
wxString name;
|
||||||
|
glm::mat4 matrix;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class PARAM_VIEWPORT3D : public PARAM_LAMBDA<nlohmann::json>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PARAM_VIEWPORT3D( const std::string& aPath, std::vector<VIEWPORT3D>* aViewportList );
|
||||||
|
|
||||||
|
private:
|
||||||
|
nlohmann::json viewportsToJson();
|
||||||
|
|
||||||
|
void jsonToViewports( const nlohmann::json & aJson );
|
||||||
|
|
||||||
|
std::vector<VIEWPORT3D>* m_viewports;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif // KICAD_BOARD_PROJECT_SETTINGS_H
|
#endif // KICAD_BOARD_PROJECT_SETTINGS_H
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2020 CERN
|
* Copyright (C) 2020 CERN
|
||||||
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2021-2022 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
* @author Jon Evans <jon@craftyjon.com>
|
* @author Jon Evans <jon@craftyjon.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify it
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
|
@ -170,6 +170,7 @@ public:
|
||||||
|
|
||||||
std::vector<LAYER_PRESET> m_LayerPresets; /// List of stored layer presets
|
std::vector<LAYER_PRESET> m_LayerPresets; /// List of stored layer presets
|
||||||
std::vector<VIEWPORT> m_Viewports; /// List of stored viewports (pos + zoom)
|
std::vector<VIEWPORT> m_Viewports; /// List of stored viewports (pos + zoom)
|
||||||
|
std::vector<VIEWPORT3D> m_Viewports3D; /// List of stored 3D viewports (view matrixes)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// An list of schematic sheets in this project
|
/// An list of schematic sheets in this project
|
||||||
|
|
|
@ -113,7 +113,7 @@ bool PCB_BASE_EDIT_FRAME::TryBefore( wxEvent& aEvent )
|
||||||
{
|
{
|
||||||
const wxArrayString& mru = m_appearancePanel->GetLayerPresetsMRU();
|
const wxArrayString& mru = m_appearancePanel->GetLayerPresetsMRU();
|
||||||
|
|
||||||
if( mru.size() > 1 )
|
if( mru.size() > 0 )
|
||||||
{
|
{
|
||||||
EDA_VIEW_SWITCHER switcher( this, mru, presetSwitchKey );
|
EDA_VIEW_SWITCHER switcher( this, mru, presetSwitchKey );
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ bool PCB_BASE_EDIT_FRAME::TryBefore( wxEvent& aEvent )
|
||||||
{
|
{
|
||||||
const wxArrayString& mru = m_appearancePanel->GetViewportsMRU();
|
const wxArrayString& mru = m_appearancePanel->GetViewportsMRU();
|
||||||
|
|
||||||
if( mru.size() > 1 )
|
if( mru.size() > 0 )
|
||||||
{
|
{
|
||||||
EDA_VIEW_SWITCHER switcher( this, mru, viewSwitchKey );
|
EDA_VIEW_SWITCHER switcher( this, mru, viewSwitchKey );
|
||||||
|
|
||||||
|
|
|
@ -2720,7 +2720,7 @@ void APPEARANCE_CONTROLS::onViewportChanged( wxCommandEvent& aEvent )
|
||||||
}
|
}
|
||||||
else if( index == count - 1 )
|
else if( index == count - 1 )
|
||||||
{
|
{
|
||||||
// Delete an existing preset
|
// Delete an existing viewport
|
||||||
wxArrayString headers;
|
wxArrayString headers;
|
||||||
std::vector<wxArrayString> items;
|
std::vector<wxArrayString> items;
|
||||||
|
|
||||||
|
@ -2743,7 +2743,7 @@ void APPEARANCE_CONTROLS::onViewportChanged( wxCommandEvent& aEvent )
|
||||||
|
|
||||||
if( idx != wxNOT_FOUND )
|
if( idx != wxNOT_FOUND )
|
||||||
{
|
{
|
||||||
m_layerPresets.erase( viewportName );
|
m_viewports.erase( viewportName );
|
||||||
m_cbViewports->Delete( idx );
|
m_cbViewports->Delete( idx );
|
||||||
m_viewportMRU.Remove( viewportName );
|
m_viewportMRU.Remove( viewportName );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue