root/src/preferences/input/InputTouchpadPrefView.h
/*
 * Copyright 2019-2025, Haiku, Inc.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *              Preetpal Kaur <preetpalok123@gmail.com>
 *              Samuel Rodríguez Pérez <samuelrp84@gmail.com>
 */


#ifndef TOUCHPAD_PREF_VIEW_H
#define TOUCHPAD_PREF_VIEW_H

#include <Bitmap.h>
#include <Button.h>
#include <CheckBox.h>
#include <GroupView.h>
#include <Invoker.h>
#include <OptionPopUp.h>
#include <Slider.h>
#include <StringView.h>
#include <View.h>

#include "InputTouchpadPref.h"
#include "touchpad_settings.h"

#include <Debug.h>

#if DEBUG
#       define LOG(text...) PRINT((text))
#else
#       define LOG(text...)
#endif

const uint SCROLL_AREA_CHANGED = '&sac';
const uint SCROLL_CONTROL_CHANGED = '&scc';
const uint TAP_CONTROL_CHANGED = '&tcc';
const uint DEFAULT_SETTINGS = '&dse';
const uint REVERT_SETTINGS = '&rse';
const uint PADBLOCK_TIME_CHANGED = '&ptc';
const uint PAD_SPEED_CHANGED = '&psc';
const uint PAD_ACCELERATION_CHANGED = '&pac';
const uint EDGE_MOTION_CHANGED = '&emc';
const uint FINGER_CLICK_CHANGED = '&fcc';
const uint SOFTWARE_BUTTON_AREAS_CHANGED = '&sbc';

class DeviceListView;


//! Shows a touchpad
class TouchpadView : public BView, public BInvoker {
public:
                                                        TouchpadView(BRect frame);
        virtual                                 ~TouchpadView();
        virtual void                    Draw(BRect updateRect);
        virtual void                    MouseDown(BPoint point);
        virtual void                    MouseUp(BPoint point);
        virtual void                    MouseMoved(BPoint point, uint32 transit,
                                                                const BMessage* dragMessage);

        virtual void                    AttachedToWindow();
        virtual void                    GetPreferredSize(float* width, float* height);

                        void                    SetValues(float rightRange, float bottomRange);
                        float                   GetRightScrollRatio()
                                                                { return 1 - fXScrollRange / fPadRect.Width(); }
                        float                   GetBottomScrollRatio()
                                                                { return 1
                                                                        - fYScrollRange / fPadRect.Height(); }
private:
        virtual void                    DrawSliders();

                        BRect                   fPrefRect;
                        BRect                   fPadRect;
                        BRect                   fXScrollDragZone;
                        float                   fXScrollRange;
                        float                   fOldXScrollRange;
                        BRect                   fYScrollDragZone;
                        float                   fYScrollRange;
                        float                   fOldYScrollRange;

                        bool                    fXTracking;
                        bool                    fYTracking;
                        BView*                  fOffScreenView;
                        BBitmap*                fOffScreenBitmap;
};


class TouchpadPrefView : public BGroupView {
public:
                                                        TouchpadPrefView(BInputDevice* dev);
        virtual                                 ~TouchpadPrefView();
        virtual void                    MessageReceived(BMessage* message);
        virtual void                    AttachedToWindow();
        virtual void                    DetachedFromWindow();
                        void                    SetupView();

                        void                    SetValues(touchpad_settings *settings);
private:
                        TouchpadPref    fTouchpadPref;
                        TouchpadView*   fTouchpadView;
                        BCheckBox*              fScrollReverseBox;
                        BCheckBox*              fTwoFingerBox;
                        BCheckBox*              fTwoFingerHorizontalBox;
                        BCheckBox*              fTwoFingerNaturalScrollingBox;
                        BCheckBox*              fFingerClickBox;
                        BCheckBox*              fSoftwareButtonAreasBox;
                        BSlider*                fScrollStepXSlider;
                        BSlider*                fScrollStepYSlider;
                        BSlider*                fScrollAccelSlider;
                        BSlider*                fPadBlockerSlider;
                        BSlider*                fTapSlider;
                        BSlider*                fSpeedSlider;
                        BSlider*                fAccelSlider;
                        BOptionPopUp*   fEdgeMotionOptionPopUp;
                        BButton*                fDefaultButton;
                        BButton*                fRevertButton;
};

#endif  // TOUCHPAD_PREF_VIEW_H