forked from enviPath/enviPy
Current Dev State
This commit is contained in:
111
static/js/ketcher2/script/editor/tool/chain.js
Normal file
111
static/js/ketcher2/script/editor/tool/chain.js
Normal file
@ -0,0 +1,111 @@
|
||||
/****************************************************************************
|
||||
* Copyright 2017 EPAM Systems
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
***************************************************************************/
|
||||
|
||||
var Vec2 = require('../../util/vec2');
|
||||
var Struct = require('../../chem/struct');
|
||||
var Action = require('../action');
|
||||
var utils = require('./utils');
|
||||
|
||||
var Atom = require('./atom');
|
||||
var Bond = require('./bond');
|
||||
|
||||
function ChainTool(editor) {
|
||||
if (!(this instanceof ChainTool))
|
||||
return new ChainTool(editor);
|
||||
|
||||
this.editor = editor;
|
||||
this.editor.selection(null);
|
||||
}
|
||||
|
||||
ChainTool.prototype.mousedown = function (event) {
|
||||
var rnd = this.editor.render;
|
||||
var ci = this.editor.findItem(event, ['atoms', 'bonds']);
|
||||
this.editor.hover(null);
|
||||
this.dragCtx = {
|
||||
xy0: rnd.page2obj(event),
|
||||
item: ci
|
||||
};
|
||||
if (ci && ci.map === 'atoms') {
|
||||
this.editor.selection({ atoms: [ci.id] }); // for change atom
|
||||
// this event has to be stopped in others events by `tool.dragCtx.stopTapping()`
|
||||
Atom.atomLongtapEvent(this, rnd);
|
||||
}
|
||||
if (!this.dragCtx.item) // ci.type == 'Canvas'
|
||||
delete this.dragCtx.item;
|
||||
return true;
|
||||
};
|
||||
|
||||
ChainTool.prototype.mousemove = function (event) { // eslint-disable-line max-statements
|
||||
var editor = this.editor;
|
||||
var rnd = editor.render;
|
||||
if (this.dragCtx) {
|
||||
if ('stopTapping' in this.dragCtx)
|
||||
this.dragCtx.stopTapping();
|
||||
this.editor.selection(null);
|
||||
var dragCtx = this.dragCtx;
|
||||
if (!('item' in dragCtx) || dragCtx.item.map === 'atoms') {
|
||||
if ('action' in dragCtx)
|
||||
dragCtx.action.perform(rnd.ctab);
|
||||
|
||||
var atoms = rnd.ctab.molecule.atoms;
|
||||
var pos0 = dragCtx.item ? atoms.get(dragCtx.item.id).pp :
|
||||
dragCtx.xy0;
|
||||
var pos1 = rnd.page2obj(event);
|
||||
var sectCount = Math.ceil(Vec2.diff(pos1, pos0).length());
|
||||
var angle = event.ctrlKey ? utils.calcAngle(pos0, pos1) :
|
||||
utils.fracAngle(pos0, pos1);
|
||||
|
||||
dragCtx.action = Action.fromChain(rnd.ctab, pos0, angle, sectCount,
|
||||
dragCtx.item ? dragCtx.item.id : null);
|
||||
editor.event.message.dispatch({
|
||||
info: sectCount + " sectors"
|
||||
});
|
||||
this.editor.update(dragCtx.action, true);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
this.editor.hover(this.editor.findItem(event, ['atoms', 'bonds']));
|
||||
return true;
|
||||
};
|
||||
|
||||
ChainTool.prototype.mouseup = function () {
|
||||
var rnd = this.editor.render;
|
||||
var struct = rnd.ctab.molecule;
|
||||
if (this.dragCtx) {
|
||||
if ('stopTapping' in this.dragCtx)
|
||||
this.dragCtx.stopTapping();
|
||||
var dragCtx = this.dragCtx;
|
||||
|
||||
var action = dragCtx.action;
|
||||
if (!action && dragCtx.item && dragCtx.item.map === 'bonds') {
|
||||
var bond = struct.bonds.get(dragCtx.item.id);
|
||||
|
||||
action = Bond.bondChangingAction(rnd.ctab, dragCtx.item.id, bond, {
|
||||
type: Struct.Bond.PATTERN.TYPE.SINGLE,
|
||||
stereo: Struct.Bond.PATTERN.STEREO.NONE
|
||||
});
|
||||
}
|
||||
delete this.dragCtx;
|
||||
if (action)
|
||||
this.editor.update(action);
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
ChainTool.prototype.cancel = ChainTool.prototype.mouseleave =
|
||||
ChainTool.prototype.mouseup;
|
||||
|
||||
module.exports = ChainTool;
|
||||
Reference in New Issue
Block a user