Skip to content

Commit 5695830

Browse files
RickBr0wncatarak
authored andcommitted
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
1 parent 8054a53 commit 5695830

File tree

7 files changed

+68
-1
lines changed

7 files changed

+68
-1
lines changed

client/constants.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export const STOP_ACCESSIBLE_OUTPUT = 'STOP_ACCESSIBLE_OUTPUT';
1212
export const OPEN_PREFERENCES = 'OPEN_PREFERENCES';
1313
export const CLOSE_PREFERENCES = 'CLOSE_PREFERENCES';
1414
export const SET_FONT_SIZE = 'SET_FONT_SIZE';
15+
export const SET_LINE_NUMBERS = 'SET_LINE_NUMBERS';
1516

1617
export const AUTH_USER = 'AUTH_USER';
1718
export const UNAUTH_USER = 'UNAUTH_USER';

client/modules/IDE/actions/preferences.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,24 @@ export function setFontSize(value) {
3232
};
3333
}
3434

35+
export function setLineNumbers(value) {
36+
return (dispatch, getState) => {
37+
dispatch({
38+
type: ActionTypes.SET_LINE_NUMBERS,
39+
value
40+
});
41+
const state = getState();
42+
if (state.user.authenticated) {
43+
const formParams = {
44+
preferences: {
45+
lineNumbers: value
46+
}
47+
};
48+
updatePreferences(formParams, dispatch);
49+
}
50+
};
51+
}
52+
3553
export function setAutosave(value) {
3654
return (dispatch, getState) => {
3755
dispatch({

client/modules/IDE/components/Editor.jsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class Editor extends React.Component {
8080
this.widgets = [];
8181
this._cm = CodeMirror(this.codemirrorContainer, { // eslint-disable-line
8282
theme: `p5-${this.props.theme}`,
83-
lineNumbers: true,
83+
lineNumbers: this.props.lineNumbers,
8484
styleActiveLine: true,
8585
inputStyle: 'contenteditable',
8686
lineWrapping: this.props.linewrap,
@@ -181,6 +181,9 @@ class Editor extends React.Component {
181181
if (this.props.theme !== prevProps.theme) {
182182
this._cm.setOption('theme', `p5-${this.props.theme}`);
183183
}
184+
if (this.props.lineNumbers !== prevProps.lineNumbers) {
185+
this._cm.setOption('lineNumbers', this.props.lineNumbers);
186+
}
184187

185188
if (prevProps.consoleEvents !== this.props.consoleEvents) {
186189
this.props.showRuntimeErrorWarning();
@@ -342,6 +345,7 @@ class Editor extends React.Component {
342345
}
343346

344347
Editor.propTypes = {
348+
lineNumbers: PropTypes.bool.isRequired,
345349
lintWarning: PropTypes.bool.isRequired,
346350
linewrap: PropTypes.bool.isRequired,
347351
lintMessages: PropTypes.arrayOf(PropTypes.shape({

client/modules/IDE/components/Preferences.jsx

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class Preferences extends React.Component {
1717
this.handleUpdateAutosave = this.handleUpdateAutosave.bind(this);
1818
this.handleUpdateLinewrap = this.handleUpdateLinewrap.bind(this);
1919
this.handleLintWarning = this.handleLintWarning.bind(this);
20+
this.handleLineNumbers = this.handleLineNumbers.bind(this);
2021
this.onFontInputChange = this.onFontInputChange.bind(this);
2122
this.onFontInputSubmit = this.onFontInputSubmit.bind(this);
2223
this.increaseFontSize = this.increaseFontSize.bind(this);
@@ -82,6 +83,11 @@ class Preferences extends React.Component {
8283
this.props.setLintWarning(value);
8384
}
8485

86+
handleLineNumbers(event) {
87+
const value = event.target.value === 'true';
88+
this.props.setLineNumbers(value);
89+
}
90+
8591
render() {
8692
const beep = new Audio(beepUrl);
8793

@@ -225,6 +231,33 @@ class Preferences extends React.Component {
225231
</div>
226232
</TabPanel>
227233
<TabPanel>
234+
<div className="preference">
235+
<h4 className="preference__title">Line numbers</h4>
236+
<div className="preference__options">
237+
<input
238+
type="radio"
239+
onChange={() => this.props.setLineNumbers(true)}
240+
aria-label="line numbers on"
241+
name="line numbers"
242+
id="line-numbers-on"
243+
className="preference__radio-button"
244+
value="On"
245+
checked={this.props.lineNumbers}
246+
/>
247+
<label htmlFor="line-numbers-on" className="preference__option">On</label>
248+
<input
249+
type="radio"
250+
onChange={() => this.props.setLineNumbers(false)}
251+
aria-label="line numbers off"
252+
name="line numbers"
253+
id="line-numbers-off"
254+
className="preference__radio-button"
255+
value="Off"
256+
checked={!this.props.lineNumbers}
257+
/>
258+
<label htmlFor="line-numbers-off" className="preference__option">Off</label>
259+
</div>
260+
</div>
228261
<div className="preference">
229262
<h4 className="preference__title">Lint warning sound</h4>
230263
<div className="preference__options">
@@ -311,9 +344,11 @@ class Preferences extends React.Component {
311344

312345
Preferences.propTypes = {
313346
fontSize: PropTypes.number.isRequired,
347+
lineNumbers: PropTypes.bool.isRequired,
314348
setFontSize: PropTypes.func.isRequired,
315349
autosave: PropTypes.bool.isRequired,
316350
linewrap: PropTypes.bool.isRequired,
351+
setLineNumbers: PropTypes.func.isRequired,
317352
setAutosave: PropTypes.func.isRequired,
318353
setLinewrap: PropTypes.func.isRequired,
319354
textOutput: PropTypes.bool.isRequired,

client/modules/IDE/pages/IDEView.jsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ class IDEView extends React.Component {
206206
setFontSize={this.props.setFontSize}
207207
autosave={this.props.preferences.autosave}
208208
linewrap={this.props.preferences.linewrap}
209+
lineNumbers={this.props.preferences.lineNumbers}
210+
setLineNumbers={this.props.setLineNumbers}
209211
setAutosave={this.props.setAutosave}
210212
setLinewrap={this.props.setLinewrap}
211213
lintWarning={this.props.preferences.lintWarning}
@@ -271,6 +273,7 @@ class IDEView extends React.Component {
271273
file={this.props.selectedFile}
272274
updateFileContent={this.props.updateFileContent}
273275
fontSize={this.props.preferences.fontSize}
276+
lineNumbers={this.props.preferences.lineNumbers}
274277
files={this.props.files}
275278
editorOptionsVisible={this.props.ide.editorOptionsVisible}
276279
showEditorOptions={this.props.showEditorOptions}
@@ -518,6 +521,7 @@ IDEView.propTypes = {
518521
fontSize: PropTypes.number.isRequired,
519522
autosave: PropTypes.bool.isRequired,
520523
linewrap: PropTypes.bool.isRequired,
524+
lineNumbers: PropTypes.bool.isRequired,
521525
lintWarning: PropTypes.bool.isRequired,
522526
textOutput: PropTypes.bool.isRequired,
523527
gridOutput: PropTypes.bool.isRequired,
@@ -528,6 +532,7 @@ IDEView.propTypes = {
528532
closePreferences: PropTypes.func.isRequired,
529533
setFontSize: PropTypes.func.isRequired,
530534
setAutosave: PropTypes.func.isRequired,
535+
setLineNumbers: PropTypes.func.isRequired,
531536
setLinewrap: PropTypes.func.isRequired,
532537
setLintWarning: PropTypes.func.isRequired,
533538
setTextOutput: PropTypes.func.isRequired,

client/modules/IDE/reducers/preferences.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const initialState = {
44
fontSize: 18,
55
autosave: true,
66
linewrap: true,
7+
lineNumbers: true,
78
lintWarning: false,
89
textOutput: false,
910
gridOutput: false,
@@ -34,6 +35,8 @@ const preferences = (state = initialState, action) => {
3435
return Object.assign({}, state, { theme: action.value });
3536
case ActionTypes.SET_AUTOREFRESH:
3637
return Object.assign({}, state, { autorefresh: action.value });
38+
case ActionTypes.SET_LINE_NUMBERS:
39+
return Object.assign({}, state, { lineNumbers: action.value });
3740
default:
3841
return state;
3942
}

server/models/user.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ const userSchema = new Schema({
2424
tokens: Array,
2525
preferences: {
2626
fontSize: { type: Number, default: 18 },
27+
lineNumbers: { type: Boolean, default: true },
2728
indentationAmount: { type: Number, default: 2 },
2829
isTabIndent: { type: Boolean, default: false },
2930
autosave: { type: Boolean, default: true },

0 commit comments

Comments
 (0)