mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-13 09:46:22 +00:00
renewal key binding
This commit is contained in:
@@ -2,7 +2,9 @@ import React from 'react'
|
|||||||
import ReactDOM from 'react-dom'
|
import ReactDOM from 'react-dom'
|
||||||
import modes from '../lib/modes'
|
import modes from '../lib/modes'
|
||||||
import _ from 'lodash'
|
import _ from 'lodash'
|
||||||
var ace = window.ace
|
|
||||||
|
const remote = require('electron').remote
|
||||||
|
const ace = window.ace
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
propTypes: {
|
propTypes: {
|
||||||
@@ -40,6 +42,15 @@ module.exports = React.createClass({
|
|||||||
},
|
},
|
||||||
readOnly: true
|
readOnly: true
|
||||||
})
|
})
|
||||||
|
editor.commands.addCommand({
|
||||||
|
name: 'Focus title',
|
||||||
|
bindKey: {win: 'Esc', mac: 'Esc'},
|
||||||
|
exec: function (editor, e) {
|
||||||
|
console.log(e)
|
||||||
|
remote.getCurrentWebContents().send('detail-edit')
|
||||||
|
},
|
||||||
|
readOnly: true
|
||||||
|
})
|
||||||
|
|
||||||
editor.setReadOnly(!!this.props.readOnly)
|
editor.setReadOnly(!!this.props.readOnly)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import ReactDOM from 'react-dom'
|
import ReactDOM from 'react-dom'
|
||||||
|
|
||||||
|
const remote = require('electron').remote
|
||||||
|
|
||||||
class ModalBase extends React.Component {
|
class ModalBase extends React.Component {
|
||||||
constructor (props) {
|
constructor (props) {
|
||||||
super(props)
|
super(props)
|
||||||
@@ -13,6 +15,8 @@ class ModalBase extends React.Component {
|
|||||||
|
|
||||||
close () {
|
close () {
|
||||||
if (modalBase != null) modalBase.setState({component: null, componentProps: null, isHidden: true})
|
if (modalBase != null) modalBase.setState({component: null, componentProps: null, isHidden: true})
|
||||||
|
|
||||||
|
remote.getCurrentWebContents().send('list-focus')
|
||||||
}
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
@@ -38,9 +42,15 @@ export function openModal (component, props) {
|
|||||||
|
|
||||||
export function closeModal () {
|
export function closeModal () {
|
||||||
if (modalBase == null) { return }
|
if (modalBase == null) { return }
|
||||||
modalBase.setState({component: null, componentProps: null, isHidden: true})
|
modalBase.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isModalOpen () {
|
export function isModalOpen () {
|
||||||
return !modalBase.state.isHidden
|
return !modalBase.state.isHidden
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
open: openModal,
|
||||||
|
close: closeModal,
|
||||||
|
isOpen: isModalOpen
|
||||||
|
}
|
||||||
|
|||||||
@@ -14,11 +14,12 @@ import TagSelect from 'browser/components/TagSelect'
|
|||||||
import ModeSelect from 'browser/components/ModeSelect'
|
import ModeSelect from 'browser/components/ModeSelect'
|
||||||
import activityRecord from 'browser/lib/activityRecord'
|
import activityRecord from 'browser/lib/activityRecord'
|
||||||
import ShareButton from './ShareButton'
|
import ShareButton from './ShareButton'
|
||||||
import { openModal } from 'browser/lib/modal'
|
import { openModal, isModalOpen } from 'browser/lib/modal'
|
||||||
import DeleteArticleModal from '../../modal/DeleteArticleModal'
|
import DeleteArticleModal from '../../modal/DeleteArticleModal'
|
||||||
|
|
||||||
const electron = require('electron')
|
const electron = require('electron')
|
||||||
const clipboard = electron.clipboard
|
const clipboard = electron.clipboard
|
||||||
|
const ipc = electron.ipcRenderer
|
||||||
|
|
||||||
const OSX = process.platform === 'darwin'
|
const OSX = process.platform === 'darwin'
|
||||||
const BRAND_COLOR = '#18AF90'
|
const BRAND_COLOR = '#18AF90'
|
||||||
@@ -88,6 +89,23 @@ export default class ArticleDetail extends React.Component {
|
|||||||
constructor (props) {
|
constructor (props) {
|
||||||
super(props)
|
super(props)
|
||||||
|
|
||||||
|
this.saveHandler = e => {
|
||||||
|
if (isModalOpen()) return true
|
||||||
|
this.handleSaveButtonClick()
|
||||||
|
}
|
||||||
|
this.deleteHandler = e => {
|
||||||
|
if (isModalOpen()) return true
|
||||||
|
this.handleDeleteButtonClick()
|
||||||
|
}
|
||||||
|
this.togglePreviewHandler = e => {
|
||||||
|
if (isModalOpen()) return true
|
||||||
|
this.handleTogglePreviewButtonClick()
|
||||||
|
}
|
||||||
|
this.editHandler = e => {
|
||||||
|
if (isModalOpen()) return true
|
||||||
|
this.editArticle()
|
||||||
|
}
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
article: Object.assign({content: ''}, props.activeArticle),
|
article: Object.assign({content: ''}, props.activeArticle),
|
||||||
previewMode: false,
|
previewMode: false,
|
||||||
@@ -102,10 +120,20 @@ export default class ArticleDetail extends React.Component {
|
|||||||
this.shareDropdownInterceptor = e => {
|
this.shareDropdownInterceptor = e => {
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ipc.on('detail-save', this.saveHandler)
|
||||||
|
ipc.on('detail-delete', this.deleteHandler)
|
||||||
|
ipc.on('detail-toggle-preview', this.togglePreviewHandler)
|
||||||
|
ipc.on('detail-edit', this.editHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount () {
|
componentWillUnmount () {
|
||||||
clearInterval(this.refreshTimer)
|
clearInterval(this.refreshTimer)
|
||||||
|
|
||||||
|
ipc.removeListener('detail-save', this.saveHandler)
|
||||||
|
ipc.removeListener('detail-delete', this.deleteHandler)
|
||||||
|
ipc.removeListener('detail-toggle-preview', this.togglePreviewHandler)
|
||||||
|
ipc.removeListener('detail-on', this.editHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillReceiveProps (nextProps) {
|
componentWillReceiveProps (nextProps) {
|
||||||
@@ -127,6 +155,12 @@ export default class ArticleDetail extends React.Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
editArticle () {
|
||||||
|
ReactDOM.findDOMNode(this.refs.title).focus()
|
||||||
|
ReactDOM.findDOMNode(this.refs.title).select()
|
||||||
|
this.setState({previewMode: false})
|
||||||
|
}
|
||||||
|
|
||||||
cacheArticle () {
|
cacheArticle () {
|
||||||
let { dispatch } = this.props
|
let { dispatch } = this.props
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,25 @@ import FolderMark from 'browser/components/FolderMark'
|
|||||||
import TagLink from './TagLink'
|
import TagLink from './TagLink'
|
||||||
import _ from 'lodash'
|
import _ from 'lodash'
|
||||||
|
|
||||||
|
const electron = require('electron')
|
||||||
|
const remote = electron.remote
|
||||||
|
const ipc = electron.ipcRenderer
|
||||||
|
|
||||||
export default class ArticleList extends React.Component {
|
export default class ArticleList extends React.Component {
|
||||||
|
constructor (props) {
|
||||||
|
super(props)
|
||||||
|
|
||||||
|
this.focusHandler = e => this.focus()
|
||||||
|
}
|
||||||
|
|
||||||
componentDidMount () {
|
componentDidMount () {
|
||||||
this.refreshTimer = setInterval(() => this.forceUpdate(), 60 * 1000)
|
this.refreshTimer = setInterval(() => this.forceUpdate(), 60 * 1000)
|
||||||
|
ipc.on('list-focus', this.focusHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount () {
|
componentWillUnmount () {
|
||||||
clearInterval(this.refreshTimer)
|
clearInterval(this.refreshTimer)
|
||||||
|
ipc.removeListener('list-focus', this.focusHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidUpdate () {
|
componentDidUpdate () {
|
||||||
@@ -36,6 +48,10 @@ export default class ArticleList extends React.Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
focus () {
|
||||||
|
ReactDOM.findDOMNode(this).focus()
|
||||||
|
}
|
||||||
|
|
||||||
// 移動ができなかったらfalseを返す:
|
// 移動ができなかったらfalseを返す:
|
||||||
selectPriorArticle () {
|
selectPriorArticle () {
|
||||||
let { articles, activeArticle, dispatch } = this.props
|
let { articles, activeArticle, dispatch } = this.props
|
||||||
@@ -68,6 +84,41 @@ export default class ArticleList extends React.Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleArticleListKeyDown (e) {
|
||||||
|
console.log(e.keyCode)
|
||||||
|
if (e.metaKey || e.ctrlKey) return true
|
||||||
|
|
||||||
|
if (e.keyCode === 65) {
|
||||||
|
e.preventDefault()
|
||||||
|
remote.getCurrentWebContents().send('nav-new-post')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.keyCode === 68) {
|
||||||
|
e.preventDefault()
|
||||||
|
remote.getCurrentWebContents().send('detail-delete')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.keyCode === 69) {
|
||||||
|
e.preventDefault()
|
||||||
|
remote.getCurrentWebContents().send('detail-edit')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.keyCode === 83) {
|
||||||
|
e.preventDefault()
|
||||||
|
remote.getCurrentWebContents().send('detail-save')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.keyCode === 38) {
|
||||||
|
e.preventDefault()
|
||||||
|
this.selectPriorArticle()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.keyCode === 40) {
|
||||||
|
e.preventDefault()
|
||||||
|
this.selectNextArticle()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
let { articles, modified, activeArticle, folders } = this.props
|
let { articles, modified, activeArticle, folders } = this.props
|
||||||
|
|
||||||
@@ -130,7 +181,7 @@ export default class ArticleList extends React.Component {
|
|||||||
})
|
})
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='ArticleList'>
|
<div tabIndex='1' onKeyDown={e => this.handleArticleListKeyDown(e)} className='ArticleList'>
|
||||||
{articleElements}
|
{articleElements}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
import React, { PropTypes } from 'react'
|
import React, { PropTypes } from 'react'
|
||||||
import { findWhere } from 'lodash'
|
import { findWhere } from 'lodash'
|
||||||
import { setSearchFilter, switchFolder, saveArticle } from '../actions'
|
import { setSearchFilter, switchFolder, saveArticle } from '../actions'
|
||||||
import { openModal } from 'browser/lib/modal'
|
import { openModal, isModalOpen } from 'browser/lib/modal'
|
||||||
import FolderMark from 'browser/components/FolderMark'
|
import FolderMark from 'browser/components/FolderMark'
|
||||||
import Preferences from '../modal/Preferences'
|
import Preferences from '../modal/Preferences'
|
||||||
import CreateNewFolder from '../modal/CreateNewFolder'
|
import CreateNewFolder from '../modal/CreateNewFolder'
|
||||||
import keygen from 'browser/lib/keygen'
|
import keygen from 'browser/lib/keygen'
|
||||||
|
|
||||||
|
const ipc = require('electron').ipcRenderer
|
||||||
|
|
||||||
const BRAND_COLOR = '#18AF90'
|
const BRAND_COLOR = '#18AF90'
|
||||||
|
|
||||||
const preferenceTutorialElement = (
|
const preferenceTutorialElement = (
|
||||||
@@ -58,6 +60,28 @@ c-3.4-6.1-8.2-11.3-13.8-15.4C50.2,11.6,31,10.9,15.3,19C13.6,19.8,15.1,22.4,16.8,
|
|||||||
)
|
)
|
||||||
|
|
||||||
export default class ArticleNavigator extends React.Component {
|
export default class ArticleNavigator extends React.Component {
|
||||||
|
constructor (props) {
|
||||||
|
super(props)
|
||||||
|
this.newPostHandler = e => {
|
||||||
|
if (isModalOpen()) return true
|
||||||
|
this.handleNewPostButtonClick(e)
|
||||||
|
}
|
||||||
|
this.newFolderHandler = e => {
|
||||||
|
if (isModalOpen()) return true
|
||||||
|
this.handleNewFolderButton(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount () {
|
||||||
|
ipc.on('nav-new-post', this.newPostHandler)
|
||||||
|
ipc.on('nav-new-folder', this.newFolderHandler)
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount () {
|
||||||
|
ipc.removeListener('nav-new-post', this.newPostHandler)
|
||||||
|
ipc.removeListener('nav-new-folder', this.newFolderHandler)
|
||||||
|
}
|
||||||
|
|
||||||
handlePreferencesButtonClick (e) {
|
handlePreferencesButtonClick (e) {
|
||||||
openModal(Preferences)
|
openModal(Preferences)
|
||||||
}
|
}
|
||||||
@@ -136,7 +160,7 @@ export default class ArticleNavigator extends React.Component {
|
|||||||
<div className='controlSection'>
|
<div className='controlSection'>
|
||||||
<button onClick={e => this.handleNewPostButtonClick(e)} className='newPostBtn'>
|
<button onClick={e => this.handleNewPostButtonClick(e)} className='newPostBtn'>
|
||||||
New Post
|
New Post
|
||||||
<span className='tooltip'>Create a new Post ({process.platform === 'darwin' ? '⌘' : '^'} + Enter or a)</span>
|
<span className='tooltip'>Create a new Post ({process.platform === 'darwin' ? '⌘' : '^'} + n)</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
{status.isTutorialOpen ? newPostTutorialElement : null}
|
{status.isTutorialOpen ? newPostTutorialElement : null}
|
||||||
@@ -148,7 +172,7 @@ export default class ArticleNavigator extends React.Component {
|
|||||||
<div className='title'>Folders</div>
|
<div className='title'>Folders</div>
|
||||||
<button onClick={e => this.handleNewFolderButton(e)} className='addBtn'>
|
<button onClick={e => this.handleNewFolderButton(e)} className='addBtn'>
|
||||||
<i className='fa fa-fw fa-plus'/>
|
<i className='fa fa-fw fa-plus'/>
|
||||||
<span className='tooltip'>Create a new folder</span>
|
<span className='tooltip'>Create a new folder ({process.platform === 'darwin' ? '⌘' : '^'} + Shift + n)</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
{status.isTutorialOpen ? newFolderTutorialElement : null}
|
{status.isTutorialOpen ? newFolderTutorialElement : null}
|
||||||
|
|||||||
@@ -3,11 +3,13 @@ import ReactDOM from 'react-dom'
|
|||||||
import ExternalLink from 'browser/components/ExternalLink'
|
import ExternalLink from 'browser/components/ExternalLink'
|
||||||
import { setSearchFilter, clearSearch, toggleOnlyUnsavedFilter, toggleTutorial, saveAllArticles, switchArticle } from '../actions'
|
import { setSearchFilter, clearSearch, toggleOnlyUnsavedFilter, toggleTutorial, saveAllArticles, switchArticle } from '../actions'
|
||||||
import store from '../store'
|
import store from '../store'
|
||||||
|
import { isModalOpen } from 'browser/lib/modal'
|
||||||
|
|
||||||
const electron = require('electron')
|
const electron = require('electron')
|
||||||
const remote = electron.remote
|
const remote = electron.remote
|
||||||
const Menu = remote.Menu
|
const Menu = remote.Menu
|
||||||
const MenuItem = remote.MenuItem
|
const MenuItem = remote.MenuItem
|
||||||
|
const ipc = electron.ipcRenderer
|
||||||
|
|
||||||
const OSX = process.platform === 'darwin'
|
const OSX = process.platform === 'darwin'
|
||||||
|
|
||||||
@@ -64,6 +66,15 @@ export default class ArticleTopBar extends React.Component {
|
|||||||
constructor (props) {
|
constructor (props) {
|
||||||
super(props)
|
super(props)
|
||||||
|
|
||||||
|
this.saveAllHandler = e => {
|
||||||
|
if (isModalOpen()) return true
|
||||||
|
this.handleSaveAllButtonClick(e)
|
||||||
|
}
|
||||||
|
this.focusSearchHandler = e => {
|
||||||
|
if (isModalOpen()) return true
|
||||||
|
this.focusInput(e)
|
||||||
|
}
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
isTooltipHidden: true,
|
isTooltipHidden: true,
|
||||||
isLinksDropdownOpen: false
|
isLinksDropdownOpen: false
|
||||||
@@ -87,11 +98,17 @@ export default class ArticleTopBar extends React.Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
document.addEventListener('click', this.hideLinksDropdown)
|
document.addEventListener('click', this.hideLinksDropdown)
|
||||||
|
|
||||||
|
ipc.on('top-save-all', this.saveAllHandler)
|
||||||
|
ipc.on('top-focus-search', this.focusSearchHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount () {
|
componentWillUnmount () {
|
||||||
document.removeEventListener('click', this.hideLinksDropdown)
|
document.removeEventListener('click', this.hideLinksDropdown)
|
||||||
this.linksButton.removeEventListener('click', this.showLinksDropdown())
|
this.linksButton.removeEventListener('click', this.showLinksDropdown())
|
||||||
|
|
||||||
|
ipc.removeListener('top-save-all', this.saveAllHandler)
|
||||||
|
ipc.removeListener('top-focus-search', this.focusSearchHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
handleTooltipRequest (e) {
|
handleTooltipRequest (e) {
|
||||||
@@ -112,10 +129,10 @@ export default class ArticleTopBar extends React.Component {
|
|||||||
dispatch(clearSearch())
|
dispatch(clearSearch())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
this.blurInput()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
focusInput () {
|
focusInput () {
|
||||||
|
console.log('focinp')
|
||||||
this.searchInput.focus()
|
this.searchInput.focus()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,6 +162,7 @@ export default class ArticleTopBar extends React.Component {
|
|||||||
let { dispatch } = this.props
|
let { dispatch } = this.props
|
||||||
|
|
||||||
dispatch(saveAllArticles())
|
dispatch(saveAllArticles())
|
||||||
|
remote.getCurrentWebContents().send('list-focus')
|
||||||
}
|
}
|
||||||
|
|
||||||
handleSaveMenuButtonClick (e) {
|
handleSaveMenuButtonClick (e) {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import React, { PropTypes} from 'react'
|
import React, { PropTypes} from 'react'
|
||||||
import { connect } from 'react-redux'
|
import { connect } from 'react-redux'
|
||||||
|
import ReactDOM from 'react-dom'
|
||||||
import { toggleTutorial } from '../actions'
|
import { toggleTutorial } from '../actions'
|
||||||
import ArticleNavigator from './ArticleNavigator'
|
import ArticleNavigator from './ArticleNavigator'
|
||||||
import ArticleTopBar from './ArticleTopBar'
|
import ArticleTopBar from './ArticleTopBar'
|
||||||
@@ -26,15 +27,14 @@ class HomePage extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleKeyDown (e) {
|
handleKeyDown (e) {
|
||||||
let cmdOrCtrl = process.platform === 'darwin' ? e.metaKey : e.ctrlKey
|
|
||||||
|
|
||||||
if (isModalOpen()) {
|
if (isModalOpen()) {
|
||||||
if (e.keyCode === 27) closeModal()
|
if (e.keyCode === 27) closeModal()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let { status, dispatch } = this.props
|
let { status, dispatch } = this.props
|
||||||
let { nav, top, list, detail } = this.refs
|
let { top, list } = this.refs
|
||||||
|
let listElement = ReactDOM.findDOMNode(list)
|
||||||
|
|
||||||
if (status.isTutorialOpen) {
|
if (status.isTutorialOpen) {
|
||||||
dispatch(toggleTutorial())
|
dispatch(toggleTutorial())
|
||||||
@@ -42,28 +42,24 @@ class HomePage extends React.Component {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Search inputがfocusされていたら大体のキー入力は無視される。
|
if (e.keyCode === 13 && top.isInputFocused()) {
|
||||||
if (top.isInputFocused() && !(e.metaKey || e.ctrlKey)) {
|
listElement.focus()
|
||||||
if (e.keyCode === 13 || e.keyCode === 27) top.escape()
|
return
|
||||||
|
}
|
||||||
|
if (e.keyCode === 27 && top.isInputFocused()) {
|
||||||
|
if (status.search.length > 0) top.escape()
|
||||||
|
else listElement.focus()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// `detail`の`openDeleteConfirmMenu`が`true`なら呼ばれない。
|
// Search inputがfocusされていたら大体のキー入力は無視される。
|
||||||
if (e.keyCode === 27 || (e.keyCode === 70 && cmdOrCtrl)) {
|
if (e.keyCode === 27) {
|
||||||
top.focusInput()
|
if (document.activeElement !== listElement) {
|
||||||
}
|
listElement.focus()
|
||||||
|
} else {
|
||||||
if (e.keyCode === 38) {
|
top.focusInput()
|
||||||
list.selectPriorArticle()
|
}
|
||||||
}
|
return
|
||||||
|
|
||||||
if (e.keyCode === 40) {
|
|
||||||
list.selectNextArticle()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e.keyCode === 78 && cmdOrCtrl) {
|
|
||||||
nav.handleNewPostButtonClick()
|
|
||||||
e.preventDefault()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
noTagsColor = #999
|
noTagsColor = #999
|
||||||
iptFocusBorderColor = #369DCD
|
|
||||||
|
|
||||||
infoButton()
|
infoButton()
|
||||||
display inline-block
|
display inline-block
|
||||||
@@ -7,14 +6,17 @@ infoButton()
|
|||||||
cursor pointer
|
cursor pointer
|
||||||
height 33px
|
height 33px
|
||||||
width 33px
|
width 33px
|
||||||
border none
|
|
||||||
margin-right 5px
|
margin-right 5px
|
||||||
font-size 18px
|
font-size 18px
|
||||||
color inactiveTextColor
|
color inactiveTextColor
|
||||||
background-color white
|
background-color white
|
||||||
padding 0
|
padding 0
|
||||||
|
border 1px solid white
|
||||||
|
&:focus
|
||||||
|
border-color focusBorderColor
|
||||||
&:hover
|
&:hover
|
||||||
color inherit
|
color inherit
|
||||||
|
|
||||||
.ArticleDetail
|
.ArticleDetail
|
||||||
absolute right bottom
|
absolute right bottom
|
||||||
top 60px
|
top 60px
|
||||||
@@ -55,7 +57,7 @@ infoButton()
|
|||||||
&:hover
|
&:hover
|
||||||
background-color white
|
background-color white
|
||||||
&:focus
|
&:focus
|
||||||
border-color iptFocusBorderColor
|
border-color focusBorderColor
|
||||||
&>.tutorial
|
&>.tutorial
|
||||||
position fixed
|
position fixed
|
||||||
z-index 35
|
z-index 35
|
||||||
@@ -124,11 +126,15 @@ infoButton()
|
|||||||
border-top solid 1px darken(brandColor, 5%)
|
border-top solid 1px darken(brandColor, 5%)
|
||||||
border-bottom solid 1px darken(brandColor, 5%)
|
border-bottom solid 1px darken(brandColor, 5%)
|
||||||
border-left solid 1px darken(brandColor, 5%)
|
border-left solid 1px darken(brandColor, 5%)
|
||||||
|
border-right solid 1px transparent
|
||||||
border-radius left 2px
|
border-radius left 2px
|
||||||
background-color brandColor
|
background-color brandColor
|
||||||
&:hover
|
&:hover
|
||||||
background-color lighten(brandColor, 10%)
|
background-color lighten(brandColor, 10%)
|
||||||
border-color lighten(brandColor, 10%)
|
border-color lighten(brandColor, 10%)
|
||||||
|
&:focus
|
||||||
|
background-color lighten(brandColor, 10%)
|
||||||
|
border-color focusBorderColor
|
||||||
.TagSelect-tags-item-label
|
.TagSelect-tags-item-label
|
||||||
background-color brandColor
|
background-color brandColor
|
||||||
float left
|
float left
|
||||||
@@ -142,12 +148,13 @@ infoButton()
|
|||||||
input.TagSelect-input
|
input.TagSelect-input
|
||||||
background-color transparent
|
background-color transparent
|
||||||
border none
|
border none
|
||||||
|
border-bottom 1px solid transparent
|
||||||
outline none
|
outline none
|
||||||
margin 0 2px
|
margin 0 2px
|
||||||
transition 0.15s
|
transition 0.15s
|
||||||
height 18px
|
height 18px
|
||||||
&:focus
|
&:focus
|
||||||
font-size 13px
|
border-color focusBorderColor
|
||||||
.TagSelect-suggest
|
.TagSelect-suggest
|
||||||
position fixed
|
position fixed
|
||||||
width 150px
|
width 150px
|
||||||
@@ -208,7 +215,7 @@ infoButton()
|
|||||||
padding 0 5px
|
padding 0 5px
|
||||||
line-height 33px
|
line-height 33px
|
||||||
&.edit
|
&.edit
|
||||||
border-color iptFocusBorderColor
|
border-color focusBorderColor
|
||||||
input
|
input
|
||||||
width 120px
|
width 120px
|
||||||
line-height 31px
|
line-height 31px
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ articleItemColor = #777
|
|||||||
width 250px
|
width 250px
|
||||||
border-top 1px solid borderColor
|
border-top 1px solid borderColor
|
||||||
border-right 1px solid borderColor
|
border-right 1px solid borderColor
|
||||||
|
&:focus
|
||||||
|
border-color focusBorderColor
|
||||||
overflow-y auto
|
overflow-y auto
|
||||||
noSelect()
|
noSelect()
|
||||||
&>div
|
&>div
|
||||||
|
|||||||
@@ -137,6 +137,11 @@ infoBtnActiveBgColor = #3A3A3A
|
|||||||
&:active
|
&:active
|
||||||
color inherit
|
color inherit
|
||||||
background-color lighten(topBarBtnBgColor, 15%)
|
background-color lighten(topBarBtnBgColor, 15%)
|
||||||
|
&:disabled
|
||||||
|
color inactiveTextColor
|
||||||
|
background transparent
|
||||||
|
&:focus
|
||||||
|
color focusBorderColor
|
||||||
&.ArticleTopBar-left-unsaved-save-button
|
&.ArticleTopBar-left-unsaved-save-button
|
||||||
position relative
|
position relative
|
||||||
.ArticleTopBar-left-unsaved-save-button-count
|
.ArticleTopBar-left-unsaved-save-button-count
|
||||||
@@ -175,8 +180,10 @@ infoBtnActiveBgColor = #3A3A3A
|
|||||||
background-color infoBtnBgColor
|
background-color infoBtnBgColor
|
||||||
color bgColor
|
color bgColor
|
||||||
border-radius 11px
|
border-radius 11px
|
||||||
border none
|
border 1px solid bgColor
|
||||||
transition 0.1s
|
transition 0.1s
|
||||||
|
&:focus
|
||||||
|
border-color focusBorderColor
|
||||||
.tooltip
|
.tooltip
|
||||||
tooltip()
|
tooltip()
|
||||||
margin-left -50px
|
margin-left -50px
|
||||||
@@ -192,6 +199,12 @@ infoBtnActiveBgColor = #3A3A3A
|
|||||||
top 8px
|
top 8px
|
||||||
right 15px
|
right 15px
|
||||||
opacity 0.7
|
opacity 0.7
|
||||||
|
border-radius 23px
|
||||||
|
height 46px
|
||||||
|
width 46px
|
||||||
|
border 1px solid transparent
|
||||||
|
&:focus
|
||||||
|
border-color focusBorderColor
|
||||||
&:hover
|
&:hover
|
||||||
opacity 1
|
opacity 1
|
||||||
.tooltip
|
.tooltip
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
.DeleteArticleModal.modal
|
.DeleteArticleModal.modal
|
||||||
width 350px
|
width 350px !important
|
||||||
top 100px
|
top 100px
|
||||||
user-select none
|
user-select none
|
||||||
.title
|
.title
|
||||||
@@ -21,9 +21,13 @@
|
|||||||
margin-left 5px
|
margin-left 5px
|
||||||
&:hover
|
&:hover
|
||||||
background-color darken(white, 10%)
|
background-color darken(white, 10%)
|
||||||
|
&:focus
|
||||||
|
border-color focusBorderColor
|
||||||
&.danger
|
&.danger
|
||||||
border-color #E9432A
|
border-color #E9432A
|
||||||
background-color #E9432A
|
background-color #E9432A
|
||||||
color white
|
color white
|
||||||
&:hover
|
&:hover
|
||||||
background-color lighten(#E9432A, 15%)
|
background-color lighten(#E9432A, 15%)
|
||||||
|
&:focus
|
||||||
|
background-color lighten(#E9432A, 15%)
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ highlightenBorderColor = darken(borderColor, 20%)
|
|||||||
invBorderColor = #404849
|
invBorderColor = #404849
|
||||||
brandBorderColor = #3FB399
|
brandBorderColor = #3FB399
|
||||||
|
|
||||||
|
focusBorderColor = #369DCD
|
||||||
|
|
||||||
buttonBorderColor = #4C4C4C
|
buttonBorderColor = #4C4C4C
|
||||||
|
|
||||||
lightButtonColor = #898989
|
lightButtonColor = #898989
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ app.on('ready', function () {
|
|||||||
app.dock.hide()
|
app.dock.hide()
|
||||||
}
|
}
|
||||||
|
|
||||||
var template = require('./menu-template')
|
var template = require('./finder-menu')
|
||||||
var menu = Menu.buildFromTemplate(template)
|
var menu = Menu.buildFromTemplate(template)
|
||||||
Menu.setApplicationMenu(menu)
|
Menu.setApplicationMenu(menu)
|
||||||
|
|
||||||
|
|||||||
94
lib/finder-menu.js
Normal file
94
lib/finder-menu.js
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
const electron = require('electron')
|
||||||
|
const BrowserWindow = electron.BrowserWindow
|
||||||
|
|
||||||
|
const OSX = process.platform === 'darwin'
|
||||||
|
const WIN = process.platform === 'win32'
|
||||||
|
|
||||||
|
var edit = {
|
||||||
|
label: 'Edit',
|
||||||
|
submenu: [
|
||||||
|
{
|
||||||
|
label: 'Undo',
|
||||||
|
accelerator: 'Command+Z',
|
||||||
|
selector: 'undo:'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Redo',
|
||||||
|
accelerator: 'Shift+Command+Z',
|
||||||
|
selector: 'redo:'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'separator'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Cut',
|
||||||
|
accelerator: 'Command+X',
|
||||||
|
selector: 'cut:'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Copy',
|
||||||
|
accelerator: 'Command+C',
|
||||||
|
selector: 'copy:'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Paste',
|
||||||
|
accelerator: 'Command+V',
|
||||||
|
selector: 'paste:'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Select All',
|
||||||
|
accelerator: 'Command+A',
|
||||||
|
selector: 'selectAll:'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
var view = {
|
||||||
|
label: 'View',
|
||||||
|
submenu: [
|
||||||
|
{
|
||||||
|
label: 'Focus Search',
|
||||||
|
accelerator: 'Control + Alt + F',
|
||||||
|
click: function () {
|
||||||
|
console.log('focus find')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'separator'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Toggle Markdown Preview',
|
||||||
|
accelerator: OSX ? 'Command + P' : 'Ctrl + P',
|
||||||
|
click: function () {
|
||||||
|
console.log('markdown')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'separator'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Reload',
|
||||||
|
accelerator: (function () {
|
||||||
|
if (process.platform === 'darwin') return 'Command+R'
|
||||||
|
else return 'Ctrl+R'
|
||||||
|
})(),
|
||||||
|
click: function () {
|
||||||
|
BrowserWindow.getFocusedWindow().reload()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Toggle Developer Tools',
|
||||||
|
accelerator: (function () {
|
||||||
|
if (process.platform === 'darwin') return 'Alt+Command+I'
|
||||||
|
else return 'Ctrl+Shift+I'
|
||||||
|
})(),
|
||||||
|
click: function (item, focusedWindow) {
|
||||||
|
if (focusedWindow) BrowserWindow.getFocusedWindow().toggleDevTools()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = process.platform === 'darwin'
|
||||||
|
? [edit, view]
|
||||||
|
: [view]
|
||||||
@@ -227,7 +227,7 @@ app.on('ready', function () {
|
|||||||
if (finderProcess) finderProcess.kill()
|
if (finderProcess) finderProcess.kill()
|
||||||
})
|
})
|
||||||
|
|
||||||
var template = require('./menu-template')
|
var template = require('./main-menu')
|
||||||
if (process.platform === 'win32') {
|
if (process.platform === 'win32') {
|
||||||
template.unshift({
|
template.unshift({
|
||||||
label: 'Boostnote',
|
label: 'Boostnote',
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
const electron = require('electron')
|
const electron = require('electron')
|
||||||
const BrowserWindow = electron.BrowserWindow
|
const BrowserWindow = electron.BrowserWindow
|
||||||
const shell = electron.shell
|
const shell = electron.shell
|
||||||
|
const mainWindow = require('./main-window')
|
||||||
|
|
||||||
|
const OSX = process.platform === 'darwin'
|
||||||
|
const WIN = process.platform === 'win32'
|
||||||
|
|
||||||
var boost = {
|
var boost = {
|
||||||
label: 'Boostnote',
|
label: 'Boostnote',
|
||||||
@@ -12,13 +16,6 @@ var boost = {
|
|||||||
{
|
{
|
||||||
type: 'separator'
|
type: 'separator'
|
||||||
},
|
},
|
||||||
{
|
|
||||||
label: 'Services',
|
|
||||||
submenu: []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'separator'
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: 'Hide Boostnote',
|
label: 'Hide Boostnote',
|
||||||
accelerator: 'Command+H',
|
accelerator: 'Command+H',
|
||||||
@@ -44,6 +41,53 @@ var boost = {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var file = {
|
||||||
|
label: 'File',
|
||||||
|
submenu: [
|
||||||
|
{
|
||||||
|
label: 'New Post',
|
||||||
|
accelerator: OSX ? 'Command + N' : 'Control + N',
|
||||||
|
click: function () {
|
||||||
|
mainWindow.webContents.send('nav-new-post')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'New Folder',
|
||||||
|
accelerator: OSX ? 'Command + Shift + N' : 'Control + Shift + N',
|
||||||
|
click: function () {
|
||||||
|
mainWindow.webContents.send('nav-new-folder')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'separator'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Save Post',
|
||||||
|
accelerator: OSX ? 'Command + S' : 'Control + S',
|
||||||
|
click: function () {
|
||||||
|
mainWindow.webContents.send('detail-save')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Save All Posts',
|
||||||
|
accelerator: OSX ? 'Command + Shift + S' : 'Control + Shift + S',
|
||||||
|
click: function () {
|
||||||
|
mainWindow.webContents.send('top-save-all')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'separator'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Delete Post',
|
||||||
|
accelerator: OSX ? 'Control + Backspace' : 'Control + Delete',
|
||||||
|
click: function () {
|
||||||
|
mainWindow.webContents.send('detail-delete')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
var edit = {
|
var edit = {
|
||||||
label: 'Edit',
|
label: 'Edit',
|
||||||
submenu: [
|
submenu: [
|
||||||
@@ -86,6 +130,26 @@ var edit = {
|
|||||||
var view = {
|
var view = {
|
||||||
label: 'View',
|
label: 'View',
|
||||||
submenu: [
|
submenu: [
|
||||||
|
{
|
||||||
|
label: 'Focus Search',
|
||||||
|
accelerator: 'Control + Alt + F',
|
||||||
|
click: function () {
|
||||||
|
mainWindow.webContents.send('top-focus-search')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'separator'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Toggle Markdown Preview',
|
||||||
|
accelerator: OSX ? 'Command + P' : 'Ctrl + P',
|
||||||
|
click: function () {
|
||||||
|
mainWindow.webContents.send('detail-toggle-preview')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'separator'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label: 'Reload',
|
label: 'Reload',
|
||||||
accelerator: (function () {
|
accelerator: (function () {
|
||||||
@@ -156,5 +220,5 @@ var help = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
module.exports = process.platform === 'darwin'
|
module.exports = process.platform === 'darwin'
|
||||||
? [boost, edit, view, window, help]
|
? [boost, file, edit, view, window, help]
|
||||||
: [view, help]
|
: [file, view, help]
|
||||||
@@ -21,6 +21,16 @@ mainWindow.webContents.on('new-window', function (e) {
|
|||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
mainWindow.webContents.sendInputEvent({
|
||||||
|
type: 'keyDown',
|
||||||
|
keyCode: '\u0008'
|
||||||
|
})
|
||||||
|
|
||||||
|
mainWindow.webContents.sendInputEvent({
|
||||||
|
type: 'keyUp',
|
||||||
|
keyCode: '\u0008'
|
||||||
|
})
|
||||||
|
|
||||||
app.on('activate', function () {
|
app.on('activate', function () {
|
||||||
if (mainWindow == null) return null
|
if (mainWindow == null) return null
|
||||||
mainWindow.show()
|
mainWindow.show()
|
||||||
|
|||||||
Reference in New Issue
Block a user