mirror of
https://github.com/overte-org/overte.git
synced 2025-04-21 06:44:06 +02:00
Simplify overlay conductor, menu interation
This commit is contained in:
parent
6ad1008a56
commit
33e9caa636
4 changed files with 42 additions and 110 deletions
|
@ -16,6 +16,8 @@ Window {
|
|||
height: 50
|
||||
clip: true
|
||||
visible: true
|
||||
// Disable this window from being able to call 'desktop.raise() and desktop.showDesktop'
|
||||
activator: Item {}
|
||||
|
||||
Item {
|
||||
width: 50
|
||||
|
@ -28,7 +30,7 @@ Window {
|
|||
MouseArea {
|
||||
readonly property string overlayMenuItem: "Overlays"
|
||||
anchors.fill: parent
|
||||
onClicked: MenuInterface.setIsOptionChecked(overlayMenuItem, !MenuInterface.isOptionChecked(overlayMenuItem))
|
||||
onClicked: MenuInterface.setIsOptionChecked(overlayMenuItem, !MenuInterface.isOptionChecked(overlayMenuItem));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2716,7 +2716,6 @@ void Application::idle(float nsecsElapsed) {
|
|||
if (firstIdle) {
|
||||
firstIdle = false;
|
||||
connect(offscreenUi.data(), &OffscreenUi::showDesktop, this, &Application::showDesktop);
|
||||
_overlayConductor.setEnabled(Menu::getInstance()->isOptionChecked(MenuOption::Overlays));
|
||||
}
|
||||
|
||||
PROFILE_RANGE(__FUNCTION__);
|
||||
|
@ -3217,13 +3216,13 @@ void Application::updateThreads(float deltaTime) {
|
|||
}
|
||||
|
||||
void Application::toggleOverlays() {
|
||||
auto newOverlaysVisible = !_overlayConductor.getEnabled();
|
||||
Menu::getInstance()->setIsOptionChecked(MenuOption::Overlays, newOverlaysVisible);
|
||||
_overlayConductor.setEnabled(newOverlaysVisible);
|
||||
auto menu = Menu::getInstance();
|
||||
menu->setIsOptionChecked(MenuOption::Overlays, menu->isOptionChecked(MenuOption::Overlays));
|
||||
}
|
||||
|
||||
void Application::setOverlaysVisible(bool visible) {
|
||||
_overlayConductor.setEnabled(visible);
|
||||
auto menu = Menu::getInstance();
|
||||
menu->setIsOptionChecked(MenuOption::Overlays, true);
|
||||
}
|
||||
|
||||
void Application::cycleCamera() {
|
||||
|
@ -5306,9 +5305,7 @@ void Application::readArgumentsFromLocalSocket() const {
|
|||
}
|
||||
|
||||
void Application::showDesktop() {
|
||||
if (!_overlayConductor.getEnabled()) {
|
||||
_overlayConductor.setEnabled(true);
|
||||
}
|
||||
Menu::getInstance()->setIsOptionChecked(MenuOption::Overlays, true);
|
||||
}
|
||||
|
||||
CompositorHelper& Application::getApplicationCompositor() const {
|
||||
|
|
|
@ -99,104 +99,50 @@ void OverlayConductor::centerUI() {
|
|||
qApp->getApplicationCompositor().setModelTransform(Transform(camMat));
|
||||
}
|
||||
|
||||
bool OverlayConductor::userWishesToHide() const {
|
||||
// user pressed toggle button.
|
||||
return Menu::getInstance()->isOptionChecked(MenuOption::Overlays) != _prevOverlayMenuChecked && Menu::getInstance()->isOptionChecked(MenuOption::Overlays);
|
||||
}
|
||||
|
||||
bool OverlayConductor::userWishesToShow() const {
|
||||
// user pressed toggle button.
|
||||
return Menu::getInstance()->isOptionChecked(MenuOption::Overlays) != _prevOverlayMenuChecked && !Menu::getInstance()->isOptionChecked(MenuOption::Overlays);
|
||||
}
|
||||
|
||||
void OverlayConductor::setState(State state) {
|
||||
#ifdef WANT_DEBUG
|
||||
static QString stateToString[NumStates] = { "Enabled", "DisabledByDrive", "DisabledByHead", "DisabledByToggle" };
|
||||
qDebug() << "OverlayConductor " << stateToString[state] << "<--" << stateToString[_state];
|
||||
#endif
|
||||
_state = state;
|
||||
}
|
||||
|
||||
OverlayConductor::State OverlayConductor::getState() const {
|
||||
return _state;
|
||||
}
|
||||
|
||||
void OverlayConductor::update(float dt) {
|
||||
auto offscreenUi = DependencyManager::get<OffscreenUi>();
|
||||
bool currentVisible = !offscreenUi->getDesktop()->property("pinned").toBool();
|
||||
|
||||
MyAvatar* myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar();
|
||||
|
||||
// centerUI when hmd mode is first enabled
|
||||
if (qApp->isHMDMode() && !_hmdMode) {
|
||||
// centerUI when hmd mode is first enabled and mounted
|
||||
if (qApp->isHMDMode() && qApp->getActiveDisplayPlugin()->isDisplayVisible() && !_hmdMode) {
|
||||
_hmdMode = true;
|
||||
centerUI();
|
||||
} else {
|
||||
_hmdMode = false;
|
||||
}
|
||||
_hmdMode = qApp->isHMDMode();
|
||||
|
||||
bool prevDriving = _currentDriving;
|
||||
bool isDriving = updateAvatarHasDriveInput();
|
||||
bool drivingChanged = prevDriving != isDriving;
|
||||
|
||||
bool isAtRest = updateAvatarIsAtRest();
|
||||
|
||||
switch (getState()) {
|
||||
case Enabled:
|
||||
if (myAvatar->getClearOverlayWhenDriving() && qApp->isHMDMode() && headOutsideOverlay()) {
|
||||
setState(DisabledByHead);
|
||||
setEnabled(false);
|
||||
}
|
||||
if (userWishesToHide()) {
|
||||
setState(DisabledByToggle);
|
||||
setEnabled(false);
|
||||
}
|
||||
if (myAvatar->getClearOverlayWhenDriving() && drivingChanged && isDriving) {
|
||||
setState(DisabledByDrive);
|
||||
setEnabled(false);
|
||||
}
|
||||
break;
|
||||
case DisabledByDrive:
|
||||
if (!isDriving || userWishesToShow()) {
|
||||
setState(Enabled);
|
||||
setEnabled(true);
|
||||
}
|
||||
break;
|
||||
case DisabledByHead:
|
||||
if (isAtRest || userWishesToShow()) {
|
||||
setState(Enabled);
|
||||
setEnabled(true);
|
||||
}
|
||||
break;
|
||||
case DisabledByToggle:
|
||||
if (userWishesToShow()) {
|
||||
setState(Enabled);
|
||||
setEnabled(true);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if (_flags & SuppressedByDrive) {
|
||||
if (!isDriving) {
|
||||
_flags &= ~SuppressedByDrive;
|
||||
}
|
||||
} else {
|
||||
if (myAvatar->getClearOverlayWhenDriving() && drivingChanged && isDriving) {
|
||||
_flags |= SuppressedByDrive;
|
||||
}
|
||||
}
|
||||
|
||||
_prevOverlayMenuChecked = Menu::getInstance()->isOptionChecked(MenuOption::Overlays);
|
||||
}
|
||||
|
||||
void OverlayConductor::setEnabled(bool enabled) {
|
||||
if (enabled == _enabled) {
|
||||
return;
|
||||
if (_flags & SuppressedByHead) {
|
||||
if (isAtRest) {
|
||||
_flags &= ~SuppressedByHead;
|
||||
}
|
||||
} else {
|
||||
if (_hmdMode && headOutsideOverlay()) {
|
||||
_flags |= SuppressedByHead;
|
||||
}
|
||||
}
|
||||
|
||||
_enabled = enabled; // set the new value
|
||||
auto offscreenUi = DependencyManager::get<OffscreenUi>();
|
||||
offscreenUi->setPinned(!_enabled);
|
||||
|
||||
// ensure that the the state of the menu item reflects the state of the overlay.
|
||||
Menu::getInstance()->setIsOptionChecked(MenuOption::Overlays, _enabled);
|
||||
_prevOverlayMenuChecked = _enabled;
|
||||
|
||||
// if the new state is visible/enabled...
|
||||
if (_enabled && qApp->isHMDMode()) {
|
||||
centerUI();
|
||||
bool targetVisible = Menu::getInstance()->isOptionChecked(MenuOption::Overlays) && (0 == (_flags & SuppressMask));
|
||||
if (targetVisible != currentVisible) {
|
||||
offscreenUi->setPinned(!targetVisible);
|
||||
if (targetVisible && _hmdMode) {
|
||||
centerUI();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool OverlayConductor::getEnabled() const {
|
||||
return _enabled;
|
||||
}
|
||||
|
||||
|
|
|
@ -17,33 +17,20 @@ public:
|
|||
~OverlayConductor();
|
||||
|
||||
void update(float dt);
|
||||
void setEnabled(bool enable);
|
||||
bool getEnabled() const;
|
||||
|
||||
void centerUI();
|
||||
|
||||
private:
|
||||
bool headOutsideOverlay() const;
|
||||
bool updateAvatarHasDriveInput();
|
||||
bool updateAvatarIsAtRest();
|
||||
bool userWishesToHide() const;
|
||||
bool userWishesToShow() const;
|
||||
|
||||
enum State {
|
||||
Enabled = 0,
|
||||
DisabledByDrive,
|
||||
DisabledByHead,
|
||||
DisabledByToggle,
|
||||
NumStates
|
||||
enum SupressionFlags {
|
||||
SuppressedByDrive = 0x01,
|
||||
SuppressedByHead = 0x02,
|
||||
SuppressMask = 0x03,
|
||||
};
|
||||
|
||||
void setState(State state);
|
||||
State getState() const;
|
||||
|
||||
State _state { DisabledByDrive };
|
||||
|
||||
bool _prevOverlayMenuChecked { true };
|
||||
bool _enabled { false };
|
||||
uint8_t _flags { SuppressedByDrive };
|
||||
bool _hmdMode { false };
|
||||
|
||||
// used by updateAvatarHasDriveInput
|
||||
|
|
Loading…
Reference in a new issue