I can can get them same width using size_group, but it doesn't work for height.
I looked where it used and made simple patch to force both width and height to be same, it works for my games and other test cases, i believe.
Obviously it would be much better if there was official solution to this, even better if it will allow to specify separate size_group for width and height, allowing some useful layouts.
RenPy, 7.3.5.606
Original renpy/display/layout.rpy:
Code: Select all
class SizeGroup(renpy.object.Object):
def __init__(self):
super(SizeGroup, self).__init__()
self.members = [ ]
self._width = None
self.computing_width = False
def width(self, width, height, st, at):
if self._width is not None:
return self._width
if self.computing_width:
return 0
self.computing_width = True
maxwidth = 0
for i in self.members:
rend = renpy.display.render.render_for_size(i, width, height, st, at)
maxwidth = max(rend.width, maxwidth)
self._width = maxwidth
self.computing_width = False
return maxwidth
size_groups = dict()
class Window(Container):
"""
A window that has padding and margins, and can place a background
behind its child. `child` is the child added to this
displayable. All other properties are as for the :ref:`Window`
screen language statement.
"""
def __init__(self, child=None, style='window', **properties):
super(Window, self).__init__(style=style, **properties)
if child is not None:
self.add(child)
def visit(self):
rv = [ ]
self.style._visit_window(rv.append)
return rv + self.children
def get_child(self):
return self.style.child or self.child
def per_interact(self):
size_group = self.style.size_group
if size_group:
group = size_groups.get(size_group, None)
if group is None:
group = size_groups[size_group] = SizeGroup()
group.members.append(self)
def render(self, width, height, st, at):
# save some typing.
style = self.style
xminimum = scale(style.xminimum, width)
yminimum = scale(style.yminimum, height)
xmaximum = scale(style.xmaximum, width)
ymaximum = scale(style.ymaximum, height)
size_group = self.style.size_group
if size_group and size_group in size_groups:
xminimum = max(xminimum, size_groups[size_group].width(width, height, st, at))
Code: Select all
class SizeGroup(renpy.object.Object):
def __init__(self):
super(SizeGroup, self).__init__()
self.members = [ ]
self._width = None
self._height = None
self.computing_width = False
def width(self, width, height, st, at):
if self._width is not None:
return self._width
if self.computing_width:
return 0
self.computing_width = True
maxwidth = 0
maxheight = 0
for i in self.members:
rend = renpy.display.render.render_for_size(i, width, height, st, at)
maxwidth = max(rend.width, maxwidth)
maxheight = max(rend.height, maxheight)
self._width = maxwidth
self._height = maxheight
self.computing_width = False
return maxwidth
def height(self,width,height,st,at):
return 0 if self.computing_width else self._height
size_groups = dict()
class Window(Container):
"""
A window that has padding and margins, and can place a background
behind its child. `child` is the child added to this
displayable. All other properties are as for the :ref:`Window`
screen language statement.
"""
def __init__(self, child=None, style='window', **properties):
super(Window, self).__init__(style=style, **properties)
if child is not None:
self.add(child)
def visit(self):
rv = [ ]
self.style._visit_window(rv.append)
return rv + self.children
def get_child(self):
return self.style.child or self.child
def per_interact(self):
size_group = self.style.size_group
if size_group:
group = size_groups.get(size_group, None)
if group is None:
group = size_groups[size_group] = SizeGroup()
group.members.append(self)
def render(self, width, height, st, at):
# save some typing.
style = self.style
xminimum = scale(style.xminimum, width)
yminimum = scale(style.yminimum, height)
xmaximum = scale(style.xmaximum, width)
ymaximum = scale(style.ymaximum, height)
size_group = self.style.size_group
if size_group and size_group in size_groups:
xminimum = max(xminimum, size_groups[size_group].width(width, height, st, at))
yminimum = max(yminimum, size_groups[size_group].height(width, height, st, at))