Skip to content

Introduce Scene Explorer feature#324

Merged
RyeMutt merged 8 commits into
developfrom
rye/scene-explorer
Jun 22, 2026
Merged

Introduce Scene Explorer feature#324
RyeMutt merged 8 commits into
developfrom
rye/scene-explorer

Conversation

@RyeMutt

@RyeMutt RyeMutt commented Jun 22, 2026

Copy link
Copy Markdown
Member

Description

Introduce Scene Explorer feature

Related Issues

  • Please link to a relevant GitHub issue for additional context.
    • Bug Fix: Link to an issue that includes reproduction steps and testing guidance.
    • Feature/Enhancement: Link to an issue with a write-up, rationale, and requirements.

Issue Link:


Checklist

Please ensure the following before requesting review:

  • I have provided a clear title and detailed description for this pull request.
  • If useful, I have included media such as screenshots and video to show off my changes.
  • I have tested the changes locally and verified they work as intended.
  • All new and existing tests pass.
  • Code follows the project's style guidelines.
  • Documentation has been updated if needed.
  • Any dependent changes have been merged and published in downstream modules
  • I have reviewed the contributing guidelines.

Additional Notes

RyeMutt and others added 7 commits June 22, 2026 05:45
A filterable LLFolderView scene-graph tree of the current region for
environment builders and region administrators: Region -> linksets ->
child prims (kept in link order), plus Avatars -> attachment-point
folders -> attachments. Animesh objects list under their wearer; control
and UI avatars are excluded.

- ALObjectPropertiesCache: session cache of bulk ObjectProperties data,
  fed by a batched ObjectSelect/ObjectDeselect probe (throttled, deduped,
  retry-capped, skips the user's live selection); handlers forward to
  LLSelectMgr and in-flight tracking suppresses its node-less reply
  warning per-id
- Idle-driven lifecycle: time-sliced discovery/widget build (~6ms/frame)
  and time-sliced filtering, so dense regions populate without stalls
- Filters (persisted): text over name/desc/UUID, owner, scripted/light/
  particles flags, radius (re-armed as the agent moves); sorts: distance/
  name/land impact/triangles/type
- Actions: focus (zoom-to-object), edit, inspect, teleport, copy id;
  configurable double-click activation; derendered objects excluded via
  ALDerenderList
- fetchObjectCostsCoro: chunk GetObjectCost requests to the cap limit and
  retire pending ids if the coroutine is torn down mid-sequence

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Server load:
- Add LLViewerObject::peekObjectCost/peekLinksetCost and use them in the
  reconcile refresh: getObjectCost() re-queues a GetObjectCost request
  whenever the cost is stale, and a failed fetch stays stale, so the
  periodic read was re-requesting failed/uncosted objects every 1.5s
  forever
- Persist the object-properties cache across region crossings (entries
  are keyed by globally-unique UUID; wiping made every border hop
  re-probe the whole region) and bound growth with oldest-first
  eviction at 100k entries instead
- Back the property-probe drain off to one batch per second while the
  backlog is large; keep the snappy cadence for normal regions

UX:
- Only drive the in-world selection while the Build or Inspect floater
  is visible: pushing a selection fires avatar look-at/point-at
  targeting and edit-mode side effects, which read as the camera and
  avatar reacting to every tree click while browsing
- Mirror LLToolSelect's EditLinkedParts split when selecting: "Edit
  linked" on selects the individual prim, off selects the whole linkset
  even from a child row, keeping the build manipulators in sync
- Double-click follows row expectation again: containers, multi-prim
  linksets and avatars expand/collapse; only childless single-prim
  roots activate like a leaf
- Skip the camera zoom on default-action activation while Build or
  Inspect is open; double-click then means "retarget the selection"
- Re-arm arrange alongside requestSortAll in reconcile: sorting only
  runs inside arrange(), so the periodic distance re-sort never
  actually reordered a quiet tree
- Show "No matching objects" for zero-hit filters; pin sort combo and
  Avatars checkbox to the left so resizing no longer scatters them

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
RLVa (stage 1):
- Hide other avatars and their attachments under a nearby-agent
  restriction (self stays); re-evaluated per reconcile pass
- Anonymize avatar row names per-agent via RlvStrings::getAnonym in the
  placeholder, the async name callback and a per-pass re-derivation, so
  @shownames flips apply promptly and search can't reveal real names
- Gate Edit (button, activation) on RlvActions::canEdit and refuse
  non-editable objects in selectInWorld while Build is up, matching
  LLToolSelect's in-world refusal

Derendered category (stage 2):
- Synthetic TYPE_DERENDERED_OBJECT/_AVATAR rows under a lazily created
  category (exists only while entries exist and the toggle is on);
  excluded from the present-set sweep, the props fetch/retry and stale
  cached props; objects scoped to the current region, avatars listed
  region-less; stored posRegion drives distance display and teleport
- syncDerendered runs per reconcile and on the ALDerenderList change
  signal; Derender / Derender Permanently / Restore context entries
  drive addSelection/removeObjects directly

Detail pane + row presentation (stage 3):
- Geometry-aware icons, on-demand rich hover tooltips, avatar rows show
  complexity + attachment count, category counts, per-selection action
  button gating, teleport to derendered positions
- Received-items style expander bar hosting a collapsible detail panel
  (LLLayoutStack::collapsePanel; spacing gap above the bar is the drag
  area; user_resize on the preceding panels)
- Type-specific native panels (object vs avatar) in a scroll container:
  form labels, owner/creator app-SLURLs (resolved clickable RLVa-aware
  names), read-only perm and flag checkboxes, heat-colored LI/render
  values, stable cost cells, muted loading placeholders so rows never
  reflow as replies arrive
- Per-face material list in its own resizable section; asset ids gated
  like the build floater's copy checks (god account, library asset or
  full-perm inventory copy; memoized) with a friendly note otherwise;
  rebuilt only on selection change so scrolling isn't reset
