Merge branch 'master' of http://github.com/highfidelity/hifi into fade

This commit is contained in:
Olivier Prat 2018-03-29 07:21:01 -04:00
commit 3c8cd48dfb
20 changed files with 393 additions and 373 deletions

View file

@ -312,7 +312,7 @@ if (APPLE)
COMPONENT ${CLIENT_COMPONENT} COMPONENT ${CLIENT_COMPONENT}
) )
set(RESOURCES_INSTALL_DIR "${INTERFACE_INSTALL_APP_PATH}/Contents/Resources") set(SCRIPTS_INSTALL_DIR "${INTERFACE_INSTALL_APP_PATH}/Contents/Resources")
set(RESOURCES_DEV_DIR "$<TARGET_FILE_DIR:${TARGET_NAME}>/../Resources") set(RESOURCES_DEV_DIR "$<TARGET_FILE_DIR:${TARGET_NAME}>/../Resources")
# copy script files beside the executable # copy script files beside the executable
@ -326,13 +326,14 @@ if (APPLE)
fixup_interface() fixup_interface()
else() else()
set(RESOURCES_DEV_DIR "$<TARGET_FILE_DIR:${TARGET_NAME}>/resources") set(INTERFACE_EXEC_DIR "$<TARGET_FILE_DIR:${TARGET_NAME}>")
set(RESOURCES_DEV_DIR "${INTERFACE_EXEC_DIR}/resources")
# copy the resources files beside the executable # copy the resources files beside the executable
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy_if_different COMMAND "${CMAKE_COMMAND}" -E copy_if_different
"${RESOURCES_RCC}" "${RESOURCES_RCC}"
"$<TARGET_FILE_DIR:interface>" "${INTERFACE_EXEC_DIR}"
# FIXME, the edit script code loads HTML from the scripts folder # FIXME, the edit script code loads HTML from the scripts folder
# which in turn relies on CSS that refers to the fonts. In theory # which in turn relies on CSS that refers to the fonts. In theory
# we should be able to modify the CSS to reference the QRC path to # we should be able to modify the CSS to reference the QRC path to
@ -340,13 +341,13 @@ else()
# so we have to retain a copy of the fonts outside of the resources binary # so we have to retain a copy of the fonts outside of the resources binary
COMMAND "${CMAKE_COMMAND}" -E copy_directory COMMAND "${CMAKE_COMMAND}" -E copy_directory
"${PROJECT_SOURCE_DIR}/resources/fonts" "${PROJECT_SOURCE_DIR}/resources/fonts"
"$<TARGET_FILE_DIR:${TARGET_NAME}>/resources/fonts" "${RESOURCES_DEV_DIR}/fonts"
COMMAND "${CMAKE_COMMAND}" -E copy_directory COMMAND "${CMAKE_COMMAND}" -E copy_directory
"${CMAKE_SOURCE_DIR}/scripts" "${CMAKE_SOURCE_DIR}/scripts"
"${RESOURCES_DEV_DIR}/scripts" "${INTERFACE_EXEC_DIR}/scripts"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different COMMAND "${CMAKE_COMMAND}" -E copy_if_different
"${PROJECT_SOURCE_DIR}/resources/serverless/tutorial.json" "${PROJECT_SOURCE_DIR}/resources/serverless/tutorial.json"
"$<TARGET_FILE_DIR:${TARGET_NAME}>/resources/serverless/tutorial.json" "${RESOURCES_DEV_DIR}/serverless/tutorial.json"
) )
# link target to external libraries # link target to external libraries
@ -363,7 +364,7 @@ else()
PATTERN "*.exp" EXCLUDE PATTERN "*.exp" EXCLUDE
) )
set(RESOURCES_INSTALL_DIR "${INTERFACE_INSTALL_DIR}") set(SCRIPTS_INSTALL_DIR "${INTERFACE_INSTALL_DIR}")
set(EXECUTABLE_COMPONENT ${CLIENT_COMPONENT}) set(EXECUTABLE_COMPONENT ${CLIENT_COMPONENT})
@ -371,11 +372,11 @@ else()
endif() endif()
endif() endif()
if (RESOURCES_INSTALL_DIR) if (SCRIPTS_INSTALL_DIR)
# setup install of scripts beside interface executable # setup install of scripts beside interface executable
install( install(
DIRECTORY "${CMAKE_SOURCE_DIR}/scripts/" DIRECTORY "${CMAKE_SOURCE_DIR}/scripts/"
DESTINATION ${RESOURCES_INSTALL_DIR}/scripts DESTINATION ${SCRIPTS_INSTALL_DIR}/scripts
COMPONENT ${CLIENT_COMPONENT} COMPONENT ${CLIENT_COMPONENT}
) )
endif() endif()

View file

@ -67,6 +67,10 @@ Item {
fill: parent fill: parent
} }
MouseArea {
anchors.fill: parent
}
QmlHifi.WindowHeader { QmlHifi.WindowHeader {
id: header id: header
iconSource: "../../../icons/goto-i.svg" iconSource: "../../../icons/goto-i.svg"

View file

@ -270,7 +270,9 @@ ModalWindow {
onTriggered: { onTriggered: {
root.result = null; root.result = null;
root.canceled(); root.canceled();
root.destroy(); // FIXME we are leaking memory to avoid a crash
// root.destroy();
visible = false;
} }
} }
@ -292,7 +294,9 @@ ModalWindow {
} }
root.result = JSON.stringify(result); root.result = JSON.stringify(result);
root.selected(root.result); root.selected(root.result);
root.destroy(); // FIXME we are leaking memory to avoid a crash
// root.destroy();
visible = false;
} }
} }
} }

View file

@ -169,7 +169,9 @@ ModalWindow {
shortcut: Qt.Key_Escape shortcut: Qt.Key_Escape
onTriggered: { onTriggered: {
root.canceled(); root.canceled();
root.destroy(); // FIXME we are leaking memory to avoid a crash
// root.destroy();
visible = false;
} }
} }
Action { Action {
@ -179,7 +181,9 @@ ModalWindow {
onTriggered: { onTriggered: {
root.result = items ? comboBox.currentText : textResult.text root.result = items ? comboBox.currentText : textResult.text
root.selected(root.result); root.selected(root.result);
root.destroy(); // FIXME we are leaking memory to avoid a crash
// root.destroy();
visible = false;
} }
} }
} }

View file

