From a7ff2fef3f9c6d7a458ba0a5c5f44b1ce8465605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Tue, 13 Aug 2019 19:41:44 +0200 Subject: [PATCH] ServerItemWidget Styling --- gui/include/discoverymanager.h | 1 + gui/include/mainwindow.h | 18 +++++++++--- gui/include/servericonwidget.h | 2 +- gui/include/serveritemwidget.h | 7 +++-- gui/src/discoverymanager.cpp | 4 ++- gui/src/mainwindow.cpp | 51 ++++++++++++++++++++++++++-------- gui/src/servericonwidget.cpp | 4 +++ gui/src/serveritemwidget.cpp | 24 ++++++++++++++-- lib/src/discovery.c | 1 + lib/src/discoveryservice.c | 3 ++ 10 files changed, 92 insertions(+), 23 deletions(-) diff --git a/gui/include/discoverymanager.h b/gui/include/discoverymanager.h index f876835..a1e69d5 100644 --- a/gui/include/discoverymanager.h +++ b/gui/include/discoverymanager.h @@ -41,6 +41,7 @@ class DiscoveryManager : public QObject friend class DiscoveryManagerPrivate; private: + ChiakiLog log; ChiakiDiscoveryService service; QList hosts; diff --git a/gui/include/mainwindow.h b/gui/include/mainwindow.h index 157d58c..ffc0e5c 100644 --- a/gui/include/mainwindow.h +++ b/gui/include/mainwindow.h @@ -25,6 +25,12 @@ class DynamicGridWidget; class ServerItemWidget; +struct DisplayServer +{ + DiscoveryHost discovery_host; + bool discovered; +}; + class MainWindow : public QMainWindow { Q_OBJECT @@ -35,17 +41,21 @@ class MainWindow : public QMainWindow DiscoveryManager discovery_manager; - public: - explicit MainWindow(QWidget *parent = nullptr); + QList display_servers; - public slots: + private slots: void ServerItemWidgetSelected(); void ServerItemWidgetTriggered(); void RunDiscovery(); void ShowSettings(); - void DiscoveryHostsUpdated(); + void UpdateDisplayServers(); + void UpdateServerWidgets(); + + public: + explicit MainWindow(QWidget *parent = nullptr); + ~MainWindow() override; }; #endif //CHIAKI_MAINWINDOW_H diff --git a/gui/include/servericonwidget.h b/gui/include/servericonwidget.h index 0dc5343..0a714b4 100644 --- a/gui/include/servericonwidget.h +++ b/gui/include/servericonwidget.h @@ -33,7 +33,7 @@ class ServerIconWidget : public QWidget void paintEvent(QPaintEvent *event) override; public: - explicit ServerIconWidget(QWidget *parent = nullptr) : QWidget(parent) {} + explicit ServerIconWidget(QWidget *parent = nullptr); void SetState(ChiakiDiscoveryHostState state) { this->state = state; update(); } }; diff --git a/gui/include/serveritemwidget.h b/gui/include/serveritemwidget.h index 032b380..9f1ff40 100644 --- a/gui/include/serveritemwidget.h +++ b/gui/include/serveritemwidget.h @@ -18,11 +18,12 @@ #ifndef CHIAKI_SERVERITEMWIDGET_H #define CHIAKI_SERVERITEMWIDGET_H -#include +#include class ServerIconWidget; +class DisplayServer; -class ServerItemWidget : public QWidget +class ServerItemWidget : public QFrame { Q_OBJECT @@ -41,6 +42,8 @@ class ServerItemWidget : public QWidget bool IsSelected() { return selected; } void SetSelected(bool selected); + void Update(const DisplayServer &display_server); + signals: void Selected(); void Triggered(); diff --git a/gui/src/discoverymanager.cpp b/gui/src/discoverymanager.cpp index befc624..baa4df6 100644 --- a/gui/src/discoverymanager.cpp +++ b/gui/src/discoverymanager.cpp @@ -29,6 +29,8 @@ static void DiscoveryServiceHostsCallback(ChiakiDiscoveryHost *hosts, size_t hos DiscoveryManager::DiscoveryManager(QObject *parent) : QObject(parent) { + chiaki_log_init(&log, CHIAKI_LOG_ALL & ~CHIAKI_LOG_VERBOSE, chiaki_log_cb_print, nullptr); + ChiakiDiscoveryServiceOptions options; options.ping_ms = PING_MS; options.hosts_max = HOSTS_MAX; @@ -43,7 +45,7 @@ DiscoveryManager::DiscoveryManager(QObject *parent) : QObject(parent) options.send_addr = reinterpret_cast(&addr); options.send_addr_size = sizeof(addr); - ChiakiErrorCode err = chiaki_discovery_service_init(&service, &options, nullptr /* TODO */); + ChiakiErrorCode err = chiaki_discovery_service_init(&service, &options, &log); if(err != CHIAKI_ERR_SUCCESS) throw std::exception(); } diff --git a/gui/src/mainwindow.cpp b/gui/src/mainwindow.cpp index 7e3635d..3306799 100644 --- a/gui/src/mainwindow.cpp +++ b/gui/src/mainwindow.cpp @@ -64,18 +64,15 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) scroll_content_layout->addStretch(0); grid_widget->setContentsMargins(0, 0, 0, 0); - for(int i=0; i<10; i++) - { - auto w = new ServerItemWidget(grid_widget); - connect(w, &ServerItemWidget::Selected, this, &MainWindow::ServerItemWidgetSelected); - connect(w, &ServerItemWidget::Triggered, this, &MainWindow::ServerItemWidgetTriggered); - server_item_widgets.append(w); - grid_widget->AddWidget(w); - } - resize(800, 600); + + connect(&discovery_manager, &DiscoveryManager::HostsUpdated, this, &MainWindow::UpdateDisplayServers); - connect(&discovery_manager, &DiscoveryManager::HostsUpdated, this, &MainWindow::DiscoveryHostsUpdated); + UpdateDisplayServers(); +} + +MainWindow::~MainWindow() +{ } void MainWindow::ServerItemWidgetSelected() @@ -111,7 +108,37 @@ void MainWindow::ShowSettings() qDebug() << "TODO: ShowSettings()"; } -void MainWindow::DiscoveryHostsUpdated() +void MainWindow::UpdateDisplayServers() { - qDebug() << "updated hosts" << discovery_manager.GetHosts().count(); + display_servers.clear(); + + for(const auto &host : discovery_manager.GetHosts()) + { + DisplayServer server; + server.discovered = true; + server.discovery_host = host; + display_servers.append(server); + } + + UpdateServerWidgets(); +} + +void MainWindow::UpdateServerWidgets() +{ + // remove excessive widgets + while(server_item_widgets.count() > display_servers.count()) + delete server_item_widgets.takeLast(); + + // add new widgets as necessary + while(server_item_widgets.count() < display_servers.count()) + { + auto widget = new ServerItemWidget(grid_widget); + connect(widget, &ServerItemWidget::Selected, this, &MainWindow::ServerItemWidgetSelected); + connect(widget, &ServerItemWidget::Triggered, this, &MainWindow::ServerItemWidgetTriggered); + server_item_widgets.append(widget); + grid_widget->AddWidget(widget); + } + + for(size_t i=0; iUpdate(display_servers[i]); } \ No newline at end of file diff --git a/gui/src/servericonwidget.cpp b/gui/src/servericonwidget.cpp index 05f74e8..e6dd621 100644 --- a/gui/src/servericonwidget.cpp +++ b/gui/src/servericonwidget.cpp @@ -19,6 +19,10 @@ #include +ServerIconWidget::ServerIconWidget(QWidget *parent) : QWidget(parent) +{ +} + void ServerIconWidget::paintEvent(QPaintEvent *event) { static const float icon_aspect = 100.0f / 17.0f; diff --git a/gui/src/serveritemwidget.cpp b/gui/src/serveritemwidget.cpp index a8c16e5..497b589 100644 --- a/gui/src/serveritemwidget.cpp +++ b/gui/src/serveritemwidget.cpp @@ -17,15 +17,18 @@ #include #include +#include #include #include #include -ServerItemWidget::ServerItemWidget(QWidget *parent) : QWidget(parent) +ServerItemWidget::ServerItemWidget(QWidget *parent) : QFrame(parent) { + setFrameStyle(QFrame::Panel | QFrame::Raised); + auto layout = new QVBoxLayout(this); - setLayout(layout); + this->setLayout(layout); auto label = new QLabel("Server", this); layout->addWidget(label); @@ -33,6 +36,9 @@ ServerItemWidget::ServerItemWidget(QWidget *parent) : QWidget(parent) icon_widget = new ServerIconWidget(this); layout->addWidget(icon_widget); + auto label2 = new QLabel("Server2", this); + layout->addWidget(label2); + this->selected = true; SetSelected(false); @@ -54,5 +60,17 @@ void ServerItemWidget::SetSelected(bool selected) if(this->selected == selected) return; this->selected = selected; - setStyleSheet(selected ? "background-color: palette(highlight);" : ""); + setStyleSheet(selected ? "background-color: palette(highlight); color: palette(highlighted-text);" : ""); +} + +void ServerItemWidget::Update(const DisplayServer &display_server) +{ + if(display_server.discovered) + { + icon_widget->SetState(display_server.discovery_host.state); + } + else + { + icon_widget->SetState(CHIAKI_DISCOVERY_HOST_STATE_UNKNOWN); + } } diff --git a/lib/src/discovery.c b/lib/src/discovery.c index 43ee9ff..8af0e11 100644 --- a/lib/src/discovery.c +++ b/lib/src/discovery.c @@ -198,6 +198,7 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_discovery_thread_start(ChiakiDiscoveryThrea CHIAKI_EXPORT ChiakiErrorCode chiaki_discovery_thread_stop(ChiakiDiscoveryThread *thread) { + chiaki_stop_pipe_stop(&thread->stop_pipe); ChiakiErrorCode err = chiaki_thread_join(&thread->thread, NULL); if(err != CHIAKI_ERR_SUCCESS) return err; diff --git a/lib/src/discoveryservice.c b/lib/src/discoveryservice.c index d77f761..b86afe5 100644 --- a/lib/src/discoveryservice.c +++ b/lib/src/discoveryservice.c @@ -28,6 +28,7 @@ static void discovery_service_report_state(ChiakiDiscoveryService *service); CHIAKI_EXPORT ChiakiErrorCode chiaki_discovery_service_init(ChiakiDiscoveryService *service, ChiakiDiscoveryServiceOptions *options, ChiakiLog *log) { + service->log = log; service->options = *options; service->ping_index = 0; @@ -222,6 +223,8 @@ static void discovery_service_host_received(ChiakiDiscoveryHost *host, void *use goto r2con; } + CHIAKI_LOGI(service->log, "Discovery Service detected new host with id %s", host->host_id); + change = true; index = service->hosts_count++; memset(&service->hosts[index], 0, sizeof(ChiakiDiscoveryHost));