250 lines
5.9 KiB
C++
250 lines
5.9 KiB
C++
/*
|
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
*
|
|
* Copyright (C) 2011 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
|
* Copyright (C) 2011 KiCad Developers, see change_log.txt for contributors.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, you may find one here:
|
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
* or you may search the http://www.gnu.org website for the version 2 license,
|
|
* or you may write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
// wxWidgets imports
|
|
#include <wx/wx.h>
|
|
#include <wx/graphics.h>
|
|
#include <wx/timer.h>
|
|
#include <wx/event.h>
|
|
#include <wx/wxprec.h>
|
|
#include <wx/cmdline.h>
|
|
|
|
// Graphics Abstraction Layer imports
|
|
#include <gal/common/definitions.h>
|
|
#include <gal/common/graphics_abstraction_layer.h>
|
|
#include <gal/opengl/opengl_gal.h>
|
|
#include <gal/common/stroke_font.h>
|
|
#include <gal/common/color4d.h>
|
|
#include <gal/font/newstroke_font.h>
|
|
|
|
#include <math/vector2d.h>
|
|
#include <math/matrix3x3.h>
|
|
|
|
#include <sweet_editor_panel.h>
|
|
|
|
#define screenSizeX 640
|
|
#define screenSizeY 480
|
|
|
|
|
|
|
|
/**
|
|
* Class SWEET_EDIT
|
|
* implements an editor for SWEET, including support for inheritance and
|
|
* LIB_TABLE configuration.
|
|
*/
|
|
class SWEET_FRAME: public wxFrame
|
|
{
|
|
public:
|
|
// @brief Constructor
|
|
SWEET_FRAME( wxWindow* parent, wxWindowID id, const wxString& title,
|
|
const wxPoint& pos, const wxSize& size );
|
|
|
|
// @brief Destructor
|
|
~SWEET_FRAME();
|
|
|
|
private:
|
|
bool m_isReady;
|
|
bool m_isPanning;
|
|
|
|
SCH::CANVAS* m_gal;
|
|
|
|
wxSize m_screenSize;
|
|
VECTOR2D m_worldSize;
|
|
VECTOR2D m_startMousePoint;
|
|
VECTOR2D m_startLookAtPoint;
|
|
|
|
/*
|
|
double m_alpha;
|
|
|
|
MATRIX3x3D m_startMatrix;
|
|
|
|
STROKE_FONT m_font;
|
|
*/
|
|
|
|
// Event handlers
|
|
void OnMotion( wxMouseEvent& event );
|
|
void OnMouseWheel( wxMouseEvent& event );
|
|
void OnRightDown( wxMouseEvent& event );
|
|
void OnRightUp( wxMouseEvent& event );
|
|
// void OnRedraw( wxCommandEvent& event );
|
|
};
|
|
|
|
|
|
SWEET_FRAME::SWEET_FRAME( wxWindow* parent, wxWindowID id, const wxString& title,
|
|
const wxPoint& pos, const wxSize& size ) :
|
|
wxFrame( parent, id, title, pos, size ),
|
|
m_screenSize( size.x, size.y )
|
|
{
|
|
m_isPanning = false;
|
|
|
|
SWEET_EDITOR_PANEL* panel =
|
|
new SWEET_EDITOR_PANEL( this, wxID_ANY, wxPoint( 0, 0 ), wxSize( -1, -1 ), 0 );
|
|
|
|
m_gal = (SCH::CANVAS*) panel->FindWindowByName( wxT( "GLCanvas" ), panel );
|
|
|
|
wxASSERT( m_gal );
|
|
|
|
m_gal->SetMouseListener( this );
|
|
|
|
Connect( wxEVT_MOTION, wxMouseEventHandler( SWEET_FRAME::OnMotion ) );
|
|
Connect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( SWEET_FRAME::OnMouseWheel ) );
|
|
Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( SWEET_FRAME::OnRightDown ) );
|
|
Connect( wxEVT_RIGHT_UP, wxMouseEventHandler( SWEET_FRAME::OnRightUp ) );
|
|
}
|
|
|
|
|
|
SWEET_FRAME::~SWEET_FRAME()
|
|
{
|
|
delete m_gal;
|
|
}
|
|
|
|
|
|
void SWEET_FRAME::OnMotion( wxMouseEvent& event )
|
|
{
|
|
VECTOR2D mousePoint( event.GetX(), event.GetY() );
|
|
|
|
if( event.Dragging() )
|
|
{
|
|
if( m_isPanning )
|
|
{
|
|
MATRIX3x3D matrix = m_gal->GetWorldScreenMatrix().Inverse();
|
|
VECTOR2D delta = matrix.GetScale().x * ( m_startMousePoint - mousePoint );
|
|
|
|
m_gal->SetLookAtPoint( m_startLookAtPoint + delta );
|
|
|
|
m_gal->PaintScene();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_gal->DrawCursor( mousePoint );
|
|
}
|
|
}
|
|
|
|
|
|
void SWEET_FRAME::OnMouseWheel( wxMouseEvent& event )
|
|
{
|
|
double zoomScale = ( event.GetWheelRotation() > 0.0 ) ? 1.1 : 0.9;
|
|
|
|
m_gal->SetZoomFactor( m_gal->GetZoomFactor() * zoomScale );
|
|
m_gal->PaintScene();
|
|
}
|
|
|
|
|
|
void SWEET_FRAME::OnRightDown( wxMouseEvent& event )
|
|
{
|
|
m_isPanning = true;
|
|
m_startMousePoint = VECTOR2D( event.GetX(), event.GetY() );
|
|
m_startLookAtPoint = m_gal->GetLookAtPoint();
|
|
}
|
|
|
|
|
|
void SWEET_FRAME::OnRightUp( wxMouseEvent& event )
|
|
{
|
|
m_isPanning = false;
|
|
}
|
|
|
|
|
|
static const wxCmdLineEntryDesc g_cmdLineDesc[] = {
|
|
{
|
|
wxCMD_LINE_PARAM,
|
|
NULL,
|
|
NULL,
|
|
|
|
#if wxCHECK_VERSION( 2, 9, 0 )
|
|
"filename of libtable",
|
|
#else
|
|
wxT( "filename of libtable" ),
|
|
#endif
|
|
wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE
|
|
},
|
|
{ wxCMD_LINE_NONE }
|
|
};
|
|
|
|
|
|
class GAL_TEST_APPLICATION: public wxApp
|
|
{
|
|
public:
|
|
GAL_TEST_APPLICATION();
|
|
|
|
private:
|
|
virtual bool OnInit();
|
|
virtual int OnExit();
|
|
virtual int OnRun();
|
|
virtual void OnInitCmdLine( wxCmdLineParser& aParser );
|
|
virtual bool OnCmdLineParsed( wxCmdLineParser& aParser );
|
|
};
|
|
|
|
|
|
GAL_TEST_APPLICATION::GAL_TEST_APPLICATION()
|
|
{
|
|
}
|
|
|
|
|
|
bool GAL_TEST_APPLICATION::OnInit()
|
|
{
|
|
if ( !wxApp::OnInit() )
|
|
return false;
|
|
|
|
SWEET_FRAME* frame = new SWEET_FRAME( (wxFrame *) NULL,
|
|
-1, wxT( "SWEET Editor" ),
|
|
wxPoint( screenSizeX + 10, 0 ),
|
|
wxSize( screenSizeX, screenSizeY ) );
|
|
|
|
frame->Show( true );
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
int GAL_TEST_APPLICATION::OnExit()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
int GAL_TEST_APPLICATION::OnRun()
|
|
{
|
|
int exitcode = wxApp::OnRun();
|
|
return exitcode;
|
|
}
|
|
|
|
|
|
void GAL_TEST_APPLICATION::OnInitCmdLine( wxCmdLineParser& parser )
|
|
{
|
|
parser.SetDesc( g_cmdLineDesc );
|
|
parser.SetSwitchChars( wxT( "-" ) );
|
|
}
|
|
|
|
|
|
bool GAL_TEST_APPLICATION::OnCmdLineParsed( wxCmdLineParser& parser )
|
|
{
|
|
return true;
|
|
}
|
|
|
|
|
|
DECLARE_APP( GAL_TEST_APPLICATION )
|
|
|
|
IMPLEMENT_APP( GAL_TEST_APPLICATION )
|