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