@ -58,6 +58,10 @@ Item {
width: parent ? parent.width : 0 width: parent ? parent.width : 0
height: parent ? parent.height : 0 height: parent ? parent.height : 0
MouseArea {
anchors.fill: parent
}
gradient: Gradient { gradient: Gradient {
GradientStop { position: 0.0; color: android.color.gradientTop } GradientStop { position: 0.0; color: android.color.gradientTop }
GradientStop { position: 1.0; color: android.color.gradientBottom } GradientStop { position: 1.0; color: android.color.gradientBottom }

View file

@ -118,7 +118,7 @@ Item {
tabletRoot.playButtonClickSound(); tabletRoot.playButtonClickSound();
}*/ }*/
} }
onEntered: { onPressed: {
button.isEntered = true; button.isEntered = true;
button.entered(); button.entered();
if (button.isActive) { if (button.isActive) {
@ -127,7 +127,7 @@ Item {
button.state = "hover state"; button.state = "hover state";
} }
} }
onExited: { onReleased: {
button.isEntered = false; button.isEntered = false;
button.exited() button.exited()
if (button.isActive) { if (button.isActive) {

View file

@ -58,7 +58,7 @@ Windows.ScrollingWindow {
Component.onDestruction: { Component.onDestruction: {
assetMappingsModel.autoRefreshEnabled = false; assetMappingsModel.autoRefreshEnabled = false;
} }
function letterbox(headerGlyph, headerText, message) { function letterbox(headerGlyph, headerText, message) {
letterboxMessage.headerGlyph = headerGlyph; letterboxMessage.headerGlyph = headerGlyph;
letterboxMessage.headerText = headerText; letterboxMessage.headerText = headerText;
@ -145,7 +145,7 @@ Windows.ScrollingWindow {
function canAddToWorld(path) { function canAddToWorld(path) {
var supportedExtensions = [/\.fbx\b/i, /\.obj\b/i, /\.jpg\b/i, /\.png\b/i]; var supportedExtensions = [/\.fbx\b/i, /\.obj\b/i, /\.jpg\b/i, /\.png\b/i];
if (selectedItemCount > 1) { if (selectedItemCount > 1) {
return false; return false;
} }
@ -154,8 +154,8 @@ Windows.ScrollingWindow {
return total | new RegExp(current).test(path); return total | new RegExp(current).test(path);
}, false); }, false);
} }
function canRename() { function canRename() {
if (treeView.selection.hasSelection && selectedItemCount == 1) { if (treeView.selection.hasSelection && selectedItemCount == 1) {
return true; return true;
} else { } else {
@ -199,7 +199,7 @@ Windows.ScrollingWindow {
var SHAPE_TYPE_STATIC_MESH = 3; var SHAPE_TYPE_STATIC_MESH = 3;
var SHAPE_TYPE_BOX = 4; var SHAPE_TYPE_BOX = 4;
var SHAPE_TYPE_SPHERE = 5; var SHAPE_TYPE_SPHERE = 5;
var SHAPE_TYPES = []; var SHAPE_TYPES = [];
SHAPE_TYPES[SHAPE_TYPE_NONE] = "No Collision"; SHAPE_TYPES[SHAPE_TYPE_NONE] = "No Collision";
SHAPE_TYPES[SHAPE_TYPE_SIMPLE_HULL] = "Basic - Whole model"; SHAPE_TYPES[SHAPE_TYPE_SIMPLE_HULL] = "Basic - Whole model";
@ -207,7 +207,7 @@ Windows.ScrollingWindow {
SHAPE_TYPES[SHAPE_TYPE_STATIC_MESH] = "Exact - All polygons"; SHAPE_TYPES[SHAPE_TYPE_STATIC_MESH] = "Exact - All polygons";
SHAPE_TYPES[SHAPE_TYPE_BOX] = "Box"; SHAPE_TYPES[SHAPE_TYPE_BOX] = "Box";
SHAPE_TYPES[SHAPE_TYPE_SPHERE] = "Sphere"; SHAPE_TYPES[SHAPE_TYPE_SPHERE] = "Sphere";
var SHAPE_TYPE_DEFAULT = SHAPE_TYPE_SIMPLE_COMPOUND; var SHAPE_TYPE_DEFAULT = SHAPE_TYPE_SIMPLE_COMPOUND;
var DYNAMIC_DEFAULT = false; var DYNAMIC_DEFAULT = false;
var prompt = desktop.customInputDialog({ var prompt = desktop.customInputDialog({
@ -349,14 +349,14 @@ Windows.ScrollingWindow {
} }
function deleteFile(index) { function deleteFile(index) {
var paths = []; var paths = [];
if (!index) { if (!index) {
for (var i = 0; i < selectedItemCount; ++i) { for (var i = 0; i < selectedItemCount; ++i) {
index = treeView.selection.selectedIndexes[i]; index = treeView.selection.selectedIndexes[i];
paths[i] = assetProxyModel.data(index, 0x100); paths[i] = assetProxyModel.data(index, 0x100);
} }
} }
if (!paths) { if (!paths) {
return; return;
} }
@ -365,13 +365,13 @@ Windows.ScrollingWindow {
var items = selectedItemCount.toString(); var items = selectedItemCount.toString();
var isFolder = assetProxyModel.data(treeView.selection.currentIndex, 0x101); var isFolder = assetProxyModel.data(treeView.selection.currentIndex, 0x101);
var typeString = isFolder ? 'folder' : 'file'; var typeString = isFolder ? 'folder' : 'file';
if (selectedItemCount > 1) { if (selectedItemCount > 1) {
modalMessage = "You are about to delete " + items + " items \nDo you want to continue?"; modalMessage = "You are about to delete " + items + " items \nDo you want to continue?";
} else { } else {
modalMessage = "You are about to delete the following " + typeString + ":\n" + paths + "\nDo you want to continue?"; modalMessage = "You are about to delete the following " + typeString + ":\n" + paths + "\nDo you want to continue?";
} }
var object = desktop.messageBox({ var object = desktop.messageBox({
icon: hifi.icons.question, icon: hifi.icons.question,
buttons: OriginalDialogs.StandardButton.Yes + OriginalDialogs.StandardButton.No, buttons: OriginalDialogs.StandardButton.Yes + OriginalDialogs.StandardButton.No,
@ -476,11 +476,11 @@ Windows.ScrollingWindow {
}); });
} }
} }
Item { Item {
width: pane.contentWidth width: pane.contentWidth
height: pane.height height: pane.height
// The letterbox used for popup messages // The letterbox used for popup messages
LetterboxMessage { LetterboxMessage {
id: letterboxMessage; id: letterboxMessage;
@ -542,7 +542,7 @@ Windows.ScrollingWindow {
anchors.margins: hifi.dimensions.contentMargin.x + 2 // Extra for border anchors.margins: hifi.dimensions.contentMargin.x + 2 // Extra for border
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
treeModel: assetProxyModel treeModel: assetProxyModel
selectionMode: SelectionMode.ExtendedSelection selectionMode: SelectionMode.ExtendedSelection
headerVisible: true headerVisible: true
@ -562,9 +562,13 @@ Windows.ScrollingWindow {
id: bakedColumn id: bakedColumn
title: "Use Baked?" title: "Use Baked?"
role: "baked" role: "baked"
width: 100 width: 170
} }
onSortIndicatorOrderChanged: {
Assets.sortProxyModel(sortIndicatorColumn, sortIndicatorOrder);
}
itemDelegate: Loader { itemDelegate: Loader {
id: itemDelegateLoader id: itemDelegateLoader
@ -600,7 +604,7 @@ Windows.ScrollingWindow {
} }
sourceComponent: getComponent() sourceComponent: getComponent()
Component { Component {
id: labelComponent id: labelComponent
FiraSansSemiBold { FiraSansSemiBold {
@ -609,15 +613,15 @@ Windows.ScrollingWindow {
color: colorScheme == hifi.colorSchemes.light color: colorScheme == hifi.colorSchemes.light
? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight) ? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight)
: (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText) : (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText)
horizontalAlignment: styleData.column === 1 ? TextInput.AlignHCenter : TextInput.AlignLeft horizontalAlignment: styleData.column === 1 ? TextInput.AlignHCenter : TextInput.AlignLeft
elide: Text.ElideMiddle elide: Text.ElideMiddle
MouseArea { MouseArea {
id: mouseArea id: mouseArea
anchors.fill: parent anchors.fill: parent
acceptedButtons: Qt.NoButton acceptedButtons: Qt.NoButton
hoverEnabled: true hoverEnabled: true
@ -639,7 +643,7 @@ Windows.ScrollingWindow {
color: colorScheme == hifi.colorSchemes.light color: colorScheme == hifi.colorSchemes.light
? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight) ? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight)
: (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText) : (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText)
elide: Text.ElideRight elide: Text.ElideRight
horizontalAlignment: TextInput.AlignHCenter horizontalAlignment: TextInput.AlignHCenter
@ -726,7 +730,7 @@ Windows.ScrollingWindow {
size: hifi.fontSizes.tableText size: hifi.fontSizes.tableText
color: colorScheme == hifi.colorSchemes.light ? hifi.colors.black : hifi.colors.lightGrayText color: colorScheme == hifi.colorSchemes.light ? hifi.colors.black : hifi.colors.lightGrayText
} }
Timer { Timer {
id: showTimer id: showTimer
interval: 1000 interval: 1000
@ -745,7 +749,7 @@ Windows.ScrollingWindow {
treeLabelToolTip.visible = false; treeLabelToolTip.visible = false;
} }
}// End_OF( treeLabelToolTip ) }// End_OF( treeLabelToolTip )
MouseArea { MouseArea {
propagateComposedEvents: true propagateComposedEvents: true
anchors.fill: parent anchors.fill: parent
@ -803,7 +807,7 @@ Windows.ScrollingWindow {
anchors.left: treeView.left anchors.left: treeView.left
anchors.right: treeView.right anchors.right: treeView.right
anchors.bottom: uploadSection.top anchors.bottom: uploadSection.top
RalewayRegular { RalewayRegular {
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
@ -847,7 +851,7 @@ Windows.ScrollingWindow {
checked = Qt.binding(isChecked); checked = Qt.binding(isChecked);
} }
function isEnabled() { function isEnabled() {
if (!treeView.selection.hasSelection) { if (!treeView.selection.hasSelection) {
return false; return false;
@ -871,7 +875,7 @@ Windows.ScrollingWindow {
} }
} }
return true; return true;
} }
function isChecked() { function isChecked() {
if (!treeView.selection.hasSelection) { if (!treeView.selection.hasSelection) {
@ -879,10 +883,10 @@ Windows.ScrollingWindow {
} }
var status = assetProxyModel.data(treeView.selection.currentIndex, 0x105); var status = assetProxyModel.data(treeView.selection.currentIndex, 0x105);
return isEnabled() && status !== "Not Baked"; return isEnabled() && status !== "Not Baked";
} }
} }
Item { Item {
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
width: infoGlyph.size; width: infoGlyph.size;
@ -906,7 +910,7 @@ Windows.ScrollingWindow {
"What is baking?", "What is baking?",
"Baking compresses and optimizes files for faster network transfer and display. We recommend you bake your content to reduce initial load times for your visitors."); "Baking compresses and optimizes files for faster network transfer and display. We recommend you bake your content to reduce initial load times for your visitors.");
} }
} }
}// End_OF( infoRow ) }// End_OF( infoRow )
HifiControls.ContentSection { HifiControls.ContentSection {

View file

@ -58,7 +58,7 @@ Rectangle {
Component.onDestruction: { Component.onDestruction: {
assetMappingsModel.autoRefreshEnabled = false; assetMappingsModel.autoRefreshEnabled = false;
} }
function letterbox(headerGlyph, headerText, message) { function letterbox(headerGlyph, headerText, message) {
letterboxMessage.headerGlyph = headerGlyph; letterboxMessage.headerGlyph = headerGlyph;
letterboxMessage.headerText = headerText; letterboxMessage.headerText = headerText;
@ -66,7 +66,7 @@ Rectangle {
letterboxMessage.visible = true; letterboxMessage.visible = true;
letterboxMessage.popupRadius = 0; letterboxMessage.popupRadius = 0;
} }
function errorMessageBox(message) { function errorMessageBox(message) {
return tabletRoot.messageBox({ return tabletRoot.messageBox({
icon: hifi.icons.warning, icon: hifi.icons.warning,
@ -145,7 +145,7 @@ Rectangle {
function canAddToWorld(path) { function canAddToWorld(path) {
var supportedExtensions = [/\.fbx\b/i, /\.obj\b/i, /\.jpg\b/i, /\.png\b/i]; var supportedExtensions = [/\.fbx\b/i, /\.obj\b/i, /\.jpg\b/i, /\.png\b/i];
if (selectedItemCount > 1) { if (selectedItemCount > 1) {
return false; return false;
} }
@ -154,8 +154,8 @@ Rectangle {
return total | new RegExp(current).test(path); return total | new RegExp(current).test(path);
}, false); }, false);
} }
function canRename() { function canRename() {
if (treeView.selection.hasSelection && selectedItemCount == 1) { if (treeView.selection.hasSelection && selectedItemCount == 1) {
return true; return true;
} else { } else {
@ -199,7 +199,7 @@ Rectangle {
var SHAPE_TYPE_STATIC_MESH = 3; var SHAPE_TYPE_STATIC_MESH = 3;
var SHAPE_TYPE_BOX = 4; var SHAPE_TYPE_BOX = 4;
var SHAPE_TYPE_SPHERE = 5; var SHAPE_TYPE_SPHERE = 5;
var SHAPE_TYPES = []; var SHAPE_TYPES = [];
SHAPE_TYPES[SHAPE_TYPE_NONE] = "No Collision"; SHAPE_TYPES[SHAPE_TYPE_NONE] = "No Collision";
SHAPE_TYPES[SHAPE_TYPE_SIMPLE_HULL] = "Basic - Whole model"; SHAPE_TYPES[SHAPE_TYPE_SIMPLE_HULL] = "Basic - Whole model";
@ -207,7 +207,7 @@ Rectangle {
SHAPE_TYPES[SHAPE_TYPE_STATIC_MESH] = "Exact - All polygons"; SHAPE_TYPES[SHAPE_TYPE_STATIC_MESH] = "Exact - All polygons";
SHAPE_TYPES[SHAPE_TYPE_BOX] = "Box"; SHAPE_TYPES[SHAPE_TYPE_BOX] = "Box";
SHAPE_TYPES[SHAPE_TYPE_SPHERE] = "Sphere"; SHAPE_TYPES[SHAPE_TYPE_SPHERE] = "Sphere";
var SHAPE_TYPE_DEFAULT = SHAPE_TYPE_SIMPLE_COMPOUND; var SHAPE_TYPE_DEFAULT = SHAPE_TYPE_SIMPLE_COMPOUND;
var DYNAMIC_DEFAULT = false; var DYNAMIC_DEFAULT = false;
var prompt = tabletRoot.customInputDialog({ var prompt = tabletRoot.customInputDialog({
@ -349,14 +349,14 @@ Rectangle {
} }
function deleteFile(index) { function deleteFile(index) {
var paths = []; var paths = [];
if (!index) { if (!index) {
for (var i = 0; i < selectedItemCount; ++i) { for (var i = 0; i < selectedItemCount; ++i) {
index = treeView.selection.selectedIndexes[i]; index = treeView.selection.selectedIndexes[i];
paths[i] = assetProxyModel.data(index, 0x100); paths[i] = assetProxyModel.data(index, 0x100);
} }
} }
if (!paths) { if (!paths) {
return; return;
} }
@ -365,7 +365,7 @@ Rectangle {
var items = selectedItemCount.toString(); var items = selectedItemCount.toString();
var isFolder = assetProxyModel.data(treeView.selection.currentIndex, 0x101); var isFolder = assetProxyModel.data(treeView.selection.currentIndex, 0x101);
var typeString = isFolder ? 'folder' : 'file'; var typeString = isFolder ? 'folder' : 'file';
if (selectedItemCount > 1) { if (selectedItemCount > 1) {
modalMessage = "You are about to delete " + items + " items \nDo you want to continue?"; modalMessage = "You are about to delete " + items + " items \nDo you want to continue?";
} else { } else {
@ -476,7 +476,7 @@ Rectangle {
}); });
} }
} }
// The letterbox used for popup messages // The letterbox used for popup messages
LetterboxMessage { LetterboxMessage {
id: letterboxMessage; id: letterboxMessage;
@ -540,7 +540,7 @@ Rectangle {
anchors.margins: hifi.dimensions.contentMargin.x + 2 // Extra for border anchors.margins: hifi.dimensions.contentMargin.x + 2 // Extra for border
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
treeModel: assetProxyModel treeModel: assetProxyModel
selectionMode: SelectionMode.ExtendedSelection selectionMode: SelectionMode.ExtendedSelection
headerVisible: true headerVisible: true
@ -560,9 +560,13 @@ Rectangle {
id: bakedColumn id: bakedColumn
title: "Use Baked?" title: "Use Baked?"
role: "baked" role: "baked"
width: 100 width: 170
} }
onSortIndicatorOrderChanged: {
Assets.sortProxyModel(sortIndicatorColumn, sortIndicatorOrder);
}
itemDelegate: Loader { itemDelegate: Loader {
id: itemDelegateLoader id: itemDelegateLoader
@ -598,7 +602,7 @@ Rectangle {
} }
sourceComponent: getComponent() sourceComponent: getComponent()
Component { Component {
id: labelComponent id: labelComponent
FiraSansSemiBold { FiraSansSemiBold {
@ -607,15 +611,15 @@ Rectangle {
color: colorScheme == hifi.colorSchemes.light color: colorScheme == hifi.colorSchemes.light
? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight) ? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight)
: (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText) : (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText)
horizontalAlignment: styleData.column === 1 ? TextInput.AlignHCenter : TextInput.AlignLeft horizontalAlignment: styleData.column === 1 ? TextInput.AlignHCenter : TextInput.AlignLeft
elide: Text.ElideMiddle elide: Text.ElideMiddle
MouseArea { MouseArea {
id: mouseArea id: mouseArea
anchors.fill: parent anchors.fill: parent
acceptedButtons: Qt.NoButton acceptedButtons: Qt.NoButton
hoverEnabled: true hoverEnabled: true
@ -637,7 +641,7 @@ Rectangle {
color: colorScheme == hifi.colorSchemes.light color: colorScheme == hifi.colorSchemes.light
? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight) ? (styleData.selected ? hifi.colors.black : hifi.colors.baseGrayHighlight)
: (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText) : (styleData.selected ? hifi.colors.black : hifi.colors.lightGrayText)
elide: Text.ElideRight elide: Text.ElideRight
horizontalAlignment: TextInput.AlignHCenter horizontalAlignment: TextInput.AlignHCenter
@ -724,7 +728,7 @@ Rectangle {
size: hifi.fontSizes.tableText size: hifi.fontSizes.tableText
color: colorScheme == hifi.colorSchemes.light ? hifi.colors.black : hifi.colors.lightGrayText color: colorScheme == hifi.colorSchemes.light ? hifi.colors.black : hifi.colors.lightGrayText
} }
Timer { Timer {
id: showTimer id: showTimer
interval: 1000 interval: 1000
@ -743,7 +747,7 @@ Rectangle {
treeLabelToolTip.visible = false; treeLabelToolTip.visible = false;
} }
}// End_OF( treeLabelToolTip ) }// End_OF( treeLabelToolTip )
MouseArea { MouseArea {
propagateComposedEvents: true propagateComposedEvents: true
anchors.fill: parent anchors.fill: parent
@ -801,7 +805,7 @@ Rectangle {
anchors.left: treeView.left anchors.left: treeView.left
anchors.right: treeView.right anchors.right: treeView.right
anchors.bottomMargin: hifi.dimensions.contentSpacing.y anchors.bottomMargin: hifi.dimensions.contentSpacing.y
RalewayRegular { RalewayRegular {
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
@ -845,7 +849,7 @@ Rectangle {
checked = Qt.binding(isChecked); checked = Qt.binding(isChecked);
} }
function isEnabled() { function isEnabled() {
if (!treeView.selection.hasSelection) { if (!treeView.selection.hasSelection) {
return false; return false;
@ -869,7 +873,7 @@ Rectangle {
} }
} }
return true; return true;
} }
function isChecked() { function isChecked() {
if (!treeView.selection.hasSelection) { if (!treeView.selection.hasSelection) {
@ -877,10 +881,10 @@ Rectangle {
} }
var status = assetProxyModel.data(treeView.selection.currentIndex, 0x105); var status = assetProxyModel.data(treeView.selection.currentIndex, 0x105);
return isEnabled() && status !== "Not Baked"; return isEnabled() && status !== "Not Baked";
} }
} }
Item { Item {
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
width: infoGlyph.size; width: infoGlyph.size;
@ -904,7 +908,7 @@ Rectangle {
"What is baking?", "What is baking?",
"Baking compresses and optimizes files for faster network transfer and display. We recommend you bake your content to reduce initial load times for your visitors."); "Baking compresses and optimizes files for faster network transfer and display. We recommend you bake your content to reduce initial load times for your visitors.");
} }
} }
}// End_OF( infoRow ) }// End_OF( infoRow )
HifiControls.TabletContentSection { HifiControls.TabletContentSection {

View file

@ -959,8 +959,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
setProperty(hifi::properties::STEAM, (steamClient && steamClient->isRunning())); setProperty(hifi::properties::STEAM, (steamClient && steamClient->isRunning()));
setProperty(hifi::properties::CRASHED, _previousSessionCrashed); setProperty(hifi::properties::CRASHED, _previousSessionCrashed);
_entityClipboard->setIsServerlessMode(true);
{ {
const QString TEST_SCRIPT = "--testScript"; const QString TEST_SCRIPT = "--testScript";
const QString TRACE_FILE = "--traceFile"; const QString TRACE_FILE = "--traceFile";

View file

@ -152,6 +152,10 @@ void AssetMappingsScriptingInterface::deleteMappings(QStringList paths, QJSValue
request->start(); request->start();
} }
void AssetMappingsScriptingInterface::sortProxyModel(int column, Qt::SortOrder order) {
_proxyModel.sort(column, order);
}
void AssetMappingsScriptingInterface::getAllMappings(QJSValue callback) { void AssetMappingsScriptingInterface::getAllMappings(QJSValue callback) {
auto assetClient = DependencyManager::get<AssetClient>(); auto assetClient = DependencyManager::get<AssetClient>();
auto request = assetClient->createGetAllMappingsRequest(); auto request = assetClient->createGetAllMappingsRequest();
@ -287,7 +291,7 @@ void AssetMappingModel::refresh() {
item->setData(parts[i], Qt::UserRole + 2); item->setData(parts[i], Qt::UserRole + 2);
item->setData("atp:" + fullPath, Qt::UserRole + 3); item->setData("atp:" + fullPath, Qt::UserRole + 3);
item->setData(fullPath, Qt::UserRole + 4); item->setData(fullPath, Qt::UserRole + 4);
if (lastItem) { if (lastItem) {
lastItem->appendRow(item); lastItem->appendRow(item);
} else { } else {

View file

@ -82,6 +82,7 @@ public:
Q_INVOKABLE void getAllMappings(QJSValue callback = QJSValue()); Q_INVOKABLE void getAllMappings(QJSValue callback = QJSValue());
Q_INVOKABLE void renameMapping(QString oldPath, QString newPath, QJSValue callback = QJSValue()); Q_INVOKABLE void renameMapping(QString oldPath, QString newPath, QJSValue callback = QJSValue());
Q_INVOKABLE void setBakingEnabled(QStringList paths, bool enabled, QJSValue callback = QJSValue()); Q_INVOKABLE void setBakingEnabled(QStringList paths, bool enabled, QJSValue callback = QJSValue());
Q_INVOKABLE void sortProxyModel(int column, Qt::SortOrder order = Qt::AscendingOrder);
protected: protected:
QSet<AssetRequest*> _pendingRequests; QSet<AssetRequest*> _pendingRequests;

View file

@ -388,6 +388,21 @@ QString Overlays::getOverlayType(OverlayID overlayId) {
return ""; return "";
} }
QObject* Overlays::getOverlayObject(OverlayID id) {
if (QThread::currentThread() != thread()) {
QObject* result;
PROFILE_RANGE(script, __FUNCTION__);
BLOCKING_INVOKE_METHOD(this, "getOverlayObject", Q_RETURN_ARG(QObject*, result), Q_ARG(OverlayID, id));
return result;
}
Overlay::Pointer thisOverlay = getOverlay(id);
if (thisOverlay) {
return qobject_cast<QObject*>(&(*thisOverlay));
}
return nullptr;
}
OverlayID Overlays::getOverlayAtPoint(const glm::vec2& point) { OverlayID Overlays::getOverlayAtPoint(const glm::vec2& point) {
if (!_enabled) { if (!_enabled) {
return UNKNOWN_OVERLAY_ID; return UNKNOWN_OVERLAY_ID;

View file

@ -235,6 +235,50 @@ public slots:
*/ */
QString getOverlayType(OverlayID overlayId); QString getOverlayType(OverlayID overlayId);
/**jsdoc
* Get the overlay script object. In particular, this is useful for accessing the event bridge for a <code>web3d</code>
* overlay.
* @function Overlays.getOverlayObject
* @param {Uuid} overlayID - The ID of the overlay to get the script object of.
* @returns {object} The script object for the overlay if found.
* @example <caption>Receive "hello" messages from a <code>web3d</code> overlay.</caption>
* // HTML file: name "web3d.html".
* <!DOCTYPE html>
* <html>
* <head>
* <title>HELLO</title>
* </head>
* <body>
* <h1>HELLO</h1></h1>
* <script>
* setInterval(function () {
* EventBridge.emitWebEvent("hello");
* }, 2000);
* </script>
* </body>
* </html>
*
* // Script file.
* var web3dOverlay = Overlays.addOverlay("web3d", {
* position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, {x: 0, y: 0.5, z: -3 })),
* rotation: MyAvatar.orientation,
* url: Script.resolvePath("web3d.html"),
* alpha: 1.0
* });
*
* function onWebEventReceived(event) {
* print("onWebEventReceived() : " + JSON.stringify(event));
* }
*
* overlayObject = Overlays.getOverlayObject(web3dOverlay);
* overlayObject.webEventReceived.connect(onWebEventReceived);
*
* Script.scriptEnding.connect(function () {
* Overlays.deleteOverlay(web3dOverlay);
* });
*/
QObject* getOverlayObject(OverlayID id);
/**jsdoc /**jsdoc
* Get the ID of the 2D overlay at a particular point on the screen or HUD. * Get the ID of the 2D overlay at a particular point on the screen or HUD.
* @function Overlays.getOverlayAtPoint * @function Overlays.getOverlayAtPoint

View file

@ -166,18 +166,30 @@ bool OffscreenSurface::eventFilter(QObject* originalDestination, QEvent* event)
case QEvent::TouchUpdate: case QEvent::TouchUpdate:
case QEvent::TouchEnd: { case QEvent::TouchEnd: {
QTouchEvent *originalEvent = static_cast<QTouchEvent *>(event); QTouchEvent *originalEvent = static_cast<QTouchEvent *>(event);
QTouchEvent fakeEvent(*originalEvent); QEvent::Type fakeMouseEventType = QEvent::None;
auto newTouchPoints = fakeEvent.touchPoints(); Qt::MouseButton fakeMouseButton = Qt::LeftButton;
for (size_t i = 0; i < newTouchPoints.size(); ++i) { Qt::MouseButtons fakeMouseButtons = Qt::NoButton;
const auto &originalPoint = originalEvent->touchPoints()[i]; switch (event->type()) {
auto &newPoint = newTouchPoints[i]; case QEvent::TouchBegin:
newPoint.setPos(originalPoint.pos()); fakeMouseEventType = QEvent::MouseButtonPress;
fakeMouseButtons = Qt::LeftButton;
break;
case QEvent::TouchUpdate:
fakeMouseEventType = QEvent::MouseMove;
fakeMouseButtons = Qt::LeftButton;
break;
case QEvent::TouchEnd:
fakeMouseEventType = QEvent::MouseButtonRelease;
fakeMouseButtons = Qt::NoButton;
break;
} }
fakeEvent.setTouchPoints(newTouchPoints); // Same case as OffscreenUi.cpp::eventFilter: touch events are always being accepted so we now use mouse events and consider one touch, touchPoints()[0].
if (QCoreApplication::sendEvent(_sharedObject->getWindow(), &fakeEvent)) { QMouseEvent fakeMouseEvent(fakeMouseEventType, originalEvent->touchPoints()[0].pos(), fakeMouseButton, fakeMouseButtons, Qt::NoModifier);
qInfo() << __FUNCTION__ << "sent fake touch event:" << fakeEvent.type() fakeMouseEvent.ignore();
<< "_quickWindow handled it... accepted:" << fakeEvent.isAccepted(); if (QCoreApplication::sendEvent(_sharedObject->getWindow(), &fakeMouseEvent)) {
return false; //event->isAccepted(); /*qInfo() << __FUNCTION__ << "sent fake touch event:" << fakeMouseEvent.type()
<< "_quickWindow handled it... accepted:" << fakeMouseEvent.isAccepted();*/
return fakeMouseEvent.isAccepted();
} }
break; break;
} }

View file

@ -26,14 +26,14 @@ var RADIUS_RATE = 1.0 / 100.0;
var PAN_RATE = 250.0; var PAN_RATE = 250.0;
var Y_AXIS = { var Y_AXIS = {
x: 0, x: 0,
y: 1, y: 1,
z: 0 z: 0
}; };
var X_AXIS = { var X_AXIS = {
x: 1, x: 1,
y: 0, y: 0,
z: 0 z: 0
}; };
var LOOK_AT_TIME = 500; var LOOK_AT_TIME = 500;
@ -56,21 +56,20 @@ var mode = noMode;
var mouseLastX = 0; var mouseLastX = 0;
var mouseLastY = 0; var mouseLastY = 0;
var center = { var center = {
x: 0, x: 0,
y: 0, y: 0,
z: 0 z: 0
}; };
var position = { var position = {
x: 0, x: 0,
y: 0, y: 0,
z: 0 z: 0
}; };
var vector = { var vector = {
x: 0, x: 0,
y: 0, y: 0,
z: 0 z: 0
}; };
var radius = 0.0; var radius = 0.0;
var azimuth = 0.0; var azimuth = 0.0;
@ -83,258 +82,248 @@ var rotatingTowardsTarget = false;
var targetCamOrientation; var targetCamOrientation;
var oldPosition, oldOrientation; var oldPosition, oldOrientation;
function orientationOf(vector) { function orientationOf(vector) {
var direction, var direction,
yaw, yaw,
pitch; pitch;
direction = Vec3.normalize(vector); direction = Vec3.normalize(vector);
yaw = Quat.angleAxis(Math.atan2(direction.x, direction.z) * RAD_TO_DEG, Y_AXIS); yaw = Quat.angleAxis(Math.atan2(direction.x, direction.z) * RAD_TO_DEG, Y_AXIS);
pitch = Quat.angleAxis(Math.asin(-direction.y) * RAD_TO_DEG, X_AXIS); pitch = Quat.angleAxis(Math.asin(-direction.y) * RAD_TO_DEG, X_AXIS);
return Quat.multiply(yaw, pitch); return Quat.multiply(yaw, pitch);
} }
function handleRadialMode(dx, dy) { function handleRadialMode(dx, dy) {
azimuth += dx / AZIMUTH_RATE; azimuth += dx / AZIMUTH_RATE;
radius += radius * dy * RADIUS_RATE; radius += radius * dy * RADIUS_RATE;
if (radius < 1) { if (radius < 1) {
radius = 1; radius = 1;
} }
vector = { vector = {
x: (Math.cos(altitude) * Math.cos(azimuth)) * radius, x: (Math.cos(altitude) * Math.cos(azimuth)) * radius,
y: Math.sin(altitude) * radius, y: Math.sin(altitude) * radius,
z: (Math.cos(altitude) * Math.sin(azimuth)) * radius z: (Math.cos(altitude) * Math.sin(azimuth)) * radius
}; };
position = Vec3.sum(center, vector); position = Vec3.sum(center, vector);
Camera.setPosition(position); Camera.setPosition(position);
Camera.setOrientation(orientationOf(vector)); Camera.setOrientation(orientationOf(vector));
} }
function handleOrbitMode(dx, dy) { function handleOrbitMode(dx, dy) {
azimuth += dx / AZIMUTH_RATE; azimuth += dx / AZIMUTH_RATE;
altitude += dy / ALTITUDE_RATE; altitude += dy / ALTITUDE_RATE;
if (altitude > PI / 2.0) { if (altitude > PI / 2.0) {
altitude = PI / 2.0; altitude = PI / 2.0;
} }
if (altitude < -PI / 2.0) { if (altitude < -PI / 2.0) {
altitude = -PI / 2.0; altitude = -PI / 2.0;
} }
vector = { vector = {
x: (Math.cos(altitude) * Math.cos(azimuth)) * radius, x: (Math.cos(altitude) * Math.cos(azimuth)) * radius,
y: Math.sin(altitude) * radius, y: Math.sin(altitude) * radius,
z: (Math.cos(altitude) * Math.sin(azimuth)) * radius z: (Math.cos(altitude) * Math.sin(azimuth)) * radius
}; };
position = Vec3.sum(center, vector); position = Vec3.sum(center, vector);
Camera.setPosition(position); Camera.setPosition(position);
Camera.setOrientation(orientationOf(vector)); Camera.setOrientation(orientationOf(vector));
} }
function handlePanMode(dx, dy) { function handlePanMode(dx, dy) {
var up = Quat.getUp(Camera.getOrientation()); var up = Quat.getUp(Camera.getOrientation());
var right = Quat.getRight(Camera.getOrientation()); var right = Quat.getRight(Camera.getOrientation());
var distance = Vec3.length(vector); var distance = Vec3.length(vector);
var dv = Vec3.sum(Vec3.multiply(up, distance * dy / PAN_RATE), Vec3.multiply(right, -distance * dx / PAN_RATE)); var dv = Vec3.sum(Vec3.multiply(up, distance * dy / PAN_RATE), Vec3.multiply(right, -distance * dx / PAN_RATE));
center = Vec3.sum(center, dv); center = Vec3.sum(center, dv);
position = Vec3.sum(position, dv); position = Vec3.sum(position, dv);
Camera.setPosition(position); Camera.setPosition(position);
Camera.setOrientation(orientationOf(vector)); Camera.setOrientation(orientationOf(vector));
} }
function saveCameraState() { function saveCameraState() {
oldMode = Camera.mode; oldMode = Camera.mode;
oldPosition = Camera.getPosition(); oldPosition = Camera.getPosition();
oldOrientation = Camera.getOrientation(); oldOrientation = Camera.getOrientation();
Camera.mode = "independent"; Camera.mode = "independent";
Camera.setPosition(oldPosition); Camera.setPosition(oldPosition);
} }
function restoreCameraState() { function restoreCameraState() {
Camera.mode = oldMode; Camera.mode = oldMode;
Camera.setPosition(oldPosition); Camera.setPosition(oldPosition);
Camera.setOrientation(oldOrientation); Camera.setOrientation(oldOrientation);
} }
function handleModes() { function handleModes() {
var newMode = (mode == noMode) ? noMode : detachedMode; var newMode = (mode == noMode) ? noMode : detachedMode;
if (alt) { if (alt) {
if (control) { if (control) {
if (shift) { if (shift) {
newMode = panningMode; newMode = panningMode;
} else { } else {
newMode = orbitMode; newMode = orbitMode;
} }
} else { } else {
newMode = radialMode; newMode = radialMode;
}
} }
}
// if entering detachMode // if entering detachMode
if (newMode == detachedMode && mode != detachedMode) { if (newMode == detachedMode && mode != detachedMode) {
avatarPosition = MyAvatar.position; avatarPosition = MyAvatar.position;
avatarOrientation = MyAvatar.orientation; avatarOrientation = MyAvatar.orientation;
} }
// if leaving detachMode // if leaving detachMode
if (mode == detachedMode && newMode == detachedMode && if (mode == detachedMode && newMode == detachedMode &&
(avatarPosition.x != MyAvatar.position.x || (avatarPosition.x != MyAvatar.position.x ||
avatarPosition.y != MyAvatar.position.y || avatarPosition.y != MyAvatar.position.y ||
avatarPosition.z != MyAvatar.position.z || avatarPosition.z != MyAvatar.position.z ||
avatarOrientation.x != MyAvatar.orientation.x || avatarOrientation.x != MyAvatar.orientation.x ||
avatarOrientation.y != MyAvatar.orientation.y || avatarOrientation.y != MyAvatar.orientation.y ||
avatarOrientation.z != MyAvatar.orientation.z || avatarOrientation.z != MyAvatar.orientation.z ||
avatarOrientation.w != MyAvatar.orientation.w)) { avatarOrientation.w != MyAvatar.orientation.w)) {
newMode = noMode; newMode = noMode;
} }
if (mode == noMode && newMode != noMode && Camera.mode == "independent") { if (mode == noMode && newMode != noMode && Camera.mode == "independent") {
newMode = noMode; newMode = noMode;
} }
// if leaving noMode // if leaving noMode
if (mode == noMode && newMode != noMode) { if (mode == noMode && newMode != noMode) {
saveCameraState(); saveCameraState();
} }
// if entering noMode // if entering noMode
if (newMode == noMode && mode != noMode) { if (newMode == noMode && mode != noMode) {
restoreCameraState(); restoreCameraState();
} }
mode = newMode; mode = newMode;
} }
function keyPressEvent(event) { function keyPressEvent(event) {
var changed = false; var changed = false;
if (event.text == "ALT") { if (event.text == "ALT") {
alt = true; alt = true;
changed = true; changed = true;
} }
if (event.text == "CONTROL") { if (event.text == "CONTROL") {
control = true; control = true;
changed = true; changed = true;
} }
if (event.text == "SHIFT") { if (event.text == "SHIFT") {
shift = true; shift = true;
changed = true; changed = true;
} }
if (changed) { if (changed) {
handleModes(); handleModes();
} }
} }
function keyReleaseEvent(event) { function keyReleaseEvent(event) {
var changed = false; var changed = false;
if (event.text == "ALT") { if (event.text == "ALT") {
alt = false; alt = false;
changed = true; changed = true;
mode = noMode; mode = noMode;
restoreCameraState(); restoreCameraState();
} }
if (event.text == "CONTROL") { if (event.text == "CONTROL") {
control = false; control = false;
changed = true; changed = true;
} }
if (event.text == "SHIFT") { if (event.text == "SHIFT") {
shift = false; shift = false;
changed = true; changed = true;
}
if (changed) {
handleModes();
}
}
function mousePressEvent(event) {
if (alt && !isActive) {
mouseLastX = event.x;
mouseLastY = event.y;
// Compute trajectories related values
var pickRay = Camera.computePickRay(mouseLastX, mouseLastY);
var modelIntersection = Entities.findRayIntersection(pickRay, true);
position = Camera.getPosition();
var avatarTarget = MyAvatar.getTargetAvatarPosition();
var distance = -1;
var string;
if (modelIntersection.intersects && modelIntersection.accurate) {
distance = modelIntersection.distance;
center = modelIntersection.intersection;
string = "Inspecting model";
//We've selected our target, now orbit towards it automatically
rotatingTowardsTarget = true;
//calculate our target cam rotation
Script.setTimeout(function() {
rotatingTowardsTarget = false;
}, LOOK_AT_TIME);
vector = Vec3.subtract(position, center);
targetCamOrientation = orientationOf(vector);
radius = Vec3.length(vector);
azimuth = Math.atan2(vector.z, vector.x);
altitude = Math.asin(vector.y / Vec3.length(vector));
isActive = true;
} }
} if (changed) {
handleModes();
}
}
function mousePressEvent(event) {
if (alt && !isActive) {
mouseLastX = event.x;
mouseLastY = event.y;
// Compute trajectories related values
var pickRay = Camera.computePickRay(mouseLastX, mouseLastY);
var modelIntersection = Entities.findRayIntersection(pickRay, true);
var avatarIntersection = AvatarList.findRayIntersection(pickRay);
position = Camera.getPosition();
if (avatarIntersection.intersects || (modelIntersection.intersects && modelIntersection.accurate)) {
if (avatarIntersection.intersects) {
center = avatarIntersection.intersection;
} else {
center = modelIntersection.intersection;
}
// We've selected our target, now orbit towards it automatically
rotatingTowardsTarget = true;
// calculate our target cam rotation
Script.setTimeout(function () {
rotatingTowardsTarget = false;
}, LOOK_AT_TIME);
vector = Vec3.subtract(position, center);
targetCamOrientation = orientationOf(vector);
radius = Vec3.length(vector);
azimuth = Math.atan2(vector.z, vector.x);
altitude = Math.asin(vector.y / Vec3.length(vector));
isActive = true;
}
}
} }
function mouseReleaseEvent(event) { function mouseReleaseEvent(event) {
if (isActive) { if (isActive) {
isActive = false; isActive = false;
} }
} }
function mouseMoveEvent(event) { function mouseMoveEvent(event) {
if (isActive && mode != noMode && !rotatingTowardsTarget) { if (isActive && mode != noMode && !rotatingTowardsTarget) {
if (mode == radialMode) { if (mode == radialMode) {
handleRadialMode(event.x - mouseLastX, event.y - mouseLastY); handleRadialMode(event.x - mouseLastX, event.y - mouseLastY);
}
if (mode == orbitMode) {
handleOrbitMode(event.x - mouseLastX, event.y - mouseLastY);
}
if (mode == panningMode) {
handlePanMode(event.x - mouseLastX, event.y - mouseLastY);
}
} }
if (mode == orbitMode) { mouseLastX = event.x;
handleOrbitMode(event.x - mouseLastX, event.y - mouseLastY); mouseLastY = event.y;
}
if (mode == panningMode) {
handlePanMode(event.x - mouseLastX, event.y - mouseLastY);
}
}
mouseLastX = event.x;
mouseLastY = event.y;
} }
function update() { function update() {
handleModes(); handleModes();
if (rotatingTowardsTarget) { if (rotatingTowardsTarget) {
rotateTowardsTarget(); rotateTowardsTarget();
} }
} }
function rotateTowardsTarget() { function rotateTowardsTarget() {
var newOrientation = Quat.mix(Camera.getOrientation(), targetCamOrientation, .1); var newOrientation = Quat.mix(Camera.getOrientation(), targetCamOrientation, 0.1);
Camera.setOrientation(newOrientation); Camera.setOrientation(newOrientation);
} }
function scriptEnding() { function scriptEnding() {
if (mode != noMode) { if (mode != noMode) {
restoreCameraState(); restoreCameraState();
} }
} }
Controller.keyPressEvent.connect(keyPressEvent); Controller.keyPressEvent.connect(keyPressEvent);
@ -345,4 +334,4 @@ Controller.mouseReleaseEvent.connect(mouseReleaseEvent);
Controller.mouseMoveEvent.connect(mouseMoveEvent); Controller.mouseMoveEvent.connect(mouseMoveEvent);
Script.update.connect(update); Script.update.connect(update);
Script.scriptEnding.connect(scriptEnding); Script.scriptEnding.connect(scriptEnding);

View file

@ -46,7 +46,6 @@ function onMuteClicked() {
printd("On Mute Clicked"); printd("On Mute Clicked");
//Menu.setIsOptionChecked("Mute Microphone", !Menu.isOptionChecked("Mute Microphone")); //Menu.setIsOptionChecked("Mute Microphone", !Menu.isOptionChecked("Mute Microphone"));
Audio.muted = !Audio.muted; Audio.muted = !Audio.muted;
onMuteToggled();
} }
function onMuteToggled() { function onMuteToggled() {

View file

@ -35,6 +35,7 @@ function fromQml(message) { // messages are {method, params}, like json-rpc. See
break; break;
case 'hide': case 'hide':
Controller.setVPadHidden(false); Controller.setVPadHidden(false);
module.exports.hide();
module.exports.onHidden(); module.exports.onHidden();
break; break;
default: default:

View file

@ -33,7 +33,6 @@ function init() {
radar.setUniqueColor(uniqueColor); radar.setUniqueColor(uniqueColor);
radar.init(); radar.init();
setupModesBar(); setupModesBar();
radar.isTouchValid = isRadarModeValidTouch;
} }
function shutdown() { function shutdown() {
@ -183,34 +182,6 @@ function onButtonClicked(clickedButton, whatToDo, hideAllAfter) {
} }
} }
function isRadarModeValidTouch(coords) {
var qmlFragments = [modesbar.qmlFragment];
var windows = [];
for (var i=0; i < qmlFragments.length; i++) {
var aQmlFrag = qmlFragments[i];
if (aQmlFrag != null && aQmlFrag.isVisible() &&
coords.x >= aQmlFrag.position.x * 3 && coords.x <= aQmlFrag.position.x * 3 + aQmlFrag.size.x * 3 &&
coords.y >= aQmlFrag.position.y * 3 && coords.y <= aQmlFrag.position.y * 3 + aQmlFrag.size.y * 3
) {
printd("godViewModeTouchValid- false because of qmlFragments!? idx " + i);
return false;
}
}
for (var i=0; i < windows.length; i++) {
var aWin = windows[i];
if (aWin != null && aWin.position() != null &&
coords.x >= aWin.position().x * 3 && coords.x <= aWin.position().x * 3 + aWin.width() * 3 &&
coords.y >= aWin.position().y * 3 && coords.y <= aWin.position().y * 3 + aWin.height() * 3
) {
printd("godViewModeTouchValid- false because of windows!?");
return false;
}
}
printd("godViewModeTouchValid- true by default ");
return true;
}
Script.scriptEnding.connect(function () { Script.scriptEnding.connect(function () {
shutdown(); shutdown();
}); });

View file

@ -13,7 +13,7 @@
var radarModeInterface = {}; var radarModeInterface = {};
var logEnabled = true; var logEnabled = false;
function printd(str) { function printd(str) {
if (logEnabled) { if (logEnabled) {
print("[radar.js] " + str); print("[radar.js] " + str);
@ -118,19 +118,10 @@ function actionOnObjectFromEvent(event) {
} }
function mousePress(event) { function mousePress(event) {
if (!isTouchValid(coords)) {
currentTouchIsValid = false;
return;
} else {
currentTouchIsValid = true;
}
mousePressOrTouchEnd(event); mousePressOrTouchEnd(event);
} }
function mousePressOrTouchEnd(event) { function mousePressOrTouchEnd(event) {
if (!currentTouchIsValid) {
return;
}
if (radar) { if (radar) {
if (actionOnObjectFromEvent(event)) { if (actionOnObjectFromEvent(event)) {
return; return;
@ -155,9 +146,6 @@ function fakeDoubleTap(event) {
teleporter.dragTeleportRelease(event); teleporter.dragTeleportRelease(event);
} }
var currentTouchIsValid = false; // Currently used to know if touch hasn't
// started on a UI overlay
var DOUBLE_TAP_TIME = 300; var DOUBLE_TAP_TIME = 300;
var fakeDoubleTapStart = Date.now(); var fakeDoubleTapStart = Date.now();
var touchEndCount = 0; var touchEndCount = 0;
@ -238,12 +226,6 @@ function touchEnd(event) {
return; return;
} }
// if touch is invalid, cancel
if (!currentTouchIsValid) {
printd("touchEnd fail because !currentTouchIsValid");
return;
}
if (analyzeDoubleTap(event)) if (analyzeDoubleTap(event))
return; // double tap detected, finish return; // double tap detected, finish
@ -345,20 +327,6 @@ function computePointAtPlaneY(x, y, py) {
p2.z, py); p2.z, py);
} }
/*******************************************************************************
*
******************************************************************************/
function isTouchValid(coords) {
// TODO: Extend to the detection of touches on new menu bars
var radarModeTouchValid = radarModeInterface.isTouchValid(coords);
// getItemAtPoint does not exist anymore, look for another way to know if we
// are touching buttons
// is it still needed?
return /* !tablet.getItemAtPoint(coords) && */radarModeTouchValid;
}
/******************************************************************************* /*******************************************************************************
* *
******************************************************************************/ ******************************************************************************/
@ -373,16 +341,8 @@ function touchBegin(event) {
x : event.x, x : event.x,
y : event.y y : event.y
}; };
if (!isTouchValid(coords)) { touchStartingCoordinates = coords;
printd("analyze touch - RADAR_TOUCH - INVALID"); touchBeginTime = Date.now();
currentTouchIsValid = false;
touchStartingCoordinates = null;
} else {
printd("analyze touch - RADAR_TOUCH - ok");
currentTouchIsValid = true;
touchStartingCoordinates = coords;
touchBeginTime = Date.now();
}
} }
var startedDraggingCamera = false; // first time var startedDraggingCamera = false; // first time
@ -848,9 +808,6 @@ function oneFingerTouchUpdate(event) {
} }
function touchUpdate(event) { function touchUpdate(event) {
if (!currentTouchIsValid) {
return; // avoid moving and zooming when tap is over UI entities
}
if (event.isPinching || event.isPinchOpening) { if (event.isPinching || event.isPinchOpening) {
pinchUpdate(event); pinchUpdate(event);
} else { } else {

View file

@ -307,6 +307,10 @@ WebTablet.prototype.setScriptURL = function (scriptURL) {
Overlays.editOverlay(this.webOverlayID, { scriptURL: scriptURL }); Overlays.editOverlay(this.webOverlayID, { scriptURL: scriptURL });
}; };
WebTablet.prototype.getOverlayObject = function () {
return Overlays.getOverlayObject(this.webOverlayID);
};
WebTablet.prototype.setWidth = function (width) { WebTablet.prototype.setWidth = function (width) {
// imported from libraries/utils.js // imported from libraries/utils.js
resizeTablet(width); resizeTablet(width);