Skip to content

Commit

Permalink
refactor!: Extract TextRendererFactory (#2680)
Browse files Browse the repository at this point in the history
This is part of my ongoing effort to simplify the text rendering
pipeline.
My ultimate goal is to:
* get rid of renders
* rename formatters to renderers
* make the interface complies to both
All details are specified here:
#2663

As a first step to break down that huge PR, this extracts
TextRendererFactory in preparation of getting rid of TextRenderer
entirely.

This is technically a breaking change but should have no effect for
users, unless you they have a custom Renderer *and* are using the
registry (which I honestly doubt). But if you are:
* just import TextRendererFactory and use the createDefault method from
there instead
  • Loading branch information
luanpotter committed Aug 26, 2023
1 parent 1a64443 commit eeb6749
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 27 deletions.
5 changes: 2 additions & 3 deletions packages/flame/lib/src/components/text_component.dart
@@ -1,8 +1,7 @@
import 'dart:ui';

import 'package:flame/components.dart';
import 'package:flame/src/text/elements/text_element.dart';
import 'package:flame/src/text/text_renderer.dart';
import 'package:flame/text.dart';
import 'package:flutter/painting.dart';
import 'package:meta/meta.dart';

Expand All @@ -19,7 +18,7 @@ class TextComponent<T extends TextRenderer> extends PositionComponent {
super.priority,
super.key,
}) : _text = text ?? '',
_textRenderer = textRenderer ?? TextRenderer.createDefault<T>() {
_textRenderer = textRenderer ?? TextRendererFactory.createDefault<T>() {
updateBounds();
}

Expand Down
21 changes: 0 additions & 21 deletions packages/flame/lib/src/text/text_renderer.dart
Expand Up @@ -41,25 +41,4 @@ class TextRenderer<T extends TextFormatter> {
}) {
format(text).render(canvas, position, anchor: anchor);
}

/// A registry containing default providers for every [TextRenderer] subclass;
/// used by [createDefault] to create default parameter values.
///
/// If you add a new [TextRenderer] child, you can register it by adding it,
/// together with a provider lambda, to this map.
static Map<Type, TextRenderer Function()> defaultRenderersRegistry = {
TextRenderer: TextPaint.new,
TextPaint: TextPaint.new,
};

/// Given a generic type [T], creates a default renderer of that type.
static T createDefault<T extends TextRenderer>() {
final creator = defaultRenderersRegistry[T];
if (creator != null) {
return creator() as T;
} else {
throw 'Unknown implementation of TextRenderer: $T. Please register it '
'under [defaultRenderersRegistry].';
}
}
}
24 changes: 24 additions & 0 deletions packages/flame/lib/src/text/text_renderer_factory.dart
@@ -0,0 +1,24 @@
import 'package:flame/text.dart';

class TextRendererFactory {
/// A registry containing default providers for every [TextRenderer] subclass;
/// used by [createDefault] to create default parameter values.
///
/// If you add a new [TextRenderer] child, you can register it by adding it,
/// together with a provider lambda, to this map.
static Map<Type, TextRenderer Function()> defaultRegistry = {
TextRenderer: TextPaint.new,
TextPaint: TextPaint.new,
};

/// Given a generic type [T], creates a default renderer of that type.
static T createDefault<T extends TextRenderer>() {
final creator = defaultRegistry[T];
if (creator != null) {
return creator() as T;
} else {
throw 'Unknown implementation of TextRenderer: $T. Please register it '
'under [TextRendererFactory.defaultRegistry].';
}
}
}
1 change: 1 addition & 0 deletions packages/flame/lib/text.dart
Expand Up @@ -34,3 +34,4 @@ export 'src/text/styles/flame_text_style.dart' show FlameTextStyle;
export 'src/text/styles/style.dart' show Style;
export 'src/text/text_paint.dart' show TextPaint;
export 'src/text/text_renderer.dart' show TextRenderer;
export 'src/text/text_renderer_factory.dart' show TextRendererFactory;
6 changes: 3 additions & 3 deletions packages/flame/test/text/text_renderer_test.dart
Expand Up @@ -6,11 +6,11 @@ import 'package:test/test.dart';
void main() {
group('TextRenderer', () {
test('createDefault', () {
final tp = TextRenderer.createDefault<TextPaint>();
final tp = TextRendererFactory.createDefault<TextPaint>();
expect(tp, isNotNull);
expect(tp, isA<TextPaint>());

final tr = TextRenderer.createDefault();
final tr = TextRendererFactory.createDefault();
expect(tr, isNotNull);
expect(tr, isA<TextRenderer>());
});
Expand All @@ -24,7 +24,7 @@ void main() {
});

test('custom renderer', () {
TextRenderer.defaultRenderersRegistry[_CustomTextRenderer] =
TextRendererFactory.defaultRegistry[_CustomTextRenderer] =
_CustomTextRenderer.new;
final tc = TextComponent<_CustomTextRenderer>(text: 'foo');
expect(tc.textRenderer, isA<_CustomTextRenderer>());
Expand Down

0 comments on commit eeb6749

Please sign in to comment.