From b791a6a348f415ed9ecdbd93f852b99ebdca1d43 Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Mon, 31 Jul 2017 07:36:38 +0800 Subject: [PATCH 1/9] qt ui - status buttons done --- qt/i2pd_qt/i2pd_qt.pro | 3 +- qt/i2pd_qt/mainwindow.cpp | 27 ++++++--- qt/i2pd_qt/mainwindow.h | 4 ++ qt/i2pd_qt/mainwindow.ui | 78 +++++++++++++++++++++----- qt/i2pd_qt/statusbuttons.ui | 109 ++++++++++++++++++++++++++++++++++++ 5 files changed, 199 insertions(+), 22 deletions(-) create mode 100644 qt/i2pd_qt/statusbuttons.ui diff --git a/qt/i2pd_qt/i2pd_qt.pro b/qt/i2pd_qt/i2pd_qt.pro index 66839ff5..ed9ffd2e 100644 --- a/qt/i2pd_qt/i2pd_qt.pro +++ b/qt/i2pd_qt/i2pd_qt.pro @@ -174,7 +174,8 @@ INCLUDEPATH += ../../daemon INCLUDEPATH += . FORMS += mainwindow.ui \ - tunnelform.ui + tunnelform.ui \ + statusbuttons.ui LIBS += -lz diff --git a/qt/i2pd_qt/mainwindow.cpp b/qt/i2pd_qt/mainwindow.cpp index 9d312fa0..a4afe6a3 100644 --- a/qt/i2pd_qt/mainwindow.cpp +++ b/qt/i2pd_qt/mainwindow.cpp @@ -1,5 +1,6 @@ #include "mainwindow.h" #include "ui_mainwindow.h" +#include "ui_statusbuttons.h" #include #include #include @@ -28,6 +29,7 @@ MainWindow::MainWindow(QWidget *parent) : ,quitting(false) #endif ,ui(new Ui::MainWindow) + ,statusButtonsUI(new Ui::StatusButtonsForm) ,i2pController(nullptr) ,configItems() ,datadir() @@ -37,12 +39,16 @@ MainWindow::MainWindow(QWidget *parent) : { ui->setupUi(this); + statusButtonsUI->setupUi(ui->statusButtonsPane); + ui->statusButtonsPane->setFixedSize(172,300); + ui->verticalLayout->setGeometry(QRect(0,0,172,ui->verticalLayout->geometry().height())); + ui->statusButtonsPane->adjustSize(); + ui->centralWidget->adjustSize(); setWindowTitle(QApplication::translate("AppTitle","I2PD")); //TODO handle resizes and change the below into resize() call - setFixedSize(width(), 480); - ui->centralWidget->setMinimumHeight(480); - ui->centralWidget->setMaximumHeight(480); + setFixedSize(width(), 550); + ui->centralWidget->setFixedHeight(550); onResize(); ui->stackedWidget->setCurrentIndex(0); @@ -70,6 +76,7 @@ MainWindow::MainWindow(QWidget *parent) : #endif QObject::connect(ui->statusPagePushButton, SIGNAL(released()), this, SLOT(showStatusPage())); + setStatusButtonsVisible(true); QObject::connect(ui->settingsPagePushButton, SIGNAL(released()), this, SLOT(showSettingsPage())); QObject::connect(ui->tunnelsPagePushButton, SIGNAL(released()), this, SLOT(showTunnelsPage())); @@ -226,11 +233,15 @@ MainWindow::MainWindow(QWidget *parent) : //QMetaObject::connectSlotsByName(this); } -void MainWindow::showStatusPage(){ui->stackedWidget->setCurrentIndex(0);} -void MainWindow::showSettingsPage(){ui->stackedWidget->setCurrentIndex(1);} -void MainWindow::showTunnelsPage(){ui->stackedWidget->setCurrentIndex(2);} -void MainWindow::showRestartPage(){ui->stackedWidget->setCurrentIndex(3);} -void MainWindow::showQuitPage(){ui->stackedWidget->setCurrentIndex(4);} +void MainWindow::showStatusPage(){ui->stackedWidget->setCurrentIndex(0);setStatusButtonsVisible(true);} +void MainWindow::showSettingsPage(){ui->stackedWidget->setCurrentIndex(1);setStatusButtonsVisible(false);} +void MainWindow::showTunnelsPage(){ui->stackedWidget->setCurrentIndex(2);setStatusButtonsVisible(false);} +void MainWindow::showRestartPage(){ui->stackedWidget->setCurrentIndex(3);setStatusButtonsVisible(false);} +void MainWindow::showQuitPage(){ui->stackedWidget->setCurrentIndex(4);setStatusButtonsVisible(false);} + +void MainWindow::setStatusButtonsVisible(bool visible) { + ui->statusButtonsPane->setVisible(visible); +} //TODO void MainWindow::resizeEvent(QResizeEvent *event) diff --git a/qt/i2pd_qt/mainwindow.h b/qt/i2pd_qt/mainwindow.h index 05cb7151..fbadf83e 100644 --- a/qt/i2pd_qt/mainwindow.h +++ b/qt/i2pd_qt/mainwindow.h @@ -307,6 +307,7 @@ public: namespace Ui { class MainWindow; +class StatusButtonsForm; } using namespace i2p::client; @@ -359,6 +360,7 @@ private: #endif Ui::MainWindow* ui; + Ui::StatusButtonsForm* statusButtonsUI; i2p::qt::Controller* i2pController; @@ -369,6 +371,8 @@ protected: void resizeEvent(QResizeEvent* event); void onResize(); + void setStatusButtonsVisible(bool visible); + QList configItems; NonGUIOptionItem* logOption; NonGUIOptionItem* daemonOption; diff --git a/qt/i2pd_qt/mainwindow.ui b/qt/i2pd_qt/mainwindow.ui index 0b3071e9..8fb9ffc1 100644 --- a/qt/i2pd_qt/mainwindow.ui +++ b/qt/i2pd_qt/mainwindow.ui @@ -6,10 +6,22 @@ 0 0 - 816 - 516 + 904 + 550 + + + 904 + 0 + + + + + 950 + 16777215 + + MainWindow @@ -22,14 +34,14 @@ - 0 - 516 + 904 + 550 16777215 - 516 + 550 @@ -37,19 +49,27 @@ 10 10 - 796 - 496 + 931 + 498 - QLayout::SetDefaultConstraint + QLayout::SetMaximumSize - + QLayout::SetMinimumSize + + + 0 + 0 + 170 + 496 + + @@ -60,6 +80,22 @@ + + + + + 0 + 0 + + + + + 172 + 0 + + + + @@ -100,6 +136,22 @@ + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 172 + 0 + + + + @@ -136,7 +188,7 @@ - 4 + 0 @@ -231,8 +283,8 @@ 0 0 - 679 - 3000 + 684 + 426 @@ -247,7 +299,7 @@ 10 10 679 - 3000 + 3052 diff --git a/qt/i2pd_qt/statusbuttons.ui b/qt/i2pd_qt/statusbuttons.ui new file mode 100644 index 00000000..79461cd4 --- /dev/null +++ b/qt/i2pd_qt/statusbuttons.ui @@ -0,0 +1,109 @@ + + + StatusButtonsForm + + + + 0 + 0 + 170 + 295 + + + + + 0 + 0 + + + + + 170 + 295 + + + + Form + + + + + 20 + 0 + 151 + 301 + + + + + QLayout::SetDefaultConstraint + + + + + Main page + + + + + + + Router commands + + + + + + + Local destinations + + + + + + + Leasesets + + + + + + + Tunnels + + + + + + + Transit tunnels + + + + + + + Transports + + + + + + + I2P tunnels + + + + + + + SAM sessions + + + + + + + + + From 978bb47b92f229b30475c742bffcb343524e93f9 Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Mon, 31 Jul 2017 07:39:22 +0800 Subject: [PATCH 2/9] qt ui - settings buttons renamed to *Settings --- qt/i2pd_qt/mainwindow.ui | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qt/i2pd_qt/mainwindow.ui b/qt/i2pd_qt/mainwindow.ui index 8fb9ffc1..7c1067b4 100644 --- a/qt/i2pd_qt/mainwindow.ui +++ b/qt/i2pd_qt/mainwindow.ui @@ -102,7 +102,7 @@ true - Settings + General Settings @@ -112,7 +112,7 @@ true - Tunnels + Tunnels Settings From 7d3a8185656ad37bacde2dd4723c99d44fbbd6ef Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Mon, 31 Jul 2017 08:00:48 +0800 Subject: [PATCH 3/9] qt ui - laid out better --- qt/i2pd_qt/mainwindow.ui | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/qt/i2pd_qt/mainwindow.ui b/qt/i2pd_qt/mainwindow.ui index 7c1067b4..afbef9a3 100644 --- a/qt/i2pd_qt/mainwindow.ui +++ b/qt/i2pd_qt/mainwindow.ui @@ -35,7 +35,7 @@ 904 - 550 + 0 @@ -50,7 +50,7 @@ 10 10 931 - 498 + 715 @@ -102,7 +102,7 @@ true - General Settings + General settings @@ -112,7 +112,7 @@ true - Tunnels Settings + Tunnels settings @@ -170,7 +170,7 @@ - + 0 0 @@ -178,17 +178,17 @@ 0 - 496 + 528 16777215 - 496 + 713 - 0 + 2 @@ -197,7 +197,7 @@ 0 0 686 - 496 + 531 @@ -245,12 +245,12 @@ 0 0 706 - 461 + 531 - QLayout::SetMinAndMaxSize + QLayout::SetMaximumSize @@ -284,7 +284,7 @@ 0 0 684 - 426 + 496 @@ -3046,7 +3046,7 @@ Comma separated list of base64 identities: 0 0 706 - 461 + 531 @@ -3110,7 +3110,7 @@ Comma separated list of base64 identities: - 0 + -18 0 699 425 From a79f614e12b2c7b7bb4fb2716d09b5abe896aca7 Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Mon, 31 Jul 2017 09:58:54 +0800 Subject: [PATCH 4/9] qt ui - now pixel perfect buttons --- qt/i2pd_qt/mainwindow.cpp | 8 ++--- qt/i2pd_qt/mainwindow.ui | 8 ++--- qt/i2pd_qt/statusbuttons.ui | 64 ++++++++++++++++++++++++++++++++++--- 3 files changed, 67 insertions(+), 13 deletions(-) diff --git a/qt/i2pd_qt/mainwindow.cpp b/qt/i2pd_qt/mainwindow.cpp index a4afe6a3..840f5b5b 100644 --- a/qt/i2pd_qt/mainwindow.cpp +++ b/qt/i2pd_qt/mainwindow.cpp @@ -40,10 +40,10 @@ MainWindow::MainWindow(QWidget *parent) : { ui->setupUi(this); statusButtonsUI->setupUi(ui->statusButtonsPane); - ui->statusButtonsPane->setFixedSize(172,300); - ui->verticalLayout->setGeometry(QRect(0,0,172,ui->verticalLayout->geometry().height())); - ui->statusButtonsPane->adjustSize(); - ui->centralWidget->adjustSize(); + ui->statusButtonsPane->setFixedSize(171,300); + ui->verticalLayout->setGeometry(QRect(0,0,171,ui->verticalLayout->geometry().height())); + //ui->statusButtonsPane->adjustSize(); + //ui->centralWidget->adjustSize(); setWindowTitle(QApplication::translate("AppTitle","I2PD")); //TODO handle resizes and change the below into resize() call diff --git a/qt/i2pd_qt/mainwindow.ui b/qt/i2pd_qt/mainwindow.ui index afbef9a3..60aacbe2 100644 --- a/qt/i2pd_qt/mainwindow.ui +++ b/qt/i2pd_qt/mainwindow.ui @@ -83,7 +83,7 @@ - + 0 0 @@ -146,7 +146,7 @@ - 172 + 171 0 @@ -260,7 +260,7 @@ - Settings + General settings @@ -3061,7 +3061,7 @@ Comma separated list of base64 identities: - Tunnels + Tunnels settings diff --git a/qt/i2pd_qt/statusbuttons.ui b/qt/i2pd_qt/statusbuttons.ui index 79461cd4..edf5a90c 100644 --- a/qt/i2pd_qt/statusbuttons.ui +++ b/qt/i2pd_qt/statusbuttons.ui @@ -6,7 +6,7 @@ 0 0 - 170 + 171 295 @@ -18,7 +18,7 @@ - 170 + 171 295 @@ -28,10 +28,10 @@ - 20 + 21 0 - 151 - 301 + 171 + 300 @@ -40,6 +40,12 @@ + + + 150 + 16777215 + + Main page @@ -47,6 +53,12 @@ + + + 150 + 16777215 + + Router commands @@ -54,6 +66,12 @@ + + + 150 + 16777215 + + Local destinations @@ -61,6 +79,12 @@ + + + 150 + 16777215 + + Leasesets @@ -68,6 +92,12 @@ + + + 150 + 16777215 + + Tunnels @@ -75,6 +105,12 @@ + + + 150 + 16777215 + + Transit tunnels @@ -82,6 +118,12 @@ + + + 150 + 16777215 + + Transports @@ -89,6 +131,12 @@ + + + 150 + 16777215 + + I2P tunnels @@ -96,6 +144,12 @@ + + + 150 + 16777215 + + SAM sessions From 163cbcb89db5a564c9e782bf69ac0d1d1e1ce640 Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Wed, 2 Aug 2017 02:40:11 +0800 Subject: [PATCH 5/9] qt ui - status main page now works --- daemon/HTTPServer.cpp | 60 ++++++++++++++------------- daemon/HTTPServer.h | 3 ++ qt/i2pd_qt/i2pd_qt.pro | 6 ++- qt/i2pd_qt/mainwindow.cpp | 66 +++++++++++++++++++++++++++++- qt/i2pd_qt/mainwindow.h | 22 ++++++++-- qt/i2pd_qt/mainwindow.ui | 62 ++++++++++++++-------------- qt/i2pd_qt/textbrowsertweaked1.cpp | 6 +++ qt/i2pd_qt/textbrowsertweaked1.h | 22 ++++++++++ 8 files changed, 180 insertions(+), 67 deletions(-) create mode 100644 qt/i2pd_qt/textbrowsertweaked1.cpp create mode 100644 qt/i2pd_qt/textbrowsertweaked1.h diff --git a/daemon/HTTPServer.cpp b/daemon/HTTPServer.cpp index 52feeb10..1f7dbc7b 100644 --- a/daemon/HTTPServer.cpp +++ b/daemon/HTTPServer.cpp @@ -185,7 +185,7 @@ namespace http { s << "ERROR: " << string << "
\r\n"; } - static void ShowStatus (std::stringstream& s) + void ShowStatus (std::stringstream& s, bool includeHiddenContent) { s << "Uptime: "; ShowUptime(s, i2p::context.GetUptime ()); @@ -233,33 +233,35 @@ namespace http { s << " (" << (double) i2p::transport::transports.GetTransitBandwidth () / 1024 << " KiB/s)
\r\n"; s << "Data path: " << i2p::fs::GetDataDir() << "
\r\n"; s << "
\r\n\r\n

