mirror of
https://github.com/lubosz/overte.git
synced 2025-08-07 17:41:12 +02:00
Merge pull request #4557 from ZappoMan/avatarUI
first simple pass at using marketplace windows in preferences
This commit is contained in:
commit
92c55f9cf0
5 changed files with 55 additions and 14 deletions
|
@ -3737,22 +3737,27 @@ bool Application::askToSetAvatarUrl(const QString& url) {
|
||||||
_myAvatar->setFaceModelURL(url);
|
_myAvatar->setFaceModelURL(url);
|
||||||
UserActivityLogger::getInstance().changedModel("head", url);
|
UserActivityLogger::getInstance().changedModel("head", url);
|
||||||
_myAvatar->sendIdentityPacket();
|
_myAvatar->sendIdentityPacket();
|
||||||
|
emit faceURLChanged(url);
|
||||||
} else if (msgBox.clickedButton() == bodyButton) {
|
} else if (msgBox.clickedButton() == bodyButton) {
|
||||||
qDebug() << "Chose to use for body: " << url;
|
qDebug() << "Chose to use for body: " << url;
|
||||||
_myAvatar->setSkeletonModelURL(url);
|
_myAvatar->setSkeletonModelURL(url);
|
||||||
// if the head is empty, reset it to the default head.
|
// if the head is empty, reset it to the default head.
|
||||||
if (_myAvatar->getFaceModelURLString().isEmpty()) {
|
if (_myAvatar->getFaceModelURLString().isEmpty()) {
|
||||||
_myAvatar->setFaceModelURL(DEFAULT_HEAD_MODEL_URL);
|
_myAvatar->setFaceModelURL(DEFAULT_HEAD_MODEL_URL);
|
||||||
|
emit faceURLChanged(DEFAULT_HEAD_MODEL_URL.toString());
|
||||||
UserActivityLogger::getInstance().changedModel("head", DEFAULT_HEAD_MODEL_URL.toString());
|
UserActivityLogger::getInstance().changedModel("head", DEFAULT_HEAD_MODEL_URL.toString());
|
||||||
}
|
}
|
||||||
UserActivityLogger::getInstance().changedModel("skeleton", url);
|
UserActivityLogger::getInstance().changedModel("skeleton", url);
|
||||||
_myAvatar->sendIdentityPacket();
|
_myAvatar->sendIdentityPacket();
|
||||||
|
emit skeletonURLChanged(url);
|
||||||
} else if (msgBox.clickedButton() == bodyAndHeadButton) {
|
} else if (msgBox.clickedButton() == bodyAndHeadButton) {
|
||||||
qDebug() << "Chose to use for body + head: " << url;
|
qDebug() << "Chose to use for body + head: " << url;
|
||||||
_myAvatar->setFaceModelURL(QString());
|
_myAvatar->setFaceModelURL(QString());
|
||||||
_myAvatar->setSkeletonModelURL(url);
|
_myAvatar->setSkeletonModelURL(url);
|
||||||
UserActivityLogger::getInstance().changedModel("skeleton", url);
|
UserActivityLogger::getInstance().changedModel("skeleton", url);
|
||||||
_myAvatar->sendIdentityPacket();
|
_myAvatar->sendIdentityPacket();
|
||||||
|
emit faceURLChanged(QString());
|
||||||
|
emit skeletonURLChanged(url);
|
||||||
} else {
|
} else {
|
||||||
qDebug() << "Declined to use the avatar: " << url;
|
qDebug() << "Declined to use the avatar: " << url;
|
||||||
}
|
}
|
||||||
|
|
|
@ -336,6 +336,9 @@ signals:
|
||||||
void checkBackgroundDownloads();
|
void checkBackgroundDownloads();
|
||||||
void domainConnectionRefused(const QString& reason);
|
void domainConnectionRefused(const QString& reason);
|
||||||
|
|
||||||
|
void faceURLChanged(const QString& newValue);
|
||||||
|
void skeletonURLChanged(const QString& newValue);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void domainChanged(const QString& domainHostname);
|
void domainChanged(const QString& domainHostname);
|
||||||
void updateWindowTitle();
|
void updateWindowTitle();
|
||||||
|
|
|
@ -54,6 +54,7 @@ WebWindowClass::WebWindowClass(const QString& title, const QString& url, int wid
|
||||||
|
|
||||||
_windowWidget = dockWidget;
|
_windowWidget = dockWidget;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
_windowWidget = new QWidget(Application::getInstance()->getWindow(), Qt::Window);
|
_windowWidget = new QWidget(Application::getInstance()->getWindow(), Qt::Window);
|
||||||
_windowWidget->setWindowTitle(title);
|
_windowWidget->setWindowTitle(title);
|
||||||
_windowWidget->setMinimumSize(width, height);
|
_windowWidget->setMinimumSize(width, height);
|
||||||
|
@ -89,24 +90,24 @@ void WebWindowClass::setVisible(bool visible) {
|
||||||
if (visible) {
|
if (visible) {
|
||||||
if (_isToolWindow) {
|
if (_isToolWindow) {
|
||||||
QMetaObject::invokeMethod(
|
QMetaObject::invokeMethod(
|
||||||
Application::getInstance()->getToolWindow(), "setVisible", Qt::BlockingQueuedConnection, Q_ARG(bool, visible));
|
Application::getInstance()->getToolWindow(), "setVisible", Qt::AutoConnection, Q_ARG(bool, visible));
|
||||||
} else {
|
} else {
|
||||||
QMetaObject::invokeMethod(_windowWidget, "raise", Qt::BlockingQueuedConnection);
|
QMetaObject::invokeMethod(_windowWidget, "raise", Qt::AutoConnection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
QMetaObject::invokeMethod(_windowWidget, "setVisible", Qt::BlockingQueuedConnection, Q_ARG(bool, visible));
|
QMetaObject::invokeMethod(_windowWidget, "setVisible", Qt::AutoConnection, Q_ARG(bool, visible));
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebWindowClass::setURL(const QString& url) {
|
void WebWindowClass::setURL(const QString& url) {
|
||||||
if (QThread::currentThread() != thread()) {
|
if (QThread::currentThread() != thread()) {
|
||||||
QMetaObject::invokeMethod(this, "setURL", Qt::BlockingQueuedConnection, Q_ARG(QString, url));
|
QMetaObject::invokeMethod(this, "setURL", Qt::AutoConnection, Q_ARG(QString, url));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_webView->setUrl(url);
|
_webView->setUrl(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebWindowClass::raise() {
|
void WebWindowClass::raise() {
|
||||||
QMetaObject::invokeMethod(_windowWidget, "raise", Qt::BlockingQueuedConnection);
|
QMetaObject::invokeMethod(_windowWidget, "raise", Qt::AutoConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
QScriptValue WebWindowClass::constructor(QScriptContext* context, QScriptEngine* engine) {
|
QScriptValue WebWindowClass::constructor(QScriptContext* context, QScriptEngine* engine) {
|
||||||
|
|
|
@ -16,17 +16,18 @@
|
||||||
#include <avatar/AvatarManager.h>
|
#include <avatar/AvatarManager.h>
|
||||||
#include <devices/Faceshift.h>
|
#include <devices/Faceshift.h>
|
||||||
#include <devices/SixenseManager.h>
|
#include <devices/SixenseManager.h>
|
||||||
|
#include <NetworkingConstants.h>
|
||||||
|
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
#include "MainWindow.h"
|
#include "MainWindow.h"
|
||||||
#include "LODManager.h"
|
#include "LODManager.h"
|
||||||
#include "Menu.h"
|
#include "Menu.h"
|
||||||
#include "ModelsBrowser.h"
|
|
||||||
#include "PreferencesDialog.h"
|
#include "PreferencesDialog.h"
|
||||||
#include "Snapshot.h"
|
#include "Snapshot.h"
|
||||||
#include "UserActivityLogger.h"
|
#include "UserActivityLogger.h"
|
||||||
#include "UIUtil.h"
|
#include "UIUtil.h"
|
||||||
|
|
||||||
|
|
||||||
const int PREFERENCES_HEIGHT_PADDING = 20;
|
const int PREFERENCES_HEIGHT_PADDING = 20;
|
||||||
|
|
||||||
PreferencesDialog::PreferencesDialog(QWidget* parent) :
|
PreferencesDialog::PreferencesDialog(QWidget* parent) :
|
||||||
|
@ -46,6 +47,11 @@ PreferencesDialog::PreferencesDialog(QWidget* parent) :
|
||||||
connect(ui.buttonBrowseScriptsLocation, &QPushButton::clicked, this, &PreferencesDialog::openScriptsLocationBrowser);
|
connect(ui.buttonBrowseScriptsLocation, &QPushButton::clicked, this, &PreferencesDialog::openScriptsLocationBrowser);
|
||||||
connect(ui.buttonReloadDefaultScripts, &QPushButton::clicked,
|
connect(ui.buttonReloadDefaultScripts, &QPushButton::clicked,
|
||||||
Application::getInstance(), &Application::loadDefaultScripts);
|
Application::getInstance(), &Application::loadDefaultScripts);
|
||||||
|
|
||||||
|
|
||||||
|
connect(Application::getInstance(), &Application::faceURLChanged, this, &PreferencesDialog::faceURLChanged);
|
||||||
|
connect(Application::getInstance(), &Application::skeletonURLChanged, this, &PreferencesDialog::skeletonURLChanged);
|
||||||
|
|
||||||
// move dialog to left side
|
// move dialog to left side
|
||||||
move(parentWidget()->geometry().topLeft());
|
move(parentWidget()->geometry().topLeft());
|
||||||
setFixedHeight(parentWidget()->size().height() - PREFERENCES_HEIGHT_PADDING);
|
setFixedHeight(parentWidget()->size().height() - PREFERENCES_HEIGHT_PADDING);
|
||||||
|
@ -53,9 +59,19 @@ PreferencesDialog::PreferencesDialog(QWidget* parent) :
|
||||||
UIUtil::scaleWidgetFontSizes(this);
|
UIUtil::scaleWidgetFontSizes(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PreferencesDialog::faceURLChanged(const QString& newValue) {
|
||||||
|
ui.faceURLEdit->setText(newValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreferencesDialog::skeletonURLChanged(const QString& newValue) {
|
||||||
|
ui.skeletonURLEdit->setText(newValue);
|
||||||
|
}
|
||||||
|
|
||||||
void PreferencesDialog::accept() {
|
void PreferencesDialog::accept() {
|
||||||
savePreferences();
|
savePreferences();
|
||||||
close();
|
close();
|
||||||
|
delete _marketplaceWindow;
|
||||||
|
_marketplaceWindow = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PreferencesDialog::setHeadUrl(QString modelUrl) {
|
void PreferencesDialog::setHeadUrl(QString modelUrl) {
|
||||||
|
@ -67,15 +83,23 @@ void PreferencesDialog::setSkeletonUrl(QString modelUrl) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PreferencesDialog::openHeadModelBrowser() {
|
void PreferencesDialog::openHeadModelBrowser() {
|
||||||
ModelsBrowser modelBrowser(FSTReader::HEAD_MODEL);
|
auto MARKETPLACE_URL = NetworkingConstants::METAVERSE_SERVER_URL.toString() + "/marketplace?category=avatars";
|
||||||
connect(&modelBrowser, &ModelsBrowser::selected, this, &PreferencesDialog::setHeadUrl);
|
auto WIDTH = 900;
|
||||||
modelBrowser.browse();
|
auto HEIGHT = 700;
|
||||||
|
if (!_marketplaceWindow) {
|
||||||
|
_marketplaceWindow = new WebWindowClass("Marketplace", MARKETPLACE_URL, WIDTH, HEIGHT, false);
|
||||||
|
}
|
||||||
|
_marketplaceWindow->setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PreferencesDialog::openBodyModelBrowser() {
|
void PreferencesDialog::openBodyModelBrowser() {
|
||||||
ModelsBrowser modelBrowser(FSTReader::HEAD_AND_BODY_MODEL);
|
auto MARKETPLACE_URL = NetworkingConstants::METAVERSE_SERVER_URL.toString() + "/marketplace?category=avatars";
|
||||||
connect(&modelBrowser, &ModelsBrowser::selected, this, &PreferencesDialog::setSkeletonUrl);
|
auto WIDTH = 900;
|
||||||
modelBrowser.browse();
|
auto HEIGHT = 700;
|
||||||
|
if (!_marketplaceWindow) {
|
||||||
|
_marketplaceWindow = new WebWindowClass("Marketplace", MARKETPLACE_URL, WIDTH, HEIGHT, false);
|
||||||
|
}
|
||||||
|
_marketplaceWindow->setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PreferencesDialog::openSnapshotLocationBrowser() {
|
void PreferencesDialog::openSnapshotLocationBrowser() {
|
||||||
|
@ -192,11 +216,13 @@ void PreferencesDialog::savePreferences() {
|
||||||
UserActivityLogger::getInstance().changedDisplayName(displayNameStr);
|
UserActivityLogger::getInstance().changedDisplayName(displayNameStr);
|
||||||
shouldDispatchIdentityPacket = true;
|
shouldDispatchIdentityPacket = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto AVATAR_FILE_EXTENSION = ".fst";
|
||||||
|
|
||||||
QUrl faceModelURL(ui.faceURLEdit->text());
|
QUrl faceModelURL(ui.faceURLEdit->text());
|
||||||
QString faceModelURLString = faceModelURL.toString();
|
QString faceModelURLString = faceModelURL.toString();
|
||||||
if (faceModelURLString != _faceURLString) {
|
if (faceModelURLString != _faceURLString) {
|
||||||
if (faceModelURLString.isEmpty() || faceModelURLString.toLower().endsWith(".fst")) {
|
if (faceModelURLString.isEmpty() || faceModelURLString.toLower().contains(AVATAR_FILE_EXTENSION)) {
|
||||||
// change the faceModelURL in the profile, it will also update this user's BlendFace
|
// change the faceModelURL in the profile, it will also update this user's BlendFace
|
||||||
myAvatar->setFaceModelURL(faceModelURL);
|
myAvatar->setFaceModelURL(faceModelURL);
|
||||||
UserActivityLogger::getInstance().changedModel("head", faceModelURLString);
|
UserActivityLogger::getInstance().changedModel("head", faceModelURLString);
|
||||||
|
@ -209,7 +235,7 @@ void PreferencesDialog::savePreferences() {
|
||||||
QUrl skeletonModelURL(ui.skeletonURLEdit->text());
|
QUrl skeletonModelURL(ui.skeletonURLEdit->text());
|
||||||
QString skeletonModelURLString = skeletonModelURL.toString();
|
QString skeletonModelURLString = skeletonModelURL.toString();
|
||||||
if (skeletonModelURLString != _skeletonURLString) {
|
if (skeletonModelURLString != _skeletonURLString) {
|
||||||
if (skeletonModelURLString.isEmpty() || skeletonModelURLString.toLower().endsWith(".fst")) {
|
if (skeletonModelURLString.isEmpty() || skeletonModelURLString.toLower().contains(AVATAR_FILE_EXTENSION)) {
|
||||||
// change the skeletonModelURL in the profile, it will also update this user's Body
|
// change the skeletonModelURL in the profile, it will also update this user's Body
|
||||||
myAvatar->setSkeletonModelURL(skeletonModelURL);
|
myAvatar->setSkeletonModelURL(skeletonModelURL);
|
||||||
UserActivityLogger::getInstance().changedModel("skeleton", skeletonModelURLString);
|
UserActivityLogger::getInstance().changedModel("skeleton", skeletonModelURLString);
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
|
#include "scripting/WebWindowClass.h"
|
||||||
|
|
||||||
class PreferencesDialog : public QDialog {
|
class PreferencesDialog : public QDialog {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
|
@ -36,6 +38,8 @@ private:
|
||||||
QString _faceURLString;
|
QString _faceURLString;
|
||||||
QString _skeletonURLString;
|
QString _skeletonURLString;
|
||||||
QString _displayNameString;
|
QString _displayNameString;
|
||||||
|
|
||||||
|
WebWindowClass* _marketplaceWindow = NULL;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void accept();
|
void accept();
|
||||||
|
@ -43,6 +47,8 @@ private slots:
|
||||||
void setSkeletonUrl(QString modelUrl);
|
void setSkeletonUrl(QString modelUrl);
|
||||||
void openSnapshotLocationBrowser();
|
void openSnapshotLocationBrowser();
|
||||||
void openScriptsLocationBrowser();
|
void openScriptsLocationBrowser();
|
||||||
|
void faceURLChanged(const QString& newValue);
|
||||||
|
void skeletonURLChanged(const QString& newValue);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue