add ability to toggle line numbers to accessibility settings. Fixes #1138 (#1146)

* Added SET_LINE_NUMBERS constant

* Added setLineNumbers()

* Added lineNumber prop

* Added functionality to Preferences

* Passing props

* handle case SET_LINE_NUMBERS

* add lineNumber default value to the schema
This commit is contained in:
Rick Brown 2019-08-30 17:36:34 +01:00 committed by Cassie Tarakajian
parent 8054a532d7
commit 5695830361
7 changed files with 68 additions and 1 deletions

View file

@ -12,6 +12,7 @@ export const STOP_ACCESSIBLE_OUTPUT = 'STOP_ACCESSIBLE_OUTPUT';
export const OPEN_PREFERENCES = 'OPEN_PREFERENCES'; export const OPEN_PREFERENCES = 'OPEN_PREFERENCES';
export const CLOSE_PREFERENCES = 'CLOSE_PREFERENCES'; export const CLOSE_PREFERENCES = 'CLOSE_PREFERENCES';
export const SET_FONT_SIZE = 'SET_FONT_SIZE'; export const SET_FONT_SIZE = 'SET_FONT_SIZE';
export const SET_LINE_NUMBERS = 'SET_LINE_NUMBERS';
export const AUTH_USER = 'AUTH_USER'; export const AUTH_USER = 'AUTH_USER';
export const UNAUTH_USER = 'UNAUTH_USER'; export const UNAUTH_USER = 'UNAUTH_USER';

View file

