> For the complete documentation index, see [llms.txt](https://stylizededge-devs.gitbook.io/aqs-doc/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://stylizededge-devs.gitbook.io/aqs-doc/building-menus/the-autopanel.md).

# The Auto Panel

Parent class: `UAQSAutoPanel`

This is the one widget that ties the 9 row templates to real data. Build it once per project. You will almost never touch its Event Graph — only its Class Defaults and Designer layout.

***

## 1. Create the widget

Right-click → User Interface → Widget Blueprint Parent class: search `AQSAutoPanel` Name: `WBP_AQS_AutoPanel`

## 2. Designer hierarchy

The only required binding is **RowContainer**. Everything else is optional dressing around it.

```
[Canvas Panel] or [Vertical Box]  (whatever your menu's outer layout needs)
└── [Scroll Box]
    └── [Vertical Box]   name: RowContainer   ★ REQUIRED — must be named exactly this
```

> RowContainer must be a panel widget that supports AddChild — Vertical Box, Horizontal Box, Wrap Box, or Scroll Box's inner box all work. The base class binds it via `meta = (BindWidget)`, so the name and "Is Variable" checkbox both matter, same rule as every other binding in this plugin.

If you want a preset quick-select row above the settings list (COD Mobile style, or the top row in AC Origins), add it here too — but note the AutoPanel doesn't build that row for you. Preset quick-select buttons are built the same way you'd build any UI list: loop `Presets`, spawn a button per entry, call `UAQSSubsystem::ApplyPreset` on click. The AutoPanel's job is strictly the per-setting rows; preset switching is a separate, simpler concern you wire normally.

## 3. Class Defaults

Open the Details panel with nothing selected (or select the AutoPanel root) to see the Class Defaults exposed by `UAQSAutoPanel`:

| Property             | What to set                                                                                                              |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| `BakedDescriptors`   | Your baked descriptor asset (DA\_AQS\_Descriptors or similar)                                                            |
| `Presets`            | Your preset array, same one you'd give to a Manager or GameMode                                                          |
| `bAutoApplyOnChange` | `true` for instant preview (COD Mobile feel). `false` if you want an explicit Apply button (AC Origins Custom mode feel) |
| `RowTemplateClasses` | The 9-entry map — see below                                                                                              |

## 4. Populate RowTemplateClasses

This is a `TMap<EAQSControlType, TSubclassOf<UAQSRowBase>>`. In the Details panel, click the `+` to add an entry per row, and assign:

| Key (EAQSControlType) | Value (Widget Class)          |
| --------------------- | ----------------------------- |
| Slider01              | WBP\_AQS\_Row\_Slider01       |
| Stepper               | WBP\_AQS\_Row\_Stepper        |
| DirectInput           | WBP\_AQS\_Row\_DirectInput    |
| Toggle                | WBP\_AQS\_Row\_Toggle         |
| BoolDropdown          | WBP\_AQS\_Row\_BoolDropdown   |
| BoolButtonList        | WBP\_AQS\_Row\_BoolButtonList |
| SliderStepped         | WBP\_AQS\_Row\_SliderStepped  |
| IntDropdown           | WBP\_AQS\_Row\_IntDropdown    |
| IntButtonList         | WBP\_AQS\_Row\_IntButtonList  |

You don't need all 9 filled to test. Any `ControlType` missing from this map is skipped with a log warning — never a crash — so you can wire 2-3 first, confirm the panel builds correctly, then fill in the rest.

> Set this map once, here, in this one Blueprint's Class Defaults. Every place you embed WBP\_AQS\_AutoPanel inherits the same 9 assignments — you never re-map this per instance.

## 5. Drop it into your real menu

In whatever widget is your actual settings screen (the one with tabs, hardware panel, title bar, etc.), drag `WBP_AQS_AutoPanel` in as a child widget — same as dragging in any other Widget Blueprint. No event graph wiring required on the host side; `NativeConstruct` builds the panel itself the moment it's added to the viewport.

## 6. Test

Press Play. You should see one row per non-hidden descriptor, each rendered through whichever template matches its ControlType. Drag a slider, toggle a checkbox — the value should apply live (if `bAutoApplyOnChange` is true) or sit in WorkingSettings until you call `ApplyChanges` from your own Apply button.

**If you built less than 9 templates so far:** check the Output Log for `"No row template assigned for ControlType on field '...'"` — that's expected and tells you exactly which fields are waiting on a template you haven't mapped yet. Not a bug, just a to-do list.

***

## Optional: Apply / Reset buttons

If `bAutoApplyOnChange = false`, add two buttons anywhere in your host menu:

**Apply button On Clicked:**

```
Get AutoPanel reference → Apply Changes (ApplyMode: LiveImmediate or LiveWithFade)
```

**Reset button On Clicked:**

```
Get AutoPanel reference → Reset To Active Preset
```

Both functions are `BlueprintCallable` on `UAQSAutoPanel` — call them from anywhere with a reference to the panel instance, no special wiring needed.

***

## Preset Buttons — Use ApplyPresetAndSync, Not ApplyPreset Directly

If you build a preset quick-select row (buttons for "Low / Medium / High"), wire each button to call **`ApplyPresetAndSync`** on the AutoPanel, not `UAQSSubsystem::ApplyPreset` directly:

```
On Clicked → Get AutoPanel reference
           → Apply Preset And Sync (Preset: GP_Balanced, ApplyMode: LiveImmediate)
```

This applies the preset for real **and** immediately moves every row's slider/checkbox/dropdown to match it. Calling the subsystem directly still applies the preset correctly, but skips the visual sync — your menu would silently show stale values until something else triggered a refresh.

## Live Editing Doesn't Re-Apply Everything

When `bAutoApplyOnChange = true`, dragging one slider only ever sets the **one CVar** tied to that field — never the full preset. This matters: the engine's own scalability system treats any `sg.*` CVar write as "the quality level changed," and reloads that entire group from `Scalability.ini` if you re-apply the full struct on every keystroke. AQS avoids this automatically — you don't need to do anything for this to work correctly, but it's worth knowing why a single row change never disturbs any other row's value.

## Group Section Headers

If you've organized your fields into named groups (see [Grouping & Ordering Rows](/aqs-doc/building-menus/grouping-and-ordering.md)), assign a **GroupHeaderWidgetClass** in the AutoPanel's Class Defaults — any Widget Blueprint with a Text Block named exactly `TXT_GroupName` (Is Variable checked). The panel inserts one automatically above each group's first row.

Leave this unset if you only grouped fields for sort order and don't want visible section breaks — rows still render in the correct grouped order either way.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://stylizededge-devs.gitbook.io/aqs-doc/building-menus/the-autopanel.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
