mirror of
https://gitlab.com/kelteseth/ScreenPlay.git
synced 2024-09-18 08:22:33 +02:00
Merge branch 'master' into qt6-support
# Conflicts: # .gitlab-ci.yml # CMakeLists.txt # ScreenPlay/CMakeLists.txt # ScreenPlay/qml/Workshop/Workshop.qml # ScreenPlay/qml/Workshop/upload/UploadProjectItem.qml # ScreenPlay/translations/ScreenPlay_.ts # ScreenPlay/translations/ScreenPlay_de.ts # ScreenPlay/translations/ScreenPlay_es.ts # ScreenPlay/translations/ScreenPlay_fr.ts # ScreenPlay/translations/ScreenPlay_ko.ts # ScreenPlay/translations/ScreenPlay_pt_br.ts # ScreenPlay/translations/ScreenPlay_ru.ts # ScreenPlay/translations/ScreenPlay_vi.qm # ScreenPlay/translations/ScreenPlay_vi.ts # ScreenPlay/translations/ScreenPlay_zh_cn.ts
This commit is contained in:
commit
6b653bdfdc
@ -16,22 +16,6 @@ check:
|
|||||||
- python clang_format.py
|
- python clang_format.py
|
||||||
- python cmake_format.py
|
- python cmake_format.py
|
||||||
|
|
||||||
build:windows_debug:
|
|
||||||
stage: build
|
|
||||||
tags:
|
|
||||||
- vs2019
|
|
||||||
- windows10
|
|
||||||
needs:
|
|
||||||
- check
|
|
||||||
script:
|
|
||||||
- cd Tools
|
|
||||||
- python setup.py
|
|
||||||
- python build.py -t debug
|
|
||||||
artifacts:
|
|
||||||
expire_in: "4 weeks"
|
|
||||||
paths:
|
|
||||||
- build-x64-windows-debug/bin/
|
|
||||||
|
|
||||||
build:windows_release:
|
build:windows_release:
|
||||||
stage: build
|
stage: build
|
||||||
tags:
|
tags:
|
||||||
@ -42,27 +26,28 @@ build:windows_release:
|
|||||||
script:
|
script:
|
||||||
- cd Tools
|
- cd Tools
|
||||||
- python setup.py
|
- python setup.py
|
||||||
- python build.py -t release
|
- python build.py -t release -steam=False
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: "4 weeks"
|
expire_in: "4 weeks"
|
||||||
paths:
|
paths:
|
||||||
- build-x64-windows-release/bin/
|
- build-x64-windows-release/bin/
|
||||||
|
|
||||||
build:osx_debug:
|
build:windows_release_steam:
|
||||||
stage: build
|
stage: build
|
||||||
allow_failure: true
|
|
||||||
tags:
|
tags:
|
||||||
- osx
|
- vs2019
|
||||||
|
- windows10
|
||||||
needs:
|
needs:
|
||||||
- check
|
- check
|
||||||
script:
|
script:
|
||||||
- cd Tools
|
- cd Tools
|
||||||
- python3 setup.py
|
- python setup.py
|
||||||
- python3 build.py -t debug
|
- python build.py -t release -steam=True
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: "4 weeks"
|
expire_in: "4 weeks"
|
||||||
paths:
|
paths:
|
||||||
- build-x64-osx-debug/bin/
|
- build-x64-windows-release/bin/
|
||||||
|
|
||||||
|
|
||||||
build:osx_release:
|
build:osx_release:
|
||||||
stage: build
|
stage: build
|
||||||
@ -74,38 +59,27 @@ build:osx_release:
|
|||||||
script:
|
script:
|
||||||
- cd Tools
|
- cd Tools
|
||||||
- python3 setup.py
|
- python3 setup.py
|
||||||
- python3 build.py -t release
|
- python3 build.py -t release -steam=False
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: "4 weeks"
|
expire_in: "4 weeks"
|
||||||
paths:
|
paths:
|
||||||
- build-x64-osx-release/bin/
|
- build-x64-osx-release/bin/
|
||||||
|
|
||||||
build:linux_debug:
|
build:osx_release_steam:
|
||||||
stage: build
|
stage: build
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
image:
|
|
||||||
name: ubuntu:20.04
|
|
||||||
tags:
|
tags:
|
||||||
- gitlab-org-docker
|
- osx
|
||||||
needs:
|
needs:
|
||||||
- check
|
- check
|
||||||
script:
|
script:
|
||||||
- apt update -y
|
|
||||||
# Otherwise libglib2 needs interaction
|
|
||||||
- export DEBIAN_FRONTEND=noninteractive
|
|
||||||
- apt install mesa-common-dev curl zip unzip tar git pkg-config apt-transport-https ca-certificates gnupg software-properties-common wget software-properties-common wget python3-pip build-essential libgl1-mesa-dev lld ninja-build cmake -y
|
|
||||||
- pip3 install aqtinstall
|
|
||||||
- mkdir Qt
|
|
||||||
- aqt install --outputdir Qt/ 6.2.0 linux desktop
|
|
||||||
- cd Tools
|
- cd Tools
|
||||||
- wget -q https://github.com/QuasarApp/CQtDeployer/releases/download/1.5.2/CQtDeployer_1.5.2_OfflineInstaller_Linux64.run
|
|
||||||
- python3 setup.py
|
- python3 setup.py
|
||||||
- python3 build.py -t debug
|
- python3 build.py -t release -steam=True
|
||||||
|
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: "4 weeks"
|
expire_in: "4 weeks"
|
||||||
paths:
|
paths:
|
||||||
- build-x64-linux-debug/bin/
|
- build-x64-osx-release/bin/
|
||||||
|
|
||||||
build:linux_release:
|
build:linux_release:
|
||||||
stage: build
|
stage: build
|
||||||
@ -127,29 +101,12 @@ build:linux_release:
|
|||||||
- cd Tools
|
- cd Tools
|
||||||
- wget -q https://github.com/QuasarApp/CQtDeployer/releases/download/1.5.2/CQtDeployer_1.5.2_OfflineInstaller_Linux64.run
|
- wget -q https://github.com/QuasarApp/CQtDeployer/releases/download/1.5.2/CQtDeployer_1.5.2_OfflineInstaller_Linux64.run
|
||||||
- python3 setup.py
|
- python3 setup.py
|
||||||
- python3 build.py -t release
|
- python3 build.py -t release -steam=False
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: "4 weeks"
|
expire_in: "4 weeks"
|
||||||
paths:
|
paths:
|
||||||
- build-x64-linux-release/bin/
|
- build-x64-linux-release/bin/
|
||||||
|
|
||||||
test:windows_debug:
|
|
||||||
stage: test
|
|
||||||
tags:
|
|
||||||
- windows10
|
|
||||||
- vs2019
|
|
||||||
dependencies:
|
|
||||||
- build:windows_debug
|
|
||||||
needs:
|
|
||||||
- build:windows_debug
|
|
||||||
script:
|
|
||||||
- ./build-x64-windows-debug/bin/ScreenPlay.exe --no-run=false --exit=true --reporters=junit --out=test-report-junit.xml
|
|
||||||
artifacts:
|
|
||||||
expire_in: "4 weeks"
|
|
||||||
when: always
|
|
||||||
reports:
|
|
||||||
junit: test-report-junit.xml
|
|
||||||
|
|
||||||
test:windows_release:
|
test:windows_release:
|
||||||
stage: test
|
stage: test
|
||||||
tags:
|
tags:
|
||||||
|
@ -7,7 +7,6 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
|||||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||||
|
|
||||||
option(SCREENPLAY_STEAM_DEPLOY OFF "Steam build settings. Disables steam_app.txt copy step, that is only needed for development.")
|
|
||||||
option(SCREENPLAY_STEAM ON "For FOSS distribution so we do not bundle proprietary code.")
|
option(SCREENPLAY_STEAM ON "For FOSS distribution so we do not bundle proprietary code.")
|
||||||
option(TESTS_ENABLED OFF)
|
option(TESTS_ENABLED OFF)
|
||||||
|
|
||||||
@ -59,6 +58,7 @@ execute_process(
|
|||||||
|
|
||||||
add_compile_definitions(COMPILE_INFO="${BUILD_DATE} + ${GIT_COMMIT_HASH}")
|
add_compile_definitions(COMPILE_INFO="${BUILD_DATE} + ${GIT_COMMIT_HASH}")
|
||||||
add_compile_definitions(SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
|
add_compile_definitions(SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
|
||||||
|
add_compile_definitions(SCREENPLAY_STEAM="${SCREENPLAY_STEAM}")
|
||||||
|
|
||||||
if(UNIX AND NOT APPLE)
|
if(UNIX AND NOT APPLE)
|
||||||
# Fixes QWebEngine linker errors on Ubuntu 20.04
|
# Fixes QWebEngine linker errors on Ubuntu 20.04
|
||||||
@ -85,11 +85,10 @@ endif()
|
|||||||
message(STATUS "[DEFINE] SOURCE_DIR = ${SOURCE_DIR}")
|
message(STATUS "[DEFINE] SOURCE_DIR = ${SOURCE_DIR}")
|
||||||
message(STATUS "[DEFINE] BUILD_DATE = ${BUILD_DATE}")
|
message(STATUS "[DEFINE] BUILD_DATE = ${BUILD_DATE}")
|
||||||
message(STATUS "[DEFINE] GIT_COMMIT_HASH = ${GIT_COMMIT_HASH}")
|
message(STATUS "[DEFINE] GIT_COMMIT_HASH = ${GIT_COMMIT_HASH}")
|
||||||
|
message(STATUS "[OPTION] SCREENPLAY_STEAM = ${SCREENPLAY_STEAM}")
|
||||||
|
message(STATUS "[OPTION] TESTS_ENABLED = ${TESTS_ENABLED}")
|
||||||
message(STATUS "[PROJECT] CMAKE_TOOLCHAIN_FILE = ${CMAKE_TOOLCHAIN_FILE}")
|
message(STATUS "[PROJECT] CMAKE_TOOLCHAIN_FILE = ${CMAKE_TOOLCHAIN_FILE}")
|
||||||
message(STATUS "[PROJECT] VCPKG_PATH = ${VCPKG_PATH}")
|
message(STATUS "[PROJECT] VCPKG_PATH = ${VCPKG_PATH}")
|
||||||
message(STATUS "[PROJECT] VCPKG_ARCH = ${VCPKG_ARCH}")
|
message(STATUS "[PROJECT] VCPKG_ARCH = ${VCPKG_ARCH}")
|
||||||
message(STATUS "[PROJECT] CMAKE_PREFIX_PATH = ${CMAKE_PREFIX_PATH}")
|
message(STATUS "[PROJECT] CMAKE_PREFIX_PATH = ${CMAKE_PREFIX_PATH}")
|
||||||
message(STATUS "[PROJECT] VCPKG_TARGET_TRIPLET = ${VCPKG_TARGET_TRIPLET}")
|
message(STATUS "[PROJECT] VCPKG_TARGET_TRIPLET = ${VCPKG_TARGET_TRIPLET}")
|
||||||
message(STATUS "[OPTION] SCREENPLAY_STEAM_DEPLOY = ${SCREENPLAY_STEAM_DEPLOY}")
|
|
||||||
message(STATUS "[OPTION] SCREENPLAY_STEAM = ${SCREENPLAY_STEAM}")
|
|
||||||
message(STATUS "[OPTION] TESTS_ENABLED = ${TESTS_ENABLED}")
|
|
||||||
|
57
README.md
57
README.md
@ -1,44 +1,27 @@
|
|||||||
<div>
|
<div>
|
||||||
<img width="100%" height="93" src=".gitlab/media/logo_gitlab_fullwidth.svg">
|
<img width="100%" height="93" src=".gitlab/media/logo_gitlab_fullwidth.svg">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
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) Docs: [![pipeline status](https://gitlab.com/kelteseth/ScreenPlayDeveloperDocs/badges/master/pipeline.svg)](https://gitlab.com/kelteseth/ScreenPlayDeveloperDocs/-/commits/master) [![Crowdin](https://badges.crowdin.net/screenplay/localized.svg)](https://crowdin.com/project/screenplay) <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://discord.com/invite/4sY9d4f2DM">![Discord](https://img.shields.io/discord/516635043435773970?style=for-the-badge)</a>
|
||||||
Dev. Docs [![pipeline status](https://gitlab.com/kelteseth/ScreenPlayDeveloperDocs/badges/master/pipeline.svg)](https://gitlab.com/kelteseth/ScreenPlayDeveloperDocs/-/commits/master) <br><br>
|
<h3><a href="https://store.steampowered.com/app/672870/ScreenPlay/">✨Download ScreenPlay with via Steam™ with Workshop support✨</a> </h3>
|
||||||
<a href=""></a>
|
<h3><a href="http://gitlab.com/kelteseth/ScreenPlay/-/jobs/artifacts/master/download?job=build:windows_release">✨💻 Download ScreenPlay Windows directly✨</a> </h3>
|
||||||
[中文总览](README_zh_CN.md)
|
<h3><a href="http://gitlab.com/kelteseth/ScreenPlay/-/jobs/artifacts/master/download?job=build:osx_release">✨🍏 Download ScreenPlay macOS (unsigned) directly✨</a> </h3>
|
||||||
<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>
|
|
||||||
User Chat (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>
|
|
||||||
|
|
||||||
<br>
|
<!-- This works only on gitlab --> ![](https://gitlab.com/kelteseth/ScreenPlay/-/raw/master/.gitlab/media/preview.webp) ![](/.gitlab/media/preview.webp) <!-- This works only on github -->
|
||||||
ScreenPlay is an open source cross platform app for displaying Video Wallpaper, Widgets and AppDrawer. It is written in modern C++20/Qt5/QML. Binaries with workshop support are available for Windows and soon Linux & MacOSX via <a href="https://store.steampowered.com/app/672870/ScreenPlay/">Steam</a>. Join our community: <a href="https://screen-play.app/">Homepage</a> - <a href="https://forum.screen-play.app/">Forum</a>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
<h3><a href="https://store.steampowered.com/app/672870/ScreenPlay/">✨Download ScreenPlay✨</a> <br> <br> <a href="https://www.patreon.com/ScreenPlayApp">🚀Support ScreenPlay On Patreon🚀</a></h3>
|
|
||||||
Windows only, Linux and MacOS next.
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<!-- This works only on gitlab -->
|
|
||||||
![](https://gitlab.com/kelteseth/ScreenPlay/-/raw/master/.gitlab/media/preview.webp)
|
|
||||||
<!-- This works only on github -->
|
|
||||||
![](/.gitlab/media/preview.webp)
|
|
||||||
|
|
||||||
<a href="https://www.youtube.com/watch?v=q-J2fTWDxw8"><p>Watch the Steam Early Access Trailer (YouTube)</p></a>
|
<a href="https://www.youtube.com/watch?v=q-J2fTWDxw8"><p>Watch the Steam Early Access Trailer (YouTube)</p></a>
|
||||||
|
|
||||||
|
[中文总览](README_zh_CN.md)
|
||||||
|
|
||||||
|
ScreenPlay is an Open Source cross-platform app for displaying Video Wallpaper & Widgets. It is written in modern C++20/Qt5/QML. <br> <a href="https://screen-play.app/">Homepage</a> - <a href="https://forum.screen-play.app/">Forum</a>- <a href="https://discord.com/invite/4sY9d4f2DM">Discord</a>
|
||||||
|
|
||||||
|
<h4><a href="https://www.patreon.com/ScreenPlayApp">🚀Support ScreenPlay On Patreon🚀</a> </h4>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Important Issues
|
# Important Issues
|
||||||
* [Implement KDE Support](https://gitlab.com/kelteseth/ScreenPlay/-/issues/111)
|
* [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/)
|
||||||
@ -67,7 +50,7 @@ Everyone can contribute with code, design, documentation or translation. Visit o
|
|||||||
|
|
||||||
Here are some ways you can contribute:
|
Here are some ways you can contribute:
|
||||||
* by using prerelease versions / master branch or the Steam nightly builds
|
* by using prerelease versions / master branch or the Steam nightly builds
|
||||||
* by [adding/fixing translation](https://kelteseth.gitlab.io/ScreenPlayDocs/contribute/translations/)
|
* by [adding/fixing translation](https://crowdin.com/project/screenplay)
|
||||||
* by [designing UI/UX](https://kelteseth.gitlab.io/ScreenPlayDocs/contribute/contribute/#design)
|
* by [designing UI/UX](https://kelteseth.gitlab.io/ScreenPlayDocs/contribute/contribute/#design)
|
||||||
* by [creating example HTML/QML/Javascript content](https://kelteseth.gitlab.io/ScreenPlayDocs/)
|
* by [creating example HTML/QML/Javascript content](https://kelteseth.gitlab.io/ScreenPlayDocs/)
|
||||||
* by [reporting bugs](https://gitlab.com/kelteseth/ScreenPlay/-/issues)
|
* by [reporting bugs](https://gitlab.com/kelteseth/ScreenPlay/-/issues)
|
||||||
@ -103,22 +86,6 @@ Here are some ways you can contribute:
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Because every operating system has its own version of desktop environment we need to adapt the ScreenPlayWindow for every platform
|
|
||||||
separately. The most feature complete for now is Windows 10. Windows 7 works but the wallpaper have the [wrong 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">
|
|
||||||
|
|
||||||
| Plattform | Windows 10 | Gnome | KDE | MacOS |
|
|
||||||
|------------------------ |------- |--------- |------- | ------- |
|
|
||||||
| __Wallpaper__ | ✔ |❌ Help Needed! | ❓ [Basic implementation](https://gitlab.com/kelteseth/ScreenPlay/-/tree/master/ScreenPlayWallpaper/kde/ScreenPlay) | ❓ [Basic implementation](https://gitlab.com/kelteseth/ScreenPlay/-/blob/master/ScreenPlayWallpaper/src/MacBridge.mm) |
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -55,15 +55,17 @@ list(
|
|||||||
APPEND
|
APPEND
|
||||||
L10N_LIST
|
L10N_LIST
|
||||||
# cmake-format: sortable
|
# cmake-format: sortable
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_de.ts
|
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_.ts
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_zh_cn.ts
|
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_tr_TR.ts
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_pt_br.ts
|
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_nl_NL.ts
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_en.ts
|
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_de_DE.ts
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_es.ts
|
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_zh_CN.ts
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_fr.ts
|
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_pt_BR.ts
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_ko.ts
|
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_es_ES.ts
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_ru.ts
|
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_fr_FR.ts
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_vi.ts)
|
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_ko_KR.ts
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_ru_RU.ts
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/translations/ScreenPlay_vi_VN.ts)
|
||||||
|
|
||||||
include(QtUpdateTranslations)
|
include(QtUpdateTranslations)
|
||||||
qt_update_translations("${CMAKE_CURRENT_SOURCE_DIR}/qml" "${L10N_LIST}")
|
qt_update_translations("${CMAKE_CURRENT_SOURCE_DIR}/qml" "${L10N_LIST}")
|
||||||
@ -109,8 +111,10 @@ target_link_libraries(
|
|||||||
Qt6::WebEngineQuick
|
Qt6::WebEngineQuick
|
||||||
Qt6::WebEngineCore)
|
Qt6::WebEngineCore)
|
||||||
|
|
||||||
add_executable(tst_ScreenPlay tests/tst_main.cpp)
|
if(${TESTS_ENABLED})
|
||||||
target_link_libraries(tst_ScreenPlay PRIVATE ScreenPlayLib Qt6::Test)
|
add_executable(tst_ScreenPlay tests/tst_main.cpp)
|
||||||
|
target_link_libraries(tst_ScreenPlay PRIVATE ScreenPlayLib Qt6::Test)
|
||||||
|
endif()
|
||||||
|
|
||||||
add_executable(${PROJECT_NAME} main.cpp)
|
add_executable(${PROJECT_NAME} main.cpp)
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE ScreenPlayLib)
|
target_link_libraries(${PROJECT_NAME} PRIVATE ScreenPlayLib)
|
||||||
@ -119,8 +123,6 @@ qt_add_translation(qmFiles ${l10n})
|
|||||||
|
|
||||||
qt_add_big_resources(fonts fonts.qrc)
|
qt_add_big_resources(fonts fonts.qrc)
|
||||||
|
|
||||||
target_compile_definitions(${PROJECT_NAME} PRIVATE "GIT_VERSION=${GIT_VERSION}")
|
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
# Icon
|
# Icon
|
||||||
target_sources(${PROJECT_NAME} PRIVATE ScreenPlay.rc)
|
target_sources(${PROJECT_NAME} PRIVATE ScreenPlay.rc)
|
||||||
|
@ -115,13 +115,6 @@
|
|||||||
<file>legal/lgpl-2.1.txt</file>
|
<file>legal/lgpl-2.1.txt</file>
|
||||||
<file>profiles.json</file>
|
<file>profiles.json</file>
|
||||||
<file>qtquickcontrols2.conf</file>
|
<file>qtquickcontrols2.conf</file>
|
||||||
<file>translations/ScreenPlay_de.qm</file>
|
|
||||||
<file>translations/ScreenPlay_en.qm</file>
|
|
||||||
<file>translations/ScreenPlay_es.qm</file>
|
|
||||||
<file>translations/ScreenPlay_fr.qm</file>
|
|
||||||
<file>translations/ScreenPlay_ko.qm</file>
|
|
||||||
<file>translations/ScreenPlay_ru.qm</file>
|
|
||||||
<file>translations/ScreenPlay_vi.qm</file>
|
|
||||||
<file>translations/ScreenPlay_zh_cn.qm</file>
|
<file>translations/ScreenPlay_zh_cn.qm</file>
|
||||||
<file>assets/images/Early_Access.png</file>
|
<file>assets/images/Early_Access.png</file>
|
||||||
<file>translations/ScreenPlay_pt_br.qm</file>
|
<file>translations/ScreenPlay_pt_br.qm</file>
|
||||||
@ -131,5 +124,27 @@
|
|||||||
<file>assets/icons/steam_default_avatar.png</file>
|
<file>assets/icons/steam_default_avatar.png</file>
|
||||||
<file>assets/macos/app.screenplay.plist</file>
|
<file>assets/macos/app.screenplay.plist</file>
|
||||||
<file>assets/icons/item_banner_new.svg</file>
|
<file>assets/icons/item_banner_new.svg</file>
|
||||||
|
<file>translations/ScreenPlay_de_DE.qm</file>
|
||||||
|
<file>translations/ScreenPlay_es_ES.qm</file>
|
||||||
|
<file>translations/ScreenPlay_fr_FR.qm</file>
|
||||||
|
<file>translations/ScreenPlay_ko_KR.qm</file>
|
||||||
|
<file>translations/ScreenPlay_pt_BR.qm</file>
|
||||||
|
<file>translations/ScreenPlay_ru_RU.qm</file>
|
||||||
|
<file>translations/ScreenPlay_vi_VN.qm</file>
|
||||||
|
<file>translations/ScreenPlay_zh_CN.qm</file>
|
||||||
|
<file>translations/ScreenPlay_.qm</file>
|
||||||
|
<file>translations/ScreenPlay_.ts</file>
|
||||||
|
<file>translations/ScreenPlay_de_DE.ts</file>
|
||||||
|
<file>translations/ScreenPlay_es_ES.ts</file>
|
||||||
|
<file>translations/ScreenPlay_fr_FR.ts</file>
|
||||||
|
<file>translations/ScreenPlay_ko_KR.ts</file>
|
||||||
|
<file>translations/ScreenPlay_pt_BR.ts</file>
|
||||||
|
<file>translations/ScreenPlay_ru_RU.ts</file>
|
||||||
|
<file>translations/ScreenPlay_vi_VN.ts</file>
|
||||||
|
<file>translations/ScreenPlay_zh_CN.ts</file>
|
||||||
|
<file>translations/ScreenPlay_tr_TR.qm</file>
|
||||||
|
<file>translations/ScreenPlay_tr_TR.ts</file>
|
||||||
|
<file>translations/ScreenPlay_nl_NL.qm</file>
|
||||||
|
<file>translations/ScreenPlay_nl_NL.ts</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
@ -92,5 +92,7 @@
|
|||||||
<file>qml/Create/StartInfoLinkImage.qml</file>
|
<file>qml/Create/StartInfoLinkImage.qml</file>
|
||||||
<file>qml/Workshop/SteamProfile.qml</file>
|
<file>qml/Workshop/SteamProfile.qml</file>
|
||||||
<file>qml/Workshop/SteamWorkshop.qml</file>
|
<file>qml/Workshop/SteamWorkshop.qml</file>
|
||||||
|
<file>qml/Workshop/Forum.qml</file>
|
||||||
|
<file>qml/Workshop/SteamWorkshopStartPage.qml</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls.Material
|
import QtQuick.Controls.Material
|
||||||
import Qt5Compat.GraphicalEffects
|
import Qt5Compat.GraphicalEffects
|
||||||
import QtQuick.Particles 2.0
|
import QtQuick.Particles
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
id: element
|
id: element
|
||||||
|
@ -14,7 +14,7 @@ Item {
|
|||||||
|
|
||||||
font.pointSize: 18
|
font.pointSize: 18
|
||||||
color: Material.primaryTextColor
|
color: Material.primaryTextColor
|
||||||
text: qsTr("Headline")
|
text: "Headline"
|
||||||
font.capitalization: Font.Capitalize
|
font.capitalization: Font.Capitalize
|
||||||
font.family: ScreenPlay.settings.font
|
font.family: ScreenPlay.settings.font
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ ColumnLayout {
|
|||||||
|
|
||||||
ListElement {
|
ListElement {
|
||||||
name: "Creative Commons - Attribution 4.0"
|
name: "Creative Commons - Attribution 4.0"
|
||||||
description: qsTr("You grant other to remix your work and change the license to their linking.")
|
description: qsTr("You grant other to remix your work and change the license to their liking.")
|
||||||
tldrlegal: "https://tldrlegal.com/license/creative-commons-attribution-4.0-international-(cc-by-4)"
|
tldrlegal: "https://tldrlegal.com/license/creative-commons-attribution-4.0-international-(cc-by-4)"
|
||||||
licenseFile: "License_CC_Attribution_4.0.txt"
|
licenseFile: "License_CC_Attribution_4.0.txt"
|
||||||
}
|
}
|
||||||
@ -61,7 +61,7 @@ ColumnLayout {
|
|||||||
|
|
||||||
ListElement {
|
ListElement {
|
||||||
name: "Open Source - Apache License 2.0"
|
name: "Open Source - Apache License 2.0"
|
||||||
description: qsTr("You grant other to remix your work and change the license to their linking.")
|
description: qsTr("You grant other to remix your work and change the license to their liking.")
|
||||||
tldrlegal: "https://tldrlegal.com/license/apache-license-2.0-(apache-2.0)"
|
tldrlegal: "https://tldrlegal.com/license/apache-license-2.0-(apache-2.0)"
|
||||||
licenseFile: "License_Apache_2.0.txt"
|
licenseFile: "License_Apache_2.0.txt"
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@ import QtQuick
|
|||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
import QtQuick.Controls.Material
|
import QtQuick.Controls.Material
|
||||||
import QtQuick.Particles 2.0
|
import QtQuick.Particles
|
||||||
import Qt5Compat.GraphicalEffects
|
import Qt5Compat.GraphicalEffects
|
||||||
import QtQuick.Controls.Material.impl
|
import QtQuick.Controls.Material.impl
|
||||||
import ScreenPlay 1.0
|
import ScreenPlay 1.0
|
||||||
|
@ -2,7 +2,7 @@ import QtQuick
|
|||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
import QtQuick.Controls.Material
|
import QtQuick.Controls.Material
|
||||||
import QtQuick.Particles 2.0
|
import QtQuick.Particles
|
||||||
import Qt5Compat.GraphicalEffects
|
import Qt5Compat.GraphicalEffects
|
||||||
import QtQuick.Controls.Material.impl
|
import QtQuick.Controls.Material.impl
|
||||||
import ScreenPlay 1.0
|
import ScreenPlay 1.0
|
||||||
|
@ -2,7 +2,7 @@ import QtQuick
|
|||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
import QtQuick.Controls.Material
|
import QtQuick.Controls.Material
|
||||||
import QtQuick.Particles 2.0
|
import QtQuick.Particles
|
||||||
import Qt5Compat.GraphicalEffects
|
import Qt5Compat.GraphicalEffects
|
||||||
import QtQuick.Controls.Material.impl
|
import QtQuick.Controls.Material.impl
|
||||||
import ScreenPlay 1.0
|
import ScreenPlay 1.0
|
||||||
|
@ -2,7 +2,7 @@ import QtQuick
|
|||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
import QtQuick.Controls.Material
|
import QtQuick.Controls.Material
|
||||||
import QtQuick.Particles 2.0
|
import QtQuick.Particles
|
||||||
import Qt5Compat.GraphicalEffects
|
import Qt5Compat.GraphicalEffects
|
||||||
import QtQuick.Controls.Material.impl
|
import QtQuick.Controls.Material.impl
|
||||||
import ScreenPlay 1.0
|
import ScreenPlay 1.0
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Controls.Material
|
import QtQuick.Controls.Material
|
||||||
import QtQuick.Controls
|
|
||||||
import Qt5Compat.GraphicalEffects
|
import Qt5Compat.GraphicalEffects
|
||||||
import QtQuick.Controls.Material.impl
|
import QtQuick.Controls.Material.impl
|
||||||
import ScreenPlay 1.0
|
import ScreenPlay 1.0
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Controls
|
|
||||||
import QtQuick.Controls.Material
|
import QtQuick.Controls.Material
|
||||||
import ScreenPlay 1.0
|
import ScreenPlay 1.0
|
||||||
import "../Common"
|
import "../Common"
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import QtQuick 2.0
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Controls.Material
|
import QtQuick.Controls.Material
|
||||||
import QtQuick.Controls
|
|
||||||
import Qt5Compat.GraphicalEffects
|
import Qt5Compat.GraphicalEffects
|
||||||
import QtQuick.Controls.Material.impl
|
import QtQuick.Controls.Material.impl
|
||||||
import ScreenPlay 1.0
|
import ScreenPlay 1.0
|
||||||
|
@ -2,7 +2,6 @@ import QtQuick
|
|||||||
import Qt5Compat.GraphicalEffects
|
import Qt5Compat.GraphicalEffects
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Controls.Material
|
import QtQuick.Controls.Material
|
||||||
import QtQuick.Controls
|
|
||||||
import ScreenPlay 1.0
|
import ScreenPlay 1.0
|
||||||
import ScreenPlay.Enums.InstalledType 1.0
|
import ScreenPlay.Enums.InstalledType 1.0
|
||||||
import "../Common/Util.js" as JSUtil
|
import "../Common/Util.js" as JSUtil
|
||||||
|
@ -78,6 +78,7 @@ Rectangle {
|
|||||||
|
|
||||||
state: "inactive"
|
state: "inactive"
|
||||||
name: "Create"
|
name: "Create"
|
||||||
|
text: qsTr("Create")
|
||||||
iconSource: "qrc:/assets/icons/icon_plus.svg"
|
iconSource: "qrc:/assets/icons/icon_plus.svg"
|
||||||
onPageClicked: (name)=> {root.onPageChanged(name)}
|
onPageClicked: (name)=> {root.onPageChanged(name)}
|
||||||
objectName: "createTab"
|
objectName: "createTab"
|
||||||
@ -88,6 +89,7 @@ Rectangle {
|
|||||||
|
|
||||||
state: "inactive"
|
state: "inactive"
|
||||||
name: "Workshop"
|
name: "Workshop"
|
||||||
|
text: qsTr("Workshop")
|
||||||
iconSource: "qrc:/assets/icons/icon_steam.svg"
|
iconSource: "qrc:/assets/icons/icon_steam.svg"
|
||||||
onPageClicked: (name)=> {root.onPageChanged(name)}
|
onPageClicked: (name)=> {root.onPageChanged(name)}
|
||||||
objectName: "workshopTab"
|
objectName: "workshopTab"
|
||||||
@ -98,6 +100,7 @@ Rectangle {
|
|||||||
|
|
||||||
state: "active"
|
state: "active"
|
||||||
name: "Installed"
|
name: "Installed"
|
||||||
|
text: qsTr("Installed")
|
||||||
amount: ScreenPlay.installedListModel.count
|
amount: ScreenPlay.installedListModel.count
|
||||||
iconSource: "qrc:/assets/icons/icon_installed.svg"
|
iconSource: "qrc:/assets/icons/icon_installed.svg"
|
||||||
onPageClicked: (name)=> {root.onPageChanged(name)}
|
onPageClicked: (name)=> {root.onPageChanged(name)}
|
||||||
@ -109,6 +112,7 @@ Rectangle {
|
|||||||
|
|
||||||
state: "inactive"
|
state: "inactive"
|
||||||
name: "Community"
|
name: "Community"
|
||||||
|
text: qsTr("Community")
|
||||||
iconSource: "qrc:/assets/icons/icon_community.svg"
|
iconSource: "qrc:/assets/icons/icon_community.svg"
|
||||||
onPageClicked: (name)=> {root.onPageChanged(name)}
|
onPageClicked: (name)=> {root.onPageChanged(name)}
|
||||||
objectName: "communityTab"
|
objectName: "communityTab"
|
||||||
@ -119,6 +123,7 @@ Rectangle {
|
|||||||
|
|
||||||
state: "inactive"
|
state: "inactive"
|
||||||
name: "Settings"
|
name: "Settings"
|
||||||
|
text: qsTr("Settings")
|
||||||
iconSource: "qrc:/assets/icons/icon_settings.svg"
|
iconSource: "qrc:/assets/icons/icon_settings.svg"
|
||||||
onPageClicked: (name)=> {root.onPageChanged(name)}
|
onPageClicked: (name)=> {root.onPageChanged(name)}
|
||||||
objectName: "settingsTab"
|
objectName: "settingsTab"
|
||||||
|
@ -7,7 +7,8 @@ Item {
|
|||||||
id: navigationItem
|
id: navigationItem
|
||||||
|
|
||||||
property string iconSource: "qrc:/assets/icons/icon_installed.svg"
|
property string iconSource: "qrc:/assets/icons/icon_installed.svg"
|
||||||
property alias name: txt.text
|
property string name
|
||||||
|
property alias text: txt.text
|
||||||
property alias amount: txtAmount.text
|
property alias amount: txtAmount.text
|
||||||
property bool enabled: true
|
property bool enabled: true
|
||||||
|
|
||||||
|
@ -163,32 +163,38 @@ Item {
|
|||||||
|
|
||||||
comboBox {
|
comboBox {
|
||||||
model: [{
|
model: [{
|
||||||
"value": Settings.En,
|
"value": Settings.En_US,
|
||||||
"text": qsTr("English")
|
"text": "English"
|
||||||
}, {
|
}, {
|
||||||
"value": Settings.De,
|
"value": Settings.De_DE,
|
||||||
"text": qsTr("German")
|
"text": "German"
|
||||||
}, {
|
}, {
|
||||||
"value": Settings.Zh_CN,
|
"value": Settings.Zh_CN,
|
||||||
"text": qsTr("Chinese - Simplified")
|
"text": "Chinese - Simplified"
|
||||||
}, {
|
}, {
|
||||||
"value": Settings.Ru,
|
"value": Settings.Ru_RU,
|
||||||
"text": qsTr("Russian")
|
"text": "Russian"
|
||||||
}, {
|
}, {
|
||||||
"value": Settings.Fr,
|
"value": Settings.Fr_FR,
|
||||||
"text": qsTr("French")
|
"text": "French"
|
||||||
}, {
|
}, {
|
||||||
"value": Settings.Es,
|
"value": Settings.Es_ES,
|
||||||
"text": qsTr("Spanish")
|
"text": "Spanish"
|
||||||
}, {
|
}, {
|
||||||
"value": Settings.Ko,
|
"value": Settings.Ko_KR,
|
||||||
"text": qsTr("Korean")
|
"text": "Korean"
|
||||||
}, {
|
}, {
|
||||||
"value": Settings.Vi,
|
"value": Settings.Vi_VN,
|
||||||
"text": qsTr("Vietnamese")
|
"text": "Vietnamese"
|
||||||
}, {
|
}, {
|
||||||
"value": Settings.Pt_BR,
|
"value": Settings.Pt_BR,
|
||||||
"text": qsTr("Portuguese (Brazil)")
|
"text": "Portuguese (Brazil)"
|
||||||
|
}, {
|
||||||
|
"value": Settings.Tr_TR,
|
||||||
|
"text": "Turkish"
|
||||||
|
}, {
|
||||||
|
"value": Settings.Nl_NL,
|
||||||
|
"text": "Dutch"
|
||||||
}]
|
}]
|
||||||
onActivated: {
|
onActivated: {
|
||||||
ScreenPlay.settings.setLanguage(settingsLanguage.comboBox.currentValue);
|
ScreenPlay.settings.setLanguage(settingsLanguage.comboBox.currentValue);
|
||||||
|
@ -7,22 +7,31 @@ Rectangle {
|
|||||||
|
|
||||||
property string backgroundImage: ""
|
property string backgroundImage: ""
|
||||||
property int imageOffsetTop: 0
|
property int imageOffsetTop: 0
|
||||||
|
property int stackViewDepth: 0
|
||||||
|
onStackViewDepthChanged: {
|
||||||
|
if (stackViewDepth > 1) {
|
||||||
|
root.state = "backgroundBlur"
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
root.state = "backgroundImage"
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
color: "#161C1D"
|
color: "#161C1D"
|
||||||
onImageOffsetTopChanged: {
|
onImageOffsetTopChanged: {
|
||||||
if ((imageOffsetTop * -1) >= 200) {
|
if ((imageOffsetTop * -1) >= 200) {
|
||||||
root.state = "backgroundColor";
|
root.state = "backgroundColor"
|
||||||
} else {
|
} else {
|
||||||
if (root.state !== "backgroundImage")
|
if (root.state !== "backgroundImage")
|
||||||
root.state = "backgroundImage";
|
root.state = "backgroundImage"
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onBackgroundImageChanged: {
|
onBackgroundImageChanged: {
|
||||||
if (backgroundImage === "")
|
if (backgroundImage === "")
|
||||||
root.state = "";
|
root.state = ""
|
||||||
else
|
else
|
||||||
root.state = "backgroundImage";
|
root.state = "backgroundImage"
|
||||||
}
|
}
|
||||||
|
|
||||||
Image {
|
Image {
|
||||||
@ -68,11 +77,8 @@ Rectangle {
|
|||||||
position: 1
|
position: 1
|
||||||
color: "#161C1D"
|
color: "#161C1D"
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FastBlur {
|
FastBlur {
|
||||||
@ -111,7 +117,6 @@ Rectangle {
|
|||||||
target: blur
|
target: blur
|
||||||
opacity: 0
|
opacity: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
State {
|
State {
|
||||||
name: "backgroundImage"
|
name: "backgroundImage"
|
||||||
@ -129,8 +134,8 @@ Rectangle {
|
|||||||
PropertyChanges {
|
PropertyChanges {
|
||||||
target: blur
|
target: blur
|
||||||
opacity: 0
|
opacity: 0
|
||||||
|
radius: 16
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
State {
|
State {
|
||||||
name: "backgroundColor"
|
name: "backgroundColor"
|
||||||
@ -148,8 +153,27 @@ Rectangle {
|
|||||||
PropertyChanges {
|
PropertyChanges {
|
||||||
target: blur
|
target: blur
|
||||||
opacity: 1
|
opacity: 1
|
||||||
|
radius: 16
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "backgroundBlur"
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: bgImage
|
||||||
|
opacity: 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: bgColor
|
||||||
|
opacity: 0.85
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyChanges {
|
||||||
|
target: blur
|
||||||
|
opacity: 1
|
||||||
|
radius: 64
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
transitions: [
|
transitions: [
|
||||||
@ -164,7 +188,6 @@ Rectangle {
|
|||||||
easing.type: Easing.InOutQuart
|
easing.type: Easing.InOutQuart
|
||||||
property: "opacity"
|
property: "opacity"
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
Transition {
|
Transition {
|
||||||
from: "backgroundImage"
|
from: "backgroundImage"
|
||||||
@ -177,7 +200,25 @@ Rectangle {
|
|||||||
easing.type: Easing.InOutQuart
|
easing.type: Easing.InOutQuart
|
||||||
property: "opacity"
|
property: "opacity"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
Transition {
|
||||||
|
from: "backgroundImage"
|
||||||
|
to: "backgroundBlur"
|
||||||
|
reversible: true
|
||||||
|
|
||||||
|
PropertyAnimation {
|
||||||
|
targets: [bgImage, bgColor, blur]
|
||||||
|
duration: 300
|
||||||
|
easing.type: Easing.InOutQuart
|
||||||
|
property: "opacity"
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyAnimation {
|
||||||
|
target: blur
|
||||||
|
duration: 300
|
||||||
|
easing.type: Easing.InOutQuart
|
||||||
|
property: "radius"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
65
ScreenPlay/qml/Workshop/Forum.qml
Normal file
65
ScreenPlay/qml/Workshop/Forum.qml
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Controls.Material
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import Qt5Compat.GraphicalEffects
|
||||||
|
import QtWebEngine
|
||||||
|
import ScreenPlay 1.0
|
||||||
|
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: navWrapper
|
||||||
|
|
||||||
|
color: Material.theme === Material.Light ? "white" : Material.background
|
||||||
|
height: 46
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
top: parent.top
|
||||||
|
right: parent.right
|
||||||
|
left: parent.left
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
anchors{
|
||||||
|
fill: parent
|
||||||
|
rightMargin: 20
|
||||||
|
leftMargin: 20
|
||||||
|
}
|
||||||
|
|
||||||
|
spacing: 20
|
||||||
|
Text {
|
||||||
|
id: name
|
||||||
|
text: qsTr("Download Wallpaper and Widgets from our forums manually. If you want to download Steam Workshop content you have to install ScreenPlay via Steam.")
|
||||||
|
Layout.fillHeight: true
|
||||||
|
Layout.fillWidth: true
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
font.pointSize: 10
|
||||||
|
font.family: ScreenPlay.settings.font
|
||||||
|
color: Material.secondaryTextColor
|
||||||
|
}
|
||||||
|
Button {
|
||||||
|
text: qsTr("Install Steam Version")
|
||||||
|
onClicked: Qt.openUrlExternally("https://store.steampowered.com/app/672870/ScreenPlay/")
|
||||||
|
}
|
||||||
|
Button {
|
||||||
|
text: qsTr("Open In Browser")
|
||||||
|
onClicked: Qt.openUrlExternally("https://forum.screen-play.app/category/5/wallpaper")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
WebEngineView {
|
||||||
|
id: webView
|
||||||
|
anchors {
|
||||||
|
top: navWrapper.bottom
|
||||||
|
right: parent.right
|
||||||
|
bottom: parent.bottom
|
||||||
|
left: parent.left
|
||||||
|
}
|
||||||
|
url:"https://forum.screen-play.app/category/5/wallpaper"
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
import QtQuick 2.0
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Controls.Material
|
import QtQuick.Controls.Material
|
||||||
import Qt5Compat.GraphicalEffects
|
import Qt5Compat.GraphicalEffects
|
||||||
|
@ -11,12 +11,11 @@ import "../Common" as Common
|
|||||||
Item {
|
Item {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
property ScreenPlayWorkshop workshop
|
property ScreenPlayWorkshop screenPlayWorkshop
|
||||||
property SteamWorkshop steam
|
property SteamWorkshop steamWorkshop
|
||||||
|
|
||||||
signal requestWorkshopMainPage
|
signal requestBack
|
||||||
|
Component.onCompleted: steamWorkshop.requestUserItems()
|
||||||
Component.onCompleted: steam.requestUserItems()
|
|
||||||
|
|
||||||
Flickable {
|
Flickable {
|
||||||
id: scrollView
|
id: scrollView
|
||||||
@ -48,7 +47,7 @@ Item {
|
|||||||
width: 70
|
width: 70
|
||||||
height: 70
|
height: 70
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
steam.steamAccount.loadAvatar()
|
root.steamWorkshop.steamAccount.loadAvatar()
|
||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
@ -57,7 +56,7 @@ Item {
|
|||||||
avatarPlaceholder.opacity = 0
|
avatarPlaceholder.opacity = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
target: steam.steamAccount
|
target: root.steamWorkshop.steamAccount
|
||||||
}
|
}
|
||||||
Image {
|
Image {
|
||||||
id: avatarPlaceholder
|
id: avatarPlaceholder
|
||||||
@ -67,7 +66,7 @@ Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
text: steam.steamAccount.username
|
text: root.steamWorkshop.steamAccount.username
|
||||||
font.pointSize: 12
|
font.pointSize: 12
|
||||||
color: "white"
|
color: "white"
|
||||||
font.family: ScreenPlay.settings.font
|
font.family: ScreenPlay.settings.font
|
||||||
@ -76,7 +75,7 @@ Item {
|
|||||||
|
|
||||||
Button {
|
Button {
|
||||||
text: qsTr("Back")
|
text: qsTr("Back")
|
||||||
onClicked: root.requestWorkshopMainPage()
|
onClicked: root.requestBack()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -90,7 +89,7 @@ Item {
|
|||||||
cellHeight: 190
|
cellHeight: 190
|
||||||
height: contentHeight
|
height: contentHeight
|
||||||
interactive: false
|
interactive: false
|
||||||
model: root.steam.workshopProfileListModel
|
model: root.steamWorkshop.workshopProfileListModel
|
||||||
boundsBehavior: Flickable.StopAtBounds
|
boundsBehavior: Flickable.StopAtBounds
|
||||||
|
|
||||||
anchors {
|
anchors {
|
||||||
@ -108,7 +107,7 @@ Item {
|
|||||||
additionalPreviewUrl: m_additionalPreviewUrl
|
additionalPreviewUrl: m_additionalPreviewUrl
|
||||||
subscriptionCount: m_subscriptionCount
|
subscriptionCount: m_subscriptionCount
|
||||||
itemIndex: index
|
itemIndex: index
|
||||||
steamWorkshop: root.steam
|
steamWorkshop: root.steamWorkshop
|
||||||
// onClicked: {
|
// onClicked: {
|
||||||
// sidebar.setWorkshopItem(publishedFileID, imgUrl,
|
// sidebar.setWorkshopItem(publishedFileID, imgUrl,
|
||||||
// additionalPreviewUrl,
|
// additionalPreviewUrl,
|
||||||
@ -136,10 +135,10 @@ Item {
|
|||||||
|
|
||||||
Layout.alignment: Qt.AlignVCenter
|
Layout.alignment: Qt.AlignVCenter
|
||||||
text: qsTr("Back")
|
text: qsTr("Back")
|
||||||
enabled: root.steam.workshopProfileListModel.currentPage > 1
|
enabled: root.steamWorkshop.workshopProfileListModel.currentPage > 1
|
||||||
onClicked: {
|
onClicked: {
|
||||||
root.steam.workshopProfileListModel.setCurrentPage(
|
root.steamWorkshop.workshopProfileListModel.setCurrentPage(
|
||||||
root.steam.workshopProfileListModel.currentPage - 1)
|
root.steamWorkshop.workshopProfileListModel.currentPage - 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,8 +146,8 @@ Item {
|
|||||||
id: txtPage
|
id: txtPage
|
||||||
|
|
||||||
Layout.alignment: Qt.AlignVCenter
|
Layout.alignment: Qt.AlignVCenter
|
||||||
text: root.steam.workshopProfileListModel.currentPage + "/"
|
text: root.steamWorkshop.workshopProfileListModel.currentPage
|
||||||
+ root.steam.workshopProfileListModel.pages
|
+ "/" + root.steamWorkshop.workshopProfileListModel.pages
|
||||||
font.family: ScreenPlay.settings.font
|
font.family: ScreenPlay.settings.font
|
||||||
color: Material.primaryTextColor
|
color: Material.primaryTextColor
|
||||||
}
|
}
|
||||||
@ -158,11 +157,11 @@ Item {
|
|||||||
|
|
||||||
Layout.alignment: Qt.AlignVCenter
|
Layout.alignment: Qt.AlignVCenter
|
||||||
text: qsTr("Forward")
|
text: qsTr("Forward")
|
||||||
enabled: root.steam.workshopProfileListModel.currentPage
|
enabled: root.steamWorkshop.workshopProfileListModel.currentPage
|
||||||
<= root.steam.workshopProfileListModel.pages - 1
|
<= root.steamWorkshop.workshopProfileListModel.pages - 1
|
||||||
onClicked: {
|
onClicked: {
|
||||||
root.steam.workshopProfileListModel.setCurrentPage(
|
root.steamWorkshop.workshopProfileListModel.setCurrentPage(
|
||||||
root.steam.workshopProfileListModel.currentPage + 1)
|
root.steamWorkshop.workshopProfileListModel.currentPage + 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,508 +6,83 @@ import QtQuick.Layouts
|
|||||||
import Workshop 1.0
|
import Workshop 1.0
|
||||||
import ScreenPlay 1.0
|
import ScreenPlay 1.0
|
||||||
import "upload/"
|
import "upload/"
|
||||||
import "../Common" as Common
|
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
property ScreenPlayWorkshop workshop
|
ScreenPlayWorkshop {
|
||||||
property SteamWorkshop steam
|
id: screenPlayWorkshop
|
||||||
|
Component.onCompleted: {
|
||||||
signal openSteamProfile
|
if (screenPlayWorkshop.init()) {
|
||||||
|
stackView.push("qrc:/qml/Workshop/SteamWorkshopStartPage.qml", {
|
||||||
onVisibleChanged: {
|
"stackView": stackView,
|
||||||
if (!visible)
|
"screenPlayWorkshop": screenPlayWorkshop,
|
||||||
sidebar.close()
|
"steamWorkshop": screenPlayWorkshop.steamWorkshop,
|
||||||
}
|
"background": background
|
||||||
Component.onCompleted: {
|
})
|
||||||
if (root.steam.online) {
|
} else {
|
||||||
root.steam.searchWorkshop(SteamEnums.K_EUGCQuery_RankedByTrend)
|
popupOffline.open()
|
||||||
} else {
|
}
|
||||||
|
|
||||||
popupOffline.open()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
enabled: gridView.count === 0
|
|
||||||
z: enabled ? 10 : 0
|
|
||||||
cursorShape: enabled ? Qt.WaitCursor : Qt.ArrowCursor
|
|
||||||
acceptedButtons: Qt.NoButton
|
|
||||||
propagateComposedEvents: true
|
|
||||||
anchors.fill: parent
|
|
||||||
preventStealing: true
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
function onWorkshopSearched() {
|
|
||||||
bannerTxt.text = root.steam.workshopListModel.getBannerText()
|
|
||||||
background.backgroundImage = root.steam.workshopListModel.getBannerUrl()
|
|
||||||
banner.bannerPublishedFileID = root.steam.workshopListModel.getBannerID()
|
|
||||||
bannerTxtUnderline.numberSubscriber
|
|
||||||
= root.steam.workshopListModel.getBannerAmountSubscriber()
|
|
||||||
}
|
|
||||||
|
|
||||||
target: root.steam
|
|
||||||
}
|
|
||||||
|
|
||||||
Background {
|
Background {
|
||||||
id: background
|
id: background
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
stackViewDepth: stackView.depth
|
||||||
}
|
}
|
||||||
|
|
||||||
UploadProject {
|
|
||||||
id: popupUploadProject
|
PopupOffline {
|
||||||
screenPlayWorkshop: workshop
|
id: popupOffline
|
||||||
|
workshop: screenPlayWorkshop
|
||||||
|
steam: screenPlayWorkshop.steamWorkshop
|
||||||
}
|
}
|
||||||
|
|
||||||
PopupSteamWorkshopAgreement {
|
StackView {
|
||||||
id: popupSteamWorkshopAgreement
|
id: stackView
|
||||||
}
|
property int duration: 300
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
function onUserNeedsToAcceptWorkshopLegalAgreement() {
|
target: stackView.currentItem
|
||||||
popupSteamWorkshopAgreement.open()
|
ignoreUnknownSignals: true
|
||||||
|
function onRequestBack() {
|
||||||
|
stackView.pop()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
target: root.steam.uploadListModel
|
|
||||||
}
|
|
||||||
|
|
||||||
Flickable {
|
|
||||||
id: scrollView
|
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
contentWidth: parent.width
|
replaceEnter: Transition {
|
||||||
contentHeight: gridView.height + header.height + 150
|
OpacityAnimator {
|
||||||
onContentYChanged: {
|
from: 0
|
||||||
// Calculate parallax scrolling
|
to: 1
|
||||||
if (contentY >= 0)
|
duration: stackView.duration
|
||||||
background.imageOffsetTop = (contentY * -0.4)
|
easing.type: Easing.InOutQuart
|
||||||
else
|
|
||||||
background.imageOffsetTop = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: header
|
|
||||||
|
|
||||||
height: 450
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
top: parent.top
|
|
||||||
right: parent.right
|
|
||||||
left: parent.left
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Item {
|
ScaleAnimator {
|
||||||
id: banner
|
from: 0.8
|
||||||
|
to: 1
|
||||||
property var bannerPublishedFileID
|
duration: stackView.duration
|
||||||
|
|
||||||
height: header.height
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
top: parent.top
|
|
||||||
right: parent.right
|
|
||||||
left: parent.left
|
|
||||||
}
|
|
||||||
|
|
||||||
Image {
|
|
||||||
id: bannerImg2
|
|
||||||
|
|
||||||
asynchronous: true
|
|
||||||
fillMode: Image.PreserveAspectCrop
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
right: parent.right
|
|
||||||
left: parent.left
|
|
||||||
bottom: parent.bottom
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ColumnLayout {
|
|
||||||
anchors {
|
|
||||||
top: parent.top
|
|
||||||
topMargin: 100
|
|
||||||
right: parent.right
|
|
||||||
left: parent.left
|
|
||||||
leftMargin: 100
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: bannerTxtUnderline
|
|
||||||
|
|
||||||
property int numberSubscriber: 0
|
|
||||||
|
|
||||||
text: numberSubscriber + " SUBSCRIBED TO:"
|
|
||||||
font.pointSize: 12
|
|
||||||
color: "white"
|
|
||||||
font.family: ScreenPlay.settings.font
|
|
||||||
font.weight: Font.Thin
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: bannerTxt
|
|
||||||
|
|
||||||
text: qsTr("Loading")
|
|
||||||
font.pointSize: 42
|
|
||||||
color: "white"
|
|
||||||
font.family: ScreenPlay.settings.font
|
|
||||||
font.weight: Font.Thin
|
|
||||||
width: 400
|
|
||||||
}
|
|
||||||
|
|
||||||
RowLayout {
|
|
||||||
spacing: 10
|
|
||||||
|
|
||||||
Button {
|
|
||||||
text: qsTr("Download now!")
|
|
||||||
Material.background: Material.accent
|
|
||||||
Material.foreground: "white"
|
|
||||||
icon.source: "qrc:/assets/icons/icon_download.svg"
|
|
||||||
onClicked: {
|
|
||||||
text = qsTr("Downloading...")
|
|
||||||
root.steam.subscribeItem(
|
|
||||||
root.steam.workshopListModel.getBannerID(
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
text: qsTr("Details")
|
|
||||||
Material.background: Material.accent
|
|
||||||
Material.foreground: "white"
|
|
||||||
icon.source: "qrc:/assets/icons/icon_info.svg"
|
|
||||||
visible: false
|
|
||||||
onClicked: {
|
|
||||||
sidebar.setWorkshopItem(publishedFileID,
|
|
||||||
imgUrl,
|
|
||||||
additionalPreviewUrl,
|
|
||||||
subscriptionCount)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
onClicked: Qt.openUrlExternally(
|
|
||||||
"steam://url/CommunityFilePage/"
|
|
||||||
+ banner.bannerPublishedFileID)
|
|
||||||
height: 30
|
|
||||||
width: bannerTxtOpenInSteam.paintedWidth
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: bannerTxtOpenInSteam
|
|
||||||
|
|
||||||
opacity: 0.7
|
|
||||||
text: qsTr("Open In Steam")
|
|
||||||
font.pointSize: 10
|
|
||||||
color: "white"
|
|
||||||
font.underline: true
|
|
||||||
font.family: ScreenPlay.settings.font
|
|
||||||
font.weight: Font.Thin
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GridView {
|
|
||||||
id: gridView
|
|
||||||
|
|
||||||
maximumFlickVelocity: 7000
|
|
||||||
flickDeceleration: 5000
|
|
||||||
cellWidth: 330
|
|
||||||
cellHeight: 190
|
|
||||||
height: contentHeight
|
|
||||||
interactive: false
|
|
||||||
model: root.steam.workshopListModel
|
|
||||||
boundsBehavior: Flickable.StopAtBounds
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
top: header.bottom
|
|
||||||
topMargin: 100
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
leftMargin: 45
|
|
||||||
}
|
|
||||||
|
|
||||||
header: Item {
|
|
||||||
property alias searchField: tiSearch
|
|
||||||
|
|
||||||
height: 80
|
|
||||||
width: gridView.width - gridView.anchors.leftMargin
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
color: Material.backgroundColor
|
|
||||||
radius: 3
|
|
||||||
width: parent.width - 20
|
|
||||||
height: 70
|
|
||||||
anchors.centerIn: parent
|
|
||||||
|
|
||||||
SteamImage {
|
|
||||||
id: avatar
|
|
||||||
|
|
||||||
width: 70
|
|
||||||
height: 70
|
|
||||||
Component.onCompleted: {
|
|
||||||
steam.steamAccount.loadAvatar()
|
|
||||||
}
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
function onAvatarChanged(_avatar) {
|
|
||||||
avatar.setImage(_avatar)
|
|
||||||
avatarPlaceholder.opacity = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
target: steam.steamAccount
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Image {
|
|
||||||
id: avatarPlaceholder
|
|
||||||
anchors.fill: avatar
|
|
||||||
source: "qrc:/assets/icons/steam_default_avatar.png"
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
id: btnSteamProfile
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
verticalCenter: parent.verticalCenter
|
|
||||||
left: avatar.right
|
|
||||||
leftMargin: 20
|
|
||||||
}
|
|
||||||
|
|
||||||
text: qsTr("Profile")
|
|
||||||
onClicked: root.openSteamProfile()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: searchWrapper
|
|
||||||
|
|
||||||
width: 400
|
|
||||||
height: 50
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
verticalCenter: parent.verticalCenter
|
|
||||||
left: btnSteamProfile.right
|
|
||||||
leftMargin: 20
|
|
||||||
}
|
|
||||||
|
|
||||||
TextField {
|
|
||||||
id: tiSearch
|
|
||||||
placeholderText: qsTr("Search for Wallpaper and Widgets...")
|
|
||||||
onEditingFinished: root.steam.searchWorkshopByText(
|
|
||||||
tiSearch.text)
|
|
||||||
anchors {
|
|
||||||
top: parent.top
|
|
||||||
right: parent.right
|
|
||||||
bottom: parent.bottom
|
|
||||||
left: parent.left
|
|
||||||
leftMargin: 10
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ToolButton {
|
|
||||||
id: tb
|
|
||||||
icon.source: "qrc:/assets/icons/icon_search.svg"
|
|
||||||
onClicked: root.steam.searchWorkshopByText(
|
|
||||||
tiSearch.text)
|
|
||||||
icon.width: 20
|
|
||||||
icon.height: 20
|
|
||||||
anchors {
|
|
||||||
right: parent.right
|
|
||||||
bottom: parent.bottom
|
|
||||||
bottomMargin: 10
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RowLayout {
|
|
||||||
spacing: 20
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
left: searchWrapper.right
|
|
||||||
leftMargin: 20
|
|
||||||
right: cbQuerySort.left
|
|
||||||
rightMargin: 20
|
|
||||||
verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.fillHeight: true
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
text: qsTr("Open Workshop in Steam")
|
|
||||||
font.capitalization: Font.Capitalize
|
|
||||||
font.family: ScreenPlay.settings.font
|
|
||||||
onClicked: Qt.openUrlExternally(
|
|
||||||
"steam://url/SteamWorkshopPage/672870")
|
|
||||||
icon.source: "qrc:/assets/icons/icon_steam.svg"
|
|
||||||
icon.width: 18
|
|
||||||
icon.height: 18
|
|
||||||
height: cbQuerySort.height
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ComboBox {
|
|
||||||
id: cbQuerySort
|
|
||||||
|
|
||||||
width: 220
|
|
||||||
height: searchWrapper.height
|
|
||||||
textRole: "text"
|
|
||||||
valueRole: "value"
|
|
||||||
currentIndex: 2
|
|
||||||
Layout.preferredHeight: searchWrapper.height
|
|
||||||
font.family: ScreenPlay.settings.font
|
|
||||||
model: [{
|
|
||||||
"value": SteamEnums.k_EUGCQuery_RankedByVote,
|
|
||||||
"text": qsTr("Ranked By Vote")
|
|
||||||
}, {
|
|
||||||
"value": SteamEnums.K_EUGCQuery_RankedByPublicationDate,
|
|
||||||
"text": qsTr("Publication Date")
|
|
||||||
}, {
|
|
||||||
"value": SteamEnums.K_EUGCQuery_RankedByTrend,
|
|
||||||
"text": qsTr("Ranked By Trend")
|
|
||||||
}, {
|
|
||||||
"value": SteamEnums.K_EUGCQuery_FavoritedByFriendsRankedByPublicationDate,
|
|
||||||
"text": qsTr("Favorited By Friends")
|
|
||||||
}, {
|
|
||||||
"value": SteamEnums.K_EUGCQuery_CreatedByFriendsRankedByPublicationDate,
|
|
||||||
"text": qsTr("Created By Friends")
|
|
||||||
}, {
|
|
||||||
"value": SteamEnums.K_EUGCQuery_CreatedByFollowedUsersRankedByPublicationDate,
|
|
||||||
"text": qsTr("Created By Followed Users")
|
|
||||||
}, {
|
|
||||||
"value": SteamEnums.K_EUGCQuery_NotYetRated,
|
|
||||||
"text": qsTr("Not Yet Rated")
|
|
||||||
}, {
|
|
||||||
"value": SteamEnums.K_EUGCQuery_RankedByTotalVotesAsc,
|
|
||||||
"text": qsTr("Total VotesAsc")
|
|
||||||
}, {
|
|
||||||
"value": SteamEnums.K_EUGCQuery_RankedByVotesUp,
|
|
||||||
"text": qsTr("Votes Up")
|
|
||||||
}, {
|
|
||||||
"value": SteamEnums.K_EUGCQuery_RankedByTotalUniqueSubscriptions,
|
|
||||||
"text": qsTr("Total Unique Subscriptions")
|
|
||||||
}]
|
|
||||||
onActivated: {
|
|
||||||
root.steam.searchWorkshop(cbQuerySort.currentValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
verticalCenter: parent.verticalCenter
|
|
||||||
right: parent.right
|
|
||||||
rightMargin: 10
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delegate: WorkshopItem {
|
|
||||||
imgUrl: m_workshopPreview
|
|
||||||
name: m_workshopTitle
|
|
||||||
publishedFileID: m_publishedFileID
|
|
||||||
additionalPreviewUrl: m_additionalPreviewUrl
|
|
||||||
subscriptionCount: m_subscriptionCount
|
|
||||||
itemIndex: index
|
|
||||||
steamWorkshop: root.steam
|
|
||||||
onClicked: {
|
|
||||||
sidebar.setWorkshopItem(publishedFileID, imgUrl,
|
|
||||||
additionalPreviewUrl,
|
|
||||||
subscriptionCount)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ScrollBar.vertical: ScrollBar {
|
|
||||||
id: workshopScrollBar
|
|
||||||
|
|
||||||
snapMode: ScrollBar.SnapOnRelease
|
|
||||||
}
|
|
||||||
|
|
||||||
footer: RowLayout {
|
|
||||||
height: 150
|
|
||||||
width: parent.width
|
|
||||||
spacing: 10
|
|
||||||
|
|
||||||
Item {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
id: btnBack
|
|
||||||
|
|
||||||
Layout.alignment: Qt.AlignVCenter
|
|
||||||
text: qsTr("Back")
|
|
||||||
enabled: root.steam.workshopListModel.currentPage > 1
|
|
||||||
onClicked: {
|
|
||||||
root.steam.workshopListModel.setCurrentPage(
|
|
||||||
root.steam.workshopListModel.currentPage - 1)
|
|
||||||
root.steam.searchWorkshop(
|
|
||||||
SteamEnums.K_EUGCQuery_RankedByTrend)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Text {
|
|
||||||
id: txtPage
|
|
||||||
|
|
||||||
Layout.alignment: Qt.AlignVCenter
|
|
||||||
text: root.steam.workshopListModel.currentPage + "/"
|
|
||||||
+ root.steam.workshopListModel.pages
|
|
||||||
font.family: ScreenPlay.settings.font
|
|
||||||
color: Material.primaryTextColor
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
id: btnForward
|
|
||||||
|
|
||||||
Layout.alignment: Qt.AlignVCenter
|
|
||||||
text: qsTr("Forward")
|
|
||||||
enabled: root.steam.workshopListModel.currentPage
|
|
||||||
<= root.steam.workshopListModel.pages - 1
|
|
||||||
onClicked: {
|
|
||||||
root.steam.workshopListModel.setCurrentPage(
|
|
||||||
root.steam.workshopListModel.currentPage + 1)
|
|
||||||
root.steam.searchWorkshop(
|
|
||||||
SteamEnums.K_EUGCQuery_RankedByTrend)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Behavior on contentHeight {
|
|
||||||
PropertyAnimation {
|
|
||||||
duration: 400
|
|
||||||
property: "contentHeight"
|
|
||||||
easing.type: Easing.InOutQuart
|
easing.type: Easing.InOutQuart
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ScrollBar.vertical: ScrollBar {
|
replaceExit: Transition {
|
||||||
snapMode: ScrollBar.SnapOnRelease
|
OpacityAnimator {
|
||||||
}
|
from: 1
|
||||||
}
|
to: 0
|
||||||
|
duration: stackView.duration
|
||||||
|
easing.type: Easing.InOutQuart
|
||||||
|
}
|
||||||
|
|
||||||
Sidebar {
|
ScaleAnimator {
|
||||||
id: sidebar
|
from: 1
|
||||||
|
to: 0.8
|
||||||
topMargin: 60
|
duration: stackView.duration
|
||||||
steamWorkshop: root.steam
|
easing.type: Easing.InOutQuart
|
||||||
onTagClicked: {
|
}
|
||||||
gridView.headerItem.searchField.text = tag
|
|
||||||
sidebar.close()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
525
ScreenPlay/qml/Workshop/SteamWorkshopStartPage.qml
Normal file
525
ScreenPlay/qml/Workshop/SteamWorkshopStartPage.qml
Normal file
@ -0,0 +1,525 @@
|
|||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Controls.Material
|
||||||
|
import Qt5Compat.GraphicalEffects
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import Workshop 1.0
|
||||||
|
import ScreenPlay 1.0
|
||||||
|
import "upload/"
|
||||||
|
import "../Common" as Common
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
property SteamWorkshop steamWorkshop
|
||||||
|
property ScreenPlayWorkshop screenPlayWorkshop
|
||||||
|
property StackView stackView
|
||||||
|
property Background background
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
root.steamWorkshop.searchWorkshop(SteamEnums.K_EUGCQuery_RankedByTrend)
|
||||||
|
}
|
||||||
|
|
||||||
|
onVisibleChanged: {
|
||||||
|
if (!visible)
|
||||||
|
sidebar.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
enabled: gridView.count === 0
|
||||||
|
z: enabled ? 10 : 0
|
||||||
|
cursorShape: enabled ? Qt.WaitCursor : Qt.ArrowCursor
|
||||||
|
acceptedButtons: Qt.NoButton
|
||||||
|
propagateComposedEvents: true
|
||||||
|
anchors.fill: parent
|
||||||
|
preventStealing: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
function onWorkshopSearched() {
|
||||||
|
bannerTxt.text = root.steamWorkshop.workshopListModel.getBannerText(
|
||||||
|
)
|
||||||
|
background.backgroundImage = root.steamWorkshop.workshopListModel.getBannerUrl()
|
||||||
|
banner.bannerPublishedFileID = root.steamWorkshop.workshopListModel.getBannerID()
|
||||||
|
bannerTxtUnderline.numberSubscriber
|
||||||
|
= root.steamWorkshop.workshopListModel.getBannerAmountSubscriber()
|
||||||
|
}
|
||||||
|
|
||||||
|
target: root.steamWorkshop
|
||||||
|
}
|
||||||
|
|
||||||
|
PopupSteamWorkshopAgreement {
|
||||||
|
id: popupSteamWorkshopAgreement
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
function onUserNeedsToAcceptWorkshopLegalAgreement() {
|
||||||
|
popupSteamWorkshopAgreement.open()
|
||||||
|
}
|
||||||
|
|
||||||
|
target: root.steamWorkshop.uploadListModel
|
||||||
|
}
|
||||||
|
|
||||||
|
Flickable {
|
||||||
|
id: scrollView
|
||||||
|
|
||||||
|
anchors.fill: parent
|
||||||
|
contentWidth: parent.width
|
||||||
|
contentHeight: gridView.height + header.height + 150
|
||||||
|
onContentYChanged: {
|
||||||
|
// Calculate parallax scrolling
|
||||||
|
if (contentY >= 0)
|
||||||
|
background.imageOffsetTop = (contentY * -0.4)
|
||||||
|
else
|
||||||
|
background.imageOffsetTop = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: header
|
||||||
|
|
||||||
|
height: 450
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
top: parent.top
|
||||||
|
right: parent.right
|
||||||
|
left: parent.left
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: banner
|
||||||
|
|
||||||
|
property var bannerPublishedFileID
|
||||||
|
|
||||||
|
height: header.height
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
top: parent.top
|
||||||
|
right: parent.right
|
||||||
|
left: parent.left
|
||||||
|
}
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: bannerImg2
|
||||||
|
|
||||||
|
asynchronous: true
|
||||||
|
fillMode: Image.PreserveAspectCrop
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
right: parent.right
|
||||||
|
left: parent.left
|
||||||
|
bottom: parent.bottom
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
anchors {
|
||||||
|
top: parent.top
|
||||||
|
topMargin: 100
|
||||||
|
right: parent.right
|
||||||
|
left: parent.left
|
||||||
|
leftMargin: 100
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: bannerTxtUnderline
|
||||||
|
|
||||||
|
property int numberSubscriber: 0
|
||||||
|
|
||||||
|
text: numberSubscriber + " SUBSCRIBED TO:"
|
||||||
|
font.pointSize: 12
|
||||||
|
color: "white"
|
||||||
|
font.family: ScreenPlay.settings.font
|
||||||
|
font.weight: Font.Thin
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: bannerTxt
|
||||||
|
|
||||||
|
text: qsTr("Loading")
|
||||||
|
font.pointSize: 42
|
||||||
|
color: "white"
|
||||||
|
font.family: ScreenPlay.settings.font
|
||||||
|
font.weight: Font.Thin
|
||||||
|
width: 400
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
spacing: 10
|
||||||
|
|
||||||
|
Button {
|
||||||
|
text: qsTr("Download now!")
|
||||||
|
Material.background: Material.accent
|
||||||
|
Material.foreground: "white"
|
||||||
|
icon.source: "qrc:/assets/icons/icon_download.svg"
|
||||||
|
onClicked: {
|
||||||
|
text = qsTr("Downloading...")
|
||||||
|
root.steamWorkshop.subscribeItem(
|
||||||
|
root.steamWorkshop.workshopListModel.getBannerID(
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
text: qsTr("Details")
|
||||||
|
Material.background: Material.accent
|
||||||
|
Material.foreground: "white"
|
||||||
|
icon.source: "qrc:/assets/icons/icon_info.svg"
|
||||||
|
visible: false
|
||||||
|
onClicked: {
|
||||||
|
sidebar.setWorkshopItem(publishedFileID,
|
||||||
|
imgUrl,
|
||||||
|
additionalPreviewUrl,
|
||||||
|
subscriptionCount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
onClicked: Qt.openUrlExternally(
|
||||||
|
"steam://url/CommunityFilePage/"
|
||||||
|
+ banner.bannerPublishedFileID)
|
||||||
|
height: 30
|
||||||
|
width: bannerTxtOpenInSteam.paintedWidth
|
||||||
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: bannerTxtOpenInSteam
|
||||||
|
|
||||||
|
opacity: 0.7
|
||||||
|
text: qsTr("Open In Steam")
|
||||||
|
font.pointSize: 10
|
||||||
|
color: "white"
|
||||||
|
font.underline: true
|
||||||
|
font.family: ScreenPlay.settings.font
|
||||||
|
font.weight: Font.Thin
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GridView {
|
||||||
|
id: gridView
|
||||||
|
|
||||||
|
maximumFlickVelocity: 7000
|
||||||
|
flickDeceleration: 5000
|
||||||
|
cellWidth: 330
|
||||||
|
cellHeight: 190
|
||||||
|
height: contentHeight
|
||||||
|
interactive: false
|
||||||
|
model: root.steamWorkshop.workshopListModel
|
||||||
|
boundsBehavior: Flickable.StopAtBounds
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
top: header.bottom
|
||||||
|
topMargin: 100
|
||||||
|
left: parent.left
|
||||||
|
right: parent.right
|
||||||
|
leftMargin: 45
|
||||||
|
}
|
||||||
|
|
||||||
|
header: Item {
|
||||||
|
property alias searchField: tiSearch
|
||||||
|
|
||||||
|
height: 80
|
||||||
|
width: gridView.width - gridView.anchors.leftMargin
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
color: Material.backgroundColor
|
||||||
|
radius: 3
|
||||||
|
width: parent.width - 20
|
||||||
|
height: 70
|
||||||
|
anchors.centerIn: parent
|
||||||
|
|
||||||
|
SteamImage {
|
||||||
|
id: avatar
|
||||||
|
|
||||||
|
width: 70
|
||||||
|
height: 70
|
||||||
|
Component.onCompleted: {
|
||||||
|
steamWorkshop.steamAccount.loadAvatar()
|
||||||
|
}
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
left: parent.left
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
function onAvatarChanged(_avatar) {
|
||||||
|
avatar.setImage(_avatar)
|
||||||
|
avatarPlaceholder.opacity = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
target: steamWorkshop.steamAccount
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: avatarPlaceholder
|
||||||
|
anchors.fill: avatar
|
||||||
|
source: "qrc:/assets/icons/steam_default_avatar.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
id: btnSteamProfile
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
left: avatar.right
|
||||||
|
leftMargin: 20
|
||||||
|
}
|
||||||
|
|
||||||
|
text: qsTr("Profile")
|
||||||
|
onClicked: {
|
||||||
|
stackView.push(
|
||||||
|
"qrc:/qml/Workshop/SteamProfile.qml", {
|
||||||
|
"screenPlayWorkshop": root.screenPlayWorkshop,
|
||||||
|
"steamWorkshop": root.steamWorkshop
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
id: btnSteamUpload
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
left: btnSteamProfile.right
|
||||||
|
leftMargin: 20
|
||||||
|
}
|
||||||
|
|
||||||
|
text: qsTr("Upload")
|
||||||
|
onClicked: {
|
||||||
|
stackView.push(
|
||||||
|
"qrc:/qml/Workshop/upload/UploadProject.qml", {
|
||||||
|
"screenPlayWorkshop": root.screenPlayWorkshop,
|
||||||
|
"steamWorkshop": root.steamWorkshop
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: searchWrapper
|
||||||
|
|
||||||
|
width: 400
|
||||||
|
height: 50
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
left: btnSteamUpload.right
|
||||||
|
leftMargin: 20
|
||||||
|
}
|
||||||
|
|
||||||
|
TextField {
|
||||||
|
id: tiSearch
|
||||||
|
placeholderText: qsTr("Search for Wallpaper and Widgets...")
|
||||||
|
onEditingFinished: root.steamWorkshop.searchWorkshopByText(
|
||||||
|
tiSearch.text)
|
||||||
|
anchors {
|
||||||
|
top: parent.top
|
||||||
|
right: parent.right
|
||||||
|
bottom: parent.bottom
|
||||||
|
left: parent.left
|
||||||
|
leftMargin: 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ToolButton {
|
||||||
|
id: tb
|
||||||
|
icon.source: "qrc:/assets/icons/icon_search.svg"
|
||||||
|
onClicked: root.steamWorkshop.searchWorkshopByText(
|
||||||
|
tiSearch.text)
|
||||||
|
icon.width: 20
|
||||||
|
icon.height: 20
|
||||||
|
anchors {
|
||||||
|
right: parent.right
|
||||||
|
bottom: parent.bottom
|
||||||
|
bottomMargin: 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
spacing: 20
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
left: searchWrapper.right
|
||||||
|
leftMargin: 20
|
||||||
|
right: cbQuerySort.left
|
||||||
|
rightMargin: 20
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
text: qsTr("Open Workshop in Steam")
|
||||||
|
font.capitalization: Font.Capitalize
|
||||||
|
font.family: ScreenPlay.settings.font
|
||||||
|
onClicked: Qt.openUrlExternally(
|
||||||
|
"steam://url/SteamWorkshopPage/672870")
|
||||||
|
icon.source: "qrc:/assets/icons/icon_steam.svg"
|
||||||
|
icon.width: 18
|
||||||
|
icon.height: 18
|
||||||
|
height: cbQuerySort.height
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ComboBox {
|
||||||
|
id: cbQuerySort
|
||||||
|
|
||||||
|
width: 220
|
||||||
|
height: searchWrapper.height
|
||||||
|
textRole: "text"
|
||||||
|
valueRole: "value"
|
||||||
|
currentIndex: 2
|
||||||
|
Layout.preferredHeight: searchWrapper.height
|
||||||
|
font.family: ScreenPlay.settings.font
|
||||||
|
model: [{
|
||||||
|
"value": SteamEnums.k_EUGCQuery_RankedByVote,
|
||||||
|
"text": qsTr("Ranked By Vote")
|
||||||
|
}, {
|
||||||
|
"value": SteamEnums.K_EUGCQuery_RankedByPublicationDate,
|
||||||
|
"text": qsTr("Publication Date")
|
||||||
|
}, {
|
||||||
|
"value": SteamEnums.K_EUGCQuery_RankedByTrend,
|
||||||
|
"text": qsTr("Ranked By Trend")
|
||||||
|
}, {
|
||||||
|
"value": SteamEnums.K_EUGCQuery_FavoritedByFriendsRankedByPublicationDate,
|
||||||
|
"text": qsTr("Favorited By Friends")
|
||||||
|
}, {
|
||||||
|
"value": SteamEnums.K_EUGCQuery_CreatedByFriendsRankedByPublicationDate,
|
||||||
|
"text": qsTr("Created By Friends")
|
||||||
|
}, {
|
||||||
|
"value": SteamEnums.K_EUGCQuery_CreatedByFollowedUsersRankedByPublicationDate,
|
||||||
|
"text": qsTr("Created By Followed Users")
|
||||||
|
}, {
|
||||||
|
"value": SteamEnums.K_EUGCQuery_NotYetRated,
|
||||||
|
"text": qsTr("Not Yet Rated")
|
||||||
|
}, {
|
||||||
|
"value": SteamEnums.K_EUGCQuery_RankedByTotalVotesAsc,
|
||||||
|
"text": qsTr("Total VotesAsc")
|
||||||
|
}, {
|
||||||
|
"value": SteamEnums.K_EUGCQuery_RankedByVotesUp,
|
||||||
|
"text": qsTr("Votes Up")
|
||||||
|
}, {
|
||||||
|
"value": SteamEnums.K_EUGCQuery_RankedByTotalUniqueSubscriptions,
|
||||||
|
"text": qsTr("Total Unique Subscriptions")
|
||||||
|
}]
|
||||||
|
onActivated: {
|
||||||
|
root.steamWorkshop.searchWorkshop(
|
||||||
|
cbQuerySort.currentValue)
|
||||||
|
}
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
right: parent.right
|
||||||
|
rightMargin: 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delegate: WorkshopItem {
|
||||||
|
imgUrl: m_workshopPreview
|
||||||
|
name: m_workshopTitle
|
||||||
|
publishedFileID: m_publishedFileID
|
||||||
|
additionalPreviewUrl: m_additionalPreviewUrl
|
||||||
|
subscriptionCount: m_subscriptionCount
|
||||||
|
itemIndex: index
|
||||||
|
steamWorkshop: root.steamWorkshop
|
||||||
|
onClicked: {
|
||||||
|
sidebar.setWorkshopItem(publishedFileID, imgUrl,
|
||||||
|
additionalPreviewUrl,
|
||||||
|
subscriptionCount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ScrollBar.vertical: ScrollBar {
|
||||||
|
id: workshopScrollBar
|
||||||
|
|
||||||
|
snapMode: ScrollBar.SnapOnRelease
|
||||||
|
}
|
||||||
|
|
||||||
|
footer: RowLayout {
|
||||||
|
height: 150
|
||||||
|
width: parent.width
|
||||||
|
spacing: 10
|
||||||
|
|
||||||
|
Item {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
id: btnBack
|
||||||
|
|
||||||
|
Layout.alignment: Qt.AlignVCenter
|
||||||
|
text: qsTr("Back")
|
||||||
|
enabled: root.steamWorkshop.workshopListModel.currentPage > 1
|
||||||
|
onClicked: {
|
||||||
|
root.steamWorkshop.workshopListModel.setCurrentPage(
|
||||||
|
root.steamWorkshop.workshopListModel.currentPage - 1)
|
||||||
|
root.steamWorkshop.searchWorkshop(
|
||||||
|
SteamEnums.K_EUGCQuery_RankedByTrend)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: txtPage
|
||||||
|
|
||||||
|
Layout.alignment: Qt.AlignVCenter
|
||||||
|
text: root.steamWorkshop.workshopListModel.currentPage + "/"
|
||||||
|
+ root.steamWorkshop.workshopListModel.pages
|
||||||
|
font.family: ScreenPlay.settings.font
|
||||||
|
color: Material.primaryTextColor
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
id: btnForward
|
||||||
|
|
||||||
|
Layout.alignment: Qt.AlignVCenter
|
||||||
|
text: qsTr("Forward")
|
||||||
|
enabled: root.steamWorkshop.workshopListModel.currentPage
|
||||||
|
<= root.steamWorkshop.workshopListModel.pages - 1
|
||||||
|
onClicked: {
|
||||||
|
root.steamWorkshop.workshopListModel.setCurrentPage(
|
||||||
|
root.steamWorkshop.workshopListModel.currentPage + 1)
|
||||||
|
root.steamWorkshop.searchWorkshop(
|
||||||
|
SteamEnums.K_EUGCQuery_RankedByTrend)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Behavior on contentHeight {
|
||||||
|
PropertyAnimation {
|
||||||
|
duration: 400
|
||||||
|
property: "contentHeight"
|
||||||
|
easing.type: Easing.InOutQuart
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ScrollBar.vertical: ScrollBar {
|
||||||
|
snapMode: ScrollBar.SnapOnRelease
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Sidebar {
|
||||||
|
id: sidebar
|
||||||
|
|
||||||
|
topMargin: 60
|
||||||
|
steamWorkshop: root.steamWorkshop
|
||||||
|
onTagClicked: {
|
||||||
|
gridView.headerItem.searchField.text = tag
|
||||||
|
sidebar.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -2,85 +2,24 @@ import QtQuick
|
|||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Controls.Material
|
import QtQuick.Controls.Material
|
||||||
import Qt5Compat.GraphicalEffects
|
import Qt5Compat.GraphicalEffects
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
import Workshop 1.0
|
import Settings
|
||||||
import ScreenPlay 1.0
|
import ScreenPlay
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
ScreenPlayWorkshop {
|
Component.onCompleted: {
|
||||||
id: ws
|
if (ScreenPlay.settings.steamVersion) {
|
||||||
|
workshopLoader.setSource("qrc:/qml/Workshop/SteamWorkshop.qml")
|
||||||
Component.onCompleted: {
|
} else {
|
||||||
const success = ws.init();
|
workshopLoader.setSource("qrc:/qml/Workshop/Forum.qml")
|
||||||
if(success){
|
|
||||||
stackView.push("qrc:/qml/Workshop/SteamWorkshop.qml", {
|
|
||||||
"workshop": ws,
|
|
||||||
"steam": ws.steamWorkshop
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
popupOffline.open()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PopupOffline {
|
Loader {
|
||||||
id: popupOffline
|
id: workshopLoader
|
||||||
workshop: ws
|
asynchronous: true
|
||||||
steam: ws.steamWorkshop
|
|
||||||
}
|
|
||||||
|
|
||||||
StackView {
|
|
||||||
id: stackView
|
|
||||||
|
|
||||||
property int duration: 300
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: stackView.currentItem
|
|
||||||
ignoreUnknownSignals: true
|
|
||||||
function onOpenSteamProfile(){
|
|
||||||
stackView.push("qrc:/qml/Workshop/SteamProfile.qml", {
|
|
||||||
"workshop": ws,
|
|
||||||
"steam": ws.steamWorkshop
|
|
||||||
})
|
|
||||||
}
|
|
||||||
function onRequestWorkshopMainPage(){
|
|
||||||
stackView.pop()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
replaceEnter: Transition {
|
|
||||||
OpacityAnimator {
|
|
||||||
from: 0
|
|
||||||
to: 1
|
|
||||||
duration: stackView.duration
|
|
||||||
easing.type: Easing.InOutQuart
|
|
||||||
}
|
|
||||||
|
|
||||||
ScaleAnimator {
|
|
||||||
from: 0.8
|
|
||||||
to: 1
|
|
||||||
duration: stackView.duration
|
|
||||||
easing.type: Easing.InOutQuart
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
replaceExit: Transition {
|
|
||||||
OpacityAnimator {
|
|
||||||
from: 1
|
|
||||||
to: 0
|
|
||||||
duration: stackView.duration
|
|
||||||
easing.type: Easing.InOutQuart
|
|
||||||
}
|
|
||||||
|
|
||||||
ScaleAnimator {
|
|
||||||
from: 1
|
|
||||||
to: 0.8
|
|
||||||
duration: stackView.duration
|
|
||||||
easing.type: Easing.InOutQuart
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Controls
|
|
||||||
import Qt5Compat.GraphicalEffects
|
import Qt5Compat.GraphicalEffects
|
||||||
import Workshop 1.0 as SP
|
import Workshop 1.0 as SP
|
||||||
|
|
||||||
|
@ -5,250 +5,215 @@ import QtQuick.Layouts
|
|||||||
import Workshop 1.0
|
import Workshop 1.0
|
||||||
import ScreenPlay 1.0
|
import ScreenPlay 1.0
|
||||||
|
|
||||||
Popup {
|
Item {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
property ScreenPlayWorkshop screenPlayWorkshop
|
property ScreenPlayWorkshop screenPlayWorkshop
|
||||||
property SteamWorkshop steam: screenPlayWorkshop.steamWorkshop
|
property SteamWorkshop steamWorkshop
|
||||||
|
|
||||||
width: 1200
|
signal requestBack
|
||||||
height: 700
|
|
||||||
modal: true
|
|
||||||
dim: true
|
|
||||||
anchors.centerIn: Overlay.overlay
|
|
||||||
closePolicy: Popup.NoAutoClose
|
|
||||||
onAboutToShow: uploadLoader.sourceComponent = com
|
|
||||||
onAboutToHide: uploadLoader.sourceComponent = undefined
|
|
||||||
|
|
||||||
Loader {
|
Item {
|
||||||
id: uploadLoader
|
id: headerWrapper
|
||||||
|
|
||||||
anchors.fill: parent
|
height: 50
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
anchors {
|
||||||
function onRequestClosePopup() {
|
top: parent.top
|
||||||
root.close()
|
right: parent.right
|
||||||
|
left: parent.left
|
||||||
|
margins: 10
|
||||||
}
|
}
|
||||||
|
|
||||||
target: uploadLoader.item
|
Text {
|
||||||
|
id: txtHeadline
|
||||||
|
|
||||||
|
text: qsTr("Upload Wallpaper/Widgets to Steam")
|
||||||
|
color: Material.foreground
|
||||||
|
font.pointSize: 21
|
||||||
|
font.family: ScreenPlay.settings.font
|
||||||
|
font.weight: Font.Thin
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
top: parent.top
|
||||||
|
horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Component {
|
SwipeView {
|
||||||
id: com
|
id: view
|
||||||
|
|
||||||
|
clip: true
|
||||||
|
currentIndex: 0
|
||||||
|
interactive: false
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
top: headerWrapper.bottom
|
||||||
|
right: parent.right
|
||||||
|
bottom: parent.bottom
|
||||||
|
left: parent.left
|
||||||
|
margins: 10
|
||||||
|
}
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: wrapper
|
id: firstPage
|
||||||
|
|
||||||
signal requestClosePopup
|
GridView {
|
||||||
|
id: gridView
|
||||||
|
|
||||||
Item {
|
boundsBehavior: Flickable.DragOverBounds
|
||||||
id: headerWrapper
|
maximumFlickVelocity: 7000
|
||||||
|
flickDeceleration: 5000
|
||||||
height: 50
|
cellWidth: parent.width
|
||||||
|
cellHeight: 250
|
||||||
|
clip: true
|
||||||
|
model: screenPlayWorkshop.installedListModel
|
||||||
|
|
||||||
anchors {
|
anchors {
|
||||||
top: parent.top
|
top: parent.top
|
||||||
right: parent.right
|
right: parent.right
|
||||||
|
bottom: btnAbort.top
|
||||||
left: parent.left
|
left: parent.left
|
||||||
margins: 10
|
margins: 10
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
delegate: UploadProjectBigItem {
|
||||||
id: txtHeadline
|
id: delegate
|
||||||
|
|
||||||
text: qsTr("Upload Wallpaper/Widgets to Steam")
|
focus: true
|
||||||
color: Material.foreground
|
width: gridView.cellWidth - 30
|
||||||
font.pointSize: 21
|
customTitle: m_title
|
||||||
font.family: ScreenPlay.settings.font
|
type: m_type
|
||||||
font.weight: Font.Thin
|
screenId: m_folderId
|
||||||
|
absoluteStoragePath: m_absoluteStoragePath
|
||||||
anchors {
|
publishedFileID: m_publishedFileID
|
||||||
top: parent.top
|
preview: m_preview
|
||||||
horizontalCenter: parent.horizontalCenter
|
itemIndex: index
|
||||||
|
onItemClicked: {
|
||||||
|
for (let childItem in gridView.contentItem.children) {
|
||||||
|
if (gridView.contentItem.children[childItem].isSelected) {
|
||||||
|
btnUploadProjects.enabled = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
btnUploadProjects.enabled = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ScrollBar.vertical: ScrollBar {
|
||||||
|
snapMode: ScrollBar.SnapOnRelease
|
||||||
|
policy: ScrollBar.AlwaysOn
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SwipeView {
|
Button {
|
||||||
id: view
|
id: btnAbort
|
||||||
|
|
||||||
clip: true
|
text: qsTr("Abort")
|
||||||
currentIndex: 0
|
onClicked: {
|
||||||
interactive: false
|
root.requestBack()
|
||||||
|
}
|
||||||
|
|
||||||
anchors {
|
anchors {
|
||||||
top: headerWrapper.bottom
|
right: btnUploadProjects.left
|
||||||
right: parent.right
|
|
||||||
bottom: parent.bottom
|
bottom: parent.bottom
|
||||||
left: parent.left
|
|
||||||
margins: 10
|
margins: 10
|
||||||
}
|
}
|
||||||
|
|
||||||
Item {
|
|
||||||
id: firstPage
|
|
||||||
|
|
||||||
GridView {
|
|
||||||
id: gridView
|
|
||||||
|
|
||||||
boundsBehavior: Flickable.DragOverBounds
|
|
||||||
maximumFlickVelocity: 7000
|
|
||||||
flickDeceleration: 5000
|
|
||||||
cellWidth: parent.width
|
|
||||||
cellHeight: 250
|
|
||||||
clip: true
|
|
||||||
model: screenPlayWorkshop.installedListModel
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
top: parent.top
|
|
||||||
right: parent.right
|
|
||||||
bottom: btnAbort.top
|
|
||||||
left: parent.left
|
|
||||||
margins: 10
|
|
||||||
}
|
|
||||||
|
|
||||||
delegate: UploadProjectBigItem {
|
|
||||||
id: delegate
|
|
||||||
|
|
||||||
focus: true
|
|
||||||
width: gridView.cellWidth - 30
|
|
||||||
customTitle: m_title
|
|
||||||
type: m_type
|
|
||||||
screenId: m_folderId
|
|
||||||
absoluteStoragePath: m_absoluteStoragePath
|
|
||||||
publishedFileID: m_publishedFileID
|
|
||||||
preview: m_preview
|
|
||||||
itemIndex: index
|
|
||||||
onItemClicked: {
|
|
||||||
for (let childItem in gridView.contentItem.children) {
|
|
||||||
if (gridView.contentItem.children[childItem].isSelected) {
|
|
||||||
btnUploadProjects.enabled = true
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
btnUploadProjects.enabled = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ScrollBar.vertical: ScrollBar {
|
|
||||||
snapMode: ScrollBar.SnapOnRelease
|
|
||||||
policy: ScrollBar.AlwaysOn
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
id: btnAbort
|
|
||||||
|
|
||||||
text: qsTr("Abort")
|
|
||||||
onClicked: {
|
|
||||||
wrapper.requestClosePopup()
|
|
||||||
}
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
right: btnUploadProjects.left
|
|
||||||
bottom: parent.bottom
|
|
||||||
margins: 10
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
id: btnUploadProjects
|
|
||||||
|
|
||||||
text: qsTr("Upload Selected Projects")
|
|
||||||
highlighted: true
|
|
||||||
enabled: false
|
|
||||||
onClicked: {
|
|
||||||
var uploadListArray = []
|
|
||||||
for (let childItem in gridView.contentItem.children) {
|
|
||||||
if (gridView.contentItem.children[childItem].isSelected)
|
|
||||||
uploadListArray.push(
|
|
||||||
gridView.contentItem.children[childItem].absoluteStoragePath)
|
|
||||||
}
|
|
||||||
view.currentIndex = 1
|
|
||||||
steam.bulkUploadToWorkshop(uploadListArray)
|
|
||||||
}
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
right: parent.right
|
|
||||||
bottom: parent.bottom
|
|
||||||
margins: 10
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: secondPage
|
|
||||||
|
|
||||||
ListView {
|
|
||||||
id: listView
|
|
||||||
|
|
||||||
boundsBehavior: Flickable.DragOverBounds
|
|
||||||
maximumFlickVelocity: 7000
|
|
||||||
flickDeceleration: 5000
|
|
||||||
cacheBuffer: 1000
|
|
||||||
clip: true
|
|
||||||
model: steam.uploadListModel
|
|
||||||
width: parent.width - 50
|
|
||||||
spacing: 25
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
top: parent.top
|
|
||||||
horizontalCenter: parent.horizontalCenter
|
|
||||||
bottom: parent.bottom
|
|
||||||
margins: 10
|
|
||||||
}
|
|
||||||
|
|
||||||
delegate: UploadProjectItem {
|
|
||||||
previewImagePath: m_absolutePreviewImagePath
|
|
||||||
progress: m_uploadProgress
|
|
||||||
name: m_name
|
|
||||||
steamStatus: m_status
|
|
||||||
}
|
|
||||||
|
|
||||||
ScrollBar.vertical: ScrollBar {
|
|
||||||
snapMode: ScrollBar.SnapOnRelease
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
id: btnFinish
|
|
||||||
|
|
||||||
text: qsTr("Finish")
|
|
||||||
highlighted: true
|
|
||||||
enabled: false
|
|
||||||
onClicked: {
|
|
||||||
root.close()
|
|
||||||
}
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
right: parent.right
|
|
||||||
bottom: parent.bottom
|
|
||||||
margins: 10
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
function onUploadCompleted() {
|
|
||||||
btnFinish.enabled = true
|
|
||||||
}
|
|
||||||
|
|
||||||
target: steam.uploadListModel
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PageIndicator {
|
Button {
|
||||||
id: indicator
|
id: btnUploadProjects
|
||||||
|
|
||||||
count: view.count
|
text: qsTr("Upload Selected Projects")
|
||||||
currentIndex: view.currentIndex
|
highlighted: true
|
||||||
anchors.bottom: view.bottom
|
enabled: false
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
onClicked: {
|
||||||
|
var uploadListArray = []
|
||||||
|
for (let childItem in gridView.contentItem.children) {
|
||||||
|
if (gridView.contentItem.children[childItem].isSelected)
|
||||||
|
uploadListArray.push(
|
||||||
|
gridView.contentItem.children[childItem].absoluteStoragePath)
|
||||||
|
}
|
||||||
|
view.currentIndex = 1
|
||||||
|
root.steamWorkshop.bulkUploadToWorkshop(uploadListArray)
|
||||||
|
}
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
right: parent.right
|
||||||
|
bottom: parent.bottom
|
||||||
|
margins: 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: secondPage
|
||||||
|
|
||||||
|
ListView {
|
||||||
|
id: listView
|
||||||
|
|
||||||
|
boundsBehavior: Flickable.DragOverBounds
|
||||||
|
maximumFlickVelocity: 7000
|
||||||
|
flickDeceleration: 5000
|
||||||
|
cacheBuffer: 1000
|
||||||
|
clip: true
|
||||||
|
model: root.steamWorkshop.uploadListModel
|
||||||
|
width: parent.width - 50
|
||||||
|
spacing: 25
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
top: parent.top
|
||||||
|
horizontalCenter: parent.horizontalCenter
|
||||||
|
bottom: parent.bottom
|
||||||
|
margins: 10
|
||||||
|
}
|
||||||
|
|
||||||
|
delegate: UploadProjectItem {
|
||||||
|
previewImagePath: m_absolutePreviewImagePath
|
||||||
|
progress: m_uploadProgress
|
||||||
|
name: m_name
|
||||||
|
steamStatus: m_status
|
||||||
|
}
|
||||||
|
|
||||||
|
ScrollBar.vertical: ScrollBar {
|
||||||
|
snapMode: ScrollBar.SnapOnRelease
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
id: btnFinish
|
||||||
|
|
||||||
|
text: qsTr("Finish")
|
||||||
|
highlighted: true
|
||||||
|
enabled: false
|
||||||
|
onClicked: {
|
||||||
|
root.requestBack()
|
||||||
|
}
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
right: parent.right
|
||||||
|
bottom: parent.bottom
|
||||||
|
margins: 10
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
function onUploadCompleted() {
|
||||||
|
btnFinish.enabled = true
|
||||||
|
}
|
||||||
|
|
||||||
|
target: root.steamWorkshop.uploadListModel
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
background: Rectangle {
|
PageIndicator {
|
||||||
color: Material.theme === Material.Light ? "white" : Material.background
|
id: indicator
|
||||||
|
|
||||||
|
count: view.count
|
||||||
|
currentIndex: view.currentIndex
|
||||||
|
anchors.bottom: view.bottom
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -63,9 +63,9 @@ Item {
|
|||||||
|
|
||||||
Image {
|
Image {
|
||||||
id: screenPlayItemImage
|
id: screenPlayItemImage
|
||||||
|
asynchronous: true
|
||||||
width: 400
|
width: 400
|
||||||
source: Qt.resolvedUrl(root.absoluteStoragePath + "/" + root.preview)
|
source: root.preview !== "" ? Qt.resolvedUrl(root.absoluteStoragePath + "/" + root.preview) : ""
|
||||||
|
|
||||||
anchors {
|
anchors {
|
||||||
top: parent.top
|
top: parent.top
|
||||||
|
@ -4,9 +4,9 @@ import Qt5Compat.GraphicalEffects
|
|||||||
import QtQuick.Controls.Material
|
import QtQuick.Controls.Material
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
import QtQuick.Controls.Material.impl
|
import QtQuick.Controls.Material.impl
|
||||||
|
import Workshop
|
||||||
|
|
||||||
Page {
|
Page {
|
||||||
// Everyting that is not OK is a fail. See steam_qt_enums_generated.h
|
|
||||||
|
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
@ -20,6 +20,7 @@ Page {
|
|||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
padding: 20
|
padding: 20
|
||||||
onPreviewImagePathChanged: img.source = Qt.resolvedUrl("file:///" + previewImagePath)
|
onPreviewImagePathChanged: img.source = Qt.resolvedUrl("file:///" + previewImagePath)
|
||||||
|
// Everyting that is not OK is a fail. See steam_qt_enums_generated.h
|
||||||
onSteamStatusChanged: {
|
onSteamStatusChanged: {
|
||||||
let errorText;
|
let errorText;
|
||||||
switch (steamStatus) {
|
switch (steamStatus) {
|
||||||
|
@ -559,7 +559,6 @@ bool ScreenPlayManager::loadProfiles()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
qInfo() << "Loading profiles " << activeProfilesTmp.size();
|
|
||||||
bool containsInvalidData = false;
|
bool containsInvalidData = false;
|
||||||
for (const QJsonValueRef wallpaper : activeProfilesTmp) {
|
for (const QJsonValueRef wallpaper : activeProfilesTmp) {
|
||||||
|
|
||||||
|
@ -102,6 +102,7 @@ Settings::Settings(const std::shared_ptr<GlobalVariables>& globalVariables,
|
|||||||
|
|
||||||
setupWidgetAndWindowPaths();
|
setupWidgetAndWindowPaths();
|
||||||
setGitBuildHash(COMPILE_INFO);
|
setGitBuildHash(COMPILE_INFO);
|
||||||
|
setSteamVersion(!(QString(SCREENPLAY_STEAM).compare("OFF", Qt::CaseInsensitive) ? false : true));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -194,7 +195,6 @@ void Settings::restoreDefault(const QString& appConfigLocation, const QString& s
|
|||||||
void Settings::initInstalledPath()
|
void Settings::initInstalledPath()
|
||||||
{
|
{
|
||||||
//If empty use steam workshop location
|
//If empty use steam workshop location
|
||||||
qInfo() << m_qSettings.value("ScreenPlayContentPath").toString();
|
|
||||||
if (QString(m_qSettings.value("ScreenPlayContentPath").toString()).isEmpty()) {
|
if (QString(m_qSettings.value("ScreenPlayContentPath").toString()).isEmpty()) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -246,22 +246,14 @@ void Settings::setupLanguage()
|
|||||||
{
|
{
|
||||||
QString langCode;
|
QString langCode;
|
||||||
if (m_qSettings.value("Language").isNull()) {
|
if (m_qSettings.value("Language").isNull()) {
|
||||||
auto localeList = QLocale::system().uiLanguages();
|
langCode = QLocale::system().name();
|
||||||
|
// QML enum begin with uppercase: de_DE -> De_DE
|
||||||
// Like En-us, De-de
|
langCode = langCode.replace(0, 1, langCode.at(0).toUpper());
|
||||||
QStringList localeSplits = localeList.at(0).split("-");
|
|
||||||
langCode = localeSplits.at(0);
|
|
||||||
|
|
||||||
// Ether De, En, Ru, Fr...
|
|
||||||
if (langCode.length() != 2) {
|
|
||||||
qWarning() << "Could not parse locale of value " << langCode;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
langCode = m_qSettings.value("Language").toString();
|
langCode = m_qSettings.value("Language").toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
setLanguage(QStringToEnum<Language>(langCode, Language::En));
|
setLanguage(QStringToEnum<Language>(langCode, Language::En_US));
|
||||||
retranslateUI();
|
retranslateUI();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -272,17 +264,16 @@ void Settings::setupLanguage()
|
|||||||
*/
|
*/
|
||||||
bool Settings::retranslateUI()
|
bool Settings::retranslateUI()
|
||||||
{
|
{
|
||||||
auto* app = static_cast<QApplication*>(QApplication::instance());
|
QString langCode = fixLanguageCode(QVariant::fromValue(language()).toString());
|
||||||
QString langCode = QVariant::fromValue(language()).toString();
|
|
||||||
langCode = langCode.toLower();
|
|
||||||
QFile tsFile;
|
|
||||||
|
|
||||||
|
QFile tsFile;
|
||||||
if (tsFile.exists(":/translations/ScreenPlay_" + langCode + ".qm")) {
|
if (tsFile.exists(":/translations/ScreenPlay_" + langCode + ".qm")) {
|
||||||
m_translator.load(":/translations/ScreenPlay_" + langCode + ".qm");
|
m_translator.load(":/translations/ScreenPlay_" + langCode + ".qm");
|
||||||
|
auto* app = static_cast<QApplication*>(QApplication::instance());
|
||||||
app->installTranslator(&m_translator);
|
app->installTranslator(&m_translator);
|
||||||
emit requestRetranslation();
|
emit requestRetranslation();
|
||||||
|
|
||||||
if (language() == Settings::Language::Ko) {
|
if (language() == Settings::Language::Ko_KR) {
|
||||||
setFont("Noto Sans CJK KR Regular");
|
setFont("Noto Sans CJK KR Regular");
|
||||||
} else {
|
} else {
|
||||||
setFont("Roboto");
|
setFont("Roboto");
|
||||||
@ -292,4 +283,19 @@ bool Settings::retranslateUI()
|
|||||||
qWarning() << tsFile.fileName() << ", cannot be loaded width langCode " << langCode;
|
qWarning() << tsFile.fileName() << ", cannot be loaded width langCode " << langCode;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief We must translate between qml langauge code and real ones.
|
||||||
|
*/
|
||||||
|
QString Settings::fixLanguageCode(const QString& languageCode)
|
||||||
|
{
|
||||||
|
QString langCode = languageCode;
|
||||||
|
// QML enums must begin with uppercase, but our code begin with lowercase
|
||||||
|
langCode = langCode.replace(0, 1, langCode.at(0).toLower());
|
||||||
|
// For US we use the default .ts file without langauge code
|
||||||
|
if (langCode == "en_US")
|
||||||
|
langCode = "";
|
||||||
|
return langCode;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -115,15 +115,17 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum class Language {
|
enum class Language {
|
||||||
En,
|
En_US,
|
||||||
De,
|
De_DE,
|
||||||
Ru,
|
Ru_RU,
|
||||||
Fr,
|
Fr_FR,
|
||||||
Es,
|
Es_ES,
|
||||||
Ko,
|
Ko_KR,
|
||||||
Vi,
|
Vi_VN,
|
||||||
Pt_BR,
|
Pt_BR,
|
||||||
Zh_CN,
|
Zh_CN,
|
||||||
|
Tr_TR,
|
||||||
|
Nl_NL,
|
||||||
};
|
};
|
||||||
Q_ENUM(Language)
|
Q_ENUM(Language)
|
||||||
|
|
||||||
@ -402,6 +404,7 @@ public slots:
|
|||||||
private:
|
private:
|
||||||
void restoreDefault(const QString& appConfigLocation, const QString& settingsFileType);
|
void restoreDefault(const QString& appConfigLocation, const QString& settingsFileType);
|
||||||
void initInstalledPath();
|
void initInstalledPath();
|
||||||
|
QString fixLanguageCode(const QString& languageCode);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QSettings m_qSettings;
|
QSettings m_qSettings;
|
||||||
@ -419,7 +422,7 @@ private:
|
|||||||
QString m_gitBuildHash;
|
QString m_gitBuildHash;
|
||||||
QString m_decoder;
|
QString m_decoder;
|
||||||
ScreenPlay::FillMode::FillMode m_videoFillMode { ScreenPlay::FillMode::FillMode::Cover };
|
ScreenPlay::FillMode::FillMode m_videoFillMode { ScreenPlay::FillMode::FillMode::Cover };
|
||||||
Language m_language { Language::En };
|
Language m_language { Language::En_US };
|
||||||
Theme m_theme { Theme::System };
|
Theme m_theme { Theme::System };
|
||||||
QString m_font { "Roboto" };
|
QString m_font { "Roboto" };
|
||||||
bool m_steamVersion { false };
|
bool m_steamVersion { false };
|
||||||
|
@ -72,6 +72,8 @@ T QStringToEnum(const QString& key, const T defaultValue)
|
|||||||
|
|
||||||
if (ok) {
|
if (ok) {
|
||||||
return wantedEnum;
|
return wantedEnum;
|
||||||
|
} else {
|
||||||
|
qWarning() << "Unable to convert QStringToEnum. Key: " << key;
|
||||||
}
|
}
|
||||||
|
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
ScreenPlay/translations/ScreenPlay_de_DE.qm
Normal file
BIN
ScreenPlay/translations/ScreenPlay_de_DE.qm
Normal file
Binary file not shown.
2244
ScreenPlay/translations/ScreenPlay_de_DE.ts
Normal file
2244
ScreenPlay/translations/ScreenPlay_de_DE.ts
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
ScreenPlay/translations/ScreenPlay_es_ES.qm
Normal file
BIN
ScreenPlay/translations/ScreenPlay_es_ES.qm
Normal file
Binary file not shown.
2245
ScreenPlay/translations/ScreenPlay_es_ES.ts
Normal file
2245
ScreenPlay/translations/ScreenPlay_es_ES.ts
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
ScreenPlay/translations/ScreenPlay_fr_FR.qm
Normal file
BIN
ScreenPlay/translations/ScreenPlay_fr_FR.qm
Normal file
Binary file not shown.
2245
ScreenPlay/translations/ScreenPlay_fr_FR.ts
Normal file
2245
ScreenPlay/translations/ScreenPlay_fr_FR.ts
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
ScreenPlay/translations/ScreenPlay_ko_KR.qm
Normal file
BIN
ScreenPlay/translations/ScreenPlay_ko_KR.qm
Normal file
Binary file not shown.
2245
ScreenPlay/translations/ScreenPlay_ko_KR.ts
Normal file
2245
ScreenPlay/translations/ScreenPlay_ko_KR.ts
Normal file
File diff suppressed because it is too large
Load Diff
BIN
ScreenPlay/translations/ScreenPlay_nl_NL.qm
Normal file
BIN
ScreenPlay/translations/ScreenPlay_nl_NL.qm
Normal file
Binary file not shown.
2245
ScreenPlay/translations/ScreenPlay_nl_NL.ts
Normal file
2245
ScreenPlay/translations/ScreenPlay_nl_NL.ts
Normal file
File diff suppressed because it is too large
Load Diff
BIN
ScreenPlay/translations/ScreenPlay_pt_BR.qm
Normal file
BIN
ScreenPlay/translations/ScreenPlay_pt_BR.qm
Normal file
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
ScreenPlay/translations/ScreenPlay_ru_RU.qm
Normal file
BIN
ScreenPlay/translations/ScreenPlay_ru_RU.qm
Normal file
Binary file not shown.
2245
ScreenPlay/translations/ScreenPlay_ru_RU.ts
Normal file
2245
ScreenPlay/translations/ScreenPlay_ru_RU.ts
Normal file
File diff suppressed because it is too large
Load Diff
BIN
ScreenPlay/translations/ScreenPlay_tr_TR.qm
Normal file
BIN
ScreenPlay/translations/ScreenPlay_tr_TR.qm
Normal file
Binary file not shown.
2245
ScreenPlay/translations/ScreenPlay_tr_TR.ts
Normal file
2245
ScreenPlay/translations/ScreenPlay_tr_TR.ts
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
ScreenPlay/translations/ScreenPlay_vi_VN.qm
Normal file
BIN
ScreenPlay/translations/ScreenPlay_vi_VN.qm
Normal file
Binary file not shown.
2245
ScreenPlay/translations/ScreenPlay_vi_VN.ts
Normal file
2245
ScreenPlay/translations/ScreenPlay_vi_VN.ts
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -237,5 +237,5 @@ void BaseWindow::setupLiveReloading()
|
|||||||
QObject::connect(&m_fileSystemWatcher, &QFileSystemWatcher::directoryChanged, this, timeoutLambda);
|
QObject::connect(&m_fileSystemWatcher, &QFileSystemWatcher::directoryChanged, this, timeoutLambda);
|
||||||
QObject::connect(&m_fileSystemWatcher, &QFileSystemWatcher::fileChanged, this, timeoutLambda);
|
QObject::connect(&m_fileSystemWatcher, &QFileSystemWatcher::fileChanged, this, timeoutLambda);
|
||||||
QObject::connect(&m_liveReloadLimiter, &QTimer::timeout, this, reloadQMLLambda);
|
QObject::connect(&m_liveReloadLimiter, &QTimer::timeout, this, reloadQMLLambda);
|
||||||
m_fileSystemWatcher.addPaths({ projectPath() });
|
m_fileSystemWatcher.addPaths({ QUrl::fromUserInput(projectPath()).toLocalFile() });
|
||||||
}
|
}
|
||||||
|
@ -86,7 +86,7 @@ if(APPLE)
|
|||||||
COMMENT "Copying steam library into ScreenPlay.app bundle"
|
COMMENT "Copying steam library into ScreenPlay.app bundle"
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy ${steam_bin} ${workshop_install_dir})
|
COMMAND ${CMAKE_COMMAND} -E copy ${steam_bin} ${workshop_install_dir})
|
||||||
|
|
||||||
if(NOT ${SCREENPLAY_STEAM_DEPLOY})
|
if(${SCREENPLAY_STEAM})
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
TARGET workshopplugin
|
TARGET workshopplugin
|
||||||
POST_BUILD
|
POST_BUILD
|
||||||
@ -96,7 +96,7 @@ if(APPLE)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
else()
|
else()
|
||||||
if(NOT ${SCREENPLAY_STEAM_DEPLOY})
|
if(${SCREENPLAY_STEAM})
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/steam_appid.txt ${CMAKE_BINARY_DIR}/bin/steam_appid.txt COPYONLY)
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/steam_appid.txt ${CMAKE_BINARY_DIR}/bin/steam_appid.txt COPYONLY)
|
||||||
endif()
|
endif()
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/qmldir ${WORKSHOP_PLUGIN_DIR}/qmldir COPYONLY)
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/qmldir ${WORKSHOP_PLUGIN_DIR}/qmldir COPYONLY)
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
void ScreenPlayWorkshopPlugin::registerTypes(const char* uri)
|
void ScreenPlayWorkshopPlugin::registerTypes(const char* uri)
|
||||||
{
|
{
|
||||||
qInfo() << "void ScreenPlayWorkshopPlugin::registerTypes(const char* uri)";
|
|
||||||
qRegisterMetaType<ScreenPlayWorkshop::SteamQMLImageProvider*>("SteamQMLImageProvider*");
|
qRegisterMetaType<ScreenPlayWorkshop::SteamQMLImageProvider*>("SteamQMLImageProvider*");
|
||||||
qmlRegisterType<ScreenPlayWorkshop::SteamQMLImageProvider>("Workshop", 1, 0, "SteamImage");
|
qmlRegisterType<ScreenPlayWorkshop::SteamQMLImageProvider>("Workshop", 1, 0, "SteamImage");
|
||||||
|
|
||||||
|
@ -228,8 +228,6 @@ void SteamWorkshop::onWorkshopSearched(SteamUGCQueryCompleted_t* pCallback, bool
|
|||||||
bool SteamWorkshop::queryWorkshopItemFromHandle(SteamWorkshopListModel* listModel, SteamUGCQueryCompleted_t* pCallback)
|
bool SteamWorkshop::queryWorkshopItemFromHandle(SteamWorkshopListModel* listModel, SteamUGCQueryCompleted_t* pCallback)
|
||||||
{
|
{
|
||||||
|
|
||||||
qDebug() << "queryWorkshopItemFromHandle " << pCallback->m_unNumResultsReturned << pCallback->m_unTotalMatchingResults;
|
|
||||||
|
|
||||||
SteamUGCDetails_t details;
|
SteamUGCDetails_t details;
|
||||||
const int urlLength = 200;
|
const int urlLength = 200;
|
||||||
char url[urlLength];
|
char url[urlLength];
|
||||||
|
@ -49,10 +49,16 @@ void SteamWorkshopItem::uploadItemToWorkshop(CreateItemResult_t* pCallback, bool
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString absoluteContentPath = m_absolutePath.toString();
|
const QString absoluteContentPath = ScreenPlayUtil::toLocal(m_absolutePath.toString());
|
||||||
|
|
||||||
auto jsonObjectOpt = ScreenPlayUtil::openJsonFileToObject(absoluteContentPath + "/project.json");
|
auto jsonObjectOpt = ScreenPlayUtil::openJsonFileToObject(absoluteContentPath + "/project.json");
|
||||||
|
|
||||||
|
if (!jsonObjectOpt.has_value()) {
|
||||||
|
qWarning() << "Unable to load project file";
|
||||||
|
emit removeThis(this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
auto jsonObject = jsonObjectOpt.value();
|
auto jsonObject = jsonObjectOpt.value();
|
||||||
QString preview = absoluteContentPath + "/" + jsonObject.value("preview").toString();
|
QString preview = absoluteContentPath + "/" + jsonObject.value("preview").toString();
|
||||||
setAbsolutePreviewImagePath(preview);
|
setAbsolutePreviewImagePath(preview);
|
||||||
|
@ -35,12 +35,14 @@ def run_io_tasks_in_parallel(tasks):
|
|||||||
parser = argparse.ArgumentParser(description='Build and Package ScreenPlay')
|
parser = argparse.ArgumentParser(description='Build and Package ScreenPlay')
|
||||||
parser.add_argument('-t', action="store", dest="build_type",
|
parser.add_argument('-t', action="store", dest="build_type",
|
||||||
help="Build type. This is either debug or release.")
|
help="Build type. This is either debug or release.")
|
||||||
parser.add_argument('-s', action="store", dest="sign_build",
|
parser.add_argument('-sign', action="store", dest="sign_build",
|
||||||
help="Enable if you want to sign the apps. This is macos only for now.")
|
help="Enable if you want to sign the apps. This is macos only for now.")
|
||||||
|
parser.add_argument('-steam', action="store", dest="steam_build",
|
||||||
|
help="Enable if you want to build the Steam workshop plugin.")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
if not args.build_type:
|
if not args.build_type:
|
||||||
print("Build type argument is missing (release,debug). Example: python build.py -t release -s=True")
|
print("Build type argument is missing (release,debug). Example: python build.py -t release -steam=True")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
qt_version = "6.2.0"
|
qt_version = "6.2.0"
|
||||||
@ -100,15 +102,15 @@ cmake_configure_command = """cmake ../
|
|||||||
-DCMAKE_TOOLCHAIN_FILE={toolchain}
|
-DCMAKE_TOOLCHAIN_FILE={toolchain}
|
||||||
-DVCPKG_TARGET_TRIPLET={triplet}
|
-DVCPKG_TARGET_TRIPLET={triplet}
|
||||||
-DTESTS_ENABLED=OFF
|
-DTESTS_ENABLED=OFF
|
||||||
-DSCREENPLAY_STEAM_DEPLOY=ON
|
-DSCREENPLAY_STEAM={steam}
|
||||||
-DSCREENPLAY_STEAM=ON
|
|
||||||
-G "CodeBlocks - Ninja"
|
-G "CodeBlocks - Ninja"
|
||||||
-B.
|
-B.
|
||||||
""".format(
|
""".format(
|
||||||
type=args.build_type,
|
type=args.build_type,
|
||||||
prefix_path=cmake_prefix_path,
|
prefix_path=cmake_prefix_path,
|
||||||
triplet=cmake_target_triplet,
|
triplet=cmake_target_triplet,
|
||||||
toolchain=cmake_toolchain_file).replace("\n", "")
|
toolchain=cmake_toolchain_file,
|
||||||
|
steam=args.steam_build).replace("\n", "")
|
||||||
|
|
||||||
execute(cmake_configure_command)
|
execute(cmake_configure_command)
|
||||||
execute("cmake --build . --target all")
|
execute("cmake --build . --target all")
|
||||||
|
3
crowdin.yml
Normal file
3
crowdin.yml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
files:
|
||||||
|
- source: /ScreenPlay/translations/ScreenPlay_.ts
|
||||||
|
translation: /ScreenPlay/translations/ScreenPlay_%locale_with_underscore%.ts
|
Loading…
Reference in New Issue
Block a user