mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-10-01 02:35:48 -04:00
GxsIdChooser
- Sort items - Added timer to load not cached RsGxsId's git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@6458 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
233953cab9
commit
02f36b3bbb
@ -23,17 +23,32 @@
|
|||||||
|
|
||||||
#include "GxsIdChooser.h"
|
#include "GxsIdChooser.h"
|
||||||
|
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QSortFilterProxyModel>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include <retroshare/rspeers.h>
|
#include <retroshare/rspeers.h>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
#define MAX_TRY 10 // 5 seconds
|
||||||
|
|
||||||
|
#define ROLE_SORT Qt::UserRole + 1 // Qt::UserRole is reserved for data
|
||||||
|
|
||||||
/** Constructor */
|
/** Constructor */
|
||||||
GxsIdChooser::GxsIdChooser(QWidget *parent)
|
GxsIdChooser::GxsIdChooser(QWidget *parent)
|
||||||
: QComboBox(parent), mFlags(IDCHOOSER_ANON_DEFAULT), mDefaultId("")
|
: QComboBox(parent), mFlags(IDCHOOSER_ANON_DEFAULT), mDefaultId("")
|
||||||
{
|
{
|
||||||
return;
|
mTimer = NULL;
|
||||||
|
mTimerCount = 0;
|
||||||
|
|
||||||
|
/* Enable sort with own role */
|
||||||
|
QSortFilterProxyModel *proxy = new QSortFilterProxyModel(this);
|
||||||
|
proxy->setSourceModel(model());
|
||||||
|
model()->setParent(proxy);
|
||||||
|
setModel(proxy);
|
||||||
|
|
||||||
|
proxy->setSortRole(ROLE_SORT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GxsIdChooser::loadIds(uint32_t chooserFlags, RsGxsId defId)
|
void GxsIdChooser::loadIds(uint32_t chooserFlags, RsGxsId defId)
|
||||||
@ -44,38 +59,80 @@ void GxsIdChooser::loadIds(uint32_t chooserFlags, RsGxsId defId)
|
|||||||
loadPrivateIds();
|
loadPrivateIds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GxsIdChooser::MakeIdDesc(const RsGxsId &id, QString &desc)
|
||||||
bool MakeIdDesc(const RsGxsId &id, QString &desc)
|
|
||||||
{
|
{
|
||||||
RsIdentityDetails details;
|
RsIdentityDetails details;
|
||||||
|
|
||||||
if (!rsIdentity->getIdDetails(id, details))
|
bool found = rsIdentity->getIdDetails(id, details);
|
||||||
|
if (found)
|
||||||
{
|
{
|
||||||
return false;
|
desc = QString::fromUtf8(details.mNickname.c_str());
|
||||||
|
if (details.mPgpLinked)
|
||||||
|
{
|
||||||
|
desc += " (PGP) [";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
desc += " (Anon) [";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (mTimerCount <= MAX_TRY) {
|
||||||
|
desc = QString("%1 ... [").arg(tr("Loading"));
|
||||||
|
} else {
|
||||||
|
desc = QString("%1 ... [").arg(tr("Not found"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
desc = QString::fromUtf8(details.mNickname.c_str());
|
|
||||||
if (details.mPgpLinked)
|
|
||||||
{
|
|
||||||
desc += " (PGP) [";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
desc += " (Anon) [";
|
|
||||||
}
|
|
||||||
desc += QString::fromStdString(id.substr(0,5));
|
desc += QString::fromStdString(id.substr(0,5));
|
||||||
desc += "...]";
|
desc += "...]";
|
||||||
|
|
||||||
return true;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GxsIdChooser::addPrivateId(const RsGxsId &gxsId, bool replace)
|
||||||
|
{
|
||||||
|
QString str;
|
||||||
|
bool found = MakeIdDesc(gxsId, str);
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
/* Add to pending id's */
|
||||||
|
mPendingId.push_back(gxsId);
|
||||||
|
if (replace && mTimerCount <= MAX_TRY) {
|
||||||
|
/* Retry */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString id = QString::fromStdString(gxsId);
|
||||||
|
|
||||||
|
if (replace) {
|
||||||
|
/* Find and replace text of exisiting item */
|
||||||
|
int index = findData(id);
|
||||||
|
if (index >= 0) {
|
||||||
|
setItemText(index, str);
|
||||||
|
setItemData(index, QString("%1_%2").arg(found ? "1" : "2").arg(str), ROLE_SORT);
|
||||||
|
model()->sort(0);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add new item */
|
||||||
|
addItem(str, id);
|
||||||
|
setItemData(count() - 1, QString("%1_%2").arg(found ? "1" : "2").arg(str), ROLE_SORT);
|
||||||
|
model()->sort(0);
|
||||||
|
}
|
||||||
|
|
||||||
void GxsIdChooser::loadPrivateIds()
|
void GxsIdChooser::loadPrivateIds()
|
||||||
{
|
{
|
||||||
|
mPendingId.clear();
|
||||||
|
mTimerCount = 0;
|
||||||
|
if (mTimer) {
|
||||||
|
delete(mTimer);
|
||||||
|
}
|
||||||
|
|
||||||
std::list<RsGxsId> ids;
|
std::list<RsGxsId> ids;
|
||||||
rsIdentity->getOwnIds(ids);
|
rsIdentity->getOwnIds(ids);
|
||||||
|
|
||||||
|
|
||||||
if (ids.empty())
|
if (ids.empty())
|
||||||
{
|
{
|
||||||
std::cerr << "GxsIdChooser::loadPrivateIds() ERROR no ids";
|
std::cerr << "GxsIdChooser::loadPrivateIds() ERROR no ids";
|
||||||
@ -90,10 +147,11 @@ void GxsIdChooser::loadPrivateIds()
|
|||||||
if (!(mFlags & IDCHOOSER_ID_REQUIRED))
|
if (!(mFlags & IDCHOOSER_ID_REQUIRED))
|
||||||
{
|
{
|
||||||
/* add No Signature option */
|
/* add No Signature option */
|
||||||
QString str = "No Signature";
|
QString str = tr("No Signature");
|
||||||
QString id = "";
|
QString id = "";
|
||||||
|
|
||||||
addItem(str, id);
|
addItem(str, id);
|
||||||
|
setItemData(count() - 1, QString("0_%2").arg(str), ROLE_SORT);
|
||||||
if (mFlags & IDCHOOSER_ANON_DEFAULT)
|
if (mFlags & IDCHOOSER_ANON_DEFAULT)
|
||||||
{
|
{
|
||||||
def = 0;
|
def = 0;
|
||||||
@ -105,16 +163,7 @@ void GxsIdChooser::loadPrivateIds()
|
|||||||
for(it = ids.begin(); it != ids.end(); it++, i++)
|
for(it = ids.begin(); it != ids.end(); it++, i++)
|
||||||
{
|
{
|
||||||
/* add to Chooser */
|
/* add to Chooser */
|
||||||
QString str;
|
addPrivateId(*it, false);
|
||||||
if (!MakeIdDesc(*it, str))
|
|
||||||
{
|
|
||||||
std::cerr << "GxsIdChooser::loadPrivateIds() ERROR Desc for Id: " << *it;
|
|
||||||
std::cerr << std::endl;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
QString id = QString::fromStdString(*it);
|
|
||||||
|
|
||||||
addItem(str, id);
|
|
||||||
|
|
||||||
if (mDefaultId == *it)
|
if (mDefaultId == *it)
|
||||||
{
|
{
|
||||||
@ -127,6 +176,16 @@ void GxsIdChooser::loadPrivateIds()
|
|||||||
setCurrentIndex(def);
|
setCurrentIndex(def);
|
||||||
//ui.comboBox->setCurrentIndex(def);
|
//ui.comboBox->setCurrentIndex(def);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!mPendingId.empty()) {
|
||||||
|
/* Create and start timer to load pending id's */
|
||||||
|
mTimerCount = 0;
|
||||||
|
mTimer = new QTimer();
|
||||||
|
mTimer->setSingleShot(true);
|
||||||
|
mTimer->setInterval(500);
|
||||||
|
connect(mTimer, SIGNAL(timeout()), this, SLOT(timer()));
|
||||||
|
mTimer->start();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GxsIdChooser::getChosenId(RsGxsId &id)
|
bool GxsIdChooser::getChosenId(RsGxsId &id)
|
||||||
@ -144,3 +203,35 @@ bool GxsIdChooser::getChosenId(RsGxsId &id)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GxsIdChooser::timer()
|
||||||
|
{
|
||||||
|
++mTimerCount;
|
||||||
|
|
||||||
|
QList<RsGxsId> pendingId = mPendingId;
|
||||||
|
mPendingId.clear();
|
||||||
|
|
||||||
|
/* Process pending id's */
|
||||||
|
while (!pendingId.empty()) {
|
||||||
|
RsGxsId id = pendingId.front();
|
||||||
|
pendingId.pop_front();
|
||||||
|
|
||||||
|
addPrivateId(id, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mPendingId.empty()) {
|
||||||
|
/* All pending id's processed */
|
||||||
|
delete(mTimer);
|
||||||
|
mTimer = NULL;
|
||||||
|
mTimerCount = 0;
|
||||||
|
} else {
|
||||||
|
if (mTimerCount <= MAX_TRY) {
|
||||||
|
/* Restart timer */
|
||||||
|
mTimer->start();
|
||||||
|
} else {
|
||||||
|
delete(mTimer);
|
||||||
|
mTimer = NULL;
|
||||||
|
mTimerCount = 0;
|
||||||
|
mPendingId.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -41,11 +41,20 @@ public:
|
|||||||
void loadIds(uint32_t chooserFlags, RsGxsId defId);
|
void loadIds(uint32_t chooserFlags, RsGxsId defId);
|
||||||
bool getChosenId(RsGxsId &id);
|
bool getChosenId(RsGxsId &id);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void timer();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void loadPrivateIds();
|
void loadPrivateIds();
|
||||||
|
void addPrivateId(const RsGxsId &gxsId, bool replace);
|
||||||
|
bool MakeIdDesc(const RsGxsId &id, QString &desc);
|
||||||
|
|
||||||
uint32_t mFlags;
|
uint32_t mFlags;
|
||||||
RsGxsId mDefaultId;
|
RsGxsId mDefaultId;
|
||||||
|
|
||||||
|
QList<RsGxsId> mPendingId;
|
||||||
|
QTimer *mTimer;
|
||||||
|
unsigned int mTimerCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user