mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 18:42:58 +02:00
UX/UI improvements
This commit is contained in:
parent
4b12c5c79c
commit
9f91238945
3 changed files with 555 additions and 296 deletions
|
@ -0,0 +1,352 @@
|
||||||
|
//
|
||||||
|
// ItemUnderTest
|
||||||
|
// qml/hifi/commerce/marketplaceItemTester
|
||||||
|
//
|
||||||
|
// Load items not in the marketplace for testing purposes
|
||||||
|
//
|
||||||
|
// Created by Kerry Ivan Kurian on 2018-10-18
|
||||||
|
// Copyright 2018 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
import QtQuick 2.10
|
||||||
|
import QtQuick.Controls 2.3
|
||||||
|
import Hifi 1.0 as Hifi
|
||||||
|
import "qrc:////qml//styles-uit" as HifiStylesUit
|
||||||
|
import "qrc:////qml//controls-uit" as HifiControlsUit
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: root;
|
||||||
|
color: hifi.colors.baseGray
|
||||||
|
width: parent.width - 16
|
||||||
|
height: childrenRect.height + itemHeaderContainer.anchors.topMargin + detailsContainer.anchors.topMargin
|
||||||
|
|
||||||
|
property var detailsExpanded: false
|
||||||
|
|
||||||
|
property var actions: {
|
||||||
|
"forward": function(resource, assetType, resourceObjectId){
|
||||||
|
switch(assetType) {
|
||||||
|
case "application":
|
||||||
|
Commerce.openApp(resource);
|
||||||
|
break;
|
||||||
|
case "avatar":
|
||||||
|
MyAvatar.useFullAvatarURL(resource);
|
||||||
|
break;
|
||||||
|
case "content set":
|
||||||
|
urlHandler.handleUrl("hifi://localhost/0,0,0");
|
||||||
|
Commerce.replaceContentSet(toUrl(resource), "");
|
||||||
|
break;
|
||||||
|
case "entity":
|
||||||
|
case "wearable":
|
||||||
|
rezEntity(resource, assetType, resourceObjectId);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
print("Marketplace item tester unsupported assetType " + assetType);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"trash": function(resource, assetType){
|
||||||
|
if ("application" === assetType) {
|
||||||
|
Commerce.uninstallApp(resource);
|
||||||
|
}
|
||||||
|
sendToScript({
|
||||||
|
method: "tester_deleteResourceObject",
|
||||||
|
objectId: resourceListModel.get(index).id});
|
||||||
|
resourceListModel.remove(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: itemHeaderContainer
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.topMargin: 8
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: 8
|
||||||
|
width: parent.width - 16
|
||||||
|
height: childrenRect.height
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: itemNameContainer
|
||||||
|
width: parent.width * 0.5
|
||||||
|
height: childrenRect.height
|
||||||
|
|
||||||
|
HifiStylesUit.RalewaySemiBold {
|
||||||
|
id: resourceName
|
||||||
|
height: paintedHeight
|
||||||
|
width: parent.width
|
||||||
|
text: {
|
||||||
|
var match = resource.match(/\/([^/]*)$/);
|
||||||
|
return match ? match[1] : resource;
|
||||||
|
}
|
||||||
|
size: 14
|
||||||
|
color: hifi.colors.white
|
||||||
|
wrapMode: Text.WrapAnywhere
|
||||||
|
}
|
||||||
|
|
||||||
|
HifiStylesUit.RalewayRegular {
|
||||||
|
id: resourceUrl
|
||||||
|
anchors.top: resourceName.bottom;
|
||||||
|
anchors.topMargin: 4;
|
||||||
|
height: paintedHeight
|
||||||
|
width: parent.width
|
||||||
|
text: resource
|
||||||
|
size: 12
|
||||||
|
color: hifi.colors.faintGray;
|
||||||
|
wrapMode: Text.WrapAnywhere
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HifiControlsUit.ComboBox {
|
||||||
|
id: comboBox
|
||||||
|
anchors.left: itemNameContainer.right
|
||||||
|
anchors.leftMargin: 4
|
||||||
|
anchors.verticalCenter: itemNameContainer.verticalCenter
|
||||||
|
height: 30
|
||||||
|
width: parent.width * 0.3 - anchors.leftMargin
|
||||||
|
|
||||||
|
model: [
|
||||||
|
"application",
|
||||||
|
"avatar",
|
||||||
|
"content set",
|
||||||
|
"entity",
|
||||||
|
"wearable",
|
||||||
|
"unknown"
|
||||||
|
]
|
||||||
|
|
||||||
|
currentIndex: (("entity or wearable" === assetType) ?
|
||||||
|
model.indexOf("unknown") : model.indexOf(assetType))
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
onCurrentIndexChanged.connect(function() {
|
||||||
|
assetType = model[currentIndex];
|
||||||
|
sendToScript({
|
||||||
|
method: "tester_updateResourceObjectAssetType",
|
||||||
|
objectId: resourceListModel.get(index)["resourceObjectId"],
|
||||||
|
assetType: assetType });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
id: actionButton
|
||||||
|
property var glyphs: {
|
||||||
|
"application": hifi.glyphs.install,
|
||||||
|
"avatar": hifi.glyphs.avatar,
|
||||||
|
"content set": hifi.glyphs.globe,
|
||||||
|
"entity": hifi.glyphs.wand,
|
||||||
|
"trash": hifi.glyphs.trash,
|
||||||
|
"unknown": hifi.glyphs.circleSlash,
|
||||||
|
"wearable": hifi.glyphs.hat,
|
||||||
|
}
|
||||||
|
property int color: hifi.buttons.blue;
|
||||||
|
property int colorScheme: hifi.colorSchemes.dark;
|
||||||
|
anchors.left: comboBox.right
|
||||||
|
anchors.leftMargin: 4
|
||||||
|
anchors.verticalCenter: itemNameContainer.verticalCenter
|
||||||
|
width: parent.width * 0.10 - anchors.leftMargin
|
||||||
|
height: width
|
||||||
|
enabled: comboBox.model[comboBox.currentIndex] !== "unknown"
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
root.actions["forward"](resource, comboBox.currentText, resourceObjectId);
|
||||||
|
}
|
||||||
|
|
||||||
|
background: Rectangle {
|
||||||
|
radius: 4;
|
||||||
|
gradient: Gradient {
|
||||||
|
GradientStop {
|
||||||
|
position: 0.2
|
||||||
|
color: {
|
||||||
|
if (!actionButton.enabled) {
|
||||||
|
hifi.buttons.disabledColorStart[actionButton.colorScheme]
|
||||||
|
} else if (actionButton.pressed) {
|
||||||
|
hifi.buttons.pressedColor[actionButton.color]
|
||||||
|
} else if (actionButton.hovered) {
|
||||||
|
hifi.buttons.hoveredColor[actionButton.color]
|
||||||
|
} else {
|
||||||
|
hifi.buttons.colorStart[actionButton.color]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GradientStop {
|
||||||
|
position: 1.0
|
||||||
|
color: {
|
||||||
|
if (!actionButton.enabled) {
|
||||||
|
hifi.buttons.disabledColorFinish[actionButton.colorScheme]
|
||||||
|
} else if (actionButton.pressed) {
|
||||||
|
hifi.buttons.pressedColor[actionButton.color]
|
||||||
|
} else if (actionButton.hovered) {
|
||||||
|
hifi.buttons.hoveredColor[actionButton.color]
|
||||||
|
} else {
|
||||||
|
hifi.buttons.colorFinish[actionButton.color]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
contentItem: Item {
|
||||||
|
HifiStylesUit.HiFiGlyphs {
|
||||||
|
id: rezIcon;
|
||||||
|
text: actionButton.glyphs[comboBox.model[comboBox.currentIndex]];
|
||||||
|
anchors.fill: parent
|
||||||
|
size: 30;
|
||||||
|
horizontalAlignment: Text.AlignHCenter;
|
||||||
|
verticalAlignment: Text.AlignVCenter;
|
||||||
|
color: enabled ? hifi.buttons.textColor[actionButton.color]
|
||||||
|
: hifi.buttons.disabledTextColor[actionButton.colorScheme]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
id: trashButton
|
||||||
|
property int color: hifi.buttons.red;
|
||||||
|
property int colorScheme: hifi.colorSchemes.dark;
|
||||||
|
anchors.left: actionButton.right
|
||||||
|
anchors.verticalCenter: itemNameContainer.verticalCenter
|
||||||
|
anchors.leftMargin: 4
|
||||||
|
width: parent.width * 0.10 - anchors.leftMargin
|
||||||
|
height: width
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
root.actions["trash"](resource, comboBox.currentText, resourceObjectId);
|
||||||
|
}
|
||||||
|
|
||||||
|
background: Rectangle {
|
||||||
|
radius: 4;
|
||||||
|
gradient: Gradient {
|
||||||
|
GradientStop {
|
||||||
|
position: 0.2
|
||||||
|
color: {
|
||||||
|
if (!trashButton.enabled) {
|
||||||
|
hifi.buttons.disabledColorStart[trashButton.colorScheme]
|
||||||
|
} else if (trashButton.pressed) {
|
||||||
|
hifi.buttons.pressedColor[trashButton.color]
|
||||||
|
} else if (trashButton.hovered) {
|
||||||
|
hifi.buttons.hoveredColor[trashButton.color]
|
||||||
|
} else {
|
||||||
|
hifi.buttons.colorStart[trashButton.color]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GradientStop {
|
||||||
|
position: 1.0
|
||||||
|
color: {
|
||||||
|
if (!trashButton.enabled) {
|
||||||
|
hifi.buttons.disabledColorFinish[trashButton.colorScheme]
|
||||||
|
} else if (trashButton.pressed) {
|
||||||
|
hifi.buttons.pressedColor[trashButton.color]
|
||||||
|
} else if (trashButton.hovered) {
|
||||||
|
hifi.buttons.hoveredColor[trashButton.color]
|
||||||
|
} else {
|
||||||
|
hifi.buttons.colorFinish[trashButton.color]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
contentItem: Item {
|
||||||
|
HifiStylesUit.HiFiGlyphs {
|
||||||
|
id: trashIcon;
|
||||||
|
text: hifi.glyphs.trash
|
||||||
|
anchors.fill: parent
|
||||||
|
size: 22;
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
color: enabled ? hifi.buttons.textColor[trashButton.color]
|
||||||
|
: hifi.buttons.disabledTextColor[trashButton.colorScheme]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: detailsContainer
|
||||||
|
|
||||||
|
width: parent.width - 16
|
||||||
|
height: root.detailsExpanded ? 300 : 26
|
||||||
|
anchors.top: itemHeaderContainer.bottom
|
||||||
|
anchors.topMargin: 12
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: 8
|
||||||
|
|
||||||
|
HifiStylesUit.HiFiGlyphs {
|
||||||
|
id: detailsToggle
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: -4
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.topMargin: -2
|
||||||
|
width: 22
|
||||||
|
text: root.detailsExpanded ? hifi.glyphs.minimize : hifi.glyphs.maximize
|
||||||
|
color: hifi.colors.white
|
||||||
|
size: 22
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
onClicked: root.detailsExpanded = !root.detailsExpanded
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ScrollView {
|
||||||
|
id: detailsTextContainer
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: detailsToggle.right
|
||||||
|
anchors.leftMargin: 4
|
||||||
|
anchors.right: parent.right
|
||||||
|
height: detailsContainer.height - (root.detailsExpanded ? (copyToClipboardButton.height + copyToClipboardButton.anchors.topMargin) : 0)
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
TextArea {
|
||||||
|
id: detailsText
|
||||||
|
readOnly: true
|
||||||
|
color: hifi.colors.white
|
||||||
|
text: {
|
||||||
|
if (root.detailsExpanded) {
|
||||||
|
return resourceAccessEventText
|
||||||
|
} else {
|
||||||
|
return (resourceAccessEventText.split("\n").length - 1).toString() + " resources loaded..."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
font: Qt.font({ family: "Courier", pointSize: 8, weight: Font.Normal })
|
||||||
|
wrapMode: TextEdit.NoWrap
|
||||||
|
|
||||||
|
background: Rectangle {
|
||||||
|
anchors.fill: parent;
|
||||||
|
color: hifi.colors.baseGrayShadow;
|
||||||
|
border.width: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
onClicked: {
|
||||||
|
if (root.detailsExpanded) {
|
||||||
|
detailsText.selectAll();
|
||||||
|
} else {
|
||||||
|
root.detailsExpanded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HifiControlsUit.Button {
|
||||||
|
id: copyToClipboardButton;
|
||||||
|
visible: root.detailsExpanded
|
||||||
|
color: hifi.buttons.noneBorderlessWhite
|
||||||
|
colorScheme: hifi.colorSchemes.dark
|
||||||
|
|
||||||
|
anchors.top: detailsTextContainer.bottom
|
||||||
|
anchors.topMargin: 8
|
||||||
|
anchors.right: parent.right
|
||||||
|
width: 150
|
||||||
|
height: 30
|
||||||
|
text: "Copy to Clipboard"
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
Window.copyToClipboard(detailsText.text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,14 +11,12 @@
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
//
|
//
|
||||||
|
|
||||||
import QtQuick 2.5
|
import QtQuick 2.10
|
||||||
import QtQuick.Controls 1.4
|
|
||||||
import QtQuick.Controls.Styles 1.4
|
|
||||||
import QtQuick.Dialogs 1.0
|
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
|
import QtQuick.Controls 2.3
|
||||||
import Hifi 1.0 as Hifi
|
import Hifi 1.0 as Hifi
|
||||||
import "../../../styles-uit" as HifiStylesUit
|
import "qrc:////qml//styles-uit" as HifiStylesUit
|
||||||
import "../../../controls-uit" as HifiControlsUit
|
import "qrc:////qml//controls-uit" as HifiControlsUit
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,20 +27,208 @@ Rectangle {
|
||||||
property string resourceAccessEventText
|
property string resourceAccessEventText
|
||||||
property var nextResourceObjectId: 0
|
property var nextResourceObjectId: 0
|
||||||
property var startDate
|
property var startDate
|
||||||
signal sendToScript(var message)
|
|
||||||
|
|
||||||
HifiStylesUit.HifiConstants { id: hifi }
|
HifiStylesUit.HifiConstants { id: hifi }
|
||||||
ListModel { id: resourceListModel }
|
ListModel { id: resourceListModel }
|
||||||
|
|
||||||
color: hifi.colors.white
|
color: hifi.colors.darkGray
|
||||||
|
|
||||||
AnimatedImage {
|
Component.onCompleted: startDate = new Date()
|
||||||
id: spinner;
|
|
||||||
source: "spinner.gif"
|
//
|
||||||
width: 74;
|
// TITLE BAR START
|
||||||
height: width;
|
//
|
||||||
anchors.verticalCenter: parent.verticalCenter;
|
Item {
|
||||||
anchors.horizontalCenter: parent.horizontalCenter;
|
id: titleBarContainer
|
||||||
|
// Size
|
||||||
|
width: root.width
|
||||||
|
height: 50
|
||||||
|
// Anchors
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.top: parent.top
|
||||||
|
|
||||||
|
// Title bar text
|
||||||
|
HifiStylesUit.RalewaySemiBold {
|
||||||
|
id: titleBarText
|
||||||
|
text: "Marketplace Item Tester"
|
||||||
|
// Text size
|
||||||
|
size: 24
|
||||||
|
// Anchors
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: 16
|
||||||
|
width: paintedWidth
|
||||||
|
// Style
|
||||||
|
color: hifi.colors.lightGrayText
|
||||||
|
// Alignment
|
||||||
|
horizontalAlignment: Text.AlignHLeft
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
// Separator
|
||||||
|
HifiControlsUit.Separator {
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.bottomMargin: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// TITLE BAR END
|
||||||
|
//
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: spinner
|
||||||
|
z: 999
|
||||||
|
anchors.top: titleBarContainer.bottom
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: buttonContainer.top
|
||||||
|
color: hifi.colors.darkGray
|
||||||
|
|
||||||
|
AnimatedImage {
|
||||||
|
source: "spinner.gif"
|
||||||
|
width: 74
|
||||||
|
height: width
|
||||||
|
anchors.centerIn: parent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: instructionsContainer
|
||||||
|
z: 998
|
||||||
|
color: hifi.colors.darkGray
|
||||||
|
visible: resourceListModel.count === 0 && !spinner.visible
|
||||||
|
anchors.top: titleBarContainer.bottom
|
||||||
|
anchors.topMargin: 20
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: 20
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.rightMargin: 20
|
||||||
|
anchors.bottom: buttonContainer.top
|
||||||
|
anchors.bottomMargin: 20
|
||||||
|
|
||||||
|
HifiStylesUit.RalewayRegular {
|
||||||
|
text: "Use Marketplace Item Tester to test out your items before submitting them to the Marketplace." +
|
||||||
|
"\n\nUse one of the buttons below to load your item."
|
||||||
|
// Text size
|
||||||
|
size: 20
|
||||||
|
// Anchors
|
||||||
|
anchors.fill: parent
|
||||||
|
// Style
|
||||||
|
color: hifi.colors.lightGrayText
|
||||||
|
wrapMode: Text.Wrap
|
||||||
|
// Alignment
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ListView {
|
||||||
|
id: itemList
|
||||||
|
visible: !instructionsContainer.visible
|
||||||
|
anchors.top: titleBarContainer.bottom
|
||||||
|
anchors.topMargin: 20
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: buttonContainer.top
|
||||||
|
anchors.bottomMargin: 20
|
||||||
|
ScrollBar.vertical: ScrollBar {
|
||||||
|
visible: !instructionsContainer.visible
|
||||||
|
policy: ScrollBar.AlwaysOn
|
||||||
|
parent: itemList.parent
|
||||||
|
anchors.top: itemList.top
|
||||||
|
anchors.right: itemList.right
|
||||||
|
anchors.bottom: itemList.bottom
|
||||||
|
width: 16
|
||||||
|
}
|
||||||
|
clip: true
|
||||||
|
model: resourceListModel
|
||||||
|
spacing: 8
|
||||||
|
|
||||||
|
delegate: ItemUnderTest {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: buttonContainer
|
||||||
|
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: 12
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.rightMargin: 12
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.bottomMargin: 12
|
||||||
|
height: 40
|
||||||
|
|
||||||
|
property string currentAction
|
||||||
|
property var actions: {
|
||||||
|
"Load File": function() {
|
||||||
|
buttonContainer.currentAction = "load file";
|
||||||
|
Window.browseChanged.connect(onResourceSelected);
|
||||||
|
Window.browseAsync("Please select a file (*.app.json *.json *.fst *.json.gz)", "", "Assets (*.app.json *.json *.fst *.json.gz)");
|
||||||
|
},
|
||||||
|
"Load URL": function() {
|
||||||
|
buttonContainer.currentAction = "load url";
|
||||||
|
Window.promptTextChanged.connect(onResourceSelected);
|
||||||
|
Window.promptAsync("Please enter a URL", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function onResourceSelected(resource) {
|
||||||
|
// It is possible that we received the present signal
|
||||||
|
// from something other than our browserAsync window.
|
||||||
|
// Alas, there is nothing we can do about that so charge
|
||||||
|
// ahead as though we are sure the present signal is one
|
||||||
|
// we expect.
|
||||||
|
print("!!!! resource selected");
|
||||||
|
switch(currentAction) {
|
||||||
|
case "load file":
|
||||||
|
Window.browseChanged.disconnect(onResourceSelected);
|
||||||
|
break
|
||||||
|
case "load url":
|
||||||
|
Window.promptTextChanged.disconnect(onResourceSelected);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (resource) {
|
||||||
|
print("!!!! building resource object");
|
||||||
|
var resourceObj = buildResourceObj(resource);
|
||||||
|
print("!!!! installing resource object");
|
||||||
|
installResourceObj(resourceObj);
|
||||||
|
print("!!!! notifying script of resource object");
|
||||||
|
sendToScript({
|
||||||
|
method: 'tester_newResourceObject',
|
||||||
|
resourceObject: resourceObj
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HifiControlsUit.Button {
|
||||||
|
enabled: !spinner.visible
|
||||||
|
anchors.right: parent.horizontalCenter
|
||||||
|
anchors.rightMargin: width/4
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
color: hifi.buttons.blue
|
||||||
|
fontSize: 20
|
||||||
|
text: "Load File"
|
||||||
|
width: parent.width / 3
|
||||||
|
height: parent.height
|
||||||
|
onClicked: buttonContainer.actions[text]()
|
||||||
|
}
|
||||||
|
|
||||||
|
HifiControlsUit.Button {
|
||||||
|
enabled: !spinner.visible
|
||||||
|
anchors.left: parent.horizontalCenter
|
||||||
|
anchors.leftMargin: width/4
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
color: hifi.buttons.blue
|
||||||
|
fontSize: 20
|
||||||
|
text: "Load URL"
|
||||||
|
width: parent.width / 3
|
||||||
|
height: parent.height
|
||||||
|
onClicked: buttonContainer.actions[text]()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function fromScript(message) {
|
function fromScript(message) {
|
||||||
|
@ -117,285 +303,6 @@ Rectangle {
|
||||||
itemType: entityType,
|
itemType: entityType,
|
||||||
itemId: resourceObjectId });
|
itemId: resourceObjectId });
|
||||||
}
|
}
|
||||||
|
|
||||||
Component.onCompleted: startDate = new Date()
|
signal sendToScript(var message)
|
||||||
|
|
||||||
ColumnLayout {
|
|
||||||
id: rootColumn
|
|
||||||
spacing: 30
|
|
||||||
|
|
||||||
HifiStylesUit.RalewayRegular {
|
|
||||||
id: rootHeader
|
|
||||||
text: "Marketplace Item Tester"
|
|
||||||
height: 40
|
|
||||||
width: paintedWidth
|
|
||||||
size: 22
|
|
||||||
color: hifi.colors.black
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.topMargin: 20
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.leftMargin: 12
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
height: root.height - 100
|
|
||||||
width: root.width
|
|
||||||
anchors.left: parent.left
|
|
||||||
|
|
||||||
ScrollView {
|
|
||||||
id: scrollView
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.rightMargin: 12
|
|
||||||
anchors.bottom: parent.top
|
|
||||||
anchors.bottomMargin: 20
|
|
||||||
anchors.leftMargin: 12
|
|
||||||
verticalScrollBarPolicy: Qt.ScrollBarAlwaysOn
|
|
||||||
|
|
||||||
frameVisible: false
|
|
||||||
|
|
||||||
contentItem: ListView {
|
|
||||||
spacing: 20
|
|
||||||
height: 200
|
|
||||||
model: resourceListModel
|
|
||||||
interactive: false
|
|
||||||
|
|
||||||
delegate: Column {
|
|
||||||
spacing: 8
|
|
||||||
|
|
||||||
RowLayout {
|
|
||||||
id: listRow
|
|
||||||
width: scrollView.width - 20
|
|
||||||
anchors.rightMargin: scrollView.rightMargin
|
|
||||||
spacing: 5
|
|
||||||
|
|
||||||
property var actions: {
|
|
||||||
"forward": function(resource, assetType, resourceObjectId){
|
|
||||||
switch(assetType) {
|
|
||||||
case "application":
|
|
||||||
Commerce.openApp(resource);
|
|
||||||
break;
|
|
||||||
case "avatar":
|
|
||||||
MyAvatar.useFullAvatarURL(resource);
|
|
||||||
break;
|
|
||||||
case "content set":
|
|
||||||
urlHandler.handleUrl("hifi://localhost/0,0,0");
|
|
||||||
Commerce.replaceContentSet(toUrl(resource), "");
|
|
||||||
break;
|
|
||||||
case "entity":
|
|
||||||
case "wearable":
|
|
||||||
rezEntity(resource, assetType, resourceObjectId);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
print("Marketplace item tester unsupported assetType " + assetType);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"trash": function(resource, assetType){
|
|
||||||
if ("application" === assetType) {
|
|
||||||
Commerce.uninstallApp(resource);
|
|
||||||
}
|
|
||||||
sendToScript({
|
|
||||||
method: "tester_deleteResourceObject",
|
|
||||||
objectId: resourceListModel.get(index).id});
|
|
||||||
resourceListModel.remove(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Column {
|
|
||||||
Layout.preferredWidth: scrollView.width * .6
|
|
||||||
spacing: 5
|
|
||||||
Text {
|
|
||||||
width: listRow.width * .6
|
|
||||||
text: {
|
|
||||||
var match = resource.match(/\/([^/]*)$/);
|
|
||||||
return match ? match[1] : resource;
|
|
||||||
}
|
|
||||||
font.pointSize: 12
|
|
||||||
horizontalAlignment: Text.AlignBottom
|
|
||||||
wrapMode: Text.WrapAnywhere
|
|
||||||
}
|
|
||||||
Text {
|
|
||||||
width: listRow.width * .6
|
|
||||||
text: resource
|
|
||||||
font.pointSize: 8
|
|
||||||
horizontalAlignment: Text.AlignBottom
|
|
||||||
wrapMode: Text.WrapAnywhere
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ComboBox {
|
|
||||||
id: comboBox
|
|
||||||
|
|
||||||
Layout.preferredWidth: listRow.width * .2
|
|
||||||
|
|
||||||
model: [
|
|
||||||
"application",
|
|
||||||
"avatar",
|
|
||||||
"content set",
|
|
||||||
"entity",
|
|
||||||
"wearable",
|
|
||||||
"unknown"
|
|
||||||
]
|
|
||||||
|
|
||||||
currentIndex: (("entity or wearable" === assetType) ?
|
|
||||||
model.indexOf("unknown") : model.indexOf(assetType))
|
|
||||||
|
|
||||||
Component.onCompleted: {
|
|
||||||
onCurrentIndexChanged.connect(function() {
|
|
||||||
assetType = model[currentIndex];
|
|
||||||
sendToScript({
|
|
||||||
method: "tester_updateResourceObjectAssetType",
|
|
||||||
objectId: resourceListModel.get(index)["resourceObjectId"],
|
|
||||||
assetType: assetType });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Repeater {
|
|
||||||
model: [ "forward", "trash" ]
|
|
||||||
|
|
||||||
HifiStylesUit.HiFiGlyphs {
|
|
||||||
property var glyphs: {
|
|
||||||
"application": hifi.glyphs.install,
|
|
||||||
"avatar": hifi.glyphs.avatar,
|
|
||||||
"content set": hifi.glyphs.globe,
|
|
||||||
"entity": hifi.glyphs.wand,
|
|
||||||
"trash": hifi.glyphs.trash,
|
|
||||||
"unknown": hifi.glyphs.circleSlash,
|
|
||||||
"wearable": hifi.glyphs.hat,
|
|
||||||
}
|
|
||||||
text: (("trash" === modelData) ?
|
|
||||||
glyphs.trash :
|
|
||||||
glyphs[comboBox.model[comboBox.currentIndex]])
|
|
||||||
size: ("trash" === modelData) ? 22 : 30
|
|
||||||
color: hifi.colors.black
|
|
||||||
horizontalAlignment: Text.AlignHCenter
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
onClicked: {
|
|
||||||
listRow.actions[modelData](resource, comboBox.currentText, resourceObjectId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: detailsContainer
|
|
||||||
|
|
||||||
width: scrollView.width - 20
|
|
||||||
height: resourceDetails.isOpen ? 300 : 20
|
|
||||||
anchors.left: parent.left
|
|
||||||
|
|
||||||
HifiStylesUit.HiFiGlyphs {
|
|
||||||
id: detailsToggle
|
|
||||||
anchors.top: parent.top
|
|
||||||
text: resourceDetails.isOpen ? hifi.glyphs.minimize : hifi.glyphs.maximize
|
|
||||||
color: hifi.colors.black
|
|
||||||
size: 22
|
|
||||||
verticalAlignment: Text.AlignBottom
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
onClicked: resourceDetails.isOpen = !resourceDetails.isOpen
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TextArea {
|
|
||||||
id: resourceDetails
|
|
||||||
|
|
||||||
property var isOpen: false
|
|
||||||
|
|
||||||
width: detailsContainer.width - 20
|
|
||||||
height: detailsContainer.height
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.left: detailsToggle.left
|
|
||||||
anchors.leftMargin: 20
|
|
||||||
verticalScrollBarPolicy: isOpen ? Qt.ScrollBarAsNeeded : Qt.ScrollBarAlwaysOff
|
|
||||||
frameVisible: isOpen
|
|
||||||
readOnly: true
|
|
||||||
|
|
||||||
text: {
|
|
||||||
if (isOpen) {
|
|
||||||
return resourceAccessEventText
|
|
||||||
} else {
|
|
||||||
return (resourceAccessEventText.split("\n").length - 1).toString() + " resources loaded..."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
font: Qt.font({ family: "Courier", pointSize: 8, weight: Font.Normal })
|
|
||||||
wrapMode: TextEdit.NoWrap
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
width: listRow.width
|
|
||||||
height: 1
|
|
||||||
color: hifi.colors.black
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Row {
|
|
||||||
id: rootActions
|
|
||||||
spacing: 20
|
|
||||||
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.leftMargin: root.width / 6 - 10
|
|
||||||
anchors.bottomMargin: 40
|
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
|
|
||||||
property string currentAction
|
|
||||||
property var actions: {
|
|
||||||
"Load File": function(){
|
|
||||||
rootActions.currentAction = "load file";
|
|
||||||
Window.browseChanged.connect(onResourceSelected);
|
|
||||||
Window.browseAsync("Please select a file (*.app.json *.json *.fst *.json.gz)", "", "Assets (*.app.json *.json *.fst *.json.gz)");
|
|
||||||
},
|
|
||||||
"Load URL": function(){
|
|
||||||
rootActions.currentAction = "load url";
|
|
||||||
Window.promptTextChanged.connect(onResourceSelected);
|
|
||||||
Window.promptAsync("Please enter a URL", "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function onResourceSelected(resource) {
|
|
||||||
// It is possible that we received the present signal
|
|
||||||
// from something other than our browserAsync window.
|
|
||||||
// Alas, there is nothing we can do about that so charge
|
|
||||||
// ahead as though we are sure the present signal is one
|
|
||||||
// we expect.
|
|
||||||
print("!!!! resource selected");
|
|
||||||
switch(currentAction) {
|
|
||||||
case "load file":
|
|
||||||
Window.browseChanged.disconnect(onResourceSelected);
|
|
||||||
break
|
|
||||||
case "load url":
|
|
||||||
Window.promptTextChanged.disconnect(onResourceSelected);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (resource) {
|
|
||||||
print("!!!! building resource object");
|
|
||||||
var resourceObj = buildResourceObj(resource);
|
|
||||||
print("!!!! installing resource object");
|
|
||||||
installResourceObj(resourceObj);
|
|
||||||
print("!!!! notifying script of resource object");
|
|
||||||
sendToScript({
|
|
||||||
method: 'tester_newResourceObject',
|
|
||||||
resourceObject: resourceObj });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Repeater {
|
|
||||||
model: [ "Load File", "Load URL" ]
|
|
||||||
HifiControlsUit.Button {
|
|
||||||
color: hifi.buttons.blue
|
|
||||||
fontSize: 20
|
|
||||||
text: modelData
|
|
||||||
width: root.width / 3
|
|
||||||
height: 40
|
|
||||||
onClicked: rootActions.actions[text]()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 58 KiB |
Loading…
Reference in a new issue