lvbk-react-fabricjs
Version:
fabricjs implemented by react
130 lines (117 loc) • 4.51 kB
JSX
'use strict';
import PropTypes from 'prop-types';
import Text from './Text';
import {fabric} from 'fabric';
export default class IText extends Text {
constructor(props, context) {
super(props, context);
this.state = {object: null};
this.isEmptyStyles = () => this.state.object &&
this.state.object.isEmptyStyles();
this.setSelectionStart = (index) => this.state.object &&
this.state.object.setSelectionStart(index);
this.setSelectionEnd = (index) => this.state.object &&
this.state.object.setSelectionEnd(index);
this.getSelectionStyles = () => this.state.object &&
this.state.object.getSelectionStyles();
this.setSelectionStyles = (styles) => this.state.object &&
this.state.object.setSelectionStyles(styles);
this.renderCursorOrSelection = () => this.state.object &&
this.state.object.renderCursorOrSelection();
this.get2DCursorLocation = (selectionStart) => this.state.object &&
this.state.object.get2DCursorLocation(selectionStart);
this.getCurrentCharStyle = (lineIndex, charIndex) => this.state.object &&
this.state.object.getCurrentCharStyle(lineIndex, charIndex);
this.getCurrentCharFontSize = (lineIndex, charIndex) => this.state.object &&
this.state.object.getCurrentCharFontSize(lineIndex, charIndex);
this.getCurrentCharColor = (lineIndex, charIndex) => this.state.object &&
this.state.object.getCurrentCharColor(lineIndex, charIndex);
this.renderCursor = (boundaries, ctx) => this.state.object &&
this.state.object.renderCursor(boundaries, ctx);
this.renderSelection = (chars, boundaries, ctx) => this.state.object &&
this.state.object.renderSelection(chars, boundaries, ctx);
this.toObject = (propertiesToInclude) => this.state.object &&
this.state.object.toObject(propertiesToInclude);
}
draw(canvas) {
let object;
if (this.props.object instanceof Object) {
object = fabric.IText.fromObject(this.props.object);
} else {
object = new fabric.IText(this.props.text, this.props);
}
super.draw(canvas, object);
}
initEvent() {
const {object} = this.state;
if (!(object instanceof fabric.Object)) return;
super.initEvent();
if (this.props.onChanged instanceof Function) {
object.on('changed', this.props.onChanged);
}
if (this.props.onSelectionChanged instanceof Function) {
object.on('selection:changed', this.props.onSelectionChanged);
}
if (this.props.onEditingEntered instanceof Function) {
object.on('editing:entered', this.props.onEditingEntered);
}
if (this.props.onEditingExited instanceof Function) {
object.on('editing:exited', this.props.onEditingExited);
}
}
eventChanged(nextProps) {
const {object} = this.state;
if (!(object instanceof fabric.Object)) return;
super.eventChanged(nextProps);
if (this.props.onChanged && !nextProps.onChanged) {
object.off('changed');
} else if (nextProps.onChanged instanceof Function) {
object.on('changed', this.props.onChanged);
}
if (this.props.onSelectionChanged && !nextProps.onSelectionChanged) {
object.off('selection:changed');
} else if (nextProps.onSelectionChanged instanceof Function) {
object.on('selection:changed', this.props.onSelectionChanged);
}
if (this.props.onEditingEntered && !nextProps.onEditingEntered) {
object.off('editing:entered');
} else if (nextProps.onEditingEntered instanceof Function) {
object.on('editing:entered', this.props.onEditingEntered);
}
if (this.props.onEditingExited && !nextProps.onEditingExited) {
object.off('editing:exited');
} else if (nextProps.onEditingExited instanceof Function) {
object.on('editing:exited', this.props.onEditingExited);
}
}
}
IText.fromObject = (object) => fabric.IText.fromObject(object);
IText.propTypes = Object.assign({}, Text.propTypes, {
selectionStart: PropTypes.number,
selectionEnd: PropTypes.number,
selectionColor: PropTypes.string,
isEditing: PropTypes.bool,
editable: PropTypes.bool,
editingBorderColor: PropTypes.string,
cursorWidth: PropTypes.number,
cursorColor: PropTypes.string,
cursorDelay: PropTypes.number,
cursorDuration: PropTypes.number,
styles: PropTypes.object,
caching: PropTypes.bool,
});
IText.defaultProps = Object.assign({}, Text.defaultProps, {
type: 'i-text',
selectionStart: 0,
selectionEnd: 0,
selectionColor: 'rgba(17,119,255,0.3)',
isEditing: false,
editable: true,
editingBorderColor: 'rgba(102,153,255,0.25)',
cursorWidth: 2,
cursorColor: '#333',
cursorDelay: 1000,
cursorDuration: 600,
// styles: [],
// caching: true,
});