1886da342Sopenharmony_ci/*
2886da342Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3886da342Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4886da342Sopenharmony_ci * you may not use this file except in compliance with the License.
5886da342Sopenharmony_ci * You may obtain a copy of the License at
6886da342Sopenharmony_ci *
7886da342Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8886da342Sopenharmony_ci *
9886da342Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10886da342Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11886da342Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12886da342Sopenharmony_ci * See the License for the specific language governing permissions and
13886da342Sopenharmony_ci * limitations under the License.
14886da342Sopenharmony_ci */
15886da342Sopenharmony_ci#ifndef UI_ACTION_H
16886da342Sopenharmony_ci#define UI_ACTION_H
17886da342Sopenharmony_ci
18886da342Sopenharmony_ci#include <vector>
19886da342Sopenharmony_ci#include "ui_model.h"
20886da342Sopenharmony_ci
21886da342Sopenharmony_cinamespace OHOS::uitest {
22886da342Sopenharmony_ci    // frequently used keys.
23886da342Sopenharmony_ci    constexpr int32_t KEYCODE_NONE = 0;
24886da342Sopenharmony_ci    constexpr int32_t KEYCODE_BACK = 2;
25886da342Sopenharmony_ci    constexpr int32_t KEYCODE_DPAD_RIGHT = 2015;
26886da342Sopenharmony_ci    constexpr int32_t KEYCODE_DEL = 2055;
27886da342Sopenharmony_ci    constexpr int32_t KEYCODE_CTRL = 2072;
28886da342Sopenharmony_ci    constexpr int32_t KEYCODE_V = 2038;
29886da342Sopenharmony_ci    constexpr int32_t KEYCODE_POWER = 18;
30886da342Sopenharmony_ci    constexpr int32_t KEYCODE_HOME = 1;
31886da342Sopenharmony_ci    constexpr int32_t KEYCODE_D = 2020;
32886da342Sopenharmony_ci    constexpr int32_t KEYCODE_WIN = 2076;
33886da342Sopenharmony_ci
34886da342Sopenharmony_ci    /**Enumerates all the supported coordinate-based touch operations.*/
35886da342Sopenharmony_ci    enum TouchOp : uint8_t { CLICK, LONG_CLICK, DOUBLE_CLICK_P, SWIPE, DRAG, FLING};
36886da342Sopenharmony_ci
37886da342Sopenharmony_ci    /**Enumerates the supported Key actions.*/
38886da342Sopenharmony_ci    enum UiKey : uint8_t { BACK, GENERIC };
39886da342Sopenharmony_ci
40886da342Sopenharmony_ci    enum ActionStage : uint8_t {
41886da342Sopenharmony_ci        NONE = 0, DOWN = 1, MOVE = 2, UP = 3, AXIS_UP = 4, AXIS_DOWN = 5, AXIS_STOP = 6
42886da342Sopenharmony_ci    };
43886da342Sopenharmony_ci
44886da342Sopenharmony_ci    enum ResizeDirection : uint8_t {
45886da342Sopenharmony_ci        LEFT,
46886da342Sopenharmony_ci        RIGHT,
47886da342Sopenharmony_ci        D_UP,
48886da342Sopenharmony_ci        D_DOWN,
49886da342Sopenharmony_ci        LEFT_UP,
50886da342Sopenharmony_ci        LEFT_DOWN,
51886da342Sopenharmony_ci        RIGHT_UP,
52886da342Sopenharmony_ci        RIGHT_DOWN
53886da342Sopenharmony_ci    };
54886da342Sopenharmony_ci
55886da342Sopenharmony_ci    enum DisplayRotation : uint32_t {
56886da342Sopenharmony_ci        ROTATION_0,
57886da342Sopenharmony_ci        ROTATION_90,
58886da342Sopenharmony_ci        ROTATION_180,
59886da342Sopenharmony_ci        ROTATION_270
60886da342Sopenharmony_ci    };
61886da342Sopenharmony_ci
62886da342Sopenharmony_ci    enum MouseButton : int32_t {
63886da342Sopenharmony_ci        BUTTON_NONE = -1,
64886da342Sopenharmony_ci        BUTTON_LEFT = 0,
65886da342Sopenharmony_ci        BUTTON_RIGHT = 1,
66886da342Sopenharmony_ci        BUTTON_MIDDLE = 2
67886da342Sopenharmony_ci    };
68886da342Sopenharmony_ci
69886da342Sopenharmony_ci    enum Direction : uint32_t {
70886da342Sopenharmony_ci        TO_LEFT,
71886da342Sopenharmony_ci        TO_RIGHT,
72886da342Sopenharmony_ci        TO_UP,
73886da342Sopenharmony_ci        TO_DOWN
74886da342Sopenharmony_ci    };
75886da342Sopenharmony_ci
76886da342Sopenharmony_ci    struct TouchEvent {
77886da342Sopenharmony_ci        ActionStage stage_;
78886da342Sopenharmony_ci        Point point_;
79886da342Sopenharmony_ci        uint32_t downTimeOffsetMs_;
80886da342Sopenharmony_ci        uint32_t holdMs_;
81886da342Sopenharmony_ci        uint32_t flags_;
82886da342Sopenharmony_ci    };
83886da342Sopenharmony_ci
84886da342Sopenharmony_ci    struct KeyEvent {
85886da342Sopenharmony_ci        ActionStage stage_;
86886da342Sopenharmony_ci        int32_t code_;
87886da342Sopenharmony_ci        uint32_t holdMs_;
88886da342Sopenharmony_ci    };
89886da342Sopenharmony_ci
90886da342Sopenharmony_ci    struct MouseEvent {
91886da342Sopenharmony_ci        ActionStage stage_;
92886da342Sopenharmony_ci        Point point_;
93886da342Sopenharmony_ci        MouseButton button_;
94886da342Sopenharmony_ci        vector<KeyEvent> keyEvents_;
95886da342Sopenharmony_ci        uint32_t holdMs_;
96886da342Sopenharmony_ci    };
97886da342Sopenharmony_ci
98886da342Sopenharmony_ci    class PointerMatrix : public BackendClass {
99886da342Sopenharmony_ci    public:
100886da342Sopenharmony_ci        PointerMatrix();
101886da342Sopenharmony_ci
102886da342Sopenharmony_ci        PointerMatrix(uint32_t fingersNum, uint32_t stepsNum);
103886da342Sopenharmony_ci
104886da342Sopenharmony_ci        PointerMatrix(PointerMatrix&& other);
105886da342Sopenharmony_ci
106886da342Sopenharmony_ci        PointerMatrix& operator=(PointerMatrix&& other);
107886da342Sopenharmony_ci
108886da342Sopenharmony_ci        ~PointerMatrix() override;
109886da342Sopenharmony_ci
110886da342Sopenharmony_ci        const FrontEndClassDef &GetFrontendClassDef() const override
111886da342Sopenharmony_ci        {
112886da342Sopenharmony_ci            return POINTER_MATRIX_DEF;
113886da342Sopenharmony_ci        }
114886da342Sopenharmony_ci
115886da342Sopenharmony_ci        void PushAction(const TouchEvent& ptr);
116886da342Sopenharmony_ci
117886da342Sopenharmony_ci        bool Empty() const;
118886da342Sopenharmony_ci
119886da342Sopenharmony_ci        TouchEvent& At(uint32_t fingerIndex, uint32_t stepIndex) const;
120886da342Sopenharmony_ci
121886da342Sopenharmony_ci        uint32_t GetCapacity() const;
122886da342Sopenharmony_ci
123886da342Sopenharmony_ci        uint32_t GetSize() const;
124886da342Sopenharmony_ci
125886da342Sopenharmony_ci        uint32_t GetSteps() const;
126886da342Sopenharmony_ci
127886da342Sopenharmony_ci        uint32_t GetFingers() const;
128886da342Sopenharmony_ci
129886da342Sopenharmony_ci        void ConvertToMouseEvents(vector<MouseEvent> &recv) const;
130886da342Sopenharmony_ci    private:
131886da342Sopenharmony_ci        std::unique_ptr<TouchEvent[]> data_ = nullptr;
132886da342Sopenharmony_ci        uint32_t capacity_ = 0;
133886da342Sopenharmony_ci        uint32_t stepNum_ = 0;
134886da342Sopenharmony_ci        uint32_t fingerNum_ = 0;
135886da342Sopenharmony_ci        uint32_t size_ = 0;
136886da342Sopenharmony_ci    };
137886da342Sopenharmony_ci
138886da342Sopenharmony_ci    /**
139886da342Sopenharmony_ci     * Options of the UI operations, initialized with system default values.
140886da342Sopenharmony_ci     **/
141886da342Sopenharmony_ci    class UiOpArgs {
142886da342Sopenharmony_ci    public:
143886da342Sopenharmony_ci        const uint32_t maxSwipeVelocityPps_ = 40000;
144886da342Sopenharmony_ci        const uint32_t minSwipeVelocityPps_ = 200;
145886da342Sopenharmony_ci        const uint32_t defaultSwipeVelocityPps_ = 600;
146886da342Sopenharmony_ci        const uint32_t maxMultiTouchFingers = 10;
147886da342Sopenharmony_ci        const uint32_t maxMultiTouchSteps = 1000;
148886da342Sopenharmony_ci        uint32_t clickHoldMs_ = 100;
149886da342Sopenharmony_ci        uint32_t longClickHoldMs_ = 1500;
150886da342Sopenharmony_ci        uint32_t doubleClickIntervalMs_ = 200;
151886da342Sopenharmony_ci        uint32_t keyHoldMs_ = 100;
152886da342Sopenharmony_ci        uint32_t swipeVelocityPps_ = defaultSwipeVelocityPps_;
153886da342Sopenharmony_ci        uint32_t uiSteadyThresholdMs_ = 1000;
154886da342Sopenharmony_ci        uint32_t waitUiSteadyMaxMs_ = 3000;
155886da342Sopenharmony_ci        uint32_t waitWidgetMaxMs_ = 5000;
156886da342Sopenharmony_ci        int32_t scrollWidgetDeadZone_ = 80; // make sure the scrollWidget does not slide more than one page.
157886da342Sopenharmony_ci        int32_t pinchWidgetDeadZone_ = 40;  // pinching at the edges of the widget has no effect.
158886da342Sopenharmony_ci        uint16_t swipeStepsCounts_ = 50;
159886da342Sopenharmony_ci    };
160886da342Sopenharmony_ci
161886da342Sopenharmony_ci    class TouchAction {
162886da342Sopenharmony_ci    public:
163886da342Sopenharmony_ci        /**Compute the touch event sequence that are needed to implement this action.
164886da342Sopenharmony_ci         * @param recv: the event seqence receiver.
165886da342Sopenharmony_ci         * @param options the ui operation agruments.
166886da342Sopenharmony_ci         * */
167886da342Sopenharmony_ci        virtual void Decompose(PointerMatrix &recv, const UiOpArgs &options) const = 0;
168886da342Sopenharmony_ci    };
169886da342Sopenharmony_ci
170886da342Sopenharmony_ci    /**
171886da342Sopenharmony_ci     * Base type of all raw pointer click actions.
172886da342Sopenharmony_ci     **/
173886da342Sopenharmony_ci    class GenericClick : public TouchAction {
174886da342Sopenharmony_ci    public:
175886da342Sopenharmony_ci        GenericClick(TouchOp type, const Point &point) : type_(type), point_(point) {};
176886da342Sopenharmony_ci
177886da342Sopenharmony_ci        void Decompose(PointerMatrix &recv, const UiOpArgs &options) const override;
178886da342Sopenharmony_ci
179886da342Sopenharmony_ci        ~GenericClick() = default;
180886da342Sopenharmony_ci
181886da342Sopenharmony_ci    private:
182886da342Sopenharmony_ci        const TouchOp type_;
183886da342Sopenharmony_ci        const Point point_;
184886da342Sopenharmony_ci    };
185886da342Sopenharmony_ci
186886da342Sopenharmony_ci    /**
187886da342Sopenharmony_ci     * Base type of all raw pointer swipe actions.
188886da342Sopenharmony_ci     **/
189886da342Sopenharmony_ci    class GenericSwipe : public TouchAction {
190886da342Sopenharmony_ci    public:
191886da342Sopenharmony_ci        explicit GenericSwipe(TouchOp type, const Point &from, const Point &to) : type_(type), from_(from), to_(to) {};
192886da342Sopenharmony_ci
193886da342Sopenharmony_ci        void Decompose(PointerMatrix &recv, const UiOpArgs &options) const override;
194886da342Sopenharmony_ci
195886da342Sopenharmony_ci        ~GenericSwipe() = default;
196886da342Sopenharmony_ci
197886da342Sopenharmony_ci    private:
198886da342Sopenharmony_ci        const TouchOp type_;
199886da342Sopenharmony_ci        const Point from_;
200886da342Sopenharmony_ci        const Point to_;
201886da342Sopenharmony_ci    };
202886da342Sopenharmony_ci
203886da342Sopenharmony_ci    /**
204886da342Sopenharmony_ci     * Base type of all raw pointer pinch actions.
205886da342Sopenharmony_ci     **/
206886da342Sopenharmony_ci    class GenericPinch : public TouchAction {
207886da342Sopenharmony_ci    public:
208886da342Sopenharmony_ci        explicit GenericPinch(const Rect &rect, float_t scale) : rect_(rect), scale_(scale) {};
209886da342Sopenharmony_ci
210886da342Sopenharmony_ci        void Decompose(PointerMatrix &recv, const UiOpArgs &options) const override;
211886da342Sopenharmony_ci
212886da342Sopenharmony_ci        ~GenericPinch() = default;
213886da342Sopenharmony_ci
214886da342Sopenharmony_ci    private:
215886da342Sopenharmony_ci        const Rect rect_;
216886da342Sopenharmony_ci        const float_t scale_;
217886da342Sopenharmony_ci    };
218886da342Sopenharmony_ci
219886da342Sopenharmony_ci    /**
220886da342Sopenharmony_ci     * Base type of multi pointer actions.
221886da342Sopenharmony_ci     **/
222886da342Sopenharmony_ci    class MultiPointerAction : public TouchAction {
223886da342Sopenharmony_ci    public:
224886da342Sopenharmony_ci        explicit MultiPointerAction(const PointerMatrix &pointer) : pointers_(pointer) {};
225886da342Sopenharmony_ci
226886da342Sopenharmony_ci        void Decompose(PointerMatrix &recv, const UiOpArgs &options) const override;
227886da342Sopenharmony_ci
228886da342Sopenharmony_ci        ~MultiPointerAction() = default;
229886da342Sopenharmony_ci
230886da342Sopenharmony_ci    private:
231886da342Sopenharmony_ci        const PointerMatrix& pointers_;
232886da342Sopenharmony_ci    };
233886da342Sopenharmony_ci
234886da342Sopenharmony_ci    /**
235886da342Sopenharmony_ci     * Base type of all key actions.
236886da342Sopenharmony_ci     * */
237886da342Sopenharmony_ci    class KeyAction {
238886da342Sopenharmony_ci    public:
239886da342Sopenharmony_ci        /**Compute the key event sequence that are needed to implement this action.*/
240886da342Sopenharmony_ci        virtual void ComputeEvents(std::vector<KeyEvent> &recv, const UiOpArgs &options) const = 0;
241886da342Sopenharmony_ci
242886da342Sopenharmony_ci        virtual ~KeyAction() = default;
243886da342Sopenharmony_ci    };
244886da342Sopenharmony_ci
245886da342Sopenharmony_ci    class KeysForwarder : public KeyAction {
246886da342Sopenharmony_ci    public:
247886da342Sopenharmony_ci        explicit KeysForwarder(const vector<KeyEvent> &evetns) : events_(evetns) {};
248886da342Sopenharmony_ci
249886da342Sopenharmony_ci        void ComputeEvents(vector<KeyEvent> &recv, const UiOpArgs &opt) const override
250886da342Sopenharmony_ci        {
251886da342Sopenharmony_ci            recv = events_;
252886da342Sopenharmony_ci        }
253886da342Sopenharmony_ci
254886da342Sopenharmony_ci    private:
255886da342Sopenharmony_ci        const vector<KeyEvent> &events_;
256886da342Sopenharmony_ci    };
257886da342Sopenharmony_ci
258886da342Sopenharmony_ci    /**Base type of named single-key actions with at most 1 ctrl key.*/
259886da342Sopenharmony_ci    template<uint32_t kCode, uint32_t kCtrlCode = KEYCODE_NONE>
260886da342Sopenharmony_ci    class NamedPlainKey : public KeyAction {
261886da342Sopenharmony_ci    public:
262886da342Sopenharmony_ci        explicit NamedPlainKey() = default;
263886da342Sopenharmony_ci
264886da342Sopenharmony_ci        void ComputeEvents(std::vector<KeyEvent> &recv, const UiOpArgs &opt) const override
265886da342Sopenharmony_ci        {
266886da342Sopenharmony_ci            if (kCtrlCode != KEYCODE_NONE) {
267886da342Sopenharmony_ci                recv.push_back(KeyEvent {ActionStage::DOWN, kCtrlCode,  0});
268886da342Sopenharmony_ci            }
269886da342Sopenharmony_ci            recv.push_back(KeyEvent {ActionStage::DOWN, kCode, opt.keyHoldMs_});
270886da342Sopenharmony_ci            if (kCtrlCode != KEYCODE_NONE) {
271886da342Sopenharmony_ci                recv.push_back(KeyEvent {ActionStage::UP, kCtrlCode, 0});
272886da342Sopenharmony_ci            }
273886da342Sopenharmony_ci            recv.push_back(KeyEvent {ActionStage::UP, kCode, 0});
274886da342Sopenharmony_ci        }
275886da342Sopenharmony_ci    };
276886da342Sopenharmony_ci
277886da342Sopenharmony_ci    /**Generic key actions without name and ctrl key.*/
278886da342Sopenharmony_ci    class AnonymousSingleKey final : public KeyAction {
279886da342Sopenharmony_ci    public:
280886da342Sopenharmony_ci        explicit AnonymousSingleKey(int32_t code) : code_(code) {};
281886da342Sopenharmony_ci
282886da342Sopenharmony_ci        void ComputeEvents(std::vector<KeyEvent> &recv, const UiOpArgs &opt) const override
283886da342Sopenharmony_ci        {
284886da342Sopenharmony_ci            recv.push_back(KeyEvent {ActionStage::DOWN, code_, opt.keyHoldMs_});
285886da342Sopenharmony_ci            recv.push_back(KeyEvent {ActionStage::UP, code_, 0});
286886da342Sopenharmony_ci        }
287886da342Sopenharmony_ci
288886da342Sopenharmony_ci    private:
289886da342Sopenharmony_ci        const int32_t code_;
290886da342Sopenharmony_ci    };
291886da342Sopenharmony_ci
292886da342Sopenharmony_ci    /**Generic Combinedkeys actions.*/
293886da342Sopenharmony_ci    class CombinedKeys final : public KeyAction {
294886da342Sopenharmony_ci    public:
295886da342Sopenharmony_ci        CombinedKeys(int32_t codeZero, int32_t codeOne, int32_t codeTwo)
296886da342Sopenharmony_ci            : codeZero_(codeZero), codeOne_(codeOne), codeTwo_(codeTwo) {};
297886da342Sopenharmony_ci
298886da342Sopenharmony_ci        void ComputeEvents(std::vector<KeyEvent> &recv, const UiOpArgs &opt) const override
299886da342Sopenharmony_ci        {
300886da342Sopenharmony_ci            recv.push_back(KeyEvent {ActionStage::DOWN, codeZero_, 0});
301886da342Sopenharmony_ci            recv.push_back(KeyEvent {ActionStage::DOWN, codeOne_, 0});
302886da342Sopenharmony_ci            if (codeTwo_ != KEYCODE_NONE) {
303886da342Sopenharmony_ci                recv.push_back(KeyEvent {ActionStage::DOWN, codeTwo_, opt.keyHoldMs_});
304886da342Sopenharmony_ci            } else {
305886da342Sopenharmony_ci                recv.at(INDEX_ONE).holdMs_ = opt.keyHoldMs_;
306886da342Sopenharmony_ci            }
307886da342Sopenharmony_ci            recv.push_back(KeyEvent {ActionStage::UP, codeZero_, 0});
308886da342Sopenharmony_ci            recv.push_back(KeyEvent {ActionStage::UP, codeOne_, 0});
309886da342Sopenharmony_ci            if (codeTwo_ != KEYCODE_NONE) {
310886da342Sopenharmony_ci                recv.push_back(KeyEvent {ActionStage::UP, codeTwo_, 0});
311886da342Sopenharmony_ci            }
312886da342Sopenharmony_ci        }
313886da342Sopenharmony_ci
314886da342Sopenharmony_ci    private:
315886da342Sopenharmony_ci        const int32_t codeZero_;
316886da342Sopenharmony_ci        const int32_t codeOne_;
317886da342Sopenharmony_ci        const int32_t codeTwo_;
318886da342Sopenharmony_ci    };
319886da342Sopenharmony_ci
320886da342Sopenharmony_ci    using Back = NamedPlainKey<KEYCODE_BACK>;
321886da342Sopenharmony_ci    using Power = NamedPlainKey<KEYCODE_POWER>;
322886da342Sopenharmony_ci    using Home = NamedPlainKey<KEYCODE_HOME>;
323886da342Sopenharmony_ci    using Paste = NamedPlainKey<KEYCODE_V, KEYCODE_CTRL>;
324886da342Sopenharmony_ci
325886da342Sopenharmony_ci    class MouseAction {
326886da342Sopenharmony_ci    public:
327886da342Sopenharmony_ci        /**Compute the mouse event sequence that are needed to implement this action.
328886da342Sopenharmony_ci         * @param recv: the event seqence receiver.
329886da342Sopenharmony_ci         * @param options the ui operation agruments.
330886da342Sopenharmony_ci         * */
331886da342Sopenharmony_ci        virtual void Decompose(std::vector<MouseEvent> &recv, const UiOpArgs &opt) const = 0;
332886da342Sopenharmony_ci    };
333886da342Sopenharmony_ci
334886da342Sopenharmony_ci    class MouseMoveTo : public MouseAction {
335886da342Sopenharmony_ci    public:
336886da342Sopenharmony_ci        explicit MouseMoveTo(const Point &point) : point_(point) {};
337886da342Sopenharmony_ci
338886da342Sopenharmony_ci        void Decompose(std::vector<MouseEvent> &recv, const UiOpArgs &opt) const override;
339886da342Sopenharmony_ci
340886da342Sopenharmony_ci        ~MouseMoveTo() = default;
341886da342Sopenharmony_ci
342886da342Sopenharmony_ci    private:
343886da342Sopenharmony_ci        const Point point_;
344886da342Sopenharmony_ci    };
345886da342Sopenharmony_ci
346886da342Sopenharmony_ci    class MouseSwipe : public MouseAction {
347886da342Sopenharmony_ci    public:
348886da342Sopenharmony_ci        explicit MouseSwipe(TouchOp type, const Point &from, const Point &to) : type_(type), from_(from), to_(to) {};
349886da342Sopenharmony_ci
350886da342Sopenharmony_ci        void Decompose(std::vector<MouseEvent> &recv, const UiOpArgs &opt) const override;
351886da342Sopenharmony_ci
352886da342Sopenharmony_ci        ~MouseSwipe() = default;
353886da342Sopenharmony_ci
354886da342Sopenharmony_ci    private:
355886da342Sopenharmony_ci        const TouchOp type_;
356886da342Sopenharmony_ci        const Point from_;
357886da342Sopenharmony_ci        const Point to_;
358886da342Sopenharmony_ci    };
359886da342Sopenharmony_ci
360886da342Sopenharmony_ci    class MouseClick : public MouseAction {
361886da342Sopenharmony_ci    public:
362886da342Sopenharmony_ci        explicit MouseClick(TouchOp type, const Point &point, const MouseButton &button, int32_t &key1, int32_t &key2)
363886da342Sopenharmony_ci            : type_(type), point_(point), button_(button), key1_(key1), key2_(key2) {};
364886da342Sopenharmony_ci
365886da342Sopenharmony_ci        void Decompose(std::vector<MouseEvent> &recv, const UiOpArgs &opt) const override;
366886da342Sopenharmony_ci
367886da342Sopenharmony_ci        ~MouseClick() = default;
368886da342Sopenharmony_ci
369886da342Sopenharmony_ci    private:
370886da342Sopenharmony_ci        const TouchOp type_;
371886da342Sopenharmony_ci        const Point point_;
372886da342Sopenharmony_ci        const MouseButton button_;
373886da342Sopenharmony_ci        const int32_t key1_;
374886da342Sopenharmony_ci        const int32_t key2_;
375886da342Sopenharmony_ci    };
376886da342Sopenharmony_ci
377886da342Sopenharmony_ci    class MouseScroll : public MouseAction {
378886da342Sopenharmony_ci    public:
379886da342Sopenharmony_ci        explicit MouseScroll(const Point &point, int32_t scrollValue, int32_t key1, int32_t key2, uint32_t speed)
380886da342Sopenharmony_ci            : point_(point),  scrollValue_(scrollValue), key1_(key1), key2_(key2),  speed_(speed) {};
381886da342Sopenharmony_ci
382886da342Sopenharmony_ci        void Decompose(std::vector<MouseEvent> &recv, const UiOpArgs &opt) const override;
383886da342Sopenharmony_ci
384886da342Sopenharmony_ci        ~MouseScroll() = default;
385886da342Sopenharmony_ci
386886da342Sopenharmony_ci    private:
387886da342Sopenharmony_ci        const Point point_;
388886da342Sopenharmony_ci        const int32_t scrollValue_;
389886da342Sopenharmony_ci        const int32_t key1_;
390886da342Sopenharmony_ci        const int32_t key2_;
391886da342Sopenharmony_ci        const uint32_t speed_;
392886da342Sopenharmony_ci    };
393886da342Sopenharmony_ci
394886da342Sopenharmony_ci    /**
395886da342Sopenharmony_ci     * Base type of all atomic actions.
396886da342Sopenharmony_ci     * */
397886da342Sopenharmony_ci    class GenericAtomicAction : public TouchAction {
398886da342Sopenharmony_ci    public:
399886da342Sopenharmony_ci        explicit GenericAtomicAction(const ActionStage stage, const Point point) : stage_(stage), point_(point) {};
400886da342Sopenharmony_ci
401886da342Sopenharmony_ci        void Decompose(PointerMatrix &recv, const UiOpArgs &options) const override;
402886da342Sopenharmony_ci
403886da342Sopenharmony_ci        ~GenericAtomicAction() = default;
404886da342Sopenharmony_ci
405886da342Sopenharmony_ci    private:
406886da342Sopenharmony_ci        const ActionStage stage_;
407886da342Sopenharmony_ci        const Point point_;
408886da342Sopenharmony_ci    };
409886da342Sopenharmony_ci}
410886da342Sopenharmony_ci
411886da342Sopenharmony_ci#endif