MyGUI  3.2.1
MyGUI_ToolTipManager.cpp
Go to the documentation of this file.
00001 /*
00002  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
00003  * Distributed under the MIT License
00004  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
00005  */
00006 
00007 #include "MyGUI_Precompiled.h"
00008 #include "MyGUI_ToolTipManager.h"
00009 #include "MyGUI_Gui.h"
00010 #include "MyGUI_InputManager.h"
00011 #include "MyGUI_WidgetManager.h"
00012 
00013 namespace MyGUI
00014 {
00015 
00016     template <> ToolTipManager* Singleton<ToolTipManager>::msInstance = nullptr;
00017     template <> const char* Singleton<ToolTipManager>::mClassTypeName = "ToolTipManager";
00018 
00019     ToolTipManager::ToolTipManager() :
00020         mDelayVisible(0.5f),
00021         mOldFocusWidget(nullptr),
00022         mToolTipVisible(false),
00023         mCurrentTime(0),
00024         mOldIndex(ITEM_NONE),
00025         mNeedToolTip(false),
00026         mIsInitialise(false)
00027     {
00028     }
00029 
00030     void ToolTipManager::initialise()
00031     {
00032         MYGUI_ASSERT(!mIsInitialise, getClassTypeName() << " initialised twice");
00033         MYGUI_LOG(Info, "* Initialise: " << getClassTypeName());
00034 
00035         mDelayVisible = 0.5f;
00036         mOldFocusWidget = nullptr;
00037         mToolTipVisible = false;
00038         mCurrentTime = 0;
00039         mOldIndex = ITEM_NONE;
00040         mNeedToolTip = false;
00041 
00042         Gui::getInstance().eventFrameStart += newDelegate(this, &ToolTipManager::notifyEventFrameStart);
00043         WidgetManager::getInstance().registerUnlinker(this);
00044 
00045         MYGUI_LOG(Info, getClassTypeName() << " successfully initialized");
00046         mIsInitialise = true;
00047     }
00048 
00049     void ToolTipManager::shutdown()
00050     {
00051         MYGUI_ASSERT(mIsInitialise, getClassTypeName() << " is not initialised");
00052         MYGUI_LOG(Info, "* Shutdown: " << getClassTypeName());
00053 
00054         WidgetManager::getInstance().unregisterUnlinker(this);
00055         Gui::getInstance().eventFrameStart -= newDelegate(this, &ToolTipManager::notifyEventFrameStart);
00056 
00057         MYGUI_LOG(Info, getClassTypeName() << " successfully shutdown");
00058         mIsInitialise = false;
00059     }
00060 
00061     void ToolTipManager::notifyEventFrameStart(float _time)
00062     {
00063         Widget* widget = InputManager::getInstance().getMouseFocusWidget();
00064         if (mOldFocusWidget != widget)
00065         {
00066             if (mToolTipVisible)
00067             {
00068                 mToolTipVisible = false;
00069                 hideToolTip(mOldFocusWidget);
00070             }
00071             mOldFocusWidget = widget;
00072             mNeedToolTip = false;
00073 
00074             if (mOldFocusWidget != nullptr)
00075             {
00076                 mCurrentTime = 0;
00077                 mOldMousePoint = InputManager::getInstance().getMousePositionByLayer();
00078                 mOldIndex = getToolTipIndex(mOldFocusWidget);
00079                 mNeedToolTip = isNeedToolTip(mOldFocusWidget);
00080             }
00081         }
00082         else if (mNeedToolTip)
00083         {
00084             bool capture = InputManager::getInstance().isCaptureMouse();
00085             if (capture)
00086             {
00087                 if (mToolTipVisible)
00088                 {
00089                     mToolTipVisible = false;
00090                     hideToolTip(mOldFocusWidget);
00091                 }
00092             }
00093             else
00094             {
00095                 IntPoint point = InputManager::getInstance().getMousePositionByLayer();
00096                 if (!mToolTipVisible && point != mOldMousePoint)
00097                 {
00098                     if (mToolTipVisible)
00099                     {
00100                         mToolTipVisible = false;
00101                         hideToolTip(mOldFocusWidget);
00102                     }
00103                     mCurrentTime = 0;
00104                     mOldMousePoint = point;
00105                     mOldIndex = getToolTipIndex(mOldFocusWidget);
00106                 }
00107                 else
00108                 {
00109                     size_t index = getToolTipIndex(mOldFocusWidget);
00110                     if (mOldIndex != index)
00111                     {
00112                         if (mToolTipVisible)
00113                         {
00114                             mToolTipVisible = false;
00115                             hideToolTip(mOldFocusWidget);
00116                         }
00117                         mCurrentTime = 0;
00118                         mOldIndex = index;
00119                     }
00120                     else
00121                     {
00122                         if (!mToolTipVisible)
00123                         {
00124                             mCurrentTime += _time;
00125                             if (mCurrentTime >= mDelayVisible)
00126                             {
00127                                 mToolTipVisible = true;
00128                                 showToolTip(mOldFocusWidget, mOldIndex, point);
00129                             }
00130                         }
00131                         else if (point != mOldMousePoint)
00132                         {
00133                             moveToolTip(mOldFocusWidget, mOldIndex, point);
00134                         }
00135                     }
00136                 }
00137             }
00138         }
00139     }
00140 
00141     void ToolTipManager::_unlinkWidget(Widget* _widget)
00142     {
00143         if (mOldFocusWidget == _widget)
00144         {
00145             if (mToolTipVisible)
00146             {
00147                 mToolTipVisible = false;
00148                 hideToolTip(mOldFocusWidget);
00149             }
00150             mOldFocusWidget = nullptr;
00151             mNeedToolTip = false;
00152         }
00153     }
00154 
00155     void ToolTipManager::hideToolTip(Widget* _widget)
00156     {
00157         Widget* container = _widget->_getContainer();
00158         if (container != nullptr)
00159             container->eventToolTip(container, ToolTipInfo(ToolTipInfo::Hide));
00160         else
00161             _widget->eventToolTip(_widget, ToolTipInfo(ToolTipInfo::Hide));
00162     }
00163 
00164     void ToolTipManager::showToolTip(Widget* _widget, size_t _index, const IntPoint& _point)
00165     {
00166         Widget* container = _widget->_getContainer();
00167         if (container != nullptr)
00168             container->eventToolTip(container, ToolTipInfo(ToolTipInfo::Show, _index, _point));
00169         else
00170             _widget->eventToolTip(_widget, ToolTipInfo(ToolTipInfo::Show, ITEM_NONE, _point));
00171     }
00172 
00173     void ToolTipManager::moveToolTip(Widget* _widget, size_t _index, const IntPoint& _point)
00174     {
00175         Widget* container = _widget->_getContainer();
00176         if (container != nullptr)
00177             container->eventToolTip(container, ToolTipInfo(ToolTipInfo::Move, _index, _point));
00178         else
00179             _widget->eventToolTip(_widget, ToolTipInfo(ToolTipInfo::Move, ITEM_NONE, _point));
00180     }
00181 
00182     bool ToolTipManager::isNeedToolTip(Widget* _widget)
00183     {
00184         Widget* container = _widget->_getContainer();
00185         if (container != nullptr)
00186             return container->getNeedToolTip();
00187         return _widget->getNeedToolTip();
00188     }
00189 
00190     size_t ToolTipManager::getToolTipIndex(Widget* _widget) const
00191     {
00192         Widget* container = _widget->_getContainer();
00193         if (container != nullptr)
00194             return container->_getItemIndex(_widget);
00195         return ITEM_NONE;
00196     }
00197 
00198     void ToolTipManager::setDelayVisible(float _value)
00199     {
00200         mDelayVisible = _value;
00201     }
00202 
00203     float ToolTipManager::getDelayVisible() const
00204     {
00205         return mDelayVisible;
00206     }
00207 
00208 } // namespace MyGUI