mirror of
https://thingvellir.net/git/overte
synced 2025-03-27 23:52:03 +01: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
|
||||
//
|
||||
|
||||
import QtQuick 2.5
|
||||
import QtQuick.Controls 1.4
|
||||
import QtQuick.Controls.Styles 1.4
|
||||
import QtQuick.Dialogs 1.0
|
||||
import QtQuick 2.10
|
||||
import QtQuick.Layouts 1.1
|
||||
import QtQuick.Controls 2.3
|
||||
import Hifi 1.0 as Hifi
|
||||
import "../../../styles-uit" as HifiStylesUit
|
||||
import "../../../controls-uit" as HifiControlsUit
|
||||
import "qrc:////qml//styles-uit" as HifiStylesUit
|
||||
import "qrc:////qml//controls-uit" as HifiControlsUit
|
||||
|
||||
|
||||
|
||||
|
@ -29,20 +27,208 @@ Rectangle {
|
|||
property string resourceAccessEventText
|
||||
property var nextResourceObjectId: 0
|
||||
property var startDate
|
||||
signal sendToScript(var message)
|
||||
|
||||
HifiStylesUit.HifiConstants { id: hifi }
|
||||
ListModel { id: resourceListModel }
|
||||
|
||||
color: hifi.colors.white
|
||||
color: hifi.colors.darkGray
|
||||
|
||||
AnimatedImage {
|
||||
id: spinner;
|
||||
source: "spinner.gif"
|
||||
width: 74;
|
||||
height: width;
|
||||
anchors.verticalCenter: parent.verticalCenter;
|
||||
anchors.horizontalCenter: parent.horizontalCenter;
|
||||
Component.onCompleted: startDate = new Date()
|
||||
|
||||
//
|
||||
// TITLE BAR START
|
||||
//
|
||||
Item {
|
||||
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) {
|
||||
|
@ -117,285 +303,6 @@ Rectangle {
|
|||
itemType: entityType,
|
||||
itemId: resourceObjectId });
|
||||
}
|
||||
|
||||
Component.onCompleted: startDate = new Date()
|
||||
|
||||
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]()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
signal sendToScript(var message)
|
||||
}
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 58 KiB |
Loading…
Reference in a new issue