1
0
mirror of https://gitlab.com/kelteseth/ScreenPlay.git synced 2024-11-07 03:22:33 +01: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> 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> 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://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> <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> <br><br>
@ -34,6 +37,11 @@ Windows only, Linux and MacOS (soon™)
<p>Click gif to see the Steam Early Access Trailer (YouTube)</p> <p>Click gif to see the Steam Early Access Trailer (YouTube)</p>
</div> </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 # 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/) [Learn the basics of QML for Wallpapers and Widgets in 5 minutes](https://screen-play.app/blog/guide_learn_the_basics_of_qml/)
<div> <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::setOrganizationName("ScreenPlay");
QGuiApplication::setOrganizationDomain("https://screen-play.app"); QGuiApplication::setOrganizationDomain("https://screen-play.app");
QGuiApplication::setApplicationName("ScreenPlay"); QGuiApplication::setApplicationName("ScreenPlay");
QGuiApplication::setApplicationVersion("0.13.0"); QGuiApplication::setApplicationVersion("0.13.1");
QGuiApplication::setQuitOnLastWindowClosed(false); QGuiApplication::setQuitOnLastWindowClosed(false);
QFontDatabase::addApplicationFont(":/assets/fonts/LibreBaskerville-Italic.ttf"); 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 // 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); 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 // Workaround because we cannot force to send exit event
m_telemetry->setSendInterval(5); m_telemetry->setSendInterval(5);
m_telemetry->endSession(); 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(); void init();
bool m_isAnotherScreenPlayInstanceRunning { false }; bool m_isAnotherScreenPlayInstanceRunning { false };
GlobalVariables* globalVariables() const GlobalVariables* globalVariables() const { return m_globalVariables.get(); }
{ ScreenPlayManager* screenPlayManager() const { return m_screenPlayManager.get(); }
return m_globalVariables.get(); Create* create() const { return m_create.get(); }
} Util* util() const { return m_util.get(); }
Settings* settings() const { return m_settings.get(); }
ScreenPlayManager* screenPlayManager() const InstalledListModel* installedListModel() const { return m_installedListModel.get(); }
{ MonitorListModel* monitorListModel() const { return m_monitorListModel.get(); }
return m_screenPlayManager.get(); ProfileListModel* profileListModel() const { return m_profileListModel.get(); }
} InstalledListFilter* installedListFilter() const { return m_installedListFilter.get(); }
QQmlApplicationEngine* mainWindowEngine() const { return m_mainWindowEngine.get(); }
Create* create() const Wizards* wizards() const { return m_wizards.get(); }
{
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: signals:
void globalVariablesChanged(GlobalVariables* globalVariables); void globalVariablesChanged(GlobalVariables* globalVariables);
@ -161,7 +118,7 @@ signals:
void wizardsChanged(Wizards* wizards); void wizardsChanged(Wizards* wizards);
public slots: public slots:
QString version() const;
void exit(); void exit();
bool loadSteamPlugin(); bool loadSteamPlugin();
bool unloadSteamPlugin(); bool unloadSteamPlugin();

View File

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

View File

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

View File

@ -105,6 +105,9 @@ Item {
id: repeater id: repeater
model: ListModel { model: ListModel {
id: webModel id: webModel
ListElement {
url: "https://screen-play.app/blog/"
}
ListElement { ListElement {
url: "https://kelteseth.gitlab.io/ScreenPlayDocs/" 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) { if (installedType === InstalledType.VideoWallpaper) {
videoControlWrapper.state = "visible" videoControlWrapper.state = "visible"
customPropertiesGridView.visible = false customPropertiesGridView.visible = false
const wallpaper = ScreenPlay.screenPlayManager.getWallpaperByAppID( const wallpaper = ScreenPlay.screenPlayManager.getWallpaperByAppID(appID)
appID)
videoControlWrapper.wallpaper = wallpaper videoControlWrapper.wallpaper = wallpaper
} else { } else {
videoControlWrapper.state = "hidden" videoControlWrapper.state = "hidden"
customPropertiesGridView.visible = true customPropertiesGridView.visible = true
ScreenPlay.screenPlayManager.requestProjectSettingsAtMonitorIndex( ScreenPlay.screenPlayManager.requestProjectSettingsAtMonitorIndex(index)
index)
} }
activeMonitorIndex = index activeMonitorIndex = index
@ -135,8 +133,10 @@ Popup {
font.family: ScreenPlay.settings.font font.family: ScreenPlay.settings.font
enabled: monitorSelection.activeMonitors.length == 1 enabled: monitorSelection.activeMonitors.length == 1
onClicked: { onClicked: {
ScreenPlay.screenPlayManager.removeWallpaperAt( if (!ScreenPlay.screenPlayManager.removeWallpaperAt(
monitorSelection.activeMonitors[0]) monitorSelection.activeMonitors[0])) {
print("Unable to close singel wallpaper")
}
} }
} }
Button { Button {
@ -149,21 +149,26 @@ Popup {
font.family: ScreenPlay.settings.font font.family: ScreenPlay.settings.font
enabled: ScreenPlay.screenPlayManager.activeWallpaperCounter > 0 enabled: ScreenPlay.screenPlayManager.activeWallpaperCounter > 0
onClicked: { onClicked: {
ScreenPlay.screenPlayManager.removeAllWallpapers() if (!ScreenPlay.screenPlayManager.removeAllWallpapers()) {
print("Unable to close all wallpaper!")
}
monitors.close() monitors.close()
} }
} }
Button { Button {
id: btnRemoveAllWidgets id: btnRemoveAllWidgets
text: qsTr("Remove ") text: qsTr("Remove ")
+ ScreenPlay.screenPlayManager.activeWidgetsCounter + " " + qsTr( + ScreenPlay.screenPlayManager.activeWidgetsCounter + " " + qsTr("Widgets")
"Widgets")
Material.background: Material.accent Material.background: Material.accent
Material.foreground: "white" Material.foreground: "white"
font.family: ScreenPlay.settings.font font.family: ScreenPlay.settings.font
enabled: ScreenPlay.screenPlayManager.activeWidgetsCounter > 0 enabled: ScreenPlay.screenPlayManager.activeWidgetsCounter > 0
onClicked: { onClicked: {
ScreenPlay.screenPlayManager.removeAllWidgets() if (!ScreenPlay.screenPlayManager.removeAllWidgets()) {
print("Unable to close all widgets!")
}
monitors.close() monitors.close()
} }
} }

View File

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

View File

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

View File

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

View File

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

View File

@ -99,7 +99,8 @@ public:
int rowCount(const QModelIndex& parent = QModelIndex()) const override; int rowCount(const QModelIndex& parent = QModelIndex()) const override;
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) 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); const QVector<int> monitors);
std::optional<QString> getAppIDByMonitorIndex(const int index) const; 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 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. 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 InstalledType::InstalledType type,
const FillMode::FillMode fillMode, const FillMode::FillMode fillMode,
const QString& absoluteStoragePath, const QString& absoluteStoragePath,
@ -146,9 +146,9 @@ void ScreenPlayManager::createWallpaper(
fillMode, fillMode,
type, type,
m_settings->checkWallpaperVisible()); m_settings->checkWallpaperVisible());
m_monitorListModel->setWallpaperActiveMonitor(wallpaper, monitorIndex); m_monitorListModel->setWallpaperMonitor(wallpaper, monitorIndex);
return; return true;
} }
} }
i++; i++;
@ -170,17 +170,21 @@ void ScreenPlayManager::createWallpaper(
m_settings->checkWallpaperVisible()); m_settings->checkWallpaperVisible());
QObject::connect(wallpaper.get(), &ScreenPlayWallpaper::requestSave, this, &ScreenPlayManager::requestSaveProfiles); 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); QObject::connect(wallpaper.get(), &ScreenPlayWallpaper::error, this, &ScreenPlayManager::displayErrorPopup);
if (!wallpaper->start()) {
return false;
}
m_screenPlayWallpapers.append(wallpaper); m_screenPlayWallpapers.append(wallpaper);
m_monitorListModel->setWallpaperActiveMonitor(wallpaper, monitorIndex); m_monitorListModel->setWallpaperMonitor(wallpaper, monitorIndex);
increaseActiveWallpaperCounter(); increaseActiveWallpaperCounter();
return true;
} }
/*! /*!
\brief Creates a ScreenPlayWidget object via a \a absoluteStoragePath and a \a preview image (relative path). \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 InstalledType::InstalledType type,
const QPoint& position, const QPoint& position,
const QString& absoluteStoragePath, const QString& absoluteStoragePath,
@ -200,7 +204,7 @@ void ScreenPlayManager::createWidget(
if (path.isEmpty()) { if (path.isEmpty()) {
qWarning() << "Path is empty, Abort! String: " << absoluteStoragePath; qWarning() << "Path is empty, Abort! String: " << absoluteStoragePath;
return; return false;
} }
auto widget = std::make_shared<ScreenPlayWidget>( auto widget = std::make_shared<ScreenPlayWidget>(
@ -213,79 +217,63 @@ void ScreenPlayManager::createWidget(
type); type);
QObject::connect(widget.get(), &ScreenPlayWidget::requestSave, this, &ScreenPlayManager::requestSaveProfiles); 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); QObject::connect(widget.get(), &ScreenPlayWidget::error, this, &ScreenPlayManager::displayErrorPopup);
if (!widget->start()) {
return false;
}
increaseActiveWidgetsCounter(); increaseActiveWidgetsCounter();
m_screenPlayWidgets.append(widget); m_screenPlayWidgets.append(widget);
return true;
} }
/*! /*!
\brief Iterates all Wallpaper and Widgets for the matching appID. Returns true if a matching appID \brief Removes all wallpaper entries in the profiles.json.
was successful set.
*/ */
bool ScreenPlayManager::appConnected(const std::shared_ptr<SDKConnection>& connection) bool ScreenPlayManager::removeAllWallpapers()
{ {
for (const auto& item : qAsConst(m_screenPlayWidgets)) {
if (item->appID() == connection->appID()) { if (m_screenPlayWallpapers.empty()) {
item->setSDKConnection(connection); qWarning() << "Trying to remove all Wallpapers while m_screenPlayWallpapers is not empty. Count: " << m_screenPlayWallpapers.size();
return true; 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)) { emit requestSaveProfiles();
if (item->appID() == connection->appID()) {
item->setSDKConnection(connection);
return true;
}
}
qWarning() << "No matching appID for id" << connection->appID() << " was found!"; return true;
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();
}
} }
/*! /*!
\brief Removes all widgets and resets the activeWidgetCounter to 0. \brief Removes all widgets and resets the activeWidgetCounter to 0.
*/ */
void ScreenPlayManager::removeAllWidgets() bool ScreenPlayManager::removeAllWidgets()
{ {
if (!m_screenPlayWidgets.empty()) { if (m_screenPlayWallpapers.empty()) {
closeAllWidgets(); qWarning() << "Trying to remove all Widgets while m_screenPlayWallpapers is not empty. Count: " << m_screenPlayWallpapers.size();
m_screenPlayWidgets.clear(); return false;
emit requestSaveProfiles();
setActiveWidgetsCounter(0);
} }
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)) { if (auto appID = m_monitorListModel->getAppIDByMonitorIndex(index)) {
return removeApp(*appID); if (removeWallpaper(*appID)) {
} emit requestSaveProfiles();
if (m_telemetry) { return true;
m_telemetry->sendEvent("wallpaper", "error_removeWallpaperAt"); }
} }
qWarning() << "Could not remove Wallpaper at index:" << index; qWarning() << "Could not remove Wallpaper at index:" << index;
return false; 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. \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)) { for (const std::shared_ptr<ScreenPlayWallpaper>& uPtrWallpaper : qAsConst(m_screenPlayWallpapers)) {
if (uPtrWallpaper->screenNumber()[0] == index) { if (uPtrWallpaper->screenNumber()[0] == index) {
emit projectSettingsListModelResult( emit projectSettingsListModelResult(
uPtrWallpaper->getProjectSettingsListModel()); 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) bool ScreenPlayManager::setWallpaperValueAtMonitorIndex(const int index, const QString& key, const QString& value)
{ {
if (auto appID = m_monitorListModel->getAppIDByMonitorIndex(index)) { if (auto appID = m_monitorListModel->getAppIDByMonitorIndex(index)) {
setWallpaperValue(*appID, key, value); return setWallpaperValue(*appID, key, value);
return true;
} }
qWarning() << "Could net get appID from m_monitorListModel!"; 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. \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)) { for (auto& wallpaper : m_screenPlayWallpapers) {
setWallpaperValue(uPtrWallpaper->appID(), key, value); return setWallpaperValue(wallpaper->appID(), key, value);
} }
return true;
} }
/*! /*!
\brief Returns \c a ScreenPlayWallpaper if successful, otherwhise \c std::nullopt. \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 ScreenPlayWallpaper* ScreenPlayManager::getWallpaperByAppID(const QString& appID) const
{ {
@ -387,113 +354,139 @@ ScreenPlayWallpaper* ScreenPlayManager::getWallpaperByAppID(const QString& appID
*/ */
void ScreenPlayManager::newConnection() 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 // 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::requestDecreaseWidgetCount, this, [this]() { setActiveWidgetsCounter(activeWallpaperCounter() - 1); });
QObject::connect(connection.get(), &SDKConnection::requestRaise, this, &ScreenPlayManager::requestRaise); 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) { QObject::connect(connection.get(), &SDKConnection::appConnected, this, [this](const SDKConnection* connection) {
for (const auto& client : qAsConst(m_clients)) { if (m_unconnectedClients.empty()) {
if (client.get() == connection) { qWarning() << "Unable to match a connection. UnconnectedClients list is empty!";
appConnected(client); 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; return;
} }
} }
qWarning() << "No matching connection found!";
});
m_clients.append(connection);
}
/*! for (int i = 0; i < m_screenPlayWidgets.size(); ++i) {
\brief Closes all wallpaper connection with the following type: if (m_screenPlayWidgets.at(i)->appID() == matchingConnection->appID()) {
\list m_screenPlayWidgets.at(i)->setSDKConnection(std::move(matchingConnection));
\li videoWallpaper return;
\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;
} }
} }
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; 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()) m_screenPlayWidgets.erase(
return true; std::remove_if(
m_screenPlayWidgets.begin(),
m_screenPlayWidgets.end(),
[this, appID](auto& widget) {
if (widget->appID() != appID) {
return false;
}
for (auto& client : m_clients) { qInfo() << "Remove widget ";
if (client->appID() == appID) {
client->close(); decreaseActiveWidgetsCounter();
return m_clients.removeOne(client);
} return true;
}));
if (activeWidgetsCounter() != m_screenPlayWidgets.length()) {
qWarning() << "activeWallpaperCounter value: " << activeWidgetsCounter()
<< "does not match m_screenPlayWallpapers length:" << m_screenPlayWidgets.length();
return false;
} }
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. \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) { 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 \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. 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(); m_saveLimiter.stop();
@ -520,27 +513,9 @@ void ScreenPlayManager::saveProfiles()
profile.insert("version", "1.0.0"); profile.insert("version", "1.0.0");
profile.insert("profiles", activeProfileList); 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(); emit profilesSaved();
} return true;
/*!
\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 false; 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 \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) { if (!configObj) {
qWarning() << "Could not load active profiles at path: " << m_globalVariables->localSettingsPath().toString() + "/profiles.json"; 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()); std::optional<QVersionNumber> version = ScreenPlayUtil::getVersionNumberFromString(configObj->value("version").toString());
if (version && *version != m_globalVariables->version()) { if (version && *version != m_globalVariables->version()) {
qWarning() << "Version missmatch fileVersion: " << version->toString() << "m_version: " << m_globalVariables->version().toString(); qWarning() << "Version missmatch fileVersion: " << version->toString() << "m_version: " << m_globalVariables->version().toString();
return; return false;
} }
QJsonArray activeProfilesTmp = configObj->value("profiles").toArray(); QJsonArray activeProfilesTmp = configObj->value("profiles").toArray();
if (activeProfilesTmp.size() > 1) { if (activeProfilesTmp.size() > 1) {
qWarning() << "We currently only support one profile!"; qWarning() << "We currently only support one profile!";
return; return false;
} }
qInfo() << "Loading profiles " << activeProfilesTmp.size(); qInfo() << "Loading profiles " << activeProfilesTmp.size();
@ -579,7 +554,7 @@ void ScreenPlayManager::loadProfiles()
if (wallpaper.toObject().value("name").toString() != "default") if (wallpaper.toObject().value("name").toString() != "default")
continue; continue;
for (const QJsonValueRef wallpaper : wallpaper.toObject().value("wallpaper").toArray()) { for (QJsonValueRef wallpaper : wallpaper.toObject().value("wallpaper").toArray()) {
QJsonObject wallpaperObj = wallpaper.toObject(); QJsonObject wallpaperObj = wallpaper.toObject();
if (wallpaperObj.empty()) if (wallpaperObj.empty())
@ -592,12 +567,12 @@ void ScreenPlayManager::loadProfiles()
int value = monitorNumber.toInt(-1); int value = monitorNumber.toInt(-1);
if (value == -1) { if (value == -1) {
qWarning() << "Could not parse monitor number to display content at"; qWarning() << "Could not parse monitor number to display content at";
return; return false;
} }
if (monitors.contains(value)) { if (monitors.contains(value)) {
qWarning() << "The monitor: " << value << " is sharing the config multiple times. "; qWarning() << "The monitor: " << value << " is sharing the config multiple times. ";
return; return false;
} }
monitors.append(value); monitors.append(value);
} }
@ -618,8 +593,11 @@ void ScreenPlayManager::loadProfiles()
const auto type = QStringToEnum<InstalledType::InstalledType>(typeString, InstalledType::InstalledType::VideoWallpaper); const auto type = QStringToEnum<InstalledType::InstalledType>(typeString, InstalledType::InstalledType::VideoWallpaper);
const auto fillMode = QStringToEnum<FillMode::FillMode>(fillModeString, FillMode::FillMode::Cover); const auto fillMode = QStringToEnum<FillMode::FillMode>(fillModeString, FillMode::FillMode::Cover);
qInfo() << "Start wallpaper from profile:" << type << fillMode << monitors << absolutePath; const bool success = createWallpaper(type, fillMode, absolutePath, previewImage, file, monitors, volume, playbackRate, properties, false);
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()) { 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 auto type = QStringToEnum<InstalledType::InstalledType>(typeString, InstalledType::InstalledType::QMLWidget);
const QJsonObject properties = widgetObj.value("properties").toObject(); const QJsonObject properties = widgetObj.value("properties").toObject();
qInfo() << "Start widget from profile:" << type << position << absolutePath; const bool success = createWidget(type, position, absolutePath, previewImage, properties, false);
createWidget(type, position, absolutePath, previewImage, properties, false);
if (!success) {
qWarning() << "Unable to start Widget! " << type << position << absolutePath;
}
} }
} }
return true;
} }
TEST_CASE("Loads profiles.json") TEST_CASE("Loads profiles.json")
@ -648,5 +630,4 @@ TEST_CASE("Loads profiles.json")
GlobalVariables globalVariables; GlobalVariables globalVariables;
ScreenPlayManager manager; ScreenPlayManager manager;
} }
} }

View File

@ -64,23 +64,7 @@ class ScreenPlayManager : public QObject {
Q_PROPERTY(int activeWidgetsCounter READ activeWidgetsCounter WRITE setActiveWidgetsCounter NOTIFY activeWidgetsCounterChanged) Q_PROPERTY(int activeWidgetsCounter READ activeWidgetsCounter WRITE setActiveWidgetsCounter NOTIFY activeWidgetsCounterChanged)
public: public:
explicit ScreenPlayManager( explicit ScreenPlayManager(QObject* parent = nullptr);
QObject* parent = nullptr);
int activeWallpaperCounter() const
{
return m_activeWallpaperCounter;
}
int activeWidgetsCounter() const
{
return m_activeWidgetsCounter;
}
bool isAnotherScreenPlayInstanceRunning()
{
return m_isAnotherScreenPlayInstanceRunning;
}
void init( void init(
const std::shared_ptr<GlobalVariables>& globalVariables, const std::shared_ptr<GlobalVariables>& globalVariables,
@ -88,22 +72,27 @@ public:
const std::shared_ptr<GAnalytics>& telemetry, const std::shared_ptr<GAnalytics>& telemetry,
const std::shared_ptr<Settings>& settings); const std::shared_ptr<Settings>& settings);
int activeWallpaperCounter() const { return m_activeWallpaperCounter; }
int activeWidgetsCounter() const { return m_activeWidgetsCounter; }
bool isAnotherScreenPlayInstanceRunning() { return m_isAnotherScreenPlayInstanceRunning; }
signals: signals:
void projectSettingsListModelResult(ScreenPlay::ProjectSettingsListModel* li = nullptr);
void activeWallpaperCounterChanged(int activeWallpaperCounter); void activeWallpaperCounterChanged(int activeWallpaperCounter);
void activeWidgetsCounterChanged(int activeWidgetsCounter); void activeWidgetsCounterChanged(int activeWidgetsCounter);
void monitorConfigurationChanged();
void projectSettingsListModelResult(ScreenPlay::ProjectSettingsListModel* li = nullptr);
void requestSaveProfiles(); void requestSaveProfiles();
void requestRaise(); void requestRaise();
void profilesSaved(); void profilesSaved();
void monitorConfigurationChanged();
void displayErrorPopup(const QString& msg); void displayErrorPopup(const QString& msg);
private slots: private slots:
void saveProfiles(); bool saveProfiles();
public slots: public slots:
// moc needs full enum namespace info see QTBUG-58454 // moc needs full enum namespace info see QTBUG-58454
void createWallpaper( bool createWallpaper(
const ScreenPlay::InstalledType::InstalledType type, const ScreenPlay::InstalledType::InstalledType type,
const ScreenPlay::FillMode::FillMode fillMode, const ScreenPlay::FillMode::FillMode fillMode,
const QString& absoluteStoragePath, const QString& absoluteStoragePath,
@ -115,7 +104,7 @@ public slots:
const QJsonObject& properties, const QJsonObject& properties,
const bool saveToProfilesConfigFile); const bool saveToProfilesConfigFile);
void createWidget( bool createWidget(
const ScreenPlay::InstalledType::InstalledType type, const ScreenPlay::InstalledType::InstalledType type,
const QPoint& position, const QPoint& position,
const QString& absoluteStoragePath, const QString& absoluteStoragePath,
@ -123,22 +112,17 @@ public slots:
const QJsonObject& properties, const QJsonObject& properties,
const bool saveToProfilesConfigFile); const bool saveToProfilesConfigFile);
void removeAllWallpapers(); bool removeAllWallpapers();
void removeAllWidgets(); bool removeAllWidgets();
bool removeWallpaperAt(const int index); 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); 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; ScreenPlayWallpaper* getWallpaperByAppID(const QString& appID) const;
void newConnection(); 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) void setActiveWallpaperCounter(int activeWallpaperCounter)
{ {
@ -189,10 +173,10 @@ public slots:
} }
private: private:
void loadProfiles(); bool loadProfiles();
bool appConnected(const std::shared_ptr<SDKConnection>& connection);
bool checkIsAnotherScreenPlayInstanceRunning(); bool checkIsAnotherScreenPlayInstanceRunning();
[[nodiscard]] bool removeWallpaperByAppID(const QString& appID); bool removeWallpaper(const QString& appID);
bool removeWidget(const QString& appID);
private: private:
std::shared_ptr<GlobalVariables> m_globalVariables; std::shared_ptr<GlobalVariables> m_globalVariables;
@ -204,7 +188,8 @@ private:
QVector<std::shared_ptr<ScreenPlayWallpaper>> m_screenPlayWallpapers; QVector<std::shared_ptr<ScreenPlayWallpaper>> m_screenPlayWallpapers;
QVector<std::shared_ptr<ScreenPlayWidget>> m_screenPlayWidgets; 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_activeWallpaperCounter { 0 };
int m_activeWidgetsCounter { 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! 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. \brief Constructor for ScreenPlayWallpaper.
*/ */
@ -77,7 +86,7 @@ ScreenPlayWallpaper::ScreenPlayWallpaper(const QVector<int>& screenNumber,
tmpScreenNumber = QString::number(m_screenNumber.first()); tmpScreenNumber = QString::number(m_screenNumber.first());
} }
const QStringList proArgs { m_appArgumentsList = QStringList {
tmpScreenNumber, tmpScreenNumber,
m_absolutePath, m_absolutePath,
QString { "appID=" + m_appID }, QString { "appID=" + m_appID },
@ -88,8 +97,11 @@ ScreenPlayWallpaper::ScreenPlayWallpaper(const QVector<int>& screenNumber,
// Fixes issue 84 media key overlay // Fixes issue 84 media key overlay
" --disable-features=HardwareMediaKeyHandling" " --disable-features=HardwareMediaKeyHandling"
}; };
}
m_process.setArguments(proArgs); bool ScreenPlayWallpaper::start()
{
m_process.setArguments(m_appArgumentsList);
m_process.setProgram(m_globalVariables->wallpaperExecutablePath().toString()); m_process.setProgram(m_globalVariables->wallpaperExecutablePath().toString());
// We must start detatched otherwise we would instantly close the process // We must start detatched otherwise we would instantly close the process
// and would loose the animted fade-out and the background refresh needed // 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(); const bool success = m_process.startDetached();
qInfo() << "Starting ScreenPlayWallpaper detached: " << (success ? "success" : "failed!"); qInfo() << "Starting ScreenPlayWallpaper detached: " << (success ? "success" : "failed!");
if (!success) { if (!success) {
qInfo() << m_process.errorString();
emit requestClose(m_appID);
emit error(QString("Could not start Wallpaper: " + m_process.errorString())); 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() QJsonObject ScreenPlayWallpaper::getActiveSettingsJson()
{ {
QJsonArray screenNumber; QJsonArray screenNumber;
for (const int i : m_screenNumber) { for (const int i : qAsConst(m_screenNumber)) {
screenNumber.append(i); 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. 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; QJsonObject obj;
obj.insert(key, value); 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)); 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(); 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) { if (playbackRate() != 1.0) {
setWallpaperValue("playbackRate", QString::number(playbackRate()), false); setWallpaperValue("playbackRate", QString::number(playbackRate()), false);
} }

View File

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

View File

@ -48,15 +48,18 @@ ScreenPlayWidget::ScreenPlayWidget(
m_projectSettingsListModel.init(type, projectSettingsListModelProperties); m_projectSettingsListModel.init(type, projectSettingsListModelProperties);
} }
const QStringList proArgs { m_appArgumentsList = QStringList {
m_absolutePath, m_absolutePath,
QString { "appID=" + m_appID }, QString { "appID=" + m_appID },
QVariant::fromValue(m_type).toString(), QVariant::fromValue(m_type).toString(),
QString::number(m_position.x()), QString::number(m_position.x()),
QString::number(m_position.y()), QString::number(m_position.y()),
}; };
}
m_process.setArguments(proArgs); bool ScreenPlayWidget::start()
{
m_process.setArguments(m_appArgumentsList);
m_process.setProgram(m_globalVariables->widgetExecutablePath().path()); m_process.setProgram(m_globalVariables->widgetExecutablePath().path());
QObject::connect(&m_process, &QProcess::errorOccurred, this, [](QProcess::ProcessError error) { QObject::connect(&m_process, &QProcess::errorOccurred, this, [](QProcess::ProcessError error) {
@ -65,18 +68,18 @@ ScreenPlayWidget::ScreenPlayWidget(
const bool success = m_process.startDetached(); const bool success = m_process.startDetached();
qInfo() << "Starting ScreenPlayWWidget detached: " << (success ? "success" : "failed!"); qInfo() << "Starting ScreenPlayWWidget detached: " << (success ? "success" : "failed!");
if (!success) { if (!success) {
qInfo() << m_process.errorString();
emit requestClose(m_appID);
emit error(QString("Could not start Widget: " + m_process.errorString())); 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!"; qInfo() << "App widget connected!";
QObject::connect(m_connection.get(), &SDKConnection::jsonMessageReceived, this, [this](const QJsonObject obj) { QObject::connect(m_connection.get(), &SDKConnection::jsonMessageReceived, this, [this](const QJsonObject obj) {
if (obj.value("messageType") == "positionUpdate") { if (obj.value("messageType") == "positionUpdate") {

View File

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

View File

@ -88,37 +88,44 @@ void ScreenPlay::SDKConnection::readyRead()
/*! /*!
\brief Sends a message to the connected socket. \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->write(message);
m_socket->waitForBytesWritten(); return m_socket->waitForBytesWritten();
} }
/*! /*!
\brief Closes the socket connection. Before it explicitly sends a quit command to make sure \brief Closes the socket connection. Before it explicitly sends a quit command to make sure
the wallpaper closes (fast). This also requestDecreaseWidgetCount() because Widgets. 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; QJsonObject obj;
obj.insert("command", QJsonValue("quit")); obj.insert("command", QJsonValue("quit"));
QByteArray command = QJsonDocument(obj).toJson(); QByteArray command = QJsonDocument(obj).toJson();
m_socket->write(command); 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) { if (m_socket->state() == QLocalSocket::ConnectedState) {
m_socket->disconnectFromServer(); m_socket->disconnectFromServer();
m_socket->close(); 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)) { if (m_type.contains("widget", Qt::CaseInsensitive)) {
emit requestDecreaseWidgetCount(); emit requestDecreaseWidgetCount();
} }
return true;
} }
} }

View File

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

View File

@ -133,84 +133,24 @@ public:
}; };
Q_ENUM(Theme) Q_ENUM(Theme)
bool offlineMode() const bool offlineMode() const { return m_offlineMode; }
{ bool getOfflineMode() const { return m_offlineMode; }
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(); 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: signals:
void requestRetranslation(); void requestRetranslation();
void resetInstalledListmodel(); void resetInstalledListmodel();

View File

@ -97,31 +97,31 @@
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="34"/> <location filename="../qml/Community/Community.qml" line="34"/>
<source>Wiki</source> <source>News</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="40"/> <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> <source>Forum</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="45"/> <location filename="../qml/Community/Community.qml" line="51"/>
<source>Issue List</source> <source>Issue List</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="50"/> <location filename="../qml/Community/Community.qml" line="56"/>
<source>Release Notes</source> <source>Contribute</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="55"/> <location filename="../qml/Community/Community.qml" line="61"/>
<source>Contribution Guide</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="60"/>
<source>Steam Workshop</source> <source>Steam Workshop</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1168,25 +1168,35 @@ wenn Sie ScreenPlay über Steam! installiert haben
<context> <context>
<name>Navigation</name> <name>Navigation</name>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="56"/> <location filename="../qml/Installed/Navigation.qml" line="57"/>
<source>All</source> <source>All</source>
<translation type="unfinished">Alles</translation> <translation type="unfinished">Alles</translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="72"/> <location filename="../qml/Installed/Navigation.qml" line="73"/>
<source>Scenes</source> <source>Scenes</source>
<translation type="unfinished">Szenen</translation> <translation type="unfinished">Szenen</translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="88"/> <location filename="../qml/Installed/Navigation.qml" line="89"/>
<source>Videos</source> <source>Videos</source>
<translation type="unfinished">Videos</translation> <translation type="unfinished">Videos</translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="104"/> <location filename="../qml/Installed/Navigation.qml" line="105"/>
<source>Widgets</source> <source>Widgets</source>
<translation type="unfinished">Widgets</translation> <translation type="unfinished">Widgets</translation>
</message> </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> <message>
<location filename="../qml/Workshop/Navigation.qml" line="35"/> <location filename="../qml/Workshop/Navigation.qml" line="35"/>
<source> Subscribed items: </source> <source> Subscribed items: </source>
@ -1488,7 +1498,7 @@ wenn Sie ScreenPlay über Steam! installiert haben
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="450"/> <location filename="../qml/Settings/Settings.qml" line="455"/>
<source>Logs</source> <source>Logs</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="420"/> <location filename="../qml/Settings/Settings.qml" line="425"/>
<source>Version</source> <source>Version</source>
<translation type="unfinished">Version</translation> <translation type="unfinished">Version</translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="421"/> <location filename="../qml/Settings/Settings.qml" line="426"/>
<source>ScreenPlay Build Version </source> <source>ScreenPlay Build Version </source>
<translation type="unfinished">ScreenPlay-Build-Version </translation> <translation type="unfinished">ScreenPlay-Build-Version </translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="423"/> <location filename="../qml/Settings/Settings.qml" line="428"/>
<source>Open Changelog</source> <source>Open Changelog</source>
<translation type="unfinished">Changelog öffnen</translation> <translation type="unfinished">Changelog öffnen</translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="430"/> <location filename="../qml/Settings/Settings.qml" line="435"/>
<source>Third Party Software</source> <source>Third Party Software</source>
<translation type="unfinished">Software von Drittanbietern</translation> <translation type="unfinished">Software von Drittanbietern</translation>
</message> </message>
<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> <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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="432"/> <location filename="../qml/Settings/Settings.qml" line="437"/>
<source>Licenses</source> <source>Licenses</source>
<translation type="unfinished">Lizenzen</translation> <translation type="unfinished">Lizenzen</translation>
</message> </message>
@ -1590,27 +1600,27 @@ wenn Sie ScreenPlay über Steam! installiert haben
<translation type="obsolete">Debugging-Meldungen</translation> <translation type="obsolete">Debugging-Meldungen</translation>
</message> </message>
<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> <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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="452"/> <location filename="../qml/Settings/Settings.qml" line="457"/>
<source>Show Logs</source> <source>Show Logs</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="463"/> <location filename="../qml/Settings/Settings.qml" line="468"/>
<source>Data Protection</source> <source>Data Protection</source>
<translation type="unfinished">Datenschutz</translation> <translation type="unfinished">Datenschutz</translation>
</message> </message>
<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> <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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="465"/> <location filename="../qml/Settings/Settings.qml" line="470"/>
<source>Privacy</source> <source>Privacy</source>
<translation type="unfinished">Datenschutz</translation> <translation type="unfinished">Datenschutz</translation>
</message> </message>
@ -1693,52 +1703,47 @@ wenn Sie ScreenPlay über Steam! installiert haben
<translation type="obsolete">Wallpaper erstellen</translation> <translation type="obsolete">Wallpaper erstellen</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/> <location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source>Project size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<source> MB</source> <source> MB</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>No description...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Click here if you like the content</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Click here if you do not like the content</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="291"/> <location filename="../qml/Workshop/Sidebar.qml" line="327"/>
<source>Tags: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="308"/>
<source>Subscribtions: </source> <source>Subscribtions: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="317"/> <location filename="../qml/Workshop/Sidebar.qml" line="381"/>
<source>Open In Steam</source> <source>Open In Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/> <location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribed!</source> <source>Subscribed!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/> <location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribe</source> <source>Subscribe</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -2558,105 +2563,115 @@ wenn Sie ScreenPlay über Steam! installiert haben
<context> <context>
<name>Workshop</name> <name>Workshop</name>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="164"/> <location filename="../qml/Workshop/Workshop.qml" line="183"/>
<source>Loading</source> <source>Loading</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="175"/> <location filename="../qml/Workshop/Workshop.qml" line="194"/>
<source>Download now!</source> <source>Download now!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="180"/> <location filename="../qml/Workshop/Workshop.qml" line="199"/>
<source>Downloading...</source> <source>Downloading...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="187"/> <location filename="../qml/Workshop/Workshop.qml" line="206"/>
<source>Details</source> <source>Details</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="211"/> <location filename="../qml/Workshop/Workshop.qml" line="230"/>
<source>Open In Steam</source> <source>Open In Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Search for Wallpaper and Widgets...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="293"/> <location filename="../qml/Workshop/Workshop.qml" line="342"/>
<source>Open Workshop in Steam</source> <source>Open Workshop in Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="303"/> <location filename="../qml/Workshop/Workshop.qml" line="353"/>
<source>Open GameHub in Steam</source> <source>Open GameHub in Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="335"/> <location filename="../qml/Workshop/Workshop.qml" line="386"/>
<source>Ranked By Vote</source> <source>Ranked By Vote</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="338"/> <location filename="../qml/Workshop/Workshop.qml" line="389"/>
<source>Publication Date</source> <source>Publication Date</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="341"/> <location filename="../qml/Workshop/Workshop.qml" line="392"/>
<source>Ranked By Trend</source> <source>Ranked By Trend</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="344"/> <location filename="../qml/Workshop/Workshop.qml" line="395"/>
<source>Favorited By Friends</source> <source>Favorited By Friends</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="347"/> <location filename="../qml/Workshop/Workshop.qml" line="398"/>
<source>Created By Friends</source> <source>Created By Friends</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="350"/> <location filename="../qml/Workshop/Workshop.qml" line="401"/>
<source>Created By Followed Users</source> <source>Created By Followed Users</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="353"/> <location filename="../qml/Workshop/Workshop.qml" line="404"/>
<source>Not Yet Rated</source> <source>Not Yet Rated</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="356"/> <location filename="../qml/Workshop/Workshop.qml" line="407"/>
<source>Total VotesAsc</source> <source>Total VotesAsc</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="359"/> <location filename="../qml/Workshop/Workshop.qml" line="410"/>
<source>Votes Up</source> <source>Votes Up</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="362"/> <location filename="../qml/Workshop/Workshop.qml" line="413"/>
<source>Total Unique Subscriptions</source> <source>Total Unique Subscriptions</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </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>
<context> <context>
<name>WorkshopItem</name> <name>WorkshopItem</name>
<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> <source>Successfully subscribed to Workshop Item!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="381"/> <location filename="../qml/Workshop/WorkshopItem.qml" line="352"/>
<source>Download complete!</source> <source>Download complete!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -2664,7 +2679,7 @@ wenn Sie ScreenPlay über Steam! installiert haben
<context> <context>
<name>XMLNewsfeed</name> <name>XMLNewsfeed</name>
<message> <message>
<location filename="../qml/Community/XMLNewsfeed.qml" line="53"/> <location filename="../qml/Community/XMLNewsfeed.qml" line="62"/>
<source>News &amp; Patchnotes</source> <source>News &amp; Patchnotes</source>
<translation type="unfinished">Neuigkeiten &amp; Patchnotes</translation> <translation type="unfinished">Neuigkeiten &amp; Patchnotes</translation>
</message> </message>

View File

@ -73,31 +73,31 @@
<name>Community</name> <name>Community</name>
<message> <message>
<location filename="../qml/Community/Community.qml" line="34"/> <location filename="../qml/Community/Community.qml" line="34"/>
<source>Wiki</source> <source>News</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="40"/> <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> <source>Forum</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="45"/> <location filename="../qml/Community/Community.qml" line="51"/>
<source>Issue List</source> <source>Issue List</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="50"/> <location filename="../qml/Community/Community.qml" line="56"/>
<source>Release Notes</source> <source>Contribute</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="55"/> <location filename="../qml/Community/Community.qml" line="61"/>
<source>Contribution Guide</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="60"/>
<source>Steam Workshop</source> <source>Steam Workshop</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -766,25 +766,35 @@
<context> <context>
<name>Navigation</name> <name>Navigation</name>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="56"/> <location filename="../qml/Installed/Navigation.qml" line="57"/>
<source>All</source> <source>All</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="72"/> <location filename="../qml/Installed/Navigation.qml" line="73"/>
<source>Scenes</source> <source>Scenes</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="88"/> <location filename="../qml/Installed/Navigation.qml" line="89"/>
<source>Videos</source> <source>Videos</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="104"/> <location filename="../qml/Installed/Navigation.qml" line="105"/>
<source>Widgets</source> <source>Widgets</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </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> <message>
<location filename="../qml/Workshop/Navigation.qml" line="35"/> <location filename="../qml/Workshop/Navigation.qml" line="35"/>
<source> Subscribed items: </source> <source> Subscribed items: </source>
@ -1130,62 +1140,62 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="420"/> <location filename="../qml/Settings/Settings.qml" line="425"/>
<source>Version</source> <source>Version</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="421"/> <location filename="../qml/Settings/Settings.qml" line="426"/>
<source>ScreenPlay Build Version </source> <source>ScreenPlay Build Version </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="423"/> <location filename="../qml/Settings/Settings.qml" line="428"/>
<source>Open Changelog</source> <source>Open Changelog</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="430"/> <location filename="../qml/Settings/Settings.qml" line="435"/>
<source>Third Party Software</source> <source>Third Party Software</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>ScreenPlay would not be possible without the work of others. A big thank you to: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="432"/> <location filename="../qml/Settings/Settings.qml" line="437"/>
<source>Licenses</source> <source>Licenses</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="450"/> <location filename="../qml/Settings/Settings.qml" line="455"/>
<source>Logs</source> <source>Logs</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <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> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="452"/> <location filename="../qml/Settings/Settings.qml" line="457"/>
<source>Show Logs</source> <source>Show Logs</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="463"/> <location filename="../qml/Settings/Settings.qml" line="468"/>
<source>Data Protection</source> <source>Data Protection</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <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> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="465"/> <location filename="../qml/Settings/Settings.qml" line="470"/>
<source>Privacy</source> <source>Privacy</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1256,52 +1266,47 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/> <location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source>Project size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<source> MB</source> <source> MB</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>No description...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Click here if you like the content</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Click here if you do not like the content</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="291"/> <location filename="../qml/Workshop/Sidebar.qml" line="327"/>
<source>Tags: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="308"/>
<source>Subscribtions: </source> <source>Subscribtions: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="317"/> <location filename="../qml/Workshop/Sidebar.qml" line="381"/>
<source>Open In Steam</source> <source>Open In Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/> <location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribed!</source> <source>Subscribed!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/> <location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribe</source> <source>Subscribe</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -2121,105 +2126,115 @@
<context> <context>
<name>Workshop</name> <name>Workshop</name>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="164"/> <location filename="../qml/Workshop/Workshop.qml" line="183"/>
<source>Loading</source> <source>Loading</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="175"/> <location filename="../qml/Workshop/Workshop.qml" line="194"/>
<source>Download now!</source> <source>Download now!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="180"/> <location filename="../qml/Workshop/Workshop.qml" line="199"/>
<source>Downloading...</source> <source>Downloading...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="187"/> <location filename="../qml/Workshop/Workshop.qml" line="206"/>
<source>Details</source> <source>Details</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="211"/> <location filename="../qml/Workshop/Workshop.qml" line="230"/>
<source>Open In Steam</source> <source>Open In Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Search for Wallpaper and Widgets...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="293"/> <location filename="../qml/Workshop/Workshop.qml" line="342"/>
<source>Open Workshop in Steam</source> <source>Open Workshop in Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="303"/> <location filename="../qml/Workshop/Workshop.qml" line="353"/>
<source>Open GameHub in Steam</source> <source>Open GameHub in Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="335"/> <location filename="../qml/Workshop/Workshop.qml" line="386"/>
<source>Ranked By Vote</source> <source>Ranked By Vote</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="338"/> <location filename="../qml/Workshop/Workshop.qml" line="389"/>
<source>Publication Date</source> <source>Publication Date</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="341"/> <location filename="../qml/Workshop/Workshop.qml" line="392"/>
<source>Ranked By Trend</source> <source>Ranked By Trend</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="344"/> <location filename="../qml/Workshop/Workshop.qml" line="395"/>
<source>Favorited By Friends</source> <source>Favorited By Friends</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="347"/> <location filename="../qml/Workshop/Workshop.qml" line="398"/>
<source>Created By Friends</source> <source>Created By Friends</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="350"/> <location filename="../qml/Workshop/Workshop.qml" line="401"/>
<source>Created By Followed Users</source> <source>Created By Followed Users</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="353"/> <location filename="../qml/Workshop/Workshop.qml" line="404"/>
<source>Not Yet Rated</source> <source>Not Yet Rated</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="356"/> <location filename="../qml/Workshop/Workshop.qml" line="407"/>
<source>Total VotesAsc</source> <source>Total VotesAsc</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="359"/> <location filename="../qml/Workshop/Workshop.qml" line="410"/>
<source>Votes Up</source> <source>Votes Up</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="362"/> <location filename="../qml/Workshop/Workshop.qml" line="413"/>
<source>Total Unique Subscriptions</source> <source>Total Unique Subscriptions</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </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>
<context> <context>
<name>WorkshopItem</name> <name>WorkshopItem</name>
<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> <source>Successfully subscribed to Workshop Item!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="381"/> <location filename="../qml/Workshop/WorkshopItem.qml" line="352"/>
<source>Download complete!</source> <source>Download complete!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -2227,7 +2242,7 @@
<context> <context>
<name>XMLNewsfeed</name> <name>XMLNewsfeed</name>
<message> <message>
<location filename="../qml/Community/XMLNewsfeed.qml" line="53"/> <location filename="../qml/Community/XMLNewsfeed.qml" line="62"/>
<source>News &amp; Patchnotes</source> <source>News &amp; Patchnotes</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View File

@ -97,31 +97,31 @@
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="34"/> <location filename="../qml/Community/Community.qml" line="34"/>
<source>Wiki</source> <source>News</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="40"/> <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> <source>Forum</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="45"/> <location filename="../qml/Community/Community.qml" line="51"/>
<source>Issue List</source> <source>Issue List</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="50"/> <location filename="../qml/Community/Community.qml" line="56"/>
<source>Release Notes</source> <source>Contribute</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="55"/> <location filename="../qml/Community/Community.qml" line="61"/>
<source>Contribution Guide</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="60"/>
<source>Steam Workshop</source> <source>Steam Workshop</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1148,25 +1148,35 @@ si instaló ScreenPlay vía Steam!
<context> <context>
<name>Navigation</name> <name>Navigation</name>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="56"/> <location filename="../qml/Installed/Navigation.qml" line="57"/>
<source>All</source> <source>All</source>
<translation type="unfinished">Todos</translation> <translation type="unfinished">Todos</translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="72"/> <location filename="../qml/Installed/Navigation.qml" line="73"/>
<source>Scenes</source> <source>Scenes</source>
<translation type="unfinished">Escenas</translation> <translation type="unfinished">Escenas</translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="88"/> <location filename="../qml/Installed/Navigation.qml" line="89"/>
<source>Videos</source> <source>Videos</source>
<translation type="unfinished">Videos</translation> <translation type="unfinished">Videos</translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="104"/> <location filename="../qml/Installed/Navigation.qml" line="105"/>
<source>Widgets</source> <source>Widgets</source>
<translation type="unfinished">Widgets</translation> <translation type="unfinished">Widgets</translation>
</message> </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> <message>
<location filename="../qml/Workshop/Navigation.qml" line="35"/> <location filename="../qml/Workshop/Navigation.qml" line="35"/>
<source> Subscribed items: </source> <source> Subscribed items: </source>
@ -1468,7 +1478,7 @@ si instaló ScreenPlay vía Steam!
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="450"/> <location filename="../qml/Settings/Settings.qml" line="455"/>
<source>Logs</source> <source>Logs</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="420"/> <location filename="../qml/Settings/Settings.qml" line="425"/>
<source>Version</source> <source>Version</source>
<translation type="unfinished">Versión</translation> <translation type="unfinished">Versión</translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="421"/> <location filename="../qml/Settings/Settings.qml" line="426"/>
<source>ScreenPlay Build Version </source> <source>ScreenPlay Build Version </source>
<translation type="unfinished">Versión de construcción de ScreenPlay </translation> <translation type="unfinished">Versión de construcción de ScreenPlay </translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="423"/> <location filename="../qml/Settings/Settings.qml" line="428"/>
<source>Open Changelog</source> <source>Open Changelog</source>
<translation type="unfinished">Registro de cambios abierto</translation> <translation type="unfinished">Registro de cambios abierto</translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="430"/> <location filename="../qml/Settings/Settings.qml" line="435"/>
<source>Third Party Software</source> <source>Third Party Software</source>
<translation type="unfinished">Software de terceros</translation> <translation type="unfinished">Software de terceros</translation>
</message> </message>
<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> <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> <translation type="unfinished">ScreenPlay no sería posible sin el trabajo de otros. Muchas gracias a todos: </translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="432"/> <location filename="../qml/Settings/Settings.qml" line="437"/>
<source>Licenses</source> <source>Licenses</source>
<translation type="unfinished">Licencias</translation> <translation type="unfinished">Licencias</translation>
</message> </message>
@ -1570,27 +1580,27 @@ si instaló ScreenPlay vía Steam!
<translation type="obsolete">Mensajes de depuración</translation> <translation type="obsolete">Mensajes de depuración</translation>
</message> </message>
<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> <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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="452"/> <location filename="../qml/Settings/Settings.qml" line="457"/>
<source>Show Logs</source> <source>Show Logs</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="463"/> <location filename="../qml/Settings/Settings.qml" line="468"/>
<source>Data Protection</source> <source>Data Protection</source>
<translation type="unfinished">Protección de datos</translation> <translation type="unfinished">Protección de datos</translation>
</message> </message>
<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> <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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="465"/> <location filename="../qml/Settings/Settings.qml" line="470"/>
<source>Privacy</source> <source>Privacy</source>
<translation type="unfinished">Privacidad</translation> <translation type="unfinished">Privacidad</translation>
</message> </message>
@ -1673,52 +1683,47 @@ si instaló ScreenPlay vía Steam!
<translation type="obsolete">Crear un wallpaper</translation> <translation type="obsolete">Crear un wallpaper</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/> <location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source>Project size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<source> MB</source> <source> MB</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>No description...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Click here if you like the content</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Click here if you do not like the content</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="291"/> <location filename="../qml/Workshop/Sidebar.qml" line="327"/>
<source>Tags: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="308"/>
<source>Subscribtions: </source> <source>Subscribtions: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="317"/> <location filename="../qml/Workshop/Sidebar.qml" line="381"/>
<source>Open In Steam</source> <source>Open In Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/> <location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribed!</source> <source>Subscribed!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/> <location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribe</source> <source>Subscribe</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -2538,105 +2543,115 @@ si instaló ScreenPlay vía Steam!
<context> <context>
<name>Workshop</name> <name>Workshop</name>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="164"/> <location filename="../qml/Workshop/Workshop.qml" line="183"/>
<source>Loading</source> <source>Loading</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="175"/> <location filename="../qml/Workshop/Workshop.qml" line="194"/>
<source>Download now!</source> <source>Download now!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="180"/> <location filename="../qml/Workshop/Workshop.qml" line="199"/>
<source>Downloading...</source> <source>Downloading...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="187"/> <location filename="../qml/Workshop/Workshop.qml" line="206"/>
<source>Details</source> <source>Details</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="211"/> <location filename="../qml/Workshop/Workshop.qml" line="230"/>
<source>Open In Steam</source> <source>Open In Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Search for Wallpaper and Widgets...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="293"/> <location filename="../qml/Workshop/Workshop.qml" line="342"/>
<source>Open Workshop in Steam</source> <source>Open Workshop in Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="303"/> <location filename="../qml/Workshop/Workshop.qml" line="353"/>
<source>Open GameHub in Steam</source> <source>Open GameHub in Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="335"/> <location filename="../qml/Workshop/Workshop.qml" line="386"/>
<source>Ranked By Vote</source> <source>Ranked By Vote</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="338"/> <location filename="../qml/Workshop/Workshop.qml" line="389"/>
<source>Publication Date</source> <source>Publication Date</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="341"/> <location filename="../qml/Workshop/Workshop.qml" line="392"/>
<source>Ranked By Trend</source> <source>Ranked By Trend</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="344"/> <location filename="../qml/Workshop/Workshop.qml" line="395"/>
<source>Favorited By Friends</source> <source>Favorited By Friends</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="347"/> <location filename="../qml/Workshop/Workshop.qml" line="398"/>
<source>Created By Friends</source> <source>Created By Friends</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="350"/> <location filename="../qml/Workshop/Workshop.qml" line="401"/>
<source>Created By Followed Users</source> <source>Created By Followed Users</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="353"/> <location filename="../qml/Workshop/Workshop.qml" line="404"/>
<source>Not Yet Rated</source> <source>Not Yet Rated</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="356"/> <location filename="../qml/Workshop/Workshop.qml" line="407"/>
<source>Total VotesAsc</source> <source>Total VotesAsc</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="359"/> <location filename="../qml/Workshop/Workshop.qml" line="410"/>
<source>Votes Up</source> <source>Votes Up</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="362"/> <location filename="../qml/Workshop/Workshop.qml" line="413"/>
<source>Total Unique Subscriptions</source> <source>Total Unique Subscriptions</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </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>
<context> <context>
<name>WorkshopItem</name> <name>WorkshopItem</name>
<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> <source>Successfully subscribed to Workshop Item!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="381"/> <location filename="../qml/Workshop/WorkshopItem.qml" line="352"/>
<source>Download complete!</source> <source>Download complete!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -2644,7 +2659,7 @@ si instaló ScreenPlay vía Steam!
<context> <context>
<name>XMLNewsfeed</name> <name>XMLNewsfeed</name>
<message> <message>
<location filename="../qml/Community/XMLNewsfeed.qml" line="53"/> <location filename="../qml/Community/XMLNewsfeed.qml" line="62"/>
<source>News &amp; Patchnotes</source> <source>News &amp; Patchnotes</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View File

@ -97,31 +97,31 @@
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="34"/> <location filename="../qml/Community/Community.qml" line="34"/>
<source>Wiki</source> <source>News</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="40"/> <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> <source>Forum</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="45"/> <location filename="../qml/Community/Community.qml" line="51"/>
<source>Issue List</source> <source>Issue List</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="50"/> <location filename="../qml/Community/Community.qml" line="56"/>
<source>Release Notes</source> <source>Contribute</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="55"/> <location filename="../qml/Community/Community.qml" line="61"/>
<source>Contribution Guide</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Community/Community.qml" line="60"/>
<source>Steam Workshop</source> <source>Steam Workshop</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1158,25 +1158,35 @@ si vous avez installé ScreenPlay via Steam !
<context> <context>
<name>Navigation</name> <name>Navigation</name>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="56"/> <location filename="../qml/Installed/Navigation.qml" line="57"/>
<source>All</source> <source>All</source>
<translation type="unfinished">Tout</translation> <translation type="unfinished">Tout</translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="72"/> <location filename="../qml/Installed/Navigation.qml" line="73"/>
<source>Scenes</source> <source>Scenes</source>
<translation type="unfinished">Scènes</translation> <translation type="unfinished">Scènes</translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="88"/> <location filename="../qml/Installed/Navigation.qml" line="89"/>
<source>Videos</source> <source>Videos</source>
<translation type="unfinished">Vidéos</translation> <translation type="unfinished">Vidéos</translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="104"/> <location filename="../qml/Installed/Navigation.qml" line="105"/>
<source>Widgets</source> <source>Widgets</source>
<translation type="unfinished">Widgets</translation> <translation type="unfinished">Widgets</translation>
</message> </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> <message>
<location filename="../qml/Workshop/Navigation.qml" line="35"/> <location filename="../qml/Workshop/Navigation.qml" line="35"/>
<source> Subscribed items: </source> <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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="420"/> <location filename="../qml/Settings/Settings.qml" line="425"/>
<source>Version</source> <source>Version</source>
<translation type="unfinished">Version</translation> <translation type="unfinished">Version</translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="421"/> <location filename="../qml/Settings/Settings.qml" line="426"/>
<source>ScreenPlay Build Version </source> <source>ScreenPlay Build Version </source>
<translation type="unfinished">Version de construction de ScreenPlay </translation> <translation type="unfinished">Version de construction de ScreenPlay </translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="423"/> <location filename="../qml/Settings/Settings.qml" line="428"/>
<source>Open Changelog</source> <source>Open Changelog</source>
<translation type="unfinished">Ouvrir le journal des modifications</translation> <translation type="unfinished">Ouvrir le journal des modifications</translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="430"/> <location filename="../qml/Settings/Settings.qml" line="435"/>
<source>Third Party Software</source> <source>Third Party Software</source>
<translation type="unfinished">Logiciel tiers</translation> <translation type="unfinished">Logiciel tiers</translation>
</message> </message>
<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> <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> <translation type="unfinished">ScreenPlay ne serait pas possible sans le travail des autres. Un grand merci à : </translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="432"/> <location filename="../qml/Settings/Settings.qml" line="437"/>
<source>Licenses</source> <source>Licenses</source>
<translation type="unfinished">Licences</translation> <translation type="unfinished">Licences</translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="450"/> <location filename="../qml/Settings/Settings.qml" line="455"/>
<source>Logs</source> <source>Logs</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1584,27 +1594,27 @@ si vous avez installé ScreenPlay via Steam !
<translation type="obsolete">Messages de débogage</translation> <translation type="obsolete">Messages de débogage</translation>
</message> </message>
<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> <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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="452"/> <location filename="../qml/Settings/Settings.qml" line="457"/>
<source>Show Logs</source> <source>Show Logs</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="463"/> <location filename="../qml/Settings/Settings.qml" line="468"/>
<source>Data Protection</source> <source>Data Protection</source>
<translation type="unfinished">Protection des données</translation> <translation type="unfinished">Protection des données</translation>
</message> </message>
<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> <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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="465"/> <location filename="../qml/Settings/Settings.qml" line="470"/>
<source>Privacy</source> <source>Privacy</source>
<translation type="unfinished">Confidentialité</translation> <translation type="unfinished">Confidentialité</translation>
</message> </message>
@ -1687,52 +1697,47 @@ si vous avez installé ScreenPlay via Steam !
<translation type="obsolete">Créer un wallpaper</translation> <translation type="obsolete">Créer un wallpaper</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/> <location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source>Project size: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<source> MB</source> <source> MB</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>No description...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Click here if you like the content</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Click here if you do not like the content</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="291"/> <location filename="../qml/Workshop/Sidebar.qml" line="327"/>
<source>Tags: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/Workshop/Sidebar.qml" line="308"/>
<source>Subscribtions: </source> <source>Subscribtions: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="317"/> <location filename="../qml/Workshop/Sidebar.qml" line="381"/>
<source>Open In Steam</source> <source>Open In Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/> <location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribed!</source> <source>Subscribed!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/> <location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribe</source> <source>Subscribe</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -2552,105 +2557,115 @@ si vous avez installé ScreenPlay via Steam !
<context> <context>
<name>Workshop</name> <name>Workshop</name>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="164"/> <location filename="../qml/Workshop/Workshop.qml" line="183"/>
<source>Loading</source> <source>Loading</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="175"/> <location filename="../qml/Workshop/Workshop.qml" line="194"/>
<source>Download now!</source> <source>Download now!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="180"/> <location filename="../qml/Workshop/Workshop.qml" line="199"/>
<source>Downloading...</source> <source>Downloading...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="187"/> <location filename="../qml/Workshop/Workshop.qml" line="206"/>
<source>Details</source> <source>Details</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="211"/> <location filename="../qml/Workshop/Workshop.qml" line="230"/>
<source>Open In Steam</source> <source>Open In Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Search for Wallpaper and Widgets...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="293"/> <location filename="../qml/Workshop/Workshop.qml" line="342"/>
<source>Open Workshop in Steam</source> <source>Open Workshop in Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="303"/> <location filename="../qml/Workshop/Workshop.qml" line="353"/>
<source>Open GameHub in Steam</source> <source>Open GameHub in Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="335"/> <location filename="../qml/Workshop/Workshop.qml" line="386"/>
<source>Ranked By Vote</source> <source>Ranked By Vote</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="338"/> <location filename="../qml/Workshop/Workshop.qml" line="389"/>
<source>Publication Date</source> <source>Publication Date</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="341"/> <location filename="../qml/Workshop/Workshop.qml" line="392"/>
<source>Ranked By Trend</source> <source>Ranked By Trend</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="344"/> <location filename="../qml/Workshop/Workshop.qml" line="395"/>
<source>Favorited By Friends</source> <source>Favorited By Friends</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="347"/> <location filename="../qml/Workshop/Workshop.qml" line="398"/>
<source>Created By Friends</source> <source>Created By Friends</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="350"/> <location filename="../qml/Workshop/Workshop.qml" line="401"/>
<source>Created By Followed Users</source> <source>Created By Followed Users</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="353"/> <location filename="../qml/Workshop/Workshop.qml" line="404"/>
<source>Not Yet Rated</source> <source>Not Yet Rated</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="356"/> <location filename="../qml/Workshop/Workshop.qml" line="407"/>
<source>Total VotesAsc</source> <source>Total VotesAsc</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="359"/> <location filename="../qml/Workshop/Workshop.qml" line="410"/>
<source>Votes Up</source> <source>Votes Up</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="362"/> <location filename="../qml/Workshop/Workshop.qml" line="413"/>
<source>Total Unique Subscriptions</source> <source>Total Unique Subscriptions</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </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>
<context> <context>
<name>WorkshopItem</name> <name>WorkshopItem</name>
<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> <source>Successfully subscribed to Workshop Item!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="381"/> <location filename="../qml/Workshop/WorkshopItem.qml" line="352"/>
<source>Download complete!</source> <source>Download complete!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -2658,7 +2673,7 @@ si vous avez installé ScreenPlay via Steam !
<context> <context>
<name>XMLNewsfeed</name> <name>XMLNewsfeed</name>
<message> <message>
<location filename="../qml/Community/XMLNewsfeed.qml" line="53"/> <location filename="../qml/Community/XMLNewsfeed.qml" line="62"/>
<source>News &amp; Patchnotes</source> <source>News &amp; Patchnotes</source>
<translation type="unfinished">Nouveautées et notes de versions</translation> <translation type="unfinished">Nouveautées et notes de versions</translation>
</message> </message>

View File

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

View File

@ -97,31 +97,39 @@
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="34"/> <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> <source>Wiki</source>
<translation type="unfinished">Wiki</translation> <translation type="unfinished">Wiki</translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="40"/> <location filename="../qml/Community/Community.qml" line="46"/>
<source>Forum</source> <source>Forum</source>
<translation type="unfinished">Forum</translation> <translation type="unfinished">Forum</translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="45"/> <location filename="../qml/Community/Community.qml" line="51"/>
<source>Issue List</source> <source>Issue List</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Release Notes</source>
<translation type="unfinished">Notas de Lançamento</translation> <translation type="obsolete">Notas de Lançamento</translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="55"/>
<source>Contribution Guide</source> <source>Contribution Guide</source>
<translation type="unfinished">Guia de contribuição</translation> <translation type="obsolete">Guia de contribuição</translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="60"/> <location filename="../qml/Community/Community.qml" line="61"/>
<source>Steam Workshop</source> <source>Steam Workshop</source>
<translation type="unfinished">Steam Workshop</translation> <translation type="unfinished">Steam Workshop</translation>
</message> </message>
@ -1148,25 +1156,35 @@ si instaló ScreenPlay vía Steam!
<context> <context>
<name>Navigation</name> <name>Navigation</name>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="56"/> <location filename="../qml/Installed/Navigation.qml" line="57"/>
<source>All</source> <source>All</source>
<translation type="unfinished">Todos</translation> <translation type="unfinished">Todos</translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="72"/> <location filename="../qml/Installed/Navigation.qml" line="73"/>
<source>Scenes</source> <source>Scenes</source>
<translation type="unfinished">Cenas</translation> <translation type="unfinished">Cenas</translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="88"/> <location filename="../qml/Installed/Navigation.qml" line="89"/>
<source>Videos</source> <source>Videos</source>
<translation type="unfinished">Videos</translation> <translation type="unfinished">Videos</translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="104"/> <location filename="../qml/Installed/Navigation.qml" line="105"/>
<source>Widgets</source> <source>Widgets</source>
<translation type="unfinished">Widgets</translation> <translation type="unfinished">Widgets</translation>
</message> </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> <message>
<location filename="../qml/Workshop/Navigation.qml" line="35"/> <location filename="../qml/Workshop/Navigation.qml" line="35"/>
<source> Subscribed items: </source> <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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="450"/> <location filename="../qml/Settings/Settings.qml" line="455"/>
<source>Logs</source> <source>Logs</source>
<translation type="unfinished">Logs</translation> <translation type="unfinished">Logs</translation>
</message> </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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="420"/> <location filename="../qml/Settings/Settings.qml" line="425"/>
<source>Version</source> <source>Version</source>
<translation type="unfinished">Versão</translation> <translation type="unfinished">Versão</translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="421"/> <location filename="../qml/Settings/Settings.qml" line="426"/>
<source>ScreenPlay Build Version </source> <source>ScreenPlay Build Version </source>
<translation type="unfinished">Versão da build do ScreenPlay </translation> <translation type="unfinished">Versão da build do ScreenPlay </translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="423"/> <location filename="../qml/Settings/Settings.qml" line="428"/>
<source>Open Changelog</source> <source>Open Changelog</source>
<translation type="unfinished">Abrir Changelog</translation> <translation type="unfinished">Abrir Changelog</translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="430"/> <location filename="../qml/Settings/Settings.qml" line="435"/>
<source>Third Party Software</source> <source>Third Party Software</source>
<translation type="unfinished">Software de terceiros</translation> <translation type="unfinished">Software de terceiros</translation>
</message> </message>
<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> <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> <translation type="unfinished">ScreenPlay não seria possivel sem o trabalho de outras pessoas. Um grande obrigado a você tambêm: </translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="432"/> <location filename="../qml/Settings/Settings.qml" line="437"/>
<source>Licenses</source> <source>Licenses</source>
<translation type="unfinished">Licenças</translation> <translation type="unfinished">Licenças</translation>
</message> </message>
@ -1570,27 +1588,27 @@ si instaló ScreenPlay vía Steam!
<translation type="obsolete">Mensagens de depuração</translation> <translation type="obsolete">Mensagens de depuração</translation>
</message> </message>
<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> <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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="452"/> <location filename="../qml/Settings/Settings.qml" line="457"/>
<source>Show Logs</source> <source>Show Logs</source>
<translation type="unfinished">Mostrar logs</translation> <translation type="unfinished">Mostrar logs</translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="463"/> <location filename="../qml/Settings/Settings.qml" line="468"/>
<source>Data Protection</source> <source>Data Protection</source>
<translation type="unfinished">Proteção de dados</translation> <translation type="unfinished">Proteção de dados</translation>
</message> </message>
<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> <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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="465"/> <location filename="../qml/Settings/Settings.qml" line="470"/>
<source>Privacy</source> <source>Privacy</source>
<translation type="unfinished">Privacidade</translation> <translation type="unfinished">Privacidade</translation>
</message> </message>
@ -1673,52 +1691,55 @@ si instaló ScreenPlay vía Steam!
<translation type="obsolete">Criar papel de parede</translation> <translation type="obsolete">Criar papel de parede</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<source>Project size: </source> <source>Project size: </source>
<translation type="unfinished">Tamanho do projeto</translation> <translation type="obsolete">Tamanho do projeto</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/> <location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source> MB</source> <source> MB</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>No description...</source>
<translation type="unfinished">Sem descrição...</translation> <translation type="unfinished">Sem descrição...</translation>
</message> </message>
<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> <source>Click here if you like the content</source>
<translation type="unfinished">Clique aqui se você gosta do conteudo</translation> <translation type="unfinished">Clique aqui se você gosta do conteudo</translation>
</message> </message>
<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> <source>Click here if you do not like the content</source>
<translation type="unfinished">Cloque aqui se você não gosta do conteudo</translation> <translation type="unfinished">Cloque aqui se você não gosta do conteudo</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="291"/>
<source>Tags: </source> <source>Tags: </source>
<translation type="unfinished">Etiquetas: </translation> <translation type="obsolete">Etiquetas: </translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="308"/> <location filename="../qml/Workshop/Sidebar.qml" line="327"/>
<source>Subscribtions: </source> <source>Subscribtions: </source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="317"/> <location filename="../qml/Workshop/Sidebar.qml" line="381"/>
<source>Open In Steam</source> <source>Open In Steam</source>
<translation type="unfinished">Abrir na Steam</translation> <translation type="unfinished">Abrir na Steam</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/> <location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribed!</source> <source>Subscribed!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/> <location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribe</source> <source>Subscribe</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -2538,95 +2559,105 @@ si instaló ScreenPlay vía Steam!
<context> <context>
<name>Workshop</name> <name>Workshop</name>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="164"/> <location filename="../qml/Workshop/Workshop.qml" line="183"/>
<source>Loading</source> <source>Loading</source>
<translation type="unfinished">Carregando</translation> <translation type="unfinished">Carregando</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="175"/> <location filename="../qml/Workshop/Workshop.qml" line="194"/>
<source>Download now!</source> <source>Download now!</source>
<translation type="unfinished">Baixe agora!</translation> <translation type="unfinished">Baixe agora!</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="180"/> <location filename="../qml/Workshop/Workshop.qml" line="199"/>
<source>Downloading...</source> <source>Downloading...</source>
<translation type="unfinished">Baixando...</translation> <translation type="unfinished">Baixando...</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="187"/> <location filename="../qml/Workshop/Workshop.qml" line="206"/>
<source>Details</source> <source>Details</source>
<translation type="unfinished">Detalhes</translation> <translation type="unfinished">Detalhes</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="211"/> <location filename="../qml/Workshop/Workshop.qml" line="230"/>
<source>Open In Steam</source> <source>Open In Steam</source>
<translation type="unfinished">Abrir na Steam</translation> <translation type="unfinished">Abrir na Steam</translation>
</message> </message>
<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> <source>Search for Wallpaper and Widgets...</source>
<translation type="unfinished">Procurar por Wallpaper e Widgets</translation> <translation type="unfinished">Procurar por Wallpaper e Widgets</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="293"/> <location filename="../qml/Workshop/Workshop.qml" line="342"/>
<source>Open Workshop in Steam</source> <source>Open Workshop in Steam</source>
<translation type="unfinished">Abrir workshop na Steam</translation> <translation type="unfinished">Abrir workshop na Steam</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="303"/> <location filename="../qml/Workshop/Workshop.qml" line="353"/>
<source>Open GameHub in Steam</source> <source>Open GameHub in Steam</source>
<translation type="unfinished">Abrir Gamehub na Steam</translation> <translation type="unfinished">Abrir Gamehub na Steam</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="335"/> <location filename="../qml/Workshop/Workshop.qml" line="386"/>
<source>Ranked By Vote</source> <source>Ranked By Vote</source>
<translation type="unfinished">Classificado por voto</translation> <translation type="unfinished">Classificado por voto</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="338"/> <location filename="../qml/Workshop/Workshop.qml" line="389"/>
<source>Publication Date</source> <source>Publication Date</source>
<translation type="unfinished">Data de publicação</translation> <translation type="unfinished">Data de publicação</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="341"/> <location filename="../qml/Workshop/Workshop.qml" line="392"/>
<source>Ranked By Trend</source> <source>Ranked By Trend</source>
<translation type="unfinished">Classificado por tendência</translation> <translation type="unfinished">Classificado por tendência</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="344"/> <location filename="../qml/Workshop/Workshop.qml" line="395"/>
<source>Favorited By Friends</source> <source>Favorited By Friends</source>
<translation type="unfinished">Favoritado por amigos</translation> <translation type="unfinished">Favoritado por amigos</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="347"/> <location filename="../qml/Workshop/Workshop.qml" line="398"/>
<source>Created By Friends</source> <source>Created By Friends</source>
<translation type="unfinished">Criado por amigos</translation> <translation type="unfinished">Criado por amigos</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="350"/> <location filename="../qml/Workshop/Workshop.qml" line="401"/>
<source>Created By Followed Users</source> <source>Created By Followed Users</source>
<translation type="unfinished">Criado por usuarios seguidos</translation> <translation type="unfinished">Criado por usuarios seguidos</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="353"/> <location filename="../qml/Workshop/Workshop.qml" line="404"/>
<source>Not Yet Rated</source> <source>Not Yet Rated</source>
<translation type="unfinished">Não votado</translation> <translation type="unfinished">Não votado</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="356"/> <location filename="../qml/Workshop/Workshop.qml" line="407"/>
<source>Total VotesAsc</source> <source>Total VotesAsc</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="359"/> <location filename="../qml/Workshop/Workshop.qml" line="410"/>
<source>Votes Up</source> <source>Votes Up</source>
<translation type="unfinished">Votos acima</translation> <translation type="unfinished">Votos acima</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="362"/> <location filename="../qml/Workshop/Workshop.qml" line="413"/>
<source>Total Unique Subscriptions</source> <source>Total Unique Subscriptions</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </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>
<context> <context>
<name>WorkshopItem</name> <name>WorkshopItem</name>
@ -2635,12 +2666,12 @@ si instaló ScreenPlay vía Steam!
<translation type="obsolete">Baixar</translation> <translation type="obsolete">Baixar</translation>
</message> </message>
<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> <source>Successfully subscribed to Workshop Item!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="381"/> <location filename="../qml/Workshop/WorkshopItem.qml" line="352"/>
<source>Download complete!</source> <source>Download complete!</source>
<translation type="unfinished">Download completado!</translation> <translation type="unfinished">Download completado!</translation>
</message> </message>
@ -2648,7 +2679,7 @@ si instaló ScreenPlay vía Steam!
<context> <context>
<name>XMLNewsfeed</name> <name>XMLNewsfeed</name>
<message> <message>
<location filename="../qml/Community/XMLNewsfeed.qml" line="53"/> <location filename="../qml/Community/XMLNewsfeed.qml" line="62"/>
<source>News &amp; Patchnotes</source> <source>News &amp; Patchnotes</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View File

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

View File

@ -73,31 +73,39 @@
<name>Community</name> <name>Community</name>
<message> <message>
<location filename="../qml/Community/Community.qml" line="34"/> <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> <source>Wiki</source>
<translation>Wiki</translation> <translation>Wiki</translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="40"/> <location filename="../qml/Community/Community.qml" line="46"/>
<source>Forum</source> <source>Forum</source>
<translation>Diễn đàn</translation> <translation>Diễn đàn</translation>
</message> </message>
<message> <message>
<location filename="../qml/Community/Community.qml" line="45"/> <location filename="../qml/Community/Community.qml" line="51"/>
<source>Issue List</source> <source>Issue List</source>
<translation>D.Sách Lỗi</translation> <translation>D.Sách Lỗi</translation>
</message> </message>
<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> <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>
<message> <message>
<location filename="../qml/Community/Community.qml" line="55"/>
<source>Contribution Guide</source> <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>
<message> <message>
<location filename="../qml/Community/Community.qml" line="60"/> <location filename="../qml/Community/Community.qml" line="61"/>
<source>Steam Workshop</source> <source>Steam Workshop</source>
<translatorcomment>Still workshop.</translatorcomment> <translatorcomment>Still workshop.</translatorcomment>
<translation>Steam Workshop</translation> <translation>Steam Workshop</translation>
@ -955,25 +963,35 @@
<context> <context>
<name>Navigation</name> <name>Navigation</name>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="56"/> <location filename="../qml/Installed/Navigation.qml" line="57"/>
<source>All</source> <source>All</source>
<translation>Tất cả</translation> <translation>Tất cả</translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="72"/> <location filename="../qml/Installed/Navigation.qml" line="73"/>
<source>Scenes</source> <source>Scenes</source>
<translation>Cảnh</translation> <translation>Cảnh</translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="88"/> <location filename="../qml/Installed/Navigation.qml" line="89"/>
<source>Videos</source> <source>Videos</source>
<translation>Videos</translation> <translation>Videos</translation>
</message> </message>
<message> <message>
<location filename="../qml/Installed/Navigation.qml" line="104"/> <location filename="../qml/Installed/Navigation.qml" line="105"/>
<source>Widgets</source> <source>Widgets</source>
<translation>Tiện ích con</translation> <translation>Tiện ích con</translation>
</message> </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> <message>
<location filename="../qml/Workshop/Navigation.qml" line="35"/> <location filename="../qml/Workshop/Navigation.qml" line="35"/>
<source> Subscribed items: </source> <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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="420"/> <location filename="../qml/Settings/Settings.qml" line="425"/>
<source>Version</source> <source>Version</source>
<translation>Phiên bản</translation> <translation>Phiên bản</translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="421"/> <location filename="../qml/Settings/Settings.qml" line="426"/>
<source>ScreenPlay Build Version </source> <source>ScreenPlay Build Version </source>
<translation>Bản dựng của ScreenPlay </translation> <translation>Bản dựng của ScreenPlay </translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="423"/> <location filename="../qml/Settings/Settings.qml" line="428"/>
<source>Open Changelog</source> <source>Open Changelog</source>
<translation>Mở changelog</translation> <translation>Mở changelog</translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="430"/> <location filename="../qml/Settings/Settings.qml" line="435"/>
<source>Third Party Software</source> <source>Third Party Software</source>
<translation>Những ng dụng của bên thứ ba</translation> <translation>Những ng dụng của bên thứ ba</translation>
</message> </message>
<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> <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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="432"/> <location filename="../qml/Settings/Settings.qml" line="437"/>
<source>Licenses</source> <source>Licenses</source>
<translation>Giấy phép</translation> <translation>Giấy phép</translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="450"/> <location filename="../qml/Settings/Settings.qml" line="455"/>
<source>Logs</source> <source>Logs</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1366,27 +1384,27 @@
<translation type="vanished">Các ghi chú gỡ lỗi</translation> <translation type="vanished">Các ghi chú gỡ lỗi</translation>
</message> </message>
<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> <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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="452"/> <location filename="../qml/Settings/Settings.qml" line="457"/>
<source>Show Logs</source> <source>Show Logs</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="463"/> <location filename="../qml/Settings/Settings.qml" line="468"/>
<source>Data Protection</source> <source>Data Protection</source>
<translation>Bảo vệ dữ liệu</translation> <translation>Bảo vệ dữ liệu</translation>
</message> </message>
<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> <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> <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>
<message> <message>
<location filename="../qml/Settings/Settings.qml" line="465"/> <location filename="../qml/Settings/Settings.qml" line="470"/>
<source>Privacy</source> <source>Privacy</source>
<translation>Quyền riêng </translation> <translation>Quyền riêng </translation>
</message> </message>
@ -1457,52 +1475,55 @@
<translation>Chọn hình nền</translation> <translation>Chọn hình nền</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/>
<source>Project size: </source> <source>Project size: </source>
<translation>Kích thước dự án: </translation> <translation type="vanished">Kích thước dự án: </translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="93"/> <location filename="../qml/Workshop/Sidebar.qml" line="109"/>
<source> MB</source> <source> MB</source>
<translation>MB</translation> <translation>MB</translation>
</message> </message>
<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> <source>No description...</source>
<translation>Không tả...</translation> <translation>Không tả...</translation>
</message> </message>
<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> <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> <translation>Bấm vào đây nếu bạn thích nội dung này</translation>
</message> </message>
<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> <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> <translation>Bấm vào đây nếu bạn không thích nội dung này</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="291"/>
<source>Tags: </source> <source>Tags: </source>
<translation>Từ khóa:</translation> <translation type="vanished">Từ khóa:</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="308"/> <location filename="../qml/Workshop/Sidebar.qml" line="327"/>
<source>Subscribtions: </source> <source>Subscribtions: </source>
<translation>Đăng : </translation> <translation>Đăng : </translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="317"/> <location filename="../qml/Workshop/Sidebar.qml" line="381"/>
<source>Open In Steam</source> <source>Open In Steam</source>
<translation>Mở trên Steam</translation> <translation>Mở trên Steam</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/> <location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribed!</source> <source>Subscribed!</source>
<translation>Đã đăng !</translation> <translation>Đã đăng !</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Sidebar.qml" line="359"/> <location filename="../qml/Workshop/Sidebar.qml" line="391"/>
<source>Subscribe</source> <source>Subscribe</source>
<translation>Đăng </translation> <translation>Đăng </translation>
</message> </message>
@ -2326,97 +2347,107 @@
<context> <context>
<name>Workshop</name> <name>Workshop</name>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="164"/> <location filename="../qml/Workshop/Workshop.qml" line="183"/>
<source>Loading</source> <source>Loading</source>
<translation>Đang tải</translation> <translation>Đang tải</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="175"/> <location filename="../qml/Workshop/Workshop.qml" line="194"/>
<source>Download now!</source> <source>Download now!</source>
<translation>Tải xuống ngay!</translation> <translation>Tải xuống ngay!</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="180"/> <location filename="../qml/Workshop/Workshop.qml" line="199"/>
<source>Downloading...</source> <source>Downloading...</source>
<translation>Đang tải xuống...</translation> <translation>Đang tải xuống...</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="187"/> <location filename="../qml/Workshop/Workshop.qml" line="206"/>
<source>Details</source> <source>Details</source>
<translation>Chi tiết</translation> <translation>Chi tiết</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="211"/> <location filename="../qml/Workshop/Workshop.qml" line="230"/>
<source>Open In Steam</source> <source>Open In Steam</source>
<translation>Mở trên Steam</translation> <translation>Mở trên Steam</translation>
</message> </message>
<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> <source>Search for Wallpaper and Widgets...</source>
<translation>Tìm hình nền &amp; cảnh...</translation> <translation>Tìm hình nền &amp; cảnh...</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="293"/> <location filename="../qml/Workshop/Workshop.qml" line="342"/>
<source>Open Workshop in Steam</source> <source>Open Workshop in Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="303"/> <location filename="../qml/Workshop/Workshop.qml" line="353"/>
<source>Open GameHub in Steam</source> <source>Open GameHub in Steam</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="335"/> <location filename="../qml/Workshop/Workshop.qml" line="386"/>
<source>Ranked By Vote</source> <source>Ranked By Vote</source>
<translation>Xếp hạng bởi số phiếu.</translation> <translation>Xếp hạng bởi số phiếu.</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="338"/> <location filename="../qml/Workshop/Workshop.qml" line="389"/>
<source>Publication Date</source> <source>Publication Date</source>
<translation>Ngày tải lên</translation> <translation>Ngày tải lên</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="341"/> <location filename="../qml/Workshop/Workshop.qml" line="392"/>
<source>Ranked By Trend</source> <source>Ranked By Trend</source>
<translation>Xếp hạng bởi trend</translation> <translation>Xếp hạng bởi trend</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="344"/> <location filename="../qml/Workshop/Workshop.qml" line="395"/>
<source>Favorited By Friends</source> <source>Favorited By Friends</source>
<translation>Đưc yêu thích bởi bạn </translation> <translation>Đưc yêu thích bởi bạn </translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="347"/> <location filename="../qml/Workshop/Workshop.qml" line="398"/>
<source>Created By Friends</source> <source>Created By Friends</source>
<translation>Tạo bởi bạn </translation> <translation>Tạo bởi bạn </translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="350"/> <location filename="../qml/Workshop/Workshop.qml" line="401"/>
<source>Created By Followed Users</source> <source>Created By Followed Users</source>
<translation>Tạo bởi người đã theo dỗi</translation> <translation>Tạo bởi người đã theo dỗi</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="353"/> <location filename="../qml/Workshop/Workshop.qml" line="404"/>
<source>Not Yet Rated</source> <source>Not Yet Rated</source>
<translation>Chưa đưc xếp hạng</translation> <translation>Chưa đưc xếp hạng</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="356"/> <location filename="../qml/Workshop/Workshop.qml" line="407"/>
<source>Total VotesAsc</source> <source>Total VotesAsc</source>
<translatorcomment>????</translatorcomment> <translatorcomment>????</translatorcomment>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="359"/> <location filename="../qml/Workshop/Workshop.qml" line="410"/>
<source>Votes Up</source> <source>Votes Up</source>
<translatorcomment>?????</translatorcomment> <translatorcomment>?????</translatorcomment>
<translation>Số phiếu đang lên cao</translation> <translation>Số phiếu đang lên cao</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/Workshop.qml" line="362"/> <location filename="../qml/Workshop/Workshop.qml" line="413"/>
<source>Total Unique Subscriptions</source> <source>Total Unique Subscriptions</source>
<translation>Tổng số đăng duy nhất</translation> <translation>Tổng số đăng duy nhất</translation>
</message> </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>
<context> <context>
<name>WorkshopItem</name> <name>WorkshopItem</name>
@ -2425,12 +2456,12 @@
<translation type="vanished">Tải xuống</translation> <translation type="vanished">Tải xuống</translation>
</message> </message>
<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> <source>Successfully subscribed to Workshop Item!</source>
<translation>Đăng thành công mục Workshop!</translation> <translation>Đăng thành công mục Workshop!</translation>
</message> </message>
<message> <message>
<location filename="../qml/Workshop/WorkshopItem.qml" line="381"/> <location filename="../qml/Workshop/WorkshopItem.qml" line="352"/>
<source>Download complete!</source> <source>Download complete!</source>
<translation>Tải xuống thành công!</translation> <translation>Tải xuống thành công!</translation>
</message> </message>
@ -2438,7 +2469,7 @@
<context> <context>
<name>XMLNewsfeed</name> <name>XMLNewsfeed</name>
<message> <message>
<location filename="../qml/Community/XMLNewsfeed.qml" line="53"/> <location filename="../qml/Community/XMLNewsfeed.qml" line="62"/>
<source>News &amp; Patchnotes</source> <source>News &amp; Patchnotes</source>
<translation>Tin tức &amp; Ghi chú</translation> <translation>Tin tức &amp; Ghi chú</translation>
</message> </message>

View File

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

View File

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

View File

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

View File

@ -63,4 +63,5 @@ QStringList getAvailableTypes();
QStringList getAvailableFillModes(); QStringList getAvailableFillModes();
bool isWallpaper(const ScreenPlay::InstalledType::InstalledType type); bool isWallpaper(const ScreenPlay::InstalledType::InstalledType type);
bool isWidget(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(); return jsonDocument.object();
} }
/*!
\brief .
*/
bool writeJsonObjectToFile(const QString& absoluteFilePath, const QJsonObject& object, bool truncate) bool writeJsonObjectToFile(const QString& absoluteFilePath, const QJsonObject& object, bool truncate)
{ {
QFile configTmp; QFile configTmp;
@ -248,6 +251,9 @@ QString toLocal(const QString& url)
return QUrl(url).toLocalFile(); return QUrl(url).toLocalFile();
} }
/*!
\brief .
*/
QStringList getAvailableWallpaper() QStringList getAvailableWallpaper()
{ {
return { return {
@ -260,6 +266,9 @@ QStringList getAvailableWallpaper()
}; };
} }
/*!
\brief .
*/
QStringList getAvailableWidgets() QStringList getAvailableWidgets()
{ {
return { return {
@ -268,11 +277,17 @@ QStringList getAvailableWidgets()
}; };
} }
/*!
\brief .
*/
QStringList getAvailableTypes() QStringList getAvailableTypes()
{ {
return { getAvailableWallpaper() + getAvailableWidgets() }; return { getAvailableWallpaper() + getAvailableWidgets() };
} }
/*!
\brief .
*/
bool isWallpaper(const ScreenPlay::InstalledType::InstalledType type) bool isWallpaper(const ScreenPlay::InstalledType::InstalledType type)
{ {
@ -286,6 +301,9 @@ bool isWallpaper(const ScreenPlay::InstalledType::InstalledType type)
|| type == InstalledType::GodotWallpaper); || type == InstalledType::GodotWallpaper);
} }
/*!
\brief .
*/
bool isWidget(const ScreenPlay::InstalledType::InstalledType type) 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); return (type == InstalledType::QMLWidget || type == InstalledType::HTMLWidget);
} }
/*!
\brief See https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit
*/
QStringList getAvailableFillModes() QStringList getAvailableFillModes()
{ {
// https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit
return { "stretch", "fill", "contain", "cover", "scale-down" }; 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 # Disable console window on Windows
# https://stackoverflow.com/questions/8249028/how-do-i-keep-my-qt-c-program-from-opening-a-console-in-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) set_property(TARGET ${PROJECT_NAME} PROPERTY WIN32_EXECUTABLE true)
target_link_libraries(${PROJECT_NAME} PRIVATE shcore.lib )
endif() endif()
if(APPLE) if(APPLE)
@ -42,7 +43,8 @@ if(APPLE)
target_link_libraries(${PROJECT_NAME} PRIVATE "-framework Cocoa") target_link_libraries(${PROJECT_NAME} PRIVATE "-framework Cocoa")
endif() 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) if(APPLE)

View File

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

View File

@ -1,5 +1,6 @@
import QtQuick 2.14
import QtQml 2.14 import QtQml 2.14
import QtQuick 2.14
import QtQuick.Controls 2.14
import ScreenPlayWallpaper 1.0 import ScreenPlayWallpaper 1.0
import ScreenPlay.Enums.InstalledType 1.0 import ScreenPlay.Enums.InstalledType 1.0
import ScreenPlay.Shader 1.0 import ScreenPlay.Shader 1.0
@ -27,7 +28,7 @@ Rectangle {
function onQmlExit() { function onQmlExit() {
if (canFadeByWallpaperFillMode && Wallpaper.canFade) { if (canFadeByWallpaperFillMode && Wallpaper.canFade) {
imgCover.state = "outExit" imgCover.state = "exit"
} else { } else {
Wallpaper.terminate() Wallpaper.terminate()
} }
@ -64,7 +65,7 @@ Rectangle {
if (oldType === InstalledType.VideoWallpaper) if (oldType === InstalledType.VideoWallpaper)
return return
imgCover.state = "in" imgCover.state = "showDefaultBackgroundImage"
loader.source = "qrc:/WebView.qml" loader.source = "qrc:/WebView.qml"
} }
} }
@ -82,27 +83,28 @@ Rectangle {
break break
case InstalledType.QMLWallpaper: case InstalledType.QMLWallpaper:
loader.source = Qt.resolvedUrl(Wallpaper.fullContentPath) loader.source = Qt.resolvedUrl(Wallpaper.fullContentPath)
fadeIn()
break break
case InstalledType.WebsiteWallpaper: case InstalledType.WebsiteWallpaper:
loader.setSource("qrc:/WebsiteWallpaper.qml", { loader.setSource("qrc:/WebsiteWallpaper.qml", {
"url": Wallpaper.fullContentPath "url": Wallpaper.fullContentPath
}) })
fadeIn()
break break
case InstalledType.GifWallpaper: case InstalledType.GifWallpaper:
loader.setSource("qrc:/GifWallpaper.qml", { loader.setSource("qrc:/GifWallpaper.qml", {
"source": Qt.resolvedUrl( "source": Qt.resolvedUrl(
Wallpaper.fullContentPath) Wallpaper.fullContentPath)
}) })
fadeIn()
break break
} }
fadeIn()
} }
function fadeIn() { function fadeIn() {
Wallpaper.setVisible(true) Wallpaper.setVisible(true)
if (canFadeByWallpaperFillMode && Wallpaper.canFade) { if (canFadeByWallpaperFillMode && Wallpaper.canFade) {
imgCover.state = "out" imgCover.state = "hideDefaultBackgroundImage"
} else { } else {
imgCover.opacity = 0 imgCover.opacity = 0
} }
@ -137,35 +139,33 @@ Rectangle {
left: parent.left left: parent.left
right: parent.right right: parent.right
} }
state: "in" state: "showDefaultBackgroundImage"
sourceSize.width: Wallpaper.width sourceSize.width: Wallpaper.width
sourceSize.height: Wallpaper.height sourceSize.height: Wallpaper.height
source: { source: {
if (Qt.platform.os === "windows") { if (Qt.platform.os === "windows") {
return Qt.resolvedUrl( return Qt.resolvedUrl(
"file:///" + Wallpaper.windowsDesktopProperties.wallpaperPath) "file:///" + Wallpaper.windowsDesktopProperties.wallpaperPath)
} else {
return ""
} }
} }
states: [ states: [
State { State {
name: "in" name: "showDefaultBackgroundImage"
PropertyChanges { PropertyChanges {
target: imgCover target: imgCover
opacity: 1 opacity: 1
} }
}, },
State { State {
name: "out" name: "hideDefaultBackgroundImage"
PropertyChanges { PropertyChanges {
target: imgCover target: imgCover
opacity: 0 opacity: 0
} }
}, },
State { State {
name: "outExit" name: "exit"
PropertyChanges { PropertyChanges {
target: imgCover target: imgCover
opacity: 1 opacity: 1
@ -174,18 +174,24 @@ Rectangle {
] ]
transitions: [ transitions: [
Transition { Transition {
from: "out" from: "showDefaultBackgroundImage"
to: "in" to: "hideDefaultBackgroundImage"
reversible: true reversible: true
PropertyAnimation {
target: imgCover SequentialAnimation {
duration: 600 PauseAnimation {
property: "opacity" duration: 100
}
PropertyAnimation {
target: imgCover
duration: 600
property: "opacity"
}
} }
}, },
Transition { Transition {
from: "out" from: "hideDefaultBackgroundImage"
to: "outExit" to: "exit"
reversible: true reversible: true
SequentialAnimation { SequentialAnimation {
PropertyAnimation { 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 <QtGlobal>
#include <QtWebEngine> #include <QtWebEngine>
#include "ScreenPlayUtil/util.h"
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
#include "src/winwindow.h" #include "src/winwindow.h"
#endif #endif
@ -17,11 +19,9 @@
#include "src/macwindow.h" #include "src/macwindow.h"
#endif #endif
#include "screenplaysdk.h"
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); //QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication::setAttribute(Qt::AA_ShareOpenGLContexts); QApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
QApplication app(argc, argv); QApplication app(argc, argv);
@ -32,17 +32,12 @@ int main(int argc, char* argv[])
// If we start with only one argument (app path) // If we start with only one argument (app path)
// It means we want to test a single wallpaper // It means we want to test a single wallpaper
QStringList argumentList = app.arguments(); QStringList argumentList = app.arguments();
if (argumentList.length() == 1) { if (argumentList.length() == 1) {
//Set the monitor number to test
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
WinWindow window1({ 0 }, "test", "appID=test", "1", "fill", "videoWallpaper", true, true);
WinWindow window1({ 0 }, "test", "appid", "1", "fill", true); //WinWindow window2({ 1 }, "test", "appID=xyz", "1", "fill", true, true);
//WinWindow window2({ 1 }, "test", "appid", "1", "fill"); //WinWindow window3({ 2 }, "test", "appID=123", "1", "fill", true,true);
//WinWindow window3({ 2 }, "test", "appid", "1", "fill");
// WinWindow window({ 0 }, "C:/Program Files (x86)/Steam/steamapps/workshop/content/672870/qmlParticles", "appid", "1", "fill", true);
#endif #endif
#if defined(Q_OS_LINUX) #if defined(Q_OS_LINUX)
LinuxWindow window({ 0 }, "/home/graphicscore/Desktop/wallpapers/MechaGirl", "appid", "1", "fill", false); 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(); 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) { if (argumentList.length() != 9) {
return -3; return -3;
} }
// AppID, Type const bool debugMode = false;
ScreenPlaySDK sdk(argumentList.at(3), argumentList.at(6));
QString monitorNumbers = argumentList.at(1); const auto activeScreensList = ScreenPlayUtil::parseStringToIntegerList(argumentList.at(1));
QStringList activeScreensList = monitorNumbers.split(",");
activeScreensList.removeAll(","); if (!activeScreensList.has_value())
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()) {
return -4; 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 ScreenPlayWallpaper m_appArgumentsList constructor how the args get created
// See screenplay.h @ScreenPlayWallpaper 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 okParseCheckWallpaperVisible = false;
bool checkWallpaperVisible = argumentList.at(7).toInt(&okParseCheckWallpaperVisible); bool checkWallpaperVisible = argumentList.at(7).toInt(&okParseCheckWallpaperVisible);
@ -105,20 +76,37 @@ int main(int argc, char* argv[])
} }
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
WinWindow window(list, argumentList.at(2), argumentList.at(3), argumentList.at(4), argumentList.at(5), checkWallpaperVisible); WinWindow window(
QObject::connect(&sdk, &ScreenPlaySDK::sdkDisconnected, &window, &WinWindow::destroyThis); activeScreensList.value(),
QObject::connect(&sdk, &ScreenPlaySDK::incommingMessage, &window, &WinWindow::messageReceived); projectFilePath,
QObject::connect(&sdk, &ScreenPlaySDK::replaceWallpaper, &window, &WinWindow::replaceWallpaper); appID,
volume,
fillmode,
type,
checkWallpaperVisible,
debugMode);
#endif #endif
#if defined(Q_OS_LINUX) #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::sdkDisconnected, &window, &LinuxWindow::destroyThis);
QObject::connect(&sdk, &ScreenPlaySDK::incommingMessage, &window, &LinuxWindow::messageReceived); QObject::connect(&sdk, &ScreenPlaySDK::incommingMessage, &window, &LinuxWindow::messageReceived);
#endif #endif
#if defined(Q_OS_OSX) #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::sdkDisconnected, &window, &MacWindow::destroyThis);
QObject::connect(&sdk, &ScreenPlaySDK::incommingMessage, &window, &MacWindow::messageReceived); QObject::connect(&sdk, &ScreenPlaySDK::incommingMessage, &window, &MacWindow::messageReceived);
#endif #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); ShowWindow(m_hwnd, SW_SHOWNOACTIVATE);
}); });

View File

@ -6,12 +6,17 @@ BaseWindow::BaseWindow(QObject* parent)
} }
BaseWindow::BaseWindow( BaseWindow::BaseWindow(
const QString& projectFilePath,
const QVector<int> activeScreensList, const QVector<int> activeScreensList,
const bool checkWallpaperVisible) const QString& projectFilePath,
const QString& type,
const bool checkWallpaperVisible,
const QString& appID,
const bool debugMode)
: QObject(nullptr) : QObject(nullptr)
, m_checkWallpaperVisible(checkWallpaperVisible) , m_checkWallpaperVisible(checkWallpaperVisible)
, m_activeScreensList(activeScreensList) , m_activeScreensList(activeScreensList)
, m_debugMode(debugMode)
, m_sdk(std::make_unique<ScreenPlaySDK>(appID, type))
{ {
QApplication::instance()->installEventFilter(this); QApplication::instance()->installEventFilter(this);
@ -24,6 +29,13 @@ BaseWindow::BaseWindow(
qmlRegisterType<BaseWindow>("ScreenPlay.Wallpaper", 1, 0, "Wallpaper"); 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()); setOSVersion(QSysInfo::productVersion());
if (projectFilePath == "test") { if (projectFilePath == "test") {

View File

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

View File

@ -1,6 +1,41 @@
#include "winwindow.h" #include "winwindow.h"
#include "WinUser.h"
#include "qqml.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) BOOL WINAPI SearchForWorkerWindow(HWND hwnd, LPARAM lparam)
{ {
@ -17,6 +52,7 @@ BOOL WINAPI SearchForWorkerWindow(HWND hwnd, LPARAM lparam)
HHOOK g_mouseHook; HHOOK g_mouseHook;
QPoint g_LastMousePosition { 0, 0 }; QPoint g_LastMousePosition { 0, 0 };
QPoint g_globalOffset { 0, 0 };
QQuickView* g_winGlobalHook = nullptr; QQuickView* g_winGlobalHook = nullptr;
LRESULT __stdcall MouseHookCallback(int nCode, WPARAM wParam, LPARAM lParam) 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); QApplication::sendEvent(g_winGlobalHook, &event);
if (type == QMouseEvent::Type::MouseButtonPress) { 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); return CallNextHookEx(g_mouseHook, nCode, wParam, lParam);
} }
@ -92,25 +129,43 @@ void WinWindow::setupWindowMouseHook()
WinWindow::WinWindow( WinWindow::WinWindow(
const QVector<int>& activeScreensList, const QVector<int>& activeScreensList,
const QString& projectPath, const QString& projectFilePath,
const QString& id, const QString& appID,
const QString& volume, const QString& volume,
const QString& fillmode, const QString& fillmode,
const bool checkWallpaperVisible) const QString& type,
: BaseWindow(projectPath, activeScreensList, checkWallpaperVisible) 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_windowsDesktopProperties = std::make_unique<WindowsDesktopProperties>();
m_windowHandle = reinterpret_cast<HWND>(m_window.winId()); m_windowHandle = reinterpret_cast<HWND>(m_window.winId());
if (!IsWindow(m_windowHandle)) { if (!IsWindow(m_windowHandle)) {
qFatal("Could not get a valid window handle!"); qFatal("Could not get a valid window handle!");
} }
ShowWindow(m_windowHandleWorker, SW_HIDE); qRegisterMetaType<WindowsDesktopProperties*>();
setAppID(id); qRegisterMetaType<WinWindow*>();
bool ok = false; bool ok = false;
float volumeParsed = volume.toFloat(&ok); float volumeParsed = volume.toFloat(&ok);
@ -121,41 +176,20 @@ WinWindow::WinWindow(
setVolume(volumeParsed); setVolume(volumeParsed);
setFillMode(fillmode); 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); qmlRegisterSingletonInstance<WinWindow>("ScreenPlayWallpaper", 1, 0, "Wallpaper", this);
// Instead of setting "renderType: Text.NativeRendering" every time configureWindowGeometry();
// we can set it here once :) bool hasWindowScaling = false;
m_window.setTextRenderType(QQuickWindow::TextRenderType::NativeTextRendering); for (int i = 0; i < screens.count(); i++) {
m_window.setResizeMode(QQuickView::ResizeMode::SizeRootObjectToView); if (getScaling(i) != 1) {
m_window.setSource(QUrl("qrc:/Wallpaper.qml")); hasWindowScaling = true;
m_window.hide(); break;
}
QObject::connect(&m_checkForFullScreenWindowTimer, &QTimer::timeout, this, &WinWindow::checkForFullScreenWindow); }
if (hasWindowScaling) {
qInfo() << "scaling";
configureWindowGeometry();
}
// We do not support autopause for multi monitor wallpaper // We do not support autopause for multi monitor wallpaper
if (this->activeScreensList().length() == 1) { if (this->activeScreensList().length() == 1) {
@ -164,21 +198,22 @@ WinWindow::WinWindow(
} }
} }
QTimer::singleShot(1000, [this]() { QTimer::singleShot(1000, this, [&]() {
setupWindowMouseHook(); setupWindowMouseHook();
}); });
sdk()->start();
} }
void WinWindow::setVisible(bool show) void WinWindow::setVisible(bool show)
{ {
if (show) { if (show) {
if (!ShowWindow(m_windowHandle, SW_SHOW)) { if (!ShowWindow(m_windowHandle, SW_SHOW))
qDebug() << "Cannot set window handle SW_SHOW"; qDebug() << "Cannot set window handle SW_SHOW";
}
} else { } else {
if (!ShowWindow(m_windowHandle, SW_HIDE)) { if (!ShowWindow(m_windowHandle, SW_HIDE))
qDebug() << "Cannot set window handle SW_HIDE"; qDebug() << "Cannot set window handle SW_HIDE";
}
} }
} }
@ -187,26 +222,62 @@ void WinWindow::destroyThis()
emit qmlExit(); 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++) { auto* info = (sEnumInfo*)dwData;
QScreen* screen = QApplication::screens().at(i); if (--info->iIndex < 0) {
if (screen->availableGeometry().x() < 0) { info->hMonitor = hMonitor;
m_windowOffsetX += (screen->availableGeometry().x() * -1); return FALSE;
}
if (screen->availableGeometry().y() < 0) {
m_windowOffsetY += (screen->availableGeometry().y() * -1);
}
} }
return TRUE;
} }
void WinWindow::setupWallpaperForOneScreen(int activeScreen) void WinWindow::setupWallpaperForOneScreen(int activeScreen)
{ {
QScreen* screen = QApplication::screens().at(activeScreen); const QRect screenRect = QApplication::screens().at(activeScreen)->geometry();
QRect screenRect = screen->geometry();
if (!SetWindowPos(m_windowHandle, nullptr, screenRect.x() + m_windowOffsetX - 1, screenRect.y() + m_windowOffsetY - 1, screenRect.width() + 2, screenRect.height() + 2, SWP_HIDEWINDOW)) { const float scaling = 1; //getScaling(activeScreen);
qFatal("Could not set window pos: "); 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) { if (SetParent(m_windowHandle, m_windowHandleWorker) == nullptr) {
qFatal("Could not attach to parent window"); qFatal("Could not attach to parent window");
@ -252,7 +323,7 @@ void WinWindow::setupWallpaperForMultipleScreens(const QVector<int>& activeScree
rect.setX(upperLeftScreen->geometry().x()); rect.setX(upperLeftScreen->geometry().x());
rect.setY(upperLeftScreen->geometry().y()); 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: "); qFatal("Could not set window pos: ");
} }
if (SetParent(m_windowHandle, m_windowHandleWorker) == nullptr) { if (SetParent(m_windowHandle, m_windowHandleWorker) == nullptr) {
@ -271,11 +342,83 @@ bool WinWindow::searchWorkerWindowToParentTo()
return EnumWindows(SearchForWorkerWindow, reinterpret_cast<LPARAM>(&m_windowHandleWorker)); 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'); // screen->logicalDotsPerInch()
GetWindowTextW(hWnd, &title[0], title.size()); // 100% - 96
return QString::fromStdWString(title); // 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) BOOL CALLBACK FindTheDesiredWnd(HWND hWnd, LPARAM lParam)
@ -288,11 +431,6 @@ BOOL CALLBACK FindTheDesiredWnd(HWND hWnd, LPARAM lParam)
return true; // keep enumerating return true; // keep enumerating
} }
struct sEnumInfo {
int iIndex = 0;
HMONITOR hMonitor = NULL;
};
BOOL CALLBACK GetMonitorByHandle(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) BOOL CALLBACK GetMonitorByHandle(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
{ {
Q_UNUSED(hdcMonitor) Q_UNUSED(hdcMonitor)

View File

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

View File

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

View File

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

View File

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