From e2068c9efa102d75f6cae13b515142250d733026 Mon Sep 17 00:00:00 2001 From: dfighter1985 Date: Mon, 2 Jul 2012 03:21:42 +0200 Subject: [PATCH] CHANGED: #1471 CViewPointer is now part of the NELGUI library and is under the NLGUI namespace. --- code/nel/include/nel/gui/view_pointer.h | 142 +++++ code/nel/src/gui/view_pointer.cpp | 505 ++++++++++++++++++ .../src/interface_v3/interface_manager.h | 2 +- .../src/interface_v3/interface_parser.cpp | 2 +- .../src/interface_v3/interface_parser.h | 2 +- .../client/src/interface_v3/view_pointer.cpp | 499 ----------------- .../client/src/interface_v3/view_pointer.h | 143 ----- .../src/interface_v3/view_pointer_ryzom.h | 2 +- 8 files changed, 651 insertions(+), 646 deletions(-) create mode 100644 code/nel/include/nel/gui/view_pointer.h create mode 100644 code/nel/src/gui/view_pointer.cpp delete mode 100644 code/ryzom/client/src/interface_v3/view_pointer.cpp delete mode 100644 code/ryzom/client/src/interface_v3/view_pointer.h diff --git a/code/nel/include/nel/gui/view_pointer.h b/code/nel/include/nel/gui/view_pointer.h new file mode 100644 index 000000000..1bcfefc08 --- /dev/null +++ b/code/nel/include/nel/gui/view_pointer.h @@ -0,0 +1,142 @@ +// Ryzom - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + + +#ifndef RZ_VIEW_POINTER_H +#define RZ_VIEW_POINTER_H + +#include "nel/misc/types_nl.h" +#include "nel/misc/events.h" +#include "nel/gui/view_pointer_base.h" + +namespace NLGUI +{ + class CCtrlBase; + class CGroupContainer; + + /** + * class describing the pointer + * \author Matthieu 'Trap' Besson + * \author Nevrax France + * \date 2002 + */ + + class CViewPointer : public CViewPointerBase + { + + public: + DECLARE_UI_CLASS( CViewPointer ) + + CViewPointer( const TCtorParam ¶m ); + virtual ~CViewPointer(){} + + bool parse (xmlNodePtr cur,CInterfaceGroup * parentGroup); + void draw(); + + // Set cursor mode + void setStringMode (bool stringCursor); + bool getStringMode() const {return _StringMode;} + + // Set cursor string + void setString (const ucstring &str); + + // TEMP PATCH + void setCursor (const std::string &name) + { + _TxDefault = name; + _TxIdDefault = -2; + } + // TEMP PATCH + + /// Show or hide the pointer. Please, use SetMouseMode (bool freelook) instead. + void show(bool s) {_PointerVisible = s;} + + static void setHWMouse( bool hw ){ hwMouse = hw; } + + private: + + /// Drawing helpers + virtual bool drawResizer(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; } + virtual bool drawRotate(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; } + virtual bool drawScale(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; } + virtual bool drawColorPicker(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; } + virtual bool drawLink(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; } + virtual bool drawBrowse(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; } + virtual bool drawPan(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; } + virtual bool drawCustom(CCtrlBase* pCB); + + protected: + + // Look of the cursor in different situation + std::string _TxDefault; + std::string _TxMoveWindow; + std::string _TxResizeBRTL; + std::string _TxResizeBLTR; + std::string _TxResizeTB; + std::string _TxResizeLR; + std::string _TxRotate; + std::string _TxScale; + std::string _TxColPick; + std::string _TxPan; + std::string _TxCanPan; + std::string _TxPanR2; + std::string _TxCanPanR2; + + sint32 _TxIdDefault; + sint32 _TxIdMoveWindow; + sint32 _TxIdResizeBRTL; + sint32 _TxIdResizeBLTR; + sint32 _TxIdResizeTB; + sint32 _TxIdResizeLR; + sint32 _TxIdRotate; + sint32 _TxIdScale; + sint32 _TxIdColPick; + sint32 _TxIdPan; + sint32 _TxIdCanPan; + sint32 _TxIdPanR2; + sint32 _TxIdCanPanR2; + + NLMISC::CRGBA _Color; + + sint32 _OffsetX; + sint32 _OffsetY; + + CGroupContainer *_LastHightLight; + + // Cursor mode + bool _StringMode; + bool _ForceStringMode; + CInterfaceGroup *_StringCursor; + CInterfaceGroup *_StringCursorHardware; + ucstring _ContextString; + + // draw current cursor with the given texture, or, if in hardware mode, change the hardware cursor shape + void drawCursor(sint32 texId, NLMISC::CRGBA col, uint8 rot); + + private: + // set the string into frame for software or hardware version + void setString (const ucstring &str, CInterfaceGroup *target); + + static bool hwMouse; + + }; + +} + +#endif // RZ_VIEW_POINTER_H + +/* End of view_pointer.h */ diff --git a/code/nel/src/gui/view_pointer.cpp b/code/nel/src/gui/view_pointer.cpp new file mode 100644 index 000000000..ce0e3ad7b --- /dev/null +++ b/code/nel/src/gui/view_pointer.cpp @@ -0,0 +1,505 @@ +// Ryzom - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +#include "nel/gui/view_pointer.h" +#include "nel/gui/widget_manager.h" +#include "nel/gui/view_renderer.h" +#include "nel/gui/group_paragraph.h" +#include "nel/gui/group_container.h" +#include "nel/misc/xml_auto_ptr.h" +#include "nel/misc/algo.h" + +using namespace std; +using namespace NLMISC; + +NLMISC_REGISTER_OBJECT(CViewBase, CViewPointer, std::string, "generic_pointer"); + +namespace NLGUI +{ + + bool CViewPointer::hwMouse = true; + + // -------------------------------------------------------------------------------------------------------------------- + CViewPointer::CViewPointer (const TCtorParam ¶m) + : CViewPointerBase(param) + { + _TxIdDefault = -2; + _TxIdMoveWindow = -2; + _TxIdResizeBRTL = -2; + _TxIdResizeBLTR = -2; + _TxIdResizeTB = -2; + _TxIdResizeLR = -2; + _TxIdRotate = -2; + _TxIdScale = -2; + _TxIdColPick = -2; + _TxIdPan = -2; + _TxIdCanPan = -2; + _TxIdPanR2 = -2; + _TxIdCanPanR2 = -2; + + // The pointer must be draw over ALL layers + _RenderLayer= VR_LAYER_MAX; + _Color = CRGBA(255,255,255,255); + _LastHightLight = NULL; + _StringMode = false; + _ForceStringMode = false; + _StringCursor = NULL; + } + + + // +++ VIEW SPECIFIC +++ + + // -------------------------------------------------------------------------------------------------------------------- + bool CViewPointer::parse (xmlNodePtr cur,CInterfaceGroup * parentGroup) + { + CXMLAutoPtr prop; + + if (! CViewBase::parse(cur, parentGroup) ) + return false; + + _OffsetX = getX(); + _OffsetY = getY(); + + prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_default"); + if (prop) _TxDefault = (const char *) prop; + _TxDefault = NLMISC::strlwr (_TxDefault); + + prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_move_window"); + if (prop) _TxMoveWindow = (const char *) prop; + _TxMoveWindow = NLMISC::strlwr (_TxMoveWindow); + + prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_resize_BR_TL"); + if (prop) _TxResizeBRTL = (const char *) prop; + _TxResizeBRTL = NLMISC::strlwr (_TxResizeBRTL); + + prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_resize_BL_TR"); + if (prop) _TxResizeBLTR = (const char *) prop; + _TxResizeBLTR = NLMISC::strlwr (_TxResizeBLTR); + + prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_resize_TB"); + if (prop) _TxResizeTB = (const char *) prop; + _TxResizeTB = NLMISC::strlwr (_TxResizeTB); + + prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_resize_LR"); + if (prop) _TxResizeLR = (const char *) prop; + _TxResizeLR = NLMISC::strlwr (_TxResizeLR); + + prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_rotate"); + if (prop) _TxRotate = (const char *) prop; + _TxRotate = NLMISC::strlwr (_TxRotate); + + prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_scale"); + if (prop) _TxScale = (const char *) prop; + _TxScale = NLMISC::strlwr (_TxScale); + + prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_colpick"); + if (prop) _TxColPick = (const char *) prop; + _TxColPick = NLMISC::strlwr (_TxColPick); + + prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_pan"); + if (prop) _TxPan = (const char *) prop; + _TxPan = NLMISC::strlwr (_TxPan); + + prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_can_pan"); + if (prop) _TxCanPan = (const char *) prop; + _TxCanPan = NLMISC::strlwr (_TxCanPan); + + prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_pan_r2"); + if (prop) _TxPanR2 = (const char *) prop; + _TxPanR2 = NLMISC::strlwr (_TxPanR2); + + prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_can_pan_r2"); + if (prop) _TxCanPanR2 = (const char *) prop; + _TxCanPanR2 = NLMISC::strlwr (_TxCanPanR2); + + prop = (char*) xmlGetProp (cur, (xmlChar*)"color"); + if (prop) _Color = convertColor(prop); + + return true; + } + + // -------------------------------------------------------------------------------------------------------------------- + class CCtrlDepthEntry + { + public: + CCtrlBase *Ctrl; + uint Depth; + bool operator<(const CCtrlDepthEntry &o) const + { + // Inverse Test => descending order + return Depth>o.Depth; + } + }; + + // -------------------------------------------------------------------------------------------------------------------- + void CViewPointer::draw () + { + // Do not display the pointer if not visible. + if(!_PointerVisible) + return; + + CViewRenderer &rVR = *CViewRenderer::getInstance(); + + if ( CWidgetManager::getInstance()->isIngame() ) + if (!_StringCursor) + { + // Create the string cursor instance + std::vector > templateParams; + templateParams.push_back (std::pair("id", "string_cursor")); + + _StringCursor = CWidgetManager::parser->createGroupInstance("string_cursor", "", templateParams); + if (_StringCursor) + _StringCursor->setParentPos(CWidgetManager::getInstance()->getElementFromId("ui:interface")); + + templateParams.clear(); + templateParams.push_back (std::pair("id", "string_cursor_hardware")); + _StringCursorHardware = CWidgetManager::parser->createGroupInstance("string_cursor_hardware", "", templateParams); + if (_StringCursorHardware) + _StringCursorHardware->setParentPos(CWidgetManager::getInstance()->getElementFromId("ui:interface")); + } + + CRGBA col; + if(getModulateGlobalColor()) + col.modulateFromColor (_Color, CWidgetManager::getInstance()->getGlobalColor()); + else + col= _Color; + + //col.A = (uint8)(((sint32)col.A*((sint32)pIM->getGlobalColor().A+1))>>8); + col.A = _Color.A; + + if (_LastHightLight != NULL) + { + _LastHightLight->setHighLighted(false,0); + _LastHightLight = NULL; + } + + if ( CWidgetManager::getInstance()->getCapturePointerLeft() != NULL && CWidgetManager::getInstance()->isMouseHandlingEnabled()) + { + CCtrlMover *pCM = dynamic_cast( CWidgetManager::getInstance()->getCapturePointerLeft()); + if ((pCM != NULL) && (pCM->canMove() == true)) + { + CGroupContainer *pGC = dynamic_cast(pCM->getParent()); + if (pGC != NULL && !pGC->isLocked()) + { + pGC->setHighLighted(true, 255); + _LastHightLight = pGC; + } + } + } + + if (_TxIdDefault == -2) + { + _TxIdDefault = rVR.getTextureIdFromName (_TxDefault); + _TxIdMoveWindow = rVR.getTextureIdFromName (_TxMoveWindow); + _TxIdResizeBRTL = rVR.getTextureIdFromName (_TxResizeBRTL); + _TxIdResizeBLTR = rVR.getTextureIdFromName (_TxResizeBLTR); + _TxIdResizeTB = rVR.getTextureIdFromName (_TxResizeTB); + _TxIdResizeLR = rVR.getTextureIdFromName (_TxResizeLR); + _TxIdRotate = rVR.getTextureIdFromName (_TxRotate); + _TxIdScale = rVR.getTextureIdFromName (_TxScale); + _TxIdColPick = rVR.getTextureIdFromName (_TxColPick); + _TxIdPan = rVR.getTextureIdFromName (_TxPan); + _TxIdCanPan = rVR.getTextureIdFromName (_TxCanPan); + _TxIdPanR2 = rVR.getTextureIdFromName (_TxPanR2); + _TxIdCanPanR2 = rVR.getTextureIdFromName (_TxCanPanR2); + + } + + const vector &rICL = CWidgetManager::getInstance()->getCtrlsUnderPointer (); + + + // Draw the captured cursor + CCtrlBase *pCB = CWidgetManager::getInstance()->getCapturePointerLeft(); + if (pCB != NULL) + { + if (drawResizer(pCB,col)) return; + if (drawColorPicker(pCB,col)) return; + if (drawRotate(pCB,col)) return; + if (drawPan(pCB,col)) return; + if (drawCustom(pCB)) return; + drawCursor(_TxIdDefault, col, 0); + return; + } + + const vector &vUP = CWidgetManager::getInstance()->getViewsUnderPointer (); + + for(uint i=0;i(vUP[i]); + if (vLink != NULL) + { + string tooltip; + uint8 rot; + + if (vLink->getMouseOverShape(tooltip, rot, col)) + { + setString(ucstring(tooltip)); + sint32 texId = rVR.getTextureIdFromName ("curs_pick.tga"); + + CInterfaceGroup *stringCursor = hwMouse ? _StringCursorHardware : _StringCursor; + if (stringCursor) + { + stringCursor->setX(_PointerX); + stringCursor->setY(_PointerY); + stringCursor->updateCoords(); + stringCursor->draw(); + // if in hardware mode, force to draw the default cursor no matter what.. + if ( hwMouse ) + drawCursor(texId, col, 0); + } + else + { + drawCursor(texId, col, 0); + } + return; + } + } + } + + // Draw if capture right + pCB = CWidgetManager::getInstance()->getCapturePointerRight(); + if (pCB != NULL) + { + // Is it a 3d scene ? + if (drawScale(pCB,col)) return; + drawCursor(_TxIdDefault, col, 0); + return; + } + + bool overModalWindow = false; + + + // is the cursor currently over a modal window ? + CInterfaceGroup *currModal = CWidgetManager::getInstance()->getModalWindow(); + if (currModal) + { + sint32 xPos = _XReal + _OffsetX; + sint32 yPos = _YReal + _OffsetY; + overModalWindow = currModal->isIn(xPos, yPos, _WReal, _HReal); + } + + // Draw the cursor type that are under the pointer + if (CWidgetManager::getInstance()->isMouseHandlingEnabled()) + { + // Sorts the controls according to their depth, to approximate as best the CapturePointerLeft algo. + // Especially important so that Resizers controls get the precedence over the move control (else could randomly bug like in chat group) + static vector sortedControls; + sortedControls.clear(); + for(uint i=0;igetParentDepth() + cde.Ctrl->getDeltaDepth(); + sortedControls.push_back(cde); + } + std::sort(sortedControls.begin(), sortedControls.end()); + + // Then draw the correct cursor + for (uint32 i = 0; i < sortedControls.size(); ++i) + { + CCtrlBase *pCB = sortedControls[i].Ctrl; + + if (overModalWindow) + { + if (!pCB->isSonOf(currModal)) continue; + } + + if (drawBrowse(pCB, col)) return; + if (drawResizer(pCB,col)) return; + if (drawColorPicker(pCB,col)) return; + if (drawLink (pCB, col)) return; + if (drawCustom(pCB)) return; + + // test for move highlight + if (_LastHightLight == NULL) + { + CCtrlMover *pCM = dynamic_cast(pCB); + if ( (pCM != NULL) && (pCM->canMove() == true) ) + { + CGroupContainer *pGC = dynamic_cast(pCM->getParent()); + if (pGC != NULL && !pGC->isLocked()) + { + if (CWidgetManager::getInstance()->getCapturePointerLeft() != pCM) + pGC->setHighLighted(true, 128); + else + pGC->setHighLighted(true, 255); + _LastHightLight = pGC; + break; + } + } + } + } + } + + if (CWidgetManager::getInstance()->isMouseHandlingEnabled()) + { + if (rICL.empty()) + { + const vector &rIGL = CWidgetManager::getInstance()->getGroupsUnderPointer (); + for (uint32 i = 0; i < rIGL.size(); ++i) + { + CInterfaceGroup *pG = rIGL[i]; + if (overModalWindow) + { + if (!pG->isSonOf(currModal)) continue; + } + if (drawPan (pG, col)) return; + if (drawBrowse(pG, col)) return; + } + } + } + + if (_StringMode && CWidgetManager::getInstance()->isMouseHandlingEnabled()) + { + CInterfaceGroup *stringCursor = hwMouse ? _StringCursorHardware : _StringCursor; + if (stringCursor) + { + stringCursor->setX(_PointerX); + stringCursor->setY(_PointerY); + stringCursor->updateCoords(); + stringCursor->draw(); + // if in hardware mode, force to draw the default cursor no matter what.. + if ( hwMouse ) + { + drawCursor(_TxIdDefault, col, 0); + } + } + } + else + { + // Draw the default cursor + drawCursor(_TxIdDefault, col, 0); + } + } + + // -------------------------------------------------------------------------------------------------------------------- + bool CViewPointer::drawCustom(CCtrlBase* pCB) + { + string texName; + uint8 rot; + NLMISC::CRGBA col; + if (pCB->getMouseOverShape(texName, rot, col)) + { + if (texName[0] == '@') + { + const string &tooltipInfos = texName.substr(1); + string tooltip; + vector tooltipInfosList; + splitString(tooltipInfos, "@", tooltipInfosList); + texName = tooltipInfosList[0]; + tooltip = tooltipInfosList[1]; + nlinfo(tooltip.c_str()); + setString(ucstring(tooltip)); + CViewRenderer &rVR = *CViewRenderer::getInstance(); + sint32 texId = rVR.getTextureIdFromName (texName); + + CInterfaceGroup *stringCursor = hwMouse ? _StringCursorHardware : _StringCursor; + if (stringCursor) + { + stringCursor->setX(_PointerX); + stringCursor->setY(_PointerY); + stringCursor->updateCoords(); + stringCursor->draw(); + // if in hardware mode, force to draw the default cursor no matter what.. + if ( hwMouse ) + drawCursor(texId, col, 0); + } + else + { + drawCursor(texId, col, 0); + } + return true; + } + else + { + CViewRenderer &rVR = *CViewRenderer::getInstance(); + sint32 texId = rVR.getTextureIdFromName (texName); + drawCursor(texId, col, 0); + return true; + } + } + return false; + } + + + // +++ SET +++ + + + // -------------------------------------------------------------------------------------------------------------------- + void CViewPointer::setStringMode (bool stringCursor) + { + _StringMode = stringCursor; + } + + // -------------------------------------------------------------------------------------------------------------------- + void CViewPointer::setString (const ucstring &str, CInterfaceGroup *target) + { + if (target) + { + CInterfaceElement *element = target->getView ("fake_txt"); + if (element) + { + CViewText *text = dynamic_cast (element); + if (text) + text->setText(str); + } + element = target->getView ("real_txt"); + if (element) + { + CViewText *text = dynamic_cast (element); + if (text) + text->setText(str); + } + target->updateCoords(); + target->updateCoords(); + _ContextString = str; + } + } + + + // -------------------------------------------------------------------------------------------------------------------- + void CViewPointer::setString (const ucstring &str) + { + if (_ContextString != str) + { + setString(str, _StringCursor); + setString(str, _StringCursorHardware); + } + } + + // -------------------------------------------------------------------------------------------------------------------- + void CViewPointer::drawCursor(sint32 texId, NLMISC::CRGBA col, uint8 rot) + { + CViewRenderer &rVR = *CViewRenderer::getInstance(); + sint32 xPos = _XReal + _OffsetX; + sint32 yPos = _YReal + _OffsetY; + if ( !hwMouse ) + { + rVR.draw11RotFlipBitmap (_RenderLayer, xPos, yPos, rot, false, texId, col); + } + else + { + // set new cursor for the hardware mouse + std::string name = rVR.getTextureNameFromId(texId); + rVR.getDriver()->setCursor(name, col, rot, (uint32) std::max(getX() - xPos, (sint32) 0), (uint32) std::max(getY() - yPos, (sint32) 0)); + } + } + + +} + diff --git a/code/ryzom/client/src/interface_v3/interface_manager.h b/code/ryzom/client/src/interface_v3/interface_manager.h index ac3865e74..a142f4d17 100644 --- a/code/ryzom/client/src/interface_v3/interface_manager.h +++ b/code/ryzom/client/src/interface_v3/interface_manager.h @@ -27,7 +27,7 @@ #include "nel/gui/interface_link.h" #include "nel/gui/group_list.h" #include "nel/gui/view_base.h" -#include "view_pointer.h" +#include "nel/gui/view_pointer.h" #include "nel/gui/ctrl_base.h" #include "nel/gui/ctrl_scroll.h" diff --git a/code/ryzom/client/src/interface_v3/interface_parser.cpp b/code/ryzom/client/src/interface_v3/interface_parser.cpp index bf120d761..5d8462e94 100644 --- a/code/ryzom/client/src/interface_v3/interface_parser.cpp +++ b/code/ryzom/client/src/interface_v3/interface_parser.cpp @@ -44,7 +44,7 @@ #include "nel/gui/view_text_id.h" #include "nel/gui/view_text_id_formated.h" #include "view_radar.h" -#include "view_pointer.h" +#include "nel/gui/view_pointer.h" // DBView (View linked to the database) #include "nel/gui/dbview_bar.h" #include "nel/gui/dbview_bar3.h" diff --git a/code/ryzom/client/src/interface_v3/interface_parser.h b/code/ryzom/client/src/interface_v3/interface_parser.h index 6373ae128..076fe56ff 100644 --- a/code/ryzom/client/src/interface_v3/interface_parser.h +++ b/code/ryzom/client/src/interface_v3/interface_parser.h @@ -39,9 +39,9 @@ namespace NLGUI class CGroupList; class CGroupContainer; class CInterfaceAnim; + class CViewPointer; } -class CViewPointer; class CBrickJob; // *************************************************************************** diff --git a/code/ryzom/client/src/interface_v3/view_pointer.cpp b/code/ryzom/client/src/interface_v3/view_pointer.cpp deleted file mode 100644 index 0da7ed610..000000000 --- a/code/ryzom/client/src/interface_v3/view_pointer.cpp +++ /dev/null @@ -1,499 +0,0 @@ -// Ryzom - MMORPG Framework -// Copyright (C) 2010 Winch Gate Property Limited -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - - -#include "view_pointer.h" -#include "nel/gui/widget_manager.h" -#include "nel/gui/view_renderer.h" -#include "nel/gui/group_paragraph.h" -#include "nel/misc/xml_auto_ptr.h" -#include "nel/gui/group_container.h" - -using namespace std; -using namespace NLMISC; - -NLMISC_REGISTER_OBJECT(CViewBase, CViewPointer, std::string, "generic_pointer"); - -bool CViewPointer::hwMouse = true; - -// -------------------------------------------------------------------------------------------------------------------- -CViewPointer::CViewPointer (const TCtorParam ¶m) - : CViewPointerBase(param) -{ - _TxIdDefault = -2; - _TxIdMoveWindow = -2; - _TxIdResizeBRTL = -2; - _TxIdResizeBLTR = -2; - _TxIdResizeTB = -2; - _TxIdResizeLR = -2; - _TxIdRotate = -2; - _TxIdScale = -2; - _TxIdColPick = -2; - _TxIdPan = -2; - _TxIdCanPan = -2; - _TxIdPanR2 = -2; - _TxIdCanPanR2 = -2; - - // The pointer must be draw over ALL layers - _RenderLayer= VR_LAYER_MAX; - _Color = CRGBA(255,255,255,255); - _LastHightLight = NULL; - _StringMode = false; - _ForceStringMode = false; - _StringCursor = NULL; -} - - -// +++ VIEW SPECIFIC +++ - -// -------------------------------------------------------------------------------------------------------------------- -bool CViewPointer::parse (xmlNodePtr cur,CInterfaceGroup * parentGroup) -{ - CXMLAutoPtr prop; - - if (! CViewBase::parse(cur, parentGroup) ) - return false; - - _OffsetX = getX(); - _OffsetY = getY(); - - prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_default"); - if (prop) _TxDefault = (const char *) prop; - _TxDefault = NLMISC::strlwr (_TxDefault); - - prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_move_window"); - if (prop) _TxMoveWindow = (const char *) prop; - _TxMoveWindow = NLMISC::strlwr (_TxMoveWindow); - - prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_resize_BR_TL"); - if (prop) _TxResizeBRTL = (const char *) prop; - _TxResizeBRTL = NLMISC::strlwr (_TxResizeBRTL); - - prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_resize_BL_TR"); - if (prop) _TxResizeBLTR = (const char *) prop; - _TxResizeBLTR = NLMISC::strlwr (_TxResizeBLTR); - - prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_resize_TB"); - if (prop) _TxResizeTB = (const char *) prop; - _TxResizeTB = NLMISC::strlwr (_TxResizeTB); - - prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_resize_LR"); - if (prop) _TxResizeLR = (const char *) prop; - _TxResizeLR = NLMISC::strlwr (_TxResizeLR); - - prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_rotate"); - if (prop) _TxRotate = (const char *) prop; - _TxRotate = NLMISC::strlwr (_TxRotate); - - prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_scale"); - if (prop) _TxScale = (const char *) prop; - _TxScale = NLMISC::strlwr (_TxScale); - - prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_colpick"); - if (prop) _TxColPick = (const char *) prop; - _TxColPick = NLMISC::strlwr (_TxColPick); - - prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_pan"); - if (prop) _TxPan = (const char *) prop; - _TxPan = NLMISC::strlwr (_TxPan); - - prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_can_pan"); - if (prop) _TxCanPan = (const char *) prop; - _TxCanPan = NLMISC::strlwr (_TxCanPan); - - prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_pan_r2"); - if (prop) _TxPanR2 = (const char *) prop; - _TxPanR2 = NLMISC::strlwr (_TxPanR2); - - prop = (char*) xmlGetProp (cur, (xmlChar*)"tx_can_pan_r2"); - if (prop) _TxCanPanR2 = (const char *) prop; - _TxCanPanR2 = NLMISC::strlwr (_TxCanPanR2); - - prop = (char*) xmlGetProp (cur, (xmlChar*)"color"); - if (prop) _Color = convertColor(prop); - - return true; -} - -// -------------------------------------------------------------------------------------------------------------------- -class CCtrlDepthEntry -{ -public: - CCtrlBase *Ctrl; - uint Depth; - bool operator<(const CCtrlDepthEntry &o) const - { - // Inverse Test => descending order - return Depth>o.Depth; - } -}; - -// -------------------------------------------------------------------------------------------------------------------- -void CViewPointer::draw () -{ - // Do not display the pointer if not visible. - if(!_PointerVisible) - return; - - CViewRenderer &rVR = *CViewRenderer::getInstance(); - - if ( CWidgetManager::getInstance()->isIngame() ) - if (!_StringCursor) - { - // Create the string cursor instance - std::vector > templateParams; - templateParams.push_back (std::pair("id", "string_cursor")); - - _StringCursor = CWidgetManager::parser->createGroupInstance("string_cursor", "", templateParams); - if (_StringCursor) - _StringCursor->setParentPos(CWidgetManager::getInstance()->getElementFromId("ui:interface")); - - templateParams.clear(); - templateParams.push_back (std::pair("id", "string_cursor_hardware")); - _StringCursorHardware = CWidgetManager::parser->createGroupInstance("string_cursor_hardware", "", templateParams); - if (_StringCursorHardware) - _StringCursorHardware->setParentPos(CWidgetManager::getInstance()->getElementFromId("ui:interface")); - } - - CRGBA col; - if(getModulateGlobalColor()) - col.modulateFromColor (_Color, CWidgetManager::getInstance()->getGlobalColor()); - else - col= _Color; - - //col.A = (uint8)(((sint32)col.A*((sint32)pIM->getGlobalColor().A+1))>>8); - col.A = _Color.A; - - if (_LastHightLight != NULL) - { - _LastHightLight->setHighLighted(false,0); - _LastHightLight = NULL; - } - - if ( CWidgetManager::getInstance()->getCapturePointerLeft() != NULL && CWidgetManager::getInstance()->isMouseHandlingEnabled()) - { - CCtrlMover *pCM = dynamic_cast( CWidgetManager::getInstance()->getCapturePointerLeft()); - if ((pCM != NULL) && (pCM->canMove() == true)) - { - CGroupContainer *pGC = dynamic_cast(pCM->getParent()); - if (pGC != NULL && !pGC->isLocked()) - { - pGC->setHighLighted(true, 255); - _LastHightLight = pGC; - } - } - } - - if (_TxIdDefault == -2) - { - _TxIdDefault = rVR.getTextureIdFromName (_TxDefault); - _TxIdMoveWindow = rVR.getTextureIdFromName (_TxMoveWindow); - _TxIdResizeBRTL = rVR.getTextureIdFromName (_TxResizeBRTL); - _TxIdResizeBLTR = rVR.getTextureIdFromName (_TxResizeBLTR); - _TxIdResizeTB = rVR.getTextureIdFromName (_TxResizeTB); - _TxIdResizeLR = rVR.getTextureIdFromName (_TxResizeLR); - _TxIdRotate = rVR.getTextureIdFromName (_TxRotate); - _TxIdScale = rVR.getTextureIdFromName (_TxScale); - _TxIdColPick = rVR.getTextureIdFromName (_TxColPick); - _TxIdPan = rVR.getTextureIdFromName (_TxPan); - _TxIdCanPan = rVR.getTextureIdFromName (_TxCanPan); - _TxIdPanR2 = rVR.getTextureIdFromName (_TxPanR2); - _TxIdCanPanR2 = rVR.getTextureIdFromName (_TxCanPanR2); - - } - - const vector &rICL = CWidgetManager::getInstance()->getCtrlsUnderPointer (); - - - // Draw the captured cursor - CCtrlBase *pCB = CWidgetManager::getInstance()->getCapturePointerLeft(); - if (pCB != NULL) - { - if (drawResizer(pCB,col)) return; - if (drawColorPicker(pCB,col)) return; - if (drawRotate(pCB,col)) return; - if (drawPan(pCB,col)) return; - if (drawCustom(pCB)) return; - drawCursor(_TxIdDefault, col, 0); - return; - } - - const vector &vUP = CWidgetManager::getInstance()->getViewsUnderPointer (); - - for(uint i=0;i(vUP[i]); - if (vLink != NULL) - { - string tooltip; - uint8 rot; - - if (vLink->getMouseOverShape(tooltip, rot, col)) - { - setString(ucstring(tooltip)); - sint32 texId = rVR.getTextureIdFromName ("curs_pick.tga"); - - CInterfaceGroup *stringCursor = hwMouse ? _StringCursorHardware : _StringCursor; - if (stringCursor) - { - stringCursor->setX(_PointerX); - stringCursor->setY(_PointerY); - stringCursor->updateCoords(); - stringCursor->draw(); - // if in hardware mode, force to draw the default cursor no matter what.. - if ( hwMouse ) - drawCursor(texId, col, 0); - } - else - { - drawCursor(texId, col, 0); - } - return; - } - } - } - - // Draw if capture right - pCB = CWidgetManager::getInstance()->getCapturePointerRight(); - if (pCB != NULL) - { - // Is it a 3d scene ? - if (drawScale(pCB,col)) return; - drawCursor(_TxIdDefault, col, 0); - return; - } - - bool overModalWindow = false; - - - // is the cursor currently over a modal window ? - CInterfaceGroup *currModal = CWidgetManager::getInstance()->getModalWindow(); - if (currModal) - { - sint32 xPos = _XReal + _OffsetX; - sint32 yPos = _YReal + _OffsetY; - overModalWindow = currModal->isIn(xPos, yPos, _WReal, _HReal); - } - - // Draw the cursor type that are under the pointer - if (CWidgetManager::getInstance()->isMouseHandlingEnabled()) - { - // Sorts the controls according to their depth, to approximate as best the CapturePointerLeft algo. - // Especially important so that Resizers controls get the precedence over the move control (else could randomly bug like in chat group) - static vector sortedControls; - sortedControls.clear(); - for(uint i=0;igetParentDepth() + cde.Ctrl->getDeltaDepth(); - sortedControls.push_back(cde); - } - std::sort(sortedControls.begin(), sortedControls.end()); - - // Then draw the correct cursor - for (uint32 i = 0; i < sortedControls.size(); ++i) - { - CCtrlBase *pCB = sortedControls[i].Ctrl; - - if (overModalWindow) - { - if (!pCB->isSonOf(currModal)) continue; - } - - if (drawBrowse(pCB, col)) return; - if (drawResizer(pCB,col)) return; - if (drawColorPicker(pCB,col)) return; - if (drawLink (pCB, col)) return; - if (drawCustom(pCB)) return; - - // test for move highlight - if (_LastHightLight == NULL) - { - CCtrlMover *pCM = dynamic_cast(pCB); - if ( (pCM != NULL) && (pCM->canMove() == true) ) - { - CGroupContainer *pGC = dynamic_cast(pCM->getParent()); - if (pGC != NULL && !pGC->isLocked()) - { - if (CWidgetManager::getInstance()->getCapturePointerLeft() != pCM) - pGC->setHighLighted(true, 128); - else - pGC->setHighLighted(true, 255); - _LastHightLight = pGC; - break; - } - } - } - } - } - - if (CWidgetManager::getInstance()->isMouseHandlingEnabled()) - { - if (rICL.empty()) - { - const vector &rIGL = CWidgetManager::getInstance()->getGroupsUnderPointer (); - for (uint32 i = 0; i < rIGL.size(); ++i) - { - CInterfaceGroup *pG = rIGL[i]; - if (overModalWindow) - { - if (!pG->isSonOf(currModal)) continue; - } - if (drawPan (pG, col)) return; - if (drawBrowse(pG, col)) return; - } - } - } - - if (_StringMode && CWidgetManager::getInstance()->isMouseHandlingEnabled()) - { - CInterfaceGroup *stringCursor = hwMouse ? _StringCursorHardware : _StringCursor; - if (stringCursor) - { - stringCursor->setX(_PointerX); - stringCursor->setY(_PointerY); - stringCursor->updateCoords(); - stringCursor->draw(); - // if in hardware mode, force to draw the default cursor no matter what.. - if ( hwMouse ) - { - drawCursor(_TxIdDefault, col, 0); - } - } - } - else - { - // Draw the default cursor - drawCursor(_TxIdDefault, col, 0); - } -} - -// -------------------------------------------------------------------------------------------------------------------- -bool CViewPointer::drawCustom(CCtrlBase* pCB) -{ - string texName; - uint8 rot; - NLMISC::CRGBA col; - if (pCB->getMouseOverShape(texName, rot, col)) - { - if (texName[0] == '@') - { - const string &tooltipInfos = texName.substr(1); - string tooltip; - vector tooltipInfosList; - splitString(tooltipInfos, "@", tooltipInfosList); - texName = tooltipInfosList[0]; - tooltip = tooltipInfosList[1]; - nlinfo(tooltip.c_str()); - setString(ucstring(tooltip)); - CViewRenderer &rVR = *CViewRenderer::getInstance(); - sint32 texId = rVR.getTextureIdFromName (texName); - - CInterfaceGroup *stringCursor = hwMouse ? _StringCursorHardware : _StringCursor; - if (stringCursor) - { - stringCursor->setX(_PointerX); - stringCursor->setY(_PointerY); - stringCursor->updateCoords(); - stringCursor->draw(); - // if in hardware mode, force to draw the default cursor no matter what.. - if ( hwMouse ) - drawCursor(texId, col, 0); - } - else - { - drawCursor(texId, col, 0); - } - return true; - } - else - { - CViewRenderer &rVR = *CViewRenderer::getInstance(); - sint32 texId = rVR.getTextureIdFromName (texName); - drawCursor(texId, col, 0); - return true; - } - } - return false; -} - - -// +++ SET +++ - - -// -------------------------------------------------------------------------------------------------------------------- -void CViewPointer::setStringMode (bool stringCursor) -{ - _StringMode = stringCursor; -} - -// -------------------------------------------------------------------------------------------------------------------- -void CViewPointer::setString (const ucstring &str, CInterfaceGroup *target) -{ - if (target) - { - CInterfaceElement *element = target->getView ("fake_txt"); - if (element) - { - CViewText *text = dynamic_cast (element); - if (text) - text->setText(str); - } - element = target->getView ("real_txt"); - if (element) - { - CViewText *text = dynamic_cast (element); - if (text) - text->setText(str); - } - target->updateCoords(); - target->updateCoords(); - _ContextString = str; - } -} - - -// -------------------------------------------------------------------------------------------------------------------- -void CViewPointer::setString (const ucstring &str) -{ - if (_ContextString != str) - { - setString(str, _StringCursor); - setString(str, _StringCursorHardware); - } -} - -// -------------------------------------------------------------------------------------------------------------------- -void CViewPointer::drawCursor(sint32 texId, NLMISC::CRGBA col, uint8 rot) -{ - CViewRenderer &rVR = *CViewRenderer::getInstance(); - sint32 xPos = _XReal + _OffsetX; - sint32 yPos = _YReal + _OffsetY; - if ( !hwMouse ) - { - rVR.draw11RotFlipBitmap (_RenderLayer, xPos, yPos, rot, false, texId, col); - } - else - { - // set new cursor for the hardware mouse - std::string name = rVR.getTextureNameFromId(texId); - rVR.getDriver()->setCursor(name, col, rot, (uint32) std::max(getX() - xPos, (sint32) 0), (uint32) std::max(getY() - yPos, (sint32) 0)); - } -} - - diff --git a/code/ryzom/client/src/interface_v3/view_pointer.h b/code/ryzom/client/src/interface_v3/view_pointer.h deleted file mode 100644 index cc422734c..000000000 --- a/code/ryzom/client/src/interface_v3/view_pointer.h +++ /dev/null @@ -1,143 +0,0 @@ -// Ryzom - MMORPG Framework -// Copyright (C) 2010 Winch Gate Property Limited -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - - - -#ifndef RZ_VIEW_POINTER_H -#define RZ_VIEW_POINTER_H - -#include "nel/misc/types_nl.h" -#include "nel/misc/events.h" -#include "nel/gui/view_pointer_base.h" - -namespace NLGUI -{ - class CCtrlBase; - class CGroupContainer; -} - -/** - * class describing the pointer - * \author Matthieu 'Trap' Besson - * \author Nevrax France - * \date 2002 - */ - -class CViewPointer : public CViewPointerBase -{ - -public: - DECLARE_UI_CLASS( CViewPointer ) - - CViewPointer( const TCtorParam ¶m ); - virtual ~CViewPointer(){} - - bool parse (xmlNodePtr cur,CInterfaceGroup * parentGroup); - void draw(); - - // Set cursor mode - void setStringMode (bool stringCursor); - bool getStringMode() const {return _StringMode;} - - // Set cursor string - void setString (const ucstring &str); - - // TEMP PATCH - void setCursor (const std::string &name) - { - _TxDefault = name; - _TxIdDefault = -2; - } - // TEMP PATCH - - /// Show or hide the pointer. Please, use SetMouseMode (bool freelook) instead. - void show(bool s) {_PointerVisible = s;} - - static void setHWMouse( bool hw ){ hwMouse = hw; } - -private: - - /// Drawing helpers - virtual bool drawResizer(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; } - virtual bool drawRotate(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; } - virtual bool drawScale(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; } - virtual bool drawColorPicker(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; } - virtual bool drawLink(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; } - virtual bool drawBrowse(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; } - virtual bool drawPan(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; } - virtual bool drawCustom(CCtrlBase* pCB); - -protected: - - // Look of the cursor in different situation - std::string _TxDefault; - std::string _TxMoveWindow; - std::string _TxResizeBRTL; - std::string _TxResizeBLTR; - std::string _TxResizeTB; - std::string _TxResizeLR; - std::string _TxRotate; - std::string _TxScale; - std::string _TxColPick; - std::string _TxPan; - std::string _TxCanPan; - std::string _TxPanR2; - std::string _TxCanPanR2; - - sint32 _TxIdDefault; - sint32 _TxIdMoveWindow; - sint32 _TxIdResizeBRTL; - sint32 _TxIdResizeBLTR; - sint32 _TxIdResizeTB; - sint32 _TxIdResizeLR; - sint32 _TxIdRotate; - sint32 _TxIdScale; - sint32 _TxIdColPick; - sint32 _TxIdPan; - sint32 _TxIdCanPan; - sint32 _TxIdPanR2; - sint32 _TxIdCanPanR2; - - NLMISC::CRGBA _Color; - - sint32 _OffsetX; - sint32 _OffsetY; - - CGroupContainer *_LastHightLight; - - // Cursor mode - bool _StringMode; - bool _ForceStringMode; - CInterfaceGroup *_StringCursor; - CInterfaceGroup *_StringCursorHardware; - ucstring _ContextString; - - // draw current cursor with the given texture, or, if in hardware mode, change the hardware cursor shape - void drawCursor(sint32 texId, NLMISC::CRGBA col, uint8 rot); - -private: - // set the string into frame for software or hardware version - void setString (const ucstring &str, CInterfaceGroup *target); - - static bool hwMouse; - -}; - - - -#endif // RZ_VIEW_POINTER_H - -/* End of view_pointer.h */ diff --git a/code/ryzom/client/src/interface_v3/view_pointer_ryzom.h b/code/ryzom/client/src/interface_v3/view_pointer_ryzom.h index 8afa7d654..9361bbcb3 100644 --- a/code/ryzom/client/src/interface_v3/view_pointer_ryzom.h +++ b/code/ryzom/client/src/interface_v3/view_pointer_ryzom.h @@ -2,7 +2,7 @@ #define VIEW_POINTER_RYZOM_H -#include "view_pointer.h" +#include "nel/gui/view_pointer.h" class CViewPointerRyzom : public CViewPointer {