mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-25 13:52:49 +02:00
373 lines
13 KiB
QML
373 lines
13 KiB
QML
//
|
|
// TabletAddressDialog.qml
|
|
//
|
|
// Created by Dante Ruiz on 2017/03/16
|
|
// Copyright 2015 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 Hifi 1.0
|
|
import QtQuick 2.5
|
|
import QtQuick.Controls 1.4
|
|
import QtGraphicalEffects 1.0
|
|
import "../../controls"
|
|
import "../../styles"
|
|
import "../../windows"
|
|
import "../"
|
|
import "../toolbars"
|
|
import "../../styles-uit" as HifiStyles
|
|
import "../../controls-uit" as HifiControls
|
|
|
|
// references HMD, AddressManager, AddressBarDialog from root context
|
|
|
|
StackView {
|
|
id: root;
|
|
HifiConstants { id: hifi }
|
|
HifiStyles.HifiConstants { id: hifiStyleConstants }
|
|
initialItem: addressBarDialog
|
|
width: parent !== null ? parent.width : undefined
|
|
height: parent !== null ? parent.height : undefined
|
|
property int cardWidth: 212;
|
|
property int cardHeight: 152;
|
|
property string metaverseBase: addressBarDialog.metaverseServerUrl + "/api/v1/";
|
|
property var tablet: null;
|
|
|
|
// This version only implements rpc(method, parameters, callback(error, result)) calls initiated from here, not initiated from .js, nor "notifications".
|
|
property var rpcCalls: ({});
|
|
property var rpcCounter: 0;
|
|
signal sendToScript(var message);
|
|
function rpc(method, parameters, callback) {
|
|
rpcCalls[rpcCounter] = callback;
|
|
var message = {method: method, params: parameters, id: rpcCounter++, jsonrpc: "2.0"};
|
|
sendToScript(message);
|
|
}
|
|
function fromScript(message) {
|
|
var callback = rpcCalls[message.id];
|
|
if (!callback) {
|
|
console.log('No callback for message fromScript', JSON.stringify(message));
|
|
return;
|
|
}
|
|
delete rpcCalls[message.id];
|
|
callback(message.error, message.result);
|
|
}
|
|
|
|
Component { id: tabletWebView; TabletWebView {} }
|
|
Component.onCompleted: {
|
|
updateLocationText(false);
|
|
addressLine.focus = !HMD.active;
|
|
root.parentChanged.connect(center);
|
|
center();
|
|
tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");
|
|
}
|
|
Component.onDestruction: {
|
|
root.parentChanged.disconnect(center);
|
|
}
|
|
|
|
function center() {
|
|
// Explicitly center in order to avoid warnings at shutdown
|
|
anchors.centerIn = parent;
|
|
}
|
|
|
|
|
|
function resetAfterTeleport() {
|
|
//storyCardFrame.shown = root.shown = false;
|
|
}
|
|
function goCard(targetString) {
|
|
if (0 !== targetString.indexOf('hifi://')) {
|
|
var card = tabletWebView.createObject();
|
|
card.url = addressBarDialog.metaverseServerUrl + targetString;
|
|
card.parentStackItem = root;
|
|
root.push(card);
|
|
return;
|
|
}
|
|
location.text = targetString;
|
|
toggleOrGo(true, targetString);
|
|
clearAddressLineTimer.start();
|
|
}
|
|
|
|
|
|
AddressBarDialog {
|
|
id: addressBarDialog
|
|
|
|
property bool keyboardEnabled: false
|
|
property bool keyboardRaised: false
|
|
property bool punctuationMode: false
|
|
|
|
width: parent.width
|
|
height: parent.height
|
|
|
|
anchors {
|
|
right: parent.right
|
|
left: parent.left
|
|
top: parent.top
|
|
bottom: parent.bottom
|
|
}
|
|
|
|
onMetaverseServerUrlChanged: updateLocationTextTimer.start();
|
|
Rectangle {
|
|
id: navBar
|
|
width: parent.width
|
|
height: 50;
|
|
color: hifiStyleConstants.colors.white
|
|
anchors.top: parent.top;
|
|
anchors.left: parent.left;
|
|
|
|
ToolbarButton {
|
|
id: homeButton
|
|
imageURL: "../../../images/home.svg"
|
|
onClicked: {
|
|
addressBarDialog.loadHome();
|
|
tabletRoot.shown = false;
|
|
tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");
|
|
tablet.gotoHomeScreen();
|
|
}
|
|
anchors {
|
|
left: parent.left
|
|
verticalCenter: parent.verticalCenter
|
|
}
|
|
}
|
|
ToolbarButton {
|
|
id: backArrow;
|
|
buttonState: addressBarDialog.backEnabled;
|
|
imageURL: "../../../images/backward.svg";
|
|
buttonEnabled: addressBarDialog.backEnabled;
|
|
onClicked: {
|
|
if (buttonEnabled) {
|
|
addressBarDialog.loadBack();
|
|
}
|
|
}
|
|
anchors {
|
|
left: homeButton.right
|
|
verticalCenter: parent.verticalCenter
|
|
}
|
|
}
|
|
ToolbarButton {
|
|
id: forwardArrow;
|
|
buttonState: addressBarDialog.forwardEnabled;
|
|
imageURL: "../../../images/forward.svg";
|
|
buttonEnabled: addressBarDialog.forwardEnabled;
|
|
onClicked: {
|
|
if (buttonEnabled) {
|
|
addressBarDialog.loadForward();
|
|
}
|
|
}
|
|
anchors {
|
|
left: backArrow.right
|
|
verticalCenter: parent.verticalCenter
|
|
}
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
id: addressBar
|
|
width: parent.width
|
|
height: 70
|
|
color: hifiStyleConstants.colors.white
|
|
anchors {
|
|
top: navBar.bottom;
|
|
left: parent.left;
|
|
}
|
|
|
|
HifiStyles.RalewayRegular {
|
|
id: notice;
|
|
font.pixelSize: hifi.fonts.pixelSize * 0.7;
|
|
anchors {
|
|
top: parent.top;
|
|
left: addressLineContainer.left;
|
|
right: addressLineContainer.right;
|
|
}
|
|
}
|
|
|
|
HifiStyles.FiraSansRegular {
|
|
id: location;
|
|
anchors {
|
|
left: addressLineContainer.left;
|
|
leftMargin: 8;
|
|
verticalCenter: addressLineContainer.verticalCenter;
|
|
}
|
|
font.pixelSize: addressLine.font.pixelSize;
|
|
color: "gray";
|
|
clip: true;
|
|
visible: addressLine.text.length === 0
|
|
}
|
|
|
|
TextInput {
|
|
id: addressLine
|
|
width: addressLineContainer.width - addressLineContainer.anchors.leftMargin - addressLineContainer.anchors.rightMargin;
|
|
anchors {
|
|
left: addressLineContainer.left;
|
|
leftMargin: 8;
|
|
verticalCenter: addressLineContainer.verticalCenter;
|
|
}
|
|
font.pixelSize: hifi.fonts.pixelSize * 0.75
|
|
onTextChanged: {
|
|
updateLocationText(text.length > 0);
|
|
}
|
|
onAccepted: {
|
|
addressBarDialog.keyboardEnabled = false;
|
|
toggleOrGo();
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
id: addressLineContainer;
|
|
height: 40;
|
|
anchors {
|
|
top: notice.bottom;
|
|
topMargin: 2;
|
|
left: parent.left;
|
|
leftMargin: 16;
|
|
right: parent.right;
|
|
rightMargin: 16;
|
|
}
|
|
color: hifiStyleConstants.colors.lightGray
|
|
opacity: 0.1
|
|
MouseArea {
|
|
anchors.fill: parent;
|
|
onClicked: {
|
|
if (!addressLine.focus || !HMD.active) {
|
|
addressLine.focus = true;
|
|
addressLine.forceActiveFocus();
|
|
addressBarDialog.keyboardEnabled = HMD.active;
|
|
}
|
|
tabletRoot.playButtonClickSound();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
id: bgMain;
|
|
anchors {
|
|
top: addressBar.bottom;
|
|
bottom: parent.keyboardEnabled ? keyboard.top : parent.bottom;
|
|
left: parent.left;
|
|
right: parent.right;
|
|
}
|
|
Rectangle {
|
|
id: addressShadow;
|
|
width: parent.width;
|
|
height: 42 - 33;
|
|
gradient: Gradient {
|
|
GradientStop { position: 0.0; color: "gray" }
|
|
GradientStop { position: 1.0; color: "white" }
|
|
}
|
|
}
|
|
Rectangle { // Column margins require QtQuick 2.7, which we don't use yet.
|
|
id: column;
|
|
property real pad: 10;
|
|
width: bgMain.width - column.pad;
|
|
height: stack.height;
|
|
color: "transparent";
|
|
anchors {
|
|
left: parent.left;
|
|
leftMargin: column.pad;
|
|
top: addressShadow.bottom;
|
|
topMargin: column.pad;
|
|
}
|
|
Column {
|
|
id: stack;
|
|
width: column.width;
|
|
spacing: 33 - places.labelSize;
|
|
Feed {
|
|
id: happeningNow;
|
|
width: parent.width;
|
|
cardWidth: 312 + (2 * 4);
|
|
cardHeight: 163 + (2 * 4);
|
|
metaverseServerUrl: addressBarDialog.metaverseServerUrl;
|
|
labelText: 'HAPPENING NOW';
|
|
actions: 'announcement';
|
|
filter: addressLine.text;
|
|
goFunction: goCard;
|
|
rpc: root.rpc;
|
|
}
|
|
Feed {
|
|
id: places;
|
|
width: parent.width;
|
|
cardWidth: 210;
|
|
cardHeight: 110 + messageHeight;
|
|
messageHeight: 44;
|
|
metaverseServerUrl: addressBarDialog.metaverseServerUrl;
|
|
labelText: 'PLACES';
|
|
actions: 'concurrency';
|
|
filter: addressLine.text;
|
|
goFunction: goCard;
|
|
rpc: root.rpc;
|
|
}
|
|
Feed {
|
|
id: snapshots;
|
|
width: parent.width;
|
|
cardWidth: 143 + (2 * 4);
|
|
cardHeight: 75 + messageHeight + 4;
|
|
messageHeight: 32;
|
|
textPadding: 6;
|
|
metaverseServerUrl: addressBarDialog.metaverseServerUrl;
|
|
labelText: 'RECENT SNAPS';
|
|
actions: 'snapshot';
|
|
filter: addressLine.text;
|
|
goFunction: goCard;
|
|
rpc: root.rpc;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Timer {
|
|
// Delay updating location text a bit to avoid flicker of content and so that connection status is valid.
|
|
id: updateLocationTextTimer
|
|
running: false
|
|
interval: 500 // ms
|
|
repeat: false
|
|
onTriggered: updateLocationText(false);
|
|
}
|
|
|
|
Timer {
|
|
// Delay clearing address line so as to avoid flicker of "not connected" being displayed after entering an address.
|
|
id: clearAddressLineTimer;
|
|
running: false;
|
|
interval: 100; // ms
|
|
repeat: false;
|
|
onTriggered: {
|
|
addressLine.text = "";
|
|
}
|
|
}
|
|
|
|
|
|
HifiControls.Keyboard {
|
|
id: keyboard
|
|
raised: parent.keyboardEnabled
|
|
numeric: parent.punctuationMode
|
|
anchors {
|
|
bottom: parent.bottom
|
|
left: parent.left
|
|
right: parent.right
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
function updateLocationText(enteringAddress) {
|
|
if (enteringAddress) {
|
|
notice.text = "Go To a place, @user, path, or network address:";
|
|
notice.color = hifiStyleConstants.colors.baseGrayHighlight;
|
|
} else {
|
|
notice.text = AddressManager.isConnected ? "YOUR LOCATION" : "NOT CONNECTED";
|
|
notice.color = AddressManager.isConnected ? hifiStyleConstants.colors.blueHighlight : hifiStyleConstants.colors.redHighlight;
|
|
// Display hostname, which includes ip address, localhost, and other non-placenames.
|
|
location.text = (AddressManager.placename || AddressManager.hostname || '') + (AddressManager.pathname ? AddressManager.pathname.match(/\/[^\/]+/)[0] : '');
|
|
}
|
|
}
|
|
|
|
function toggleOrGo(fromSuggestions, address) {
|
|
if (address !== undefined && address !== "") {
|
|
addressBarDialog.loadAddress(address, fromSuggestions);
|
|
clearAddressLineTimer.start();
|
|
} else if (addressLine.text !== "") {
|
|
addressBarDialog.loadAddress(addressLine.text, fromSuggestions);
|
|
clearAddressLineTimer.start();
|
|
}
|
|
DialogsManager.hideAddressBar();
|
|
}
|
|
}
|