diff options
| author | Matthias Melcher <github@matthiasm.com> | 2024-01-04 01:26:32 +0100 |
|---|---|---|
| committer | Matthias Melcher <github@matthiasm.com> | 2024-01-04 01:26:40 +0100 |
| commit | 46c9cf2f1033b847896e43d5dad6359f6b01decf (patch) | |
| tree | 8858e64f4dd2adc7aecee1d59ed65a3d397e0633 | |
| parent | d237d186ae1db050ce07a6e39cc2fb4d455f150a (diff) | |
#797: Improves Fl_Tile resize behaviour
- if a tile with a size range is resize smaller than the
minimum size of all children, the children will now no
longer shrink, and expanding will make them work
again as expected.
| -rw-r--r-- | src/Fl_Tile.cxx | 58 |
1 files changed, 49 insertions, 9 deletions
diff --git a/src/Fl_Tile.cxx b/src/Fl_Tile.cxx index 5fc015e62..a8f24e67e 100644 --- a/src/Fl_Tile.cxx +++ b/src/Fl_Tile.cxx @@ -565,19 +565,59 @@ void Fl_Tile::drag_intersection(int oldx, int oldy, int newx, int newy) { void Fl_Tile::resize(int X,int Y,int W,int H) { if (size_range_) { - int dw = w() - W, dh = h() - H; - Fl_Widget *r = resizable(); - if (r) { - int rr = r->x() + r->w(), rb = r->y() + r->h(); - move_intersection(rr, rb, rr-dw, rb-dh); + // -- handle size_range style resizing + int dx = X - x(); + int dy = Y - y(); + int dw = w() - W; + int dh = h() - H; + // -- if the size does not change, Group resize will suffice + if ((dw==0) && (dh==0)) { + Fl_Group::resize(X, Y, W, H); + init_sizes(); + redraw(); + return; } - int tr = x() + w(), tb = y() + h(); - move_intersection(tr, tb, tr-dw, tb-dh); + // -- if the position changes, move all widgets first + if ((dx!=0) || (dy!=0)) { + for (int i = 0; i < children(); i++) { + Fl_Widget *c = child(i); + c->position(c->x()+dx, c->y()+dy); + } + } + // check the bounding box of all children at minimum size init_sizes(); + Fl_Rect *p = bounds(); + int bbr = X, bbb = Y; + for (int i = 0; i < children(); i++) { + // find the current bounding box + bbr = fl_max(bbr, p[i+2].r()); + bbb = fl_max(bbb, p[i+2].b()); + } + // fix the dw to the maximum difference possible + int r2 = X+W; + request_shrink_r(bbr, r2, NULL); + dw = bbr - r2; + // fix the dh to the maximum difference possible + int b2 = Y+H; + request_shrink_b(bbb, b2, NULL); + dh = bbb - b2; + printf("%d %d %d %d %d %d\n", X, Y, W, H, dw, dh); + // perform the actual resize within a safe range + if ((dw!=0) || (dh!=0)) { + Fl_Widget *r = resizable(); + if (r) { + int rr = r->x() + r->w(), rb = r->y() + r->h(); + move_intersection(rr, rb, rr-dw, rb-dh); + } + int tr = x() + w(), tb = y() + h(); + move_intersection(bbr, bbb, bbr-dw, bbb-dh); + init_sizes(); + } + // resize the tile itself if (Fl_Window::is_a_rescale()) - Fl_Group::resize(X,Y,W,H); + Fl_Group::resize(X, Y, W, H); else - Fl_Widget::resize(X,Y,W,H); + Fl_Widget::resize(X, Y, W, H); return; } |
