make themes work better
This commit is contained in:
parent
30c0526ff7
commit
b39e23d462
6 changed files with 70 additions and 30 deletions
|
@ -161,13 +161,14 @@ function main() {
|
||||||
userscript.log("Loading userstyles...");
|
userscript.log("Loading userstyles...");
|
||||||
userscript.loadingMessage = "Loading userstyles...";
|
userscript.loadingMessage = "Loading userstyles...";
|
||||||
let stylesheet = document.getElementById("discordScreenaudioUserstyles");
|
let stylesheet = document.getElementById("discordScreenaudioUserstyles");
|
||||||
if (!stylesheet) {
|
if (stylesheet) {
|
||||||
stylesheet = document.createElement("style");
|
userscript.log("Removing old userstyles...");
|
||||||
stylesheet.id = "discordScreenaudioUserstyles";
|
stylesheet.remove();
|
||||||
stylesheet.type = "text/css";
|
|
||||||
document.head.appendChild(stylesheet);
|
|
||||||
}
|
}
|
||||||
|
stylesheet = document.createElement("style");
|
||||||
|
stylesheet.id = "discordScreenaudioUserstyles";
|
||||||
stylesheet.innerText = userscript.userstyles;
|
stylesheet.innerText = userscript.userstyles;
|
||||||
|
document.head.appendChild(stylesheet);
|
||||||
userscript.log("Finished loading userstyles");
|
userscript.log("Finished loading userstyles");
|
||||||
userscript.loadingMessage = "";
|
userscript.loadingMessage = "";
|
||||||
}
|
}
|
||||||
|
@ -329,6 +330,18 @@ function main() {
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
section.appendChild(
|
||||||
|
createButton("Install Theme", () => {
|
||||||
|
userscript.showThemeDialog();
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
section.appendChild(
|
||||||
|
createButton("Uninstall Theme", () => {
|
||||||
|
userscript.installUserStyles("");
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
section.appendChild(
|
section.appendChild(
|
||||||
createSwitch(
|
createSwitch(
|
||||||
"Move discord-screenaudio to the system tray instead of closing",
|
"Move discord-screenaudio to the system tray instead of closing",
|
||||||
|
|
|
@ -73,7 +73,7 @@ void CentralWidget::setLoadingIndicator(QString text) {
|
||||||
m_loadingLabel->setStyleSheet("color:#dedede;");
|
m_loadingLabel->setStyleSheet("color:#dedede;");
|
||||||
m_layout->addWidget(m_loadingLabel);
|
m_layout->addWidget(m_loadingLabel);
|
||||||
}
|
}
|
||||||
m_loadingLabel->setText(text);
|
m_loadingLabel->setText(text.mid(0, 100));
|
||||||
} else {
|
} else {
|
||||||
if (m_loadingLabel != nullptr) {
|
if (m_loadingLabel != nullptr) {
|
||||||
m_layout->removeWidget(m_loadingLabel);
|
m_layout->removeWidget(m_loadingLabel);
|
||||||
|
|
|
@ -53,34 +53,35 @@ void DiscordPage::setupPermissions() {
|
||||||
settings()->setAttribute(QWebEngineSettings::ScrollAnimatorEnabled, true);
|
settings()->setAttribute(QWebEngineSettings::ScrollAnimatorEnabled, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString fileContent;
|
|
||||||
|
|
||||||
void DiscordPage::setupUserStyles() {
|
void DiscordPage::setupUserStyles() {
|
||||||
auto file = new QFile(
|
m_userStylesFile = new QFile(
|
||||||
QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) +
|
QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) +
|
||||||
"/userstyles.css");
|
"/userstyles.css");
|
||||||
if (file->exists()) {
|
if (m_userStylesFile->exists()) {
|
||||||
qDebug(userstylesLog) << "Found userstyles:" << file->fileName();
|
qDebug(userstylesLog) << "Found userstyles:"
|
||||||
file->open(QIODevice::ReadOnly);
|
<< m_userStylesFile->fileName();
|
||||||
fileContent = file->readAll();
|
m_userStylesFile->open(QIODevice::ReadOnly);
|
||||||
file->close();
|
m_userStylesContent = m_userStylesFile->readAll();
|
||||||
fetchUserStyles(file);
|
m_userStylesFile->close();
|
||||||
|
fetchUserStyles();
|
||||||
}
|
}
|
||||||
|
connect(&m_userScript, &UserScript::shouldInstallUserStyles, this,
|
||||||
|
&DiscordPage::getUserStyles);
|
||||||
}
|
}
|
||||||
|
|
||||||
const QRegularExpression
|
const QRegularExpression importRegex(
|
||||||
importRegex(R"r(@import url\(['"]{0,1}([^'"]+?)['"]{0,1}\);)r");
|
R"r(@import (?:url\(|)['"]{0,1}(?!.*usrbgs?\.css)([^'"]+?)['"]{0,1}(?:|\));)r");
|
||||||
const QRegularExpression urlRegex(
|
const QRegularExpression urlRegex(
|
||||||
R"r(url\(['"]{0,1}((?!https:\/\/fonts.gstatic.com)(?!data:)(?!.*usrbgs?\.css)(?!.*\.woff2)(?!.*\.ttf)[^'"]+?)['"]{0,1}\))r");
|
R"r(url\(['"]{0,1}((?!https:\/\/fonts.gstatic.com)(?!data:)(?!.*\.woff2)(?!.*\.ttf)[^'"]+?)['"]{0,1}\))r");
|
||||||
|
|
||||||
void DiscordPage::fetchUserStyles(QFile *file) {
|
void DiscordPage::fetchUserStyles() {
|
||||||
m_userScript.setProperty(
|
m_userScript.setProperty(
|
||||||
"loadingMessage", "Loading userstyles: Fetching additional resources...");
|
"loadingMessage", "Loading userstyles: Fetching additional resources...");
|
||||||
bool foundImport = true;
|
bool foundImport = true;
|
||||||
auto match = importRegex.match(fileContent);
|
auto match = importRegex.match(m_userStylesContent);
|
||||||
if (!match.hasMatch()) {
|
if (!match.hasMatch()) {
|
||||||
foundImport = false;
|
foundImport = false;
|
||||||
match = urlRegex.match(fileContent);
|
match = urlRegex.match(m_userStylesContent);
|
||||||
}
|
}
|
||||||
if (match.hasMatch()) {
|
if (match.hasMatch()) {
|
||||||
auto url = match.captured(1);
|
auto url = match.captured(1);
|
||||||
|
@ -103,21 +104,26 @@ void DiscordPage::fetchUserStyles(QFile *file) {
|
||||||
} else
|
} else
|
||||||
qDebug(userstylesLog) << reply->errorString().toUtf8().constData();
|
qDebug(userstylesLog) << reply->errorString().toUtf8().constData();
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
fileContent = fileContent.replace(
|
m_userStylesContent = m_userStylesContent.replace(
|
||||||
match.captured(0), foundImport
|
match.captured(0), foundImport
|
||||||
? content
|
? content
|
||||||
: "url(data:application/octet-stream;base64," +
|
: "url(data:application/octet-stream;base64," +
|
||||||
content.toBase64() + ")");
|
content.toBase64() + ")");
|
||||||
fetchUserStyles(file);
|
fetchUserStyles();
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
qDebug(userstylesLog) << "Injecting userstyles";
|
qDebug(userstylesLog) << "Injecting userstyles";
|
||||||
m_userScript.setProperty("userstyles", fileContent);
|
m_userScript.setProperty("userstyles", m_userStylesContent);
|
||||||
file->open(QIODevice::WriteOnly);
|
m_userScript.setProperty("loadingMessage", "");
|
||||||
file->write(fileContent.toUtf8().constData());
|
m_userStylesFile->open(QIODevice::WriteOnly);
|
||||||
file->close();
|
m_userStylesFile->write(m_userStylesContent.toUtf8());
|
||||||
file->deleteLater();
|
m_userStylesFile->close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DiscordPage::getUserStyles(QString url) {
|
||||||
|
m_userStylesContent = url == "" ? "" : QString("@import url(%1);").arg(url);
|
||||||
|
fetchUserStyles();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiscordPage::injectScript(
|
void DiscordPage::injectScript(
|
||||||
|
@ -142,7 +148,6 @@ void DiscordPage::injectScript(QString name, QString content) {
|
||||||
|
|
||||||
void DiscordPage::injectStylesheet(QString name, QString content) {
|
void DiscordPage::injectStylesheet(QString name, QString content) {
|
||||||
auto script = QString(R"(const stylesheet = document.createElement("style");
|
auto script = QString(R"(const stylesheet = document.createElement("style");
|
||||||
stylesheet.type = "text/css";
|
|
||||||
stylesheet.id = "%1";
|
stylesheet.id = "%1";
|
||||||
stylesheet.innerText = `%2`;
|
stylesheet.innerText = `%2`;
|
||||||
document.head.appendChild(stylesheet);
|
document.head.appendChild(stylesheet);
|
||||||
|
|
|
@ -17,10 +17,12 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
UserScript m_userScript;
|
UserScript m_userScript;
|
||||||
|
QFile *m_userStylesFile;
|
||||||
|
QString m_userStylesContent;
|
||||||
QNetworkAccessManager m_networkAccessManager;
|
QNetworkAccessManager m_networkAccessManager;
|
||||||
void setupPermissions();
|
void setupPermissions();
|
||||||
void setupUserStyles();
|
void setupUserStyles();
|
||||||
void fetchUserStyles(QFile *file);
|
void fetchUserStyles();
|
||||||
bool acceptNavigationRequest(const QUrl &url,
|
bool acceptNavigationRequest(const QUrl &url,
|
||||||
QWebEnginePage::NavigationType type,
|
QWebEnginePage::NavigationType type,
|
||||||
bool isMainFrame) override;
|
bool isMainFrame) override;
|
||||||
|
@ -39,6 +41,9 @@ private:
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void featurePermissionRequested(const QUrl &securityOrigin,
|
void featurePermissionRequested(const QUrl &securityOrigin,
|
||||||
QWebEnginePage::Feature feature);
|
QWebEnginePage::Feature feature);
|
||||||
|
|
||||||
|
public Q_SLOTS:
|
||||||
|
void getUserStyles(QString url);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Will immediately get destroyed again but is needed for navigation to
|
// Will immediately get destroyed again but is needed for navigation to
|
||||||
|
|
|
@ -4,6 +4,9 @@
|
||||||
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QInputDialog>
|
||||||
|
#include <QStandardPaths>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
#ifdef KXMLGUI
|
#ifdef KXMLGUI
|
||||||
|
@ -163,3 +166,14 @@ void UserScript::showStreamDialog() {
|
||||||
m_streamDialog->activateWindow();
|
m_streamDialog->activateWindow();
|
||||||
m_streamDialog->updateTargets();
|
m_streamDialog->updateTargets();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UserScript::showThemeDialog() {
|
||||||
|
auto url = QInputDialog::getText(MainWindow::instance(), "Theme Installation",
|
||||||
|
"Please enter the URL of the Theme");
|
||||||
|
if (url != "")
|
||||||
|
emit shouldInstallUserStyles(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UserScript::installUserStyles(QString url) {
|
||||||
|
emit shouldInstallUserStyles(url);
|
||||||
|
}
|
||||||
|
|
|
@ -65,6 +65,7 @@ Q_SIGNALS:
|
||||||
void streamStarted(bool video, int width, int height, int frameRate);
|
void streamStarted(bool video, int width, int height, int frameRate);
|
||||||
void userstylesChanged();
|
void userstylesChanged();
|
||||||
void loadingMessageChanged(QString message);
|
void loadingMessageChanged(QString message);
|
||||||
|
void shouldInstallUserStyles(QString url);
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
void log(QString message);
|
void log(QString message);
|
||||||
|
@ -78,6 +79,8 @@ public Q_SLOTS:
|
||||||
void showStreamDialog();
|
void showStreamDialog();
|
||||||
void stopVirtmic();
|
void stopVirtmic();
|
||||||
void startVirtmic(QString target);
|
void startVirtmic(QString target);
|
||||||
|
void showThemeDialog();
|
||||||
|
void installUserStyles(QString url);
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void startStream(bool video, bool audio, int width, int height, int frameRate,
|
void startStream(bool video, bool audio, int width, int height, int frameRate,
|
||||||
|
|
Loading…
Reference in a new issue