Tables & Alarm Viewer¶
TablePostgre — Industrial-Grade Data Tables¶
We built a complete data table widget with direct PostgreSQL connectivity, virtual scrolling, multi-column sorting, aggregation functions, advanced filtering, and real-time refresh — all in a single C++ EWO component.
Master-Detail Pattern¶
Click a row and a secondary table loads the related data. We designed this interaction to feel natural — no popups, no page changes, just fluid context switching:
Column Customization¶
Every column is individually configurable at runtime — sorting, formatting, filtering, conditional colors, and export:
Conditional Progress Bars¶
We implemented visual cell renderers that transform raw numbers into intuitive graphics. The progress bar renderer maps values to a filled bar with percentage label:
Multi-View Dashboards¶
Multiple table instances can be synchronized in a single dashboard, creating complex analytical views:
Key Technical Features¶
- Virtual scrolling — renders only visible rows, handles thousands of records without performance degradation
- Multi-column sort — chained sorting with visual indicators
- SQL aggregation — SUM, AVG, COUNT, MIN, MAX with summary rows
- Real-time refresh — configurable polling interval for live data
- Network support — can pull data from remote sources, not just local PostgreSQL
AlarmViewer — Real-Time Alarm Management¶
A specialized alarm widget for high-frequency industrial alarm streams:
- Blink Controller — unacknowledged alarms blink with a configurable animation (row background, priority dot, or text) to grab operator attention
- 7 column types — Text, Badge, Icon, Checkbox, Priority, DateTime, Actions
- 4 priority levels — High (red), Medium (orange), Low (yellow), Warning (blue) with color-coded indicators
- Deferred rendering — updates throttled to ~30fps, preventing UI freeze during alarm storms
- Multi-select with Ctrl+Click and bulk acknowledge
- Pagination — dynamic row calculation based on available viewport height
The blink controller is a separate, testable component — not embedded in the rendering loop. This means blink behavior can be changed without touching the table rendering code.