\r\n"; - s << "Router Ident: " << i2p::context.GetRouterInfo().GetIdentHashBase64() << "
\r\n"; - s << "Router Family: " << i2p::context.GetRouterInfo().GetProperty("family") << "
\r\n"; - s << "Router Caps: " << i2p::context.GetRouterInfo().GetProperty("caps") << "
\r\n"; - s << "Our external address:" << "
\r\n" ; - for (const auto& address : i2p::context.GetRouterInfo().GetAddresses()) - { - switch (address->transportStyle) - { - case i2p::data::RouterInfo::eTransportNTCP: - if (address->host.is_v6 ()) - s << "NTCP6  "; - else - s << "NTCP  "; - break; - case i2p::data::RouterInfo::eTransportSSU: - if (address->host.is_v6 ()) - s << "SSU6     "; - else - s << "SSU     "; - break; - default: - s << "Unknown  "; - } - s << address->host.to_string() << ":" << address->port << "
\r\n"; - } - s << "

\r\n
\r\n"; - s << "Routers: " << i2p::data::netdb.GetNumRouters () << " "; + if(includeHiddenContent) { + s << "Router Ident: " << i2p::context.GetRouterInfo().GetIdentHashBase64() << "
\r\n"; + s << "Router Family: " << i2p::context.GetRouterInfo().GetProperty("family") << "
\r\n"; + s << "Router Caps: " << i2p::context.GetRouterInfo().GetProperty("caps") << "
\r\n"; + s << "Our external address:" << "
\r\n" ; + for (const auto& address : i2p::context.GetRouterInfo().GetAddresses()) + { + switch (address->transportStyle) + { + case i2p::data::RouterInfo::eTransportNTCP: + if (address->host.is_v6 ()) + s << "NTCP6  "; + else + s << "NTCP  "; + break; + case i2p::data::RouterInfo::eTransportSSU: + if (address->host.is_v6 ()) + s << "SSU6     "; + else + s << "SSU     "; + break; + default: + s << "Unknown  "; + } + s << address->host.to_string() << ":" << address->port << "
\r\n"; + } + } + s << "

