Config

Configuration dataclasses and enums for the file browser.

Enums

Enumeration types for browser configuration options.


source

SelectionMode


def SelectionMode(
    args:VAR_POSITIONAL, kwds:VAR_KEYWORD
):

File selection modes.


source

FileColumn


def FileColumn(
    args:VAR_POSITIONAL, kwds:VAR_KEYWORD
):

Available columns for list view.

# Test enums
assert SelectionMode.SINGLE.value == "single"
assert FileColumn.NAME.value == "name"
print("Enum tests passed!")

ViewConfig

Configuration for how directory contents are displayed.


source

ViewConfig


def ViewConfig(
    columns:List=<factory>, default_sort:FileColumn=<FileColumn.NAME: 'name'>, sort_folders_first:bool=True,
    allow_sort_toggle:bool=True
)->None:

View display configuration.

# Test ViewConfig defaults
view_config = ViewConfig()
assert FileColumn.NAME in view_config.columns
assert view_config.sort_folders_first == True
assert view_config.allow_sort_toggle == True

# Test custom config
custom_view = ViewConfig(
    columns=[FileColumn.NAME, FileColumn.TYPE],
)
assert len(custom_view.columns) == 2

print("ViewConfig tests passed!")

FilterConfig

Configuration for filtering which files are displayed.


source

FilterConfig


def FilterConfig(
    allowed_extensions:Optional=None, show_directories:bool=True, show_hidden:bool=False,
    show_system_files:bool=False, custom_filter:Optional=None
)->None:

Filtering configuration.

# Test FilterConfig
filter_config = FilterConfig()

# Test default (no filter)
file1 = FileInfo(name="test.txt", path="/test.txt", is_directory=False, extension="txt")
assert filter_config.matches(file1) == True

# Test hidden file filtering
hidden_file = FileInfo(name=".hidden", path="/.hidden", is_directory=False)
assert filter_config.matches(hidden_file) == False  # Hidden files off by default

filter_with_hidden = FilterConfig(show_hidden=True)
assert filter_with_hidden.matches(hidden_file) == True

# Test extension filtering
ext_filter = FilterConfig(allowed_extensions=[".py", ".txt"])
py_file = FileInfo(name="script.py", path="/script.py", is_directory=False, extension="py")
js_file = FileInfo(name="script.js", path="/script.js", is_directory=False, extension="js")
folder = FileInfo(name="folder", path="/folder", is_directory=True)

assert ext_filter.matches(py_file) == True
assert ext_filter.matches(js_file) == False
assert ext_filter.matches(folder) == True  # Directories always pass extension filter

# Test directory filtering
no_dirs = FilterConfig(show_directories=False)
assert no_dirs.matches(folder) == False
assert no_dirs.matches(py_file) == True

# Test custom filter
def size_filter(f: FileInfo) -> bool:
    return f.size is None or f.size < 1000

custom_filter = FilterConfig(custom_filter=size_filter)
small_file = FileInfo(name="small.txt", path="/small.txt", is_directory=False, size=100)
large_file = FileInfo(name="large.txt", path="/large.txt", is_directory=False, size=10000)
assert custom_filter.matches(small_file) == True
assert custom_filter.matches(large_file) == False

print("FilterConfig tests passed!")
FilterConfig tests passed!

FileBrowserCallbacks

Optional callbacks for customizing browser behavior.


source

FileBrowserCallbacks


def FileBrowserCallbacks(
    on_navigate:Optional=None, on_select:Optional=None, on_selection_change:Optional=None, on_open:Optional=None,
    validate_selection:Optional=None, validate_navigation:Optional=None
)->None:

Event callbacks for customization.

# Test FileBrowserCallbacks
navigated_paths = []
selected_files = []

def track_navigate(path: str):
    navigated_paths.append(path)

def track_select(path: str):
    selected_files.append(path)

def validate_py_only(path: str) -> Tuple[bool, str]:
    if path.endswith('.py'):
        return (True, "")
    return (False, "Only .py files allowed")

callbacks = FileBrowserCallbacks(
    on_navigate=track_navigate,
    on_select=track_select,
    validate_selection=validate_py_only
)

# Test callbacks work
callbacks.on_navigate("/home/user")
callbacks.on_select("/home/user/file.txt")
assert navigated_paths == ["/home/user"]
assert selected_files == ["/home/user/file.txt"]

# Test validation
valid, msg = callbacks.validate_selection("/test.py")
assert valid == True
valid, msg = callbacks.validate_selection("/test.txt")
assert valid == False
assert "Only .py files" in msg

print("FileBrowserCallbacks tests passed!")
FileBrowserCallbacks tests passed!

FileBrowserConfig

Main configuration for the file browser component.


source

FileBrowserConfig


def FileBrowserConfig(
    provider:Optional=None, start_path:Optional=None, selection_mode:SelectionMode=<SelectionMode.SINGLE: 'single'>,
    selectable_types:Literal='files', max_selections:Optional=None, view:ViewConfig=<factory>,
    filter:FilterConfig=<factory>, show_path_bar:bool=True, show_path_input:bool=False, show_breadcrumbs:bool=True,
    bookmarks:Optional=None, show_bookmarks:bool=False, container_id:str='file-browser',
    content_id:str='file-browser-content', path_bar_id:str='file-browser-path',
    listing_id:str='file-browser-listing', vc_prefix:str=''
)->None:

Main configuration for file browser.

# Test FileBrowserConfig
config = FileBrowserConfig()

# Test defaults
assert config.selection_mode == SelectionMode.SINGLE
assert config.selectable_types == "files"
assert config.show_path_bar == True
assert config.container_id == "file-browser"
assert config.vc_prefix == ""
assert isinstance(config.view, ViewConfig)
assert isinstance(config.filter, FilterConfig)

# Test can_select
file = FileInfo(name="test.txt", path="/test.txt", is_directory=False)
folder = FileInfo(name="folder", path="/folder", is_directory=True)

# Default: files only
assert config.can_select(file) == True
assert config.can_select(folder) == False

# Directories only
dir_config = FileBrowserConfig(selectable_types="directories")
assert dir_config.can_select(file) == False
assert dir_config.can_select(folder) == True

# Both
both_config = FileBrowserConfig(selectable_types="both")
assert both_config.can_select(file) == True
assert both_config.can_select(folder) == True

# No selection
no_select = FileBrowserConfig(selection_mode=SelectionMode.NONE)
assert no_select.can_select(file) == False
assert no_select.can_select(folder) == False

# Test with custom IDs and vc_prefix
custom_config = FileBrowserConfig(
    container_id="my-browser",
    content_id="my-content",
    filter=FilterConfig(allowed_extensions=[".db"]),
    bookmarks=[("Home", "/home"), ("Downloads", "/downloads")],
    vc_prefix="fb",
)
assert custom_config.container_id == "my-browser"
assert custom_config.filter.allowed_extensions == [".db"]
assert len(custom_config.bookmarks) == 2
assert custom_config.vc_prefix == "fb"

print("FileBrowserConfig tests passed!")