diff --git a/app_flowy/assets/images/editor/editor_check.svg b/app_flowy/assets/images/editor/editor_check.svg new file mode 100644 index 0000000000..8446cced9f --- /dev/null +++ b/app_flowy/assets/images/editor/editor_check.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app_flowy/assets/images/editor/editor_uncheck.svg b/app_flowy/assets/images/editor/editor_uncheck.svg new file mode 100644 index 0000000000..6c487795c6 --- /dev/null +++ b/app_flowy/assets/images/editor/editor_uncheck.svg @@ -0,0 +1,3 @@ + + + diff --git a/app_flowy/lib/workspace/application/app/app_bloc.dart b/app_flowy/lib/workspace/application/app/app_bloc.dart index 0675e562cc..3431eb24ae 100644 --- a/app_flowy/lib/workspace/application/app/app_bloc.dart +++ b/app_flowy/lib/workspace/application/app/app_bloc.dart @@ -75,7 +75,7 @@ class AppBloc extends Bloc { AppState newState = state.copyWith(views: views); if (selectedView != null) { final index = views.indexWhere((element) => element.id == selectedView.id); - if (index != -1) { + if (index == -1) { newState = newState.copyWith(selectedView: null); } } diff --git a/app_flowy/lib/workspace/presentation/stack_page/doc/styles.dart b/app_flowy/lib/workspace/presentation/stack_page/doc/styles.dart index 7ee0b40438..f945070c5d 100644 --- a/app_flowy/lib/workspace/presentation/stack_page/doc/styles.dart +++ b/app_flowy/lib/workspace/presentation/stack_page/doc/styles.dart @@ -4,13 +4,15 @@ import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; import 'package:flowy_infra/theme.dart'; +import 'widget/style_widgets/style_widgets.dart'; + DefaultStyles customStyles(BuildContext context) { const baseSpacing = Tuple2(6, 0); final defaultTextStyle = DefaultTextStyle.of(context); final baseStyle = defaultTextStyle.style.copyWith( fontSize: 18, height: 1.3, - fontWeight: FontWeight.w400, + fontWeight: FontWeight.w300, letterSpacing: 0.6, ); final theme = context.watch(); @@ -72,7 +74,8 @@ DefaultStyles customStyles(BuildContext context) { const Tuple2(0, 0), const Tuple2(0, 0), null), - lists: DefaultTextBlockStyle(baseStyle, baseSpacing, const Tuple2(0, 6), null), + lists: + DefaultListBlockStyle(baseStyle, baseSpacing, const Tuple2(0, 6), null, StyleWidgetBuilder.checkbox(theme)), quote: DefaultTextBlockStyle( TextStyle(color: baseStyle.color!.withOpacity(0.6)), baseSpacing, diff --git a/app_flowy/lib/workspace/presentation/stack_page/doc/widget/style_widgets/style_widgets.dart b/app_flowy/lib/workspace/presentation/stack_page/doc/widget/style_widgets/style_widgets.dart new file mode 100644 index 0000000000..a85a160d84 --- /dev/null +++ b/app_flowy/lib/workspace/presentation/stack_page/doc/widget/style_widgets/style_widgets.dart @@ -0,0 +1,69 @@ +import 'package:flowy_infra/image.dart'; +import 'package:flowy_infra/theme.dart'; +import 'package:flowy_infra_ui/style_widget/icon_button.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_quill/flutter_quill.dart'; + +class StyleWidgetBuilder { + static QuillCheckboxBuilder checkbox(AppTheme theme) { + return EditorCheckboxBuilder(theme); + } +} + +class EditorCheckboxBuilder extends QuillCheckboxBuilder { + final AppTheme theme; + + EditorCheckboxBuilder(this.theme); + + @override + Widget build({required BuildContext context, required bool isChecked, required void Function(bool? p1) onChanged}) { + return FlowyEditorCheckbox( + theme: theme, + isChecked: isChecked, + onChanged: onChanged, + ); + } +} + +class FlowyEditorCheckbox extends StatefulWidget { + final bool isChecked; + final void Function(bool? value) onChanged; + final AppTheme theme; + const FlowyEditorCheckbox({ + required this.theme, + required this.isChecked, + required this.onChanged, + Key? key, + }) : super(key: key); + + @override + _FlowyEditorCheckboxState createState() => _FlowyEditorCheckboxState(); +} + +class _FlowyEditorCheckboxState extends State { + late bool isChecked; + + @override + void initState() { + isChecked = widget.isChecked; + super.initState(); + } + + @override + Widget build(BuildContext context) { + final icon = isChecked ? svg('editor/editor_check') : svg('editor/editor_uncheck'); + return Align( + alignment: Alignment.centerLeft, + child: FlowyIconButton( + onPressed: () { + isChecked = !isChecked; + widget.onChanged(isChecked); + setState(() {}); + }, + iconPadding: EdgeInsets.zero, + icon: icon, + width: 23, + ), + ); + } +} diff --git a/app_flowy/packages/flowy_infra_ui/example/pubspec.lock b/app_flowy/packages/flowy_infra_ui/example/pubspec.lock index eb9c1f5d57..0a91c0b58c 100644 --- a/app_flowy/packages/flowy_infra_ui/example/pubspec.lock +++ b/app_flowy/packages/flowy_infra_ui/example/pubspec.lock @@ -14,7 +14,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.7.0" + version: "2.8.2" boolean_selector: dependency: transitive description: @@ -28,7 +28,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0" charcode: dependency: transitive description: @@ -125,6 +125,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.4" + flutter_svg: + dependency: transitive + description: + name: flutter_svg + url: "https://pub.dartlang.org" + source: hosted + version: "0.22.0" flutter_test: dependency: "direct dev" description: flutter @@ -163,20 +170,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.1" - logger: - dependency: transitive - description: - name: logger - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10" + version: "0.12.11" meta: dependency: transitive description: @@ -198,6 +198,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0" + path_drawing: + dependency: transitive + description: + name: path_drawing + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.1+1" + path_parsing: + dependency: transitive + description: + name: path_parsing + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.dartlang.org" + source: hosted + version: "4.4.0" plugin_platform_interface: dependency: transitive description: @@ -211,7 +232,7 @@ packages: name: provider url: "https://pub.dartlang.org" source: hosted - version: "5.0.0" + version: "6.0.1" sky_engine: dependency: transitive description: flutter @@ -265,7 +286,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.1" + version: "0.4.3" textstyle_extensions: dependency: transitive description: @@ -301,6 +322,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.dartlang.org" + source: hosted + version: "5.3.1" sdks: - dart: ">=2.12.0 <3.0.0" + dart: ">=2.14.0 <3.0.0" flutter: ">=2.0.0" diff --git a/app_flowy/packages/flowy_infra_ui/lib/style_widget/icon_button.dart b/app_flowy/packages/flowy_infra_ui/lib/style_widget/icon_button.dart index e2ace2ac99..598a7fb832 100644 --- a/app_flowy/packages/flowy_infra_ui/lib/style_widget/icon_button.dart +++ b/app_flowy/packages/flowy_infra_ui/lib/style_widget/icon_button.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:flowy_infra/image.dart'; import 'package:flutter/material.dart'; @@ -12,9 +14,9 @@ class FlowyIconButton extends StatelessWidget { const FlowyIconButton({ Key? key, + this.width = 30, this.height, this.onPressed, - this.width = 30, this.fillColor = Colors.transparent, this.hoverColor = Colors.transparent, this.iconPadding = EdgeInsets.zero, @@ -34,9 +36,16 @@ class FlowyIconButton extends StatelessWidget { // child: child, // ); // } + final size = Size(width, height ?? width); + + assert(size.width > iconPadding.horizontal); + assert(size.height > iconPadding.vertical); + + final childWidth = min(size.width - iconPadding.horizontal, size.height - iconPadding.vertical); + final childSize = Size(childWidth, childWidth); return ConstrainedBox( - constraints: BoxConstraints.tightFor(width: width, height: width), + constraints: BoxConstraints.tightFor(width: size.width, height: size.height), child: RawMaterialButton( visualDensity: VisualDensity.compact, hoverElevation: 0, @@ -51,7 +60,7 @@ class FlowyIconButton extends StatelessWidget { onPressed: onPressed, child: Padding( padding: iconPadding, - child: SizedBox.fromSize(child: child, size: Size(width, width)), + child: SizedBox.fromSize(child: child, size: childSize), ), ), ); diff --git a/app_flowy/packages/flowy_infra_ui/pubspec.lock b/app_flowy/packages/flowy_infra_ui/pubspec.lock index 7c78eced5a..8ff7b9870b 100644 --- a/app_flowy/packages/flowy_infra_ui/pubspec.lock +++ b/app_flowy/packages/flowy_infra_ui/pubspec.lock @@ -14,7 +14,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.7.0" + version: "2.8.2" boolean_selector: dependency: transitive description: @@ -28,7 +28,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0" charcode: dependency: transitive description: @@ -111,6 +111,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.4" + flutter_svg: + dependency: transitive + description: + name: flutter_svg + url: "https://pub.dartlang.org" + source: hosted + version: "0.22.0" flutter_test: dependency: "direct dev" description: flutter @@ -149,20 +156,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.1" - logger: - dependency: transitive - description: - name: logger - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10" + version: "0.12.11" meta: dependency: transitive description: @@ -184,6 +184,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0" + path_drawing: + dependency: transitive + description: + name: path_drawing + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.1+1" + path_parsing: + dependency: transitive + description: + name: path_parsing + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.dartlang.org" + source: hosted + version: "4.4.0" plugin_platform_interface: dependency: transitive description: @@ -197,7 +218,7 @@ packages: name: provider url: "https://pub.dartlang.org" source: hosted - version: "5.0.0" + version: "6.0.1" sky_engine: dependency: transitive description: flutter @@ -251,7 +272,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.1" + version: "0.4.3" textstyle_extensions: dependency: "direct main" description: @@ -287,6 +308,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.dartlang.org" + source: hosted + version: "5.3.1" sdks: - dart: ">=2.12.0 <3.0.0" + dart: ">=2.14.0 <3.0.0" flutter: ">=2.0.0"