\r\n\r\n"; + s << "Routers: " << i2p::data::netdb.GetNumRouters () << " "; s << "Floodfills: " << i2p::data::netdb.GetNumFloodfills () << " "; s << "LeaseSets: " << i2p::data::netdb.GetNumLeaseSets () << "
\r\n"; @@ -797,7 +799,7 @@ namespace http { } else if (req.uri.find("cmd=") != std::string::npos) { HandleCommand (req, res, s); } else { - ShowStatus (s); + ShowStatus (s, true); res.add_header("Refresh", "10"); } ShowPageTail (s); diff --git a/daemon/HTTPServer.h b/daemon/HTTPServer.h index ec56e08a..edff1bf3 100644 --- a/daemon/HTTPServer.h +++ b/daemon/HTTPServer.h @@ -7,6 +7,7 @@ #include #include #include +#include #include "HTTP.h" namespace i2p @@ -75,6 +76,8 @@ namespace http boost::asio::io_service::work m_Work; boost::asio::ip::tcp::acceptor m_Acceptor; }; + + void ShowStatus (std::stringstream& s, bool includeHiddenContent); } // http } // i2p diff --git a/qt/i2pd_qt/i2pd_qt.pro b/qt/i2pd_qt/i2pd_qt.pro index ed9ffd2e..918f0230 100644 --- a/qt/i2pd_qt/i2pd_qt.pro +++ b/qt/i2pd_qt/i2pd_qt.pro @@ -87,7 +87,8 @@ SOURCES += DaemonQT.cpp mainwindow.cpp \ ../../daemon/i2pd.cpp \ ../../daemon/I2PControl.cpp \ ../../daemon/UnixDaemon.cpp \ - ../../daemon/UPnP.cpp + ../../daemon/UPnP.cpp \ + textbrowsertweaked1.cpp #qt creator does not handle this well #SOURCES += $$files(../../libi2pd/*.cpp) @@ -166,7 +167,8 @@ HEADERS += DaemonQT.h mainwindow.h \ ../../daemon/Daemon.h \ ../../daemon/HTTPServer.h \ ../../daemon/I2PControl.h \ - ../../daemon/UPnP.h + ../../daemon/UPnP.h \ + textbrowsertweaked1.h INCLUDEPATH += ../../libi2pd INCLUDEPATH += ../../libi2pd_client diff --git a/qt/i2pd_qt/mainwindow.cpp b/qt/i2pd_qt/mainwindow.cpp index 840f5b5b..3a947bd1 100644 --- a/qt/i2pd_qt/mainwindow.cpp +++ b/qt/i2pd_qt/mainwindow.cpp @@ -1,6 +1,8 @@ #include "mainwindow.h" #include "ui_mainwindow.h" #include "ui_statusbuttons.h" +#include "ui_statushtmlpaneform.h" +#include #include #include #include @@ -10,6 +12,8 @@ #include "FS.h" #include "Log.h" +#include "HTTPServer.h" + #ifndef ANDROID # include #endif @@ -28,6 +32,8 @@ MainWindow::MainWindow(QWidget *parent) : #ifndef ANDROID ,quitting(false) #endif + ,wasSelectingAtStatusMainPage(false) + ,showHiddenInfoStatusMainPage(false) ,ui(new Ui::MainWindow) ,statusButtonsUI(new Ui::StatusButtonsForm) ,i2pController(nullptr) @@ -40,6 +46,8 @@ MainWindow::MainWindow(QWidget *parent) : { ui->setupUi(this); statusButtonsUI->setupUi(ui->statusButtonsPane); + //,statusHtmlUI(new Ui::StatusHtmlPaneForm) + //statusHtmlUI->setupUi(lastStatusWidgetui->statusWidget); ui->statusButtonsPane->setFixedSize(171,300); ui->verticalLayout->setGeometry(QRect(0,0,171,ui->verticalLayout->geometry().height())); //ui->statusButtonsPane->adjustSize(); @@ -75,8 +83,17 @@ MainWindow::MainWindow(QWidget *parent) : createTrayIcon(); #endif - QObject::connect(ui->statusPagePushButton, SIGNAL(released()), this, SLOT(showStatusPage())); - setStatusButtonsVisible(true); + textBrowser = new TextBrowserTweaked1(); + ui->verticalLayout_2->addWidget(textBrowser); + scheduleMainPageUpdates(); + + QObject::connect(ui->statusPagePushButton, SIGNAL(released()), this, SLOT(showStatusMainPage())); + showStatusMainPage(); + QObject::connect(statusButtonsUI->mainPagePushButton, SIGNAL(released()), this, SLOT(showStatusMainPage())); + QObject::connect(textBrowser, SIGNAL(mouseReleased()), this, SLOT(statusHtmlPageMouseReleased())); + QObject::connect(textBrowser, SIGNAL(selectionChanged()), this, SLOT(statusHtmlPageSelectionChanged())); + + QObject::connect(ui->settingsPagePushButton, SIGNAL(released()), this, SLOT(showSettingsPage())); QObject::connect(ui->tunnelsPagePushButton, SIGNAL(released()), this, SLOT(showTunnelsPage())); @@ -243,6 +260,49 @@ void MainWindow::setStatusButtonsVisible(bool visible) { ui->statusButtonsPane->setVisible(visible); } +// see also: HTTPServer.cpp +QString MainWindow::getStatusMainPageHtml(bool showHiddenInfo) { + std::stringstream s; + + i2p::http::ShowStatus (s, showHiddenInfo); + + std::string str = s.str(); + return QString::fromStdString(str); +} + +void MainWindow::showStatusMainPage() { + showHiddenInfoStatusMainPage=false; + showStatusPage(); + textBrowser->setHtml(getStatusMainPageHtml(false)); + textBrowser->show(); + wasSelectingAtStatusMainPage=false; +} + +void MainWindow::scheduleMainPageUpdates() { + statusMainPageUpdateTimer = new QTimer(this); + connect(statusMainPageUpdateTimer, SIGNAL(timeout()), this, SLOT(updateStatusMainPage())); + statusMainPageUpdateTimer->start(10*1000/*millis*/); +} + +void MainWindow::statusHtmlPageMouseReleased() { + if(wasSelectingAtStatusMainPage){ + QString selection = textBrowser->textCursor().selectedText(); + if(!selection.isEmpty()&&!selection.isNull())return; + } + showHiddenInfoStatusMainPage=!showHiddenInfoStatusMainPage; + textBrowser->setHtml(getStatusMainPageHtml(showHiddenInfoStatusMainPage)); +} + +void MainWindow::statusHtmlPageSelectionChanged() { + wasSelectingAtStatusMainPage=true; +} + +void MainWindow::updateStatusMainPage() { + showHiddenInfoStatusMainPage=false; + textBrowser->setHtml(getStatusMainPageHtml(showHiddenInfoStatusMainPage)); +} + + //TODO void MainWindow::resizeEvent(QResizeEvent *event) { @@ -363,6 +423,7 @@ void MainWindow::handleGracefulQuitTimerEvent() { MainWindow::~MainWindow() { qDebug("Destroying main window"); + delete statusMainPageUpdateTimer; for(QList::iterator it = configItems.begin(); it!= configItems.end(); ++it) { MainWindowItem* item = *it; item->deleteLater(); @@ -642,3 +703,4 @@ void MainWindow::addClientTunnelPushButtonReleased() { void MainWindow::setI2PController(i2p::qt::Controller* controller_) { this->i2pController = controller_; } + diff --git a/qt/i2pd_qt/mainwindow.h b/qt/i2pd_qt/mainwindow.h index fbadf83e..e973cfe1 100644 --- a/qt/i2pd_qt/mainwindow.h +++ b/qt/i2pd_qt/mainwindow.h @@ -40,6 +40,7 @@ #include "ServerTunnelPane.h" #include "ClientTunnelPane.h" #include "TunnelConfig.h" +#include "textbrowsertweaked1.h" #include "Config.h" #include "FS.h" @@ -306,8 +307,9 @@ public: }; namespace Ui { -class MainWindow; -class StatusButtonsForm; + class MainWindow; + class StatusButtonsForm; + class StatusHtmlPaneForm; } using namespace i2p::client; @@ -343,13 +345,23 @@ private slots: void iconActivated(QSystemTrayIcon::ActivationReason reason); void toggleVisibilitySlot(); #endif - void showStatusPage(); + void showStatusMainPage(); + void statusHtmlPageMouseReleased(); + void statusHtmlPageSelectionChanged(); + void updateStatusMainPage(); + void scheduleMainPageUpdates(); + void showSettingsPage(); void showTunnelsPage(); void showRestartPage(); void showQuitPage(); private: + QTimer * statusMainPageUpdateTimer; + bool wasSelectingAtStatusMainPage; + bool showHiddenInfoStatusMainPage; + + void showStatusPage(); #ifndef ANDROID void createActions(); void createTrayIcon(); @@ -362,6 +374,8 @@ private: Ui::MainWindow* ui; Ui::StatusButtonsForm* statusButtonsUI; + TextBrowserTweaked1 * textBrowser; + i2p::qt::Controller* i2pController; protected: @@ -373,6 +387,8 @@ protected: void setStatusButtonsVisible(bool visible); + QString getStatusMainPageHtml(bool showHiddenInfo); + QList configItems; NonGUIOptionItem* logOption; NonGUIOptionItem* daemonOption; diff --git a/qt/i2pd_qt/mainwindow.ui b/qt/i2pd_qt/mainwindow.ui index 60aacbe2..59033e9d 100644 --- a/qt/i2pd_qt/mainwindow.ui +++ b/qt/i2pd_qt/mainwindow.ui @@ -6,19 +6,19 @@ 0 0 - 904 + 908 550 - 904 + 908 0 - 950 + 908 16777215 @@ -34,13 +34,13 @@ - 904 - 0 + 908 + 550 - 16777215 + 908 550 @@ -49,8 +49,8 @@ 10 10 - 931 - 715 + 888 + 530 @@ -183,26 +183,32 @@ - 16777215 + 713 713 - 2 + 0 + + + 0 + 0 + + 0 0 - 686 + 713 531 - QLayout::SetMinAndMaxSize + QLayout::SetMaximumSize @@ -217,17 +223,11 @@ - - - Qt::Vertical + + + QLayout::SetMaximumSize - - - 20 - 40 - - - +
@@ -244,7 +244,7 @@ 0 0 - 706 + 711 531 @@ -283,8 +283,8 @@ 0 0 - 684 - 496 + 80 + 26 @@ -3045,7 +3045,7 @@ Comma separated list of base64 identities: 0 0 - 706 + 711 531 @@ -3110,7 +3110,7 @@ Comma separated list of base64 identities: - -18 + 0 0 699 425 @@ -3128,8 +3128,8 @@ Comma separated list of base64 identities: 0 0 - 686 - 496 + 711 + 531 @@ -3183,8 +3183,8 @@ Comma separated list of base64 identities: 0 0 - 686 - 496 + 711 + 531 diff --git a/qt/i2pd_qt/textbrowsertweaked1.cpp b/qt/i2pd_qt/textbrowsertweaked1.cpp new file mode 100644 index 00000000..7d0f5132 --- /dev/null +++ b/qt/i2pd_qt/textbrowsertweaked1.cpp @@ -0,0 +1,6 @@ +#include "textbrowsertweaked1.h" + +TextBrowserTweaked1::TextBrowserTweaked1() +{ + +} diff --git a/qt/i2pd_qt/textbrowsertweaked1.h b/qt/i2pd_qt/textbrowsertweaked1.h new file mode 100644 index 00000000..d64c58d8 --- /dev/null +++ b/qt/i2pd_qt/textbrowsertweaked1.h @@ -0,0 +1,22 @@ +#ifndef TEXTBROWSERTWEAKED1_H +#define TEXTBROWSERTWEAKED1_H + +#include + +class TextBrowserTweaked1 : public QTextBrowser +{ + Q_OBJECT + +public: + TextBrowserTweaked1(); + +signals: + void mouseReleased(); + +protected: + void mouseReleaseEvent(QMouseEvent *event) { + emit mouseReleased(); + } +}; + +#endif // TEXTBROWSERTWEAKED1_H From 856dda68dbcd6eb706ee319113c2b72dc985c9ef Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Wed, 2 Aug 2017 04:12:37 +0800 Subject: [PATCH 6/9] qt ui - now all buttons have handlers --- daemon/HTTPServer.cpp | 16 ++++----- daemon/HTTPServer.h | 9 +++++ qt/i2pd_qt/mainwindow.cpp | 69 ++++++++++++++++++++++++++++----------- qt/i2pd_qt/mainwindow.h | 27 +++++++++++---- 4 files changed, 88 insertions(+), 33 deletions(-) diff --git a/daemon/HTTPServer.cpp b/daemon/HTTPServer.cpp index 1f7dbc7b..82939bbf 100644 --- a/daemon/HTTPServer.cpp +++ b/daemon/HTTPServer.cpp @@ -273,7 +273,7 @@ namespace http { s << "Transit Tunnels: " << std::to_string(transitTunnelCount) << "
\r\n"; } - static void ShowLocalDestinations (std::stringstream& s) + void ShowLocalDestinations (std::stringstream& s) { s << "Local Destinations:
\r\n
\r\n"; for (auto& it: i2p::client::context.GetDestinations ()) @@ -399,7 +399,7 @@ namespace http { ShowError(s, "I2CP is not enabled"); } - static void ShowLeasesSets(std::stringstream& s) + void ShowLeasesSets(std::stringstream& s) { s << "
LeaseSets (click on to show info):

