Config

Configuration dataclasses and enums for the media gallery.

Enums

Enumeration types for gallery configuration options.


ViewMode


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

Display modes for media gallery.


SelectionMode


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

File selection modes.


CardSize


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

Card size presets for grid view.


ListColumn


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

Available columns for list view.

# Test enums
assert ViewMode.GRID.value == "grid"
assert ViewMode.LIST == "list"
assert SelectionMode.SINGLE.value == "single"
assert CardSize.MEDIUM.value == "medium"
assert ListColumn.NAME.value == "name"
print("Enum tests passed!")
Enum tests passed!

GridConfig

Configuration for the grid view layout.


GridConfig


def GridConfig(
    columns:int=4, card_size:CardSize=<CardSize.MEDIUM: 'medium'>, show_thumbnails:bool=True,
    show_file_size:bool=True, show_file_type:bool=True
)->None:

Grid view display configuration.

# Test GridConfig defaults
grid_config = GridConfig()
assert grid_config.columns == 4
assert grid_config.card_size == CardSize.MEDIUM
assert grid_config.show_thumbnails == True

# Test custom config
custom_grid = GridConfig(
    columns=6,
    card_size=CardSize.SMALL,
    show_thumbnails=False
)
assert custom_grid.columns == 6
assert custom_grid.card_size == CardSize.SMALL
assert custom_grid.show_thumbnails == False

print("GridConfig tests passed!")
GridConfig tests passed!

ListConfig

Configuration for the list view layout.


ListConfig


def ListConfig(
    columns:List=<factory>, show_icons:bool=True, striped:bool=False, compact:bool=False
)->None:

List view display configuration.

# Test ListConfig defaults
list_config = ListConfig()
assert ListColumn.NAME in list_config.columns
assert ListColumn.SIZE in list_config.columns
assert list_config.show_icons == True
assert list_config.striped == False

# Test custom config
custom_list = ListConfig(
    columns=[ListColumn.NAME, ListColumn.TYPE],
    striped=True,
    compact=True
)
assert len(custom_list.columns) == 2
assert custom_list.striped == True
assert custom_list.compact == True

print("ListConfig tests passed!")
ListConfig tests passed!

FilterConfig

Configuration for filtering displayed media files.


FilterConfig


def FilterConfig(
    enabled_types:List=<factory>, allow_type_filter:bool=True, show_hidden:bool=False, custom_filter:Optional=None
)->None:

Filter configuration for media gallery.

# Test FilterConfig
filter_config = FilterConfig()

# Test default (media types enabled)
audio_file = FileInfo(
    name="song.mp3", path="/song.mp3", is_directory=False,
    file_type=FileType.AUDIO
)
assert filter_config.matches(audio_file) == True

# Test hidden file filtering
hidden_file = FileInfo(
    name=".hidden.mp3", path="/.hidden.mp3", is_directory=False,
    file_type=FileType.AUDIO
)
assert filter_config.matches(hidden_file) == False

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

# Test type filtering
code_file = FileInfo(
    name="script.py", path="/script.py", is_directory=False,
    file_type=FileType.CODE
)
assert filter_config.matches(code_file) == False  # CODE not in default enabled

# Test enabled types
audio_only_filter = FilterConfig(enabled_types=[FileType.AUDIO])
video_file = FileInfo(
    name="video.mp4", path="/video.mp4", is_directory=False,
    file_type=FileType.VIDEO
)
assert audio_only_filter.matches(audio_file) == True
assert audio_only_filter.matches(video_file) == False

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

custom_filter = FilterConfig(custom_filter=size_filter)
small_file = FileInfo(
    name="small.mp3", path="/small.mp3", is_directory=False,
    file_type=FileType.AUDIO, size=500
)
large_file = FileInfo(
    name="large.mp3", path="/large.mp3", is_directory=False,
    file_type=FileType.AUDIO, size=10000000
)
assert custom_filter.matches(small_file) == True
assert custom_filter.matches(large_file) == False

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

PaginationConfig

Configuration for pagination controls.


PaginationConfig


def PaginationConfig(
    items_per_page:int=24, show_pagination:bool=True, show_page_size_selector:bool=False,
    page_size_options:List=<factory>
)->None:

Pagination configuration.

# Test PaginationConfig
pagination = PaginationConfig()
assert pagination.items_per_page == 24
assert pagination.show_pagination == True
assert 24 in pagination.page_size_options

