more fp_lib_table work

This commit is contained in:
Dick Hollenbeck 2012-10-18 10:28:50 -05:00
parent 58299fc921
commit 9e41a8127d
3 changed files with 152 additions and 36 deletions

View File

@ -100,7 +100,9 @@ public:
typedef IO_MGR::PCB_FILE_T LIB_T;
ROW(){}
ROW() : type( IO_MGR::KICAD )
{
}
ROW( const wxString& aNick, const wxString& aURI, const wxString& aType, const wxString& aOptions ) :
nickName( aNick ),
@ -222,6 +224,23 @@ public:
*/
FP_LIB_TABLE( FP_LIB_TABLE* aFallBackTable = NULL );
bool operator==( const FP_LIB_TABLE& r ) const
{
if( rows.size() == r.rows.size() )
{
unsigned i;
for( i = 0; i < rows.size() && rows[i] == r.rows[i]; ++i )
;
if( i == rows.size() )
return true;
}
return false;
}
bool operator!=( const FP_LIB_TABLE& r ) const { return !( *this == r ); }
/**
* Function Parse
* fills this table fragment from information in the input stream \a aParser, which

View File

@ -28,13 +28,12 @@
#include <dialog_fp_lib_table_base.h>
#include <fp_lib_table.h>
#include <wx/grid.h>
#include <wx/grid.h>
/**
* Class FP_TBL_MODEL
* mixes in wxGridTableBase into FP_LIB_TABLE so that the latter can be used
* as table within wxGrid.
* as a table within wxGrid.
*/
class FP_TBL_MODEL : public wxGridTableBase, public FP_LIB_TABLE
{
@ -42,23 +41,14 @@ public:
/**
* Constructor FP_TBL_MODEL
* builds a wxGridTableBase (table model) by wrapping an FP_LIB_TABLE.
* @a aFallBackTable. Loading of this table fragment is done by using Parse().
*
* @param aFallBackTable is another FP_LIB_TABLE which is searched only when
* a record is not found in this table. No ownership is
* taken of aFallBackTable.
* is a copy constructor that builds a wxGridTableBase (table model) by wrapping
* an FP_LIB_TABLE.
*/
FP_TBL_MODEL( const FP_LIB_TABLE& aTableToEdit ) :
FP_LIB_TABLE( aTableToEdit ) // copy constructor
{
}
~FP_TBL_MODEL()
{
D(printf("%s\n", __func__ );)
}
//-----<wxGridTableBase overloads>-------------------------------------------
int GetNumberRows () { return rows.size(); }
@ -93,8 +83,8 @@ public:
switch( aCol )
{
case 0: r.SetNickName( aValue ); break;
case 1: r.SetType( aValue ); break;
case 2: r.SetFullURI( aValue ); break;
case 1: r.SetFullURI( aValue ); break;
case 2: r.SetType( aValue ); break;
case 3: r.SetOptions( aValue ); break;
}
}
@ -112,6 +102,18 @@ public:
if( aPos < rows.size() )
{
rows.insert( rows.begin() + aPos, aNumRows, ROW() );
// use the (wxGridStringTable) source Luke.
if( GetView() )
{
wxGridTableMessage msg( this,
wxGRIDTABLE_NOTIFY_ROWS_INSERTED,
aPos,
aNumRows );
GetView()->ProcessTableMessage( msg );
}
return true;
}
return false;
@ -119,8 +121,19 @@ public:
bool AppendRows( size_t aNumRows = 1 )
{
while( aNumRows-- )
// do not modify aNumRows, original value needed for wxGridTableMessage below
for( int i = aNumRows; i; --i )
rows.push_back( ROW() );
if( GetView() )
{
wxGridTableMessage msg( this,
wxGRIDTABLE_NOTIFY_ROWS_APPENDED,
aNumRows );
GetView()->ProcessTableMessage( msg );
}
return true;
}
@ -130,6 +143,17 @@ public:
{
ROWS_ITER start = rows.begin() + aPos;
rows.erase( start, start + aNumRows );
if( GetView() )
{
wxGridTableMessage msg( this,
wxGRIDTABLE_NOTIFY_ROWS_DELETED,
aPos,
aNumRows );
GetView()->ProcessTableMessage( msg );
}
return true;
}
return false;
@ -168,6 +192,39 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE
{
typedef FP_LIB_TABLE::ROW ROW;
/* row & col "selection" acquisition, not currently used but works.
// selected area by cell coordinate and count
int selRowStart;
int selColStart;
int selRowCount;
int selColCount;
/// Gets the selected area into a sensible rectable of sel{Row,Col}{Start,Count} above.
void getSelectedArea()
{
wxGridCellCoordsArray topLeft = m_cur_grid->GetSelectionBlockTopLeft();
wxGridCellCoordsArray botRight = m_cur_grid->GetSelectionBlockBottomRight();
if( topLeft.Count() && botRight.Count() )
{
selRowStart = topLeft[0].GetRow();
selColStart = topLeft[0].GetCol();
selRowCount = botRight[0].GetRow() - selRowStart + 1;
selColCount = botRight[0].GetCol() - selColStart + 1;
}
else
{
selRowStart = -1;
selColStart = -1;
selRowCount = 0;
selColCount = 0;
}
D(printf("selRowStart:%d selColStart:%d selRowCount:%d selColCount:%d\n",
selRowStart, selColStart, selRowCount, selColCount );)
}
*/
//-----<event handlers>----------------------------------
@ -175,22 +232,52 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE
{
int pageNdx = m_auinotebook->GetSelection();
m_cur_grid = pageNdx ? m_global_grid : m_project_grid;
m_cur_grid = pageNdx==0 ? m_global_grid : m_project_grid;
D(printf("%s cur_grid is %s\n", __func__, pageNdx==0 ? "global" : "project" );)
}
void appendRowHandler( wxMouseEvent& event )
{
D(printf("%s\n", __func__);)
m_cur_grid->AppendRows( 1 );
}
void deleteRowHandler( wxMouseEvent& event )
{
D(printf("%s\n", __func__);)
int curRow = m_cur_grid->GetGridCursorRow();
m_cur_grid->DeleteRows( curRow );
}
void moveUpHandler( wxMouseEvent& event )
{
D(printf("%s\n", __func__);)
int curRow = m_cur_grid->GetGridCursorRow();
if( curRow >= 1 )
{
FP_TBL_MODEL* tbl = (FP_TBL_MODEL*) m_cur_grid->GetTable();
ROW save = tbl->rows[curRow];
tbl->DeleteRows( curRow, 1 );
tbl->InsertRows( --curRow, 1 );
tbl->rows[curRow] = save;
if( tbl->GetView() )
{
wxGridTableMessage msg( tbl,
wxGRIDTABLE_NOTIFY_ROWS_INSERTED,
curRow,
0 );
tbl->GetView()->ProcessTableMessage( msg );
}
}
}
void moveDownHandler( wxMouseEvent& event )
@ -200,20 +287,32 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE
void onCancelButtonClick( wxCommandEvent& event )
{
EndModal( wxID_CANCEL );
EndModal( 0 );
}
void onOKButtonClick( wxCommandEvent& event )
{
*m_global = m_global_model;
*m_project = m_project_model;
int dialogRet = 0;
// @todo reindex, or add member function for wholesale row replacement
if( m_global_model != *m_global )
{
dialogRet |= 1;
EndModal( wxID_OK );
*m_global = m_global_model;
m_global->reindex();
}
if( m_project_model != *m_project )
{
dialogRet |= 2;
*m_project = m_project_model;
m_project->reindex();
}
EndModal( dialogRet );
}
//-----</event handlers>---------------------------------
@ -244,6 +343,10 @@ public:
m_project_grid->AutoSizeColumns( false );
m_path_subs_grid->AutoSizeColumns( false );
// fire pageChangedHandler() so m_cur_grid gets set
wxAuiNotebookEvent uneventful;
pageChangedHandler( uneventful );
}
~DIALOG_FP_LIB_TABLE()
@ -262,18 +365,10 @@ public:
int InvokePcbLibTableEditor( wxFrame* aParent, FP_LIB_TABLE* aGlobal, FP_LIB_TABLE* aProject )
{
DIALOG_FP_LIB_TABLE dlg( aParent, aGlobal, aProject );
DIALOG_FP_LIB_TABLE dlg( aParent, aGlobal, aProject );
int ret = dlg.ShowModal();
switch( ret )
{
case wxID_OK:
break;
int dialogRet = dlg.ShowModal(); // returns value passed to EndModal() above
case wxID_CANCEL:
break;
}
return 0;
return dialogRet;
}

View File

@ -102,11 +102,13 @@ void PCB_EDIT_FRAME::Process_Config( wxCommandEvent& event )
if( r & 1 )
{
// save global table to disk and apply it
D( printf( "global has changed\n" );)
}
if( r & 2 )
{
// save project table to disk and apply it
// save project table to disk and apply it
D( printf( "project has changed\n" );)
}
}
break;