123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- /*
- * WindowHandler.h, part of VCMI engine
- *
- * Authors: listed in file AUTHORS in main folder
- *
- * License: GNU General Public License v2.0 or later
- * Full text of license available in license.txt file, in main folder
- *
- */
- #pragma once
- class IShowActivatable;
- class WindowHandler
- {
- /// list of windows. front = bottom-most (background), back = top-most (foreground)
- /// (includes adventure map, window windows, all kind of active dialogs, and so on)
- std::vector<std::shared_ptr<IShowActivatable>> windowsStack;
- /// Temporary list of recently popped windows
- std::vector<std::shared_ptr<IShowActivatable>> disposed;
- bool totalRedrawRequested = false;
- /// returns top windows
- std::shared_ptr<IShowActivatable> topWindowImpl() const;
- /// forces total redraw (using showAll), sets a flag, method gets called at the end of the rendering
- void totalRedrawImpl();
- /// update only top windows and draw background from buffer, sets a flag, method gets called at the end of the rendering
- void simpleRedrawImpl();
- public:
- /// forces total redraw (using showAll), sets a flag, method gets called at the end of the rendering
- void totalRedraw();
- /// update only top windows and draw background from buffer, sets a flag, method gets called at the end of the rendering
- void simpleRedraw();
- /// called whenever user selects different resolution, requiring to center/resize all windows
- void onScreenResize();
- /// deactivate old top windows, activates this one and pushes to the top
- void pushWindow(std::shared_ptr<IShowActivatable> newInt);
- /// creates window of class T and pushes it to the top
- template <typename T, typename ... Args>
- void createAndPushWindow(Args && ... args);
- /// pops one or more windows - deactivates top, deletes and removes given number of windows, activates new front
- void popWindows(int howMany);
- /// returns true if current top window is a right-click popup
- bool isTopWindowPopup() const;
- /// removes given windows from the top and activates next
- void popWindow(std::shared_ptr<IShowActivatable> top);
- /// returns true if selected interface is on top
- bool isTopWindow(std::shared_ptr<IShowActivatable> window) const;
- bool isTopWindow(IShowActivatable * window) const;
- /// returns top window if it matches requested class
- template <typename T>
- std::shared_ptr<T> topWindow() const;
- /// should be called after frame has been rendered to screen
- void onFrameRendered();
- /// returns current number of windows in the stack
- size_t count() const;
- /// erases all currently existing windows from the stack
- void clear();
- /// returns all existing windows of selected type
- template <typename T>
- std::vector<std::shared_ptr<T>> findWindows() const;
- };
- template <typename T, typename ... Args>
- void WindowHandler::createAndPushWindow(Args && ... args)
- {
- auto newWindow = std::make_shared<T>(std::forward<Args>(args)...);
- pushWindow(newWindow);
- }
- template <typename T>
- std::vector<std::shared_ptr<T>> WindowHandler::findWindows() const
- {
- std::vector<std::shared_ptr<T>> result;
- for(const auto & window : windowsStack)
- {
- std::shared_ptr<T> casted = std::dynamic_pointer_cast<T>(window);
- if (casted)
- result.push_back(casted);
- }
- return result;
- }
- template <typename T>
- std::shared_ptr<T> WindowHandler::topWindow() const
- {
- return std::dynamic_pointer_cast<T>(topWindowImpl());
- }
|