Reorganize project structure for clarity
- Rename tests/wasm-app/ to tests/apps/ for brevity - Move lib/gl_immediate_shim.js to wasm/shims/ (consolidates WASM files) - Delete docs/ directory (outdated Nov 2024 research docs) - Delete patches/ directory (already applied to fork submodules) - Delete wasm/patches/ and wasm/config/ (empty/unused) - Update all file references in scripts, configs, and documentation - Update .gitignore for new tests/apps/ paths Verified both build workflows pass: - wxWidgets tests: 255 passed - Docker KiCad build: completed successfully 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
c4cd69f28d
commit
a26b40c063
78 changed files with 38 additions and 128055 deletions
206
tests/apps/standalone/gridedit/gridedit_test.cpp
Normal file
206
tests/apps/standalone/gridedit/gridedit_test.cpp
Normal file
|
|
@ -0,0 +1,206 @@
|
|||
// wxGrid Cell Editing Test - Property editing simulation
|
||||
// Tests wxGrid with editable cells for KiCad property panels
|
||||
|
||||
#include "wx/wx.h"
|
||||
#include "wx/grid.h"
|
||||
|
||||
class GridEditFrame : public wxFrame
|
||||
{
|
||||
public:
|
||||
GridEditFrame() : wxFrame(nullptr, wxID_ANY, "wxGrid Cell Editing Test",
|
||||
wxDefaultPosition, wxSize(900, 600))
|
||||
{
|
||||
wxPanel* mainPanel = new wxPanel(this);
|
||||
wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL);
|
||||
|
||||
// Description
|
||||
wxStaticText* desc = new wxStaticText(mainPanel, wxID_ANY,
|
||||
"KiCad uses wxGrid for editable property tables.\n"
|
||||
"Tests cell editing with different editor types: text, number, choice, checkbox.");
|
||||
mainSizer->Add(desc, 0, wxALL, 5);
|
||||
|
||||
// Controls
|
||||
wxBoxSizer* controlSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
|
||||
wxButton* btnAdd = new wxButton(mainPanel, wxID_ANY, "Add Row");
|
||||
wxButton* btnDelete = new wxButton(mainPanel, wxID_ANY, "Delete Row");
|
||||
wxButton* btnClear = new wxButton(mainPanel, wxID_ANY, "Clear Selection");
|
||||
|
||||
btnAdd->Bind(wxEVT_BUTTON, &GridEditFrame::OnAddRow, this);
|
||||
btnDelete->Bind(wxEVT_BUTTON, &GridEditFrame::OnDeleteRow, this);
|
||||
btnClear->Bind(wxEVT_BUTTON, &GridEditFrame::OnClearSelection, this);
|
||||
|
||||
controlSizer->Add(btnAdd, 0, wxRIGHT, 5);
|
||||
controlSizer->Add(btnDelete, 0, wxRIGHT, 5);
|
||||
controlSizer->Add(btnClear, 0);
|
||||
|
||||
mainSizer->Add(controlSizer, 0, wxALL, 5);
|
||||
|
||||
// Create grid
|
||||
m_grid = new wxGrid(mainPanel, wxID_ANY);
|
||||
m_grid->CreateGrid(10, 5);
|
||||
|
||||
// Set column headers
|
||||
m_grid->SetColLabelValue(0, "Reference");
|
||||
m_grid->SetColLabelValue(1, "Value");
|
||||
m_grid->SetColLabelValue(2, "Footprint");
|
||||
m_grid->SetColLabelValue(3, "Quantity");
|
||||
m_grid->SetColLabelValue(4, "DNP");
|
||||
|
||||
// Set column widths
|
||||
m_grid->SetColSize(0, 100);
|
||||
m_grid->SetColSize(1, 120);
|
||||
m_grid->SetColSize(2, 200);
|
||||
m_grid->SetColSize(3, 80);
|
||||
m_grid->SetColSize(4, 60);
|
||||
|
||||
// Set up cell editors
|
||||
// Column 0-2: Text editors (default)
|
||||
// Column 3: Number editor
|
||||
m_grid->SetColFormatNumber(3);
|
||||
|
||||
// Column 4: Boolean editor (checkbox)
|
||||
m_grid->SetColFormatBool(4);
|
||||
|
||||
// Populate with KiCad-like component data
|
||||
PopulateGrid();
|
||||
|
||||
// Set up choice editor for footprint column
|
||||
wxString footprints[] = {
|
||||
"Resistor_SMD:R_0402", "Resistor_SMD:R_0603", "Resistor_SMD:R_0805",
|
||||
"Capacitor_SMD:C_0402", "Capacitor_SMD:C_0603", "Capacitor_SMD:C_0805",
|
||||
"Package_QFP:LQFP-48", "Package_QFP:LQFP-64", "Package_QFP:LQFP-100"
|
||||
};
|
||||
wxGridCellChoiceEditor* choiceEditor = new wxGridCellChoiceEditor(9, footprints);
|
||||
m_grid->SetColAttr(2, new wxGridCellAttr());
|
||||
m_grid->GetOrCreateCellAttr(0, 2)->SetEditor(choiceEditor);
|
||||
|
||||
mainSizer->Add(m_grid, 1, wxEXPAND | wxALL, 5);
|
||||
|
||||
// Event log
|
||||
mainSizer->Add(new wxStaticText(mainPanel, wxID_ANY, "Event Log"), 0, wxLEFT | wxTOP, 5);
|
||||
m_log = new wxTextCtrl(mainPanel, wxID_ANY, "", wxDefaultPosition, wxSize(-1, 100),
|
||||
wxTE_MULTILINE | wxTE_READONLY);
|
||||
mainSizer->Add(m_log, 0, wxEXPAND | wxALL, 5);
|
||||
|
||||
mainPanel->SetSizer(mainSizer);
|
||||
|
||||
// Bind grid events
|
||||
m_grid->Bind(wxEVT_GRID_CELL_CHANGED, &GridEditFrame::OnCellChanged, this);
|
||||
m_grid->Bind(wxEVT_GRID_SELECT_CELL, &GridEditFrame::OnCellSelected, this);
|
||||
m_grid->Bind(wxEVT_GRID_EDITOR_SHOWN, &GridEditFrame::OnEditorShown, this);
|
||||
m_grid->Bind(wxEVT_GRID_EDITOR_HIDDEN, &GridEditFrame::OnEditorHidden, this);
|
||||
|
||||
// Status bar
|
||||
CreateStatusBar();
|
||||
SetStatusText("Grid editing test app started");
|
||||
|
||||
Log("Grid editing test app started");
|
||||
Log("Double-click cells to edit. Use choice dropdown for Footprint column.");
|
||||
}
|
||||
|
||||
private:
|
||||
void PopulateGrid()
|
||||
{
|
||||
// Reference, Value, Footprint, Quantity, DNP
|
||||
SetRow(0, "R1", "10k", "Resistor_SMD:R_0402", "1", "0");
|
||||
SetRow(1, "R2", "4.7k", "Resistor_SMD:R_0402", "1", "0");
|
||||
SetRow(2, "R3", "100", "Resistor_SMD:R_0603", "2", "0");
|
||||
SetRow(3, "C1", "100nF", "Capacitor_SMD:C_0402", "1", "0");
|
||||
SetRow(4, "C2", "10uF", "Capacitor_SMD:C_0805", "1", "0");
|
||||
SetRow(5, "U1", "STM32F103", "Package_QFP:LQFP-48", "1", "0");
|
||||
SetRow(6, "U2", "74HC595", "Package_QFP:LQFP-64", "1", "1");
|
||||
SetRow(7, "J1", "USB-C", "Connector_USB:USB_C", "1", "0");
|
||||
SetRow(8, "D1", "LED_Red", "LED_SMD:LED_0603", "1", "0");
|
||||
SetRow(9, "Q1", "2N7002", "Package_TO:SOT-23", "1", "0");
|
||||
}
|
||||
|
||||
void SetRow(int row, const wxString& ref, const wxString& val,
|
||||
const wxString& fp, const wxString& qty, const wxString& dnp)
|
||||
{
|
||||
m_grid->SetCellValue(row, 0, ref);
|
||||
m_grid->SetCellValue(row, 1, val);
|
||||
m_grid->SetCellValue(row, 2, fp);
|
||||
m_grid->SetCellValue(row, 3, qty);
|
||||
m_grid->SetCellValue(row, 4, dnp);
|
||||
}
|
||||
|
||||
void Log(const wxString& msg)
|
||||
{
|
||||
m_log->AppendText(msg + "\n");
|
||||
}
|
||||
|
||||
void OnAddRow(wxCommandEvent& event)
|
||||
{
|
||||
int newRow = m_grid->GetNumberRows();
|
||||
m_grid->AppendRows(1);
|
||||
m_grid->SetCellValue(newRow, 0, wxString::Format("NEW%d", newRow + 1));
|
||||
m_grid->SetCellValue(newRow, 3, "1");
|
||||
m_grid->SetCellValue(newRow, 4, "0");
|
||||
Log(wxString::Format("Added row %d", newRow));
|
||||
}
|
||||
|
||||
void OnDeleteRow(wxCommandEvent& event)
|
||||
{
|
||||
int row = m_grid->GetGridCursorRow();
|
||||
if (row >= 0 && m_grid->GetNumberRows() > 1)
|
||||
{
|
||||
wxString ref = m_grid->GetCellValue(row, 0);
|
||||
m_grid->DeleteRows(row, 1);
|
||||
Log(wxString::Format("Deleted row: %s", ref));
|
||||
}
|
||||
}
|
||||
|
||||
void OnClearSelection(wxCommandEvent& event)
|
||||
{
|
||||
m_grid->ClearSelection();
|
||||
Log("Selection cleared");
|
||||
}
|
||||
|
||||
void OnCellChanged(wxGridEvent& event)
|
||||
{
|
||||
int row = event.GetRow();
|
||||
int col = event.GetCol();
|
||||
wxString value = m_grid->GetCellValue(row, col);
|
||||
wxString colName = m_grid->GetColLabelValue(col);
|
||||
Log(wxString::Format("Cell changed: [%d,%d] %s = '%s'", row, col, colName, value));
|
||||
}
|
||||
|
||||
void OnCellSelected(wxGridEvent& event)
|
||||
{
|
||||
int row = event.GetRow();
|
||||
int col = event.GetCol();
|
||||
Log(wxString::Format("Cell selected: [%d,%d]", row, col));
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
void OnEditorShown(wxGridEvent& event)
|
||||
{
|
||||
int row = event.GetRow();
|
||||
int col = event.GetCol();
|
||||
Log(wxString::Format("Editor opened: [%d,%d]", row, col));
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
void OnEditorHidden(wxGridEvent& event)
|
||||
{
|
||||
Log("Editor closed");
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
wxGrid* m_grid;
|
||||
wxTextCtrl* m_log;
|
||||
};
|
||||
|
||||
class GridEditApp : public wxApp
|
||||
{
|
||||
public:
|
||||
virtual bool OnInit() override
|
||||
{
|
||||
GridEditFrame* frame = new GridEditFrame();
|
||||
frame->Show();
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
wxIMPLEMENT_APP(GridEditApp);
|
||||
Loading…
Reference in a new issue