- ObjectProperties handler now unpacks the five permission masks into
  the props cache

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Inspect floater gains ten opt-in scene-builder columns (LI, ARC, physics,
streaming, prim count, distance, scripts, light/glow, media, alpha/PBR)
sourced from ALObjectProperties::fromObject so it and the explorer always
agree; LI reads linkset total on roots and own contribution on children,
and the cost setters now dirty the Inspect floater so async costs fill in.

The explorer's static context menu becomes one superset toggleable menu
serving both right-click and a new gear button, shown/hidden per row type
imperatively (folder-view popups never evaluate on_visible/on_enable).
Object rows stage the selection and reuse the global viewer handlers and
their registered enable predicates; avatar rows act by id through
LL/ALAvatarActions with parcel/estate admin entries hidden without the
matching power. Adds tracker beacons, Show on Map, a Copy submenu,
filter-by-owner (new OWNER_SPECIFIC mode), CSV results export, Ctrl+F,
a view/sort hamburger replacing the sort combo and visibility checkboxes,
a region-origin sort key, and Inspect/Beacon/TP bottom buttons.

LLSliderCtrl now keeps its read-only value text pinned to the right edge
on reshape, matching the editable variant.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Full Region Coverage in the view menu asks the simulator for the 360
interest list while the explorer is open (applied on open, released on
close); the agent-level mode re-applies itself across crossings, the
release path never clobbers the 360 capture floater, and reconcile
re-claims the mode if the capture floater restores it away. First enable
shows a notice about the server load.

Cost fetches become fully demand-driven: node builds peek instead of
trigger (fillFromObject gains a fetch_costs switch, peekPhysicsCost
added), with one-shot per-node demand from visible rows, the LI sort,
and the detail pane. A per-reconcile visible-row scan keeps on-screen
suffixes fresh and bumps those rows' property fetches into a priority
lane drained ahead of the off-screen backlog. The position-keyed sorts
re-arm only when the agent or an object actually moved and defer while
the cursor is over the tree or a menu is open, and a status line reports
build/fetch backlogs and a large-region note.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Selection now syncs both ways while Build or Inspect is open - and only
then, so transient world selections never yank the tree while browsing.
Multi-select feeds batch menu actions (Take Copy, Return, Derender,
Restore), Enter activates rows, and Refresh re-arms fetch demand,
re-requests visible rows, and time-slice re-fills local records so
per-face flags catch up to edits.

The filter bar adopts the inventory pattern: a search-type combo
(name/description/owner/UUID/all over per-field pre-lowered strings), a
visibility eye menu, and a sort/actions hamburger with Select All
Results and a selection-sync toggle. A companion filters floater holds
the full predicate set - type, all feature flags plus For Sale (sale
info now unpacked from both ObjectProperties reply flavours) and
payable, a region/parcel/radius scope, and land-impact/triangle
thresholds - sharing persisted settings with the quick bar. Owners
resolve once per unique id into row suffixes and searchable text with
RLVa @shownames flips scrubbed or re-resolved per pass, the owner
filter labels its target, and matches highlight in row names.

