François 3be5bc3f6e ODS polish + reusable confirm modal + file-dialog focus/overwrite fixes.
ODS writer:
- Header row styled bold on a grey background; data rows alternate
  light-grey / white (zebra). Auto-filter buttons enabled per sheet
  via `<table:database-range table:display-filter-buttons="true">`
  — sheet names are now single-quoted in the target-range-address so
  LibreOffice actually parses ranges that contain spaces.
- First row of every sheet frozen via `settings.xml` (view setting).
  The settings layout follows LibreOffice's own writer exactly:
  `xmlns:ooo` + `xmlns:xlink` declared on the root, `ActiveTable` and
  view-level zoom/grid/headers placed *after* the Tables map (the
  order LibreOffice expects to read back). HorizontalSplitMode = 0,
  VerticalSplitMode = 2 → only the first row is frozen, the first
  column scrolls normally. ActiveSplitRange = 2 (bottom-left pane).
  `settings.xml` registered in `META-INF/manifest.xml`.

Reusable Yes/No modal:
- New `screen_confirm.cpp` exposing `Tui::ShowConfirm(msg, on_yes)`.
  Centred `borderRounded` popup, `No` first (safer default), Enter
  confirms the focused button, Esc cancels (treated as No).
- Stacked into the Modal chain in `Run()` (between file-dialog and
  error). The outer `CatchEvent` cedes events when it's open.

File dialog:
- Picks `OK` button focus reliably — previously the focus indices in
  the Renderer were remapped against the Container::Vertical child
  indices, so the OK label only flagged "focused" while the actual
  focused child was the filename input.
- OK button uses a custom `ButtonOption::transform` that renders the
  label transparent when idle, inverted when focused. No more
  cyan-fill, no more double-inversion via FocusLabel.
- After confirmation, if the picked path already exists, pops a
  `ShowConfirm("File … already exists. Overwrite?")` before invoking
  the caller's action.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-16 13:36:05 +02:00
2025-03-21 18:47:49 +01:00
2025-03-21 18:51:19 +01:00
2026-05-08 20:38:30 +02:00

essim — system digital twin

Interactive simulator for the inter-card connections inside a system. Built around a domain model of modules → parts → pins / signals → connections, with importers for Mentor Graphics, Altium and ODS pinout sheets, a TUI shell with scripting, snapshots and BFS net analysis.

Status: early work-in-progress.

Quick start

cmake -S . -B build
cmake --build build -j
./build/essim

Requirements:

  • A C++17 compiler.
  • CMake 3.14+.
  • System packages: libzip and pugixml (Arch: pacman -S libzip pugixml).
  • FTXUI (v6.1.9) and doctest (v2.4.11) are fetched at configure time via FetchContent.

Inside the shell, type help for the live command list — or read the auto-generated reference at doc/user/commands.md. A worked bring-up script is at test/system.essim; load it with source test/system.essim.

Tests

./build/essim_tests
# or
ctest --test-dir build

Skip building tests entirely:

cmake -S . -B build -DBUILD_TESTING=OFF

Documentation

  • doc/user/ — user guide, command reference, scripting.
  • doc/api/ — auto-generated C++ API reference.
  • DESIGN.md — implementation notes (domain conventions, TUI internals, gotchas).
  • doc/README.md — how the doc pipeline is wired.

Regenerate auto-generated parts after substantive code changes:

cmake --build build --target doc      # needs doxygen + python3

Project layout

src/system/   domain model (Module/Part/Pin/Signal, Connection, Transform, …)
src/imports/  Mentor / Altium / ODS netlist importers
src/tui/      FTXUI shell (commands, screens, completion, history)
tests/        doctest suite
doc/          api/ + user/ Markdown trees, Doxyfile.in, gen_api_md.py
test/         sample netlists + system.essim bring-up script

Full layout & rationale in DESIGN.md.

Licence

Copyright (c) 2026 François Dausseur

Licensed under the European Union Public Licence (EUPL), Version 1.2 — the "Licence". You may not use this work except in compliance with the Licence. You may obtain a copy of the Licence in the LICENSE file or at https://joinup.ec.europa.eu/software/page/eupl.

Unless required by applicable law or agreed to in writing, software distributed under the Licence is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Licence for the specific language governing permissions and limitations under the Licence.

SPDX-License-Identifier: EUPL-1.2

Description
Embedded System Simulation
Readme EUPL-1.2 3.8 MiB
Languages
C++ 98.2%
CMake 1.8%