more layer_widget work

This commit is contained in:
dickelbeck 2010-01-16 06:22:24 +00:00
parent 8789ca5f1d
commit e7a49c838a
4 changed files with 444 additions and 138 deletions

View File

@ -36,16 +36,27 @@ LAYER_PANEL_BASE::LAYER_PANEL_BASE( wxWindow* parent, wxWindowID id, const wxPoi
m_LayerPanel->Layout(); m_LayerPanel->Layout();
bSizer3->Fit( m_LayerPanel ); bSizer3->Fit( m_LayerPanel );
m_notebook->AddPage( m_LayerPanel, _("Layers"), true ); m_notebook->AddPage( m_LayerPanel, _("Layers"), true );
m_Page1Panel = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); m_RenderingPanel = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_Page1Panel->SetToolTip( _("Part depiction and visibility") ); m_RenderingPanel->SetToolTip( _("Part depiction and visibility") );
wxBoxSizer* bSizer4; wxBoxSizer* bSizer4;
bSizer4 = new wxBoxSizer( wxVERTICAL ); bSizer4 = new wxBoxSizer( wxVERTICAL );
m_Page1Panel->SetSizer( bSizer4 ); m_RenderScrolledWindow = new wxScrolledWindow( m_RenderingPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL );
m_Page1Panel->Layout(); m_RenderScrolledWindow->SetScrollRate( 5, 5 );
bSizer4->Fit( m_Page1Panel ); m_RenderFlexGridSizer = new wxFlexGridSizer( 0, 2, 1, 3 );
m_notebook->AddPage( m_Page1Panel, _("Rendering"), false ); m_RenderFlexGridSizer->SetFlexibleDirection( wxHORIZONTAL );
m_RenderFlexGridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_RenderScrolledWindow->SetSizer( m_RenderFlexGridSizer );
m_RenderScrolledWindow->Layout();
m_RenderFlexGridSizer->Fit( m_RenderScrolledWindow );
bSizer4->Add( m_RenderScrolledWindow, 1, wxALL|wxEXPAND, 5 );
m_RenderingPanel->SetSizer( bSizer4 );
m_RenderingPanel->Layout();
bSizer4->Fit( m_RenderingPanel );
m_notebook->AddPage( m_RenderingPanel, _("Rendering"), false );
boxSizer->Add( m_notebook, 1, wxEXPAND | wxALL, 5 ); boxSizer->Add( m_notebook, 1, wxEXPAND | wxALL, 5 );
@ -53,7 +64,6 @@ LAYER_PANEL_BASE::LAYER_PANEL_BASE( wxWindow* parent, wxWindowID id, const wxPoi
this->Layout(); this->Layout();
// Connect Events // Connect Events
m_LayerScrolledWindow->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( LAYER_PANEL_BASE::OnLeftDblClickLayers ), NULL, this );
m_LayerScrolledWindow->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( LAYER_PANEL_BASE::OnLeftDownLayers ), NULL, this ); m_LayerScrolledWindow->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( LAYER_PANEL_BASE::OnLeftDownLayers ), NULL, this );
m_LayerScrolledWindow->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( LAYER_PANEL_BASE::OnRightDownLayers ), NULL, this ); m_LayerScrolledWindow->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( LAYER_PANEL_BASE::OnRightDownLayers ), NULL, this );
} }
@ -61,7 +71,6 @@ LAYER_PANEL_BASE::LAYER_PANEL_BASE( wxWindow* parent, wxWindowID id, const wxPoi
LAYER_PANEL_BASE::~LAYER_PANEL_BASE() LAYER_PANEL_BASE::~LAYER_PANEL_BASE()
{ {
// Disconnect Events // Disconnect Events
m_LayerScrolledWindow->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( LAYER_PANEL_BASE::OnLeftDblClickLayers ), NULL, this );
m_LayerScrolledWindow->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( LAYER_PANEL_BASE::OnLeftDownLayers ), NULL, this ); m_LayerScrolledWindow->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( LAYER_PANEL_BASE::OnLeftDownLayers ), NULL, this );
m_LayerScrolledWindow->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( LAYER_PANEL_BASE::OnRightDownLayers ), NULL, this ); m_LayerScrolledWindow->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( LAYER_PANEL_BASE::OnRightDownLayers ), NULL, this );
} }

View File

@ -38,10 +38,11 @@ class LAYER_PANEL_BASE : public wxPanel
wxPanel* m_LayerPanel; wxPanel* m_LayerPanel;
wxScrolledWindow* m_LayerScrolledWindow; wxScrolledWindow* m_LayerScrolledWindow;
wxFlexGridSizer* m_LayersFlexGridSizer; wxFlexGridSizer* m_LayersFlexGridSizer;
wxPanel* m_Page1Panel; wxPanel* m_RenderingPanel;
wxScrolledWindow* m_RenderScrolledWindow;
wxFlexGridSizer* m_RenderFlexGridSizer;
// Virtual event handlers, overide them in your derived class // Virtual event handlers, overide them in your derived class
virtual void OnLeftDblClickLayers( wxMouseEvent& event ){ event.Skip(); }
virtual void OnLeftDownLayers( wxMouseEvent& event ){ event.Skip(); } virtual void OnLeftDownLayers( wxMouseEvent& event ){ event.Skip(); }
virtual void OnRightDownLayers( wxMouseEvent& event ){ event.Skip(); } virtual void OnRightDownLayers( wxMouseEvent& event ){ event.Skip(); }