custom_pagination = PaginationConfig(
    items_per_page=48,
    show_page_size_selector=True
)
assert custom_pagination.items_per_page == 48
assert custom_pagination.show_page_size_selector == True

print("PaginationConfig tests passed!")
PaginationConfig tests passed!

PreviewConfig

Configuration for the preview modal.


PreviewConfig


def PreviewConfig(
    enable_preview:bool=True, show_download_button:bool=True, show_info_panel:bool=True, show_navigation:bool=True,
    autoplay_video:bool=False, autoplay_audio:bool=False
)->None:

Preview modal configuration.

# Test PreviewConfig
preview = PreviewConfig()
assert preview.enable_preview == True
assert preview.show_download_button == True
assert preview.autoplay_video == False

custom_preview = PreviewConfig(
    show_navigation=False,
    autoplay_video=True
)
assert custom_preview.show_navigation == False
assert custom_preview.autoplay_video == True

print("PreviewConfig tests passed!")
PreviewConfig tests passed!

GalleryCallbacks

Optional callbacks for customizing gallery behavior.


GalleryCallbacks


def GalleryCallbacks(
    on_select:Optional=None, on_selection_change:Optional=None, on_preview:Optional=None, on_download:Optional=None,
    validate_selection:Optional=None
)->None:

Event callbacks for gallery customization.

# Test GalleryCallbacks
selected_files = []

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

def validate_audio_only(path: str) -> Tuple[bool, str]:
    if path.endswith('.mp3') or path.endswith('.wav'):
        return (True, "")
    return (False, "Only audio files allowed")

callbacks = GalleryCallbacks(
    on_select=track_select,
    validate_selection=validate_audio_only
)

# Test callback works
callbacks.on_select("/test/song.mp3")
assert selected_files == ["/test/song.mp3"]

# Test validation
valid, msg = callbacks.validate_selection("/test.mp3")
assert valid == True
valid, msg = callbacks.validate_selection("/test.mp4")
assert valid == False
assert "Only audio" in msg

print("GalleryCallbacks tests passed!")
GalleryCallbacks tests passed!

GalleryConfig

Main configuration for the media gallery component.


GalleryConfig


def GalleryConfig(
    default_view:ViewMode=<ViewMode.GRID: 'grid'>, allow_view_toggle:bool=True, grid:GridConfig=<factory>,
    list:ListConfig=<factory>, filter:FilterConfig=<factory>, pagination:PaginationConfig=<factory>,
    preview:PreviewConfig=<factory>, selection_mode:SelectionMode=<SelectionMode.NONE: 'none'>,
    max_selections:Optional=None, gallery_id:str='media-gallery', content_id:str='media-gallery-content',
    controls_id:str='media-gallery-controls', preview_modal_id:str='media-preview-modal',
    keyboard_config:Optional=None
)->None:

Main configuration for media gallery.

# Test GalleryConfig
config = GalleryConfig()

# Test defaults
assert config.default_view == ViewMode.GRID
assert config.allow_view_toggle == True
assert config.selection_mode == SelectionMode.NONE
assert config.gallery_id == "media-gallery"
assert isinstance(config.grid, GridConfig)
assert isinstance(config.list, ListConfig)
assert isinstance(config.filter, FilterConfig)
assert isinstance(config.pagination, PaginationConfig)
assert isinstance(config.preview, PreviewConfig)

# Test can_select
file = FileInfo(name="test.mp3", path="/test.mp3", is_directory=False, file_type=FileType.AUDIO)
folder = FileInfo(name="folder", path="/folder", is_directory=True)

# Default: no selection
assert config.can_select(file) == False
assert config.can_select(folder) == False

# With selection enabled
select_config = GalleryConfig(selection_mode=SelectionMode.SINGLE)
assert select_config.can_select(file) == True
assert select_config.can_select(folder) == False  # Folders never selectable

# Test with custom IDs
custom_config = GalleryConfig(
    gallery_id="my-gallery",
    content_id="my-content",
    grid=GridConfig(columns=6),
    pagination=PaginationConfig(items_per_page=48)
)
assert custom_config.gallery_id == "my-gallery"
assert custom_config.grid.columns == 6
assert custom_config.pagination.items_per_page == 48

print("GalleryConfig tests passed!")
GalleryConfig tests passed!