mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-10-01 02:35:48 -04:00
improved display in bw statistics
This commit is contained in:
parent
d73e850122
commit
eb30af57bd
@ -59,6 +59,7 @@ RSGraphSource::RSGraphSource()
|
||||
#endif
|
||||
_timer = new QTimer ;
|
||||
_digits = 2 ;
|
||||
_filtering_enabled = true;
|
||||
|
||||
QObject::connect(_timer,SIGNAL(timeout()),this,SLOT(updateIfPossible())) ;
|
||||
}
|
||||
@ -123,6 +124,9 @@ void RSGraphSource::getDataPoints(int index,std::vector<QPointF>& pts,float filt
|
||||
pts.clear() ;
|
||||
qint64 now = getTime() ;
|
||||
|
||||
if(!_filtering_enabled)
|
||||
filter_factor = 0 ;
|
||||
|
||||
std::map<std::string,std::list<std::pair<qint64,float> > >::const_iterator it = _points.begin();
|
||||
|
||||
int n=0;
|
||||
@ -267,11 +271,13 @@ RSGraphWidget::RSGraphWidget(QWidget *parent)
|
||||
_timer = new QTimer ;
|
||||
QObject::connect(_timer,SIGNAL(timeout()),this,SLOT(updateIfPossible())) ;
|
||||
|
||||
|
||||
_y_scale = 1.0f ;
|
||||
_timer->start(1000);
|
||||
|
||||
float FS = QFontMetricsF(font()).height();
|
||||
setMinimumHeight(12*FS);
|
||||
_graph_base = FS*GRAPH_BASE;
|
||||
}
|
||||
|
||||
void RSGraphWidget::updateIfPossible()
|
||||
@ -292,6 +298,12 @@ RSGraphWidget::~RSGraphWidget()
|
||||
delete _source ;
|
||||
}
|
||||
|
||||
void RSGraphWidget::setFiltering(bool b)
|
||||
{
|
||||
if(_source != NULL)
|
||||
_source->setFiltering(b) ;
|
||||
}
|
||||
|
||||
/** Gets the width of the desktop, which is the maximum number of points
|
||||
* we can plot in the graph. */
|
||||
int
|
||||
@ -465,13 +477,15 @@ void RSGraphWidget::pointsFromData(const std::vector<QPointF>& values,QVector<QP
|
||||
qreal px = x - (values[i].x()-last)*_time_scale ;
|
||||
qreal py = y - valueToPixels(values[i].y()) ;
|
||||
|
||||
if(!(_flags & RSGRAPH_FLAGS_PAINT_STYLE_DOTS))
|
||||
{
|
||||
if(px >= SCALE_WIDTH*fact && last_px < SCALE_WIDTH*fact)
|
||||
{
|
||||
float alpha = (SCALE_WIDTH*fact - last_px)/(px - last_px) ;
|
||||
float ipx = SCALE_WIDTH*fact ;
|
||||
float ipy = (1-alpha)*last_py + alpha*py ;
|
||||
|
||||
points << QPointF(ipx,y) ;
|
||||
points << QPointF(ipx,y - _graph_base) ;
|
||||
points << QPointF(ipx,ipy) ;
|
||||
}
|
||||
else if(i==0)
|
||||
@ -479,28 +493,27 @@ void RSGraphWidget::pointsFromData(const std::vector<QPointF>& values,QVector<QP
|
||||
if(px < SCALE_WIDTH*fact)
|
||||
points << QPointF(SCALE_WIDTH*fact,py) ;
|
||||
else
|
||||
points << QPointF(px,y) ;
|
||||
points << QPointF(px,y - _graph_base) ;
|
||||
}
|
||||
}
|
||||
|
||||
if(px < SCALE_WIDTH*fact)
|
||||
continue ;
|
||||
|
||||
if((_flags & RSGRAPH_FLAGS_PAINT_STYLE_DOTS) && values[i].y() == 0)
|
||||
continue ;
|
||||
|
||||
_maxValue = std::max(_maxValue,values[i].y()) ;
|
||||
|
||||
// remove midle point when 3 consecutive points have the same value.
|
||||
|
||||
if(!(_flags & RSGRAPH_FLAGS_PAINT_STYLE_DOTS))
|
||||
if(points.size() > 1 && points[points.size()-2].y() == points.back().y() && points.back().y() == py)
|
||||
points.pop_back() ;
|
||||
|
||||
// if(fabs(px - last_px)/_time_scale > min_x_no_data_threshold)
|
||||
// {
|
||||
// points << QPointF(last_px,y) ;
|
||||
// points << QPointF(px,y) ;
|
||||
// }
|
||||
|
||||
points << QPointF(px,py) ;
|
||||
|
||||
if(i==values.size()-1)
|
||||
if(!(_flags & RSGRAPH_FLAGS_PAINT_STYLE_DOTS) && (i==values.size()-1))
|
||||
points << QPointF(px,y) ;
|
||||
|
||||
last_px = px ;
|
||||
@ -512,17 +525,17 @@ void RSGraphWidget::pointsFromData(const std::vector<QPointF>& values,QVector<QP
|
||||
qreal RSGraphWidget::valueToPixels(qreal val)
|
||||
{
|
||||
if(_flags & RSGRAPH_FLAGS_LOG_SCALE_Y)
|
||||
return log(std::max((qreal)1.0,val))*_y_scale ;
|
||||
return _graph_base + log(std::max((qreal)1.0,val))*_y_scale ;
|
||||
else
|
||||
return val*_y_scale ;
|
||||
return _graph_base + val*_y_scale ;
|
||||
}
|
||||
|
||||
qreal RSGraphWidget::pixelsToValue(qreal val)
|
||||
{
|
||||
if(_flags & RSGRAPH_FLAGS_LOG_SCALE_Y)
|
||||
return exp(val / _y_scale) ;
|
||||
return exp( (val - _graph_base) / _y_scale) ;
|
||||
else
|
||||
return val/_y_scale ;
|
||||
return (val - _graph_base)/_y_scale ;
|
||||
}
|
||||
|
||||
/** Plots an integral using the data points in <b>points</b>. The area will be
|
||||
@ -560,7 +573,7 @@ void RSGraphWidget::paintDots(const QVector<QPointF>& points, QColor color)
|
||||
_painter->setBrush(QBrush(color));
|
||||
|
||||
for(int i=0;i<points.size();++i)
|
||||
_painter->drawEllipse(QRect(points[i].x(),points[i].y(),5*_linewidthscale,5*_linewidthscale)) ;
|
||||
_painter->drawEllipse(QRect(points[i].x()-2.5*_linewidthscale,points[i].y()-2.5*_linewidthscale,5*_linewidthscale,5*_linewidthscale)) ;
|
||||
|
||||
_painter->setPen(oldPen);
|
||||
_painter->setBrush(oldBrush);
|
||||
@ -603,8 +616,8 @@ void RSGraphWidget::paintScale1()
|
||||
float fact = FS/14.0 ;
|
||||
|
||||
int top = _rec.y();
|
||||
int bottom = _rec.height();
|
||||
qreal paintStep = (bottom - (bottom/10)) / 4;
|
||||
int bottom = _rec.height() - _graph_base;
|
||||
qreal paintStep = (bottom - top) / 5;
|
||||
|
||||
/* Draw the other marks in their correctly scaled locations */
|
||||
qreal scale;
|
||||
@ -615,16 +628,23 @@ void RSGraphWidget::paintScale1()
|
||||
|
||||
QString unit_name = _source->unitName() ;
|
||||
|
||||
for (int i = 1; i < 5; i++)
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
pos = bottom - (i * paintStep) ;
|
||||
|
||||
scale = pixelsToValue(i * paintStep);
|
||||
scale = pixelsToValue(_graph_base + i * paintStep);
|
||||
|
||||
// If legend contains integers only the value should be rounded to the nearest integer
|
||||
if(_flags & RSGRAPH_FLAGS_LEGEND_INTEGER)
|
||||
{
|
||||
scale = (int)scale ;
|
||||
pos = bottom - (valueToPixels(scale) - _graph_base) ;
|
||||
}
|
||||
|
||||
QString text = _source->displayValue(scale) ;
|
||||
|
||||
_painter->setPen(SCALE_COLOR);
|
||||
_painter->drawText(QPointF(5*fact, pos+0.5*FS), text);
|
||||
_painter->drawText(QPointF(5*fact, pos+0.4*FS), text);
|
||||
_painter->setPen(GRID_COLOR);
|
||||
_painter->drawLine(QPointF(SCALE_WIDTH*fact, pos), QPointF(_rec.width(), pos));
|
||||
}
|
||||
@ -710,7 +730,11 @@ void RSGraphWidget::paintLegend()
|
||||
QString text = _source->legend(i,vals[i]) ;
|
||||
|
||||
QPen oldPen = _painter->pen();
|
||||
_painter->setPen(QPen(getColor(i), Qt::SolidLine));
|
||||
|
||||
QPen pen(getColor(i), Qt::SolidLine) ;
|
||||
pen.setWidth(_linewidthscale);
|
||||
|
||||
_painter->setPen(pen);
|
||||
_painter->drawLine(QPointF(SCALE_WIDTH*fact+10.0*fact, pos+FS/3), QPointF(SCALE_WIDTH*fact+30.0*fact, pos+FS/3));
|
||||
_painter->setPen(oldPen);
|
||||
|
||||
|
@ -32,6 +32,7 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define GRAPH_BASE 2 /** Position of the 0 of the scale, in count of the text height */
|
||||
#define SCALE_WIDTH 75 /** Width of the scale */
|
||||
#define MINUSER_SCALE 2000 /** 2000 users is the minimum scale */
|
||||
#define SCROLL_STEP 4 /** Horizontal change on graph update */
|
||||
@ -87,6 +88,9 @@ public:
|
||||
// Sets the time period for collecting new values. Units=milliseconds.
|
||||
void setCollectionTimePeriod(qint64 msecs) ;
|
||||
|
||||
// Enables/disables time filtering of the data
|
||||
void setFiltering(bool b) { _filtering_enabled = b; }
|
||||
|
||||
void setDigits(int d) { _digits = d ;}
|
||||
|
||||
protected slots:
|
||||
@ -112,6 +116,7 @@ protected:
|
||||
qint64 _update_period_msecs ;
|
||||
qint64 _time_orig_msecs ;
|
||||
int _digits ;
|
||||
bool _filtering_enabled ;
|
||||
};
|
||||
|
||||
class RSGraphWidget: public QFrame
|
||||
@ -127,6 +132,7 @@ public:
|
||||
static const uint32_t RSGRAPH_FLAGS_PAINT_STYLE_FLAT = 0x0020 ;// do not interpolate, and draw flat colored boxes
|
||||
static const uint32_t RSGRAPH_FLAGS_LEGEND_CUMULATED = 0x0040 ;// show the total in the legend rather than current values
|
||||
static const uint32_t RSGRAPH_FLAGS_PAINT_STYLE_DOTS = 0x0080 ;// use dots
|
||||
static const uint32_t RSGRAPH_FLAGS_LEGEND_INTEGER = 0x0100 ;// use integer number in the legend, and move the lines to match integers
|
||||
|
||||
/** Bandwidth graph style. */
|
||||
enum GraphStyle
|
||||
@ -156,6 +162,8 @@ public:
|
||||
void setShowEntry(uint32_t entry, bool show) ;
|
||||
void setCurvesOpacity(float f) ;
|
||||
|
||||
void setFiltering(bool b) ;
|
||||
|
||||
void setFlags(uint32_t flag) { _flags |= flag ; }
|
||||
void resetFlags(uint32_t flag) { _flags &= ~flag ; }
|
||||
protected:
|
||||
@ -209,6 +217,7 @@ private:
|
||||
/** The maximum number of points to store. */
|
||||
qreal _y_scale ;
|
||||
qreal _opacity ;
|
||||
qreal _graph_base;
|
||||
|
||||
qreal pixelsToValue(qreal) ;
|
||||
qreal valueToPixels(qreal) ;
|
||||
|
@ -202,12 +202,16 @@ void BandwidthStatsWidget::updateUnitSelection(int n)
|
||||
{
|
||||
ui.bwgraph_BW->setUnit(BWGraphSource::UNIT_KILOBYTES) ;
|
||||
ui.bwgraph_BW->resetFlags(RSGraphWidget::RSGRAPH_FLAGS_PAINT_STYLE_DOTS);
|
||||
ui.bwgraph_BW->resetFlags(RSGraphWidget::RSGRAPH_FLAGS_LEGEND_INTEGER);
|
||||
ui.legend_CB->setItemText(1,tr("Average"));
|
||||
ui.bwgraph_BW->setFiltering(true) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
ui.bwgraph_BW->setUnit(BWGraphSource::UNIT_COUNT) ;
|
||||
ui.bwgraph_BW->setFlags(RSGraphWidget::RSGRAPH_FLAGS_PAINT_STYLE_DOTS);
|
||||
ui.bwgraph_BW->setFlags(RSGraphWidget::RSGRAPH_FLAGS_LEGEND_INTEGER);
|
||||
ui.bwgraph_BW->setFiltering(false) ;
|
||||
ui.legend_CB->setItemText(1,tr("Total"));
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user