Skip to content

Commit dacd23f

Browse files
Brutus5000claude
andcommitted
Show selected avatar via player.currentAvatar instead of the selected flag
The API now tracks a player's worn avatar via login.avatar_id (exposed as the player.currentAvatar relationship) and no longer maintains the legacy AvatarAssignment.selected flag, so the "Selected" columns always showed false. Derive the column from currentAvatar instead: include currentAvatar in the player/avatar queries, map it onto PlayerFX, and compute "Selected" as player.currentAvatar.id == assignment.avatar.id. Bumps commons to the release that adds Player.currentAvatar. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 4938bdb commit dacd23f

6 files changed

Lines changed: 42 additions & 6 deletions

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ println "Platform is: ${javafxPlatform}"
3939
dependencies {
4040
def springBootVersion = "3.5.6"
4141
def mapStructVersion = "1.6.3"
42-
def commonsVersion = "20251008-e3f795c"
42+
def commonsVersion = "20260626-2e8a5a8"
4343

4444
annotationProcessor(platform("org.springframework.boot:spring-boot-dependencies:${springBootVersion}"))
4545
implementation(platform("org.springframework.boot:spring-boot-dependencies:${springBootVersion}"))

src/main/java/com/faforever/moderatorclient/api/domain/AvatarService.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ public List<Avatar> getAll() {
3939
List<Avatar> result = fafApi.getAll(Avatar.class, ElideNavigator.of(Avatar.class)
4040
.collection()
4141
.addInclude("assignments")
42-
.addInclude("assignments.player"));
42+
.addInclude("assignments.player")
43+
.addInclude("assignments.player.currentAvatar"));
4344
log.trace("found {} avatars", result.size());
4445
return result;
4546
}
@@ -50,6 +51,7 @@ private List<Avatar> findAvatarsByAttribute(@NotNull String attribute, @NotNull
5051
.collection()
5152
.addInclude("assignments")
5253
.addInclude("assignments.player")
54+
.addInclude("assignments.player.currentAvatar")
5355
.setFilter(ElideNavigator.qBuilder().string(attribute).eq(pattern));
5456

5557
List<Avatar> result = fafApi.getAll(Avatar.class, navigator);
@@ -73,6 +75,7 @@ public List<Avatar> findAvatarsByAssignedUser(@NotNull String pattern) {
7375
.collection()
7476
.addInclude("assignments")
7577
.addInclude("assignments.player")
78+
.addInclude("assignments.player.currentAvatar")
7679
.setFilter(ElideNavigator.qBuilder().string(isNumeric ? "assignments.player.id" : "assignments.player.login").eq(pattern));
7780

7881
List<Avatar> result = fafApi.getAll(Avatar.class, navigator);
@@ -115,7 +118,8 @@ public List<Avatar> getAllAvatarsWithPlayerAssignments() {
115118
return fafApi.getAll(Avatar.class, ElideNavigator.of(Avatar.class)
116119
.collection()
117120
.addInclude("assignments")
118-
.addInclude("assignments.player"));
121+
.addInclude("assignments.player")
122+
.addInclude("assignments.player.currentAvatar"));
119123
}
120124

121125
public void updateAvatarMetadata(String avatarId, String name, String description) {

src/main/java/com/faforever/moderatorclient/api/domain/UserService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ private <T extends ElideEntity> ElideNavigatorOnCollection<T> addModeratorInclud
5858
.addInclude(variablePrefix + "names")
5959
.addInclude(variablePrefix + "avatarAssignments")
6060
.addInclude(variablePrefix + "avatarAssignments.avatar")
61+
.addInclude(variablePrefix + "currentAvatar")
6162
.addInclude(variablePrefix + "uniqueIdAssignments")
6263
.addInclude(variablePrefix + "uniqueIdAssignments.uniqueId")
6364
.addInclude(variablePrefix + "accountLinks")

src/main/java/com/faforever/moderatorclient/mapstruct/PlayerMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import java.util.List;
88
import java.util.Set;
99

10-
@Mapper(componentModel = "spring", uses = {JavaFXMapper.class, UniqueIdAssignmentMapper.class, NameRecordMapper.class, BanInfoMapper.class, AvatarAssignmentMapper.class, AccountLinkMapper.class, CycleAvoidingMappingContext.class})
10+
@Mapper(componentModel = "spring", uses = {JavaFXMapper.class, UniqueIdAssignmentMapper.class, NameRecordMapper.class, BanInfoMapper.class, AvatarAssignmentMapper.class, AvatarMapper.class, AccountLinkMapper.class, CycleAvoidingMappingContext.class})
1111
public abstract class PlayerMapper {
1212
public abstract PlayerFX map(Player dto);
1313

src/main/java/com/faforever/moderatorclient/ui/ViewHelper.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import com.faforever.moderatorclient.ui.domain.VotingQuestionFX;
4343
import com.faforever.moderatorclient.ui.domain.VotingSubjectFX;
4444
import javafx.beans.binding.Bindings;
45+
import javafx.beans.property.SimpleBooleanProperty;
4546
import javafx.beans.property.SimpleIntegerProperty;
4647
import javafx.beans.property.SimpleObjectProperty;
4748
import javafx.beans.property.SimpleStringProperty;
@@ -101,6 +102,7 @@
101102
import java.util.Comparator;
102103
import java.util.HashMap;
103104
import java.util.Locale;
105+
import java.util.Objects;
104106
import java.util.Optional;
105107
import java.util.Set;
106108
import java.util.TimeZone;
@@ -228,6 +230,21 @@ public static void bindMapTreeViewToImageView(TreeTableView<MapTableItemAdapter>
228230
});
229231
}
230232

233+
/**
234+
* Whether this assignment's avatar is the player's currently worn avatar, i.e. the one referenced
235+
* by {@code login.avatar_id} (exposed as {@link PlayerFX#getCurrentAvatar()}). Replaces the legacy
236+
* {@code AvatarAssignment.selected} flag, which the API no longer maintains.
237+
*/
238+
private static boolean isCurrentAvatar(AvatarAssignmentFX avatarAssignment) {
239+
if (avatarAssignment == null) {
240+
return false;
241+
}
242+
PlayerFX player = avatarAssignment.getPlayer();
243+
AvatarFX avatar = avatarAssignment.getAvatar();
244+
return player != null && avatar != null && player.getCurrentAvatar() != null
245+
&& Objects.equals(player.getCurrentAvatar().getId(), avatar.getId());
246+
}
247+
231248
public static void buildAvatarAssignmentTableView(TableView<AvatarAssignmentFX> tableView, ObservableList<AvatarAssignmentFX> data, @Nullable Consumer<AvatarAssignmentFX> onRemove) {
232249
tableView.setItems(data);
233250
HashMap<TableColumn<AvatarAssignmentFX, ?>, Function<AvatarAssignmentFX, ?>> extractors = new HashMap<>();
@@ -257,7 +274,7 @@ public static void buildAvatarAssignmentTableView(TableView<AvatarAssignmentFX>
257274
extractors.put(userNameColumn, avatarAssignmentFX -> avatarAssignmentFX.getPlayer().getLogin());
258275

259276
TableColumn<AvatarAssignmentFX, Boolean> selectedColumn = new TableColumn<>("Selected");
260-
selectedColumn.setCellValueFactory(o -> o.getValue().selectedProperty());
277+
selectedColumn.setCellValueFactory(o -> new SimpleBooleanProperty(isCurrentAvatar(o.getValue())));
261278
selectedColumn.setMinWidth(50);
262279
tableView.getColumns().add(selectedColumn);
263280

@@ -892,7 +909,7 @@ public static void buildUserAvatarsTableView(TableView<AvatarAssignmentFX> table
892909
extractors.put(descriptionColumn, avatarAssignmentFX -> avatarAssignmentFX.getAvatar().getDescription());
893910

894911
TableColumn<AvatarAssignmentFX, Boolean> selectedColumn = new TableColumn<>("Selected");
895-
selectedColumn.setCellValueFactory(o -> o.getValue().selectedProperty());
912+
selectedColumn.setCellValueFactory(o -> new SimpleBooleanProperty(isCurrentAvatar(o.getValue())));
896913
selectedColumn.setCellFactory(CheckBoxTableCell.forTableColumn(selectedColumn));
897914
selectedColumn.setMinWidth(50);
898915
tableView.getColumns().add(selectedColumn);

src/main/java/com/faforever/moderatorclient/ui/domain/PlayerFX.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ public class PlayerFX extends AbstractEntityFX {
2525
private final ObservableList<NameRecordFX> names;
2626
private final ObservableList<BanInfoFX> bans;
2727
private final ObservableList<AvatarAssignmentFX> avatarAssignments;
28+
private final ObjectProperty<AvatarFX> currentAvatar;
2829

2930
public PlayerFX() {
31+
currentAvatar = new SimpleObjectProperty<>();
3032
login = new SimpleStringProperty();
3133
email = new SimpleStringProperty();
3234
userAgent = new SimpleStringProperty();
@@ -158,6 +160,18 @@ public void setAvatarAssignments(ObservableList<AvatarAssignmentFX> avatarAssign
158160
}
159161
}
160162

163+
public AvatarFX getCurrentAvatar() {
164+
return currentAvatar.get();
165+
}
166+
167+
public void setCurrentAvatar(AvatarFX currentAvatar) {
168+
this.currentAvatar.set(currentAvatar);
169+
}
170+
171+
public ObjectProperty<AvatarFX> currentAvatarProperty() {
172+
return currentAvatar;
173+
}
174+
161175
public boolean isBannedGlobally() {
162176
return !bans.filtered(banInfoFX -> banInfoFX.getBanStatus() == BanStatus.BANNED && banInfoFX.getLevel() == BanLevel.GLOBAL).isEmpty();
163177
}

0 commit comments

Comments
 (0)