lltooldraganddrop.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:10k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltooldraganddrop.h
  3.  * @brief LLToolDragAndDrop class header file
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_TOOLDRAGANDDROP_H
  33. #define LL_TOOLDRAGANDDROP_H
  34. #include "lldictionary.h"
  35. #include "lltool.h"
  36. #include "llview.h"
  37. #include "lluuid.h"
  38. #include "stdenums.h"
  39. #include "llassetstorage.h"
  40. #include "lldarray.h"
  41. #include "llpermissions.h"
  42. #include "llwindow.h"
  43. #include "llviewerinventory.h"
  44. class LLToolDragAndDrop;
  45. class LLViewerRegion;
  46. class LLVOAvatar;
  47. class LLPickInfo;
  48. class LLToolDragAndDrop : public LLTool, public LLSingleton<LLToolDragAndDrop>
  49. {
  50. public:
  51. typedef boost::signals2::signal<void ()> enddrag_signal_t;
  52. LLToolDragAndDrop();
  53. // overridden from LLTool
  54. virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
  55. virtual BOOL handleHover(S32 x, S32 y, MASK mask);
  56. virtual BOOL handleKey(KEY key, MASK mask);
  57. virtual BOOL handleToolTip(S32 x, S32 y, MASK mask);
  58. virtual void onMouseCaptureLost();
  59. virtual void handleDeselect();
  60. void setDragStart( S32 x, S32 y ); // In screen space
  61. BOOL isOverThreshold( S32 x, S32 y ); // In screen space
  62. enum ESource
  63. {
  64. SOURCE_AGENT,
  65. SOURCE_WORLD,
  66. SOURCE_NOTECARD,
  67. SOURCE_LIBRARY
  68. };
  69. void beginDrag(EDragAndDropType type,
  70.    const LLUUID& cargo_id,
  71.    ESource source,
  72.    const LLUUID& source_id = LLUUID::null,
  73.    const LLUUID& object_id = LLUUID::null);
  74. void beginMultiDrag(const std::vector<EDragAndDropType> types,
  75. const std::vector<LLUUID>& cargo_ids,
  76. ESource source,
  77. const LLUUID& source_id = LLUUID::null);
  78. void endDrag();
  79. ESource getSource() const { return mSource; }
  80. const LLUUID& getSourceID() const { return mSourceID; }
  81. const LLUUID& getObjectID() const { return mObjectID; }
  82. EAcceptance getLastAccept() { return mLastAccept; }
  83. boost::signals2::connection setEndDragCallback( const enddrag_signal_t::slot_type& cb ) { return mEndDragSignal.connect(cb); }
  84. protected:
  85. enum EDropTarget
  86. {
  87. DT_NONE = 0,
  88. DT_SELF = 1,
  89. DT_AVATAR = 2,
  90. DT_OBJECT = 3,
  91. DT_LAND = 4,
  92. DT_COUNT = 5
  93. };
  94. protected:
  95. // dragOrDrop3dImpl points to a member of LLToolDragAndDrop that
  96. // takes parameters (LLViewerObject* obj, S32 face, MASK, BOOL
  97. // drop) and returns a BOOL if drop is ok
  98. typedef EAcceptance (LLToolDragAndDrop::*dragOrDrop3dImpl)
  99. (LLViewerObject*, S32, MASK, BOOL);
  100. void dragOrDrop(S32 x, S32 y, MASK mask, BOOL drop,
  101. EAcceptance* acceptance);
  102. void dragOrDrop3D(S32 x, S32 y, MASK mask, BOOL drop,
  103.   EAcceptance* acceptance);
  104. static void pickCallback(const LLPickInfo& pick_info);
  105. void pick(const LLPickInfo& pick_info);
  106. protected:
  107. S32 mDragStartX;
  108. S32 mDragStartY;
  109. std::vector<EDragAndDropType> mCargoTypes;
  110. //void* mCargoData;
  111. std::vector<LLUUID> mCargoIDs;
  112. ESource mSource;
  113. LLUUID mSourceID;
  114. LLUUID mObjectID;
  115. LLVector3d mLastCameraPos;
  116. LLVector3d mLastHitPos;
  117. ECursorType mCursor;
  118. EAcceptance mLastAccept;
  119. BOOL mDrop;
  120. S32 mCurItemIndex;
  121. std::string mToolTipMsg;
  122. enddrag_signal_t mEndDragSignal;
  123. protected:
  124. // 3d drop functions. these call down into the static functions
  125. // named drop<ThingToDrop> if drop is TRUE and permissions allow
  126. // that behavior.
  127. EAcceptance dad3dNULL(LLViewerObject*, S32, MASK, BOOL);
  128. EAcceptance dad3dRezObjectOnLand(LLViewerObject* obj, S32 face,
  129.  MASK mask, BOOL drop);
  130. EAcceptance dad3dRezObjectOnObject(LLViewerObject* obj, S32 face,
  131.    MASK mask, BOOL drop);
  132. EAcceptance dad3dRezScript(LLViewerObject* obj, S32 face,
  133.    MASK mask, BOOL drop);
  134. EAcceptance dad3dTextureObject(LLViewerObject* obj, S32 face,
  135.    MASK mask, BOOL drop);
  136. // EAcceptance dad3dTextureSelf(LLViewerObject* obj, S32 face,
  137. //  MASK mask, BOOL drop);
  138. EAcceptance dad3dWearItem(LLViewerObject* obj, S32 face,
  139.  MASK mask, BOOL drop);
  140. EAcceptance dad3dWearCategory(LLViewerObject* obj, S32 face,
  141.  MASK mask, BOOL drop);
  142. EAcceptance dad3dUpdateInventory(LLViewerObject* obj, S32 face,
  143.  MASK mask, BOOL drop);
  144. EAcceptance dad3dUpdateInventoryCategory(LLViewerObject* obj,
  145.  S32 face,
  146.  MASK mask,
  147.  BOOL drop);
  148. EAcceptance dad3dGiveInventoryObject(LLViewerObject* obj, S32 face,
  149.    MASK mask, BOOL drop);
  150. EAcceptance dad3dGiveInventory(LLViewerObject* obj, S32 face,
  151.    MASK mask, BOOL drop);
  152. EAcceptance dad3dGiveInventoryCategory(LLViewerObject* obj, S32 face,
  153.    MASK mask, BOOL drop);
  154. EAcceptance dad3dRezFromObjectOnLand(LLViewerObject* obj, S32 face,
  155.  MASK mask, BOOL drop);
  156. EAcceptance dad3dRezFromObjectOnObject(LLViewerObject* obj, S32 face,
  157.    MASK mask, BOOL drop);
  158. EAcceptance dad3dRezAttachmentFromInv(LLViewerObject* obj, S32 face,
  159.   MASK mask, BOOL drop);
  160. EAcceptance dad3dCategoryOnLand(LLViewerObject *obj, S32 face,
  161. MASK mask, BOOL drop);
  162. EAcceptance dad3dAssetOnLand(LLViewerObject *obj, S32 face,
  163.  MASK mask, BOOL drop);
  164. EAcceptance dad3dActivateGesture(LLViewerObject *obj, S32 face,
  165.  MASK mask, BOOL drop);
  166. // set the LLToolDragAndDrop's cursor based on the given acceptance
  167. ECursorType acceptanceToCursor( EAcceptance acceptance );
  168. // This method converts mCargoID to an inventory item or
  169. // folder. If no item or category is found, both pointers will be
  170. // returned NULL.
  171. LLInventoryObject* locateInventory(LLViewerInventoryItem*& item,
  172.    LLViewerInventoryCategory*& cat);
  173. //LLInventoryObject* locateMultipleInventory(
  174. // LLViewerInventoryCategory::cat_array_t& cats,
  175. // LLViewerInventoryItem::item_array_t& items);
  176. void dropObject(LLViewerObject* raycast_target,
  177. BOOL bypass_sim_raycast,
  178. BOOL from_task_inventory,
  179. BOOL remove_from_inventory);
  180. // accessor that looks at permissions, copyability, and names of
  181. // inventory items to determine if a drop would be ok.
  182. static EAcceptance willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item);
  183. // deal with permissions of object, etc. returns TRUE if drop can
  184. // proceed, otherwise FALSE.
  185. static BOOL handleDropTextureProtections(LLViewerObject* hit_obj,
  186.  LLInventoryItem* item,
  187.  LLToolDragAndDrop::ESource source,
  188.  const LLUUID& src_id);
  189. // give inventory item functionality
  190. static bool handleCopyProtectedItem(const LLSD& notification, const LLSD& response);
  191. static void commitGiveInventoryItem(const LLUUID& to_agent,
  192. LLInventoryItem* item,
  193. const LLUUID &im_session_id = LLUUID::null);
  194. // give inventory category functionality
  195. static bool handleCopyProtectedCategory(const LLSD& notification, const LLSD& response);
  196. static void commitGiveInventoryCategory(const LLUUID& to_agent,
  197. LLInventoryCategory* cat,
  198. const LLUUID &im_session_id = LLUUID::null);
  199. public:
  200. // helper functions
  201. static BOOL isInventoryDropAcceptable(LLViewerObject* obj, LLInventoryItem* item) { return (ACCEPT_YES_COPY_SINGLE <= willObjectAcceptInventory(obj, item)); }
  202. // This simple helper function assumes you are attempting to
  203. // transfer item. returns true if you can give, otherwise false.
  204. static BOOL isInventoryGiveAcceptable(LLInventoryItem* item);
  205. static BOOL isInventoryGroupGiveAcceptable(LLInventoryItem* item);
  206. BOOL dadUpdateInventory(LLViewerObject* obj, BOOL drop);
  207. BOOL dadUpdateInventoryCategory(LLViewerObject* obj, BOOL drop);
  208. // methods that act on the simulator state.
  209. static void dropScript(LLViewerObject* hit_obj,
  210.    LLInventoryItem* item,
  211.    BOOL active,
  212.    ESource source,
  213.    const LLUUID& src_id);
  214. static void dropTextureOneFace(LLViewerObject* hit_obj, S32 hit_face,
  215.    LLInventoryItem* item,
  216.    ESource source,
  217.    const LLUUID& src_id);
  218. static void dropTextureAllFaces(LLViewerObject* hit_obj,
  219. LLInventoryItem* item,
  220. ESource source,
  221. const LLUUID& src_id);
  222. //static void dropTextureOneFaceAvatar(LLVOAvatar* avatar,S32 hit_face,
  223. //  LLInventoryItem* item)
  224. static void dropInventory(LLViewerObject* hit_obj,
  225.   LLInventoryItem* item,
  226.   ESource source,
  227.   const LLUUID& src_id);
  228. static void giveInventory(const LLUUID& to_agent, 
  229.   LLInventoryItem* item,
  230.   const LLUUID &session_id = LLUUID::null);
  231. static void giveInventoryCategory(const LLUUID& to_agent,
  232.   LLInventoryCategory* item,
  233.   const LLUUID &session_id = LLUUID::null);
  234. static bool handleGiveDragAndDrop(LLUUID agent, LLUUID session, BOOL drop,
  235.   EDragAndDropType cargo_type,
  236.   void* cargo_data,
  237.   EAcceptance* accept);
  238. // Classes used for determining 3d drag and drop types.
  239. private:
  240. struct DragAndDropEntry : public LLDictionaryEntry
  241. {
  242. DragAndDropEntry(dragOrDrop3dImpl f_none,
  243.  dragOrDrop3dImpl f_self,
  244.  dragOrDrop3dImpl f_avatar,
  245.  dragOrDrop3dImpl f_object,
  246.  dragOrDrop3dImpl f_land);
  247. dragOrDrop3dImpl mFunctions[DT_COUNT];
  248. };
  249. class LLDragAndDropDictionary : public LLSingleton<LLDragAndDropDictionary>,
  250. public LLDictionary<EDragAndDropType, DragAndDropEntry>
  251. {
  252. public:
  253. LLDragAndDropDictionary();
  254. dragOrDrop3dImpl get(EDragAndDropType dad_type, EDropTarget drop_target);
  255. };
  256. };
  257. // utility functions
  258. void pack_permissions_slam(LLMessageSystem* msg, U32 flags, const LLPermissions& perms);
  259. #endif  // LL_TOOLDRAGANDDROP_H