pcbjam/tests/apps/standalone/gridedit/gridedit_test.cpp
Viktor Vaczi a26b40c063 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>
2025-12-27 14:06:23 +01:00

206 lines
7 KiB
C++

// 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);