From 5f73b76be755175c766e709e6965fe4e4b651b6e Mon Sep 17 00:00:00 2001 From: stojce Date: Sun, 2 Mar 2014 14:36:01 +0100 Subject: [PATCH 01/23] Share dialog --- interface/src/ui/Snapshot.cpp | 3 + interface/src/ui/SnapshotShareDialog.cpp | 13 ++++ interface/src/ui/SnapshotShareDialog.h | 14 ++++ interface/ui/shareSnapshot.ui | 99 ++++++++++++++++++++++++ snapshotShareDialog.cpp | 9 +++ snapshotShareDialog.h | 14 ++++ 6 files changed, 152 insertions(+) create mode 100644 interface/src/ui/SnapshotShareDialog.cpp create mode 100644 interface/src/ui/SnapshotShareDialog.h create mode 100644 interface/ui/shareSnapshot.ui create mode 100644 snapshotShareDialog.cpp create mode 100644 snapshotShareDialog.h diff --git a/interface/src/ui/Snapshot.cpp b/interface/src/ui/Snapshot.cpp index f0fef33cee..89b0d56a0b 100644 --- a/interface/src/ui/Snapshot.cpp +++ b/interface/src/ui/Snapshot.cpp @@ -9,6 +9,7 @@ #include "Snapshot.h" #include +#include #include #include @@ -41,6 +42,8 @@ void Snapshot::saveSnapshot(QGLWidget* widget, QString username, glm::vec3 locat QString fileName = FileUtils::standardPath(SNAPSHOTS_DIRECTORY); fileName.append(QString(FILENAME_PATH_FORMAT.arg(username, now.toString(DATETIME_FORMAT), formattedLocation))); shot.save(fileName, 0, 100); + + } diff --git a/interface/src/ui/SnapshotShareDialog.cpp b/interface/src/ui/SnapshotShareDialog.cpp new file mode 100644 index 0000000000..76556e0222 --- /dev/null +++ b/interface/src/ui/SnapshotShareDialog.cpp @@ -0,0 +1,13 @@ +// +// snapshotShareDialog.cpp +// hifi +// +// Created by Stojce Slavkovski on 2/16/14. +// +// + +#include "snapshotShareDialog.h" + +#include "ui_shareSnapshot.h" + + diff --git a/interface/src/ui/SnapshotShareDialog.h b/interface/src/ui/SnapshotShareDialog.h new file mode 100644 index 0000000000..77e92216fd --- /dev/null +++ b/interface/src/ui/SnapshotShareDialog.h @@ -0,0 +1,14 @@ +// +// snapshotShareDialog.h +// hifi +// +// Created by Stojce Slavkovski on 2/16/14. +// +// + +#ifndef __hifi__snapshotShareDialog__ +#define __hifi__snapshotShareDialog__ + +#include + +#endif /* defined(__hifi__snapshotShareDialog__) */ diff --git a/interface/ui/shareSnapshot.ui b/interface/ui/shareSnapshot.ui new file mode 100644 index 0000000000..94c1b4220e --- /dev/null +++ b/interface/ui/shareSnapshot.ui @@ -0,0 +1,99 @@ + + + Dialog + + + Qt::NonModal + + + + 0 + 0 + 808 + 577 + + + + PointingHandCursor + + + Share with community + + + background-color: rgb(255, 255, 255); + + + + + -1 + -1 + 681 + 511 + + + + + + + + 0 + 0 + + + + background-color: #000; + + + + + + + + 0 + 0 + + + + Notes about this image + + + + + + + + + + 0 + 0 + + + + + + + + background-color: #333333; + border-width: 0; + border-radius: 9px; + border-radius: 9px; + font-family: Arial; + font-size: 18px; + font-weight: 100; + color: #FFFFFF; + width: 120px; + height: 50px; + + + Share + + + + + + + + + + + diff --git a/snapshotShareDialog.cpp b/snapshotShareDialog.cpp new file mode 100644 index 0000000000..53a445292f --- /dev/null +++ b/snapshotShareDialog.cpp @@ -0,0 +1,9 @@ +// +// snapshotShareDialog.cpp +// hifi +// +// Created by Stojce Slavkovski on 2/16/14. +// +// + +#include "snapshotShareDialog.h" diff --git a/snapshotShareDialog.h b/snapshotShareDialog.h new file mode 100644 index 0000000000..77e92216fd --- /dev/null +++ b/snapshotShareDialog.h @@ -0,0 +1,14 @@ +// +// snapshotShareDialog.h +// hifi +// +// Created by Stojce Slavkovski on 2/16/14. +// +// + +#ifndef __hifi__snapshotShareDialog__ +#define __hifi__snapshotShareDialog__ + +#include + +#endif /* defined(__hifi__snapshotShareDialog__) */ From e2eb34b6c997bb428004a56f12930b80d7d6645a Mon Sep 17 00:00:00 2001 From: stojce Date: Sun, 23 Mar 2014 07:03:20 +0100 Subject: [PATCH 02/23] Layout setup image ratio fixed image centre position --- interface/interface_en.ts | 33 +++- interface/src/Application.cpp | 7 +- interface/src/Application.h | 2 + interface/src/ui/Snapshot.cpp | 5 +- interface/src/ui/Snapshot.h | 2 +- interface/src/ui/SnapshotShareDialog.cpp | 23 ++- interface/src/ui/SnapshotShareDialog.h | 15 +- interface/ui/shareSnapshot.ui | 187 +++++++++++++++++++++-- 8 files changed, 247 insertions(+), 27 deletions(-) diff --git a/interface/interface_en.ts b/interface/interface_en.ts index 34e3614716..f8de770fca 100644 --- a/interface/interface_en.ts +++ b/interface/interface_en.ts @@ -14,12 +14,12 @@ - + Open Script - + JavaScript Files (*.js) @@ -113,18 +113,18 @@ Menu - + Open .ini config file - - + + Text files (*.ini) - + Save .ini config file @@ -158,4 +158,25 @@ + + SnapshotShareDialog + + + + Share with community + + + + + + Notes about this image + + + + + + Share + + + diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 9563cbf3b4..e819422d46 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3671,5 +3671,10 @@ void Application::takeSnapshot() { player->setMedia(QUrl::fromLocalFile(inf.absoluteFilePath())); player->play(); - Snapshot::saveSnapshot(_glWidget, _myAvatar); + QString fileName = Snapshot::saveSnapshot(_glWidget, _myAvatar); + + if (!_snapshotShareDialog) { + _snapshotShareDialog = new SnapshotShareDialog(fileName, _glWidget); + } + _snapshotShareDialog->exec(); } diff --git a/interface/src/Application.h b/interface/src/Application.h index 28060113a9..bc401c7de5 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -66,6 +66,7 @@ #include "ui/BandwidthDialog.h" #include "ui/OctreeStatsDialog.h" #include "ui/RearMirrorTools.h" +#include "ui/SnapshotShareDialog.h" #include "ui/LodToolsDialog.h" #include "ui/LogDialog.h" #include "ui/UpdateDialog.h" @@ -473,6 +474,7 @@ private: std::vector _voxelFades; ControllerScriptingInterface _controllerScriptingInterface; QPointer _logDialog; + QPointer _snapshotShareDialog; FileLogger* _logger; diff --git a/interface/src/ui/Snapshot.cpp b/interface/src/ui/Snapshot.cpp index 998aef82e4..90a226c594 100644 --- a/interface/src/ui/Snapshot.cpp +++ b/interface/src/ui/Snapshot.cpp @@ -11,7 +11,6 @@ #include #include -#include #include "Snapshot.h" @@ -61,7 +60,7 @@ SnapshotMetaData* Snapshot::parseSnapshotData(QString snapshotPath) { return data; } -void Snapshot::saveSnapshot(QGLWidget* widget, Avatar* avatar) { +QString Snapshot::saveSnapshot(QGLWidget* widget, Avatar* avatar) { QImage shot = widget->grabFrameBuffer(); glm::vec3 location = avatar->getPosition(); @@ -93,7 +92,7 @@ void Snapshot::saveSnapshot(QGLWidget* widget, Avatar* avatar) { fileName.append(QString(FILENAME_PATH_FORMAT.arg(username, now.toString(DATETIME_FORMAT), formattedLocation))); shot.save(fileName, 0, 100); - + return fileName; } diff --git a/interface/src/ui/Snapshot.h b/interface/src/ui/Snapshot.h index 1b78e8328e..83cfe5bc85 100644 --- a/interface/src/ui/Snapshot.h +++ b/interface/src/ui/Snapshot.h @@ -38,7 +38,7 @@ private: class Snapshot { public: - static void saveSnapshot(QGLWidget* widget, Avatar* avatar); + static QString saveSnapshot(QGLWidget* widget, Avatar* avatar); static SnapshotMetaData* parseSnapshotData(QString snapshotPath); }; diff --git a/interface/src/ui/SnapshotShareDialog.cpp b/interface/src/ui/SnapshotShareDialog.cpp index 76556e0222..2af564ff0b 100644 --- a/interface/src/ui/SnapshotShareDialog.cpp +++ b/interface/src/ui/SnapshotShareDialog.cpp @@ -1,13 +1,30 @@ // -// snapshotShareDialog.cpp +// SnapshotShareDialog.cpp // hifi // // Created by Stojce Slavkovski on 2/16/14. // // -#include "snapshotShareDialog.h" +#include "SnapshotShareDialog.h" -#include "ui_shareSnapshot.h" +SnapshotShareDialog::SnapshotShareDialog(QString fileName, QWidget* parent) : QDialog(parent), _fileName(fileName) { + setAttribute(Qt::WA_DeleteOnClose); + ui.setupUi(this); + + QPixmap snaphsotPixmap(fileName); + float snapshotRatio = static_cast(snaphsotPixmap.size().width()) / snaphsotPixmap.size().height(); + float labelRatio = static_cast(ui.snapshotWidget->size().width()) / ui.snapshotWidget->size().height(); + + // set the same aspect ratio of label as of snapshot + if (snapshotRatio > labelRatio) { + ui.snapshotWidget->setFixedHeight(ui.snapshotWidget->size().width() / snapshotRatio); + } else { + ui.snapshotWidget->setFixedWidth(ui.snapshotWidget->size().height() * snapshotRatio); + } + + ui.snapshotWidget->setPixmap(snaphsotPixmap); + ui.snapshotWidget->adjustSize(); +} diff --git a/interface/src/ui/SnapshotShareDialog.h b/interface/src/ui/SnapshotShareDialog.h index 77e92216fd..077acd182b 100644 --- a/interface/src/ui/SnapshotShareDialog.h +++ b/interface/src/ui/SnapshotShareDialog.h @@ -1,5 +1,5 @@ // -// snapshotShareDialog.h +// SnapshotShareDialog.h // hifi // // Created by Stojce Slavkovski on 2/16/14. @@ -9,6 +9,17 @@ #ifndef __hifi__snapshotShareDialog__ #define __hifi__snapshotShareDialog__ -#include +#include "ui_shareSnapshot.h" + +class SnapshotShareDialog : public QDialog { + Q_OBJECT + +public: + SnapshotShareDialog(QString fileName, QWidget* parent = 0); + +private: + QString _fileName; + Ui_SnapshotShareDialog ui; +}; #endif /* defined(__hifi__snapshotShareDialog__) */ diff --git a/interface/ui/shareSnapshot.ui b/interface/ui/shareSnapshot.ui index 94c1b4220e..039e611115 100644 --- a/interface/ui/shareSnapshot.ui +++ b/interface/ui/shareSnapshot.ui @@ -1,7 +1,7 @@ - Dialog - + SnapshotShareDialog + Qt::NonModal @@ -9,10 +9,28 @@ 0 0 - 808 - 577 + 789 + 645 + + + 0 + 0 + + + + + 789 + 645 + + + + + 789 + 645 + + PointingHandCursor @@ -22,33 +40,149 @@ background-color: rgb(255, 255, 255); + + true + -1 -1 - 681 - 511 + 792 + 645 - + - + 0 0 - - background-color: #000; + + + 790 + 510 + + + background-color: #333; + + + QFrame::StyledPanel + + + QFrame::Raised + + + 0 + + + + + -1 + 1 + 791 + 512 + + + + + 0 + + + + + + 0 + 0 + + + + + 790 + 510 + + + + background-color: #ccc; + + + 0 + + + true + + + Qt::AlignCenter + + + 0 + + + + + + + Qt::Vertical + + + + 0 + 0 + + + + + + + + Qt::Horizontal + + + + 0 + 0 + + + + + + + + Qt::Horizontal + + + + 0 + 0 + + + + + + + + Qt::Vertical + + + + 0 + 0 + + + + + + - + 0 0 @@ -56,10 +190,25 @@ Notes about this image + + 0 + + + 20 + + + 0 + + + 20 + + + 20 + @@ -70,6 +219,22 @@ + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + From 0a0515b652d359bc833faacecea08ce3b42aa330 Mon Sep 17 00:00:00 2001 From: stojce Date: Mon, 24 Mar 2014 20:35:28 +0100 Subject: [PATCH 03/23] layout / font changes --- interface/interface_en.ts | 10 +++++----- interface/ui/shareSnapshot.ui | 35 +++++++++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/interface/interface_en.ts b/interface/interface_en.ts index f8de770fca..ce777b8551 100644 --- a/interface/interface_en.ts +++ b/interface/interface_en.ts @@ -162,19 +162,19 @@ SnapshotShareDialog - + Share with community - - + + Notes about this image - - + + Share diff --git a/interface/ui/shareSnapshot.ui b/interface/ui/shareSnapshot.ui index 039e611115..3d729cf9df 100644 --- a/interface/ui/shareSnapshot.ui +++ b/interface/ui/shareSnapshot.ui @@ -53,6 +53,9 @@ + + 0 + @@ -68,13 +71,13 @@ - background-color: #333; + background-color: #000 - QFrame::StyledPanel + QFrame::NoFrame - QFrame::Raised + QFrame::Plain 0 @@ -84,7 +87,7 @@ -1 1 - 791 + 792 512 @@ -187,9 +190,28 @@ 0 + + + 0 + 30 + + + + + Helvetica + 75 + true + + + + color: #666; + Notes about this image + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + 0 @@ -217,6 +239,11 @@ 0 + + + Helvetica + + From 63a29cad0a591c1c6598dd6520f4b2788ffcfb0c Mon Sep 17 00:00:00 2001 From: stojce Date: Mon, 24 Mar 2014 20:39:13 +0100 Subject: [PATCH 04/23] layout fixes --- interface/interface_en.ts | 10 +++--- interface/ui/shareSnapshot.ui | 68 ++++++++--------------------------- 2 files changed, 19 insertions(+), 59 deletions(-) diff --git a/interface/interface_en.ts b/interface/interface_en.ts index ce777b8551..2d2f4c1c07 100644 --- a/interface/interface_en.ts +++ b/interface/interface_en.ts @@ -162,19 +162,19 @@ SnapshotShareDialog - + Share with community - - + + Notes about this image - - + + Share diff --git a/interface/ui/shareSnapshot.ui b/interface/ui/shareSnapshot.ui index 3d729cf9df..85334cbc65 100644 --- a/interface/ui/shareSnapshot.ui +++ b/interface/ui/shareSnapshot.ui @@ -59,7 +59,7 @@ - + 0 0 @@ -70,6 +70,12 @@ 510 + + + 790 + 510 + + background-color: #000 @@ -95,7 +101,7 @@ 0 - + @@ -109,6 +115,12 @@ 510 + + + 790 + 510 + + background-color: #ccc; @@ -126,58 +138,6 @@ - - - - Qt::Vertical - - - - 0 - 0 - - - - - - - - Qt::Horizontal - - - - 0 - 0 - - - - - - - - Qt::Horizontal - - - - 0 - 0 - - - - - - - - Qt::Vertical - - - - 0 - 0 - - - - From e5a66ddb90909210635a1a4596e10fafdcf1abd2 Mon Sep 17 00:00:00 2001 From: stojce Date: Tue, 25 Mar 2014 21:56:20 +0100 Subject: [PATCH 05/23] New layout behaviour --- interface/interface_en.ts | 21 ++ interface/src/ui/SnapshotShareDialog.cpp | 16 + interface/ui/shareSnapshot.ui | 374 +++++++++++------------ 3 files changed, 214 insertions(+), 197 deletions(-) diff --git a/interface/interface_en.ts b/interface/interface_en.ts index beada5df43..0a5b7e4057 100644 --- a/interface/interface_en.ts +++ b/interface/interface_en.ts @@ -158,4 +158,25 @@ + + SnapshotShareDialog + + + + Share with community + + + + + + Notes about this image + + + + + + Share + + + diff --git a/interface/src/ui/SnapshotShareDialog.cpp b/interface/src/ui/SnapshotShareDialog.cpp index 2af564ff0b..d57951a484 100644 --- a/interface/src/ui/SnapshotShareDialog.cpp +++ b/interface/src/ui/SnapshotShareDialog.cpp @@ -6,6 +6,9 @@ // // +const int NARROW_SNAPSHOT_DIALOG_SIZE = 500; +const int WIDE_SNAPSHOT_DIALOG_WIDTH = 650; + #include "SnapshotShareDialog.h" SnapshotShareDialog::SnapshotShareDialog(QString fileName, QWidget* parent) : QDialog(parent), _fileName(fileName) { @@ -16,11 +19,24 @@ SnapshotShareDialog::SnapshotShareDialog(QString fileName, QWidget* parent) : QD QPixmap snaphsotPixmap(fileName); float snapshotRatio = static_cast(snaphsotPixmap.size().width()) / snaphsotPixmap.size().height(); + + // narrow snapshot + if (snapshotRatio > 1) { + setFixedWidth(WIDE_SNAPSHOT_DIALOG_WIDTH); + ui.snapshotWidget->setFixedWidth(WIDE_SNAPSHOT_DIALOG_WIDTH); + } + float labelRatio = static_cast(ui.snapshotWidget->size().width()) / ui.snapshotWidget->size().height(); // set the same aspect ratio of label as of snapshot if (snapshotRatio > labelRatio) { + int oldHeight = ui.snapshotWidget->size().height(); ui.snapshotWidget->setFixedHeight(ui.snapshotWidget->size().width() / snapshotRatio); + + // if height is less then original, resize the window as well + if (ui.snapshotWidget->size().height() < NARROW_SNAPSHOT_DIALOG_SIZE) { + setFixedHeight(size().height() - (oldHeight - ui.snapshotWidget->size().height())); + } } else { ui.snapshotWidget->setFixedWidth(ui.snapshotWidget->size().height() * snapshotRatio); } diff --git a/interface/ui/shareSnapshot.ui b/interface/ui/shareSnapshot.ui index 85334cbc65..cb8754a46d 100644 --- a/interface/ui/shareSnapshot.ui +++ b/interface/ui/shareSnapshot.ui @@ -9,26 +9,26 @@ 0 0 - 789 - 645 + 502 + 625 - + 0 0 - 789 - 645 + 500 + 625 - 789 - 645 + 502 + 625 @@ -43,189 +43,168 @@ true - - - - -1 - -1 - 792 - 645 - + + + 0 - - - 0 - - - - - - 0 - 0 - - - - - 790 - 510 - - - - - 790 - 510 - - - - background-color: #000 - - - QFrame::NoFrame - - - QFrame::Plain - - - 0 - - - - - -1 - 1 - 792 - 512 - + + 0 + + + 0 + + + 0 + + + 0 + + + + + QLayout::SetMinAndMaxSize + + + + + + 0 + 0 + + + + + 500 + 500 + + + + + 30 + 2000 + + + + background-color: #ccc; + + + 0 + + + true + + + Qt::AlignCenter + + + 0 - - - 0 - - - - - - 0 - 0 - - - - - 790 - 510 - - - - - 790 - 510 - - - - background-color: #ccc; - - - 0 - - - true - - - Qt::AlignCenter - - - 0 - - - - - - - - - - - 0 - 0 - - - - - 0 - 30 - - - - - Helvetica - 75 - true - - - - color: #666; - - - Notes about this image - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - 0 - - - 20 - - - - - - - 0 - - - 20 - - - 20 - - - - - - 0 - 0 - - - - - Helvetica - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - background-color: #333333; + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + Helvetica + 75 + true + + + + color: #666; +padding-left:20px; + + + 0 + + + Notes about this image + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + 0 + + + 0 + + + + + + + 0 + + + QLayout::SetFixedSize + + + 20 + + + 20 + + + + + + 0 + 0 + + + + + 16777215 + 60 + + + + + Helvetica + 14 + + + + QFrame::Box + + + QFrame::Plain + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + background-color: #333333; border-width: 0; border-radius: 9px; border-radius: 9px; @@ -235,16 +214,17 @@ color: #FFFFFF; width: 120px; height: 50px; - - - Share - - - - - - - + + + Share + + + + + + + + From b223d10e700d40a53455196fc1b6cca4d87ca23d Mon Sep 17 00:00:00 2001 From: stojce Date: Wed, 26 Mar 2014 21:24:18 +0100 Subject: [PATCH 06/23] Layout fixes --- interface/interface_en.ts | 39 ++++++++----- interface/ui/shareSnapshot.ui | 106 ++++++++++++++++++++++++++++++---- 2 files changed, 120 insertions(+), 25 deletions(-) diff --git a/interface/interface_en.ts b/interface/interface_en.ts index 39e9142400..6baf4e7054 100644 --- a/interface/interface_en.ts +++ b/interface/interface_en.ts @@ -4,22 +4,22 @@ Application - + Export Voxels - + Sparse Voxel Octree Files (*.svo) - + Open Script - + JavaScript Files (*.js) @@ -113,18 +113,18 @@ Menu - + Open .ini config file - - + + Text files (*.ini) - + Save .ini config file @@ -162,19 +162,30 @@ SnapshotShareDialog - - Share with community + + Share with Alphas + Share with community - - + + Notes about this image - - + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Helvetica'; font-size:14pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + + + Share diff --git a/interface/ui/shareSnapshot.ui b/interface/ui/shareSnapshot.ui index cb8754a46d..988acfcd56 100644 --- a/interface/ui/shareSnapshot.ui +++ b/interface/ui/shareSnapshot.ui @@ -10,7 +10,7 @@ 0 0 502 - 625 + 616 @@ -22,20 +22,20 @@ 500 - 625 + 616 502 - 625 + 616 PointingHandCursor - Share with community + Share with Alphas background-color: rgb(255, 255, 255); @@ -61,6 +61,9 @@ + + 0 + QLayout::SetMinAndMaxSize @@ -101,10 +104,26 @@ + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 9 + + + + - + 0 0 @@ -112,12 +131,13 @@ 0 - 30 + 19 Helvetica + 14 75 true @@ -126,6 +146,9 @@ color: #666; padding-left:20px; + + QFrame::NoFrame + 0 @@ -152,11 +175,27 @@ padding-left:20px; QLayout::SetFixedSize - 20 + 0 - 20 + 0 + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 19 + 20 + + + + @@ -177,12 +216,25 @@ padding-left:20px; 14 + + border-color: #c00 + - QFrame::Box + QFrame::StyledPanel QFrame::Plain + + 1 + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Helvetica'; font-size:14pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + @@ -195,8 +247,8 @@ padding-left:20px; - 20 - 20 + 25 + 19 @@ -220,8 +272,40 @@ padding-left:20px; + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 25 + 20 + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 11 + + + + From 9f05d71796d47f0899ef2f81cbfbdea7fecc7ecd Mon Sep 17 00:00:00 2001 From: stojce Date: Wed, 26 Mar 2014 21:30:02 +0100 Subject: [PATCH 07/23] fixed QTextEdit border color --- interface/ui/shareSnapshot.ui | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/ui/shareSnapshot.ui b/interface/ui/shareSnapshot.ui index 988acfcd56..19857bfb28 100644 --- a/interface/ui/shareSnapshot.ui +++ b/interface/ui/shareSnapshot.ui @@ -217,16 +217,16 @@ padding-left:20px; - border-color: #c00 + border: 1px solid #c5c5c5; - QFrame::StyledPanel + QFrame::NoFrame QFrame::Plain - 1 + 0 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> From d90e15ad5801928bd788460f0ea5e4194ddb1407 Mon Sep 17 00:00:00 2001 From: stojce Date: Thu, 27 Mar 2014 17:56:42 +0100 Subject: [PATCH 08/23] Don't show share dialog for anonymous users --- interface/src/Application.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 42c8efb952..1e0976c021 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3715,6 +3715,11 @@ void Application::takeSnapshot() { QString fileName = Snapshot::saveSnapshot(_glWidget, _myAvatar); + AccountManager& accountManager = AccountManager::getInstance(); + if (!accountManager.isLoggedIn()) { + return; + } + if (!_snapshotShareDialog) { _snapshotShareDialog = new SnapshotShareDialog(fileName, _glWidget); } From d3fecd7a31b503c9bf820b1f3c03cb2ff5eb932b Mon Sep 17 00:00:00 2001 From: Stojce Slavkovski Date: Fri, 2 May 2014 22:16:19 +0200 Subject: [PATCH 09/23] store discourse api key --- interface/src/ui/SnapshotShareDialog.cpp | 6 ++++++ interface/src/ui/SnapshotShareDialog.h | 3 +++ interface/ui/shareSnapshot.ui | 19 ++++++++++++++++++- .../networking/src/DataServerAccountInfo.cpp | 10 +++++++++- .../networking/src/DataServerAccountInfo.h | 6 +++++- 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/interface/src/ui/SnapshotShareDialog.cpp b/interface/src/ui/SnapshotShareDialog.cpp index d57951a484..081d3518b2 100644 --- a/interface/src/ui/SnapshotShareDialog.cpp +++ b/interface/src/ui/SnapshotShareDialog.cpp @@ -44,3 +44,9 @@ SnapshotShareDialog::SnapshotShareDialog(QString fileName, QWidget* parent) : QD ui.snapshotWidget->setPixmap(snaphsotPixmap); ui.snapshotWidget->adjustSize(); } + +void SnapshotShareDialog::accept() { + // post to Discourse forum + + close(); +} diff --git a/interface/src/ui/SnapshotShareDialog.h b/interface/src/ui/SnapshotShareDialog.h index 077acd182b..2823c8b78d 100644 --- a/interface/src/ui/SnapshotShareDialog.h +++ b/interface/src/ui/SnapshotShareDialog.h @@ -20,6 +20,9 @@ public: private: QString _fileName; Ui_SnapshotShareDialog ui; + +private slots: + void accept(); }; #endif /* defined(__hifi__snapshotShareDialog__) */ diff --git a/interface/ui/shareSnapshot.ui b/interface/ui/shareSnapshot.ui index 19857bfb28..0f59349442 100644 --- a/interface/ui/shareSnapshot.ui +++ b/interface/ui/shareSnapshot.ui @@ -311,5 +311,22 @@ p, li { white-space: pre-wrap; } - + + + shareButton + clicked() + SnapshotShareDialog + accept() + + + 420 + 565 + + + 250 + 307 + + + + diff --git a/libraries/networking/src/DataServerAccountInfo.cpp b/libraries/networking/src/DataServerAccountInfo.cpp index 87d3b694a7..d7cbd91e78 100644 --- a/libraries/networking/src/DataServerAccountInfo.cpp +++ b/libraries/networking/src/DataServerAccountInfo.cpp @@ -16,7 +16,8 @@ DataServerAccountInfo::DataServerAccountInfo() : _accessToken(), _username(), - _xmppPassword() + _xmppPassword(), + _discourseApiKey() { } @@ -29,6 +30,7 @@ DataServerAccountInfo::DataServerAccountInfo(const QJsonObject& jsonObject) : QJsonObject userJSONObject = jsonObject["user"].toObject(); setUsername(userJSONObject["username"].toString()); setXMPPPassword(userJSONObject["xmpp_password"].toString()); + setDiscourseApiKey(userJSONObject["discourse_api_key"].toString()); } DataServerAccountInfo::DataServerAccountInfo(const DataServerAccountInfo& otherInfo) { @@ -65,6 +67,12 @@ void DataServerAccountInfo::setXMPPPassword(const QString& xmppPassword) { } } +void DataServerAccountInfo::setDiscourseApiKey(const QString& discourseApiKey) { + if (_discourseApiKey != discourseApiKey) { + _discourseApiKey = discourseApiKey; + } +} + QDataStream& operator<<(QDataStream &out, const DataServerAccountInfo& info) { out << info._accessToken << info._username << info._xmppPassword; return out; diff --git a/libraries/networking/src/DataServerAccountInfo.h b/libraries/networking/src/DataServerAccountInfo.h index 21380c0855..a7d1fa9cb0 100644 --- a/libraries/networking/src/DataServerAccountInfo.h +++ b/libraries/networking/src/DataServerAccountInfo.h @@ -31,7 +31,10 @@ public: const QString& getXMPPPassword() const { return _xmppPassword; } void setXMPPPassword(const QString& xmppPassword); - + + const QString& getDiscourseApiKey() const { return _discourseApiKey; } + void setDiscourseApiKey(const QString& discourseApiKey); + friend QDataStream& operator<<(QDataStream &out, const DataServerAccountInfo& info); friend QDataStream& operator>>(QDataStream &in, DataServerAccountInfo& info); private: @@ -40,6 +43,7 @@ private: OAuthAccessToken _accessToken; QString _username; QString _xmppPassword; + QString _discourseApiKey; }; #endif // hifi_DataServerAccountInfo_h From c400630bc440e13171ea06397b0bc9660bf9761a Mon Sep 17 00:00:00 2001 From: Stojce Slavkovski Date: Sat, 3 May 2014 21:12:20 +0200 Subject: [PATCH 10/23] make post --- interface/src/ui/SnapshotShareDialog.cpp | 60 +++++++++++++++++-- interface/src/ui/SnapshotShareDialog.h | 6 ++ .../networking/src/DataServerAccountInfo.cpp | 2 + 3 files changed, 64 insertions(+), 4 deletions(-) diff --git a/interface/src/ui/SnapshotShareDialog.cpp b/interface/src/ui/SnapshotShareDialog.cpp index 081d3518b2..921400ba1e 100644 --- a/interface/src/ui/SnapshotShareDialog.cpp +++ b/interface/src/ui/SnapshotShareDialog.cpp @@ -6,10 +6,17 @@ // // +#include "SnapshotShareDialog.h" +#include "AccountManager.h" + +#include +#include +#include +#include + const int NARROW_SNAPSHOT_DIALOG_SIZE = 500; const int WIDE_SNAPSHOT_DIALOG_WIDTH = 650; - -#include "SnapshotShareDialog.h" +const QString FORUM_POST_URL = "http://localhost:4000"; SnapshotShareDialog::SnapshotShareDialog(QString fileName, QWidget* parent) : QDialog(parent), _fileName(fileName) { @@ -46,7 +53,52 @@ SnapshotShareDialog::SnapshotShareDialog(QString fileName, QWidget* parent) : QD } void SnapshotShareDialog::accept() { - // post to Discourse forum - + close(); + + // post to Discourse forum +// AccountManager& accountManager = AccountManager::getInstance(); + QNetworkAccessManager* _networkAccessManager = NULL; + + if (!_networkAccessManager) { + _networkAccessManager = new QNetworkAccessManager(this); + } + + QNetworkRequest request; + + QUrl grantURL(FORUM_POST_URL); + grantURL.setPath("/posts"); + + + QByteArray postData; + // postData.append("api_key=" + accountManager.getAccountInfo().getDiscourseApiKey() + "&"); + postData.append("api_key=9168f53930b2fc69ec278414d6ff04fed723ef717867a25954143150d3e2dfe8&"); + postData.append("topic_id=64&"); + postData.append("raw=" + QUrl::toPercentEncoding(ui.textEdit->toPlainText())); + + request.setUrl(grantURL); + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); + + QNetworkReply* requestReply = _networkAccessManager->post(request, postData); + connect(_networkAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*))); + + connect(requestReply, &QNetworkReply::finished, this, &SnapshotShareDialog::requestFinished); + connect(requestReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestError(QNetworkReply::NetworkError))); } + +void SnapshotShareDialog::serviceRequestFinished(QNetworkReply* reply) { + qDebug() << reply->errorString(); +} + +void SnapshotShareDialog::requestFinished() { + + QNetworkReply* requestReply = reinterpret_cast(sender()); + + qDebug() << requestReply->errorString(); + delete requestReply; +} + +void SnapshotShareDialog::requestError(QNetworkReply::NetworkError error) { + // TODO: error handling + qDebug() << "AccountManager requestError - " << error; +} \ No newline at end of file diff --git a/interface/src/ui/SnapshotShareDialog.h b/interface/src/ui/SnapshotShareDialog.h index 2823c8b78d..18a66616db 100644 --- a/interface/src/ui/SnapshotShareDialog.h +++ b/interface/src/ui/SnapshotShareDialog.h @@ -10,6 +10,7 @@ #define __hifi__snapshotShareDialog__ #include "ui_shareSnapshot.h" +#include class SnapshotShareDialog : public QDialog { Q_OBJECT @@ -21,6 +22,11 @@ private: QString _fileName; Ui_SnapshotShareDialog ui; +public slots: + void requestFinished(); + void requestError(QNetworkReply::NetworkError error); + void serviceRequestFinished(QNetworkReply* reply); + private slots: void accept(); }; diff --git a/libraries/networking/src/DataServerAccountInfo.cpp b/libraries/networking/src/DataServerAccountInfo.cpp index d7cbd91e78..a9522148a8 100644 --- a/libraries/networking/src/DataServerAccountInfo.cpp +++ b/libraries/networking/src/DataServerAccountInfo.cpp @@ -37,6 +37,7 @@ DataServerAccountInfo::DataServerAccountInfo(const DataServerAccountInfo& otherI _accessToken = otherInfo._accessToken; _username = otherInfo._username; _xmppPassword = otherInfo._xmppPassword; + _discourseApiKey = otherInfo._discourseApiKey; } DataServerAccountInfo& DataServerAccountInfo::operator=(const DataServerAccountInfo& otherInfo) { @@ -51,6 +52,7 @@ void DataServerAccountInfo::swap(DataServerAccountInfo& otherInfo) { swap(_accessToken, otherInfo._accessToken); swap(_username, otherInfo._username); swap(_xmppPassword, otherInfo._xmppPassword); + swap(_discourseApiKey, otherInfo._discourseApiKey); } void DataServerAccountInfo::setUsername(const QString& username) { From d93480458f0941281db882ee63db2f0b7fa461bd Mon Sep 17 00:00:00 2001 From: Stojce Slavkovski Date: Sun, 4 May 2014 18:30:58 +0200 Subject: [PATCH 11/23] Posting Image to forum --- interface/src/Application.cpp | 2 +- interface/src/ui/SnapshotShareDialog.cpp | 125 ++++++++++++++++------- interface/src/ui/SnapshotShareDialog.h | 23 +++-- 3 files changed, 102 insertions(+), 48 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0d99f60f58..a6fd36a0d8 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3663,7 +3663,7 @@ void Application::takeSnapshot() { if (!_snapshotShareDialog) { _snapshotShareDialog = new SnapshotShareDialog(fileName, _glWidget); } - _snapshotShareDialog->exec(); + _snapshotShareDialog->show(); } void Application::urlGoTo(int argc, const char * constArgv[]) { diff --git a/interface/src/ui/SnapshotShareDialog.cpp b/interface/src/ui/SnapshotShareDialog.cpp index 921400ba1e..a5d598dc8b 100644 --- a/interface/src/ui/SnapshotShareDialog.cpp +++ b/interface/src/ui/SnapshotShareDialog.cpp @@ -1,28 +1,41 @@ // // SnapshotShareDialog.cpp -// hifi +// interface/src/ui // // Created by Stojce Slavkovski on 2/16/14. +// Copyright 2014 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 // #include "SnapshotShareDialog.h" #include "AccountManager.h" -#include +#include #include -#include #include const int NARROW_SNAPSHOT_DIALOG_SIZE = 500; const int WIDE_SNAPSHOT_DIALOG_WIDTH = 650; -const QString FORUM_POST_URL = "http://localhost:4000"; -SnapshotShareDialog::SnapshotShareDialog(QString fileName, QWidget* parent) : QDialog(parent), _fileName(fileName) { +const QString FORUM_URL = "http://localhost:4000"; +const QString FORUM_UPLOADS_URL = FORUM_URL + "/uploads"; +const QString FORUM_POST_URL = FORUM_URL + "/posts"; +const QString FORUM_REPLY_TO_TOPIC = "64"; +const QString FORUM_POST_TEMPLATE = "

