dartlangeditorflutterflutter-appsflutter-examplesflutter-packageflutter-widgetquillquill-deltaquilljsreactquillrich-textrich-text-editorwysiwygwysiwyg-editor
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.3 KiB
84 lines
2.3 KiB
4 years ago
|
import 'package:flutter/widgets.dart';
|
||
|
|
||
|
const Duration _FADE_DURATION = Duration(milliseconds: 250);
|
||
|
|
||
|
class CursorStyle {
|
||
|
final Color color;
|
||
|
final Color backgroundColor;
|
||
|
final double width;
|
||
|
final double height;
|
||
|
final Radius radius;
|
||
|
final Offset offset;
|
||
|
final bool opacityAnimates;
|
||
|
final bool paintAboveText;
|
||
|
|
||
|
const CursorStyle({
|
||
|
@required this.color,
|
||
|
@required this.backgroundColor,
|
||
|
this.width = 1.0,
|
||
|
this.height,
|
||
|
this.radius,
|
||
|
this.offset,
|
||
|
this.opacityAnimates = false,
|
||
|
this.paintAboveText = false,
|
||
|
}) : assert(color != null),
|
||
|
assert(backgroundColor != null),
|
||
|
assert(opacityAnimates != null),
|
||
|
assert(paintAboveText != null);
|
||
|
|
||
|
@override
|
||
|
bool operator ==(Object other) =>
|
||
|
identical(this, other) ||
|
||
|
other is CursorStyle &&
|
||
|
runtimeType == other.runtimeType &&
|
||
|
color == other.color &&
|
||
|
backgroundColor == other.backgroundColor &&
|
||
|
width == other.width &&
|
||
|
height == other.height &&
|
||
|
radius == other.radius &&
|
||
|
offset == other.offset &&
|
||
|
opacityAnimates == other.opacityAnimates &&
|
||
|
paintAboveText == other.paintAboveText;
|
||
|
|
||
|
@override
|
||
|
int get hashCode =>
|
||
|
color.hashCode ^
|
||
|
backgroundColor.hashCode ^
|
||
|
width.hashCode ^
|
||
|
height.hashCode ^
|
||
|
radius.hashCode ^
|
||
|
offset.hashCode ^
|
||
|
opacityAnimates.hashCode ^
|
||
|
paintAboveText.hashCode;
|
||
|
}
|
||
|
|
||
|
class CursorCont extends ChangeNotifier {
|
||
|
|
||
|
final ValueNotifier<bool> show;
|
||
|
final ValueNotifier<bool> _blink;
|
||
|
final ValueNotifier<Color> _color;
|
||
|
AnimationController _blinkOpacityCont;
|
||
|
CursorStyle _style;
|
||
|
|
||
|
CursorCont({
|
||
|
@required ValueNotifier<bool> show,
|
||
|
@required CursorStyle style,
|
||
|
@required TickerProvider tickerProvider,
|
||
|
}) : assert(show != null),
|
||
|
assert(style != null),
|
||
|
assert(tickerProvider != null),
|
||
|
show = show ?? ValueNotifier<bool>(false),
|
||
|
_style = style,
|
||
|
_blink = ValueNotifier(false),
|
||
|
_color = ValueNotifier(style.color) {
|
||
|
_blinkOpacityCont =
|
||
|
AnimationController(vsync: tickerProvider, duration: _FADE_DURATION);
|
||
|
_blinkOpacityCont.addListener(_onColorTick);
|
||
|
}
|
||
|
|
||
|
void _onColorTick() {
|
||
|
_color.value = _style.color.withOpacity(_blinkOpacityCont.value);
|
||
|
_blink.value = show.value && _blinkOpacityCont.value > 0;
|
||
|
}
|
||
|
}
|