From 67ddff736c4fa4fc2679abf69c40238c649a65be Mon Sep 17 00:00:00 2001 From: Nikolay Lopin Date: Tue, 13 Feb 2018 23:43:11 +0300 Subject: [PATCH] Switch from preview to edit by double click User want to click markdown to work with text (for example copy). If they have "Switch to Preview" setting in "When Editor Blurred", they enter edit mode after click. To fix that issue I introduced new value to the "Switch to Preview" setting that do that thing. User can enter edit mode by double click on the editor and leave it on blur. Unfortunately, it's impossible to switch both ways by double click because the editor mode is listening for double click event. #1523 --- browser/components/MarkdownEditor.js | 21 +++++++++++++++++-- browser/components/MarkdownPreview.js | 7 +++++++ browser/main/modals/PreferencesModal/UiTab.js | 1 + 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/browser/components/MarkdownEditor.js b/browser/components/MarkdownEditor.js index 52ab2873..8d79629d 100644 --- a/browser/components/MarkdownEditor.js +++ b/browser/components/MarkdownEditor.js @@ -5,7 +5,7 @@ import styles from './MarkdownEditor.styl' import CodeEditor from 'browser/components/CodeEditor' import MarkdownPreview from 'browser/components/MarkdownPreview' import eventEmitter from 'browser/main/lib/eventEmitter' -import { findStorage } from 'browser/lib/findStorage' +import {findStorage} from 'browser/lib/findStorage' class MarkdownEditor extends React.Component { constructor (props) { @@ -92,7 +92,9 @@ class MarkdownEditor extends React.Component { if (this.state.isLocked) return this.setState({ keyPressed: new Set() }) const { config } = this.props - if (config.editor.switchPreview === 'BLUR') { + if (config.editor.switchPreview === 'BLUR' || + (config.editor.switchPreview === 'DBL_CLICK' && this.state.status === 'CODE') + ) { const cursorPosition = this.refs.code.editor.getCursor() this.setState({ status: 'PREVIEW' @@ -104,6 +106,20 @@ class MarkdownEditor extends React.Component { } } + handleDoubleClick (e) { + if (this.state.isLocked) return + this.setState({keyPressed: new Set()}) + const { config } = this.props + if (config.editor.switchPreview === 'DBL_CLICK') { + this.setState({ + status: 'CODE' + }, () => { + this.refs.code.focus() + eventEmitter.emit('topbar:togglelockbutton', this.state.status) + }) + } + } + handlePreviewMouseDown (e) { this.previewMouseDownedAt = new Date() } @@ -264,6 +280,7 @@ class MarkdownEditor extends React.Component { scrollPastEnd={config.preview.scrollPastEnd} ref='preview' onContextMenu={(e) => this.handleContextMenu(e)} + onDoubleClick={(e) => this.handleDoubleClick(e)} tabIndex='0' value={this.state.renderValue} onMouseUp={(e) => this.handlePreviewMouseUp(e)} diff --git a/browser/components/MarkdownPreview.js b/browser/components/MarkdownPreview.js index ecaff1b8..1d0f7513 100755 --- a/browser/components/MarkdownPreview.js +++ b/browser/components/MarkdownPreview.js @@ -120,6 +120,7 @@ export default class MarkdownPreview extends React.Component { this.contextMenuHandler = (e) => this.handleContextMenu(e) this.mouseDownHandler = (e) => this.handleMouseDown(e) this.mouseUpHandler = (e) => this.handleMouseUp(e) + this.DoubleClickHandler = (e) => this.handleDoubleClick(e) this.anchorClickHandler = (e) => this.handlePreviewAnchorClick(e) this.checkboxClickHandler = (e) => this.handleCheckboxClick(e) this.saveAsTextHandler = () => this.handleSaveAsText() @@ -154,6 +155,10 @@ export default class MarkdownPreview extends React.Component { this.props.onContextMenu(e) } + handleDoubleClick (e) { + if (this.props.onDoubleClick != null) this.props.onDoubleClick(e) + } + handleMouseDown (e) { if (e.target != null) { switch (e.target.tagName) { @@ -271,6 +276,7 @@ export default class MarkdownPreview extends React.Component { this.refs.root.contentWindow.document.addEventListener('mousedown', this.mouseDownHandler) this.refs.root.contentWindow.document.addEventListener('mouseup', this.mouseUpHandler) + this.refs.root.contentWindow.document.addEventListener('dblclick', this.DoubleClickHandler) this.refs.root.contentWindow.document.addEventListener('drop', this.preventImageDroppedHandler) this.refs.root.contentWindow.document.addEventListener('dragover', this.preventImageDroppedHandler) eventEmitter.on('export:save-text', this.saveAsTextHandler) @@ -283,6 +289,7 @@ export default class MarkdownPreview extends React.Component { this.refs.root.contentWindow.document.body.removeEventListener('contextmenu', this.contextMenuHandler) this.refs.root.contentWindow.document.removeEventListener('mousedown', this.mouseDownHandler) this.refs.root.contentWindow.document.removeEventListener('mouseup', this.mouseUpHandler) + this.refs.root.contentWindow.document.removeEventListener('dblclick', this.DoubleClickHandler) this.refs.root.contentWindow.document.removeEventListener('drop', this.preventImageDroppedHandler) this.refs.root.contentWindow.document.removeEventListener('dragover', this.preventImageDroppedHandler) eventEmitter.off('export:save-text', this.saveAsTextHandler) diff --git a/browser/main/modals/PreferencesModal/UiTab.js b/browser/main/modals/PreferencesModal/UiTab.js index df35e260..654e1dfd 100644 --- a/browser/main/modals/PreferencesModal/UiTab.js +++ b/browser/main/modals/PreferencesModal/UiTab.js @@ -283,6 +283,7 @@ class UiTab extends React.Component { onChange={(e) => this.handleUIChange(e)} > +