Skip to content
Open
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
12 changes: 12 additions & 0 deletions lib/core/commands/command_factory/command_factory.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import 'package:paintroid/core/commands/command_implementation/graphic/shape/hea
import 'package:paintroid/core/commands/command_implementation/graphic/shape/square_shape_command.dart';
import 'package:paintroid/core/commands/command_implementation/graphic/shape/star_shape_command.dart';
import 'package:paintroid/core/commands/command_implementation/graphic/spray_command.dart';
import 'package:paintroid/core/commands/command_implementation/graphic/color_changed_command.dart';
import 'package:paintroid/core/commands/path_with_action_history.dart';
import 'package:paintroid/core/enums/shape_style.dart';

Expand Down Expand Up @@ -136,4 +137,15 @@ class CommandFactory {
Paint(),
region,
);

ColorChangedCommand createColorChangedCommand(
Color oldColor,
Color newColor,
Paint paint,
) =>
ColorChangedCommand(
oldColor: oldColor,
newColor: newColor,
paint: paint,
);
}
3 changes: 3 additions & 0 deletions lib/core/commands/command_implementation/command.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:paintroid/core/commands/command_implementation/graphic/shape/squ
import 'package:paintroid/core/commands/command_implementation/graphic/text_command.dart';
import 'package:paintroid/core/commands/command_implementation/graphic/shape/heart_shape_command.dart';
import 'package:paintroid/core/commands/command_implementation/graphic/shape/star_shape_command.dart';
import 'package:paintroid/core/commands/command_implementation/graphic/color_changed_command.dart';
import 'package:paintroid/core/json_serialization/versioning/serializer_version.dart';

