Showing the changes to interface/src/ui/PreferencesDialog.cpp (1 of 8 files). Show all
Unified · Split
| @@ -1,16 +1,12 @@ | |||
| 1 | // | 1 | // |
| 2 | // PreferencesDialog.cpp | 2 | // Re-created Bradley Austin Davis on 2016/01/22 |
| 3 | // interface/src/ui | 3 | // Copyright 2016 High Fidelity, Inc. |
| 4 | // | ||
| 5 | // Created by Stojce Slavkovski on 2/20/14. | ||
| 6 | // Copyright 2014 High Fidelity, Inc. | ||
| 7 | // | 4 | // |
| 8 | // Distributed under the Apache License, Version 2.0. | 5 | // Distributed under the Apache License, Version 2.0. |
| 9 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | 6 | // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html |
| 10 | // | 7 | // |
| 11 | 8 | ||
| 12 | #include <QFileDialog> | 9 | #include "PreferencesDialog.h" |
| 13 | #include <QFont> | ||
| 14 | 10 | ||
| 15 | #include <AudioClient.h> | 11 | #include <AudioClient.h> |
| 16 | #include <avatar/AvatarManager.h> | 12 | #include <avatar/AvatarManager.h> |
| @@ -19,19 +15,14 @@ · 2 unmodified lines | |||
| 19 | #include <NetworkingConstants.h> | 15 | #include <NetworkingConstants.h> |
| 20 | #include <ScriptEngines.h> | 16 | #include <ScriptEngines.h> |
| 21 | #include <OffscreenUi.h> | 17 | #include <OffscreenUi.h> |
| 22 | #include <QtQml/QQmlContext> | ||
| 23 | #include <Preferences.h> | 18 | #include <Preferences.h> |
| 24 | 19 | ||
| 25 | #include "Application.h" | 20 | #include "Application.h" |
| 26 | #include "DialogsManager.h" | 21 | #include "DialogsManager.h" |
| 27 | #include "MainWindow.h" | ||
| 28 | #include "LODManager.h" | 22 | #include "LODManager.h" |
| 29 | #include "Menu.h" | 23 | #include "Menu.h" |
| 30 | #include "PreferencesDialog.h" | ||
| 31 | #include "Snapshot.h" | 24 | #include "Snapshot.h" |
| 32 | #include "UserActivityLogger.h" | 25 | #include "UserActivityLogger.h" |
| 33 | #include "UIUtil.h" | ||
| 34 | #include "scripting/WebWindowClass.h" | ||
| 35 | 26 | ||
| 36 | void setupPreferences() { | 27 | void setupPreferences() { |
| 37 | auto preferences = DependencyManager::get<Preferences>(); | 28 | auto preferences = DependencyManager::get<Preferences>(); |
| @@ -320,299 +311,3 @@ void setupPreferences() { · 282 unmodified lines | |||
| 320 | preferences->addPreference(preference); | 311 | preferences->addPreference(preference); |
| 321 | } | 312 | } |
| 322 | } | 313 | } |
| 323 | |||
| 324 | const int PREFERENCES_HEIGHT_PADDING = 20; | ||
| 325 | |||
| 326 | PreferencesDialog::PreferencesDialog(QWidget* parent) : | ||
| 327 | QDialog(parent) | ||
| 328 | { | ||
| 329 | setAttribute(Qt::WA_DeleteOnClose); | ||
| 330 | |||
| 331 | ui.setupUi(this); | ||
| 332 | loadPreferences(); | ||
| 333 | |||
| 334 | ui.outputBufferSizeSpinner->setMinimum(MIN_AUDIO_OUTPUT_BUFFER_SIZE_FRAMES); | ||
| 335 | ui.outputBufferSizeSpinner->setMaximum(MAX_AUDIO_OUTPUT_BUFFER_SIZE_FRAMES); | ||
| 336 | |||
| 337 | connect(ui.buttonBrowseLocation, &QPushButton::clicked, this, &PreferencesDialog::openSnapshotLocationBrowser); | ||
| 338 | connect(ui.buttonBrowseScriptsLocation, &QPushButton::clicked, this, &PreferencesDialog::openScriptsLocationBrowser); | ||
| 339 | connect(ui.buttonReloadDefaultScripts, &QPushButton::clicked, [] { | ||
| 340 | DependencyManager::get<ScriptEngines>()->loadDefaultScripts(); | ||
| 341 | }); | ||
| 342 | |||
| 343 | connect(ui.buttonChangeAppearance, &QPushButton::clicked, this, &PreferencesDialog::openFullAvatarModelBrowser); | ||
| 344 | connect(ui.appearanceDescription, &QLineEdit::editingFinished, this, &PreferencesDialog::changeFullAvatarURL); | ||
| 345 | connect(ui.useAcuityCheckBox, &QCheckBox::clicked, this, &PreferencesDialog::changeUseAcuity); | ||
| 346 | |||
| 347 | connect(qApp, &Application::fullAvatarURLChanged, this, &PreferencesDialog::fullAvatarURLChanged); | ||
| 348 | |||
| 349 | // move dialog to left side | ||
| 350 | move(parentWidget()->geometry().topLeft()); | ||
| 351 | resize(sizeHint().width(), parentWidget()->size().height() - PREFERENCES_HEIGHT_PADDING); | ||
| 352 | |||
| 353 | UIUtil::scaleWidgetFontSizes(this); | ||
| 354 | } | ||
| 355 | |||
| 356 | void PreferencesDialog::changeUseAcuity() { | ||
| 357 | bool useAcuity = ui.useAcuityCheckBox->isChecked(); | ||
| 358 | ui.label_desktopMinimumFPSSpin->setEnabled(useAcuity); | ||
| 359 | ui.desktopMinimumFPSSpin->setEnabled(useAcuity); | ||
| 360 | ui.label_hmdMinimumFPSSpin->setEnabled(useAcuity); | ||
| 361 | ui.hmdMinimumFPSSpin->setEnabled(useAcuity); | ||
| 362 | ui.label_smallestReasonableRenderHorizon->setEnabled(!useAcuity); | ||
| 363 | ui.smallestReasonableRenderHorizon->setEnabled(!useAcuity); | ||
| 364 | Menu::getInstance()->getActionForOption(MenuOption::LodTools)->setEnabled(useAcuity); | ||
| 365 | Menu::getInstance()->getSubMenuFromName(MenuOption::RenderResolution, Menu::getInstance()->getSubMenuFromName("Render", Menu::getInstance()->getMenu("Developer")))->setEnabled(useAcuity); | ||
| 366 | } | ||
| 367 | void PreferencesDialog::changeFullAvatarURL() { | ||
| 368 | DependencyManager::get<AvatarManager>()->getMyAvatar()->useFullAvatarURL(ui.appearanceDescription->text(), ""); | ||
| 369 | this->fullAvatarURLChanged(ui.appearanceDescription->text(), ""); | ||
| 370 | } | ||
| 371 | |||
| 372 | void PreferencesDialog::fullAvatarURLChanged(const QString& newValue, const QString& modelName) { | ||
| 373 | ui.appearanceDescription->setText(newValue); | ||
| 374 | const QString APPEARANCE_LABEL_TEXT("Appearance: "); | ||
| 375 | ui.appearanceLabel->setText(APPEARANCE_LABEL_TEXT + modelName); | ||
| 376 | } | ||
| 377 | |||
| 378 | void PreferencesDialog::accept() { | ||
| 379 | MyAvatar* myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar(); | ||
| 380 | |||
| 381 | // if there is an attempted change to the full avatar URL, apply it now | ||
| 382 | if (QUrl(ui.appearanceDescription->text()) != myAvatar->getFullAvatarURLFromPreferences()) { | ||
| 383 | changeFullAvatarURL(); | ||
| 384 | } | ||
| 385 | |||
| 386 | _lastGoodAvatarURL = myAvatar->getFullAvatarURLFromPreferences(); | ||
| 387 | _lastGoodAvatarName = myAvatar->getFullAvatarModelName(); | ||
| 388 | |||
| 389 | savePreferences(); | ||
| 390 | |||
| 391 | close(); | ||
| 392 | delete _marketplaceWindow; | ||
| 393 | _marketplaceWindow = NULL; | ||
| 394 | } | ||
| 395 | |||
| 396 | void PreferencesDialog::restoreLastGoodAvatar() { | ||
| 397 | const QString& url = _lastGoodAvatarURL.toString(); | ||
| 398 | fullAvatarURLChanged(url, _lastGoodAvatarName); | ||
| 399 | DependencyManager::get<AvatarManager>()->getMyAvatar()->useFullAvatarURL(url, _lastGoodAvatarName); | ||
| 400 | } | ||
| 401 | |||
| 402 | void PreferencesDialog::reject() { | ||
| 403 | restoreLastGoodAvatar(); | ||
| 404 | QDialog::reject(); | ||
| 405 | } | ||
| 406 | |||
| 407 | void PreferencesDialog::openSnapshotLocationBrowser() { | ||
| 408 | QString dir = QFileDialog::getExistingDirectory(this, tr("Snapshots Location"), | ||
| 409 | QStandardPaths::writableLocation(QStandardPaths::DesktopLocation), | ||
| 410 | QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); | ||
| 411 | if (!dir.isNull() && !dir.isEmpty()) { | ||
| 412 | ui.snapshotLocationEdit->setText(dir); | ||
| 413 | } | ||
| 414 | } | ||
| 415 | |||
| 416 | void PreferencesDialog::openScriptsLocationBrowser() { | ||
| 417 | QString dir = QFileDialog::getExistingDirectory(this, tr("Scripts Location"), | ||
| 418 | ui.scriptsLocationEdit->text(), | ||
| 419 | QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); | ||
| 420 | if (!dir.isNull() && !dir.isEmpty()) { | ||
| 421 | ui.scriptsLocationEdit->setText(dir); | ||
| 422 | } | ||
| 423 | } | ||
| 424 | void PreferencesDialog::openFullAvatarModelBrowser() { | ||
| 425 | const auto MARKETPLACE_URL = NetworkingConstants::METAVERSE_SERVER_URL.toString() + "/marketplace?category=avatars"; | ||
| 426 | const auto WIDTH = 900; | ||
| 427 | const auto HEIGHT = 700; | ||
| 428 | if (!_marketplaceWindow) { | ||
| 429 | _marketplaceWindow = new WebWindowClass("Marketplace", MARKETPLACE_URL, WIDTH, HEIGHT); | ||
| 430 | } | ||
| 431 | _marketplaceWindow->setVisible(true); | ||
| 432 | |||
| 433 | } | ||
| 434 | |||
| 435 | void PreferencesDialog::resizeEvent(QResizeEvent *resizeEvent) { | ||
| 436 | |||
| 437 | // keep buttons panel at the bottom | ||
| 438 | ui.buttonsPanel->setGeometry(0, | ||
| 439 | size().height() - ui.buttonsPanel->height(), | ||
| 440 | size().width(), | ||
| 441 | ui.buttonsPanel->height()); | ||
| 442 | |||
| 443 | // set width and height of srcollarea to match bottom panel and width | ||
| 444 | ui.scrollArea->setGeometry(ui.scrollArea->geometry().x(), ui.scrollArea->geometry().y(), | ||
| 445 | size().width(), | ||
| 446 | size().height() - ui.buttonsPanel->height() - ui.scrollArea->geometry().y()); | ||
| 447 | |||
| 448 | } | ||
| 449 | |||
| 450 | void PreferencesDialog::loadPreferences() { | ||
| 451 | |||
| 452 | MyAvatar* myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar(); | ||
| 453 | Menu* menuInstance = Menu::getInstance(); | ||
| 454 | |||
| 455 | _displayNameString = myAvatar->getDisplayName(); | ||
| 456 | ui.displayNameEdit->setText(_displayNameString); | ||
| 457 | |||
| 458 | ui.collisionSoundURLEdit->setText(myAvatar->getCollisionSoundURL()); | ||
| 459 | |||
| 460 | _lastGoodAvatarURL = myAvatar->getFullAvatarURLFromPreferences(); | ||
| 461 | _lastGoodAvatarName = myAvatar->getFullAvatarModelName(); | ||
| 462 | fullAvatarURLChanged(_lastGoodAvatarURL.toString(), _lastGoodAvatarName); | ||
| 463 | |||
| 464 | ui.sendDataCheckBox->setChecked(!menuInstance->isOptionChecked(MenuOption::DisableActivityLogger)); | ||
| 465 | |||
| 466 | ui.snapshotLocationEdit->setText(Snapshot::snapshotsLocation.get()); | ||
| 467 | |||
| 468 | ui.scriptsLocationEdit->setText(DependencyManager::get<ScriptEngines>()->getScriptsLocation()); | ||
| 469 | |||
| 470 | ui.pupilDilationSlider->setValue(myAvatar->getHead()->getPupilDilation() * | ||
| 471 | ui.pupilDilationSlider->maximum()); | ||
| 472 | |||
| 473 | auto dde = DependencyManager::get<DdeFaceTracker>(); | ||
| 474 | ui.ddeEyeClosingThresholdSlider->setValue(dde->getEyeClosingThreshold() * | ||
| 475 | ui.ddeEyeClosingThresholdSlider->maximum()); | ||
| 476 | |||
| 477 | ui.faceTrackerEyeDeflectionSider->setValue(FaceTracker::getEyeDeflection() * | ||
| 478 | ui.faceTrackerEyeDeflectionSider->maximum()); | ||
| 479 | |||
| 480 | auto faceshift = DependencyManager::get<Faceshift>(); | ||
| 481 | ui.faceshiftHostnameEdit->setText(faceshift->getHostname()); | ||
| 482 | |||
| 483 | auto audio = DependencyManager::get<AudioClient>(); | ||
| 484 | MixedProcessedAudioStream& stream = audio->getReceivedAudioStream(); | ||
| 485 | |||
| 486 | ui.dynamicJitterBuffersCheckBox->setChecked(stream.getDynamicJitterBuffers()); | ||
| 487 | ui.staticDesiredJitterBufferFramesSpin->setValue(stream.getDesiredJitterBufferFrames()); | ||
| 488 | ui.maxFramesOverDesiredSpin->setValue(stream.getMaxFramesOverDesired()); | ||
| 489 | ui.useStdevForJitterCalcCheckBox->setChecked(stream.getUseStDevForJitterCalc()); | ||
| 490 | ui.windowStarveThresholdSpin->setValue(stream.getWindowStarveThreshold()); | ||
| 491 | ui.windowSecondsForDesiredCalcOnTooManyStarvesSpin->setValue( | ||
| 492 | stream.getWindowSecondsForDesiredCalcOnTooManyStarves()); | ||
| 493 | ui.windowSecondsForDesiredReductionSpin->setValue(stream.getWindowSecondsForDesiredReduction()); | ||
| 494 | ui.repetitionWithFadeCheckBox->setChecked(stream.getRepetitionWithFade()); | ||
| 495 | |||
| 496 | ui.outputBufferSizeSpinner->setValue(audio->getOutputBufferSize()); | ||
| 497 | |||
| 498 | ui.outputStarveDetectionCheckBox->setChecked(audio->getOutputStarveDetectionEnabled()); | ||
| 499 | ui.outputStarveDetectionThresholdSpinner->setValue(audio->getOutputStarveDetectionThreshold()); | ||
| 500 | ui.outputStarveDetectionPeriodSpinner->setValue(audio->getOutputStarveDetectionPeriod()); | ||
| 501 | |||
| 502 | ui.realWorldFieldOfViewSpin->setValue(myAvatar->getRealWorldFieldOfView()); | ||
| 503 | |||
| 504 | ui.fieldOfViewSpin->setValue(qApp->getFieldOfView()); | ||
| 505 | |||
| 506 | ui.leanScaleSpin->setValue(myAvatar->getLeanScale()); | ||
| 507 | |||
| 508 | ui.avatarScaleSpin->setValue(myAvatar->getUniformScale()); | ||
| 509 | ui.avatarAnimationEdit->setText(myAvatar->getAnimGraphUrl().toString()); | ||
| 510 | |||
| 511 | ui.maxOctreePPSSpin->setValue(qApp->getMaxOctreePacketsPerSecond()); | ||
| 512 | |||
| 513 | #if 0 | ||
| 514 | ui.oculusUIAngularSizeSpin->setValue(qApp->getApplicationCompositor().getHmdUIAngularSize()); | ||
| 515 | #endif | ||
| 516 | |||
| 517 | ui.sixenseReticleMoveSpeedSpin->setValue(controller::InputDevice::getReticleMoveSpeed()); | ||
| 518 | |||
| 519 | // LOD items | ||
| 520 | auto lodManager = DependencyManager::get<LODManager>(); | ||
| 521 | ui.useAcuityCheckBox->setChecked(lodManager->getUseAcuity()); | ||
| 522 | ui.desktopMinimumFPSSpin->setValue(lodManager->getDesktopLODDecreaseFPS()); | ||
| 523 | ui.hmdMinimumFPSSpin->setValue(lodManager->getHMDLODDecreaseFPS()); | ||
| 524 | ui.smallestReasonableRenderHorizon->setValue(1.0f / lodManager->getRenderDistanceInverseHighLimit()); | ||
| 525 | changeUseAcuity(); | ||
| 526 | } | ||
| 527 | |||
| 528 | void PreferencesDialog::savePreferences() { | ||
| 529 | |||
| 530 | MyAvatar* myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar(); | ||
| 531 | |||
| 532 | bool shouldDispatchIdentityPacket = false; | ||
| 533 | |||
| 534 | QString displayNameStr(ui.displayNameEdit->text()); | ||
| 535 | if (displayNameStr != _displayNameString) { | ||
| 536 | myAvatar->setDisplayName(displayNameStr); | ||
| 537 | UserActivityLogger::getInstance().changedDisplayName(displayNameStr); | ||
| 538 | shouldDispatchIdentityPacket = true; | ||
| 539 | } | ||
| 540 | |||
| 541 | if (shouldDispatchIdentityPacket) { | ||
| 542 | myAvatar->sendIdentityPacket(); | ||
| 543 | } | ||
| 544 | |||
| 545 | myAvatar->setCollisionSoundURL(ui.collisionSoundURLEdit->text()); | ||
| 546 | |||
| 547 | // MyAvatar persists its own data. If it doesn't agree with what the user has explicitly accepted, set it back to old values. | ||
| 548 | if (_lastGoodAvatarURL != myAvatar->getFullAvatarURLFromPreferences()) { | ||
| 549 | restoreLastGoodAvatar(); | ||
| 550 | } | ||
| 551 | |||
| 552 | if (!Menu::getInstance()->isOptionChecked(MenuOption::DisableActivityLogger) | ||
| 553 | != ui.sendDataCheckBox->isChecked()) { | ||
| 554 | Menu::getInstance()->triggerOption(MenuOption::DisableActivityLogger); | ||
| 555 | } | ||
| 556 | |||
| 557 | if (!ui.snapshotLocationEdit->text().isEmpty() && QDir(ui.snapshotLocationEdit->text()).exists()) { | ||
| 558 | Snapshot::snapshotsLocation.set(ui.snapshotLocationEdit->text()); | ||
| 559 | } | ||
| 560 | |||
| 561 | if (!ui.scriptsLocationEdit->text().isEmpty() && QDir(ui.scriptsLocationEdit->text()).exists()) { | ||
| 562 | DependencyManager::get<ScriptEngines>()->setScriptsLocation(ui.scriptsLocationEdit->text()); | ||
| 563 | } | ||
| 564 | |||
| 565 | myAvatar->getHead()->setPupilDilation(ui.pupilDilationSlider->value() / (float)ui.pupilDilationSlider->maximum()); | ||
| 566 | myAvatar->setLeanScale(ui.leanScaleSpin->value()); | ||
| 567 | myAvatar->setTargetScaleVerbose(ui.avatarScaleSpin->value()); | ||
| 568 | if (myAvatar->getAnimGraphUrl() != ui.avatarAnimationEdit->text()) { // If changed, destroy the old and start with the new | ||
| 569 | myAvatar->setAnimGraphUrl(ui.avatarAnimationEdit->text()); | ||
| 570 | } | ||
| 571 | |||
| 572 | myAvatar->setRealWorldFieldOfView(ui.realWorldFieldOfViewSpin->value()); | ||
| 573 | |||
| 574 | qApp->setFieldOfView(ui.fieldOfViewSpin->value()); | ||
| 575 | |||
| 576 | auto dde = DependencyManager::get<DdeFaceTracker>(); | ||
| 577 | dde->setEyeClosingThreshold(ui.ddeEyeClosingThresholdSlider->value() / | ||
| 578 | (float)ui.ddeEyeClosingThresholdSlider->maximum()); | ||
| 579 | |||
| 580 | FaceTracker::setEyeDeflection(ui.faceTrackerEyeDeflectionSider->value() / | ||
| 581 | (float)ui.faceTrackerEyeDeflectionSider->maximum()); | ||
| 582 | |||
| 583 | auto faceshift = DependencyManager::get<Faceshift>(); | ||
| 584 | faceshift->setHostname(ui.faceshiftHostnameEdit->text()); | ||
| 585 | |||
| 586 | qApp->setMaxOctreePacketsPerSecond(ui.maxOctreePPSSpin->value()); | ||
| 587 | |||
| 588 | qApp->getApplicationCompositor().setHmdUIAngularSize(ui.oculusUIAngularSizeSpin->value()); | ||
| 589 | |||
| 590 | controller::InputDevice::setReticleMoveSpeed(ui.sixenseReticleMoveSpeedSpin->value()); | ||
| 591 | |||
| 592 | auto audio = DependencyManager::get<AudioClient>(); | ||
| 593 | MixedProcessedAudioStream& stream = audio->getReceivedAudioStream(); | ||
| 594 | |||
| 595 | stream.setDynamicJitterBuffers(ui.dynamicJitterBuffersCheckBox->isChecked()); | ||
| 596 | stream.setStaticDesiredJitterBufferFrames(ui.staticDesiredJitterBufferFramesSpin->value()); | ||
| 597 | stream.setMaxFramesOverDesired(ui.maxFramesOverDesiredSpin->value()); | ||
| 598 | stream.setUseStDevForJitterCalc(ui.useStdevForJitterCalcCheckBox->isChecked()); | ||
| 599 | stream.setWindowStarveThreshold(ui.windowStarveThresholdSpin->value()); | ||
| 600 | stream.setWindowSecondsForDesiredCalcOnTooManyStarves(ui.windowSecondsForDesiredCalcOnTooManyStarvesSpin->value()); | ||
| 601 | stream.setWindowSecondsForDesiredReduction(ui.windowSecondsForDesiredReductionSpin->value()); | ||
| 602 | stream.setRepetitionWithFade(ui.repetitionWithFadeCheckBox->isChecked()); | ||
| 603 | |||
| 604 | QMetaObject::invokeMethod(audio.data(), "setOutputBufferSize", Q_ARG(int, ui.outputBufferSizeSpinner->value())); | ||
| 605 | |||
| 606 | audio->setOutputStarveDetectionEnabled(ui.outputStarveDetectionCheckBox->isChecked()); | ||
| 607 | audio->setOutputStarveDetectionThreshold(ui.outputStarveDetectionThresholdSpinner->value()); | ||
| 608 | audio->setOutputStarveDetectionPeriod(ui.outputStarveDetectionPeriodSpinner->value()); | ||
| 609 | |||
| 610 | qApp->resizeGL(); | ||
| 611 | |||
| 612 | // LOD items | ||
| 613 | auto lodManager = DependencyManager::get<LODManager>(); | ||
| 614 | lodManager->setUseAcuity(ui.useAcuityCheckBox->isChecked()); | ||
| 615 | lodManager->setDesktopLODDecreaseFPS(ui.desktopMinimumFPSSpin->value()); | ||
| 616 | lodManager->setHMDLODDecreaseFPS(ui.hmdMinimumFPSSpin->value()); | ||
| 617 | lodManager->setRenderDistanceInverseHighLimit(1.0f / ui.smallestReasonableRenderHorizon->value()); | ||
| 618 | } | ||