prompt-toolkit / prompt-toolkit/python-prompt-toolkit

ConditionalContainer set a space on top

Open
#1,138 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
10.6k
Forks
815
PR merge metrics
No merged PRs in 30d

Description

Hi,

I'm using conditional containers to select which container is shown based on a state variable. Each hidden container is adding a space on top.

conditional_container

#!/usr/bin/env python
"""
A simple example of a few buttons and click handlers.
"""
from prompt_toolkit.application import Application
from prompt_toolkit.application.current import get_app
from prompt_toolkit.key_binding import KeyBindings
from prompt_toolkit.key_binding.bindings.focus import focus_next, focus_previous
from prompt_toolkit.layout import HSplit, Layout, VSplit, HorizontalAlign, VerticalAlign
from prompt_toolkit.styles import Style
from prompt_toolkit.filters import Condition
from prompt_toolkit.completion import WordCompleter
from prompt_toolkit.widgets import Box, Button, Frame, Label, TextArea, Dialog
from prompt_toolkit.layout.containers import (
    AnyContainer,
    ConditionalContainer,
    Container,
    DynamicContainer,
    Float,
    FloatContainer,
    HSplit,
    VSplit,
    Window,
    WindowAlign,
)
from asyncio import Future, ensure_future
from prompt_toolkit.layout.menus import CompletionsMenu
from prompt_toolkit.layout.dimension import D

state = "main"

def clicked_main():
    global state
    state = "main"
    layout.focus((main_menu_container.get_children()[0]))

def clicked_item1():
    global state
    state = "item1"
    layout.focus((item1_menu_container.get_children()[0]))

def clicked_item2():
    global state
    state = "item2"
    layout.focus((item2_menu_container.get_children()[0]))

def clicked_item2_item21():
    global state
    state = "item21"
    layout.focus((item21_menu_container.get_children()[0]))

def clicked_exit():
    get_app().exit()

# All the widgets for the UI.
btn_item1 = Button("Item 1", handler=clicked_item1)
btn_item2 = Button("Item 2", handler=clicked_item2)
btn_item3 = Button("Item 3", handler=clicked_main)

btn_exit = Button("Exit", handler=clicked_exit)

btn_item1_item11 = Button("Item 1.1", handler=clicked_main)
btn_item1_item12 = Button("Item 1.2", handler=clicked_main)
btn_item1_item13 = Button("Item 1.3", handler=clicked_main)

btn_item2_item21 = Button("Item 2.1", handler=clicked_item2_item21)
btn_item2_item22 = Button("Item 2.2", handler=clicked_main)
btn_item2_item23 = Button("Item 2.3", handler=clicked_main)

btn_item2_item21_item211 = Button("Item 2.1.1", handler=clicked_main)
btn_item2_item21_item212 = Button("Item 2.1.2", handler=clicked_main)
btn_item2_item21_item213 = Button("Item 2.1.3", handler=clicked_main)

#MENU

main_menu_container = ConditionalContainer(
                        content=HSplit(
                            [
                                btn_item1, btn_item2, btn_item3
                            ], 
                            padding=1,
                        ),
                        filter=Condition(lambda: True if (state == "main") else False),
                    )

item1_menu_container = ConditionalContainer(
                        content=HSplit(
                            [
                                btn_item1_item11, btn_item1_item12, btn_item1_item13
                            ], 
                            padding=1,
                        ),
                        filter=Condition(lambda: True if (state == "item1") else False),
                    )

item2_menu_container = ConditionalContainer(
                        content=HSplit(
                            [
                                btn_item2_item21, btn_item2_item22, btn_item2_item23
                            ], 
                            padding=1,
                        ),
                        filter=Condition(lambda: True if (state == "item2") else False),
                    )

item21_menu_container = ConditionalContainer(
                        content=HSplit(
                            [
                                btn_item2_item21_item211, btn_item2_item21_item212, btn_item2_item21_item213
                            ], 
                            padding=1,
                        ),
                        filter=Condition(lambda: True if (state == "item21") else False),
                    )



quit_menu_container = VSplit(
                            [
                               btn_exit
                            ], 
                        )

root_container = FloatContainer(
    content=VSplit(
        [
            HSplit(
                [
                    main_menu_container,
                    item1_menu_container,
                    item2_menu_container,
                    item21_menu_container,
                    quit_menu_container,
                ],
                padding=1,
                align=HorizontalAlign.LEFT,
            ),
        ],
    ),
    floats=[
        Float(
            xcursor=True,
            ycursor=True,
            content=CompletionsMenu(max_height=16, scroll_offset=1),
        ),
    ],
)

layout = Layout(container=root_container)

# Key bindings.
kb = KeyBindings()
kb.add("down")(focus_next)
kb.add("up")(focus_previous)


# Styling.
style = Style(
    [
        ("button", "#00ff00"),
        ("button-arrow", "bg:#00ff00"),
        ("button focused", "bg:#00ff00"),
        ("text-area focused", "bg:#ff0000"),
        ("text-area", "bg:#ff0000"),
    ]
)


# Build a main application object.
application = Application(layout=layout, key_bindings=kb, style=None, full_screen=True)


def main():
    application.run()


if __name__ == "__main__":
    main()

How can I remove this space?

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Run the provided reproduction through its main() entry point and inspect how ConditionalContainer instances are arranged inside HSplit with padding=1. Trace the layout behavior when the state changes, then verify that hidden containers no longer add vertical space while the visible menu and quit button retain their intended spacing.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
cli
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.