Pantrix UI

Segment Button

Bir segment düğmesi: tek bir kontrolde yan yana duran birkaç seçenek, biri seçili.

import com.pantrixui.components.elements.segmentbutton.PantrixSegmentButton

Örnekler

Genişliği eşit paylaşan segmentler

En yalın hâli: seçenekler, seçili değer ve onSelect. Kontrol verilen genişliğe yayılır ve üç segment onu eşit paylaşır (fullWidth, varsayılan). Seçim hemen uygulanır: altındaki satır seçilenle birlikte değişir.

Seçili segmentin altındaki hap oraya kayar ve etiketi primary renginde yazılır. Klavyede kontrol tek bir Tab durağıdır; ok tuşları seçimi bir sonrakine ya da bir öncekine taşır.

var sort by rememberSaveable { mutableStateOf("newest") }
PantrixSegmentButton(
    options = SORTS,
    selected = sort,
    onSelect = { sort = it },
    modifier = Modifier.widthIn(max = 480.dp),
    tagKey = "sort"
)
PantrixText(
    text = "Sıralama: ${SORTS.first { it.value == sort }.label}",
    style = PantrixTheme.typography.footnote,
    color = PantrixTheme.colors.textSecondary,
    tagKey = "sort_result"
)

private val SORTS = listOf(
    SegmentOption("newest", "En yeni", tagKey = "newest"),
    SegmentOption("cheapest", "En ucuz", tagKey = "cheapest"),
    SegmentOption("nearest", "En yakın", tagKey = "nearest")
)

Etiketleri kadar geniş

fullWidth = false her segmenti etiketi kadar geniş yapar: bir araç çubuğunda ya da bir başlığın yanında kontrol yalnızca gerektiği kadar yer tutar. Yer hepsine yetmezse kısa etiketler bütün kalır, uzun olanlar kalanı paylaşır.

İki kontrol de böyledir: dört seçenekli bir zaman aralığı ve üç seçenekli bir platform seçimi.

var span by rememberSaveable { mutableStateOf("week") }
var platform by rememberSaveable { mutableStateOf("web") }
PantrixSegmentButton(
    options = SPANS,
    selected = span,
    onSelect = { span = it },
    fullWidth = false,
    tagKey = "span"
)
PantrixText(
    text = "Gösterilen: son ${SPANS.first { it.value == span }.label.lowercase()}",
    style = PantrixTheme.typography.footnote,
    color = PantrixTheme.colors.textSecondary,
    tagKey = "span_result"
)
PantrixSegmentButton(
    options = PLATFORMS,
    selected = platform,
    onSelect = { platform = it },
    fullWidth = false,
    tagKey = "platform"
)

private val SPANS = listOf(
    SegmentOption("day", "Gün", tagKey = "day"),
    SegmentOption("week", "Hafta", tagKey = "week"),
    SegmentOption("month", "Ay", tagKey = "month"),
    SegmentOption("year", "Yıl", tagKey = "year")
)

private val PLATFORMS = listOf(
    SegmentOption("android", "Android", tagKey = "android"),
    SegmentOption("ios", "iOS", tagKey = "ios"),
    SegmentOption("web", "Web", tagKey = "web")
)

İkonlar ve seçilemeyen bir segment

SegmentOption(icon = …) etiketin önüne bir ikon koyar: ikon etiketin rengindedir ve ekran okuyucu onu atlar.

"Klasörler" henüz açık değil (enabled = false): devre dışı renkle yazılır, basılmaz ve ok tuşları onu atlar.

var view by rememberSaveable { mutableStateOf("list") }
PantrixSegmentButton(
    options = listOf(
        SegmentOption("list", "Liste", icon = PantrixIcons.Menu, tagKey = "list"),
        SegmentOption("search", "Ara", icon = PantrixIcons.Search, tagKey = "search"),
        SegmentOption("folders", "Klasörler", icon = PantrixIcons.Folder, enabled = false, tagKey = "folders")
    ),
    selected = view,
    onSelect = { view = it },
    modifier = Modifier.widthIn(max = 480.dp),
    tagKey = "view"
)

Hiçbiri seçili değilken

selected hiçbir seçeneğin değeri değilse hiçbir segment seçili değildir ve hap çizilmez; null da böyle bir değerdir. Bir cevabın önceden seçilmemesi gereken yerde kullanılır.

Birine bas: hap orada belirir. Bundan sonra seçim iki segment arasında kayar; kontrol seçimi kendiliğinden kaldırmaz.

