1 /*
2  * Copyright (C) 2020 Linux Studio Plugins Project <https://lsp-plug.in/>
3  *           (C) 2020 Vladimir Sadovnikov <sadko4u@gmail.com>
4  *
5  * This file is part of lsp-plugins
6  * Created on: 8 окт. 2017 г.
7  *
8  * lsp-plugins is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * any later version.
12  *
13  * lsp-plugins is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with lsp-plugins. If not, see <https://www.gnu.org/licenses/>.
20  */
21 
22 #include <ui/tk/tk.h>
23 
24 namespace lsp
25 {
26     namespace tk
27     {
LSPSizeConstraints(LSPWidget * w)28         LSPSizeConstraints::LSPSizeConstraints(LSPWidget *w)
29         {
30             sSize.nMinWidth     = -1;
31             sSize.nMinHeight    = -1;
32             sSize.nMaxWidth     = -1;
33             sSize.nMaxHeight    = -1;
34             pWidget             = w;
35         }
36 
~LSPSizeConstraints()37         LSPSizeConstraints::~LSPSizeConstraints()
38         {
39         }
40 
max_width() const41         ssize_t LSPSizeConstraints::max_width() const
42         {
43             return ((sSize.nMaxWidth >= 0) && (sSize.nMinWidth > sSize.nMaxWidth)) ?
44                     sSize.nMinWidth : sSize.nMaxWidth;
45         }
46 
max_height() const47         ssize_t LSPSizeConstraints::max_height() const
48         {
49             return ((sSize.nMaxHeight >= 0) && (sSize.nMinHeight > sSize.nMaxHeight)) ?
50                     sSize.nMinHeight : sSize.nMaxHeight;
51         }
52 
get(size_request_t * dst) const53         void LSPSizeConstraints::get(size_request_t *dst) const
54         {
55             dst->nMinWidth  = sSize.nMinWidth;
56             dst->nMinHeight = sSize.nMinHeight;
57             dst->nMaxWidth  = max_width();
58             dst->nMaxHeight = max_height();
59         }
60 
set_min_width(ssize_t value)61         void LSPSizeConstraints::set_min_width(ssize_t value)
62         {
63             if (sSize.nMinWidth == value)
64                 return;
65 
66             sSize.nMinWidth     = value;
67             if (value < 0)
68                 return;
69 
70             ssize_t size        = pWidget->width();
71             if (size < value)
72                 pWidget->query_resize();
73         }
74 
set_min_height(ssize_t value)75         void LSPSizeConstraints::set_min_height(ssize_t value)
76         {
77             if (sSize.nMinHeight == value)
78                 return;
79 
80             sSize.nMinHeight    = value;
81             if (value < 0)
82                 return;
83 
84             ssize_t size        = pWidget->height();
85             if (size < value)
86                 pWidget->query_resize();
87         }
88 
set_max_width(ssize_t value)89         void LSPSizeConstraints::set_max_width(ssize_t value)
90         {
91             if (sSize.nMaxWidth == value)
92                 return;
93 
94             sSize.nMaxWidth     = value;
95             if (value < 0)
96                 return;
97 
98             ssize_t size        = pWidget->width();
99             if (size > value)
100                 pWidget->query_resize();
101         }
102 
set_max_height(ssize_t value)103         void LSPSizeConstraints::set_max_height(ssize_t value)
104         {
105             if (sSize.nMaxHeight == value)
106                 return;
107 
108             sSize.nMaxHeight    = value;
109             if (value < 0)
110                 return;
111 
112             ssize_t size        = pWidget->height();
113             if (size > value)
114                 pWidget->query_resize();
115         }
116 
set_width(ssize_t min,ssize_t max)117         void LSPSizeConstraints::set_width(ssize_t min, ssize_t max)
118         {
119             if ((sSize.nMinWidth == min) && (sSize.nMaxWidth == max))
120                 return;
121 
122             sSize.nMinWidth     = min;
123             sSize.nMaxWidth     = max;
124             ssize_t size        = pWidget->width();
125 
126             if (((min >= 0) && (size < min)) ||
127                 ((max >= 0) && (size > max)))
128                 pWidget->query_resize();
129         }
130 
set_height(ssize_t min,ssize_t max)131         void LSPSizeConstraints::set_height(ssize_t min, ssize_t max)
132         {
133             if ((sSize.nMinHeight == min) && (sSize.nMaxHeight == max))
134                 return;
135 
136             sSize.nMinHeight    = min;
137             sSize.nMaxHeight    = max;
138             ssize_t size        = pWidget->height();
139 
140             if (((min >= 0) && (size < min)) ||
141                 ((max >= 0) && (size > max)))
142                 pWidget->query_resize();
143         }
144 
set(ssize_t min_width,ssize_t min_height,ssize_t max_width,ssize_t max_height)145         void LSPSizeConstraints::set(ssize_t min_width, ssize_t min_height, ssize_t max_width, ssize_t max_height)
146         {
147             if ((sSize.nMinWidth == min_width) && (sSize.nMaxHeight == max_width) &&
148                 (sSize.nMinHeight == min_height) && (sSize.nMaxHeight == max_width))
149                 return;
150 
151             sSize.nMinWidth     = min_width;
152             sSize.nMinHeight    = min_height;
153             sSize.nMaxWidth     = max_width;
154             sSize.nMaxHeight    = max_height;
155 
156             ssize_t width       = pWidget->width();
157             ssize_t height      = pWidget->height();
158 
159             if (((min_width >= 0) && (width < min_width)) ||
160                 ((max_width >= 0) && (width > max_width)) ||
161                 ((min_height >= 0) && (height < min_height)) ||
162                 ((max_height >= 0) && (height > max_height)))
163                 pWidget->query_resize();
164         }
165 
set_min(ssize_t min_width,ssize_t min_height)166         void LSPSizeConstraints::set_min(ssize_t min_width, ssize_t min_height)
167         {
168             if ((sSize.nMinWidth == min_width) &&
169                 (sSize.nMinHeight == min_height))
170                 return;
171 
172             sSize.nMinWidth     = min_width;
173             sSize.nMinHeight    = min_height;
174 
175             ssize_t width       = pWidget->width();
176             ssize_t height      = pWidget->height();
177 
178             if (((min_width >= 0) && (width < min_width)) ||
179                 ((min_height >= 0) && (height < min_height)))
180                 pWidget->query_resize();
181         }
182 
set_max(ssize_t max_width,ssize_t max_height)183         void LSPSizeConstraints::set_max(ssize_t max_width, ssize_t max_height)
184         {
185             if ((sSize.nMaxHeight == max_width) &&
186                 (sSize.nMaxHeight == max_width))
187                 return;
188 
189             sSize.nMaxWidth     = max_width;
190             sSize.nMaxHeight    = max_height;
191 
192             ssize_t width       = pWidget->width();
193             ssize_t height      = pWidget->height();
194 
195             if (((max_width >= 0) && (width > max_width)) ||
196                 ((max_height >= 0) && (height > max_height)))
197                 pWidget->query_resize();
198         }
199 
set(const size_request_t * sr)200         void LSPSizeConstraints::set(const size_request_t *sr)
201         {
202             set(sr->nMinWidth, sr->nMinHeight, sr->nMaxWidth, sr->nMaxHeight);
203         }
204 
apply(size_request_t * sr) const205         void LSPSizeConstraints::apply(size_request_t *sr) const
206         {
207             if ((sSize.nMinWidth >= 0) && (sr->nMinWidth < sSize.nMinWidth))
208                 sr->nMinWidth       = sSize.nMinWidth;
209             if ((sSize.nMinHeight >= 0) && (sr->nMinHeight < sSize.nMinHeight))
210                 sr->nMinHeight      = sSize.nMinHeight;
211             if ((sSize.nMaxWidth >= 0) && (sr->nMaxWidth < sSize.nMaxWidth))
212                 sr->nMaxWidth       = sSize.nMaxWidth;
213             if ((sSize.nMaxHeight >= 0) && (sr->nMaxHeight < sSize.nMaxHeight))
214                 sr->nMaxHeight      = sSize.nMaxHeight;
215 //            if ((sSize.nMaxWidth >= 0) && (sr->nMaxWidth >= 0) && (sr->nMaxWidth < sSize.nMaxWidth))
216 //                sr->nMaxWidth       = sSize.nMaxWidth;
217 //            if ((sSize.nMaxHeight >= 0) && (sr->nMaxHeight >= 0) && (sr->nMaxHeight < sSize.nMaxHeight))
218 //                sr->nMaxHeight      = sSize.nMaxHeight;
219 
220             if ((sr->nMaxWidth >= 0) && (sr->nMinWidth >= 0) && (sr->nMaxWidth < sr->nMinWidth))
221                 sr ->nMaxWidth      = sr->nMinWidth;
222             if ((sr->nMaxHeight >= 0) && (sr->nMinHeight >= 0) && (sr->nMaxHeight < sr->nMinHeight))
223                 sr ->nMaxHeight     = sr->nMinHeight;
224         }
225     } /* namespace tk */
226 } /* namespace lsp */
227