- 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>
300 lines
8.3 KiB
C++
300 lines
8.3 KiB
C++
// wxMenuBar Test - Tests menu functionality in WASM
|
|
// KiCad uses extensive menus for File, Edit, View, Place, Route, etc.
|
|
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/wx.h"
|
|
#endif
|
|
|
|
#ifdef __EMSCRIPTEN__
|
|
#include <emscripten/emscripten.h>
|
|
#endif
|
|
|
|
class MenuTestApp : public wxApp
|
|
{
|
|
public:
|
|
virtual bool OnInit() override;
|
|
};
|
|
|
|
class MenuTestFrame : public wxFrame
|
|
{
|
|
public:
|
|
MenuTestFrame();
|
|
|
|
private:
|
|
wxTextCtrl* m_log;
|
|
|
|
void LogEvent(const wxString& msg);
|
|
|
|
// Menu event handlers
|
|
void OnMenuNew(wxCommandEvent& evt);
|
|
void OnMenuOpen(wxCommandEvent& evt);
|
|
void OnMenuSave(wxCommandEvent& evt);
|
|
void OnMenuSaveAs(wxCommandEvent& evt);
|
|
void OnMenuExit(wxCommandEvent& evt);
|
|
|
|
void OnMenuUndo(wxCommandEvent& evt);
|
|
void OnMenuRedo(wxCommandEvent& evt);
|
|
void OnMenuCut(wxCommandEvent& evt);
|
|
void OnMenuCopy(wxCommandEvent& evt);
|
|
void OnMenuPaste(wxCommandEvent& evt);
|
|
void OnMenuSelectAll(wxCommandEvent& evt);
|
|
|
|
void OnMenuZoomIn(wxCommandEvent& evt);
|
|
void OnMenuZoomOut(wxCommandEvent& evt);
|
|
void OnMenuZoomFit(wxCommandEvent& evt);
|
|
void OnMenuFullScreen(wxCommandEvent& evt);
|
|
|
|
void OnMenuPreferences(wxCommandEvent& evt);
|
|
void OnMenuAbout(wxCommandEvent& evt);
|
|
void OnMenuHelp(wxCommandEvent& evt);
|
|
|
|
wxDECLARE_EVENT_TABLE();
|
|
};
|
|
|
|
enum {
|
|
ID_NEW = wxID_HIGHEST + 1,
|
|
ID_OPEN,
|
|
ID_SAVE,
|
|
ID_SAVE_AS,
|
|
ID_UNDO,
|
|
ID_REDO,
|
|
ID_CUT,
|
|
ID_COPY,
|
|
ID_PASTE,
|
|
ID_SELECT_ALL,
|
|
ID_ZOOM_IN,
|
|
ID_ZOOM_OUT,
|
|
ID_ZOOM_FIT,
|
|
ID_FULLSCREEN,
|
|
ID_PREFERENCES,
|
|
ID_HELP_CONTENTS
|
|
};
|
|
|
|
wxBEGIN_EVENT_TABLE(MenuTestFrame, wxFrame)
|
|
EVT_MENU(ID_NEW, MenuTestFrame::OnMenuNew)
|
|
EVT_MENU(ID_OPEN, MenuTestFrame::OnMenuOpen)
|
|
EVT_MENU(ID_SAVE, MenuTestFrame::OnMenuSave)
|
|
EVT_MENU(ID_SAVE_AS, MenuTestFrame::OnMenuSaveAs)
|
|
EVT_MENU(wxID_EXIT, MenuTestFrame::OnMenuExit)
|
|
EVT_MENU(ID_UNDO, MenuTestFrame::OnMenuUndo)
|
|
EVT_MENU(ID_REDO, MenuTestFrame::OnMenuRedo)
|
|
EVT_MENU(ID_CUT, MenuTestFrame::OnMenuCut)
|
|
EVT_MENU(ID_COPY, MenuTestFrame::OnMenuCopy)
|
|
EVT_MENU(ID_PASTE, MenuTestFrame::OnMenuPaste)
|
|
EVT_MENU(ID_SELECT_ALL, MenuTestFrame::OnMenuSelectAll)
|
|
EVT_MENU(ID_ZOOM_IN, MenuTestFrame::OnMenuZoomIn)
|
|
EVT_MENU(ID_ZOOM_OUT, MenuTestFrame::OnMenuZoomOut)
|
|
EVT_MENU(ID_ZOOM_FIT, MenuTestFrame::OnMenuZoomFit)
|
|
EVT_MENU(ID_FULLSCREEN, MenuTestFrame::OnMenuFullScreen)
|
|
EVT_MENU(ID_PREFERENCES, MenuTestFrame::OnMenuPreferences)
|
|
EVT_MENU(wxID_ABOUT, MenuTestFrame::OnMenuAbout)
|
|
EVT_MENU(ID_HELP_CONTENTS, MenuTestFrame::OnMenuHelp)
|
|
wxEND_EVENT_TABLE()
|
|
|
|
wxIMPLEMENT_APP(MenuTestApp);
|
|
|
|
bool MenuTestApp::OnInit()
|
|
{
|
|
if (!wxApp::OnInit())
|
|
return false;
|
|
|
|
MenuTestFrame* frame = new MenuTestFrame();
|
|
frame->Show(true);
|
|
return true;
|
|
}
|
|
|
|
MenuTestFrame::MenuTestFrame()
|
|
: wxFrame(nullptr, wxID_ANY, "wxMenuBar WASM Test",
|
|
wxDefaultPosition, wxSize(600, 400))
|
|
{
|
|
// Create File menu
|
|
wxMenu* menuFile = new wxMenu;
|
|
menuFile->Append(ID_NEW, "&New\tCtrl+N", "Create a new file");
|
|
menuFile->Append(ID_OPEN, "&Open...\tCtrl+O", "Open an existing file");
|
|
menuFile->AppendSeparator();
|
|
menuFile->Append(ID_SAVE, "&Save\tCtrl+S", "Save the current file");
|
|
menuFile->Append(ID_SAVE_AS, "Save &As...\tCtrl+Shift+S", "Save with a new name");
|
|
menuFile->AppendSeparator();
|
|
menuFile->Append(wxID_EXIT, "E&xit\tAlt+F4", "Exit the application");
|
|
|
|
// Create Edit menu
|
|
wxMenu* menuEdit = new wxMenu;
|
|
menuEdit->Append(ID_UNDO, "&Undo\tCtrl+Z", "Undo the last action");
|
|
menuEdit->Append(ID_REDO, "&Redo\tCtrl+Y", "Redo the last undone action");
|
|
menuEdit->AppendSeparator();
|
|
menuEdit->Append(ID_CUT, "Cu&t\tCtrl+X", "Cut selection to clipboard");
|
|
menuEdit->Append(ID_COPY, "&Copy\tCtrl+C", "Copy selection to clipboard");
|
|
menuEdit->Append(ID_PASTE, "&Paste\tCtrl+V", "Paste from clipboard");
|
|
menuEdit->AppendSeparator();
|
|
menuEdit->Append(ID_SELECT_ALL, "Select &All\tCtrl+A", "Select all");
|
|
|
|
// Create View menu
|
|
wxMenu* menuView = new wxMenu;
|
|
menuView->Append(ID_ZOOM_IN, "Zoom &In\tCtrl++", "Zoom in");
|
|
menuView->Append(ID_ZOOM_OUT, "Zoom &Out\tCtrl+-", "Zoom out");
|
|
menuView->Append(ID_ZOOM_FIT, "Zoom to &Fit\tCtrl+0", "Fit view to window");
|
|
menuView->AppendSeparator();
|
|
menuView->AppendCheckItem(ID_FULLSCREEN, "&Full Screen\tF11", "Toggle full screen mode");
|
|
|
|
// Create Tools menu (like KiCad's preferences)
|
|
wxMenu* menuTools = new wxMenu;
|
|
menuTools->Append(ID_PREFERENCES, "&Preferences...", "Open preferences dialog");
|
|
|
|
// Create Help menu
|
|
wxMenu* menuHelp = new wxMenu;
|
|
menuHelp->Append(ID_HELP_CONTENTS, "&Help Contents\tF1", "Show help");
|
|
menuHelp->AppendSeparator();
|
|
menuHelp->Append(wxID_ABOUT, "&About...", "About this application");
|
|
|
|
// Create menu bar
|
|
wxMenuBar* menuBar = new wxMenuBar;
|
|
menuBar->Append(menuFile, "&File");
|
|
menuBar->Append(menuEdit, "&Edit");
|
|
menuBar->Append(menuView, "&View");
|
|
menuBar->Append(menuTools, "&Tools");
|
|
menuBar->Append(menuHelp, "&Help");
|
|
|
|
SetMenuBar(menuBar);
|
|
|
|
// Create main content - NO GL canvas
|
|
wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
|
|
|
|
wxStaticText* desc = new wxStaticText(this, wxID_ANY,
|
|
"wxMenuBar Test\n\n"
|
|
"This tests the menu system which KiCad uses extensively.\n"
|
|
"Click menu items to see events logged below.");
|
|
sizer->Add(desc, 0, wxALL, 10);
|
|
|
|
m_log = new wxTextCtrl(this, wxID_ANY, "", wxDefaultPosition, wxSize(-1, 200),
|
|
wxTE_MULTILINE | wxTE_READONLY);
|
|
sizer->Add(m_log, 1, wxEXPAND | wxALL, 10);
|
|
|
|
SetSizer(sizer);
|
|
|
|
// Create status bar
|
|
CreateStatusBar(2);
|
|
SetStatusText("Ready");
|
|
SetStatusText("Menu test", 1);
|
|
|
|
LogEvent("Menu test app started");
|
|
LogEvent("Menu bar created with File, Edit, View, Tools, Help menus");
|
|
|
|
#ifdef __EMSCRIPTEN__
|
|
EM_ASM({
|
|
console.log('[MENU_TEST] wxMenuBar test app started successfully');
|
|
});
|
|
#endif
|
|
}
|
|
|
|
void MenuTestFrame::LogEvent(const wxString& msg)
|
|
{
|
|
m_log->AppendText(msg + "\n");
|
|
SetStatusText(msg);
|
|
|
|
#ifdef __EMSCRIPTEN__
|
|
EM_ASM({
|
|
console.log('[MENU_EVENT] ' + UTF8ToString($0));
|
|
}, msg.c_str().AsChar());
|
|
#endif
|
|
}
|
|
|
|
// File menu handlers
|
|
void MenuTestFrame::OnMenuNew(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
LogEvent("File > New clicked");
|
|
}
|
|
|
|
void MenuTestFrame::OnMenuOpen(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
LogEvent("File > Open clicked");
|
|
}
|
|
|
|
void MenuTestFrame::OnMenuSave(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
LogEvent("File > Save clicked");
|
|
}
|
|
|
|
void MenuTestFrame::OnMenuSaveAs(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
LogEvent("File > Save As clicked");
|
|
}
|
|
|
|
void MenuTestFrame::OnMenuExit(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
LogEvent("File > Exit clicked");
|
|
Close(true);
|
|
}
|
|
|
|
// Edit menu handlers
|
|
void MenuTestFrame::OnMenuUndo(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
LogEvent("Edit > Undo clicked");
|
|
}
|
|
|
|
void MenuTestFrame::OnMenuRedo(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
LogEvent("Edit > Redo clicked");
|
|
}
|
|
|
|
void MenuTestFrame::OnMenuCut(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
LogEvent("Edit > Cut clicked");
|
|
}
|
|
|
|
void MenuTestFrame::OnMenuCopy(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
LogEvent("Edit > Copy clicked");
|
|
}
|
|
|
|
void MenuTestFrame::OnMenuPaste(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
LogEvent("Edit > Paste clicked");
|
|
}
|
|
|
|
void MenuTestFrame::OnMenuSelectAll(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
LogEvent("Edit > Select All clicked");
|
|
}
|
|
|
|
// View menu handlers
|
|
void MenuTestFrame::OnMenuZoomIn(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
LogEvent("View > Zoom In clicked");
|
|
}
|
|
|
|
void MenuTestFrame::OnMenuZoomOut(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
LogEvent("View > Zoom Out clicked");
|
|
}
|
|
|
|
void MenuTestFrame::OnMenuZoomFit(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
LogEvent("View > Zoom to Fit clicked");
|
|
}
|
|
|
|
void MenuTestFrame::OnMenuFullScreen(wxCommandEvent& evt)
|
|
{
|
|
bool isFullScreen = evt.IsChecked();
|
|
LogEvent(wxString::Format("View > Full Screen toggled: %s",
|
|
isFullScreen ? "ON" : "OFF"));
|
|
ShowFullScreen(isFullScreen);
|
|
}
|
|
|
|
// Tools menu handlers
|
|
void MenuTestFrame::OnMenuPreferences(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
LogEvent("Tools > Preferences clicked");
|
|
}
|
|
|
|
// Help menu handlers
|
|
void MenuTestFrame::OnMenuAbout(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
LogEvent("Help > About clicked");
|
|
}
|
|
|
|
void MenuTestFrame::OnMenuHelp(wxCommandEvent& WXUNUSED(evt))
|
|
{
|
|
LogEvent("Help > Help Contents clicked");
|
|
}
|