Though I'm not an expert, I tried for fun a (very) simple driver setup that you could try to adapt-
I created two shapes roughly resembling yours above, here shown with two different materials to help visualization.
(Note that I locked all "manual" rotation and location transform for those shapes, because I wished to hide the transform tools when they were selected!)
the top brown cylindrical has an array that allows for X replication (fixed count), and has a driver using the X location of a "controlling" mesh (a blue cube, named cube.001, here hidden in another layer)
the side yellow square shape had two array modifiers, allowing replication (fixed count) on its X and Y local axis, with a driver for each (always to the blue controlling cube, on its X and Z), and also a driver that allows for the rotation on its X, based on the X rotation (limited by constraints) of the blue cube.
You can add those drivers right clicking on the "count" property, and choosing this menu voice:
You'll find (for a selected object) this new driver settings in the "graph" editor, selecting "drivers" mode, instead of the default "f-curve"
Here is the overall setup:
Now, revealing the blue cube (separate layer) allows for "roof tiles" editing: the cube is in its initial position
grabbing it along its X, allows for the roof X "expansion"
then, grabbing the blue cube down on its Z, expands the roof tiles on their Y direction:
and finally, rotating the blue cube on its X axis allows the roof tile to rotate in the same way, as needed:
here is an animation showing how it works, and how you can reset it using clear location (altG) and clear rotation (altG)
and here is the file I used (just a simple example)
Note: drivers need to automatically run python scripts, so you need to load the file using the "trusted source"