Merge pull request #2308 from csoler/v0.6-BugFixing_9

V0.6 bug fixing 9
This commit is contained in:
csoler 2021-02-13 14:13:18 +01:00 committed by GitHub
commit dfa088acac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 87 additions and 52 deletions

View File

@ -2039,7 +2039,7 @@ void RsGxsNetService::debugDump()
for(ServerMsgMap::const_iterator it(mServerMsgUpdateMap.begin());it!=mServerMsgUpdateMap.end();++it)
{
RsGxsGrpMetaTemporaryMap::const_iterator it2 = grpMetas.find(it->first) ;
RsGxsGrpMetaData *grpMeta = (it2 != grpMetas.end())? it2->second : NULL;
auto grpMeta = (it2 != grpMetas.end())? it2->second : (std::shared_ptr<RsGxsGrpMetaData>()) ;
std::string subscribe_string = (grpMeta==NULL)?"Unknown" : ((grpMeta->mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_SUBSCRIBED)?" Subscribed":" NOT Subscribed") ;
GXSNETDEBUG__G(it->first) << " Grp:" << it->first << " last local modification (secs ago): " << nice_time_stamp(time(NULL),it->second.msgUpdateTS) << ", " << subscribe_string << std::endl;
@ -5368,13 +5368,14 @@ void RsGxsNetService::receiveTurtleSearchResults(TurtleRequestId req,const unsig
#endif
uint32_t used_size = clear_group_data_len;
RsItem *item = RsNxsSerialiser(mServType).deserialise(clear_group_data,&used_size) ;
RsNxsGrp *nxs_identity_grp=nullptr;
if(used_size < clear_group_data_len)
{
uint32_t remaining_size = clear_group_data_len-used_size ;
RsItem *item2 = RsNxsSerialiser(RS_SERVICE_GXS_TYPE_GXSID).deserialise(clear_group_data+used_size,&remaining_size) ;
auto nxs_identity_grp = dynamic_cast<RsNxsGrp*>(item2);
nxs_identity_grp = dynamic_cast<RsNxsGrp*>(item2);
if(!nxs_identity_grp)
std::cerr << "(EE) decrypted item contains more data that cannot be deserialized as a GxsId. Unexpected!" << std::endl;

View File

@ -143,6 +143,7 @@ struct RsGxsIdGroup : RsSerializable
rstime_t mLastUsageTS ;
// Not Serialised - for GUI's benefit.
bool mPgpLinked;
bool mPgpKnown;
bool mIsAContact; // change that into flags one day
RsPgpId mPgpId;

View File

@ -969,16 +969,14 @@ bool p3IdService::createIdentity(
{
if(!rsNotify->cachePgpPassphrase(pgpPassword))
{
RsErr() << __PRETTY_FUNCTION__ << " Failure caching password"
<< std::endl;
RsErr() << __PRETTY_FUNCTION__ << " Failure caching password" << std::endl;
ret = false;
goto LabelCreateIdentityCleanup;
}
if(!rsNotify->setDisableAskPassword(true))
{
RsErr() << __PRETTY_FUNCTION__ << " Failure disabling password user"
<< " request" << std::endl;
RsErr() << __PRETTY_FUNCTION__ << " Failure disabling password user request" << std::endl;
ret = false;
goto LabelCreateIdentityCleanup;
}
@ -990,8 +988,7 @@ bool p3IdService::createIdentity(
if(!createIdentity(token, params))
{
RsErr() << __PRETTY_FUNCTION__ << " Failed creating GXS group."
<< std::endl;
RsErr() << __PRETTY_FUNCTION__ << " Failed creating GXS group." << std::endl;
ret = false;
goto LabelCreateIdentityCleanup;
}
@ -1003,16 +1000,14 @@ bool p3IdService::createIdentity(
token, std::chrono::seconds(10), std::chrono::milliseconds(20) ))
!= RsTokenService::COMPLETE )
{
RsErr() << __PRETTY_FUNCTION__ << " waitToken("<< token
<< ") failed with: " << wtStatus << std::endl;
RsErr() << __PRETTY_FUNCTION__ << " waitToken("<< token << ") failed with: " << wtStatus << std::endl;
ret = false;
goto LabelCreateIdentityCleanup;
}
if(!RsGenExchange::getPublishedGroupMeta(token, meta))
{
RsErr() << __PRETTY_FUNCTION__ << " Failure getting updated group data."
<< std::endl;
RsErr() << __PRETTY_FUNCTION__ << " Failure getting updated group data." << std::endl;
ret = false;
goto LabelCreateIdentityCleanup;
}
@ -2022,6 +2017,7 @@ bool p3IdService::getGroupData(const uint32_t &token, std::vector<RsGxsIdGroup>
}
group.mIsAContact = (mContacts.find(RsGxsId(group.mMeta.mGroupId)) != mContacts.end());
group.mPgpLinked = (!!(group.mMeta.mGroupFlags & RSGXSID_GROUPFLAG_REALID_kept_for_compatibility)) || !!(group.mMeta.mGroupFlags & RSGXSID_GROUPFLAG_REALID);
groups.push_back(group);
delete(item);

View File

@ -191,6 +191,7 @@ void HomePage::toggleIncludeAllIPs()
HomePage::~HomePage()
{
rsEvents->unregisterEventsHandler(mEventHandlerId);
delete ui;
}

View File

@ -210,10 +210,10 @@ void IdEditDialog::setAvatar(const QPixmap &avatar)
mAvatar = avatar;
if (!mAvatar.isNull()) {
ui->avatarLabel->setPixmap(mAvatar);
} else {
ui->avatarLabel->setPicture(avatar);
} else {
// we need to use the default pixmap here, generated from the ID
ui->avatarLabel->setPixmap(GxsIdDetails::makeDefaultIcon(RsGxsId(mEditGroup.mMeta.mGroupId)));
ui->avatarLabel->setPicture(GxsIdDetails::makeDefaultIcon(RsGxsId(mEditGroup.mMeta.mGroupId)));
}
}
@ -551,18 +551,20 @@ void IdEditDialog::createId()
params.nickname = groupname.toUtf8().constData();
params.isPgpLinked = (ui->radioButton_GpgId->isChecked());
if (!mAvatar.isNull())
{
QByteArray ba;
QBuffer buffer(&ba);
mAvatar = ui->avatarLabel->extractCroppedScaledPicture();
buffer.open(QIODevice::WriteOnly);
mAvatar.save(&buffer, "PNG"); // writes image into ba in PNG format
if (!mAvatar.isNull())
{
QByteArray ba;
QBuffer buffer(&ba);
params.mImage.copy((uint8_t *) ba.data(), ba.size());
}
else
params.mImage.clear();
buffer.open(QIODevice::WriteOnly);
mAvatar.save(&buffer, "PNG"); // writes image into ba in PNG format
params.mImage.copy((uint8_t *) ba.data(), ba.size());
}
else
params.mImage.clear();
RsGxsId keyId;
std::string gpg_password;
@ -639,7 +641,7 @@ void IdEditDialog::updateId()
RsGxsId keyId;
std::string gpg_password;
if(!mEditGroup.mPgpId.isNull())
if(mEditGroup.mPgpLinked)
{
std::string gpg_name = rsPeers->getGPGName(rsPeers->getGPGOwnId());
bool cancelled;

View File

@ -175,7 +175,7 @@ void PostedPostDelegate::expandItem(RsGxsMessageId msgId,bool expanded)
else
mExpandedItems.erase(msgId);
mPostListWidget->forceRedraw();
mPostListWidget->redraw();
}
uint8_t PostedPostDelegate::displayFlags(const RsGxsMessageId &id) const
@ -244,7 +244,7 @@ PostedListWidgetWithModel::PostedListWidgetWithModel(const RsGxsGroupId& postedI
/* Invoke the Qt Designer generated object setup routine */
ui->setupUi(this);
ui->postsTree->setModel(mPostedPostsModel = new RsPostedPostsModel());
ui->postsTree->setModel(mPostedPostsModel = new RsPostedPostsModel(POSTS_CHUNK_SIZE));
ui->postsTree->setItemDelegate(mPostedPostsDelegate = new PostedPostDelegate(this));
ui->postsTree->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // prevents bug on w10, since row size depends on widget width
ui->postsTree->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);// more beautiful if we scroll at pixel level
@ -351,31 +351,45 @@ void PostedListWidgetWithModel::handlePostsTreeSizeChange(QSize size)
mPostedPostsModel->triggerRedraw();
}
void PostedListWidgetWithModel::updateShowLabel()
{
if (mPostedPostsModel->rowCount() > 0)
whileBlocking(ui->showLabel)->setText(QString::number(mPostedPostsModel->displayedStartPostIndex()+1)
+" - "+QString::number(mPostedPostsModel->displayedStartPostIndex()+mPostedPostsModel->rowCount()));
else
whileBlocking(ui->showLabel)->setText(tr("Empty"));
ui->nextButton->setEnabled(mPostedPostsModel->displayedStartPostIndex() + POSTS_CHUNK_SIZE < mPostedPostsModel->filteredPostsCount());
ui->prevButton->setEnabled(mPostedPostsModel->displayedStartPostIndex() > 0);
}
void PostedListWidgetWithModel::filterItems(QString text)
{
QStringList lst = text.split(" ",QString::SkipEmptyParts) ;
uint32_t count;
mPostedPostsModel->setFilter(lst,count) ;
ui->showLabel->setText(QString::number(mPostedPostsModel->displayedStartPostIndex()+1)+" - "+QString::number(std::min(mPostedPostsModel->filteredPostsCount(),mPostedPostsModel->displayedStartPostIndex()+POSTS_CHUNK_SIZE+1)));
updateShowLabel();
}
void PostedListWidgetWithModel::nextPosts()
{
ui->postsTree->selectionModel()->clear();
if(mPostedPostsModel->displayedStartPostIndex() + POSTS_CHUNK_SIZE < mPostedPostsModel->filteredPostsCount())
{
mPostedPostsModel->setPostsInterval(POSTS_CHUNK_SIZE+mPostedPostsModel->displayedStartPostIndex(),POSTS_CHUNK_SIZE);
ui->showLabel->setText(QString::number(mPostedPostsModel->displayedStartPostIndex()+1)+" - "+QString::number(std::min(mPostedPostsModel->filteredPostsCount(),mPostedPostsModel->displayedStartPostIndex()+POSTS_CHUNK_SIZE+1)));
updateShowLabel();
}
}
void PostedListWidgetWithModel::prevPosts()
{
if((int)mPostedPostsModel->displayedStartPostIndex() - POSTS_CHUNK_SIZE >= 0)
ui->postsTree->selectionModel()->clear();
if((int)mPostedPostsModel->displayedStartPostIndex() > 0)
{
mPostedPostsModel->setPostsInterval(mPostedPostsModel->displayedStartPostIndex()-POSTS_CHUNK_SIZE,POSTS_CHUNK_SIZE);
ui->showLabel->setText(QString::number(mPostedPostsModel->displayedStartPostIndex()+1)+" - "+QString::number(std::min(mPostedPostsModel->filteredPostsCount(),mPostedPostsModel->displayedStartPostIndex()+POSTS_CHUNK_SIZE+1)));
mPostedPostsModel->setPostsInterval((int)mPostedPostsModel->displayedStartPostIndex()-POSTS_CHUNK_SIZE,POSTS_CHUNK_SIZE);
updateShowLabel();
}
}
@ -651,7 +665,7 @@ void PostedListWidgetWithModel::postPostLoad()
else
std::cerr << "No pre-selected channel post." << std::endl;
whileBlocking(ui->showLabel)->setText(QString::number(mPostedPostsModel->displayedStartPostIndex()+1)+" - "+QString::number(std::min(mPostedPostsModel->filteredPostsCount(),mPostedPostsModel->displayedStartPostIndex()+POSTS_CHUNK_SIZE+1)));
updateShowLabel();
}
void PostedListWidgetWithModel::forceRedraw()
@ -659,7 +673,11 @@ void PostedListWidgetWithModel::forceRedraw()
if(mPostedPostsModel)
mPostedPostsModel->deepUpdate();
}
void PostedListWidgetWithModel::redraw()
{
if(mPostedPostsModel)
mPostedPostsModel->triggerRedraw();
}
void PostedListWidgetWithModel::updateDisplay(bool complete)
{
#ifdef DEBUG_CHANNEL

View File

@ -99,7 +99,8 @@ public:
virtual bool navigate(const RsGxsMessageId&) override;
void updateDisplay(bool complete) ;
void forceRedraw(); // does not re-load the data, but makes sure the underlying model triggers a full redraw, recomputes sizes, etc.
void forceRedraw(); // does not re-load the data, but makes sure the underlying model triggers a full redraw, recomputes indexes, etc.
void redraw(); // does not re-load the data, but makes sure the underlying model triggers a full redraw, recomputes only sizes.
#ifdef TODO
/* FeedHolder */
@ -149,6 +150,7 @@ private slots:
void nextPosts();
void prevPosts();
void filterItems(QString s);
void updateShowLabel();
public slots:
void handlePostsTreeSizeChange(QSize size);

View File

@ -42,10 +42,12 @@ const uint32_t RsPostedPostsModel::DEFAULT_DISPLAYED_NB_POSTS = 10;
std::ostream& operator<<(std::ostream& o, const QModelIndex& i);// defined elsewhere
RsPostedPostsModel::RsPostedPostsModel(QObject *parent)
RsPostedPostsModel::RsPostedPostsModel(int default_chunk_size, QObject *parent)
: QAbstractItemModel(parent), mTreeMode(TREE_MODE_PLAIN)
{
initEmptyHierarchy();
mDefaultDisplayedNbPosts = default_chunk_size;
initEmptyHierarchy();
mEventHandlerId = 0;
mSortingStrategy = SORT_NEW_SCORE;
@ -132,7 +134,7 @@ void RsPostedPostsModel::initEmptyHierarchy()
mPosts.clear();
mFilteredPosts.clear();
mDisplayedNbPosts = DEFAULT_DISPLAYED_NB_POSTS;
mDisplayedNbPosts = mDefaultDisplayedNbPosts;
mDisplayedStartIndex = 0;
postMods();
@ -149,7 +151,8 @@ void RsPostedPostsModel::postMods()
}
void RsPostedPostsModel::update()
{
emit dataChanged(createIndex(0,0,(void*)NULL), createIndex(mDisplayedNbPosts,0,(void*)NULL));
if(mDisplayedNbPosts > 0)
emit dataChanged(createIndex(0,0,(void*)NULL), createIndex(mDisplayedNbPosts-1,0,(void*)NULL));
}
void RsPostedPostsModel::triggerRedraw()
{
@ -191,7 +194,7 @@ void RsPostedPostsModel::setFilter(const QStringList& strings, uint32_t& count)
count = mFilteredPosts.size();
mDisplayedStartIndex = 0;
mDisplayedNbPosts = std::min(count,DEFAULT_DISPLAYED_NB_POSTS) ;
mDisplayedNbPosts = std::min(count,mDefaultDisplayedNbPosts) ;
std::cerr << "After filtering: " << count << " posts remain." << std::endl;
@ -491,19 +494,28 @@ void RsPostedPostsModel::setPostsInterval(int start,int nb_posts)
{
if(start >= (int)mFilteredPosts.size())
return;
if(start < 0)
start = 0;
preMods();
uint32_t old_nb_rows = rowCount() ;
int old_nb_rows = rowCount() ;
int new_nb_rows = (uint32_t)std::min(nb_posts,(int)mFilteredPosts.size() - start);
mDisplayedNbPosts = (uint32_t)std::min(nb_posts,(int)mFilteredPosts.size() - (start+1));
mDisplayedStartIndex = start;
if(old_nb_rows > new_nb_rows)
{
beginRemoveRows(QModelIndex(),new_nb_rows,old_nb_rows-1);
endRemoveRows();
}
beginRemoveRows(QModelIndex(),mDisplayedNbPosts,old_nb_rows);
endRemoveRows();
mDisplayedStartIndex = start;
mDisplayedNbPosts = new_nb_rows;
beginInsertRows(QModelIndex(),old_nb_rows,mDisplayedNbPosts);
endInsertRows();
if(new_nb_rows > old_nb_rows)
{
beginInsertRows(QModelIndex(),old_nb_rows,new_nb_rows-1);
endInsertRows();
}
postMods();
}
@ -532,7 +544,7 @@ void RsPostedPostsModel::setPosts(const RsPostedGroup& group, std::vector<RsPost
uint32_t tmpval;
setFilter(QStringList(),tmpval);
mDisplayedNbPosts = std::min((uint32_t)mFilteredPosts.size(),DEFAULT_DISPLAYED_NB_POSTS);
mDisplayedNbPosts = std::min((uint32_t)mFilteredPosts.size(),mDefaultDisplayedNbPosts);
mDisplayedStartIndex = 0;
if (rowCount()>0)

View File

@ -92,7 +92,7 @@ class RsPostedPostsModel : public QAbstractItemModel
Q_OBJECT
public:
explicit RsPostedPostsModel(QObject *parent = NULL);
explicit RsPostedPostsModel(int default_chunk_size,QObject *parent = NULL);
virtual ~RsPostedPostsModel() override;
static const uint32_t COLUMN_THREAD_NB_COLUMNS = 0x01;
@ -159,6 +159,7 @@ public:
void setFilter(const QStringList &strings, uint32_t &count) ;
void setSortingStrategy(SortingStrategy s);
void setPostsInterval(int start,int nb_posts);
void setPostsDefaultInterval(int size);
#ifdef TODO
void setAuthorOpinion(const QModelIndex& indx,RsOpinion op);
@ -246,6 +247,7 @@ private:
std::vector<int> mFilteredPosts;
uint32_t mDisplayedStartIndex;
uint32_t mDisplayedNbPosts;
uint32_t mDefaultDisplayedNbPosts;
SortingStrategy mSortingStrategy;
RsEventsHandlerId_t mEventHandlerId ;

View File

@ -42,7 +42,7 @@ void RSTreeView::mouseMoveEvent(QMouseEvent *e)
{
QModelIndex idx = indexAt(e->pos());
if(idx != selectionModel()->currentIndex())
if(idx.isValid() && idx != selectionModel()->currentIndex())
selectionModel()->setCurrentIndex(idx,QItemSelectionModel::ClearAndSelect);
QTreeView::mouseMoveEvent(e);