00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef _XNV_SELECTABLE_SLIDER_2D_H_
00010 #define _XNV_SELECTABLE_SLIDER_2D_H_
00011
00012 #include <XnOpenNI.h>
00013 #include "XnVNiteDefs.h"
00014 #include "XnVPointControl.h"
00015 #include "XnVDirection.h"
00016 #include "XnVSlider2D.h"
00017 #include "XnVMultiItemHysteresis2D.h"
00018 #include "XnVSlider1D.h"
00019 #include "XnVMultiItemHysteresis1D.h"
00020
00021 class XnVBorderScrollController2D;
00022
00029 class XNV_NITE_API XnVSelectableSlider2D :
00030 public XnVPointControl
00031 {
00032 public:
00036 typedef void (XN_CALLBACK_TYPE *ItemHoverCB)(XnInt32 nXIndex, XnInt32 nYIndex, void* pUserCxt);
00040 typedef void (XN_CALLBACK_TYPE *ItemSelectCB)(XnInt32 nXIndex, XnInt32 nYIndex, XnVDirection eDir, void* pUserCxt);
00044 typedef void (XN_CALLBACK_TYPE *OffAxisMovementCB)(XnVDirection eDir, void* pUserCxt);
00049 typedef void (XN_CALLBACK_TYPE *ValueChangeCB)(XnFloat fXValue, XnFloat fYValue, void* pUserCxt);
00054 typedef void (XN_CALLBACK_TYPE *ScrollCB)(XnFloat fXValue, XnFloat fYValue, void* pUserCxt);
00055
00067 XnVSelectableSlider2D(XnInt32 nXItems, XnInt32 nYItems,
00068 XnFloat fSliderSizeX = ms_fDefaultSliderSize, XnFloat fSliderSizeY = ms_fDefaultSliderSize,
00069 XnFloat fBorderWidth = 0, const XnChar* strName = "XnVSelectableSlider2D");
00070 virtual ~XnVSelectableSlider2D();
00071
00078 void OnPrimaryPointCreate(const XnVHandPointContext* pContext, const XnPoint3D& ptFocus);
00085 void OnPrimaryPointUpdate(const XnVHandPointContext* pContext);
00091 void OnPrimaryPointDestroy(XnUInt32 nID);
00092
00101 XnCallbackHandle RegisterItemHover(void* cxt, ItemHoverCB CB);
00110 XnCallbackHandle RegisterScroll(void* cxt, ScrollCB CB);
00119 XnCallbackHandle RegisterValueChange(void* cxt, ValueChangeCB CB);
00128 XnCallbackHandle RegisterItemSelect(void* cxt, ItemSelectCB CB);
00137 XnCallbackHandle RegisterOffAxisMovement(void* cxt, OffAxisMovementCB CB);
00138
00144 void UnregisterItemHover(XnCallbackHandle hCB);
00150 void UnregisterScroll(XnCallbackHandle hCB);
00156 void UnregisterValueChange(XnCallbackHandle hCB);
00162 void UnregisterItemSelect(XnCallbackHandle hCB);
00168 void UnregisterOffAxisMovement(XnCallbackHandle hCB);
00169
00170 static const XnFloat ms_fDefaultSliderSize;
00171
00177 void Reposition(const XnPoint3D& ptCenter);
00178 void GetCenter(XnPoint3D& ptCenter) const;
00179
00186 void GetSliderSize(XnFloat& fSliderXSize, XnFloat& fSliderYSize) const;
00193 void SetSliderSize(XnFloat fSliderXSize, XnFloat fSliderYSize);
00194
00200 XnUInt32 GetItemXCount() const;
00206 XnUInt32 GetItemYCount() const;
00213 void SetItemCount(XnUInt32 nItemXCount, XnUInt32 nItemYCount);
00219 void SetItemXCount(XnUInt32 nItemXCount);
00225 void SetItemYCount(XnUInt32 nItemYCount);
00226
00232 void SetValueChangeOnOffAxis(XnBool bReport);
00236 XnBool GetValueChangeOnOffAxis() const;
00237
00243 XnFloat GetBorderWidth() const;
00249 XnStatus SetBorderWidth(XnFloat fWidth);
00256 void SetHysteresisRatio(XnFloat fRatio);
00262 XnFloat GetHysteresisRatio() const;
00263 protected:
00264 XN_DECLARE_EVENT_3ARG(XnVItemSelectSpecificEvent, XnVItemSelectEvent, XnInt32, nItemX, XnInt32, nItemY, XnVDirection, eDir);
00265
00266 void UpdateSlider(XnFloat fXValue, XnFloat fYValue);
00267
00268 void PointDeleted(XnBool bReason);
00269 void PointMoved(const XnPoint3D& pt, XnFloat fTime);
00270
00271
00272 void ItemHover(XnInt32 nXIndex, XnInt32 nYIndex);
00273 void Scroll(XnFloat fXValue, XnFloat fYValue);
00274 void ValueChange(XnFloat fXValue, XnFloat fYValue);
00275 void ItemSelect(XnVDirection eDir);
00276 void OffAxisMovement(XnVDirection eDir);
00277
00278
00279 static void XN_CALLBACK_TYPE Slider_ValueChange(XnFloat fXValue, XnFloat fYValue, void* pContext);
00280 static void XN_CALLBACK_TYPE Slider_OffAxis(XnVDirection eDir, void* cxt);
00281 static void XN_CALLBACK_TYPE Hysteresis_ItemSelected(XnInt32 nXItem, XnInt32 nYItem, void* pContext);
00282 static void XN_CALLBACK_TYPE Scroller2D_Scrolled(XnFloat fXValue, XnFloat fYValue, void *pContext);
00283
00284 static void XN_CALLBACK_TYPE SecondarySlider_OffAxisMovement(XnVDirection eDir, void* cxt);
00285 static void XN_CALLBACK_TYPE SecondarySlider_ValueChange(XnFloat fValue, void* cxt);
00286 static void XN_CALLBACK_TYPE OffAxisHysteresis_ItemSelected(XnInt32 nItem, void* cxt);
00287
00288 static const XnFloat ms_fSecondarySliderSize;
00289 XnBool m_bValueChangeWithoutBorders;
00290
00291 XnBool m_bPositioned;
00292 XnInt32 m_nXItems, m_nYItems;
00293
00294 XnBool m_bValueChangeOnOffAxis;
00295
00296 XnFloat m_fSliderSizeX;
00297 XnFloat m_fSliderSizeY;
00298 XnFloat m_fBorderWidth;
00299 XnVSlider2D* m_pSlider;
00300 XnVMultiItemHysteresis2D* m_pHysteresis;
00301 XnVBorderScrollController2D* m_pScroller;
00302
00303 XnBool m_bInOffAxis;
00304 XnVSlider1D* m_pSecondarySlider;
00305 XnVMultiItemHysteresis1D* m_pOffAxisHysteresis;
00306
00307 XnPoint3D m_ptCenter;
00308
00309 XnInt32 m_nXLastHover, m_nYLastHover;
00310
00311 XnCallbackHandle m_hHysteresisItemSelect;
00312 XnCallbackHandle m_hScrollerScroll;
00313 XnCallbackHandle m_hSliderValueChange;
00314 XnCallbackHandle m_hSliderOffAxis;
00315
00316 XnCallbackHandle m_hOffAxisHysteresisItemSelect;
00317 XnCallbackHandle m_hSecondarySliderValueChange;
00318 XnCallbackHandle m_hSecondarySliderOffAxis;
00319
00320 XnVIntIntSpecificEvent m_ItemHoverCBs;
00321 XnVFloatFloatSpecificEvent m_ScrollCBs;
00322 XnVFloatFloatSpecificEvent m_ValueChangeCBs;
00323 XnVItemSelectSpecificEvent m_ItemSelectCBs;
00324 XnVDirectionSpecificEvent m_OffAxisMovementCBs;
00325 };
00326
00327 #endif // _XNV_SELECTABLE_SLIDER_2D_H_