ui: each tab's glyph is a pair, not one icon

The Measure tab is now `udpscope-tab-measure-symbolic` — the two cursors standing across a ruler — and
the Signals tab is `udpscope-tab-signals-symbolic` — the trigger's rising edge over the channel list it
acts on. Each is a 16px composite rather than one of the icons the toolbar carries: a glyph the toolbar
already uses for one thing means two things the moment a tab shows it too, which is why the ruler alone
and the trigger alone were both wrong here.

The plain ruler stays exactly where it was. `udpscope-measure-symbolic` is the Preferences window's Plot
page icon and is untouched; the tab's pair is a new file beside it, so nothing that already meant "the
measurement ruler" changed meaning. Seven action icons bundled, nine with the two app icons.

Both composites are at the limit of what 16px holds — four features each — so each was drawn and then
*measured*: rasterized and read back as an ink map, since the shapes have to be checked as pixels and the
house range is 25-36% ink (trigger 25, cursors 27, ruler 36). The Signals list is two rows and not three,
so the edge and the list get half the cell each; its bars are all one length, because unequal ones read as
a bar chart and a chart is not a list. The Measure ruler's ends are open on purpose: a closed frame puts
four more pixels of ink at the left and right edges, which is what turns a ruler into a rectangle at this
size. First drafts came out at 39% and 44% ink and were rebalanced to 32% and 36%.

Verified: `page icons: measure=udpscope-tab-measure-symbolic(ok) signals=udpscope-tab-signals-symbolic(ok)`;
`switcher: policy=narrow pills=2 labels=0 names=2`; `[side-tab-probe] … advanced=4` (switching by page
name still works); the Preferences dialog opened in the same run with no "not present"; `make test-ui` 14
files; zero `Gtk-CRITICAL`. The icons' GResource blob is now 11309 bytes, still over C99's 4095-byte
string-literal limit, so the clean-build warning count is still four.
This commit is contained in:
Martino Ferrari committed 2026-10-14 13:33:24 +02:00
1 parent 0b146f1d53
commit e615465366
9 files changed
+76 -40

No files matched your search

@@ -1,19 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- SPDX-License-Identifier: MIT -->
<!-- SPDX-FileCopyrightText: 2026 Martino Ferrari -->
<!-- The Signals tab's own glyph: the channel list, drawn as a list. Three rows of a
colour chip and a name, the shape the signal panel's own rows have — which is
what the tab mostly *is*, and which is why it is not the trigger icon: the
toolbar's trigger button already carries that one, and one glyph with two
meanings in one window is worse than a new glyph. The bars are all one length
on purpose: unequal ones read as a bar chart, and a chart is not a list. Every
coordinate is a whole pixel of the 16px cell, every subpath is a filled `path`
wound the same way, and the 2px bars match the house stroke weight. -->
<svg height="16px" width="16px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<path fill="#2e3436" d="M1 1 H4 V4 H1 Z
M6 2 H14 V4 H6 Z
M1 6 H4 V9 H1 Z
M6 7 H14 V9 H6 Z
M1 11 H4 V14 H1 Z
M6 12 H14 V14 H6 Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- SPDX-License-Identifier: MIT -->
<!-- SPDX-FileCopyrightText: 2026 Martino Ferrari -->
<!-- The Measure tab: the cursors and the ruler they read against, in one glyph. Two markers, each a
cap over a dashed shaft, stand across a ruler: the ruler is two bars with three hanging ticks.
The ruler's ends are open on purpose. A closed frame puts four more pixels of ink at the left
and right edges, which at this size is what turns a ruler into a rectangle. The shafts stop at
the bars rather than crossing them, the way a marker on a plot sits over the scale. Whole
pixels, filled `path`s wound the same way, and an ink fraction of 36%, in line with the ruler
and the cursors it is made of. -->
<svg height="16px" width="16px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<path fill="#2e3436" d="M3 1 H7 V3 H3 Z
M9 1 H13 V3 H9 Z
M4 3 H6 V6 H4 Z
M10 3 H12 V6 H10 Z
M4 14 H6 V16 H4 Z
M10 14 H12 V16 H10 Z
M2 6 H14 V8 H2 Z
M2 12 H14 V14 H2 Z
M4 8 H5 V11 H4 Z
M8 8 H9 V10 H8 Z
M12 8 H13 V11 H12 Z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- SPDX-License-Identifier: MIT -->
<!-- SPDX-FileCopyrightText: 2026 Martino Ferrari -->
<!-- The Signals tab: the trigger *and* the channel list it acts on, in one glyph. A rising edge
crossing a dashed level is the trigger as the toolbar already draws it; below it, two rows of a
colour chip and a name are the channel list, which is what the page mostly is. Two rows and not
three, so the edge and the list each get half the cell: at 16px a third row costs the edge its
clearance and the whole thing turns into a grid. Whole pixels, filled `path`s wound the same
way, and the 2px bars match the house stroke weight. -->
<svg height="16px" width="16px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<path fill="#2e3436" d="M6 1 H8 V6 H6 Z
M6 1 H15 V3 H6 Z
M0 5 H2 V7 H0 Z
M3 5 H5 V7 H3 Z
M12 5 H14 V7 H12 Z
M1 9 H4 V12 H1 Z
M6 10 H14 V12 H6 Z
M1 13 H4 V15 H1 Z
M6 13 H14 V15 H6 Z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

