File: ScrollArea.h

package info (click to toggle)
lsp-plugins 1.2.21-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 120,408 kB
  • sloc: cpp: 589,849; xml: 74,078; makefile: 13,396; php: 1,268; sh: 185
file content (134 lines) | stat: -rw-r--r-- 5,909 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
 * Copyright (C) 2023 Linux Studio Plugins Project <https://lsp-plug.in/>
 *           (C) 2023 Vladimir Sadovnikov <sadko4u@gmail.com>
 *
 * This file is part of lsp-tk-lib
 * Created on: 17 июл. 2020 г.
 *
 * lsp-tk-lib is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * any later version.
 *
 * lsp-tk-lib is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with lsp-tk-lib. If not, see <https://www.gnu.org/licenses/>.
 */

#ifndef LSP_PLUG_IN_TK_WIDGETS_CONTAINERS_SCROLLAREA_H_
#define LSP_PLUG_IN_TK_WIDGETS_CONTAINERS_SCROLLAREA_H_

#ifndef LSP_PLUG_IN_TK_IMPL
    #error "use <lsp-plug.in/tk/tk.h>"
#endif

namespace lsp
{
    namespace tk
    {
        // Style definition
        namespace style
        {
            LSP_TK_STYLE_DEF_BEGIN(ScrollArea, WidgetContainer)
                prop::Layout            sLayout;
                prop::SizeConstraints   sSizeConstraints;
                prop::Scrolling         sHScrollMode;
                prop::Scrolling         sVScrollMode;
                prop::RangeFloat        sHScroll;
                prop::RangeFloat        sVScroll;
            LSP_TK_STYLE_DEF_END
        }

        /**
         * Scrolling area widget, provides container that may scroll it's contents if it does not fit into
         * the window
         */
        class ScrollArea: public WidgetContainer
        {
            public:
                static const w_class_t    metadata;

            protected:
                typedef struct alloc_t
                {
                    ws::size_limit_t        sSize;      // Overall widget size limits
                    ws::size_limit_t        sWidget;    // Size limits of the widget
                    ws::rectangle_t         sArea;      // Area allocated for the widget
                    ws::rectangle_t         sHBar;      // horizontal scroll parameters
                    ws::rectangle_t         sVBar;      // vertical scroll parameters
                    bool                    bHBar;      // horizontal scroll enable
                    bool                    bVBar;      // vertical scroll enable
                    ssize_t                 wMinW;      // widget min width
                    ssize_t                 wMinH;      // widget min height
                } alloc_t;

            protected:
                Widget                 *pWidget;
                ScrollBar               sHBar;
                ScrollBar               sVBar;
                ws::rectangle_t         sArea;

                prop::Layout            sLayout;
                prop::SizeConstraints   sSizeConstraints;
                prop::Scrolling         sHScrollMode;
                prop::Scrolling         sVScrollMode;
                prop::RangeFloat        sHScroll;
                prop::RangeFloat        sVScroll;

            protected:
                void                    do_destroy();
                void                    estimate_size(alloc_t *a, const ws::rectangle_t *xr);

                static status_t         slot_on_scroll_change(Widget *sender, void *ptr, void *data);

            protected:
                virtual void            property_changed(Property *prop) override;
                virtual void            size_request(ws::size_limit_t *r) override;
                virtual void            realize(const ws::rectangle_t *r) override;

            public:
                explicit                ScrollArea(Display *dpy);
                ScrollArea(const ScrollArea &) = delete;
                ScrollArea(ScrollArea &&) = delete;
                virtual                 ~ScrollArea() override;

                ScrollArea & operator = (const ScrollArea &) = delete;
                ScrollArea & operator = (ScrollArea &&) = delete;

                virtual status_t        init() override;
                virtual void            destroy() override;

            public:
                inline void             get_area(ws::rectangle_t *area) { *area = sArea;            }

            public:
                LSP_TK_PROPERTY(Layout,             layout,             &sLayout)
                LSP_TK_PROPERTY(SizeConstraints,    constraints,        &sSizeConstraints)
                LSP_TK_PROPERTY(Scrolling,          hscroll_mode,       &sHScrollMode)
                LSP_TK_PROPERTY(Scrolling,          vscroll_mode,       &sVScrollMode)

                LSP_TK_PROPERTY(RangeFloat,         hscroll,            &sHScroll)
                LSP_TK_PROPERTY(RangeFloat,         vscroll,            &sVScroll)
                LSP_TK_PROPERTY(StepFloat,          hstep,               sHBar.step())
                LSP_TK_PROPERTY(StepFloat,          vstep,               sVBar.step())
                LSP_TK_PROPERTY(StepFloat,          haccel_step,         sHBar.accel_step())
                LSP_TK_PROPERTY(StepFloat,          vaccel_step,         sVBar.accel_step())

            public:
                virtual void            render(ws::ISurface *s, const ws::rectangle_t *area, bool force) override;

                virtual status_t        add(Widget *widget) override;
                virtual status_t        remove(Widget *widget) override;

                virtual Widget         *find_widget(ssize_t x, ssize_t y) override;

                virtual status_t        on_mouse_scroll(const ws::event_t *e) override;
        };
    } /* namespace tk */
} /* namespace lsp */

#endif /* LSP_PLUG_IN_TK_WIDGETS_CONTAINERS_SCROLLAREA_H_ */