<div style="font-family: Arial, sans-serif; font-size: 14px;">Hi,</div><div style="font-family: Arial, sans-serif; font-size: 14px;"><br></div><div style="font-family: Arial, sans-serif; font-size: 14px;"><br></div><div style="font-family: Arial, sans-serif; font-size: 14px;">Here is our weekly Mapiah release: v0.3.3 - <span>The <a href="https://xkcd.com/3218" title="Subduction Retrieval ">Subduction Retrieval</a> release.</span></div><div style="font-family: Arial, sans-serif; font-size: 14px;"><span><br></span></div><div style="font-family: Arial, sans-serif; font-size: 14px;"><span><span># Changelog</span><div><br></div><div><span>## 0.3.3 - 2026-03-27 - The [Subduction Retrieval](<a target="_blank" rel="noreferrer nofollow noopener" href="https://xkcd.com/3218">https://xkcd.com/3218</a>) release</span></div><div><span>* Highlights:</span></div><div><span> * **State-context FABs** bring the most-used actions directly onto the canvas, adapting to the current editing state (selection, single-line edit, empty selection).</span></div><div><span> * **Default options** let you pre-configure point, line, and area attributes that are automatically applied to every newly created element.</span></div><div><span> * **Search and select dialog** lets you find and select elements by type, ID, subtype, and option presence — including per-segment options on lines.</span></div><div><span> * **Split line at selected points** (Ctrl+Shift+P) in single-line-edit mode makes it easy to break a line into sub-lines while preserving options.</span></div><div><span> * **Hide elements** (Ctrl+H) temporarily removes selected elements from the canvas without saving the change, useful for uncluttering complex scraps.</span></div><div><span> * **XVI survey grid visibility** can now be toggled per-image or all at once (Ctrl+G), independently from the image itself.</span></div><div><span> * **TH2 file properties page** exposes per-file settings (currently file encoding) via a settings button in each file tab.</span></div><div><span> * **Anonymous opt-in telemetry** (daily aggregate usage data — no personal information) with consent dialog on first launch and a Settings toggle.</span></div><div><span>* New features:</span></div><div><span> * Area-border selection shortcuts updated: Ctrl/Meta+click now cycles border-line selection for areas with multiple border lines (all lines → each line in THAreaBorderTHIDs order → all lines again while Ctrl/Meta stays pressed [requested by Marco Corvi]). Area-only selection changed from Ctrl/Meta+Shift+click to Ctrl/Meta+Alt+click.</span></div><div><span> * Show direction ticks on non-selected lines: new Settings toggle (TH2Edit_ShowDirectionTicksOnNonSelectedLines, default off). When off, only selected lines show direction ticks (previous behaviour). When on, all lines in the active scrap show direction ticks regardless of selection. Also togglable via Ctrl+Alt+R. [requested by Marco Corvi]</span></div><div><span> * Default option values: pressing 'O' with no elements selected (or clicking the new tune button in the top right corner) opens a "Default options" overlay with Points / Lines / Areas tabs. Options set there are automatically applied to every newly created element of the matching type. A Reset button clears all defaults for the current category.</span></div><div><span> * Anonymous telemetry: Mapiah can optionally collect aggregated, anonymous daily usage data (OS type/version, Mapiah version, TH2 open counts and time, Therion run counts and time). A consent dialog is shown on first launch; consent can be changed at any time in Settings. No file paths, personal data, or identifying information is ever collected or transmitted. Data is aggregated client-side before sending and only previous UTC days' records are ever transmitted.</span></div><div><span> * XVI image grid visibility toggle: each XVI image row in the available images panel now has a second checkbox to show or hide the survey grid independently from the image itself. Hiding the grid removes the grid lines from the canvas while keeping shots, stations, and sketch lines visible. The grid visibility state is persisted in the session.</span></div><div><span> * Toggle all grids visibility button (Ctrl+G): a new icon button in the available images panel header hides or shows all XVI survey grids at once; it is only shown when at least one XVI image is present. The existing toggle all images button tooltip now also displays the Ctrl+I shortcut hint.</span></div><div><span> * Checkbox clarity in the available images panel: each image row now shows a small image icon beside the visibility checkbox and a small grid icon beside the grid-visibility checkbox, making it immediately clear which checkbox controls what without needing to hover for a tooltip.</span></div><div><span> * Search and select dialog: find and select elements in the current scrap by type, ID, subtype, and option presence. Supports set/add/remove selection actions with live matching count. Accessible via the search button in the top right corner.</span></div><div><span> * Search and select dialog: added "By line segment option" filter in the Lines section, allowing lines to be selected based on whether any of their segments have specific options set or unset.</span></div><div><span> * Ctrl+H shortcut: hides selected elements from the canvas (they are also deselected and no longer selectable); with no selection, clears all hidden elements and makes them visible again. Hidden elements are a temporary canvas-only state and are not saved to the file.</span></div><div><span> * Showing selected elements on single line edit.</span></div><div><span> * Show status message listing what's selected in 'single line edit' mode.</span></div><div><span> * When moving an object of end/control point, show mouse position in canvas coordinates on status bar.</span></div><div><span> * Split line at selected points (Ctrl+Shift+P): in single-line-edit mode, select one or more non-last line points and press Ctrl+Shift+P to split the line at those points. Each resulting sub-line preserves all options of the original; if the original had an -id, sub-lines receive -id suffixed with -1, -2, etc. Area border lines are protected (a message is shown and no split occurs). After splitting, all sub-lines are selected. The operation is fully undoable.</span></div><div><span> * State-context FABs: a horizontal row of mini FABs appears at the top-left corner of the canvas and changes based on the current editing state. In single-line-edit mode the row offers: select/deselect all end points (toggle), simplify lines (keep types / force straight / force Bézier), open option window, split line at selected end points, reverse line, and smooth line segments. In non-empty selection mode the row adds: copy, cut, paste, duplicate, create map connection lines, and a select/deselect all elements toggle. In empty selection mode only the select-all toggle and paste button are shown. Buttons are automatically enabled or disabled based on selection state and clipboard content.</span></div><div><span>* Fixed bugs:</span></div><div><span> * State-context FABs in single-line-edit mode (split line, open option window, smooth line segments): buttons were never enabled when selecting an end point. Root cause: `_selectedEndControlPoints` was mutated in-place (`.clear()`, `[key]=value`, `.remove()`), but MobX only fires atom notifications on map **assignment**; the `hasSelectedEndPoints` computed therefore never updated. Fixed by replacing all in-place mutations with full map reassignments.</span></div><div><span> * Select/deselect all button: the button never changed from "Select all" to "Deselect all" because areAllElementsSelected always returned false. Root cause: it compared the selected count against getSelectableLogicalElementCount() which returned 0 whenever _mpSelectableElements was null (not yet lazily initialized). Fixed by rewriting areAllElementsSelected to count selectable elements directly from the active scrap's childrenMPIDs, which avoids the lazy-init side effect and keeps the computed pure and reactive.</span></div><div><span> * Test 3100 (new file dialog): telemetry consent dialog was blocking the home UI because consent was unset in the test environment. Fixed by setting consent in setUp before pumping the app.</span></div><div><span> * MPSettingsController: all setter methods (setBool, setInt, setDouble, setString, setStringList, setEnum) now always write the value to storage, even when it matches the implicit default. Previously, setting a value equal to the default was a no-op, so isXxxSet() returned false as if the setting had never been touched — causing the telemetry consent dialog to reappear on every launch after a user had refused.</span></div><div><span> * Telemetry: session time spanning midnight was fully attributed to the new day. The rollover now snapshots active TH2 and Therion session time up to midnight into the old day's record and resets the in-memory session baseline to midnight, so each day receives only the time that actually occurred within it. [suggested by Patrícia Finageiv]</span></div><div><span> * "Reset" button in search and select dialog is enabled when there is no active filter configuration.</span></div><div><span> * Fixed crash when adding a point with default options configured: option commands (subtype + defaults) are now placed in the posCommand of MPAddPointCommand instead of alongside it in MPMultipleElementsCommand, so they run after the point is in the file and the MPID lookup succeeds. Added regression tests (1305).</span></div><div><span> * Reset button in the default options overlay window was invisible when enabled because TextButton defaults to colorScheme.primary for its text, which matched the block's primary background. Fixed by explicitly setting foregroundColor to colorScheme.onPrimary.</span></div><div><span>* Infrastructure maintenance:</span></div><div><span> * Fixed area-border Ctrl/Meta+click cycling: refactored cycle index to use -1 as sentinel for "all border lines selected" (previously 0), making the index directly usable as a list index for individual lines. Fixed double-index-advance bug where pointer-down and pointer-up each called the cycle independently; pointer-down now skips the selectable elements query when Ctrl/Meta-only is pressed.</span></div><div><span> * Moved resetAreaBorderCtrlMetaCycle key-up handling from the base MPTH2FileEditState into a dedicated shared mixin applied only to MPTH2FileEditStateSelectEmptySelection and MPTH2FileEditStateSelectNonEmptySelection, limiting the behavior to selection modes.</span></div><div><span> * Added widget regression tests for area-border selection shortcuts (3710), including Ctrl/Meta cycling, Ctrl/Meta+Alt area-only selection, and checks that Ctrl/Meta+Shift is no longer area-only.</span></div><div><span> * Extracted TH2FileEditAreaLineCreationController: separated all area and line creation logic from TH2FileEditElementEditController into a dedicated MobX controller for better separation of concerns.</span></div><div><span> * Created TH2FileEditSearchController: new MobX controller for search and select functionality.</span></div><div><span> * Added public getAllSupportedPointOptions/LineOptions/AreaOptions getters to MPCommandOptionAux.</span></div><div><span> * Removed the legacy TH2FileEditPage entry point, standardized widget tests on TH2FileTabsPage with a shared test helper, and made MPGeneralController.reset clear tab state for isolated tabbed-page tests.</span></div><div><span> * Extracted MPDialogBottomWidget: shared widget for the dialog button area (divider + tinted background + rounded bottom corners), used by both the help dialog and the search and select dialog.</span></div><div><span> * Removed duplicate TH2FileEditOverlayWindowController.close() method; unified callers to use clearOverlayWindows().</span></div><div><span> * clearOverlayWindows() now accepts an optional except parameter to preserve specific window types.</span></div><div><span> * Added no-op guard to setShowOverlayWindow() to skip MobX notifications when the window state is unchanged.</span></div><div><span> * Search and select dialog: consolidated duplicated option row/subsection builder methods into unified helpers parameterized by option list and state map.</span></div><div><span> * Search controller: extracted _matchesOptionStates() helper to eliminate duplicated logic between _matchesOptions() and _matchesLineSegmentOptions().</span></div><div><span> * Created TH2FileHideElementController: extracted all hide/show logic for both elements and scraps from TH2FileEditController into a dedicated controller, accessible as hideElementController.</span></div><div><span> * Added tests for TH2FileEditSearchController (3680): 23 tests covering getMatchingElements, selectAll, byType, byID, byOption, byLineSegmentOption, resetCriteria, and all three selection actions (setSelection, addToSelection, removeFromSelection).</span></div><div><span> * flutter upgrade 3.41.6 and flutter pub upgrade --major-versions.</span></div><div><span> * Separating current (0.3.X) changelog from previous versions.</span></div><div><span> * Added tests for MPTelemetryController (3690): 27 tests covering consent gating, TH2 open/close recording, Therion recording, day rollover, and midnight session snapshot.</span></div><div><span> * Added tests for MPSettingsController always-persist behaviour (3692): 12 tests verifying that all setter types (bool, int, double, string, stringList, enum) record the value even when it equals the implicit default, and that the setter return value correctly reflects whether observers should fire.</span></div><div><span> * Home page: increased font size of the initial page presentation text to headlineMedium. [requested by Patrícia Finageiv]</span></div><div><span> * Cursor changes to a hand pointer when hovering over links in the telemetry consent dialog and in the about dialog (MPURLTextWidget). [requested by Patrícia Finageiv]</span></div><div><span> * Telemetry consent dialog body is now loaded from locale-aware markdown assets (assets/help/{locale}/telemetry_consent.md) and rendered with MarkdownBlock, replacing the plain localization string. Falls back to the localization string if the asset cannot be loaded. [requested by Patrícia Finageiv]</span></div><div><span> * Canvas cursor now changes to reflect the current editing state: crosshair when adding points or lines, grabbing when moving elements or control points, and the default arrow cursor in select mode.</span></div><div><span> * Added MPDefaultOptionsController: plain Dart class that stores default option values per element category (point/line/area), persists them via SharedPreferences (Internal settings), and filters applicable defaults at creation time using MPCommandOptionAux.getSupportedOptionsFor*.</span></div><div><span> * Extracted MPOptionsListBuilderMixin: shared mixin eliminating duplicated option-list building and option-selection handling between MPOptionsEditOverlayWindowWidget and the new MPDefaultOptionsOverlayWindowWidget.</span></div><div><span> * Added tests for default options (3700): 7 tests covering MPDefaultOptionsController unit behaviour (setDefault, getApplicableDefaults, removeDefault, clearForElementType, hasAnyDefaults) and area creation with clip and subtype posCommands.</span></div><div><span> * Removed id from default options: id is now excluded from the default options UI and from getApplicableDefaults, since there is no meaningful default value for a unique identifier. The search/select dialog is unaffected.</span></div><div><span> * Default options overlay window now auto-closes on canvas click, consistent with all other overlay windows.</span></div><div><span> * Added regression tests for line and area creation with default options (1205, 1255): verify no exception is thrown, that the default option is present on the created element, and that undo restores the original state.</span></div><div><span> * Overlay windows now auto-close when any action button is pressed (add point, add line, undo, redo, remove, etc.); zoom buttons are excluded as zooming does not imply dismissing a panel.</span></div><div><span> * Added widget tests for select/deselect all button toggle (3730): two tests verify the button changes tooltip and state correctly — one starting from empty selection and one starting with a partial selection — across three consecutive clicks each.</span></div><div><span> * Default options toolbar button is now painted in the active (full-color) style whenever any default option is set, giving a persistent visual cue even when the panel is closed. MPDefaultOptionsController converted to a MobX store so hasAnyDefaults is reactive.</span></div><div><span> * Default options toolbar button icon changed from tune to auto_fix_high to better represent the concept of preset/initial configuration values.</span></div><div><span> * 'O' shortcut with no selection now opens the default options window (previously the call was commented out with a TODO).</span></div><div><span> * Default options toolbar button now shows four distinct visual states: pressed+active (primaryContainer, low elevation), pressed+no-defaults (dim, low elevation), unpressed+active (default FAB colors, high elevation), and unpressed+no-defaults (dim, medium elevation). Fixed showDefaultOptionsOverlayWindow reactivity: the previous @readonly Map mutation was invisible to MobX; replaced with a dedicated @observable bool _isDefaultOptionsWindowShown that is kept in sync in setShowOverlayWindow.</span></div><div><span> * TH2 file properties page: a settings icon button in each file tab opens a dedicated page to edit per-file properties. Currently exposes the file encoding (THEncoding). Changes are applied immediately on save. If no THEncoding element exists in the file, one is created and prepended as the first child. Introduced TH2FilePropertiesController (MobX) to manage file-level properties editing.</span></div><div><span> * Extracted MPTH2FileEditStateKeyDownMixin: keyboard shortcut handling (onKeyDownEvent/_onKeyDownEvent) moved from MPTH2FileEditStateMoveCanvasMixin into a new dedicated mixin, applied to all editing states that previously included MoveCanvasMixin.</span></div><div><span> * Change active scrap shortcut corrected to Alt+K (was incorrectly implemented as Alt+S); tooltip and help pages updated.</span></div><div><span> * Options edit overlay stays open when pressing "Add area border" button and while clicking lines in addLineToArea state: added keepOverlayOpenOnCanvasClick virtual property to base state (default false), overridden to true in MPTH2FileEditStateAddLineToArea; MPButtonType.addLineToArea added to _noAutoCloseButtonTypes.</span></div><span> * Area borders panel now refreshes after every border addition: MPAddAreaBorderTHIDCommand._actualExecute calls addOutdatedCloneMPID and triggerOptionsListRedraw so the selection clone and overlay update for both lines with and without pre-existing THIDs.<br><br><br>Enjoy,</span></span></div><div style="font-family: Arial, sans-serif; font-size: 14px;"><span><span><br></span></span></div><div style="font-family: Arial, sans-serif; font-size: 14px;"><span><span>Rodrigo</span></span></div><div style="font-family: Arial, sans-serif; font-size: 14px;"><span><span><br></span></span></div>
<div style="font-family: Arial, sans-serif; font-size: 14px;" class="protonmail_signature_block protonmail_signature_block-empty">
<div class="protonmail_signature_block-user protonmail_signature_block-empty">
</div>
<div class="protonmail_signature_block-proton protonmail_signature_block-empty">
</div>
</div>