From 163cbcb89db5a564c9e782bf69ac0d1d1e1ce640 Mon Sep 17 00:00:00 2001 From: hypnosis-i2p Date: Wed, 2 Aug 2017 02:40:11 +0800 Subject: [PATCH] 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