class EE::UI::Tools::UITabWidgetSplitter

#include <uitabwidgetsplitter.hpp>

class UITabWidgetSplitter {
public:
    // typedefs

    typedef std::function<bool(UIWidget*, UITabWidget::FocusTabBehavior, std::function<void()> onMsgBoxCloseCb)> TabTryCloseCallback;

    // classes

    class Client;

    // construction

    virtual ~UITabWidgetSplitter();

    // methods

    static UITabWidgetSplitter* New(Client* client, UISceneNode* sceneNode);
    UITabWidget* createTabWidget(Node* parent);
    std::pair<UITab*, UIWidget*> createWidget(UIWidget* widget, const std::string& tabName, bool focus = true);
    std::pair<UITab*, UIWidget*> createWidgetInTabWidget(UITabWidget* tabWidget, UIWidget* widget, const std::string& tabName, bool focus = true);
    std::vector<std::pair<UITab*, UITabWidget*>> getTabFromOwnedWidgetId(const std::string& id);
    bool ownedWidgetExists(UIWidget* widget);
    bool removeTabWithOwnedWidgetId(const std::string& id, bool destroyOwnedNode = true, bool immediateClose = false);
    UITab* getTabFromWidget(UIWidget* widget) const;
    virtual bool tryTabClose(UIWidget* widget, UITabWidget::FocusTabBehavior focusTabBehavior, std::function<void()> onMsgBoxCloseCb = {});
    virtual bool tryCloseAllTabs(UIWidget* widget, UITabWidget::FocusTabBehavior focusTabBehavior);
    virtual bool tryCloseOtherTabs(UIWidget* widget, UITabWidget::FocusTabBehavior focusTabBehavior);
    virtual bool tryCloseTabsToDirection(UIWidget* widget, UITabWidget::FocusTabBehavior focusTabBehavior, bool toTheRight);
    void closeTab(UIWidget* widget, UITabWidget::FocusTabBehavior focusTabBehavior);
    UISplitter* split(const SplitDirection& direction, UIWidget* widget);
    UITabWidget* splitTabWidget(SplitDirection direction, UITabWidget* tabWidget);
    void switchToTab(Int32 index);
    UITabWidget* findPreviousSplit(UIWidget* widget);
    void switchPreviousSplit(UIWidget* widget);
    UITabWidget* findNextSplit(UIWidget* widget);
    void switchNextSplit(UIWidget* widget);
    void setCurrentWidget(UIWidget* curWidget);
    void focusSomeWidget(Node* searchFrom = nullptr);
    UIWidget* getSomeWidget();
    UITabWidget* tabWidgetFromWidget(UIWidget* widget) const;
    UISplitter* splitterFromWidget(UIWidget* widget) const;
    bool curWidgetExists() const;
    bool hasSplit() const;
    UIOrientation getMainSplitOrientation() const;
    UIWidget* getCurWidget() const;
    const std::vector<UITabWidget*>& getTabWidgets() const;
    UITabWidget* getFirstTabWidget() const;
    Node* getBaseLayout() const;
    UISceneNode* getUISceneNode() const;
    bool getHideTabBarOnSingleTab() const;
    void setHideTabBarOnSingleTab(bool hideTabBarOnSingleTab);
    void setHideTabBar(bool hideTabBar);
    bool getVisualSplitting() const;
    void setVisualSplitting(bool visualSplitting);
    Float getVisualSplitEdgePercent() const;
    void setVisualSplitEdgePercent(Float visualSplitEdgePercent);
    void setOnTabWidgetCreateCb(std::function<void(UITabWidget*)> cb);
    void closeSplitter(UISplitter* splitter);
    void addRemainingTabWidgets(Node* widget);
    void closeTabWidgets(UISplitter* splitter);
    bool checkWidgetExists(UIWidget*) const;
    bool isWidgetInAnyWidget(UIWidget*) const;
    void forEachWidget(std::function<void(UIWidget*)> run) const;
    void forEachWidgetStoppable(std::function<bool(UIWidget*)> run) const;
    void forEachWidgetClass(const std::string& className, std::function<void(UIWidget*)> run) const;
    void forEachWidgetClassStoppable(const std::string& className, std::function<bool(UIWidget*)> run) const;
    void forEachWidgetType(const UINodeType& nodeType, std::function<void(UIWidget*)> run) const;
    void forEachWidgetTypeStoppable(const UINodeType& nodeType, std::function<bool(UIWidget*)> run) const;
    void forEachTabWidget(std::function<void(UITabWidget*)> run) const;
    void forEachTabWidgetStoppable(std::function<bool(UITabWidget*)> run) const;
    void forEachTab(std::function<void(UITab*)> run) const;

    template <typename T>
    void registerSplitterCommands(T& t);

    void registerWidgetType(const std::string& type, const WidgetTypeCallback& cb);
    void unregisterWidgetType(const std::string& type);
    nlohmann::json serializeNode(Node* node) const;
    void unserializeNode(const nlohmann::json& j, UITabWidget* curTabWidget);
    nlohmann::json toJSON() const;
    void fromJSON(const nlohmann::json& j);
    void setTabTryCloseCallback(TabTryCloseCallback cb);
    void setCanCreateSplitFn(std::function<bool(SplitDirection direction, UIWidget*widget)> fn);
};