various layout fixes

This commit is contained in:
Vaxry 2023-12-16 00:58:10 +00:00
parent ab3283b903
commit 80fddebf86
5 changed files with 348 additions and 262 deletions

View file

@ -38,7 +38,7 @@ else()
else() else()
add_executable(HyprlandWelcome add_executable(HyprlandWelcome
${PROJECT_SOURCES} ${PROJECT_SOURCES}
Logo.qrc assets/Logo.qrc
) )
endif() endif()
endif() endif()

View file

@ -1,5 +0,0 @@
<RCC>
<qresource prefix="/assets">
<file>assets/logobanner.png</file>
</qresource>
</RCC>

View file

@ -7,6 +7,7 @@
#include <QTimer> #include <QTimer>
#include <QProcess> #include <QProcess>
#include <filesystem> #include <filesystem>
#include <thread>
QWidget* findByName(QString name) { QWidget* findByName(QString name) {
QList<QWidget*> widgets = QApplication::allWidgets(); QList<QWidget*> widgets = QApplication::allWidgets();
@ -47,10 +48,12 @@ struct SAppCheck {
std::vector<std::string> binaryNames; std::vector<std::string> binaryNames;
std::vector<std::string> binaryPaths; std::vector<std::string> binaryPaths;
std::string name; std::string name;
QLabel* label = nullptr; QLabel* label = nullptr;
bool needsAllInstalled = false; bool needsAllInstalled = false;
bool needsAllRunning = false; bool needsAllRunning = false;
std::vector<std::string> runningNames; std::vector<std::string> runningNames;
std::string currentText = "";
}; };
std::vector<SAppCheck> appChecks; std::vector<SAppCheck> appChecks;
@ -68,8 +71,12 @@ void CHyprlandWelcome::startAppTimer() {
{"/usr/lib/xdg-desktop-portal", "/usr/lib/xdg-desktop-portal-hyprland", "/usr/lib/xdg-desktop-portal-gtk", "/usr/libexec/xdg-desktop-portal", {"/usr/lib/xdg-desktop-portal", "/usr/lib/xdg-desktop-portal-hyprland", "/usr/lib/xdg-desktop-portal-gtk", "/usr/libexec/xdg-desktop-portal",
"/usr/libexec/xdg-desktop-portal-hyprland", "/usr/libexec/xdg-desktop-portal-gtk"}, "/usr/libexec/xdg-desktop-portal-hyprland", "/usr/libexec/xdg-desktop-portal-gtk"},
"XDG Desktop Portal*", "XDG Desktop Portal*",
(QLabel*)findByName("INSTALL_XDP"), false, true, {"xdg-desktop-portal", "xdg-desktop-portal-hyprland"}}); (QLabel*)findByName("INSTALL_XDP"),
appChecks.push_back(SAppCheck{{}, {"/usr/lib/polkit-kde-authentication-agent-1"}, "Authentication Agent", (QLabel*)findByName("INSTALL_AUTH"), false, false, {"polkit-kde-authentication-agent-1"}}); false,
true,
{"xdg-desktop-portal", "xdg-desktop-portal-hyprland"}});
appChecks.push_back(SAppCheck{
{}, {"/usr/lib/polkit-kde-authentication-agent-1"}, "Authentication Agent", (QLabel*)findByName("INSTALL_AUTH"), false, false, {"polkit-kde-authentication-agent-1"}});
appChecks.push_back(SAppCheck{{"qtwaylandscanner"}, {}, "QT Wayland Support", (QLabel*)findByName("INSTALL_QTW")}); appChecks.push_back(SAppCheck{{"qtwaylandscanner"}, {}, "QT Wayland Support", (QLabel*)findByName("INSTALL_QTW")});
appChecks.push_back(SAppCheck{{"kitty", "wezterm", "alacritty", "foot", "konsole", "gnome-terminal"}, {}, "Terminal", (QLabel*)findByName("INSTALL_TERM")}); appChecks.push_back(SAppCheck{{"kitty", "wezterm", "alacritty", "foot", "konsole", "gnome-terminal"}, {}, "Terminal", (QLabel*)findByName("INSTALL_TERM")});
appChecks.push_back(SAppCheck{{"qt5ct", "qt6ct"}, {}, "QT Theming", (QLabel*)findByName("INSTALL_QTTHEME")}); appChecks.push_back(SAppCheck{{"qt5ct", "qt6ct"}, {}, "QT Theming", (QLabel*)findByName("INSTALL_QTTHEME")});
@ -79,55 +86,90 @@ void CHyprlandWelcome::startAppTimer() {
if (this->currentTab != 1) if (this->currentTab != 1)
return; return;
appScanMutex.lock();
for (const auto& app : appChecks) { for (const auto& app : appChecks) {
std::vector<std::string> found; if (app.currentText.empty())
std::vector<std::string> runningApps; continue;
bool running = false; app.label->setText(QString::fromStdString(app.currentText));
for (const auto& bin : app.binaryNames) {
if (appExists(bin))
found.push_back(bin);
if (app.runningNames.empty() && appIsRunning(bin)) {
runningApps.push_back(bin);
running = true;
}
}
if (!app.runningNames.empty()) for (const auto& bin : app.runningNames) {
if (appIsRunning(bin)) {
runningApps.push_back(bin);
running = true;
}
}
for (const auto& bin : app.binaryPaths) {
if (binExists(bin))
found.push_back(bin);
}
if ((found.empty() && !running) || (app.needsAllInstalled && found.size() != app.binaryNames.size() + app.binaryPaths.size())) {
app.label->setText(QString::fromStdString("<html><head/><body><p><span style=\" color:#ff0000;\">❌</span> " + app.name + "</p></body></html>"));
} else if (app.needsAllRunning && runningApps.size() != (app.runningNames.empty() ? app.binaryNames : app.runningNames).size()) {
app.label->setText(QString::fromStdString("<html><head/><body><p><span style=\" color:#ff0000;\">❌</span> " + app.name + ": Found all, but not running.</p></body></html>"));
} else if (!running) {
std::string text = "<html><head/><body><p><span style=\" color:#00ff00;\">✔️</span> " + app.name + ": <span style=\" color:#00ff00;\">found</span> ";
for (auto& f : found)
text += f + ", ";
text.pop_back();
text.pop_back();
text += "</p></body></html>";
app.label->setText(QString::fromStdString(text));
} else {
std::string text = "<html><head/><body><p><span style=\" color:#00ffff;\">✔️</span> " + app.name + ": <span style=\" color:#00ffff;\">running</span> ";
for (auto& f : runningApps)
text += f + ", ";
text.pop_back();
text.pop_back();
text += "</p></body></html>";
app.label->setText(QString::fromStdString(text));
}
} }
appScanMutex.unlock();
}); });
timer->start(1000); timer->start(1000);
std::thread t([this]() {
while (true) {
if (exit)
return;
if (currentTab != 1) {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
continue;
}
for (auto& app : appChecks) {
std::vector<std::string> found;
std::vector<std::string> runningApps;
bool running = false;
for (const auto& bin : app.binaryNames) {
if (appExists(bin))
found.push_back(bin);
if (app.runningNames.empty() && appIsRunning(bin)) {
runningApps.push_back(bin);
running = true;
}
}
if (!app.runningNames.empty())
for (const auto& bin : app.runningNames) {
if (appIsRunning(bin)) {
runningApps.push_back(bin);
running = true;
}
}
for (const auto& bin : app.binaryPaths) {
if (binExists(bin))
found.push_back(bin);
}
if ((found.empty() && !running) || (app.needsAllInstalled && found.size() != app.binaryNames.size() + app.binaryPaths.size())) {
appScanMutex.lock();
app.currentText = "<html><head/><body><p><span style=\" color:#ff0000;\">❌</span> " + app.name + "</p></body></html>";
appScanMutex.unlock();
} else if (app.needsAllRunning && runningApps.size() != (app.runningNames.empty() ? app.binaryNames : app.runningNames).size()) {
appScanMutex.lock();
app.currentText = "<html><head/><body><p><span style=\" color:#ff0000;\">❌</span> " + app.name + ": Found all, but not running.</p></body></html>";
appScanMutex.unlock();
} else if (!running) {
std::string text = "<html><head/><body><p><span style=\" color:#00ff00;\">✔️</span> " + app.name + ": <span style=\" color:#00ff00;\">found</span> ";
for (auto& f : found)
text += f + ", ";
text.pop_back();
text.pop_back();
text += "</p></body></html>";
appScanMutex.lock();
app.currentText = text;
appScanMutex.unlock();
} else {
std::string text = "<html><head/><body><p><span style=\" color:#00ffff;\">✔️</span> " + app.name + ": <span style=\" color:#00ffff;\">running</span> ";
for (auto& f : runningApps)
text += f + ", ";
text.pop_back();
text.pop_back();
text += "</p></body></html>";
appScanMutex.lock();
app.currentText = text;
appScanMutex.unlock();
}
}
std::this_thread::sleep_for(std::chrono::seconds(1));
}
});
t.detach();
} }
std::string getDataStatePath() { std::string getDataStatePath() {
@ -145,6 +187,7 @@ std::string getDataStatePath() {
void CHyprlandWelcome::exitDontShowAgain() { void CHyprlandWelcome::exitDontShowAgain() {
const auto STATEPATH = getDataStatePath(); const auto STATEPATH = getDataStatePath();
if (STATEPATH.empty()) { if (STATEPATH.empty()) {
exit = true;
QApplication::exit(0); QApplication::exit(0);
return; return;
} }
@ -155,6 +198,7 @@ void CHyprlandWelcome::exitDontShowAgain() {
std::filesystem::create_directories(STATEPATH); std::filesystem::create_directories(STATEPATH);
execAndGet("echo \"noshow\" > " + CONFPATH); execAndGet("echo \"noshow\" > " + CONFPATH);
exit = true;
QApplication::exit(0); QApplication::exit(0);
} }
@ -168,7 +212,10 @@ CHyprlandWelcome::CHyprlandWelcome(QWidget* parent) : QMainWindow(parent), ui(ne
QObject::connect(WIKIBUTTON, &QPushButton::clicked, [] { QDesktopServices::openUrl(QString{"https://wiki.hyprland.org/Configuring/Configuring-Hyprland/"}); }); QObject::connect(WIKIBUTTON, &QPushButton::clicked, [] { QDesktopServices::openUrl(QString{"https://wiki.hyprland.org/Configuring/Configuring-Hyprland/"}); });
const auto EXITBUTTON = (QPushButton*)findByName("exitButton"); const auto EXITBUTTON = (QPushButton*)findByName("exitButton");
QObject::connect(EXITBUTTON, &QPushButton::clicked, [] { QApplication::exit(0); }); QObject::connect(EXITBUTTON, &QPushButton::clicked, [this] {
exit = true;
QApplication::exit(0);
});
const auto TABS = (QTabWidget*)findByName("tabs"); const auto TABS = (QTabWidget*)findByName("tabs");
QObject::connect(TABS->tabBar(), &QTabBar::currentChanged, [TABS, this] { TABS->tabBar()->setCurrentIndex(this->currentTab); }); QObject::connect(TABS->tabBar(), &QTabBar::currentChanged, [TABS, this] { TABS->tabBar()->setCurrentIndex(this->currentTab); });

View file

@ -2,6 +2,7 @@
#define CHYPRLANDWELCOME_H #define CHYPRLANDWELCOME_H
#include <QMainWindow> #include <QMainWindow>
#include <mutex>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
namespace Ui { namespace Ui {
@ -23,5 +24,7 @@ class CHyprlandWelcome : public QMainWindow {
void exitDontShowAgain(); void exitDontShowAgain();
int currentTab = 0; int currentTab = 0;
bool exit = false;
std::mutex appScanMutex;
}; };
#endif // CHYPRLANDWELCOME_H #endif // CHYPRLANDWELCOME_H

View file

@ -29,14 +29,10 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>CHyprlandWelcome</string> <string>Welcome to Hyprland!</string>
</property>
<property name="windowIcon">
<iconset>
<normaloff>../../Documents/Hypr/try3finaltransparent.png</normaloff>../../Documents/Hypr/try3finaltransparent.png</iconset>
</property> </property>
<property name="windowOpacity"> <property name="windowOpacity">
<double>0.900000000000000</double> <double>1.000000000000000</double>
</property> </property>
<property name="autoFillBackground"> <property name="autoFillBackground">
<bool>true</bool> <bool>true</bool>
@ -55,7 +51,7 @@
<string/> <string/>
</property> </property>
<property name="pixmap"> <property name="pixmap">
<pixmap resource="Logo.qrc">:/assets/assets/logobanner.png</pixmap> <pixmap>:/logobanner.png</pixmap>
</property> </property>
<property name="scaledContents"> <property name="scaledContents">
<bool>true</bool> <bool>true</bool>
@ -80,7 +76,7 @@
<enum>Qt::NoFocus</enum> <enum>Qt::NoFocus</enum>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
<number>3</number> <number>1</number>
</property> </property>
<property name="usesScrollButtons"> <property name="usesScrollButtons">
<bool>false</bool> <bool>false</bool>
@ -164,185 +160,6 @@
<attribute name="title"> <attribute name="title">
<string>Getting Started</string> <string>Getting Started</string>
</attribute> </attribute>
<widget class="QLabel" name="label_3">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>751</width>
<height>171</height>
</rect>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The first thing we'll need to do is get some packages installed that you absolutely need in order for your system to be working properly.&lt;/p&gt;&lt;p&gt;Apps with * are absolutely necessary. All other are &lt;span style=&quot; font-weight:700; font-style:italic;&quot;&gt;highly&lt;/span&gt; recommended, as they provide core parts of a working environment.&lt;/p&gt;&lt;p&gt;You &lt;span style=&quot; font-style:italic;&quot;&gt;can &lt;/span&gt;proceed without any of those, but it's not advised. There is a possibility that this app is unable to detect some of your installed binaries. In that case, it's okay to ignore them.&lt;/p&gt;&lt;p&gt;Use the &amp;quot;launch terminal&amp;quot; button to launch a terminal. Supported terminals are kitty, alacritty, foot, wezterm, konsole, gnome-terminal, xterm. If none are installed, you'll need to exit hyprland and install one. Use SUPER+M to exit hyprland.&lt;br/&gt;&lt;br/&gt;Hover on the different components to see what options are accepted. &lt;span style=&quot; color:#00ff00;&quot;&gt;Green&lt;/span&gt; means the component is found to be installed, &lt;span style=&quot; color:#00ffff;&quot;&gt;blue&lt;/span&gt; means it's running.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
<widget class="QLabel" name="INSTALL_TERM">
<property name="geometry">
<rect>
<x>30</x>
<y>180</y>
<width>301</width>
<height>21</height>
</rect>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: kitty, alacritty, wezterm, foot, konsole, gnome-terminal. Worth noting this is not a comprehensive list and Hyprland will work with any wayland-compatible terminal emulator, however this app will not automatically detect it.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; Terminal&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
<widget class="QLabel" name="INSTALL_FM">
<property name="geometry">
<rect>
<x>30</x>
<y>200</y>
<width>301</width>
<height>21</height>
</rect>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: dolphin, ranger, thunar&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; File Manager&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
<widget class="QLabel" name="INSTALL_WALLPAPER">
<property name="geometry">
<rect>
<x>30</x>
<y>220</y>
<width>301</width>
<height>21</height>
</rect>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: hyprpaper, swaybg, swww, wpaperd. Recommended: hyprpaper&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; Wallpaper Utility&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
<widget class="QLabel" name="INSTALL_PW">
<property name="geometry">
<rect>
<x>30</x>
<y>240</y>
<width>301</width>
<height>21</height>
</rect>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: pipewire &lt;span style=&quot; font-weight:700;&quot;&gt;and&lt;/span&gt; wireplumber&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; Pipewire*&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
<widget class="QLabel" name="INSTALL_XDP">
<property name="geometry">
<rect>
<x>440</x>
<y>180</y>
<width>301</width>
<height>21</height>
</rect>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: xdg-desktop-portal &lt;span style=&quot; font-weight:700;&quot;&gt;and&lt;/span&gt; xdg-desktop-portal-hyprland. Recommended to also install xdg-desktop-portal-gtk for a file picker.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; XDG Desktop Portal*&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
<widget class="QLabel" name="INSTALL_AUTH">
<property name="geometry">
<rect>
<x>440</x>
<y>200</y>
<width>301</width>
<height>21</height>
</rect>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: &lt;span style=&quot; font-family:'monospace';&quot;&gt;kde-authentication-agent&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; Authentication Agent&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
<widget class="QLabel" name="INSTALL_QTW">
<property name="geometry">
<rect>
<x>440</x>
<y>220</y>
<width>301</width>
<height>21</height>
</rect>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: qt5-wayland, qt6-wayland (highly recommended both)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; QT Wayland support&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
<widget class="QLabel" name="INSTALL_NOTIF">
<property name="geometry">
<rect>
<x>30</x>
<y>280</y>
<width>301</width>
<height>21</height>
</rect>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: dunst, mako. Worth noting you can also create your own notification daemons with stuff like ags or eww.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; Notification Daemon&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
<widget class="QLabel" name="INSTALL_BAR">
<property name="geometry">
<rect>
<x>440</x>
<y>260</y>
<width>301</width>
<height>21</height>
</rect>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: waybar, eww, ags&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; Status Bar&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
<widget class="QLabel" name="INSTALL_LAUNCHER">
<property name="geometry">
<rect>
<x>30</x>
<y>260</y>
<width>301</width>
<height>21</height>
</rect>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: fuzzel, wofi, anyrun, tofi&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; App Launcher&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
<widget class="QPushButton" name="tab2Next"> <widget class="QPushButton" name="tab2Next">
<property name="geometry"> <property name="geometry">
<rect> <rect>
@ -375,22 +192,6 @@
<string>Open Terminal</string> <string>Open Terminal</string>
</property> </property>
</widget> </widget>
<widget class="QLabel" name="INSTALL_QTTHEME">
<property name="geometry">
<rect>
<x>440</x>
<y>240</y>
<width>301</width>
<height>21</height>
</rect>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: qt5ct, qt6ct.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; QT Theming&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
<widget class="QPushButton" name="tab2Back"> <widget class="QPushButton" name="tab2Back">
<property name="geometry"> <property name="geometry">
<rect> <rect>
@ -407,6 +208,248 @@
<string>Back</string> <string>Back</string>
</property> </property>
</widget> </widget>
<widget class="QScrollArea" name="scrollArea">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>775</width>
<height>313</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTipDuration">
<number>-2</number>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<widget class="QWidget" name="verticalLayoutWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>769</width>
<height>315</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="GettingStartedText">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>760</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string notr="true">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The first thing we'll need to do is get some packages installed that you absolutely need in order for your system to be working properly.&lt;/p&gt;&lt;p&gt;Apps with * are absolutely necessary. All other are &lt;span style=&quot; font-weight:700; font-style:italic;&quot;&gt;highly&lt;/span&gt; recommended, as they provide core parts of a working environment.&lt;/p&gt;&lt;p&gt;You &lt;span style=&quot; font-style:italic;&quot;&gt;can &lt;/span&gt;proceed without any of those, but it's not advised. There is a possibility that this app is unable to detect some of your installed binaries. In that case, it's okay to ignore them. Nix users might have the issue.&lt;/p&gt;&lt;p&gt;Use the &amp;quot;launch terminal&amp;quot; button to launch a terminal. Use SUPER+M to exit hyprland. Supported terminals: kitty, alacritty, foot, wezterm, konsole, gnome-terminal, xterm.&lt;br/&gt;&lt;br/&gt;Hover on the different components to see what options are accepted. &lt;span style=&quot; color:#00ff00;&quot;&gt;Green&lt;/span&gt; means the component is found to be installed, &lt;span style=&quot; color:#00ffff;&quot;&gt;blue&lt;/span&gt; means it's running.&lt;/p&gt;&lt;p&gt;This list refreshes automatically.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="textFormat">
<enum>Qt::RichText</enum>
</property>
<property name="scaledContents">
<bool>false</bool>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="margin">
<number>5</number>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="Components" columnminimumwidth="155,155">
<property name="leftMargin">
<number>40</number>
</property>
<property name="rightMargin">
<number>40</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="horizontalSpacing">
<number>10</number>
</property>
<property name="verticalSpacing">
<number>0</number>
</property>
<item row="1" column="1">
<widget class="QLabel" name="INSTALL_AUTH">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: &lt;span style=&quot; font-family:'monospace';&quot;&gt;kde-authentication-agent&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; Authentication Agent&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="INSTALL_QTW">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: qt5-wayland, qt6-wayland (highly recommended both)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; QT Wayland support&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="INSTALL_FM">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: dolphin, ranger, thunar&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; File Manager&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="INSTALL_TERM">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: kitty, alacritty, wezterm, foot, konsole, gnome-terminal. Worth noting this is not a comprehensive list and Hyprland will work with any wayland-compatible terminal emulator, however this app will not automatically detect it.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; Terminal&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="INSTALL_PW">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: pipewire &lt;span style=&quot; font-weight:700;&quot;&gt;and&lt;/span&gt; wireplumber&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; Pipewire*&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="INSTALL_WALLPAPER">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: hyprpaper, swaybg, swww, wpaperd. Recommended: hyprpaper&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; Wallpaper Utility&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="INSTALL_XDP">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: xdg-desktop-portal &lt;span style=&quot; font-weight:700;&quot;&gt;and&lt;/span&gt; xdg-desktop-portal-hyprland. Recommended to also install xdg-desktop-portal-gtk for a file picker.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; XDG Desktop Portal*&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="INSTALL_QTTHEME">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: qt5ct, qt6ct.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; QT Theming&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="INSTALL_NOTIF">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: dunst, mako. Worth noting you can also create your own notification daemons with stuff like ags or eww.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; Notification Daemon&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="INSTALL_BAR">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: waybar, eww, ags&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; Status Bar&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="INSTALL_LAUNCHER">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Accepted: fuzzel, wofi, anyrun, tofi&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#ff0000;&quot;&gt;❌&lt;/span&gt; App Launcher&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
</widget> </widget>
<widget class="QWidget" name="configuringTab"> <widget class="QWidget" name="configuringTab">
<attribute name="title"> <attribute name="title">
@ -713,8 +756,6 @@
</widget> </widget>
</widget> </widget>
</widget> </widget>
<resources> <resources/>
<include location="Logo.qrc"/>
</resources>
<connections/> <connections/>
</ui> </ui>