* #issue-fix The new menu will ask if you want to erase the current content but it will ignore the answer * #issue-fix dialog needs to be closer than the original * #issue-fix main menu alignment changes * #issue_fix double click and opensvg issue fixed * #issue-fix process_cancel change to seConfirm * #issue-fix review how the top toolbar display when many buttons are displayed * #issue-fix unwanted css reoved * #issue-fix BOTTOM TOOLS Make sure all features of the bottom toolbar are working * #issue-fix IMPORT IMAGE menu open issue fixed * #issue-fix alert dialog overwrite style * #issue-fix lint issue fixed * npm update + associated fixes * #36 look of opacity button should like the zoom button (without the dropdown button) * #37 Clicking anywhere on the bottom bar (for example below the opacity button is displaying the “color popup”.) * #38 The opacity button does not update with the current element * #42 When you import an image, it works well but the dialog should disappear automatically * Fixes #53: 4th option for the background display fixed * Fixes #53: 4th option for the background fixed * #49 the x button does not work * Fixes #41: Alignment fixes in bottom bar * fix test scenario * #39 opacity button/stroke size/radius button don’t allow the 0 value * #41 The look and alignment of stroke size and stroke style should be consistent with the rest of the bottom bar. * #44 Text font dropdown is broken * #52 Fix the export * Fixes #44: Text font dropdown fixed * Fixes #44: Text font dropdown fixed * Fixes #44: Text font dropdown fixed * Fixes #44: Text font dropdown fixed * Update index.html * update husky * fixes * moves from index.html to js * fix #66 * fix #48 first set of new icons * Reorganize tools in left panel to be more intuitive * Update button styles to adapt to new icons * Fix #48 new set of icons for alignments * Variabilisation of icon bkgd colors Update of color choice to fit new icons design * Update canvas and rulers colors * Improve layer handle design * Modernize SVG Logo but keeping original spirit * Fix #48 continue improve icons * Continue to reorganise left panel * Update right panel handle for layers * Fix #48 new set of icons for main menu * Improve main menu design * Rework menu organisation * Rework menu organisation * Update input element design * New icons * Improve Zoom Module * Improve Color Picker Module * New icons * New icons * #65 restore the feature of start/end marker lines partially did * #64 The export dialog needs to include the quality options (except for PDF) * #39 opacity button/stroke size/radius button don’t allow the 0 value * #39 eslint changes * #69 menu button style overwrite * #65 restore the feature of start/end marker lines * #43 With a small window, the look of the top toolbar is broken * #43 tool top alignment revert * #46 Move this jQuery component to a web component for graduate and picker components * #46 Move this jQuery component to a web component * remove some non standard lint rules * #46 picker convert as pure javascript changes * #46 jquery plugin convert to pure javascript * #46 jquery plugin change to pure javascript * #46 jquery remove and convert to pure javascript * #46 slider issue fixed * #46 ColorValuePicker and js convertion * #46 globals $ remov from slider class * #46 jquery convert pure javascript changes * #46 jquery to js convertion changes * #46 paintbox and current element color set issue fixed * #46 unwanted files removed * #46 $.extend modify changes * #46 extend modifiey changes * #46 $.extend change to pure javascript * #46 extend and data changes * #46 jquery removed * #45 These buttons don't work and dropdown is broken * #45 These buttons don't work and dropdown is broken * #45 These buttons don't work and dropdown is broken commit reverted * #43 With a small window, the look of the top toolbar is broken * Update jQuery.jPicker.js * #76 draggable modification changes * #76 jquery-ui-1.8.17.custom.min.js removed from editor * #76 jquery ui file removed * npm update * #77 console issue fixed * #77 <SVG> button issue fixed * #77 shortkey issue fixed * #77 jquery hotkeys plugin changes * #77 hotkey plugin related changes * #78 hotkey related code comment. * #78 js-hotkeys/jquery.hotkeys.min.js file removed from svgedit.js * #51 Rewrite the color palette without elix * #81 unwanted files removed * #81 folder name renamed * #81 folder rename changes * #81 jquery-ui folder renamed * #81 jquery modify changes * #81 globals $ removed Co-authored-by: Agriya Dev5 <agriya.dev5@agriya.in> Co-authored-by: mathieucura <mathieu@optimistik.fr>
145 lines
4.0 KiB
JavaScript
145 lines
4.0 KiB
JavaScript
import {jGraduate} from './jgraduate/jQuery.jGraduate.js';
|
|
/**
|
|
*
|
|
*/
|
|
class PaintBox {
|
|
/**
|
|
* @param {string|Element|external:jQuery} container
|
|
* @param {"fill"} type
|
|
*/
|
|
constructor (container, type) {
|
|
// set up gradients to be used for the buttons
|
|
const svgdocbox = new DOMParser().parseFromString(
|
|
`<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14">
|
|
<rect
|
|
fill="#000000" opacity="1" width="14" height="14"/>
|
|
<defs><linearGradient id="gradbox_${PaintBox.ctr++}"/></defs>
|
|
</svg>`,
|
|
'text/xml'
|
|
);
|
|
|
|
let docElem = svgdocbox.documentElement;
|
|
docElem = document.importNode(docElem, true);
|
|
container.appendChild(docElem);
|
|
|
|
this.rect = docElem.firstElementChild;
|
|
this.defs = docElem.getElementsByTagName('defs')[0];
|
|
this.grad = this.defs.firstElementChild;
|
|
// this.paint = new $.jGraduate.Paint({solidColor: color});
|
|
this.type = type;
|
|
}
|
|
|
|
/**
|
|
* @param {module:jGraduate~Paint} paint
|
|
* @returns {void}
|
|
*/
|
|
setPaint (paint) {
|
|
this.paint = paint;
|
|
|
|
const ptype = paint.type;
|
|
const opac = paint.alpha / 100;
|
|
|
|
let fillAttr = 'none';
|
|
switch (ptype) {
|
|
case 'solidColor':
|
|
fillAttr = (paint[ptype] !== 'none') ? '#' + paint[ptype] : paint[ptype];
|
|
break;
|
|
case 'linearGradient':
|
|
case 'radialGradient': {
|
|
this.grad.remove();
|
|
this.grad = paint[ptype];
|
|
this.defs.appendChild(this.grad);
|
|
const id = this.grad.id = 'gradbox_' + this.type;
|
|
fillAttr = 'url(#' + id + ')';
|
|
break;
|
|
}
|
|
}
|
|
|
|
this.rect.setAttribute('fill', fillAttr);
|
|
this.rect.setAttribute('opacity', opac);
|
|
}
|
|
/**
|
|
* @param {PlainObject} svgCanvas
|
|
* @param {string} color
|
|
* @param {Float} opac
|
|
* @param {string} type
|
|
* @returns {module:jGraduate~Paint}
|
|
*/
|
|
static getPaint (svgCanvas, color, opac, type) {
|
|
// update the editor's fill paint
|
|
const opts = {alpha: opac};
|
|
if (color.startsWith('url(#')) {
|
|
let refElem = svgCanvas.getRefElem(color);
|
|
refElem = (refElem) ? refElem.cloneNode(true) : document.querySelectorAll('#' + type + '_color defs *')[0];
|
|
opts[refElem.tagName] = refElem;
|
|
} else if (color.startsWith('#')) {
|
|
opts.solidColor = color.substr(1);
|
|
} else {
|
|
opts.solidColor = 'none';
|
|
}
|
|
return new jGraduate.Paint(opts);
|
|
}
|
|
|
|
/**
|
|
* @param {PlainObject} svgcanvas
|
|
* @param {PlainObject} selectedElement
|
|
* @returns {any}
|
|
*/
|
|
update (svgcanvas, selectedElement) {
|
|
if (!selectedElement) { return null; }
|
|
|
|
const {type} = this;
|
|
switch (selectedElement.tagName) {
|
|
case 'use':
|
|
case 'image':
|
|
case 'foreignObject':
|
|
// These elements don't have fill or stroke, so don't change
|
|
// the current value
|
|
return null;
|
|
case 'g':
|
|
case 'a': {
|
|
const childs = selectedElement.getElementsByTagName('*');
|
|
|
|
let gPaint = null;
|
|
for (let i = 0, len = childs.length; i < len; i++) {
|
|
const elem = childs[i];
|
|
const p = elem.getAttribute(type);
|
|
if (i === 0) {
|
|
gPaint = p;
|
|
} else if (gPaint !== p) {
|
|
gPaint = null;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (gPaint === null) {
|
|
// No common color, don't update anything
|
|
this._paintColor = null;
|
|
return null;
|
|
}
|
|
this._paintColor = gPaint;
|
|
this._paintOpacity = 1;
|
|
break;
|
|
} default: {
|
|
this._paintOpacity = Number.parseFloat(selectedElement.getAttribute(type + '-opacity'));
|
|
if (Number.isNaN(this._paintOpacity)) {
|
|
this._paintOpacity = 1.0;
|
|
}
|
|
|
|
const defColor = type === 'fill' ? 'black' : 'none';
|
|
this._paintColor = selectedElement.getAttribute(type) || defColor;
|
|
}
|
|
}
|
|
|
|
this._paintOpacity *= 100;
|
|
|
|
const paint = PaintBox.getPaint(svgcanvas, this._paintColor, this._paintOpacity, type);
|
|
// update the rect inside #fill_color/#stroke_color
|
|
this.setPaint(paint);
|
|
return (paint);
|
|
}
|
|
}
|
|
PaintBox.ctr = 0;
|
|
|
|
export default PaintBox;
|