diff --git a/editor/svg-editor.js b/editor/svg-editor.js index 96e5ee0a..967a36c3 100644 --- a/editor/svg-editor.js +++ b/editor/svg-editor.js @@ -382,12 +382,23 @@ function svg_edit_setup() { } var extAdded = function(window, ext) { + + var cb_called = false; + + var runCallback = function() { + if(ext.callback && !cb_called) { + cb_called = true; + ext.callback(); + } + } + if(ext.buttons) { var fallback_obj = {}, placement_obj = {}, svgicons = ext.svgicons; var holders = {}; + // Add buttons given by extension $.each(ext.buttons, function(i, btn) { @@ -514,32 +525,70 @@ function svg_edit_setup() { setIconSize('m'); setIconSize(old); } + runCallback(); } }); } - if(ext.context_panels) { - $.each(ext.context_panels, function(i, panel) { - // Add select panel + if(ext.context_tools) { + $.each(ext.context_tools, function(i, tool) { + // Add select tool + var cont_id = tool.container_id?(' id="' + tool.container_id + '"'):""; - // TODO: Allow support for other types, or adding to existing panel - if(panel.type == "select") { - var html = '
"; - // Creates the panel, hides & adds it, returns the select element - var sel = $(html).hide().appendTo("#tools_top").find("select"); - $.each(panel.events, function(evt, func) { - $(sel).bind(evt, func); - }); + var panel = $('#' + tool.panel); + + if(!panel.length) { + panel = $('
', {id: tool.panel}).appendTo("#tools_top"); } + // TODO: Allow support for other types, or adding to existing tool + switch (tool.type) { + case 'select': + var html = '' + + '"; + // Creates the tool, hides & adds it, returns the select element + var sel = $(html).appendTo(panel).find('select'); + + $.each(tool.events, function(evt, func) { + $(sel).bind(evt, func); + }); + break; + + case 'input': + var html = '' + + '' + + tool.label + ':' + + '' + + // Creates the tool, hides & adds it, returns the select element + + // Add to given tool.panel + var inp = $(html).appendTo(panel).find('input'); + + if(tool.spindata) { + inp.SpinButton(tool.spindata); + } + + if(tool.events) { + $.each(tool.events, function(evt, func) { + $(sel).bind(evt, func); + }); + } + break; + + default: + break; + } }); } + + runCallback(); }; var getPaint = function(color, opac) { diff --git a/editor/svgcanvas.js b/editor/svgcanvas.js index 3516de41..32f13df3 100644 --- a/editor/svgcanvas.js +++ b/editor/svgcanvas.js @@ -6541,6 +6541,9 @@ function BatchCommand(text) { // selector if the element is in that array if ($.inArray(elem, selectedElements) != -1) { setTimeout(function() { + // Due to element replacement, this element may no longer + // be part of the DOM + if(!elem.parentNode) return; selectorManager.requestSelector(elem).resize(); },0); } diff --git a/extensions/ext-arrows.js b/extensions/ext-arrows.js index 97e7ea1b..8d3c6f48 100644 --- a/extensions/ext-arrows.js +++ b/extensions/ext-arrows.js @@ -135,10 +135,11 @@ $(function() { return { name: "Arrows", - context_panels: [{ + context_tools: [{ type: "select", - id: "arrow_panel", - list_id: "arrow_list", + panel: "arrow_panel", + title: "Select arrow type", + id: "arrow_list", options: { none: "No arrow", end: "---->", @@ -147,11 +148,14 @@ $(function() { mid: "-->--", mid_bk: "--<--" }, - defopt: "none", + defval: "none", events: { change: setArrow } }], + callback: function() { + $('#arrow_panel').hide(); + }, addLangData: function(lang) { return { data: lang_list[lang] diff --git a/extensions/ext-connector.js b/extensions/ext-connector.js index 7c90e3c4..a0e050e7 100644 --- a/extensions/ext-connector.js +++ b/extensions/ext-connector.js @@ -473,6 +473,7 @@ $(function() { se_ns = svgCanvas.getEditorNS(true); cur_line.setAttributeNS(se_ns, "se:connector", conn_str); cur_line.setAttribute('class', conn_sel.substr(1)); + cur_line.setAttribute('opacity', 1); svgCanvas.addToSelection([cur_line]); svgCanvas.moveToBottomSelectedElement(); selManager.requestSelector(cur_line).showGrips(false); @@ -522,11 +523,40 @@ $(function() { elem.getAttribute("marker-end") )) { var start = elem.getAttribute("marker-start"); + var mid = elem.getAttribute("marker-mid"); var end = elem.getAttribute("marker-end"); cur_line = elem; $(elem) .data("start_off", !!start) .data("end_off", !!end); + + if(elem.tagName == "line" && mid) { + // Convert to polyline to accept mid-arrow + + var x1 = elem.getAttribute('x1')-0; + var x2 = elem.getAttribute('x2')-0; + var y1 = elem.getAttribute('y1')-0; + var y2 = elem.getAttribute('y2')-0; + var id = elem.id; + + var mid_pt = (' '+((x1+x2)/2)+','+((y1+y2)/2) + ' '); + var pline = addElem({ + "element": "polyline", + "attr": { + "points": (x1+','+y1+ mid_pt +x2+','+y2), + "stroke": elem.getAttribute('stroke'), + "stroke-width": elem.getAttribute('stroke-width'), + "marker-mid": mid, + "fill": "none", + "opacity": elem.getAttribute('opacity') || 1 + } + }); + $(elem).after(pline).remove(); + svgCanvas.clearSelection(); + pline.id = id; + svgCanvas.addToSelection([pline]); + } + } updateConnectors(); },