Changeset 59ef71f1da184bd31fce88539fd66974f75dc406

Show
Ignore:
Timestamp:
03/18/09 01:16:05 (10 years ago)
Author:
Theo Schlossnagle <jesus@omniti.com>
git-committer:
Theo Schlossnagle <jesus@omniti.com> 1237338965 +0000
git-parent:

[48908b92c6a2da6bbeacfe24e28915422b16424d]

git-author:
Theo Schlossnagle <jesus@omniti.com> 1237338965 +0000
Message:

first step (multi-item return set for nearest datapoints, refs #108

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • ui/web/htdocs/css/style.css

    r7fa19b3 r59ef71f  
    594594background:white none repeat scroll 0 0; 
    595595border:1px solid #333; 
     596padding:0; 
     597} 
     598div.tooltip div { 
     599border:0; 
    596600padding:0 3px; 
    597601} 
  • ui/web/htdocs/js/jquery.flot.js

    r09ae4af r59ef71f  
    130130            series = parseData(d); 
    131131 
     132            //      interpolateData(series); 
     133 
    132134            fillInSeriesOptions(); 
    133135            processData(); 
    134136        } 
    135          
     137 
     138        function interpolateData(series){ 
     139 
     140            for (var i = 1; i < series.length; i++) { 
     141                var data = series[i].data; 
     142                var bdata = series[i-1].data; 
     143                console.log(bdata.length); 
     144                console.log(data.length); 
     145                for (var j = 0; j < bdata.length; j++) { 
     146 
     147                    match = binary_search(data, bdata[j][0], bdata.length, 0); 
     148                    // if(match.index>=0) console.log("found ", bdata[j][0]-3, " at ",match.index,"! see: ",data[match.index][0]); 
     149                    //              if( tindex != -1) data[tindex][1] += bdata[j][1]; 
     150                    //              interpolate 
     151                    //              else data.splice(i_top.below +1, 0, interpolate(data[i_top.below], data[i_top.below+1], bdata[j][0])); 
     152                } 
     153            } 
     154        } 
     155        //returns the index the item was found at, or the index below it that is closest, or -1 if it is lower than anything else 
     156        function binary_search(a, v, high, low) { 
     157 
     158            if(high <= low) { var r = { found: false, index: low-1}; return r;} 
     159 
     160            middle = parseInt(((high-low)/2)) + low; 
     161 
     162            if(middle>=a.length) console.log("high = ", high," low = ",low); 
     163 
     164            if(a[middle][0] > v) return binary_search(a, v, middle-1, low); 
     165            else if(a[middle][0] < v) return binary_search(a, v, high, middle+1); 
     166            else { var r =  { found: true, index: middle}; return r;} 
     167        } 
     168 
     169        function interpolate(p1, p2, t) { 
     170            dx = p2[0] - p1[0]; dy = p2[1] - p1[1]; 
     171            return (dy/dx)*(t-p1[0]) + p1[1]; 
     172        } 
     173         
     174 
    136175        function parseData(d) { 
    137176            var res = []; 
     
    15521591        // Returns the data item the mouse is over, or null if none is found 
    15531592        function findNearbyItem(mouseX, mouseY) { 
     1593            var items = [] 
    15541594            var maxDistance = options.grid.mouseActiveRadius, 
    1555                 lowestDistance = maxDistance * maxDistance + 1, 
    15561595                item = null, foundPoint = false; 
    15571596 
     
    15671606                    axisx = series[i].xaxis, 
    15681607                    axisy = series[i].yaxis, 
     1608                    lowestDistance = maxDistance * maxDistance + 1, 
    15691609                 
    15701610                    // precompute some stuff to make the loop faster 
     
    16131653                    } 
    16141654                } 
    1615             } 
    1616  
    1617             return item; 
     1655                if(item) items.push(item); 
     1656                item = null; 
     1657            } 
     1658 
     1659            return items; 
    16181660        } 
    16191661 
     
    16931735                pos.y2 = axes.y2axis.c2p(canvasY); 
    16941736 
    1695             var item = findNearbyItem(canvasX, canvasY); 
    1696  
    1697             if (item) { 
     1737            var items = findNearbyItem(canvasX, canvasY); 
     1738 
     1739            for(var i=0; i<items.length; i++) { 
    16981740                // fill in mouse pos for any listeners out there 
    1699                 item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left); 
    1700                 item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top); 
     1741                items[i].pageX = parseInt(items[i].series.xaxis.p2c(items[i].datapoint[0]) + offset.left + plotOffset.left); 
     1742                items[i].pageY = parseInt(items[i].series.yaxis.p2c(items[i].datapoint[1]) + offset.top + plotOffset.top); 
    17011743 
    17021744                     
     
    17061748                for (var i = 0; i < highlights.length; ++i) { 
    17071749                    var h = highlights[i]; 
    1708                     if (h.auto && 
    1709                         !(item && h.series == item.series && h.point == item.datapoint)) 
    1710                         unhighlight(h.series, h.point); 
    1711                 } 
    1712                  
    1713                 if (item) 
    1714                     highlight(item.series, item.datapoint, true); 
    1715             } 
    1716              
    1717             target.trigger(eventname, [ pos, item ]); 
     1750                    if (h.auto) { 
     1751                        var found = 0; 
     1752                        for(var j = 0; j < items.length; j++) 
     1753                            if(items[j] && h.series == items[j].series && h.point == items[j].datapoint) 
     1754                                found++; 
     1755                        if(found == 0) unhighlight(h.series, h.point); 
     1756                    } 
     1757                } 
     1758                 
     1759                for(var i = 0; i < items.length; i++) 
     1760                    highlight(items[i].series, items[i].datapoint, true); 
     1761            } 
     1762             
     1763            target.trigger(eventname, [ pos, items ]); 
    17181764        } 
    17191765 
  • ui/web/htdocs/js/recon.js

    rfe6bcca r59ef71f  
    313313 
    314314          var plot = this.flot_plot = $.plot(placeholder, r.data, r.options); 
    315           var hovering; 
    316           placeholder.bind("plothover", function (event, pos, item) { 
    317             if(hovering) plot.unhighlight(hovering.series, hovering.datapoint); 
    318             if(item && (item.datapoint[1] != "" || item.datapoint[2] != null)) { 
     315          var hoverings = []; 
     316          placeholder.bind("plothover", function (event, pos, items) { 
     317            for(var h=0; h<hoverings.length; h++) 
     318              plot.unhighlight(hoverings[h].series, hoverings[h].datapoint); 
     319            hoverings = []; 
     320            if(items && items.length) { 
    319321              // Emulate opacity on white 
    320               var soft = 'rgb(' + 
    321                          (item.series.color.match(/\((.+)\)/))[1] 
    322                                            .split(',') 
    323                                            .map(function(a) { 
    324                                              return Math.round(255-(255-a)*0.1); 
    325                                            }) 
    326                                            .join(',') + 
    327                          ')'; 
    328322              if(! $("div.tooltip")[0]) 
    329323                $('<div class="tooltip"></div>').appendTo($('body')); 
    330324              $("div.tooltip") 
    331                 .html((item.datapoint[2] ? item.datapoint[2] : item.datapoint[1]) + " (" + item.series.label + ")") 
    332                 .css( { top: item.pageY - 15, 
    333                         left: item.pageX + 10, 
    334                         border: '1px solid ' + item.series.color, 
    335                         backgroundColor: soft, 
     325                .css( { top: items[0].pageY - 15, 
     326                        left: items[0].pageX + 10, 
    336327                        position: 'absolute', 
    337                         'z-index': 4000 }); 
    338               hovering = item; 
    339               plot.highlight(item.series, item.datapoint); 
     328                        'z-index': 4000 }) 
     329                .html(''); 
     330              for(var i = 0; i < items.length; i++) { 
     331                var soft = 
     332                  'rgb(' + 
     333                  (items[i].series.color.match(/\((.+)\)/))[1] 
     334                                        .split(',') 
     335                                        .map(function(a) { 
     336                                           return Math.round(255-(255-a)*0.1); 
     337                                        }) 
     338                                        .join(',') + 
     339                  ')'; 
     340                var tt = $('<div><div/>') 
     341                  .html((items[i].datapoint[2] ? items[i].datapoint[2] : items[i].datapoint[1]) + " (" + items[i].series.label + ")") 
     342                  .css( { backgroundColor: soft }); 
     343                tt.appendTo($("div.tooltip")); 
     344                hoverings.push(items[i]); 
     345                plot.highlight(items[i].series, items[i].datapoint); 
     346              } 
    340347              return true; 
    341348            }