mirror of
https://github.com/overte-org/overte.git
synced 2025-08-07 02:04:26 +02:00
Fix issues; checkpoint on new ComboDialog
This commit is contained in:
parent
0f90ba49ba
commit
6a4c2c5e12
4 changed files with 209 additions and 14 deletions
Binary file not shown.
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 87 KiB |
154
interface/resources/qml/hifi/ComboDialog.qml
Normal file
154
interface/resources/qml/hifi/ComboDialog.qml
Normal file
|
@ -0,0 +1,154 @@
|
||||||
|
//
|
||||||
|
// ComboDialog.qml
|
||||||
|
// qml/hifi
|
||||||
|
//
|
||||||
|
// Created by Zach Fox on 3/31/2017
|
||||||
|
// Copyright 2017 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.5
|
||||||
|
import QtQuick.Controls 1.4
|
||||||
|
import "../styles-uit"
|
||||||
|
|
||||||
|
Item {
|
||||||
|
property var dialogTitleText;
|
||||||
|
property var optionTitleText;
|
||||||
|
property var optionBodyText;
|
||||||
|
property var optionValues;
|
||||||
|
property var selectedOptionIndex;
|
||||||
|
property int dialogWidth;
|
||||||
|
property int dialogHeight;
|
||||||
|
property int comboOptionTextSize: 18;
|
||||||
|
FontLoader { id: ralewayRegular; source: "../../fonts/Raleway-Regular.ttf"; }
|
||||||
|
FontLoader { id: ralewaySemiBold; source: "../../fonts/Raleway-SemiBold.ttf"; }
|
||||||
|
visible: false;
|
||||||
|
id: combo;
|
||||||
|
anchors.fill: parent;
|
||||||
|
onVisibleChanged: {
|
||||||
|
populateComboListViewModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: dialogBackground;
|
||||||
|
anchors.fill: parent;
|
||||||
|
color: "black";
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: dialogContainer;
|
||||||
|
color: "white";
|
||||||
|
anchors.centerIn: dialogBackground;
|
||||||
|
width: dialogWidth;
|
||||||
|
height: dialogHeight;
|
||||||
|
|
||||||
|
RalewayRegular {
|
||||||
|
id: dialogTitle;
|
||||||
|
text: dialogTitleText;
|
||||||
|
anchors.top: parent.top;
|
||||||
|
anchors.topMargin: 20;
|
||||||
|
anchors.left: parent.left;
|
||||||
|
anchors.leftMargin: 20;
|
||||||
|
size: 24;
|
||||||
|
color: 'black';
|
||||||
|
horizontalAlignment: Text.AlignLeft;
|
||||||
|
verticalAlignment: Text.AlignTop;
|
||||||
|
}
|
||||||
|
|
||||||
|
ListModel {
|
||||||
|
id: comboListViewModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
ListView {
|
||||||
|
id: comboListView;
|
||||||
|
anchors.top: dialogTitle.bottom;
|
||||||
|
anchors.topMargin: 20;
|
||||||
|
anchors.bottom: parent.bottom;
|
||||||
|
anchors.left: parent.left;
|
||||||
|
anchors.right: parent.right;
|
||||||
|
model: comboListViewModel;
|
||||||
|
delegate: comboListViewDelegate;
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: comboListViewDelegate;
|
||||||
|
Rectangle {
|
||||||
|
id: comboListViewItemContainer;
|
||||||
|
// Size
|
||||||
|
height: childrenRect.height + 10;
|
||||||
|
width: dialogContainer.width;
|
||||||
|
color: selectedOptionIndex === index ? '#cee6ff' : 'white';
|
||||||
|
Rectangle {
|
||||||
|
id: comboOptionSelected;
|
||||||
|
visible: selectedOptionIndex === index ? true : false;
|
||||||
|
color: hifi.colors.blueAccent;
|
||||||
|
anchors.left: parent.left;
|
||||||
|
anchors.leftMargin: 20;
|
||||||
|
anchors.top: parent.top;
|
||||||
|
anchors.topMargin: 20;
|
||||||
|
width: 25;
|
||||||
|
height: width;
|
||||||
|
radius: width;
|
||||||
|
border.width: 3;
|
||||||
|
border.color: hifi.colors.blueHighlight;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
RalewaySemiBold {
|
||||||
|
id: optionTitle;
|
||||||
|
text: titleText;
|
||||||
|
anchors.top: parent.top;
|
||||||
|
anchors.left: comboOptionSelected.right;
|
||||||
|
anchors.leftMargin: 20;
|
||||||
|
anchors.right: parent.right;
|
||||||
|
height: 30;
|
||||||
|
size: comboOptionTextSize;
|
||||||
|
wrapMode: Text.WordWrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
RalewayRegular {
|
||||||
|
id: optionBody;
|
||||||
|
text: bodyText;
|
||||||
|
anchors.top: optionTitle.bottom;
|
||||||
|
anchors.bottom: parent.bottom;
|
||||||
|
anchors.left: comboOptionSelected.right;
|
||||||
|
anchors.leftMargin: 25;
|
||||||
|
anchors.right: parent.right;
|
||||||
|
size: comboOptionTextSize;
|
||||||
|
wrapMode: Text.WordWrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
acceptedButtons: Qt.LeftButton
|
||||||
|
hoverEnabled: true;
|
||||||
|
onEntered: comboListViewItemContainer.color = hifi.colors.blueHighlight
|
||||||
|
onExited: comboListViewItemContainer.color = selectedOptionIndex === index ? '#cee6ff' : 'white';
|
||||||
|
onClicked: {
|
||||||
|
GlobalServices.findableBy = optionValue;
|
||||||
|
UserActivityLogger.palAction("set_availability", optionValue);
|
||||||
|
print('Setting availability:', optionValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
acceptedButtons: Qt.LeftButton
|
||||||
|
onClicked: {
|
||||||
|
combo.visible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function populateComboListViewModel() {
|
||||||
|
comboListViewModel.clear();
|
||||||
|
optionTitleText.forEach(function(titleText, index) {
|
||||||
|
comboListViewModel.insert(index, {"titleText": titleText, "bodyText": optionBodyText[index], "optionValue": optionValues[index]});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -49,10 +49,16 @@ Rectangle {
|
||||||
|
|
||||||
// The letterbox used for popup messages
|
// The letterbox used for popup messages
|
||||||
LetterboxMessage {
|
LetterboxMessage {
|
||||||
|
|
||||||
id: letterboxMessage;
|
id: letterboxMessage;
|
||||||
z: 999; // Force the popup on top of everything else
|
z: 999; // Force the popup on top of everything else
|
||||||
}
|
}
|
||||||
|
// The ComboDialog used for setting availability
|
||||||
|
ComboDialog {
|
||||||
|
id: comboDialog;
|
||||||
|
z: 999; // Force the ComboDialog on top of everything else
|
||||||
|
dialogWidth: parent.width - 100;
|
||||||
|
dialogHeight: parent.height - 100;
|
||||||
|
}
|
||||||
function letterbox(headerGlyph, headerText, message) {
|
function letterbox(headerGlyph, headerText, message) {
|
||||||
letterboxMessage.headerGlyph = headerGlyph;
|
letterboxMessage.headerGlyph = headerGlyph;
|
||||||
letterboxMessage.headerText = headerText;
|
letterboxMessage.headerText = headerText;
|
||||||
|
@ -60,6 +66,15 @@ Rectangle {
|
||||||
letterboxMessage.visible = true;
|
letterboxMessage.visible = true;
|
||||||
letterboxMessage.popupRadius = 0;
|
letterboxMessage.popupRadius = 0;
|
||||||
}
|
}
|
||||||
|
function popupComboDialog(dialogTitleText, optionTitleText, optionBodyText, optionValues) {
|
||||||
|
comboDialog.dialogTitleText = dialogTitleText;
|
||||||
|
comboDialog.optionTitleText = optionTitleText;
|
||||||
|
comboDialog.optionBodyText = optionBodyText;
|
||||||
|
comboDialog.optionValues = optionValues;
|
||||||
|
comboDialog.selectedOptionIndex = ['all', 'connections', 'friends', 'none'].indexOf(GlobalServices.findableBy);
|
||||||
|
comboDialog.populateComboListViewModel();
|
||||||
|
comboDialog.visible = true;
|
||||||
|
}
|
||||||
Settings {
|
Settings {
|
||||||
id: settings;
|
id: settings;
|
||||||
category: "pal";
|
category: "pal";
|
||||||
|
@ -241,7 +256,7 @@ Rectangle {
|
||||||
// "CONNECTIONS" text
|
// "CONNECTIONS" text
|
||||||
RalewaySemiBold {
|
RalewaySemiBold {
|
||||||
id: connectionsTabSelectorText;
|
id: connectionsTabSelectorText;
|
||||||
text: "CONNECTIONS";
|
text: "PEOPLE";
|
||||||
// Text size
|
// Text size
|
||||||
size: hifi.fontSizes.tabularData;
|
size: hifi.fontSizes.tabularData;
|
||||||
// Anchors
|
// Anchors
|
||||||
|
@ -266,7 +281,7 @@ Rectangle {
|
||||||
anchors.left: connectionsTabSelectorTextContainer.left;
|
anchors.left: connectionsTabSelectorTextContainer.left;
|
||||||
anchors.top: connectionsTabSelectorTextContainer.top;
|
anchors.top: connectionsTabSelectorTextContainer.top;
|
||||||
anchors.topMargin: 1;
|
anchors.topMargin: 1;
|
||||||
anchors.leftMargin: connectionsTabSelectorTextMetrics.width + 42;
|
anchors.leftMargin: connectionsTabSelectorTextMetrics.width + 25;
|
||||||
RalewayRegular {
|
RalewayRegular {
|
||||||
id: connectionsHelpText;
|
id: connectionsHelpText;
|
||||||
text: "[?]";
|
text: "[?]";
|
||||||
|
@ -350,6 +365,7 @@ Rectangle {
|
||||||
// This TableView refers to the Nearby Table (on the "Nearby" tab below the current user's NameCard)
|
// This TableView refers to the Nearby Table (on the "Nearby" tab below the current user's NameCard)
|
||||||
HifiControlsUit.Table {
|
HifiControlsUit.Table {
|
||||||
id: nearbyTable;
|
id: nearbyTable;
|
||||||
|
flickableItem.interactive: true;
|
||||||
// Anchors
|
// Anchors
|
||||||
anchors.fill: parent;
|
anchors.fill: parent;
|
||||||
// Properties
|
// Properties
|
||||||
|
@ -653,7 +669,9 @@ Rectangle {
|
||||||
source: "../../icons/profilePicLoading.gif"
|
source: "../../icons/profilePicLoading.gif"
|
||||||
width: 120;
|
width: 120;
|
||||||
height: width;
|
height: width;
|
||||||
anchors.centerIn: parent;
|
anchors.top: parent.top;
|
||||||
|
anchors.topMargin: 185;
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter;
|
||||||
visible: true;
|
visible: true;
|
||||||
onVisibleChanged: {
|
onVisibleChanged: {
|
||||||
if (visible) {
|
if (visible) {
|
||||||
|
@ -689,6 +707,7 @@ Rectangle {
|
||||||
// This TableView refers to the Connections Table (on the "Connections" tab below the current user's NameCard)
|
// This TableView refers to the Connections Table (on the "Connections" tab below the current user's NameCard)
|
||||||
HifiControlsUit.Table {
|
HifiControlsUit.Table {
|
||||||
id: connectionsTable;
|
id: connectionsTable;
|
||||||
|
flickableItem.interactive: true;
|
||||||
visible: !connectionsLoading.visible;
|
visible: !connectionsLoading.visible;
|
||||||
// Anchors
|
// Anchors
|
||||||
anchors.fill: parent;
|
anchors.fill: parent;
|
||||||
|
@ -943,6 +962,28 @@ Rectangle {
|
||||||
horizontalAlignment: Text.AlignHCenter;
|
horizontalAlignment: Text.AlignHCenter;
|
||||||
verticalAlignment: Text.AlignTop;
|
verticalAlignment: Text.AlignTop;
|
||||||
}
|
}
|
||||||
|
/*Rectangle {
|
||||||
|
id: availabilityComboBox;
|
||||||
|
// Anchors
|
||||||
|
anchors.top: parent.top;
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter;
|
||||||
|
// Size
|
||||||
|
width: parent.width;
|
||||||
|
height: 40;
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
onClicked: {
|
||||||
|
popupComboDialog("Set your list visibility",
|
||||||
|
["Everyone", "Friends and Connections", "Friends Only", "Appear Offline"],
|
||||||
|
["You will be invisible in everyone's 'People' list.\nAnyone will be able to jump to your location if the domain allows.",
|
||||||
|
"You will be visible in the 'People' list only for those with whom you are connected or friends.\nThey will be able to jump to your location if the domain allows.",
|
||||||
|
"You will be visible in the 'People' list only for those with whom you are friends.\nThey will be able to jump to your location if the domain allows.",
|
||||||
|
"You will not be visible in the 'People' list of any other users."],
|
||||||
|
["all", "connections", "friends", "none"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
HifiControlsUit.ComboBox {
|
HifiControlsUit.ComboBox {
|
||||||
function determineAvailabilityIndex() {
|
function determineAvailabilityIndex() {
|
||||||
return ['all', 'connections', 'friends', 'none'].indexOf(GlobalServices.findableBy)
|
return ['all', 'connections', 'friends', 'none'].indexOf(GlobalServices.findableBy)
|
||||||
|
@ -1219,12 +1260,12 @@ Rectangle {
|
||||||
break;
|
break;
|
||||||
// Received an "updateUsername()" request from the JS
|
// Received an "updateUsername()" request from the JS
|
||||||
case 'updateUsername':
|
case 'updateUsername':
|
||||||
// The User ID (UUID) is the first parameter in the message.
|
// Get the connection status
|
||||||
var userId = message.params.sessionId;
|
var connectionStatus = message.params.connection;
|
||||||
// If the userId is empty, we're probably updating "myData".
|
// If the connection status isn't "self"...
|
||||||
if (userId) {
|
if (connectionStatus !== "self") {
|
||||||
// Get the index in nearbyUserModel and nearbyUserModelData associated with the passed UUID
|
// Get the index in nearbyUserModel and nearbyUserModelData associated with the passed UUID
|
||||||
var userIndex = findNearbySessionIndex(userId);
|
var userIndex = findNearbySessionIndex(message.params.sessionId);
|
||||||
if (userIndex !== -1) {
|
if (userIndex !== -1) {
|
||||||
['userName', 'admin', 'connection', 'profileUrl', 'placeName'].forEach(function (name) {
|
['userName', 'admin', 'connection', 'profileUrl', 'placeName'].forEach(function (name) {
|
||||||
var value = message.params[name];
|
var value = message.params[name];
|
||||||
|
@ -1235,7 +1276,6 @@ Rectangle {
|
||||||
nearbyUserModelData[userIndex][name] = value; // for refill after sort
|
nearbyUserModelData[userIndex][name] = value; // for refill after sort
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// In this "else if" case, the only param of the message is the profile pic URL.
|
|
||||||
} else if (message.params.profileUrl) {
|
} else if (message.params.profileUrl) {
|
||||||
myData.profileUrl = message.params.profileUrl;
|
myData.profileUrl = message.params.profileUrl;
|
||||||
myCard.profileUrl = message.params.profileUrl;
|
myCard.profileUrl = message.params.profileUrl;
|
||||||
|
|
|
@ -361,8 +361,12 @@ function getAvailableConnections(domain, callback) { // callback([{usename, loca
|
||||||
|
|
||||||
function getConnectionData(domain) { // Update all the usernames that I am entitled to see, using my login but not dependent on canKick.
|
function getConnectionData(domain) { // Update all the usernames that I am entitled to see, using my login but not dependent on canKick.
|
||||||
function frob(user) { // get into the right format
|
function frob(user) { // get into the right format
|
||||||
|
var formattedSessionId = user.location.node_id || '';
|
||||||
|
if (formattedSessionId !== '' && formattedSessionId.indexOf("{") != 0) {
|
||||||
|
formattedSessionId = "{" + formattedSessionId + "}";
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
sessionId: user.location.node_id || '',
|
sessionId: formattedSessionId,
|
||||||
userName: user.username,
|
userName: user.username,
|
||||||
connection: user.connection,
|
connection: user.connection,
|
||||||
profileUrl: user.profileUrl,
|
profileUrl: user.profileUrl,
|
||||||
|
@ -450,9 +454,6 @@ function populateNearbyUserList(selectData, oldAudioData) {
|
||||||
} else {
|
} else {
|
||||||
// Return our username from the Account API
|
// Return our username from the Account API
|
||||||
avatarPalDatum.userName = Account.username;
|
avatarPalDatum.userName = Account.username;
|
||||||
getProfilePicture(avatarPalDatum.userName, function (url) {
|
|
||||||
sendToQml({ method: 'updateUsername', params: { profileUrl: url } });
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
data.push(avatarPalDatum);
|
data.push(avatarPalDatum);
|
||||||
print('PAL data:', JSON.stringify(avatarPalDatum));
|
print('PAL data:', JSON.stringify(avatarPalDatum));
|
||||||
|
|
Loading…
Reference in a new issue