import app from './../../app.js'; import config from './../../config.js'; import Base_tools_class from './../../core/base-tools.js'; import Base_layers_class from './../../core/base-layers.js'; class Ellipse_class extends Base_tools_class { constructor(ctx) { super(); this.Base_layers = new Base_layers_class(); this.ctx = ctx; this.name = 'ellipse'; this.layer = {}; this.best_ratio = 1; this.snap_line_info = {x: null, y: null}; this.mouse_click = {x: null, y: null}; } load() { this.default_events(); } mousedown(e) { var mouse = this.get_mouse_info(e); var params = this.getParams(); if (mouse.click_valid == false) return; var mouse_x = mouse.x; var mouse_y = mouse.y; //apply snap var snap_info = this.calc_snap_position(e, mouse_x, mouse_y); if(snap_info != null){ if(snap_info.x != null) { mouse_x = snap_info.x; } if(snap_info.y != null) { mouse_y = snap_info.y; } } this.mouse_click.x = mouse_x; this.mouse_click.y = mouse_y; //register new object - current layer is not ours or params changed this.layer = { type: this.name, params: this.clone(this.getParams()), status: 'draft', render_function: [this.name, 'render'], x: mouse_x, y: mouse_y, color: null, is_vector: true, }; if (params.circle == true) { //disable rotate this.layer.rotate = null; } app.State.do_action( new app.Actions.Bundle_action('new_ellipse_layer', 'New Ellipse Layer', [ new app.Actions.Insert_layer_action(this.layer) ]) ); } mousemove(e) { var mouse = this.get_mouse_info(e); var params = this.getParams(); if (mouse.is_drag == false) return; if (mouse.click_valid == false) { return; } var mouse_x = Math.round(mouse.x); var mouse_y = Math.round(mouse.y); var click_x = Math.round(this.mouse_click.x); var click_y = Math.round(this.mouse_click.y); //apply snap var snap_info = this.calc_snap_position(e, mouse_x, mouse_y, config.layer.id); if(snap_info != null){ if(snap_info.x != null) { mouse_x = snap_info.x; } if(snap_info.y != null) { mouse_y = snap_info.y; } } var x = Math.min(mouse_x, click_x); var y = Math.min(mouse_y, click_y); var width = Math.abs(mouse_x - click_x); var height = Math.abs(mouse_y - click_y); if (params.circle == true || e.ctrlKey == true || e.metaKey) { if (width < height) { width = height; } else { height = width; } if (mouse_x < click_x) { x = click_x - width; } if (mouse_y < click_y) { y = click_y - height; } } //more data config.layer.x = x; config.layer.y = y; config.layer.width = width; config.layer.height = height; this.Base_layers.render(); } mouseup(e) { var mouse = this.get_mouse_info(e); var params = this.getParams(); if (mouse.click_valid == false) { config.layer.status = null; return; } var mouse_x = Math.round(mouse.x); var mouse_y = Math.round(mouse.y); var click_x = Math.round(this.mouse_click.x); var click_y = Math.round(this.mouse_click.y); //apply snap var snap_info = this.calc_snap_position(e, mouse_x, mouse_y, config.layer.id); if(snap_info != null){ if(snap_info.x != null) { mouse_x = snap_info.x; } if(snap_info.y != null) { mouse_y = snap_info.y; } } this.snap_line_info = {x: null, y: null}; var x = Math.min(mouse_x, click_x); var y = Math.min(mouse_y, click_y); var width = Math.abs(mouse_x - click_x); var height = Math.abs(mouse_y - click_y); if (params.circle == true || e.ctrlKey == true || e.metaKey) { if (width < height) { width = height; } else { height = width; } if (mouse_x < click_x) { x = click_x - width; } if (mouse_y < click_y) { y = click_y - height; } } if (width == 0 && height == 0) { //same coordinates - cancel app.State.scrap_last_action(); return; } //more data app.State.do_action( new app.Actions.Update_layer_action(config.layer.id, { x: x, y: y, width: width, height: height, status: null }), { merge_with_history: 'new_ellipse_layer' } ); } render_overlay(ctx){ var ctx = this.Base_layers.ctx; this.render_overlay_parent(ctx); } demo(ctx, x, y, width, height) { x = parseInt(x); y = parseInt(y); width = parseInt(width); height = parseInt(height); ctx.fillStyle = '#aaa'; ctx.strokeStyle = '#555'; ctx.lineWidth = 3; this.ellipse( ctx, x, y, width, height, true, true ); } render(ctx, layer) { var params = layer.params; ctx.save(); //set styles ctx.strokeStyle = 'transparent'; ctx.fillStyle = 'transparent'; if(params.border) ctx.strokeStyle = params.border_color; if(params.fill) ctx.fillStyle = params.fill_color; ctx.lineWidth = params.border_size; var dist_x = layer.width; var dist_y = layer.height; ctx.translate(layer.x + layer.width / 2, layer.y + layer.height / 2); ctx.rotate(layer.rotate * Math.PI / 180); this.ellipse(ctx, -layer.width / 2, -layer.height / 2, layer.width, layer.height, params.border, params.fill); ctx.restore(); } ellipse(ctx, x, y, w, h, stroke, fill) { var kappa = .5522848, ox = (w / 2) * kappa, // control point offset horizontal oy = (h / 2) * kappa, // control point offset vertical xe = x + w, // x-end ye = y + h, // y-end xm = x + w / 2, // x-middle ym = y + h / 2; // y-middle ctx.beginPath(); ctx.moveTo(x, ym); ctx.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); ctx.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); ctx.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); ctx.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); ctx.closePath(); if ( stroke == true) ctx.stroke(); if (fill == true) ctx.fill(); } } export default Ellipse_class;