Merge pull request #4557 from ZappoMan/avatarUI

first simple pass at using marketplace windows in preferences
This commit is contained in:
Stephen Birarda 2015-04-01 09:45:56 -07:00
commit 92c55f9cf0
5 changed files with 55 additions and 14 deletions

View file

@ -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;
} }

View file

@ -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();

View file

@ -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) {

View file

@ -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);

View file

@ -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);
}; };