#-----------------------------------------------------------------------------
# Copyright (c) Anaconda, Inc., and Bokeh Contributors.
# All rights reserved.
#
# The full license is in the file LICENSE.txt, distributed with this software.
#-----------------------------------------------------------------------------
""" Various kinds of dialogs. """
#-----------------------------------------------------------------------------
# Boilerplate
#-----------------------------------------------------------------------------
from __future__ import annotations
import logging # isort:skip
log = logging.getLogger(__name__)
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
# Bokeh imports
from ...core.enums import Movable, Resizable
from ...core.properties import (
Bool,
Either,
Enum,
Instance,
Nullable,
Required,
String,
)
from ..dom import DOMNode
from ..nodes import Node
from .ui_element import UIElement
#-----------------------------------------------------------------------------
# Globals and constants
#-----------------------------------------------------------------------------
__all__ = (
"Dialog",
)
#-----------------------------------------------------------------------------
# General API
#-----------------------------------------------------------------------------
[docs]
class Dialog(UIElement):
""" A floating, movable and resizable container for UI elements.
.. note::
This model and all its properties is experimental and may change at any point.
"""
# explicit __init__ to support Init signatures
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
title = Nullable(Either(String, Instance(DOMNode), Instance(UIElement)), help="""
The title of the dialog.
This can be either a plain text string, a DOM node, a UI element or a layout.
""")
content = Required(Either(String, Instance(DOMNode), Instance(UIElement)), help="""
The contents of this dialog.
This can be either a plain text string, a DOM node, a UI element or a layout.
""")
pinnable = Bool(default=True, help="""
Determines whether to allow to pin the dialog.
A pinned dialog always stays on top of other dialogs. Pinning one dialog
unpins any other dialogs.
""")
collapsible = Bool(default=True, help="""
Determines whether to allow to collapse the dialog.
A collapsed dialog only shows its title, while its content is hidden from
the view. This allows keep a dialog open while having a better accesses
to UIs below it.
.. note::
A dialog can be collapsed by scrolling on its title.
""")
minimizable = Bool(default=True, help="""
Determines whether to allow to minimize the dialog.
Minimizing a dialog means collapsing it and moving it to a designated
"minimization" area in the bottom left corner of the viewport.
""")
maximizable = Bool(default=True, help="""
Determines whether to allow to maximize the dialog.
A maximized dialog covers the entire viewport area. Multiple dialogs
can be maximized at the same time, but only one will be at the top
of the viewport.
""")
closable = Bool(default=True, help="""
Determines whether to allow to close the dialog.
Property ``close_action`` determines what happens when a dialog is
closed. Note that even if dialog can't be closed through the UI,
it can be closed programmatically.
""")
close_action = Enum("hide", "destroy", default="destroy", help="""
Determines the action when closing a dialog.
Options are:
* ``"hide"`` - Removes the dialog from the DOM, but keeps its
view "alive", so that it can be opened another time.
* ``"destroy"`` - Destroys the associated view and the state
it stores. A dialog needs to be rebuilt with a fresh state
before it can be opened again.
""")
resizable = Enum(Resizable, default="all", help="""
Determines whether or in which directions a dialog can be resized.
""")
movable = Enum(Movable, default="both", help="""
Determines whether or in which directions a dialog can be moved.
""")
symmetric = Bool(default=False, help="""
Determines if resizing one edge or corner affects the opposite one.
""")
top_limit = Nullable(Instance(Node), default=None, help="""
Optional top movement or resize limit.
Together with ``bottom_limit``, ``left_limit`` and ``right_limit`` it
forms a bounding box for movement and resizing of this dialog.
""")
bottom_limit = Nullable(Instance(Node), default=None, help="""
Optional bottom movement or resize limit.
Together with ``top_limit``, ``left_limit`` and ``right_limit`` it
forms a bounding box for movement and resizing of this dialog.
""")
left_limit = Nullable(Instance(Node), default=None, help="""
Optional left movement or resize limit.
Together with ``top_limit``, ``bottom_limit`` and ``right_limit`` it
forms a bounding box for movement and resizing of this dialog.
""")
right_limit = Nullable(Instance(Node), default=None, help="""
Optional right movement or resize limit.
Together with ``top_limit``, ``bottom_limit`` and ``left_limit`` it
forms a bounding box for movement and resizing of this dialog.
""")
#-----------------------------------------------------------------------------
# Dev API
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Private API
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Code
#-----------------------------------------------------------------------------