Skip to content

Commit

Permalink
同步优化
Browse files Browse the repository at this point in the history
  • Loading branch information
lyming99 committed Mar 20, 2024
1 parent 3cd2073 commit 29a1f37
Show file tree
Hide file tree
Showing 10 changed files with 124 additions and 125 deletions.
Binary file added demo/newData.data
Binary file not shown.
Binary file added demo/oldData.data
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class MobileCardEditController extends MobileDocEditController {
editController.waitLayout(() {
editController.requestFocus();
});
doc.updateV2.add((data, origin, transaction) async {
doc.updateV2['update'] = ((data, origin, transaction) async {
card.content = await getDocJson();
await serviceManager.cardService.updateCard(card);
});
Expand Down
2 changes: 1 addition & 1 deletion lib/app/mobile/view/edit/doc_edit_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ class MobileDocEditController extends ServiceManagerController {
editController.waitLayout(() {
editController.requestFocus();
});
doc.updateV2.add((data, origin, transaction) {
doc.updateV2['update'] = ((data, origin, transaction) {
if (transaction.local != true) {
// 如果不是本地更新的话,就不需要写入文件了
return;
Expand Down
2 changes: 1 addition & 1 deletion lib/app/windows/view/doc/win_note_edit_tab.dart
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ class WinNoteEditTabController extends WinEditTabController {
yDoc: doc,
);
ysTree!.init();
doc.updateV2.add((data, origin, transaction) {
doc.updateV2['update'] = ((data, origin, transaction) {
if (transaction.local != true) {
return;
}
Expand Down
3 changes: 1 addition & 2 deletions lib/app/windows/widgets/card_editor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ class _CardEditorState extends State<CardEditor>
readDoc();
}


@override
void dispose() {
super.dispose();
Expand Down Expand Up @@ -76,7 +75,7 @@ class _CardEditorState extends State<CardEditor>
yDoc: doc,
);
ysTree!.init();
doc.updateV2.add((data, origin, transaction) async {
doc.updateV2['update'] = ((data, origin, transaction) async {
var json = await getJson();
widget.card.content = json;
widget.onCardUpdate?.call(doc);
Expand Down
192 changes: 99 additions & 93 deletions lib/editor/edit_content_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -59,111 +59,117 @@ class EditContentWidgetState extends State<EditContentWidget> {
widget.controller.viewContext = context;
return LayoutBuilder(
builder: (context, constraints) {
double maxWidth =
min(widget.controller.maxEditWidth, constraints.maxWidth);
var blockConstrains = constraints.copyWith(maxWidth: maxWidth);
widget.controller.onLayoutBuild(context, constraints, blockConstrains);
widget.viewportOffset.applyViewportDimension(constraints.maxHeight);
var maxExtend = max(
0.0, widget.controller.getContentHeight() - constraints.maxHeight);
widget.viewportOffset.applyContentDimensions(0, maxExtend);
// 通知卡片高度更新,以便列表更新卡片高度
EditContentHeightNotification(widget.controller.getContentHeight())
.dispatch(context);
//显示blockWidgets
var blockWidgets = widget.controller
.buildContentBlocksWidget(context, constraints, blockConstrains);
//计算滚动最大位置
var cursorWidget = widget.controller.buildCursorWidget();
if (cursorWidget != null) {
blockWidgets.add(cursorWidget);
}
var contentWidgets = <Widget>[];
var singleWidgets = <Widget>[];
for (var widget in blockWidgets) {
if (widget is SingleWidget) {
singleWidgets.add(widget);
} else {
contentWidgets.add(widget);
try{
double maxWidth =
min(widget.controller.maxEditWidth, constraints.maxWidth);
var blockConstrains = constraints.copyWith(maxWidth: maxWidth);
widget.controller
.onLayoutBuild(context, constraints, blockConstrains);
widget.viewportOffset.applyViewportDimension(constraints.maxHeight);
var maxExtend = max(0.0,
widget.controller.getContentHeight() - constraints.maxHeight);
widget.viewportOffset.applyContentDimensions(0, maxExtend);
// 通知卡片高度更新,以便列表更新卡片高度
EditContentHeightNotification(widget.controller.getContentHeight())
.dispatch(context);
//显示blockWidgets
var blockWidgets = widget.controller
.buildContentBlocksWidget(context, constraints, blockConstrains);
//计算滚动最大位置
var cursorWidget = widget.controller.buildCursorWidget();
if (cursorWidget != null) {
blockWidgets.add(cursorWidget);
}
}
var floatWidgetXOffset =
(constraints.maxWidth - blockConstrains.maxWidth) / 2;
widget.controller.floatWidgetXOffset = floatWidgetXOffset;
List<PopupPositionWidget> floatWidgets =
EditController.translatePopupPositionWidget(
widget.controller.buildFloatWidgets(), floatWidgetXOffset, 0.0);
var backgroundWidgets = EditController.translatePopupPositionWidget(
widget.controller.buildBackgroundWidgets(),
floatWidgetXOffset,
0.0);
return PopupStack(
children: [
//block背景渲染
...backgroundWidgets,
//镶嵌的block
Align(
alignment: Alignment.topCenter,
child: SizedBox(
width: blockConstrains.maxWidth,
height: blockConstrains.maxHeight,
child: Focus(
focusNode: widget.controller.focusNode,
autofocus: widget.controller.initFocus,
onFocusChange: (focus) {
widget.controller.onFocusChanged(focus);
},
onKey: (node, event) {
var result = widget.controller.onKey(node, event);
if (widget.controller.inputManager.hasComposing) {
return KeyEventResult.skipRemainingHandlers;
}
return result;
},
child: GestureDetector(
onLongPress: () {
HapticFeedback.selectionClick();
var eventQueue = widget
.controller.mouseKeyboardState.mouseDownEvent1;
if (eventQueue.isNotEmpty) {
widget.controller
.selectWord(eventQueue.last.localPosition);
var contentWidgets = <Widget>[];
var singleWidgets = <Widget>[];
for (var widget in blockWidgets) {
if (widget is SingleWidget) {
singleWidgets.add(widget);
} else {
contentWidgets.add(widget);
}
}
var floatWidgetXOffset =
(constraints.maxWidth - blockConstrains.maxWidth) / 2;
widget.controller.floatWidgetXOffset = floatWidgetXOffset;
List<PopupPositionWidget> floatWidgets =
EditController.translatePopupPositionWidget(
widget.controller.buildFloatWidgets(),
floatWidgetXOffset,
0.0);
var backgroundWidgets = EditController.translatePopupPositionWidget(
widget.controller.buildBackgroundWidgets(),
floatWidgetXOffset,
0.0);
return PopupStack(
children: [
//block背景渲染
...backgroundWidgets,
//镶嵌的block
Align(
alignment: Alignment.topCenter,
child: SizedBox(
width: blockConstrains.maxWidth,
height: blockConstrains.maxHeight,
child: Focus(
focusNode: widget.controller.focusNode,
autofocus: widget.controller.initFocus,
onFocusChange: (focus) {
widget.controller.onFocusChanged(focus);
},
onKey: (node, event) {
var result = widget.controller.onKey(node, event);
if (widget.controller.inputManager.hasComposing) {
return KeyEventResult.skipRemainingHandlers;
}
return result;
},
child: MouseEventListenerWidget(
eventListener: (event, entry) {
widget.controller.onMouseEvent(event.copyWith(
position: event.position,
));
child: GestureDetector(
onLongPress: () {
HapticFeedback.selectionClick();
var eventQueue = widget
.controller.mouseKeyboardState.mouseDownEvent1;
if (eventQueue.isNotEmpty) {
widget.controller
.selectWord(eventQueue.last.localPosition);
}
},
behavior: HitTestBehavior.opaque,
child: SizedBox(
width: blockConstrains.maxWidth,
height: blockConstrains.maxHeight,
child: Stack(
children: contentWidgets,
child: MouseEventListenerWidget(
eventListener: (event, entry) {
widget.controller.onMouseEvent(event.copyWith(
position: event.position,
));
},
behavior: HitTestBehavior.opaque,
child: SizedBox(
width: blockConstrains.maxWidth,
height: blockConstrains.maxHeight,
child: Stack(
children: contentWidgets,
),
),
),
),
),
),
),
),
//独立控制事件的block
Align(
alignment: Alignment.topCenter,
child: SizedBox(
width: blockConstrains.maxWidth,
height: blockConstrains.maxHeight,
child: Stack(
children: singleWidgets,
//独立控制事件的block
Align(
alignment: Alignment.topCenter,
child: SizedBox(
width: blockConstrains.maxWidth,
height: blockConstrains.maxHeight,
child: Stack(
children: singleWidgets,
),
),
),
),
//悬浮控件
...floatWidgets,
],
);
//悬浮控件
...floatWidgets,
],
);
}finally{
}
},
);
}
Expand Down
1 change: 1 addition & 0 deletions lib/editor/edit_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -625,6 +625,7 @@ class EditController with ChangeNotifier {
if (constrains.maxWidth < 0) {
return [];
}

var blocks = blockManager.layout(
context, scrollOffset, Size(blockMaxWidth, visionHeight), padding);
var ret = <Widget>[];
Expand Down
30 changes: 3 additions & 27 deletions lib/service/edit/doc_edit_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ class DocEditService {

DocEditService(this.serviceManager);

final _fileCache = <String, Uint8List>{};
final _docCache = <String, YDoc>{};
final _docLock = <String, Object>{};
final _openedDocList = <String>{};
Expand All @@ -46,15 +45,10 @@ class DocEditService {
if (docId == null || docId.isEmpty) {
return null;
}
var item = _fileCache[docId];
if (item != null) {
return item;
}
var noteFile =
File(await serviceManager.fileManager.getNoteFilePath(docId));
if (noteFile.existsSync()) {
var result = await noteFile.readAsBytes();
_fileCache[docId] = result;
return result;
}
return null;
Expand All @@ -67,7 +61,6 @@ class DocEditService {
var noteFile =
File(await serviceManager.fileManager.getNoteFilePath(docId));
await noteFile.writeAsBytes(data);
_fileCache[docId] = data;
printLog("writeDocBytes: $noteFile");
}

Expand All @@ -79,30 +72,14 @@ class DocEditService {
if (doc != null) {
return doc;
}
// 如何将读取耗时控制在一定范围内?
var bytes = await readDocBytes(docId);
if (bytes == null) {
// 读取失败,应该触发1秒后从服务器下载文档数据
// if (serviceManager.userService.hasLogin) {
// serviceManager.docSnapshotService.downloadDocFile(docId);
// }
return null;
}
var docItem = await serviceManager.docService.queryDoc(docId);
dynamic createTime = docItem?.createTime;
String? dateTime;
if (createTime != null) {
var date = DateTime.fromMillisecondsSinceEpoch(createTime);
dateTime = date.toString();
}
try {
var path = await serviceManager.fileManager.getNoteFilePath(docId);
var result = YDoc()..clientId = serviceManager.userService.clientId;
result.applyUpdateV2(bytes);
result.applyUpdateV2(File(path).readAsBytesSync());
FragmentDocFile(path: "$path.bak").readDoc(result);
_docCache[docId] = result;
return result;
} catch (e, stack) {
print(
"read doc file error [${docItem?.type}/${docItem?.name}] lenth: ${bytes.length} create time:$dateTime :${await serviceManager.fileManager.getNoteFilePath(docId)}");
return null;
}
}
Expand Down Expand Up @@ -221,7 +198,6 @@ class DocEditService {

Future<void> deleteDocFile(String docId) async {
_docCache.remove(docId);
_fileCache.remove(docId);
var path = await serviceManager.fileManager.getNoteFilePath(docId);
try {
File(path).deleteSync();
Expand Down
17 changes: 17 additions & 0 deletions test/merge_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'dart:convert';
import 'dart:io';

import 'package:wenznote/editor/crdt/doc_utils.dart';
import 'package:ydart/utils/y_doc.dart';
/// 合并之后得到一堆gc
void main()async{
var oldFile = File("./demo/oldData.data");
print(await oldFile.length());
var newFile = File("./demo/newData.data");
var doc = YDoc();
doc.applyUpdateV2(oldFile.readAsBytesSync());
print(jsonEncode(yDocToWenElements(doc).map((e) => e.toJson()).toList()));
doc.applyUpdateV2(newFile.readAsBytesSync());
print(jsonEncode(yDocToWenElements(doc).map((e) => e.toJson()).toList()));

}

0 comments on commit 29a1f37

Please sign in to comment.