save correct color to db
use different pointer for highlighter
This commit is contained in:
parent
9be2c69ff5
commit
4d52868854
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user