fixes #49
This commit is contained in:
parent
29de5fce55
commit
49bdd9377f
1 changed files with 43 additions and 19 deletions
|
@ -40,11 +40,9 @@ class Editor extends React.Component {
|
||||||
this.widgets = [];
|
this.widgets = [];
|
||||||
this._cm = CodeMirror(this.refs.container, { // eslint-disable-line
|
this._cm = CodeMirror(this.refs.container, { // eslint-disable-line
|
||||||
theme: `p5-${this.props.theme}`,
|
theme: `p5-${this.props.theme}`,
|
||||||
value: this.props.file.content,
|
|
||||||
lineNumbers: true,
|
lineNumbers: true,
|
||||||
styleActiveLine: true,
|
styleActiveLine: true,
|
||||||
inputStyle: 'contenteditable',
|
inputStyle: 'contenteditable',
|
||||||
mode: 'javascript',
|
|
||||||
lineWrapping: false,
|
lineWrapping: false,
|
||||||
fixedGutter: false,
|
fixedGutter: false,
|
||||||
gutters: ['CodeMirror-lint-markers'],
|
gutters: ['CodeMirror-lint-markers'],
|
||||||
|
@ -64,6 +62,9 @@ class Editor extends React.Component {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.initializeDocuments(this.props.files);
|
||||||
|
this._cm.swapDoc(this._docs[this.props.file.id]);
|
||||||
|
|
||||||
this._cm.on('change', debounce(() => {
|
this._cm.on('change', debounce(() => {
|
||||||
this.props.setUnsavedChanges(true);
|
this.props.setUnsavedChanges(true);
|
||||||
this.props.updateFileContent(this.props.file.name, this._cm.getValue());
|
this.props.updateFileContent(this.props.file.name, this._cm.getValue());
|
||||||
|
@ -89,10 +90,20 @@ class Editor extends React.Component {
|
||||||
this._cm.setOption('tabSize', this.props.indentationAmount);
|
this._cm.setOption('tabSize', this.props.indentationAmount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
componentWillUpdate(nextProps) {
|
||||||
|
// check if files have changed
|
||||||
|
if (this.props.files[0].id !== nextProps.files[0].id) {
|
||||||
|
// then need to make CodeMirror documents
|
||||||
|
this.initializeDocuments(nextProps.files);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
componentDidUpdate(prevProps) {
|
componentDidUpdate(prevProps) {
|
||||||
if (this.props.file.content !== prevProps.file.content &&
|
if (this.props.file.content !== prevProps.file.content &&
|
||||||
this.props.file.content !== this._cm.getValue()) {
|
this.props.file.content !== this._cm.getValue()) {
|
||||||
this._cm.setValue(this.props.file.content); // eslint-disable-line no-underscore-dangle
|
const oldDoc = this._cm.swapDoc(this._docs[this.props.file.id]);
|
||||||
|
this._docs[prevProps.file.id] = oldDoc;
|
||||||
|
this._cm.focus();
|
||||||
if (!prevProps.unsavedChanges) {
|
if (!prevProps.unsavedChanges) {
|
||||||
setTimeout(() => this.props.setUnsavedChanges(false), 400);
|
setTimeout(() => this.props.setUnsavedChanges(false), 400);
|
||||||
}
|
}
|
||||||
|
@ -106,20 +117,6 @@ class Editor extends React.Component {
|
||||||
if (this.props.isTabIndent !== prevProps.isTabIndent) {
|
if (this.props.isTabIndent !== prevProps.isTabIndent) {
|
||||||
this._cm.setOption('indentWithTabs', this.props.isTabIndent);
|
this._cm.setOption('indentWithTabs', this.props.isTabIndent);
|
||||||
}
|
}
|
||||||
if (this.props.file.name !== prevProps.name) {
|
|
||||||
if (this.props.file.name.match(/.+\.js$/i)) {
|
|
||||||
this._cm.setOption('mode', 'javascript');
|
|
||||||
} else if (this.props.file.name.match(/.+\.css$/i)) {
|
|
||||||
this._cm.setOption('mode', 'css');
|
|
||||||
} else if (this.props.file.name.match(/.+\.html$/i)) {
|
|
||||||
this._cm.setOption('mode', 'htmlmixed');
|
|
||||||
} else if (this.props.file.name.match(/.+\.json$/i)) {
|
|
||||||
this._cm.setOption('mode', 'application/json');
|
|
||||||
} else {
|
|
||||||
this._cm.setOption('mode', 'text/plain');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.props.theme !== prevProps.theme) {
|
if (this.props.theme !== prevProps.theme) {
|
||||||
this._cm.setOption('theme', `p5-${this.props.theme}`);
|
this._cm.setOption('theme', `p5-${this.props.theme}`);
|
||||||
}
|
}
|
||||||
|
@ -129,6 +126,31 @@ class Editor extends React.Component {
|
||||||
this._cm = null;
|
this._cm = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getFileMode(fileName) {
|
||||||
|
let mode;
|
||||||
|
if (fileName.match(/.+\.js$/i)) {
|
||||||
|
mode = 'javascript';
|
||||||
|
} else if (fileName.match(/.+\.css$/i)) {
|
||||||
|
mode = 'css';
|
||||||
|
} else if (fileName.match(/.+\.html$/i)) {
|
||||||
|
mode = 'htmlmixed';
|
||||||
|
} else if (fileName.match(/.+\.json$/i)) {
|
||||||
|
mode = 'application/json';
|
||||||
|
} else {
|
||||||
|
mode = 'text/plain';
|
||||||
|
}
|
||||||
|
return mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
initializeDocuments(files) {
|
||||||
|
this._docs = {};
|
||||||
|
files.forEach(file => {
|
||||||
|
if (file.fileType === 'file') {
|
||||||
|
this._docs[file.id] = CodeMirror.Doc(file.content, this.getFileMode(file.name)); // eslint-disable-line
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
tidyCode() {
|
tidyCode() {
|
||||||
const beautifyOptions = {
|
const beautifyOptions = {
|
||||||
indent_size: this.props.indentationAmount,
|
indent_size: this.props.indentationAmount,
|
||||||
|
@ -211,7 +233,8 @@ Editor.propTypes = {
|
||||||
fontSize: PropTypes.number.isRequired,
|
fontSize: PropTypes.number.isRequired,
|
||||||
file: PropTypes.shape({
|
file: PropTypes.shape({
|
||||||
name: PropTypes.string.isRequired,
|
name: PropTypes.string.isRequired,
|
||||||
content: PropTypes.string.isRequired
|
content: PropTypes.string.isRequired,
|
||||||
|
id: PropTypes.string.isRequired
|
||||||
}),
|
}),
|
||||||
editorOptionsVisible: PropTypes.bool.isRequired,
|
editorOptionsVisible: PropTypes.bool.isRequired,
|
||||||
showEditorOptions: PropTypes.func.isRequired,
|
showEditorOptions: PropTypes.func.isRequired,
|
||||||
|
@ -223,7 +246,8 @@ Editor.propTypes = {
|
||||||
isPlaying: PropTypes.bool.isRequired,
|
isPlaying: PropTypes.bool.isRequired,
|
||||||
theme: PropTypes.string.isRequired,
|
theme: PropTypes.string.isRequired,
|
||||||
unsavedChanges: PropTypes.bool.isRequired,
|
unsavedChanges: PropTypes.bool.isRequired,
|
||||||
projectSavedTime: PropTypes.string.isRequired
|
projectSavedTime: PropTypes.string.isRequired,
|
||||||
|
files: PropTypes.array.isRequired
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Editor;
|
export default Editor;
|
||||||
|
|
Loading…
Reference in a new issue