var helpful by rememberSaveable { mutableStateOf<String?>(null) }
PantrixText(text = if (helpful == null) "Bu sayfa işinize yaradı mı?" else "Cevabınız kaydedildi")
PantrixSegmentButton(
    options = listOf(
        SegmentOption("yes", "Evet", tagKey = "yes"),
        SegmentOption("no", "Hayır", tagKey = "no")
    ),
    selected = helpful,
    onSelect = { helpful = it },
    fullWidth = false,
    tagKey = "helpful"
)

Kendi renkleri

colors yalnızca verilen alanları değiştirir: burada hap uygulamanın kendi morundadır (pill), üstündeki etiket o morun üstünde okunan renktedir (selectedContent); iz ve seçili olmayan etiketler temanın renginde kalır.

Uygulamanın moru temanın hiçbir rolünde yok: böyle bir hapın üstünde okunan rengi de çağıran verir. Devre dışı bir kontrolün izi ve seçilemeyen bir segment, renk verilse de temanın renkleriyle çizilir.

val own = ownColors()
var span by rememberSaveable { mutableStateOf("week") }
PantrixSegmentButton(
    options = SPANS,
    selected = span,
    onSelect = { span = it },
    modifier = Modifier.widthIn(max = 480.dp),
    colors = SegmentButtonColors(pill = own.color, selectedContent = own.onColor),
    tagKey = "span_own"
)

private val SPANS = listOf(
    SegmentOption("day", "Gün", tagKey = "day"),
    SegmentOption("week", "Hafta", tagKey = "week"),
    SegmentOption("month", "Ay", tagKey = "month"),
    SegmentOption("year", "Yıl", tagKey = "year")
)

Devre dışı

enabled = false her segmenti kapatır: iz ve etiketler devre dışı renklerle çizilir, kontrol basış ve odak almaz. Hap yerinde kalır: hangi seçeneğin seçili olduğu yine okunur.

Bu kontrolün seçenekleri ilk örnektekilerle aynıdır. Segmentler kontrolün test etiketi içinde adlandırıldığı için çakışmazlar: oradaki SegmentButton_sort.Segment_newest, buradaki SegmentButton_locked.Segment_newest'tir.

PantrixSegmentButton(
    options = SORTS,
    selected = "newest",
    onSelect = {},
    modifier = Modifier.widthIn(max = 480.dp),
    enabled = false,
    tagKey = "locked"
)

private val SORTS = listOf(
    SegmentOption("newest", "En yeni", tagKey = "newest"),
    SegmentOption("cheapest", "En ucuz", tagKey = "cheapest"),
    SegmentOption("nearest", "En yakın", tagKey = "nearest")
)

Stil

style tek bir kontrolün geometrisini değiştirir: izin şekli (shape) ve yüksekliği (height), izin kenarıyla hap arasındaki boşluk (trackPadding), etiketin iki yanındaki boşluk (segmentPadding). Yalnızca verilen alanlar değişir; gerisi temanın ve platformun stilinden gelir.

Hapın kendi şekli yoktur: izin şeklidir, her köşesi trackPadding kadar küçültülmüş. Böylece ikisinin köşeleri aynı merkezin çevresinde döner.

var size by rememberSaveable { mutableStateOf("m") }
PantrixSegmentButton(
    options = listOf(
        SegmentOption("s", "Küçük", tagKey = "s"),
        SegmentOption("m", "Orta", tagKey = "m"),
        SegmentOption("l", "Büyük", tagKey = "l")
    ),
    selected = size,
    onSelect = { size = it },
    fullWidth = false,
    style = SegmentButtonStyle(
        shape = ShapeRole.Small,
        height = 48.dp,
        trackPadding = 6.dp,
        segmentPadding = 20.dp
    ),
    tagKey = "size"
)

Kendi yazısıyla

Dar bir sütunda kendi yazısıyla: üç seçenek temanın footnote yazısıyla (labelStyle) sığar. Yazının rengi segmentindir: seçili olanınki ana renk, ötekilerinki sessiz.

var mode by rememberSaveable { mutableStateOf("auto") }
PantrixSegmentButton(
    options = listOf(
        SegmentOption("light", "Açık", tagKey = "light"),
        SegmentOption("dark", "Koyu", tagKey = "dark"),
        SegmentOption("auto", "Sistem", tagKey = "auto")
    ),
    selected = mode,
    onSelect = { mode = it },
    modifier = Modifier.widthIn(max = 220.dp),
    tagKey = "mode",
    labelStyle = PantrixTheme.typography.footnote
)