@ -32,6 +32,24 @@ export function setFontSize(value) {
}; };
} }
export function setLineNumbers(value) {
return (dispatch, getState) => {
dispatch({
type: ActionTypes.SET_LINE_NUMBERS,
value
});
const state = getState();
if (state.user.authenticated) {
const formParams = {
preferences: {
lineNumbers: value
}
};
updatePreferences(formParams, dispatch);
}
};
}
export function setAutosave(value) { export function setAutosave(value) {
return (dispatch, getState) => { return (dispatch, getState) => {
dispatch({ dispatch({

View file

@ -80,7 +80,7 @@ class Editor extends React.Component {
this.widgets = []; this.widgets = [];
this._cm = CodeMirror(this.codemirrorContainer, { // eslint-disable-line this._cm = CodeMirror(this.codemirrorContainer, { // eslint-disable-line
theme: `p5-${this.props.theme}`, theme: `p5-${this.props.theme}`,
lineNumbers: true, lineNumbers: this.props.lineNumbers,
styleActiveLine: true, styleActiveLine: true,
inputStyle: 'contenteditable', inputStyle: 'contenteditable',
lineWrapping: this.props.linewrap, lineWrapping: this.props.linewrap,
@ -181,6 +181,9 @@ class Editor extends React.Component {
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}`);
} }
if (this.props.lineNumbers !== prevProps.lineNumbers) {
this._cm.setOption('lineNumbers', this.props.lineNumbers);
}
if (prevProps.consoleEvents !== this.props.consoleEvents) { if (prevProps.consoleEvents !== this.props.consoleEvents) {
this.props.showRuntimeErrorWarning(); this.props.showRuntimeErrorWarning();
@ -342,6 +345,7 @@ class Editor extends React.Component {
} }
Editor.propTypes = { Editor.propTypes = {
lineNumbers: PropTypes.bool.isRequired,
lintWarning: PropTypes.bool.isRequired, lintWarning: PropTypes.bool.isRequired,
linewrap: PropTypes.bool.isRequired, linewrap: PropTypes.bool.isRequired,
lintMessages: PropTypes.arrayOf(PropTypes.shape({ lintMessages: PropTypes.arrayOf(PropTypes.shape({

View file

@ -17,6 +17,7 @@ class Preferences extends React.Component {
this.handleUpdateAutosave = this.handleUpdateAutosave.bind(this); this.handleUpdateAutosave = this.handleUpdateAutosave.bind(this);
this.handleUpdateLinewrap = this.handleUpdateLinewrap.bind(this); this.handleUpdateLinewrap = this.handleUpdateLinewrap.bind(this);
this.handleLintWarning = this.handleLintWarning.bind(this); this.handleLintWarning = this.handleLintWarning.bind(this);
this.handleLineNumbers = this.handleLineNumbers.bind(this);
this.onFontInputChange = this.onFontInputChange.bind(this); this.onFontInputChange = this.onFontInputChange.bind(this);
this.onFontInputSubmit = this.onFontInputSubmit.bind(this); this.onFontInputSubmit = this.onFontInputSubmit.bind(this);
this.increaseFontSize = this.increaseFontSize.bind(this); this.increaseFontSize = this.increaseFontSize.bind(this);
@ -82,6 +83,11 @@ class Preferences extends React.Component {
this.props.setLintWarning(value); this.props.setLintWarning(value);
} }
handleLineNumbers(event) {
const value = event.target.value === 'true';
this.props.setLineNumbers(value);
}
render() { render() {
const beep = new Audio(beepUrl); const beep = new Audio(beepUrl);
@ -225,6 +231,33 @@ class Preferences extends React.Component {
</div> </div>
</TabPanel> </TabPanel>
<TabPanel> <TabPanel>
<div className="preference">
<h4 className="preference__title">Line numbers</h4>
<div className="preference__options">
<input
type="radio"
onChange={() => this.props.setLineNumbers(true)}
aria-label="line numbers on"
name="line numbers"
id="line-numbers-on"
className="preference__radio-button"
value="On"
checked={this.props.lineNumbers}
/>
<label htmlFor="line-numbers-on" className="preference__option">On</label>
<input
type="radio"
onChange={() => this.props.setLineNumbers(false)}
aria-label="line numbers off"
name="line numbers"
id="line-numbers-off"
className="preference__radio-button"
value="Off"
checked={!this.props.lineNumbers}
/>
<label htmlFor="line-numbers-off" className="preference__option">Off</label>
</div>
</div>
<div className="preference"> <div className="preference">
<h4 className="preference__title">Lint warning sound</h4> <h4 className="preference__title">Lint warning sound</h4>
<div className="preference__options"> <div className="preference__options">
@ -311,9 +344,11 @@ class Preferences extends React.Component {
Preferences.propTypes = { Preferences.propTypes = {
fontSize: PropTypes.number.isRequired, fontSize: PropTypes.number.isRequired,
lineNumbers: PropTypes.bool.isRequired,
setFontSize: PropTypes.func.isRequired, setFontSize: PropTypes.func.isRequired,
autosave: PropTypes.bool.isRequired, autosave: PropTypes.bool.isRequired,
linewrap: PropTypes.bool.isRequired, linewrap: PropTypes.bool.isRequired,
setLineNumbers: PropTypes.func.isRequired,
setAutosave: PropTypes.func.isRequired, setAutosave: PropTypes.func.isRequired,
setLinewrap: PropTypes.func.isRequired, setLinewrap: PropTypes.func.isRequired,
textOutput: PropTypes.bool.isRequired, textOutput: PropTypes.bool.isRequired,

View file

@ -206,6 +206,8 @@ class IDEView extends React.Component {
setFontSize={this.props.setFontSize} setFontSize={this.props.setFontSize}
autosave={this.props.preferences.autosave} autosave={this.props.preferences.autosave}
linewrap={this.props.preferences.linewrap} linewrap={this.props.preferences.linewrap}
lineNumbers={this.props.preferences.lineNumbers}
setLineNumbers={this.props.setLineNumbers}
setAutosave={this.props.setAutosave} setAutosave={this.props.setAutosave}
setLinewrap={this.props.setLinewrap} setLinewrap={this.props.setLinewrap}
lintWarning={this.props.preferences.lintWarning} lintWarning={this.props.preferences.lintWarning}
@ -271,6 +273,7 @@ class IDEView extends React.Component {
file={this.props.selectedFile} file={this.props.selectedFile}
updateFileContent={this.props.updateFileContent} updateFileContent={this.props.updateFileContent}
fontSize={this.props.preferences.fontSize} fontSize={this.props.preferences.fontSize}
lineNumbers={this.props.preferences.lineNumbers}
files={this.props.files} files={this.props.files}
editorOptionsVisible={this.props.ide.editorOptionsVisible} editorOptionsVisible={this.props.ide.editorOptionsVisible}
showEditorOptions={this.props.showEditorOptions} showEditorOptions={this.props.showEditorOptions}
@ -518,6 +521,7 @@ IDEView.propTypes = {
fontSize: PropTypes.number.isRequired, fontSize: PropTypes.number.isRequired,
autosave: PropTypes.bool.isRequired, autosave: PropTypes.bool.isRequired,
linewrap: PropTypes.bool.isRequired, linewrap: PropTypes.bool.isRequired,
lineNumbers: PropTypes.bool.isRequired,
lintWarning: PropTypes.bool.isRequired, lintWarning: PropTypes.bool.isRequired,
textOutput: PropTypes.bool.isRequired, textOutput: PropTypes.bool.isRequired,
gridOutput: PropTypes.bool.isRequired, gridOutput: PropTypes.bool.isRequired,
@ -528,6 +532,7 @@ IDEView.propTypes = {
closePreferences: PropTypes.func.isRequired, closePreferences: PropTypes.func.isRequired,
setFontSize: PropTypes.func.isRequired, setFontSize: PropTypes.func.isRequired,
setAutosave: PropTypes.func.isRequired, setAutosave: PropTypes.func.isRequired,
setLineNumbers: PropTypes.func.isRequired,
setLinewrap: PropTypes.func.isRequired, setLinewrap: PropTypes.func.isRequired,
setLintWarning: PropTypes.func.isRequired, setLintWarning: PropTypes.func.isRequired,
setTextOutput: PropTypes.func.isRequired, setTextOutput: PropTypes.func.isRequired,

View file

@ -4,6 +4,7 @@ const initialState = {
fontSize: 18, fontSize: 18,
autosave: true, autosave: true,
linewrap: true, linewrap: true,
lineNumbers: true,
lintWarning: false, lintWarning: false,
textOutput: false, textOutput: false,
gridOutput: false, gridOutput: false,
@ -34,6 +35,8 @@ const preferences = (state = initialState, action) => {
return Object.assign({}, state, { theme: action.value }); return Object.assign({}, state, { theme: action.value });
case ActionTypes.SET_AUTOREFRESH: case ActionTypes.SET_AUTOREFRESH:
return Object.assign({}, state, { autorefresh: action.value }); return Object.assign({}, state, { autorefresh: action.value });
case ActionTypes.SET_LINE_NUMBERS:
return Object.assign({}, state, { lineNumbers: action.value });
default: default:
return state; return state;
} }

View file

@ -24,6 +24,7 @@ const userSchema = new Schema({
tokens: Array, tokens: Array,
preferences: { preferences: {
fontSize: { type: Number, default: 18 }, fontSize: { type: Number, default: 18 },
lineNumbers: { type: Boolean, default: true },
indentationAmount: { type: Number, default: 2 }, indentationAmount: { type: Number, default: 2 },
isTabIndent: { type: Boolean, default: false }, isTabIndent: { type: Boolean, default: false },
autosave: { type: Boolean, default: true }, autosave: { type: Boolean, default: true },