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
215
tests/apps/standalone/logerror/logerror_test.cpp
Normal file
215
tests/apps/standalone/logerror/logerror_test.cpp
Normal file
|
|
@ -0,0 +1,215 @@
|
|||
// wxLogError Dialog Test - Reproduces KiCad's kiface error dialog
|
||||
// Tests wxLogDialog with wxCollapsiblePane "Details" dropdown
|
||||
// Used to debug dialog positioning and wxLog console logging
|
||||
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/wx.h"
|
||||
#endif
|
||||
|
||||
#include "wx/log.h"
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
#include <emscripten/emscripten.h>
|
||||
#endif
|
||||
|
||||
class LogErrorTestApp : public wxApp
|
||||
{
|
||||
public:
|
||||
virtual bool OnInit() override;
|
||||
};
|
||||
|
||||
class LogErrorTestFrame : public wxFrame
|
||||
{
|
||||
public:
|
||||
LogErrorTestFrame();
|
||||
|
||||
private:
|
||||
wxTextCtrl* m_log;
|
||||
|
||||
void LogEvent(const wxString& msg);
|
||||
|
||||
// Single error - like KiCad's "Error loading editor."
|
||||
void OnSingleError(wxCommandEvent& evt);
|
||||
|
||||
// Multiple errors - triggers Details dropdown with wxListCtrl
|
||||
void OnMultipleErrors(wxCommandEvent& evt);
|
||||
|
||||
// Mix of error levels
|
||||
void OnMixedLevels(wxCommandEvent& evt);
|
||||
|
||||
// Manually flush the log to show dialog
|
||||
void OnFlushLog(wxCommandEvent& evt);
|
||||
|
||||
// Clear logged messages without showing dialog
|
||||
void OnClearLog(wxCommandEvent& evt);
|
||||
|
||||
wxDECLARE_EVENT_TABLE();
|
||||
};
|
||||
|
||||
enum {
|
||||
ID_SINGLE_ERROR = wxID_HIGHEST + 1,
|
||||
ID_MULTIPLE_ERRORS,
|
||||
ID_MIXED_LEVELS,
|
||||
ID_FLUSH_LOG,
|
||||
ID_CLEAR_LOG
|
||||
};
|
||||
|
||||
wxBEGIN_EVENT_TABLE(LogErrorTestFrame, wxFrame)
|
||||
EVT_BUTTON(ID_SINGLE_ERROR, LogErrorTestFrame::OnSingleError)
|
||||
EVT_BUTTON(ID_MULTIPLE_ERRORS, LogErrorTestFrame::OnMultipleErrors)
|
||||
EVT_BUTTON(ID_MIXED_LEVELS, LogErrorTestFrame::OnMixedLevels)
|
||||
EVT_BUTTON(ID_FLUSH_LOG, LogErrorTestFrame::OnFlushLog)
|
||||
EVT_BUTTON(ID_CLEAR_LOG, LogErrorTestFrame::OnClearLog)
|
||||
wxEND_EVENT_TABLE()
|
||||
|
||||
wxIMPLEMENT_APP(LogErrorTestApp);
|
||||
|
||||
bool LogErrorTestApp::OnInit()
|
||||
{
|
||||
if (!wxApp::OnInit())
|
||||
return false;
|
||||
|
||||
LogErrorTestFrame* frame = new LogErrorTestFrame();
|
||||
frame->Show(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
LogErrorTestFrame::LogErrorTestFrame()
|
||||
: wxFrame(nullptr, wxID_ANY, "wxLogError Dialog Test",
|
||||
wxDefaultPosition, wxSize(700, 550))
|
||||
{
|
||||
wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL);
|
||||
|
||||
// Description
|
||||
wxStaticText* desc = new wxStaticText(this, wxID_ANY,
|
||||
"wxLogError Dialog Test\n\n"
|
||||
"This test reproduces the exact dialog KiCad shows when kiface loading fails.\n"
|
||||
"It uses wxLogDialog with wxCollapsiblePane 'Details' dropdown.\n"
|
||||
"Watch the browser console for [wxLog] messages.");
|
||||
mainSizer->Add(desc, 0, wxALL, 10);
|
||||
|
||||
// Single error section - like KiCad's error
|
||||
wxStaticBoxSizer* singleBox = new wxStaticBoxSizer(wxVERTICAL, this, "Single Error (KiCad-style)");
|
||||
wxBoxSizer* singleBtnSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
singleBtnSizer->Add(new wxButton(this, ID_SINGLE_ERROR, "Trigger Error"), 0, wxALL, 5);
|
||||
singleBtnSizer->Add(new wxStaticText(this, wxID_ANY, "Calls wxLogError(\"Error loading editor.\")"),
|
||||
0, wxALL | wxALIGN_CENTER_VERTICAL, 5);
|
||||
singleBox->Add(singleBtnSizer, 0, wxALIGN_LEFT);
|
||||
mainSizer->Add(singleBox, 0, wxEXPAND | wxALL, 10);
|
||||
|
||||
// Multiple errors section - triggers Details dropdown
|
||||
wxStaticBoxSizer* multiBox = new wxStaticBoxSizer(wxVERTICAL, this, "Multiple Errors (Details dropdown)");
|
||||
wxBoxSizer* multiBtnSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
multiBtnSizer->Add(new wxButton(this, ID_MULTIPLE_ERRORS, "Trigger Multiple"), 0, wxALL, 5);
|
||||
multiBtnSizer->Add(new wxStaticText(this, wxID_ANY, "Logs 3 errors - shows Details with wxListCtrl"),
|
||||
0, wxALL | wxALIGN_CENTER_VERTICAL, 5);
|
||||
multiBox->Add(multiBtnSizer, 0, wxALIGN_LEFT);
|
||||
mainSizer->Add(multiBox, 0, wxEXPAND | wxALL, 10);
|
||||
|
||||
// Mixed levels section
|
||||
wxStaticBoxSizer* mixedBox = new wxStaticBoxSizer(wxVERTICAL, this, "Mixed Log Levels");
|
||||
wxBoxSizer* mixedBtnSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
mixedBtnSizer->Add(new wxButton(this, ID_MIXED_LEVELS, "Mixed Levels"), 0, wxALL, 5);
|
||||
mixedBtnSizer->Add(new wxStaticText(this, wxID_ANY, "wxLogError + wxLogWarning + wxLogMessage"),
|
||||
0, wxALL | wxALIGN_CENTER_VERTICAL, 5);
|
||||
mixedBox->Add(mixedBtnSizer, 0, wxALIGN_LEFT);
|
||||
mainSizer->Add(mixedBox, 0, wxEXPAND | wxALL, 10);
|
||||
|
||||
// Control buttons
|
||||
wxStaticBoxSizer* controlBox = new wxStaticBoxSizer(wxHORIZONTAL, this, "Log Control");
|
||||
controlBox->Add(new wxButton(this, ID_FLUSH_LOG, "Flush Log (Show Dialog)"), 0, wxALL, 5);
|
||||
controlBox->Add(new wxButton(this, ID_CLEAR_LOG, "Clear Log"), 0, wxALL, 5);
|
||||
mainSizer->Add(controlBox, 0, wxEXPAND | wxALL, 10);
|
||||
|
||||
// Event log
|
||||
wxStaticBoxSizer* logBox = new wxStaticBoxSizer(wxVERTICAL, this, "Event Log");
|
||||
m_log = new wxTextCtrl(this, wxID_ANY, "",
|
||||
wxDefaultPosition, wxSize(-1, 150), wxTE_MULTILINE | wxTE_READONLY);
|
||||
logBox->Add(m_log, 1, wxEXPAND | wxALL, 5);
|
||||
mainSizer->Add(logBox, 1, wxEXPAND | wxALL, 10);
|
||||
|
||||
SetSizer(mainSizer);
|
||||
CreateStatusBar();
|
||||
SetStatusText("Ready - Click buttons to trigger wxLog errors");
|
||||
|
||||
LogEvent("wxLogError test app started");
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
EM_ASM({
|
||||
console.log('[LOGERROR_TEST] wxLogError test app started successfully');
|
||||
});
|
||||
#endif
|
||||
}
|
||||
|
||||
void LogErrorTestFrame::LogEvent(const wxString& msg)
|
||||
{
|
||||
m_log->AppendText(msg + "\n");
|
||||
SetStatusText(msg);
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
EM_ASM({
|
||||
console.log('[LOGERROR_EVENT] ' + UTF8ToString($0));
|
||||
}, msg.c_str().AsChar());
|
||||
#endif
|
||||
}
|
||||
|
||||
void LogErrorTestFrame::OnSingleError(wxCommandEvent& WXUNUSED(evt))
|
||||
{
|
||||
LogEvent("Triggering single wxLogError...");
|
||||
|
||||
// This is exactly what KiCad does in kiway.cpp
|
||||
wxLogError("Error loading editor.");
|
||||
|
||||
LogEvent("wxLogError called - dialog should appear on next event loop or Flush");
|
||||
}
|
||||
|
||||
void LogErrorTestFrame::OnMultipleErrors(wxCommandEvent& WXUNUSED(evt))
|
||||
{
|
||||
LogEvent("Triggering multiple wxLogError calls...");
|
||||
|
||||
// Multiple errors trigger the Details dropdown with wxListCtrl
|
||||
wxLogError("Failed to load shared library '/usr/bin/_pcbnew.kiface'");
|
||||
wxLogError("IO_ERROR: Failed to load kiface library");
|
||||
wxLogError("Error loading editor.");
|
||||
|
||||
LogEvent("3 errors logged - Details dropdown should appear");
|
||||
}
|
||||
|
||||
void LogErrorTestFrame::OnMixedLevels(wxCommandEvent& WXUNUSED(evt))
|
||||
{
|
||||
LogEvent("Triggering mixed log levels...");
|
||||
|
||||
wxLogError("This is an error message");
|
||||
wxLogWarning("This is a warning message");
|
||||
wxLogMessage("This is an info message");
|
||||
|
||||
LogEvent("Mixed levels logged - check console for [wxLog] output");
|
||||
}
|
||||
|
||||
void LogErrorTestFrame::OnFlushLog(wxCommandEvent& WXUNUSED(evt))
|
||||
{
|
||||
LogEvent("Flushing log - dialog should appear now...");
|
||||
|
||||
// Force the log to flush, which shows the dialog
|
||||
wxLog::FlushActive();
|
||||
|
||||
LogEvent("Flush complete - dialog should have been shown");
|
||||
}
|
||||
|
||||
void LogErrorTestFrame::OnClearLog(wxCommandEvent& WXUNUSED(evt))
|
||||
{
|
||||
LogEvent("Clearing accumulated log messages...");
|
||||
|
||||
// Get the active log and clear it without showing dialog
|
||||
wxLog* log = wxLog::GetActiveTarget();
|
||||
if (log)
|
||||
{
|
||||
// Disable logging temporarily to clear without showing
|
||||
wxLogNull noLog;
|
||||
// The accumulated messages will be discarded
|
||||
}
|
||||
|
||||
LogEvent("Log cleared");
|
||||
}
|
||||
Loading…
Reference in a new issue