The predicate core moves to alsceneexplorerpredicate as a pure,
TUT-tested function (16 cases) with change-classification helpers
backing a multi-generation filter: less-restrictive changes keep the
visible set stable and more-restrictive ones re-stamp failing rows
without re-evaluating. The model now requests a re-arrange when an
item's filtered state changes - the framework has no other
filter-to-arrange link, previously masked by the unconditional
distance re-sort. Also adds a toolbar command and tooltip coverage.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 22, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@RyeMutt, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 48 minutes and 55 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan refill rate.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, the refill rate gradually slows as usage increases. The highest same-day bursts are limited more strictly.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: ef7ed3b7-2383-4a78-b55f-3f0912016ba3

📥 Commits

Reviewing files that changed from the base of the PR and between f010c12 and a3e6e4b.

📒 Files selected for processing (5)
  • indra/newview/alfloatersceneexplorer.cpp
  • indra/newview/alfloatersceneexplorer.h
  • indra/newview/alfloatersceneexplorerfilters.cpp
  • indra/newview/llfloaterinspect.cpp
  • indra/newview/skins/default/xui/en/notifications.xml
📝 Walkthrough

Walkthrough

Adds a new Scene Explorer floater providing a filterable tree view of scene objects with sorting, incremental predicate-based filtering, async server-property caching, and per-row context actions. Extends the Inspect floater with optional metric columns, refactors object-cost fetching to use chunked HTTP requests, and fixes a slider text-box layout positioning bug.

Changes

Scene Explorer Feature

