ServerItemWidget Styling

This commit is contained in:
Florian Märkl 2019-08-13 19:41:44 +02:00
commit a7ff2fef3f
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
10 changed files with 92 additions and 23 deletions

View file

@ -41,6 +41,7 @@ class DiscoveryManager : public QObject
friend class DiscoveryManagerPrivate;
private:
ChiakiLog log;
ChiakiDiscoveryService service;
QList<DiscoveryHost> hosts;

View file

@ -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<DisplayServer> 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

View file

@ -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(); }
};

View file

@ -18,11 +18,12 @@
#ifndef CHIAKI_SERVERITEMWIDGET_H
#define CHIAKI_SERVERITEMWIDGET_H
#include <QWidget>
#include <QFrame>
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();

View file

@ -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<sockaddr *>(&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();
}

View file

@ -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; i<server_item_widgets.count(); i++)
server_item_widgets[i]->Update(display_servers[i]);
}

View file

@ -19,6 +19,10 @@
#include <QPainter>
ServerIconWidget::ServerIconWidget(QWidget *parent) : QWidget(parent)
{
}
void ServerIconWidget::paintEvent(QPaintEvent *event)
{
static const float icon_aspect = 100.0f / 17.0f;

View file

@ -17,15 +17,18 @@
#include <serveritemwidget.h>
#include <servericonwidget.h>
#include <mainwindow.h>
#include <QLabel>
#include <QVBoxLayout>
#include <QStyle>
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);
}
}

View file

@ -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;

View file

@ -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));