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

#include "tools/viewer/ClickHandlerSlide.h"

bool ClickHandlerSlide::onMouse(SkScalar x, SkScalar y,
                                skui::InputState clickState,
                                skui::ModifierKey modifierKeys) {
    auto dispatch = [this](Click* c) {
        return c->fHasFunc ? c->fFunc(c) : this->onClick(c);
    };

    switch (clickState) {
        case skui::InputState::kDown:
            fClick = nullptr;
            fClick.reset(this->onFindClickHandler(x, y, modifierKeys));
            if (!fClick) {
                return false;
            }
            fClick->fPrev = fClick->fCurr = fClick->fOrig = {x, y};
            fClick->fState = skui::InputState::kDown;
            fClick->fModifierKeys = modifierKeys;
            dispatch(fClick.get());
            return true;
        case skui::InputState::kMove:
            if (fClick) {
                fClick->fPrev = fClick->fCurr;
                fClick->fCurr = {x, y};
                fClick->fState = skui::InputState::kMove;
                fClick->fModifierKeys = modifierKeys;
                return dispatch(fClick.get());
            }
            return false;
        case skui::InputState::kUp:
            if (fClick) {
                fClick->fPrev = fClick->fCurr;
                fClick->fCurr = {x, y};
                fClick->fState = skui::InputState::kUp;
                fClick->fModifierKeys = modifierKeys;
                bool result = dispatch(fClick.get());
                fClick = nullptr;
                return result;
            }
            return false;
        default:
            // Ignore other cases
            SK_ABORT("Unexepected InputState");
    }

    SkUNREACHABLE;
}
