painter icon indicating copy to clipboard operation
painter copied to clipboard

How can I redo?

Open jameszasod opened this issue 4 years ago • 2 comments

How can I redo? Thank you.

jameszasod avatar Jul 09 '21 01:07 jameszasod

First, you need to update the path history class like this:-

class _PathHistory {
  var redoPath = [];
  List<MapEntry<Path, Paint>> _paths;
  Paint currentPaint;
  Paint _backgroundPaint;
  bool _inDrag;

  bool get isEmpty => _paths.isEmpty || (_paths.length == 1 && _inDrag);

  _PathHistory()
      : _paths = <MapEntry<Path, Paint>>[],
        _inDrag = false,
        _backgroundPaint = new Paint()..blendMode = BlendMode.dstOver,
        currentPaint = new Paint()
          ..color = Colors.black
          ..strokeWidth = 1.0
          ..style = PaintingStyle.fill;

  void setBackgroundColor(Color backgroundColor) {
    _backgroundPaint.color = backgroundColor;
  }

  void undo() {
    if (!_inDrag) {
      if(_paths.isNotEmpty){
        redoPath.add(_paths.last);
      }
      _paths.removeLast();
      print("elements are ${redoPath.length}");
      print("_paths elements are ${_paths.length}");
    }
  }
  
  void redo(){
      _paths.add(redoPath.last);
      redoPath.removeLast();
      print("redo path are ${redoPath.length}");
      print("_paths elements are ${_paths.length}");
  }

  void clear() {
    if (!_inDrag) {
      _paths.clear();
      redoPath.clear();
      print("elements of undo ${_paths.length}");
      print("elements of redo ${redoPath.length}");
    }
  }

  void add(Offset startPoint) {
    if (!_inDrag) {
      _inDrag = true;
      Path path = new Path();
      path.moveTo(startPoint.dx, startPoint.dy);
      _paths.add(new MapEntry<Path, Paint>(path, currentPaint));
    }
  }

  void updateCurrent(Offset nextPoint) {
    if (_inDrag) {
      Path path = _paths.last.key;
      path.lineTo(nextPoint.dx, nextPoint.dy);
    }
  }

  void endCurrent() {
    _inDrag = false;
  }

  void draw(Canvas canvas, Size size) {
    canvas.saveLayer(Offset.zero & size, Paint());
    for (MapEntry<Path, Paint> path in _paths) {
      Paint p = path.value;
      canvas.drawPath(path.key, p);
    }
    canvas.drawRect(
        new Rect.fromLTWH(0.0, 0.0, size.width, size.height), _backgroundPaint);
    canvas.restore();
  }
}

End Then Add This redo Methode In Painter controller like this:-

void redo(){
    if (!isFinished()){
      _pathHistory.redo();
      notifyListeners();
    }
  }

you need to also update the undo method that I already do in path history's code

You're Welcome! :-)

karan-jarvis avatar Jul 19 '21 07:07 karan-jarvis

First, you need to update the path history class like this:-

class _PathHistory {
  var redoPath = [];
  List<MapEntry<Path, Paint>> _paths;
  Paint currentPaint;
  Paint _backgroundPaint;
  bool _inDrag;

  bool get isEmpty => _paths.isEmpty || (_paths.length == 1 && _inDrag);

  _PathHistory()
      : _paths = <MapEntry<Path, Paint>>[],
        _inDrag = false,
        _backgroundPaint = new Paint()..blendMode = BlendMode.dstOver,
        currentPaint = new Paint()
          ..color = Colors.black
          ..strokeWidth = 1.0
          ..style = PaintingStyle.fill;

  void setBackgroundColor(Color backgroundColor) {
    _backgroundPaint.color = backgroundColor;
  }

  void undo() {
    if (!_inDrag) {
      if(_paths.isNotEmpty){
        redoPath.add(_paths.last);
      }
      _paths.removeLast();
      print("elements are ${redoPath.length}");
      print("_paths elements are ${_paths.length}");
    }
  }
  
  void redo(){
      _paths.add(redoPath.last);
      redoPath.removeLast();
      print("redo path are ${redoPath.length}");
      print("_paths elements are ${_paths.length}");
  }

  void clear() {
    if (!_inDrag) {
      _paths.clear();
      redoPath.clear();
      print("elements of undo ${_paths.length}");
      print("elements of redo ${redoPath.length}");
    }
  }

  void add(Offset startPoint) {
    if (!_inDrag) {
      _inDrag = true;
      Path path = new Path();
      path.moveTo(startPoint.dx, startPoint.dy);
      _paths.add(new MapEntry<Path, Paint>(path, currentPaint));
    }
  }

  void updateCurrent(Offset nextPoint) {
    if (_inDrag) {
      Path path = _paths.last.key;
      path.lineTo(nextPoint.dx, nextPoint.dy);
    }
  }

  void endCurrent() {
    _inDrag = false;
  }

  void draw(Canvas canvas, Size size) {
    canvas.saveLayer(Offset.zero & size, Paint());
    for (MapEntry<Path, Paint> path in _paths) {
      Paint p = path.value;
      canvas.drawPath(path.key, p);
    }
    canvas.drawRect(
        new Rect.fromLTWH(0.0, 0.0, size.width, size.height), _backgroundPaint);
    canvas.restore();
  }
}

End Then Add This redo Methode In Painter controller like this:-

void redo(){
    if (!isFinished()){
      _pathHistory.redo();
      notifyListeners();
    }
  }

you need to also update the undo method that I already do in path history's code

You're Welcome! :-)

Thank you so much!, I'm new in Flutter xD

jameszasod avatar Jul 19 '21 07:07 jameszasod