+2 -1
View File
@@ -20,7 +20,8 @@
<file preprocess="xml-stripblanks">scalable/actions/udpscope-trigger-symbolic.svg</file>
<file preprocess="xml-stripblanks">scalable/actions/udpscope-cursors-symbolic.svg</file>
<file preprocess="xml-stripblanks">scalable/actions/udpscope-measure-symbolic.svg</file>
<file preprocess="xml-stripblanks">scalable/actions/udpscope-signals-symbolic.svg</file>
<file preprocess="xml-stripblanks">scalable/actions/udpscope-tab-measure-symbolic.svg</file>
<file preprocess="xml-stripblanks">scalable/actions/udpscope-tab-signals-symbolic.svg</file>
<file preprocess="xml-stripblanks">scalable/actions/udpscope-events-symbolic.svg</file>
<file preprocess="xml-stripblanks">scalable/actions/udpscope-resize-rows-symbolic.svg</file>
<file preprocess="xml-stripblanks">scalable/apps/org.udpscope.app.svg</file>
+11 -8
View File
@@ -60,10 +60,12 @@
`select_side_tab()` and the session file, and the words are re-attached to the pills in
code — tooltip and accessible name — by `name_side_tabs()` on the first tick, so an
icon-only pill is still a named thing rather than an anonymous button.
Each page's icon is its own glyph: `udpscope-measure-symbolic` is the ruler the
measurements used as a toggle, and `udpscope-signals-symbolic` is the channel list,
drawn for this tab rather than reusing the toolbar's trigger icon — one glyph
meaning two things in one window is worse than a new one. -->
Each page's icon is a glyph of its own, and each one is a *pair*: the Measure tab is
`udpscope-tab-measure-symbolic` (the cursors and the ruler they read against), and the
Signals tab is `udpscope-tab-signals-symbolic` (the trigger's edge and the channel list
below it). They are drawn for the tabs rather than reusing the icons the toolbar and the
Preferences window already carry: a glyph the toolbar uses for one thing means two things
the moment a tab shows it too. -->
<object class="GtkBox" id="side_column">
<property name="orientation">vertical</property>
<property name="width-request">300</property>
@@ -84,8 +86,9 @@
<object class="AdwViewStackPage">
<property name="name">measure</property>
<property name="title"></property>
<!-- The ruler: what the pane measures the waveform with. -->
<property name="icon-name">udpscope-measure-symbolic</property>
<!-- The cursors and the ruler: what the pane brackets, and what it
reads the bracketed window with. -->
<property name="icon-name">udpscope-tab-measure-symbolic</property>
<property name="child">
<object class="GtkScrolledWindow">
<property name="hscrollbar-policy">never</property>
@@ -103,8 +106,8 @@
<object class="AdwViewStackPage">
<property name="name">signals</property>
<property name="title"></property>
<!-- The channel list this page mostly is. -->
<property name="icon-name">udpscope-signals-symbolic</property>
<!-- The trigger and the channel list it acts on. -->
<property name="icon-name">udpscope-tab-signals-symbolic</property>
<property name="child">
<object class="GtkScrolledWindow">
<property name="hscrollbar-policy">never</property>