Mercurial > hg > pub > prymula > com
diff DPF-Prymula-audioplugins/dpf/dgl/EventHandlers.hpp @ 3:84e66ea83026
DPF-Prymula-audioplugins-0.231015-2
author | prymula <prymula76@outlook.com> |
---|---|
date | Mon, 16 Oct 2023 21:53:34 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DPF-Prymula-audioplugins/dpf/dgl/EventHandlers.hpp Mon Oct 16 21:53:34 2023 +0200 @@ -0,0 +1,197 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2022 Filipe Coelho <falktx@falktx.com> + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_EVENT_HANDLERS_HPP_INCLUDED +#define DGL_EVENT_HANDLERS_HPP_INCLUDED + +#include "Widget.hpp" + +START_NAMESPACE_DGL + +/* NOTE none of these classes get assigned to a widget automatically + Manual plugging into Widget events is needed, like so: + + ``` + bool onMouse(const MouseEvent& ev) override + { + return ButtonEventHandler::mouseEvent(ev); + } + ``` +*/ + +// -------------------------------------------------------------------------------------------------------------------- + +class ButtonEventHandler +{ +public: + enum State { + kButtonStateDefault = 0x0, + kButtonStateHover = 0x1, + kButtonStateActive = 0x2, + kButtonStateActiveHover = kButtonStateActive|kButtonStateHover + }; + + class Callback + { + public: + virtual ~Callback() {} + virtual void buttonClicked(SubWidget* widget, int button) = 0; + }; + + explicit ButtonEventHandler(SubWidget* self); + virtual ~ButtonEventHandler(); + + bool isActive() noexcept; + void setActive(bool active, bool sendCallback) noexcept; + + bool isChecked() const noexcept; + void setChecked(bool checked, bool sendCallback) noexcept; + + bool isCheckable() const noexcept; + void setCheckable(bool checkable) noexcept; + + Point<double> getLastClickPosition() const noexcept; + Point<double> getLastMotionPosition() const noexcept; + + void setCallback(Callback* callback) noexcept; + + bool mouseEvent(const Widget::MouseEvent& ev); + bool motionEvent(const Widget::MotionEvent& ev); + +protected: + State getState() const noexcept; + void clearState() noexcept; + + virtual void stateChanged(State state, State oldState); + + void setInternalCallback(Callback* callback) noexcept; + void triggerUserCallback(SubWidget* widget, int button); + +private: + struct PrivateData; + PrivateData* const pData; + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ButtonEventHandler) +}; + +// -------------------------------------------------------------------------------------------------------------------- + +class KnobEventHandler +{ +public: + enum Orientation { + Horizontal, + Vertical, + Both + }; + + // NOTE hover not implemented yet + enum State { + kKnobStateDefault = 0x0, + kKnobStateHover = 0x1, + kKnobStateDragging = 0x2, + kKnobStateDraggingHover = kKnobStateDragging|kKnobStateHover + }; + + class Callback + { + public: + virtual ~Callback() {} + virtual void knobDragStarted(SubWidget* widget) = 0; + virtual void knobDragFinished(SubWidget* widget) = 0; + virtual void knobValueChanged(SubWidget* widget, float value) = 0; + virtual void knobDoubleClicked(SubWidget*) {}; + }; + + explicit KnobEventHandler(SubWidget* self); + explicit KnobEventHandler(SubWidget* self, const KnobEventHandler& other); + KnobEventHandler& operator=(const KnobEventHandler& other); + virtual ~KnobEventHandler(); + + // if setStep(1) has been called before, this returns true + bool isInteger() const noexcept; + + // returns raw value, is assumed to be scaled if using log + float getValue() const noexcept; + + // NOTE: value is assumed to be scaled if using log + virtual bool setValue(float value, bool sendCallback = false) noexcept; + + // returns 0-1 ranged value, already with log scale as needed + float getNormalizedValue() const noexcept; + + // NOTE: value is assumed to be scaled if using log + void setDefault(float def) noexcept; + + // NOTE: value is assumed to be scaled if using log + void setRange(float min, float max) noexcept; + + void setStep(float step) noexcept; + + void setUsingLogScale(bool yesNo) noexcept; + + Orientation getOrientation() const noexcept; + void setOrientation(Orientation orientation) noexcept; + + void setCallback(Callback* callback) noexcept; + + // default 200, higher means slower + void setMouseDeceleration(float accel) noexcept; + + bool mouseEvent(const Widget::MouseEvent& ev, double scaleFactor = 1.0); + bool motionEvent(const Widget::MotionEvent& ev, double scaleFactor = 1.0); + bool scrollEvent(const Widget::ScrollEvent& ev); + +protected: + State getState() const noexcept; + +private: + struct PrivateData; + PrivateData* const pData; + + /* not for use */ +#ifdef DISTRHO_PROPER_CPP11_SUPPORT + KnobEventHandler(KnobEventHandler& other) = delete; + KnobEventHandler(const KnobEventHandler& other) = delete; +#else + KnobEventHandler(KnobEventHandler& other); + KnobEventHandler(const KnobEventHandler& other); +#endif + + DISTRHO_LEAK_DETECTOR(KnobEventHandler) +}; + +// -------------------------------------------------------------------------------------------------------------------- + +class SliderEventHandler +{ +public: + explicit SliderEventHandler(SubWidget* self); + virtual ~SliderEventHandler(); + +private: + struct PrivateData; + PrivateData* const pData; + + DISTRHO_LEAK_DETECTOR(SliderEventHandler) +}; + +// -------------------------------------------------------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_EVENT_HANDLERS_HPP_INCLUDED +