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

summaryrefslogtreecommitdiff
path: root/source/windowing/StarPaneManager.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/windowing/StarPaneManager.hpp')
-rw-r--r--source/windowing/StarPaneManager.hpp104
1 files changed, 104 insertions, 0 deletions
diff --git a/source/windowing/StarPaneManager.hpp b/source/windowing/StarPaneManager.hpp
new file mode 100644
index 0000000..cdc6901
--- /dev/null
+++ b/source/windowing/StarPaneManager.hpp
@@ -0,0 +1,104 @@
+#ifndef STAR_PANE_MANAGER_HPP
+#define STAR_PANE_MANAGER_HPP
+
+#include "StarPane.hpp"
+#include "StarOrderedMap.hpp"
+
+namespace Star {
+
+STAR_CLASS(PaneManager);
+
+enum class PaneLayer {
+ // A special class of window only meant to be used by PaneManager to display
+ // tooltips given by Pane::createTooltip
+ Tooltip,
+ // A special class of window that is displayed above all other windows and
+ // turns off input to other windows and the hud until it is dismissed.
+ ModalWindow,
+ // Window layer for regular windows that are regularly displayed and
+ // dismissed and dragged around.
+ Window,
+ // The bottom GUI layer, for persistent hud elements that are always or almost
+ // always shown. Not key dismissable.
+ Hud,
+ // Layer for interface elements which are logically part of the world but
+ // handled by GUI panes (such as wires)
+ World
+};
+
+// This class handles a set of panes to be drawn as a collective windowing
+// interface. It is a set of panes on separate distinct layers, where each
+// layer contains a z-ordered list of panes to display.
+class PaneManager {
+public:
+ typedef function<void(PanePtr const&)> DismissCallback;
+
+ PaneManager();
+
+ // Display a pane on any given layer. The pane lifetime in this class is
+ // only during display, once dismissed, the pane is forgotten completely.
+ void displayPane(PaneLayer paneLayer, PanePtr const& pane, DismissCallback onDismiss = {});
+
+ bool isDisplayed(PanePtr const& pane) const;
+
+ // Dismiss a given displayed pane. Pane must already be displayed.
+ void dismissPane(PanePtr const& pane);
+
+ // Dismisses all panes in the given layers.
+ void dismissAllPanes(Set<PaneLayer> const& paneLayers);
+ void dismissAllPanes();
+
+ PanePtr topPane(Set<PaneLayer> const& paneLayers) const;
+ PanePtr topPane() const;
+
+ // Brign an already displayed pane to the top of its layer.
+ void bringToTop(PanePtr const& pane);
+
+ // Position a pane adjacent to an anchor pane in a direction where
+ // it will fit on the screen
+ void bringPaneAdjacent(PanePtr const& anchor, PanePtr const& adjacent, int gap);
+
+ PanePtr getPaneAt(Set<PaneLayer> const& paneLayers, Vec2I const& position) const;
+ PanePtr getPaneAt(Vec2I const& position) const;
+
+ void setBackgroundWidget(WidgetPtr bg);
+
+ // Returns the pane that has captured the keyboard, if any.
+ PanePtr keyboardCapturedPane() const;
+ // Returns true if the current pane that has captured the keyboard is
+ // accepting text input.
+ bool keyboardCapturedForTextInput() const;
+
+ bool sendInputEvent(InputEvent const& event);
+
+ void render();
+ void update();
+
+private:
+ Vec2I windowSize() const;
+ Vec2I calculatePaneOffset(PanePtr const& pane) const;
+ Vec2I calculateNewInterfacePosition(PanePtr const& pane, float interfaceScaleRatio) const;
+ bool dismiss(PanePtr const& pane);
+
+ GuiContext* m_context;
+ int m_prevInterfaceScale;
+
+ // Map of each pane layer, where the 0th pane is the topmost pane in each layer.
+ Map<PaneLayer, OrderedMap<PanePtr, DismissCallback>> m_displayedPanes;
+
+ WidgetPtr m_backgroundWidget;
+
+ float m_tooltipMouseoverTime;
+ float m_tooltipMouseoverRadius;
+ Vec2I m_tooltipMouseOffset;
+
+ float m_tooltipShowTimer;
+ Vec2I m_tooltipLastMousePos;
+ Vec2I m_tooltipInitialPosition;
+ PanePtr m_activeTooltip;
+ PanePtr m_tooltipParentPane;
+};
+
+}
+
+#endif