\r\n"; int counter = 1; @@ -432,7 +432,7 @@ namespace http { // end for each lease set } - static void ShowTunnels (std::stringstream& s) + void ShowTunnels (std::stringstream& s) { s << "Queue size: " << i2p::tunnel::tunnels.GetQueueSize () << "
\r\n"; @@ -454,7 +454,7 @@ namespace http { s << "
\r\n"; } - static void ShowCommands (std::stringstream& s, uint32_t token) + void ShowCommands (std::stringstream& s, uint32_t token) { /* commands */ s << "Router Commands
\r\n"; @@ -476,7 +476,7 @@ namespace http { s << " Force shutdown
\r\n"; } - static void ShowTransitTunnels (std::stringstream& s) + void ShowTransitTunnels (std::stringstream& s) { s << "Transit tunnels:
\r\n
\r\n"; for (const auto& it: i2p::tunnel::tunnels.GetTransitTunnels ()) @@ -491,7 +491,7 @@ namespace http { } } - static void ShowTransports (std::stringstream& s) + void ShowTransports (std::stringstream& s) { s << "Transports:
\r\n
\r\n"; auto ntcpServer = i2p::transport::transports.GetNTCPServer (); @@ -577,7 +577,7 @@ namespace http { } } - static void ShowSAMSessions (std::stringstream& s) + void ShowSAMSessions (std::stringstream& s) { auto sam = i2p::client::context.GetSAMBridge (); if (!sam) { @@ -624,7 +624,7 @@ namespace http { } } - static void ShowI2PTunnels (std::stringstream& s) + void ShowI2PTunnels (std::stringstream& s) { s << "Client Tunnels:
\r\n
\r\n"; for (auto& it: i2p::client::context.GetClientTunnels ()) diff --git a/daemon/HTTPServer.h b/daemon/HTTPServer.h index edff1bf3..79f265b8 100644 --- a/daemon/HTTPServer.h +++ b/daemon/HTTPServer.h @@ -77,7 +77,16 @@ namespace http boost::asio::ip::tcp::acceptor m_Acceptor; }; + //all the below functions are also used by Qt GUI, see mainwindow.cpp -> getStatusPageHtml void ShowStatus (std::stringstream& s, bool includeHiddenContent); + void ShowLocalDestinations (std::stringstream& s); + void ShowLeasesSets(std::stringstream& s); + void ShowTunnels (std::stringstream& s); + void ShowCommands (std::stringstream& s, uint32_t token); + void ShowTransitTunnels (std::stringstream& s); + void ShowTransports (std::stringstream& s); + void ShowSAMSessions (std::stringstream& s); + void ShowI2PTunnels (std::stringstream& s); } // http } // i2p diff --git a/qt/i2pd_qt/mainwindow.cpp b/qt/i2pd_qt/mainwindow.cpp index 3a947bd1..b465bc18 100644 --- a/qt/i2pd_qt/mainwindow.cpp +++ b/qt/i2pd_qt/mainwindow.cpp @@ -1,3 +1,4 @@ +#include #include "mainwindow.h" #include "ui_mainwindow.h" #include "ui_statusbuttons.h" @@ -85,11 +86,20 @@ MainWindow::MainWindow(QWidget *parent) : textBrowser = new TextBrowserTweaked1(); ui->verticalLayout_2->addWidget(textBrowser); - scheduleMainPageUpdates(); + scheduleStatusPageUpdates(); QObject::connect(ui->statusPagePushButton, SIGNAL(released()), this, SLOT(showStatusMainPage())); showStatusMainPage(); QObject::connect(statusButtonsUI->mainPagePushButton, SIGNAL(released()), this, SLOT(showStatusMainPage())); + QObject::connect(statusButtonsUI->routerCommandsPushButton, SIGNAL(released()), this, SLOT(showStatus_commands_Page())); + QObject::connect(statusButtonsUI->localDestinationsPushButton, SIGNAL(released()), this, SLOT(showStatus_local_destinations_Page())); + QObject::connect(statusButtonsUI->leasesetsPushButton, SIGNAL(released()), this, SLOT(showStatus_leasesets_Page())); + QObject::connect(statusButtonsUI->tunnelsPushButton, SIGNAL(released()), this, SLOT(showStatus_tunnels_Page())); + QObject::connect(statusButtonsUI->transitTunnelsPushButton, SIGNAL(released()), this, SLOT(showStatus_transit_tunnels_Page())); + QObject::connect(statusButtonsUI->transportsPushButton, SIGNAL(released()), this, SLOT(showStatus_transports_Page())); + QObject::connect(statusButtonsUI->i2pTunnelsPushButton, SIGNAL(released()), this, SLOT(showStatus_i2p_tunnels_Page())); + QObject::connect(statusButtonsUI->samSessionsPushButton, SIGNAL(released()), this, SLOT(showStatus_sam_sessions_Page())); + QObject::connect(textBrowser, SIGNAL(mouseReleased()), this, SLOT(statusHtmlPageMouseReleased())); QObject::connect(textBrowser, SIGNAL(selectionChanged()), this, SLOT(statusHtmlPageSelectionChanged())); @@ -250,7 +260,14 @@ MainWindow::MainWindow(QWidget *parent) : //QMetaObject::connectSlotsByName(this); } -void MainWindow::showStatusPage(){ui->stackedWidget->setCurrentIndex(0);setStatusButtonsVisible(true);} +void MainWindow::showStatusPage(StatusPage newStatusPage){ + ui->stackedWidget->setCurrentIndex(0); + setStatusButtonsVisible(true); + statusPage=newStatusPage; + showHiddenInfoStatusMainPage=false; + textBrowser->setHtml(getStatusPageHtml(false)); + wasSelectingAtStatusMainPage=false; +} void MainWindow::showSettingsPage(){ui->stackedWidget->setCurrentIndex(1);setStatusButtonsVisible(false);} void MainWindow::showTunnelsPage(){ui->stackedWidget->setCurrentIndex(2);setStatusButtonsVisible(false);} void MainWindow::showRestartPage(){ui->stackedWidget->setCurrentIndex(3);setStatusButtonsVisible(false);} @@ -261,27 +278,41 @@ void MainWindow::setStatusButtonsVisible(bool visible) { } // see also: HTTPServer.cpp -QString MainWindow::getStatusMainPageHtml(bool showHiddenInfo) { +QString MainWindow::getStatusPageHtml(bool showHiddenInfo) { std::stringstream s; - i2p::http::ShowStatus (s, showHiddenInfo); + switch (statusPage) { + case main_page: i2p::http::ShowStatus(s, showHiddenInfo);break; + case commands: i2p::http::ShowCommands(s, /*token=*/0); break; + case local_destinations: i2p::http::ShowLocalDestinations(s);break; + case leasesets: i2p::http::ShowLeasesSets(s); break; + case tunnels: i2p::http::ShowTunnels(s); break; + case transit_tunnels: i2p::http::ShowTransitTunnels(s); break; + case transports: i2p::http::ShowTransports(s); break; + case i2p_tunnels: i2p::http::ShowI2PTunnels(s); break; + case sam_sessions: i2p::http::ShowSAMSessions(s); break; + default: assert(false); break; + } std::string str = s.str(); return QString::fromStdString(str); } -void MainWindow::showStatusMainPage() { - showHiddenInfoStatusMainPage=false; - showStatusPage(); - textBrowser->setHtml(getStatusMainPageHtml(false)); - textBrowser->show(); - wasSelectingAtStatusMainPage=false; -} +void MainWindow::showStatusMainPage() { showStatusPage(StatusPage::main_page); } +void MainWindow::showStatus_commands_Page() { showStatusPage(StatusPage::commands); } +void MainWindow::showStatus_local_destinations_Page() { showStatusPage(StatusPage::local_destinations); } +void MainWindow::showStatus_leasesets_Page() { showStatusPage(StatusPage::leasesets); } +void MainWindow::showStatus_tunnels_Page() { showStatusPage(StatusPage::tunnels); } +void MainWindow::showStatus_transit_tunnels_Page() { showStatusPage(StatusPage::transit_tunnels); } +void MainWindow::showStatus_transports_Page() { showStatusPage(StatusPage::transports); } +void MainWindow::showStatus_i2p_tunnels_Page() { showStatusPage(StatusPage::i2p_tunnels); } +void MainWindow::showStatus_sam_sessions_Page() { showStatusPage(StatusPage::sam_sessions); } + -void MainWindow::scheduleMainPageUpdates() { - statusMainPageUpdateTimer = new QTimer(this); - connect(statusMainPageUpdateTimer, SIGNAL(timeout()), this, SLOT(updateStatusMainPage())); - statusMainPageUpdateTimer->start(10*1000/*millis*/); +void MainWindow::scheduleStatusPageUpdates() { + statusPageUpdateTimer = new QTimer(this); + connect(statusPageUpdateTimer, SIGNAL(timeout()), this, SLOT(updateStatusPage())); + statusPageUpdateTimer->start(10*1000/*millis*/); } void MainWindow::statusHtmlPageMouseReleased() { @@ -290,16 +321,16 @@ void MainWindow::statusHtmlPageMouseReleased() { if(!selection.isEmpty()&&!selection.isNull())return; } showHiddenInfoStatusMainPage=!showHiddenInfoStatusMainPage; - textBrowser->setHtml(getStatusMainPageHtml(showHiddenInfoStatusMainPage)); + textBrowser->setHtml(getStatusPageHtml(showHiddenInfoStatusMainPage)); } void MainWindow::statusHtmlPageSelectionChanged() { wasSelectingAtStatusMainPage=true; } -void MainWindow::updateStatusMainPage() { +void MainWindow::updateStatusPage() { showHiddenInfoStatusMainPage=false; - textBrowser->setHtml(getStatusMainPageHtml(showHiddenInfoStatusMainPage)); + textBrowser->setHtml(getStatusPageHtml(showHiddenInfoStatusMainPage)); } @@ -423,7 +454,7 @@ void MainWindow::handleGracefulQuitTimerEvent() { MainWindow::~MainWindow() { qDebug("Destroying main window"); - delete statusMainPageUpdateTimer; + delete statusPageUpdateTimer; for(QList::iterator it = configItems.begin(); it!= configItems.end(); ++it) { MainWindowItem* item = *it; item->deleteLater(); diff --git a/qt/i2pd_qt/mainwindow.h b/qt/i2pd_qt/mainwindow.h index e973cfe1..1c538810 100644 --- a/qt/i2pd_qt/mainwindow.h +++ b/qt/i2pd_qt/mainwindow.h @@ -335,7 +335,12 @@ public: // void setVisible(bool visible); //#endif +private: + + enum StatusPage {main_page, commands, local_destinations, leasesets, tunnels, transit_tunnels, + transports, i2p_tunnels, sam_sessions}; private slots: + void handleQuitButton(); void handleGracefulQuitButton(); void handleDoRestartButton(); @@ -345,11 +350,20 @@ private slots: void iconActivated(QSystemTrayIcon::ActivationReason reason); void toggleVisibilitySlot(); #endif - void showStatusMainPage(); + void scheduleStatusPageUpdates(); void statusHtmlPageMouseReleased(); void statusHtmlPageSelectionChanged(); - void updateStatusMainPage(); - void scheduleMainPageUpdates(); + void updateStatusPage(); + + void showStatusMainPage(); + void showStatus_commands_Page(); + void showStatus_local_destinations_Page(); + void showStatus_leasesets_Page(); + void showStatus_tunnels_Page(); + void showStatus_transit_tunnels_Page(); + void showStatus_transports_Page(); + void showStatus_i2p_tunnels_Page(); + void showStatus_sam_sessions_Page(); void showSettingsPage(); void showTunnelsPage(); @@ -357,11 +371,12 @@ private slots: void showQuitPage(); private: - QTimer * statusMainPageUpdateTimer; + StatusPage statusPage; + QTimer * statusPageUpdateTimer; bool wasSelectingAtStatusMainPage; bool showHiddenInfoStatusMainPage; - void showStatusPage(); + void showStatusPage(StatusPage newStatusPage); #ifndef ANDROID void createActions(); void createTrayIcon(); @@ -387,7 +402,7 @@ protected: void setStatusButtonsVisible(bool visible); - QString getStatusMainPageHtml(bool showHiddenInfo); + QString getStatusPageHtml(bool showHiddenInfo); QList configItems; NonGUIOptionItem* logOption; From db0e02c05df9d9b61fd63d0fe2840d7b8347f6c3 Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Wed, 2 Aug 2017 05:05:56 +0800 Subject: [PATCH 7/9] qt ui - status commands are now pushbuttons with no handlers --- daemon/HTTPServer.cpp | 2 +- daemon/HTTPServer.h | 1 - qt/i2pd_qt/i2pd_qt.pro | 3 +- qt/i2pd_qt/mainwindow.cpp | 32 +++++++--- qt/i2pd_qt/mainwindow.h | 7 ++- qt/i2pd_qt/mainwindow.ui | 4 +- qt/i2pd_qt/routercommandswidget.ui | 94 ++++++++++++++++++++++++++++++ 7 files changed, 130 insertions(+), 13 deletions(-) create mode 100644 qt/i2pd_qt/routercommandswidget.ui diff --git a/daemon/HTTPServer.cpp b/daemon/HTTPServer.cpp index 82939bbf..a019acaf 100644 --- a/daemon/HTTPServer.cpp +++ b/daemon/HTTPServer.cpp @@ -454,7 +454,7 @@ namespace http { s << "
\r\n"; } - void ShowCommands (std::stringstream& s, uint32_t token) + static void ShowCommands (std::stringstream& s, uint32_t token) { /* commands */ s << "Router Commands
\r\n"; diff --git a/daemon/HTTPServer.h b/daemon/HTTPServer.h index 79f265b8..b65c9094 100644 --- a/daemon/HTTPServer.h +++ b/daemon/HTTPServer.h @@ -82,7 +82,6 @@ namespace http void ShowLocalDestinations (std::stringstream& s); void ShowLeasesSets(std::stringstream& s); void ShowTunnels (std::stringstream& s); - void ShowCommands (std::stringstream& s, uint32_t token); void ShowTransitTunnels (std::stringstream& s); void ShowTransports (std::stringstream& s); void ShowSAMSessions (std::stringstream& s); diff --git a/qt/i2pd_qt/i2pd_qt.pro b/qt/i2pd_qt/i2pd_qt.pro index 918f0230..c1ce8c5c 100644 --- a/qt/i2pd_qt/i2pd_qt.pro +++ b/qt/i2pd_qt/i2pd_qt.pro @@ -177,7 +177,8 @@ INCLUDEPATH += . FORMS += mainwindow.ui \ tunnelform.ui \ - statusbuttons.ui + statusbuttons.ui \ + routercommandswidget.ui LIBS += -lz diff --git a/qt/i2pd_qt/mainwindow.cpp b/qt/i2pd_qt/mainwindow.cpp index b465bc18..b342efe1 100644 --- a/qt/i2pd_qt/mainwindow.cpp +++ b/qt/i2pd_qt/mainwindow.cpp @@ -1,9 +1,11 @@ +#include #include #include "mainwindow.h" #include "ui_mainwindow.h" #include "ui_statusbuttons.h" -#include "ui_statushtmlpaneform.h" +#include "ui_routercommandswidget.h" #include +#include #include #include #include @@ -12,6 +14,7 @@ #include "Config.h" #include "FS.h" #include "Log.h" +#include "RouterContext.h" #include "HTTPServer.h" @@ -19,10 +22,6 @@ # include #endif -#include - -#include - #include "DaemonQT.h" #include "SignatureTypeComboboxFactory.h" @@ -37,6 +36,8 @@ MainWindow::MainWindow(QWidget *parent) : ,showHiddenInfoStatusMainPage(false) ,ui(new Ui::MainWindow) ,statusButtonsUI(new Ui::StatusButtonsForm) + ,routerCommandsUI(new Ui::routerCommandsWidget) + ,routerCommandsParent(new QWidget(this)) ,i2pController(nullptr) ,configItems() ,datadir() @@ -47,6 +48,9 @@ MainWindow::MainWindow(QWidget *parent) : { ui->setupUi(this); statusButtonsUI->setupUi(ui->statusButtonsPane); + routerCommandsUI->setupUi(routerCommandsParent); + routerCommandsParent->hide(); + ui->verticalLayout_2->addWidget(routerCommandsParent); //,statusHtmlUI(new Ui::StatusHtmlPaneForm) //statusHtmlUI->setupUi(lastStatusWidgetui->statusWidget); ui->statusButtonsPane->setFixedSize(171,300); @@ -260,12 +264,26 @@ MainWindow::MainWindow(QWidget *parent) : //QMetaObject::connectSlotsByName(this); } +void MainWindow::updateRouterCommandsButtons() { + bool acceptsTunnels = i2p::context.AcceptsTunnels (); + routerCommandsUI->declineTransitTunnelsPushButton->setEnabled(acceptsTunnels); + routerCommandsUI->acceptTransitTunnelsPushButton->setEnabled(!acceptsTunnels); +} + void MainWindow::showStatusPage(StatusPage newStatusPage){ ui->stackedWidget->setCurrentIndex(0); setStatusButtonsVisible(true); statusPage=newStatusPage; showHiddenInfoStatusMainPage=false; - textBrowser->setHtml(getStatusPageHtml(false)); + if(newStatusPage!=StatusPage::commands){ + textBrowser->setHtml(getStatusPageHtml(false)); + textBrowser->show(); + routerCommandsParent->hide(); + }else{ + routerCommandsParent->show(); + textBrowser->hide(); + updateRouterCommandsButtons(); + } wasSelectingAtStatusMainPage=false; } void MainWindow::showSettingsPage(){ui->stackedWidget->setCurrentIndex(1);setStatusButtonsVisible(false);} @@ -283,7 +301,7 @@ QString MainWindow::getStatusPageHtml(bool showHiddenInfo) { switch (statusPage) { case main_page: i2p::http::ShowStatus(s, showHiddenInfo);break; - case commands: i2p::http::ShowCommands(s, /*token=*/0); break; + case commands: break; case local_destinations: i2p::http::ShowLocalDestinations(s);break; case leasesets: i2p::http::ShowLeasesSets(s); break; case tunnels: i2p::http::ShowTunnels(s); break; diff --git a/qt/i2pd_qt/mainwindow.h b/qt/i2pd_qt/mainwindow.h index 1c538810..2a1e7d64 100644 --- a/qt/i2pd_qt/mainwindow.h +++ b/qt/i2pd_qt/mainwindow.h @@ -309,7 +309,7 @@ public: namespace Ui { class MainWindow; class StatusButtonsForm; - class StatusHtmlPaneForm; + class routerCommandsWidget; } using namespace i2p::client; @@ -388,12 +388,17 @@ private: Ui::MainWindow* ui; Ui::StatusButtonsForm* statusButtonsUI; + Ui::routerCommandsWidget* routerCommandsUI; TextBrowserTweaked1 * textBrowser; + QWidget * routerCommandsParent; i2p::qt::Controller* i2pController; protected: + + void updateRouterCommandsButtons(); + #ifndef ANDROID void closeEvent(QCloseEvent *event); #endif diff --git a/qt/i2pd_qt/mainwindow.ui b/qt/i2pd_qt/mainwindow.ui index 59033e9d..6945a2a2 100644 --- a/qt/i2pd_qt/mainwindow.ui +++ b/qt/i2pd_qt/mainwindow.ui @@ -283,8 +283,8 @@ 0 0 - 80 - 26 + 689 + 496 diff --git a/qt/i2pd_qt/routercommandswidget.ui b/qt/i2pd_qt/routercommandswidget.ui new file mode 100644 index 00000000..fa4f2177 --- /dev/null +++ b/qt/i2pd_qt/routercommandswidget.ui @@ -0,0 +1,94 @@ + + + routerCommandsWidget + + + + 0 + 0 + 400 + 300 + + + + + 0 + 0 + + + + Form + + + + + 0 + 0 + 401 + 301 + + + + + + + + 75 + true + + + + Router Commands + + + + + + + Run peer test + + + + + + + Decline transit tunnels + + + + + + + Accept transit tunnels + + + + + + + false + + + Cancel graceful quit + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + From 822995cbaf5e44359bdb88e7f315e40581644754 Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Thu, 3 Aug 2017 06:18:21 +0800 Subject: [PATCH 8/9] ignored android/libs/ --- .gitignore | 2 ++ qt/i2pd_qt/pagewithbackbutton.cpp | 6 ++++++ qt/i2pd_qt/pagewithbackbutton.h | 17 +++++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 qt/i2pd_qt/pagewithbackbutton.cpp create mode 100644 qt/i2pd_qt/pagewithbackbutton.h diff --git a/.gitignore b/.gitignore index 5424262f..353d839f 100644 --- a/.gitignore +++ b/.gitignore @@ -262,3 +262,5 @@ qt/i2pd_qt/*.ui.autosave qt/i2pd_qt/*.ui.bk* qt/i2pd_qt/*.ui_* +#unknown android stuff +android/libs/ diff --git a/qt/i2pd_qt/pagewithbackbutton.cpp b/qt/i2pd_qt/pagewithbackbutton.cpp new file mode 100644 index 00000000..c1692552 --- /dev/null +++ b/qt/i2pd_qt/pagewithbackbutton.cpp @@ -0,0 +1,6 @@ +#include "pagewithbackbutton.h" + +PageWithBackButton::PageWithBackButton(QWidget *parent) : QWidget(parent) +{ + +} diff --git a/qt/i2pd_qt/pagewithbackbutton.h b/qt/i2pd_qt/pagewithbackbutton.h new file mode 100644 index 00000000..eef97b26 --- /dev/null +++ b/qt/i2pd_qt/pagewithbackbutton.h @@ -0,0 +1,17 @@ +#ifndef PAGEWITHBACKBUTTON_H +#define PAGEWITHBACKBUTTON_H + +#include + +class PageWithBackButton : public QWidget +{ + Q_OBJECT +public: + explicit PageWithBackButton(QWidget *parent = 0); + +signals: + +public slots: +}; + +#endif // PAGEWITHBACKBUTTON_H \ No newline at end of file From 07fe51fa25ab9afeabc45a09874d9626aaddaf3e Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Sun, 20 Aug 2017 10:22:30 +0800 Subject: [PATCH 9/9] some qt gui changes --- daemon/HTTPServer.cpp | 2 +- daemon/HTTPServer.h | 1 + qt/i2pd_qt/i2pd_qt.pro | 6 ++- qt/i2pd_qt/mainwindow.cpp | 62 +++++++++++++++++++++++++++++- qt/i2pd_qt/mainwindow.h | 11 ++++++ qt/i2pd_qt/pagewithbackbutton.cpp | 20 +++++++++- qt/i2pd_qt/pagewithbackbutton.h | 10 +++-- qt/i2pd_qt/routercommandswidget.ui | 37 +++++++++++++++++- qt/i2pd_qt/textbrowsertweaked1.cpp | 7 +++- qt/i2pd_qt/textbrowsertweaked1.h | 6 ++- 10 files changed, 148 insertions(+), 14 deletions(-) diff --git a/daemon/HTTPServer.cpp b/daemon/HTTPServer.cpp index a019acaf..d491e8a0 100644 --- a/daemon/HTTPServer.cpp +++ b/daemon/HTTPServer.cpp @@ -341,7 +341,7 @@ namespace http { s << "
" << std::endl; } - static void ShowLocalDestination (std::stringstream& s, const std::string& b32) + void ShowLocalDestination (std::stringstream& s, const std::string& b32) { s << "Local Destination:
\r\n
\r\n"; i2p::data::IdentHash ident; diff --git a/daemon/HTTPServer.h b/daemon/HTTPServer.h index b65c9094..ec718532 100644 --- a/daemon/HTTPServer.h +++ b/daemon/HTTPServer.h @@ -86,6 +86,7 @@ namespace http void ShowTransports (std::stringstream& s); void ShowSAMSessions (std::stringstream& s); void ShowI2PTunnels (std::stringstream& s); + void ShowLocalDestination (std::stringstream& s, const std::string& b32); } // http } // i2p diff --git a/qt/i2pd_qt/i2pd_qt.pro b/qt/i2pd_qt/i2pd_qt.pro index c1ce8c5c..06760bb7 100644 --- a/qt/i2pd_qt/i2pd_qt.pro +++ b/qt/i2pd_qt/i2pd_qt.pro @@ -88,7 +88,8 @@ SOURCES += DaemonQT.cpp mainwindow.cpp \ ../../daemon/I2PControl.cpp \ ../../daemon/UnixDaemon.cpp \ ../../daemon/UPnP.cpp \ - textbrowsertweaked1.cpp + textbrowsertweaked1.cpp \ + pagewithbackbutton.cpp #qt creator does not handle this well #SOURCES += $$files(../../libi2pd/*.cpp) @@ -168,7 +169,8 @@ HEADERS += DaemonQT.h mainwindow.h \ ../../daemon/HTTPServer.h \ ../../daemon/I2PControl.h \ ../../daemon/UPnP.h \ - textbrowsertweaked1.h + textbrowsertweaked1.h \ + pagewithbackbutton.h INCLUDEPATH += ../../libi2pd INCLUDEPATH += ../../libi2pd_client diff --git a/qt/i2pd_qt/mainwindow.cpp b/qt/i2pd_qt/mainwindow.cpp index b342efe1..79516206 100644 --- a/qt/i2pd_qt/mainwindow.cpp +++ b/qt/i2pd_qt/mainwindow.cpp @@ -15,6 +15,7 @@ #include "FS.h" #include "Log.h" #include "RouterContext.h" +#include "Transports.h" #include "HTTPServer.h" @@ -60,7 +61,7 @@ MainWindow::MainWindow(QWidget *parent) : setWindowTitle(QApplication::translate("AppTitle","I2PD")); //TODO handle resizes and change the below into resize() call - setFixedSize(width(), 550); + setFixedHeight(550); ui->centralWidget->setFixedHeight(550); onResize(); @@ -88,8 +89,21 @@ MainWindow::MainWindow(QWidget *parent) : createTrayIcon(); #endif - textBrowser = new TextBrowserTweaked1(); + textBrowser = new TextBrowserTweaked1(this); + //textBrowser->setOpenExternalLinks(false); + textBrowser->setOpenLinks(false); + /*textBrowser->setTextInteractionFlags(textBrowser->textInteractionFlags()| + Qt::LinksAccessibleByMouse|Qt::LinksAccessibleByKeyboard| + Qt::TextSelectableByMouse|Qt::TextSelectableByKeyboard);*/ ui->verticalLayout_2->addWidget(textBrowser); + childTextBrowser = new TextBrowserTweaked1(this); + //childTextBrowser->setOpenExternalLinks(false); + childTextBrowser->setOpenLinks(false); + connect(textBrowser, SIGNAL(anchorClicked(const QUrl&)), this, SLOT(anchorClickedHandler(const QUrl&))); + pageWithBackButton = new PageWithBackButton(this, childTextBrowser); + ui->verticalLayout_2->addWidget(pageWithBackButton); + pageWithBackButton->hide(); + connect(pageWithBackButton, SIGNAL(backReleased()), this, SLOT(backClickedFromChild())); scheduleStatusPageUpdates(); QObject::connect(ui->statusPagePushButton, SIGNAL(released()), this, SLOT(showStatusMainPage())); @@ -107,6 +121,9 @@ MainWindow::MainWindow(QWidget *parent) : QObject::connect(textBrowser, SIGNAL(mouseReleased()), this, SLOT(statusHtmlPageMouseReleased())); QObject::connect(textBrowser, SIGNAL(selectionChanged()), this, SLOT(statusHtmlPageSelectionChanged())); + QObject::connect(routerCommandsUI->runPeerTestPushButton, SIGNAL(released()), this, SLOT(runPeerTest())); + QObject::connect(routerCommandsUI->acceptTransitTunnelsPushButton, SIGNAL(released()), this, SLOT(enableTransit())); + QObject::connect(routerCommandsUI->declineTransitTunnelsPushButton, SIGNAL(released()), this, SLOT(disableTransit())); QObject::connect(ui->settingsPagePushButton, SIGNAL(released()), this, SLOT(showSettingsPage())); @@ -279,9 +296,11 @@ void MainWindow::showStatusPage(StatusPage newStatusPage){ textBrowser->setHtml(getStatusPageHtml(false)); textBrowser->show(); routerCommandsParent->hide(); + pageWithBackButton->hide(); }else{ routerCommandsParent->show(); textBrowser->hide(); + pageWithBackButton->hide(); updateRouterCommandsButtons(); } wasSelectingAtStatusMainPage=false; @@ -299,6 +318,8 @@ void MainWindow::setStatusButtonsVisible(bool visible) { QString MainWindow::getStatusPageHtml(bool showHiddenInfo) { std::stringstream s; + s << ""; + switch (statusPage) { case main_page: i2p::http::ShowStatus(s, showHiddenInfo);break; case commands: break; @@ -753,3 +774,40 @@ void MainWindow::setI2PController(i2p::qt::Controller* controller_) { this->i2pController = controller_; } +void MainWindow::runPeerTest() { + i2p::transport::transports.PeerTest(); +} + +void MainWindow::enableTransit() { + i2p::context.SetAcceptsTunnels(true); + updateRouterCommandsButtons(); +} + +void MainWindow::disableTransit() { + i2p::context.SetAcceptsTunnels(false); + updateRouterCommandsButtons(); +} + +void MainWindow::anchorClickedHandler(const QUrl & link) { + QString debugStr=QString()+"anchorClicked: "+"\""+link.toString()+"\""; + qDebug()<show(); + textBrowser->hide(); + std::stringstream s; + i2p::http::ShowLocalDestination(s,str.toStdString()); + childTextBrowser->setHtml(QString::fromStdString(s.str())); + } +} + +void MainWindow::backClickedFromChild() { + showStatusPage(statusPage); +} diff --git a/qt/i2pd_qt/mainwindow.h b/qt/i2pd_qt/mainwindow.h index 2a1e7d64..829cac37 100644 --- a/qt/i2pd_qt/mainwindow.h +++ b/qt/i2pd_qt/mainwindow.h @@ -24,6 +24,7 @@ #include #include #include "QVBoxLayout" +#include "QUrl" #ifndef ANDROID # include @@ -54,6 +55,7 @@ #include "DaemonQT.h" #include "SignatureTypeComboboxFactory.h" +#include "pagewithbackbutton.h" template bool isType(boost::any& a) { @@ -357,6 +359,10 @@ private slots: void showStatusMainPage(); void showStatus_commands_Page(); + void runPeerTest(); + void enableTransit(); + void disableTransit(); + void showStatus_local_destinations_Page(); void showStatus_leasesets_Page(); void showStatus_tunnels_Page(); @@ -392,6 +398,8 @@ private: TextBrowserTweaked1 * textBrowser; QWidget * routerCommandsParent; + PageWithBackButton * pageWithBackButton; + TextBrowserTweaked1 * childTextBrowser; i2p::qt::Controller* i2pController; @@ -442,6 +450,9 @@ public slots: void addServerTunnelPushButtonReleased(); void addClientTunnelPushButtonReleased(); + void anchorClickedHandler(const QUrl & link); + void backClickedFromChild(); + private: QString datadir; QString confpath; diff --git a/qt/i2pd_qt/pagewithbackbutton.cpp b/qt/i2pd_qt/pagewithbackbutton.cpp index c1692552..bc297ac2 100644 --- a/qt/i2pd_qt/pagewithbackbutton.cpp +++ b/qt/i2pd_qt/pagewithbackbutton.cpp @@ -1,6 +1,24 @@ #include "pagewithbackbutton.h" +#include "QVBoxLayout" +#include "QHBoxLayout" +#include "QPushButton" -PageWithBackButton::PageWithBackButton(QWidget *parent) : QWidget(parent) +PageWithBackButton::PageWithBackButton(QWidget *parent, QWidget* child) : QWidget(parent) { + QVBoxLayout * layout = new QVBoxLayout(); + setLayout(layout); + QWidget * topBar = new QWidget(); + QHBoxLayout * topBarLayout = new QHBoxLayout(); + topBar->setLayout(topBarLayout); + layout->addWidget(topBar); + layout->addWidget(child); + QPushButton * backButton = new QPushButton(topBar); + backButton->setText("< Back"); + topBarLayout->addWidget(backButton); + connect(backButton, SIGNAL(released()), this, SLOT(backReleasedSlot())); +} + +void PageWithBackButton::backReleasedSlot() { + emit backReleased(); } diff --git a/qt/i2pd_qt/pagewithbackbutton.h b/qt/i2pd_qt/pagewithbackbutton.h index eef97b26..60779f80 100644 --- a/qt/i2pd_qt/pagewithbackbutton.h +++ b/qt/i2pd_qt/pagewithbackbutton.h @@ -7,11 +7,15 @@ class PageWithBackButton : public QWidget { Q_OBJECT public: - explicit PageWithBackButton(QWidget *parent = 0); + explicit PageWithBackButton(QWidget *parent, QWidget* child); signals: -public slots: + void backReleased(); + +private slots: + + void backReleasedSlot(); }; -#endif // PAGEWITHBACKBUTTON_H \ No newline at end of file +#endif // PAGEWITHBACKBUTTON_H diff --git a/qt/i2pd_qt/routercommandswidget.ui b/qt/i2pd_qt/routercommandswidget.ui index fa4f2177..c5098e8e 100644 --- a/qt/i2pd_qt/routercommandswidget.ui +++ b/qt/i2pd_qt/routercommandswidget.ui @@ -6,7 +6,7 @@ 0 0 - 400 + 711 300
@@ -24,13 +24,22 @@ 0 0 - 401 + 711 301 + + QLayout::SetMaximumSize + + + + 0 + 0 + + 75 @@ -44,6 +53,12 @@ + + + 0 + 0 + + Run peer test @@ -51,6 +66,12 @@ + + + 0 + 0 + + Decline transit tunnels @@ -58,6 +79,12 @@ + + + 0 + 0 + + Accept transit tunnels @@ -68,6 +95,12 @@ false + + + 0 + 0 + + Cancel graceful quit diff --git a/qt/i2pd_qt/textbrowsertweaked1.cpp b/qt/i2pd_qt/textbrowsertweaked1.cpp index 7d0f5132..f8802061 100644 --- a/qt/i2pd_qt/textbrowsertweaked1.cpp +++ b/qt/i2pd_qt/textbrowsertweaked1.cpp @@ -1,6 +1,9 @@ #include "textbrowsertweaked1.h" -TextBrowserTweaked1::TextBrowserTweaked1() +TextBrowserTweaked1::TextBrowserTweaked1(QWidget * parent): QTextBrowser(parent) { - } + +/*void TextBrowserTweaked1::setSource(const QUrl & url) { + emit navigatedTo(url); +}*/ diff --git a/qt/i2pd_qt/textbrowsertweaked1.h b/qt/i2pd_qt/textbrowsertweaked1.h index d64c58d8..288a3c32 100644 --- a/qt/i2pd_qt/textbrowsertweaked1.h +++ b/qt/i2pd_qt/textbrowsertweaked1.h @@ -2,19 +2,23 @@ #define TEXTBROWSERTWEAKED1_H #include +#include class TextBrowserTweaked1 : public QTextBrowser { Q_OBJECT public: - TextBrowserTweaked1(); + TextBrowserTweaked1(QWidget * parent); + //virtual void setSource(const QUrl & url); signals: void mouseReleased(); + //void navigatedTo(const QUrl & link); protected: void mouseReleaseEvent(QMouseEvent *event) { + QTextBrowser::mouseReleaseEvent(event); emit mouseReleased(); } };