1
0
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:
Elias Steurer 2021-09-26 17:56:40 +02:00
commit 6b653bdfdc
77 changed files with 19257 additions and 19299 deletions

View File

@ -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:

View File

@ -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}")

View File

@ -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>

View File

@ -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)

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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
} }

View File

@ -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"
} }

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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);

View File

@ -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"
}
} }
] ]
} }

View 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"
}
}

View File

@ -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

View File

@ -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)
} }
} }

View File

@ -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()
} }
} }
} }

View 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()
}
}
}

View File

@ -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
}
}
} }
} }

View File

@ -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

View File

@ -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
} }
} }

View File

@ -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

View File

@ -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) {

View File

@ -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) {

View File

@ -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;
}
} }

View File

@ -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 };

View File

@ -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

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

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

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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() });
} }

View File

@ -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)

View File

@ -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");

View File

@ -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];

View File

@ -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);

View File

@ -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
View File

@ -0,0 +1,3 @@
files:
- source: /ScreenPlay/translations/ScreenPlay_.ts
translation: /ScreenPlay/translations/ScreenPlay_%locale_with_underscore%.ts