Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/windowing/StarPaneManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/windowing/StarPaneManager.cpp')
-rw-r--r--source/windowing/StarPaneManager.cpp71
1 files changed, 40 insertions, 31 deletions
diff --git a/source/windowing/StarPaneManager.cpp b/source/windowing/StarPaneManager.cpp
index 4f4cee7..d8a727a 100644
--- a/source/windowing/StarPaneManager.cpp
+++ b/source/windowing/StarPaneManager.cpp
@@ -17,11 +17,9 @@ EnumMap<PaneLayer> const PaneLayerNames{
PaneManager::PaneManager()
: m_context(GuiContext::singletonPtr()), m_prevInterfaceScale(1) {
auto assets = Root::singleton().assets();
- m_tooltipMouseoverTime = assets->json("/panes.config:tooltipMouseoverTime").toFloat();
m_tooltipMouseoverRadius = assets->json("/panes.config:tooltipMouseoverRadius").toFloat();
m_tooltipMouseOffset = jsonToVec2I(assets->json("/panes.config:tooltipMouseoverOffset"));
-
- m_tooltipShowTimer = m_tooltipMouseoverTime;
+ m_tooltipShowTimer = GameTimer(assets->json("/panes.config:tooltipMouseoverTime").toFloat());
}
void PaneManager::displayPane(PaneLayer paneLayer, PanePtr const& pane, DismissCallback onDismiss) {
@@ -124,7 +122,9 @@ PanePtr PaneManager::getPaneAt(Set<PaneLayer> const& paneLayers, Vec2I const& po
PanePtr PaneManager::getPaneAt(Vec2I const& position) const {
for (auto const& layerPair : m_displayedPanes) {
for (auto const& panePair : layerPair.second) {
- if (panePair.first->inWindow(position) && panePair.first->active())
+ if (panePair.first != m_activeTooltip
+ && panePair.first->inWindow(position)
+ && panePair.first->active())
return panePair.first;
}
}
@@ -184,13 +184,13 @@ bool PaneManager::sendInputEvent(InputEvent const& event) {
}
}
- if (event.is<MouseButtonDownEvent>() || vmag(m_tooltipInitialPosition - m_tooltipLastMousePos) > m_tooltipMouseoverRadius) {
- m_tooltipShowTimer = m_tooltipMouseoverTime;
+ if (event.is<MouseButtonDownEvent>()) {
+ m_tooltipShowTimer.reset();
if (m_activeTooltip) {
dismiss(m_activeTooltip);
m_activeTooltip.reset();
m_tooltipParentPane.reset();
- m_tooltipShowTimer = m_tooltipMouseoverTime;
+ m_tooltipShowTimer.reset();
}
}
@@ -270,37 +270,46 @@ void PaneManager::render() {
}
void PaneManager::update(float dt) {
- m_tooltipShowTimer -= GlobalTimestep;
- if (m_tooltipShowTimer < 0 && !m_activeTooltip) {
- if (auto parentPane = getPaneAt(m_tooltipLastMousePos)) {
- if (auto tooltip = parentPane->createTooltip(m_tooltipLastMousePos)) {
+ auto newTooltipParentPane = getPaneAt(m_tooltipLastMousePos);
+
+ bool updateTooltip = m_tooltipShowTimer.tick(dt) || (m_activeTooltip && (
+ vmag(m_tooltipInitialPosition - m_tooltipLastMousePos) > m_tooltipMouseoverRadius
+ || m_tooltipParentPane != newTooltipParentPane
+ || !m_tooltipParentPane->inWindow(m_tooltipLastMousePos)));
+
+ if (updateTooltip) {
+ if (m_activeTooltip) {
+ dismiss(m_activeTooltip);
+ m_activeTooltip.reset();
+ m_tooltipParentPane.reset();
+ }
+
+ m_tooltipShowTimer.reset();
+ if (newTooltipParentPane) {
+ if (auto tooltip = newTooltipParentPane->createTooltip(m_tooltipLastMousePos)) {
m_activeTooltip = std::move(tooltip);
- m_tooltipParentPane = std::move(parentPane);
+ m_tooltipParentPane = std::move(newTooltipParentPane);
m_tooltipInitialPosition = m_tooltipLastMousePos;
displayPane(PaneLayer::Tooltip, m_activeTooltip);
+ }
+ }
+ }
- Vec2I offsetDirection = Vec2I::filled(1);
- Vec2I offsetAdjust = Vec2I();
+ if (m_activeTooltip) {
+ Vec2I offsetDirection = Vec2I::filled(1);
+ Vec2I offsetAdjust = Vec2I();
- if (m_tooltipLastMousePos[0] + m_tooltipMouseOffset[0] + m_activeTooltip->size()[0] > (int)m_context->windowWidth() / m_context->interfaceScale()) {
- offsetDirection[0] = -1;
- offsetAdjust[0] = -m_activeTooltip->size()[0];
- }
+ if (m_tooltipLastMousePos[0] + m_tooltipMouseOffset[0] + m_activeTooltip->size()[0] > (int)m_context->windowWidth() / m_context->interfaceScale()) {
+ offsetDirection[0] = -1;
+ offsetAdjust[0] = -m_activeTooltip->size()[0];
+ }
- if (m_tooltipLastMousePos[1] + m_tooltipMouseOffset[1] - m_activeTooltip->size()[1] < 0)
- offsetDirection[1] = -1;
- else
- offsetAdjust[1] = -m_activeTooltip->size()[1];
+ if (m_tooltipLastMousePos[1] + m_tooltipMouseOffset[1] - m_activeTooltip->size()[1] < 0)
+ offsetDirection[1] = -1;
+ else
+ offsetAdjust[1] = -m_activeTooltip->size()[1];
- m_activeTooltip->setPosition(m_tooltipLastMousePos + (offsetAdjust + m_tooltipMouseOffset.piecewiseMultiply(offsetDirection)));
- } else {
- m_tooltipShowTimer = m_tooltipMouseoverTime;
- }
- }
- } else if (m_activeTooltip && !m_tooltipParentPane->isDisplayed()) {
- dismiss(m_activeTooltip);
- m_activeTooltip.reset();
- m_tooltipParentPane.reset();
+ m_activeTooltip->setPosition(m_tooltipLastMousePos + (offsetAdjust + m_tooltipMouseOffset.piecewiseMultiply(offsetDirection)));
}
for (auto const& layerPair : m_displayedPanes) {