Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions assets/gamemodes/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Gamemode logos

Bundled Valorant gamemode icons retrieved on 2026-09-22. Valorant and the artwork belong to Riot Games. The Valorant wiki and Valorant-API are unofficial asset sources.

Each source PNG was flattened to a white silhouette: the alpha channel is kept and the RGB channels are set to white, because `FolderIconView` tints folder icons by alpha (srcIn). The longest side is resized to 256px. No runtime downloads are needed.

| File | Source |
| --- | --- |
| competitive.webp | [Competitive](https://valorant.fandom.com/wiki/File:Competitive.png) (the Radiant rank icon, which the wiki uses as the Competitive mode symbol) |
| premier.webp | [Premier](https://valorant.fandom.com/wiki/File:Premier.png) |
| unrated.webp | [Standard](https://media.valorant-api.com/gamemodes/96bd3920-4f36-d026-2b28-c683eb0bcac5/displayicon.png) (Valorant-API "Standard" gamemode) |
| deathmatch.webp | [Deathmatch](https://valorant.fandom.com/wiki/File:Deathmatch.png) |
| team_deathmatch.webp | [Team Deathmatch](https://valorant.fandom.com/wiki/File:Team_Deathmatch.png) |
| spike_rush.webp | [Spike Rush](https://valorant.fandom.com/wiki/File:Spike_Rush.png) |
| escalation.webp | [Escalation](https://valorant.fandom.com/wiki/File:Escalation.png) |
Binary file added assets/gamemodes/competitive.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/gamemodes/deathmatch.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/gamemodes/escalation.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/gamemodes/premier.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/gamemodes/spike_rush.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/gamemodes/team_deathmatch.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/gamemodes/unrated.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
56 changes: 55 additions & 1 deletion lib/const/folder_icons.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ enum FolderIconRenderKind {
enum FolderIconCategory {
symbol,
role,
gamemode,
}

class FolderIconDefinition {
Expand All @@ -28,7 +29,7 @@ class FolderIconDefinition {
required this.id,
required this.assetPath,
this.label = '',
this.category = FolderIconCategory.role,
required this.category,
this.hiddenFromPicker = false,
}) : kind = FolderIconRenderKind.asset,
iconData = null;
Expand Down Expand Up @@ -66,6 +67,13 @@ class FolderIconRegistry {
static const int duelistRoleId = 1001;
static const int initiatorRoleId = 1002;
static const int sentinelRoleId = 1003;
static const int competitiveModeId = 2000;
static const int premierModeId = 2001;
static const int unratedModeId = 2002;
static const int deathmatchModeId = 2003;
static const int teamDeathmatchModeId = 2004;
static const int spikeRushModeId = 2005;
static const int escalationModeId = 2006;

static const List<FolderIconDefinition> _baseEntries = [
FolderIconDefinition.material(
Expand Down Expand Up @@ -119,21 +127,67 @@ class FolderIconRegistry {
id: controllerRoleId,
assetPath: 'assets/agents/controller.webp',
label: 'Controller',
category: FolderIconCategory.role,
),
FolderIconDefinition.asset(
id: duelistRoleId,
assetPath: 'assets/agents/duelist.webp',
label: 'Duelist',
category: FolderIconCategory.role,
),
FolderIconDefinition.asset(
id: initiatorRoleId,
assetPath: 'assets/agents/initiator.webp',
label: 'Initiator',
category: FolderIconCategory.role,
),
FolderIconDefinition.asset(
id: sentinelRoleId,
assetPath: 'assets/agents/sentinel.webp',
label: 'Sentinel',
category: FolderIconCategory.role,
),
FolderIconDefinition.asset(
id: competitiveModeId,
assetPath: 'assets/gamemodes/competitive.webp',
label: 'Competitive',
category: FolderIconCategory.gamemode,
),
FolderIconDefinition.asset(
id: premierModeId,
assetPath: 'assets/gamemodes/premier.webp',
label: 'Premier',
category: FolderIconCategory.gamemode,
),
FolderIconDefinition.asset(
id: unratedModeId,
assetPath: 'assets/gamemodes/unrated.webp',
label: 'Unrated',
category: FolderIconCategory.gamemode,
),
FolderIconDefinition.asset(
id: deathmatchModeId,
assetPath: 'assets/gamemodes/deathmatch.webp',
label: 'Deathmatch',
category: FolderIconCategory.gamemode,
),
FolderIconDefinition.asset(
id: teamDeathmatchModeId,
assetPath: 'assets/gamemodes/team_deathmatch.webp',
label: 'Team Deathmatch',
category: FolderIconCategory.gamemode,
),
FolderIconDefinition.asset(
id: spikeRushModeId,
assetPath: 'assets/gamemodes/spike_rush.webp',
label: 'Spike Rush',
category: FolderIconCategory.gamemode,
),
FolderIconDefinition.asset(
id: escalationModeId,
assetPath: 'assets/gamemodes/escalation.webp',
label: 'Escalation',
category: FolderIconCategory.gamemode,
),
];

Expand Down
7 changes: 7 additions & 0 deletions lib/widgets/folder_edit_dialog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ enum _FolderIconFilter {
all,
symbols,
roles,
modes,
}

class FolderEditDialog extends ConsumerStatefulWidget {
Expand Down Expand Up @@ -268,6 +269,10 @@ class _FolderEditDialogState extends ConsumerState<FolderEditDialog> {
value: _FolderIconFilter.roles,
child: Text("Roles"),
),
SegmentedTabItem<_FolderIconFilter>(
value: _FolderIconFilter.modes,
child: Text("Modes"),
),
],
onChanged: (value) {
setState(() {
Expand Down Expand Up @@ -336,6 +341,8 @@ class _FolderEditDialogState extends ConsumerState<FolderEditDialog> {
FolderIconRegistry.pickerEntriesFor(FolderIconCategory.symbol),
_FolderIconFilter.roles =>
FolderIconRegistry.pickerEntriesFor(FolderIconCategory.role),
_FolderIconFilter.modes =>
FolderIconRegistry.pickerEntriesFor(FolderIconCategory.gamemode),
};
}
}
1 change: 1 addition & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ flutter:
- assets/maps/thumbnails/
- assets/agents/
- assets/weapons/
- assets/gamemodes/
- assets/agents/Omen/
- assets/agents/Killjoy/
- assets/agents/Sova/
Expand Down
24 changes: 22 additions & 2 deletions test/folder_icon_registry_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,13 @@ void main() {
1001: 'asset|assets/agents/duelist.webp',
1002: 'asset|assets/agents/initiator.webp',
1003: 'asset|assets/agents/sentinel.webp',
2000: 'asset|assets/gamemodes/competitive.webp',
2001: 'asset|assets/gamemodes/premier.webp',
2002: 'asset|assets/gamemodes/unrated.webp',
2003: 'asset|assets/gamemodes/deathmatch.webp',
2004: 'asset|assets/gamemodes/team_deathmatch.webp',
2005: 'asset|assets/gamemodes/spike_rush.webp',
2006: 'asset|assets/gamemodes/escalation.webp',
},
);
});
Expand All @@ -105,8 +112,21 @@ void main() {
FolderIconRegistry.sentinelRoleId,
]),
);
expect(FolderIconRegistry.isKnownId(2000), isFalse);
expect(FolderIconRegistry.resolve(2000).id, FolderIconRegistry.defaultId);
expect(
FolderIconRegistry.pickerEntriesFor(FolderIconCategory.gamemode)
.map((entry) => entry.id),
containsAll([
FolderIconRegistry.competitiveModeId,
FolderIconRegistry.premierModeId,
FolderIconRegistry.unratedModeId,
FolderIconRegistry.deathmatchModeId,
FolderIconRegistry.teamDeathmatchModeId,
FolderIconRegistry.spikeRushModeId,
FolderIconRegistry.escalationModeId,
]),
);
expect(FolderIconRegistry.isKnownId(9999), isFalse);
expect(FolderIconRegistry.resolve(9999).id, FolderIconRegistry.defaultId);
});

test('legacy IconData values migrate to registry ids', () {
Expand Down
Loading