Layer / File(s) Summary
Object properties API, Record struct, and cache contract
indra/newview/alobjectproperties.h
Defines ALObjectProperties namespace (enums, Record struct, helper declarations) and ALObjectPropertiesCache singleton class with ServerProps, static message-handler entry points, lookup, change-signal wiring, pending-request tracking, and bounded-eviction members.
Object properties and cache implementation
indra/newview/alobjectproperties.cpp
Implements fillFromObject (spatial/geometry/flag/cost population), fromObject, flagsToString, iconName, LRU cache eviction, and both ObjectProperties message parsers that populate ServerProps, emit the change signal, forward to LLSelectMgr, and retire pending markers.
Message handler re-routing and cost floater updates
indra/newview/llstartup.cpp, indra/newview/llselectmgr.cpp, indra/newview/llviewerobject.cpp, indra/newview/llviewerobject.h
llstartup.cpp redirects ObjectProperties/ObjectPropertiesFamily to ALObjectPropertiesCache. llselectmgr.cpp gates missing-node warnings via isExpectedReply. llviewerobject adds dirty_cost_floaters() (dirtying both gFloaterTools and LLFloaterInspect) used in all setXxxCost paths, plus non-fetching peekXxxCost() accessors.
Chunked GetObjectCost fetching
indra/newview/llviewerobjectlist.cpp
Replaces a single-bulk GetObjectCost request with a sequential 256-ID chunked loop; per-chunk exception handling cleans up pending IDs on teardown; HTTP failures log and continue to the next chunk; successes update stale/pending tracking and per-object costs.
Pure predicate core, data structures, and unit tests
indra/newview/alsceneexplorerpredicate.h, indra/newview/alsceneexplorerpredicate.cpp, indra/newview/tests/alsceneexplorerpredicate_test.cpp
Declares ItemFacts/Constraints structs, matches predicate, and four classifyXxx change helpers. Implementation applies ordered early-exit checks (scope, geometry mask, flags, thresholds, owner mode, substring). Tests cover all predicate branches, classifier semantics, and constraint composition.
Scene Explorer sort, filter, view-model, and item classes
indra/newview/alsceneexplorermodel.h, indra/newview/alsceneexplorermodel.cpp, indra/newview/alderenderlist.h
Declares and implements ALSceneExplorerSort (mode comparator), ALSceneExplorerFilter (generation bookkeeping, narrowing/widening/restart classification, timed incremental pass), ALSceneExplorerViewModel, ALSceneExplorerItem (EItemType variants, label/tooltip/suffix/icon, activate, incremental filter with generation-sensitive visibility), and folder/list-item widget subclasses.
Scene Explorer main floater declaration
indra/newview/alfloatersceneexplorer.h
Declares ALFloaterSceneExplorer with lifecycle overrides, public activateItem/buildRowContextMenu/refreshFilters, all private subsystem methods (tree build, property-fetch pipeline, owner resolution, filter/sort, detail pane, user actions), and the full member state.
Scene Explorer filters floater
indra/newview/alfloatersceneexplorerfilters.h, indra/newview/alfloatersceneexplorerfilters.cpp
Declares and implements ALFloaterSceneExplorerFilters; maps checkbox names to flag/type bitmasks; wires postBuild callbacks; reads/writes persisted settings in refreshFromSettings/onCommitAny; resets to defaults in onClickReset; each write calls refreshFilters() on the main floater.
Inspect floater metric columns
indra/newview/llfloaterinspect.cpp, indra/newview/skins/default/xui/en/floater_inspect.xml, indra/newview/skins/default/xui/en/menu_inspect_options.xml
llfloaterinspect.cpp gates new metric columns on ALInspectColumnConfig, calls ALObjectProperties::fromObject per row, formats ten new cells with scaled integer sort companions. XML adds visible and hidden sort columns; menu adds toggle items for each column.
Registration, settings, commands, and UI skin resources
indra/newview/CMakeLists.txt, indra/newview/llviewerfloaterreg.cpp, indra/newview/app_settings/commands.xml, indra/newview/app_settings/settings_alchemy.xml, indra/newview/skins/default/xui/en/*
CMake adds all new sources/headers/tests. Floater registry gains scene_explorer/scene_explorer_filters. Sixteen new persistent settings keys added; ALInspectColumnConfig default bumped to 4095. Full XUI layouts for the main and filters floaters, all context/view/visibility menus, the World menu entry, a full-region alert notification, and label/tooltip strings.

Slider Text-Box Positioning Fix

Layer / File(s) Summary
Pin mTextBox to right edge in updateSliderRect
indra/llui/llsliderctrl.cpp
updateSliderRect() now repositions mTextBox's rect so its right edge is pinned to the computed right boundary before subtracting the text width and spacing from the available slider track region.

Sequence Diagram(s)

sequenceDiagram
  participant Server
  participant ALObjectPropertiesCache
  participant LLSelectMgr
  participant ALFloaterSceneExplorer
  participant ALSceneExplorerFilter
  participant ALSceneExplorerPredicate

  Server->>ALObjectPropertiesCache: ObjectProperties (msg)
  ALObjectPropertiesCache->>ALObjectPropertiesCache: parse ServerProps, evict oldest entries
  ALObjectPropertiesCache->>LLSelectMgr: forward message
  ALObjectPropertiesCache->>ALFloaterSceneExplorer: mChangeSignal fired
  ALFloaterSceneExplorer->>ALSceneExplorerFilter: update Constraints (owner/flags/scope/search)
  ALSceneExplorerFilter->>ALSceneExplorerFilter: setModified() — bump generation, classify restrictiveness
  ALSceneExplorerFilter->>ALSceneExplorerPredicate: matches(ItemFacts, Constraints)
  ALSceneExplorerPredicate-->>ALSceneExplorerFilter: pass/fail
  ALSceneExplorerFilter->>ALFloaterSceneExplorer: setPassedFilter → requestArrange
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Suggested labels

llui, viewer, cmake, skins

🐇 A new explorer hops into view,
With filters and prims to browse and pursue,
Each object inspected, each cost peeked with care,
The cache never sleeps — it's always right there!
From region to parcel, the bunny doth roam,
Scene Explorer is ready to call this world home! 🌿

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The PR description consists entirely of an uncompleted template with no substantive details about the Scene Explorer feature, its motivation, or implementation. Replace the template placeholders with a comprehensive description of the Scene Explorer feature, including motivation, key functionality, testing approach, and any relevant context or related issues.
Docstring Coverage ⚠️ Warning Docstring coverage is 17.60% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Introduce Scene Explorer feature' clearly summarizes the main change—adding a new Scene Explorer feature to the viewer.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
indra/newview/llfloaterinspect.cpp (1)

63-65: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Consolidate metric bit values into named constants.

METRIC_COLUMNS_MASK and mColumnBits duplicate raw bit literals, which can drift over time and silently desync column gating. Define the bit constants once and reuse them in both places.

♻️ Suggested refactor
+namespace
+{
+constexpr U32 COL_LAND_IMPACT = 1u << 10;
+constexpr U32 COL_RENDERCOST  = 1u << 11;
+constexpr U32 COL_PHYSICSCOST = 1u << 12;
+constexpr U32 COL_STREAMCOST  = 1u << 13;
+constexpr U32 COL_PRIMCOUNT   = 1u << 14;
+constexpr U32 COL_DISTANCE    = 1u << 15;
+constexpr U32 COL_SCRIPTS     = 1u << 16;
+constexpr U32 COL_LIGHTGLOW   = 1u << 17;
+constexpr U32 COL_MEDIA       = 1u << 18;
+constexpr U32 COL_ALPHAPBR    = 1u << 19;
+}
+
-static constexpr U32 METRIC_COLUMNS_MASK = 1024 | 2048 | 4096 | 8192 | 16384 | 32768 | 65536 | 131072 | 262144 | 524288;
+static constexpr U32 METRIC_COLUMNS_MASK =
+    COL_LAND_IMPACT | COL_RENDERCOST | COL_PHYSICSCOST | COL_STREAMCOST |
+    COL_PRIMCOUNT | COL_DISTANCE | COL_SCRIPTS | COL_LIGHTGLOW | COL_MEDIA | COL_ALPHAPBR;
...
-    mColumnBits["land_impact"] = 1024;
-    mColumnBits["rendercost"] = 2048;
-    mColumnBits["physicscost"] = 4096;
-    mColumnBits["streamingcost"] = 8192;
-    mColumnBits["primcount"] = 16384;
-    mColumnBits["distance"] = 32768;
-    mColumnBits["scripts"] = 65536;
-    mColumnBits["lightglow"] = 131072;
-    mColumnBits["media"] = 262144;
-    mColumnBits["alphapbr"] = 524288;
+    mColumnBits["land_impact"] = COL_LAND_IMPACT;
+    mColumnBits["rendercost"] = COL_RENDERCOST;
+    mColumnBits["physicscost"] = COL_PHYSICSCOST;
+    mColumnBits["streamingcost"] = COL_STREAMCOST;
+    mColumnBits["primcount"] = COL_PRIMCOUNT;
+    mColumnBits["distance"] = COL_DISTANCE;
+    mColumnBits["scripts"] = COL_SCRIPTS;
+    mColumnBits["lightglow"] = COL_LIGHTGLOW;
+    mColumnBits["media"] = COL_MEDIA;
+    mColumnBits["alphapbr"] = COL_ALPHAPBR;

Also applies to: 92-103

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@indra/newview/llfloaterinspect.cpp` around lines 63 - 65, Extract the
individual bit values (1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072,
262144, 524288) used in the METRIC_COLUMNS_MASK constant into named constant
definitions (for example, METRIC_BIT_1, METRIC_BIT_2, etc., or more
descriptively named based on their purpose). Then update METRIC_COLUMNS_MASK to
be composed from these named constants using the bitwise OR operator.
Additionally, locate the mColumnBits field definition (around lines 92-103) and
update it to use the same named constants instead of repeating the raw bit
literals. This eliminates duplication and ensures the two definitions stay in
sync.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@indra/newview/alfloatersceneexplorerfilters.cpp`:
- Around line 155-162: The onClickReset() method is not resetting the
ALSceneExplorerRadius setting along with the other filter settings
(ALSceneExplorerFlagFilter, ALSceneExplorerTypeFilter, ALSceneExplorerScope,
ALSceneExplorerMinLandImpact, and ALSceneExplorerMinTriangles), which leaves the
radius filter with a stale value when the user resets filters. Add a
gSavedSettings call to reset ALSceneExplorerRadius to its default value
(typically 0.f) in the onClickReset() method alongside the other setting resets.

In `@indra/newview/skins/default/xui/en/floater_scene_explorer_filters.xml`:
- Around line 355-364: The reset button's tool_tip in the
floater_scene_explorer_filters.xml file promises to clear every filter including
the explorer's quick bar, but the corresponding reset function implementation in
indra/newview/alfloatersceneexplorerfilters.cpp (Lines 155-168) only resets
advanced settings and refreshes filters without clearing the main floater's
search/owner quick-bar state or resetting the radius value. Update the reset
function to additionally clear the quick-bar search and owner fields, and reset
the radius value to its default state, so the implementation matches the UI's
promise of resetting all filters.

In `@indra/newview/skins/default/xui/en/notifications.xml`:
- Around line 13391-13394: The usetemplate element with name="okbutton" does not
support the ignore control, making the ignoretext attribute on line 13392
ineffective for the SceneExplorerFullRegion notification. Replace the
usetemplate name attribute from "okbutton" to a template that includes ignore
functionality, such as one that provides both an action button and ignore
capability. This will ensure the ignoretext value is properly honored and users
can actually use the "don't show again" feature for this notification.

---

Nitpick comments:
In `@indra/newview/llfloaterinspect.cpp`:
- Around line 63-65: Extract the individual bit values (1024, 2048, 4096, 8192,
16384, 32768, 65536, 131072, 262144, 524288) used in the METRIC_COLUMNS_MASK
constant into named constant definitions (for example, METRIC_BIT_1,
METRIC_BIT_2, etc., or more descriptively named based on their purpose). Then
update METRIC_COLUMNS_MASK to be composed from these named constants using the
bitwise OR operator. Additionally, locate the mColumnBits field definition
(around lines 92-103) and update it to use the same named constants instead of
repeating the raw bit literals. This eliminates duplication and ensures the two
definitions stay in sync.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 050ad1f7-1f52-4189-9f6b-aeee2a22201f

📥 Commits

Reviewing files that changed from the base of the PR and between dc03040 and f010c12.

📒 Files selected for processing (33)
  • indra/llui/llsliderctrl.cpp
  • indra/newview/CMakeLists.txt
  • indra/newview/alderenderlist.h
  • indra/newview/alfloatersceneexplorer.cpp
  • indra/newview/alfloatersceneexplorer.h
  • indra/newview/alfloatersceneexplorerfilters.cpp
  • indra/newview/alfloatersceneexplorerfilters.h
  • indra/newview/alobjectproperties.cpp
  • indra/newview/alobjectproperties.h
  • indra/newview/alsceneexplorermodel.cpp
  • indra/newview/alsceneexplorermodel.h
  • indra/newview/alsceneexplorerpredicate.cpp
  • indra/newview/alsceneexplorerpredicate.h
  • indra/newview/app_settings/commands.xml
  • indra/newview/app_settings/settings_alchemy.xml
  • indra/newview/llfloaterinspect.cpp
  • indra/newview/llselectmgr.cpp
  • indra/newview/llstartup.cpp
  • indra/newview/llviewerfloaterreg.cpp
  • indra/newview/llviewerobject.cpp
  • indra/newview/llviewerobject.h
  • indra/newview/llviewerobjectlist.cpp
  • indra/newview/skins/default/xui/en/floater_inspect.xml
  • indra/newview/skins/default/xui/en/floater_scene_explorer.xml
  • indra/newview/skins/default/xui/en/floater_scene_explorer_filters.xml
  • indra/newview/skins/default/xui/en/menu_inspect_options.xml
  • indra/newview/skins/default/xui/en/menu_scene_explorer.xml
  • indra/newview/skins/default/xui/en/menu_scene_explorer_view.xml
  • indra/newview/skins/default/xui/en/menu_scene_explorer_visibility.xml
  • indra/newview/skins/default/xui/en/menu_viewer.xml
  • indra/newview/skins/default/xui/en/notifications.xml
  • indra/newview/skins/default/xui/en/strings.xml
  • indra/newview/tests/alsceneexplorerpredicate_test.cpp

Comment thread indra/newview/alfloatersceneexplorerfilters.cpp Outdated
Comment thread indra/newview/skins/default/xui/en/notifications.xml
- Reset All Filters now delegates to the explorer's canonical doResetFilters
  so it also clears the quick-bar search/owner state and restores radius to
  its default, matching the button's "clear every filter" tooltip.
- SceneExplorerFullRegion notification uses the okignore template so its
  "don't show again" option actually works (okbutton has no ignore control).
- Inspect metric column bits extracted to named COL_* constants shared by
  METRIC_COLUMNS_MASK and mColumnBits so they cannot drift.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@RyeMutt RyeMutt merged commit 9cf2fab into develop Jun 22, 2026
21 of 26 checks passed
@RyeMutt RyeMutt deleted the rye/scene-explorer branch June 22, 2026 15:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant