Skip to content

Commit 269d3c8

Browse files
authored
PAINRTOID-763: RedoStack not cleared for new project (Catrobat#99)
* PAINTROID-763: RedoStack not cleared for new project - extract back logic to top app bar * PAINTROID-763: RedoStack not cleared for new project - create and assign value key to back button * PAINTROID-763: RedoStack not cleared for new project - add ValueKey to genericDialogActionButtons for identification * PAINTROID-763: RedoStack not cleared for new project - revert backbutton logic * PAINTROID-763: RedoStack not cleared for new project - add identifier to generic action buttons * PAINTROID-763: RedoStack not cleared for new project - failing tests * PAINTROID-763: RedoStack not cleared for new project - fix
1 parent bfcec80 commit 269d3c8

14 files changed

+254
-48
lines changed

lib/core/providers/state/canvas_state_provider.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@ import 'dart:ui';
22

33
import 'package:flutter/painting.dart';
44
import 'package:flutter/widgets.dart' as widgets;
5-
6-
import 'package:riverpod_annotation/riverpod_annotation.dart';
7-
85
import 'package:paintroid/core/commands/command_implementation/command.dart';
96
import 'package:paintroid/core/commands/command_manager/command_manager_provider.dart';
107
import 'package:paintroid/core/commands/graphic_factory/graphic_factory_provider.dart';
118
import 'package:paintroid/core/providers/object/device_service.dart';
129
import 'package:paintroid/core/providers/state/canvas_state_data.dart';
10+
import 'package:riverpod_annotation/riverpod_annotation.dart';
1311

1412
part 'canvas_state_provider.g.dart';
1513

@@ -64,6 +62,7 @@ class CanvasStateProvider extends _$CanvasStateProvider {
6462
}
6563

6664
Future<void> resetCanvasWithNewCommands(Iterable<Command> commands) async {
65+
state.commandManager.clearRedoStack();
6766
state.commandManager.clearUndoStack(newCommands: commands);
6867
if (commands.isEmpty) {
6968
state = state.copyWith(cachedImage: null);

lib/core/utils/widget_identifier.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,17 @@ class WidgetIdentifier {
22
static const canvasPainter = 'CanvasPainter';
33
static const newImageActionButton = 'NewImageActionButton';
44
static const circleShapeTypeChip = 'CircleShapeTypeChip';
5+
static const backButton = 'BackButton';
6+
7+
// GenericDialogAction
8+
static const genericDialogActionDone = 'GenericDialogActionDone';
9+
static const genericDialogActionDiscard = 'GenericDialogActionDiscard';
10+
static const genericDialogActionSave = 'GenericDialogActionSave';
11+
static const genericDialogActionPhotos = 'GenericDialogActionPhotos';
12+
static const genericDialogActionFiles = 'GenericDialogActionFiles';
13+
static const genericDialogActionCancel = 'GenericDialogActionCancel';
14+
static const genericDialogActionDelete = 'GenericDialogActionDelete';
15+
static const genericDialogActionOk = 'GenericDialogActionOk';
16+
static const genericDialogActionRename = 'GenericDialogActionRename';
17+
static const genericDialogActionYes = 'GenericDialogActionYes';
518
}

lib/ui/pages/workspace_page/workspace_page.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter/services.dart';
3-
43
import 'package:flutter_riverpod/flutter_riverpod.dart';
5-
import 'package:toast/toast.dart';
6-
74
import 'package:paintroid/core/providers/object/io_handler.dart';
85
import 'package:paintroid/core/providers/state/workspace_state_notifier.dart';
96
import 'package:paintroid/ui/pages/workspace_page/components/bottom_bar/bottom_nav_bar.dart';
@@ -12,6 +9,7 @@ import 'package:paintroid/ui/pages/workspace_page/components/drawing_surface/dra
129
import 'package:paintroid/ui/pages/workspace_page/components/drawing_surface/exit_fullscreen_button.dart';
1310
import 'package:paintroid/ui/pages/workspace_page/components/top_bar/top_app_bar.dart';
1411
import 'package:paintroid/ui/shared/dialogs/discard_changes_dialog.dart';
12+
import 'package:toast/toast.dart';
1513

1614
class WorkspacePage extends ConsumerStatefulWidget {
1715
const WorkspacePage({super.key});

lib/ui/shared/dialogs/about_dialog.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import 'package:flutter/gestures.dart';
22
import 'package:flutter/material.dart';
3-
43
import 'package:flutter_riverpod/flutter_riverpod.dart';
5-
64
import 'package:paintroid/core/utils/open_url.dart';
5+
import 'package:paintroid/core/utils/widget_identifier.dart';
76
import 'package:paintroid/ui/shared/dialogs/generic_dialog.dart';
87
import 'package:paintroid/ui/shared/images/pocketpaint_logo_small.dart';
98
import 'package:paintroid/ui/theme/theme.dart';
@@ -54,7 +53,10 @@ class _MyAboutDialogState extends ConsumerState<MyAboutDialog> {
5453
title: 'About',
5554
actions: [
5655
GenericDialogAction(
57-
title: 'DONE', onPressed: () => Navigator.of(context).pop(true)),
56+
title: 'DONE',
57+
onPressed: () => Navigator.of(context).pop(true),
58+
identifier: WidgetIdentifier.genericDialogActionDone,
59+
),
5860
],
5961
content: Column(
6062
mainAxisAlignment: MainAxisAlignment.center,
Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import 'package:flutter/material.dart';
2-
2+
import 'package:paintroid/core/utils/widget_identifier.dart';
33
import 'package:paintroid/ui/shared/dialogs/generic_dialog.dart';
44

55
Future<bool?> showDeleteDialog(BuildContext context, String name) =>
@@ -10,11 +10,15 @@ Future<bool?> showDeleteDialog(BuildContext context, String name) =>
1010
text: 'Do you really want to delete your project?',
1111
actions: [
1212
GenericDialogAction(
13-
title: 'Cancel',
14-
onPressed: () => Navigator.of(context).pop(false)),
13+
title: 'Cancel',
14+
onPressed: () => Navigator.of(context).pop(false),
15+
identifier: WidgetIdentifier.genericDialogActionCancel,
16+
),
1517
GenericDialogAction(
16-
title: 'Delete',
17-
onPressed: () => Navigator.of(context).pop(true)),
18+
title: 'Delete',
19+
onPressed: () => Navigator.of(context).pop(true),
20+
identifier: WidgetIdentifier.genericDialogActionDelete,
21+
),
1822
]),
1923
barrierDismissible: true,
2024
barrierLabel: 'Show delete project dialog box');
Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import 'package:flutter/material.dart';
2-
2+
import 'package:paintroid/core/utils/widget_identifier.dart';
33
import 'package:paintroid/ui/shared/dialogs/generic_dialog.dart';
44

55
Future<bool?> showDiscardChangesDialog(BuildContext context) =>
@@ -11,11 +11,15 @@ Future<bool?> showDiscardChangesDialog(BuildContext context) =>
1111
'You have not saved your last changes. They will be lost!',
1212
actions: [
1313
GenericDialogAction(
14-
title: 'Discard',
15-
onPressed: () => Navigator.of(context).pop(true)),
14+
title: 'Discard',
15+
onPressed: () => Navigator.of(context).pop(true),
16+
identifier: WidgetIdentifier.genericDialogActionDiscard,
17+
),
1618
GenericDialogAction(
17-
title: 'Save',
18-
onPressed: () => Navigator.of(context).pop(false)),
19+
title: 'Save',
20+
onPressed: () => Navigator.of(context).pop(false),
21+
identifier: WidgetIdentifier.genericDialogActionSave,
22+
),
1923
]),
2024
barrierDismissible: true,
2125
barrierLabel: 'Dismiss discard changes dialog box');

