Skip to content

Generated Settings Pages

This page explains how the Application Settings pages are generated from JSON definitions and how to extend them.

For the complete JSON schema reference see tools/generators/settings_qml/README.md.

Architecture Overview

The runtime stack is:

  1. Fact metadata in src/Settings/*.SettingsGroup.json
  2. Settings Fact accessors in src/Settings/*Settings.h/.cc
  3. Settings UI page definitions in src/AppSettings/pages/*.SettingsUI.json
  4. Page list in src/AppSettings/pages/SettingsPages.json
  5. Python generator in tools/generators/settings_qml
  6. Generated QML loaded by src/QmlControls/AppSettings.qml

At build time, CMake runs the generator and places generated QML in the build tree. Those files are then compiled into the QGroundControl.AppSettings QML module.

Where Generation Is Wired

Generation is configured in src/AppSettings/CMakeLists.txt:

  • Custom command runs:
    • python -m tools.generators.settings_qml.generate_pages --output-dir <build>/generated
  • Inputs:
    • src/AppSettings/pages/*.json
    • src/Settings/*.SettingsGroup.json
  • Outputs:
    • Generated page QML files (e.g. GeneralSettings.qml, FlyViewSettings.qml)
    • SettingsPagesModel.qml

The generator entry point is tools/generators/settings_qml/generate_pages.py, with most logic in tools/generators/settings_qml/page_generator.py.

How Controls Are Chosen

When control is omitted in a *.SettingsUI.json, the generator reads the fact's type from *.SettingsGroup.json metadata to auto-detect:

  • bool → checkbox
  • Enum-backed facts → combobox
  • Other types → text field

An explicit control key overrides auto-selection.

The generated SettingsPagesModel.qml is built from SettingsPages.json and each page definition.

It includes:

  • sections: section names for expandable sidebar rows
  • searchTerms: page/section/fact keyword tokens used by the search field in src/QmlControls/AppSettings.qml

Search terms are derived from:

  • Page name
  • Section heading/section name
  • Fact metadata keywords
  • Group-level keywords when using component groups without explicit controls

Add a New Setting to an Existing Generated Page

  1. Add a Fact metadata entry to the appropriate src/Settings/<Group>.SettingsGroup.json file.

  2. Expose that Fact through the corresponding settings class:

    • Add DEFINE_SETTINGFACT(<factName>) in the matching *Settings.h.
    • Ensure DECLARE_SETTINGSFACT exists in *Settings.cc if required by that file pattern.
  3. Add a control entry in the page JSON:

    • File: src/AppSettings/pages/<Page>.SettingsUI.json
    • Add: { "setting": "<accessor>.<factName>" }

    See tools/generators/settings_qml/README.md for the full JSON schema.

  4. Build. CMake regenerates the QML page automatically.

Add a New Generated Settings Page

  1. Create a new page definition JSON in src/AppSettings/pages, e.g. MyFeature.SettingsUI.json.
  2. Add a new entry to src/AppSettings/pages/SettingsPages.json:
    • name, icon, qml (output filename), pageDefinition (your new JSON file)
    • Optional visible expression
  3. Update the generated outputs list in src/AppSettings/CMakeLists.txt:
    • Add your new QML filename to _generated_qml_names.
  4. Build QGC to generate and include the new page.

Important Notes

  • If a page in SettingsPages.json has no pageDefinition, it is treated as hand-written QML/URL content and not generated.
  • The CMake _generated_qml_names list is explicit. If you forget to add a new output filename, build integration will be incomplete.
  • The setting path in *.SettingsUI.json must match a valid QGroundControl.settingsManager.<group>.<fact> accessor.
  • Fact labels should be present in metadata. Missing labels are logged at runtime by SettingsGroup.