%2

"; + +Q_DECLARE_METATYPE(QNetworkAccessManager::Operation) + +SnapshotShareDialog::SnapshotShareDialog(QString fileName, QWidget* parent) : + QDialog(parent), + _fileName(fileName), + _networkAccessManager(NULL) +{ setAttribute(Qt::WA_DeleteOnClose); - ui.setupUi(this); + _ui.setupUi(this); QPixmap snaphsotPixmap(fileName); float snapshotRatio = static_cast(snaphsotPixmap.size().width()) / snaphsotPixmap.size().height(); @@ -30,70 +43,104 @@ SnapshotShareDialog::SnapshotShareDialog(QString fileName, QWidget* parent) : QD // narrow snapshot if (snapshotRatio > 1) { setFixedWidth(WIDE_SNAPSHOT_DIALOG_WIDTH); - ui.snapshotWidget->setFixedWidth(WIDE_SNAPSHOT_DIALOG_WIDTH); + _ui.snapshotWidget->setFixedWidth(WIDE_SNAPSHOT_DIALOG_WIDTH); } - float labelRatio = static_cast(ui.snapshotWidget->size().width()) / ui.snapshotWidget->size().height(); + float labelRatio = static_cast(_ui.snapshotWidget->size().width()) / _ui.snapshotWidget->size().height(); // set the same aspect ratio of label as of snapshot if (snapshotRatio > labelRatio) { - int oldHeight = ui.snapshotWidget->size().height(); - ui.snapshotWidget->setFixedHeight(ui.snapshotWidget->size().width() / snapshotRatio); + int oldHeight = _ui.snapshotWidget->size().height(); + _ui.snapshotWidget->setFixedHeight((int) (_ui.snapshotWidget->size().width() / snapshotRatio)); // if height is less then original, resize the window as well - if (ui.snapshotWidget->size().height() < NARROW_SNAPSHOT_DIALOG_SIZE) { - setFixedHeight(size().height() - (oldHeight - ui.snapshotWidget->size().height())); + if (_ui.snapshotWidget->size().height() < NARROW_SNAPSHOT_DIALOG_SIZE) { + setFixedHeight(size().height() - (oldHeight - _ui.snapshotWidget->size().height())); } } else { - ui.snapshotWidget->setFixedWidth(ui.snapshotWidget->size().height() * snapshotRatio); + _ui.snapshotWidget->setFixedWidth((int) (_ui.snapshotWidget->size().height() * snapshotRatio)); } - ui.snapshotWidget->setPixmap(snaphsotPixmap); - ui.snapshotWidget->adjustSize(); + _ui.snapshotWidget->setPixmap(snaphsotPixmap); + _ui.snapshotWidget->adjustSize(); } void SnapshotShareDialog::accept() { - + uploadSnapshot(); + sendForumPost("/uploads/default/25/b607c8faea6de9c3.jpg"); close(); - - // post to Discourse forum -// AccountManager& accountManager = AccountManager::getInstance(); - QNetworkAccessManager* _networkAccessManager = NULL; +} + +void SnapshotShareDialog::uploadSnapshot() { if (!_networkAccessManager) { _networkAccessManager = new QNetworkAccessManager(this); } - QNetworkRequest request; + QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); - QUrl grantURL(FORUM_POST_URL); - grantURL.setPath("/posts"); + QHttpPart apiKeyPart; + apiKeyPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"api_key\"")); + apiKeyPart.setBody("9168f53930b2fc69ec278414d6ff04fed723ef717867a25954143150d3e2dfe8"); +// apiKeyPart.setBody(AccountManager::getInstance().getAccountInfo().getDiscourseApiKey().toLatin1()); + QFile *file = new QFile(_fileName); + file->open(QIODevice::ReadOnly); - QByteArray postData; - // postData.append("api_key=" + accountManager.getAccountInfo().getDiscourseApiKey() + "&"); - postData.append("api_key=9168f53930b2fc69ec278414d6ff04fed723ef717867a25954143150d3e2dfe8&"); - postData.append("topic_id=64&"); - postData.append("raw=" + QUrl::toPercentEncoding(ui.textEdit->toPlainText())); + QHttpPart imagePart; + imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg")); + imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, + QVariant("form-data; name=\"file\"; filename=\"" + file->fileName() +"\"")); + imagePart.setBodyDevice(file); + file->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart - request.setUrl(grantURL); - request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); + multiPart->append(apiKeyPart); + multiPart->append(imagePart); - QNetworkReply* requestReply = _networkAccessManager->post(request, postData); - connect(_networkAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*))); + QUrl url(FORUM_UPLOADS_URL); + QNetworkRequest request(url); - connect(requestReply, &QNetworkReply::finished, this, &SnapshotShareDialog::requestFinished); - connect(requestReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestError(QNetworkReply::NetworkError))); + QNetworkReply *reply = _networkAccessManager->post(request, multiPart); + bool check; + Q_UNUSED(check); + + check = connect(reply, SIGNAL(finished()), this, SLOT(requestFinished())); + Q_ASSERT(check); } -void SnapshotShareDialog::serviceRequestFinished(QNetworkReply* reply) { - qDebug() << reply->errorString(); +void SnapshotShareDialog::sendForumPost(QString snapshotPath) { + + if (!_networkAccessManager) { + _networkAccessManager = new QNetworkAccessManager(this); + } + + // post to Discourse forum + QNetworkRequest request; + QUrl forumUrl(FORUM_POST_URL); + + QUrlQuery query; +// query.addQueryItem("api_key", accountManager.getAccountInfo().getDiscourseApiKey(); + query.addQueryItem("api_key", "9168f53930b2fc69ec278414d6ff04fed723ef717867a25954143150d3e2dfe8"); + query.addQueryItem("topic_id", FORUM_REPLY_TO_TOPIC); + query.addQueryItem("raw", FORUM_POST_TEMPLATE.arg(snapshotPath, _ui.textEdit->toPlainText())); + forumUrl.setQuery(query); + + QByteArray postData = forumUrl.toEncoded(QUrl::RemoveFragment); + request.setUrl(forumUrl); + QNetworkReply* requestReply = _networkAccessManager->post(request, postData); + + bool check; + Q_UNUSED(check); + + check = connect(requestReply, &QNetworkReply::finished, this, &SnapshotShareDialog::requestFinished); + Q_ASSERT(check); + + check = connect(requestReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestError(QNetworkReply::NetworkError))); + Q_ASSERT(check); } void SnapshotShareDialog::requestFinished() { - QNetworkReply* requestReply = reinterpret_cast(sender()); - qDebug() << requestReply->errorString(); delete requestReply; } @@ -101,4 +148,4 @@ void SnapshotShareDialog::requestFinished() { void SnapshotShareDialog::requestError(QNetworkReply::NetworkError error) { // TODO: error handling qDebug() << "AccountManager requestError - " << error; -} \ No newline at end of file +} diff --git a/interface/src/ui/SnapshotShareDialog.h b/interface/src/ui/SnapshotShareDialog.h index 18a66616db..ea973022f3 100644 --- a/interface/src/ui/SnapshotShareDialog.h +++ b/interface/src/ui/SnapshotShareDialog.h @@ -1,16 +1,22 @@ // // SnapshotShareDialog.h -// hifi +// interface/src/ui // // Created by Stojce Slavkovski on 2/16/14. +// Copyright 2014 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 // -#ifndef __hifi__snapshotShareDialog__ -#define __hifi__snapshotShareDialog__ +#ifndef hifi_snapshotShareDialog +#define hifi_snapshotShareDialog #include "ui_shareSnapshot.h" + +#include #include +#include class SnapshotShareDialog : public QDialog { Q_OBJECT @@ -20,15 +26,16 @@ public: private: QString _fileName; - Ui_SnapshotShareDialog ui; + QNetworkAccessManager* _networkAccessManager; + Ui_SnapshotShareDialog _ui; + + void uploadSnapshot(); + void sendForumPost(QString snapshotPath); public slots: void requestFinished(); void requestError(QNetworkReply::NetworkError error); - void serviceRequestFinished(QNetworkReply* reply); - -private slots: void accept(); }; -#endif /* defined(__hifi__snapshotShareDialog__) */ +#endif // hifi_snapshotShareDialog From f668cc85812c33fb179be2dae88902c7eb2cfc8b Mon Sep 17 00:00:00 2001 From: Stojce Slavkovski Date: Mon, 5 May 2014 00:55:24 +0200 Subject: [PATCH 12/23] Discourse upload image - success message set - fixed signal/slots in QDialog w/QEventLoop - layout fixes --- interface/src/ui/SnapshotShareDialog.cpp | 100 +++++++++++++++++------ interface/src/ui/SnapshotShareDialog.h | 6 +- interface/ui/shareSnapshot.ui | 53 +++++++++++- 3 files changed, 125 insertions(+), 34 deletions(-) diff --git a/interface/src/ui/SnapshotShareDialog.cpp b/interface/src/ui/SnapshotShareDialog.cpp index a5d598dc8b..fc738c9761 100644 --- a/interface/src/ui/SnapshotShareDialog.cpp +++ b/interface/src/ui/SnapshotShareDialog.cpp @@ -13,17 +13,24 @@ #include "AccountManager.h" #include +#include +#include #include +#include #include + const int NARROW_SNAPSHOT_DIALOG_SIZE = 500; const int WIDE_SNAPSHOT_DIALOG_WIDTH = 650; +const int SUCCESS_LABEL_HEIGHT = 140; -const QString FORUM_URL = "http://localhost:4000"; +const QString FORUM_URL = "https://alphas.highfidelity.io"; const QString FORUM_UPLOADS_URL = FORUM_URL + "/uploads"; const QString FORUM_POST_URL = FORUM_URL + "/posts"; -const QString FORUM_REPLY_TO_TOPIC = "64"; +const QString FORUM_REPLY_TO_TOPIC = "244"; const QString FORUM_POST_TEMPLATE = "

