Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How can I redo? #36

Open
jameszasod opened this issue Jul 9, 2021 · 2 comments
Open

How can I redo? #36

jameszasod opened this issue Jul 9, 2021 · 2 comments

Comments

@jameszasod
Copy link

How can I redo?
Thank you.

@karan-jarvis
Copy link

karan-jarvis commented Jul 19, 2021

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! :-)

@jameszasod
Copy link
Author

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

bdlukaa added a commit to presence-app/painter that referenced this issue Jul 12, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants