Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature Request: BoxLayout #74

Open
ElliotGarbus opened this issue Sep 7, 2022 · 0 comments
Open

Feature Request: BoxLayout #74

ElliotGarbus opened this issue Sep 7, 2022 · 0 comments
Labels
enhancement New feature or request

Comments

@ElliotGarbus
Copy link

I would like to request an additional Layout: BoxLayout.
Here is a use case from a project I am working on: I am using a GridLayout to simplify laying out the information on the screen. I have defined 4 rows and 1 column in the grid. I want each row to contain multiple Labels and a TileGrid bitmap. The allows me to position these objects without having to manually calculate all of the horizontal positions.

I created a primitive horizontal boxlayout that works with Label and TileGrid to create a Group that can be placed in the GridLayout.

Here is the code I used this works for my limited use case:

class HBoxLayout(Group):
    @property
    def width(self):
        _width = 0
        for w in self:
            if isinstance(w, TileGrid):
                _width += w.width * w.tile_width
            else:
                _width += w.width * w.scale            
        #_width = sum([w.width * w.scale for w in self]) #TileGrid does not have a scale attribute
        return _width
        
    @property
    def height(self):
        return max([w.height for w in self])  # also needs scale - but not needed for my use case.
       
    def append(self, layer):
        if not len(self):
            layer.x = 0 # the first widget starts at zero
        else:
            layer.x = self.width 
        super().append(layer)

As you can see in the code above, the HBoxLayout adds height and width properties to Group, and overrides the append method to automatically position "widgets".

Here is a simple example of the class in use:

layout = GridLayout(
    x=128,
    y=0,
    width=168,
    height=128,
    grid_size=(1, 4),
    cell_padding=0,
    divider_lines=False,
    divider_line_color=0x000000,
    cell_anchor_point=(0, 1))

for row in range(4):
    group = HBoxLayout()
    weather_icon = TileGrid(
        icons_small_bmp,
        pixel_shader=icons_small_pal,
        x=0,
        y=-8,
        width=1,
        height=1,
        tile_width=20,
        tile_height=20,
    )
    weather_icon[0] = row
    group.append(label.Label(terminalio.FONT, text=f'{DAYS[row]} ', color=0x000000, scale=2))
    group.append(weather_icon)
    group.append(label.Label(terminalio.FONT, text=' 88/106', color=0x000000, scale=2))
    group.append(label.Label(terminalio.FONT, text='o', y=-6, color=0x000000, scale=1))
    layout.add_content(cell_content=group, grid_position=(0, row), cell_size=(1,1))

magtag.splash.append(layout)
magtag.refresh()
magtag.exit_and_deep_sleep(15)

A more robust solution would include a more general BoxLayout that supports vertical and horizontal orientations.

@tekktrik tekktrik added the enhancement New feature or request label Sep 16, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants