Fifteen display strings in the two preference forms were written as GTK mnemonics -- `_Directory`, `_Server`, `Multicast _group`, `_Theme` and the rest -- but the property that makes GTK read them was never set, so GTK drew the underscore literally: `_Directory` in the row, not a D with a line under it. Two switches are involved, FALSE by default in each case. `GtkLabel`/`GtkButton` take `use-underline`; the rows take `AdwPreferencesRow:use-underline`, "whether an embedded underline in the title indicates a mnemonic". The two buttons in the source form already set it (so their mnemonics worked and showed no underscore); the thirteen rows did not. All thirteen now do. The row classes that carry the property are not all related -- AdwEntryRow has its own, while AdwSpinRow, AdwComboRow and AdwSwitchRow get it through AdwActionRow -- so the probe reads it by name on a GObject (g_object_class_find_property, then g_object_get) rather than casting to one row type; a cast to a `GtkWidget*` where the type is only forward-declared does not compile at all. `_Cancel` and `_Connect` both claimed C in the same form, so Alt+C could only reach one of them: that marker was unreachable, which is worse than absent because it is in the source to be trusted. `_Connect` becomes `Conn_ect`, freeing C for Cancel. [prefs-probe] reads the count (4/4) on the real widgets; check_ui validates the property against the GIR for every object in every .ui file, inherited properties included.
101 lines
5.2 KiB
XML
101 lines
5.2 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!-- SPDX-License-Identifier: MIT -->
|
|
<!-- SPDX-FileCopyrightText: 2026 Martino Ferrari -->
|
|
<!--
|
|
The preferences, as an AdwPreferencesDialog: pages of groups of rows, which is what every GNOME
|
|
application shows and what libadwaita's own widgets are for. The rows are AdwEntryRow, AdwSpinRow,
|
|
AdwSwitchRow, AdwComboRow and AdwButtonRow rather than a label and a bare GtkEntry in a GtkBox, so
|
|
they behave the way a reader expects — each one is a whole row, with its own title, an optional
|
|
subtitle underneath, and the editing widget on the right where a finger expects it.
|
|
|
|
**There is no Apply button, deliberately.** A preferences row applies as it changes, which is the
|
|
practice these widgets are designed around and why they carry an `apply` of their own (AdwEntryRow's
|
|
show-apply-button is off here: the write is a few bytes to one file, so a keystroke is not worth
|
|
batching). The two settings that cannot take effect immediately — the cache directory and relative
|
|
time, both of which are planned before any source is known — say so in their subtitles instead of
|
|
being held back by a button.
|
|
|
|
Nothing here carries a value: `ui_prefs.cpp` fills the rows from `Settings` when the dialog opens,
|
|
and writes it back on every change. This file is the shape, that is the state.
|
|
-->
|
|
<interface>
|
|
<object class="AdwPreferencesDialog" id="preferences">
|
|
<property name="title" translatable="yes">Preferences</property>
|
|
<property name="search-enabled">0</property>
|
|
<child>
|
|
<object class="AdwPreferencesPage">
|
|
<property name="title" translatable="yes">Event cache</property>
|
|
<property name="icon-name">udpscope-events-symbolic</property>
|
|
<property name="description" translatable="yes">Latches are written here as they happen; whether anything is written at all is the trigger panel's own switch.</property>
|
|
<child>
|
|
<object class="AdwPreferencesGroup">
|
|
<child>
|
|
<object class="AdwEntryRow" id="dir_row">
|
|
<property name="title" translatable="yes">_Directory</property>
|
|
<property name="use-underline">True</property>
|
|
<property name="tooltip-text" translatable="yes">One directory in which every source gets a folder of its own, never one directory between two sources</property>
|
|
</object>
|
|
</child>
|
|
<child>
|
|
<object class="AdwSpinRow" id="keep_row">
|
|
<property name="title" translatable="yes">Keep _events</property>
|
|
<property name="use-underline">True</property>
|
|
<property name="subtitle" translatable="yes">Per source; 0 keeps every event, which is a decision about the disk</property>
|
|
<property name="adjustment">
|
|
<object class="GtkAdjustment">
|
|
<property name="lower">0</property>
|
|
<property name="upper">100000</property>
|
|
<property name="step-increment">1</property>
|
|
<property name="value">32</property>
|
|
</object>
|
|
</property>
|
|
</object>
|
|
</child>
|
|
</object>
|
|
</child>
|
|
</object>
|
|
</child>
|
|
<child>
|
|
<object class="AdwPreferencesPage">
|
|
<property name="title" translatable="yes">Plot</property>
|
|
<property name="icon-name">udpscope-measure-symbolic</property>
|
|
<child>
|
|
<object class="AdwPreferencesGroup">
|
|
<child>
|
|
<object class="AdwSwitchRow" id="relative_row">
|
|
<property name="title" translatable="yes">_Relative time</property>
|
|
<property name="use-underline">True</property>
|
|
<property name="subtitle" translatable="yes">Take the plot's time from the sample rate and the packet counter rather than from the stream's own clock, so arrival and clock jitter cannot move a sample; absolute time is still kept for export. Read at start-up, because the buffers are planned before any source is known.</property>
|
|
</object>
|
|
</child>
|
|
<child>
|
|
<object class="AdwComboRow" id="theme_row">
|
|
<property name="title" translatable="yes">_Theme</property>
|
|
<property name="use-underline">True</property>
|
|
<property name="subtitle" translatable="yes">What the interface looks like; auto follows the system</property>
|
|
</object>
|
|
</child>
|
|
</object>
|
|
</child>
|
|
</object>
|
|
</child>
|
|
<child>
|
|
<object class="AdwPreferencesPage">
|
|
<property name="title" translatable="yes">Reset</property>
|
|
<property name="icon-name">view-refresh-symbolic</property>
|
|
<child>
|
|
<object class="AdwPreferencesGroup">
|
|
<child>
|
|
<object class="AdwButtonRow" id="reset_row">
|
|
<property name="title" translatable="yes">_Reset to defaults</property>
|
|
<property name="use-underline">True</property>
|
|
<property name="start-icon-name">view-refresh-symbolic</property>
|
|
</object>
|
|
</child>
|
|
</object>
|
|
</child>
|
|
</object>
|
|
</child>
|
|
</object>
|
|
</interface>
|