pcbjam/tests/apps/standalone/wizard/wizard_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

290 lines
10 KiB
C++

// wxWizard Test - Footprint Wizard simulation
// Tests wxWizard for step-by-step dialogs
#include "wx/wx.h"
#include "wx/wizard.h"
#include "wx/spinctrl.h"
// Page 1: Package Type Selection
class PackageTypePage : public wxWizardPageSimple
{
public:
PackageTypePage(wxWizard* parent) : wxWizardPageSimple(parent)
{
wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
sizer->Add(new wxStaticText(this, wxID_ANY, "Step 1: Select Package Type"), 0, wxBOTTOM, 10);
sizer->Add(new wxStaticText(this, wxID_ANY, "Choose the type of footprint to create:"), 0, wxBOTTOM, 10);
wxString choices[] = {"QFP (Quad Flat Package)", "BGA (Ball Grid Array)",
"DIP (Dual In-line Package)", "SOT (Small Outline Transistor)",
"SOP (Small Outline Package)"};
m_choice = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 5, choices);
m_choice->SetSelection(0);
sizer->Add(m_choice, 0, wxEXPAND | wxBOTTOM, 10);
sizer->Add(new wxStaticText(this, wxID_ANY, "Selected: QFP - Common for microcontrollers"), 0);
SetSizer(sizer);
}
wxString GetSelection() const { return m_choice->GetStringSelection(); }
private:
wxChoice* m_choice;
};
// Page 2: Pin Configuration
class PinConfigPage : public wxWizardPageSimple
{
public:
PinConfigPage(wxWizard* parent) : wxWizardPageSimple(parent)
{
wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
sizer->Add(new wxStaticText(this, wxID_ANY, "Step 2: Pin Configuration"), 0, wxBOTTOM, 10);
wxFlexGridSizer* grid = new wxFlexGridSizer(2, 2, 5, 10);
grid->Add(new wxStaticText(this, wxID_ANY, "Number of Pins:"), 0, wxALIGN_CENTER_VERTICAL);
m_pinCount = new wxSpinCtrl(this, wxID_ANY, "48", wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 4, 256, 48);
grid->Add(m_pinCount, 0);
grid->Add(new wxStaticText(this, wxID_ANY, "Pins Per Side:"), 0, wxALIGN_CENTER_VERTICAL);
m_pinsPerSide = new wxSpinCtrl(this, wxID_ANY, "12", wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 64, 12);
grid->Add(m_pinsPerSide, 0);
grid->Add(new wxStaticText(this, wxID_ANY, "Pin Pitch (mm):"), 0, wxALIGN_CENTER_VERTICAL);
wxString pitches[] = {"0.4", "0.5", "0.65", "0.8", "1.0", "1.27"};
m_pitch = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 6, pitches);
m_pitch->SetSelection(1);
grid->Add(m_pitch, 0);
grid->Add(new wxStaticText(this, wxID_ANY, "Pin 1 Position:"), 0, wxALIGN_CENTER_VERTICAL);
wxString positions[] = {"Top-Left", "Bottom-Left", "Top-Right", "Bottom-Right"};
m_pin1Pos = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 4, positions);
m_pin1Pos->SetSelection(0);
grid->Add(m_pin1Pos, 0);
sizer->Add(grid, 0, wxEXPAND | wxBOTTOM, 10);
SetSizer(sizer);
}
int GetPinCount() const { return m_pinCount->GetValue(); }
wxString GetPitch() const { return m_pitch->GetStringSelection(); }
private:
wxSpinCtrl* m_pinCount;
wxSpinCtrl* m_pinsPerSide;
wxChoice* m_pitch;
wxChoice* m_pin1Pos;
};
// Page 3: Package Dimensions
class DimensionsPage : public wxWizardPageSimple
{
public:
DimensionsPage(wxWizard* parent) : wxWizardPageSimple(parent)
{
wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
sizer->Add(new wxStaticText(this, wxID_ANY, "Step 3: Package Dimensions"), 0, wxBOTTOM, 10);
wxFlexGridSizer* grid = new wxFlexGridSizer(2, 2, 5, 10);
grid->Add(new wxStaticText(this, wxID_ANY, "Package Width (mm):"), 0, wxALIGN_CENTER_VERTICAL);
m_width = new wxTextCtrl(this, wxID_ANY, "7.0");
grid->Add(m_width, 0);
grid->Add(new wxStaticText(this, wxID_ANY, "Package Height (mm):"), 0, wxALIGN_CENTER_VERTICAL);
m_height = new wxTextCtrl(this, wxID_ANY, "7.0");
grid->Add(m_height, 0);
grid->Add(new wxStaticText(this, wxID_ANY, "Pad Width (mm):"), 0, wxALIGN_CENTER_VERTICAL);
m_padWidth = new wxTextCtrl(this, wxID_ANY, "0.3");
grid->Add(m_padWidth, 0);
grid->Add(new wxStaticText(this, wxID_ANY, "Pad Height (mm):"), 0, wxALIGN_CENTER_VERTICAL);
m_padHeight = new wxTextCtrl(this, wxID_ANY, "1.0");
grid->Add(m_padHeight, 0);
sizer->Add(grid, 0, wxEXPAND | wxBOTTOM, 10);
// Checkbox options
m_addThermal = new wxCheckBox(this, wxID_ANY, "Add thermal pad");
m_addSilkscreen = new wxCheckBox(this, wxID_ANY, "Add silkscreen outline");
m_addCourtyard = new wxCheckBox(this, wxID_ANY, "Add courtyard");
m_addSilkscreen->SetValue(true);
m_addCourtyard->SetValue(true);
sizer->Add(m_addThermal, 0, wxBOTTOM, 5);
sizer->Add(m_addSilkscreen, 0, wxBOTTOM, 5);
sizer->Add(m_addCourtyard, 0);
SetSizer(sizer);
}
private:
wxTextCtrl* m_width;
wxTextCtrl* m_height;
wxTextCtrl* m_padWidth;
wxTextCtrl* m_padHeight;
wxCheckBox* m_addThermal;
wxCheckBox* m_addSilkscreen;
wxCheckBox* m_addCourtyard;
};
// Page 4: Summary
class SummaryPage : public wxWizardPageSimple
{
public:
SummaryPage(wxWizard* parent, PackageTypePage* p1, PinConfigPage* p2)
: wxWizardPageSimple(parent), m_page1(p1), m_page2(p2)
{
wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
sizer->Add(new wxStaticText(this, wxID_ANY, "Step 4: Summary"), 0, wxBOTTOM, 10);
sizer->Add(new wxStaticText(this, wxID_ANY, "Review your footprint settings:"), 0, wxBOTTOM, 10);
m_summary = new wxTextCtrl(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize,
wxTE_MULTILINE | wxTE_READONLY);
sizer->Add(m_summary, 1, wxEXPAND | wxBOTTOM, 10);
sizer->Add(new wxStaticText(this, wxID_ANY, "Click Finish to create the footprint."), 0);
SetSizer(sizer);
}
virtual bool TransferDataToWindow() override
{
wxString summary;
summary += "Footprint Summary\n";
summary += "=================\n\n";
summary += wxString::Format("Package Type: %s\n", m_page1->GetSelection());
summary += wxString::Format("Pin Count: %d\n", m_page2->GetPinCount());
summary += wxString::Format("Pin Pitch: %s mm\n", m_page2->GetPitch());
summary += "\nDimensions:\n";
summary += " Package: 7.0 x 7.0 mm\n";
summary += " Pad Size: 0.3 x 1.0 mm\n";
summary += "\nOptions:\n";
summary += " Silkscreen: Yes\n";
summary += " Courtyard: Yes\n";
m_summary->SetValue(summary);
return true;
}
private:
PackageTypePage* m_page1;
PinConfigPage* m_page2;
wxTextCtrl* m_summary;
};
class WizardFrame : public wxFrame
{
public:
WizardFrame() : wxFrame(nullptr, wxID_ANY, "wxWizard Test",
wxDefaultPosition, wxSize(800, 500))
{
wxPanel* mainPanel = new wxPanel(this);
wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL);
// Description
wxStaticText* desc = new wxStaticText(mainPanel, wxID_ANY,
"KiCad uses wxWizard for the Footprint Wizard.\n"
"This tests step-by-step dialog functionality with Next/Back navigation.");
mainSizer->Add(desc, 0, wxALL, 10);
// Launch button
wxButton* btnLaunch = new wxButton(mainPanel, wxID_ANY, "Launch Footprint Wizard");
btnLaunch->Bind(wxEVT_BUTTON, &WizardFrame::OnLaunchWizard, this);
mainSizer->Add(btnLaunch, 0, wxALL, 10);
// Event log
mainSizer->Add(new wxStaticText(mainPanel, wxID_ANY, "Event Log"), 0, wxLEFT | wxTOP, 10);
m_log = new wxTextCtrl(mainPanel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize,
wxTE_MULTILINE | wxTE_READONLY);
mainSizer->Add(m_log, 1, wxEXPAND | wxALL, 10);
mainPanel->SetSizer(mainSizer);
// Status bar
CreateStatusBar();
SetStatusText("Wizard test app started");
Log("Wizard test app started");
Log("Click 'Launch Footprint Wizard' to start");
}
private:
void Log(const wxString& msg)
{
m_log->AppendText(msg + "\n");
}
void OnLaunchWizard(wxCommandEvent& event)
{
Log("Launching Footprint Wizard...");
wxWizard* wizard = new wxWizard(this, wxID_ANY, "Footprint Wizard",
wxNullBitmap, wxDefaultPosition,
wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
// Create pages
PackageTypePage* page1 = new PackageTypePage(wizard);
PinConfigPage* page2 = new PinConfigPage(wizard);
DimensionsPage* page3 = new DimensionsPage(wizard);
SummaryPage* page4 = new SummaryPage(wizard, page1, page2);
// Chain pages
wxWizardPageSimple::Chain(page1, page2);
wxWizardPageSimple::Chain(page2, page3);
wxWizardPageSimple::Chain(page3, page4);
wizard->GetPageAreaSizer()->Add(page1);
// Bind wizard events
wizard->Bind(wxEVT_WIZARD_PAGE_CHANGED, [this](wxWizardEvent& evt) {
Log(wxString::Format("Page changed to: %d", evt.GetPage() ? 1 : 0));
});
wizard->Bind(wxEVT_WIZARD_CANCEL, [this](wxWizardEvent&) {
Log("Wizard cancelled");
});
wizard->Bind(wxEVT_WIZARD_FINISHED, [this](wxWizardEvent&) {
Log("Wizard finished - footprint would be created");
});
if (wizard->RunWizard(page1))
{
Log("Footprint created successfully!");
Log(wxString::Format(" Type: %s", page1->GetSelection()));
Log(wxString::Format(" Pins: %d", page2->GetPinCount()));
Log(wxString::Format(" Pitch: %s mm", page2->GetPitch()));
}
else
{
Log("Wizard was cancelled");
}
wizard->Destroy();
}
wxTextCtrl* m_log;
};
class WizardApp : public wxApp
{
public:
virtual bool OnInit() override
{
WizardFrame* frame = new WizardFrame();
frame->Show();
return true;
}
};
wxIMPLEMENT_APP(WizardApp);