/*
* Copyright 2016 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/

#ifndef Slide_DEFINED
#define Slide_DEFINED

#include "include/core/SkRefCnt.h"
#include "include/core/SkSize.h"
#include "include/core/SkString.h"
#include "tools/Registry.h"
#include "tools/skui/InputState.h"
#include "tools/skui/ModifierKey.h"

class SkCanvas;
class SkMetaData;
class Slide;

using SlideFactory = Slide* (*)();
using SlideRegistry = sk_tools::Registry<SlideFactory>;

#define DEF_SLIDE(code) \
    static Slide*          SK_MACRO_APPEND_LINE(F_)() { code } \
    static SlideRegistry   SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_));

class Slide : public SkRefCnt {
public:
    /**
     * A slide may have a content dimensions that is independent of the current window size. An
     * empty size indicates that the Slide's dimensions are equal to the window's dimensions.
     */
    virtual SkISize getDimensions() const { return SkISize::MakeEmpty(); }

    virtual void gpuTeardown() { }
    virtual void draw(SkCanvas* canvas) = 0;
    virtual bool animate(double nanos) { return false; }
    virtual void load(SkScalar winWidth, SkScalar winHeight) {}
    virtual void resize(SkScalar winWidth, SkScalar winHeight) {}
    virtual void unload() {}

    virtual bool onChar(SkUnichar c) { return false; }
    virtual bool onMouse(SkScalar x, SkScalar y, skui::InputState state,
                         skui::ModifierKey modifiers) { return false; }

    virtual bool onGetControls(SkMetaData*) { return false; }
    virtual void onSetControls(const SkMetaData&) {}

    const SkString& getName() { return fName; }

protected:
    SkString    fName;
};

#endif
