Skip to content

Commit 3a48447

Browse files
authored
PAINTROID-768: Add Spray Can tool (Catrobat#98)
* test * test * PAINTROID-768: Flutter: Add Spray Can tool * PAINTROID-768: Flutter: Add Spray Can tool * PAINTROID-768: Flutter: Add Spray Can tool - tests * PAINTROID-768: Flutter: Add Spray Can tool - CR * PAINTROID-768: Flutter: Add Spray Can tool - CR * PAINTROID-768: Flutter: Add Spray Can tool - CR * PAINTROID-768: Flutter: Add Spray Can tool - CR
1 parent 269d3c8 commit 3a48447

28 files changed

+810
-88
lines changed

ios/Podfile.lock

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,18 +121,18 @@ SPEC CHECKSUMS:
121121
file_picker: ce3938a0df3cc1ef404671531facef740d03f920
122122
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
123123
flutter_localization: f43b18844a2b3d2c71fd64f04ffd6b1e64dd54d4
124-
image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
125-
integration_test: ce0a3ffa1de96d1a89ca0ac26fca7ea18a749ef4
124+
image_picker_ios: 99dfe1854b4fa34d0364e74a78448a0151025425
125+
integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
126126
launch_review: 75d5a956ba8eaa493e9c9d4bf4c05e505e8d5ed0
127127
package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85
128-
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
128+
path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c
129129
permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6
130130
SDWebImage: dfe95b2466a9823cf9f0c6d01217c06550d7b29a
131-
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
131+
shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695
132132
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
133133
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
134-
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
134+
url_launcher_ios: bbd758c6e7f9fd7b5b1d4cde34d2b95fcce5e812
135135

136136
PODFILE CHECKSUM: 303789365c3a8d7bc562e5e65d7e8e15218ec5c6
137137

138-
COCOAPODS: 1.15.2
138+
COCOAPODS: 1.15.0

lib/core/commands/command_factory/command_factory.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:paintroid/core/commands/command_implementation/graphic/line_comm
44
import 'package:paintroid/core/commands/command_implementation/graphic/path_command.dart';
55
import 'package:paintroid/core/commands/command_implementation/graphic/shape/circle_shape_command.dart';
66
import 'package:paintroid/core/commands/command_implementation/graphic/shape/square_shape_command.dart';
7+
import 'package:paintroid/core/commands/command_implementation/graphic/spray_command.dart';
78
import 'package:paintroid/core/commands/path_with_action_history.dart';
89

910
class CommandFactory {
@@ -38,4 +39,8 @@ class CommandFactory {
3839
Offset center,
3940
) =>
4041
CircleShapeCommand(paint, radius, center);
42+
43+
SprayCommand createSprayCommand(List<Offset> points, Paint paint) {
44+
return SprayCommand(points, paint);
45+
}
4146
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import 'dart:ui';
2+
3+
import 'package:freezed_annotation/freezed_annotation.dart';
4+
import 'package:paintroid/core/commands/command_implementation/graphic/graphic_command.dart';
5+
import 'package:paintroid/core/json_serialization/converter/offset_converter.dart';
6+
import 'package:paintroid/core/json_serialization/converter/paint_converter.dart';
7+
import 'package:paintroid/core/json_serialization/versioning/serializer_version.dart';
8+
import 'package:paintroid/core/json_serialization/versioning/version_strategy.dart';
9+
10+
part 'spray_command.g.dart';
11+
12+
@JsonSerializable()
13+
class SprayCommand extends GraphicCommand {
14+
final String type;
15+
final int version;
16+
17+
@OffsetConverter()
18+
List<Offset> points;
19+
20+
SprayCommand(
21+
this.points,
22+
super.paint, {
23+
this.type = SerializerType.SPRAY_COMMAND,
24+
int? version,
25+
}) : version =
26+
version ?? VersionStrategyManager.strategy.getSprayCommandVersion();
27+
28+
@override
29+
void call(Canvas canvas) {
30+
canvas.drawPoints(PointMode.points, points, paint);
31+
}
32+
33+
@override
34+
List<Object?> get props => [paint, points];
35+
36+
@override
37+
Map<String, dynamic> toJson() => _$SprayCommandToJson(this);
38+
39+
factory SprayCommand.fromJson(Map<String, dynamic> json) {
40+
int version = json['version'] as int;
41+
42+
switch (version) {
43+
case Version.v1:
44+
return _$SprayCommandFromJson(json);
45+
default:
46+
return _$SprayCommandFromJson(json);
47+
}
48+
}
49+
}

lib/core/commands/command_implementation/graphic/spray_command.g.dart

Lines changed: 25 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/core/commands/command_manager/command_manager.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:paintroid/core/commands/command_implementation/graphic/shape/squ
88
import 'package:paintroid/core/tools/line_tool/vertex.dart';
99
import 'package:paintroid/core/tools/line_tool/vertex_stack.dart';
1010
import 'package:paintroid/core/tools/tool_data.dart';
11+
import 'package:paintroid/core/commands/command_implementation/graphic/spray_command.dart';
1112

1213
enum ActionType { UNDO, REDO }
1314

@@ -109,6 +110,9 @@ class CommandManager {
109110
return ToolData.SHAPES;
110111
} else if (command.runtimeType == CircleShapeCommand) {
111112
return ToolData.SHAPES;
113+
}
114+
else if (command.runtimeType == SprayCommand) {
115+
return ToolData.SPRAY;
112116
} else {
113117
return ToolData.BRUSH;
114118
}

lib/core/json_serialization/versioning/serializer_version.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ class SerializerVersion {
55
static const int LINE_COMMAND_VERSION = Version.v1;
66
static const int SQUARE_SHAPE_COMMAND_VERSION = Version.v1;
77
static const int CIRCLE_SHAPE_COMMAND_VERSION = Version.v1;
8+
static const int SPRAY_COMMAND_VERSION = Version.v1;
89
}
910

1011
class Version {
@@ -21,4 +22,5 @@ class SerializerType {
2122
static const String CLOSE_ACTION = 'CloseAction';
2223
static const String SQUARE_SHAPE_COMMAND = 'SquareShapeCommand';
2324
static const String CIRCLE_SHAPE_COMMAND = 'CircleShapeCommand';
25+
static const String SPRAY_COMMAND = 'SprayCommand';
2426
}

lib/core/json_serialization/versioning/version_strategy.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,16 @@ import 'package:paintroid/core/json_serialization/versioning/serializer_version.
22

33
abstract class IVersionStrategy {
44
int getCatrobatImageVersion();
5+
56
int getPathCommandVersion();
7+
68
int getLineCommandVersion();
9+
710
int getSquareShapeCommandVersion();
11+
812
int getCircleShapeCommandVersion();
13+
14+
int getSprayCommandVersion();
915
}
1016

1117
class ProductionVersionStrategy implements IVersionStrategy {
@@ -25,6 +31,9 @@ class ProductionVersionStrategy implements IVersionStrategy {
2531
@override
2632
int getCircleShapeCommandVersion() =>
2733
SerializerVersion.CIRCLE_SHAPE_COMMAND_VERSION;
34+
35+
@override
36+
int getSprayCommandVersion() => SerializerVersion.SPRAY_COMMAND_VERSION;
2837
}
2938

3039
class VersionStrategyManager {

lib/core/providers/state/paint_provider.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import 'dart:ui';
22

3-
import 'package:riverpod_annotation/riverpod_annotation.dart';
4-
53
import 'package:paintroid/core/commands/graphic_factory/graphic_factory.dart';
64
import 'package:paintroid/core/commands/graphic_factory/graphic_factory_provider.dart';
75
import 'package:paintroid/core/enums/tool_types.dart';
6+
import 'package:riverpod_annotation/riverpod_annotation.dart';
87

98
part 'paint_provider.g.dart';
109

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import 'package:paintroid/core/commands/command_factory/command_factory_provider.dart';
2+
import 'package:paintroid/core/commands/command_manager/command_manager_provider.dart';
3+
import 'package:paintroid/core/commands/graphic_factory/graphic_factory_provider.dart';
4+
import 'package:paintroid/core/enums/tool_types.dart';
5+
import 'package:paintroid/core/providers/state/canvas_state_provider.dart';
6+
import 'package:paintroid/core/tools/implementation/spray_tool.dart';
7+
import 'package:riverpod_annotation/riverpod_annotation.dart';
8+
9+
part 'spray_tool_provider.g.dart';
10+
11+
@riverpod
12+
class SprayToolProvider extends _$SprayToolProvider {
13+
@override
14+
SprayTool build() {
15+
return SprayTool(
16+
type: ToolType.SPRAY,
17+
commandManager: ref.watch(commandManagerProvider),
18+
commandFactory: ref.watch(commandFactoryProvider),
19+
graphicFactory: ref.watch(graphicFactoryProvider),
20+
drawingSurfaceSize:
21+
ref.watch(canvasStateProvider.select((state) => state.size)),
22+
);
23+
}
24+
}

lib/core/providers/state/spray_tool_provider.g.dart

Lines changed: 26 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)