ScrollIndicator
Overview
The ScrollIndicator widget renders a circular arc indicator on the left edge of the screen that tracks the selected item in a scroll-wheel menu. A sliding arc handle moves along a background rail arc as the user navigates the list. It supports smooth animated transitions including wrap-around (last → first and first → last) using a dual-handle technique.
Components
Name |
Type |
Description |
|---|---|---|
|
Circle arc |
Background track, 232°–308°, radius 112 px |
|
Circle arc |
Active position indicator, slides along the rail |
|
Circle arc |
Hidden; used only during wrap-around animations |
Container size: 36×146 px, positioned at X=0, Y=47. The arc center is at (120, 73) relative to the screen — the same virtual center used by Buttons — so the indicator aligns with the bezel geometry.
Predefined Configs
Two configurations are available as static constexpr members:
Config |
Rail range |
Handle span |
Use case |
|---|---|---|---|
|
232°–308° (76°) |
18° |
Menus with few items (≤ 5) |
|
252°–288° (36°) |
10° |
Menus with many items |
The default (applied by the Designer-generated base) is kBig. Call setConfig(kSmall) to switch.
Custom configs can be built from ScrollIndicatorConfig:
struct ScrollIndicatorConfig {
float handleLen; // Handle arc span (degrees)
float railMin; // Rail low bound (degrees)
float railMax; // Rail high bound (degrees)
uint32_t handleColor; // Handle color (0xRRGGBB)
uint32_t railColor; // Rail background color (0xRRGGBB)
};
API
void setConfig(const ScrollIndicatorConfig& cfg); // apply config (optional, default = kBig)
void setCount(uint16_t count); // total items; handle hidden when count <= 1
void setActiveId(uint16_t index); // instant jump to item
void animateToId(int16_t index,
int16_t animationSteps = 0); // animated move; 0 = instant
uint16_t getActiveId(); // current (or target) index
Wrap-around values for animateToId: passing -1 wraps to the last item; passing count wraps to item 0.
Usage in TouchGFX Designer
Import the package:
Open TouchGFX Designer
Go to
Edit→Import→Custom ContainersSelect
ScrollIndicator.tpkg
Add to screen: drag the
ScrollIndicatorcontainer onto your screen. Position at X=0, Y=47.No designer properties — all configuration is done in C++.
Usage in C++ Code
#include <gui/containers/ScrollIndicator.hpp>
ScrollIndicator scrollIndicator;
add(scrollIndicator);
scrollIndicator.setPosition(0, 47, 36, 146);
// Setup (kBig is default; only call setConfig to switch or customize)
scrollIndicator.setConfig(ScrollIndicator::kSmall);
scrollIndicator.setCount(5); // 5-item list, starts at index 0
scrollIndicator.setActiveId(0);
// Navigate — animated (8 ticks ≈ smooth on 60 fps)
scrollIndicator.animateToId(nextIndex, 8);
// Navigate — instant
scrollIndicator.setActiveId(2);
// Wrap-around (last -> first)
scrollIndicator.animateToId(scrollIndicator.getActiveId() + 1, 8);
// If activeId was the last item, animateToId wraps back to 0 automatically.
Notes
The handle is automatically hidden when
count <= 1.Starting a new animation while one is in progress snaps the handle to its current visual position before proceeding — no visual glitch.
The overflow handle (
handleOvf) is managed internally and must not be manipulated directly.The timer widget is automatically unregistered when the animation completes or in the destructor.
Files Included
manifest.xml— package manifest (requires TouchGFX ≥ 4.26.1)content/CustomContainerExport.touchgfx— Designer container definitioncontent/CustomContainerManifest.xml— container manifestfiles/gui/include/gui/containers/ScrollIndicator.hpp— headerfiles/gui/src/containers/ScrollIndicator.cpp— implementation
Dependencies
TouchGFX Framework (minimum version 4.26.1)
No image assets — fully vector-based