diff --git a/UI/cmake/legacy.cmake b/UI/cmake/legacy.cmake
index b1145f7253d2a5..ae08191b0c3198 100644
--- a/UI/cmake/legacy.cmake
+++ b/UI/cmake/legacy.cmake
@@ -116,6 +116,7 @@ target_sources(
forms/OBSRemux.ui
forms/OBSUpdate.ui
forms/OBSYoutubeActions.ui
+ forms/StatusBarWidget.ui
forms/source-toolbar/browser-source-toolbar.ui
forms/source-toolbar/color-source-toolbar.ui
forms/source-toolbar/device-select-toolbar.ui
diff --git a/UI/data/themes/Acri.qss b/UI/data/themes/Acri.qss
index 3a47002d1827db..e7c70496acd901 100644
--- a/UI/data/themes/Acri.qss
+++ b/UI/data/themes/Acri.qss
@@ -337,8 +337,20 @@ QScrollArea {
border-radius: 4px;
}
+/* Qt enforces a padding inside its status bar, so we
+ * oversize it and use margin to crunch it back down
+ */
OBSBasicStatusBar {
- margin-top: 8px;
+ margin-top: 4px;
+ border-top: 1px solid #3c404b;
+ background: palette(dark);
+}
+
+StatusBarWidget > QFrame {
+ margin-top: 1px;
+ border: 0px solid #3c404b;
+ border-left-width: 1px;
+ padding: 0px 12px 2px;
}
/* Group Box */
diff --git a/UI/data/themes/Dark.qss b/UI/data/themes/Dark.qss
index fc4883759288e6..6c96a902cb9e3a 100644
--- a/UI/data/themes/Dark.qss
+++ b/UI/data/themes/Dark.qss
@@ -644,6 +644,22 @@ QStatusBar::item {
border: none;
}
+/* Qt enforces a padding inside its status bar, so we
+ * oversize it and use margin to crunch it back down
+ */
+OBSBasicStatusBar {
+ margin-top: 4px;
+ border-top: 1px solid palette(dark);
+ background: palette(window);
+}
+
+StatusBarWidget > QFrame {
+ margin-top: 2px;
+ border: 0px solid palette(dark);
+ border-left-width: 1px;
+ padding: 0px 12px 4px;
+}
+
/* Table View */
QTableView {
diff --git a/UI/data/themes/Dark/network-disconnected.svg b/UI/data/themes/Dark/network-disconnected.svg
new file mode 100644
index 00000000000000..153b57066310b7
--- /dev/null
+++ b/UI/data/themes/Dark/network-disconnected.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/UI/data/themes/Dark/network-inactive.svg b/UI/data/themes/Dark/network-inactive.svg
new file mode 100644
index 00000000000000..8711d71e26d18d
--- /dev/null
+++ b/UI/data/themes/Dark/network-inactive.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/UI/data/themes/Dark/recording-inactive.svg b/UI/data/themes/Dark/recording-inactive.svg
new file mode 100644
index 00000000000000..d9cf620f613ce7
--- /dev/null
+++ b/UI/data/themes/Dark/recording-inactive.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/UI/data/themes/Dark/recording-pause-inactive.svg b/UI/data/themes/Dark/recording-pause-inactive.svg
new file mode 100644
index 00000000000000..800060855e853a
--- /dev/null
+++ b/UI/data/themes/Dark/recording-pause-inactive.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/UI/data/themes/Dark/streaming-inactive.svg b/UI/data/themes/Dark/streaming-inactive.svg
new file mode 100644
index 00000000000000..c5def1d65a6d4c
--- /dev/null
+++ b/UI/data/themes/Dark/streaming-inactive.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/UI/data/themes/Grey.qss b/UI/data/themes/Grey.qss
index 93733dd07c6797..0748deffad638c 100644
--- a/UI/data/themes/Grey.qss
+++ b/UI/data/themes/Grey.qss
@@ -337,8 +337,20 @@ QScrollArea {
border-radius: 4px;
}
+/* Qt enforces a padding inside its status bar, so we
+ * oversize it and use margin to crunch it back down
+ */
OBSBasicStatusBar {
- margin-top: 8px;
+ margin-top: 4px;
+ border-top: 1px solid #3c404b;
+ background: palette(dark);
+}
+
+StatusBarWidget > QFrame {
+ margin-top: 1px;
+ border: 0px solid #3c404b;
+ border-left-width: 1px;
+ padding: 0px 12px 2px;
}
/* Group Box */
diff --git a/UI/data/themes/Light.qss b/UI/data/themes/Light.qss
index 3f8f81781f6e3e..e6c9a6be0b2dc1 100644
--- a/UI/data/themes/Light.qss
+++ b/UI/data/themes/Light.qss
@@ -337,8 +337,20 @@ QScrollArea {
border-radius: 4px;
}
+/* Qt enforces a padding inside its status bar, so we
+ * oversize it and use margin to crunch it back down
+ */
OBSBasicStatusBar {
- margin-top: 8px;
+ margin-top: 4px;
+ border-top: 1px solid rgb(192,192,192);
+ background: palette(dark);
+}
+
+StatusBarWidget > QFrame {
+ margin-top: 1px;
+ border: 0px solid rgb(192,192,192);
+ border-left-width: 1px;
+ padding: 0px 12px 2px;
}
/* Group Box */
diff --git a/UI/data/themes/Rachni.qss b/UI/data/themes/Rachni.qss
index 351e9bef9a24be..92880cfd0cb035 100644
--- a/UI/data/themes/Rachni.qss
+++ b/UI/data/themes/Rachni.qss
@@ -339,8 +339,20 @@ QScrollArea {
border-radius: 4px;
}
+/* Qt enforces a padding inside its status bar, so we
+ * oversize it and use margin to crunch it back down
+ */
OBSBasicStatusBar {
- margin-top: 8px;
+ margin-top: 4px;
+ border-top: 1px solid #3c404b;
+ background: palette(dark);
+}
+
+StatusBarWidget > QFrame {
+ margin-top: 1px;
+ border: 0px solid #3c404b;
+ border-left-width: 1px;
+ padding: 0px 12px 2px;
}
/* Group Box */
diff --git a/UI/data/themes/System.qss b/UI/data/themes/System.qss
index 76af193c6b5490..94c4466730c190 100644
--- a/UI/data/themes/System.qss
+++ b/UI/data/themes/System.qss
@@ -402,3 +402,8 @@ QCalendarWidget #qt_calendar_nextmonth {
qproperty-icon: url(./Dark/right.svg);
icon-size: 16px, 16px;
}
+
+/* Status Bar */
+StatusBarWidget > QFrame {
+ padding: 0px 12px 8px;
+}
diff --git a/UI/data/themes/Yami.qss b/UI/data/themes/Yami.qss
index 54b3c2e6a225cf..b32a7b47d2f946 100644
--- a/UI/data/themes/Yami.qss
+++ b/UI/data/themes/Yami.qss
@@ -341,8 +341,20 @@ QScrollArea {
border-radius: 4px;
}
+/* Qt enforces a padding inside its status bar, so we
+ * oversize it and use margin to crunch it back down
+ */
OBSBasicStatusBar {
- margin-top: 8px;
+ margin-top: 4px;
+ border-top: 1px solid #3c404b;
+ background: palette(dark);
+}
+
+StatusBarWidget > QFrame {
+ margin-top: 1px;
+ border: 0px solid #3c404b;
+ border-left-width: 1px;
+ padding: 0px 12px 2px;
}
/* Group Box */
diff --git a/UI/forms/StatusBarWidget.ui b/UI/forms/StatusBarWidget.ui
new file mode 100644
index 00000000000000..0971f7dd9eecf8
--- /dev/null
+++ b/UI/forms/StatusBarWidget.ui
@@ -0,0 +1,418 @@
+
+
+ StatusBarWidget
+
+
+
+ 0
+ 0
+ 714
+ 34
+
+
+
+
+ 0
+ 34
+
+
+
+ Form
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 6
+
+
+ 0
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 2
+ 2
+
+
+
+
+ -
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ DelayInfo
+
+
+
+
+
+
+ -
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ DroppedFrames
+
+
+
+
+
+
+ -
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 6
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+ :/res/images/network-inactive.svg
+
+
+
+ -
+
+
+ true
+
+
+
+ 0
+ 0
+
+
+
+ 0 kbps
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+
+ -
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+ :/res/images/streaming-inactive.svg
+
+
+ false
+
+
+
+ -
+
+
+ true
+
+
+
+ 0
+ 0
+
+
+
+ 00:00:00
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+ :/res/images/recording-inactive.svg
+
+
+ false
+
+
+
+ -
+
+
+ true
+
+
+
+ 0
+ 0
+
+
+
+ 00:00:00
+
+
+
+
+
+
+ -
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ CPU: 0.0%
+
+
+ Qt::AlignCenter
+
+
+
+
+
+
+ -
+
+
+ QFrame::NoFrame
+
+
+ QFrame::Plain
+
+
+ 0
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ 0.00 / 0.00 FPS
+
+
+ Qt::AlignCenter
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UI/forms/images/network-bad.svg b/UI/forms/images/network-bad.svg
new file mode 100644
index 00000000000000..9e3517f32995d6
--- /dev/null
+++ b/UI/forms/images/network-bad.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/UI/forms/images/network-disconnected.svg b/UI/forms/images/network-disconnected.svg
new file mode 100644
index 00000000000000..df5e20512bcf7a
--- /dev/null
+++ b/UI/forms/images/network-disconnected.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/UI/forms/images/network-excellent.svg b/UI/forms/images/network-excellent.svg
new file mode 100644
index 00000000000000..0e04e7d34d93d9
--- /dev/null
+++ b/UI/forms/images/network-excellent.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/UI/forms/images/network-good.svg b/UI/forms/images/network-good.svg
new file mode 100644
index 00000000000000..0bbe206e345750
--- /dev/null
+++ b/UI/forms/images/network-good.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/UI/forms/images/network-inactive.svg b/UI/forms/images/network-inactive.svg
new file mode 100644
index 00000000000000..af3c8369af5f90
--- /dev/null
+++ b/UI/forms/images/network-inactive.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/UI/forms/images/network-mediocre.svg b/UI/forms/images/network-mediocre.svg
new file mode 100644
index 00000000000000..283983aa0e40cf
--- /dev/null
+++ b/UI/forms/images/network-mediocre.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/UI/forms/images/recording-active.svg b/UI/forms/images/recording-active.svg
index 7c735a9d31a87b..30b442e91fd179 100644
--- a/UI/forms/images/recording-active.svg
+++ b/UI/forms/images/recording-active.svg
@@ -1,37 +1,4 @@
-
-