1
0
mirror of https://gitlab.com/kelteseth/ScreenPlay.git synced 2024-09-14 22:42:34 +02:00
This commit is contained in:
Elias Steurer 2021-04-22 16:07:22 +02:00
commit 2cd40c559d
51 changed files with 1734 additions and 1311 deletions

View File

@ -8,6 +8,9 @@
ScreenPlay [![pipeline status](https://gitlab.com/kelteseth/ScreenPlay/badges/master/pipeline.svg)](https://gitlab.com/kelteseth/ScreenPlay/-/commits/master) <br>
Dev. Docs [![pipeline status](https://gitlab.com/kelteseth/ScreenPlayDeveloperDocs/badges/master/pipeline.svg)](https://gitlab.com/kelteseth/ScreenPlayDeveloperDocs/-/commits/master) <br><br>
<a href=""></a>
[中文总览](README_zh_CN.md)
<br><br>
<a href="https://twitter.com/kelteseth">![Twitter Follow](https://img.shields.io/twitter/follow/kelteseth?style=for-the-badge)</a>
<a href="https://www.reddit.com/r/ScreenPlayApp/">![Subreddit subscribers](https://img.shields.io/reddit/subreddit-subscribers/screenplayapp?style=for-the-badge)</a>
<br><br>
@ -34,6 +37,11 @@ Windows only, Linux and MacOS (soon™)
<p>Click gif to see the Steam Early Access Trailer (YouTube)</p>
</div>
# Important Issues
* [Support for Windows monitor scaling is currently buggy. All monitors must be set to 100%!](https://gitlab.com/kelteseth/ScreenPlay/-/issues/125)
* [Implement KDE Support](https://gitlab.com/kelteseth/ScreenPlay/-/issues/111)
* [Implement MacOS Support](https://gitlab.com/kelteseth/ScreenPlay/-/issues/130)
# Content Creation
[Learn the basics of QML for Wallpapers and Widgets in 5 minutes](https://screen-play.app/blog/guide_learn_the_basics_of_qml/)
<div>

126
README_zh_CN.md Normal file
View File

@ -0,0 +1,126 @@
<div>
<img width="100%" height="93" src=".gitlab/media/logo_gitlab_fullwidth.svg">
</div>
<div align="center">
<br>
ScreenPlay [![pipeline status](https://gitlab.com/kelteseth/ScreenPlay/badges/master/pipeline.svg)](https://gitlab.com/kelteseth/ScreenPlay/-/commits/master) <br>
开发文档 [![pipeline status](https://gitlab.com/kelteseth/ScreenPlayDeveloperDocs/badges/master/pipeline.svg)](https://gitlab.com/kelteseth/ScreenPlayDeveloperDocs/-/commits/master) <br><br>
<a href="https://twitter.com/kelteseth">![Twitter Follow](https://img.shields.io/twitter/follow/kelteseth?style=for-the-badge)</a>
<a href="https://www.reddit.com/r/ScreenPlayApp/">![Subreddit subscribers](https://img.shields.io/reddit/subreddit-subscribers/screenplayapp?style=for-the-badge)</a>
<br><br>
用户交流 (Discord英语)
<a href="https://discord.com/invite/JBMmZbgc?utm_source=Discord%20Widget&utm_medium=Connect">![Discord](https://img.shields.io/discord/516635043435773970?style=for-the-badge)</a>
开发者交流(英语) [![Gitter](https://badges.gitter.im/ScreenPlayApp/community.svg)](https://gitter.im/ScreenPlayApp/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
<br>
ScreenPlay 是一款开源、跨平台,显示视频壁纸,部件,应用抽屉的软件。它以现代的 C++20/Qt5/QML编写。
带有创意工坊支持的二进制(在 Windows ,以及不久的 Linux 及 MacOSX 可用)可以通过<a href="https://store.steampowered.com/app/672870/ScreenPlay/">Steam</a>获取。加入我们(英语):<a href="https://screen-play.app/">首页</a> - <a href="https://forum.screen-play.app/">论坛</a>
<br>
<h3><a href="https://store.steampowered.com/app/672870/ScreenPlay/">✨通过Steam下载ScreenPlay</a> - <a href="https://steamcommunity.com/app/672870/workshop/">Steam 创意工坊,获取壁纸与部件✨</a></h3>
仅支持WindowsLinux 和 MacOS 在做了
<br>
<br>
<a href="https://www.youtube.com/watch?v=q-J2fTWDxw8">
![预览](.gitlab/media/preview.gif)
</a>
<p>点击gif查看尽早访问预告片 (YouTube)</p>
</div>
# 重要议题
* [对Windows显示器缩放的支持目前有问题。所有显示器必须被设为100%](https://gitlab.com/kelteseth/ScreenPlay/-/issues/125)
* [KDE 支持](https://gitlab.com/kelteseth/ScreenPlay/-/issues/111)
* [MacOS 支持](https://gitlab.com/kelteseth/ScreenPlay/-/issues/130)
# 内容创建
[5分钟内学习QML基础壁纸部件(English)](https://screen-play.app/blog/guide_learn_the_basics_of_qml/)
<div>
<a href="https://kelteseth.gitlab.io/ScreenPlayDocs/wallpaper/wallpaper/"><img src=".gitlab/media/wallpaper_guide.png"></a>
</div>
* [视频壁纸](https://kelteseth.gitlab.io/ScreenPlayDocs/wallpaper/video_wallpaper/) - 您可以直接导入任何WebM文件
或者使用导入工具导入任何其他视频类型。
* [性能指南](https://kelteseth.gitlab.io/ScreenPlayDocs/wallpaper/wallpaper/) - 流畅的播放需要您有一块现代的显卡。如果您遇到性能问题,您可以一直用 QML/HTML/GIF 壁纸!
* [通过Handbrake导入视频](https://forum.screen-play.app/topic/43/fast-bulk-video-conversion-with-handbrake)。 Handbrake 提供了方便的视频批量导入。
<div>
<a href="https://kelteseth.gitlab.io/ScreenPlayDocs/widgets/widgets/"><img src=".gitlab/media/widgets_guide.png"></a>
</div>
* [部件引导](https://kelteseth.gitlab.io/ScreenPlayDocs/widgets/widgets/) - 通用引导,如何创建部件。
ScreenPlay使用易于学习的 QML 语言。无需任何编程知识!
* [Storage Widget](https://kelteseth.gitlab.io/ScreenPlayDocs/widgets/example_Storage/). Display your drives and usage.
* [CPU 占用部件](https://kelteseth.gitlab.io/ScreenPlayDocs/widgets/example_CPU/) 显示您当前的CPU使用情况
* [RSS订阅部件](https://kelteseth.gitlab.io/ScreenPlayDocs/widgets/example_RSS/) 以RSS部件显示新闻
# 一般贡献
每个人都可以贡献代码,设计,文档以及翻译。更多信息见[贡献引导](https://kelteseth.gitlab.io/ScreenPlayDocs/contribute/contribute)。也请查阅 [Collaboration Guidelines](Docs/CodeOfConduct.md).
这里是一些您贡献的方式:
* 通过使用预发布版本/ master分支或者Steam每夜构建。
* 通过 [添加/修复翻译](https://kelteseth.gitlab.io/ScreenPlayDocs/contribute/translations/)
* by [设计 UI/UX](https://kelteseth.gitlab.io/ScreenPlayDocs/contribute/contribute/#design)
* by [创建示例 HTML/QML/Javascript 内容](https://kelteseth.gitlab.io/ScreenPlayDocs/)
* by [报告漏洞](https://gitlab.com/kelteseth/ScreenPlay/-/issues)
* by [编写用户文档](https://gitlab.com/kelteseth/ScreenPlayDocs)
* by [编写需要的功能](https://gitlab.com/kelteseth/ScreenPlay/-/issues?label_name%5B%5D=Feature)
* by [重构代码](https://gitlab.com/kelteseth/ScreenPlay/-/issues?label_name%5B%5D=Code+Quality)
* by [检阅合并请求](https://gitlab.com/kelteseth/ScreenPlay/-/merge_requests)
* by [验证Issue](https://gitlab.com/kelteseth/ScreenPlay/-/issues?label_name%5B%5D=Unverified)
# Development
* [**Developer setup guide on how to download and compile ScreenPlay yourself.**](Docs/DeveloperSetup.md)
* If you want to contribute but don't know how to start, take a look at our open issues and WIP merge request.
* If you need help don't hesitate to ask me (Kelteseth) via:
* [Create a forum topic with a detailed description](https://forum.screen-play.app/category/2/general-discussion)
* [discord channel general](https://discord.gg/3RygPHZ)
* [ScreenPlay project overview](Docs/ProjectOverview.md)
* [Developer C++ Classes Documentation](https://kelteseth.gitlab.io/ScreenPlayDeveloperDocs/)
# Platform support
* ❌ Not working/Not implemented
* ❓ Only partially implemented/Not tested, help needed
<div align="center">
| 功能 | Windows | Linux | MacOS |
|------------------------ |--------- |------- |------- |
| __ScreenPlay 主程序__ | ✔ | ✔ | ✔ |
| __Steam 二进制__ | ✔ | ❌ | ❌ |
| __壁纸__ | ✔ | ❓ 需要帮助 Gnome/KDE 等! | ✔ |
| __部件__ | ✔ | ✔ | ✔ |
| __多语言 (EN,DE,RU,FR,ES,KO,VI,ZH_CN,PT_BR🆕)__ | ✔ | ✔ | ✔ |
</div>
因为每个操作系统有它自己的桌面环境,我们需要分别适配 ScreenPlayWindow 到各个平台。
目前功能最完好的是Windows 10。Windows 7下也可用但有[错误的coordinates](https://gitlab.com/kelteseth/ScreenPlay/issues/34). MacOS has some basic wallpaper functionality but no maintainer. For Linux we sadly have no support for any desktop environments at the moment, except basic KDE support.
__If you want to help and add new desktop environments look at ScreenPlayWallpaper/src folder__
* [BaseWindow](https://gitlab.com/kelteseth/ScreenPlay/blob/dev/ScreenPlayWallpaper/src/basewindow.h) baseclass for:
* [LinuxWindow](https://gitlab.com/kelteseth/ScreenPlay/blob/dev/ScreenPlayWallpaper/src/linuxwindow.h)
* [WinWindow](https://gitlab.com/kelteseth/ScreenPlay/blob/dev/ScreenPlayWallpaper/src/winwindow.h)
* [MacWindow](https://gitlab.com/kelteseth/ScreenPlay/blob/dev/ScreenPlayWallpaper/src/macwindow.h)
<div align="center">
| 平台 | Windows 10 | Gnome | KDE | MacOS |
|------------------------ |------- |--------- |------- | ------- |
| __壁纸__ | ✔ |❌ Help Needed! | ❓ [基本实现](https://gitlab.com/kelteseth/ScreenPlay/-/tree/master/ScreenPlayWallpaper/kde/ScreenPlay) | ❓ [基本实现](https://gitlab.com/kelteseth/ScreenPlay/-/blob/master/ScreenPlayWallpaper/src/MacBridge.mm) |
</div>

View File

@ -54,7 +54,7 @@ App::App()
QGuiApplication::setOrganizationName("ScreenPlay");
QGuiApplication::setOrganizationDomain("https://screen-play.app");
QGuiApplication::setApplicationName("ScreenPlay");
QGuiApplication::setApplicationVersion("0.13.0");
QGuiApplication::setApplicationVersion("0.13.1");
QGuiApplication::setQuitOnLastWindowClosed(false);
QFontDatabase::addApplicationFont(":/assets/fonts/LibreBaskerville-Italic.ttf");
@ -205,7 +205,12 @@ void App::init()
// Must be called last to display a error message on startup by the qml engine
m_screenPlayManager->init(m_globalVariables, m_monitorListModel, m_telemetry, m_settings);
QObject::connect(m_monitorListModel.get(), &MonitorListModel::monitorConfigurationChanged, m_screenPlayManager.get(), &ScreenPlayManager::closeAllWallpapers);
QObject::connect(m_monitorListModel.get(), &MonitorListModel::monitorConfigurationChanged, m_screenPlayManager.get(), &ScreenPlayManager::removeAllWallpapers);
}
QString App::version() const
{
return QGuiApplication::applicationVersion();
}
/*!
@ -220,7 +225,7 @@ void App::exit()
// Workaround because we cannot force to send exit event
m_telemetry->setSendInterval(5);
m_telemetry->endSession();
QTimer::singleShot(150, []() { QApplication::instance()->quit(); });
QTimer::singleShot(150, this, []() { QApplication::instance()->quit(); });
}
}

View File

@ -92,60 +92,17 @@ public:
void init();
bool m_isAnotherScreenPlayInstanceRunning { false };
GlobalVariables* globalVariables() const
{
return m_globalVariables.get();
}
ScreenPlayManager* screenPlayManager() const
{
return m_screenPlayManager.get();
}
Create* create() const
{
return m_create.get();
}
Util* util() const
{
return m_util.get();
}
Settings* settings() const
{
return m_settings.get();
}
InstalledListModel* installedListModel() const
{
return m_installedListModel.get();
}
MonitorListModel* monitorListModel() const
{
return m_monitorListModel.get();
}
ProfileListModel* profileListModel() const
{
return m_profileListModel.get();
}
InstalledListFilter* installedListFilter() const
{
return m_installedListFilter.get();
}
QQmlApplicationEngine* mainWindowEngine() const
{
return m_mainWindowEngine.get();
}
Wizards* wizards() const
{
return m_wizards.get();
}
GlobalVariables* globalVariables() const { return m_globalVariables.get(); }
ScreenPlayManager* screenPlayManager() const { return m_screenPlayManager.get(); }
Create* create() const { return m_create.get(); }
Util* util() const { return m_util.get(); }
Settings* settings() const { return m_settings.get(); }
InstalledListModel* installedListModel() const { return m_installedListModel.get(); }
MonitorListModel* monitorListModel() const { return m_monitorListModel.get(); }
ProfileListModel* profileListModel() const { return m_profileListModel.get(); }
InstalledListFilter* installedListFilter() const { return m_installedListFilter.get(); }
QQmlApplicationEngine* mainWindowEngine() const { return m_mainWindowEngine.get(); }
Wizards* wizards() const { return m_wizards.get(); }
signals:
void globalVariablesChanged(GlobalVariables* globalVariables);
@ -161,7 +118,7 @@ signals:
void wizardsChanged(Wizards* wizards);
public slots:
QString version() const;
void exit();
bool loadSteamPlugin();
bool unloadSteamPlugin();

View File

@ -76,7 +76,6 @@ int main(int argc, char* argv[])
ScreenPlay::App app;
if (app.m_isAnotherScreenPlayInstanceRunning) {
return 0;
} else {

View File

@ -24,7 +24,7 @@ ApplicationWindow {
visible: false
width: 1400
height: 788
title: "ScreenPlay Alpha - 0.13.0"
title: "ScreenPlay Alpha - " + ScreenPlay.version();
minimumHeight: 450
minimumWidth: 1050
onVisibilityChanged: {

View File

@ -105,6 +105,9 @@ Item {
id: repeater
model: ListModel {
id: webModel
ListElement {
url: "https://screen-play.app/blog/"
}
ListElement {
url: "https://kelteseth.gitlab.io/ScreenPlayDocs/"
}
@ -142,4 +145,10 @@ Item {
}
}
}
Binding{
target: nav
property: "currentIndex"
value: swipeView.currentIndex
}
}

View File

@ -98,14 +98,12 @@ Popup {
if (installedType === InstalledType.VideoWallpaper) {
videoControlWrapper.state = "visible"
customPropertiesGridView.visible = false
const wallpaper = ScreenPlay.screenPlayManager.getWallpaperByAppID(
appID)
const wallpaper = ScreenPlay.screenPlayManager.getWallpaperByAppID(appID)
videoControlWrapper.wallpaper = wallpaper
} else {
videoControlWrapper.state = "hidden"
customPropertiesGridView.visible = true
ScreenPlay.screenPlayManager.requestProjectSettingsAtMonitorIndex(
index)
ScreenPlay.screenPlayManager.requestProjectSettingsAtMonitorIndex(index)
}
activeMonitorIndex = index
@ -135,8 +133,10 @@ Popup {
font.family: ScreenPlay.settings.font
enabled: monitorSelection.activeMonitors.length == 1
onClicked: {
ScreenPlay.screenPlayManager.removeWallpaperAt(
monitorSelection.activeMonitors[0])
if (!ScreenPlay.screenPlayManager.removeWallpaperAt(
monitorSelection.activeMonitors[0])) {
print("Unable to close singel wallpaper")
}
}
}
Button {
@ -149,21 +149,26 @@ Popup {
font.family: ScreenPlay.settings.font
enabled: ScreenPlay.screenPlayManager.activeWallpaperCounter > 0
onClicked: {
ScreenPlay.screenPlayManager.removeAllWallpapers()
if (!ScreenPlay.screenPlayManager.removeAllWallpapers()) {
print("Unable to close all wallpaper!")
}
monitors.close()
}
}
Button {
id: btnRemoveAllWidgets
text: qsTr("Remove ")
+ ScreenPlay.screenPlayManager.activeWidgetsCounter + " " + qsTr(
"Widgets")
+ ScreenPlay.screenPlayManager.activeWidgetsCounter + " " + qsTr("Widgets")
Material.background: Material.accent
Material.foreground: "white"
font.family: ScreenPlay.settings.font
enabled: ScreenPlay.screenPlayManager.activeWidgetsCounter > 0
onClicked: {
ScreenPlay.screenPlayManager.removeAllWidgets()
if (!ScreenPlay.screenPlayManager.removeAllWidgets()) {
print("Unable to close all widgets!")
}
monitors.close()
}
}

View File

@ -84,20 +84,11 @@ public:
};
Q_ENUM(VideoCodec)
float progress() const
{
return m_progress;
}
float progress() const { return m_progress; }
QString workingDir() const
{
return m_workingDir;
}
QString workingDir() const { return m_workingDir; }
QString ffmpegOutput() const
{
return m_ffmpegOutput;
}
QString ffmpegOutput() const { return m_ffmpegOutput; }
signals:
void createWallpaperStateChanged(CreateImportVideo::ImportVideoState state);

View File

@ -100,10 +100,7 @@ public:
};
Q_ENUM(ImportVideoState)
float progress() const
{
return m_progress;
}
float progress() const { return m_progress; }
bool m_skipAudio { false };

View File

@ -67,42 +67,27 @@ public:
\property GlobalVariables::localStoragePath
\brief Returns the localStoragePath.
*/
QUrl localStoragePath() const
{
return m_localStoragePath;
}
QUrl localStoragePath() const { return m_localStoragePath; }
/*!
\property GlobalVariables::localSettingsPath
\brief Returns the localSettingsPath.
*/
QUrl localSettingsPath() const
{
return m_localSettingsPath;
}
QUrl localSettingsPath() const { return m_localSettingsPath; }
/*!
\property GlobalVariables::wallpaperExecutablePath
\brief Returns the wallpaperExecutablePath. This only differes in development builds.
*/
QUrl wallpaperExecutablePath() const
{
return m_wallpaperExecutablePath;
}
QUrl wallpaperExecutablePath() const { return m_wallpaperExecutablePath; }
/*!
\property GlobalVariables::widgetExecutablePath
\brief Returns the widgetExecutablePath. This only differes in development builds.
*/
QUrl widgetExecutablePath() const
{
return m_widgetExecutablePath;
}
QUrl widgetExecutablePath() const { return m_widgetExecutablePath; }
/*!
\property GlobalVariables::m_version
\brief Returns the current app version. Not yet used.
*/
QVersionNumber version() const
{
return m_version;
}
QVersionNumber version() const { return m_version; }
signals:
void localStoragePathChanged(QUrl localStoragePath);

View File

@ -33,7 +33,7 @@ void InstalledListModel::init()
}
auto reloadLambda = [this]() {
QTimer::singleShot(500, [this]() {
QTimer::singleShot(500, this, [this]() {
reset();
});
};
@ -170,7 +170,6 @@ void InstalledListModel::loadInstalledContent()
if (!obj->contains("type"))
continue;
if (ScreenPlayUtil::getAvailableTypes().contains(obj->value("type").toString())) {
if (ScreenPlayUtil::getAvailableTypes().contains(obj->value("type").toString(), Qt::CaseInsensitive)) {
append(*obj, item.baseName(), item.lastModified());

View File

@ -223,9 +223,10 @@ QRect MonitorListModel::getAbsoluteDesktopSize() const
}
/*!
\brief Sets the previewImage and appID for a list item.
\brief Sets a shared_ptr to the monitor list. This should be used to set and
remove the shared_ptr.
*/
void MonitorListModel::setWallpaperActiveMonitor(const std::shared_ptr<ScreenPlayWallpaper>& wallpaper, const QVector<int> monitors)
void MonitorListModel::setWallpaperMonitor(const std::shared_ptr<ScreenPlayWallpaper>& wallpaper, const QVector<int> monitors)
{
for (const int monitor : monitors) {

View File

@ -99,7 +99,8 @@ public:
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
void setWallpaperActiveMonitor(const std::shared_ptr<ScreenPlayWallpaper>& wallpaper,
void setWallpaperMonitor(
const std::shared_ptr<ScreenPlayWallpaper>& wallpaper,
const QVector<int> monitors);
std::optional<QString> getAppIDByMonitorIndex(const int index) const;

View File

@ -101,7 +101,7 @@ void ScreenPlayManager::init(
a \a fillMode, a \a type (htmlWallpaper, qmlWallpaper etc.), a \a saveToProfilesConfigFile bool only set to flase
if we call the method when using via the settings on startup to skip a unnecessary save.
*/
void ScreenPlayManager::createWallpaper(
bool ScreenPlayManager::createWallpaper(
const InstalledType::InstalledType type,
const FillMode::FillMode fillMode,
const QString& absoluteStoragePath,
@ -146,9 +146,9 @@ void ScreenPlayManager::createWallpaper(
fillMode,
type,
m_settings->checkWallpaperVisible());
m_monitorListModel->setWallpaperActiveMonitor(wallpaper, monitorIndex);
m_monitorListModel->setWallpaperMonitor(wallpaper, monitorIndex);
return;
return true;
}
}
i++;
@ -170,17 +170,21 @@ void ScreenPlayManager::createWallpaper(
m_settings->checkWallpaperVisible());
QObject::connect(wallpaper.get(), &ScreenPlayWallpaper::requestSave, this, &ScreenPlayManager::requestSaveProfiles);
QObject::connect(wallpaper.get(), &ScreenPlayWallpaper::requestClose, this, &ScreenPlayManager::removeApp);
QObject::connect(wallpaper.get(), &ScreenPlayWallpaper::requestClose, this, &ScreenPlayManager::removeWallpaper);
QObject::connect(wallpaper.get(), &ScreenPlayWallpaper::error, this, &ScreenPlayManager::displayErrorPopup);
if (!wallpaper->start()) {
return false;
}
m_screenPlayWallpapers.append(wallpaper);
m_monitorListModel->setWallpaperActiveMonitor(wallpaper, monitorIndex);
m_monitorListModel->setWallpaperMonitor(wallpaper, monitorIndex);
increaseActiveWallpaperCounter();
return true;
}
/*!
\brief Creates a ScreenPlayWidget object via a \a absoluteStoragePath and a \a preview image (relative path).
*/
void ScreenPlayManager::createWidget(
bool ScreenPlayManager::createWidget(
const InstalledType::InstalledType type,
const QPoint& position,
const QString& absoluteStoragePath,
@ -200,7 +204,7 @@ void ScreenPlayManager::createWidget(
if (path.isEmpty()) {
qWarning() << "Path is empty, Abort! String: " << absoluteStoragePath;
return;
return false;
}
auto widget = std::make_shared<ScreenPlayWidget>(
@ -213,79 +217,63 @@ void ScreenPlayManager::createWidget(
type);
QObject::connect(widget.get(), &ScreenPlayWidget::requestSave, this, &ScreenPlayManager::requestSaveProfiles);
QObject::connect(widget.get(), &ScreenPlayWidget::requestClose, this, &ScreenPlayManager::removeApp);
QObject::connect(widget.get(), &ScreenPlayWidget::requestClose, this, &ScreenPlayManager::removeWidget);
QObject::connect(widget.get(), &ScreenPlayWidget::error, this, &ScreenPlayManager::displayErrorPopup);
if (!widget->start()) {
return false;
}
increaseActiveWidgetsCounter();
m_screenPlayWidgets.append(widget);
return true;
}
/*!
\brief Iterates all Wallpaper and Widgets for the matching appID. Returns true if a matching appID
was successful set.
\brief Removes all wallpaper entries in the profiles.json.
*/
bool ScreenPlayManager::appConnected(const std::shared_ptr<SDKConnection>& connection)
bool ScreenPlayManager::removeAllWallpapers()
{
for (const auto& item : qAsConst(m_screenPlayWidgets)) {
if (item->appID() == connection->appID()) {
item->setSDKConnection(connection);
return true;
if (m_screenPlayWallpapers.empty()) {
qWarning() << "Trying to remove all Wallpapers while m_screenPlayWallpapers is not empty. Count: " << m_screenPlayWallpapers.size();
return false;
}
QStringList appIDs;
// Do not remove items from the vector you iterate on.
for (auto& client : m_screenPlayWallpapers) {
appIDs.append(client->appID());
}
for (const auto& appID : appIDs) {
if (!removeWallpaper(appID)) {
return false;
}
}
for (const auto& item : qAsConst(m_screenPlayWallpapers)) {
if (item->appID() == connection->appID()) {
item->setSDKConnection(connection);
return true;
}
}
emit requestSaveProfiles();
qWarning() << "No matching appID for id" << connection->appID() << " was found!";
return false;
}
/*!
\brief Removes all wallpaper entries in the profiles.json. This method will likely be removed
when using nlohmann/json in the future.
*/
void ScreenPlayManager::removeAllWallpapers()
{
if (!m_screenPlayWallpapers.empty()) {
closeAllWallpapers();
m_screenPlayWallpapers.clear();
m_monitorListModel->clearActiveWallpaper();
emit requestSaveProfiles();
setActiveWallpaperCounter(0);
if (activeWallpaperCounter() != m_screenPlayWallpapers.length()) {
if (m_telemetry) {
m_telemetry->sendEvent("wallpaper", "error_removeAllWallpapers");
}
qWarning() << "activeWallpaperCounter value: " << activeWallpaperCounter()
<< "does not match m_screenPlayWallpapers length:" << m_screenPlayWallpapers.length();
}
} else {
if (m_telemetry) {
m_telemetry->sendEvent("wallpaper", "error_removeAllWallpapers_m_screenPlayWallpapers_notEmpty");
}
qWarning() << "Trying to remove all wallpapers while m_screenPlayWallpapers is not empty. Count: " << m_screenPlayWallpapers.size();
}
return true;
}
/*!
\brief Removes all widgets and resets the activeWidgetCounter to 0.
*/
void ScreenPlayManager::removeAllWidgets()
bool ScreenPlayManager::removeAllWidgets()
{
if (!m_screenPlayWidgets.empty()) {
closeAllWidgets();
m_screenPlayWidgets.clear();
emit requestSaveProfiles();
setActiveWidgetsCounter(0);
if (m_screenPlayWallpapers.empty()) {
qWarning() << "Trying to remove all Widgets while m_screenPlayWallpapers is not empty. Count: " << m_screenPlayWallpapers.size();
return false;
}
for (auto& client : m_screenPlayWallpapers) {
if (!removeWidget(client->appID())) {
return false;
}
}
emit requestSaveProfiles();
return true;
}
/*!
@ -297,52 +285,30 @@ bool ScreenPlayManager::removeWallpaperAt(int index)
{
if (auto appID = m_monitorListModel->getAppIDByMonitorIndex(index)) {
return removeApp(*appID);
}
if (m_telemetry) {
m_telemetry->sendEvent("wallpaper", "error_removeWallpaperAt");
if (removeWallpaper(*appID)) {
emit requestSaveProfiles();
return true;
}
}
qWarning() << "Could not remove Wallpaper at index:" << index;
return false;
}
/*!
\brief Disconnects the connection, remove
*/
bool ScreenPlayManager::removeApp(const QString& appID)
{
if (!closeConnection(appID)) {
qWarning() << "Could not close socket. Abort!";
return false;
}
m_monitorListModel->closeWallpaper(appID);
const QString appIDCopy = appID;
if (!removeWallpaperByAppID(appIDCopy)) {
if (m_telemetry) {
m_telemetry->sendEvent("wallpaper", "error_removeWallpaperAt_removeWallpaperByAppID");
}
qWarning() << "Could not remove Wallpaper " << appIDCopy << " from wallpaper list!";
return false;
}
emit requestSaveProfiles();
return true;
}
/*!
\brief Request a spesific json profile to display in the active wallpaper popup on the right.
*/
void ScreenPlayManager::requestProjectSettingsAtMonitorIndex(const int index)
bool ScreenPlayManager::requestProjectSettingsAtMonitorIndex(const int index)
{
for (const std::shared_ptr<ScreenPlayWallpaper>& uPtrWallpaper : qAsConst(m_screenPlayWallpapers)) {
if (uPtrWallpaper->screenNumber()[0] == index) {
emit projectSettingsListModelResult(
uPtrWallpaper->getProjectSettingsListModel());
return;
return true;
}
}
return false;
}
/*!
@ -351,8 +317,7 @@ void ScreenPlayManager::requestProjectSettingsAtMonitorIndex(const int index)
bool ScreenPlayManager::setWallpaperValueAtMonitorIndex(const int index, const QString& key, const QString& value)
{
if (auto appID = m_monitorListModel->getAppIDByMonitorIndex(index)) {
setWallpaperValue(*appID, key, value);
return true;
return setWallpaperValue(*appID, key, value);
}
qWarning() << "Could net get appID from m_monitorListModel!";
@ -362,15 +327,17 @@ bool ScreenPlayManager::setWallpaperValueAtMonitorIndex(const int index, const Q
/*!
\brief Convenient function to set a \a value at a given \a index and \a key for all wallaper. For exmaple used to mute all wallpaper.
*/
void ScreenPlayManager::setAllWallpaperValue(const QString& key, const QString& value)
bool ScreenPlayManager::setAllWallpaperValue(const QString& key, const QString& value)
{
for (const std::shared_ptr<ScreenPlayWallpaper>& uPtrWallpaper : qAsConst(m_screenPlayWallpapers)) {
setWallpaperValue(uPtrWallpaper->appID(), key, value);
for (auto& wallpaper : m_screenPlayWallpapers) {
return setWallpaperValue(wallpaper->appID(), key, value);
}
return true;
}
/*!
\brief Returns \c a ScreenPlayWallpaper if successful, otherwhise \c std::nullopt.
This function is only used in QML.
*/
ScreenPlayWallpaper* ScreenPlayManager::getWallpaperByAppID(const QString& appID) const
{
@ -387,113 +354,139 @@ ScreenPlayWallpaper* ScreenPlayManager::getWallpaperByAppID(const QString& appID
*/
void ScreenPlayManager::newConnection()
{
auto connection = std::make_shared<SDKConnection>(m_server->nextPendingConnection());
auto connection = std::make_unique<SDKConnection>(m_server->nextPendingConnection());
// Because user can close widgets by pressing x the widgets must send us the event
QObject::connect(connection.get(), &SDKConnection::requestDecreaseWidgetCount, this, [this]() { setActiveWidgetsCounter(activeWallpaperCounter() - 1); });
QObject::connect(connection.get(), &SDKConnection::requestRaise, this, &ScreenPlayManager::requestRaise);
// Only after we receive the first message with appID and type we can set the shared reference to the
// ScreenPlayWallpaper or ScreenPlayWidgets class
// Only after we receive the first message with appID and type we can set the SDKConnection to the
// ScreenPlayWallpaper or ScreenPlayWidgets class.
QObject::connect(connection.get(), &SDKConnection::appConnected, this, [this](const SDKConnection* connection) {
for (const auto& client : qAsConst(m_clients)) {
if (client.get() == connection) {
appConnected(client);
if (m_unconnectedClients.empty()) {
qWarning() << "Unable to match a connection. UnconnectedClients list is empty!";
return;
}
qWarning() << "There are no wallpaper or widgets that have to SDKConnection "
<< "m_screenPlayWallpapers count: " << m_screenPlayWallpapers.size()
<< "m_screenPlayWidgets count: " << m_screenPlayWidgets.size()
<< "m_unconnectedClients count: " << m_unconnectedClients.size();
std::unique_ptr<SDKConnection> matchingConnection;
for (int i = 0; i < m_unconnectedClients.size(); ++i) {
if (m_unconnectedClients.at(i).get() == connection) {
matchingConnection = std::move(m_unconnectedClients.at(i));
m_unconnectedClients.erase(m_unconnectedClients.begin() + i);
}
}
if (!matchingConnection) {
qWarning() << "Unable to match a connection! Aborting!";
return;
}
for (int i = 0; i < m_screenPlayWallpapers.size(); ++i) {
if (m_screenPlayWallpapers.at(i)->appID() == matchingConnection->appID()) {
m_screenPlayWallpapers.at(i)->setSDKConnection(std::move(matchingConnection));
return;
}
}
qWarning() << "No matching connection found!";
});
m_clients.append(connection);
}
/*!
\brief Closes all wallpaper connection with the following type:
\list
\li videoWallpaper
\li qmlWallpaper
\li htmlWallpaper
\li godotWallpaper
\endlist
*/
void ScreenPlayManager::closeAllWallpapers()
{
if (m_screenPlayWallpapers.empty() && m_activeWallpaperCounter == 0)
return;
closeConntectionByType(ScreenPlayUtil::getAvailableWallpaper());
setActiveWallpaperCounter(0);
}
/*!
\brief Closes all widgets connection with the following type:
\list
\li qmlWidget
\li htmlWidget
\li standaloneWidget
\endlist
*/
void ScreenPlayManager::closeAllWidgets()
{
if (m_screenPlayWidgets.empty() && m_activeWidgetsCounter == 0)
return;
closeConntectionByType(ScreenPlayUtil::getAvailableWidgets());
setActiveWidgetsCounter(0);
}
/*!
\brief Closes a connection by type. Used only by closeAllWidgets() and closeAllWallpapers()
*/
bool ScreenPlayManager::closeConntectionByType(const QStringList& types)
{
if (m_clients.isEmpty())
return true;
for (auto& client : m_clients) {
if (types.contains(client->type(), Qt::CaseInsensitive)) {
client->close();
if (!m_clients.removeOne(client)) {
return false;
for (int i = 0; i < m_screenPlayWidgets.size(); ++i) {
if (m_screenPlayWidgets.at(i)->appID() == matchingConnection->appID()) {
m_screenPlayWidgets.at(i)->setSDKConnection(std::move(matchingConnection));
return;
}
}
qWarning() << "No matching connection found!";
});
m_unconnectedClients.push_back(std::move(connection));
}
/*!
\brief Removes a wallpaper from the given appID. Returns true on success.
*/
bool ScreenPlayManager::removeWallpaper(const QString& appID)
{
m_screenPlayWallpapers.erase(
std::remove_if(
m_screenPlayWallpapers.begin(),
m_screenPlayWallpapers.end(),
[this, appID](auto& wallpaper) {
if (wallpaper->appID() != appID) {
return false;
}
qInfo() << "Remove wallpaper " << wallpaper->file() << "at monitor " << wallpaper->screenNumber();
// The MonitorListModel contains a shared_ptr of this object that needs to be removed
// for shared_ptr to release the object.
m_monitorListModel->setWallpaperMonitor({}, wallpaper->screenNumber());
decreaseActiveWallpaperCounter();
return true;
}));
if (activeWallpaperCounter() != m_screenPlayWallpapers.length()) {
qWarning() << "activeWallpaperCounter value: " << activeWallpaperCounter()
<< "does not match m_screenPlayWallpapers length:" << m_screenPlayWallpapers.length();
return false;
}
return true;
}
/*!
\brief Closes a Wallpaper or Widget connection by the given \a appID.
\brief Removes a Widget from the given appID. Returns true on success.
*/
bool ScreenPlayManager::closeConnection(const QString& appID)
bool ScreenPlayManager::removeWidget(const QString& appID)
{
if (m_clients.isEmpty())
return true;
m_screenPlayWidgets.erase(
std::remove_if(
m_screenPlayWidgets.begin(),
m_screenPlayWidgets.end(),
[this, appID](auto& widget) {
if (widget->appID() != appID) {
return false;
}
for (auto& client : m_clients) {
if (client->appID() == appID) {
client->close();
return m_clients.removeOne(client);
}
qInfo() << "Remove widget ";
decreaseActiveWidgetsCounter();
return true;
}));
if (activeWidgetsCounter() != m_screenPlayWidgets.length()) {
qWarning() << "activeWallpaperCounter value: " << activeWidgetsCounter()
<< "does not match m_screenPlayWallpapers length:" << m_screenPlayWidgets.length();
return false;
}
return false;
}
/*!
\brief Sets a given \a value to a given \a key. The \a appID is used to identify the receiver socket.
*/
void ScreenPlayManager::setWallpaperValue(const QString& appID, const QString& key, const QString& value)
bool ScreenPlayManager::setWallpaperValue(const QString& appID, const QString& key, const QString& value)
{
for (const auto& wallpaper : qAsConst(m_screenPlayWallpapers)) {
for (auto& wallpaper : m_screenPlayWallpapers) {
if (wallpaper->appID() == appID) {
wallpaper->setWallpaperValue(key, value, true);
return wallpaper->setWallpaperValue(key, value, true);
}
}
return false;
}
/*!
\brief Saves a given wallpaper \a newProfileObject to a \a profileName. We ignore the profileName argument
because we currently only support one profile. Returns \c true if successfuly saved to profiles.json, otherwise \c false.
*/
void ScreenPlayManager::saveProfiles()
bool ScreenPlayManager::saveProfiles()
{
m_saveLimiter.stop();
@ -520,27 +513,9 @@ void ScreenPlayManager::saveProfiles()
profile.insert("version", "1.0.0");
profile.insert("profiles", activeProfileList);
if (Util::writeJsonObjectToFile({ m_globalVariables->localSettingsPath().toString() + "/profiles.json" }, profile))
if (Util::writeJsonObjectToFile({ m_globalVariables->localSettingsPath().toString() + "/profiles.json" }, profile)) {
emit profilesSaved();
}
/*!
\brief Removes a wallpaper from the given appID. Returns true on success.
*/
bool ScreenPlayManager::removeWallpaperByAppID(const QString& appID)
{
for (auto& wallpaper : m_screenPlayWallpapers) {
if (wallpaper->appID() == appID) {
qInfo() << "Remove wallpaper " << wallpaper->file() << "at monitor " << wallpaper->screenNumber();
decreaseActiveWallpaperCounter();
m_screenPlayWallpapers.removeOne(wallpaper);
if (activeWallpaperCounter() != m_screenPlayWallpapers.length()) {
qWarning() << "activeWallpaperCounter value: " << activeWallpaperCounter()
<< "does not match m_screenPlayWallpapers length:" << m_screenPlayWallpapers.length();
return false;
}
return true;
}
return true;
}
return false;
}
@ -548,27 +523,27 @@ bool ScreenPlayManager::removeWallpaperByAppID(const QString& appID)
/*!
\brief Loads all wallpaper from profiles.json when the version number matches and starts the available wallpaper
*/
void ScreenPlayManager::loadProfiles()
bool ScreenPlayManager::loadProfiles()
{
auto configObj = ScreenPlayUtil::openJsonFileToObject(m_globalVariables->localSettingsPath().toString() + "/profiles.json");
const auto configObj = ScreenPlayUtil::openJsonFileToObject(m_globalVariables->localSettingsPath().toString() + "/profiles.json");
if (!configObj) {
qWarning() << "Could not load active profiles at path: " << m_globalVariables->localSettingsPath().toString() + "/profiles.json";
return;
return false;
}
std::optional<QVersionNumber> version = ScreenPlayUtil::getVersionNumberFromString(configObj->value("version").toString());
if (version && *version != m_globalVariables->version()) {
qWarning() << "Version missmatch fileVersion: " << version->toString() << "m_version: " << m_globalVariables->version().toString();
return;
return false;
}
QJsonArray activeProfilesTmp = configObj->value("profiles").toArray();
if (activeProfilesTmp.size() > 1) {
qWarning() << "We currently only support one profile!";
return;
return false;
}
qInfo() << "Loading profiles " << activeProfilesTmp.size();
@ -579,7 +554,7 @@ void ScreenPlayManager::loadProfiles()
if (wallpaper.toObject().value("name").toString() != "default")
continue;
for (const QJsonValueRef wallpaper : wallpaper.toObject().value("wallpaper").toArray()) {
for (QJsonValueRef wallpaper : wallpaper.toObject().value("wallpaper").toArray()) {
QJsonObject wallpaperObj = wallpaper.toObject();
if (wallpaperObj.empty())
@ -592,12 +567,12 @@ void ScreenPlayManager::loadProfiles()
int value = monitorNumber.toInt(-1);
if (value == -1) {
qWarning() << "Could not parse monitor number to display content at";
return;
return false;
}
if (monitors.contains(value)) {
qWarning() << "The monitor: " << value << " is sharing the config multiple times. ";
return;
return false;
}
monitors.append(value);
}
@ -618,8 +593,11 @@ void ScreenPlayManager::loadProfiles()
const auto type = QStringToEnum<InstalledType::InstalledType>(typeString, InstalledType::InstalledType::VideoWallpaper);
const auto fillMode = QStringToEnum<FillMode::FillMode>(fillModeString, FillMode::FillMode::Cover);
qInfo() << "Start wallpaper from profile:" << type << fillMode << monitors << absolutePath;
createWallpaper(type, fillMode, absolutePath, previewImage, file, monitors, volume, playbackRate, properties, false);
const bool success = createWallpaper(type, fillMode, absolutePath, previewImage, file, monitors, volume, playbackRate, properties, false);
if (!success) {
qWarning() << "Unable to start Wallpaper! " << type << fillMode << monitors << absolutePath;
}
}
for (const QJsonValueRef widget : wallpaper.toObject().value("widgets").toArray()) {
@ -637,10 +615,14 @@ void ScreenPlayManager::loadProfiles()
const auto type = QStringToEnum<InstalledType::InstalledType>(typeString, InstalledType::InstalledType::QMLWidget);
const QJsonObject properties = widgetObj.value("properties").toObject();
qInfo() << "Start widget from profile:" << type << position << absolutePath;
createWidget(type, position, absolutePath, previewImage, properties, false);
const bool success = createWidget(type, position, absolutePath, previewImage, properties, false);
if (!success) {
qWarning() << "Unable to start Widget! " << type << position << absolutePath;
}
}
}
return true;
}
TEST_CASE("Loads profiles.json")
@ -648,5 +630,4 @@ TEST_CASE("Loads profiles.json")
GlobalVariables globalVariables;
ScreenPlayManager manager;
}
}

View File

@ -64,23 +64,7 @@ class ScreenPlayManager : public QObject {
Q_PROPERTY(int activeWidgetsCounter READ activeWidgetsCounter WRITE setActiveWidgetsCounter NOTIFY activeWidgetsCounterChanged)
public:
explicit ScreenPlayManager(
QObject* parent = nullptr);
int activeWallpaperCounter() const
{
return m_activeWallpaperCounter;
}
int activeWidgetsCounter() const
{
return m_activeWidgetsCounter;
}
bool isAnotherScreenPlayInstanceRunning()
{
return m_isAnotherScreenPlayInstanceRunning;
}
explicit ScreenPlayManager(QObject* parent = nullptr);
void init(
const std::shared_ptr<GlobalVariables>& globalVariables,
@ -88,22 +72,27 @@ public:
const std::shared_ptr<GAnalytics>& telemetry,
const std::shared_ptr<Settings>& settings);
int activeWallpaperCounter() const { return m_activeWallpaperCounter; }
int activeWidgetsCounter() const { return m_activeWidgetsCounter; }
bool isAnotherScreenPlayInstanceRunning() { return m_isAnotherScreenPlayInstanceRunning; }
signals:
void projectSettingsListModelResult(ScreenPlay::ProjectSettingsListModel* li = nullptr);
void activeWallpaperCounterChanged(int activeWallpaperCounter);
void activeWidgetsCounterChanged(int activeWidgetsCounter);
void monitorConfigurationChanged();
void projectSettingsListModelResult(ScreenPlay::ProjectSettingsListModel* li = nullptr);
void requestSaveProfiles();
void requestRaise();
void profilesSaved();
void monitorConfigurationChanged();
void displayErrorPopup(const QString& msg);
private slots:
void saveProfiles();
bool saveProfiles();
public slots:
// moc needs full enum namespace info see QTBUG-58454
void createWallpaper(
bool createWallpaper(
const ScreenPlay::InstalledType::InstalledType type,
const ScreenPlay::FillMode::FillMode fillMode,
const QString& absoluteStoragePath,
@ -115,7 +104,7 @@ public slots:
const QJsonObject& properties,
const bool saveToProfilesConfigFile);
void createWidget(
bool createWidget(
const ScreenPlay::InstalledType::InstalledType type,
const QPoint& position,
const QString& absoluteStoragePath,
@ -123,22 +112,17 @@ public slots:
const QJsonObject& properties,
const bool saveToProfilesConfigFile);
void removeAllWallpapers();
void removeAllWidgets();
bool removeAllWallpapers();
bool removeAllWidgets();
bool removeWallpaperAt(const int index);
bool removeApp(const QString& appID);
void requestProjectSettingsAtMonitorIndex(const int index);
bool requestProjectSettingsAtMonitorIndex(const int index);
bool setWallpaperValueAtMonitorIndex(const int index, const QString& key, const QString& value);
void setAllWallpaperValue(const QString& key, const QString& value);
bool setAllWallpaperValue(const QString& key, const QString& value);
bool setWallpaperValue(const QString& appID, const QString& key, const QString& value);
ScreenPlayWallpaper* getWallpaperByAppID(const QString& appID) const;
void newConnection();
void closeAllWallpapers();
void closeAllWidgets();
bool closeConntectionByType(const QStringList& types);
bool closeConnection(const QString& appID);
void setWallpaperValue(const QString& appID, const QString& key, const QString& value);
void setActiveWallpaperCounter(int activeWallpaperCounter)
{
@ -189,10 +173,10 @@ public slots:
}
private:
void loadProfiles();
bool appConnected(const std::shared_ptr<SDKConnection>& connection);
bool loadProfiles();
bool checkIsAnotherScreenPlayInstanceRunning();
[[nodiscard]] bool removeWallpaperByAppID(const QString& appID);
bool removeWallpaper(const QString& appID);
bool removeWidget(const QString& appID);
private:
std::shared_ptr<GlobalVariables> m_globalVariables;
@ -204,7 +188,8 @@ private:
QVector<std::shared_ptr<ScreenPlayWallpaper>> m_screenPlayWallpapers;
QVector<std::shared_ptr<ScreenPlayWidget>> m_screenPlayWidgets;
QVector<std::shared_ptr<SDKConnection>> m_clients;
std::vector<std::unique_ptr<SDKConnection>> m_unconnectedClients;
int m_activeWallpaperCounter { 0 };
int m_activeWidgetsCounter { 0 };

View File

@ -10,6 +10,15 @@ namespace ScreenPlay {
This class is only for managing the QProcess to an extern ScreenPlayWallpaper!
*/
/*!
\brief Destructor for ScreenPlayWallpaper.
*/
ScreenPlayWallpaper::~ScreenPlayWallpaper()
{
qInfo() << "Remove wallpaper " << m_appID;
m_connection->close();
}
/*!
\brief Constructor for ScreenPlayWallpaper.
*/
@ -77,7 +86,7 @@ ScreenPlayWallpaper::ScreenPlayWallpaper(const QVector<int>& screenNumber,
tmpScreenNumber = QString::number(m_screenNumber.first());
}
const QStringList proArgs {
m_appArgumentsList = QStringList {
tmpScreenNumber,
m_absolutePath,
QString { "appID=" + m_appID },
@ -88,8 +97,11 @@ ScreenPlayWallpaper::ScreenPlayWallpaper(const QVector<int>& screenNumber,
// Fixes issue 84 media key overlay
" --disable-features=HardwareMediaKeyHandling"
};
}
m_process.setArguments(proArgs);
bool ScreenPlayWallpaper::start()
{
m_process.setArguments(m_appArgumentsList);
m_process.setProgram(m_globalVariables->wallpaperExecutablePath().toString());
// We must start detatched otherwise we would instantly close the process
// and would loose the animted fade-out and the background refresh needed
@ -97,10 +109,9 @@ ScreenPlayWallpaper::ScreenPlayWallpaper(const QVector<int>& screenNumber,
const bool success = m_process.startDetached();
qInfo() << "Starting ScreenPlayWallpaper detached: " << (success ? "success" : "failed!");
if (!success) {
qInfo() << m_process.errorString();
emit requestClose(m_appID);
emit error(QString("Could not start Wallpaper: " + m_process.errorString()));
}
return success;
}
/*!
@ -110,7 +121,7 @@ ScreenPlayWallpaper::ScreenPlayWallpaper(const QVector<int>& screenNumber,
QJsonObject ScreenPlayWallpaper::getActiveSettingsJson()
{
QJsonArray screenNumber;
for (const int i : m_screenNumber) {
for (const int i : qAsConst(m_screenNumber)) {
screenNumber.append(i);
}
@ -157,7 +168,7 @@ void ScreenPlayWallpaper::processError(QProcess::ProcessError error)
playbackRate or fillMode. Otherwise it is a simple key, value json pair.
*/
void ScreenPlayWallpaper::setWallpaperValue(const QString& key, const QString& value, const bool save)
bool ScreenPlayWallpaper::setWallpaperValue(const QString& key, const QString& value, const bool save)
{
QJsonObject obj;
obj.insert(key, value);
@ -172,20 +183,23 @@ void ScreenPlayWallpaper::setWallpaperValue(const QString& key, const QString& v
setFillMode(QStringToEnum<FillMode::FillMode>(value, FillMode::FillMode::Cover));
}
m_connection->sendMessage(QJsonDocument(obj).toJson(QJsonDocument::Compact));
const bool success = m_connection->sendMessage(QJsonDocument(obj).toJson(QJsonDocument::Compact));
if (save)
if (save && success)
emit requestSave();
return success;
}
/*!
\brief Connects to ScreenPlay. Start a alive ping check for every 16 seconds.
\brief Connects to ScreenPlay. Start a alive ping check for every
GlobalVariables::contentPingAliveIntervalMS seconds.
*/
void ScreenPlayWallpaper::setSDKConnection(const std::shared_ptr<SDKConnection>& connection)
void ScreenPlayWallpaper::setSDKConnection(std::unique_ptr<SDKConnection> connection)
{
m_connection = connection;
m_connection = std::move(connection);
QTimer::singleShot(1000, [this]() {
QTimer::singleShot(1000, this, [this]() {
if (playbackRate() != 1.0) {
setWallpaperValue("playbackRate", QString::number(playbackRate()), false);
}

View File

@ -68,6 +68,7 @@ class ScreenPlayWallpaper : public QObject {
public:
ScreenPlayWallpaper() { }
~ScreenPlayWallpaper();
explicit ScreenPlayWallpaper(
const QVector<int>& screenNumber,
@ -82,6 +83,8 @@ public:
const bool checkWallpaperVisible,
QObject* parent = nullptr);
bool start();
void replace(
const QString& absolutePath,
const QString& previewImage,
@ -91,64 +94,31 @@ public:
const InstalledType::InstalledType type,
const bool checkWallpaperVisible);
void setSDKConnection(const std::shared_ptr<SDKConnection>& connection);
void setSDKConnection(std::unique_ptr<SDKConnection> connection);
QJsonObject getActiveSettingsJson();
QVector<int> screenNumber() const
{
return m_screenNumber;
}
QVector<int> screenNumber() const { return m_screenNumber; }
QString previewImage() const
{
return m_previewImage;
}
QString previewImage() const { return m_previewImage; }
QString appID() const
{
return m_appID;
}
QString appID() const { return m_appID; }
InstalledType::InstalledType type() const
{
return m_type;
}
InstalledType::InstalledType type() const { return m_type; }
QString file() const
{
return m_file;
}
QString file() const { return m_file; }
FillMode::FillMode fillMode() const
{
return m_fillMode;
}
FillMode::FillMode fillMode() const { return m_fillMode; }
QString absolutePath() const
{
return m_absolutePath;
}
QString absolutePath() const { return m_absolutePath; }
float volume() const
{
return m_volume;
}
float volume() const { return m_volume; }
bool isLooping() const
{
return m_isLooping;
}
bool isLooping() const { return m_isLooping; }
ProjectSettingsListModel* getProjectSettingsListModel()
{
return &m_projectSettingsListModel;
}
ProjectSettingsListModel* getProjectSettingsListModel() { return &m_projectSettingsListModel; }
float playbackRate() const
{
return m_playbackRate;
}
float playbackRate() const { return m_playbackRate; }
signals:
void screenNumberChanged(QVector<int> screenNumber);
@ -170,7 +140,7 @@ signals:
public slots:
void processExit(int exitCode, QProcess::ExitStatus exitStatus);
void processError(QProcess::ProcessError error);
void setWallpaperValue(const QString& key, const QString& value, const bool save = false);
bool setWallpaperValue(const QString& key, const QString& value, const bool save = false);
void setScreenNumber(QVector<int> screenNumber)
{
@ -267,7 +237,7 @@ public slots:
private:
const std::shared_ptr<GlobalVariables> m_globalVariables;
std::shared_ptr<SDKConnection> m_connection;
std::unique_ptr<SDKConnection> m_connection;
ProjectSettingsListModel m_projectSettingsListModel;
QVector<int> m_screenNumber;
@ -282,5 +252,6 @@ private:
bool m_isLooping { true };
float m_playbackRate { 1.0f };
QTimer m_pingAliveTimer;
QStringList m_appArgumentsList;
};
}

View File

@ -48,15 +48,18 @@ ScreenPlayWidget::ScreenPlayWidget(
m_projectSettingsListModel.init(type, projectSettingsListModelProperties);
}
const QStringList proArgs {
m_appArgumentsList = QStringList {
m_absolutePath,
QString { "appID=" + m_appID },
QVariant::fromValue(m_type).toString(),
QString::number(m_position.x()),
QString::number(m_position.y()),
};
}
m_process.setArguments(proArgs);
bool ScreenPlayWidget::start()
{
m_process.setArguments(m_appArgumentsList);
m_process.setProgram(m_globalVariables->widgetExecutablePath().path());
QObject::connect(&m_process, &QProcess::errorOccurred, this, [](QProcess::ProcessError error) {
@ -65,18 +68,18 @@ ScreenPlayWidget::ScreenPlayWidget(
const bool success = m_process.startDetached();
qInfo() << "Starting ScreenPlayWWidget detached: " << (success ? "success" : "failed!");
if (!success) {
qInfo() << m_process.errorString();
emit requestClose(m_appID);
emit error(QString("Could not start Widget: " + m_process.errorString()));
}
return success;
}
/*!
\brief Connects to ScreenPlay. Start a alive ping check for every 16 seconds.
\brief Connects to ScreenPlay. Start a alive ping check for every
GlobalVariables::contentPingAliveIntervalMS seconds.
*/
void ScreenPlayWidget::setSDKConnection(const std::shared_ptr<SDKConnection>& connection)
void ScreenPlayWidget::setSDKConnection(std::unique_ptr<SDKConnection> connection)
{
m_connection = connection;
m_connection = std::move(connection);
qInfo() << "App widget connected!";
QObject::connect(m_connection.get(), &SDKConnection::jsonMessageReceived, this, [this](const QJsonObject obj) {
if (obj.value("messageType") == "positionUpdate") {

View File

@ -48,6 +48,7 @@
#include "sdkconnection.h"
#include <memory>
#include <utility>
namespace ScreenPlay {
@ -68,39 +69,23 @@ public:
const QString& previewImage, const QJsonObject& properties,
const InstalledType::InstalledType type);
bool start();
ScreenPlayWidget() { }
QString previewImage() const
{
return m_previewImage;
}
QString previewImage() const { return m_previewImage; }
QPoint position() const
{
return m_position;
}
QPoint position() const { return m_position; }
QString absolutePath() const
{
return m_absolutePath;
}
QString absolutePath() const { return m_absolutePath; }
QString appID() const
{
return m_appID;
}
QString appID() const { return m_appID; }
InstalledType::InstalledType type() const
{
return m_type;
}
InstalledType::InstalledType type() const { return m_type; }
void setSDKConnection(const std::shared_ptr<SDKConnection>& connection);
void setSDKConnection(std::unique_ptr<SDKConnection> connection);
ProjectSettingsListModel* getProjectSettingsListModel()
{
return &m_projectSettingsListModel;
}
ProjectSettingsListModel* getProjectSettingsListModel() { return &m_projectSettingsListModel; }
public slots:
QJsonObject getActiveSettingsJson();
@ -163,7 +148,7 @@ signals:
private:
const std::shared_ptr<GlobalVariables> m_globalVariables;
std::shared_ptr<SDKConnection> m_connection;
std::unique_ptr<SDKConnection> m_connection;
ProjectSettingsListModel m_projectSettingsListModel;
QProcess m_process;
@ -173,5 +158,6 @@ private:
InstalledType::InstalledType m_type;
QString m_absolutePath;
QTimer m_pingAliveTimer;
QStringList m_appArgumentsList;
};
}

View File

@ -88,37 +88,44 @@ void ScreenPlay::SDKConnection::readyRead()
/*!
\brief Sends a message to the connected socket.
*/
void ScreenPlay::SDKConnection::sendMessage(const QByteArray& message)
bool ScreenPlay::SDKConnection::sendMessage(const QByteArray& message)
{
m_socket->write(message);
m_socket->waitForBytesWritten();
return m_socket->waitForBytesWritten();
}
/*!
\brief Closes the socket connection. Before it explicitly sends a quit command to make sure
the wallpaper closes (fast). This also requestDecreaseWidgetCount() because Widgets.
*/
void ScreenPlay::SDKConnection::close()
bool ScreenPlay::SDKConnection::close()
{
qInfo() << "Close " << m_type << m_appID;
qInfo() << "Close " << m_type << m_appID << m_socket->state();
QJsonObject obj;
obj.insert("command", QJsonValue("quit"));
QByteArray command = QJsonDocument(obj).toJson();
m_socket->write(command);
m_socket->waitForBytesWritten();
if (!m_socket->waitForBytesWritten()) {
qWarning("Faild to send quit command to app");
return false;
}
if (m_socket->state() == QLocalSocket::ConnectedState) {
m_socket->disconnectFromServer();
m_socket->close();
qDebug() << "### Destroy APPID:\t " << m_appID << " State: " << m_socket->state();
qInfo() << "### Destroy APPID:\t " << m_appID << " State: " << m_socket->state();
} else {
qWarning() << "Cannot disconnect app " << m_appID << " with the state:" << m_socket->state();
return false;
}
if (m_type.contains("widget", Qt::CaseInsensitive)) {
emit requestDecreaseWidgetCount();
}
return true;
}
}

View File

@ -72,25 +72,13 @@ public:
*/
explicit SDKConnection(QLocalSocket* socket, QObject* parent = nullptr);
QString appID() const
{
return m_appID;
}
QString appID() const { return m_appID; }
QLocalSocket* socket() const
{
return m_socket;
}
QLocalSocket* socket() const { return m_socket; }
QVector<int> monitor() const
{
return m_monitor;
}
QVector<int> monitor() const { return m_monitor; }
QString type() const
{
return m_type;
}
QString type() const { return m_type; }
signals:
void requestCloseAt(int at);
@ -105,8 +93,8 @@ signals:
public slots:
void readyRead();
void sendMessage(const QByteArray& message);
void close();
bool sendMessage(const QByteArray& message);
bool close();
void setAppID(QString appID)
{

View File

@ -133,84 +133,24 @@ public:
};
Q_ENUM(Theme)
bool offlineMode() const
{
return m_offlineMode;
}
bool offlineMode() const { return m_offlineMode; }
bool getOfflineMode() const { return m_offlineMode; }
bool autostart() const { return m_autostart; }
bool highPriorityStart() const { return m_highPriorityStart; }
QString decoder() const { return m_decoder; }
QString gitBuildHash() const { return m_gitBuildHash; }
bool silentStart() const { return m_silentStart; }
bool anonymousTelemetry() const { return m_anonymousTelemetry; }
bool checkWallpaperVisible() const { return m_checkWallpaperVisible; }
ScreenPlay::FillMode::FillMode videoFillMode() const { return m_videoFillMode; }
Language language() const { return m_language; }
QString font() const { return m_font; }
Theme theme() const { return m_theme; }
bool steamVersion() const { return m_steamVersion; }
DesktopEnvironment desktopEnvironment() const { return m_desktopEnvironment; }
bool getOfflineMode() const
{
return m_offlineMode;
}
bool autostart() const
{
return m_autostart;
}
bool highPriorityStart() const
{
return m_highPriorityStart;
}
QString decoder() const
{
return m_decoder;
}
QString gitBuildHash() const
{
return m_gitBuildHash;
}
bool silentStart() const
{
return m_silentStart;
}
bool anonymousTelemetry() const
{
return m_anonymousTelemetry;
}
bool checkWallpaperVisible() const
{
return m_checkWallpaperVisible;
}
ScreenPlay::FillMode::FillMode videoFillMode() const
{
return m_videoFillMode;
}
Language language() const
{
return m_language;
}
public:
void setupLanguage();
QString font() const
{
return m_font;
}
Theme theme() const
{
return m_theme;
}
bool steamVersion() const
{
return m_steamVersion;
}
DesktopEnvironment desktopEnvironment() const
{
return m_desktopEnvironment;
}
signals:
void requestRetranslation();
void resetInstalledListmodel();

View File

@ -97,31 +97,31 @@
</message>
<message>
<location filename="../qml/Community/Community.qml" line="34"/>
<source>Wiki</source>
<source>News</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="40"/>
<source>Wiki</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="46"/>
<source>Forum</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="45"/>
<location filename="../qml/Community/Community.qml" line="51"/>
<source>Issue List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="50"/>
<source>Release Notes</source>
<location filename="../qml/Community/Community.qml" line="56"/>
<source>Contribute</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="55"/>
<source>Contribution Guide</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="60"/>
<location filename="../qml/Community/Community.qml" line="61"/>
<source>Steam Workshop</source>
<translation type="unfinished"></translation>
</message>
@ -1168,25 +1168,35 @@ wenn Sie ScreenPlay über Steam! installiert haben
<context>
<name>Navigation</name>
<message>
<location filename="../qml/Installed/Navigation.qml" line="56"/>
<location filename="../qml/Installed/Navigation.qml" line="57"/>
<source>All</source>
<translation type="unfinished">Alles</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="72"/>
<location filename="../qml/Installed/Navigation.qml" line="73"/>
<source>Scenes</source>
<translation type="unfinished">Szenen</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="88"/>
<location filename="../qml/Installed/Navigation.qml" line="89"/>
<source>Videos</source>
<translation type="unfinished">Videos</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="104"/>
<location filename="../qml/Installed/Navigation.qml" line="105"/>
<source>Widgets</source>
<translation type="unfinished">Widgets</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Ascending</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Descending</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Navigation.qml" line="35"/>
<source> Subscribed items: </source>
@ -1488,7 +1498,7 @@ wenn Sie ScreenPlay über Steam! installiert haben
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="450"/>
<location filename="../qml/Settings/Settings.qml" line="455"/>
<source>Logs</source>
<translation type="unfinished"></translation>
</message>
@ -1556,32 +1566,32 @@ wenn Sie ScreenPlay über Steam! installiert haben
<translation type="unfinished">Moin, ich bin Elias Steurer, auch bekannt als Kelteseth und ich bin der Entwickler von ScreenPlay. Danke, dass du meine Software nutzt. Du kannst mir hier folgen, um Updates über ScreenPlay zu erhalten:</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="420"/>
<location filename="../qml/Settings/Settings.qml" line="425"/>
<source>Version</source>
<translation type="unfinished">Version</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="421"/>
<location filename="../qml/Settings/Settings.qml" line="426"/>
<source>ScreenPlay Build Version </source>
<translation type="unfinished">ScreenPlay-Build-Version </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="423"/>
<location filename="../qml/Settings/Settings.qml" line="428"/>
<source>Open Changelog</source>
<translation type="unfinished">Changelog öffnen</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="430"/>
<location filename="../qml/Settings/Settings.qml" line="435"/>
<source>Third Party Software</source>
<translation type="unfinished">Software von Drittanbietern</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="431"/>
<location filename="../qml/Settings/Settings.qml" line="436"/>
<source>ScreenPlay would not be possible without the work of others. A big thank you to: </source>
<translation type="unfinished">ScreenPlay wäre ohne die Arbeit anderer nicht möglich. Ein großes Dankeschön dafür geht an: </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="432"/>
<location filename="../qml/Settings/Settings.qml" line="437"/>
<source>Licenses</source>
<translation type="unfinished">Lizenzen</translation>
</message>
@ -1590,27 +1600,27 @@ wenn Sie ScreenPlay über Steam! installiert haben
<translation type="obsolete">Debugging-Meldungen</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="451"/>
<location filename="../qml/Settings/Settings.qml" line="456"/>
<source>If your ScreenPlay missbehaves this is a good way to look for answers. This shows all logs and warning during runtime.</source>
<translation type="unfinished">Wenn den ScreenPlay sich falsch verhält, ist hier eine gute Möglichkeit, nach Antworten zu suchen. Hier werden alle Protokolle und Warnungen während der Laufzeit angezeigt.</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="452"/>
<location filename="../qml/Settings/Settings.qml" line="457"/>
<source>Show Logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="463"/>
<location filename="../qml/Settings/Settings.qml" line="468"/>
<source>Data Protection</source>
<translation type="unfinished">Datenschutz</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="464"/>
<location filename="../qml/Settings/Settings.qml" line="469"/>
<source>We use you data very carefully to improve ScreenPlay. We do not sell or share this (anonymous) information with others!</source>
<translation type="unfinished">Wir verwenden deine Daten sehr sorgfältig, um ScreenPlay zu verbessern. Wir verkaufen oder teilen diese (anonymen) Informationen nicht mit anderen!</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="465"/>
<location filename="../qml/Settings/Settings.qml" line="470"/>
<source>Privacy</source>
<translation type="unfinished">Datenschutz</translation>
</message>
@ -1693,52 +1703,47 @@ wenn Sie ScreenPlay über Steam! installiert haben
<translation type="obsolete">Wallpaper erstellen</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<source>Project size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source> MB</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="99"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source>Size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="115"/>
<source>No description...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="243"/>
<location filename="../qml/Workshop/Sidebar.qml" line="259"/>
<source>Click here if you like the content</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="256"/>
<location filename="../qml/Workshop/Sidebar.qml" line="272"/>
<source>Click here if you do not like the content</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="291"/>
<source>Tags: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="308"/>
<location filename="../qml/Workshop/Sidebar.qml" line="327"/>
<source>Subscribtions: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="317"/>
<location filename="../qml/Workshop/Sidebar.qml" line="381"/>
<source>Open In Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribe</source>
<translation type="unfinished"></translation>
</message>
@ -2558,105 +2563,115 @@ wenn Sie ScreenPlay über Steam! installiert haben
<context>
<name>Workshop</name>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="164"/>
<location filename="../qml/Workshop/Workshop.qml" line="183"/>
<source>Loading</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="175"/>
<location filename="../qml/Workshop/Workshop.qml" line="194"/>
<source>Download now!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="180"/>
<location filename="../qml/Workshop/Workshop.qml" line="199"/>
<source>Downloading...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="187"/>
<location filename="../qml/Workshop/Workshop.qml" line="206"/>
<source>Details</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="211"/>
<location filename="../qml/Workshop/Workshop.qml" line="230"/>
<source>Open In Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="272"/>
<location filename="../qml/Workshop/Workshop.qml" line="294"/>
<source>Search for Wallpaper and Widgets...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="293"/>
<location filename="../qml/Workshop/Workshop.qml" line="342"/>
<source>Open Workshop in Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="303"/>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<source>Open GameHub in Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="335"/>
<location filename="../qml/Workshop/Workshop.qml" line="386"/>
<source>Ranked By Vote</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="338"/>
<location filename="../qml/Workshop/Workshop.qml" line="389"/>
<source>Publication Date</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="341"/>
<location filename="../qml/Workshop/Workshop.qml" line="392"/>
<source>Ranked By Trend</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="344"/>
<location filename="../qml/Workshop/Workshop.qml" line="395"/>
<source>Favorited By Friends</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="347"/>
<location filename="../qml/Workshop/Workshop.qml" line="398"/>
<source>Created By Friends</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="350"/>
<location filename="../qml/Workshop/Workshop.qml" line="401"/>
<source>Created By Followed Users</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<location filename="../qml/Workshop/Workshop.qml" line="404"/>
<source>Not Yet Rated</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="356"/>
<location filename="../qml/Workshop/Workshop.qml" line="407"/>
<source>Total VotesAsc</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="359"/>
<location filename="../qml/Workshop/Workshop.qml" line="410"/>
<source>Votes Up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="362"/>
<location filename="../qml/Workshop/Workshop.qml" line="413"/>
<source>Total Unique Subscriptions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="451"/>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="471"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WorkshopItem</name>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="286"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="257"/>
<source>Successfully subscribed to Workshop Item!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="381"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="352"/>
<source>Download complete!</source>
<translation type="unfinished"></translation>
</message>
@ -2664,7 +2679,7 @@ wenn Sie ScreenPlay über Steam! installiert haben
<context>
<name>XMLNewsfeed</name>
<message>
<location filename="../qml/Community/XMLNewsfeed.qml" line="53"/>
<location filename="../qml/Community/XMLNewsfeed.qml" line="62"/>
<source>News &amp; Patchnotes</source>
<translation type="unfinished">Neuigkeiten &amp; Patchnotes</translation>
</message>

View File

@ -73,31 +73,31 @@
<name>Community</name>
<message>
<location filename="../qml/Community/Community.qml" line="34"/>
<source>Wiki</source>
<source>News</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="40"/>
<source>Wiki</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="46"/>
<source>Forum</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="45"/>
<location filename="../qml/Community/Community.qml" line="51"/>
<source>Issue List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="50"/>
<source>Release Notes</source>
<location filename="../qml/Community/Community.qml" line="56"/>
<source>Contribute</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="55"/>
<source>Contribution Guide</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="60"/>
<location filename="../qml/Community/Community.qml" line="61"/>
<source>Steam Workshop</source>
<translation type="unfinished"></translation>
</message>
@ -766,25 +766,35 @@
<context>
<name>Navigation</name>
<message>
<location filename="../qml/Installed/Navigation.qml" line="56"/>
<location filename="../qml/Installed/Navigation.qml" line="57"/>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="72"/>
<location filename="../qml/Installed/Navigation.qml" line="73"/>
<source>Scenes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="88"/>
<location filename="../qml/Installed/Navigation.qml" line="89"/>
<source>Videos</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="104"/>
<location filename="../qml/Installed/Navigation.qml" line="105"/>
<source>Widgets</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Ascending</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Descending</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Navigation.qml" line="35"/>
<source> Subscribed items: </source>
@ -1130,62 +1140,62 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="420"/>
<location filename="../qml/Settings/Settings.qml" line="425"/>
<source>Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="421"/>
<location filename="../qml/Settings/Settings.qml" line="426"/>
<source>ScreenPlay Build Version </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="423"/>
<location filename="../qml/Settings/Settings.qml" line="428"/>
<source>Open Changelog</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="430"/>
<location filename="../qml/Settings/Settings.qml" line="435"/>
<source>Third Party Software</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="431"/>
<location filename="../qml/Settings/Settings.qml" line="436"/>
<source>ScreenPlay would not be possible without the work of others. A big thank you to: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="432"/>
<location filename="../qml/Settings/Settings.qml" line="437"/>
<source>Licenses</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="450"/>
<location filename="../qml/Settings/Settings.qml" line="455"/>
<source>Logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="451"/>
<location filename="../qml/Settings/Settings.qml" line="456"/>
<source>If your ScreenPlay missbehaves this is a good way to look for answers. This shows all logs and warning during runtime.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="452"/>
<location filename="../qml/Settings/Settings.qml" line="457"/>
<source>Show Logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="463"/>
<location filename="../qml/Settings/Settings.qml" line="468"/>
<source>Data Protection</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="464"/>
<location filename="../qml/Settings/Settings.qml" line="469"/>
<source>We use you data very carefully to improve ScreenPlay. We do not sell or share this (anonymous) information with others!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="465"/>
<location filename="../qml/Settings/Settings.qml" line="470"/>
<source>Privacy</source>
<translation type="unfinished"></translation>
</message>
@ -1256,52 +1266,47 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<source>Project size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source> MB</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="99"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source>Size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="115"/>
<source>No description...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="243"/>
<location filename="../qml/Workshop/Sidebar.qml" line="259"/>
<source>Click here if you like the content</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="256"/>
<location filename="../qml/Workshop/Sidebar.qml" line="272"/>
<source>Click here if you do not like the content</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="291"/>
<source>Tags: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="308"/>
<location filename="../qml/Workshop/Sidebar.qml" line="327"/>
<source>Subscribtions: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="317"/>
<location filename="../qml/Workshop/Sidebar.qml" line="381"/>
<source>Open In Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribe</source>
<translation type="unfinished"></translation>
</message>
@ -2121,105 +2126,115 @@
<context>
<name>Workshop</name>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="164"/>
<location filename="../qml/Workshop/Workshop.qml" line="183"/>
<source>Loading</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="175"/>
<location filename="../qml/Workshop/Workshop.qml" line="194"/>
<source>Download now!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="180"/>
<location filename="../qml/Workshop/Workshop.qml" line="199"/>
<source>Downloading...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="187"/>
<location filename="../qml/Workshop/Workshop.qml" line="206"/>
<source>Details</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="211"/>
<location filename="../qml/Workshop/Workshop.qml" line="230"/>
<source>Open In Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="272"/>
<location filename="../qml/Workshop/Workshop.qml" line="294"/>
<source>Search for Wallpaper and Widgets...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="293"/>
<location filename="../qml/Workshop/Workshop.qml" line="342"/>
<source>Open Workshop in Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="303"/>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<source>Open GameHub in Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="335"/>
<location filename="../qml/Workshop/Workshop.qml" line="386"/>
<source>Ranked By Vote</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="338"/>
<location filename="../qml/Workshop/Workshop.qml" line="389"/>
<source>Publication Date</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="341"/>
<location filename="../qml/Workshop/Workshop.qml" line="392"/>
<source>Ranked By Trend</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="344"/>
<location filename="../qml/Workshop/Workshop.qml" line="395"/>
<source>Favorited By Friends</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="347"/>
<location filename="../qml/Workshop/Workshop.qml" line="398"/>
<source>Created By Friends</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="350"/>
<location filename="../qml/Workshop/Workshop.qml" line="401"/>
<source>Created By Followed Users</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<location filename="../qml/Workshop/Workshop.qml" line="404"/>
<source>Not Yet Rated</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="356"/>
<location filename="../qml/Workshop/Workshop.qml" line="407"/>
<source>Total VotesAsc</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="359"/>
<location filename="../qml/Workshop/Workshop.qml" line="410"/>
<source>Votes Up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="362"/>
<location filename="../qml/Workshop/Workshop.qml" line="413"/>
<source>Total Unique Subscriptions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="451"/>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="471"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WorkshopItem</name>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="286"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="257"/>
<source>Successfully subscribed to Workshop Item!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="381"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="352"/>
<source>Download complete!</source>
<translation type="unfinished"></translation>
</message>
@ -2227,7 +2242,7 @@
<context>
<name>XMLNewsfeed</name>
<message>
<location filename="../qml/Community/XMLNewsfeed.qml" line="53"/>
<location filename="../qml/Community/XMLNewsfeed.qml" line="62"/>
<source>News &amp; Patchnotes</source>
<translation type="unfinished"></translation>
</message>

View File

@ -97,31 +97,31 @@
</message>
<message>
<location filename="../qml/Community/Community.qml" line="34"/>
<source>Wiki</source>
<source>News</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="40"/>
<source>Wiki</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="46"/>
<source>Forum</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="45"/>
<location filename="../qml/Community/Community.qml" line="51"/>
<source>Issue List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="50"/>
<source>Release Notes</source>
<location filename="../qml/Community/Community.qml" line="56"/>
<source>Contribute</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="55"/>
<source>Contribution Guide</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="60"/>
<location filename="../qml/Community/Community.qml" line="61"/>
<source>Steam Workshop</source>
<translation type="unfinished"></translation>
</message>
@ -1148,25 +1148,35 @@ si instaló ScreenPlay vía Steam!
<context>
<name>Navigation</name>
<message>
<location filename="../qml/Installed/Navigation.qml" line="56"/>
<location filename="../qml/Installed/Navigation.qml" line="57"/>
<source>All</source>
<translation type="unfinished">Todos</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="72"/>
<location filename="../qml/Installed/Navigation.qml" line="73"/>
<source>Scenes</source>
<translation type="unfinished">Escenas</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="88"/>
<location filename="../qml/Installed/Navigation.qml" line="89"/>
<source>Videos</source>
<translation type="unfinished">Videos</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="104"/>
<location filename="../qml/Installed/Navigation.qml" line="105"/>
<source>Widgets</source>
<translation type="unfinished">Widgets</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Ascending</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Descending</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Navigation.qml" line="35"/>
<source> Subscribed items: </source>
@ -1468,7 +1478,7 @@ si instaló ScreenPlay vía Steam!
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="450"/>
<location filename="../qml/Settings/Settings.qml" line="455"/>
<source>Logs</source>
<translation type="unfinished"></translation>
</message>
@ -1536,32 +1546,32 @@ si instaló ScreenPlay vía Steam!
<translation type="unfinished">Hola, soy Elias Steurer también conocido como Kelteseth y soy el desarrollador de ScreenPlay. Gracias por usar mi software. Puedes seguirme para recibir actualizaciones sobre ScreenPlay aquí:</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="420"/>
<location filename="../qml/Settings/Settings.qml" line="425"/>
<source>Version</source>
<translation type="unfinished">Versión</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="421"/>
<location filename="../qml/Settings/Settings.qml" line="426"/>
<source>ScreenPlay Build Version </source>
<translation type="unfinished">Versión de construcción de ScreenPlay </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="423"/>
<location filename="../qml/Settings/Settings.qml" line="428"/>
<source>Open Changelog</source>
<translation type="unfinished">Registro de cambios abierto</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="430"/>
<location filename="../qml/Settings/Settings.qml" line="435"/>
<source>Third Party Software</source>
<translation type="unfinished">Software de terceros</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="431"/>
<location filename="../qml/Settings/Settings.qml" line="436"/>
<source>ScreenPlay would not be possible without the work of others. A big thank you to: </source>
<translation type="unfinished">ScreenPlay no sería posible sin el trabajo de otros. Muchas gracias a todos: </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="432"/>
<location filename="../qml/Settings/Settings.qml" line="437"/>
<source>Licenses</source>
<translation type="unfinished">Licencias</translation>
</message>
@ -1570,27 +1580,27 @@ si instaló ScreenPlay vía Steam!
<translation type="obsolete">Mensajes de depuración</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="451"/>
<location filename="../qml/Settings/Settings.qml" line="456"/>
<source>If your ScreenPlay missbehaves this is a good way to look for answers. This shows all logs and warning during runtime.</source>
<translation type="unfinished">Si su ScreenPlay se comporta mal, esta es una buena manera de buscar respuestas. Esto muestra todos los registros y advertencias durante el tiempo de ejecución.</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="452"/>
<location filename="../qml/Settings/Settings.qml" line="457"/>
<source>Show Logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="463"/>
<location filename="../qml/Settings/Settings.qml" line="468"/>
<source>Data Protection</source>
<translation type="unfinished">Protección de datos</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="464"/>
<location filename="../qml/Settings/Settings.qml" line="469"/>
<source>We use you data very carefully to improve ScreenPlay. We do not sell or share this (anonymous) information with others!</source>
<translation type="unfinished">Utilizamos sus datos con mucho cuidado para mejorar ScreenPlay. No vendemos ni compartimos esta información (anónima) con otros!</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="465"/>
<location filename="../qml/Settings/Settings.qml" line="470"/>
<source>Privacy</source>
<translation type="unfinished">Privacidad</translation>
</message>
@ -1673,52 +1683,47 @@ si instaló ScreenPlay vía Steam!
<translation type="obsolete">Crear un wallpaper</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<source>Project size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source> MB</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="99"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source>Size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="115"/>
<source>No description...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="243"/>
<location filename="../qml/Workshop/Sidebar.qml" line="259"/>
<source>Click here if you like the content</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="256"/>
<location filename="../qml/Workshop/Sidebar.qml" line="272"/>
<source>Click here if you do not like the content</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="291"/>
<source>Tags: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="308"/>
<location filename="../qml/Workshop/Sidebar.qml" line="327"/>
<source>Subscribtions: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="317"/>
<location filename="../qml/Workshop/Sidebar.qml" line="381"/>
<source>Open In Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribe</source>
<translation type="unfinished"></translation>
</message>
@ -2538,105 +2543,115 @@ si instaló ScreenPlay vía Steam!
<context>
<name>Workshop</name>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="164"/>
<location filename="../qml/Workshop/Workshop.qml" line="183"/>
<source>Loading</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="175"/>
<location filename="../qml/Workshop/Workshop.qml" line="194"/>
<source>Download now!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="180"/>
<location filename="../qml/Workshop/Workshop.qml" line="199"/>
<source>Downloading...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="187"/>
<location filename="../qml/Workshop/Workshop.qml" line="206"/>
<source>Details</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="211"/>
<location filename="../qml/Workshop/Workshop.qml" line="230"/>
<source>Open In Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="272"/>
<location filename="../qml/Workshop/Workshop.qml" line="294"/>
<source>Search for Wallpaper and Widgets...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="293"/>
<location filename="../qml/Workshop/Workshop.qml" line="342"/>
<source>Open Workshop in Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="303"/>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<source>Open GameHub in Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="335"/>
<location filename="../qml/Workshop/Workshop.qml" line="386"/>
<source>Ranked By Vote</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="338"/>
<location filename="../qml/Workshop/Workshop.qml" line="389"/>
<source>Publication Date</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="341"/>
<location filename="../qml/Workshop/Workshop.qml" line="392"/>
<source>Ranked By Trend</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="344"/>
<location filename="../qml/Workshop/Workshop.qml" line="395"/>
<source>Favorited By Friends</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="347"/>
<location filename="../qml/Workshop/Workshop.qml" line="398"/>
<source>Created By Friends</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="350"/>
<location filename="../qml/Workshop/Workshop.qml" line="401"/>
<source>Created By Followed Users</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<location filename="../qml/Workshop/Workshop.qml" line="404"/>
<source>Not Yet Rated</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="356"/>
<location filename="../qml/Workshop/Workshop.qml" line="407"/>
<source>Total VotesAsc</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="359"/>
<location filename="../qml/Workshop/Workshop.qml" line="410"/>
<source>Votes Up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="362"/>
<location filename="../qml/Workshop/Workshop.qml" line="413"/>
<source>Total Unique Subscriptions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="451"/>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="471"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WorkshopItem</name>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="286"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="257"/>
<source>Successfully subscribed to Workshop Item!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="381"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="352"/>
<source>Download complete!</source>
<translation type="unfinished"></translation>
</message>
@ -2644,7 +2659,7 @@ si instaló ScreenPlay vía Steam!
<context>
<name>XMLNewsfeed</name>
<message>
<location filename="../qml/Community/XMLNewsfeed.qml" line="53"/>
<location filename="../qml/Community/XMLNewsfeed.qml" line="62"/>
<source>News &amp; Patchnotes</source>
<translation type="unfinished"></translation>
</message>

View File

@ -97,31 +97,31 @@
</message>
<message>
<location filename="../qml/Community/Community.qml" line="34"/>
<source>Wiki</source>
<source>News</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="40"/>
<source>Wiki</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="46"/>
<source>Forum</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="45"/>
<location filename="../qml/Community/Community.qml" line="51"/>
<source>Issue List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="50"/>
<source>Release Notes</source>
<location filename="../qml/Community/Community.qml" line="56"/>
<source>Contribute</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="55"/>
<source>Contribution Guide</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="60"/>
<location filename="../qml/Community/Community.qml" line="61"/>
<source>Steam Workshop</source>
<translation type="unfinished"></translation>
</message>
@ -1158,25 +1158,35 @@ si vous avez installé ScreenPlay via Steam !
<context>
<name>Navigation</name>
<message>
<location filename="../qml/Installed/Navigation.qml" line="56"/>
<location filename="../qml/Installed/Navigation.qml" line="57"/>
<source>All</source>
<translation type="unfinished">Tout</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="72"/>
<location filename="../qml/Installed/Navigation.qml" line="73"/>
<source>Scenes</source>
<translation type="unfinished">Scènes</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="88"/>
<location filename="../qml/Installed/Navigation.qml" line="89"/>
<source>Videos</source>
<translation type="unfinished">Vidéos</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="104"/>
<location filename="../qml/Installed/Navigation.qml" line="105"/>
<source>Widgets</source>
<translation type="unfinished">Widgets</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Ascending</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Descending</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Navigation.qml" line="35"/>
<source> Subscribed items: </source>
@ -1545,37 +1555,37 @@ si vous avez installé ScreenPlay via Steam !
<translation type="unfinished">Bonjour, je suis Elias Steurer, aussi connu sous le nom de Kelteseth, et je suis le développeur de ScreenPlay. Merci d&apos;utiliser mon logiciel. Vous pouvez me suivre pour recevoir des mises à jour sur ScreenPlay ici :</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="420"/>
<location filename="../qml/Settings/Settings.qml" line="425"/>
<source>Version</source>
<translation type="unfinished">Version</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="421"/>
<location filename="../qml/Settings/Settings.qml" line="426"/>
<source>ScreenPlay Build Version </source>
<translation type="unfinished">Version de construction de ScreenPlay </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="423"/>
<location filename="../qml/Settings/Settings.qml" line="428"/>
<source>Open Changelog</source>
<translation type="unfinished">Ouvrir le journal des modifications</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="430"/>
<location filename="../qml/Settings/Settings.qml" line="435"/>
<source>Third Party Software</source>
<translation type="unfinished">Logiciel tiers</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="431"/>
<location filename="../qml/Settings/Settings.qml" line="436"/>
<source>ScreenPlay would not be possible without the work of others. A big thank you to: </source>
<translation type="unfinished">ScreenPlay ne serait pas possible sans le travail des autres. Un grand merci à : </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="432"/>
<location filename="../qml/Settings/Settings.qml" line="437"/>
<source>Licenses</source>
<translation type="unfinished">Licences</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="450"/>
<location filename="../qml/Settings/Settings.qml" line="455"/>
<source>Logs</source>
<translation type="unfinished"></translation>
</message>
@ -1584,27 +1594,27 @@ si vous avez installé ScreenPlay via Steam !
<translation type="obsolete">Messages de débogage</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="451"/>
<location filename="../qml/Settings/Settings.qml" line="456"/>
<source>If your ScreenPlay missbehaves this is a good way to look for answers. This shows all logs and warning during runtime.</source>
<translation type="unfinished">Si votre ScreenPlay se comporte mal, c&apos;est une bonne façon de chercher des réponses. Ceci montre tous les journaux et les avertissements pendant l&apos;exécution.</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="452"/>
<location filename="../qml/Settings/Settings.qml" line="457"/>
<source>Show Logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="463"/>
<location filename="../qml/Settings/Settings.qml" line="468"/>
<source>Data Protection</source>
<translation type="unfinished">Protection des données</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="464"/>
<location filename="../qml/Settings/Settings.qml" line="469"/>
<source>We use you data very carefully to improve ScreenPlay. We do not sell or share this (anonymous) information with others!</source>
<translation type="unfinished">Nous utilisons vos données avec beaucoup de soin pour améliorer le ScreenPlay. Nous ne vendons ni ne partageons ces informations (anonymes) avec d&apos;autres personnes !</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="465"/>
<location filename="../qml/Settings/Settings.qml" line="470"/>
<source>Privacy</source>
<translation type="unfinished">Confidentialité</translation>
</message>
@ -1687,52 +1697,47 @@ si vous avez installé ScreenPlay via Steam !
<translation type="obsolete">Créer un wallpaper</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<source>Project size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source> MB</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="99"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source>Size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="115"/>
<source>No description...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="243"/>
<location filename="../qml/Workshop/Sidebar.qml" line="259"/>
<source>Click here if you like the content</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="256"/>
<location filename="../qml/Workshop/Sidebar.qml" line="272"/>
<source>Click here if you do not like the content</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="291"/>
<source>Tags: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="308"/>
<location filename="../qml/Workshop/Sidebar.qml" line="327"/>
<source>Subscribtions: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="317"/>
<location filename="../qml/Workshop/Sidebar.qml" line="381"/>
<source>Open In Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribe</source>
<translation type="unfinished"></translation>
</message>
@ -2552,105 +2557,115 @@ si vous avez installé ScreenPlay via Steam !
<context>
<name>Workshop</name>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="164"/>
<location filename="../qml/Workshop/Workshop.qml" line="183"/>
<source>Loading</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="175"/>
<location filename="../qml/Workshop/Workshop.qml" line="194"/>
<source>Download now!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="180"/>
<location filename="../qml/Workshop/Workshop.qml" line="199"/>
<source>Downloading...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="187"/>
<location filename="../qml/Workshop/Workshop.qml" line="206"/>
<source>Details</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="211"/>
<location filename="../qml/Workshop/Workshop.qml" line="230"/>
<source>Open In Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="272"/>
<location filename="../qml/Workshop/Workshop.qml" line="294"/>
<source>Search for Wallpaper and Widgets...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="293"/>
<location filename="../qml/Workshop/Workshop.qml" line="342"/>
<source>Open Workshop in Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="303"/>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<source>Open GameHub in Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="335"/>
<location filename="../qml/Workshop/Workshop.qml" line="386"/>
<source>Ranked By Vote</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="338"/>
<location filename="../qml/Workshop/Workshop.qml" line="389"/>
<source>Publication Date</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="341"/>
<location filename="../qml/Workshop/Workshop.qml" line="392"/>
<source>Ranked By Trend</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="344"/>
<location filename="../qml/Workshop/Workshop.qml" line="395"/>
<source>Favorited By Friends</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="347"/>
<location filename="../qml/Workshop/Workshop.qml" line="398"/>
<source>Created By Friends</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="350"/>
<location filename="../qml/Workshop/Workshop.qml" line="401"/>
<source>Created By Followed Users</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<location filename="../qml/Workshop/Workshop.qml" line="404"/>
<source>Not Yet Rated</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="356"/>
<location filename="../qml/Workshop/Workshop.qml" line="407"/>
<source>Total VotesAsc</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="359"/>
<location filename="../qml/Workshop/Workshop.qml" line="410"/>
<source>Votes Up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="362"/>
<location filename="../qml/Workshop/Workshop.qml" line="413"/>
<source>Total Unique Subscriptions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="451"/>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="471"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WorkshopItem</name>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="286"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="257"/>
<source>Successfully subscribed to Workshop Item!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="381"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="352"/>
<source>Download complete!</source>
<translation type="unfinished"></translation>
</message>
@ -2658,7 +2673,7 @@ si vous avez installé ScreenPlay via Steam !
<context>
<name>XMLNewsfeed</name>
<message>
<location filename="../qml/Community/XMLNewsfeed.qml" line="53"/>
<location filename="../qml/Community/XMLNewsfeed.qml" line="62"/>
<source>News &amp; Patchnotes</source>
<translation type="unfinished">Nouveautées et notes de versions</translation>
</message>

View File

@ -97,31 +97,31 @@
</message>
<message>
<location filename="../qml/Community/Community.qml" line="34"/>
<source>Wiki</source>
<source>News</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="40"/>
<source>Wiki</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="46"/>
<source>Forum</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="45"/>
<location filename="../qml/Community/Community.qml" line="51"/>
<source>Issue List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="50"/>
<source>Release Notes</source>
<location filename="../qml/Community/Community.qml" line="56"/>
<source>Contribute</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="55"/>
<source>Contribution Guide</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="60"/>
<location filename="../qml/Community/Community.qml" line="61"/>
<source>Steam Workshop</source>
<translation type="unfinished"></translation>
</message>
@ -1085,25 +1085,35 @@ Steam을 통해 설치하셨을때의 기본 위치입니다!
<context>
<name>Navigation</name>
<message>
<location filename="../qml/Installed/Navigation.qml" line="56"/>
<location filename="../qml/Installed/Navigation.qml" line="57"/>
<source>All</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="72"/>
<location filename="../qml/Installed/Navigation.qml" line="73"/>
<source>Scenes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="88"/>
<location filename="../qml/Installed/Navigation.qml" line="89"/>
<source>Videos</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="104"/>
<location filename="../qml/Installed/Navigation.qml" line="105"/>
<source>Widgets</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Ascending</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Descending</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Navigation.qml" line="35"/>
<source> Subscribed items: </source>
@ -1405,7 +1415,7 @@ Steam을 통해 설치하셨을때의 기본 위치입니다!
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="450"/>
<location filename="../qml/Settings/Settings.qml" line="455"/>
<source>Logs</source>
<translation type="unfinished"></translation>
</message>
@ -1473,32 +1483,32 @@ Steam을 통해 설치하셨을때의 기본 위치입니다!
<translation>, ScreenPlay를 , Kelteseth Elias Steurer입니다. . ScreenPlay의 :</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="420"/>
<location filename="../qml/Settings/Settings.qml" line="425"/>
<source>Version</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="421"/>
<location filename="../qml/Settings/Settings.qml" line="426"/>
<source>ScreenPlay Build Version </source>
<translation>ScreenPlay </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="423"/>
<location filename="../qml/Settings/Settings.qml" line="428"/>
<source>Open Changelog</source>
<translation> </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="430"/>
<location filename="../qml/Settings/Settings.qml" line="435"/>
<source>Third Party Software</source>
<translation> </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="431"/>
<location filename="../qml/Settings/Settings.qml" line="436"/>
<source>ScreenPlay would not be possible without the work of others. A big thank you to: </source>
<translation>ScreenPlay . : </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="432"/>
<location filename="../qml/Settings/Settings.qml" line="437"/>
<source>Licenses</source>
<translation></translation>
</message>
@ -1507,27 +1517,27 @@ Steam을 통해 설치하셨을때의 기본 위치입니다!
<translation type="vanished"> </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="451"/>
<location filename="../qml/Settings/Settings.qml" line="456"/>
<source>If your ScreenPlay missbehaves this is a good way to look for answers. This shows all logs and warning during runtime.</source>
<translation>ScreenPlay가 , . .</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="452"/>
<location filename="../qml/Settings/Settings.qml" line="457"/>
<source>Show Logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="463"/>
<location filename="../qml/Settings/Settings.qml" line="468"/>
<source>Data Protection</source>
<translation> </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="464"/>
<location filename="../qml/Settings/Settings.qml" line="469"/>
<source>We use you data very carefully to improve ScreenPlay. We do not sell or share this (anonymous) information with others!</source>
<translation>ScreenPlay . !</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="465"/>
<location filename="../qml/Settings/Settings.qml" line="470"/>
<source>Privacy</source>
<translation> </translation>
</message>
@ -1610,52 +1620,47 @@ Steam을 통해 설치하셨을때의 기본 위치입니다!
<translation type="vanished"> </translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<source>Project size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source> MB</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="99"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source>Size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="115"/>
<source>No description...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="243"/>
<location filename="../qml/Workshop/Sidebar.qml" line="259"/>
<source>Click here if you like the content</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="256"/>
<location filename="../qml/Workshop/Sidebar.qml" line="272"/>
<source>Click here if you do not like the content</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="291"/>
<source>Tags: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="308"/>
<location filename="../qml/Workshop/Sidebar.qml" line="327"/>
<source>Subscribtions: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="317"/>
<location filename="../qml/Workshop/Sidebar.qml" line="381"/>
<source>Open In Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribe</source>
<translation type="unfinished"></translation>
</message>
@ -2475,105 +2480,115 @@ Steam을 통해 설치하셨을때의 기본 위치입니다!
<context>
<name>Workshop</name>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="164"/>
<location filename="../qml/Workshop/Workshop.qml" line="183"/>
<source>Loading</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="175"/>
<location filename="../qml/Workshop/Workshop.qml" line="194"/>
<source>Download now!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="180"/>
<location filename="../qml/Workshop/Workshop.qml" line="199"/>
<source>Downloading...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="187"/>
<location filename="../qml/Workshop/Workshop.qml" line="206"/>
<source>Details</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="211"/>
<location filename="../qml/Workshop/Workshop.qml" line="230"/>
<source>Open In Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="272"/>
<location filename="../qml/Workshop/Workshop.qml" line="294"/>
<source>Search for Wallpaper and Widgets...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="293"/>
<location filename="../qml/Workshop/Workshop.qml" line="342"/>
<source>Open Workshop in Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="303"/>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<source>Open GameHub in Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="335"/>
<location filename="../qml/Workshop/Workshop.qml" line="386"/>
<source>Ranked By Vote</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="338"/>
<location filename="../qml/Workshop/Workshop.qml" line="389"/>
<source>Publication Date</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="341"/>
<location filename="../qml/Workshop/Workshop.qml" line="392"/>
<source>Ranked By Trend</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="344"/>
<location filename="../qml/Workshop/Workshop.qml" line="395"/>
<source>Favorited By Friends</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="347"/>
<location filename="../qml/Workshop/Workshop.qml" line="398"/>
<source>Created By Friends</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="350"/>
<location filename="../qml/Workshop/Workshop.qml" line="401"/>
<source>Created By Followed Users</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<location filename="../qml/Workshop/Workshop.qml" line="404"/>
<source>Not Yet Rated</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="356"/>
<location filename="../qml/Workshop/Workshop.qml" line="407"/>
<source>Total VotesAsc</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="359"/>
<location filename="../qml/Workshop/Workshop.qml" line="410"/>
<source>Votes Up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="362"/>
<location filename="../qml/Workshop/Workshop.qml" line="413"/>
<source>Total Unique Subscriptions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="451"/>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="471"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WorkshopItem</name>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="286"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="257"/>
<source>Successfully subscribed to Workshop Item!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="381"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="352"/>
<source>Download complete!</source>
<translation type="unfinished"></translation>
</message>
@ -2581,7 +2596,7 @@ Steam을 통해 설치하셨을때의 기본 위치입니다!
<context>
<name>XMLNewsfeed</name>
<message>
<location filename="../qml/Community/XMLNewsfeed.qml" line="53"/>
<location filename="../qml/Community/XMLNewsfeed.qml" line="62"/>
<source>News &amp; Patchnotes</source>
<translation> &amp; </translation>
</message>

View File

@ -97,31 +97,39 @@
</message>
<message>
<location filename="../qml/Community/Community.qml" line="34"/>
<source>News</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="40"/>
<source>Wiki</source>
<translation type="unfinished">Wiki</translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="40"/>
<location filename="../qml/Community/Community.qml" line="46"/>
<source>Forum</source>
<translation type="unfinished">Forum</translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="45"/>
<location filename="../qml/Community/Community.qml" line="51"/>
<source>Issue List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="50"/>
<location filename="../qml/Community/Community.qml" line="56"/>
<source>Contribute</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Release Notes</source>
<translation type="unfinished">Notas de Lançamento</translation>
<translation type="obsolete">Notas de Lançamento</translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="55"/>
<source>Contribution Guide</source>
<translation type="unfinished">Guia de contribuição</translation>
<translation type="obsolete">Guia de contribuição</translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="60"/>
<location filename="../qml/Community/Community.qml" line="61"/>
<source>Steam Workshop</source>
<translation type="unfinished">Steam Workshop</translation>
</message>
@ -1148,25 +1156,35 @@ si instaló ScreenPlay vía Steam!
<context>
<name>Navigation</name>
<message>
<location filename="../qml/Installed/Navigation.qml" line="56"/>
<location filename="../qml/Installed/Navigation.qml" line="57"/>
<source>All</source>
<translation type="unfinished">Todos</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="72"/>
<location filename="../qml/Installed/Navigation.qml" line="73"/>
<source>Scenes</source>
<translation type="unfinished">Cenas</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="88"/>
<location filename="../qml/Installed/Navigation.qml" line="89"/>
<source>Videos</source>
<translation type="unfinished">Videos</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="104"/>
<location filename="../qml/Installed/Navigation.qml" line="105"/>
<source>Widgets</source>
<translation type="unfinished">Widgets</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Ascending</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Descending</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Navigation.qml" line="35"/>
<source> Subscribed items: </source>
@ -1468,7 +1486,7 @@ si instaló ScreenPlay vía Steam!
<translation type="unfinished">Nós desativamos a renderização de video (menos o audio!) para melhor performance. Se você tiver problemas você pode desativar isso por aqui. O papel de parede vai precisar ser reiniciado!</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="450"/>
<location filename="../qml/Settings/Settings.qml" line="455"/>
<source>Logs</source>
<translation type="unfinished">Logs</translation>
</message>
@ -1536,32 +1554,32 @@ si instaló ScreenPlay vía Steam!
<translation type="unfinished">Olá, Eu sou o Elias Steurer tambem conhecido como Kelteseth e eu sou desenvolvedor do ScreenPlay. Obrigado por usar meu programa. Você pode me seguir para receber atualizações sobre o ScreenPlay aquí:</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="420"/>
<location filename="../qml/Settings/Settings.qml" line="425"/>
<source>Version</source>
<translation type="unfinished">Versão</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="421"/>
<location filename="../qml/Settings/Settings.qml" line="426"/>
<source>ScreenPlay Build Version </source>
<translation type="unfinished">Versão da build do ScreenPlay </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="423"/>
<location filename="../qml/Settings/Settings.qml" line="428"/>
<source>Open Changelog</source>
<translation type="unfinished">Abrir Changelog</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="430"/>
<location filename="../qml/Settings/Settings.qml" line="435"/>
<source>Third Party Software</source>
<translation type="unfinished">Software de terceiros</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="431"/>
<location filename="../qml/Settings/Settings.qml" line="436"/>
<source>ScreenPlay would not be possible without the work of others. A big thank you to: </source>
<translation type="unfinished">ScreenPlay não seria possivel sem o trabalho de outras pessoas. Um grande obrigado a você tambêm: </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="432"/>
<location filename="../qml/Settings/Settings.qml" line="437"/>
<source>Licenses</source>
<translation type="unfinished">Licenças</translation>
</message>
@ -1570,27 +1588,27 @@ si instaló ScreenPlay vía Steam!
<translation type="obsolete">Mensagens de depuração</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="451"/>
<location filename="../qml/Settings/Settings.qml" line="456"/>
<source>If your ScreenPlay missbehaves this is a good way to look for answers. This shows all logs and warning during runtime.</source>
<translation type="unfinished">Se o seu ScreenPlay se comportar mal, esta é uma boa maneira de procurar respostas. Isso mostra todos os logs e avisos durante o tempo de execução</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="452"/>
<location filename="../qml/Settings/Settings.qml" line="457"/>
<source>Show Logs</source>
<translation type="unfinished">Mostrar logs</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="463"/>
<location filename="../qml/Settings/Settings.qml" line="468"/>
<source>Data Protection</source>
<translation type="unfinished">Proteção de dados</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="464"/>
<location filename="../qml/Settings/Settings.qml" line="469"/>
<source>We use you data very carefully to improve ScreenPlay. We do not sell or share this (anonymous) information with others!</source>
<translation type="unfinished">Utilizamos seus dados com muito cuidado para melhorar o ScreenPlay. Não vendemos e nem compartilhamos informações (anónima) com outros!</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="465"/>
<location filename="../qml/Settings/Settings.qml" line="470"/>
<source>Privacy</source>
<translation type="unfinished">Privacidade</translation>
</message>
@ -1673,52 +1691,55 @@ si instaló ScreenPlay vía Steam!
<translation type="obsolete">Criar papel de parede</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<source>Project size: </source>
<translation type="unfinished">Tamanho do projeto</translation>
<translation type="obsolete">Tamanho do projeto</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source> MB</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="99"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source>Size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="115"/>
<source>No description...</source>
<translation type="unfinished">Sem descrição...</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="243"/>
<location filename="../qml/Workshop/Sidebar.qml" line="259"/>
<source>Click here if you like the content</source>
<translation type="unfinished">Clique aqui se você gosta do conteudo</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="256"/>
<location filename="../qml/Workshop/Sidebar.qml" line="272"/>
<source>Click here if you do not like the content</source>
<translation type="unfinished">Cloque aqui se você não gosta do conteudo</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="291"/>
<source>Tags: </source>
<translation type="unfinished">Etiquetas: </translation>
<translation type="obsolete">Etiquetas: </translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="308"/>
<location filename="../qml/Workshop/Sidebar.qml" line="327"/>
<source>Subscribtions: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="317"/>
<location filename="../qml/Workshop/Sidebar.qml" line="381"/>
<source>Open In Steam</source>
<translation type="unfinished">Abrir na Steam</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribe</source>
<translation type="unfinished"></translation>
</message>
@ -2538,95 +2559,105 @@ si instaló ScreenPlay vía Steam!
<context>
<name>Workshop</name>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="164"/>
<location filename="../qml/Workshop/Workshop.qml" line="183"/>
<source>Loading</source>
<translation type="unfinished">Carregando</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="175"/>
<location filename="../qml/Workshop/Workshop.qml" line="194"/>
<source>Download now!</source>
<translation type="unfinished">Baixe agora!</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="180"/>
<location filename="../qml/Workshop/Workshop.qml" line="199"/>
<source>Downloading...</source>
<translation type="unfinished">Baixando...</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="187"/>
<location filename="../qml/Workshop/Workshop.qml" line="206"/>
<source>Details</source>
<translation type="unfinished">Detalhes</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="211"/>
<location filename="../qml/Workshop/Workshop.qml" line="230"/>
<source>Open In Steam</source>
<translation type="unfinished">Abrir na Steam</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="272"/>
<location filename="../qml/Workshop/Workshop.qml" line="294"/>
<source>Search for Wallpaper and Widgets...</source>
<translation type="unfinished">Procurar por Wallpaper e Widgets</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="293"/>
<location filename="../qml/Workshop/Workshop.qml" line="342"/>
<source>Open Workshop in Steam</source>
<translation type="unfinished">Abrir workshop na Steam</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="303"/>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<source>Open GameHub in Steam</source>
<translation type="unfinished">Abrir Gamehub na Steam</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="335"/>
<location filename="../qml/Workshop/Workshop.qml" line="386"/>
<source>Ranked By Vote</source>
<translation type="unfinished">Classificado por voto</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="338"/>
<location filename="../qml/Workshop/Workshop.qml" line="389"/>
<source>Publication Date</source>
<translation type="unfinished">Data de publicação</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="341"/>
<location filename="../qml/Workshop/Workshop.qml" line="392"/>
<source>Ranked By Trend</source>
<translation type="unfinished">Classificado por tendência</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="344"/>
<location filename="../qml/Workshop/Workshop.qml" line="395"/>
<source>Favorited By Friends</source>
<translation type="unfinished">Favoritado por amigos</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="347"/>
<location filename="../qml/Workshop/Workshop.qml" line="398"/>
<source>Created By Friends</source>
<translation type="unfinished">Criado por amigos</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="350"/>
<location filename="../qml/Workshop/Workshop.qml" line="401"/>
<source>Created By Followed Users</source>
<translation type="unfinished">Criado por usuarios seguidos</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<location filename="../qml/Workshop/Workshop.qml" line="404"/>
<source>Not Yet Rated</source>
<translation type="unfinished">Não votado</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="356"/>
<location filename="../qml/Workshop/Workshop.qml" line="407"/>
<source>Total VotesAsc</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="359"/>
<location filename="../qml/Workshop/Workshop.qml" line="410"/>
<source>Votes Up</source>
<translation type="unfinished">Votos acima</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="362"/>
<location filename="../qml/Workshop/Workshop.qml" line="413"/>
<source>Total Unique Subscriptions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="451"/>
<source>Back</source>
<translation type="unfinished">Voltar</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="471"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WorkshopItem</name>
@ -2635,12 +2666,12 @@ si instaló ScreenPlay vía Steam!
<translation type="obsolete">Baixar</translation>
</message>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="286"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="257"/>
<source>Successfully subscribed to Workshop Item!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="381"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="352"/>
<source>Download complete!</source>
<translation type="unfinished">Download completado!</translation>
</message>
@ -2648,7 +2679,7 @@ si instaló ScreenPlay vía Steam!
<context>
<name>XMLNewsfeed</name>
<message>
<location filename="../qml/Community/XMLNewsfeed.qml" line="53"/>
<location filename="../qml/Community/XMLNewsfeed.qml" line="62"/>
<source>News &amp; Patchnotes</source>
<translation type="unfinished"></translation>
</message>

View File

@ -97,31 +97,31 @@
</message>
<message>
<location filename="../qml/Community/Community.qml" line="34"/>
<source>Wiki</source>
<source>News</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="40"/>
<source>Wiki</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="46"/>
<source>Forum</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="45"/>
<location filename="../qml/Community/Community.qml" line="51"/>
<source>Issue List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="50"/>
<source>Release Notes</source>
<location filename="../qml/Community/Community.qml" line="56"/>
<source>Contribute</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="55"/>
<source>Contribution Guide</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="60"/>
<location filename="../qml/Community/Community.qml" line="61"/>
<source>Steam Workshop</source>
<translation type="unfinished"></translation>
</message>
@ -1163,25 +1163,35 @@ ms), но есть и некоторые проприетарные, такие
<context>
<name>Navigation</name>
<message>
<location filename="../qml/Installed/Navigation.qml" line="56"/>
<location filename="../qml/Installed/Navigation.qml" line="57"/>
<source>All</source>
<translation type="unfinished">Все</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="72"/>
<location filename="../qml/Installed/Navigation.qml" line="73"/>
<source>Scenes</source>
<translation type="unfinished">Сцены</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="88"/>
<location filename="../qml/Installed/Navigation.qml" line="89"/>
<source>Videos</source>
<translation type="unfinished">Видео</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="104"/>
<location filename="../qml/Installed/Navigation.qml" line="105"/>
<source>Widgets</source>
<translation type="unfinished">Виджеты</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Ascending</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Descending</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Navigation.qml" line="35"/>
<source> Subscribed items: </source>
@ -1483,7 +1493,7 @@ ms), но есть и некоторые проприетарные, такие
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="450"/>
<location filename="../qml/Settings/Settings.qml" line="455"/>
<source>Logs</source>
<translation type="unfinished"></translation>
</message>
@ -1551,32 +1561,32 @@ ms), но есть и некоторые проприетарные, такие
<translation type="unfinished">Привет, я Elias Steurer, также известный как Kelteseth, и я разработчик ScreenPlay. Спасибо за использование моего программного обеспечения. Вы можете подписаться на меня, чтобы получать обновления о ScreenPlay:</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="420"/>
<location filename="../qml/Settings/Settings.qml" line="425"/>
<source>Version</source>
<translation type="unfinished">Версия</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="421"/>
<location filename="../qml/Settings/Settings.qml" line="426"/>
<source>ScreenPlay Build Version </source>
<translation type="unfinished">Версия сборки ScreenPlay </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="423"/>
<location filename="../qml/Settings/Settings.qml" line="428"/>
<source>Open Changelog</source>
<translation type="unfinished">Открыть журнал изменений</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="430"/>
<location filename="../qml/Settings/Settings.qml" line="435"/>
<source>Third Party Software</source>
<translation type="unfinished">Стороннее ПО</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="431"/>
<location filename="../qml/Settings/Settings.qml" line="436"/>
<source>ScreenPlay would not be possible without the work of others. A big thank you to: </source>
<translation type="unfinished">ScreenPlay был бы невозможен без работы других. Большое спасибо: </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="432"/>
<location filename="../qml/Settings/Settings.qml" line="437"/>
<source>Licenses</source>
<translation type="unfinished">Лицензии</translation>
</message>
@ -1585,27 +1595,27 @@ ms), но есть и некоторые проприетарные, такие
<translation type="obsolete">Отладочные сообщения</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="451"/>
<location filename="../qml/Settings/Settings.qml" line="456"/>
<source>If your ScreenPlay missbehaves this is a good way to look for answers. This shows all logs and warning during runtime.</source>
<translation type="unfinished">Если ваш ScreenPlay плохо себя ведет, это хороший способ поиска ответов. Он показывает все журналы и предупреждения во время работы.</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="452"/>
<location filename="../qml/Settings/Settings.qml" line="457"/>
<source>Show Logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="463"/>
<location filename="../qml/Settings/Settings.qml" line="468"/>
<source>Data Protection</source>
<translation type="unfinished">Защита данных</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="464"/>
<location filename="../qml/Settings/Settings.qml" line="469"/>
<source>We use you data very carefully to improve ScreenPlay. We do not sell or share this (anonymous) information with others!</source>
<translation type="unfinished">Мы используем ваши данные очень тщательно, чтобы улучшить ScreenPlay. Мы не продаем и не делимся этой (анонимной) информацией с другими!</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="465"/>
<location filename="../qml/Settings/Settings.qml" line="470"/>
<source>Privacy</source>
<translation type="unfinished">Конфиденциальность</translation>
</message>
@ -1688,52 +1698,47 @@ ms), но есть и некоторые проприетарные, такие
<translation type="obsolete">Создать обои</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<source>Project size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source> MB</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="99"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source>Size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="115"/>
<source>No description...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="243"/>
<location filename="../qml/Workshop/Sidebar.qml" line="259"/>
<source>Click here if you like the content</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="256"/>
<location filename="../qml/Workshop/Sidebar.qml" line="272"/>
<source>Click here if you do not like the content</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="291"/>
<source>Tags: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="308"/>
<location filename="../qml/Workshop/Sidebar.qml" line="327"/>
<source>Subscribtions: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="317"/>
<location filename="../qml/Workshop/Sidebar.qml" line="381"/>
<source>Open In Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribe</source>
<translation type="unfinished"></translation>
</message>
@ -2553,105 +2558,115 @@ ms), но есть и некоторые проприетарные, такие
<context>
<name>Workshop</name>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="164"/>
<location filename="../qml/Workshop/Workshop.qml" line="183"/>
<source>Loading</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="175"/>
<location filename="../qml/Workshop/Workshop.qml" line="194"/>
<source>Download now!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="180"/>
<location filename="../qml/Workshop/Workshop.qml" line="199"/>
<source>Downloading...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="187"/>
<location filename="../qml/Workshop/Workshop.qml" line="206"/>
<source>Details</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="211"/>
<location filename="../qml/Workshop/Workshop.qml" line="230"/>
<source>Open In Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="272"/>
<location filename="../qml/Workshop/Workshop.qml" line="294"/>
<source>Search for Wallpaper and Widgets...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="293"/>
<location filename="../qml/Workshop/Workshop.qml" line="342"/>
<source>Open Workshop in Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="303"/>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<source>Open GameHub in Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="335"/>
<location filename="../qml/Workshop/Workshop.qml" line="386"/>
<source>Ranked By Vote</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="338"/>
<location filename="../qml/Workshop/Workshop.qml" line="389"/>
<source>Publication Date</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="341"/>
<location filename="../qml/Workshop/Workshop.qml" line="392"/>
<source>Ranked By Trend</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="344"/>
<location filename="../qml/Workshop/Workshop.qml" line="395"/>
<source>Favorited By Friends</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="347"/>
<location filename="../qml/Workshop/Workshop.qml" line="398"/>
<source>Created By Friends</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="350"/>
<location filename="../qml/Workshop/Workshop.qml" line="401"/>
<source>Created By Followed Users</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<location filename="../qml/Workshop/Workshop.qml" line="404"/>
<source>Not Yet Rated</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="356"/>
<location filename="../qml/Workshop/Workshop.qml" line="407"/>
<source>Total VotesAsc</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="359"/>
<location filename="../qml/Workshop/Workshop.qml" line="410"/>
<source>Votes Up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="362"/>
<location filename="../qml/Workshop/Workshop.qml" line="413"/>
<source>Total Unique Subscriptions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="451"/>
<source>Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="471"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WorkshopItem</name>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="286"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="257"/>
<source>Successfully subscribed to Workshop Item!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="381"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="352"/>
<source>Download complete!</source>
<translation type="unfinished"></translation>
</message>
@ -2659,7 +2674,7 @@ ms), но есть и некоторые проприетарные, такие
<context>
<name>XMLNewsfeed</name>
<message>
<location filename="../qml/Community/XMLNewsfeed.qml" line="53"/>
<location filename="../qml/Community/XMLNewsfeed.qml" line="62"/>
<source>News &amp; Patchnotes</source>
<translation type="unfinished">Список изменений</translation>
</message>

View File

@ -73,31 +73,39 @@
<name>Community</name>
<message>
<location filename="../qml/Community/Community.qml" line="34"/>
<source>News</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="40"/>
<source>Wiki</source>
<translation>Wiki</translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="40"/>
<location filename="../qml/Community/Community.qml" line="46"/>
<source>Forum</source>
<translation>Diễn đàn</translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="45"/>
<location filename="../qml/Community/Community.qml" line="51"/>
<source>Issue List</source>
<translation>D.Sách Lỗi</translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="50"/>
<location filename="../qml/Community/Community.qml" line="56"/>
<source>Contribute</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Release Notes</source>
<translation>Ghi chú bản phát hành</translation>
<translation type="vanished">Ghi chú bản phát hành</translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="55"/>
<source>Contribution Guide</source>
<translation>Hướng dẫn đóng góp</translation>
<translation type="vanished">Hướng dẫn đóng góp</translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="60"/>
<location filename="../qml/Community/Community.qml" line="61"/>
<source>Steam Workshop</source>
<translatorcomment>Still workshop.</translatorcomment>
<translation>Steam Workshop</translation>
@ -955,25 +963,35 @@
<context>
<name>Navigation</name>
<message>
<location filename="../qml/Installed/Navigation.qml" line="56"/>
<location filename="../qml/Installed/Navigation.qml" line="57"/>
<source>All</source>
<translation>Tất cả</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="72"/>
<location filename="../qml/Installed/Navigation.qml" line="73"/>
<source>Scenes</source>
<translation>Cảnh</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="88"/>
<location filename="../qml/Installed/Navigation.qml" line="89"/>
<source>Videos</source>
<translation>Videos</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="104"/>
<location filename="../qml/Installed/Navigation.qml" line="105"/>
<source>Widgets</source>
<translation>Tiện ích con</translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Ascending</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Descending</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Navigation.qml" line="35"/>
<source> Subscribed items: </source>
@ -1327,37 +1345,37 @@
<translation>Chào, tôi Elias Steurer (hay còn đưc biết đến Kelteseth) tôi nhà phát triển của ScreenPlay. Cảm ơn ban đã sử dụng ng dụng của tôi. Bạn thể theo dõi tôi đây đ nhận tin tức về ScreenPlay:</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="420"/>
<location filename="../qml/Settings/Settings.qml" line="425"/>
<source>Version</source>
<translation>Phiên bản</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="421"/>
<location filename="../qml/Settings/Settings.qml" line="426"/>
<source>ScreenPlay Build Version </source>
<translation>Bản dựng của ScreenPlay </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="423"/>
<location filename="../qml/Settings/Settings.qml" line="428"/>
<source>Open Changelog</source>
<translation>Mở changelog</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="430"/>
<location filename="../qml/Settings/Settings.qml" line="435"/>
<source>Third Party Software</source>
<translation>Những ng dụng của bên thứ ba</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="431"/>
<location filename="../qml/Settings/Settings.qml" line="436"/>
<source>ScreenPlay would not be possible without the work of others. A big thank you to: </source>
<translation>ScreenPlay sẽ không thể đưc néu như không việc làm của những người khác. Một sự cảm ơn to lớn cho: </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="432"/>
<location filename="../qml/Settings/Settings.qml" line="437"/>
<source>Licenses</source>
<translation>Giấy phép</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="450"/>
<location filename="../qml/Settings/Settings.qml" line="455"/>
<source>Logs</source>
<translation type="unfinished"></translation>
</message>
@ -1366,27 +1384,27 @@
<translation type="vanished">Các ghi chú gỡ lỗi</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="451"/>
<location filename="../qml/Settings/Settings.qml" line="456"/>
<source>If your ScreenPlay missbehaves this is a good way to look for answers. This shows all logs and warning during runtime.</source>
<translation>Nếu ScreenPlay của bạn không hoạt đng bình thường thì đây cách tốt đ tìm ra câu trả lời. Cái này sẽ hiện tất cả các ghi chú cảnh báo trong lúc ng dụng chạy.</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="452"/>
<location filename="../qml/Settings/Settings.qml" line="457"/>
<source>Show Logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="463"/>
<location filename="../qml/Settings/Settings.qml" line="468"/>
<source>Data Protection</source>
<translation>Bảo vệ dữ liệu</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="464"/>
<location filename="../qml/Settings/Settings.qml" line="469"/>
<source>We use you data very carefully to improve ScreenPlay. We do not sell or share this (anonymous) information with others!</source>
<translation>Chúng tôi dùng dữ liệu của bạn rất cẩn thận đ cải thiện ScreenPlay. Chúng tôi không bán thông tin của bạn với người khác!</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="465"/>
<location filename="../qml/Settings/Settings.qml" line="470"/>
<source>Privacy</source>
<translation>Quyền riêng </translation>
</message>
@ -1457,52 +1475,55 @@
<translation>Chọn hình nền</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<source>Project size: </source>
<translation>Kích thước dự án: </translation>
<translation type="vanished">Kích thước dự án: </translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source> MB</source>
<translation>MB</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="99"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source>Size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="115"/>
<source>No description...</source>
<translation>Không tả...</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="243"/>
<location filename="../qml/Workshop/Sidebar.qml" line="259"/>
<source>Click here if you like the content</source>
<translation>Bấm vào đây nếu bạn thích nội dung này</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="256"/>
<location filename="../qml/Workshop/Sidebar.qml" line="272"/>
<source>Click here if you do not like the content</source>
<translation>Bấm vào đây nếu bạn không thích nội dung này</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="291"/>
<source>Tags: </source>
<translation>Từ khóa:</translation>
<translation type="vanished">Từ khóa:</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="308"/>
<location filename="../qml/Workshop/Sidebar.qml" line="327"/>
<source>Subscribtions: </source>
<translation>Đăng : </translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="317"/>
<location filename="../qml/Workshop/Sidebar.qml" line="381"/>
<source>Open In Steam</source>
<translation>Mở trên Steam</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribed!</source>
<translation>Đã đăng !</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribe</source>
<translation>Đăng </translation>
</message>
@ -2326,97 +2347,107 @@
<context>
<name>Workshop</name>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="164"/>
<location filename="../qml/Workshop/Workshop.qml" line="183"/>
<source>Loading</source>
<translation>Đang tải</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="175"/>
<location filename="../qml/Workshop/Workshop.qml" line="194"/>
<source>Download now!</source>
<translation>Tải xuống ngay!</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="180"/>
<location filename="../qml/Workshop/Workshop.qml" line="199"/>
<source>Downloading...</source>
<translation>Đang tải xuống...</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="187"/>
<location filename="../qml/Workshop/Workshop.qml" line="206"/>
<source>Details</source>
<translation>Chi tiết</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="211"/>
<location filename="../qml/Workshop/Workshop.qml" line="230"/>
<source>Open In Steam</source>
<translation>Mở trên Steam</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="272"/>
<location filename="../qml/Workshop/Workshop.qml" line="294"/>
<source>Search for Wallpaper and Widgets...</source>
<translation>Tìm hình nền &amp; cảnh...</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="293"/>
<location filename="../qml/Workshop/Workshop.qml" line="342"/>
<source>Open Workshop in Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="303"/>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<source>Open GameHub in Steam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="335"/>
<location filename="../qml/Workshop/Workshop.qml" line="386"/>
<source>Ranked By Vote</source>
<translation>Xếp hạng bởi số phiếu.</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="338"/>
<location filename="../qml/Workshop/Workshop.qml" line="389"/>
<source>Publication Date</source>
<translation>Ngày tải lên</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="341"/>
<location filename="../qml/Workshop/Workshop.qml" line="392"/>
<source>Ranked By Trend</source>
<translation>Xếp hạng bởi trend</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="344"/>
<location filename="../qml/Workshop/Workshop.qml" line="395"/>
<source>Favorited By Friends</source>
<translation>Đưc yêu thích bởi bạn </translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="347"/>
<location filename="../qml/Workshop/Workshop.qml" line="398"/>
<source>Created By Friends</source>
<translation>Tạo bởi bạn </translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="350"/>
<location filename="../qml/Workshop/Workshop.qml" line="401"/>
<source>Created By Followed Users</source>
<translation>Tạo bởi người đã theo dỗi</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<location filename="../qml/Workshop/Workshop.qml" line="404"/>
<source>Not Yet Rated</source>
<translation>Chưa đưc xếp hạng</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="356"/>
<location filename="../qml/Workshop/Workshop.qml" line="407"/>
<source>Total VotesAsc</source>
<translatorcomment>????</translatorcomment>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="359"/>
<location filename="../qml/Workshop/Workshop.qml" line="410"/>
<source>Votes Up</source>
<translatorcomment>?????</translatorcomment>
<translation>Số phiếu đang lên cao</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="362"/>
<location filename="../qml/Workshop/Workshop.qml" line="413"/>
<source>Total Unique Subscriptions</source>
<translation>Tổng số đăng duy nhất</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="451"/>
<source>Back</source>
<translation type="unfinished">Quay lại</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="471"/>
<source>Forward</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WorkshopItem</name>
@ -2425,12 +2456,12 @@
<translation type="vanished">Tải xuống</translation>
</message>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="286"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="257"/>
<source>Successfully subscribed to Workshop Item!</source>
<translation>Đăng thành công mục Workshop!</translation>
</message>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="381"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="352"/>
<source>Download complete!</source>
<translation>Tải xuống thành công!</translation>
</message>
@ -2438,7 +2469,7 @@
<context>
<name>XMLNewsfeed</name>
<message>
<location filename="../qml/Community/XMLNewsfeed.qml" line="53"/>
<location filename="../qml/Community/XMLNewsfeed.qml" line="62"/>
<source>News &amp; Patchnotes</source>
<translation>Tin tức &amp; Ghi chú</translation>
</message>

View File

@ -73,31 +73,31 @@
<name>Community</name>
<message>
<location filename="../qml/Community/Community.qml" line="34"/>
<source>News</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="40"/>
<source>Wiki</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="40"/>
<location filename="../qml/Community/Community.qml" line="46"/>
<source>Forum</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="45"/>
<location filename="../qml/Community/Community.qml" line="51"/>
<source>Issue List</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="50"/>
<source>Release Notes</source>
<translation></translation>
<location filename="../qml/Community/Community.qml" line="56"/>
<source>Contribute</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="55"/>
<source>Contribution Guide</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="60"/>
<location filename="../qml/Community/Community.qml" line="61"/>
<source>Steam Workshop</source>
<translation></translation>
</message>
@ -671,7 +671,7 @@
<message>
<location filename="../qml/Common/LicenseSelector.qml" line="69"/>
<source>You do not share any rights and nobody is allowed to use or remix it (Not recommended). Can also used to credit work others.</source>
<translation type="unfinished">使Can also used to credit work others.</translation>
<translation>使</translation>
</message>
</context>
<context>
@ -681,7 +681,7 @@
<source>Your monitor setup changed!
Please configure your wallpaper again.</source>
<translation>
</translation>
</translation>
</message>
</context>
<context>
@ -729,25 +729,35 @@
<context>
<name>Navigation</name>
<message>
<location filename="../qml/Installed/Navigation.qml" line="56"/>
<location filename="../qml/Installed/Navigation.qml" line="57"/>
<source>All</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="72"/>
<location filename="../qml/Installed/Navigation.qml" line="73"/>
<source>Scenes</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="88"/>
<location filename="../qml/Installed/Navigation.qml" line="89"/>
<source>Videos</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="104"/>
<location filename="../qml/Installed/Navigation.qml" line="105"/>
<source>Widgets</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Ascending</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Installed/Navigation.qml" line="154"/>
<source>Install Date Descending</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Navigation.qml" line="35"/>
<source> Subscribed items: </source>
@ -1005,7 +1015,7 @@
<message>
<location filename="../qml/Settings/Settings.qml" line="188"/>
<source>Portuguese (Brazil)</source>
<translation type="unfinished"></translation>
<translation>西</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="196"/>
@ -1093,62 +1103,62 @@
<translation>Elias SteurerKeltesethScreenPlay的开发者使ScreenPlay的更新</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="420"/>
<location filename="../qml/Settings/Settings.qml" line="425"/>
<source>Version</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="421"/>
<location filename="../qml/Settings/Settings.qml" line="426"/>
<source>ScreenPlay Build Version </source>
<translation>ScreenPlay编译版本 </translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="423"/>
<location filename="../qml/Settings/Settings.qml" line="428"/>
<source>Open Changelog</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="430"/>
<location filename="../qml/Settings/Settings.qml" line="435"/>
<source>Third Party Software</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="431"/>
<location filename="../qml/Settings/Settings.qml" line="436"/>
<source>ScreenPlay would not be possible without the work of others. A big thank you to: </source>
<translation>ScreenPlay离不开一些人的帮助</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="432"/>
<location filename="../qml/Settings/Settings.qml" line="437"/>
<source>Licenses</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="450"/>
<location filename="../qml/Settings/Settings.qml" line="455"/>
<source>Logs</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="451"/>
<location filename="../qml/Settings/Settings.qml" line="456"/>
<source>If your ScreenPlay missbehaves this is a good way to look for answers. This shows all logs and warning during runtime.</source>
<translation>ScreenPlay出错</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="452"/>
<location filename="../qml/Settings/Settings.qml" line="457"/>
<source>Show Logs</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="463"/>
<location filename="../qml/Settings/Settings.qml" line="468"/>
<source>Data Protection</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="464"/>
<location filename="../qml/Settings/Settings.qml" line="469"/>
<source>We use you data very carefully to improve ScreenPlay. We do not sell or share this (anonymous) information with others!</source>
<translation>使ScreenPlay的体验</translation>
</message>
<message>
<location filename="../qml/Settings/Settings.qml" line="465"/>
<location filename="../qml/Settings/Settings.qml" line="470"/>
<source>Privacy</source>
<translation></translation>
</message>
@ -1219,52 +1229,47 @@
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<source>Project size: </source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source> MB</source>
<translation> </translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="99"/>
<location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source>Size: </source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="115"/>
<source>No description...</source>
<translation>...</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="243"/>
<location filename="../qml/Workshop/Sidebar.qml" line="259"/>
<source>Click here if you like the content</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="256"/>
<location filename="../qml/Workshop/Sidebar.qml" line="272"/>
<source>Click here if you do not like the content</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="291"/>
<source>Tags: </source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="308"/>
<location filename="../qml/Workshop/Sidebar.qml" line="327"/>
<source>Subscribtions: </source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="317"/>
<location filename="../qml/Workshop/Sidebar.qml" line="381"/>
<source>Open In Steam</source>
<translation>Steam打开</translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribed!</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/>
<location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribe</source>
<translation></translation>
</message>
@ -2084,109 +2089,115 @@
<context>
<name>Workshop</name>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="164"/>
<location filename="../qml/Workshop/Workshop.qml" line="183"/>
<source>Loading</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="175"/>
<location filename="../qml/Workshop/Workshop.qml" line="194"/>
<source>Download now!</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="180"/>
<location filename="../qml/Workshop/Workshop.qml" line="199"/>
<source>Downloading...</source>
<translation>...</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="187"/>
<location filename="../qml/Workshop/Workshop.qml" line="206"/>
<source>Details</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="211"/>
<location filename="../qml/Workshop/Workshop.qml" line="230"/>
<source>Open In Steam</source>
<translation>Steam打开</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="272"/>
<location filename="../qml/Workshop/Workshop.qml" line="294"/>
<source>Search for Wallpaper and Widgets...</source>
<translation>...</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="293"/>
<location filename="../qml/Workshop/Workshop.qml" line="342"/>
<source>Open Workshop in Steam</source>
<translation>Steam中打开创意工坊</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="303"/>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<source>Open GameHub in Steam</source>
<translation>Steam中打开游戏社区</translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="335"/>
<location filename="../qml/Workshop/Workshop.qml" line="386"/>
<source>Ranked By Vote</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="338"/>
<location filename="../qml/Workshop/Workshop.qml" line="389"/>
<source>Publication Date</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="341"/>
<location filename="../qml/Workshop/Workshop.qml" line="392"/>
<source>Ranked By Trend</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="344"/>
<location filename="../qml/Workshop/Workshop.qml" line="395"/>
<source>Favorited By Friends</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="347"/>
<location filename="../qml/Workshop/Workshop.qml" line="398"/>
<source>Created By Friends</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="350"/>
<location filename="../qml/Workshop/Workshop.qml" line="401"/>
<source>Created By Followed Users</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="353"/>
<location filename="../qml/Workshop/Workshop.qml" line="404"/>
<source>Not Yet Rated</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="356"/>
<location filename="../qml/Workshop/Workshop.qml" line="407"/>
<source>Total VotesAsc</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="359"/>
<location filename="../qml/Workshop/Workshop.qml" line="410"/>
<source>Votes Up</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="362"/>
<location filename="../qml/Workshop/Workshop.qml" line="413"/>
<source>Total Unique Subscriptions</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="451"/>
<source>Back</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/Workshop.qml" line="471"/>
<source>Forward</source>
<translation></translation>
</message>
</context>
<context>
<name>WorkshopItem</name>
<message>
<source>Download</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="286"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="257"/>
<source>Successfully subscribed to Workshop Item!</source>
<translation></translation>
</message>
<message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="381"/>
<location filename="../qml/Workshop/WorkshopItem.qml" line="352"/>
<source>Download complete!</source>
<translation></translation>
</message>
@ -2194,7 +2205,7 @@
<context>
<name>XMLNewsfeed</name>
<message>
<location filename="../qml/Community/XMLNewsfeed.qml" line="53"/>
<location filename="../qml/Community/XMLNewsfeed.qml" line="62"/>
<source>News &amp; Patchnotes</source>
<translation></translation>
</message>

View File

@ -85,6 +85,7 @@ public slots:
void error(QLocalSocket::LocalSocketError socketError);
void redirectMessage(QByteArray& msg);
void pingAlive();
void start();
void setType(QString type)
{
@ -136,9 +137,6 @@ signals:
const QString type,
const bool checkWallpaperVisible);
private:
void init();
private:
QLocalSocket m_socket;

View File

@ -6,7 +6,6 @@ static ScreenPlaySDK* global_sdkPtr = nullptr;
ScreenPlaySDK::ScreenPlaySDK(QQuickItem* parent)
: QQuickItem(parent)
{
init();
}
ScreenPlaySDK::ScreenPlaySDK(
@ -17,10 +16,9 @@ ScreenPlaySDK::ScreenPlaySDK(
, m_type { type }
, m_appID { appID }
{
init();
}
void ScreenPlaySDK::init()
void ScreenPlaySDK::start()
{
// Redirect all messages from this to ScreenPlay
global_sdkPtr = this;
@ -36,7 +34,7 @@ void ScreenPlaySDK::init()
// If the wallpaper never connects it will never get the
// disconnect event. We can savely assume no connection will
// be made after 1 second timeout.
QTimer::singleShot(1000, [this]() {
QTimer::singleShot(1000, this, [this]() {
if (m_socket.state() != QLocalSocket::ConnectedState) {
m_socket.disconnectFromServer();
emit sdkDisconnected();
@ -122,7 +120,7 @@ void ScreenPlaySDK::readyRead()
qWarning() << "Command replaced contained bad volume float value: " << volumeParsed;
}
qWarning()
qInfo()
<< type
<< fillMode
<< volumeParsed
@ -142,9 +140,7 @@ void ScreenPlaySDK::readyRead()
void ScreenPlaySDK::error(QLocalSocket::LocalSocketError socketError)
{
if (socketError == QLocalSocket::LocalSocketError::ConnectionRefusedError) {
QCoreApplication::quit();
}
emit sdkDisconnected();
}
void ScreenPlaySDK::redirectMessage(QByteArray& msg)
@ -172,8 +168,8 @@ void ScreenPlaySDK::ScreenPlaySDK::redirectMessageOutputToMainWindow(QtMsgType t
return;
QByteArray localMsg = msg.toLocal8Bit();
QByteArray file = "File: " + QByteArray(context.file) + ", ";
QByteArray line = "in line " + QByteArray::number(context.line) + ", ";
localMsg += "\nFile: " + QByteArray(context.file) + ", ";
localMsg += "\nin line " + QByteArray::number(context.line) + ", ";
global_sdkPtr->redirectMessage(localMsg);
}

View File

@ -63,4 +63,5 @@ QStringList getAvailableTypes();
QStringList getAvailableFillModes();
bool isWallpaper(const ScreenPlay::InstalledType::InstalledType type);
bool isWidget(const ScreenPlay::InstalledType::InstalledType type);
std::optional<QVector<int>> parseStringToIntegerList(const QString string);
}

View File

@ -29,6 +29,9 @@ std::optional<QJsonObject> openJsonFileToObject(const QString& path)
return jsonDocument.object();
}
/*!
\brief .
*/
bool writeJsonObjectToFile(const QString& absoluteFilePath, const QJsonObject& object, bool truncate)
{
QFile configTmp;
@ -248,6 +251,9 @@ QString toLocal(const QString& url)
return QUrl(url).toLocalFile();
}
/*!
\brief .
*/
QStringList getAvailableWallpaper()
{
return {
@ -260,6 +266,9 @@ QStringList getAvailableWallpaper()
};
}
/*!
\brief .
*/
QStringList getAvailableWidgets()
{
return {
@ -268,11 +277,17 @@ QStringList getAvailableWidgets()
};
}
/*!
\brief .
*/
QStringList getAvailableTypes()
{
return { getAvailableWallpaper() + getAvailableWidgets() };
}
/*!
\brief .
*/
bool isWallpaper(const ScreenPlay::InstalledType::InstalledType type)
{
@ -286,6 +301,9 @@ bool isWallpaper(const ScreenPlay::InstalledType::InstalledType type)
|| type == InstalledType::GodotWallpaper);
}
/*!
\brief .
*/
bool isWidget(const ScreenPlay::InstalledType::InstalledType type)
{
@ -294,10 +312,36 @@ bool isWidget(const ScreenPlay::InstalledType::InstalledType type)
return (type == InstalledType::QMLWidget || type == InstalledType::HTMLWidget);
}
/*!
\brief See https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit
*/
QStringList getAvailableFillModes()
{
// https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit
return { "stretch", "fill", "contain", "cover", "scale-down" };
}
/*!
\brief parseIntList parses a list of string separated with a comma
"1,2,3". IMPORTANT: No trailing comma!
*/
std::optional<QVector<int>> parseStringToIntegerList(const QString string)
{
if (string.isEmpty())
return {};
QVector<int> list;
QStringList stringList = string.split(",");
for (const auto& item : stringList) {
bool ok = false;
int val = item.toInt(&ok);
if (!ok) {
qFatal("Could not parse item to Integer!");
} else {
list.append(val);
}
}
return list;
}
}

View File

@ -35,6 +35,7 @@ if(WIN32)
# Disable console window on Windows
# https://stackoverflow.com/questions/8249028/how-do-i-keep-my-qt-c-program-from-opening-a-console-in-windows
set_property(TARGET ${PROJECT_NAME} PROPERTY WIN32_EXECUTABLE true)
target_link_libraries(${PROJECT_NAME} PRIVATE shcore.lib )
endif()
if(APPLE)
@ -42,7 +43,8 @@ if(APPLE)
target_link_libraries(${PROJECT_NAME} PRIVATE "-framework Cocoa")
endif()
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Quick Qt5::Gui Qt5::Widgets Qt5::Core Qt5::WebEngine ScreenPlaySDK ScreenPlayUtil)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Quick Qt5::Gui Qt5::Widgets Qt5::Core Qt5::WebEngine shcore.lib ScreenPlaySDK ScreenPlayUtil)
if(APPLE)

View File

@ -8,6 +8,11 @@ Rectangle {
id: root
anchors.fill: parent
color: Material.color(Material.Grey, Material.Shade800)
border.width: 10
border.color: "orange"
signal requestFadeIn
Component.onCompleted: root.requestFadeIn()
property int attStrength: 800000
//Emitter
@ -25,7 +30,7 @@ Rectangle {
id: ma
anchors.fill: parent
preventStealing: true
propagateComposedEvents:true
propagateComposedEvents: true
hoverEnabled: true
Component.onCompleted: {
attractor.pointX = parent.width * .5
@ -34,10 +39,10 @@ Rectangle {
onPositionChanged: {
setPosition()
}
onClicked: {
// setPosition()
// setPosition()
}
function setPosition() {
attractor.pointX = mouseX - 25
@ -50,11 +55,9 @@ Rectangle {
id: mouseDot
property int center: mouseDot.width * .5
width: 10
y: attractor.pointY
x: attractor.pointX
height: width
radius: width
z: 99
color: "orange"
}
@ -102,6 +105,21 @@ Rectangle {
system: particleSystem
opacity: root.imgOpacity
}
Text {
id: txtMousePos
property int counter: 0
text: attractor.pointY + " - " +attractor.pointX
font.pointSize: 32
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
wrapMode: Text.WordWrap
anchors {
horizontalCenter: parent.horizontalCenter
bottom: txtButtonConter.top
bottomMargin: 20
}
color: "white"
}
Text {
id: txtButtonConter
@ -125,16 +143,15 @@ Rectangle {
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
wrapMode: Text.WordWrap
anchors.centerIn: parent
anchors.centerIn: parent
anchors.margins: 10
color: "white"
}
Row {
anchors {
horizontalCenter: parent.horizontalCenter
top:name.bottom
top: name.bottom
topMargin: 20
}
spacing: 20
@ -142,9 +159,9 @@ Rectangle {
highlighted: true
onClicked: {
focus =false
focus =true
print("Button Clicked!" )
focus = false
focus = true
print("Button Clicked!")
txtButtonConter.counter = txtButtonConter.counter - 1
}
text: qsTr("Click me! - 1")
@ -153,24 +170,23 @@ Rectangle {
highlighted: true
onClicked: {
focus =false
focus =true
print("Button Clicked!" )
focus = false
focus = true
print("Button Clicked!")
txtButtonConter.counter = txtButtonConter.counter
}
text: qsTr("Click me!")
}
Button {
highlighted: true
focusPolicy: Qt.ClickFocus
focusPolicy: Qt.ClickFocus
onClicked: {
print("Button Clicked!" )
print("Button Clicked!")
txtButtonConter.counter = txtButtonConter.counter + 1
}
text: qsTr("Click me! +1")
}
}
WebView {

View File

@ -1,5 +1,6 @@
import QtQuick 2.14
import QtQml 2.14
import QtQuick 2.14
import QtQuick.Controls 2.14
import ScreenPlayWallpaper 1.0
import ScreenPlay.Enums.InstalledType 1.0
import ScreenPlay.Shader 1.0
@ -27,7 +28,7 @@ Rectangle {
function onQmlExit() {
if (canFadeByWallpaperFillMode && Wallpaper.canFade) {
imgCover.state = "outExit"
imgCover.state = "exit"
} else {
Wallpaper.terminate()
}
@ -64,7 +65,7 @@ Rectangle {
if (oldType === InstalledType.VideoWallpaper)
return
imgCover.state = "in"
imgCover.state = "showDefaultBackgroundImage"
loader.source = "qrc:/WebView.qml"
}
}
@ -82,27 +83,28 @@ Rectangle {
break
case InstalledType.QMLWallpaper:
loader.source = Qt.resolvedUrl(Wallpaper.fullContentPath)
fadeIn()
break
case InstalledType.WebsiteWallpaper:
loader.setSource("qrc:/WebsiteWallpaper.qml", {
"url": Wallpaper.fullContentPath
})
fadeIn()
break
case InstalledType.GifWallpaper:
loader.setSource("qrc:/GifWallpaper.qml", {
"source": Qt.resolvedUrl(
Wallpaper.fullContentPath)
})
fadeIn()
break
}
fadeIn()
}
function fadeIn() {
Wallpaper.setVisible(true)
if (canFadeByWallpaperFillMode && Wallpaper.canFade) {
imgCover.state = "out"
imgCover.state = "hideDefaultBackgroundImage"
} else {
imgCover.opacity = 0
}
@ -137,35 +139,33 @@ Rectangle {
left: parent.left
right: parent.right
}
state: "in"
state: "showDefaultBackgroundImage"
sourceSize.width: Wallpaper.width
sourceSize.height: Wallpaper.height
source: {
if (Qt.platform.os === "windows") {
return Qt.resolvedUrl(
"file:///" + Wallpaper.windowsDesktopProperties.wallpaperPath)
} else {
return ""
}
}
states: [
State {
name: "in"
name: "showDefaultBackgroundImage"
PropertyChanges {
target: imgCover
opacity: 1
}
},
State {
name: "out"
name: "hideDefaultBackgroundImage"
PropertyChanges {
target: imgCover
opacity: 0
}
},
State {
name: "outExit"
name: "exit"
PropertyChanges {
target: imgCover
opacity: 1
@ -174,18 +174,24 @@ Rectangle {
]
transitions: [
Transition {
from: "out"
to: "in"
from: "showDefaultBackgroundImage"
to: "hideDefaultBackgroundImage"
reversible: true
PropertyAnimation {
target: imgCover
duration: 600
property: "opacity"
SequentialAnimation {
PauseAnimation {
duration: 100
}
PropertyAnimation {
target: imgCover
duration: 600
property: "opacity"
}
}
},
Transition {
from: "out"
to: "outExit"
from: "hideDefaultBackgroundImage"
to: "exit"
reversible: true
SequentialAnimation {
PropertyAnimation {
@ -234,4 +240,67 @@ Rectangle {
}
}
}
Pane {
id: debug
visible: Wallpaper.debugMode
enabled: Wallpaper.debugMode
width: parent.width * .3
height: parent.height * .3
anchors.centerIn: parent
background: Rectangle {
opacity: .5
}
Column {
anchors.fill: parent
anchors.margins: 20
spacing: 10
Text {
text: "appID " + Wallpaper.appID
font.pointSize: 14
}
Text {
text: "basePath " + Wallpaper.basePath
font.pointSize: 14
}
Text {
text: "fullContentPath " + Wallpaper.fullContentPath
font.pointSize: 14
}
Text {
text: "fillMode " + Wallpaper.fillMode
font.pointSize: 14
}
Text {
text: "sdk.type " + Wallpaper.sdk.type
font.pointSize: 14
}
Text {
text: "sdk.isConnected " + Wallpaper.sdk.isConnected
font.pointSize: 14
}
Text {
text: "sdk.appID " + Wallpaper.sdk.appID
font.pointSize: 14
}
Text {
text: "canFadeByWallpaperFillMode " + canFadeByWallpaperFillMode
font.pointSize: 14
}
Text {
text: "Wallpaper.canFade " + Wallpaper.canFade
font.pointSize: 14
}
Text {
text: "imgCover.source " + Qt.resolvedUrl(
"file:///" + Wallpaper.windowsDesktopProperties.wallpaperPath)
font.pointSize: 14
}
Text {
text: "imgCover.status " + imgCover.status
font.pointSize: 14
}
}
}
}

View File

@ -5,6 +5,8 @@
#include <QtGlobal>
#include <QtWebEngine>
#include "ScreenPlayUtil/util.h"
#if defined(Q_OS_WIN)
#include "src/winwindow.h"
#endif
@ -17,11 +19,9 @@
#include "src/macwindow.h"
#endif
#include "screenplaysdk.h"
int main(int argc, char* argv[])
{
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
//QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
QApplication app(argc, argv);
@ -32,17 +32,12 @@ int main(int argc, char* argv[])
// If we start with only one argument (app path)
// It means we want to test a single wallpaper
QStringList argumentList = app.arguments();
if (argumentList.length() == 1) {
//Set the monitor number to test
#if defined(Q_OS_WIN)
WinWindow window1({ 0 }, "test", "appid", "1", "fill", true);
//WinWindow window2({ 1 }, "test", "appid", "1", "fill");
//WinWindow window3({ 2 }, "test", "appid", "1", "fill");
// WinWindow window({ 0 }, "C:/Program Files (x86)/Steam/steamapps/workshop/content/672870/qmlParticles", "appid", "1", "fill", true);
WinWindow window1({ 0 }, "test", "appID=test", "1", "fill", "videoWallpaper", true, true);
//WinWindow window2({ 1 }, "test", "appID=xyz", "1", "fill", true, true);
//WinWindow window3({ 2 }, "test", "appID=123", "1", "fill", true,true);
#endif
#if defined(Q_OS_LINUX)
LinuxWindow window({ 0 }, "/home/graphicscore/Desktop/wallpapers/MechaGirl", "appid", "1", "fill", false);
@ -54,48 +49,24 @@ int main(int argc, char* argv[])
return app.exec();
}
// 6 parameter + 1 OS working directory default paramter
// 8 parameter + 1 OS working directory as the first default paramter
if (argumentList.length() != 9) {
return -3;
}
// AppID, Type
ScreenPlaySDK sdk(argumentList.at(3), argumentList.at(6));
const bool debugMode = false;
QString monitorNumbers = argumentList.at(1);
QStringList activeScreensList = monitorNumbers.split(",");
const auto activeScreensList = ScreenPlayUtil::parseStringToIntegerList(argumentList.at(1));
activeScreensList.removeAll(",");
QVector<int> list;
if (monitorNumbers.length() == 1) {
bool canParseMonitorNumber = false;
int monitor = monitorNumbers.toInt(&canParseMonitorNumber);
if (!canParseMonitorNumber) {
qFatal("Could not parse monitor id to diplay wallpaper");
} else {
list.append(monitor);
}
} else {
for (const QString& s : activeScreensList) {
bool ok = false;
int val = s.toInt(&ok);
if (!ok) {
qFatal("Could not parse monitor id to diplay wallpaper");
} else {
list.append(val);
}
}
}
if (list.empty()) {
if (!activeScreensList.has_value())
return -4;
}
// Args: which monitor, (2) path to project, (3)wallpaper secret to identify the connected socket, (4) volume, (5) fillmode, (6) type, (7)
// See screenplay.h @ScreenPlayWallpaper constructor how the args get created
// See ScreenPlayWallpaper m_appArgumentsList constructor how the args get created
const QString projectFilePath = argumentList.at(2);
const QString appID = argumentList.at(3);
const QString volume = argumentList.at(4);
const QString fillmode = argumentList.at(5);
const QString type = argumentList.at(6);
bool okParseCheckWallpaperVisible = false;
bool checkWallpaperVisible = argumentList.at(7).toInt(&okParseCheckWallpaperVisible);
@ -105,20 +76,37 @@ int main(int argc, char* argv[])
}
#if defined(Q_OS_WIN)
WinWindow window(list, argumentList.at(2), argumentList.at(3), argumentList.at(4), argumentList.at(5), checkWallpaperVisible);
QObject::connect(&sdk, &ScreenPlaySDK::sdkDisconnected, &window, &WinWindow::destroyThis);
QObject::connect(&sdk, &ScreenPlaySDK::incommingMessage, &window, &WinWindow::messageReceived);
QObject::connect(&sdk, &ScreenPlaySDK::replaceWallpaper, &window, &WinWindow::replaceWallpaper);
WinWindow window(
activeScreensList.value(),
projectFilePath,
appID,
volume,
fillmode,
type,
checkWallpaperVisible,
debugMode);
#endif
#if defined(Q_OS_LINUX)
LinuxWindow window(list, argumentList.at(2), argumentList.at(3), argumentList.at(4), argumentList.at(5), checkWallpaperVisible);
LinuxWindow window(
activeScreensList.value(),
projectPath,
appID,
fillmode,
volume,
checkWallpaperVisible);
QObject::connect(&sdk, &ScreenPlaySDK::sdkDisconnected, &window, &LinuxWindow::destroyThis);
QObject::connect(&sdk, &ScreenPlaySDK::incommingMessage, &window, &LinuxWindow::messageReceived);
#endif
#if defined(Q_OS_OSX)
MacWindow window(list, argumentList.at(2), argumentList.at(3), argumentList.at(4), argumentList.at(5));
MacWindow window(
activeScreensList.value(),
projectPath,
appID,
fillmode,
volume,
checkWallpaperVisible);
QObject::connect(&sdk, &ScreenPlaySDK::sdkDisconnected, &window, &MacWindow::destroyThis);
QObject::connect(&sdk, &ScreenPlaySDK::incommingMessage, &window, &MacWindow::messageReceived);
#endif

View File

@ -158,7 +158,7 @@ MainWindow::MainWindow(int screenAt, QString projectPath, QString id, QString de
}
});
QTimer::singleShot(3000, [=]() {
QTimer::singleShot(3000, this, [=]() {
ShowWindow(m_hwnd, SW_SHOWNOACTIVATE);
});

View File

@ -6,12 +6,17 @@ BaseWindow::BaseWindow(QObject* parent)
}
BaseWindow::BaseWindow(
const QString& projectFilePath,
const QVector<int> activeScreensList,
const bool checkWallpaperVisible)
const QString& projectFilePath,
const QString& type,
const bool checkWallpaperVisible,
const QString& appID,
const bool debugMode)
: QObject(nullptr)
, m_checkWallpaperVisible(checkWallpaperVisible)
, m_activeScreensList(activeScreensList)
, m_debugMode(debugMode)
, m_sdk(std::make_unique<ScreenPlaySDK>(appID, type))
{
QApplication::instance()->installEventFilter(this);
@ -24,6 +29,13 @@ BaseWindow::BaseWindow(
qmlRegisterType<BaseWindow>("ScreenPlay.Wallpaper", 1, 0, "Wallpaper");
if (!appID.contains("appID=")) {
qInfo() << "Invalid appID: "<< appID;
qFatal("AppID does not contain appID=");
}
setAppID(appID);
setOSVersion(QSysInfo::productVersion());
if (projectFilePath == "test") {

View File

@ -48,12 +48,22 @@
#include "ScreenPlayUtil/util.h"
#include "screenplaysdk.h"
#include <memory>
class BaseWindow : public QObject {
Q_OBJECT
public:
BaseWindow(QObject* parent = nullptr);
BaseWindow(const QString& projectFilePath, const QVector<int> activeScreensList, const bool checkWallpaperVisible);
BaseWindow(
const QVector<int> activeScreensList,
const QString& projectFilePath,
const QString& type,
const bool checkWallpaperVisible,
const QString& appID,
const bool debugMode);
Q_PROPERTY(int width READ width WRITE setWidth NOTIFY widthChanged)
Q_PROPERTY(int height READ height WRITE setHeight NOTIFY heightChanged)
@ -68,6 +78,7 @@ public:
Q_PROPERTY(bool isPlaying READ isPlaying WRITE setIsPlaying NOTIFY isPlayingChanged)
Q_PROPERTY(bool muted READ muted WRITE setMuted NOTIFY mutedChanged)
Q_PROPERTY(bool canFade READ canFade WRITE setCanFade NOTIFY canFadeChanged)
Q_PROPERTY(bool debugMode READ debugMode WRITE setDebugMode NOTIFY debugModeChanged)
// Save performance by checking if the wallpaper is visible (video wallpaper only for now)
Q_PROPERTY(bool checkWallpaperVisible READ checkWallpaperVisible WRITE setCheckWallpaperVisible NOTIFY checkWallpaperVisibleChanged)
@ -80,6 +91,8 @@ public:
Q_PROPERTY(ScreenPlay::InstalledType::InstalledType type READ type WRITE setType NOTIFY typeChanged)
Q_PROPERTY(QString OSVersion READ OSVersion WRITE setOSVersion NOTIFY OSVersionChanged)
Q_PROPERTY(ScreenPlaySDK* sdk READ sdk WRITE setSdk NOTIFY sdkChanged)
bool loops() const { return m_loops; }
float volume() const { return m_volume; }
bool isPlaying() const { return m_isPlaying; }
@ -98,6 +111,8 @@ public:
bool checkWallpaperVisible() const { return m_checkWallpaperVisible; }
bool visualsPaused() const { return m_visualsPaused; }
QString basePath() const { return m_basePath; }
bool debugMode() const { return m_debugMode; }
ScreenPlaySDK* sdk() const { return m_sdk.get(); }
signals:
void qmlExit();
@ -124,6 +139,8 @@ signals:
void checkWallpaperVisibleChanged(bool checkWallpaperVisible);
void visualsPausedChanged(bool visualsPaused);
void basePathChanged(QString basePath);
void debugModeChanged(bool debugMode);
void sdkChanged(ScreenPlaySDK* sdk);
public slots:
virtual void destroyThis() { }
@ -307,6 +324,22 @@ public slots:
emit basePathChanged(m_basePath);
}
void setDebugMode(bool debugMode)
{
if (m_debugMode == debugMode)
return;
m_debugMode = debugMode;
emit debugModeChanged(debugMode);
}
void setSdk(ScreenPlaySDK* sdk)
{
if (m_sdk.get() == sdk)
return;
m_sdk.reset(sdk);
emit sdkChanged(sdk);
}
private:
void setupLiveReloading();
@ -335,4 +368,6 @@ private:
QFileSystemWatcher m_fileSystemWatcher;
QSysInfo m_sysinfo;
QString m_basePath;
bool m_debugMode = false;
std::unique_ptr<ScreenPlaySDK> m_sdk;
};

View File

@ -1,6 +1,41 @@
#include "winwindow.h"
#include "WinUser.h"
#include "qqml.h"
#include <ShellScalingApi.h>
#include <algorithm>
#include <iostream>
#include <vector>
#include <windows.h>
struct WinMonitorStats {
std::vector<int> iMonitors;
std::vector<HMONITOR> hMonitors;
std::vector<HDC> hdcMonitors;
std::vector<RECT> rcMonitors;
std::vector<DEVICE_SCALE_FACTOR> scaleFactor;
std::vector<std::pair<UINT, UINT>> sizes;
static BOOL CALLBACK MonitorEnum(HMONITOR hMon, HDC hdc, LPRECT lprcMonitor,
LPARAM pData)
{
WinMonitorStats* pThis = reinterpret_cast<WinMonitorStats*>(pData);
auto scaleFactor = DEVICE_SCALE_FACTOR::DEVICE_SCALE_FACTOR_INVALID;
GetScaleFactorForMonitor(hMon, &scaleFactor);
UINT x = 0;
UINT y = 0;
GetDpiForMonitor(hMon, MONITOR_DPI_TYPE::MDT_RAW_DPI, &x, &y);
pThis->sizes.push_back({ x, y });
pThis->scaleFactor.push_back(scaleFactor);
pThis->hMonitors.push_back(hMon);
pThis->hdcMonitors.push_back(hdc);
pThis->rcMonitors.push_back(*lprcMonitor);
pThis->iMonitors.push_back(pThis->hdcMonitors.size());
return TRUE;
}
WinMonitorStats() { EnumDisplayMonitors(0, 0, MonitorEnum, (LPARAM)this); }
};
BOOL WINAPI SearchForWorkerWindow(HWND hwnd, LPARAM lparam)
{
@ -17,6 +52,7 @@ BOOL WINAPI SearchForWorkerWindow(HWND hwnd, LPARAM lparam)
HHOOK g_mouseHook;
QPoint g_LastMousePosition { 0, 0 };
QPoint g_globalOffset { 0, 0 };
QQuickView* g_winGlobalHook = nullptr;
LRESULT __stdcall MouseHookCallback(int nCode, WPARAM wParam, LPARAM lParam)
@ -62,12 +98,13 @@ LRESULT __stdcall MouseHookCallback(int nCode, WPARAM wParam, LPARAM lParam)
QApplication::sendEvent(g_winGlobalHook, &event);
if (type == QMouseEvent::Type::MouseButtonPress) {
QTimer::singleShot(100, []() {
auto eventRelease = QMouseEvent(QMouseEvent::Type::MouseButtonRelease, g_LastMousePosition, Qt::MouseButton::LeftButton, Qt::LeftButton, {});
QApplication::sendEvent(g_winGlobalHook, &eventRelease);
});
}
QTimer::singleShot(100, [&]() {
//auto eventPress = QMouseEvent(QMouseEvent::Type::MouseButtonPress, g_LastMousePosition, mouseButton, mouseButtons, {});
//qInfo() << mouseButton << QApplication::sendEvent(g_winGlobalHook, &eventPress) << g_globalOffset.x() << g_globalOffset.y();
auto eventRelease = QMouseEvent(QMouseEvent::Type::MouseButtonRelease, g_LastMousePosition, mouseButton, mouseButtons, {});
QApplication::sendEvent(g_winGlobalHook, &eventRelease);
});
return CallNextHookEx(g_mouseHook, nCode, wParam, lParam);
}
@ -92,25 +129,43 @@ void WinWindow::setupWindowMouseHook()
WinWindow::WinWindow(
const QVector<int>& activeScreensList,
const QString& projectPath,
const QString& id,
const QString& projectFilePath,
const QString& appID,
const QString& volume,
const QString& fillmode,
const bool checkWallpaperVisible)
: BaseWindow(projectPath, activeScreensList, checkWallpaperVisible)
const QString& type,
const bool checkWallpaperVisible,
const bool debugMode)
: BaseWindow(
activeScreensList,
projectFilePath,
type,
checkWallpaperVisible,
appID,
debugMode)
{
auto* guiAppInst = dynamic_cast<QApplication*>(QApplication::instance());
connect(guiAppInst, &QApplication::screenAdded, this, &WinWindow::configureWindowGeometry);
connect(guiAppInst, &QApplication::screenRemoved, this, &WinWindow::configureWindowGeometry);
connect(guiAppInst, &QApplication::primaryScreenChanged, this, &WinWindow::configureWindowGeometry);
connect(sdk(), &ScreenPlaySDK::sdkDisconnected, this, &WinWindow::destroyThis);
connect(sdk(), &ScreenPlaySDK::incommingMessage, this, &WinWindow::messageReceived);
connect(sdk(), &ScreenPlaySDK::replaceWallpaper, this, &WinWindow::replaceWallpaper);
connect(&m_checkForFullScreenWindowTimer, &QTimer::timeout, this, &WinWindow::checkForFullScreenWindow);
const auto screens = QApplication::screens();
for (const auto& screen : screens) {
connect(screen, &QScreen::geometryChanged, this, &WinWindow::configureWindowGeometry);
}
qRegisterMetaType<WindowsDesktopProperties*>();
qRegisterMetaType<WinWindow*>();
m_windowsDesktopProperties = std::make_unique<WindowsDesktopProperties>();
m_windowHandle = reinterpret_cast<HWND>(m_window.winId());
if (!IsWindow(m_windowHandle)) {
qFatal("Could not get a valid window handle!");
}
ShowWindow(m_windowHandleWorker, SW_HIDE);
setAppID(id);
qRegisterMetaType<WindowsDesktopProperties*>();
qRegisterMetaType<WinWindow*>();
bool ok = false;
float volumeParsed = volume.toFloat(&ok);
@ -121,41 +176,20 @@ WinWindow::WinWindow(
setVolume(volumeParsed);
setFillMode(fillmode);
if (!searchWorkerWindowToParentTo()) {
qFatal("No worker window found");
}
// WARNING: Setting Window flags must be called *here*!
SetWindowLongPtr(m_windowHandle, GWL_EXSTYLE, WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW | WS_EX_TRANSPARENT);
SetWindowLongPtr(m_windowHandle, GWL_STYLE, WS_POPUPWINDOW);
// Windows coordante system begins at 0x0 at the
// main monitors upper left and not at the most left top monitor
calcOffsets();
// Ether for one Screen or for all
if ((QApplication::screens().length() == activeScreensList.length()) && (activeScreensList.length() != 1)) {
setupWallpaperForAllScreens();
} else if (activeScreensList.length() == 1) {
setupWallpaperForOneScreen(activeScreensList.at(0));
setCanFade(true);
} else if (activeScreensList.length() > 1) {
setupWallpaperForMultipleScreens(activeScreensList);
}
setWidth(m_window.width());
setHeight(m_window.height());
qmlRegisterSingletonInstance<WinWindow>("ScreenPlayWallpaper", 1, 0, "Wallpaper", this);
// Instead of setting "renderType: Text.NativeRendering" every time
// we can set it here once :)
m_window.setTextRenderType(QQuickWindow::TextRenderType::NativeTextRendering);
m_window.setResizeMode(QQuickView::ResizeMode::SizeRootObjectToView);
m_window.setSource(QUrl("qrc:/Wallpaper.qml"));
m_window.hide();
QObject::connect(&m_checkForFullScreenWindowTimer, &QTimer::timeout, this, &WinWindow::checkForFullScreenWindow);
configureWindowGeometry();
bool hasWindowScaling = false;
for (int i = 0; i < screens.count(); i++) {
if (getScaling(i) != 1) {
hasWindowScaling = true;
break;
}
}
if (hasWindowScaling) {
qInfo() << "scaling";
configureWindowGeometry();
}
// We do not support autopause for multi monitor wallpaper
if (this->activeScreensList().length() == 1) {
@ -164,21 +198,22 @@ WinWindow::WinWindow(
}
}
QTimer::singleShot(1000, [this]() {
QTimer::singleShot(1000, this, [&]() {
setupWindowMouseHook();
});
sdk()->start();
}
void WinWindow::setVisible(bool show)
{
if (show) {
if (!ShowWindow(m_windowHandle, SW_SHOW)) {
if (!ShowWindow(m_windowHandle, SW_SHOW))
qDebug() << "Cannot set window handle SW_SHOW";
}
} else {
if (!ShowWindow(m_windowHandle, SW_HIDE)) {
if (!ShowWindow(m_windowHandle, SW_HIDE))
qDebug() << "Cannot set window handle SW_HIDE";
}
}
}
@ -187,26 +222,62 @@ void WinWindow::destroyThis()
emit qmlExit();
}
void WinWindow::calcOffsets()
struct sEnumInfo {
int iIndex;
HMONITOR hMonitor;
};
BOOL CALLBACK GetMonitorByIndex(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
{
for (int i = 0; i < QApplication::screens().count(); i++) {
QScreen* screen = QApplication::screens().at(i);
if (screen->availableGeometry().x() < 0) {
m_windowOffsetX += (screen->availableGeometry().x() * -1);
}
if (screen->availableGeometry().y() < 0) {
m_windowOffsetY += (screen->availableGeometry().y() * -1);
}
auto* info = (sEnumInfo*)dwData;
if (--info->iIndex < 0) {
info->hMonitor = hMonitor;
return FALSE;
}
return TRUE;
}
void WinWindow::setupWallpaperForOneScreen(int activeScreen)
{
QScreen* screen = QApplication::screens().at(activeScreen);
QRect screenRect = screen->geometry();
const QRect screenRect = QApplication::screens().at(activeScreen)->geometry();
if (!SetWindowPos(m_windowHandle, nullptr, screenRect.x() + m_windowOffsetX - 1, screenRect.y() + m_windowOffsetY - 1, screenRect.width() + 2, screenRect.height() + 2, SWP_HIDEWINDOW)) {
qFatal("Could not set window pos: ");
const float scaling = 1; //getScaling(activeScreen);
for (int i = 0; i < QApplication::screens().count(); i++) {
// qInfo() << i << "scaling " << getScaling(i) << QApplication::screens().at(i)->geometry();
}
// qInfo() << activeScreen << "Monitor 0" << getScaling(0) << QApplication::screens().at(0)->geometry();
// qInfo() << activeScreen << "Monitor 1" << getScaling(1) << QApplication::screens().at(1)->geometry();
WinMonitorStats Monitors;
int width = std::abs(Monitors.rcMonitors[activeScreen].right - Monitors.rcMonitors[activeScreen].left);
int height = std::abs(Monitors.rcMonitors[activeScreen].top - Monitors.rcMonitors[activeScreen].bottom);
//qInfo() << "scaling " << scaling << width << height << " activeScreen " << activeScreen;
//qInfo() << "scaling " << scaling << screenRect.width() << screenRect.height() << " activeScreen " << activeScreen;
const int boderWidth = 2;
const int borderOffset = -1;
// Needs to be set like to this work. I do not know why...
if (!SetWindowPos(
m_windowHandle,
nullptr,
Monitors.rcMonitors[activeScreen].left + borderOffset,
Monitors.rcMonitors[activeScreen].top + borderOffset,
width + boderWidth,
height + boderWidth,
SWP_HIDEWINDOW)) {
qFatal("Could not set window pos");
}
if (!SetWindowPos(
m_windowHandle,
nullptr,
screenRect.x() + m_zeroPoint.x() + borderOffset,
screenRect.y() + m_zeroPoint.y() + borderOffset,
screenRect.width() * scaling + boderWidth,
screenRect.height() * scaling + boderWidth,
SWP_HIDEWINDOW)) {
qFatal("Could not set window pos");
}
if (SetParent(m_windowHandle, m_windowHandleWorker) == nullptr) {
qFatal("Could not attach to parent window");
@ -252,7 +323,7 @@ void WinWindow::setupWallpaperForMultipleScreens(const QVector<int>& activeScree
rect.setX(upperLeftScreen->geometry().x());
rect.setY(upperLeftScreen->geometry().y());
if (!SetWindowPos(m_windowHandle, nullptr, rect.x() + m_windowOffsetX, rect.y() + m_windowOffsetY, rect.width(), rect.height(), SWP_SHOWWINDOW)) {
if (!SetWindowPos(m_windowHandle, nullptr, rect.x() + m_zeroPoint.x(), rect.y() + m_zeroPoint.y(), rect.width(), rect.height(), SWP_SHOWWINDOW)) {
qFatal("Could not set window pos: ");
}
if (SetParent(m_windowHandle, m_windowHandleWorker) == nullptr) {
@ -271,11 +342,83 @@ bool WinWindow::searchWorkerWindowToParentTo()
return EnumWindows(SearchForWorkerWindow, reinterpret_cast<LPARAM>(&m_windowHandleWorker));
}
QString printWindowNameByhWnd(HWND hWnd)
float WinWindow::getScaling(const int monitorIndex)
{
std::wstring title(GetWindowTextLength(hWnd) + 1, L'\0');
GetWindowTextW(hWnd, &title[0], title.size());
return QString::fromStdWString(title);
// screen->logicalDotsPerInch()
// 100% - 96
// 125% - 120
// 150% - 144
// 175% - 168
// 200% - 192
QScreen* screen = QApplication::screens().at(monitorIndex);
const int factor = screen->logicalDotsPerInch();
switch (factor) {
case 96:
return 1;
case 120:
return 1.25;
case 144:
return 1.5;
case 168:
return 1.75;
case 192:
return 2;
case 216:
return 2.25;
case 240:
return 2.5;
case 288:
return 3;
case 336:
return 3.5;
default:
qWarning() << "Monitor with factor: " << factor << " detected! This is not supported!";
return 1;
}
}
void WinWindow::configureWindowGeometry()
{
ShowWindow(m_windowHandle, SW_HIDE);
if (!searchWorkerWindowToParentTo()) {
qFatal("No worker window found");
}
RECT rect {};
if (!GetWindowRect(m_windowHandleWorker, &rect)) {
qFatal("Unable to get WindoeRect from worker");
}
// Windows coordante system begins at 0x0 at the
// main monitors upper left and not at the most left top monitor.
// This can be easily read from the worker window.
m_zeroPoint = { std::abs(rect.left), std::abs(rect.top) };
g_globalOffset = m_zeroPoint;
// WARNING: Setting Window flags must be called *here*!
SetWindowLongPtr(m_windowHandle, GWL_EXSTYLE, WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW | WS_EX_TRANSPARENT);
SetWindowLongPtr(m_windowHandle, GWL_STYLE, WS_POPUPWINDOW);
// Ether for one Screen or for all
if ((QApplication::screens().length() == activeScreensList().length()) && (activeScreensList().length() != 1)) {
setupWallpaperForAllScreens();
} else if (activeScreensList().length() == 1) {
setupWallpaperForOneScreen(activeScreensList().at(0));
setCanFade(true);
} else if (activeScreensList().length() > 1) {
setupWallpaperForMultipleScreens(activeScreensList());
}
setWidth(m_window.width());
setHeight(m_window.height());
// Instead of setting "renderType: Text.NativeRendering" every time
// we can set it here once :)
m_window.setTextRenderType(QQuickWindow::TextRenderType::NativeTextRendering);
m_window.setResizeMode(QQuickView::ResizeMode::SizeRootObjectToView);
m_window.setSource(QUrl("qrc:/Wallpaper.qml"));
m_window.hide();
}
BOOL CALLBACK FindTheDesiredWnd(HWND hWnd, LPARAM lParam)
@ -288,11 +431,6 @@ BOOL CALLBACK FindTheDesiredWnd(HWND hWnd, LPARAM lParam)
return true; // keep enumerating
}
struct sEnumInfo {
int iIndex = 0;
HMONITOR hMonitor = NULL;
};
BOOL CALLBACK GetMonitorByHandle(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
{
Q_UNUSED(hdcMonitor)

View File

@ -60,11 +60,12 @@ class WinWindow : public BaseWindow {
public:
explicit WinWindow(
const QVector<int>& activeScreensList,
const QString& projectPath,
const QString& id,
const QString& projectFilePath,
const QString& appID,
const QString& volume,
const QString& fillmode,
const bool checkWallpaperVisible);
const QString& fillmode, const QString &type,
const bool checkWallpaperVisible,
const bool debugMode = false);
WindowsDesktopProperties* windowsDesktopProperties() const { return m_windowsDesktopProperties.get(); }
@ -93,16 +94,18 @@ private:
void setupWallpaperForMultipleScreens(const QVector<int>& activeScreensList);
void setupWindowMouseHook();
bool searchWorkerWindowToParentTo();
void configureWindowGeometry();
float getScaling(const int monitorIndex);
private slots:
void checkForFullScreenWindow();
private:
int m_windowOffsetX = 0;
int m_windowOffsetY = 0;
QPoint m_zeroPoint {};
QQuickView m_window;
HWND m_windowHandle;
HWND m_windowHandleWorker;
HWND m_windowHandle {};
HWND m_windowHandleWorker {};
QTimer m_checkForFullScreenWindowTimer;
QTimer m_reconfigureTimer;
std::unique_ptr<WindowsDesktopProperties> m_windowsDesktopProperties;
};

View File

@ -69,7 +69,7 @@ WidgetWindow::WidgetWindow(
m_window.show();
// Do not trigger position changed save reuqest on startup
QTimer::singleShot(1000, [=, this]() {
QTimer::singleShot(1000, this, [=, this]() {
// We limit ourself to only update the position every 500ms!
auto sendPositionUpdate = [this]() {
m_positionMessageLimiter.stop();

View File

@ -5,8 +5,8 @@ cd ..
git clone https://github.com/microsoft/vcpkg.git ScreenPlay-vcpkg
cd ScreenPlay-vcpkg
git pull
# master 25.01.2021 - fc0d6b28006e0607a6b9871641ec48925274e079
git checkout fc0d6b28006e0607a6b9871641ec48925274e079
# master 27.03.2021 - 9f6157a
git checkout 9f6157a
chmod +x bootstrap-vcpkg.sh
./bootstrap-vcpkg.sh
chmod +x vcpkg

View File

@ -5,8 +5,8 @@ cd ..
git clone https://github.com/microsoft/vcpkg.git ScreenPlay-vcpkg
cd ScreenPlay-vcpkg
git pull
rem master 25.01.2021 - fc0d6b28006e0607a6b9871641ec48925274e079
git checkout fc0d6b28006e0607a6b9871641ec48925274e079
rem master 27.03.2021 - 9f6157a
git checkout 9f6157a
call bootstrap-vcpkg.bat
rem Install vcpkg dependencies