10.11 Section 10: Hardware Limitations (Camera Profiles)

Zoom lens range clamps focal length picker

Zoom range bounds the slider in Gear mode; lens name shows above the focal length so you know what is mounted.

Where to find it

Viewfinder Focal length slider wheel; Equipment Lens picker sub-label

Summary

LensSpec carries an optional focalLengthMaxMm. When RangesMode is GEAR_BASED and the picked lens is a zoom (focalLengthMaxMm > focalLengthMm) the main focal-length picker is bounded by the lens's range, the picker sub-label reads 24-70mm, the picker stays visible for zooms even when the gear-lens card replacement would otherwise apply, and the lens displayName renders next to the focal-length readout. In CUSTOM mode the picker stays format-wide and shows no lens annotation. Picking any lens (in Gear mode) lands it at the lens's wide end (lens.focalLengthMm), and the endpoints get wider snap zones so a 24-70 zoom can actually reach 70 without competing with the 65mm common stop. Zooms you add yourself work the same way: the custom lens form has a Zoom switch that splits the focal field into a wide and a long end, and the Paper theme keeps a working ruler for zooms instead of the static prime card.

How it works

When you pick a zoom lens like the Canon 24-70mm in Gear mode, the focal length picker on the main viewfinder is limited to 24-70mm. The slider can no longer drift past the wide or long end of the glass that is actually mounted, so every focal length you can dial is one your lens can reach.

Lens name above the focal length

While Gear mode is on, the slider's focal-length readout shows the lens name (for example Canon EF 24-70mm f/2.8L USM) on the line above the millimetre value, so a glance tells you what is mounted. Custom mode hides the lens name and lifts the range constraint, so you can dial any focal length your format supports for what-if work.

Picking a zoom

Tap the Equipment icon, choose a zoom lens. The Equipment list shows the full range under the lens name (for example 24-70mm f/2.8) so you can tell zooms from primes at a glance. Picking the zoom drops the slider at the wide end of the range; drag toward the long end to zoom in.

Reaching the lens ends

The wide and long ends of a zoom are the most important snap targets, so they get a wider snap zone than the format's common focal lengths. On a 24-70 the slider will reliably stop at 70 even though the format also has a 65mm common stop nearby.

Picking a prime

Primes behave the same as before. Mount one in Gear mode and the focal length picker is replaced by a card showing the lens, since there is nothing left to dial. That swap only ever happens for primes: a zoom keeps a working picker, because you need one to move inside the range.

Adding your own zoom

If your zoom is not in the catalogue, add it. In the Lens picker tap Add custom lens, turn on the Zoom lens switch, and the focal length field splits into a wide end and a long end. Enter 28 and 85 for a 28-85mm and it behaves exactly like a bundled zoom from then on: the picker clamps to 28-85, the sub-label reads 28-85mm, and it snaps cleanly to both ends. The same switch appears when you add a fixed-lens camera, which is what most zoom compacts need.

Catalogue coverage

120 bundled lenses carry a zoom range, including several 28-85s. Search the Lens picker before adding your own; you may already have it.

Implementation notes (for developers)
LensSpec.focalLengthMaxMm + isZoom getter; assets/gear/lenses.json carries the long end on 120 bundled zooms; ViewfinderViewModel.effectiveFocalRange gates lens range on RangesMode.GEAR_BASED and routes onSliderPositionChanged / applyFocalLengthSync / onGearLensChanged / onGearCameraChanged / onRangesModeChanged / applyPresetToState / restoreSettings; lens-swap paths snap focalLengthMm to lens.focalLengthMm (wide end) regardless of zoom vs prime; onRangesModeChanged always re-runs applyFocalLengthSync so sliderPosition recomputes against the new effective range; FocalLengthSlider gives endpoints a 5% snap zone vs 1.5% for middle stops; FocalLengthWheel adds effMin/effMax to its majors set; DefaultControls and ClassicControls compute gearActive = (mode == GEAR_BASED && lens != null) and gate zoom bounds + lensName off it. Custom zooms: custom_lens.focalLengthMaxMm (Room v80, MIGRATION_79_80) + CustomLens.toLensSpec mapping it through a takeIf { it > focalLengthMm } guard so an inverted or equal range degrades to a prime; shared FocalLengthFields composable drives both AddCustomLensDialog and AddCustomCameraDialog's fixed-lens branch (fixed-zoom compacts), validated by focalEndsValid with an inline long-must-exceed-wide error. Paper theme parity: PaperControls mirrors ClassicControls' isZoomMounted gate so GearLensFocalCard only replaces the ruler for primes, and LcdFocalRuler takes minFocalMm/maxFocalMm/lensName, forces the endpoints into its majors set, and converts mm to slider position against the effective range rather than the format range.

Search documentation