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