feat(tools): rnote-style toolbar core writing batch
Some checks failed
CI / Windows build (push) Has been cancelled

Replace the ad-hoc tool palette with a shared tool system
(EditorToolKind) across the PDF, note and slide editors, and add
the core writing tools.

- Multiple brushes, each remembering its OWN color (rnote-style):
  selecting a brush restores its color, changing color updates only
  that brush, and each brush button shows its current color.
- Select tool: tap-select a committed stroke, drag to move it,
  delete it — persisted and undoable.
- Shape tool: line / rectangle / ellipse / arrow, drawn with a live
  preview and committed as generated PenStrokes (shape_geometry.dart)
  so they reuse stroke rendering, erase, persistence and undo.
- Highlighter + eraser fold into the same tool system.

Text/bookmark/search+OCR/backgrounds/Windows-Ink are later batches
(TODO). Brush opacity still deferred. analyze clean, 302 tests.
This commit is contained in:
2026-06-24 20:38:18 +08:00
parent fd102b5703
commit 875dabcd89
18 changed files with 2104 additions and 62 deletions

View File

@@ -51,6 +51,14 @@
"brushBallpoint": "Ballpoint",
"brushPencil": "Pencil",
"brushHighlighter": "Highlighter",
"toolSelect": "Select",
"toolShape": "Shape",
"shapePicker": "Shape",
"shapeLine": "Line",
"shapeRectangle": "Rectangle",
"shapeEllipse": "Ellipse",
"shapeArrow": "Arrow",
"actionDeleteSelection": "Delete selection",
"actionUndo": "Undo",
"actionRedo": "Redo",
"fingerDrawingOn": "Finger drawing ON",

View File

@@ -350,6 +350,54 @@ abstract class AppLocalizations {
/// **'Highlighter'**
String get brushHighlighter;
/// No description provided for @toolSelect.
///
/// In en, this message translates to:
/// **'Select'**
String get toolSelect;
/// No description provided for @toolShape.
///
/// In en, this message translates to:
/// **'Shape'**
String get toolShape;
/// No description provided for @shapePicker.
///
/// In en, this message translates to:
/// **'Shape'**
String get shapePicker;
/// No description provided for @shapeLine.
///
/// In en, this message translates to:
/// **'Line'**
String get shapeLine;
/// No description provided for @shapeRectangle.
///
/// In en, this message translates to:
/// **'Rectangle'**
String get shapeRectangle;
/// No description provided for @shapeEllipse.
///
/// In en, this message translates to:
/// **'Ellipse'**
String get shapeEllipse;
/// No description provided for @shapeArrow.
///
/// In en, this message translates to:
/// **'Arrow'**
String get shapeArrow;
/// No description provided for @actionDeleteSelection.
///
/// In en, this message translates to:
/// **'Delete selection'**
String get actionDeleteSelection;
/// No description provided for @actionUndo.
///
/// In en, this message translates to:

View File

@@ -140,6 +140,30 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get brushHighlighter => 'Highlighter';
@override
String get toolSelect => 'Select';
@override
String get toolShape => 'Shape';
@override
String get shapePicker => 'Shape';
@override
String get shapeLine => 'Line';
@override
String get shapeRectangle => 'Rectangle';
@override
String get shapeEllipse => 'Ellipse';
@override
String get shapeArrow => 'Arrow';
@override
String get actionDeleteSelection => 'Delete selection';
@override
String get actionUndo => 'Undo';

View File

@@ -140,6 +140,30 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get brushHighlighter => '荧光笔';
@override
String get toolSelect => '选择';
@override
String get toolShape => '形状';
@override
String get shapePicker => '形状';
@override
String get shapeLine => '直线';
@override
String get shapeRectangle => '矩形';
@override
String get shapeEllipse => '椭圆';
@override
String get shapeArrow => '箭头';
@override
String get actionDeleteSelection => '删除所选';
@override
String get actionUndo => '撤销';

View File

@@ -42,6 +42,14 @@
"brushBallpoint": "圆珠笔",
"brushPencil": "铅笔",
"brushHighlighter": "荧光笔",
"toolSelect": "选择",
"toolShape": "形状",
"shapePicker": "形状",
"shapeLine": "直线",
"shapeRectangle": "矩形",
"shapeEllipse": "椭圆",
"shapeArrow": "箭头",
"actionDeleteSelection": "删除所选",
"actionUndo": "撤销",
"actionRedo": "重做",
"fingerDrawingOn": "手指书写:开",