ToyDragAndDropHandler.h 3.81 KB
//
//  ToyDragAndDropHandler.h
//  SteveMaggieCpp
//
//  Created by Katarzyna Kalinowska-Górska on 02.06.2017.
//
//

#ifndef ToyDragAndDropHandler_h
#define ToyDragAndDropHandler_h

#include <stdio.h>
#include <vector>
#include "cocos2d.h"
#include "ToyScenarioObject.h"
#include "TouchHandlerTypes.h"


class ToyDragAndDropHandler : public ToyScenarioObject
{
    public:
    
        typedef enum DragState {
            NotDragging,
            Dragging,
            DraggingOverCorrectDestination,
            DraggingOverWrongDestination
        } DragState;
    
        ToyDragAndDropHandler(std::vector<cocos2d::Node*> objectsToDrag, cocos2d::Node* destinationObject, std::vector<cocos2d::Node*> wrongDraggedObjects = std::vector<cocos2d::Node*>(), std::vector<cocos2d::Node*> wrongDestinationObjects = std::vector<cocos2d::Node*>());
    
        virtual TouchHandlerFunction prepareTouchBeganHandler();
        virtual TouchHandlerFunction prepareTouchMovedHandler();
        virtual TouchHandlerFunction prepareTouchEndedHandler();
    
        virtual void setObjectToDragExtendPercentValues(std::vector<float>);
        virtual void setAccurateDestinationCheck(bool accurateDstCheck);
        virtual void setFingerOnlyDestinationCheck(bool fingerOnlyDstCheck);
    
        friend class ToyBlockingActionParser; //temporary. will prepare setters when I have more time
    
    protected:
    
        bool _allowDraggingWrongObjects;
        bool _allowDraggingInvisibleObjects;
        bool _allowMultipleDrag;
        bool _moreAccurateDestinationCheck;
        bool _fingerOnlyDestinationCheck;
    
        std::vector<cocos2d::Node*> _objectsToDrag;
        std::vector<float> _extendPercentValues;
        std::vector<cocos2d::Node*> _wrongDestinationObjects;
        std::vector<cocos2d::Node*> _wrongDraggedObjects;
        std::vector<int> _cachedDraggedObjectRFActionTags;
    
        cocos2d::Node* _draggedObject;
        cocos2d::Node* _destinationObject;
        int _draggedObjectOriginalZ;
    
        bool _draggingWrongObject;
        cocos2d::Node* _draggingOverWrongDestinationObject;
        DragState _currentDraggingState;
    
        cocos2d::Point _startLocation;
        cocos2d::Point _startingObjectPosition;
    
        std::function<void(cocos2d::Node*, cocos2d::Node*)> _finalSuccessCallback;
        std::function<void(cocos2d::Node*, cocos2d::Node*)> _successCallback;
        std::function<void(cocos2d::Node*)> _wrongDestinationObjectCallback;
        std::function<void(cocos2d::Node*)> _startDraggingWrongObjectCallback;
        std::function<void(cocos2d::Node*)> _startDraggingCorrectObjectCallback;
//        std::map<std::string, std::function<void(cocos2d::Node*)>> _startDraggingConcreteObjectCallbacks;
        std::function<void(cocos2d::Node*, cocos2d::Node*)> _draggedObjectEnterCorrectDestinationCallback;
        std::function<void(cocos2d::Node*, cocos2d::Node*)> _draggedObjectEnterWrongDestinationCallback;
        std::function<void()> _dropTooSoonCallback;
        std::function<void(cocos2d::Node*)> _draggedWrongObjectCallback;
    
        std::function<void(cocos2d::Node*, cocos2d::Node*, cocos2d::Point)> _objectDragNDropSuccessBehaviour;
    
        virtual void onMovingOverCorrectDestination();
        virtual void onMovingOverWrongDestination(cocos2d::Node* wrongDestinationObject);
        virtual void onMovingOverNothing();
        virtual void onTouchEndedOverCorrectDestination();
        virtual void draggedObjectMoveBack(bool restoreActions);
        virtual cocos2d::Node* detectDestination(const cocos2d::Point& touchLocation, bool& isRightObject, bool& isWrongObject);
        virtual bool checkDraggingOverCorrectDestination(const cocos2d::Point& touchLocation);
        virtual cocos2d::Node* checkDraggingOverWrongDestination(const cocos2d::Point& touchLocation);
};

#endif /* ToyDragAndDropHandler_h */