diff --git a/retroshare-gui/src/gui/Identity/IdDialog.cpp b/retroshare-gui/src/gui/Identity/IdDialog.cpp index c9c66fa2b..80a501a97 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdDialog.cpp @@ -202,22 +202,21 @@ IdDialog::IdDialog(QWidget *parent) : connect(ui->idTreeWidget, SIGNAL(itemSelectionChanged()), this, SLOT(updateSelection())); connect(ui->idTreeWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(IdListCustomPopupMenu(QPoint))); - connect(ui->filterComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterComboBoxChanged())); connect(ui->filterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(filterChanged(QString))); connect(ui->ownOpinion_CB, SIGNAL(currentIndexChanged(int)), this, SLOT(modifyReputation())); connect(ui->inviteButton, SIGNAL(clicked()), this, SLOT(sendInvite())); - ui->avlabel->setPixmap(QPixmap(":/images/user/friends64.png")); + ui->avLabel_Person->setPixmap(QPixmap(":/images/user/friends64.png")); ui->avlabel_Circles->setPixmap(QPixmap(":/icons/circles_128.png")); - ui->headerTextLabel->setText(tr("People")); + ui->headerTextLabel_Person->setText(tr("People")); ui->headerTextLabel_Circles->setText(tr("Circles")); /* Initialize splitter */ - ui->splitter->setStretchFactor(0, 0); - ui->splitter->setStretchFactor(1, 1); + ui->mainSplitter->setStretchFactor(0, 0); + ui->mainSplitter->setStretchFactor(1, 1); /*remove QList sizes; @@ -225,13 +224,54 @@ IdDialog::IdDialog(QWidget *parent) : ui->splitter->setSizes(sizes);*/ /* Add filter types */ - ui->filterComboBox->addItem(tr("All"), RSID_FILTER_ALL); - ui->filterComboBox->addItem(tr("Owned by myself"), RSID_FILTER_OWNED_BY_YOU); - ui->filterComboBox->addItem(tr("Linked to my node"), RSID_FILTER_YOURSELF); - ui->filterComboBox->addItem(tr("Linked to neighbor nodes"), RSID_FILTER_FRIENDS); - ui->filterComboBox->addItem(tr("Linked to distant nodes"), RSID_FILTER_OTHERS); - ui->filterComboBox->addItem(tr("Anonymous"), RSID_FILTER_PSEUDONYMS); - ui->filterComboBox->setCurrentIndex(0); + QMenu *idTWHMenu = new QMenu(tr("Show"), this); + idTWHMenu->setVisible(true); + ui->idTreeWidget->addHeaderContextMenuMenu(idTWHMenu); + + QActionGroup *idTWHActionGroup = new QActionGroup(this); + QAction *idTWHAction = new QAction(QIcon(),tr("All"), this); + idTWHAction->setActionGroup(idTWHActionGroup); + idTWHAction->setCheckable(true); + idTWHAction->setChecked(true); + filter = RSID_FILTER_ALL; + idTWHAction->setData(RSID_FILTER_ALL); + connect(idTWHAction, SIGNAL(toggled(bool)), this, SLOT(filterToggled(bool))); + idTWHMenu->addAction(idTWHAction); + + idTWHAction = new QAction(QIcon(),tr("Owned by myself"), this); + idTWHAction->setActionGroup(idTWHActionGroup); + idTWHAction->setCheckable(true); + idTWHAction->setData(RSID_FILTER_OWNED_BY_YOU); + connect(idTWHAction, SIGNAL(toggled(bool)), this, SLOT(filterToggled(bool))); + idTWHMenu->addAction(idTWHAction); + + idTWHAction = new QAction(QIcon(),tr("Linked to my node"), this); + idTWHAction->setActionGroup(idTWHActionGroup); + idTWHAction->setCheckable(true); + idTWHAction->setData(RSID_FILTER_YOURSELF); + connect(idTWHAction, SIGNAL(toggled(bool)), this, SLOT(filterToggled(bool))); + idTWHMenu->addAction(idTWHAction); + + idTWHAction = new QAction(QIcon(),tr("Linked to neighbor nodes"), this); + idTWHAction->setActionGroup(idTWHActionGroup); + idTWHAction->setCheckable(true); + idTWHAction->setData(RSID_FILTER_FRIENDS); + connect(idTWHAction, SIGNAL(toggled(bool)), this, SLOT(filterToggled(bool))); + idTWHMenu->addAction(idTWHAction); + + idTWHAction = new QAction(QIcon(),tr("Linked to distant nodes"), this); + idTWHAction->setActionGroup(idTWHActionGroup); + idTWHAction->setCheckable(true); + idTWHAction->setData(RSID_FILTER_OTHERS); + connect(idTWHAction, SIGNAL(toggled(bool)), this, SLOT(filterToggled(bool))); + idTWHMenu->addAction(idTWHAction); + + idTWHAction = new QAction(QIcon(),tr("Anonymous"), this); + idTWHAction->setActionGroup(idTWHActionGroup); + idTWHAction->setCheckable(true); + idTWHAction->setData(RSID_FILTER_PSEUDONYMS); + connect(idTWHAction, SIGNAL(toggled(bool)), this, SLOT(filterToggled(bool))); + idTWHMenu->addAction(idTWHAction); /* Add filter actions */ QTreeWidgetItem *headerItem = ui->idTreeWidget->headerItem(); @@ -576,8 +616,8 @@ void IdDialog::loadCircleGroupMeta(const uint32_t &token) #endif // remove any identity that has an item, but no subscription flag entry std::vector to_delete ; - - for(uint32_t k=0;kchildCount();++k) + + for(uint32_t k=0; k < (uint32_t)item->childCount(); ++k) if(details.mSubscriptionFlags.find(RsGxsId(item->child(k)->data(CIRCLEGROUP_CIRCLE_COL_GROUPID,Qt::UserRole).toString().toStdString())) == details.mSubscriptionFlags.end()) to_delete.push_back(item->child(k)); @@ -599,7 +639,7 @@ void IdDialog::loadCircleGroupMeta(const uint32_t &token) QTreeWidgetItem *subitem = NULL ; // see if the item already exists - for(uint32_t k=0;kchildCount();++k) + for(uint32_t k=0; k < (uint32_t)item->childCount(); ++k) if(item->child(k)->data(CIRCLEGROUP_CIRCLE_COL_GROUPID,Qt::UserRole).toString().toStdString() == it->first.toStdString()) { subitem = item->child(k); @@ -1247,7 +1287,7 @@ void IdDialog::processSettings(bool load) ui->filterLineEdit->setCurrentFilter(Settings->value("filterColumn", RSID_COL_NICKNAME).toInt()); // state of splitter - ui->splitter->restoreState(Settings->value("splitter").toByteArray()); + ui->mainSplitter->restoreState(Settings->value("splitter").toByteArray()); } else { // save settings @@ -1255,7 +1295,7 @@ void IdDialog::processSettings(bool load) Settings->setValue("filterColumn", ui->filterLineEdit->currentFilter()); // state of splitter - Settings->setValue("splitter", ui->splitter->saveState()); + Settings->setValue("splitter", ui->mainSplitter->saveState()); //save expanding Settings->setValue("ExpandAll", allItem->isExpanded()); @@ -1266,16 +1306,22 @@ void IdDialog::processSettings(bool load) Settings->endGroup(); } -void IdDialog::filterComboBoxChanged() -{ - requestIdList(); -} - void IdDialog::filterChanged(const QString& /*text*/) { filterIds(); } +void IdDialog::filterToggled(const bool &value) +{ + if (value) { + QAction *source = qobject_cast(QObject::sender()); + if (source) { + filter = source->data().toInt(); + requestIdList(); + } + } +} + void IdDialog::updateSelection() { QTreeWidgetItem *item = ui->idTreeWidget->currentItem(); @@ -1460,7 +1506,7 @@ void IdDialog::insertIdList(uint32_t token) { mStateHelper->setLoading(IDDIALOG_IDLIST, false); - int accept = ui->filterComboBox->itemData(ui->filterComboBox->currentIndex()).toInt(); + int accept = filter; RsGxsIdGroup data; std::vector datavector; @@ -1633,7 +1679,7 @@ void IdDialog::insertIdDetails(uint32_t token) time_t now = time(NULL) ; ui->lineEdit_LastUsed->setText(getHumanReadableDuration(now - data.mLastUsageTS)) ; - ui->headerTextLabel->setText(QString::fromUtf8(data.mMeta.mGroupName.c_str()).left(RSID_MAXIMUM_NICKNAME_SIZE)); + ui->headerTextLabel_Person->setText(QString::fromUtf8(data.mMeta.mGroupName.c_str()).left(RSID_MAXIMUM_NICKNAME_SIZE)); QPixmap pixmap ; @@ -1644,7 +1690,7 @@ void IdDialog::insertIdDetails(uint32_t token) std::cerr << "Setting header frame image : " << pixmap.width() << " x " << pixmap.height() << std::endl; #endif - ui->avlabel->setPixmap(pixmap); + ui->avLabel_Person->setPixmap(pixmap); ui->avatarLabel->setPixmap(pixmap); if (data.mPgpKnown) @@ -1664,23 +1710,23 @@ void IdDialog::insertIdDetails(uint32_t token) if(data.mPgpId.isNull()) { ui->lineEdit_GpgId->hide() ; - ui->PgpId_LB->hide() ; + ui->label_GpgId->hide() ; } else { ui->lineEdit_GpgId->show() ; - ui->PgpId_LB->show() ; + ui->label_GpgId->show() ; } if(data.mPgpKnown) { ui->lineEdit_GpgName->show() ; - ui->PgpName_LB->show() ; + ui->label_GpgName->show() ; } else { ui->lineEdit_GpgName->hide() ; - ui->PgpName_LB->hide() ; + ui->label_GpgName->hide() ; } bool isLinkedToOwnPgpId = (data.mPgpKnown && (data.mPgpId == ownPgpId)) ; @@ -1702,7 +1748,9 @@ void IdDialog::insertIdDetails(uint32_t token) ui->lineEdit_Type->setText(tr("Linked to unknown Retroshare node")) ; } else + { ui->lineEdit_Type->setText(tr("Anonymous identity")) ; + } if (isOwnId) { @@ -2054,7 +2102,8 @@ void IdDialog::IdListCustomPopupMenu( QPoint ) if(!one_item_owned_by_you) { - if(n_selected_items == 1) // if only one item is selected, allow to chat with this item + if(n_selected_items == 1) // if only one item is selected, allow to chat with this item + { if(own_identities.size() <= 1) { QAction *action = contextMnu.addAction(QIcon(":/images/chat_24.png"), tr("Chat with this person"), this, SLOT(chatIdentity())); @@ -2082,6 +2131,7 @@ void IdDialog::IdListCustomPopupMenu( QPoint ) action->setData(QString::fromStdString((*it).toStdString())) ; } } + } // always allow to send messages contextMnu.addAction(QIcon(":/images/mail_new.png"), tr("Send message"), this, SLOT(sendMsg())); diff --git a/retroshare-gui/src/gui/Identity/IdDialog.h b/retroshare-gui/src/gui/Identity/IdDialog.h index cb53f178f..4253ddb9c 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.h +++ b/retroshare-gui/src/gui/Identity/IdDialog.h @@ -83,8 +83,8 @@ private slots: void grantCircleMembership() ; void revokeCircleMembership() ; - void filterComboBoxChanged(); void filterChanged(const QString &text); + void filterToggled(const bool &value); void addIdentity(); void removeIdentity(); @@ -149,6 +149,7 @@ private: std::map mCircleUpdates ; RsGxsGroupId mId; + int filter; /* UI - Designer */ Ui::IdDialog *ui; diff --git a/retroshare-gui/src/gui/Identity/IdDialog.ui b/retroshare-gui/src/gui/Identity/IdDialog.ui index 0c0a93c1d..42347f116 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.ui +++ b/retroshare-gui/src/gui/Identity/IdDialog.ui @@ -19,7 +19,7 @@ - + 0 @@ -46,7 +46,7 @@ QFrame::Sunken - + 2 @@ -132,12 +132,12 @@ - + Qt::Horizontal - + @@ -146,7 +146,7 @@ QFrame::Sunken - + 1 @@ -229,12 +229,6 @@ - - - - - - @@ -291,11 +285,11 @@ - + - 1 + 0 - + :/images/no_avatar_background.png:/images/no_avatar_background.png @@ -303,287 +297,285 @@ Person - + - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 12 + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 12 + + + + + + 64 + 64 + - - - - - 64 - 64 - - - - - 64 - 64 - - - - - + + + 64 + 64 + + + + + + + + + + true + + + + + + + People + + + + + + + + + + Identity info + + + + + + 6 + + + 6 + + + 6 + + + 6 + + + 6 + + + - + Identity ID : - + + + + + + Identity name : + + + + + + + Owner node ID : + + + + + + + true + + true - - - - People + + + + true + + + true - - - - - - - Identity info - - - - - - 6 + + + + true - - 6 + + true - - 6 - - - 6 - - - 6 - - - - - Identity ID : - - - - - - - Identity name : - - - - - - - Owner node ID : - - - - - - - true - - - true - - - - - - - true - - - true - - - - - - - true - - - true - - - - - - - Owner node name : - - - - - - - true - - - true - - - - - - - Type: - - - - - - - - - - Last used: - - - - - - - + - - - - - - - 0 - 0 - - - - - 128 - 128 - - - - - 128 - 128 - - - - QFrame::Box - - - QFrame::Sunken - - - Your Avatar - - - true - - - Qt::AlignCenter - - - - - - - Send Invite - - - - - - - Qt::Vertical - - - - 20 - 2 - - - - - + + + + Owner node name : + + + + + + + true + + + true + + + + + + + Type: + + + + + + + + + + Last used: + + + + + - - - - - - - 0 - 0 - - - - Reputation - - + + + - - - 6 + + + + 0 + 0 + - - 6 + + + 128 + 128 + - - 6 + + + 128 + 128 + - - 6 + + QFrame::Box - - - - <html><head/><body><p>Average opinion of neighbor nodes about this identity. Negative is bad,</p><p>positive is good. Zero is neutral.</p></body></html> - - - true - - - - - - - Your opinion: - - - - - - - Neighbor nodes: - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> + + QFrame::Sunken + + + Your Avatar + + + true + + + Qt::AlignCenter + + + + + + + Send Invite + + + + + + + Qt::Vertical + + + + 20 + 2 + + + + + + + + + + + + + + 0 + 0 + + + + Reputation + + + + + + 6 + + + 6 + + + 6 + + + 6 + + + + + <html><head/><body><p>Average opinion of neighbor nodes about this identity. Negative is bad,</p><p>positive is good. Zero is neutral.</p></body></html> + + + true + + + + + + + Your opinion: + + + + + + + Neighbor nodes: + + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:9pt; font-weight:400; font-style:normal;"> @@ -591,80 +583,78 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The overall score is used in chat lobbies, forums and channels to decide on the actions to take for each specific identity. When the overall score is lower than -0.6, the identity is banned, which prevents all messages and forums/channels authored by this identity to be forwarded, both ways. Some forums also have special anti-spam flags that require a higher reputation level, making them more sensitive to bad opinions. Banned identities gradually lose their activity and eventually disappear (after 30 days). </p> <p style="-qt-paragraph-type:empty; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - - - 0 - - - - Negative - - - - ../icons/yellow_biohazard64.png../icons/yellow_biohazard64.png - - - - - Neutral - - - - - Positive - - - + + + 0 + + + + Negative + + + + ../icons/yellow_biohazard64.png../icons/yellow_biohazard64.png + - - - - <html><head/><body><p>Overall reputation score, accounting for yours and your friends'.</p><p>Negative is bad, positive is good. Zero is neutral. If the score is too low,</p><p>the identity is flagged as bad, and will be filtered out in forums, chat lobbies,</p><p>channels, etc.</p></body></html> - - - true - - + + + Neutral + - - - - - 75 - true - - - - Overall: - - + + + Positive + - + + + + + + <html><head/><body><p>Overall reputation score, accounting for yours and your friends'.</p><p>Negative is bad, positive is good. Zero is neutral. If the score is too low,</p><p>the identity is flagged as bad, and will be filtered out in forums, chat lobbies,</p><p>channels, etc.</p></body></html> + + + true + + + + + + + + 75 + true + + + + Overall: + + - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 20 - 40 - - - - - + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 40 + + + - + :/images/circles/circles_64.png:/images/circles/circles_64.png @@ -672,16 +662,16 @@ p, li { white-space: pre-wrap; } Circles - + - + QFrame::StyledPanel QFrame::Raised - + 12 diff --git a/retroshare-gui/src/gui/common/RSTreeWidget.cpp b/retroshare-gui/src/gui/common/RSTreeWidget.cpp index abbf766d3..404b98217 100644 --- a/retroshare-gui/src/gui/common/RSTreeWidget.cpp +++ b/retroshare-gui/src/gui/common/RSTreeWidget.cpp @@ -169,6 +169,11 @@ void RSTreeWidget::addHeaderContextMenuAction(QAction *action) mHeaderContextMenuActions.push_back(action); } +void RSTreeWidget::addHeaderContextMenuMenu(QMenu *menu) +{ + mHeaderContextMenuMenus.push_back(menu); +} + void RSTreeWidget::headerContextMenuRequested(const QPoint &pos) { QMenu contextMenu(this); @@ -207,6 +212,13 @@ void RSTreeWidget::headerContextMenuRequested(const QPoint &pos) contextMenu.addActions(mHeaderContextMenuActions); } + if (!mHeaderContextMenuMenus.isEmpty()) { + foreach(QMenu *menu, mHeaderContextMenuMenus) { + contextMenu.addSeparator(); + contextMenu.addMenu(menu); + } + } + if (contextMenu.isEmpty()) { return; } diff --git a/retroshare-gui/src/gui/common/RSTreeWidget.h b/retroshare-gui/src/gui/common/RSTreeWidget.h index 2261e836b..5fd365244 100644 --- a/retroshare-gui/src/gui/common/RSTreeWidget.h +++ b/retroshare-gui/src/gui/common/RSTreeWidget.h @@ -47,6 +47,8 @@ public: // Add QAction to context menu (action won't be deleted) void addHeaderContextMenuAction(QAction *action); + // Add QMenu to context menu (menu won't be deleted) + void addHeaderContextMenuMenu(QMenu *menu); signals: void signalMouseMiddleButtonClicked(QTreeWidgetItem *item); @@ -69,6 +71,7 @@ private: quint32 mSettingsVersion; QMap mColumnCustomizable; QList mHeaderContextMenuActions; + QList mHeaderContextMenuMenus; }; #endif