1
0
mirror of https://github.com/BoostIo/Boostnote synced 2025-12-13 09:46:22 +00:00

renewal key binding

This commit is contained in:
Rokt33r
2015-12-29 02:18:37 +09:00
parent b820bdec09
commit 0187217c86
17 changed files with 388 additions and 48 deletions

View File

@@ -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)

View File

@@ -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
}

View File

@@ -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

View File

@@ -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>
) )

View File

@@ -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}

View File

@@ -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) {

View File

@@ -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) {
if (document.activeElement !== listElement) {
listElement.focus()
} else {
top.focusInput() top.focusInput()
} }
return
if (e.keyCode === 38) {
list.selectPriorArticle()
}
if (e.keyCode === 40) {
list.selectNextArticle()
}
if (e.keyCode === 78 && cmdOrCtrl) {
nav.handleNewPostButtonClick()
e.preventDefault()
} }
} }

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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%)

View File

@@ -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

View File

@@ -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
View 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]

View File

@@ -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',

View File

@@ -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]

View File

@@ -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()