0
0
mirror of https://github.com/naturalcrit/homebrewery.git synced 2026-01-08 07:32:40 +00:00

Add editorTheme to editor.jsx and downstream

This commit is contained in:
G.Ambatte
2023-04-02 12:53:26 +12:00
parent 51f657d2c5
commit 7dd1368c09
3 changed files with 49 additions and 14 deletions

View File

@@ -34,12 +34,14 @@ const Editor = createClass({
onMetaChange : ()=>{}, onMetaChange : ()=>{},
reportError : ()=>{}, reportError : ()=>{},
renderer : 'legacy' editorTheme : 'default',
renderer : 'legacy'
}; };
}, },
getInitialState : function() { getInitialState : function() {
return { return {
view : 'text' //'text', 'style', 'meta' editorTheme : this.props.editorTheme,
view : 'text' //'text', 'style', 'meta'
}; };
}, },
@@ -255,25 +257,38 @@ const Editor = createClass({
this.refs.codeEditor?.updateSize(); this.refs.codeEditor?.updateSize();
}, },
updateEditorTheme : function(newTheme){
this.setState({
editorTheme : newTheme
});
},
//Called by CodeEditor after document switch, so Snippetbar can refresh UndoHistory //Called by CodeEditor after document switch, so Snippetbar can refresh UndoHistory
rerenderParent : function (){ rerenderParent : function (){
this.forceUpdate(); this.forceUpdate();
}, },
renderEditorCSSLink : function(){
return <link href={`../homebrew/cm-themes/${this.state.editorTheme}.css`} rel='stylesheet' />;
},
renderEditor : function(){ renderEditor : function(){
if(this.isText()){ if(this.isText()){
return <> return <>
{this.renderEditorCSSLink()}
<CodeEditor key='codeEditor' <CodeEditor key='codeEditor'
ref='codeEditor' ref='codeEditor'
language='gfm' language='gfm'
view={this.state.view} view={this.state.view}
value={this.props.brew.text} value={this.props.brew.text}
onChange={this.props.onTextChange} onChange={this.props.onTextChange}
editorTheme={this.state.editorTheme}
rerenderParent={this.rerenderParent} /> rerenderParent={this.rerenderParent} />
</>; </>;
} }
if(this.isStyle()){ if(this.isStyle()){
return <> return <>
{this.renderEditorCSSLink()}
<CodeEditor key='codeEditor' <CodeEditor key='codeEditor'
ref='codeEditor' ref='codeEditor'
language='css' language='css'
@@ -281,6 +296,7 @@ const Editor = createClass({
value={this.props.brew.style ?? DEFAULT_STYLE_TEXT} value={this.props.brew.style ?? DEFAULT_STYLE_TEXT}
onChange={this.props.onStyleChange} onChange={this.props.onStyleChange}
enableFolding={false} enableFolding={false}
editorTheme={this.state.editorTheme}
rerenderParent={this.rerenderParent} /> rerenderParent={this.rerenderParent} />
</>; </>;
} }
@@ -323,7 +339,8 @@ const Editor = createClass({
theme={this.props.brew.theme} theme={this.props.brew.theme}
undo={this.undo} undo={this.undo}
redo={this.redo} redo={this.redo}
historySize={this.historySize()} /> historySize={this.historySize()}
updateEditorTheme={this.updateEditorTheme} />
{this.renderEditor()} {this.renderEditor()}
</div> </div>

View File

@@ -24,16 +24,17 @@ const Snippetbar = createClass({
displayName : 'SnippetBar', displayName : 'SnippetBar',
getDefaultProps : function() { getDefaultProps : function() {
return { return {
brew : {}, brew : {},
view : 'text', view : 'text',
onViewChange : ()=>{}, onViewChange : ()=>{},
onInject : ()=>{}, onInject : ()=>{},
onToggle : ()=>{}, onToggle : ()=>{},
showEditButtons : true, showEditButtons : true,
renderer : 'legacy', renderer : 'legacy',
undo : ()=>{}, undo : ()=>{},
redo : ()=>{}, redo : ()=>{},
historySize : ()=>{} historySize : ()=>{},
updateEditorTheme : ()=>{}
}; };
}, },
@@ -94,6 +95,13 @@ const Snippetbar = createClass({
this.props.onInject(injectedText); this.props.onInject(injectedText);
}, },
selectTheme : function(){
console.log('select theme');
const editorTheme = window.prompt('Enter theme name:', 'default');
if(!editorTheme) return;
this.props.updateEditorTheme(editorTheme);
},
renderSnippetGroups : function(){ renderSnippetGroups : function(){
const snippets = this.state.snippets.filter((snippetGroup)=>snippetGroup.view === this.props.view); const snippets = this.state.snippets.filter((snippetGroup)=>snippetGroup.view === this.props.view);
@@ -122,6 +130,10 @@ const Snippetbar = createClass({
<i className='fas fa-redo' /> <i className='fas fa-redo' />
</div> </div>
<div className='divider'></div> <div className='divider'></div>
<div className={'editorTool palette'}
onClick={this.selectTheme} >
<i className='fas fa-palette' />
</div>
<div className={cx('text', { selected: this.props.view === 'text' })} <div className={cx('text', { selected: this.props.view === 'text' })}
onClick={()=>this.props.onViewChange('text')}> onClick={()=>this.props.onViewChange('text')}>
<i className='fa fa-beer' /> <i className='fa fa-beer' />

View File

@@ -49,7 +49,8 @@ const CodeEditor = createClass({
value : '', value : '',
wrap : true, wrap : true,
onChange : ()=>{}, onChange : ()=>{},
enableFolding : true enableFolding : true,
editorTheme : 'default'
}; };
}, },
@@ -91,6 +92,10 @@ const CodeEditor = createClass({
} else { } else {
this.codeMirror.setOption('foldOptions', false); this.codeMirror.setOption('foldOptions', false);
} }
if(prevProps.editorTheme !== this.props.editorTheme){
this.codeMirror.setOption('theme', this.props.editorTheme);
}
}, },
buildEditor : function() { buildEditor : function() {
@@ -156,6 +161,7 @@ const CodeEditor = createClass({
autoCloseTags : true, autoCloseTags : true,
styleActiveLine : true, styleActiveLine : true,
showTrailingSpace : false, showTrailingSpace : false,
theme : this.props.editorTheme
// specialChars : / /, // specialChars : / /,
// specialCharPlaceholder : function(char) { // specialCharPlaceholder : function(char) {
// const el = document.createElement('span'); // const el = document.createElement('span');