API

options

Bir segment düğmesi: tek bir kontrolde yan yana duran birkaç seçenek, biri seçili.

ParametreTürVarsayılanNe olduğu
optionsList<SegmentOption<T>>Seçenekler, sırasıyla. Boş bir liste hiçbir şey çizmez.
selectedT?Seçili segmentin değeri. Her seçeneğin değeriyle == ile karşılaştırılır. Hiçbir seçeneğin taşımadığı bir değer, null da böyledir, hiçbirini seçmez: hiçbir segment seçili olmaz ve hap çizilmez.
onSelect(T) -> UnitKullanıcının bir basışla ya da bir tuşla seçtiği segmentin değeriyle çağrılır, o segment zaten seçili değilse. Kontrol kendiliğinden bir şey seçmez: selected hangi değeri söylüyorsa o segment seçilidir.
modifierModifierModifierKontrolün modifier'ı. Kontrolün ayırdığı dokunma hedefinin dışına uygulanır.
enabledBooleantrueFalse verilirse her segment devre dışı kalır. Hap yerinde kalır ki seçim yine okunsun.
fullWidthBooleantrueTrue verilirse kontrol kendisine verilen genişliğe yayılır ve her segment eşit pay alır: böylece etiketler başka bir dilde ne derse desin segmentler yerinde kalır. False her segmenti etiketi kadar geniş yapar. Buna yetmeyecek kadar dar bir yerde kısa etiketler bütün kalır, uzun olanlar kalanı paylaşır.
styleSegmentButtonStyle?nullBu çağrının kendi stili: çevresindeki her stili ezer, yoğunluk ona da uygulanır. Yalnızca verdiği alanlar değişir ve her platformda değişir.
colorsSegmentButtonColors?nullBu kontrolün kendi renkleri: verdiği renkler kullanılır, gerisi temanınkilerdir. Devre dışı bir kontrolün izi ve seçilemeyen bir segment temanın renklerinde kalır.
tagKeyString?nullKontrolün otomasyon anahtarı: kontrol SegmentButton_<tagKey>'dir ve segmentleri onun içinde adlandırılır, SegmentButton_<tagKey>.Segment_<key>. Böylece seçenekleri aynı olan iki kontrol birbirinden ayırt edilir. Bir seçim SegmentButton olayı olarak bildirilir: select. Olay segmentin anahtarını, anahtarı yoksa sırasını taşır, etiketini hiçbir zaman taşımaz.
labelStyleTextStylePantrixTheme.typography.labeletiketlerin yazı stili: verilmezse temanın label stili. İzden büyük yazılan bir etiket, büyük bir yazı ölçeğinin yaptığı gibi izi uzatır.

SegmentButtonStyle

PantrixSegmentButton'ın geometrisi: iz, içinde kayan hap ve her segmentin etiketine ayırdığı yer.

ParametreTürVarsayılanNe olduğu
shapeShapeSpecShapeSpec.Unspecifiedİzin şekli: markanın şekil ölçeğinin bir adımı ya da sabit bir şekil.
heightDpDp.Unspecifiedİzin yüksekliği. Büyük bir yazı ölçeğinde bu yüksekliğe sığmayan etiket izi yükseltir.
trackPaddingDpDp.Unspecifiedİzin kenarıyla hap arasındaki boşluk.
segmentPaddingDpDp.UnspecifiedBir segmentin etiketinin iki yanındaki boşluk.
iconGapDpDp.UnspecifiedBir segmentin ikonuyla etiketi arasındaki aralık.
iconSizeDpDp.UnspecifiedBir segmentin ikonunun genişliği ve yüksekliği.

SegmentButtonColors

Temanın renklerini almayan bir kontrol için PantrixSegmentButton'ın boyandığı renkler: verilen renk kullanılır, verilmeyen temanın rolünde kalır.

ParametreTürVarsayılanNe olduğu
trackColorColor.UnspecifiedSegmentlerin üstünde durduğu iz. Neutral rolünün container'ı.
pillColorColor.UnspecifiedSeçili segmentin altındaki hap. Temanın surface rengi.
selectedContentColorColor.UnspecifiedSeçili segmentin etiketi ve ikonu: pill'in üstünde okunan renk. Temanın primary rengi.
unselectedContentColorColor.UnspecifiedÖteki segmentlerin etiketi ve ikonu: track'in üstünde okunan renk. Temanın textSecondary rengi.

Erişilebilirlik