View File

@ -43,13 +43,19 @@
#include "layer_panel_base.h" #include "layer_panel_base.h"
#include "colors.h" #include "colors.h"
#include "pcbstruct.h" // IsValidCopperLayerIndex()
/* no external data knowledge needed or wanted /* no external data knowledge needed or wanted
#include "pcbnew.h" #include "pcbnew.h"
#include "wxPcbStruct.h" #include "wxPcbStruct.h"
*/ */
#define LAYER_COLUMN_COUNT 4 #define LYR_COLUMN_COUNT 4 ///< Layer tab column count
#define RND_COLUMN_COUNT 2 ///< Rendering tab column count
#define ID_SHOW_ALL_COPPERS wxID_HIGHEST
#define ID_SHOW_NO_COPPERS (wxID_HIGHEST+1)
/* XPM */ /* XPM */
@ -96,27 +102,27 @@ static const char * rightarrow_xpm[] = {
/** /**
* Function layerId * Function encodeId
* is here to allow saving a layer index within a control as its wxControl id, * is here to allow saving a layer index within a control as its wxControl id,
* but to do so in a way that all child wxControl ids within a wxWindow are unique, * but to do so in a way that all child wxControl ids within a wxWindow are unique,
* since this is required by Windows. * since this is required by Windows.
* @see getLayerId() * @see getDecodedId()
*/ */
static int layerId( int aColumn, int aLayer ) static int encodeId( int aColumn, int aId )
{ {
int id = aLayer * LAYER_COLUMN_COUNT + aColumn; int id = aId * LYR_COLUMN_COUNT + aColumn;
return id; return id;
} }
/** /**
* Function getLayerId * Function getDecodedId
* decodes \a aControlId to return a layer. * decodes \a aControlId to original un-encoded value.
*/ */
static int getLayerId( int aControlId ) static int getDecodedId( int aControlId )
{ {
int layer = aControlId / LAYER_COLUMN_COUNT; // rounding is OK. int id = aControlId / LYR_COLUMN_COUNT; // rounding is OK.
return layer; return id;
} }
@ -133,25 +139,6 @@ static wxString makeColorTxt( int aColor )
} }
/**
* Struct LAYER_SPEC
* provides all the data needed to add a layer row to a LAYER_WIDGET
*/
struct LAYER_SPEC
{
wxString layerName;
int layer;
int color;
LAYER_SPEC( const wxString& aLayerName, int aLayer, int aColor = 0 )
{
layerName = aLayerName;
layer = aLayer;
color = aColor;
}
};
/** /**
* Class LAYER_WIDGET * Class LAYER_WIDGET
* is abstract and is derived from a wxFormBuilder maintained class called * is abstract and is derived from a wxFormBuilder maintained class called
@ -162,22 +149,46 @@ struct LAYER_SPEC
* within the UI provided here. This widget knows nothing of the client code, meaning * within the UI provided here. This widget knows nothing of the client code, meaning
* it has no knowledge of a BOARD or anything. To use it you must derive from * it has no knowledge of a BOARD or anything. To use it you must derive from
* this class and implement the abstract functions: * this class and implement the abstract functions:
* <p> * <p> void OnLayerColorChange( int aLayer, int aColor );
* void OnColorChange( int aLayer, int aColor ); * <p> bool OnLayerSelect( int aLayer );
* <p> * <p> void OnLayerVisible( int aLayer, bool isVisible );
* bool OnLayerSelect( int aLayer ); * <p> void OnRenderColorChange( int id, int aColor );
* <p> * <p> void OnRenderEnable( int id, bool isEnabled );
* void OnLayerVisible( int aLayer, bool isVisible );
*/ */
class LAYER_WIDGET : public LAYER_PANEL_BASE class LAYER_WIDGET : public LAYER_PANEL_BASE
{ {
public:
/**
* Struct ROW
* provides all the data needed to add a row to a LAYER_WIDGET. This is
* part of the public API for a LAYER_WIDGET.
*/
struct ROW
{
wxString rowName;
int id; // either a layer or
int color; // -1 if none.
bool state; // initial wxCheckBox state
ROW( const wxString& aRowName, int aId, int aColor = 0, bool aState = true )
{
rowName = aRowName;
id = aId;
color = aColor;
state = aState;
}
};
protected:
#define MAX_LAYER_ROWS 64 #define MAX_LAYER_ROWS 64
#define BUTT_SIZE_X 32 #define BUTT_SIZE_X 32
#define BUTT_SIZE_Y 22 #define BUTT_SIZE_Y 22
#define BUTT_VOID 6 #define BUTT_VOID 6
protected:
wxBitmap* m_BlankBitmap; wxBitmap* m_BlankBitmap;
wxBitmap* m_RightArrowBitmap; wxBitmap* m_RightArrowBitmap;
wxSize m_BitmapSize; wxSize m_BitmapSize;
@ -185,8 +196,8 @@ protected:
static wxBitmap makeBitmap( int aColor ) static wxBitmap makeBitmap( int aColor )
{ {
// the bitmap will be 8 pixels smaller than the button, leaving a // the bitmap will be BUTT_VOID*2 pixels smaller than the button, leaving a
// border of 4 pixels on each side. // border of BUTT_VOID pixels on each side.
wxBitmap bitmap( BUTT_SIZE_X - 2 * BUTT_VOID, BUTT_SIZE_Y - 2 * BUTT_VOID ); wxBitmap bitmap( BUTT_SIZE_X - 2 * BUTT_VOID, BUTT_SIZE_Y - 2 * BUTT_VOID );
wxBrush brush; wxBrush brush;
wxMemoryDC iconDC; wxMemoryDC iconDC;
@ -207,13 +218,13 @@ protected:
* Function makeColorButton * Function makeColorButton
* creates a wxBitmapButton and assigns it a solid color and a control ID * creates a wxBitmapButton and assigns it a solid color and a control ID
*/ */
wxBitmapButton* makeColorButton( int aColor, int aID ) wxBitmapButton* makeColorButton( wxWindow* aParent, int aColor, int aID )
{ {
// dynamically make a wxBitMap and brush it with the appropriate color, // dynamically make a wxBitMap and brush it with the appropriate color,
// then create a wxBitmapButton from it. // then create a wxBitmapButton from it.
wxBitmap bitmap = makeBitmap( aColor ); wxBitmap bitmap = makeBitmap( aColor );
wxBitmapButton* ret = new wxBitmapButton( m_LayerScrolledWindow, aID, bitmap, wxBitmapButton* ret = new wxBitmapButton( aParent, aID, bitmap,
wxDefaultPosition, wxSize(BUTT_SIZE_X, BUTT_SIZE_Y), wxBORDER_RAISED ); wxDefaultPosition, wxSize(BUTT_SIZE_X, BUTT_SIZE_Y), wxBORDER_RAISED );
// save the color value in the name, no where else to put it. // save the color value in the name, no where else to put it.
@ -221,7 +232,6 @@ protected:
return ret; return ret;
} }
void OnLeftDownLayers( wxMouseEvent& event ) void OnLeftDownLayers( wxMouseEvent& event )
{ {
int row; int row;
@ -254,8 +264,8 @@ protected:
else else
{ {
// all nested controls on a given row will have their ID encoded with // all nested controls on a given row will have their ID encoded with
// makeLayerId(), and the corresponding decoding is getLayerId() // encodeId(), and the corresponding decoding is getDecodedId()
int layer = getLayerId( eventSource ->GetId() ); int layer = getDecodedId( eventSource ->GetId() );
row = findLayerRow( layer ); row = findLayerRow( layer );
} }
@ -283,10 +293,10 @@ protected:
wxBitmap bm = makeBitmap( newColor ); wxBitmap bm = makeBitmap( newColor );
eventSource->SetBitmapLabel( bm ); eventSource->SetBitmapLabel( bm );
int layer = getLayerId( eventSource->GetId() ); int layer = getDecodedId( eventSource->GetId() );
// tell the client code. // tell the client code.
OnColorChange( layer, newColor ); OnLayerColorChange( layer, newColor );
} }
} }
@ -297,8 +307,48 @@ protected:
*/ */
void OnRightDownLayers( wxMouseEvent& event ) void OnRightDownLayers( wxMouseEvent& event )
{ {
// popup menu wxMenu menu;
printf( "OnRightDownLayers\n" );
// menu text is capitalized:
// http://library.gnome.org/devel/hig-book/2.20/design-text-labels.html.en#layout-capitalization
menu.Append( new wxMenuItem( &menu, ID_SHOW_ALL_COPPERS,
_("Show All Copper Layers") ) );
menu.Append( new wxMenuItem( &menu, ID_SHOW_NO_COPPERS,
_( "Show No Copper Layers" ) ) );
PopupMenu( &menu );
}
void OnPopupSelection( wxCommandEvent& event )
{
int rowCount;
int menuId = event.GetId();
bool visible;
switch( menuId )
{
case ID_SHOW_ALL_COPPERS:
visible = true;
goto L_change_coppers;
case ID_SHOW_NO_COPPERS:
visible = false;
L_change_coppers:
rowCount = GetLayerRowCount();
for( int row=0; row<rowCount; ++row )
{
wxCheckBox* cb = (wxCheckBox*) getLayerComp( row*LYR_COLUMN_COUNT + 3 );
int layer = getDecodedId( cb->GetId() );
if( IsValidCopperLayerIndex( layer ) )
{
cb->SetValue( visible );
OnLayerVisible( layer, visible );
}
}
break;
}
} }
@ -310,23 +360,55 @@ protected:
void OnLayerCheckBox( wxCommandEvent& event ) void OnLayerCheckBox( wxCommandEvent& event )
{ {
wxCheckBox* eventSource = (wxCheckBox*) event.GetEventObject(); wxCheckBox* eventSource = (wxCheckBox*) event.GetEventObject();
int layer = getDecodedId( eventSource->GetId() );
int layer = getLayerId( eventSource->GetId() );
OnLayerVisible( layer, eventSource->IsChecked() ); OnLayerVisible( layer, eventSource->IsChecked() );
} }
void OnMiddleDownRenderColor( wxMouseEvent& event )
{
wxBitmapButton* eventSource = (wxBitmapButton*) event.GetEventObject();
wxString colorTxt = eventSource->GetName();
int oldColor = strtoul( CONV_TO_UTF8(colorTxt), NULL, 0 );
int newColor = DisplayColorFrame( this, oldColor );
if( newColor >= 0 )
{
eventSource->SetName( makeColorTxt( newColor ) );
wxBitmap bm = makeBitmap( newColor );
eventSource->SetBitmapLabel( bm );
int id = getDecodedId( eventSource->GetId() );
// tell the client code.
OnRenderColorChange( id, newColor );
}
}
void OnRenderCheckBox( wxCommandEvent& event )
{
wxCheckBox* eventSource = (wxCheckBox*) event.GetEventObject();
int id = getDecodedId( eventSource->GetId() );
OnRenderEnable( id, eventSource->IsChecked() );
}
/** /**
* Function getLayerComp * Function getLayerComp
* returns the component within the m_LayersFlexGridSizer at aSizerNdx. * returns the component within the m_LayersFlexGridSizer at aSizerNdx or
* NULL if \a aSizerNdx is out of range.
* *
* @param aSizerNdx is the 0 based index into all the wxWindows which have * @param aSizerNdx is the 0 based index into all the wxWindows which have
* been added to the m_LayersFlexGridSizer. * been added to the m_LayersFlexGridSizer.
*/ */
wxWindow* getLayerComp( int aSizerNdx ) wxWindow* getLayerComp( int aSizerNdx )
{ {
if( (unsigned) aSizerNdx < m_LayersFlexGridSizer->GetChildren().GetCount() )
return m_LayersFlexGridSizer->GetChildren()[aSizerNdx]->GetWindow(); return m_LayersFlexGridSizer->GetChildren()[aSizerNdx]->GetWindow();
return NULL;
} }
/** /**
@ -339,12 +421,11 @@ protected:
for( int row=0; row<count; ++row ) for( int row=0; row<count; ++row )
{ {
// column 0 in the layer scroll window has a wxStaticBitmap, get its ID. // column 0 in the layer scroll window has a wxStaticBitmap, get its ID.
wxStaticBitmap* bm = (wxStaticBitmap*) getLayerComp( row * LAYER_COLUMN_COUNT + 0 ); wxStaticBitmap* bm = (wxStaticBitmap*) getLayerComp( row * LYR_COLUMN_COUNT );
if( aLayer == getLayerId( bm->GetId() )) if( aLayer == getDecodedId( bm->GetId() ))
return row; return row;
} }
return -1; return -1;
} }
@ -352,46 +433,94 @@ protected:
* Function insertLayerRow * Function insertLayerRow
* appends or inserts a new row in the layer portion of the widget. * appends or inserts a new row in the layer portion of the widget.
*/ */
void insertLayerRow( int aRow, const LAYER_SPEC& aSpec ) void insertLayerRow( int aRow, const ROW& aSpec )
{ {
int col;
wxASSERT( aRow >= 0 && aRow < MAX_LAYER_ROWS ); wxASSERT( aRow >= 0 && aRow < MAX_LAYER_ROWS );
size_t index = aRow * LAYER_COLUMN_COUNT; size_t index = aRow * LYR_COLUMN_COUNT;
wxSizerFlags flags; wxSizerFlags flags;
flags.Align(wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL); flags.Align(wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL);
// column 0 // column 0
wxStaticBitmap* sbm = new wxStaticBitmap( m_LayerScrolledWindow, layerId( 0, aSpec.layer ), col = 0;
wxStaticBitmap* sbm = new wxStaticBitmap( m_LayerScrolledWindow, encodeId( col, aSpec.id ),
*m_BlankBitmap, wxDefaultPosition, m_BitmapSize ); *m_BlankBitmap, wxDefaultPosition, m_BitmapSize );
sbm->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnLeftDownLayers ), NULL, this ); sbm->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnLeftDownLayers ), NULL, this );
sbm->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnRightDownLayers ), NULL, this ); sbm->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnRightDownLayers ), NULL, this );
m_LayersFlexGridSizer->Insert( index+0, m_LayersFlexGridSizer->Insert( index+col,
new wxSizerItem( sbm, wxSizerFlags().Align( wxALIGN_CENTER_VERTICAL ) ) ); new wxSizerItem( sbm, wxSizerFlags().Align( wxALIGN_CENTER_VERTICAL ) ) );
// column 1 // column 1
wxBitmapButton* bmb = makeColorButton( aSpec.color, layerId( 1, aSpec.layer ) ); col = 1;
wxBitmapButton* bmb = makeColorButton( m_LayerScrolledWindow, aSpec.color, encodeId( col, aSpec.id ) );
bmb->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnLeftDownLayers ), NULL, this ); bmb->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnLeftDownLayers ), NULL, this );
bmb->Connect( wxEVT_MIDDLE_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnMiddleDownLayerColor ), NULL, this ); bmb->Connect( wxEVT_MIDDLE_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnMiddleDownLayerColor ), NULL, this );
bmb->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnRightDownLayers ), NULL, this ); bmb->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnRightDownLayers ), NULL, this );
bmb->SetToolTip( _("Right click to change layer color, left click to select layer" ) ); bmb->SetToolTip( _("Left click to select, middle click for color change, right click for menu" ) );
m_LayersFlexGridSizer->Insert( index+1, m_LayersFlexGridSizer->Insert( index+col, new wxSizerItem( bmb, flags ) );
new wxSizerItem( bmb, flags ) );
// column 2 // column 2
wxStaticText* st = new wxStaticText( m_LayerScrolledWindow, layerId( 2, aSpec.layer ), aSpec.layerName ); col = 2;
wxStaticText* st = new wxStaticText( m_LayerScrolledWindow, encodeId( col, aSpec.id ), aSpec.rowName );
st->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnLeftDownLayers ), NULL, this ); st->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnLeftDownLayers ), NULL, this );
st->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnRightDownLayers ), NULL, this ); st->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnRightDownLayers ), NULL, this );
st->SetToolTip( _( "Click here to select this layer" ) ); st->SetToolTip( _( "Click here to select this layer" ) );
m_LayersFlexGridSizer->Insert( index+2, m_LayersFlexGridSizer->Insert( index+col,
new wxSizerItem( st, wxSizerFlags().Align( wxALIGN_CENTER_VERTICAL )) ); new wxSizerItem( st, wxSizerFlags().Align( wxALIGN_CENTER_VERTICAL )) );
// column 3 // column 3
wxCheckBox* cb = new wxCheckBox( m_LayerScrolledWindow, layerId( 3, aSpec.layer ), wxEmptyString ); col = 3;
wxCheckBox* cb = new wxCheckBox( m_LayerScrolledWindow, encodeId( col, aSpec.id ), wxEmptyString );
cb->SetValue( aSpec.state );
cb->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( LAYER_WIDGET::OnLayerCheckBox ), NULL, this ); cb->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( LAYER_WIDGET::OnLayerCheckBox ), NULL, this );
cb->SetToolTip( _( "Enable this for visibility" ) ); cb->SetToolTip( _( "Enable this for visibility" ) );
m_LayersFlexGridSizer->Insert( index+3, new wxSizerItem( cb, flags ) ); m_LayersFlexGridSizer->Insert( index+col, new wxSizerItem( cb, flags ) );
}
void insertRenderRow( int aRow, const ROW& aSpec )
{
int col;
wxASSERT( aRow >= 0 && aRow < MAX_LAYER_ROWS );
size_t index = aRow * RND_COLUMN_COUNT;
wxSizerFlags flags;
flags.Align(wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL);
// column 0
col = 0;
wxBitmapButton* bmb = makeColorButton( m_RenderScrolledWindow, aSpec.color, encodeId( col, aSpec.id ) );
bmb->Connect( wxEVT_MIDDLE_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnMiddleDownRenderColor ), NULL, this );
bmb->SetToolTip( _("Middle click for color change" ) );
m_RenderFlexGridSizer->Insert( index+col, new wxSizerItem( bmb, flags ) );
#if 1
// column 1
col = 1;
wxCheckBox* cb = new wxCheckBox( m_RenderScrolledWindow, encodeId( col, aSpec.id ), aSpec.rowName );
cb->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( LAYER_WIDGET::OnRenderCheckBox ), NULL, this );
// cb->SetToolTip( _( "Enable this for visibility" ) );
m_RenderFlexGridSizer->Insert( index+col, new wxSizerItem( cb, flags ) );
#else
// column 1
col = 1;
wxStaticText* st = new wxStaticText( m_RenderScrolledWindow, encodeId( col, aSpec.id ), aSpec.rowName );
m_RenderFlexGridSizer->Insert( index+col,
new wxSizerItem( st, wxSizerFlags().Align( wxALIGN_CENTER_VERTICAL )) );
// column 2
col = 2;
wxCheckBox* cb = new wxCheckBox( m_RenderScrolledWindow, encodeId( col, aSpec.id ), wxEmptyString );
cb->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( LAYER_WIDGET::OnRenderCheckBox ), NULL, this );
// cb->SetToolTip( _( "Enable this for visibility" ) );
m_RenderFlexGridSizer->Insert( index+col, new wxSizerItem( cb, flags ) );
#endif
} }
@ -401,24 +530,22 @@ public:
LAYER_WIDGET( wxWindow* parent ) : LAYER_WIDGET( wxWindow* parent ) :
LAYER_PANEL_BASE( parent ) LAYER_PANEL_BASE( parent )
{ {
m_CurrentRow = 0; m_CurrentRow = -1;
m_RightArrowBitmap = new wxBitmap( rightarrow_xpm ); m_RightArrowBitmap = new wxBitmap( rightarrow_xpm );
m_BlankBitmap = new wxBitmap( clear_xpm ); // translucent
m_BlankBitmap = new wxBitmap( clear_xpm ); // translucent
m_BitmapSize = wxSize(m_BlankBitmap->GetWidth(), m_BlankBitmap->GetHeight()); m_BitmapSize = wxSize(m_BlankBitmap->GetWidth(), m_BlankBitmap->GetHeight());
m_LayerScrolledWindow->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnRightDownLayers ), NULL, this ); // handle the popup menu over the layer window
m_LayerScrolledWindow->Connect( wxEVT_RIGHT_DOWN,
wxMouseEventHandler( LAYER_WIDGET::OnRightDownLayers ), NULL, this );
// since Popupmenu() call this->ProcessEvent() we must call this->Connect()
AppendLayerRow( LAYER_SPEC( wxT("layer 1"), 0, RED ) ); // and not m_LayerScrolledWindow->Connect()
AppendLayerRow( LAYER_SPEC( wxT("layer 2"), 1, GREEN ) ); Connect( ID_SHOW_ALL_COPPERS, ID_SHOW_NO_COPPERS,
AppendLayerRow( LAYER_SPEC( wxT("brown_layer"), 2, BROWN ) ); wxEVT_COMMAND_MENU_SELECTED,
AppendLayerRow( LAYER_SPEC( wxT("layer_4_you"), 3, BLUE ) ); wxCommandEventHandler( LAYER_WIDGET::OnPopupSelection ), NULL, this );
SelectLayerRow( 1 );
SetMinSize( GetPreferredSize() );
} }
@ -429,30 +556,38 @@ public:
*/ */
wxSize GetPreferredSize() wxSize GetPreferredSize()
{ {
m_LayersFlexGridSizer->Layout(); FitInside();
// size of m_LayerScrolledWindow --------------
wxArrayInt widths = m_LayersFlexGridSizer->GetColWidths(); wxArrayInt widths = m_LayersFlexGridSizer->GetColWidths();
int totWidth = 0; int totWidth = 0;
for( int i=0; i<LAYER_COLUMN_COUNT; ++i ) for( int i=0; i<LYR_COLUMN_COUNT; ++i )
{ {
totWidth += widths[i] + m_LayersFlexGridSizer->GetHGap(); totWidth += widths[i] + m_LayersFlexGridSizer->GetHGap();
printf("widths[%d]:%d\n", i, widths[i] ); // printf("widths[%d]:%d\n", i, widths[i] );
} }
wxArrayInt heights = m_LayersFlexGridSizer->GetRowHeights(); wxArrayInt heights = m_LayersFlexGridSizer->GetRowHeights();
int totHeight = 0; int totHeight = 2 * heights[0]; // use 2 row heights to approximate tab height
int rowCount = GetLayerRowCount(); int rowCount = GetLayerRowCount();
for( int i=0; i<rowCount; ++i ) for( int i=0; i<rowCount; ++i )
{ {
totHeight += heights[i] + m_LayersFlexGridSizer->GetVGap(); totHeight += heights[i] + m_LayersFlexGridSizer->GetVGap();
printf("heights[%d]:%d\n", i, heights[i] ); // printf("heights[%d]:%d\n", i, heights[i] );
} }
wxSize layerPanelSize( totWidth, totHeight ); // on linux: trial and error min until horizontal scroll bar goes away.
// I think this is to account for the top most window's frame:
totWidth += 10;
// this aint done yet, just a place holder for more work. wxSize layerWindowSize( totWidth, totHeight );
return layerPanelSize; return layerWindowSize;
}
void SetPreferredSize()
{
SetMinSize( GetPreferredSize() );
} }
@ -463,17 +598,28 @@ public:
int GetLayerRowCount() const int GetLayerRowCount() const
{ {
int controlCount = m_LayersFlexGridSizer->GetChildren().GetCount(); int controlCount = m_LayersFlexGridSizer->GetChildren().GetCount();
return controlCount / LAYER_COLUMN_COUNT; return controlCount / LYR_COLUMN_COUNT;
}
/**
* Function GetRenderRowCount
* returns the number of rows in the render tab.
*/
int GetRenderRowCount() const
{
int controlCount = m_RenderFlexGridSizer->GetChildren().GetCount();
return controlCount / RND_COLUMN_COUNT;
} }
/** /**
* Function AppendLayerRow * Function AppendLayerRow
* appends a new row in the layer portion of the widget. * appends a new row in the layer portion of the widget. The user must
* ensure that ROW::id is unique for all existing rows on Windows.
*/ */
void AppendLayerRow( const LAYER_SPEC& aSpec ) void AppendLayerRow( const ROW& aRow )
{ {
int nextRow = GetLayerRowCount(); int nextRow = GetLayerRowCount();
insertLayerRow( nextRow, aSpec ); insertLayerRow( nextRow, aRow );
} }
/** /**
@ -485,29 +631,49 @@ public:
m_LayerScrolledWindow->DestroyChildren(); m_LayerScrolledWindow->DestroyChildren();
} }
/**
* Function AppendRenderRow
* appends a new row in the render portion of the widget. The user must
* ensure that ROW::id is unique for all existing rows on Windows.
*/
void AppendRenderRow( const ROW& aRow )
{
int nextRow = GetRenderRowCount();
insertRenderRow( nextRow, aRow );
}
/**
* Function ClearRenderRows
* empties out the render rows.
*/
void ClearRenderRows()
{
m_RenderScrolledWindow->DestroyChildren();
}
/** /**
* Function SelectLayerRow * Function SelectLayerRow
* changes the row selection in the layer list to the given row. * changes the row selection in the layer list to the given row.
*/ */
bool SelectLayerRow( int aRow ) void SelectLayerRow( int aRow )
{ {
// enable the layer tab at index 0 // enable the layer tab at index 0
m_notebook->ChangeSelection( 0 ); m_notebook->ChangeSelection( 0 );
if( (unsigned) aRow < (unsigned) GetLayerRowCount() ) int oldNdx = LYR_COLUMN_COUNT * m_CurrentRow;
{ int newNdx = LYR_COLUMN_COUNT * aRow;
int newNdx = LAYER_COLUMN_COUNT * aRow;
int oldNdx = LAYER_COLUMN_COUNT * m_CurrentRow;
wxStaticBitmap* oldbm = (wxStaticBitmap*) getLayerComp( oldNdx );
wxStaticBitmap* newbm = (wxStaticBitmap*) getLayerComp( newNdx );
oldbm->SetBitmap( *m_BlankBitmap );
newbm->SetBitmap( *m_RightArrowBitmap );
m_CurrentRow = aRow; m_CurrentRow = aRow;
wxStaticBitmap* oldbm = (wxStaticBitmap*) getLayerComp( oldNdx );
if( oldbm )
oldbm->SetBitmap( *m_BlankBitmap );
wxStaticBitmap* newbm = (wxStaticBitmap*) getLayerComp( newNdx );
if( newbm )
{
newbm->SetBitmap( *m_RightArrowBitmap );
// Change the focus to the wxBitmapButton in column 1 for this row. // Change the focus to the wxBitmapButton in column 1 for this row.
// We really do not need or want the focus, but because we get focus // We really do not need or want the focus, but because we get focus
// and it changes the appearance of these wxBitmapButtons, if any focused // and it changes the appearance of these wxBitmapButtons, if any focused
@ -519,31 +685,58 @@ public:
// It seems that as of 2.8.2, setting the focus // It seems that as of 2.8.2, setting the focus
// does this and generally I don't expect the scrolling to be needed at all because // does this and generally I don't expect the scrolling to be needed at all because
// the minimum window size may end up being established by the number of layers. // the minimum window size may end up being established by the number of layers.
}
}
return true;
}
return false;
}
/** /**
* Function SelectLayer * Function SelectLayer
* changes the row selection in the layer list to \a aLayer provided. * changes the row selection in the layer list to \a aLayer provided.
*/ */
bool SelectLayer( int aLayer ) void SelectLayer( int aLayer )
{ {
int row = findLayerRow( aLayer ); int row = findLayerRow( aLayer );
return SelectLayerRow( row ); SelectLayerRow( row );
} }
/**
* Function GetSelectedLayer
* returns the selected layer or -1 if none.
*/
int GetSelectedLayer()
{
// column 0 in the layer scroll window has a wxStaticBitmap, get its ID.
wxStaticBitmap* bm = (wxStaticBitmap*) getLayerComp( m_CurrentRow * LYR_COLUMN_COUNT );
if( bm )
return getDecodedId( bm->GetId() );
return -1;
}
/**
* Function SetLayerVisible
* sets \a aLayer visible or not. This does not invoke OnLayerVisible().
*/
void SetLayerVisible( int aLayer, bool isVisible )
{
int row = findLayerRow( aLayer );
if( row >= 0 )
{
wxCheckBox* cb = (wxCheckBox*) getLayerComp( row * LYR_COLUMN_COUNT + 3 );
wxASSERT( cb );
cb->SetValue( isVisible ); // does not fire an event
}
}
//-----<abstract functions>------------------------------------------- //-----<abstract functions>-------------------------------------------
/** /**
* Function OnColorChange * Function OnLayerColorChange
* is called to notify client code about a layer color change. Derived * is called to notify client code about a layer color change. Derived
* classes will handle this accordingly. * classes will handle this accordingly.
*/ */
virtual void OnColorChange( int aLayer, int aColor ) = 0; virtual void OnLayerColorChange( int aLayer, int aColor ) = 0;
/** /**
* Function OnLayerSelect * Function OnLayerSelect
@ -559,8 +752,26 @@ public:
*/ */
virtual void OnLayerVisible( int aLayer, bool isVisible ) = 0; virtual void OnLayerVisible( int aLayer, bool isVisible ) = 0;
//-----</abstract functions>------------------------------------------ /**
* Function OnRenderColorChange
* is called to notify client code whenever the user changes a rendering
* color.
* @param aId is the same id that was established in a Rendering row
* via the AddRenderRow() function.
*/
virtual void OnRenderColorChange( int aId, int aColor ) = 0;
/**
* Function OnRenderEnable
* is called to notify client code whenever the user changes an rendering
* enable in one of the rendering checkboxes.
* @param aId is the same id that was established in a Rendering row
* via the AddRenderRow() function.
* @param isEnabled is the state of the checkbox, true if checked.
*/
virtual void OnRenderEnable( int aId, bool isEnabled ) = 0;
//-----</abstract functions>------------------------------------------
}; };
@ -590,16 +801,17 @@ class MYFRAME : public wxFrame
{ {
} }
void OnColorChange( int aLayer, int aColor ) void OnLayerColorChange( int aLayer, int aColor )
{ {
printf( "OnColorChange( aLayer:%d, aColor:%d )\n", aLayer, aColor ); printf( "OnLayerColorChange( aLayer:%d, aColor:%d )\n", aLayer, aColor );
// a test trigger only /* a test trigger only
if( aLayer == 2 ) if( aLayer == 2 )
{ {
ClearLayerRows(); ClearLayerRows();
printf(" GetLayerRowCount(): %d\n", GetLayerRowCount() ); printf(" GetLayerRowCount(): %d\n", GetLayerRowCount() );
} }
*/
} }
bool OnLayerSelect( int aLayer ) bool OnLayerSelect( int aLayer )
@ -612,6 +824,16 @@ class MYFRAME : public wxFrame
{ {
printf( "OnLayerVisible( aLayer:%d, isVisible:%d )\n", aLayer, isVisible ); printf( "OnLayerVisible( aLayer:%d, isVisible:%d )\n", aLayer, isVisible );
} }
void OnRenderColorChange( int aId, int aColor )
{
printf( "OnRenderColorChange( aId:%d, aColor:%d )\n", aId, aColor );
}
void OnRenderEnable( int aId, bool isEnabled )
{
printf( "OnRenderEnable( aId:%d, isEnabled:%d )\n", aId, isEnabled );
}
}; };
@ -623,28 +845,39 @@ public:
// notify wxAUI which frame to use // notify wxAUI which frame to use
m_mgr.SetManagedWindow( this ); m_mgr.SetManagedWindow( this );
MYLAYERS* layerWidget = new MYLAYERS( this, this ); MYLAYERS* lw = new MYLAYERS( this, this );
lw->AppendLayerRow( LAYER_WIDGET::ROW( wxT("layer 1"), 0, RED, false ) );
lw->AppendLayerRow( LAYER_WIDGET::ROW( wxT("layer 2"), 1, GREEN ) );
lw->AppendLayerRow( LAYER_WIDGET::ROW( wxT("brown_layer"), 2, BROWN ) );
lw->AppendLayerRow( LAYER_WIDGET::ROW( wxT("layer_4_you"), 3, BLUE, false ) );
lw->AppendRenderRow( LAYER_WIDGET::ROW( wxT("With Ears"), 0, GREEN ) );
lw->AppendRenderRow( LAYER_WIDGET::ROW( wxT("With Legs"), 1, YELLOW ) );
lw->SetPreferredSize();
lw->SelectLayerRow( 1 );
wxAuiPaneInfo li;
li.MinSize( lw->GetPreferredSize() );
li.BestSize( lw->GetPreferredSize() );
li.Left();
// li.MaximizeButton( true );
// li.MinimizeButton( true );
li.CloseButton( false );
li.Caption( wxT( "Layers" ) );
m_mgr.AddPane( lw, li );
wxTextCtrl* text2 = new wxTextCtrl( this, -1, _( "Pane 2 - sample text" ), wxTextCtrl* text2 = new wxTextCtrl( this, -1, _( "Pane 2 - sample text" ),
wxDefaultPosition, wxSize( 200, 150 ), wxDefaultPosition, wxSize( 200, 150 ),
wxNO_BORDER | wxTE_MULTILINE ); wxNO_BORDER | wxTE_MULTILINE );
m_mgr.AddPane( text2, wxBOTTOM, wxT( "Pane Number Two" ) );
wxTextCtrl* text3 = new wxTextCtrl( this, -1, _( "Main content window" ), wxTextCtrl* text3 = new wxTextCtrl( this, -1, _( "Main content window" ),
wxDefaultPosition, wxSize( 200, 150 ), wxDefaultPosition, wxSize( 200, 150 ),
wxNO_BORDER | wxTE_MULTILINE ); wxNO_BORDER | wxTE_MULTILINE );
// add the panes to the manager
wxAuiPaneInfo li;
li.MinSize( layerWidget->GetPreferredSize() ); // ignored on linux
li.BestSize( layerWidget->GetPreferredSize() );
li.Left();
li.MaximizeButton( true );
li.MinimizeButton( true );
li.CloseButton( false );
li.Caption( wxT( "Layers" ) );
m_mgr.AddPane( layerWidget, li );
m_mgr.AddPane( text2, wxBOTTOM, wxT( "Pane Number Two" ) );
m_mgr.AddPane( text3, wxCENTER ); m_mgr.AddPane( text3, wxCENTER );
// tell the manager to "commit" all the changes just made // tell the manager to "commit" all the changes just made