lib/ui/shared/dialogs/generic_dialog.dart

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
import 'package:flutter/material.dart';
2-
32
import 'package:paintroid/ui/theme/theme.dart';
43

54
class GenericDialogActionButton extends StatelessWidget {
65
final String text;
76
final Function? onPressed;
7+
final String identifier;
88

9-
const GenericDialogActionButton(
10-
{super.key, required this.text, this.onPressed});
9+
const GenericDialogActionButton({
10+
super.key,
11+
required this.text,
12+
this.onPressed,
13+
required this.identifier,
14+
});
1115

1216
@override
1317
Widget build(BuildContext context) => TextButton(
18+
key: ValueKey(identifier),
1419
style: ButtonStyle(
1520
foregroundColor: WidgetStateProperty.all(
1621
PaintroidTheme.of(context).primaryColor,
@@ -26,8 +31,13 @@ class GenericDialogActionButton extends StatelessWidget {
2631
class GenericDialogAction {
2732
final Function? onPressed;
2833
final String title;
34+
final String identifier;
2935

30-
const GenericDialogAction({Key? key, this.onPressed, required this.title});
36+
const GenericDialogAction({
37+
this.onPressed,
38+
required this.title,
39+
required this.identifier,
40+
});
3141
}
3242

3343
class GenericDialog extends StatelessWidget {
@@ -36,12 +46,13 @@ class GenericDialog extends StatelessWidget {
3646
final Widget? content;
3747
final List<GenericDialogAction> actions;
3848

39-
const GenericDialog(
40-
{super.key,
41-
required this.title,
42-
this.text,
43-
this.content,
44-
required this.actions});
49+
const GenericDialog({
50+
super.key,
51+
required this.title,
52+
this.text,
53+
this.content,
54+
required this.actions,
55+
});
4556

4657
Widget? getContent(BuildContext context) {
4758
if (content != null) {
@@ -71,6 +82,7 @@ class GenericDialog extends StatelessWidget {
7182
.map((action) => GenericDialogActionButton(
7283
text: action.title,
7384
onPressed: action.onPressed,
85+
identifier: action.identifier,
7486
))
7587
.toList(),
7688
content: getContent(context),

lib/ui/shared/dialogs/load_image_dialog.dart

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import 'package:flutter/material.dart';
2-
32
import 'package:paintroid/core/enums/image_location.dart';
3+
import 'package:paintroid/core/utils/widget_identifier.dart';
44
import 'package:paintroid/ui/shared/dialogs/generic_dialog.dart';
55

66
Future<ImageLocation?> showLoadImageDialog(BuildContext context) =>
@@ -11,13 +11,17 @@ Future<ImageLocation?> showLoadImageDialog(BuildContext context) =>
1111
text: 'Where do you want to load the image from?',
1212
actions: [
1313
GenericDialogAction(
14-
title: 'Photos',
15-
onPressed: () =>
16-
Navigator.of(context).pop(ImageLocation.photos)),
14+
title: 'Photos',
15+
onPressed: () =>
16+
Navigator.of(context).pop(ImageLocation.photos),
17+
identifier: WidgetIdentifier.genericDialogActionPhotos,
18+
),
1719
GenericDialogAction(
18-
title: 'Files',
19-
onPressed: () =>
20-
Navigator.of(context).pop(ImageLocation.files))
20+
title: 'Files',
21+
onPressed: () =>
22+
Navigator.of(context).pop(ImageLocation.files),
23+
identifier: WidgetIdentifier.genericDialogActionFiles,
24+
),
2125
],
2226
),
2327
barrierDismissible: true,

lib/ui/shared/dialogs/overwrite_dialog.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import 'package:flutter/material.dart';
2-
2+
import 'package:paintroid/core/utils/widget_identifier.dart';
33
import 'package:paintroid/ui/shared/dialogs/generic_dialog.dart';
44

55
Future<bool?> showOverwriteDialog(BuildContext context) =>
@@ -13,10 +13,12 @@ Future<bool?> showOverwriteDialog(BuildContext context) =>
1313
GenericDialogAction(
1414
title: 'Cancel',
1515
onPressed: () => Navigator.of(context).pop(true),
16+
identifier: WidgetIdentifier.genericDialogActionCancel,
1617
),
1718
GenericDialogAction(
1819
title: 'Yes',
1920
onPressed: () => Navigator.of(context).pop(false),
21+
identifier: WidgetIdentifier.genericDialogActionYes,
2022
),
2123
],
2224
),

lib/ui/shared/dialogs/project_details_dialog.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
import 'package:flutter/material.dart';
2-
31
import 'package:filesize/filesize.dart';
2+
import 'package:flutter/material.dart';
43
import 'package:flutter_riverpod/flutter_riverpod.dart';
54
import 'package:intl/intl.dart';
65
import 'package:oxidized/oxidized.dart';
7-
86
import 'package:paintroid/core/models/database/project.dart';
97
import 'package:paintroid/core/providers/object/file_service.dart';
108
import 'package:paintroid/core/providers/object/image_service.dart';
9+
import 'package:paintroid/core/utils/widget_identifier.dart';
1110
import 'package:paintroid/ui/shared/dialogs/generic_dialog.dart';
1211
import 'package:paintroid/ui/theme/theme.dart';
1312
import 'package:paintroid/ui/utils/toast_utils.dart';
@@ -44,7 +43,10 @@ class _ProjectDetailsDialogState extends ConsumerState<ProjectDetailsDialog> {
4443
title: widget.project.name,
4544
actions: [
4645
GenericDialogAction(
47-
title: 'OK', onPressed: () => Navigator.of(context).pop(false))
46+
title: 'OK',
47+
onPressed: () => Navigator.of(context).pop(false),
48+
identifier: WidgetIdentifier.genericDialogActionOk,
49+
),
4850
],
4951
content: FutureBuilder(
5052
future: _getImageDimensions(widget.project.imagePreviewPath),

0 commit comments

Comments
 (0)