1
0
mirror of https://gitlab.com/kelteseth/ScreenPlay.git synced 2024-09-18 16:32:33 +02:00

Add new Workshop integration, remove debug messages and add new create style and functionality

This commit is contained in:
kelteseth 2017-10-14 10:42:07 +02:00
parent 0724ed7501
commit 5c0b73bfb1
12 changed files with 389 additions and 188 deletions

View File

@ -1,7 +1,6 @@
import QtQuick 2.7 import QtQuick 2.7
import QtQuick.Controls 2.2 import QtQuick.Controls 2.2
import QtQuick.Dialogs 1.2 import QtQuick.Dialogs 1.2
import Qt.labs.platform 1.0 import Qt.labs.platform 1.0
CustomPage { CustomPage {
@ -31,92 +30,13 @@ CustomPage {
source: "qrc:/assets/fonts/LibreBaskerville-Italic.ttf" source: "qrc:/assets/fonts/LibreBaskerville-Italic.ttf"
} }
Item { CreateLeftArea {
id: leftArea id: leftArea
width: parent.width * .5 width: parent.width * .5
anchors { anchors {
top: parent.top top: parent.top
bottom: parent.bottom
left: parent.left left: parent.left
} margins: 10
Column {
id: column
anchors.fill: parent
anchors.margins: 30
spacing: 30
TextField {
id: txtTitle
width: parent.width
height: 60
text: qsTr("")
placeholderText: "Title"
}
TextField {
id: txtDescription
width: parent.width
height: 60
text: qsTr("")
placeholderText: "Description"
}
TextField {
id: txtTags
width: parent.width
height: 60
text: qsTr("")
placeholderText: "Tags"
}
TextField {
id: txtYouTube
width: parent.width
height: 60
text: qsTr("")
placeholderText: "YouTube Preview"
}
Row {
id: rowVisible
width: parent.width
height: 50
Text {
id: txtVisibleDescription
height: parent.height
text: qsTr("Visible")
font.pixelSize: 12
verticalAlignment: Text.AlignVCenter
}
ComboBox {
id: cbVisibility
model: ["Public", "Friends only", "Private"]
}
spacing: 30
}
Button {
id: btnSubmit
text: qsTr("Create New Wallpaper")
onClicked: {
//TODO wait for callback
steamWorkshop.createWorkshopItem()
steamWorkshop.submitWorkshopItem(
txtTitle.text.toString(),
txtDescription.text.toString(), "english",
cbVisibility.currentIndex,
fileDialogOpenVideo.currentFile,
fileDialogOpenPreview.currentFile)
tiItemUpdate.start()
}
}
}
CheckDelegate {
id: checkDelegate
opacity: 0
text: qsTr("By submitting this item, you agree to the workshop terms of service")
onCheckedChanged: Qt.openUrlExternally(
"http://steamcommunity.com/sharedfiles/workshoplegalagreement")
} }
} }
@ -142,8 +62,8 @@ CustomPage {
height: parent.height height: parent.height
FileDropperSingleFile { FileDropperSingleFile {
anchors.fill: parent anchors.fill: parent
z:99 z: 99
descriptionTitle: "Set Video" descriptionTitle: "Drop your video here"
isVideo: true isVideo: true
imagePath: "qrc:/assets/icons/icon_tv.svg" imagePath: "qrc:/assets/icons/icon_tv.svg"
} }
@ -155,7 +75,7 @@ CustomPage {
FileDropperSingleFile { FileDropperSingleFile {
anchors.fill: parent anchors.fill: parent
z:99 z: 99
descriptionTitle: "Set Preview Image" descriptionTitle: "Set Preview Image"
imagePath: "qrc:/assets/icons/icon_single_image.svg" imagePath: "qrc:/assets/icons/icon_single_image.svg"
} }
@ -172,7 +92,7 @@ CustomPage {
} }
FileDropperSingleFile { FileDropperSingleFile {
anchors.fill: parent anchors.fill: parent
z:99 z: 99
descriptionTitle: "Add additional images" descriptionTitle: "Add additional images"
imagePath: "qrc:/assets/icons/icon_multiple_images.svg" imagePath: "qrc:/assets/icons/icon_multiple_images.svg"
} }
@ -181,7 +101,7 @@ CustomPage {
Timer { Timer {
id: tiItemUpdate id: tiItemUpdate
interval: 500 interval: 100
running: false running: false
repeat: true repeat: true
onTriggered: { onTriggered: {

View File

@ -0,0 +1,213 @@
import QtQuick 2.7
import QtQuick.Controls 2.2
import QtQuick.Dialogs 1.2
import Qt.labs.platform 1.0
Rectangle {
id: leftArea
radius: 3
height: column.childrenRect.height + (6 * 30)
state: "workshop"
property int steamWorkshopHeight
Row {
id: rowUseSteamWorkshop
height: 40
anchors {
top: parent.top
right: parent.right
left: parent.left
margins: 30
}
Switch {
id: switchUseSteamWorkshop
checked: true
onCheckedChanged: {
if (switchUseSteamWorkshop.checked) {
leftArea.state = "workshop"
} else {
leftArea.state = "local"
}
}
}
Text {
id: txtUseSteamWorkshop
text: qsTr("Upload Wallpaper to Steam Workshop")
anchors.bottom: parent.bottom
anchors.bottomMargin: 0
anchors.top: parent.top
anchors.topMargin: 0
verticalAlignment: Text.AlignVCenter
font.pointSize: 12
renderType: Text.NativeRendering
font.family: font_Roboto_Regular.name
}
}
Column {
id: column
anchors {
top: rowUseSteamWorkshop.bottom
right: parent.right
left: parent.left
margins: 30
}
spacing: 30
TextField {
id: txtTitle
width: parent.width
height: 60
text: qsTr("")
placeholderText: "Title"
}
Column {
spacing: 30
id: useSteamWorkshopFieldsWrapper
height: 300
anchors {
right: parent.right
left: parent.left
}
TextField {
id: txtDescription
width: parent.width
height: 60
text: qsTr("")
placeholderText: "Description"
}
TextField {
id: txtTags
width: parent.width
height: 60
text: qsTr("")
placeholderText: "Tags"
}
TextField {
id: txtYouTube
width: parent.width
height: 60
text: qsTr("")
placeholderText: "YouTube Preview"
}
Row {
id: rowVisible
width: parent.width
height: 50
Text {
id: txtVisibleDescription
height: parent.height
text: qsTr("Visible")
font.pixelSize: 12
verticalAlignment: Text.AlignVCenter
}
ComboBox {
id: cbVisibility
model: ["Public", "Friends only", "Private"]
}
spacing: 30
}
}
Button {
id: btnSubmit
text: qsTr("Create New Workshop Wallpaper")
onClicked: {
if (switchUseSteamWorkshop) {
//TODO wait for callback
steamWorkshop.createWorkshopItem()
steamWorkshop.submitWorkshopItem(
txtTitle.text.toString(),
txtDescription.text.toString(), "english",
cbVisibility.currentIndex,
fileDialogOpenVideo.currentFile,
fileDialogOpenPreview.currentFile)
tiItemUpdate.start()
} else {
steamWorkshop.createLocalWorkshopItem(
txtTitle.text.toString(),
fileDialogOpenVideo.currentFile,
fileDialogOpenPreview.currentFile)
}
}
}
CheckDelegate {
id: checkDelegate
opacity: 0
visible: false
text: qsTr("By submitting this item, you agree to the workshop terms of service")
onCheckedChanged: {
if (checkDelegate.visible) {
Qt.openUrlExternally(
"http://steamcommunity.com/sharedfiles/workshoplegalagreement")
}
}
}
}
states: [
State {
name: "local"
PropertyChanges {
target: useSteamWorkshopFieldsWrapper
visible: false
height: 0
}
PropertyChanges {
target: txtUseSteamWorkshop
color: "black"
}
PropertyChanges {
target: btnSubmit
text: qsTr("Create Local Wallpaper")
}
},
State {
name: "workshop"
PropertyChanges {
target: useSteamWorkshopFieldsWrapper
visible: true
height: 200
}
PropertyChanges {
target: txtUseSteamWorkshop
color: "orange"
}
PropertyChanges {
target: btnSubmit
text: qsTr("Upload Wallpaper to Steam Workshop")
}
}
]
transitions: [
Transition {
from: "local"
to: "workshop"
PropertyAnimation {
property: "height"
duration: 300
easing.type: Easing.InOutQuad
}
},
Transition {
from: "workshop"
to: "local"
PropertyAnimation {
property: "height"
duration: 200
easing.type: Easing.InOutQuad
}
}
]
}

View File

@ -0,0 +1,30 @@
import QtQuick 2.0
import QtAV 1.07
Rectangle {
id: createVideoPreviewSmall
property url source
Video {
id: previewVideo
anchors.fill: parent
z: 99
source: createVideoPreviewSmall.source
onSourceChanged: {
print(previewVideo.error + previewVideo.errorString + previewVideo.source)
//previewVideo.source = createVideoPreviewSmall.source;
previewVideo.play()
}
onPlaying: {
print("playing")
}
onErrorChanged: {
print(previewVideo.error + previewVideo.errorString)
}
//videoCodecPriority: ["CUDA", "D3D11", "DXVA", "VAAPI", "FFmpeg"]
}
}

View File

@ -1,6 +1,7 @@
import QtQuick 2.7 import QtQuick 2.9
import QtQuick.Dialogs 1.2 import QtQuick.Dialogs 1.2
Rectangle { Rectangle {
property color background: "white" property color background: "white"
@ -8,6 +9,7 @@ Rectangle {
property url imagePath: "qrc:/assets/icons/icon_plus.svg" property url imagePath: "qrc:/assets/icons/icon_plus.svg"
//FIXME in 5.10 with an enum //FIXME in 5.10 with an enum
property bool isVideo: false property bool isVideo: false
property url externalFilePath
id: fileDropperSingleFile id: fileDropperSingleFile
color: fileDropperSingleFile.background color: fileDropperSingleFile.background
@ -16,6 +18,24 @@ Rectangle {
radius: 4 radius: 4
state: "" state: ""
Component.onCompleted: {
if (isVideo) {
} else {
}
}
Image {
id: previewImage
anchors.fill: parent
z: 98
visible: false
}
FontLoader { FontLoader {
id: font_LibreBaskerville id: font_LibreBaskerville
source: "qrc:/assets/fonts/LibreBaskerville-Italic.ttf" source: "qrc:/assets/fonts/LibreBaskerville-Italic.ttf"
@ -23,10 +43,10 @@ Rectangle {
Item { Item {
id: column id: column
height:imageIcon.height + txtSplashInput.contentHeight height: imageIcon.height + txtSplashInput.contentHeight
anchors { anchors {
right:parent.right right: parent.right
left:parent.left left: parent.left
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
} }
@ -38,7 +58,7 @@ Rectangle {
sourceSize.width: 32 sourceSize.width: 32
source: fileDropperSingleFile.imagePath source: fileDropperSingleFile.imagePath
anchors { anchors {
top:parent.top top: parent.top
horizontalCenter: parent.horizontalCenter horizontalCenter: parent.horizontalCenter
} }
} }
@ -46,11 +66,11 @@ Rectangle {
id: txtSplashInput id: txtSplashInput
text: descriptionTitle text: descriptionTitle
anchors { anchors {
top:imageIcon.bottom top: imageIcon.bottom
topMargin: 10 topMargin: 10
horizontalCenter: parent.horizontalCenter horizontalCenter: parent.horizontalCenter
} }
height:40 height: 40
font.pointSize: 12 font.pointSize: 12
color: "#626262" color: "#626262"
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
@ -58,21 +78,54 @@ Rectangle {
font.italic: true font.italic: true
renderType: Text.NativeRendering renderType: Text.NativeRendering
} }
} }
DropArea { DropArea {
id: dropper
anchors.fill: parent anchors.fill: parent
onEntered: { onEntered: {
fileDropperSingleFile.state = "fileEntered" fileDropperSingleFile.state = "fileEntered"
} }
onDropped: { onDropped: {
fileDropperSingleFile.state = "fileDropped" fileDropperSingleFile.state = "fileDropped"
if (drop.hasUrls) {
if (isVideo) {
if (validateVideoFileExtension(drop.urls[0])) {
videoPreviewLoader.setSource("CreateVideoPreviewSmall.qml",{"source":drop.urls[0]})
}
} else {
if (validateImageFileExtension(drop.urls[0])) {
previewImage.source = drop.urls[0]
previewImage.visible = true
}
}
}
} }
onExited: { onExited: {
fileDropperSingleFile.state = "empty" fileDropperSingleFile.state = "empty"
} }
function validateImageFileExtension(filePath) {
var tmp = filePath.split('.').pop()
return tmp === "png" || tmp === "jpg"
}
function validateVideoFileExtension(filePath) {
var tmp = filePath.split('.').pop()
return tmp === "vp9" || tmp === "mp4"
}
}
Loader {
id:videoPreviewLoader
asynchronous: true
anchors.fill: parent
z: 97
onLoaded: {
//videoPreviewLoader.item.playVideo(drop.urls[0]);
}
} }
/* FIXME: For now only drag n drop Workshop /* FIXME: For now only drag n drop Workshop
@ -99,7 +152,6 @@ Rectangle {
} }
}*/ }*/
states: [ states: [
State { State {
name: "fileEntered" name: "fileEntered"
@ -116,7 +168,6 @@ Rectangle {
target: fileDropperSingleFile target: fileDropperSingleFile
color: "#ffbf49" color: "#ffbf49"
} }
}, },
State { State {
name: "empty" name: "empty"

View File

@ -9,91 +9,80 @@ CustomPage {
steamWorkshop.searchWorkshop() steamWorkshop.searchWorkshop()
} }
Connections{ Flickable {
target: steamWorkshop anchors.fill: parent
onWorkshopSearched:{ flickableDirection: Flickable.VerticalFlick
busyIndicator.running = false
txtBusyIndicator.visible = false
bannerTxt.text = workshopListModel.getBannerText()
bannerImg.source = workshopListModel.getBannerUrl();
}
}
BusyIndicator {
id: busyIndicator
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
running: true
Material.accent: Material.Orange
}
Text {
id: txtBusyIndicator
text: qsTr("Searching for workshop content. Please stand by")
anchors.top: busyIndicator.bottom
anchors.topMargin: 30
anchors.horizontalCenter: parent.horizontalCenter
}
Rectangle {
id: banner
color: "#131313"
height: 250
anchors {
top: parent.top
right: parent.right
left:parent.left
}
Image {
id: bannerImg
anchors.fill: parent
fillMode: Image.PreserveAspectCrop
}
Text {
id: bannerTxt
text: "loading"
font.pixelSize: 36
color: "white"
}
}
Item {
id: searchBar
height:70
anchors {
top: banner.bottom
right: parent.right
left:parent.left
}
}
Item {
anchors {
top: searchBar.bottom
right: parent.right
bottom: parent.bottom
left:parent.left
}
GridView { GridView {
id: gridView id: gridView
boundsBehavior: Flickable.DragOverBounds
cacheBuffer: 1000 cacheBuffer: 1000
maximumFlickVelocity: 10000 maximumFlickVelocity: 5000
anchors.fill: parent anchors.fill: parent
cellWidth: 330 cellWidth: 330
cellHeight: 200 cellHeight: 200
anchors.margins: 30
model: workshopListModel
delegate: Rectangle { boundsBehavior: Flickable.StopAtBounds
//boundsBehavior: Flickable.OvershootBounds
header: Item {
height: 500
anchors {
right: parent.right
left: parent.left
}
Connections {
target: steamWorkshop
onWorkshopSearched: {
bannerTxt.text = workshopListModel.getBannerText()
bannerImg.source = workshopListModel.getBannerUrl()
}
}
Rectangle {
id: banner
color: "#131313"
height: 350
anchors {
top: parent.top
right: parent.right
left: parent.left
}
Image {
id: bannerImg
anchors.fill: parent
asynchronous: true
fillMode: Image.PreserveAspectCrop
}
Text {
id: bannerTxt
text: "loading"
font.pixelSize: 36
color: "white"
}
}
Item {
id: searchBar
height: 70
anchors {
top: banner.bottom
right: parent.right
left: parent.left
}
}
}
model: workshopListModel
delegate: Rectangle {
color: "steelblue" color: "steelblue"
id:delegate id: delegate
width: 180 width: 180
height:100 height: 100
focus: true focus: true
Image { Image {
id: img id: img
anchors.fill: parent anchors.fill: parent
@ -106,18 +95,18 @@ CustomPage {
id: namea id: namea
anchors.fill: parent anchors.fill: parent
text: workshopTitle text: workshopTitle
color:"white" color: "white"
} }
} }
add: Transition { add: Transition {
NumberAnimation { property: "opacity"; from: 0; to: 1.0; duration: 400 } NumberAnimation {
property: "opacity"
from: 0
to: 1.0
duration: 400
}
} }
} }
} }
} }

View File

@ -13,7 +13,6 @@ ApplicationWindow {
minimumHeight: 768 minimumHeight: 768
minimumWidth: 1050 minimumWidth: 1050
Component.onCompleted: { Component.onCompleted: {
setX(Screen.width / 2 - width / 2); setX(Screen.width / 2 - width / 2);
setY(Screen.height / 2 - height / 2); setY(Screen.height / 2 - height / 2);

View File

@ -11,5 +11,5 @@ Theme=Light
[Material] [Material]
Theme=Light Theme=Light
;Accent=BlueGrey Accent=Orange
;Primary=BlueGray Primary=Orange

View File

@ -75,7 +75,6 @@ void InstalledListModel::loadScreens()
for (auto&& item : list) { for (auto&& item : list) {
tmpPath = m_absoluteStoragePath.toString() +"/" +item.baseName() + "/project.json"; tmpPath = m_absoluteStoragePath.toString() +"/" +item.baseName() + "/project.json";
qDebug() << tmpPath;
if (!QFile(tmpPath).exists()) if (!QFile(tmpPath).exists())
continue; continue;

View File

@ -20,8 +20,6 @@ QHash<int, QByteArray> MonitorListModel::roleNames() const
QRect MonitorListModel::getAbsoluteDesktopSize() QRect MonitorListModel::getAbsoluteDesktopSize()
{ {
// qDebug() << _monitorList.at(0)._availableVirtualGeometry;
// qDebug() << _monitorList.at(0)._availableGeometry;
return _monitorList.at(0)._availableVirtualGeometry; return _monitorList.at(0)._availableVirtualGeometry;
} }
@ -145,7 +143,6 @@ Monitor::Monitor(QString manufacturer, QString model, QString name, QSize size,
_availableGeometry = availableGeometry; _availableGeometry = availableGeometry;
_availableVirtualGeometry = availableVirtualGeometry; _availableVirtualGeometry = availableVirtualGeometry;
//qDebug() << _availableGeometry << " " << availableVirtualGeometry;
_number = number; _number = number;
// FIXME: Use a better way to create an id // FIXME: Use a better way to create an id
// because name and manufacturer are allways empty // because name and manufacturer are allways empty

View File

@ -10,6 +10,7 @@ public:
Profile(); Profile();
Profile(QUrl absolutePath, QString id, QString version, QString wallpaperId, QRect rect, bool isLooping); Profile(QUrl absolutePath, QString id, QString version, QString wallpaperId, QRect rect, bool isLooping);
QUrl m_absolutePath; QUrl m_absolutePath;
QString m_id; QString m_id;
QString m_version = ""; QString m_version = "";

View File

@ -67,8 +67,6 @@ Settings::Settings(ProfileListModel* plm, MonitorListModel* mlm, InstalledListMo
steamTmpUrl.cd("content"); steamTmpUrl.cd("content");
steamTmpUrl.cd("672870"); steamTmpUrl.cd("672870");
qDebug() << steamTmpUrl.path();
m_absoluteStoragePath = steamTmpUrl.path(); m_absoluteStoragePath = steamTmpUrl.path();
} else { } else {
m_absoluteStoragePath = configObj.value("absoluteStoragePath").toString(); m_absoluteStoragePath = configObj.value("absoluteStoragePath").toString();

View File

@ -24,7 +24,6 @@ void SteamWorkshop::submitWorkshopItem(QString title, QString description, QStri
QString video = QString(tmpVideoPath).remove(0, 8); QString video = QString(tmpVideoPath).remove(0, 8);
QString thumb = QString(absolutePreviewPath.toString()).remove(0, 8); QString thumb = QString(absolutePreviewPath.toString()).remove(0, 8);
qDebug() << video << thumb;
SteamUGC()->SetItemTitle(m_UGCUpdateHandle, QByteArray(title.toLatin1()).data()); SteamUGC()->SetItemTitle(m_UGCUpdateHandle, QByteArray(title.toLatin1()).data());
SteamUGC()->SetItemDescription(m_UGCUpdateHandle, QByteArray(description.toLatin1()).data()); SteamUGC()->SetItemDescription(m_UGCUpdateHandle, QByteArray(description.toLatin1()).data());
SteamUGC()->SetItemUpdateLanguage(m_UGCUpdateHandle, QByteArray(language.toLatin1()).data()); SteamUGC()->SetItemUpdateLanguage(m_UGCUpdateHandle, QByteArray(language.toLatin1()).data());
@ -49,6 +48,11 @@ void SteamWorkshop::getAPICallInfo()
qDebug() << SteamUtils()->GetAPICallFailureReason(m_searchCall); qDebug() << SteamUtils()->GetAPICallFailureReason(m_searchCall);
} }
void SteamWorkshop::createLocalWorkshopItem(QString title, QUrl videoPath, QUrl previewPath)
{
}
void SteamWorkshop::onWorkshopItemCreated(CreateItemResult_t* pCallback, bool bIOFailure) void SteamWorkshop::onWorkshopItemCreated(CreateItemResult_t* pCallback, bool bIOFailure)
{ {
if (bIOFailure) if (bIOFailure)
@ -65,7 +69,7 @@ void SteamWorkshop::searchWorkshop()
m_AppId, m_AppId,
m_AppId, m_AppId,
1); 1);
SteamUGC()->SetAllowCachedResponse(m_UGCSearchHandle, 3000);
//Important: First send the request to get the Steam API Call //Important: First send the request to get the Steam API Call
// then set the handler // then set the handler
m_searchCall = SteamUGC()->SendQueryUGCRequest(m_UGCSearchHandle); m_searchCall = SteamUGC()->SendQueryUGCRequest(m_UGCSearchHandle);