/* * Copyright 2006 The Android Open Source Project * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkView_DEFINED #define SkView_DEFINED #include "SkEventSink.h" #include "SkRect.h" #include "SkMatrix.h" #include "SkMetaData.h" class SkCanvas; /** \class SkView SkView is the base class for screen management. All widgets and controls inherit from SkView. */ class SkView : public SkEventSink { public: enum Flag_Shift { kVisible_Shift, kNoClip_Shift, kFlagShiftCount }; enum Flag_Mask { kVisible_Mask = 1 << kVisible_Shift, //!< set if the view is visible kNoClip_Mask = 1 << kNoClip_Shift, //!< set if the view is not clipped to its bounds kAllFlagMasks = (uint32_t)(0 - 1) >> (32 - kFlagShiftCount) }; SkView(uint32_t flags = 0); virtual ~SkView(); /** Return the flags associated with the view */ uint32_t getFlags() const { return fFlags; } /** Set the flags associated with the view */ void setFlags(uint32_t flags); /** Helper that returns non-zero if the kVisible_Mask bit is set in the view's flags */ int isVisible() const { return fFlags & kVisible_Mask; } int isClipToBounds() const { return !(fFlags & kNoClip_Mask); } /** Helper to set/clear the view's kVisible_Mask flag */ void setVisibleP(bool); void setClipToBounds(bool); /** Return the view's width */ SkScalar width() const { return fWidth; } /** Return the view's height */ SkScalar height() const { return fHeight; } /** Set the view's width and height. These must both be >= 0. This does not affect the view's loc */ void setSize(SkScalar width, SkScalar height); void setSize(const SkPoint& size) { this->setSize(size.fX, size.fY); } void setWidth(SkScalar width) { this->setSize(width, fHeight); } void setHeight(SkScalar height) { this->setSize(fWidth, height); } /** Call this to have the view draw into the specified canvas. */ virtual void draw(SkCanvas* canvas); // Click handling class Click { public: Click(SkView* target); virtual ~Click(); enum State { kDown_State, kMoved_State, kUp_State }; SkPoint fOrig, fPrev, fCurr; SkIPoint fIOrig, fIPrev, fICurr; State fState; unsigned fModifierKeys; SkMetaData fMeta; private: SkEventSinkID fTargetID; friend class SkView; }; Click* findClickHandler(SkScalar x, SkScalar y, unsigned modifierKeys); static void DoClickDown(Click*, int x, int y, unsigned modi); static void DoClickMoved(Click*, int x, int y, unsigned modi); static void DoClickUp(Click*, int x, int y, unsigned modi); protected: /** Override this to draw inside the view. Be sure to call the inherited version too */ virtual void onDraw(SkCanvas*); /** Override this to be notified when the view's size changes. Be sure to call the inherited version too */ virtual void onSizeChange(); /** Override this if you might handle the click */ virtual Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi); /** Override this to track clicks, returning true as long as you want to track the pen/mouse. */ virtual bool onClick(Click*); private: SkScalar fWidth, fHeight; uint8_t fFlags; }; #endif