View File

@ -198,7 +198,7 @@
<event name="OnKeyUp"></event> <event name="OnKeyUp"></event>
<event name="OnKillFocus"></event> <event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event> <event name="OnLeaveWindow"></event>
<event name="OnLeftDClick">OnLeftDblClickLayers</event> <event name="OnLeftDClick"></event>
<event name="OnLeftDown">OnLeftDownLayers</event> <event name="OnLeftDown">OnLeftDownLayers</event>
<event name="OnLeftUp"></event> <event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event> <event name="OnMiddleDClick"></event>
@ -246,7 +246,7 @@
<property name="id">wxID_ANY</property> <property name="id">wxID_ANY</property>
<property name="maximum_size"></property> <property name="maximum_size"></property>
<property name="minimum_size"></property> <property name="minimum_size"></property>
<property name="name">m_Page1Panel</property> <property name="name">m_RenderingPanel</property>
<property name="permission">protected</property> <property name="permission">protected</property>
<property name="pos"></property> <property name="pos"></property>
<property name="size"></property> <property name="size"></property>
@ -283,6 +283,69 @@
<property name="name">bSizer4</property> <property name="name">bSizer4</property>
<property name="orient">wxVERTICAL</property> <property name="orient">wxVERTICAL</property>
<property name="permission">none</property> <property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxScrolledWindow" expanded="1">
<property name="bg"></property>
<property name="context_help"></property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maximum_size"></property>
<property name="minimum_size"></property>
<property name="name">m_RenderScrolledWindow</property>
<property name="permission">protected</property>
<property name="pos"></property>
<property name="scroll_rate_x">5</property>
<property name="scroll_rate_y">5</property>
<property name="size"></property>
<property name="subclass"></property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style">wxVSCROLL</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
<object class="wxFlexGridSizer" expanded="1">
<property name="cols">2</property>
<property name="flexible_direction">wxHORIZONTAL</property>
<property name="growablecols"></property>
<property name="growablerows"></property>
<property name="hgap">3</property>
<property name="minimum_size"></property>
<property name="name">m_RenderFlexGridSizer</property>
<property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
<property name="permission">protected</property>
<property name="rows">0</property>
<property name="vgap">1</property>
</object>
</object>
</object>
</object> </object>
</object> </object>
</object> </object>