abstract class Command with EquatableMixin {
Expand Down Expand Up @@ -38,6 +39,8 @@ abstract class Command with EquatableMixin {
return HeartShapeCommand.fromJson(json);
case SerializerType.STAR_SHAPE_COMMAND:
return StarShapeCommand.fromJson(json);
case SerializerType.COLOR_CHANGED_COMMAND:
return ColorChangedCommand.fromJson(json);
default:
return PathCommand.fromJson(json);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import 'dart:ui';

import 'package:json_annotation/json_annotation.dart';
import 'package:paintroid/core/commands/command_implementation/graphic/graphic_command.dart';
import 'package:paintroid/core/json_serialization/converter/color_converter.dart';
import 'package:paintroid/core/json_serialization/converter/paint_converter.dart';
import 'package:paintroid/core/json_serialization/versioning/serializer_version.dart';
import 'package:paintroid/core/json_serialization/versioning/version_strategy.dart';

part 'color_changed_command.g.dart';

@JsonSerializable()
class ColorChangedCommand extends GraphicCommand {
final String type;
final int version;

@ColorConverter()
final Color oldColor;

@ColorConverter()
final Color newColor;

ColorChangedCommand({
required this.oldColor,
required this.newColor,
required Paint paint,
this.type = SerializerType.COLOR_CHANGED_COMMAND,
int? version,
}) : version = version ??
VersionStrategyManager.strategy.getColorChangedCommandVersion(),
super(paint);

@override
void call(Canvas canvas) {}

@override
List<Object?> get props => [oldColor, newColor, type, version, paint];

@override
Map<String, dynamic> toJson() => _$ColorChangedCommandToJson(this);

factory ColorChangedCommand.fromJson(Map<String, dynamic> json) {
final int version = json['version'] as int? ?? Version.v1;
switch (version) {
case Version.v1:
return _$ColorChangedCommandFromJson(json);
case Version.v2:
// For different versions of ColorChangedCommand the deserialization
// has to be implemented manually.
// Autogenerated code can only be used for one version
default:
return _$ColorChangedCommandFromJson(json);
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions lib/core/commands/command_manager/command_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import 'package:paintroid/core/tools/line_tool/vertex.dart';
import 'package:paintroid/core/tools/line_tool/vertex_stack.dart';
import 'package:paintroid/core/tools/tool_data.dart';
import 'package:paintroid/core/commands/command_implementation/graphic/spray_command.dart';
import 'package:paintroid/core/commands/command_implementation/graphic/color_changed_command.dart';

enum ActionType { UNDO, REDO }

Expand Down Expand Up @@ -133,6 +134,8 @@ class CommandManager {
} else {
return ToolData.BRUSH;
}
} else if (command is ColorChangedCommand) {
return ToolData.PIPETTE;
} else {
return ToolData.BRUSH;
}
Expand Down
13 changes: 13 additions & 0 deletions lib/core/json_serialization/converter/color_converter.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import 'dart:ui';
import 'package:json_annotation/json_annotation.dart';
import 'package:paintroid/core/utils/color_utils.dart';

class ColorConverter implements JsonConverter<Color, int> {
const ColorConverter();

@override
Color fromJson(int json) => Color(json);

@override
int toJson(Color color) => color.toValue();
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class SerializerVersion {
static const int SPRAY_COMMAND_VERSION = Version.v1;
static const int CLIPBOARD_COMMAND_VERSION = Version.v1;
static const int DELETE_REGION_COMMAND_VERSION = Version.v1;
static const int COLOR_CHANGED_COMMAND_VERSION = Version.v1;
}

class Version {
Expand All @@ -33,4 +34,5 @@ class SerializerType {
static const String SPRAY_COMMAND = 'SprayCommand';
static const String CLIPBOARD_COMMAND = 'ClipboardCommand';
static const String DELETE_REGION_COMMAND = 'DeleteRegionCommand';
static const String COLOR_CHANGED_COMMAND = 'ColorChangedCommand';
}
6 changes: 6 additions & 0 deletions lib/core/json_serialization/versioning/version_strategy.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ abstract class IVersionStrategy {
int getClipboardCommandVersion();

int getDeleteRegionCommandVersion();

int getColorChangedCommandVersion();
}

class ProductionVersionStrategy implements IVersionStrategy {
Expand Down Expand Up @@ -63,6 +65,10 @@ class ProductionVersionStrategy implements IVersionStrategy {
@override
int getDeleteRegionCommandVersion() =>
SerializerVersion.DELETE_REGION_COMMAND_VERSION;

@override
int getColorChangedCommandVersion() =>
SerializerVersion.COLOR_CHANGED_COMMAND_VERSION;
}

class VersionStrategyManager {
Expand Down
23 changes: 23 additions & 0 deletions lib/core/providers/object/tools/pipette_tool_provider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import 'package:paintroid/core/commands/command_factory/command_factory_provider.dart';
import 'package:paintroid/core/commands/command_manager/command_manager_provider.dart';
import 'package:paintroid/core/enums/tool_types.dart';
import 'package:paintroid/core/providers/state/canvas_state_provider.dart';
import 'package:paintroid/core/providers/state/paint_provider.dart';
import 'package:paintroid/core/tools/implementation/pipette_tool.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';

part 'pipette_tool_provider.g.dart';

@riverpod
class PipetteToolProvider extends _$PipetteToolProvider {
@override
PipetteTool build() {
return PipetteTool(
commandFactory: ref.watch(commandFactoryProvider),
commandManager: ref.watch(commandManagerProvider),
type: ToolType.PIPETTE,
paintProvider: ref.watch(paintProvider.notifier),
canvasStateProvider: ref.watch(canvasStateProvider.notifier),
);
}
}
27 changes: 27 additions & 0 deletions lib/core/providers/object/tools/pipette_tool_provider.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions lib/core/providers/state/canvas_state_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ class CanvasStateProvider extends _$CanvasStateProvider with LoggableMixin {
);
}

CanvasStateData get currentState => state;

void setBackgroundImage(Image image) => state = state.copyWith(
backgroundImage: image,
size: Size(image.width.toDouble(), image.height.toDouble()),
Expand Down
2 changes: 1 addition & 1 deletion lib/core/providers/state/canvas_state_provider.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions lib/core/providers/state/paint_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ class PaintProvider extends _$PaintProvider {
..strokeWidth = 25;
}

Paint get currentState => state;

void updateStrokeWidth(double newStrokeWidth) {
state = GraphicFactory.copyPaintWith(
original: state,
Expand Down
2 changes: 1 addition & 1 deletion lib/core/providers/state/paint_provider.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions lib/core/providers/state/toolbox_state_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:paintroid/core/providers/object/tools/clipboard_tool_provider.da
import 'package:paintroid/core/providers/object/tools/eraser_tool_provider.dart';
import 'package:paintroid/core/providers/object/tools/hand_tool_provider.dart';
import 'package:paintroid/core/providers/object/tools/line_tool_provider.dart';
import 'package:paintroid/core/providers/object/tools/pipette_tool_provider.dart';
import 'package:paintroid/core/providers/object/tools/shapes_tool_provider.dart';
import 'package:paintroid/core/providers/object/tools/text_tool_provider.dart';
import 'package:paintroid/core/providers/object/tools/watercolor_tool_provider.dart';
Expand Down Expand Up @@ -90,6 +91,9 @@ class ToolBoxStateProvider extends _$ToolBoxStateProvider {
state = state.copyWith(currentTool: ref.read(clipboardToolProvider));
ref.read(canvasPainterProvider.notifier).repaint();
break;
case ToolType.PIPETTE:
state = state.copyWith(currentTool: ref.read(pipetteToolProvider));
break;
default:
state = state.copyWith(currentTool: ref.read(brushToolProvider));
break;
Expand Down
2 changes: 1 addition & 1 deletion lib/core/providers/state/toolbox_state_provider.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading