save correct color to db
use different pointer for highlighter
This commit is contained in:
		| @@ -40,7 +40,8 @@ class MyPainter extends CustomPainter { | |||||||
|   void paint(Canvas canvas, Size size) { |   void paint(Canvas canvas, Size size) { | ||||||
|     var paint = Paint() |     var paint = Paint() | ||||||
|       ..color = Colors.blue |       ..color = Colors.blue | ||||||
|       ..strokeCap = StrokeCap.square; |       ..strokeCap = StrokeCap.square | ||||||
|  |       ..isAntiAlias = true; | ||||||
|  |  | ||||||
|     // clipping canvas to reqired size |     // clipping canvas to reqired size | ||||||
|     canvas.clipRect(Offset.zero & size); |     canvas.clipRect(Offset.zero & size); | ||||||
| @@ -59,8 +60,24 @@ class MyPainter extends CustomPainter { | |||||||
|         Offset pt2 = stroke.points[i + 1].point; |         Offset pt2 = stroke.points[i + 1].point; | ||||||
|         pt2 = _translatept(pt2, size); |         pt2 = _translatept(pt2, size); | ||||||
|  |  | ||||||
|         canvas.drawLine( |         final zoomedthickness = stroke.points[i].thickness * zoom; | ||||||
|             pt1, pt2, paint..strokeWidth = stroke.points[i].thickness * zoom); |  | ||||||
|  |         // only temporary solution to differ from highlighter and pen | ||||||
|  |         if (stroke.color.opacity != 1.0) { | ||||||
|  |           final off = Offset(zoomedthickness / 2, zoomedthickness / 2); | ||||||
|  |           canvas.drawPath( | ||||||
|  |               Path() | ||||||
|  |                 ..moveTo((pt1 - off).dx, (pt1 - off).dy) | ||||||
|  |                 ..lineTo((pt1 + off).dx, (pt1 + off).dy) | ||||||
|  |                 ..lineTo((pt2 + off).dx, (pt2 + off).dy) | ||||||
|  |                 ..lineTo((pt2 - off).dx, (pt2 - off).dy) | ||||||
|  |                 ..lineTo((pt1 - off).dx, (pt1 - off).dy), | ||||||
|  |               paint | ||||||
|  |                 ..style = PaintingStyle.fill | ||||||
|  |                 ..strokeWidth = 0); | ||||||
|  |         } else { | ||||||
|  |           canvas.drawLine(pt1, pt2, paint..strokeWidth = zoomedthickness); | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -62,19 +62,20 @@ class PaintController extends ChangeNotifier { | |||||||
|       if (activePen == Pen.eraser || activePen == Pen.selector) return; |       if (activePen == Pen.eraser || activePen == Pen.selector) return; | ||||||
|  |  | ||||||
|       int strokeid = strokes.isNotEmpty ? strokes.last.id + 1 : 0; |       int strokeid = strokes.isNotEmpty ? strokes.last.id + 1 : 0; | ||||||
|  |       final color = activePen == Pen.pen | ||||||
|  |           ? const Color(0xFF444444) | ||||||
|  |           : Colors.yellow.withOpacity(.3); | ||||||
|       strokes.add(Stroke.fromPoints( |       strokes.add(Stroke.fromPoints( | ||||||
|           [Point(offset, _calcTiltedWidth(3.0, e.tilt))], |           [Point(offset, _calcTiltedWidth(3.0, e.tilt))], strokeid, color)); | ||||||
|           strokeid, |       file.addStroke(strokeid, color); | ||||||
|           activePen == Pen.pen |  | ||||||
|               ? const Color(0xFF444444) |  | ||||||
|               : Colors.yellow.withOpacity(.5))); |  | ||||||
|       file.addStroke(strokeid); |  | ||||||
|       notifyListeners(); |       notifyListeners(); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   void pointUpEvent(PointerUpEvent e) { |   void pointUpEvent(PointerUpEvent e) { | ||||||
|     if (activePen == Pen.eraser) return; |     if (activePen == Pen.eraser) return; | ||||||
|  |  | ||||||
|  |     // pointerupevent doesn't deliver correct event button | ||||||
|     if (_allowedToDraw(e.kind, 1)) { |     if (_allowedToDraw(e.kind, 1)) { | ||||||
|       final lastStroke = strokes.last; |       final lastStroke = strokes.last; | ||||||
|       if (lastStroke.points.length <= 1) { |       if (lastStroke.points.length <= 1) { | ||||||
| @@ -122,20 +123,24 @@ class PaintController extends ChangeNotifier { | |||||||
|           } |           } | ||||||
|           break; |           break; | ||||||
|         case Pen.pen: |         case Pen.pen: | ||||||
|         case Pen.highlighter: |  | ||||||
|           final pts = strokes.last.points; |           final pts = strokes.last.points; | ||||||
|  |           // avoid duplicates | ||||||
|           if (pts.last.point == offset) return; |           if (pts.last.point == offset) return; | ||||||
|  |  | ||||||
|           double newWidth = _calcTiltedWidth(5.0, event.tilt); |           double newWidth = _calcTiltedWidth(4.0, event.tilt); | ||||||
|           if (pts.length > 1) { |           if (pts.length > 1) { | ||||||
|             newWidth = _calcAngleDependentWidth(pts.last, |             newWidth = _calcAngleDependentWidth(pts.last, | ||||||
|                 pts[pts.length - (pts.length > 5 ? 5 : pts.length)], newWidth); |                 pts[pts.length - (pts.length > 5 ? 5 : pts.length)], newWidth); | ||||||
|           } |           } | ||||||
|  |  | ||||||
|           Point p = Point(offset, newWidth); |           strokes.last.addPoint(Point(offset, newWidth)); | ||||||
|           strokes.last.addPoint(p); |           break; | ||||||
|           // // todo do a batch commit per stroke |         case Pen.highlighter: | ||||||
|           // file.addPoint(strokes.last.id, p); |           final pts = strokes.last.points; | ||||||
|  |           // avoid duplicates | ||||||
|  |           if (pts.last.point == offset) return; | ||||||
|  |  | ||||||
|  |           strokes.last.addPoint(Point(offset, 15.0)); | ||||||
|           break; |           break; | ||||||
|         case Pen.selector: |         case Pen.selector: | ||||||
|           // TODO: Handle this case. |           // TODO: Handle this case. | ||||||
|   | |||||||
| @@ -47,9 +47,9 @@ void exportPDF(List<Stroke> strokes, String name) async { | |||||||
|  |  | ||||||
|   const PdfPageFormat a4 = PdfPageFormat(_a4width, _a4height); |   const PdfPageFormat a4 = PdfPageFormat(_a4width, _a4height); | ||||||
|  |  | ||||||
|   pdf.addPage(pw.MultiPage( |   pdf.addPage(pw.Page( | ||||||
|     pageFormat: a4, |     pageFormat: a4, | ||||||
|     build: (context) => [_StrokePDFPaint(strokes)], |     build: (context) => _StrokePDFPaint(strokes), | ||||||
|   )); |   )); | ||||||
|  |  | ||||||
|   final path = await getSavePath(); |   final path = await getSavePath(); | ||||||
|   | |||||||
| @@ -5,9 +5,13 @@ import 'note_file.dart'; | |||||||
|  |  | ||||||
| extension LineLoading on NoteFile { | extension LineLoading on NoteFile { | ||||||
|   Future<List<Stroke>> loadStrokes() async { |   Future<List<Stroke>> loadStrokes() async { | ||||||
|     final query = await db().query('points', |     const sql = ''' | ||||||
|         orderBy: 'strokeid', | SELECT x, y, thickness, strokeid, points.id, s.color | ||||||
|         columns: ['x', 'y', 'thickness', 'strokeid', 'id']); | from points | ||||||
|  |          JOIN strokes s on s.id = strokeid | ||||||
|  | ORDER BY strokeid | ||||||
|  | '''; | ||||||
|  |     final query = await db().rawQuery(sql); | ||||||
|     int strokeid = -1; |     int strokeid = -1; | ||||||
|     List<Stroke> strokes = []; |     List<Stroke> strokes = []; | ||||||
|  |  | ||||||
| @@ -15,7 +19,7 @@ extension LineLoading on NoteFile { | |||||||
|       final int csid = i['strokeid'] as int; |       final int csid = i['strokeid'] as int; | ||||||
|       if (csid != strokeid) { |       if (csid != strokeid) { | ||||||
|         strokeid = csid; |         strokeid = csid; | ||||||
|         strokes.add(Stroke(strokeid, Colors.green)); |         strokes.add(Stroke(strokeid, Color(i['color'] as int))); | ||||||
|       } |       } | ||||||
|       final Point p = Point( |       final Point p = Point( | ||||||
|           Offset(i['x'] as double, i['y'] as double), i['thickness'] as double); |           Offset(i['x'] as double, i['y'] as double), i['thickness'] as double); | ||||||
| @@ -26,11 +30,12 @@ extension LineLoading on NoteFile { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   // create new stroke in file and return strokeid |   // create new stroke in file and return strokeid | ||||||
|   Future<void> addStroke(int newStrokeId) async { |   Future<void> addStroke(int newStrokeId, Color color) async { | ||||||
|     await db().insert( |     await db().insert( | ||||||
|         'strokes', {'color': 0xffffff, 'elevation': 0, 'id': newStrokeId}); |         'strokes', {'color': color.value, 'elevation': 0, 'id': newStrokeId}); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   // add one point to a stroke in db | ||||||
|   Future<void> addPoint(int strokeid, Point p) async { |   Future<void> addPoint(int strokeid, Point p) async { | ||||||
|     await db().insert('points', { |     await db().insert('points', { | ||||||
|       'x': p.point.dx, |       'x': p.point.dx, | ||||||
| @@ -40,6 +45,7 @@ extension LineLoading on NoteFile { | |||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   // add list of points to a stroke in db | ||||||
|   Future<void> addPoints(int strokeid, List<Point> pts) async { |   Future<void> addPoints(int strokeid, List<Point> pts) async { | ||||||
|     final batch = db().batch(); |     final batch = db().batch(); | ||||||
|     for (final p in pts) { |     for (final p in pts) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user