pcbjam/tests/apps/standalone/menu/menu_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

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");
}