From 892acd8ef8c787dff2a71d13c74f9b4f561216a5 Mon Sep 17 00:00:00 2001 From: defnax Date: Fri, 27 Sep 2019 20:21:40 +0200 Subject: [PATCH] Home View changes for Retroshare ID Added Label for Retroshare ID (short invites) Show Optional the certificate with the Cert Button --- retroshare-gui/src/gui/HomePage.cpp | 72 ++- retroshare-gui/src/gui/HomePage.h | 3 + retroshare-gui/src/gui/HomePage.ui | 409 ++++++++++-------- .../src/gui/connect/ConnectFriendWizard.ui | 18 +- retroshare-gui/src/gui/icons.qrc | 1 + retroshare-gui/src/gui/icons/png/cert.png | Bin 0 -> 6924 bytes .../src/gui/qss/stylesheet/Standard.qss | 5 +- 7 files changed, 302 insertions(+), 206 deletions(-) create mode 100644 retroshare-gui/src/gui/icons/png/cert.png diff --git a/retroshare-gui/src/gui/HomePage.cpp b/retroshare-gui/src/gui/HomePage.cpp index 385e6c075..eff1b395d 100644 --- a/retroshare-gui/src/gui/HomePage.cpp +++ b/retroshare-gui/src/gui/HomePage.cpp @@ -49,14 +49,15 @@ HomePage::HomePage(QWidget *parent) : MainPage(parent), ui(new Ui::HomePage), mIncludeAllIPs(false), - mUseShortFormat(true) + mUseShortFormat(false) { ui->setupUi(this); updateOwnCert(); + updateOwnId(); connect(ui->addButton, SIGNAL(clicked()), this, SLOT(addFriend())); - //connect(ui->LoadCertFileButton, SIGNAL(clicked()), this, SLOT(loadCert())); + connect(ui->expandButton, SIGNAL(clicked()), this, SLOT(doExpand())); QAction *WebMailAction = new QAction(QIcon(),tr("Invite via WebMail"), this); connect(WebMailAction, SIGNAL(triggered()), this, SLOT(webMail())); @@ -66,9 +67,24 @@ HomePage::HomePage(QWidget *parent) : QAction *SendAction = new QAction(QIcon(),tr("Send via Email"), this); connect(SendAction, SIGNAL(triggered()), this, SLOT(runEmailClient())); + + QAction *CopyIdAction = new QAction(QIcon(),tr("Copy your Retroshare ID to Clipboard"), this); + connect(CopyIdAction, SIGNAL(triggered()), this, SLOT(copyId())); QMenu *menu = new QMenu(); - menu->addAction(SendAction); + menu->addAction(CopyIdAction); + + if(!RsAccounts::isHiddenNode()) + { + QAction *includeIPsAct = new QAction(QIcon(), tr("Include all your known IPs"),this); + connect(includeIPsAct, SIGNAL(triggered()), this, SLOT(toggleIncludeAllIPs())); + includeIPsAct->setCheckable(true); + includeIPsAct->setChecked(mIncludeAllIPs); + + menu->addAction(includeIPsAct); + } + menu->addSeparator(); + menu->addAction(SendAction); menu->addAction(WebMailAction); menu->addAction(RecAction); @@ -78,7 +94,7 @@ HomePage::HomePage(QWidget *parent) : connect(ui->openwebhelp,SIGNAL(clicked()), this,SLOT(openWebHelp())) ; - //ui->LoadCertFileButton->hide(); // duplicates functionality => not good. + ui->userCertEdit->hide(); int S = QFontMetricsF(font()).height(); QString help_str = tr( @@ -137,6 +153,7 @@ void HomePage::toggleIncludeAllIPs() { mIncludeAllIPs = !mIncludeAllIPs; updateOwnCert(); + updateOwnId(); } HomePage::~HomePage() @@ -170,6 +187,28 @@ void HomePage::updateOwnCert() ui->userCertEdit->setToolTip(description); } +void HomePage::updateOwnId() +{ + bool include_extra_locators = mIncludeAllIPs; + + RsPeerDetails detail; + + if (!rsPeers->getPeerDetails(rsPeers->getOwnId(), detail)) + { + std::cerr << "(EE) Cannot retrieve information about own certificate. That is a real problem!!" << std::endl; + return ; + } + + std::string invite ; + + rsPeers->getShortInvite(invite,rsPeers->getOwnId(),true,!mIncludeAllIPs); + + ui->retroshareid->setText(QString::fromUtf8(invite.c_str())); + + QString description = ConfCertDialog::getCertificateDescription(detail,false,mUseShortFormat,include_extra_locators); + + ui->retroshareid->setToolTip(description); +} static void sendMail(QString sAddress, QString sSubject, QString sBody) { #ifdef Q_OS_WIN @@ -212,7 +251,14 @@ void HomePage::copyCert() { QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(ui->userCertEdit->toPlainText()); - QMessageBox::information(this, "RetroShare", tr("Your Cert is copied to Clipboard, paste and send it to your friend via email or some other way")); + QMessageBox::information(this, "RetroShare", tr("Your Retroshare certificate is copied to Clipboard, paste and send it to your friend via email or some other way")); +} + +void HomePage::copyId() +{ + QClipboard *clipboard = QApplication::clipboard(); + clipboard->setText(ui->retroshareid->text()); + QMessageBox::information(this, "RetroShare", tr("Your Retroshare ID is copied to Clipboard, paste and send it to your friend via email or some other way")); } void HomePage::saveCert() @@ -261,3 +307,19 @@ void HomePage::openWebHelp() { QDesktopServices::openUrl(QUrl(QString("https://retroshare.readthedocs.io"))); } + +void HomePage::doExpand() +{ + + if (ui->expandButton->isChecked()) + { + ui->userCertEdit->show(); + ui->expandButton->setToolTip(tr("Hide")); + } + else + { + ui->userCertEdit->hide(); + ui->expandButton->setToolTip(tr("Show Certificate")); + } + +} diff --git a/retroshare-gui/src/gui/HomePage.h b/retroshare-gui/src/gui/HomePage.h index 58a7c65b9..8345d0715 100644 --- a/retroshare-gui/src/gui/HomePage.h +++ b/retroshare-gui/src/gui/HomePage.h @@ -49,8 +49,10 @@ public: private slots: void certContextMenu(QPoint); void updateOwnCert(); + void updateOwnId(); void runEmailClient(); void copyCert(); + void copyId(); void saveCert(); void addFriend(); void webMail(); @@ -59,6 +61,7 @@ private slots: void recommendFriends(); void toggleIncludeAllIPs(); void toggleUseShortFormat(); + void doExpand(); private: Ui::HomePage *ui; diff --git a/retroshare-gui/src/gui/HomePage.ui b/retroshare-gui/src/gui/HomePage.ui index fea881a6f..c29bbeeff 100644 --- a/retroshare-gui/src/gui/HomePage.ui +++ b/retroshare-gui/src/gui/HomePage.ui @@ -6,14 +6,121 @@ 0 0 - 1334 - 867 + 800 + 600 Form + + + + + + + + + + + 11 + + + + + + + Did you receive a Retroshare id from a friend? + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Add friend + + + + :/icons/png/invite.png:/icons/png/invite.png + + + + 24 + 24 + + + + Qt::ToolButtonTextBesideIcon + + + false + + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + 11 + + + + Do you need help with Retroshare? + + + + + + + Open Web Help + + + + :/icons/settings/webinterface.svg:/icons/settings/webinterface.svg + + + + 24 + 24 + + + + Qt::ToolButtonTextBesideIcon + + + + + + @@ -33,7 +140,24 @@ - + + + + + 12 + + + + Open Source cross-platform, +private and secure decentralized communication platform. + + + + Qt::AlignCenter + + + + 9 @@ -44,27 +168,6 @@ 2 - - - - - 0 - 0 - - - - - 11 - - - - The text below is your own Retroshare certificate. Send it to your friends - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - @@ -77,10 +180,71 @@ true + + true + - + + + + + 0 + 0 + + + + Qt::NoFocus + + + <html><head/><body><p>Share your RetroShare ID</p></body></html> + + + + :/icons/svg/share.svg:/icons/svg/share.svg + + + + 24 + 24 + + + + QToolButton::InstantPopup + + + true + + + + + + + + 10 + 75 + true + + + + Qt::DefaultContextMenu + + + + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + 0 + 0 + + Courier New @@ -109,23 +273,35 @@ - - + + - + 0 0 - - Qt::NoFocus + + + 11 + - - Share your RetroShare Key + + This is your Retroshare ID. Copy and share with your friends! + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + ... - :/icons/svg/share.svg:/icons/svg/share.svg + :/icons/png/cert.png:/icons/png/cert.png @@ -133,8 +309,8 @@ 24 - - QToolButton::InstantPopup + + true true @@ -143,165 +319,20 @@ - - - - - 12 - - - - Open Source cross-platform, -private and secure decentralized communication platform. - - - - Qt::AlignCenter - - - - - - + + + Qt::Vertical - - QFrame::StyledPanel + + + 20 + 40 + - - QFrame::Raised - - - - - - - 11 - - - - Do you need help with RetroShare? - - - - - - - Open Web Help - - - - :/icons/settings/webinterface.svg:/icons/settings/webinterface.svg - - - - 24 - 24 - - - - Qt::ToolButtonTextBesideIcon - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - - - - 11 - - - - - - - Did you receive a certificate from a friend? - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Add friends certificate - - - - :/icons/png/invite.png:/icons/png/invite.png - - - - 24 - 24 - - - - Qt::ToolButtonTextBesideIcon - - - false - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - + - label - addFrame - label_2 - addframe - frame - helpframe diff --git a/retroshare-gui/src/gui/connect/ConnectFriendWizard.ui b/retroshare-gui/src/gui/connect/ConnectFriendWizard.ui index 8aadc22db..1c097627e 100644 --- a/retroshare-gui/src/gui/connect/ConnectFriendWizard.ui +++ b/retroshare-gui/src/gui/connect/ConnectFriendWizard.ui @@ -6,8 +6,8 @@ 0 0 - 1139 - 1171 + 600 + 500 @@ -19,10 +19,10 @@ - RetroShare certificate + RetroShare ID - Please paste below your friend's Retroshare certificate + Please paste below your friend's Retroshare ID ConnectFriendWizard::Page_Text @@ -207,7 +207,7 @@ - The text below is your Retroshare certificate. You have to provide it to your friend + The text below is your Retroshare ID. You have to provide it to your friend @@ -229,10 +229,10 @@ Qt::NoFocus - Paste Cert of your friend from Clipboard + Paste ID of your friend from Clipboard - Paste certificate + Paste @@ -267,7 +267,7 @@ Open Cert of your friend from File - Open certificate + Open @@ -314,7 +314,7 @@ QPlainTextEdit::NoWrap - Please, paste your friend's Retroshare certificate into the box below + Please, paste your friend's Retroshare ID into the box below diff --git a/retroshare-gui/src/gui/icons.qrc b/retroshare-gui/src/gui/icons.qrc index a1bdb46a5..d510544a8 100644 --- a/retroshare-gui/src/gui/icons.qrc +++ b/retroshare-gui/src/gui/icons.qrc @@ -71,6 +71,7 @@ icons/png/add.png icons/png/attach-image.png icons/png/attach.png + icons/png/cert.png icons/png/channels-notify.png icons/png/channels.png icons/png/chat-bubble-notify.png diff --git a/retroshare-gui/src/gui/icons/png/cert.png b/retroshare-gui/src/gui/icons/png/cert.png new file mode 100644 index 0000000000000000000000000000000000000000..39c9cb6bb54b2975a333bb670f6ed98a41677b80 GIT binary patch literal 6924 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 Sk2xd&0000