mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-13 17:56:25 +00:00
resizable SideNav
This commit is contained in:
@@ -20,8 +20,10 @@ class Main extends React.Component {
|
|||||||
let { config } = props
|
let { config } = props
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
isSliderFocused: false,
|
isRightSliderFocused: false,
|
||||||
listWidth: config.listWidth
|
listWidth: config.listWidth,
|
||||||
|
navWidth: config.listWidth,
|
||||||
|
isLeftSliderFocused: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,17 +51,24 @@ class Main extends React.Component {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
handleSlideMouseDown (e) {
|
handleLeftSlideMouseDown (e) {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
this.setState({
|
this.setState({
|
||||||
isSliderFocused: true
|
isLeftSliderFocused: true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
handleRightSlideMouseDown (e) {
|
||||||
|
e.preventDefault()
|
||||||
|
this.setState({
|
||||||
|
isRightSliderFocused: true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
handleMouseUp (e) {
|
handleMouseUp (e) {
|
||||||
if (this.state.isSliderFocused) {
|
if (this.state.isRightSliderFocused) {
|
||||||
this.setState({
|
this.setState({
|
||||||
isSliderFocused: false
|
isRightSliderFocused: false
|
||||||
}, () => {
|
}, () => {
|
||||||
let { dispatch } = this.props
|
let { dispatch } = this.props
|
||||||
let newListWidth = this.state.listWidth
|
let newListWidth = this.state.listWidth
|
||||||
@@ -71,10 +80,24 @@ class Main extends React.Component {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
if (this.state.isLeftSliderFocused) {
|
||||||
|
this.setState({
|
||||||
|
isLeftSliderFocused: false
|
||||||
|
}, () => {
|
||||||
|
let { dispatch } = this.props
|
||||||
|
let navWidth = this.state.navWidth
|
||||||
|
// TODO: ConfigManager should dispatch itself.
|
||||||
|
ConfigManager.set({listWidth: navWidth})
|
||||||
|
dispatch({
|
||||||
|
type: 'SET_NAV_WIDTH',
|
||||||
|
listWidth: navWidth
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handleMouseMove (e) {
|
handleMouseMove (e) {
|
||||||
if (this.state.isSliderFocused) {
|
if (this.state.isRightSliderFocused) {
|
||||||
let offset = this.refs.body.getBoundingClientRect().left
|
let offset = this.refs.body.getBoundingClientRect().left
|
||||||
let newListWidth = e.pageX - offset
|
let newListWidth = e.pageX - offset
|
||||||
if (newListWidth < 10) {
|
if (newListWidth < 10) {
|
||||||
@@ -86,6 +109,17 @@ class Main extends React.Component {
|
|||||||
listWidth: newListWidth
|
listWidth: newListWidth
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
if (this.state.isLeftSliderFocused) {
|
||||||
|
let navWidth = e.pageX
|
||||||
|
if (navWidth < 80) {
|
||||||
|
navWidth = 80
|
||||||
|
} else if (navWidth > 600) {
|
||||||
|
navWidth = 600
|
||||||
|
}
|
||||||
|
this.setState({
|
||||||
|
navWidth: navWidth
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
@@ -105,9 +139,20 @@ class Main extends React.Component {
|
|||||||
'config',
|
'config',
|
||||||
'location'
|
'location'
|
||||||
])}
|
])}
|
||||||
|
width={this.state.navWidth}
|
||||||
/>
|
/>
|
||||||
|
{!config.isSideNavFolded &&
|
||||||
|
<div styleName={this.state.isLeftSliderFocused ? 'slider--active' : 'slider'}
|
||||||
|
style={{left: this.state.navWidth - 1}}
|
||||||
|
onMouseDown={(e) => this.handleLeftSlideMouseDown(e)}
|
||||||
|
draggable='false'
|
||||||
|
>
|
||||||
|
<div styleName='slider-hitbox'/>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
<div styleName={config.isSideNavFolded ? 'body--expanded' : 'body'}
|
<div styleName={config.isSideNavFolded ? 'body--expanded' : 'body'}
|
||||||
ref='body'
|
ref='body'
|
||||||
|
style={{left: config.isSideNavFolded ? 44 : this.state.navWidth}}
|
||||||
>
|
>
|
||||||
<TopBar style={{width: this.state.listWidth}}
|
<TopBar style={{width: this.state.listWidth}}
|
||||||
{..._.pick(this.props, [
|
{..._.pick(this.props, [
|
||||||
@@ -127,9 +172,9 @@ class Main extends React.Component {
|
|||||||
'location'
|
'location'
|
||||||
])}
|
])}
|
||||||
/>
|
/>
|
||||||
<div styleName={this.state.isSliderFocused ? 'slider--active' : 'slider'}
|
<div styleName={this.state.isRightSliderFocused ? 'slider--active' : 'slider'}
|
||||||
style={{left: this.state.listWidth}}
|
style={{left: this.state.listWidth}}
|
||||||
onMouseDown={(e) => this.handleSlideMouseDown(e)}
|
onMouseDown={(e) => this.handleRightSlideMouseDown(e)}
|
||||||
draggable='false'
|
draggable='false'
|
||||||
>
|
>
|
||||||
<div styleName='slider-hitbox'/>
|
<div styleName='slider-hitbox'/>
|
||||||
@@ -143,7 +188,7 @@ class Main extends React.Component {
|
|||||||
'params',
|
'params',
|
||||||
'location'
|
'location'
|
||||||
])}
|
])}
|
||||||
ignorePreviewPointerEvents={this.state.isSliderFocused}
|
ignorePreviewPointerEvents={this.state.isRightSliderFocused}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<StatusBar
|
<StatusBar
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
.top-menu-label
|
.top-menu-label
|
||||||
margin-left 5px
|
margin-left 5px
|
||||||
|
overflow ellipsis
|
||||||
|
|
||||||
.menu
|
.menu
|
||||||
margin-top 15px
|
margin-top 15px
|
||||||
@@ -33,6 +34,7 @@
|
|||||||
font-size 14px
|
font-size 14px
|
||||||
width 100%
|
width 100%
|
||||||
text-align left
|
text-align left
|
||||||
|
overflow ellipsis
|
||||||
|
|
||||||
.menu-button--active
|
.menu-button--active
|
||||||
@extend .menu-button
|
@extend .menu-button
|
||||||
|
|||||||
@@ -65,6 +65,7 @@
|
|||||||
margin 2px 0
|
margin 2px 0
|
||||||
text-align left
|
text-align left
|
||||||
border none
|
border none
|
||||||
|
overflow ellipsis
|
||||||
font-size 14px
|
font-size 14px
|
||||||
&:first-child
|
&:first-child
|
||||||
margin-top 0
|
margin-top 0
|
||||||
|
|||||||
@@ -50,11 +50,13 @@ class SideNav extends React.Component {
|
|||||||
isFolded={isFolded}
|
isFolded={isFolded}
|
||||||
/>
|
/>
|
||||||
})
|
})
|
||||||
|
let style = {}
|
||||||
|
if (!isFolded) style.width = this.props.width
|
||||||
return (
|
return (
|
||||||
<div className='SideNav'
|
<div className='SideNav'
|
||||||
styleName={isFolded ? 'root--folded' : 'root'}
|
styleName={isFolded ? 'root--folded' : 'root'}
|
||||||
tabIndex='1'
|
tabIndex='1'
|
||||||
|
style={style}
|
||||||
>
|
>
|
||||||
<div styleName='top'>
|
<div styleName='top'>
|
||||||
<button styleName='top-menu'
|
<button styleName='top-menu'
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ const defaultConfig = {
|
|||||||
zoom: 1,
|
zoom: 1,
|
||||||
isSideNavFolded: false,
|
isSideNavFolded: false,
|
||||||
listWidth: 250,
|
listWidth: 250,
|
||||||
|
navWidth: 200,
|
||||||
hotkey: {
|
hotkey: {
|
||||||
toggleFinder: OSX ? 'Cmd + Alt + S' : 'Super + Alt + S',
|
toggleFinder: OSX ? 'Cmd + Alt + S' : 'Super + Alt + S',
|
||||||
toggleMain: OSX ? 'Cmd + Alt + L' : 'Super + Alt + E'
|
toggleMain: OSX ? 'Cmd + Alt + L' : 'Super + Alt + E'
|
||||||
|
|||||||
@@ -461,6 +461,9 @@ function config (state = defaultConfig, action) {
|
|||||||
case 'SET_LIST_WIDTH':
|
case 'SET_LIST_WIDTH':
|
||||||
state.listWidth = action.listWidth
|
state.listWidth = action.listWidth
|
||||||
return Object.assign({}, state)
|
return Object.assign({}, state)
|
||||||
|
case 'SET_NAV_WIDTH':
|
||||||
|
state.navWidth = action.navWidth
|
||||||
|
return Object.assign({}, state)
|
||||||
case 'SET_CONFIG':
|
case 'SET_CONFIG':
|
||||||
return Object.assign({}, state, action.config)
|
return Object.assign({}, state, action.config)
|
||||||
case 'SET_UI':
|
case 'SET_UI':
|
||||||
|
|||||||
Reference in New Issue
Block a user