aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/util
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/ui/util')
-rw-r--r--main/src/ui/util/size_request_box.vala11
-rw-r--r--main/src/ui/util/sizing_bin.vala63
2 files changed, 64 insertions, 10 deletions
diff --git a/main/src/ui/util/size_request_box.vala b/main/src/ui/util/size_request_box.vala
index 7d7b6185..98f1a20a 100644
--- a/main/src/ui/util/size_request_box.vala
+++ b/main/src/ui/util/size_request_box.vala
@@ -16,6 +16,17 @@ public class SizeRequestBin : Widget {
this.layout_manager = new BinLayout();
}
+ public override void compute_expand_internal(out bool hexpand, out bool vexpand) {
+ hexpand = false;
+ vexpand = false;
+ Widget child = get_first_child();
+ while (child != null) {
+ hexpand = hexpand || child.compute_expand(Orientation.HORIZONTAL);
+ vexpand = vexpand || child.compute_expand(Orientation.VERTICAL);
+ child = child.get_next_sibling();
+ }
+ }
+
public override Gtk.SizeRequestMode get_request_mode() {
return size_request_mode;
}
diff --git a/main/src/ui/util/sizing_bin.vala b/main/src/ui/util/sizing_bin.vala
index c17cb3cc..7401ddbf 100644
--- a/main/src/ui/util/sizing_bin.vala
+++ b/main/src/ui/util/sizing_bin.vala
@@ -9,29 +9,72 @@ public class SizingBin : Widget {
public int target_height { get; set; default = -1; }
public int max_height { get; set; default = -1; }
- construct {
- layout_manager = new BinLayout();
+ public override void compute_expand_internal(out bool hexpand, out bool vexpand) {
+ hexpand = false;
+ vexpand = false;
+ Widget child = get_first_child();
+ while (child != null) {
+ hexpand = hexpand || child.compute_expand(Orientation.HORIZONTAL);
+ vexpand = vexpand || child.compute_expand(Orientation.VERTICAL);
+ child = child.get_next_sibling();
+ }
}
public override void size_allocate(int width, int height, int baseline) {
if (max_height != -1) height = int.min(height, max_height);
if (max_width != -1) width = int.min(width, max_width);
- base.size_allocate(width, height, baseline);
+ Widget child = get_first_child();
+ while (child != null) {
+ if (child.should_layout()) {
+ child.allocate(width, height, baseline, null);
+ }
+ child = child.get_next_sibling();
+ }
}
public override void measure(Orientation orientation, int for_size, out int minimum, out int natural, out int minimum_baseline, out int natural_baseline) {
- base.measure(orientation, for_size, out minimum, out natural, out minimum_baseline, out natural_baseline);
if (orientation == Orientation.HORIZONTAL) {
- if (min_width != -1) minimum = int.max(minimum, min_width);
+ minimum = min_width;
+ natural = target_width;
+ } else {
+ minimum = min_height;
+ natural = target_height;
+ }
+ minimum_baseline = -1;
+ natural_baseline = -1;
+ Widget child = get_first_child();
+ while (child != null) {
+ if (child.should_layout()) {
+ int child_min = 0;
+ int child_nat = 0;
+ int child_min_baseline = -1;
+ int child_nat_baseline = -1;
+ child.measure(orientation, for_size, out child_min, out child_nat, out child_min_baseline, out child_nat_baseline);
+ minimum = int.max(minimum, child_min);
+ natural = int.max(natural, child_nat);
+ if (child_min_baseline > 0) {
+ minimum_baseline = int.max(minimum_baseline, child_min_baseline);
+ }
+ if (child_nat_baseline > 0) {
+ natural_baseline = int.max(natural_baseline, child_nat_baseline);
+ }
+ }
+ child = child.get_next_sibling();
+ }
+ if (orientation == Orientation.HORIZONTAL) {
if (max_width != -1) natural = int.min(natural, max_width);
- if (target_width != -1) natural = int.max(natural, target_width);
- natural = int.max(natural, minimum);
} else {
- if (min_height != -1) minimum = int.max(minimum, min_height);
if (max_height != -1) natural = int.min(natural, max_height);
- if (target_height != -1) natural = int.max(natural, target_height);
- natural = int.max(natural, minimum);
}
+ natural = int.max(natural, minimum);
+ }
+
+ public override SizeRequestMode get_request_mode() {
+ Widget child = get_first_child();
+ if (child != null) {
+ return child.get_request_mode();
+ }
+ return SizeRequestMode.CONSTANT_SIZE;
}
public override void dispose() {