|
import emitter from '../lib/emitter' |
|
import Settings from '../Settings/Settings' |
|
import Emitter from 'licia/Emitter' |
|
import $ from 'licia/$' |
|
import nextTick from 'licia/nextTick' |
|
import orientation from 'licia/orientation' |
|
import pointerEvent from 'licia/pointerEvent' |
|
import { pxToNum, classPrefix as c, eventClient } from '../lib/util' |
|
import evalCss from '../lib/evalCss' |
|
|
|
const $document = $(document) |
|
|
|
export default class EntryBtn extends Emitter { |
|
constructor($container) { |
|
super() |
|
|
|
this._style = evalCss(require('./EntryBtn.scss')) |
|
|
|
this._$container = $container |
|
this._initTpl() |
|
this._bindEvent() |
|
this._registerListener() |
|
} |
|
hide() { |
|
this._$el.hide() |
|
} |
|
show() { |
|
this._$el.show() |
|
} |
|
setPos(pos) { |
|
if (this._isOutOfRange(pos)) { |
|
pos = this._getDefPos() |
|
} |
|
|
|
this._$el.css({ |
|
left: pos.x, |
|
top: pos.y, |
|
}) |
|
|
|
this.config.set('pos', pos) |
|
} |
|
getPos() { |
|
return this.config.get('pos') |
|
} |
|
destroy() { |
|
evalCss.remove(this._style) |
|
this._unregisterListener() |
|
this._$el.remove() |
|
} |
|
_isOutOfRange(pos) { |
|
pos = pos || this.config.get('pos') |
|
const defPos = this._getDefPos() |
|
|
|
return ( |
|
pos.x > defPos.x + 10 || pos.x < 0 || pos.y < 0 || pos.y > defPos.y + 10 |
|
) |
|
} |
|
_registerListener() { |
|
this._scaleListener = () => |
|
nextTick(() => { |
|
if (this._isOutOfRange()) this._resetPos() |
|
}) |
|
emitter.on(emitter.SCALE, this._scaleListener) |
|
} |
|
_unregisterListener() { |
|
emitter.off(emitter.SCALE, this._scaleListener) |
|
} |
|
_initTpl() { |
|
const $container = this._$container |
|
|
|
$container.append( |
|
c('<div class="entry-btn"><span class="icon-tool"></span></div>') |
|
) |
|
this._$el = $container.find('.eruda-entry-btn') |
|
} |
|
_resetPos(orientationChanged) { |
|
const cfg = this.config |
|
let pos = cfg.get('pos') |
|
const defPos = this._getDefPos() |
|
|
|
if (!cfg.get('rememberPos') || orientationChanged) { |
|
pos = defPos |
|
} |
|
|
|
this.setPos(pos) |
|
} |
|
_onDragStart = (e) => { |
|
const $el = this._$el |
|
$el.addClass(c('active')) |
|
|
|
this._isClick = true |
|
e = e.origEvent |
|
this._startX = eventClient('x', e) |
|
this._oldX = pxToNum($el.css('left')) |
|
this._oldY = pxToNum($el.css('top')) |
|
this._startY = eventClient('y', e) |
|
$document.on(pointerEvent('move'), this._onDragMove) |
|
$document.on(pointerEvent('up'), this._onDragEnd) |
|
} |
|
_onDragMove = (e) => { |
|
const btnSize = this._$el.get(0).offsetWidth |
|
const maxWidth = this._$container.get(0).offsetWidth |
|
const maxHeight = this._$container.get(0).offsetHeight |
|
|
|
e = e.origEvent |
|
const deltaX = eventClient('x', e) - this._startX |
|
const deltaY = eventClient('y', e) - this._startY |
|
if (Math.abs(deltaX) > 3 || Math.abs(deltaY) > 3) { |
|
this._isClick = false |
|
} |
|
let newX = this._oldX + deltaX |
|
let newY = this._oldY + deltaY |
|
if (newX < 0) { |
|
newX = 0 |
|
} else if (newX > maxWidth - btnSize) { |
|
newX = maxWidth - btnSize |
|
} |
|
if (newY < 0) { |
|
newY = 0 |
|
} else if (newY > maxHeight - btnSize) { |
|
newY = maxHeight - btnSize |
|
} |
|
this._$el.css({ |
|
left: newX, |
|
top: newY, |
|
}) |
|
} |
|
_onDragEnd = (e) => { |
|
const $el = this._$el |
|
|
|
if (this._isClick) { |
|
this.emit('click') |
|
} |
|
|
|
this._onDragMove(e) |
|
$document.off(pointerEvent('move'), this._onDragMove) |
|
$document.off(pointerEvent('up'), this._onDragEnd) |
|
|
|
const cfg = this.config |
|
|
|
if (cfg.get('rememberPos')) { |
|
cfg.set('pos', { |
|
x: pxToNum($el.css('left')), |
|
y: pxToNum($el.css('top')), |
|
}) |
|
} |
|
|
|
$el.rmClass('eruda-active') |
|
} |
|
_bindEvent() { |
|
const $el = this._$el |
|
|
|
$el.on(pointerEvent('down'), this._onDragStart) |
|
|
|
orientation.on('change', () => this._resetPos(true)) |
|
window.addEventListener('resize', () => this._resetPos()) |
|
} |
|
initCfg(settings) { |
|
const cfg = (this.config = Settings.createCfg('entry-button', { |
|
rememberPos: true, |
|
pos: this._getDefPos(), |
|
})) |
|
|
|
settings.switch(cfg, 'rememberPos', '入力ボタンの位置を記憶する') |
|
|
|
this._resetPos() |
|
} |
|
_getDefPos() { |
|
const minWidth = this._$el.get(0).offsetWidth + 10 |
|
|
|
return { |
|
x: window.innerWidth - minWidth, |
|
y: window.innerHeight - minWidth, |
|
} |
|
} |
|
} |
|
|