From 7dd26f974f385f13fe9a863e72bae998ec68776f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Fri, 25 Dec 2020 21:39:58 +0100 Subject: [PATCH] Add new Console Icons to GUI --- assets/console.svg | 58 +++++++++-------- assets/console2.svg | 50 ++++++-------- gui/include/discoverymanager.h | 1 + gui/include/mainwindow.h | 2 + gui/include/servericonwidget.h | 7 +- gui/res/console-ps4.svg | 43 ++++++++++++ gui/res/console-ps5.svg | 42 ++++++++++++ gui/res/resources.qrc | 2 + gui/src/discoverymanager.cpp | 1 + gui/src/servericonwidget.cpp | 116 ++++++++++++++++++--------------- gui/src/serveritemwidget.cpp | 3 +- lib/include/chiaki/discovery.h | 1 + lib/src/discovery.c | 6 ++ 13 files changed, 222 insertions(+), 110 deletions(-) create mode 100644 gui/res/console-ps4.svg create mode 100644 gui/res/console-ps5.svg diff --git a/assets/console.svg b/assets/console.svg index 00fba66..99eadb9 100644 --- a/assets/console.svg +++ b/assets/console.svg @@ -1,6 +1,4 @@ - - @@ -25,18 +23,19 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="1.4" - inkscape:cx="300.0445" - inkscape:cy="77.810757" + inkscape:zoom="1.979899" + inkscape:cx="277.12099" + inkscape:cy="63.078394" inkscape:document-units="mm" inkscape:current-layer="layer1" showgrid="false" units="px" - inkscape:window-width="1918" - inkscape:window-height="1048" + inkscape:window-width="1916" + inkscape:window-height="1031" inkscape:window-x="0" - inkscape:window-y="15" - inkscape:window-maximized="1" /> + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:document-rotation="0" /> @@ -45,7 +44,7 @@ image/svg+xml - + @@ -54,21 +53,26 @@ inkscape:groupmode="layer" id="layer1" transform="translate(0,-274.24582)"> - - - - + + + diff --git a/assets/console2.svg b/assets/console2.svg index 39fb096..720fa37 100644 --- a/assets/console2.svg +++ b/assets/console2.svg @@ -23,11 +23,11 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="0.7" - inkscape:cx="87.618933" - inkscape:cy="14.057308" + inkscape:zoom="0.98994949" + inkscape:cx="162.87247" + inkscape:cy="106.01511" inkscape:document-units="mm" - inkscape:current-layer="g1675" + inkscape:current-layer="layer1" showgrid="false" units="px" inkscape:window-width="1916" @@ -50,32 +50,22 @@ - - - - - - + inkscape:groupmode="layer"> + + + diff --git a/gui/include/discoverymanager.h b/gui/include/discoverymanager.h index f03a5e6..be3462c 100644 --- a/gui/include/discoverymanager.h +++ b/gui/include/discoverymanager.h @@ -12,6 +12,7 @@ struct DiscoveryHost { + bool ps5; ChiakiDiscoveryHostState state; uint16_t host_request_port; #define STRING_MEMBER(name) QString name; diff --git a/gui/include/mainwindow.h b/gui/include/mainwindow.h index 715c7d9..f1190de 100644 --- a/gui/include/mainwindow.h +++ b/gui/include/mainwindow.h @@ -22,6 +22,8 @@ struct DisplayServer bool registered; QString GetHostAddr() const { return discovered ? discovery_host.host_addr : manual_host.GetHost(); } + bool IsPS5() const { return discovered ? discovery_host.ps5 : + (registered ? chiaki_target_is_ps5(registered_host.GetTarget()) : false); } }; class MainWindow : public QMainWindow diff --git a/gui/include/servericonwidget.h b/gui/include/servericonwidget.h index 1a8525a..364cb4b 100644 --- a/gui/include/servericonwidget.h +++ b/gui/include/servericonwidget.h @@ -6,13 +6,18 @@ #include #include +#include class ServerIconWidget : public QWidget { Q_OBJECT private: + bool ps5 = false; ChiakiDiscoveryHostState state = CHIAKI_DISCOVERY_HOST_STATE_UNKNOWN; + QSvgRenderer svg_renderer; + + void LoadSvg(); protected: void paintEvent(QPaintEvent *event) override; @@ -20,7 +25,7 @@ class ServerIconWidget : public QWidget public: explicit ServerIconWidget(QWidget *parent = nullptr); - void SetState(ChiakiDiscoveryHostState state) { this->state = state; update(); } + void SetState(bool ps5, ChiakiDiscoveryHostState state); }; #endif // CHIAKI_SERVERICONWIDGET_H diff --git a/gui/res/console-ps4.svg b/gui/res/console-ps4.svg new file mode 100644 index 0000000..1591574 --- /dev/null +++ b/gui/res/console-ps4.svg @@ -0,0 +1,43 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/gui/res/console-ps5.svg b/gui/res/console-ps5.svg new file mode 100644 index 0000000..8216a04 --- /dev/null +++ b/gui/res/console-ps5.svg @@ -0,0 +1,42 @@ + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/gui/res/resources.qrc b/gui/res/resources.qrc index bf7efd5..86efda9 100644 --- a/gui/res/resources.qrc +++ b/gui/res/resources.qrc @@ -5,5 +5,7 @@ discover-24px.svg discover-off-24px.svg chiaki.svg + console-ps4.svg + console-ps5.svg diff --git a/gui/src/discoverymanager.cpp b/gui/src/discoverymanager.cpp index 042e68b..ae1564f 100644 --- a/gui/src/discoverymanager.cpp +++ b/gui/src/discoverymanager.cpp @@ -129,6 +129,7 @@ static void DiscoveryServiceHostsCallback(ChiakiDiscoveryHost *hosts, size_t hos { ChiakiDiscoveryHost *h = hosts + i; DiscoveryHost o = {}; + o.ps5 = chiaki_discovery_host_is_ps5(h); o.state = h->state; o.host_request_port = o.host_request_port; #define CONVERT_STRING(name) if(h->name) { o.name = QString::fromLocal8Bit(h->name); } diff --git a/gui/src/servericonwidget.cpp b/gui/src/servericonwidget.cpp index d001026..45d85a5 100644 --- a/gui/src/servericonwidget.cpp +++ b/gui/src/servericonwidget.cpp @@ -7,73 +7,87 @@ ServerIconWidget::ServerIconWidget(QWidget *parent) : QWidget(parent) { + LoadSvg(); } void ServerIconWidget::paintEvent(QPaintEvent *event) { - static const float icon_aspect = 100.0f / 17.0f; - static const float coolness = 0.585913713f; - - if(width() == 0 || height() == 0) + QRectF view_box = svg_renderer.viewBoxF(); + if(view_box.width() < 0.00001f || view_box.height() < 0.00001f) return; + float icon_aspect = view_box.width() / view_box.height(); + float widget_aspect = (float)width() / (float)height(); + QRectF icon_rect; + if(widget_aspect > icon_aspect) + { + icon_rect.setHeight(height()); + icon_rect.setWidth((float)height() * icon_aspect); + icon_rect.moveTop(0.0f); + icon_rect.moveLeft(((float)width() - icon_rect.width()) * 0.5f); + } + else + { + icon_rect.setWidth(width()); + icon_rect.setHeight((float)width() / icon_aspect); + icon_rect.moveLeft(0.0f); + icon_rect.moveTop(((float)height() - icon_rect.height()) * 0.5f); + } QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); - QRectF icon_rect; - float widget_aspect = (float)width() / (float)height(); - if(widget_aspect > icon_aspect) - { - icon_rect.setHeight(height()); - icon_rect.setWidth((float)height() * icon_aspect); - icon_rect.moveTop(0.0f); - icon_rect.moveLeft(((float)width() - icon_rect.width()) * 0.5f); - } - else - { - icon_rect.setWidth(width()); - icon_rect.setHeight((float)width() / icon_aspect); - icon_rect.moveLeft(0.0f); - icon_rect.moveTop(((float)height() - icon_rect.height()) * 0.5f); - } - - - auto XForY = [&icon_rect](float y, bool right) - { - float r = (icon_rect.height() - y) * coolness; - if(right) - r += icon_rect.width() - icon_rect.height() * coolness; - return r; + auto render_element = [&view_box, &icon_rect, this](QPainter &painter, const QString &id) { + QRectF src = svg_renderer.transformForElement(id).mapRect(svg_renderer.boundsOnElement(id)); + QRectF dst = src.translated(-view_box.left(), -view_box.top()); + dst = QRectF( + icon_rect.width() * dst.left() / view_box.width(), + icon_rect.height() * dst.top() / view_box.height(), + icon_rect.width() * dst.width() / view_box.width(), + icon_rect.height() * dst.height() / view_box.height()); + dst = dst.translated(icon_rect.left(), icon_rect.top()); + svg_renderer.render(&painter, id, dst); }; - auto SectionPath = [&XForY, &icon_rect](float y0, float y1) - { - QPainterPath path; - path.moveTo(XForY(y0, false), y0); - path.lineTo(XForY(y1, false), y1); - path.lineTo(XForY(y1, true), y1); - path.lineTo(XForY(y0, true), y0); - path.translate(icon_rect.topLeft()); - return path; - }; - - auto color = palette().color(QPalette::Text); - - QColor bar_color; switch(state) { - case CHIAKI_DISCOVERY_HOST_STATE_STANDBY: - bar_color = QColor(255, 174, 47); - break; case CHIAKI_DISCOVERY_HOST_STATE_READY: - bar_color = QColor(0, 167, 255); + render_element(painter, "light_on"); + break; + case CHIAKI_DISCOVERY_HOST_STATE_STANDBY: + render_element(painter, "light_standby"); break; default: break; } - if(bar_color.isValid()) - painter.fillPath(SectionPath(icon_rect.height() * 0.41f - 1.0f, icon_rect.height() * 0.59f + 1.0f), bar_color); - painter.fillPath(SectionPath(0, icon_rect.height() * 0.41f), color); - painter.fillPath(SectionPath(icon_rect.height() * 0.59f, icon_rect.height()), color); -} \ No newline at end of file + auto color = palette().color(QPalette::Text); + + QImage temp_image((int)(devicePixelRatioF() * width()), + (int)(devicePixelRatioF() * height()), + QImage::Format_ARGB32_Premultiplied); + { + temp_image.fill(QColor(0, 0, 0, 0)); + QPainter temp_painter(&temp_image); + render_element(temp_painter, "console"); + temp_painter.setCompositionMode(QPainter::CompositionMode_SourceAtop); + temp_painter.fillRect(icon_rect, color); + } + painter.drawImage(QRectF(0.0f, 0.0f, width(), height()), temp_image); +} + +void ServerIconWidget::LoadSvg() +{ + QString path = ps5 ? ":/icons/console-ps5.svg" : ":/icons/console-ps4.svg"; + svg_renderer.load(path); + update(); +} + +void ServerIconWidget::SetState(bool ps5, ChiakiDiscoveryHostState state) +{ + bool reload = this->ps5 != ps5; + this->ps5 = ps5; + this->state = state; + if(reload) + LoadSvg(); + update(); +} diff --git a/gui/src/serveritemwidget.cpp b/gui/src/serveritemwidget.cpp index ef7448e..13e1937 100644 --- a/gui/src/serveritemwidget.cpp +++ b/gui/src/serveritemwidget.cpp @@ -70,7 +70,8 @@ void ServerItemWidget::Update(const DisplayServer &display_server) delete_action->setEnabled(!display_server.discovered); wake_action->setEnabled(display_server.registered); - icon_widget->SetState(display_server.discovered ? display_server.discovery_host.state : CHIAKI_DISCOVERY_HOST_STATE_UNKNOWN); + icon_widget->SetState(display_server.IsPS5(), + display_server.discovered ? display_server.discovery_host.state : CHIAKI_DISCOVERY_HOST_STATE_UNKNOWN); QString top_text = ""; diff --git a/lib/include/chiaki/discovery.h b/lib/include/chiaki/discovery.h index 50364ac..ddae8ef 100644 --- a/lib/include/chiaki/discovery.h +++ b/lib/include/chiaki/discovery.h @@ -71,6 +71,7 @@ typedef struct chiaki_discovery_host_t #undef STRING_MEMBER } ChiakiDiscoveryHost; +CHIAKI_EXPORT bool chiaki_discovery_host_is_ps5(ChiakiDiscoveryHost *host); CHIAKI_EXPORT int chiaki_discovery_packet_fmt(char *buf, size_t buf_size, ChiakiDiscoveryPacket *packet); diff --git a/lib/src/discovery.c b/lib/src/discovery.c index 4771456..601e488 100644 --- a/lib/src/discovery.c +++ b/lib/src/discovery.c @@ -32,6 +32,12 @@ const char *chiaki_discovery_host_state_string(ChiakiDiscoveryHostState state) } } +CHIAKI_EXPORT bool chiaki_discovery_host_is_ps5(ChiakiDiscoveryHost *host) +{ + return host->device_discovery_protocol_version + && !strcmp(host->device_discovery_protocol_version, CHIAKI_DISCOVERY_PROTOCOL_VERSION_PS5); +} + CHIAKI_EXPORT int chiaki_discovery_packet_fmt(char *buf, size_t buf_size, ChiakiDiscoveryPacket *packet) { if(!packet->protocol_version)