Stores: source chips show the store's mark instead of its name

GOG, Epic Games, Amazon Games and Steam glyphs from Simple Icons (CC0) as
vector drawables, a folder-plus for a Custom game, each in a small rounded
square in the source's colours with the name as its description. Rows,
store cards and Downloads show the mark alone; the Games hero and a store
game's page show the mark and the name. The store chips atop the Stores
page carry the marks in place of the dots, dimmed while signed out.
This commit is contained in:
The412Banner committed 2026-10-08 19:59:57 -04:00
1 parent b6903db58c
commit 01c7248965
10 files changed
+116 -16

No files matched your search

@@ -221,7 +221,7 @@ private fun ManageSaves(g: Library.SteamGame, prefix: java.io.File, a: FrontEndA
@Composable
private fun ColumnScope.GameHeroCopy(g: Library.SteamGame, titleSize: androidx.compose.ui.unit.TextUnit) {
Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp)) {
SourceChip(g.source)
SourceChip(g.source, withName = true)
Text(
(lastPlayedText(g.lastPlayed) ?: libraryLabel(g)).uppercase(),
fontSize = 12.sp, fontWeight = FontWeight.SemiBold, letterSpacing = 1.2.sp, color = LocalPalette.current.signal,
@@ -1,6 +1,21 @@
package com.droiddeck.launcher.ui
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.widthIn
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.CreateNewFolder
import androidx.compose.material3.Icon
import androidx.compose.ui.Alignment
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.MaterialTheme
@@ -17,7 +32,7 @@ import com.droiddeck.launcher.R
import com.droiddeck.launcher.frontend.Library
import com.droiddeck.launcher.stores.Store
// Where a game came from, as a small coloured chip: Steam, one of the stores, or an added folder.
// Where a game came from, as a small coloured chip with its mark: Steam, one of the stores, or an added folder.
/** The chip's colours per source: a tinted ground and a readable ink on it, one pair per store. */
internal class SourceColours(val fill: Color, val ink: Color, val dot: Color)
@@ -39,16 +54,37 @@ internal fun sourceLabel(source: String): String = when (source) {
else -> stringResource(R.string.source_added)
}
/** The source chip itself; [small] for a list row, the regular size for a hero or a card. */
/** The source's mark: the store's glyph (Simple Icons, CC0), Steam's, or a folder for a Custom game. */
@Composable
internal fun SourceChip(source: String, small: Boolean = false, modifier: Modifier = Modifier) {
internal fun sourcePainter(source: String): Painter = when (source) {
Store.GOG.id -> painterResource(R.drawable.ic_store_gog)
Store.EPIC.id -> painterResource(R.drawable.ic_store_epic)
Store.AMAZON.id -> painterResource(R.drawable.ic_store_amazon)
Library.SOURCE_STEAM -> painterResource(R.drawable.ic_store_steam)
else -> rememberVectorPainter(Icons.Outlined.CreateNewFolder)
}
/**
* The source chip: a small rounded square in the source's colours holding its mark, the name as
* what a screen reader says. [withName] (a hero, a game page) puts the name beside the mark;
* [small] is a list row's size.
*/
@Composable
internal fun SourceChip(source: String, small: Boolean = false, withName: Boolean = false, modifier: Modifier = Modifier) {
val c = sourceColours(source)
Text(
sourceLabel(source), fontSize = if (small) 10.sp else 11.sp, fontWeight = FontWeight.Bold, letterSpacing = 0.4.sp,
color = c.ink, maxLines = 1,
modifier = modifier.clip(RoundedCornerShape(6.dp)).background(c.fill)
.padding(horizontal = if (small) 6.dp else 8.dp, vertical = if (small) 1.dp else 2.dp),
)
val name = sourceLabel(source)
val side = if (small) 22.dp else 24.dp
Row(
verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(6.dp),
modifier = modifier.heightIn(min = side).clip(RoundedCornerShape(6.dp)).background(c.fill)
.then(if (withName) Modifier.padding(start = 4.dp, end = 8.dp) else Modifier.widthIn(min = side))
.semantics(mergeDescendants = true) { contentDescription = name },
) {
Box(Modifier.size(side), contentAlignment = Alignment.Center) {
Icon(sourcePainter(source), null, tint = c.ink, modifier = Modifier.size(if (small) 14.dp else 16.dp))
}
if (withName) Text(name, fontSize = 11.sp, fontWeight = FontWeight.Bold, letterSpacing = 0.4.sp, color = c.ink, maxLines = 1)
}
}
/** A status chip in the stores' colours: green for done ("Installed"), blue for busy, amber for a warning. */
@@ -56,7 +56,7 @@ internal fun StoreGameDetail(store: Store, key: String, s: FrontEndState, a: Fro
Rise(0) {
Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(12.dp), modifier = Modifier.padding(bottom = 12.dp)) {
BackLink(store.label, compact = true, onClick = onBack)
SourceChip(store.id)
SourceChip(store.id, withName = true)
}
}
Rise(1) {
@@ -164,8 +164,8 @@ private fun StoreChips(selected: String, active: Int, onPick: (String) -> Unit,
StoreChip(
label = store.shortLabel, on = selected == store.id, key = store.id, modifier = Modifier.weight(1f),
lead = {
val c = sourceColours(store.id)
Box(Modifier.size(12.dp).clip(CircleShape).background(c.dot).alpha(if (StoresState.isSignedIn(store)) 1f else 0.35f))
// The store's mark in its colour; dimmed while signed out.
Icon(sourcePainter(store.id), null, tint = sourceColours(store.id).dot, modifier = Modifier.size(18.dp).alpha(if (StoresState.isSignedIn(store)) 1f else 0.4f))
},
description = store.label + if (StoresState.isSignedIn(store)) "" else " " + stringResource(R.string.stores_chip_signed_out),
) { onPick(store.id) }
@@ -451,7 +451,10 @@ private fun GameCard(item: CatalogItem, store: Store, s: FrontEndState, a: Front
.clip(RoundedCornerShape(10.dp)).background(colors.surface).glideBorder(hot, RoundedCornerShape(10.dp), pal.signal, pal.line)
.hoverable(src).clickable(interactionSource = src, indication = LocalIndication.current, onClick = open).controllerConfirm(onClick = open),
) {
CardArt(item, Modifier.fillMaxWidth().aspectRatio(16f / 9f))
Box {
CardArt(item, Modifier.fillMaxWidth().aspectRatio(16f / 9f))
SourceChip(item.store.id, small = true, modifier = Modifier.align(Alignment.TopStart).padding(6.dp))
}
Column(verticalArrangement = Arrangement.spacedBy(5.dp), modifier = Modifier.padding(start = 8.dp, end = 8.dp, top = 6.dp, bottom = 8.dp)) {
Text(item.title, fontSize = 11.sp, lineHeight = 13.sp, fontWeight = FontWeight.Bold, color = colors.onBackground, maxLines = 2, minLines = 2, overflow = TextOverflow.Ellipsis)
PriceLine(item, installed)
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Amazon Games glyph from Simple Icons v13.21.0 ("amazongames"), CC0-1.0; https://simpleicons.org.
The mark itself is the brand owner's trademark, shown only to say where a game comes from.
Single colour: tinted at the call site. -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M3.8457 11.1425c.09-.303.082-.685.082-1.078V7.2513c0-.135.033-.52-.02-.6-.054-.08-.26-.062-.404-.062-.412 0-.595-.057-.632.336l-.016.01c-.323-.247-.63-.482-1.223-.47l-.197.015a1.875 1.875 0 0 0-.3361.082 1.622 1.622 0 0 0-.886.89 3.0171 3.0171 0 0 0-.171.607 1.967 1.967 0 0 0-.031.62c.03.195.012.365.05.535.145.609.43 1.083.955 1.31a1.665 1.665 0 0 0 .917.114 1.73 1.73 0 0 0 .59-.22l.223-.164h.005a1.857 1.857 0 0 1-.01.556c-.091.526-.246.704-.771.797a1.483 1.483 0 0 1-.446.011l-.435-.057-.638-.154a.14.14 0 0 0-.103.088 3.3121 3.3121 0 0 0 .02.6431c.073.122.31.17.457.218.494.157 1.292.233 1.828.047.613-.211 1-.624 1.192-1.261zm-1.09-3.0421v1.445a1.255 1.255 0 0 1-.356.176c-.872.274-1.2021-.34-1.2021-1.144a2.087 2.087 0 0 1 .093-.731c.077-.198.195-.371.39-.45.068-.03.152-.022.227-.053a1.745 1.745 0 0 1 .642.1l.193.09c.047.083.014.438.014.567zm3.509 2.756a2.114 2.114 0 0 0 .689-.265l.2741-.202c.07.092.043.231.134.301.092.07.798.096.865 0 .068-.095.037-.302.037-.446v-1.848c0-.36.027-.763-.057-1.046-.197-.667-.76-.896-1.632-.887l-.466.03a5.1102 5.1102 0 0 0-.788.172c-.112.039-.283.068-.33.17-.045.104-.036.647.026.69.093.063.536-.083.66-.11.357-.077 1.173-.156 1.372.1.144.184.12.544.116.876-.082.02-.224-.035-.31-.052l-.394-.041a1.483 1.483 0 0 0-.435.015c-.676.116-1.154.373-1.31 1-.243.963.592 1.746 1.549 1.544Zm-.197-1.786c.098-.058.22-.042.342-.09.276 0 .509.043.7401.053.043.093.013.563.01.705-.196.261-.988.521-1.257.15-.194-.275-.064-.684.165-.818Zm3.1752 1.318c0 .144-.018.287.072.342.05.03.172.016.247.016.173 0 .765.036.83-.047.082-.103.035-.645.035-.834v-2.261a1.594 1.594 0 0 1 .503-.187c.279-.065.648-.066.787.12.123.164.104.457.104.745v1.565c0 .213-.048.807.072.881.074.045.412.016.528.016.117 0 .457.028.53-.026.097-.074.056-.6.056-.788q0-1.164.005-2.331c.04-.065.202-.092.28-.12.3421-.12.8751-.2 1.0411.135.082.173.057.488.057.742v1.552c0 .185-.041.687.036.788.046.059.151.047.254.047.155 0 .77.027.84-.026.102-.078.061-.39.061-.565v-1.61c0-.68.053-1.298-.247-1.685-.537-.7-1.953-.325-2.472.12h-.02c-.199-.334-.54-.522-1.081-.514l-.218.016a2.49 2.49 0 0 0-.435.098 3.3441 3.3441 0 0 0-.5231.247l-.254.156c-.092-.111-.036-.292-.165-.368-.05-.03-.714-.038-.807-.015a.165.165 0 0 0-.088.057c-.055.082-.027.625-.027.782zm7.9362.175c.51.32 1.426.389 2.15.208.182-.045.5371-.11.6001-.259a3.9771 3.9771 0 0 0 .01-.622.15.15 0 0 0-.066-.077c-.065-.028-.165.02-.228.036l-.534.098a1.95 1.95 0 0 1-.59.022 3.2441 3.2441 0 0 1-.412-.058c-.406-.123-.675-.425-.68-.943.097-.043.413-.01.544-.01h1.32c.19 0 .493.04.61-.047.155-.116.144-.894.093-1.144-.17-.85-.682-1.318-1.71-1.3l-.124.005-.373.05c-.4.102-.746.287-.968.566a2.117 2.117 0 0 0-.3061.494c-.203.482-.259 1.353-.087 1.93.138.46.381.818.751 1.049zm.305-2.682c.093-.268.247-.463.518-.55l.232-.044c.615-.005.784.313.777.928-.083.038-.35.01-.467.01h-1.117c-.034-.086.03-.27.057-.347zm6.3982 1.087c-.247-.428-.784-.595-1.264-.792-.227-.094-.6-.172-.653-.435-.113-.564 1.045-.4 1.388-.316.096.023.317.11.378.03s.032-.27.032-.393c0-.101.013-.23-.027-.295-.059-.1-.215-.128-.336-.165a3.0161 3.0161 0 0 0-.964-.14l-.296.022a2.396 2.396 0 0 0-.538.144 1.223 1.223 0 0 0-.659.642c-.184.455-.01 1.058.265 1.28.33.266.777.417 1.2.59.215.088.458.138.504.394.122.697-1.196.444-1.59.342-.083-.022-.343-.11-.413-.072-.094.053-.057.317-.057.46 0 .083-.012.2.021.254.1.165.645.269.886.317.956.19 1.806-.134 2.113-.736.154-.291.182-.834.01-1.133zm-3.357 4.0871-.18.01a3.0931 3.0931 0 0 0-.5241.058 3.6181 3.6181 0 0 0-1.114.39c-.083.05-.412.211-.352.361.047.12.524.02.678.01.305-.02.454-.047.742-.046h.528a2.958 2.958 0 0 1 .472.03.702.702 0 0 1 .284.136c.12.103.098.452.057.616a11.4804 11.4804 0 0 1-.476 1.5541c-.034.082-.3.602-.005.54.133-.03.404-.33.487-.43.412-.528.672-1.134.865-1.896.045-.178.147-.874.046-1.036-.165-.269-1.037-.306-1.508-.297zm-.6431 1.483-.472.207-.78.2951c-.697.27-1.47.446-2.2451.638l-.907.17-1.067.14-.342.026c-.136.03-.297.012-.4501.036a6.8722 6.8722 0 0 1-1.02.042l-.772.005-.555-.02-.357-.02c-.082-.017-.18-.006-.27-.022l-1.0821-.119c-.32-.06-.665-.082-.97-.165l-.253-.042-.9411-.21c-.673-.21-1.341-.375-1.97-.617-.696-.27-1.4241-.564-2.0401-.928l-.61-.352c-.112-.066-.202-.164-.38-.164-.131.065-.171.15-.081.305a1.049 1.049 0 0 0 .238.233l.28.26c.404.32.81.65 1.248.937.38.247.783.457 1.18.69l.597.284c.34.15.694.305 1.05.445l.9181.305c.495.165 1.033.248 1.566.38l1.1241.163.362.027.612.046h.222a2.504 2.504 0 0 0 .653.006l.233-.006.285-.005.9741-.077c.437-.098.897-.083 1.31-.208l.954-.232a16.0985 16.0985 0 0 0 1.6731-.586 11.8764 11.8764 0 0 0 1.9471-1.036c.211-.142.51-.247.565-.544.047-.25-.21-.347-.427-.287z" />
</vector>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Epic Games glyph from Simple Icons v13.21.0 ("epicgames"), CC0-1.0; https://simpleicons.org.
The mark itself is the brand owner's trademark, shown only to say where a game comes from.
Single colour: tinted at the call site. -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M3.537 0C2.165 0 1.66.506 1.66 1.879V18.44a4.262 4.262 0 00.02.433c.031.3.037.59.316.92.027.033.311.245.311.245.153.075.258.13.43.2l8.335 3.491c.433.199.614.276.928.27h.002c.314.006.495-.071.928-.27l8.335-3.492c.172-.07.277-.124.43-.2 0 0 .284-.211.311-.243.28-.33.285-.621.316-.92a4.261 4.261 0 00.02-.434V1.879c0-1.373-.506-1.88-1.878-1.88zm13.366 3.11h.68c1.138 0 1.688.553 1.688 1.696v1.88h-1.374v-1.8c0-.369-.17-.54-.523-.54h-.235c-.367 0-.537.17-.537.539v5.81c0 .369.17.54.537.54h.262c.353 0 .523-.171.523-.54V8.619h1.373v2.143c0 1.144-.562 1.71-1.7 1.71h-.694c-1.138 0-1.7-.566-1.7-1.71V4.82c0-1.144.562-1.709 1.7-1.709zm-12.186.08h3.114v1.274H6.117v2.603h1.648v1.275H6.117v2.774h1.74v1.275h-3.14zm3.816 0h2.198c1.138 0 1.7.564 1.7 1.708v2.445c0 1.144-.562 1.71-1.7 1.71h-.799v3.338h-1.4zm4.53 0h1.4v9.201h-1.4zm-3.13 1.235v3.392h.575c.354 0 .523-.171.523-.54V4.965c0-.368-.17-.54-.523-.54zm-3.74 10.147a1.708 1.708 0 01.591.108 1.745 1.745 0 01.49.299l-.452.546a1.247 1.247 0 00-.308-.195.91.91 0 00-.363-.068.658.658 0 00-.28.06.703.703 0 00-.224.163.783.783 0 00-.151.243.799.799 0 00-.056.299v.008a.852.852 0 00.056.31.7.7 0 00.157.245.736.736 0 00.238.16.774.774 0 00.303.058.79.79 0 00.445-.116v-.339h-.548v-.565H7.37v1.255a2.019 2.019 0 01-.524.307 1.789 1.789 0 01-.683.123 1.642 1.642 0 01-.602-.107 1.46 1.46 0 01-.478-.3 1.371 1.371 0 01-.318-.455 1.438 1.438 0 01-.115-.58v-.008a1.426 1.426 0 01.113-.57 1.449 1.449 0 01.312-.46 1.418 1.418 0 01.474-.309 1.58 1.58 0 01.598-.111 1.708 1.708 0 01.045 0zm11.963.008a2.006 2.006 0 01.612.094 1.61 1.61 0 01.507.277l-.386.546a1.562 1.562 0 00-.39-.205 1.178 1.178 0 00-.388-.07.347.347 0 00-.208.052.154.154 0 00-.07.127v.008a.158.158 0 00.022.084.198.198 0 00.076.066.831.831 0 00.147.06c.062.02.14.04.236.061a3.389 3.389 0 01.43.122 1.292 1.292 0 01.328.17.678.678 0 01.207.24.739.739 0 01.071.337v.008a.865.865 0 01-.081.382.82.82 0 01-.229.285 1.032 1.032 0 01-.353.18 1.606 1.606 0 01-.46.061 2.16 2.16 0 01-.71-.116 1.718 1.718 0 01-.593-.346l.43-.514c.277.223.578.335.9.335a.457.457 0 00.236-.05.157.157 0 00.082-.142v-.008a.15.15 0 00-.02-.077.204.204 0 00-.073-.066.753.753 0 00-.143-.062 2.45 2.45 0 00-.233-.062 5.036 5.036 0 01-.413-.113 1.26 1.26 0 01-.331-.16.72.72 0 01-.222-.243.73.73 0 01-.082-.36v-.008a.863.863 0 01.074-.359.794.794 0 01.214-.283 1.007 1.007 0 01.34-.185 1.423 1.423 0 01.448-.066 2.006 2.006 0 01.025 0zm-9.358.025h.742l1.183 2.81h-.825l-.203-.499H8.623l-.198.498h-.81zm2.197.02h.814l.663 1.08.663-1.08h.814v2.79h-.766v-1.602l-.711 1.091h-.016l-.707-1.083v1.593h-.754zm3.469 0h2.235v.658h-1.473v.422h1.334v.61h-1.334v.442h1.493v.658h-2.255zm-5.3.897l-.315.793h.624zm-1.145 5.19h8.014l-4.09 1.348z" />
</vector>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- GOG.com glyph from Simple Icons v13.21.0 ("gogdotcom"), CC0-1.0; https://simpleicons.org.
The mark itself is the brand owner's trademark, shown only to say where a game comes from.
Single colour: tinted at the call site. -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M7.15 15.24H4.36a.4.4 0 0 0-.4.4v2c0 .21.18.4.4.4h2.8v1.32h-3.5c-.56 0-1.02-.46-1.02-1.03v-3.39c0-.56.46-1.02 1.03-1.02h3.48v1.32zM8.16 11.54c0 .58-.47 1.05-1.05 1.05H2.63v-1.35h3.78a.4.4 0 0 0 .4-.4V6.39a.4.4 0 0 0-.4-.4H4.39a.4.4 0 0 0-.41.4v2.02c0 .23.18.4.4.4H6v1.35H3.68c-.58 0-1.05-.46-1.05-1.04V5.68c0-.57.47-1.04 1.05-1.04H7.1c.58 0 1.05.47 1.05 1.04v5.86zM21.36 19.36h-1.32v-4.12h-.93a.4.4 0 0 0-.4.4v3.72h-1.33v-4.12h-.93a.4.4 0 0 0-.4.4v3.72h-1.33v-4.42c0-.56.46-1.02 1.03-1.02h5.61v5.44zM21.37 11.54c0 .58-.47 1.05-1.05 1.05h-4.48v-1.35h3.78a.4.4 0 0 0 .4-.4V6.39a.4.4 0 0 0-.4-.4h-2.03a.4.4 0 0 0-.4.4v2.02c0 .23.18.4.4.4h1.62v1.35H16.9c-.58 0-1.05-.46-1.05-1.04V5.68c0-.57.47-1.04 1.05-1.04h3.43c.58 0 1.05.47 1.05 1.04v5.86zM13.72 4.64h-3.44c-.58 0-1.04.47-1.04 1.04v3.44c0 .58.46 1.04 1.04 1.04h3.44c.57 0 1.04-.46 1.04-1.04V5.68c0-.57-.47-1.04-1.04-1.04m-.3 1.75v2.02a.4.4 0 0 1-.4.4h-2.03a.4.4 0 0 1-.4-.4V6.4c0-.22.17-.4.4-.4H13c.23 0 .4.18.4.4zM12.63 13.92H9.24c-.57 0-1.03.46-1.03 1.02v3.39c0 .57.46 1.03 1.03 1.03h3.39c.57 0 1.03-.46 1.03-1.03v-3.39c0-.56-.46-1.02-1.03-1.02m-.3 1.72v2a.4.4 0 0 1-.4.4v-.01H9.94a.4.4 0 0 1-.4-.4v-1.99c0-.22.18-.4.4-.4h2c.22 0 .4.18.4.4zM23.49 1.1a1.74 1.74 0 0 0-1.24-.52H1.75A1.74 1.74 0 0 0 0 2.33v19.34a1.74 1.74 0 0 0 1.75 1.75h20.5A1.74 1.74 0 0 0 24 21.67V2.33c0-.48-.2-.92-.51-1.24m0 20.58a1.23 1.23 0 0 1-1.24 1.24H1.75A1.23 1.23 0 0 1 .5 21.67V2.33a1.23 1.23 0 0 1 1.24-1.24h20.5a1.24 1.24 0 0 1 1.24 1.24v19.34z" />
</vector>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Steam glyph from Simple Icons v13.21.0 ("steam"), CC0-1.0; https://simpleicons.org.
The mark itself is the brand owner's trademark, shown only to say where a game comes from.
Single colour: tinted at the call site. -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M11.979 0C5.678 0 .511 4.86.022 11.037l6.432 2.658c.545-.371 1.203-.59 1.912-.59.063 0 .125.004.188.006l2.861-4.142V8.91c0-2.495 2.028-4.524 4.524-4.524 2.494 0 4.524 2.031 4.524 4.527s-2.03 4.525-4.524 4.525h-.105l-4.076 2.911c0 .052.004.105.004.159 0 1.875-1.515 3.396-3.39 3.396-1.635 0-3.016-1.173-3.331-2.727L.436 15.27C1.862 20.307 6.486 24 11.979 24c6.627 0 11.999-5.373 11.999-12S18.605 0 11.979 0zM7.54 18.21l-1.473-.61c.262.543.714.999 1.314 1.25 1.297.539 2.793-.076 3.332-1.375.263-.63.264-1.319.005-1.949s-.75-1.121-1.377-1.383c-.624-.26-1.29-.249-1.878-.03l1.523.63c.956.4 1.409 1.5 1.009 2.455-.397.957-1.497 1.41-2.454 1.012H7.54zm11.415-9.303c0-1.662-1.353-3.015-3.015-3.015-1.665 0-3.015 1.353-3.015 3.015 0 1.665 1.35 3.015 3.015 3.015 1.663 0 3.015-1.35 3.015-3.015zm-5.273-.005c0-1.252 1.013-2.266 2.265-2.266 1.249 0 2.266 1.014 2.266 2.266 0 1.251-1.017 2.265-2.266 2.265-1.253 0-2.265-1.014-2.265-2.265z" />
</vector>
+7 -2
View File
@@ -79,8 +79,13 @@ The appid Steam derives (CRC32 of the quoted exe plus the name, high bit set) is
listing carries, so the live add and the writer never disagree. Uninstall removes the folder and the
listing drops the entry; the live client is asked to remove it too.
`Library.SteamGame.source` is `steam`, `gog`, `epic`, `amazon` or `added`; the Games tab shows it as
a chip on every row and in the hero.
`Library.SteamGame.source` is `steam`, `gog`, `epic`, `amazon` or `added`; it shows as a small
square chip with the source's mark (`SourceChip`) on Games rows, store cards and Downloads rows, and
mark + name in the Games hero and on a store game's page; the name is the chip's content
description. The marks are `res/drawable/ic_store_*.xml`, converted from Simple Icons v13.21.0
(CC0-1.0; `gogdotcom`, `epicgames`, `amazongames`, `steam`); a Custom game uses Material's
CreateNewFolder. The store chips atop the Stores page carry the same marks (dimmed while signed
out).
## Launch
+4
View File
@@ -131,6 +131,10 @@ without it and Setup says "Stores engine not built").
`nativeAssemble` both).
- **Install-to dialog compacted** (440 dp, two tiles that are the action, one-line caption, Cancel
in the title row); the cog popup is capped at 440 dp too.
- **Source chips are marks now:** GOG / Epic / Amazon / Steam glyphs from Simple Icons (CC0) as
vector drawables, a folder-plus for Custom, in the existing per-source colours; icon-only on rows,
cards and Downloads, mark + name on the hero and game page; the Stores chip row's dots became the
marks too.
- **Device-proven on the AYANEO Pocket FIT, 2026-10-08 (GOG):** sign-in, the library (33 owned),
DOOM I Enhanced installed through the GOG engine to the SD Games root, shown in Games with the
GOG chip and real art, registered as a non-Steam game in the Steam client (grid art present), and