2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 10:46:53 +00:00

svg.js: fix copy&paste, switch from cookie to indexedDB

git-svn-id: https://svn.fhem.de/fhem/trunk@8879 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2015-07-03 16:53:17 +00:00
parent 5133e6a3e8
commit 5c83f2247a
3 changed files with 48 additions and 54 deletions

View File

@ -1591,7 +1591,7 @@ SVG_render($$$$$$$$$$)
$hmin{x1y1}=$hmin{x1y2}, $hmax{x1y1}=$hmax{x1y2} if(!defined($hmin{x1y1}));
$hmin{x1y2}=$hmin{x1y1}, $hmax{x1y2}=$hmax{x1y1} if(!defined($hmin{x1y2}));
my (%hstep,%htics,%axdrawn);
my (%hstep,%htics);
#-- yrange handling for axes x1y1..x1y8
for my $idx (0..7) {
@ -1615,16 +1615,15 @@ SVG_render($$$$$$$$$$)
$htics{$a} = defined($conf{$yt}) ? $conf{$yt} : "";
#-- Round values, compute a nice step
($hstep{$a}, $hmin{$a}, $hmax{$a}) = SVG_getSteps($conf{$yra},$hmin{$a},$hmax{$a});
$axdrawn{$a} = 0;
($hstep{$a}, $hmin{$a}, $hmax{$a}) =
SVG_getSteps($conf{$yra},$hmin{$a},$hmax{$a});
#Log3 $name, 2, "Axis $a has interval [$hmin{$a},$hmax{$a}], step $hstep{$a}, tics $htics{$a}\n";
#Log3 $name, 2, "Axis $a has interval [$hmin{$a},$hmax{$a}],
# step $hstep{$a}, tics $htics{$a}\n";
}
#-- run through all axes for drawing (each only once !)
foreach my $a (sort keys %hmin) {
next if( $axdrawn{$a} );
$axdrawn{$a}=1;
next if(!defined($hmin{$a})); # Bogus case

View File

@ -78,7 +78,7 @@ span.sort-item-delete-link {
pre { white-space: pre-wrap; }
svg { height:32px; width:32px; vertical-align:middle; margin:2px 0; }
svg:not([fill]) { fill:#278727; }
svg:not([fill]):not(.jssvg) { fill:#278727; }
svg.on,svg.FS20_on { fill:orange; }

View File

@ -1,56 +1,44 @@
"use strict";
var svgNS = "http://www.w3.org/2000/svg";
var svg_b64 ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var svg_initialized={}, lastHidden;
var svg_db, svg_dbtbl = "SVG_KEYVALUE", svg_pastedata;
// Base64 encode the xy points (12 bit x, 12 bit y).
function
svg_compressPoints(pointList)
svg_initDb(nextFn)
{
var i, x, y, lx = -1, ly, ret = "";
var pl_arr = pointList.replace(/^ */,'').split(/[, ]/);
for(i = 0; i < pl_arr.length; i +=2) {
x = parseInt(pl_arr[i]);
y = parseInt(pl_arr[i+1]);
if(pl_arr.length > 500 && lx != -1 && x-lx < 2) // Filter the data.
continue;
ret = ret+
svg_b64.charAt((x&0xfc0)>>6)+
svg_b64.charAt((x&0x3f))+
svg_b64.charAt((y&0xfc0)>>6)+
svg_b64.charAt((y&0x3f));
lx = x; ly = y;
}
return ret;
if(window.indexedDB == undefined)
return;
var dbreq = indexedDB.open("FHEM", 1)
dbreq.onsuccess = function(op) { svg_db = op.target.result; nextFn() }
dbreq.onerror = function(op) { log("indexedDB.open Error: " + op.message); }
dbreq.onupgradeneeded = function(op) {
svg_db = op.target.result;
svg_db.createObjectStore(svg_dbtbl, { keyPath:"key" });
};
}
function
svg_uncompressPoints(cmpData)
svg_save(key, value)
{
var i = 0, ret = "";
while(i < cmpData.length) {
var x = (svg_b64.indexOf(cmpData.charAt(i++))<<6)+
svg_b64.indexOf(cmpData.charAt(i++));
var y = (svg_b64.indexOf(cmpData.charAt(i++))<<6)+
svg_b64.indexOf(cmpData.charAt(i++));
ret += " "+x+","+y;
}
return ret;
if(!svg_db)
return;
var os = svg_db.transaction([svg_dbtbl],"readwrite")
.objectStore(svg_dbtbl);
os.put({key:key, val:value});
}
function
svg_getcookie()
svg_load(key, nextFn)
{
var c = document.cookie;
if(c == null)
return [];
var results = c.match('fhemweb=(.*?)(;|$)' );
return (results ? unescape(results[1]).split(":") : []);
if(!svg_db)
return;
var req = svg_db.transaction([svg_dbtbl],"readonly")
.objectStore(svg_dbtbl)
.get(key);
req.onsuccess = function(e) { if(req.result) nextFn(req.result.val); }
}
function
svg_prepareHash(el)
{
@ -83,7 +71,6 @@ sv_menu(evt, embed)
var svg = $(label).closest("svg");
var svgNode = $(svg).get(0);
var lid = $(label).attr("line_id");
var data = svg_getcookie();
var sel = $(svg).find("#"+lid);
var selNode = $(sel).get(0);
var tl = $(svg).find("#svg_title");
@ -112,7 +99,7 @@ sv_menu(evt, embed)
"Hide other lines",
"Show all lines",
selNode.showVal ? "Stop displaying values" : "Display plot values" ],
[undefined, data.length==0,
[undefined, svg_pastedata == undefined,
!selNode.isHidden && (lines.length - hidden.length) == 1,
!selNode.isHidden && (lines.length - hidden.length) == 1,
hidden.length==0,
@ -121,21 +108,26 @@ sv_menu(evt, embed)
//////////////////////////////////// copy
if(arg == 0) {
document.cookie="fhemweb="+
$(sel).attr("y_min")+":"+$(sel).attr("y_mul")+":"+
svg_compressPoints($(sel).attr(pn));
svg_pastedata = {
key:"svg_pastedata",
tag:sn, attr:pn,
y_min:$(sel).attr("y_min"),
y_mul:$(sel).attr("y_mul"),
datapoints:$(sel).attr(pn)
};
svg_save("svg_pastedata", svg_pastedata);
}
//////////////////////////////////// paste
if(arg == 1) {
var doc = $(svg).get(0).ownerDocument;
var o=doc.createElementNS(svgNS, "polyline");
o.setAttribute("class", "pasted");
o.setAttribute(pn, svg_uncompressPoints(data[2]));
var o=doc.createElementNS(svgNS, svg_pastedata.tag);
o.setAttribute("class", "SVGplot pasted");
o.setAttribute(svg_pastedata.attr, svg_pastedata.datapoints);
var h = parseFloat($(sel).attr("y_h"));
var ny_mul = parseFloat(data[1]);
var ny_min = parseInt(data[0]);
var ny_mul = parseFloat(svg_pastedata.y_mul);
var ny_min = parseInt(svg_pastedata.y_min);
var y_mul = parseFloat($(sel).attr("y_mul"));
var y_min = parseInt($(sel).attr("y_min"));
var tr =
@ -331,6 +323,9 @@ svg_init(par) // also called directly from perl, in race condition
$(document).ready(function(){
svg_init(); // <embed><svg>
svg_initDb(function(){
svg_load("svg_pastedata", function(val) {svg_pastedata = val} );
});
$("svg[id]").each(function(){ // <svg> (direct)
if($(this).attr("id").indexOf("SVGPLOT") == 0)
svg_init_one(undefined, this);