// Load this file in the DisplayScript editor to view it. drawable split(a, b, dividerWidth) { state splitPercentage = 0.5 var splitWidth = @width var splitAmount = round(splitWidth * splitPercentage) if splitAmount > @width - dividerWidth { splitAmount = @width - dividerWidth } var bSize = measure(@width - splitAmount - dividerWidth, @height, b) splitAmount = @width - bSize.width - dividerWidth var needsAdditionalBMeasurement = false if splitAmount < 0 { splitAmount = 0 needsAdditionalBMeasurement = true } var aSize = measure(splitAmount, @height, a) if splitAmount != aSize.width { splitAmount = aSize.width needsAdditionalBMeasurement = true } if needsAdditionalBMeasurement { bSize = measure(@width - splitAmount - dividerWidth, @height, b) } measurement aSize.width + bSize.width + dividerWidth, max(aSize.height, bSize.height) draw at(0, 0, aSize.width, aSize.height, a) draw at(splitAmount + dividerWidth, 0, bSize.width, bSize.height, b) var divider = drawable { state selected = false if selected { draw fill(srgb(1, 0.8, 0)) } else { draw fill(gray(1 / dividerWidth)) } draw dragHandler(function (x, y) { selected <- true splitPercentage <- splitAmount / splitWidth }, function (dx, dy) { splitPercentage <- splitPercentage + dx / splitWidth }, function () { selected <- false }) } draw at(splitAmount, 0, dividerWidth, @height, divider) } function splitters(level) { if (level > 0) { return split(splitters(level - 1), splitters(level - 1), level * 2) } else { return fill(white) } } draw splitters(6)