import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:tuple/tuple.dart'; class QuillTheme extends InheritedWidget { final DefaultStyles data; QuillTheme({ Key key, @required this.data, @required Widget child, }) : assert(data != null), assert(child != null), super(key: key, child: child); @override bool updateShouldNotify(QuillTheme oldWidget) { return data != oldWidget.data; } static DefaultStyles of(BuildContext context, nullOk) { var widget = context.dependOnInheritedWidgetOfExactType(); if (widget == null && nullOk) { return null; } assert(widget != null); return widget.data; } } class DefaultTextBlockStyle { final TextStyle style; final Tuple2 verticalSpacing; final Tuple2 lineSpacing; final BoxDecoration decoration; DefaultTextBlockStyle( this.style, this.verticalSpacing, this.lineSpacing, this.decoration); } class DefaultStyles { final DefaultTextBlockStyle h1; final DefaultTextBlockStyle h2; final DefaultTextBlockStyle h3; final DefaultTextBlockStyle paragraph; final TextStyle bold; final TextStyle italic; final TextStyle underline; final TextStyle strikeThrough; final TextStyle link; final DefaultTextBlockStyle lists; final DefaultTextBlockStyle quote; final DefaultTextBlockStyle code; DefaultStyles( this.h1, this.h2, this.h3, this.paragraph, this.bold, this.italic, this.underline, this.strikeThrough, this.link, this.lists, this.quote, this.code); static DefaultStyles getInstance(BuildContext context) { ThemeData themeData = Theme.of(context); DefaultTextStyle defaultTextStyle = DefaultTextStyle.of(context); TextStyle baseStyle = defaultTextStyle.style.copyWith( fontSize: 16.0, height: 1.3, ); Tuple2 baseSpacing = Tuple2(6.0, 10); String fontFamily; switch (themeData.platform) { case TargetPlatform.iOS: case TargetPlatform.macOS: fontFamily = 'Menlo'; break; case TargetPlatform.android: case TargetPlatform.fuchsia: case TargetPlatform.windows: case TargetPlatform.linux: fontFamily = 'Roboto Mono'; break; default: throw UnimplementedError(); } return DefaultStyles( DefaultTextBlockStyle( defaultTextStyle.style.copyWith( fontSize: 34.0, color: defaultTextStyle.style.color.withOpacity(0.70), height: 1.15, fontWeight: FontWeight.w300, ), Tuple2(16.0, 0.0), Tuple2(0.0, 0.0), null), DefaultTextBlockStyle( defaultTextStyle.style.copyWith( fontSize: 24.0, color: defaultTextStyle.style.color.withOpacity(0.70), height: 1.15, fontWeight: FontWeight.normal, ), Tuple2(8.0, 0.0), Tuple2(0.0, 0.0), null), DefaultTextBlockStyle( defaultTextStyle.style.copyWith( fontSize: 20.0, color: defaultTextStyle.style.color.withOpacity(0.70), height: 1.25, fontWeight: FontWeight.w500, ), Tuple2(8.0, 0.0), Tuple2(0.0, 0.0), null), DefaultTextBlockStyle(baseStyle, baseSpacing, Tuple2(0.0, 0.0), null), TextStyle(fontWeight: FontWeight.bold), TextStyle(fontStyle: FontStyle.italic), TextStyle(decoration: TextDecoration.underline), TextStyle(decoration: TextDecoration.lineThrough), TextStyle( color: themeData.accentColor, decoration: TextDecoration.underline, ), DefaultTextBlockStyle(baseStyle, baseSpacing, Tuple2(0.0, 6.0), null), DefaultTextBlockStyle( TextStyle(color: baseStyle.color.withOpacity(0.6)), baseSpacing, Tuple2(6.0, 2.0), BoxDecoration( border: Border( left: BorderSide(width: 4, color: Colors.grey.shade300), ), )), DefaultTextBlockStyle( TextStyle( color: Colors.blue.shade900.withOpacity(0.9), fontFamily: fontFamily, fontSize: 13.0, height: 1.15, ), baseSpacing, Tuple2(0.0, 0.0), BoxDecoration( color: Colors.grey.shade50, borderRadius: BorderRadius.circular(2), ))); } }