gptsite / gradio /layouts.py
sunxianfeng's picture
Duplicate from jumei/gptsite
11b6e82
from __future__ import annotations
import warnings
from typing import Type
from gradio.blocks import BlockContext
from gradio.documentation import document, set_documentation_group
from gradio.events import Changeable, Selectable
set_documentation_group("layout")
@document()
class Row(BlockContext):
"""
Row is a layout element within Blocks that renders all children horizontally.
Example:
with gradio.Blocks() as demo:
with gradio.Row():
gr.Image("lion.jpg")
gr.Image("tiger.jpg")
demo.launch()
Guides: controlling_layout
"""
def __init__(
self,
*,
variant: str = "default",
visible: bool = True,
elem_id: str | None = None,
**kwargs,
):
"""
Parameters:
variant: row type, 'default' (no background), 'panel' (gray background color and rounded corners), or 'compact' (rounded corners and no internal gap).
visible: If False, row will be hidden.
elem_id: An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.
"""
self.variant = variant
if variant == "compact":
self.allow_expected_parents = False
super().__init__(visible=visible, elem_id=elem_id, **kwargs)
def get_config(self):
return {"type": "row", "variant": self.variant, **super().get_config()}
@staticmethod
def update(
visible: bool | None = None,
):
return {
"visible": visible,
"__type__": "update",
}
def style(
self,
*,
equal_height: bool | None = None,
mobile_collapse: bool | None = None,
**kwargs,
):
"""
Styles the Row.
Parameters:
equal_height: If True, makes every child element have equal height
mobile_collapse: DEPRECATED.
"""
if equal_height is not None:
self._style["equal_height"] = equal_height
if mobile_collapse is not None:
warnings.warn("mobile_collapse is no longer supported.")
return self
@document()
class Column(BlockContext):
"""
Column is a layout element within Blocks that renders all children vertically. The widths of columns can be set through the `scale` and `min_width` parameters.
If a certain scale results in a column narrower than min_width, the min_width parameter will win.
Example:
with gradio.Blocks() as demo:
with gradio.Row():
with gradio.Column(scale=1):
text1 = gr.Textbox()
text2 = gr.Textbox()
with gradio.Column(scale=4):
btn1 = gr.Button("Button 1")
btn2 = gr.Button("Button 2")
Guides: controlling_layout
"""
def __init__(
self,
*,
scale: int = 1,
min_width: int = 320,
variant: str = "default",
visible: bool = True,
elem_id: str | None = None,
**kwargs,
):
"""
Parameters:
scale: relative width compared to adjacent Columns. For example, if Column A has scale=2, and Column B has scale=1, A will be twice as wide as B.
min_width: minimum pixel width of Column, will wrap if not sufficient screen space to satisfy this value. If a certain scale value results in a column narrower than min_width, the min_width parameter will be respected first.
variant: column type, 'default' (no background), 'panel' (gray background color and rounded corners), or 'compact' (rounded corners and no internal gap).
visible: If False, column will be hidden.
elem_id: An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.
"""
self.scale = scale
self.min_width = min_width
self.variant = variant
if variant == "compact":
self.allow_expected_parents = False
super().__init__(visible=visible, elem_id=elem_id, **kwargs)
def get_config(self):
return {
"type": "column",
"variant": self.variant,
"scale": self.scale,
"min_width": self.min_width,
**super().get_config(),
}
@staticmethod
def update(
variant: str | None = None,
visible: bool | None = None,
):
return {
"variant": variant,
"visible": visible,
"__type__": "update",
}
class Tabs(BlockContext, Changeable, Selectable):
"""
Tabs is a layout element within Blocks that can contain multiple "Tab" Components.
"""
def __init__(
self,
*,
selected: int | str | None = None,
visible: bool = True,
elem_id: str | None = None,
**kwargs,
):
"""
Parameters:
selected: The currently selected tab. Must correspond to an id passed to the one of the child TabItems. Defaults to the first TabItem.
visible: If False, Tabs will be hidden.
elem_id: An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.
"""
BlockContext.__init__(self, visible=visible, elem_id=elem_id, **kwargs)
Changeable.__init__(self)
Selectable.__init__(self)
self.selected = selected
def get_config(self):
return {"selected": self.selected, **super(BlockContext, self).get_config()}
@staticmethod
def update(
selected: int | str | None = None,
):
return {
"selected": selected,
"__type__": "update",
}
@document()
class Tab(BlockContext, Selectable):
"""
Tab (or its alias TabItem) is a layout element. Components defined within the Tab will be visible when this tab is selected tab.
Example:
with gradio.Blocks() as demo:
with gradio.Tab("Lion"):
gr.Image("lion.jpg")
gr.Button("New Lion")
with gradio.Tab("Tiger"):
gr.Image("tiger.jpg")
gr.Button("New Tiger")
Guides: controlling_layout
"""
def __init__(
self,
label: str,
*,
id: int | str | None = None,
elem_id: str | None = None,
**kwargs,
):
"""
Parameters:
label: The visual label for the tab
id: An optional identifier for the tab, required if you wish to control the selected tab from a predict function.
elem_id: An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.
"""
BlockContext.__init__(self, elem_id=elem_id, **kwargs)
Selectable.__init__(self)
self.label = label
self.id = id
def get_config(self):
return {
"label": self.label,
"id": self.id,
**super(BlockContext, self).get_config(),
}
def get_expected_parent(self) -> Type[Tabs]:
return Tabs
def get_block_name(self):
return "tabitem"
TabItem = Tab
class Group(BlockContext):
"""
Group is a layout element within Blocks which groups together children so that
they do not have any padding or margin between them.
Example:
with gradio.Group():
gr.Textbox(label="First")
gr.Textbox(label="Last")
"""
def __init__(
self,
*,
visible: bool = True,
elem_id: str | None = None,
**kwargs,
):
"""
Parameters:
visible: If False, group will be hidden.
elem_id: An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.
"""
super().__init__(visible=visible, elem_id=elem_id, **kwargs)
def get_config(self):
return {"type": "group", **super().get_config()}
@staticmethod
def update(
visible: bool | None = None,
):
return {
"visible": visible,
"__type__": "update",
}
@document()
class Box(BlockContext):
"""
Box is a a layout element which places children in a box with rounded corners and
some padding around them.
Example:
with gradio.Box():
gr.Textbox(label="First")
gr.Textbox(label="Last")
"""
def __init__(
self,
*,
visible: bool = True,
elem_id: str | None = None,
**kwargs,
):
"""
Parameters:
visible: If False, box will be hidden.
elem_id: An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.
"""
super().__init__(visible=visible, elem_id=elem_id, **kwargs)
def get_config(self):
return {"type": "box", **super().get_config()}
@staticmethod
def update(
visible: bool | None = None,
):
return {
"visible": visible,
"__type__": "update",
}
def style(self, **kwargs):
return self
class Form(BlockContext):
def get_config(self):
return {"type": "form", **super().get_config()}
@document()
class Accordion(BlockContext):
"""
Accordion is a layout element which can be toggled to show/hide the contained content.
Example:
with gradio.Accordion("See Details"):
gr.Markdown("lorem ipsum")
"""
def __init__(
self,
label,
*,
open: bool = True,
visible: bool = True,
elem_id: str | None = None,
**kwargs,
):
"""
Parameters:
label: name of accordion section.
open: if True, accordion is open by default.
elem_id: An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.
"""
self.label = label
self.open = open
super().__init__(visible=visible, elem_id=elem_id, **kwargs)
def get_config(self):
return {
"type": "accordion",
"open": self.open,
"label": self.label,
**super().get_config(),
}
@staticmethod
def update(
open: bool | None = None,
label: str | None = None,
visible: bool | None = None,
):
return {
"visible": visible,
"label": label,
"open": open,
"__type__": "update",
}