MyGUI
3.2.1
|
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