%2

"; +const QString SHARE_DEFAULT_ERROR = "The server isn't responding. Please try again in a few minutes."; +const QString SUCCESS_LABEL_TEMPLATE = "Success!!! Go check out your image ...
%1"; Q_DECLARE_METATYPE(QNetworkAccessManager::Operation) @@ -67,12 +74,15 @@ SnapshotShareDialog::SnapshotShareDialog(QString fileName, QWidget* parent) : void SnapshotShareDialog::accept() { uploadSnapshot(); - sendForumPost("/uploads/default/25/b607c8faea6de9c3.jpg"); - close(); } void SnapshotShareDialog::uploadSnapshot() { + if (AccountManager::getInstance().getAccountInfo().getDiscourseApiKey().isEmpty()) { + QMessageBox::warning(this, "", "Your Discourse API key is missing, you cannot share snapshots."); + return; + } + if (!_networkAccessManager) { _networkAccessManager = new QNetworkAccessManager(this); } @@ -81,8 +91,7 @@ void SnapshotShareDialog::uploadSnapshot() { QHttpPart apiKeyPart; apiKeyPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"api_key\"")); - apiKeyPart.setBody("9168f53930b2fc69ec278414d6ff04fed723ef717867a25954143150d3e2dfe8"); -// apiKeyPart.setBody(AccountManager::getInstance().getAccountInfo().getDiscourseApiKey().toLatin1()); + apiKeyPart.setBody(AccountManager::getInstance().getAccountInfo().getDiscourseApiKey().toLatin1()); QFile *file = new QFile(_fileName); file->open(QIODevice::ReadOnly); @@ -101,11 +110,13 @@ void SnapshotShareDialog::uploadSnapshot() { QNetworkRequest request(url); QNetworkReply *reply = _networkAccessManager->post(request, multiPart); - bool check; - Q_UNUSED(check); - check = connect(reply, SIGNAL(finished()), this, SLOT(requestFinished())); - Q_ASSERT(check); + + connect(reply, &QNetworkReply::finished, this, &SnapshotShareDialog::uploadRequestFinished); + + QEventLoop loop; + connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); + loop.exec(); } void SnapshotShareDialog::sendForumPost(QString snapshotPath) { @@ -119,33 +130,68 @@ void SnapshotShareDialog::sendForumPost(QString snapshotPath) { QUrl forumUrl(FORUM_POST_URL); QUrlQuery query; -// query.addQueryItem("api_key", accountManager.getAccountInfo().getDiscourseApiKey(); - query.addQueryItem("api_key", "9168f53930b2fc69ec278414d6ff04fed723ef717867a25954143150d3e2dfe8"); + query.addQueryItem("api_key", AccountManager::getInstance().getAccountInfo().getDiscourseApiKey()); query.addQueryItem("topic_id", FORUM_REPLY_TO_TOPIC); query.addQueryItem("raw", FORUM_POST_TEMPLATE.arg(snapshotPath, _ui.textEdit->toPlainText())); forumUrl.setQuery(query); QByteArray postData = forumUrl.toEncoded(QUrl::RemoveFragment); request.setUrl(forumUrl); + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); + QNetworkReply* requestReply = _networkAccessManager->post(request, postData); + connect(requestReply, &QNetworkReply::finished, this, &SnapshotShareDialog::postRequestFinished); - bool check; - Q_UNUSED(check); - - check = connect(requestReply, &QNetworkReply::finished, this, &SnapshotShareDialog::requestFinished); - Q_ASSERT(check); - - check = connect(requestReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(requestError(QNetworkReply::NetworkError))); - Q_ASSERT(check); + QEventLoop loop; + connect(requestReply, &QNetworkReply::finished, &loop, &QEventLoop::quit); + loop.exec(); } -void SnapshotShareDialog::requestFinished() { +void SnapshotShareDialog::postRequestFinished() { + QNetworkReply* requestReply = reinterpret_cast(sender()); - qDebug() << requestReply->errorString(); + QJsonDocument jsonResponse = QJsonDocument::fromJson(requestReply->readAll()); + const QJsonObject& responseObject = jsonResponse.object(); + + if (responseObject.contains("id")) { + _ui.textEdit->setHtml(""); + const QString urlTemplate = "%1/t/%2/%3/%4"; + QString link = urlTemplate.arg(FORUM_URL, + responseObject["topic_slug"].toString(), + QString::number(responseObject["topic_id"].toDouble()), + QString::number(responseObject["post_number"].toDouble())); + + _ui.successLabel->setText(SUCCESS_LABEL_TEMPLATE.arg(link)); + _ui.successLabel->setFixedHeight(SUCCESS_LABEL_HEIGHT); + + // hide input widgets + _ui.shareButton->hide(); + _ui.textEdit->hide(); + _ui.labelNotes->hide(); + + } else { + QString errorMessage(SHARE_DEFAULT_ERROR); + if (responseObject.contains("errors")) { + QJsonArray errorArray = responseObject["errors"].toArray(); + if (!errorArray.first().toString().isEmpty()) { + errorMessage = errorArray.first().toString(); + } + } + QMessageBox::warning(this, "", SHARE_DEFAULT_ERROR); + } +} + +void SnapshotShareDialog::uploadRequestFinished() { + + QNetworkReply* requestReply = reinterpret_cast(sender()); + QJsonDocument jsonResponse = QJsonDocument::fromJson(requestReply->readAll()); + const QJsonObject& responseObject = jsonResponse.object(); + + if (responseObject.contains("url")) { + sendForumPost(responseObject["url"].toString()); + } else { + QMessageBox::warning(this, "", SHARE_DEFAULT_ERROR); + } + delete requestReply; } - -void SnapshotShareDialog::requestError(QNetworkReply::NetworkError error) { - // TODO: error handling - qDebug() << "AccountManager requestError - " << error; -} diff --git a/interface/src/ui/SnapshotShareDialog.h b/interface/src/ui/SnapshotShareDialog.h index ea973022f3..bc92e63e4c 100644 --- a/interface/src/ui/SnapshotShareDialog.h +++ b/interface/src/ui/SnapshotShareDialog.h @@ -32,9 +32,9 @@ private: void uploadSnapshot(); void sendForumPost(QString snapshotPath); -public slots: - void requestFinished(); - void requestError(QNetworkReply::NetworkError error); +private slots: + void uploadRequestFinished(); + void postRequestFinished(); void accept(); }; diff --git a/interface/ui/shareSnapshot.ui b/interface/ui/shareSnapshot.ui index 0f59349442..df7fc4939f 100644 --- a/interface/ui/shareSnapshot.ui +++ b/interface/ui/shareSnapshot.ui @@ -31,9 +31,6 @@ 616 - - PointingHandCursor - Share with Alphas @@ -121,7 +118,55 @@ - + + + true + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 0 + + + + + Arial + + + + color: #666 + + + + + + Qt::RichText + + + Qt::AlignCenter + + + true + + + Qt::TextBrowserInteraction + + + + + 0 From ef67a72f23b55383c8da20bcb0a286e68a998881 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 8 May 2014 07:22:55 -0700 Subject: [PATCH 13/23] Remove icon paths from runningScriptsWidget.ui These icon paths are already set programmatically. --- interface/ui/runningScriptsWidget.ui | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/interface/ui/runningScriptsWidget.ui b/interface/ui/runningScriptsWidget.ui index 6abd0f2d5a..cb0106cd48 100644 --- a/interface/ui/runningScriptsWidget.ui +++ b/interface/ui/runningScriptsWidget.ui @@ -88,10 +88,6 @@ padding-top: 3px; Reload all - - - ../resources/images/reload.svg../resources/images/reload.svg - @@ -115,10 +111,6 @@ padding-top: 3px; Stop all - - - ../resources/images/stop.svg../resources/images/stop.svg - @@ -251,10 +243,6 @@ padding-top: 3px; Load script - - - ../resources/images/plus.svg../resources/images/plus.svg - widgetTitle currentlyRunningLabel From fdaa42b21902813475fee733b5f8cce784cbfa42 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 8 May 2014 07:54:49 -0700 Subject: [PATCH 14/23] Add hifi:// clickable links to chat The handling also needed to be updated to handle domains correctly - just routing to goToURL instead of gTo fixes this. --- interface/src/Menu.cpp | 4 +--- interface/src/ui/ChatWindow.cpp | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index ad2b220d55..a027a7939c 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -984,9 +984,7 @@ void Menu::goToUser(const QString& user) { /// Open a url, shortcutting any "hifi" scheme URLs to the local application. void Menu::openUrl(const QUrl& url) { if (url.scheme() == "hifi") { - QString path = url.toString(QUrl::RemoveScheme); - path = path.remove(QRegExp("^:?/*")); - goTo(path); + goToURL(url.toString()); } else { QDesktopServices::openUrl(url); } diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index 72445fa69a..fce900f352 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -30,7 +30,7 @@ const int NUM_MESSAGES_TO_TIME_STAMP = 20; -const QRegularExpression regexLinks("((?:(?:ftp)|(?:https?))://\\S+)"); +const QRegularExpression regexLinks("((?:(?:ftp)|(?:https?)|(?:hifi))://\\S+)"); const QRegularExpression regexHifiLinks("([#@]\\S+)"); const QString mentionSoundsPath("/sounds/mention/"); const QString mentionRegex("@(\\b%1\\b)"); From 96a9a478712a2052414b6476970dd2f3a0db93e2 Mon Sep 17 00:00:00 2001 From: Stojce Slavkovski Date: Thu, 8 May 2014 20:54:28 +0200 Subject: [PATCH 15/23] minor code fixes --- interface/src/ui/SnapshotShareDialog.cpp | 10 +++++----- interface/src/ui/SnapshotShareDialog.h | 4 ++-- snapshotShareDialog.cpp | 9 --------- snapshotShareDialog.h | 14 -------------- 4 files changed, 7 insertions(+), 30 deletions(-) delete mode 100644 snapshotShareDialog.cpp delete mode 100644 snapshotShareDialog.h diff --git a/interface/src/ui/SnapshotShareDialog.cpp b/interface/src/ui/SnapshotShareDialog.cpp index fc738c9761..5ba284618f 100644 --- a/interface/src/ui/SnapshotShareDialog.cpp +++ b/interface/src/ui/SnapshotShareDialog.cpp @@ -13,11 +13,11 @@ #include "AccountManager.h" #include -#include -#include -#include -#include #include +#include +#include +#include +#include const int NARROW_SNAPSHOT_DIALOG_SIZE = 500; @@ -177,7 +177,7 @@ void SnapshotShareDialog::postRequestFinished() { errorMessage = errorArray.first().toString(); } } - QMessageBox::warning(this, "", SHARE_DEFAULT_ERROR); + QMessageBox::warning(this, "", errorMessage); } } diff --git a/interface/src/ui/SnapshotShareDialog.h b/interface/src/ui/SnapshotShareDialog.h index bc92e63e4c..a8795d578a 100644 --- a/interface/src/ui/SnapshotShareDialog.h +++ b/interface/src/ui/SnapshotShareDialog.h @@ -14,9 +14,9 @@ #include "ui_shareSnapshot.h" -#include -#include #include +#include +#include class SnapshotShareDialog : public QDialog { Q_OBJECT diff --git a/snapshotShareDialog.cpp b/snapshotShareDialog.cpp deleted file mode 100644 index 53a445292f..0000000000 --- a/snapshotShareDialog.cpp +++ /dev/null @@ -1,9 +0,0 @@ -// -// snapshotShareDialog.cpp -// hifi -// -// Created by Stojce Slavkovski on 2/16/14. -// -// - -#include "snapshotShareDialog.h" diff --git a/snapshotShareDialog.h b/snapshotShareDialog.h deleted file mode 100644 index 77e92216fd..0000000000 --- a/snapshotShareDialog.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// snapshotShareDialog.h -// hifi -// -// Created by Stojce Slavkovski on 2/16/14. -// -// - -#ifndef __hifi__snapshotShareDialog__ -#define __hifi__snapshotShareDialog__ - -#include - -#endif /* defined(__hifi__snapshotShareDialog__) */ From b9fecb8b92daa7cee2be643fac465a7dba4abec5 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 9 May 2014 14:34:13 -0700 Subject: [PATCH 16/23] Wait for scripts to finish before restarting them. --- interface/src/Application.cpp | 126 ++++++++++++++++------------------ interface/src/Application.h | 4 +- 2 files changed, 63 insertions(+), 67 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 61666ccdeb..1f7ddb616a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3374,71 +3374,6 @@ void Application::saveScripts() { _settings->endArray(); } -void Application::stopAllScripts() { - // stops all current running scripts - for (int i = 0; i < _scriptEnginesHash.size(); ++i) { - _scriptEnginesHash.values().at(i)->stop(); - qDebug() << "stopping script..." << getRunningScripts().at(i); - } - _scriptEnginesHash.clear(); - _runningScriptsWidget->setRunningScripts(getRunningScripts()); - bumpSettings(); -} - -void Application::stopScript(const QString &scriptName) { - if (_scriptEnginesHash.contains(scriptName)) { - _scriptEnginesHash.value(scriptName)->stop(); - qDebug() << "stopping script..." << scriptName; - _scriptEnginesHash.remove(scriptName); - _runningScriptsWidget->setRunningScripts(getRunningScripts()); - bumpSettings(); - } -} - -void Application::reloadAllScripts() { - // remember all the current scripts so we can reload them - QStringList reloadList = getRunningScripts(); - // reloads all current running scripts - stopAllScripts(); - - foreach (QString scriptName, reloadList){ - qDebug() << "reloading script..." << scriptName; - loadScript(scriptName); - } -} - -void Application::manageRunningScriptsWidgetVisibility(bool shown) { - if (_runningScriptsWidgetWasVisible && shown) { - _runningScriptsWidget->show(); - } else if (_runningScriptsWidgetWasVisible && !shown) { - _runningScriptsWidget->hide(); - } -} - -void Application::toggleRunningScriptsWidget() { - if (_runningScriptsWidgetWasVisible) { - _runningScriptsWidget->hide(); - _runningScriptsWidgetWasVisible = false; - } else { - _runningScriptsWidget->setBoundary(QRect(_window->geometry().topLeft(), - _window->size())); - _runningScriptsWidget->show(); - _runningScriptsWidgetWasVisible = true; - } -} - -void Application::uploadHead() { - uploadModel(HEAD_MODEL); -} - -void Application::uploadSkeleton() { - uploadModel(SKELETON_MODEL); -} - -void Application::uploadAttachment() { - uploadModel(ATTACHMENT_MODEL); -} - ScriptEngine* Application::loadScript(const QString& scriptName, bool loadScriptFromEditor) { if(loadScriptFromEditor && _scriptEnginesHash.contains(scriptName) && !_scriptEnginesHash[scriptName]->isFinished()){ return _scriptEnginesHash[scriptName]; @@ -3518,6 +3453,67 @@ ScriptEngine* Application::loadScript(const QString& scriptName, bool loadScript return scriptEngine; } +void Application::stopAllScripts(bool restart) { + // stops all current running scripts + for (QHash::const_iterator it = _scriptEnginesHash.constBegin(); + it != _scriptEnginesHash.constEnd(); it++) { + if (restart) { + connect(it.value(), SIGNAL(finished(const QString&)), SLOT(loadScript(const QString&))); + } + it.value()->stop(); + qDebug() << "stopping script..." << it.key(); + } + _scriptEnginesHash.clear(); + _runningScriptsWidget->setRunningScripts(getRunningScripts()); + bumpSettings(); +} + +void Application::stopScript(const QString &scriptName) { + if (_scriptEnginesHash.contains(scriptName)) { + _scriptEnginesHash.value(scriptName)->stop(); + qDebug() << "stopping script..." << scriptName; + _scriptEnginesHash.remove(scriptName); + _runningScriptsWidget->setRunningScripts(getRunningScripts()); + bumpSettings(); + } +} + +void Application::reloadAllScripts() { + stopAllScripts(true); +} + +void Application::manageRunningScriptsWidgetVisibility(bool shown) { + if (_runningScriptsWidgetWasVisible && shown) { + _runningScriptsWidget->show(); + } else if (_runningScriptsWidgetWasVisible && !shown) { + _runningScriptsWidget->hide(); + } +} + +void Application::toggleRunningScriptsWidget() { + if (_runningScriptsWidgetWasVisible) { + _runningScriptsWidget->hide(); + _runningScriptsWidgetWasVisible = false; + } else { + _runningScriptsWidget->setBoundary(QRect(_window->geometry().topLeft(), + _window->size())); + _runningScriptsWidget->show(); + _runningScriptsWidgetWasVisible = true; + } +} + +void Application::uploadHead() { + uploadModel(HEAD_MODEL); +} + +void Application::uploadSkeleton() { + uploadModel(SKELETON_MODEL); +} + +void Application::uploadAttachment() { + uploadModel(ATTACHMENT_MODEL); +} + QString Application::getPreviousScriptLocation() { QString suggestedName; if (_previousScriptLocation.isEmpty()) { diff --git a/interface/src/Application.h b/interface/src/Application.h index 91a7ebd29b..ea0de764b9 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -126,7 +126,6 @@ public: ~Application(); void restoreSizeAndPosition(); - ScriptEngine* loadScript(const QString& fileNameString, bool loadScriptFromEditor = false); void loadScripts(); QString getPreviousScriptLocation(); void setPreviousScriptLocation(const QString& previousScriptLocation); @@ -291,7 +290,8 @@ public slots: void loadScriptURLDialog(); void toggleLogDialog(); void initAvatarAndViewFrustum(); - void stopAllScripts(); + ScriptEngine* loadScript(const QString& fileNameString, bool loadScriptFromEditor = false); + void stopAllScripts(bool restart = false); void stopScript(const QString& scriptName); void reloadAllScripts(); void toggleRunningScriptsWidget(); From e1717b1c53f0fed9af37246d51854e510344954a Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Fri, 9 May 2014 15:02:47 -0700 Subject: [PATCH 17/23] Fix bug with mirror settings not initialized --- interface/src/Application.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 61666ccdeb..c9b14d50a1 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -152,6 +152,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _mirrorViewRect(QRect(MIRROR_VIEW_LEFT_PADDING, MIRROR_VIEW_TOP_PADDING, MIRROR_VIEW_WIDTH, MIRROR_VIEW_HEIGHT)), _cameraPushback(0.0f), _scaleMirror(1.0f), + _rotateMirror(0.0f), + _raiseMirror(0.0f), _mouseX(0), _mouseY(0), _lastMouseMove(usecTimestampNow()), From 0474375a39568fbe719cc3ffdd957cd093e727c4 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 9 May 2014 15:13:58 -0700 Subject: [PATCH 18/23] Don't render head attachments in first person mode. --- interface/src/avatar/Avatar.cpp | 8 +++++--- interface/src/avatar/Avatar.h | 2 +- interface/src/avatar/MyAvatar.cpp | 19 ++++++++++++++++++- interface/src/avatar/MyAvatar.h | 3 +++ 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 4de608fc6b..32df49ca0f 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -353,7 +353,7 @@ void Avatar::renderBody(RenderMode renderMode, float glowLevel) { return; } _skeletonModel.render(1.0f, modelRenderMode); - renderAttachments(modelRenderMode); + renderAttachments(renderMode); getHand()->render(false, modelRenderMode); } getHead()->render(1.0f, modelRenderMode); @@ -380,9 +380,11 @@ void Avatar::simulateAttachments(float deltaTime) { } } -void Avatar::renderAttachments(Model::RenderMode renderMode) { +void Avatar::renderAttachments(RenderMode renderMode) { + Model::RenderMode modelRenderMode = (renderMode == SHADOW_RENDER_MODE) ? + Model::SHADOW_RENDER_MODE : Model::DEFAULT_RENDER_MODE; foreach (Model* model, _attachmentModels) { - model->render(1.0f, renderMode); + model->render(1.0f, modelRenderMode); } } diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index edd53e4b8f..289a0500d0 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -192,7 +192,7 @@ protected: virtual bool shouldRenderHead(const glm::vec3& cameraPosition, RenderMode renderMode) const; void simulateAttachments(float deltaTime); - void renderAttachments(Model::RenderMode renderMode); + virtual void renderAttachments(RenderMode renderMode); virtual void updateJointMappings(); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 6ce362071b..52eff6e2ce 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -669,7 +669,7 @@ void MyAvatar::renderBody(RenderMode renderMode, float glowLevel) { Model::RenderMode modelRenderMode = (renderMode == SHADOW_RENDER_MODE) ? Model::SHADOW_RENDER_MODE : Model::DEFAULT_RENDER_MODE; _skeletonModel.render(1.0f, modelRenderMode); - renderAttachments(modelRenderMode); + renderAttachments(renderMode); // Render head so long as the camera isn't inside it if (shouldRenderHead(Application::getInstance()->getCamera()->getPosition(), renderMode)) { @@ -1489,6 +1489,23 @@ void MyAvatar::updateMotionBehaviorsFromMenu() { } } +void MyAvatar::renderAttachments(RenderMode renderMode) { + if (!Application::getInstance()->getCamera()->getMode() == CAMERA_MODE_FIRST_PERSON || renderMode == MIRROR_RENDER_MODE) { + Avatar::renderAttachments(renderMode); + return; + } + const FBXGeometry& geometry = _skeletonModel.getGeometry()->getFBXGeometry(); + QString headJointName = (geometry.headJointIndex == -1) ? QString() : geometry.joints.at(geometry.headJointIndex).name; + Model::RenderMode modelRenderMode = (renderMode == SHADOW_RENDER_MODE) ? + Model::SHADOW_RENDER_MODE : Model::DEFAULT_RENDER_MODE; + for (int i = 0; i < _attachmentData.size(); i++) { + const QString& jointName = _attachmentData.at(i).jointName; + if (jointName != headJointName && jointName != "Head") { + _attachmentModels.at(i)->render(1.0f, modelRenderMode); + } + } +} + void MyAvatar::setCollisionGroups(quint32 collisionGroups) { Avatar::setCollisionGroups(collisionGroups & VALID_COLLISION_GROUPS); Menu* menu = Menu::getInstance(); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 96249aec33..2e47d9c973 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -121,6 +121,9 @@ public slots: signals: void transformChanged(); +protected: + virtual void renderAttachments(RenderMode renderMode); + private: bool _mousePressed; float _bodyPitchDelta; // degrees From 3329cb7638d114ac4aa91cec49ae325da1c7e797 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 9 May 2014 15:25:48 -0700 Subject: [PATCH 19/23] Set the LOD distance on attachments (controls the load priority, too). --- interface/src/avatar/Avatar.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 32df49ca0f..b74adee55a 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -370,6 +370,9 @@ void Avatar::simulateAttachments(float deltaTime) { int jointIndex = getJointIndex(attachment.jointName); glm::vec3 jointPosition; glm::quat jointRotation; + if (!isMyAvatar()) { + model->setLODDistance(getLODDistance()); + } if (_skeletonModel.getJointPosition(jointIndex, jointPosition) && _skeletonModel.getJointRotation(jointIndex, jointRotation)) { model->setTranslation(jointPosition + jointRotation * attachment.translation * _scale); From ea1bcd13a4d579a6f9c76962d8f5d7c372931dab Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Fri, 9 May 2014 17:39:03 -0700 Subject: [PATCH 20/23] Updated guitar with more chords, key triggers --- examples/airGuitar.js | 85 +++++++++++++++++++++++++++++++------------ 1 file changed, 62 insertions(+), 23 deletions(-) diff --git a/examples/airGuitar.js b/examples/airGuitar.js index b7c4b72948..78c16be7bc 100644 --- a/examples/airGuitar.js +++ b/examples/airGuitar.js @@ -35,16 +35,26 @@ var chords = new Array(); chords[1] = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guitars/Guitar+-+Nylon+A.raw"); chords[2] = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guitars/Guitar+-+Nylon+B.raw"); chords[3] = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guitars/Guitar+-+Nylon+E.raw"); +chords[4] = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guitars/Guitar+-+Nylon+G.raw"); + // Electric guitar -chords[4] = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guitars/Guitar+-+Metal+A+short.raw"); -chords[5] = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guitars/Guitar+-+Metal+B+short.raw"); -chords[6] = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guitars/Guitar+-+Metal+E+short.raw"); +chords[5] = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guitars/Guitar+-+Metal+A+short.raw"); +chords[6] = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guitars/Guitar+-+Metal+B+short.raw"); +chords[7] = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guitars/Guitar+-+Metal+E+short.raw"); +chords[8] = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guitars/Guitar+-+Metal+G+short.raw"); -var guitarSelector = 3; +// Steel Guitar +chords[9] = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guitars/Guitar+-+Steel+A.raw"); +chords[10] = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guitars/Guitar+-+Steel+B.raw"); +chords[11] = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guitars/Guitar+-+Steel+E.raw"); +chords[12] = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guitars/Guitar+-+Steel+G.raw"); -var whichChord = chords[guitarSelector + 1]; +var NUM_CHORDS = 4; +var NUM_GUITARS = 3; +var guitarSelector = NUM_CHORDS; +var whichChord = 1; -var leftHanded = false; +var leftHanded = true; if (leftHanded) { var strumHand = 0; var chordHand = 1; @@ -59,20 +69,23 @@ var lastPosition = { x: 0.0, var soundPlaying = false; var selectorPressed = false; +var position; MyAvatar.attach(guitarModel, "Hips", {x: -0.0, y: -0.0, z: 0.0}, Quat.fromPitchYawRollDegrees(0, 0, 0), 1.0); function checkHands(deltaTime) { for (var palm = 0; palm < 2; palm++) { var palmVelocity = Controller.getSpatialControlVelocity(palm * 2 + 1); - var speed = length(palmVelocity) / 4.0; + var volume = length(palmVelocity) / 5.0; var position = Controller.getSpatialControlPosition(palm * 2 + 1); var myPelvis = MyAvatar.position; var trigger = Controller.getTriggerValue(strumHand); var chord = Controller.getTriggerValue(chordHand); + if (volume > 1.0) volume = 1.0; if ((chord > 0.1) && Audio.isInjectorPlaying(soundPlaying)) { // If chord finger trigger pulled, stop current chord + print("stopped sound"); Audio.stopInjector(soundPlaying); } @@ -81,11 +94,10 @@ function checkHands(deltaTime) { // Change guitars if button FWD (5) pressed if (Controller.isButtonPressed(chordHand * BUTTON_COUNT + 5)) { if (!selectorPressed) { - if (guitarSelector == 0) { - guitarSelector = 3; - } else { + guitarSelector += NUM_CHORDS; + if (guitarSelector >= NUM_CHORDS * NUM_GUITARS) { guitarSelector = 0; - } + } selectorPressed = true; } } else { @@ -93,38 +105,65 @@ function checkHands(deltaTime) { } if (Controller.isButtonPressed(chordHand * BUTTON_COUNT + 1)) { - whichChord = chords[guitarSelector + 1]; + whichChord = 1; } else if (Controller.isButtonPressed(chordHand * BUTTON_COUNT + 2)) { - whichChord = chords[guitarSelector + 2]; + whichChord = 2; } else if (Controller.isButtonPressed(chordHand * BUTTON_COUNT + 3)) { - whichChord = chords[guitarSelector + 3]; + whichChord = 3; + } else if (Controller.isButtonPressed(chordHand * BUTTON_COUNT + 4)) { + whichChord = 4; } if (palm == strumHand) { - var STRUM_HEIGHT_ABOVE_PELVIS = 0.00; + var STRUM_HEIGHT_ABOVE_PELVIS = 0.10; var strumTriggerHeight = myPelvis.y + STRUM_HEIGHT_ABOVE_PELVIS; //printVector(position); if ( ( ((position.y < strumTriggerHeight) && (lastPosition.y >= strumTriggerHeight)) || ((position.y > strumTriggerHeight) && (lastPosition.y <= strumTriggerHeight)) ) && (trigger > 0.1) ){ // If hand passes downward or upward through 'strings', and finger trigger pulled, play - var options = new AudioInjectionOptions(); - options.position = position; - if (speed > 1.0) { speed = 1.0; } - options.volume = speed; - if (Audio.isInjectorPlaying(soundPlaying)) { - Audio.stopInjector(soundPlaying); - } - soundPlaying = Audio.playSound(whichChord, options); + playChord(position, volume); } lastPosition = Controller.getSpatialControlPosition(palm * 2 + 1); } } } +function playChord(position, volume) { + var options = new AudioInjectionOptions(); + options.position = position; + options.volume = volume; + if (Audio.isInjectorPlaying(soundPlaying)) { + print("stopped sound"); + Audio.stopInjector(soundPlaying); + } + print("Played sound: " + whichChord + " at volume " + options.volume); + soundPlaying = Audio.playSound(chords[guitarSelector + whichChord], options); +} + +function keyPressEvent(event) { + // check for keypresses and use those to trigger sounds if not hydra + keyVolume = 0.4; + if (event.text == "1") { + whichChord = 1; + playChord(MyAvatar.position, keyVolume); + } else if (event.text == "2") { + whichChord = 2; + playChord(MyAvatar.position, keyVolume); + } else if (event.text == "3") { + whichChord = 3; + playChord(MyAvatar.position, keyVolume); + } else if (event.text == "4") { + whichChord = 4; + playChord(MyAvatar.position, keyVolume); + } +} + function scriptEnding() { MyAvatar.detachOne(guitarModel); } // Connect a call back that happens every frame Script.update.connect(checkHands); Script.scriptEnding.connect(scriptEnding); +Controller.keyPressEvent.connect(keyPressEvent); + From 3b7e0814fe2d2572102e03e9447d29539840ae77 Mon Sep 17 00:00:00 2001 From: Stojce Slavkovski Date: Sun, 11 May 2014 09:57:43 +0200 Subject: [PATCH 21/23] CR fixes --- interface/src/XmppClient.cpp | 2 +- interface/src/ui/SnapshotShareDialog.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/src/XmppClient.cpp b/interface/src/XmppClient.cpp index 666906681c..2d421b1afa 100644 --- a/interface/src/XmppClient.cpp +++ b/interface/src/XmppClient.cpp @@ -16,7 +16,7 @@ #include "XmppClient.h" const QString DEFAULT_XMPP_SERVER = "chat.highfidelity.io"; -const QString DEFAULT_CHAT_ROOM = "public@public-chat.highfidelity.io"; +const QString DEFAULT_CHAT_ROOM = "test@public-chat.highfidelity.io"; XmppClient::XmppClient() : _xmppClient(), diff --git a/interface/src/ui/SnapshotShareDialog.cpp b/interface/src/ui/SnapshotShareDialog.cpp index 5ba284618f..2ac1c81f52 100644 --- a/interface/src/ui/SnapshotShareDialog.cpp +++ b/interface/src/ui/SnapshotShareDialog.cpp @@ -87,13 +87,13 @@ void SnapshotShareDialog::uploadSnapshot() { _networkAccessManager = new QNetworkAccessManager(this); } - QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); + QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QHttpPart apiKeyPart; apiKeyPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"api_key\"")); apiKeyPart.setBody(AccountManager::getInstance().getAccountInfo().getDiscourseApiKey().toLatin1()); - QFile *file = new QFile(_fileName); + QFile* file = new QFile(_fileName); file->open(QIODevice::ReadOnly); QHttpPart imagePart; @@ -109,7 +109,7 @@ void SnapshotShareDialog::uploadSnapshot() { QUrl url(FORUM_UPLOADS_URL); QNetworkRequest request(url); - QNetworkReply *reply = _networkAccessManager->post(request, multiPart); + QNetworkReply* reply = _networkAccessManager->post(request, multiPart); connect(reply, &QNetworkReply::finished, this, &SnapshotShareDialog::uploadRequestFinished); From 3e1d0536c174310bb025f0516ae475282773d785 Mon Sep 17 00:00:00 2001 From: Kai Ludwig Date: Sun, 11 May 2014 16:18:43 +0200 Subject: [PATCH 22/23] Fix for: #19626 - Fix the Windows 7 crash The image data for glTexImage2D is size=width x height without any borders. So there must be a border of 0 given when calling glTexImage2D, otherwise there is not enough image data causing crashes when textures get loaded. The effect occurs reproducible on Win7 with ATI cards. Maybe their OpenGL-Implementation is less robust ... --- interface/src/avatar/Avatar.cpp | 2 +- interface/src/renderer/TextureCache.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index b74adee55a..41dc50b1fa 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -406,7 +406,7 @@ void Avatar::renderBillboard() { } _billboardTexture.reset(new Texture()); glBindTexture(GL_TEXTURE_2D, _billboardTexture->getID()); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 1, + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0, GL_BGRA, GL_UNSIGNED_BYTE, image.constBits()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); diff --git a/interface/src/renderer/TextureCache.cpp b/interface/src/renderer/TextureCache.cpp index f31e4f9060..0588ca70d2 100644 --- a/interface/src/renderer/TextureCache.cpp +++ b/interface/src/renderer/TextureCache.cpp @@ -366,10 +366,10 @@ void NetworkTexture::setImage(const QImage& image, bool translucent) { imageLoaded(image); glBindTexture(GL_TEXTURE_2D, getID()); if (image.hasAlphaChannel()) { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 1, + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0, GL_BGRA, GL_UNSIGNED_BYTE, image.constBits()); } else { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image.width(), image.height(), 1, + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image.width(), image.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.constBits()); } glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); @@ -404,10 +404,10 @@ QSharedPointer DilatableNetworkTexture::getDilatedTexture(float dilatio glBindTexture(GL_TEXTURE_2D, texture->getID()); if (dilatedImage.hasAlphaChannel()) { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dilatedImage.width(), dilatedImage.height(), 1, + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dilatedImage.width(), dilatedImage.height(), 0, GL_BGRA, GL_UNSIGNED_BYTE, dilatedImage.constBits()); } else { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, dilatedImage.width(), dilatedImage.height(), 1, + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, dilatedImage.width(), dilatedImage.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, dilatedImage.constBits()); } glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); From 070d9960961766c201b4b34c9c1b5082e8eab2ef Mon Sep 17 00:00:00 2001 From: Stojce Slavkovski Date: Mon, 12 May 2014 19:47:41 +0200 Subject: [PATCH 23/23] change `key missing` message --- interface/src/ui/SnapshotShareDialog.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/ui/SnapshotShareDialog.cpp b/interface/src/ui/SnapshotShareDialog.cpp index 2ac1c81f52..b5694b3e48 100644 --- a/interface/src/ui/SnapshotShareDialog.cpp +++ b/interface/src/ui/SnapshotShareDialog.cpp @@ -79,7 +79,8 @@ void SnapshotShareDialog::accept() { void SnapshotShareDialog::uploadSnapshot() { if (AccountManager::getInstance().getAccountInfo().getDiscourseApiKey().isEmpty()) { - QMessageBox::warning(this, "", "Your Discourse API key is missing, you cannot share snapshots."); + QMessageBox::warning(this, "", + "Your Discourse API key is missing, you cannot share snapshots. Please try to relog."); return; }