pcbjam/tests/apps/standalone/fontenum/fontenum_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

250 lines
7.8 KiB
C++

// wxFontEnumerator Test - Tests Local Font Access API integration
// Tests: wxFontEnumerator::EnumerateFacenames(), font listing, sample rendering
#include "wx/wx.h"
#include "wx/fontenum.h"
#include "wx/listbox.h"
// Custom font enumerator that collects font names
class FontCollector : public wxFontEnumerator
{
public:
wxArrayString& GetFonts() { return m_fonts; }
protected:
virtual bool OnFacename(const wxString& facename) override
{
m_fonts.Add(facename);
return true; // Continue enumeration
}
private:
wxArrayString m_fonts;
};
class FontEnumFrame : public wxFrame
{
public:
FontEnumFrame() : wxFrame(nullptr, wxID_ANY, "wxFontEnumerator Test",
wxDefaultPosition, wxSize(800, 600))
{
wxPanel* mainPanel = new wxPanel(this);
wxBoxSizer* mainSizer = new wxBoxSizer(wxHORIZONTAL);
// Left panel - font list
wxBoxSizer* leftSizer = new wxBoxSizer(wxVERTICAL);
wxStaticText* listLabel = new wxStaticText(mainPanel, wxID_ANY,
"System Fonts (via Local Font Access API):");
leftSizer->Add(listLabel, 0, wxALL, 5);
m_fontList = new wxListBox(mainPanel, wxID_ANY, wxDefaultPosition,
wxSize(300, -1));
m_fontList->Bind(wxEVT_LISTBOX, &FontEnumFrame::OnFontSelected, this);
leftSizer->Add(m_fontList, 1, wxEXPAND | wxALL, 5);
m_enumButton = new wxButton(mainPanel, wxID_ANY, "Enumerate Fonts");
m_enumButton->Bind(wxEVT_BUTTON, &FontEnumFrame::OnEnumerateFonts, this);
leftSizer->Add(m_enumButton, 0, wxALL, 5);
m_statusText = new wxStaticText(mainPanel, wxID_ANY, "Click 'Enumerate Fonts' to start");
leftSizer->Add(m_statusText, 0, wxALL, 5);
mainSizer->Add(leftSizer, 0, wxEXPAND | wxALL, 5);
// Right panel - font preview
wxBoxSizer* rightSizer = new wxBoxSizer(wxVERTICAL);
wxStaticText* previewLabel = new wxStaticText(mainPanel, wxID_ANY, "Font Preview:");
rightSizer->Add(previewLabel, 0, wxALL, 5);
m_previewPanel = new wxPanel(mainPanel, wxID_ANY, wxDefaultPosition,
wxSize(-1, 200));
m_previewPanel->SetBackgroundColour(*wxWHITE);
m_previewPanel->Bind(wxEVT_PAINT, &FontEnumFrame::OnPaintPreview, this);
rightSizer->Add(m_previewPanel, 0, wxEXPAND | wxALL, 5);
// Sample text sizes
wxStaticText* sizesLabel = new wxStaticText(mainPanel, wxID_ANY, "Sample Text at Different Sizes:");
rightSizer->Add(sizesLabel, 0, wxALL, 5);
m_samplesPanel = new wxPanel(mainPanel, wxID_ANY, wxDefaultPosition,
wxSize(-1, 250));
m_samplesPanel->SetBackgroundColour(*wxWHITE);
m_samplesPanel->Bind(wxEVT_PAINT, &FontEnumFrame::OnPaintSamples, this);
rightSizer->Add(m_samplesPanel, 1, wxEXPAND | wxALL, 5);
mainSizer->Add(rightSizer, 1, wxEXPAND | wxALL, 5);
mainPanel->SetSizer(mainSizer);
// Event log
m_log = new wxTextCtrl(this, wxID_ANY, "", wxDefaultPosition, wxSize(-1, 100),
wxTE_MULTILINE | wxTE_READONLY);
wxBoxSizer* frameSizer = new wxBoxSizer(wxVERTICAL);
frameSizer->Add(mainPanel, 1, wxEXPAND);
frameSizer->Add(m_log, 0, wxEXPAND | wxALL, 5);
SetSizer(frameSizer);
CreateStatusBar();
SetStatusText("Font Enumeration Test - Uses Local Font Access API");
Log("Font enumeration test app started");
Log("Note: Requires Chrome/Edge 103+ and user permission");
// Auto-enumerate fonts on startup for testing
CallAfter([this]() {
wxCommandEvent evt;
OnEnumerateFonts(evt);
});
}
private:
void OnEnumerateFonts(wxCommandEvent& event)
{
m_fontList->Clear();
m_selectedFont.Clear();
m_previewPanel->Refresh();
m_samplesPanel->Refresh();
Log("Starting font enumeration...");
m_statusText->SetLabel("Enumerating fonts...");
FontCollector collector;
bool success = collector.EnumerateFacenames();
if (success)
{
wxArrayString& fonts = collector.GetFonts();
int count = fonts.GetCount();
Log(wxString::Format("Found %d font families", count));
m_statusText->SetLabel(wxString::Format("Found %d fonts", count));
for (size_t i = 0; i < fonts.GetCount(); i++)
{
m_fontList->Append(fonts[i]);
}
if (count > 0)
{
m_fontList->SetSelection(0);
m_selectedFont = fonts[0];
m_previewPanel->Refresh();
m_samplesPanel->Refresh();
}
}
else
{
Log("Font enumeration failed or permission denied");
m_statusText->SetLabel("Enumeration failed - check console");
// Add a note about the API requirement
m_fontList->Append("(Font enumeration unavailable)");
m_fontList->Append("Requires:");
m_fontList->Append("- Chrome/Edge 103+");
m_fontList->Append("- User permission");
}
}
void OnFontSelected(wxCommandEvent& event)
{
int sel = m_fontList->GetSelection();
if (sel != wxNOT_FOUND)
{
m_selectedFont = m_fontList->GetString(sel);
Log(wxString::Format("Selected font: %s", m_selectedFont));
m_previewPanel->Refresh();
m_samplesPanel->Refresh();
}
}
void OnPaintPreview(wxPaintEvent& event)
{
wxPaintDC dc(m_previewPanel);
dc.SetBackground(*wxWHITE_BRUSH);
dc.Clear();
if (m_selectedFont.IsEmpty())
{
dc.SetFont(wxFont(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_ITALIC, wxFONTWEIGHT_NORMAL));
dc.SetTextForeground(wxColour(128, 128, 128));
dc.DrawText("Select a font to preview", 10, 10);
return;
}
// Draw font name and sample text
wxFont font(24, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL,
false, m_selectedFont);
dc.SetFont(font);
dc.SetTextForeground(*wxBLACK);
int y = 10;
dc.DrawText(m_selectedFont, 10, y);
y += 40;
dc.DrawText("The quick brown fox jumps over the lazy dog", 10, y);
y += 40;
dc.DrawText("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 10, y);
y += 40;
dc.DrawText("abcdefghijklmnopqrstuvwxyz", 10, y);
y += 40;
dc.DrawText("0123456789 !@#$%^&*()", 10, y);
}
void OnPaintSamples(wxPaintEvent& event)
{
wxPaintDC dc(m_samplesPanel);
dc.SetBackground(*wxWHITE_BRUSH);
dc.Clear();
if (m_selectedFont.IsEmpty())
{
return;
}
int sizes[] = {8, 10, 12, 14, 16, 18, 24, 32};
int y = 10;
for (int size : sizes)
{
wxFont font(size, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL,
false, m_selectedFont);
dc.SetFont(font);
dc.SetTextForeground(*wxBLACK);
wxString sample = wxString::Format("%dpt: Sample Text AaBbCc 123", size);
dc.DrawText(sample, 10, y);
y += size + 8;
}
}
void Log(const wxString& msg)
{
m_log->AppendText(msg + "\n");
}
wxListBox* m_fontList;
wxButton* m_enumButton;
wxStaticText* m_statusText;
wxPanel* m_previewPanel;
wxPanel* m_samplesPanel;
wxTextCtrl* m_log;
wxString m_selectedFont;
};
class FontEnumApp : public wxApp
{
public:
virtual bool OnInit() override
{
FontEnumFrame* frame = new FontEnumFrame();
frame->Show();
return true;
}
};
wxIMPLEMENT_APP(FontEnumApp);