diff --git a/retroshare-gui/src/RetroShare.pro b/retroshare-gui/src/RetroShare.pro index 4ce32b86b..5329aaa3f 100644 --- a/retroshare-gui/src/RetroShare.pro +++ b/retroshare-gui/src/RetroShare.pro @@ -199,6 +199,7 @@ HEADERS += rshare.h \ gui/MainWindow.h \ gui/RSHumanReadableDelegate.h \ gui/TurtleRouterDialog.h \ + gui/TurtleRouterStatistics.h \ gui/AboutDialog.h \ gui/ForumsDialog.h \ gui/forums/ForumDetails.h \ @@ -351,6 +352,7 @@ FORMS += gui/StartDialog.ui \ gui/ForumsDialog.ui \ gui/MainWindow.ui \ gui/TurtleRouterDialog.ui \ + gui/TurtleRouterStatistics.ui \ gui/forums/CreateForum.ui \ gui/forums/CreateForumMsg.ui \ gui/forums/ForumDetails.ui \ @@ -433,6 +435,7 @@ SOURCES += main.cpp \ gui/graphframe.cpp \ gui/mainpagestack.cpp \ gui/TurtleRouterDialog.cpp \ + gui/TurtleRouterStatistics.cpp \ gui/MainWindow.cpp \ gui/ForumsDialog.cpp \ gui/forums/ForumDetails.cpp \ diff --git a/retroshare-gui/src/gui/TransfersDialog.cpp b/retroshare-gui/src/gui/TransfersDialog.cpp index 1d6bb5010..6da6685bf 100644 --- a/retroshare-gui/src/gui/TransfersDialog.cpp +++ b/retroshare-gui/src/gui/TransfersDialog.cpp @@ -40,6 +40,7 @@ #include "ULListDelegate.h" #include "FileTransferInfoWidget.h" #include "TurtleRouterDialog.h" +#include "TurtleRouterStatistics.h" #include "xprogressbar.h" #include "settings/rsharesettings.h" @@ -262,7 +263,10 @@ TransfersDialog::TransfersDialog(QWidget *parent) QObject::connect(ui.downloadList->selectionModel(),SIGNAL(selectionChanged (const QItemSelection&, const QItemSelection&)),this,SLOT(showFileDetails())) ; - ui.tabWidget->addTab( new TurtleRouterDialog(), tr("Tunneling")) ; + ui.tabWidget->addTab( new TurtleRouterStatistics(), tr("Router Statistics")) ; + + ui.tabWidget->addTab( new TurtleRouterDialog(), tr("Router Requests")) ; + // TurtleRouterDialog *trdl = new TurtleRouterDialog(); // ui.tunnelInfoWidget->setWidget(trdl); diff --git a/retroshare-gui/src/gui/TurtleRouterDialog.cpp b/retroshare-gui/src/gui/TurtleRouterDialog.cpp index b1a337757..87eafeba7 100644 --- a/retroshare-gui/src/gui/TurtleRouterDialog.cpp +++ b/retroshare-gui/src/gui/TurtleRouterDialog.cpp @@ -11,127 +11,6 @@ static const int MAX_TUNNEL_REQUESTS_DISPLAY = 10 ; -class TRHistogram -{ - public: - TRHistogram(const std::vector& info) :_infos(info) {} - - QColor colorScale(float f) - { - if(f == 0) - return QColor::fromHsv(0,0,192) ; - else - return QColor::fromHsv((int)((1.0-f)*280),200,255) ; - } - - virtual void draw(QPainter *painter,int& ox,int& oy,const QString& title) - { - static const int MaxTime = 61 ; - static const int MaxDepth = 8 ; - static const int cellx = 7 ; - static const int celly = 12 ; - - int save_ox = ox ; - painter->setPen(QColor::fromRgb(0,0,0)) ; - painter->drawText(2+ox,celly+oy,title) ; - oy+=2+2*celly ; - - if(_infos.empty()) - return ; - - ox += 10 ; - std::map > hits ; - std::map > depths ; - std::map >::iterator it ; - - int max_hits = 1; - int max_depth = 1; - - for(uint32_t i=0;i<_infos.size();++i) - { - std::vector& h(hits[_infos[i].source_peer_id]) ; - std::vector& g(depths[_infos[i].source_peer_id]) ; - - if(h.size() <= _infos[i].age) - h.resize(MaxTime,0) ; - - if(g.empty()) - g.resize(MaxDepth,0) ; - - if(_infos[i].age < h.size()) - { - h[_infos[i].age]++ ; - if(h[_infos[i].age] > max_hits) - max_hits = h[_infos[i].age] ; - } - if(_infos[i].depth < g.size()) - { - g[_infos[i].depth]++ ; - - if(g[_infos[i].depth] > max_depth) - max_depth = g[_infos[i].depth] ; - } - } - - int p=0 ; - - for(it=depths.begin();it!=depths.end();++it,++p) - for(int i=0;ifillRect(ox+MaxTime*cellx+20+i*cellx,oy+p*celly,cellx,celly,colorScale(it->second[i]/(float)max_depth)) ; - - painter->setPen(QColor::fromRgb(0,0,0)) ; - painter->drawRect(ox+MaxTime*cellx+20,oy,MaxDepth*cellx,p*celly) ; - - for(int i=0;idrawText(ox+i*cellx,oy+(p+1)*celly+4,QString::number(i)) ; - - p=0 ; - for(it=hits.begin();it!=hits.end();++it,++p) - { - int total = 0 ; - - for(int i=0;ifillRect(ox+i*cellx,oy+p*celly,cellx,celly,colorScale(it->second[i]/(float)max_hits)) ; - total += it->second[i] ; - } - - painter->setPen(QColor::fromRgb(0,0,0)) ; - painter->drawText(ox+MaxDepth*cellx+30+(MaxTime+1)*cellx,oy+(p+1)*celly,TurtleRouterDialog::getPeerName(it->first)) ; - painter->drawText(ox+MaxDepth*cellx+30+(MaxTime+1)*cellx+120,oy+(p+1)*celly,"("+QString::number(total)+")") ; - } - - painter->drawRect(ox,oy,MaxTime*cellx,p*celly) ; - - for(int i=0;idrawText(ox+i*cellx,oy+(p+1)*celly+4,QString::number(i)) ; - for(int i=0;idrawText(ox+MaxTime*cellx+20+i*cellx,oy+(p+1)*celly+4,QString::number(i)) ; - - oy += (p+1)*celly+4 ; - - painter->drawText(ox,oy+celly,QObject::tr("(Age in seconds)")); - painter->drawText(ox+MaxTime*cellx+20,oy+celly,QObject::tr("(Depth)")); - oy += 3*celly ; - - // now, draw a scale - - for(int i=0;i<=10;++i) - { - painter->fillRect(ox+i*(cellx+20),oy,cellx,celly,colorScale(i/10.0f)) ; - painter->setPen(QColor::fromRgb(0,0,0)) ; - painter->drawRect(ox+i*(cellx+20),oy,cellx,celly) ; - painter->drawText(ox+i*(cellx+20)+cellx+4,oy+celly,QString::number((int)(max_hits*i/10.0))) ; - } - - oy += celly*2 ; - - ox = save_ox ; - } - - private: - const std::vector& _infos ; -}; TurtleRouterDialog::TurtleRouterDialog(QWidget *parent) : RsAutoUpdatePage(2000,parent) @@ -157,14 +36,6 @@ TurtleRouterDialog::TurtleRouterDialog(QWidget *parent) top_level_hashes.clear() ; - _tunnel_statistics_F->setWidget( _tst_CW = new TurtleRouterStatisticsWidget() ) ; - _tunnel_statistics_F->setWidgetResizable(true); - _tunnel_statistics_F->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - _tunnel_statistics_F->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); - _tunnel_statistics_F->viewport()->setBackgroundRole(QPalette::NoRole); - _tunnel_statistics_F->setFrameStyle(QFrame::NoFrame); - _tunnel_statistics_F->setFocusPolicy(Qt::NoFocus); - // load settings processSettings(true); } @@ -186,12 +57,12 @@ void TurtleRouterDialog::processSettings(bool bLoad) // load settings // state of splitter - splitter->restoreState(Settings->value("Splitter").toByteArray()); + //splitter->restoreState(Settings->value("Splitter").toByteArray()); } else { // save settings // state of splitter - Settings->setValue("Splitter", splitter->saveState()); + //Settings->setValue("Splitter", splitter->saveState()); } @@ -212,8 +83,8 @@ void TurtleRouterDialog::updateDisplay() rsTurtle->getInfo(hashes_info,tunnels_info,search_reqs_info,tunnel_reqs_info) ; updateTunnelRequests(hashes_info,tunnels_info,search_reqs_info,tunnel_reqs_info) ; - _tst_CW->updateTunnelStatistics(hashes_info,tunnels_info,search_reqs_info,tunnel_reqs_info) ; - _tst_CW->update(); + //_tst_CW->updateTunnelStatistics(hashes_info,tunnels_info,search_reqs_info,tunnel_reqs_info) ; + //_tst_CW->update(); } QString TurtleRouterDialog::getPeerName(const std::string& peer_id) @@ -348,88 +219,4 @@ QTreeWidgetItem *TurtleRouterDialog::findParentHashItem(const std::string& hash) return items.front() ; } -TurtleRouterStatisticsWidget::TurtleRouterStatisticsWidget(QWidget *parent) - : QWidget(parent) -{ - maxWidth = 200 ; - maxHeight = 0 ; -} - -void TurtleRouterStatisticsWidget::updateTunnelStatistics(const std::vector >& hashes_info, - const std::vector >& tunnels_info, - const std::vector& search_reqs_info, - const std::vector& tunnel_reqs_info) - -{ - static const int cellx = 6 ; - static const int celly = 10+4 ; - - QPixmap tmppixmap(maxWidth, maxHeight); - tmppixmap.fill(this, 0, 0); - setFixedHeight(maxHeight); - - QPainter painter(&tmppixmap); - painter.initFrom(this); - - maxHeight = 500 ; - - // std::cerr << "Drawing into pixmap of size " << maxWidth << "x" << maxHeight << std::endl; - // draw... - int ox=5,oy=5 ; - - TRHistogram(search_reqs_info).draw(&painter,ox,oy,QObject::tr("Search requests repartition:")) ; - - painter.setPen(QColor::fromRgb(70,70,70)) ; - painter.drawLine(0,oy,maxWidth,oy) ; - oy += celly ; - - TRHistogram(tunnel_reqs_info).draw(&painter,ox,oy,QObject::tr("Tunnel requests repartition:")) ; - - // now give information about turtle traffic. - // - TurtleTrafficStatisticsInfo info ; - rsTurtle->getTrafficStatistics(info) ; - - painter.setPen(QColor::fromRgb(70,70,70)) ; - painter.drawLine(0,oy,maxWidth,oy) ; - oy += celly ; - - painter.drawText(ox,oy+celly,tr("Turtle router traffic:")) ; oy += celly*2 ; - painter.drawText(ox+2*cellx,oy+celly,tr("Tunnel requests Up")+"\t: " + speedString(info.tr_up_Bps) ) ; oy += celly ; - painter.drawText(ox+2*cellx,oy+celly,tr("Tunnel requests Dn")+"\t: " + speedString(info.tr_dn_Bps) ) ; oy += celly ; - painter.drawText(ox+2*cellx,oy+celly,tr("Incoming file data")+"\t: " + speedString(info.data_dn_Bps) ) ; oy += celly ; - painter.drawText(ox+2*cellx,oy+celly,tr("Outgoing file data")+"\t: " + speedString(info.data_up_Bps) ) ; oy += celly ; - painter.drawText(ox+2*cellx,oy+celly,tr("Forwarded data ")+"\t: " + speedString(info.unknown_updn_Bps) ) ; oy += celly ; - - // update the pixmap - // - pixmap = tmppixmap; - maxHeight = oy ; -} - -QString TurtleRouterStatisticsWidget::speedString(float f) -{ - if(f < 1.0f) - return QString("0 B/s") ; - if(f < 1024.0f) - return QString::number((int)f)+" B/s" ; - - return QString::number(f/1024.0,'f',2) + " KB/s"; -} - -void TurtleRouterStatisticsWidget::paintEvent(QPaintEvent *event) -{ - QStylePainter(this).drawPixmap(0, 0, pixmap); -} - -void TurtleRouterStatisticsWidget::resizeEvent(QResizeEvent *event) -{ - QRect TaskGraphRect = geometry(); - maxWidth = TaskGraphRect.width(); - maxHeight = TaskGraphRect.height() ; - - QWidget::resizeEvent(event); - update(); -} - diff --git a/retroshare-gui/src/gui/TurtleRouterDialog.h b/retroshare-gui/src/gui/TurtleRouterDialog.h index e1c32e62f..64e667433 100644 --- a/retroshare-gui/src/gui/TurtleRouterDialog.h +++ b/retroshare-gui/src/gui/TurtleRouterDialog.h @@ -5,7 +5,6 @@ #include "ui_TurtleRouterDialog.h" #include "RsAutoUpdatePage.h" -class TurtleRouterStatisticsWidget ; class TurtleRouterDialog: public RsAutoUpdatePage, public Ui::TurtleRouterDialogForm { @@ -33,26 +32,8 @@ class TurtleRouterDialog: public RsAutoUpdatePage, public Ui::TurtleRouterDialog QTreeWidgetItem *top_level_s_requests ; QTreeWidgetItem *top_level_t_requests ; - TurtleRouterStatisticsWidget *_tst_CW ; + //TurtleRouterStatisticsWidget *_tst_CW ; } ; -class TurtleRouterStatisticsWidget: public QWidget -{ - public: - TurtleRouterStatisticsWidget(QWidget *parent = NULL) ; - virtual void paintEvent(QPaintEvent *event) ; - virtual void resizeEvent(QResizeEvent *event); - - void updateTunnelStatistics( const std::vector > >&, - const std::vector > >&, - const std::vector&, - const std::vector&) ; - - private: - static QString speedString(float f) ; - - QPixmap pixmap ; - int maxWidth,maxHeight ; -}; diff --git a/retroshare-gui/src/gui/TurtleRouterDialog.ui b/retroshare-gui/src/gui/TurtleRouterDialog.ui index 5b2dfb6e2..da4780cf2 100644 --- a/retroshare-gui/src/gui/TurtleRouterDialog.ui +++ b/retroshare-gui/src/gui/TurtleRouterDialog.ui @@ -6,8 +6,8 @@ 0 0 - 865 - 525 + 572 + 350 @@ -17,43 +17,17 @@ :/images/rstray3.png:/images/rstray3.png - - - - - Qt::Vertical + + + + + true - - - true + + + F2F router information - - - F2F router information - - - - - - QFrame::NoFrame - - - Qt::ScrollBarAlwaysOff - - - true - - - - - 0 - 0 - 847 - 283 - - - - + diff --git a/retroshare-gui/src/gui/TurtleRouterStatistics.cpp b/retroshare-gui/src/gui/TurtleRouterStatistics.cpp new file mode 100644 index 000000000..7680b27ed --- /dev/null +++ b/retroshare-gui/src/gui/TurtleRouterStatistics.cpp @@ -0,0 +1,327 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 20011, RetroShare Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + ****************************************************************/ + +#include +#include +#include + +#include +#include + +#include +#include +#include "TurtleRouterStatistics.h" + +#include "gui/settings/rsharesettings.h" + +static const int MAX_TUNNEL_REQUESTS_DISPLAY = 10 ; + +class TRHistogram +{ + public: + TRHistogram(const std::vector& info) :_infos(info) {} + + QColor colorScale(float f) + { + if(f == 0) + return QColor::fromHsv(0,0,192) ; + else + return QColor::fromHsv((int)((1.0-f)*280),200,255) ; + } + + virtual void draw(QPainter *painter,int& ox,int& oy,const QString& title) + { + static const int MaxTime = 61 ; + static const int MaxDepth = 8 ; + static const int cellx = 7 ; + static const int celly = 12 ; + + int save_ox = ox ; + painter->setPen(QColor::fromRgb(0,0,0)) ; + painter->drawText(2+ox,celly+oy,title) ; + oy+=2+2*celly ; + + if(_infos.empty()) + return ; + + ox += 10 ; + std::map > hits ; + std::map > depths ; + std::map >::iterator it ; + + int max_hits = 1; + int max_depth = 1; + + for(uint32_t i=0;i<_infos.size();++i) + { + std::vector& h(hits[_infos[i].source_peer_id]) ; + std::vector& g(depths[_infos[i].source_peer_id]) ; + + if(h.size() <= _infos[i].age) + h.resize(MaxTime,0) ; + + if(g.empty()) + g.resize(MaxDepth,0) ; + + if(_infos[i].age < h.size()) + { + h[_infos[i].age]++ ; + if(h[_infos[i].age] > max_hits) + max_hits = h[_infos[i].age] ; + } + if(_infos[i].depth < g.size()) + { + g[_infos[i].depth]++ ; + + if(g[_infos[i].depth] > max_depth) + max_depth = g[_infos[i].depth] ; + } + } + + int p=0 ; + + for(it=depths.begin();it!=depths.end();++it,++p) + for(int i=0;ifillRect(ox+MaxTime*cellx+20+i*cellx,oy+p*celly,cellx,celly,colorScale(it->second[i]/(float)max_depth)) ; + + painter->setPen(QColor::fromRgb(0,0,0)) ; + painter->drawRect(ox+MaxTime*cellx+20,oy,MaxDepth*cellx,p*celly) ; + + for(int i=0;idrawText(ox+i*cellx,oy+(p+1)*celly+4,QString::number(i)) ; + + p=0 ; + for(it=hits.begin();it!=hits.end();++it,++p) + { + int total = 0 ; + + for(int i=0;ifillRect(ox+i*cellx,oy+p*celly,cellx,celly,colorScale(it->second[i]/(float)max_hits)) ; + total += it->second[i] ; + } + + painter->setPen(QColor::fromRgb(0,0,0)) ; + painter->drawText(ox+MaxDepth*cellx+30+(MaxTime+1)*cellx,oy+(p+1)*celly,TurtleRouterStatistics::getPeerName(it->first)) ; + painter->drawText(ox+MaxDepth*cellx+30+(MaxTime+1)*cellx+120,oy+(p+1)*celly,"("+QString::number(total)+")") ; + } + + painter->drawRect(ox,oy,MaxTime*cellx,p*celly) ; + + for(int i=0;idrawText(ox+i*cellx,oy+(p+1)*celly+4,QString::number(i)) ; + for(int i=0;idrawText(ox+MaxTime*cellx+20+i*cellx,oy+(p+1)*celly+4,QString::number(i)) ; + + oy += (p+1)*celly+4 ; + + painter->drawText(ox,oy+celly,QObject::tr("(Age in seconds)")); + painter->drawText(ox+MaxTime*cellx+20,oy+celly,QObject::tr("(Depth)")); + oy += 3*celly ; + + // now, draw a scale + + for(int i=0;i<=10;++i) + { + painter->fillRect(ox+i*(cellx+20),oy,cellx,celly,colorScale(i/10.0f)) ; + painter->setPen(QColor::fromRgb(0,0,0)) ; + painter->drawRect(ox+i*(cellx+20),oy,cellx,celly) ; + painter->drawText(ox+i*(cellx+20)+cellx+4,oy+celly,QString::number((int)(max_hits*i/10.0))) ; + } + + oy += celly*2 ; + + ox = save_ox ; + } + + private: + const std::vector& _infos ; +}; + +TurtleRouterStatistics::TurtleRouterStatistics(QWidget *parent) + : RsAutoUpdatePage(2000,parent) +{ + setupUi(this) ; + + m_bProcessSettings = false; + + _tunnel_statistics_F->setWidget( _tst_CW = new TurtleRouterStatisticsWidget() ) ; + _tunnel_statistics_F->setWidgetResizable(true); + _tunnel_statistics_F->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + _tunnel_statistics_F->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + _tunnel_statistics_F->viewport()->setBackgroundRole(QPalette::NoRole); + _tunnel_statistics_F->setFrameStyle(QFrame::NoFrame); + _tunnel_statistics_F->setFocusPolicy(Qt::NoFocus); + + // load settings + processSettings(true); +} + +TurtleRouterStatistics::~TurtleRouterStatistics() +{ + + // save settings + processSettings(false); +} + +void TurtleRouterStatistics::processSettings(bool bLoad) +{ + m_bProcessSettings = true; + + Settings->beginGroup(QString("TurtleRouterStatistics")); + + if (bLoad) { + // load settings + + // state of splitter + //splitter->restoreState(Settings->value("Splitter").toByteArray()); + } else { + // save settings + + // state of splitter + //Settings->setValue("Splitter", splitter->saveState()); + + } + + Settings->endGroup(); + + m_bProcessSettings = false; + +} + + +void TurtleRouterStatistics::updateDisplay() +{ + std::vector > hashes_info ; + std::vector > tunnels_info ; + std::vector search_reqs_info ; + std::vector tunnel_reqs_info ; + + rsTurtle->getInfo(hashes_info,tunnels_info,search_reqs_info,tunnel_reqs_info) ; + + //updateTunnelRequests(hashes_info,tunnels_info,search_reqs_info,tunnel_reqs_info) ; + _tst_CW->updateTunnelStatistics(hashes_info,tunnels_info,search_reqs_info,tunnel_reqs_info) ; + _tst_CW->update(); +} + +QString TurtleRouterStatistics::getPeerName(const std::string& peer_id) +{ + static std::map names ; + + std::map::const_iterator it = names.find(peer_id) ; + + if( it != names.end()) + return it->second ; + else + { + RsPeerDetails detail ; + if(!rsPeers->getPeerDetails(peer_id,detail)) + return "unknown peer"; + + return (names[peer_id] = QString::fromStdString(detail.name)) ; + } +} + +TurtleRouterStatisticsWidget::TurtleRouterStatisticsWidget(QWidget *parent) + : QWidget(parent) +{ + maxWidth = 200 ; + maxHeight = 0 ; +} + +void TurtleRouterStatisticsWidget::updateTunnelStatistics(const std::vector >& hashes_info, + const std::vector >& tunnels_info, + const std::vector& search_reqs_info, + const std::vector& tunnel_reqs_info) + +{ + static const int cellx = 6 ; + static const int celly = 10+4 ; + + QPixmap tmppixmap(maxWidth, maxHeight); + tmppixmap.fill(this, 0, 0); + setFixedHeight(maxHeight); + + QPainter painter(&tmppixmap); + painter.initFrom(this); + + maxHeight = 500 ; + + // std::cerr << "Drawing into pixmap of size " << maxWidth << "x" << maxHeight << std::endl; + // draw... + int ox=5,oy=5 ; + + TRHistogram(search_reqs_info).draw(&painter,ox,oy,QObject::tr("Search requests repartition:")) ; + + painter.setPen(QColor::fromRgb(70,70,70)) ; + painter.drawLine(0,oy,maxWidth,oy) ; + oy += celly ; + + TRHistogram(tunnel_reqs_info).draw(&painter,ox,oy,QObject::tr("Tunnel requests repartition:")) ; + + // now give information about turtle traffic. + // + TurtleTrafficStatisticsInfo info ; + rsTurtle->getTrafficStatistics(info) ; + + painter.setPen(QColor::fromRgb(70,70,70)) ; + painter.drawLine(0,oy,maxWidth,oy) ; + oy += celly ; + + painter.drawText(ox,oy+celly,tr("Turtle router traffic:")) ; oy += celly*2 ; + painter.drawText(ox+2*cellx,oy+celly,tr("Tunnel requests Up")+"\t: " + speedString(info.tr_up_Bps) ) ; oy += celly ; + painter.drawText(ox+2*cellx,oy+celly,tr("Tunnel requests Dn")+"\t: " + speedString(info.tr_dn_Bps) ) ; oy += celly ; + painter.drawText(ox+2*cellx,oy+celly,tr("Incoming file data")+"\t: " + speedString(info.data_dn_Bps) ) ; oy += celly ; + painter.drawText(ox+2*cellx,oy+celly,tr("Outgoing file data")+"\t: " + speedString(info.data_up_Bps) ) ; oy += celly ; + painter.drawText(ox+2*cellx,oy+celly,tr("Forwarded data ")+"\t: " + speedString(info.unknown_updn_Bps) ) ; oy += celly ; + + // update the pixmap + // + pixmap = tmppixmap; + maxHeight = oy ; +} + +QString TurtleRouterStatisticsWidget::speedString(float f) +{ + if(f < 1.0f) + return QString("0 B/s") ; + if(f < 1024.0f) + return QString::number((int)f)+" B/s" ; + + return QString::number(f/1024.0,'f',2) + " KB/s"; +} + +void TurtleRouterStatisticsWidget::paintEvent(QPaintEvent *event) +{ + QStylePainter(this).drawPixmap(0, 0, pixmap); +} + +void TurtleRouterStatisticsWidget::resizeEvent(QResizeEvent *event) +{ + QRect TaskGraphRect = geometry(); + maxWidth = TaskGraphRect.width(); + maxHeight = TaskGraphRect.height() ; + + QWidget::resizeEvent(event); + update(); +} + + diff --git a/retroshare-gui/src/gui/TurtleRouterStatistics.h b/retroshare-gui/src/gui/TurtleRouterStatistics.h new file mode 100644 index 000000000..0e3ab2d5a --- /dev/null +++ b/retroshare-gui/src/gui/TurtleRouterStatistics.h @@ -0,0 +1,69 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 20011, RetroShare Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + ****************************************************************/ + +#pragma once + +#include +#include +#include "ui_TurtleRouterStatistics.h" +#include "RsAutoUpdatePage.h" + +class TurtleRouterStatisticsWidget ; + +class TurtleRouterStatistics: public RsAutoUpdatePage, public Ui::TurtleRouterStatistics +{ + public: + TurtleRouterStatistics(QWidget *parent = NULL) ; + ~TurtleRouterStatistics(); + + // Cache for peer names. + static QString getPeerName(const std::string& peer_id) ; + + private: + + void processSettings(bool bLoad); + bool m_bProcessSettings; + + virtual void updateDisplay() ; + + TurtleRouterStatisticsWidget *_tst_CW ; +} ; + +class TurtleRouterStatisticsWidget: public QWidget +{ + public: + TurtleRouterStatisticsWidget(QWidget *parent = NULL) ; + + virtual void paintEvent(QPaintEvent *event) ; + virtual void resizeEvent(QResizeEvent *event); + + void updateTunnelStatistics( const std::vector > >&, + const std::vector > >&, + const std::vector&, + const std::vector&) ; + + private: + static QString speedString(float f) ; + + QPixmap pixmap ; + int maxWidth,maxHeight ; +}; + diff --git a/retroshare-gui/src/gui/TurtleRouterStatistics.ui b/retroshare-gui/src/gui/TurtleRouterStatistics.ui new file mode 100644 index 000000000..365d3f362 --- /dev/null +++ b/retroshare-gui/src/gui/TurtleRouterStatistics.ui @@ -0,0 +1,55 @@ + + + TurtleRouterStatistics + + + + 0 + 0 + 611 + 408 + + + + Router Statistics + + + + :/images/rstray3.png:/images/rstray3.png + + + + + + Qt::Vertical + + + + QFrame::NoFrame + + + Qt::ScrollBarAlwaysOff + + + true + + + + + 0 + 0 + 593 + 390 + + + + + + + + + + + + +