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();
bSizer3->Fit( m_LayerPanel );
m_notebook->AddPage( m_LayerPanel, _("Layers"), true );
m_Page1Panel = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_Page1Panel->SetToolTip( _("Part depiction and visibility") );
m_RenderingPanel = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_RenderingPanel->SetToolTip( _("Part depiction and visibility") );
wxBoxSizer* bSizer4;
bSizer4 = new wxBoxSizer( wxVERTICAL );
m_Page1Panel->SetSizer( bSizer4 );
m_Page1Panel->Layout();
bSizer4->Fit( m_Page1Panel );
m_notebook->AddPage( m_Page1Panel, _("Rendering"), false );
m_RenderScrolledWindow = new wxScrolledWindow( m_RenderingPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL );
m_RenderScrolledWindow->SetScrollRate( 5, 5 );
m_RenderFlexGridSizer = new wxFlexGridSizer( 0, 2, 1, 3 );
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 );
@ -53,7 +64,6 @@ LAYER_PANEL_BASE::LAYER_PANEL_BASE( wxWindow* parent, wxWindowID id, const wxPoi
this->Layout();
// 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_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()
{
// 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_RIGHT_DOWN, wxMouseEventHandler( LAYER_PANEL_BASE::OnRightDownLayers ), NULL, this );
}

View File

@ -38,10 +38,11 @@ class LAYER_PANEL_BASE : public wxPanel
wxPanel* m_LayerPanel;
wxScrolledWindow* m_LayerScrolledWindow;
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 void OnLeftDblClickLayers( wxMouseEvent& event ){ event.Skip(); }
virtual void OnLeftDownLayers( wxMouseEvent& event ){ event.Skip(); }
virtual void OnRightDownLayers( wxMouseEvent& event ){ event.Skip(); }

View File

@ -43,13 +43,19 @@
#include "layer_panel_base.h"
#include "colors.h"
#include "pcbstruct.h" // IsValidCopperLayerIndex()
/* no external data knowledge needed or wanted
#include "pcbnew.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 */
@ -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,
* but to do so in a way that all child wxControl ids within a wxWindow are unique,
* 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;
}
/**
* Function getLayerId
* decodes \a aControlId to return a layer.
* Function getDecodedId
* 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.
return layer;
int id = aControlId / LYR_COLUMN_COUNT; // rounding is OK.
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
* 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
* it has no knowledge of a BOARD or anything. To use it you must derive from
* this class and implement the abstract functions:
* <p>
* void OnColorChange( int aLayer, int aColor );
* <p>
* bool OnLayerSelect( int aLayer );
* <p>
* void OnLayerVisible( int aLayer, bool isVisible );
* <p> void OnLayerColorChange( int aLayer, int aColor );
* <p> bool OnLayerSelect( int aLayer );
* <p> void OnLayerVisible( int aLayer, bool isVisible );
* <p> void OnRenderColorChange( int id, int aColor );
* <p> void OnRenderEnable( int id, bool isEnabled );
*/
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 BUTT_SIZE_X 32
#define BUTT_SIZE_Y 22
#define BUTT_VOID 6
protected:
wxBitmap* m_BlankBitmap;
wxBitmap* m_RightArrowBitmap;
wxSize m_BitmapSize;
@ -185,8 +196,8 @@ protected:
static wxBitmap makeBitmap( int aColor )
{
// the bitmap will be 8 pixels smaller than the button, leaving a
// border of 4 pixels on each side.
// the bitmap will be BUTT_VOID*2 pixels smaller than the button, leaving a
// border of BUTT_VOID pixels on each side.
wxBitmap bitmap( BUTT_SIZE_X - 2 * BUTT_VOID, BUTT_SIZE_Y - 2 * BUTT_VOID );
wxBrush brush;
wxMemoryDC iconDC;
@ -207,13 +218,13 @@ protected:
* Function makeColorButton
* 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,
// then create a wxBitmapButton from it.
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 );
// save the color value in the name, no where else to put it.
@ -221,7 +232,6 @@ protected:
return ret;
}
void OnLeftDownLayers( wxMouseEvent& event )
{
int row;
@ -254,8 +264,8 @@ protected:
else
{
// all nested controls on a given row will have their ID encoded with
// makeLayerId(), and the corresponding decoding is getLayerId()
int layer = getLayerId( eventSource ->GetId() );
// encodeId(), and the corresponding decoding is getDecodedId()
int layer = getDecodedId( eventSource ->GetId() );
row = findLayerRow( layer );
}
@ -283,10 +293,10 @@ protected:
wxBitmap bm = makeBitmap( newColor );
eventSource->SetBitmapLabel( bm );
int layer = getLayerId( eventSource->GetId() );
int layer = getDecodedId( eventSource->GetId() );
// tell the client code.
OnColorChange( layer, newColor );
OnLayerColorChange( layer, newColor );
}
}
@ -297,8 +307,48 @@ protected:
*/
void OnRightDownLayers( wxMouseEvent& event )
{
// popup menu
printf( "OnRightDownLayers\n" );
wxMenu menu;
// 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 )
{
wxCheckBox* eventSource = (wxCheckBox*) event.GetEventObject();
int layer = getLayerId( eventSource->GetId() );
int layer = getDecodedId( eventSource->GetId() );
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
* 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
* been added to the m_LayersFlexGridSizer.
*/
wxWindow* getLayerComp( int aSizerNdx )
{
if( (unsigned) aSizerNdx < m_LayersFlexGridSizer->GetChildren().GetCount() )
return m_LayersFlexGridSizer->GetChildren()[aSizerNdx]->GetWindow();
return NULL;
}
/**
@ -339,12 +421,11 @@ protected:
for( int row=0; row<count; ++row )
{
// 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 -1;
}
@ -352,46 +433,94 @@ protected:
* Function insertLayerRow
* 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 );
size_t index = aRow * LAYER_COLUMN_COUNT;
size_t index = aRow * LYR_COLUMN_COUNT;
wxSizerFlags flags;
flags.Align(wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL);
// 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 );
sbm->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnLeftDownLayers ), 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 ) ) );
// 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_MIDDLE_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnMiddleDownLayerColor ), 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" ) );
m_LayersFlexGridSizer->Insert( index+1,
new wxSizerItem( bmb, flags ) );
bmb->SetToolTip( _("Left click to select, middle click for color change, right click for menu" ) );
m_LayersFlexGridSizer->Insert( index+col, new wxSizerItem( bmb, flags ) );
// 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_RIGHT_DOWN, wxMouseEventHandler( LAYER_WIDGET::OnRightDownLayers ), NULL, this );
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 )) );
// 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->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_PANEL_BASE( parent )
{
m_CurrentRow = 0;
m_CurrentRow = -1;
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_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 );
AppendLayerRow( LAYER_SPEC( wxT("layer 1"), 0, RED ) );
AppendLayerRow( LAYER_SPEC( wxT("layer 2"), 1, GREEN ) );
AppendLayerRow( LAYER_SPEC( wxT("brown_layer"), 2, BROWN ) );
AppendLayerRow( LAYER_SPEC( wxT("layer_4_you"), 3, BLUE ) );
SelectLayerRow( 1 );
SetMinSize( GetPreferredSize() );
// since Popupmenu() call this->ProcessEvent() we must call this->Connect()
// and not m_LayerScrolledWindow->Connect()
Connect( ID_SHOW_ALL_COPPERS, ID_SHOW_NO_COPPERS,
wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler( LAYER_WIDGET::OnPopupSelection ), NULL, this );
}
@ -429,30 +556,38 @@ public:
*/
wxSize GetPreferredSize()
{
m_LayersFlexGridSizer->Layout();
FitInside();
// size of m_LayerScrolledWindow --------------
wxArrayInt widths = m_LayersFlexGridSizer->GetColWidths();
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();
printf("widths[%d]:%d\n", i, widths[i] );
// printf("widths[%d]:%d\n", i, widths[i] );
}
wxArrayInt heights = m_LayersFlexGridSizer->GetRowHeights();
int totHeight = 0;
int totHeight = 2 * heights[0]; // use 2 row heights to approximate tab height
int rowCount = GetLayerRowCount();
for( int i=0; i<rowCount; ++i )
{
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 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
* 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();
insertLayerRow( nextRow, aSpec );
insertLayerRow( nextRow, aRow );
}
/**
@ -485,29 +631,49 @@ public:
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
* 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
m_notebook->ChangeSelection( 0 );
if( (unsigned) aRow < (unsigned) GetLayerRowCount() )
{
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 );
int oldNdx = LYR_COLUMN_COUNT * m_CurrentRow;
int newNdx = LYR_COLUMN_COUNT * 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.
// 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
@ -519,31 +685,58 @@ public:
// 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
// the minimum window size may end up being established by the number of layers.
}
}
return true;
}
return false;
}
/**
* Function SelectLayer
* changes the row selection in the layer list to \a aLayer provided.
*/
bool SelectLayer( int aLayer )
void SelectLayer( int 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>-------------------------------------------
/**
* Function OnColorChange
* Function OnLayerColorChange
* is called to notify client code about a layer color change. Derived
* classes will handle this accordingly.
*/
virtual void OnColorChange( int aLayer, int aColor ) = 0;
virtual void OnLayerColorChange( int aLayer, int aColor ) = 0;
/**
* Function OnLayerSelect
@ -559,8 +752,26 @@ public:
*/
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 )
{
ClearLayerRows();
printf(" GetLayerRowCount(): %d\n", GetLayerRowCount() );
}
*/
}
bool OnLayerSelect( int aLayer )
@ -612,6 +824,16 @@ class MYFRAME : public wxFrame
{
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
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" ),
wxDefaultPosition, wxSize( 200, 150 ),
wxNO_BORDER | wxTE_MULTILINE );
m_mgr.AddPane( text2, wxBOTTOM, wxT( "Pane Number Two" ) );
wxTextCtrl* text3 = new wxTextCtrl( this, -1, _( "Main content window" ),
wxDefaultPosition, wxSize( 200, 150 ),
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 );
// tell the manager to "commit" all the changes just made

View File

@ -198,7 +198,7 @@
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick">OnLeftDblClickLayers</event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown">OnLeftDownLayers</event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
@ -246,7 +246,7 @@
<property name="id">wxID_ANY</property>
<property name="maximum_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="pos"></property>
<property name="size"></property>
@ -283,6 +283,69 @@
<property name="name">bSizer4</property>
<property name="orient">wxVERTICAL</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>