Improve state update when removing face

This commit is contained in:
laurenspriem
2025-06-23 15:02:29 +05:30
parent f7e96794cd
commit c14021f2a7
5 changed files with 48 additions and 11 deletions

View File

@@ -4,12 +4,14 @@ import "package:photos/models/ml/face/person.dart";
class PeopleChangedEvent extends Event {
final List<EnteFile>? relevantFiles;
final List<String>? relevantFaceIDs;
final PeopleEventType type;
final String source;
final PersonEntity? person;
PeopleChangedEvent({
this.relevantFiles,
this.relevantFaceIDs,
this.type = PeopleEventType.defaultType,
this.source = "",
this.person,

View File

@@ -218,7 +218,11 @@ class ClusterFeedbackService<T> {
.removeFacesFromPerson(person: person, faceIDs: {faceID});
Bus.instance.fire(
PeopleChangedEvent(type: PeopleEventType.removedFaceFromCluster),
PeopleChangedEvent(
type: PeopleEventType.removedFaceFromCluster,
relevantFaceIDs: [faceID],
source: person.remoteID,
),
);
_logger.info('removeFaceFromPerson done');
return updatedClusterID;
@@ -299,6 +303,7 @@ class ClusterFeedbackService<T> {
Bus.instance.fire(
PeopleChangedEvent(
type: PeopleEventType.removedFaceFromCluster,
relevantFaceIDs: [faceID],
source: clusterID ?? "",
),
);

View File

@@ -13,6 +13,7 @@ import 'package:photos/models/gallery_type.dart';
import "package:photos/models/ml/face/person.dart";
import 'package:photos/models/selected_files.dart';
import "package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart";
import "package:photos/services/machine_learning/ml_result.dart";
import "package:photos/ui/notification/toast.dart";
import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart';
import 'package:photos/ui/viewer/gallery/gallery.dart';
@@ -76,12 +77,20 @@ class _ClusterPageState extends State<ClusterPage> {
}
});
_peopleChangedEvent = Bus.instance.on<PeopleChangedEvent>().listen((event) {
if (event.type == PeopleEventType.removedFilesFromCluster &&
(event.source == widget.clusterID.toString())) {
for (var updatedFile in event.relevantFiles!) {
files.remove(updatedFile);
if (event.source == widget.clusterID.toString()) {
if (event.type == PeopleEventType.removedFilesFromCluster) {
for (var updatedFile in event.relevantFiles!) {
files.remove(updatedFile);
}
setState(() {});
}
if (event.type == PeopleEventType.removedFaceFromCluster) {
for (final String removedFaceID in event.relevantFaceIDs!) {
final int fileID = getFileIdFromFaceId<int>(removedFaceID);
files.removeWhere((file) => file.uploadedFileID == fileID);
}
setState(() {});
}
setState(() {});
}
});
kDebugMode

View File

@@ -15,6 +15,7 @@ import "package:photos/models/search/search_result.dart";
import 'package:photos/models/selected_files.dart';
import "package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart";
import "package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart";
import "package:photos/services/machine_learning/ml_result.dart";
import "package:photos/services/search_service.dart";
import "package:photos/ui/components/end_to_end_banner.dart";
import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart';
@@ -85,6 +86,17 @@ class _PeoplePageState extends State<PeoplePage> {
});
}
}
if (event.source == widget.person.remoteID) {
if (event.type == PeopleEventType.removedFaceFromCluster) {
final filesBefore = files?.length ?? 0;
for (final String removedFaceID in event.relevantFaceIDs!) {
final int fileID = getFileIdFromFaceId<int>(removedFaceID);
files?.removeWhere((file) => file.uploadedFileID == fileID);
}
final filesAfter = files?.length ?? 0;
if (filesBefore != filesAfter) setState(() {});
}
}
});
filesFuture = loadPersonFiles();

View File

@@ -14,6 +14,7 @@ import "package:photos/models/file/file.dart";
import "package:photos/models/ml/face/person.dart";
import 'package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart';
import "package:photos/services/machine_learning/face_ml/person/person_service.dart";
import "package:photos/services/machine_learning/ml_result.dart";
import "package:photos/theme/ente_theme.dart";
import "package:photos/ui/components/buttons/button_widget.dart";
import "package:photos/ui/components/models/button_type.dart";
@@ -123,12 +124,20 @@ class _PersonClustersState extends State<PersonReviewClusterSuggestion> {
_peopleChangedEvent =
Bus.instance.on<PeopleChangedEvent>().listen((event) {
if (event.type == PeopleEventType.removedFilesFromCluster &&
(event.source == clusterID.toString())) {
for (var updatedFile in event.relevantFiles!) {
files.remove(updatedFile);
if (event.source == clusterID.toString()) {
if (event.type == PeopleEventType.removedFilesFromCluster) {
for (var updatedFile in event.relevantFiles!) {
files.remove(updatedFile);
}
setState(() {});
}
if (event.type == PeopleEventType.removedFaceFromCluster) {
for (final String removedFaceID in event.relevantFaceIDs!) {
final int fileID = getFileIdFromFaceId<int>(removedFaceID);
files.removeWhere((file) => file.uploadedFileID == fileID);
}
setState(() {});
}
setState(() {});
}
});