mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-10-01 02:35:48 -04:00
c35a48feb7
git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@1571 b45a01b8-16f6-495d-af2f-9b41ad6348cc
267 lines
6.6 KiB
C++
267 lines
6.6 KiB
C++
#include <math.h>
|
|
#include <QTimer>
|
|
#include <QWheelEvent>
|
|
#include <QHeaderView>
|
|
#include "rsiface/rsiface.h"
|
|
#include "rsiface/rspeers.h"
|
|
|
|
#include <QTableView>
|
|
#include "TrustView.h"
|
|
|
|
using namespace std ;
|
|
|
|
TrustView::TrustView()
|
|
{
|
|
setupUi(this) ;
|
|
|
|
trustTableTW->setMouseTracking(true) ;
|
|
// trustInconsistencyCB->setEnabled(false) ;
|
|
|
|
zoomHS->setValue(100) ;
|
|
|
|
QObject::connect(zoomHS,SIGNAL(valueChanged(int)),this,SLOT(updateZoom(int))) ;
|
|
QObject::connect(updatePB,SIGNAL(clicked()),this,SLOT(update())) ;
|
|
QObject::connect(trustTableTW,SIGNAL(cellClicked(int,int)),this,SLOT(selectCell(int,int))) ;
|
|
QObject::connect(trustTableTW->verticalHeader(),SIGNAL(sectionClicked(int)),this,SLOT(hideShowPeers(int))) ;
|
|
QObject::connect(trustTableTW->horizontalHeader(),SIGNAL(sectionClicked(int)),this,SLOT(hideShowPeers(int))) ;
|
|
|
|
updatePB->setToolTip(QString("This table normaly auto-updates every 10 seconds.")) ;
|
|
|
|
QTimer *timer = new QTimer ;
|
|
|
|
QObject::connect(timer,SIGNAL(timeout()),this,SLOT(update())) ;
|
|
timer->start(10000) ;
|
|
|
|
update() ;
|
|
}
|
|
|
|
void TrustView::showEvent(QShowEvent *e)
|
|
{
|
|
QWidget::showEvent(e) ;
|
|
update() ;
|
|
}
|
|
void TrustView::wheelEvent(QWheelEvent *e)
|
|
{
|
|
if(e->modifiers() & Qt::ShiftModifier)
|
|
{
|
|
if(e->delta() > 0)
|
|
zoomHS->setValue(zoomHS->value()-5) ;
|
|
else
|
|
zoomHS->setValue(zoomHS->value()+5) ;
|
|
}
|
|
}
|
|
|
|
void TrustView::selectCell(int row,int col)
|
|
{
|
|
static int last_row = -1 ;
|
|
static int last_col = -1 ;
|
|
|
|
cout << "row = " << row << ", column = " << col << endl;
|
|
if(row == 0 || col == 0)
|
|
cout << "***********************************************" << endl ;
|
|
if(last_row > -1)
|
|
{
|
|
int col_s,row_s ;
|
|
getCellSize(zoomHS->value(),col_s,row_s) ;
|
|
|
|
trustTableTW->setColumnWidth(last_col,col_s) ;
|
|
trustTableTW->setRowHeight(last_row,row_s) ;
|
|
}
|
|
|
|
if(row != last_row || col != last_col)
|
|
{
|
|
trustTableTW->setColumnWidth(col,_base_cell_width) ;
|
|
trustTableTW->setRowHeight(row,_base_cell_height) ;
|
|
|
|
last_col = col ;
|
|
last_row = row ;
|
|
}
|
|
else
|
|
{
|
|
last_col = -1 ;
|
|
last_row = -1 ;
|
|
}
|
|
}
|
|
|
|
void TrustView::getCellSize(int z,int& col_s,int& row_s) const
|
|
{
|
|
col_s = max(10,(int)rint( z/100.0 * _base_cell_width )) ;
|
|
row_s = max(10,(int)rint( z/100.0 * _base_cell_height)) ;
|
|
}
|
|
|
|
void TrustView::updateZoom(int z)
|
|
{
|
|
int col_s,row_s ;
|
|
getCellSize(z,col_s,row_s) ;
|
|
|
|
for(int i=0;i<trustTableTW->columnCount();++i)
|
|
trustTableTW->setColumnWidth(i,col_s) ;
|
|
|
|
for(int i=0;i<trustTableTW->rowCount();++i)
|
|
trustTableTW->setRowHeight(i,row_s) ;
|
|
|
|
// cout << "updated zoom" << endl;
|
|
}
|
|
|
|
int TrustView::getRowColId(const string& peerid)
|
|
{
|
|
static map<string,int> peeridToRow ;
|
|
|
|
map<string,int>::const_iterator itpr(peeridToRow.find( peerid )) ;
|
|
int i ;
|
|
|
|
if(itpr == peeridToRow.end())
|
|
{
|
|
i = trustTableTW->columnCount() ;
|
|
// cout << " -> peer not in table. Creating entry # " << i << endl ;
|
|
|
|
trustTableTW->insertColumn(i) ;
|
|
trustTableTW->insertRow(i) ;
|
|
|
|
peeridToRow[peerid] = i ;
|
|
|
|
std::string name = rsPeers->getPeerName(peerid) ;
|
|
|
|
trustTableTW->setHorizontalHeaderItem(i,new QTableWidgetItem(QString(name.c_str()))) ;
|
|
trustTableTW->setVerticalHeaderItem(i,new QTableWidgetItem(QString(name.c_str()))) ;
|
|
|
|
trustTableTW->setColumnWidth(i,_base_cell_width) ;
|
|
trustTableTW->setRowHeight(i,_base_cell_height) ;
|
|
}
|
|
else
|
|
i = (*itpr).second ;
|
|
|
|
return i ;
|
|
}
|
|
|
|
void TrustView::update()
|
|
{
|
|
// collect info.
|
|
|
|
if(!isVisible())
|
|
return ;
|
|
|
|
std::list<std::string> neighs;
|
|
|
|
if(!rsPeers->getOthersList(neighs))
|
|
return ;
|
|
|
|
neighs.push_back(rsPeers->getOwnId()) ;
|
|
|
|
trustTableTW->setSortingEnabled(false) ;
|
|
|
|
RsPeerDetails details ;
|
|
|
|
// Fill everything
|
|
for(list<string>::const_iterator it1(neighs.begin()); it1 != neighs.end(); ++it1)
|
|
{
|
|
if(!rsPeers->getPeerDetails(*it1,details))
|
|
continue ;
|
|
|
|
// cout << "treating neigh = " << details.name << endl ;
|
|
// cout << " signers = " ;
|
|
int i = getRowColId(details.id) ;
|
|
|
|
for(list<string>::const_iterator it2(details.signers.begin());it2!=details.signers.end();++it2)
|
|
{
|
|
cout << *it2 << " " ;
|
|
// Signers are identified by there name, so if we have twice the same signers, this gets crappy.
|
|
|
|
int j = getRowColId(*it2) ;
|
|
|
|
QString trr( (i==j)?"Self":"Trust") ;
|
|
|
|
if(trustTableTW->item(i,j) == NULL)
|
|
trustTableTW->setItem(i,j,new QTableWidgetItem(trr)) ;
|
|
else
|
|
trustTableTW->item(i,j)->setText(trr) ;
|
|
}
|
|
// cout << endl ;
|
|
}
|
|
// assign colors
|
|
vector<int> ni(trustTableTW->rowCount(),0) ;
|
|
vector<int> nj(trustTableTW->columnCount(),0) ;
|
|
|
|
for(int i=0;i<trustTableTW->rowCount();++i)
|
|
for(int j=0;j<trustTableTW->columnCount();++j)
|
|
{
|
|
QTableWidgetItem *i_ij(trustTableTW->item(i,j)) ;
|
|
QTableWidgetItem *i_ji(trustTableTW->item(j,i)) ;
|
|
|
|
QColor color ;
|
|
|
|
// check bidirectional trust
|
|
//
|
|
if(i_ij != NULL)
|
|
{
|
|
++ni[i] ;
|
|
++nj[j] ;
|
|
|
|
if(i_ji == NULL)
|
|
{
|
|
i_ij->setBackgroundColor(Qt::yellow) ;
|
|
i_ij->setToolTip(trustTableTW->horizontalHeaderItem(i)->text() + QString(" is trusted (one way) by " )+trustTableTW->verticalHeaderItem(j)->text()) ;
|
|
i_ij->setText(QString("Half")) ;
|
|
}
|
|
else
|
|
{
|
|
if(i==j)
|
|
{
|
|
i_ij->setBackgroundColor(Qt::red) ;
|
|
i_ij->setToolTip(trustTableTW->horizontalHeaderItem(i)->text() + QString(" trusts himself") ) ;
|
|
}
|
|
else
|
|
{
|
|
i_ij->setBackgroundColor(Qt::green) ;
|
|
i_ij->setToolTip(trustTableTW->horizontalHeaderItem(i)->text() + " and " +trustTableTW->verticalHeaderItem(j)->text() + QString(" trust each others") ) ;
|
|
i_ij->setText(QString("Full")) ;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for(int i=0;i<trustTableTW->rowCount();++i)
|
|
trustTableTW->verticalHeaderItem(i)->setToolTip(trustTableTW->verticalHeaderItem(i)->text()+" is trusted by " + QString::number(ni[i]) + " peers, including him(her)self.") ;
|
|
|
|
for(int j=0;j<trustTableTW->columnCount();++j)
|
|
trustTableTW->horizontalHeaderItem(j)->setToolTip(trustTableTW->horizontalHeaderItem(j)->text()+" trusts " + QString::number(nj[j]) + " peers, including him(her)self.") ;
|
|
|
|
}
|
|
|
|
void TrustView::hideShowPeers(int col)
|
|
{
|
|
// Choose what to show/hide
|
|
//
|
|
|
|
static int last_col = -1 ;
|
|
|
|
if(col == last_col)
|
|
{
|
|
for(int i=0;i<trustTableTW->rowCount();++i)
|
|
{
|
|
trustTableTW->setColumnHidden(i,false) ;
|
|
trustTableTW->setRowHidden(i,false) ;
|
|
}
|
|
last_col = -1 ;
|
|
|
|
showingLabel->setText(QString("Showing: whole network")) ;
|
|
}
|
|
else
|
|
{
|
|
for(int i=0;i<trustTableTW->rowCount();++i)
|
|
if(trustTableTW->item(i,col) == NULL && trustTableTW->item(col,i) == NULL)
|
|
{
|
|
trustTableTW->setColumnHidden(i,true) ;
|
|
trustTableTW->setRowHidden(i,true) ;
|
|
}
|
|
else
|
|
{
|
|
trustTableTW->setColumnHidden(i,false) ;
|
|
trustTableTW->setRowHidden(i,false) ;
|
|
}
|
|
last_col = col ;
|
|
showingLabel->setText(QString("Showing: peers connected to ")+trustTableTW->verticalHeaderItem(col)->text()) ;
|
|
}
|
|
}
|
|
|
|
|