mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-12-27 00:19:25 -05:00
commit
d1d66bb8bf
@ -56,12 +56,6 @@ retroshare_qml_app {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
retroshare_plugins {
|
|
||||||
SUBDIRS += plugins
|
|
||||||
plugins.file = plugins/plugins.pro
|
|
||||||
plugins.depends = retroshare_gui
|
|
||||||
plugins.target = plugins
|
|
||||||
}
|
|
||||||
|
|
||||||
wikipoos {
|
wikipoos {
|
||||||
SUBDIRS += pegmarkdown
|
SUBDIRS += pegmarkdown
|
||||||
|
@ -71,7 +71,7 @@
|
|||||||
#define COLUMN_LAST_USED 5
|
#define COLUMN_LAST_USED 5
|
||||||
#define COLUMN_COUNT 6
|
#define COLUMN_COUNT 6
|
||||||
|
|
||||||
RsPeerId getNeighRsCertId(QTreeWidgetItem *i);
|
//RsPeerId getNeighRsCertId(QTreeWidgetItem *i);
|
||||||
|
|
||||||
/******
|
/******
|
||||||
* #define NET_DEBUG 1
|
* #define NET_DEBUG 1
|
||||||
@ -81,85 +81,64 @@ static const unsigned int ROLE_SORT = Qt::UserRole + 1 ;
|
|||||||
|
|
||||||
/** Constructor */
|
/** Constructor */
|
||||||
NetworkDialog::NetworkDialog(QWidget *parent)
|
NetworkDialog::NetworkDialog(QWidget *parent)
|
||||||
: RsAutoUpdatePage(10000,parent) // updates every 10 sec.
|
|
||||||
{
|
{
|
||||||
/* Invoke the Qt Designer generated object setup routine */
|
/* Invoke the Qt Designer generated object setup routine */
|
||||||
ui.setupUi(this);
|
ui.setupUi(this);
|
||||||
|
|
||||||
connect( ui.connectTreeWidget, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( connectTreeWidgetCostumPopupMenu( QPoint ) ) );
|
|
||||||
connect( ui.connectTreeWidget, SIGNAL( itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT( peerdetails () ) );
|
|
||||||
|
|
||||||
connect( ui.filterLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(filterItems(QString)));
|
connect( ui.filterLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(filterItems(QString)));
|
||||||
connect( ui.filterLineEdit, SIGNAL(filterChanged(int)), this, SLOT(filterColumnChanged(int)));
|
connect( ui.filterLineEdit, SIGNAL(filterChanged(int)), this, SLOT(filterColumnChanged(int)));
|
||||||
|
|
||||||
connect( ui.onlyTrustedKeys, SIGNAL(clicked()), this, SLOT(securedUpdateDisplay()));
|
|
||||||
|
|
||||||
/* hide the Tree +/- */
|
//list data model
|
||||||
ui.connectTreeWidget -> setRootIsDecorated( false );
|
float f = QFontMetricsF(font()).height()/14.0 ;
|
||||||
ui.connectTreeWidget -> setColumnCount(6);
|
PGPIdItemModel = new pgpid_item_model(neighs, f, this);
|
||||||
|
PGPIdItemProxy = new pgpid_item_proxy(this);
|
||||||
|
connect(ui.onlyTrustedKeys, SIGNAL(toggled(bool)), PGPIdItemProxy, SLOT(use_only_trusted_keys(bool)));
|
||||||
|
PGPIdItemProxy->setSourceModel(PGPIdItemModel);
|
||||||
|
PGPIdItemProxy->setFilterKeyColumn(COLUMN_PEERNAME);
|
||||||
|
PGPIdItemProxy->setFilterCaseSensitivity(Qt::CaseInsensitive);
|
||||||
|
PGPIdItemProxy->setSortRole(Qt::EditRole); //use edit role to get raw data since we do not have edit for this model.
|
||||||
|
ui.connectTreeWidget->setModel(PGPIdItemProxy);
|
||||||
|
ui.connectTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
|
ui.connectTreeWidget->verticalHeader()->hide();
|
||||||
|
ui.connectTreeWidget->setShowGrid(false);
|
||||||
|
ui.connectTreeWidget->setUpdatesEnabled(true);
|
||||||
|
ui.connectTreeWidget->setSortingEnabled(true);
|
||||||
|
ui.connectTreeWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
|
||||||
|
connect(ui.connectTreeWidget, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( connectTreeWidgetCostumPopupMenu( QPoint ) ) );
|
||||||
|
connect(ui.connectTreeWidget, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(peerdetails()));
|
||||||
|
|
||||||
|
|
||||||
compareNetworkRole = new RSTreeWidgetItemCompareRole;
|
|
||||||
compareNetworkRole->setRole(COLUMN_LAST_USED, ROLE_SORT);
|
|
||||||
|
|
||||||
/* Set header resize modes and initial section sizes */
|
/* Set header resize modes and initial section sizes */
|
||||||
QHeaderView * _header = ui.connectTreeWidget->header () ;
|
/* QHeaderView * _header = ui.connectTreeWidget->header () ;
|
||||||
QHeaderView_setSectionResizeModeColumn(_header, COLUMN_CHECK, QHeaderView::Custom);
|
QHeaderView_setSectionResizeModeColumn(_header, COLUMN_CHECK, QHeaderView::Custom);
|
||||||
QHeaderView_setSectionResizeModeColumn(_header, COLUMN_PEERNAME, QHeaderView::Interactive);
|
QHeaderView_setSectionResizeModeColumn(_header, COLUMN_PEERNAME, QHeaderView::Interactive);
|
||||||
QHeaderView_setSectionResizeModeColumn(_header, COLUMN_I_AUTH_PEER, QHeaderView::Interactive);
|
QHeaderView_setSectionResizeModeColumn(_header, COLUMN_I_AUTH_PEER, QHeaderView::Interactive);
|
||||||
QHeaderView_setSectionResizeModeColumn(_header, COLUMN_PEER_AUTH_ME, QHeaderView::Interactive);
|
QHeaderView_setSectionResizeModeColumn(_header, COLUMN_PEER_AUTH_ME, QHeaderView::Interactive);
|
||||||
QHeaderView_setSectionResizeModeColumn(_header, COLUMN_PEERID, QHeaderView::Interactive);
|
QHeaderView_setSectionResizeModeColumn(_header, COLUMN_PEERID, QHeaderView::Interactive);
|
||||||
QHeaderView_setSectionResizeModeColumn(_header, COLUMN_LAST_USED, QHeaderView::Interactive);
|
QHeaderView_setSectionResizeModeColumn(_header, COLUMN_LAST_USED, QHeaderView::Interactive); */
|
||||||
|
|
||||||
_header->model()->setHeaderData(COLUMN_CHECK, Qt::Horizontal, tr(""));
|
|
||||||
_header->model()->setHeaderData(COLUMN_PEERNAME, Qt::Horizontal, tr("Profile"));
|
|
||||||
_header->model()->setHeaderData(COLUMN_I_AUTH_PEER, Qt::Horizontal, tr("Trust level"));
|
|
||||||
_header->model()->setHeaderData(COLUMN_PEER_AUTH_ME, Qt::Horizontal, tr("Has signed your key?"));
|
|
||||||
_header->model()->setHeaderData(COLUMN_PEERID, Qt::Horizontal, tr("Id"));
|
|
||||||
_header->model()->setHeaderData(COLUMN_LAST_USED, Qt::Horizontal, tr("Last used"));
|
|
||||||
|
|
||||||
_header->model()->setHeaderData(COLUMN_CHECK, Qt::Horizontal, tr(" Do you accept connections signed by this profile?"),Qt::ToolTipRole);
|
|
||||||
_header->model()->setHeaderData(COLUMN_PEERNAME, Qt::Horizontal, tr("Name of the profile"),Qt::ToolTipRole);
|
|
||||||
_header->model()->setHeaderData(COLUMN_I_AUTH_PEER, Qt::Horizontal, tr("This column indicates trust level and whether you signed the profile PGP key"),Qt::ToolTipRole);
|
|
||||||
_header->model()->setHeaderData(COLUMN_PEER_AUTH_ME, Qt::Horizontal, tr("Did that peer sign your own profile PGP key"),Qt::ToolTipRole);
|
|
||||||
_header->model()->setHeaderData(COLUMN_PEERID, Qt::Horizontal, tr("PGP Key Id of that profile"),Qt::ToolTipRole);
|
|
||||||
_header->model()->setHeaderData(COLUMN_LAST_USED, Qt::Horizontal, tr("Last time this key was used (received time, or to check connection)"),Qt::ToolTipRole);
|
|
||||||
|
|
||||||
float f = QFontMetricsF(font()).height()/14.0 ;
|
|
||||||
|
|
||||||
_header->resizeSection ( COLUMN_CHECK, 25*f );
|
|
||||||
_header->resizeSection ( COLUMN_PEERNAME, 200*f );
|
|
||||||
_header->resizeSection ( COLUMN_I_AUTH_PEER, 200*f );
|
|
||||||
_header->resizeSection ( COLUMN_PEER_AUTH_ME, 200*f );
|
|
||||||
_header->resizeSection ( COLUMN_LAST_USED, 75*f );
|
|
||||||
|
|
||||||
// set header text aligment
|
|
||||||
QTreeWidgetItem * headerItem = ui.connectTreeWidget->headerItem();
|
|
||||||
headerItem->setTextAlignment(COLUMN_CHECK, Qt::AlignHCenter | Qt::AlignVCenter);
|
|
||||||
headerItem->setTextAlignment(COLUMN_PEERNAME, Qt::AlignHCenter | Qt::AlignVCenter);
|
|
||||||
headerItem->setTextAlignment(COLUMN_I_AUTH_PEER, Qt::AlignHCenter | Qt::AlignVCenter);
|
|
||||||
headerItem->setTextAlignment(COLUMN_PEER_AUTH_ME, Qt::AlignHCenter | Qt::AlignVCenter);
|
|
||||||
headerItem->setTextAlignment(COLUMN_PEERID, Qt::AlignVCenter);
|
|
||||||
headerItem->setTextAlignment(COLUMN_LAST_USED, Qt::AlignVCenter);
|
|
||||||
|
|
||||||
headerItem->setText(0,QString()) ;
|
|
||||||
|
|
||||||
ui.connectTreeWidget->sortItems( COLUMN_PEERNAME, Qt::AscendingOrder );
|
|
||||||
|
|
||||||
ui.onlyTrustedKeys->setMinimumWidth(20*f);
|
ui.onlyTrustedKeys->setMinimumWidth(20*f);
|
||||||
|
|
||||||
QMenu *menu = new QMenu();
|
|
||||||
|
|
||||||
|
/* QMenu *menu = new QMenu();
|
||||||
menu->addAction(ui.actionTabsright);
|
menu->addAction(ui.actionTabsright);
|
||||||
menu->addAction(ui.actionTabswest);
|
menu->addAction(ui.actionTabswest);
|
||||||
menu->addAction(ui.actionTabssouth);
|
menu->addAction(ui.actionTabssouth);
|
||||||
menu->addAction(ui.actionTabsnorth);
|
menu->addAction(ui.actionTabsnorth);
|
||||||
menu->addSeparator();
|
menu->addSeparator();
|
||||||
menu->addAction(ui.actionTabsTriangular);
|
menu->addAction(ui.actionTabsTriangular);
|
||||||
menu->addAction(ui.actionTabsRounded);
|
menu->addAction(ui.actionTabsRounded); */
|
||||||
|
|
||||||
/* add filter actions */
|
/* add filter actions */
|
||||||
ui.filterLineEdit->addFilter(QIcon(), tr("Name"), COLUMN_PEERNAME, tr("Search name"));
|
ui.filterLineEdit->addFilter(QIcon(), tr("Name"), COLUMN_PEERNAME, tr("Search name"));
|
||||||
ui.filterLineEdit->addFilter(QIcon(), tr("Peer ID"), COLUMN_PEERID, tr("Search peer ID"));
|
ui.filterLineEdit->addFilter(QIcon(), tr("Peer ID"), COLUMN_PEERID, tr("Search peer ID"));
|
||||||
ui.filterLineEdit->setCurrentFilter(COLUMN_PEERNAME);
|
ui.filterLineEdit->setCurrentFilter(COLUMN_PEERNAME);
|
||||||
|
connect(ui.filterLineEdit, SIGNAL(textChanged(QString)), PGPIdItemProxy, SLOT(setFilterWildcard(QString)));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkDialog::changeEvent(QEvent *e)
|
void NetworkDialog::changeEvent(QEvent *e)
|
||||||
@ -177,14 +156,14 @@ void NetworkDialog::changeEvent(QEvent *e)
|
|||||||
|
|
||||||
void NetworkDialog::connectTreeWidgetCostumPopupMenu( QPoint /*point*/ )
|
void NetworkDialog::connectTreeWidgetCostumPopupMenu( QPoint /*point*/ )
|
||||||
{
|
{
|
||||||
//std::cerr << "NetworkDialog::connectTreeWidgetCostumPopupMenu( QPoint point ) called" << std::endl;
|
|
||||||
QTreeWidgetItem *wi = getCurrentNeighbour();
|
QModelIndexList l = ui.connectTreeWidget->selectionModel()->selection().indexes();
|
||||||
if (!wi)
|
if(l.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QMenu *contextMnu = new QMenu;
|
QMenu *contextMnu = new QMenu;
|
||||||
|
|
||||||
RsPgpId peer_id(wi->text(COLUMN_PEERID).toStdString()) ;
|
RsPgpId peer_id(ui.connectTreeWidget->model()->data(ui.connectTreeWidget->model()->index(l.begin()->row(), COLUMN_PEERID)).toString().toStdString()) ;
|
||||||
|
|
||||||
// That's what context menus are made for
|
// That's what context menus are made for
|
||||||
RsPeerDetails detail;
|
RsPeerDetails detail;
|
||||||
@ -271,13 +250,17 @@ void NetworkDialog::removeUnusedKeys()
|
|||||||
}
|
}
|
||||||
QMessageBox::warning(NULL,tr("Keyring info"),tr("Key removal has failed. Your keyring remains intact.\n\nReported error:")+" "+error_string ) ;
|
QMessageBox::warning(NULL,tr("Keyring info"),tr("Key removal has failed. Your keyring remains intact.\n\nReported error:")+" "+error_string ) ;
|
||||||
}
|
}
|
||||||
insertConnect() ;
|
updateDisplay();
|
||||||
|
// insertConnect() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkDialog::denyFriend()
|
void NetworkDialog::denyFriend()
|
||||||
{
|
{
|
||||||
QTreeWidgetItem *wi = getCurrentNeighbour();
|
QModelIndexList l = ui.connectTreeWidget->selectionModel()->selection().indexes();
|
||||||
RsPgpId peer_id( wi->text(COLUMN_PEERID).toStdString() );
|
if(l.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
RsPgpId peer_id(ui.connectTreeWidget->model()->data(ui.connectTreeWidget->model()->index(l.begin()->row(), COLUMN_PEERID)).toString().toStdString());
|
||||||
rsPeers->removeFriend(peer_id) ;
|
rsPeers->removeFriend(peer_id) ;
|
||||||
|
|
||||||
securedUpdateDisplay();
|
securedUpdateDisplay();
|
||||||
@ -300,27 +283,32 @@ void NetworkDialog::denyFriend()
|
|||||||
|
|
||||||
void NetworkDialog::makeFriend()
|
void NetworkDialog::makeFriend()
|
||||||
{
|
{
|
||||||
PGPKeyDialog::showIt(RsPgpId(getCurrentNeighbour()->text(COLUMN_PEERID).toStdString()), PGPKeyDialog::PageDetails);
|
|
||||||
|
QModelIndexList l = ui.connectTreeWidget->selectionModel()->selection().indexes();
|
||||||
|
if(l.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
PGPKeyDialog::showIt(RsPgpId(ui.connectTreeWidget->model()->data(ui.connectTreeWidget->model()->index(l.begin()->row(), COLUMN_PEERID)).toString().toStdString()), PGPKeyDialog::PageDetails);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Shows Peer Information/Auth Dialog */
|
/** Shows Peer Information/Auth Dialog */
|
||||||
void NetworkDialog::peerdetails()
|
void NetworkDialog::peerdetails()
|
||||||
{
|
{
|
||||||
QTreeWidgetItem* item = getCurrentNeighbour();
|
QModelIndexList l = ui.connectTreeWidget->selectionModel()->selection().indexes();
|
||||||
if (item == NULL) {
|
if(l.empty())
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
PGPKeyDialog::showIt(RsPgpId(item->text(COLUMN_PEERID).toStdString()), PGPKeyDialog::PageDetails);
|
PGPKeyDialog::showIt(RsPgpId(ui.connectTreeWidget->model()->data(ui.connectTreeWidget->model()->index(l.begin()->row(), COLUMN_PEERID)).toString().toStdString()), PGPKeyDialog::PageDetails);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkDialog::copyLink()
|
void NetworkDialog::copyLink()
|
||||||
{
|
{
|
||||||
QTreeWidgetItem *wi = getCurrentNeighbour();
|
QModelIndexList l = ui.connectTreeWidget->selectionModel()->selection().indexes();
|
||||||
if (wi == NULL) {
|
if(l.empty())
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
RsPgpId peer_id ( wi->text(COLUMN_PEERID).toStdString() ) ;
|
|
||||||
|
RsPgpId peer_id (ui.connectTreeWidget->model()->data(ui.connectTreeWidget->model()->index(l.begin()->row(), COLUMN_PEERID)).toString().toStdString()) ;
|
||||||
|
|
||||||
QList<RetroShareLink> urls;
|
QList<RetroShareLink> urls;
|
||||||
RetroShareLink link = RetroShareLink::createPerson(peer_id);
|
RetroShareLink link = RetroShareLink::createPerson(peer_id);
|
||||||
@ -356,225 +344,14 @@ void NetworkDialog::copyLink()
|
|||||||
// /* window will destroy itself! */
|
// /* window will destroy itself! */
|
||||||
//}
|
//}
|
||||||
|
|
||||||
void NetworkDialog::updateDisplay()
|
|
||||||
{
|
|
||||||
insertConnect() ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get the list of Neighbours from the RsIface. */
|
|
||||||
void NetworkDialog::insertConnect()
|
|
||||||
{
|
|
||||||
// static time_t last_time = 0 ;
|
|
||||||
|
|
||||||
if (!rsPeers)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// // Because this is called from a qt signal, there's no limitation between calls.
|
|
||||||
time_t now = time(NULL);
|
|
||||||
|
|
||||||
std::list<RsPgpId> neighs; //these are GPG ids
|
|
||||||
std::list<RsPgpId>::iterator it;
|
|
||||||
rsPeers->getGPGAllList(neighs);
|
|
||||||
|
|
||||||
/* get a link to the table */
|
|
||||||
QTreeWidget *connectWidget = ui.connectTreeWidget;
|
|
||||||
/* disable sorting while editing the table */
|
|
||||||
connectWidget->setSortingEnabled(false);
|
|
||||||
|
|
||||||
//remove items
|
|
||||||
int index = 0;
|
|
||||||
while (index < connectWidget->topLevelItemCount())
|
|
||||||
{
|
|
||||||
RsPgpId gpg_widget_id( (connectWidget->topLevelItem(index))->text(COLUMN_PEERID).toStdString() );
|
|
||||||
RsPeerDetails detail;
|
|
||||||
if ( (!rsPeers->getGPGDetails(gpg_widget_id, detail)) || (ui.onlyTrustedKeys->isChecked() && (detail.validLvl < RS_TRUST_LVL_MARGINAL && !detail.accept_connection)))
|
|
||||||
delete (connectWidget->takeTopLevelItem(index));
|
|
||||||
else
|
|
||||||
++index;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(it = neighs.begin(); it != neighs.end(); ++it)
|
|
||||||
{
|
|
||||||
#ifdef NET_DEBUG
|
|
||||||
std::cerr << "NetworkDialog::insertConnect() inserting gpg key : " << *it << std::endl;
|
|
||||||
#endif
|
|
||||||
if (*it == rsPeers->getGPGOwnId()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
RsPeerDetails detail;
|
|
||||||
if (!rsPeers->getGPGDetails(*it, detail))
|
|
||||||
{
|
|
||||||
continue; /* BAD */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* make a widget per friend */
|
|
||||||
QTreeWidgetItem *item;
|
|
||||||
QList<QTreeWidgetItem *> list = connectWidget->findItems(QString::fromStdString( (*it).toStdString() ), Qt::MatchExactly, COLUMN_PEERID);
|
|
||||||
if (list.size() == 1) {
|
|
||||||
item = list.front();
|
|
||||||
} else {
|
|
||||||
//create new item
|
|
||||||
#ifdef NET_DEBUG
|
|
||||||
std::cerr << "NetworkDialog::insertConnect() creating new tree widget item : " << *it << std::endl;
|
|
||||||
#endif
|
|
||||||
item = new RSTreeWidgetItem(compareNetworkRole, 0);
|
|
||||||
item -> setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
|
|
||||||
|
|
||||||
int S = QFontMetricsF(font()).height() ;
|
|
||||||
item -> setSizeHint(COLUMN_CHECK, QSize( S,S ) );
|
|
||||||
|
|
||||||
/* (1) Person */
|
|
||||||
item -> setText(COLUMN_PEERNAME, QString::fromUtf8(detail.name.c_str()));
|
|
||||||
|
|
||||||
/* (4) key id */
|
|
||||||
item -> setText(COLUMN_PEERID, QString::fromStdString(detail.gpg_id.toStdString()));
|
|
||||||
}
|
|
||||||
|
|
||||||
//QString TrustLevelString ;
|
|
||||||
|
|
||||||
/* (2) Key validity */
|
|
||||||
if (detail.ownsign)
|
|
||||||
{
|
|
||||||
item -> setText(COLUMN_I_AUTH_PEER, tr("Personal signature"));
|
|
||||||
item -> setToolTip(COLUMN_I_AUTH_PEER, tr("PGP key signed by you"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
switch(detail.trustLvl)
|
|
||||||
{
|
|
||||||
case RS_TRUST_LVL_MARGINAL: item->setText(COLUMN_I_AUTH_PEER,tr("Marginally trusted peer")) ; break;
|
|
||||||
case RS_TRUST_LVL_FULL:
|
|
||||||
case RS_TRUST_LVL_ULTIMATE: item->setText(COLUMN_I_AUTH_PEER,tr("Fully trusted peer")) ; break ;
|
|
||||||
case RS_TRUST_LVL_UNKNOWN:
|
|
||||||
case RS_TRUST_LVL_UNDEFINED:
|
|
||||||
case RS_TRUST_LVL_NEVER:
|
|
||||||
default: item->setText(2,tr("Untrusted peer")) ; break ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (3) has me auth */
|
|
||||||
QString PeerAuthenticationString ;
|
|
||||||
|
|
||||||
if (detail.hasSignedMe)
|
|
||||||
PeerAuthenticationString = tr("Yes");
|
|
||||||
else
|
|
||||||
PeerAuthenticationString = tr("No");
|
|
||||||
|
|
||||||
item->setText(COLUMN_PEER_AUTH_ME,PeerAuthenticationString) ;
|
|
||||||
|
|
||||||
uint64_t last_time_used = now - detail.lastUsed ;
|
|
||||||
QString lst_used_str ;
|
|
||||||
|
|
||||||
if(last_time_used < 3600)
|
|
||||||
lst_used_str = tr("Last hour") ;
|
|
||||||
else if(last_time_used < 86400)
|
|
||||||
lst_used_str = tr("Today") ;
|
|
||||||
else if(last_time_used > 86400 * 15000)
|
|
||||||
lst_used_str = tr("Never");
|
|
||||||
else
|
|
||||||
lst_used_str = tr("%1 days ago").arg((int)( last_time_used / 86400 )) ;
|
|
||||||
|
|
||||||
QString lst_used_sort_str = QString::number(detail.lastUsed,'f',10);
|
|
||||||
|
|
||||||
item->setText(COLUMN_LAST_USED,lst_used_str) ;
|
|
||||||
item->setData(COLUMN_LAST_USED,ROLE_SORT,lst_used_sort_str) ;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determinated the Background Color
|
|
||||||
*/
|
|
||||||
QColor backgrndcolor;
|
|
||||||
|
|
||||||
if (detail.accept_connection)
|
|
||||||
{
|
|
||||||
item -> setText(COLUMN_CHECK, "0");
|
|
||||||
item -> setIcon(COLUMN_CHECK,(QIcon(IMAGE_AUTHED)));
|
|
||||||
if (detail.ownsign)
|
|
||||||
{
|
|
||||||
backgrndcolor = backgroundColorOwnSign();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
backgrndcolor = backgroundColorAcceptConnection();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
item -> setText(COLUMN_CHECK, "1");
|
|
||||||
|
|
||||||
if (detail.hasSignedMe)
|
|
||||||
{
|
|
||||||
backgrndcolor = backgroundColorHasSignedMe();
|
|
||||||
item -> setIcon(COLUMN_CHECK,(QIcon(IMAGE_DENIED)));
|
|
||||||
for(int k=0;k<COLUMN_COUNT;++k)
|
|
||||||
item -> setToolTip(k, QString::fromUtf8(detail.name.c_str()) + tr(" has authenticated you. \nRight-click and select 'make friend' to be able to connect."));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
backgrndcolor = backgroundColorDenied();
|
|
||||||
item -> setIcon(COLUMN_CHECK,(QIcon(IMAGE_DENIED)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Color each Background column in the Network Tab except the first one => 1-9
|
|
||||||
// whith the determinated color
|
|
||||||
for(int i = 0; i <COLUMN_COUNT; ++i)
|
|
||||||
item -> setBackground(i,QBrush(backgrndcolor));
|
|
||||||
|
|
||||||
if( (detail.accept_connection || detail.validLvl >= RS_TRUST_LVL_MARGINAL) || !ui.onlyTrustedKeys->isChecked())
|
|
||||||
connectWidget->addTopLevelItem(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
// add self to network.
|
|
||||||
RsPeerDetails ownGPGDetails;
|
|
||||||
rsPeers->getGPGDetails(rsPeers->getGPGOwnId(), ownGPGDetails);
|
|
||||||
/* make a widget per friend */
|
|
||||||
QTreeWidgetItem *self_item;
|
|
||||||
QList<QTreeWidgetItem *> list = connectWidget->findItems(QString::fromStdString(ownGPGDetails.gpg_id.toStdString()), Qt::MatchExactly, COLUMN_PEERID);
|
|
||||||
if (list.size() == 1) {
|
|
||||||
self_item = list.front();
|
|
||||||
} else {
|
|
||||||
self_item = new RSTreeWidgetItem(compareNetworkRole, 0);
|
|
||||||
self_item->setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
|
|
||||||
}
|
|
||||||
self_item -> setText(COLUMN_CHECK, "0");
|
|
||||||
self_item->setIcon(COLUMN_CHECK,(QIcon(IMAGE_AUTHED)));
|
|
||||||
self_item->setText(COLUMN_PEERNAME, QString::fromUtf8(ownGPGDetails.name.c_str()) + " (" + tr("yourself") + ")");
|
|
||||||
self_item->setText(COLUMN_I_AUTH_PEER,"N/A");
|
|
||||||
self_item->setText(COLUMN_PEERID, QString::fromStdString(ownGPGDetails.gpg_id.toStdString()));
|
|
||||||
|
|
||||||
// Color each Background column in the Network Tab except the first one => 1-9
|
|
||||||
for(int i=0;i<COLUMN_COUNT;++i)
|
|
||||||
{
|
|
||||||
self_item->setBackground(i,backgroundColorSelf()) ;
|
|
||||||
}
|
|
||||||
connectWidget->addTopLevelItem(self_item);
|
|
||||||
|
|
||||||
/* enable sorting */
|
|
||||||
connectWidget->setSortingEnabled(true);
|
|
||||||
/* update display */
|
|
||||||
connectWidget->update();
|
|
||||||
|
|
||||||
if (ui.filterLineEdit->text().isEmpty() == false) {
|
|
||||||
filterItems(ui.filterLineEdit->text());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
QTreeWidgetItem *NetworkDialog::getCurrentNeighbour()
|
|
||||||
{
|
|
||||||
if (ui.connectTreeWidget->selectedItems().size() != 0)
|
|
||||||
{
|
|
||||||
return ui.connectTreeWidget -> currentItem();
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Utility Fns */
|
/* Utility Fns */
|
||||||
RsPeerId getNeighRsCertId(QTreeWidgetItem *i)
|
/*RsPeerId getNeighRsCertId(QTreeWidgetItem *i)
|
||||||
{
|
{
|
||||||
RsPeerId id ( (i -> text(COLUMN_PEERID)).toStdString() );
|
RsPeerId id ( (i -> text(COLUMN_PEERID)).toStdString() );
|
||||||
return id;
|
return id;
|
||||||
}
|
} */
|
||||||
void NetworkDialog::on_actionAddFriend_activated()
|
void NetworkDialog::on_actionAddFriend_activated()
|
||||||
{
|
{
|
||||||
// /* Create a new input dialog, which allows users to create files, too */
|
// /* Create a new input dialog, which allows users to create files, too */
|
||||||
@ -700,44 +477,23 @@ void NetworkDialog::on_actionCreate_New_Profile_activated()
|
|||||||
// Settings->endGroup();
|
// Settings->endGroup();
|
||||||
// }
|
// }
|
||||||
|
|
||||||
void NetworkDialog::filterColumnChanged(int)
|
void NetworkDialog::filterColumnChanged(int col)
|
||||||
{
|
{
|
||||||
filterItems(ui.filterLineEdit->text());
|
if(PGPIdItemProxy)
|
||||||
|
PGPIdItemProxy->setFilterKeyColumn(col);
|
||||||
|
//filterItems(ui.filterLineEdit->text());
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkDialog::filterItems(const QString &text)
|
|
||||||
{
|
|
||||||
int filterColumn = ui.filterLineEdit->currentFilter();
|
|
||||||
|
|
||||||
int count = ui.connectTreeWidget->topLevelItemCount ();
|
|
||||||
for (int index = 0; index < count; ++index) {
|
void NetworkDialog::updateDisplay()
|
||||||
filterItem(ui.connectTreeWidget->topLevelItem(index), text, filterColumn);
|
{
|
||||||
}
|
if (!rsPeers)
|
||||||
|
return;
|
||||||
|
//update ids list
|
||||||
|
std::list<RsPgpId> new_neighs;
|
||||||
|
rsPeers->getGPGAllList(new_neighs);
|
||||||
|
//refresh model
|
||||||
|
PGPIdItemModel->data_updated(new_neighs);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NetworkDialog::filterItem(QTreeWidgetItem *item, const QString &text, int filterColumn)
|
|
||||||
{
|
|
||||||
bool visible = true;
|
|
||||||
|
|
||||||
if (text.isEmpty() == false) {
|
|
||||||
if (item->text(filterColumn).contains(text, Qt::CaseInsensitive) == false) {
|
|
||||||
visible = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int visibleChildCount = 0;
|
|
||||||
int count = item->childCount();
|
|
||||||
for (int index = 0; index < count; ++index) {
|
|
||||||
if (filterItem(item->child(index), text, filterColumn)) {
|
|
||||||
++visibleChildCount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (visible || visibleChildCount) {
|
|
||||||
item->setHidden(false);
|
|
||||||
} else {
|
|
||||||
item->setHidden(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (visible || visibleChildCount);
|
|
||||||
}
|
|
||||||
|
@ -25,6 +25,11 @@
|
|||||||
|
|
||||||
#include "ui_NetworkDialog.h"
|
#include "ui_NetworkDialog.h"
|
||||||
#include "RsAutoUpdatePage.h"
|
#include "RsAutoUpdatePage.h"
|
||||||
|
#include "gui/NetworkDialog/pgpid_item_model.h"
|
||||||
|
#include "gui/NetworkDialog/pgpid_item_proxy.h"
|
||||||
|
|
||||||
|
//tmp
|
||||||
|
class QTreeWidgetItem;
|
||||||
|
|
||||||
class RSTreeWidgetItemCompareRole ;
|
class RSTreeWidgetItemCompareRole ;
|
||||||
|
|
||||||
@ -42,9 +47,8 @@ public:
|
|||||||
/** Default Constructor */
|
/** Default Constructor */
|
||||||
NetworkDialog(QWidget *parent = 0);
|
NetworkDialog(QWidget *parent = 0);
|
||||||
|
|
||||||
//void load();
|
|
||||||
virtual void updateDisplay() ; // overloaded from RsAutoUpdatePage
|
virtual void updateDisplay() ; // overloaded from RsAutoUpdatePage
|
||||||
|
|
||||||
QColor backgroundColorSelf() const { return mBackgroundColorSelf; }
|
QColor backgroundColorSelf() const { return mBackgroundColorSelf; }
|
||||||
QColor backgroundColorOwnSign() const { return mBackgroundColorOwnSign; }
|
QColor backgroundColorOwnSign() const { return mBackgroundColorOwnSign; }
|
||||||
QColor backgroundColorAcceptConnection() const { return mBackgroundColorAcceptConnection; }
|
QColor backgroundColorAcceptConnection() const { return mBackgroundColorAcceptConnection; }
|
||||||
@ -58,7 +62,7 @@ public:
|
|||||||
void setBackgroundColorDenied(QColor color) { mBackgroundColorDenied = color; }
|
void setBackgroundColorDenied(QColor color) { mBackgroundColorDenied = color; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void insertConnect();
|
// void insertConnect();
|
||||||
// std::string loadneighbour();
|
// std::string loadneighbour();
|
||||||
/* void loadneighbour(); */
|
/* void loadneighbour(); */
|
||||||
//void updateNewDiscoveryInfo() ;
|
//void updateNewDiscoveryInfo() ;
|
||||||
@ -68,7 +72,7 @@ protected:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void removeUnusedKeys() ;
|
void removeUnusedKeys() ;
|
||||||
void makeFriend() ;
|
void makeFriend() ;
|
||||||
void denyFriend() ;
|
void denyFriend() ;
|
||||||
// void deleteCert() ;
|
// void deleteCert() ;
|
||||||
@ -104,14 +108,15 @@ private slots:
|
|||||||
// void on_actionTabsTriangular_activated();
|
// void on_actionTabsTriangular_activated();
|
||||||
|
|
||||||
void filterColumnChanged(int);
|
void filterColumnChanged(int);
|
||||||
void filterItems(const QString &text);
|
// void filterItems(const QString &text);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QTreeWidgetItem *getCurrentNeighbour();
|
|
||||||
|
|
||||||
// class NetworkView *networkview;
|
// class NetworkView *networkview;
|
||||||
|
|
||||||
bool filterItem(QTreeWidgetItem *item, const QString &text, int filterColumn);
|
// bool filterItem(QTreeWidgetItem *item, const QString &text, int filterColumn);
|
||||||
|
|
||||||
/* Color definitions (for standard see qss.default) */
|
/* Color definitions (for standard see qss.default) */
|
||||||
QColor mBackgroundColorSelf;
|
QColor mBackgroundColorSelf;
|
||||||
@ -122,6 +127,12 @@ private:
|
|||||||
|
|
||||||
RSTreeWidgetItemCompareRole *compareNetworkRole ;
|
RSTreeWidgetItemCompareRole *compareNetworkRole ;
|
||||||
|
|
||||||
|
//iinternal long lived data
|
||||||
|
std::list<RsPgpId> neighs;
|
||||||
|
|
||||||
|
pgpid_item_model *PGPIdItemModel;
|
||||||
|
pgpid_item_proxy *PGPIdItemProxy;
|
||||||
|
|
||||||
/** Qt Designer generated object */
|
/** Qt Designer generated object */
|
||||||
Ui::NetworkDialog ui;
|
Ui::NetworkDialog ui;
|
||||||
};
|
};
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QTreeWidget" name="connectTreeWidget">
|
<widget class="QTableView" name="connectTreeWidget">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
@ -66,63 +66,6 @@
|
|||||||
<height>16</height>
|
<height>16</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="uniformRowHeights">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="sortingEnabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="animated">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="allColumnsShowFocus">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<attribute name="headerCascadingSectionResizes">
|
|
||||||
<bool>true</bool>
|
|
||||||
</attribute>
|
|
||||||
<attribute name="headerDefaultSectionSize">
|
|
||||||
<number>200</number>
|
|
||||||
</attribute>
|
|
||||||
<attribute name="headerStretchLastSection">
|
|
||||||
<bool>true</bool>
|
|
||||||
</attribute>
|
|
||||||
<column>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</column>
|
|
||||||
<column>
|
|
||||||
<property name="text">
|
|
||||||
<string>Profile</string>
|
|
||||||
</property>
|
|
||||||
</column>
|
|
||||||
<column>
|
|
||||||
<property name="text">
|
|
||||||
<string>Did I authenticated peer</string>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Did I sign his PGP key</string>
|
|
||||||
</property>
|
|
||||||
</column>
|
|
||||||
<column>
|
|
||||||
<property name="text">
|
|
||||||
<string>Has signed my key</string>
|
|
||||||
</property>
|
|
||||||
</column>
|
|
||||||
<column>
|
|
||||||
<property name="text">
|
|
||||||
<string>Cert Id</string>
|
|
||||||
</property>
|
|
||||||
</column>
|
|
||||||
<column>
|
|
||||||
<property name="text">
|
|
||||||
<string>Last used</string>
|
|
||||||
</property>
|
|
||||||
</column>
|
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
342
retroshare-gui/src/gui/NetworkDialog/pgpid_item_model.cpp
Normal file
342
retroshare-gui/src/gui/NetworkDialog/pgpid_item_model.cpp
Normal file
@ -0,0 +1,342 @@
|
|||||||
|
#include "pgpid_item_model.h"
|
||||||
|
#include <retroshare/rspeers.h>
|
||||||
|
#include <QIcon>
|
||||||
|
|
||||||
|
#define IMAGE_AUTHED ":/images/accepted16.png"
|
||||||
|
#define IMAGE_DENIED ":/images/denied16.png"
|
||||||
|
#define IMAGE_TRUSTED ":/images/rs-2.png"
|
||||||
|
|
||||||
|
/*TODO:
|
||||||
|
* using list here for internal data storage is not best option
|
||||||
|
*/
|
||||||
|
pgpid_item_model::pgpid_item_model(std::list<RsPgpId> &neighs_, float &_font_height, QObject *parent)
|
||||||
|
: QAbstractTableModel(parent), neighs(neighs_), font_height(_font_height)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant pgpid_item_model::headerData(int section, Qt::Orientation orientation, int role) const
|
||||||
|
{
|
||||||
|
if(orientation == Qt::Horizontal)
|
||||||
|
{
|
||||||
|
if(role == Qt::ToolTipRole)
|
||||||
|
{
|
||||||
|
switch(section)
|
||||||
|
{
|
||||||
|
case COLUMN_CHECK:
|
||||||
|
return QString(tr(" Do you accept connections signed by this profile?"));
|
||||||
|
break;
|
||||||
|
case COLUMN_PEERNAME:
|
||||||
|
return QString(tr("Name of the profile"));
|
||||||
|
break;
|
||||||
|
case COLUMN_I_AUTH_PEER:
|
||||||
|
return QString(tr("This column indicates trust level and whether you signed the profile PGP key"));
|
||||||
|
break;
|
||||||
|
case COLUMN_PEER_AUTH_ME:
|
||||||
|
return QString(tr("Did that peer sign your own profile PGP key"));
|
||||||
|
break;
|
||||||
|
case COLUMN_PEERID:
|
||||||
|
return QString(tr("PGP Key Id of that profile"));
|
||||||
|
break;
|
||||||
|
case COLUMN_LAST_USED:
|
||||||
|
return QString(tr("Last time this key was used (received time, or to check connection)"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(role == Qt::DisplayRole)
|
||||||
|
{
|
||||||
|
switch(section)
|
||||||
|
{
|
||||||
|
case COLUMN_CHECK:
|
||||||
|
return QString(tr("Connections"));
|
||||||
|
break;
|
||||||
|
case COLUMN_PEERNAME:
|
||||||
|
return QString(tr("Profile"));
|
||||||
|
break;
|
||||||
|
case COLUMN_I_AUTH_PEER:
|
||||||
|
return QString(tr("Trust level"));
|
||||||
|
break;
|
||||||
|
case COLUMN_PEER_AUTH_ME:
|
||||||
|
return QString(tr("Has signed your key?"));
|
||||||
|
break;
|
||||||
|
case COLUMN_PEERID:
|
||||||
|
return QString(tr("Id"));
|
||||||
|
break;
|
||||||
|
case COLUMN_LAST_USED:
|
||||||
|
return QString(tr("Last used"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (role == Qt::TextAlignmentRole)
|
||||||
|
{
|
||||||
|
switch(section)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
return (uint32_t)(Qt::AlignHCenter | Qt::AlignVCenter);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(role == Qt::SizeHintRole)
|
||||||
|
{
|
||||||
|
switch(section)
|
||||||
|
{
|
||||||
|
case COLUMN_CHECK:
|
||||||
|
return 25*font_height;
|
||||||
|
break;
|
||||||
|
case COLUMN_PEERNAME: case COLUMN_I_AUTH_PEER: case COLUMN_PEER_AUTH_ME:
|
||||||
|
return 200*font_height;
|
||||||
|
break;
|
||||||
|
case COLUMN_LAST_USED:
|
||||||
|
return 75*font_height;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int pgpid_item_model::rowCount(const QModelIndex &/*parent*/) const
|
||||||
|
{
|
||||||
|
return neighs.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
int pgpid_item_model::columnCount(const QModelIndex &/*parent*/) const
|
||||||
|
{
|
||||||
|
return COLUMN_COUNT;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QVariant pgpid_item_model::data(const QModelIndex &index, int role) const
|
||||||
|
{
|
||||||
|
if (!index.isValid())
|
||||||
|
return QVariant();
|
||||||
|
|
||||||
|
if((unsigned)index.row() >= neighs.size())
|
||||||
|
return QVariant();
|
||||||
|
|
||||||
|
|
||||||
|
//shit code (please rewrite it)
|
||||||
|
|
||||||
|
std::list<RsPgpId>::iterator it = neighs.begin();
|
||||||
|
for(int i = 0; i < index.row(); i++)
|
||||||
|
it++;
|
||||||
|
RsPeerDetails detail;
|
||||||
|
if (!rsPeers->getGPGDetails(*it, detail))
|
||||||
|
return QVariant();
|
||||||
|
//shit code end
|
||||||
|
if(role == Qt::EditRole) //some columns return raw data for editrole, used for proper filtering
|
||||||
|
{
|
||||||
|
switch(index.column())
|
||||||
|
{
|
||||||
|
case COLUMN_LAST_USED:
|
||||||
|
return detail.lastUsed;
|
||||||
|
break;
|
||||||
|
case COLUMN_I_AUTH_PEER:
|
||||||
|
{
|
||||||
|
if (detail.ownsign)
|
||||||
|
return RS_TRUST_LVL_ULTIMATE;
|
||||||
|
return detail.trustLvl;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case COLUMN_PEER_AUTH_ME:
|
||||||
|
return detail.hasSignedMe;
|
||||||
|
break;
|
||||||
|
case COLUMN_CHECK:
|
||||||
|
return detail.accept_connection;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if(role == Qt::DisplayRole || role == Qt::EditRole)
|
||||||
|
{
|
||||||
|
switch(index.column())
|
||||||
|
{
|
||||||
|
case COLUMN_PEERNAME:
|
||||||
|
return QString::fromUtf8(detail.name.c_str());
|
||||||
|
break;
|
||||||
|
case COLUMN_PEERID:
|
||||||
|
return QString::fromStdString(detail.gpg_id.toStdString());
|
||||||
|
break;
|
||||||
|
case COLUMN_I_AUTH_PEER:
|
||||||
|
{
|
||||||
|
if (detail.ownsign)
|
||||||
|
return tr("Personal signature");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch(detail.trustLvl)
|
||||||
|
{
|
||||||
|
case RS_TRUST_LVL_MARGINAL: return tr("Marginally trusted peer") ; break;
|
||||||
|
case RS_TRUST_LVL_FULL:
|
||||||
|
case RS_TRUST_LVL_ULTIMATE: return tr("Fully trusted peer") ; break ;
|
||||||
|
case RS_TRUST_LVL_UNKNOWN:
|
||||||
|
case RS_TRUST_LVL_UNDEFINED:
|
||||||
|
case RS_TRUST_LVL_NEVER:
|
||||||
|
default: return tr("Untrusted peer") ; break ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case COLUMN_PEER_AUTH_ME:
|
||||||
|
{
|
||||||
|
if (detail.hasSignedMe)
|
||||||
|
return tr("Yes");
|
||||||
|
else
|
||||||
|
return tr("No");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case COLUMN_LAST_USED:
|
||||||
|
{
|
||||||
|
time_t now = time(NULL);
|
||||||
|
uint64_t last_time_used = now - detail.lastUsed ;
|
||||||
|
QString lst_used_str ;
|
||||||
|
|
||||||
|
if(last_time_used < 3600)
|
||||||
|
lst_used_str = tr("Last hour") ;
|
||||||
|
else if(last_time_used < 86400)
|
||||||
|
lst_used_str = tr("Today") ;
|
||||||
|
else if(last_time_used > 86400 * 15000)
|
||||||
|
lst_used_str = tr("Never");
|
||||||
|
else
|
||||||
|
lst_used_str = tr("%1 days ago").arg((int)( last_time_used / 86400 )) ;
|
||||||
|
|
||||||
|
|
||||||
|
return lst_used_str;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case COLUMN_CHECK:
|
||||||
|
{
|
||||||
|
if (detail.accept_connection)
|
||||||
|
{
|
||||||
|
return tr("Accepted");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return tr(" - ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(role == Qt::ToolTipRole)
|
||||||
|
{
|
||||||
|
switch(index.column())
|
||||||
|
{
|
||||||
|
case COLUMN_I_AUTH_PEER:
|
||||||
|
{
|
||||||
|
if (detail.ownsign)
|
||||||
|
return tr("PGP key signed by you");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
if (!detail.accept_connection && detail.hasSignedMe)
|
||||||
|
{
|
||||||
|
return QString::fromUtf8(detail.name.c_str()) + tr(" has authenticated you. \nRight-click and select 'make friend' to be able to connect.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(role == Qt::DecorationRole)
|
||||||
|
{
|
||||||
|
switch(index.column())
|
||||||
|
{
|
||||||
|
case COLUMN_CHECK:
|
||||||
|
{
|
||||||
|
if (detail.accept_connection)
|
||||||
|
return QIcon(IMAGE_AUTHED);
|
||||||
|
else
|
||||||
|
return QIcon(IMAGE_DENIED);
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(role == Qt::BackgroundRole)
|
||||||
|
{
|
||||||
|
switch(index.column())
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
//TODO: add access to bckground colors from networkdialog
|
||||||
|
if (detail.accept_connection)
|
||||||
|
{
|
||||||
|
if (detail.ownsign)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//following code is just a poc, it's still suboptimal, unefficient, but much better then existing rs code
|
||||||
|
|
||||||
|
void pgpid_item_model::data_updated(std::list<RsPgpId> &new_neighs)
|
||||||
|
{
|
||||||
|
|
||||||
|
//shit code follow (rewrite this please)
|
||||||
|
size_t old_size = neighs.size(), new_size = 0;
|
||||||
|
std::list<RsPgpId> old_neighs = neighs;
|
||||||
|
|
||||||
|
new_size = new_neighs.size();
|
||||||
|
//set model data to new cleaned up data
|
||||||
|
neighs = new_neighs;
|
||||||
|
neighs.sort();
|
||||||
|
neighs.unique(); //remove possible dups
|
||||||
|
|
||||||
|
//reflect actual row count in model
|
||||||
|
if(old_size < new_size)
|
||||||
|
{
|
||||||
|
beginInsertRows(QModelIndex(), old_size - 1, old_size - 1 + new_size - old_size);
|
||||||
|
insertRows(old_size - 1 , new_size - old_size);
|
||||||
|
endInsertRows();
|
||||||
|
}
|
||||||
|
else if(new_size < old_size)
|
||||||
|
{
|
||||||
|
beginRemoveRows(QModelIndex(), new_size - 1, new_size - 1 + old_size - new_size);
|
||||||
|
removeRows(old_size - 1, old_size - new_size);
|
||||||
|
endRemoveRows();
|
||||||
|
}
|
||||||
|
//update data in ui, to avoid unnecessary redraw and ui updates, updating only changed elements
|
||||||
|
//TODO: libretroshare should implement a way to obtain only changed elements via some signalling non-blocking api.
|
||||||
|
{
|
||||||
|
size_t ii1 = 0;
|
||||||
|
for(auto i1 = neighs.begin(), end1 = neighs.end(), i2 = old_neighs.begin(), end2 = old_neighs.end(); i1 != end1; ++i1, ++i2, ii1++)
|
||||||
|
{
|
||||||
|
if(i2 == end2)
|
||||||
|
break;
|
||||||
|
if(*i1 != *i2)
|
||||||
|
{
|
||||||
|
QModelIndex topLeft = createIndex(ii1,0), bottomRight = createIndex(ii1, COLUMN_COUNT-1);
|
||||||
|
emit dataChanged(topLeft, bottomRight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(new_size > old_size)
|
||||||
|
{
|
||||||
|
QModelIndex topLeft = createIndex(old_size ? old_size -1 : 0 ,0), bottomRight = createIndex(new_size -1, COLUMN_COUNT-1);
|
||||||
|
emit dataChanged(topLeft, bottomRight);
|
||||||
|
}
|
||||||
|
//dirty solution for initial data fetch
|
||||||
|
//TODO: do it properly!
|
||||||
|
if(!old_size)
|
||||||
|
{
|
||||||
|
beginResetModel();
|
||||||
|
endResetModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
//shit code end
|
||||||
|
}
|
||||||
|
|
40
retroshare-gui/src/gui/NetworkDialog/pgpid_item_model.h
Normal file
40
retroshare-gui/src/gui/NetworkDialog/pgpid_item_model.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#ifndef KEY_ITEM_MODEL_H
|
||||||
|
#define KEY_ITEM_MODEL_H
|
||||||
|
|
||||||
|
#include <QAbstractItemModel>
|
||||||
|
#include <retroshare/rspeers.h>
|
||||||
|
|
||||||
|
#define COLUMN_CHECK 0
|
||||||
|
#define COLUMN_PEERNAME 1
|
||||||
|
#define COLUMN_I_AUTH_PEER 2
|
||||||
|
#define COLUMN_PEER_AUTH_ME 3
|
||||||
|
#define COLUMN_PEERID 4
|
||||||
|
#define COLUMN_LAST_USED 5
|
||||||
|
#define COLUMN_COUNT 6
|
||||||
|
|
||||||
|
|
||||||
|
class pgpid_item_model : public QAbstractTableModel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit pgpid_item_model(std::list<RsPgpId> &neighs, float &font_height, QObject *parent = nullptr);
|
||||||
|
|
||||||
|
// Header:
|
||||||
|
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
||||||
|
|
||||||
|
|
||||||
|
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||||
|
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||||
|
|
||||||
|
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void data_updated(std::list<RsPgpId> &new_neighs);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::list<RsPgpId> &neighs;
|
||||||
|
float &font_height;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // KEY_ITEM_MODEL_H
|
48
retroshare-gui/src/gui/NetworkDialog/pgpid_item_proxy.cpp
Normal file
48
retroshare-gui/src/gui/NetworkDialog/pgpid_item_proxy.cpp
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#include "pgpid_item_proxy.h"
|
||||||
|
|
||||||
|
//TODO: include only required headers here
|
||||||
|
#include <retroshare/rsiface.h>
|
||||||
|
#include <retroshare/rspeers.h>
|
||||||
|
#include <retroshare/rsdisc.h>
|
||||||
|
#include <retroshare/rsmsgs.h>
|
||||||
|
|
||||||
|
|
||||||
|
//TODO: set this defines in one place
|
||||||
|
// Defines for key list columns
|
||||||
|
#define COLUMN_CHECK 0
|
||||||
|
#define COLUMN_PEERNAME 1
|
||||||
|
#define COLUMN_I_AUTH_PEER 2
|
||||||
|
#define COLUMN_PEER_AUTH_ME 3
|
||||||
|
#define COLUMN_PEERID 4
|
||||||
|
#define COLUMN_LAST_USED 5
|
||||||
|
#define COLUMN_COUNT 6
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
pgpid_item_proxy::pgpid_item_proxy(QObject *parent) :
|
||||||
|
QSortFilterProxyModel(parent)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void pgpid_item_proxy::use_only_trusted_keys(bool val)
|
||||||
|
{
|
||||||
|
only_trusted_keys = val;
|
||||||
|
filterChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool pgpid_item_proxy::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
|
||||||
|
{
|
||||||
|
if(only_trusted_keys)
|
||||||
|
{
|
||||||
|
if(!rsPeers)
|
||||||
|
return false;
|
||||||
|
RsPgpId peer_id (sourceModel()->data(sourceModel()->index(sourceRow, COLUMN_PEERID, sourceParent)).toString().toStdString());
|
||||||
|
RsPeerDetails details;
|
||||||
|
if(!rsPeers->getGPGDetails(peer_id, details))
|
||||||
|
return false;
|
||||||
|
if(details.validLvl < RS_TRUST_LVL_MARGINAL)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent);
|
||||||
|
}
|
21
retroshare-gui/src/gui/NetworkDialog/pgpid_item_proxy.h
Normal file
21
retroshare-gui/src/gui/NetworkDialog/pgpid_item_proxy.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#ifndef PGPID_ITEM_PROXY_H
|
||||||
|
#define PGPID_ITEM_PROXY_H
|
||||||
|
|
||||||
|
#include <QSortFilterProxyModel>
|
||||||
|
|
||||||
|
class pgpid_item_proxy :
|
||||||
|
public QSortFilterProxyModel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
pgpid_item_proxy(QObject *parent = nullptr);
|
||||||
|
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
|
||||||
|
public slots:
|
||||||
|
void use_only_trusted_keys(bool val);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool only_trusted_keys = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // PGPID_ITEM_PROXY_H
|
@ -416,7 +416,7 @@ feenableexcept(FE_INVALID | FE_DIVBYZERO);
|
|||||||
QObject::connect(notify,SIGNAL(chatStatusChanged(const QString&,const QString&,bool)),w->friendsDialog,SLOT(updatePeerStatusString(const QString&,const QString&,bool)));
|
QObject::connect(notify,SIGNAL(chatStatusChanged(const QString&,const QString&,bool)),w->friendsDialog,SLOT(updatePeerStatusString(const QString&,const QString&,bool)));
|
||||||
QObject::connect(notify,SIGNAL(ownStatusMessageChanged()),w->friendsDialog,SLOT(loadmypersonalstatus()));
|
QObject::connect(notify,SIGNAL(ownStatusMessageChanged()),w->friendsDialog,SLOT(loadmypersonalstatus()));
|
||||||
|
|
||||||
QObject::connect(notify,SIGNAL(logInfoChanged(const QString&)) ,w->friendsDialog->networkDialog,SLOT(setLogInfo(QString))) ;
|
// QObject::connect(notify,SIGNAL(logInfoChanged(const QString&)) ,w->friendsDialog->networkDialog,SLOT(setLogInfo(QString))) ;
|
||||||
QObject::connect(notify,SIGNAL(discInfoChanged()) ,w->friendsDialog->networkView,SLOT(update()),Qt::QueuedConnection) ;
|
QObject::connect(notify,SIGNAL(discInfoChanged()) ,w->friendsDialog->networkView,SLOT(update()),Qt::QueuedConnection) ;
|
||||||
QObject::connect(notify,SIGNAL(errorOccurred(int,int,const QString&)),w,SLOT(displayErrorMessage(int,int,const QString&))) ;
|
QObject::connect(notify,SIGNAL(errorOccurred(int,int,const QString&)),w,SLOT(displayErrorMessage(int,int,const QString&))) ;
|
||||||
|
|
||||||
|
@ -565,8 +565,9 @@ HEADERS += rshare.h \
|
|||||||
gui/statistics/BWGraph.h \
|
gui/statistics/BWGraph.h \
|
||||||
util/RsSyntaxHighlighter.h \
|
util/RsSyntaxHighlighter.h \
|
||||||
util/imageutil.h \
|
util/imageutil.h \
|
||||||
|
gui/NetworkDialog/pgpid_item_model.h \
|
||||||
|
gui/NetworkDialog/pgpid_item_proxy.h \
|
||||||
gui/common/RsCollection.h
|
gui/common/RsCollection.h
|
||||||
|
|
||||||
# gui/ForumsDialog.h \
|
# gui/ForumsDialog.h \
|
||||||
# gui/forums/ForumDetails.h \
|
# gui/forums/ForumDetails.h \
|
||||||
# gui/forums/EditForumDetails.h \
|
# gui/forums/EditForumDetails.h \
|
||||||
@ -925,8 +926,9 @@ SOURCES += main.cpp \
|
|||||||
gui/statistics/BWGraph.cpp \
|
gui/statistics/BWGraph.cpp \
|
||||||
util/RsSyntaxHighlighter.cpp \
|
util/RsSyntaxHighlighter.cpp \
|
||||||
util/imageutil.cpp \
|
util/imageutil.cpp \
|
||||||
|
gui/NetworkDialog/pgpid_item_model.cpp \
|
||||||
|
gui/NetworkDialog/pgpid_item_proxy.cpp \
|
||||||
gui/common/RsCollection.cpp
|
gui/common/RsCollection.cpp
|
||||||
|
|
||||||
# gui/ForumsDialog.cpp \
|
# gui/ForumsDialog.cpp \
|
||||||
# gui/forums/ForumDetails.cpp \
|
# gui/forums/ForumDetails.cpp \
|
||||||
# gui/forums/EditForumDetails.cpp \
|
# gui/forums/EditForumDetails.cpp \
|
||||||
|
Loading…
Reference in New Issue
Block a user