From 2e717d35c7545fc306c05dded3c8428e8908e1f2 Mon Sep 17 00:00:00 2001 From: defnax Date: Mon, 12 Dec 2016 21:16:56 +0100 Subject: [PATCH] Added Home Page View for easy see own Cert to Copy and Share to Friends Fixed Share Manager Label layout Update emotes file Set radio items font size to stylesheet file --- retroshare-gui/src/gui/HomePage.cpp | 137 ++++++ retroshare-gui/src/gui/HomePage.h | 64 +++ retroshare-gui/src/gui/HomePage.ui | 194 +++++++++ retroshare-gui/src/gui/MainWindow.cpp | 3 + retroshare-gui/src/gui/MainWindow.h | 2 + retroshare-gui/src/gui/ShareManager.ui | 16 +- .../src/gui/connect/ConnectFriendWizard.cpp | 4 +- .../src/gui/connect/ConnectFriendWizard.ui | 405 +++++++++--------- retroshare-gui/src/gui/emojione.qrc | 12 + retroshare-gui/src/gui/emojione/emotes.acs | 17 + retroshare-gui/src/gui/icons.qrc | 1 + retroshare-gui/src/gui/icons/invite64.png | Bin 0 -> 2519 bytes .../src/gui/qss/stylesheet/Standard.qss | 23 + retroshare-gui/src/retroshare-gui.pro | 3 + 14 files changed, 670 insertions(+), 211 deletions(-) create mode 100644 retroshare-gui/src/gui/HomePage.cpp create mode 100644 retroshare-gui/src/gui/HomePage.h create mode 100644 retroshare-gui/src/gui/HomePage.ui create mode 100644 retroshare-gui/src/gui/icons/invite64.png diff --git a/retroshare-gui/src/gui/HomePage.cpp b/retroshare-gui/src/gui/HomePage.cpp new file mode 100644 index 000000000..3003f7e3e --- /dev/null +++ b/retroshare-gui/src/gui/HomePage.cpp @@ -0,0 +1,137 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2016, defnax + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + ****************************************************************/ + +#include "HomePage.h" +#include "ui_HomePage.h" + +#include "gui/notifyqt.h" +#include "gui/msgs/MessageComposer.h" + +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +HomePage::HomePage(QWidget *parent) : + MainPage(parent), + ui(new Ui::HomePage) +{ + ui->setupUi(this); + + updateOwnCert(); + + QAction *CopyAction = new QAction(QIcon(),tr("Copy your Cert to Clipboard"), this); + connect(CopyAction, SIGNAL(triggered()), this, SLOT(copyCert())); + + QAction *SaveAction = new QAction(QIcon(),tr("Save your Cert into a File"), this); + connect(SaveAction, SIGNAL(triggered()), this, SLOT(saveCert())); + + QAction *SendAction = new QAction(QIcon(),tr("Send via Email"), this); + connect(SendAction, SIGNAL(triggered()), this, SLOT(runEmailClient())); + + QMenu *menu = new QMenu(); + menu->addAction(CopyAction); + menu->addAction(SaveAction); + menu->addAction(SendAction); + + ui->shareButton->setMenu(menu); + +} + +HomePage::~HomePage() +{ + delete ui; +} + +void HomePage::updateOwnCert() +{ + std::string invite = rsPeers->GetRetroshareInvite(false); + + ui->userCertEdit->setPlainText(QString::fromUtf8(invite.c_str())); +} + +static void sendMail(QString sAddress, QString sSubject, QString sBody) +{ +#ifdef Q_OS_WIN + /* search and replace the end of lines with: "%0D%0A" */ + sBody.replace("\n", "%0D%0A"); +#endif + + QUrl url = QUrl("mailto:" + sAddress); + +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) + QUrlQuery urlQuery; +#else + QUrl &urlQuery(url); +#endif + + urlQuery.addQueryItem("subject", sSubject); + urlQuery.addQueryItem("body", sBody); + +#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) + url.setQuery(urlQuery); +#endif + + std::cerr << "MAIL STRING:" << (std::string)url.toEncoded().constData() << std::endl; + + /* pass the url directly to QDesktopServices::openUrl */ + QDesktopServices::openUrl (url); +} + +void HomePage::runEmailClient() +{ + sendMail("", tr("RetroShare Invite"), ui->userCertEdit->toPlainText()); +} + +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")); +} + +void HomePage::saveCert() +{ + QString fileName = QFileDialog::getSaveFileName(this, tr("Save as..."), "", tr("RetroShare Certificate (*.rsc );;All Files (*)")); + if (fileName.isEmpty()) + return; + + QFile file(fileName); + if (!file.open(QFile::WriteOnly)) + return; + + //Todo: move save to file to p3Peers::SaveCertificateToFile + + QTextStream ts(&file); + ts.setCodec(QTextCodec::codecForName("UTF-8")); + ts << ui->userCertEdit->document()->toPlainText(); +} + diff --git a/retroshare-gui/src/gui/HomePage.h b/retroshare-gui/src/gui/HomePage.h new file mode 100644 index 000000000..2fadff7bf --- /dev/null +++ b/retroshare-gui/src/gui/HomePage.h @@ -0,0 +1,64 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2016, defnax + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + ****************************************************************/ + +#ifndef HOMEPAGE_H +#define HOMEPAGE_H + +#include +#include +#include + +#include + + +class QAction; + +namespace Ui { +class HomePage; +} + +class HomePage : public MainPage +{ + Q_OBJECT + +public: + explicit HomePage(QWidget *parent); + ~HomePage(); + + virtual QIcon iconPixmap() const { return QPixmap(":/icons/svg/profile.svg") ; } //MainPage + virtual QString pageName() const { return tr("Home") ; } //MainPage + virtual QString helpText() const { return ""; } //MainPage + + +private slots: + void updateOwnCert(); + void runEmailClient(); + void copyCert(); + void saveCert(); + + +private: + Ui::HomePage *ui; + + +}; + +#endif // HomePage_H diff --git a/retroshare-gui/src/gui/HomePage.ui b/retroshare-gui/src/gui/HomePage.ui new file mode 100644 index 000000000..39c0dd846 --- /dev/null +++ b/retroshare-gui/src/gui/HomePage.ui @@ -0,0 +1,194 @@ + + + HomePage + + + + 0 + 0 + 771 + 560 + + + + Form + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 268 + + + + + + + + 9 + + + 6 + + + 2 + + + + + + 0 + 0 + + + + + 11 + + + + The text below is your Retroshare certificate. Copy and share it with your friends + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Share your RetroShare Key + + + + :/icons/png/network.png:/icons/png/network.png + + + + 24 + 24 + + + + QToolButton::InstantPopup + + + true + + + + + + + + Courier New + + + + + + + QPlainTextEdit::NoWrap + + + true + + + 80 + + + false + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 288 + + + + + + + + + + + :/images/logo/logo_splash.png + + + Qt::AlignCenter + + + + + + + + 12 + + + + RetroShare is an Open Source cross-platform, +private and secure decentralized commmunication platform. + + + + Qt::AlignCenter + + + + + + + + + + + diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index 3160b7b30..c653503b1 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -39,6 +39,7 @@ #include "MainWindow.h" #include "ui_MainWindow.h" #include "MessengerWindow.h" +#include "HomePage.h" #include "NetworkDialog.h" #include "gui/FileTransfer/SearchDialog.h" #include "gui/FileTransfer/TransfersDialog.h" @@ -341,6 +342,8 @@ void MainWindow::initStackedPage() /* Create the Main pages and actions */ QActionGroup *grp = new QActionGroup(this); + addPage(homePage = new HomePage(ui->stackPages), grp, NULL); + addPage(newsFeed = new NewsFeed(ui->stackPages), grp, ¬ify); addPage(friendsDialog = new FriendsDialog(ui->stackPages), grp, ¬ify); diff --git a/retroshare-gui/src/gui/MainWindow.h b/retroshare-gui/src/gui/MainWindow.h index 9bdaeb97b..98c17b3eb 100644 --- a/retroshare-gui/src/gui/MainWindow.h +++ b/retroshare-gui/src/gui/MainWindow.h @@ -60,6 +60,7 @@ class MessagesDialog; class SharedFilesDialog; class MessengerWindow; class PluginsPage; +class HomePage; //class ChannelFeed; class BandwidthGraph; class MainPage; @@ -132,6 +133,7 @@ public: // NetworkDialog *networkDialog; // SearchDialog *searchDialog; + HomePage *homePage; NewsFeed *newsFeed; FriendsDialog *friendsDialog; TransfersDialog *transfersDialog; diff --git a/retroshare-gui/src/gui/ShareManager.ui b/retroshare-gui/src/gui/ShareManager.ui index 42d1bbd3a..88a7030c9 100644 --- a/retroshare-gui/src/gui/ShareManager.ui +++ b/retroshare-gui/src/gui/ShareManager.ui @@ -178,7 +178,14 @@ - + + + + Cancel + + + + @@ -261,13 +268,6 @@ - - - - Cancel - - - diff --git a/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp b/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp index 20656567a..82bf9ccf7 100755 --- a/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp +++ b/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp @@ -89,7 +89,7 @@ ConnectFriendWizard::ConnectFriendWizard(QWidget *parent) : // setOption(HaveHelpButton, true); // connect(this, SIGNAL(helpRequested()), this, SLOT(showHelp())); - setPixmap(QWizard::LogoPixmap, QPixmap(":/images/connect/connectFriendLogo.png")); + setPixmap(QWizard::LogoPixmap, QPixmap(":/icons/invite64.png")); // we have no good pictures for watermarks // setPixmap(QWizard::WatermarkPixmap, QPixmap(":/images/connectFriendWatermark.png")); @@ -121,6 +121,8 @@ ConnectFriendWizard::ConnectFriendWizard(QWidget *parent) : body += "\n" + GetStartedDialog::GetCutBelowText(); body += "\n\n" + QString::fromUtf8(rsPeers->GetRetroshareInvite(false).c_str()); + ui->userFrame->hide(); + updateStylesheet(); } diff --git a/retroshare-gui/src/gui/connect/ConnectFriendWizard.ui b/retroshare-gui/src/gui/connect/ConnectFriendWizard.ui index 16ec2ee08..f5f967a26 100644 --- a/retroshare-gui/src/gui/connect/ConnectFriendWizard.ui +++ b/retroshare-gui/src/gui/connect/ConnectFriendWizard.ui @@ -7,7 +7,7 @@ 0 0 691 - 644 + 522 @@ -92,189 +92,191 @@ - - - The text below is your Retroshare certificate. You have to provide it to your friend - + + + + + + + + + 20 + 20 + + + + Qt::NoFocus + + + + :/images/info16.png:/images/info16.png + + + true + + + + + + + + 20 + 20 + + + + Qt::NoFocus + + + Include signatures + + + + :/images/gpgp_key_generate.png:/images/gpgp_key_generate.png + + + true + + + true + + + + + + + + 20 + 20 + + + + Qt::NoFocus + + + Copy your Cert to Clipboard + + + + :/images/copyrslink.png:/images/copyrslink.png + + + true + + + + + + + + 20 + 20 + + + + Qt::NoFocus + + + Save your Cert into a File + + + + :/images/document_save.png:/images/document_save.png + + + true + + + + + + + + 20 + 20 + + + + Qt::NoFocus + + + Run Email program + + + + :/images/mail_send.png:/images/mail_send.png + + + true + + + + + + + + 20 + 20 + + + + Qt::NoFocus + + + + :/images/ledon1.png:/images/ledon1.png + + + true + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + Courier New + + + + QPlainTextEdit::NoWrap + + + true + + + 80 + + + + + + + The text below is your Retroshare certificate. You have to provide it to your friend + + + + - - - - - - - Courier New - - - - QPlainTextEdit::NoWrap - - - true - - - 80 - - - - - - - - - - 20 - 20 - - - - Qt::NoFocus - - - - :/images/info16.png:/images/info16.png - - - true - - - - - - - - 20 - 20 - - - - Qt::NoFocus - - - Include signatures - - - - :/images/gpgp_key_generate.png:/images/gpgp_key_generate.png - - - true - - - true - - - - - - - - 20 - 20 - - - - Qt::NoFocus - - - Copy your Cert to Clipboard - - - - :/images/copyrslink.png:/images/copyrslink.png - - - true - - - - - - - - 20 - 20 - - - - Qt::NoFocus - - - Save your Cert into a File - - - - :/images/document_save.png:/images/document_save.png - - - true - - - - - - - - 20 - 20 - - - - Qt::NoFocus - - - Run Email program - - - - :/images/mail_send.png:/images/mail_send.png - - - true - - - - - - - - 20 - 20 - - - - Qt::NoFocus - - - - :/images/ledon1.png:/images/ledon1.png - - - true - - - true - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - @@ -294,6 +296,9 @@ <html><head/><body><p>This box expects your friend's Retroshare certificate. WARNING: this is different from your friend's PGP key. Do not paste your friend's PGP key here (not even a part of it). It's not going to work.</p></body></html> + + + QPlainTextEdit::NoWrap @@ -301,19 +306,6 @@ - - - - Qt::Vertical - - - - 20 - 40 - - - - @@ -527,7 +519,16 @@ - + + 9 + + + 9 + + + 9 + + 9 @@ -1544,12 +1545,6 @@ resources. - - AvatarWidget - QLabel -
gui/common/AvatarWidget.h
- 1 -
StyledLabel QLabel @@ -1561,6 +1556,12 @@ resources.
gui/common/FriendSelectionWidget.h
1
+ + AvatarWidget + QLabel +
gui/common/AvatarWidget.h
+ 1 +
DropLineEdit QLineEdit diff --git a/retroshare-gui/src/gui/emojione.qrc b/retroshare-gui/src/gui/emojione.qrc index 51fbc9070..bf1c441a1 100644 --- a/retroshare-gui/src/gui/emojione.qrc +++ b/retroshare-gui/src/gui/emojione.qrc @@ -1,5 +1,17 @@ + emojione/1f325.png + emojione/1F30D.png + emojione/1F30E.png + emojione/1F30F.png + emojione/1F31A.png + emojione/1F31B.png + emojione/1F31C.png + emojione/1F31D.png + emojione/1F31E.png + emojione/1F31F.png + emojione/1f324.png + emojione/1f326.png emojione/1F35A.png emojione/1F35B.png emojione/1F35C.png diff --git a/retroshare-gui/src/gui/emojione/emotes.acs b/retroshare-gui/src/gui/emojione/emotes.acs index 8f5f92c07..6842d436a 100644 --- a/retroshare-gui/src/gui/emojione/emotes.acs +++ b/retroshare-gui/src/gui/emojione/emotes.acs @@ -144,6 +144,16 @@ "emojione/people2.png"|":zzz:":"emojione/1F4A4.png"; "emojione/people2.png"|":eyeglasses:":"emojione/1F453.png"; "emojione/people2.png"|":crown:":"emojione/1F451.png"; +"emojione/people2.png"|":womans_hat:":"emojione/1F452.png"; +"emojione/people2.png"|":necktie:":"emojione/1F454.png"; +"emojione/people2.png"|":shirt:":"emojione/1F455.png"; +"emojione/people2.png"|":jeans:":"emojione/1F456.png"; +"emojione/people2.png"|":dress:":"emojione/1F457.png"; +"emojione/people2.png"|":kimono:":"emojione/1F458.png"; +"emojione/people2.png"|":bikini:":"emojione/1F459.png"; +"emojione/people2.png"|":high_heel:":"emojione/1F460.png"; +"emojione/people2.png"|":sandal:":"emojione/1F461.png"; +"emojione/people2.png"|":boot:":"emojione/1F462.png"; "emojione/people2.png"|":lipstick:":"emojione/1F484.png"; "emojione/people2.png"|":ring:":"emojione/1F48D.png"; "emojione/people2.png"|":closed_umbrella:":"emojione/1F302.png"; @@ -265,6 +275,9 @@ "emojione/nature.png"|":crescent_moon:":"emojione/1F319.png"; "emojione/nature.png"|":sunny:":"emojione/2600.png"; "emojione/nature.png"|":partly_sunny:":"emojione/26C5.png"; +"emojione/nature.png"|":white_sun_small_cloud:":"emojione/1f324.png"; +"emojione/nature.png"|":white_sun_cloud:":"emojione/1f325.png"; +"emojione/nature.png"|":white_sun_rain_cloud:":"emojione/1f326.png"; "emojione/nature.png"|":cloud:":"emojione/2601.png"; "emojione/nature.png"|":cloud_rain:":"emojione/1F327.png"; "emojione/nature.png"|":cloud_snow:":"emojione/1F328.png"; @@ -322,10 +335,14 @@ "emojione/objects.png"|":bomb:":"emojione/1F4A3.png"; "emojione/objects.png"|":hole:":"emojione/1F573.png"; "emojione/objects.png"|":shopping_bags:":"emojione/1F6CD.png"; +"emojione/objects.png"|":barber:":"emojione/1F488.png"; +"emojione/objects.png"|":syringe:":"emojione/1F489.png"; +"emojione/objects.png"|":pill:":"emojione/1F48A.png"; "emojione/objects.png"|":hourglass:":"emojione/231B.png"; "emojione/objects.png"|":hourglass_flowing_sand:":"emojione/23F3.png"; "emojione/objects.png"|":watch:":"emojione/231A.png"; "emojione/objects.png"|":alarm_clock:":"emojione/23F0.png"; +"emojione/objects.png"|":thermometer:":"emojione/1F321.png"; "emojione/objects.png"|":iphone:":"emojione/1F4F1.png"; "emojione/objects.png"|":calling:":"emojione/1F4F2.png"; "emojione/objects.png"|":ribbon:":"emojione/1F380.png"; diff --git a/retroshare-gui/src/gui/icons.qrc b/retroshare-gui/src/gui/icons.qrc index 38d6878fd..c2506c851 100644 --- a/retroshare-gui/src/gui/icons.qrc +++ b/retroshare-gui/src/gui/icons.qrc @@ -54,6 +54,7 @@ icons/help_64.png icons/information_128.png icons/internet_128.png + icons/invite64.png icons/knews_128.png icons/knews_red_128.png icons/konversation_128.png diff --git a/retroshare-gui/src/gui/icons/invite64.png b/retroshare-gui/src/gui/icons/invite64.png new file mode 100644 index 0000000000000000000000000000000000000000..8ab342a7b3da3452b844784e7e7a1015bec72ab5 GIT binary patch literal 2519 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