Sideband/sbapp/kivymd/uix/__init__.py

93 lines
2.8 KiB
Python
Executable File

__all__ = ("MDAdaptiveWidget",)
from kivy.properties import BooleanProperty
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.uix.screenmanager import Screen
from kivymd.uix.behaviors import SpecificBackgroundColorBehavior
class MDAdaptiveWidget(SpecificBackgroundColorBehavior):
adaptive_height = BooleanProperty(False)
"""
If `True`, the following properties will be applied to the widget:
.. code-block:: kv
size_hint_y: None
height: self.minimum_height
:attr:`adaptive_height` is an :class:`~kivy.properties.BooleanProperty`
and defaults to `False`.
"""
adaptive_width = BooleanProperty(False)
"""
If `True`, the following properties will be applied to the widget:
.. code-block:: kv
size_hint_x: None
width: self.minimum_width
:attr:`adaptive_width` is an :class:`~kivy.properties.BooleanProperty`
and defaults to `False`.
"""
adaptive_size = BooleanProperty(False)
"""
If `True`, the following properties will be applied to the widget:
.. code-block:: kv
size_hint: None, None
size: self.minimum_size
:attr:`adaptive_size` is an :class:`~kivy.properties.BooleanProperty`
and defaults to `False`.
"""
def on_adaptive_height(self, md_widget, value: bool) -> None:
self.size_hint_y = None
if issubclass(self.__class__, Label):
self.bind(
texture_size=lambda *x: self.setter("height")(
self, self.texture_size[1]
)
)
else:
if not isinstance(self, (FloatLayout, Screen)):
self.bind(minimum_height=self.setter("height"))
if not self.children:
self.height = 0
def on_adaptive_width(self, md_widget, value: bool) -> None:
self.size_hint_x = None
if issubclass(self.__class__, Label):
self.bind(
texture_size=lambda *x: self.setter("width")(
self, self.texture_size[0]
)
)
else:
if not isinstance(self, (FloatLayout, Screen)):
self.bind(minimum_width=self.setter("width"))
if not self.children:
self.width = 0
def on_adaptive_size(self, md_widget, value: bool) -> None:
self.size_hint = (None, None)
if issubclass(self.__class__, Label):
self.text_size = (None, None)
self.bind(
texture_size=lambda *x: self.setter("size")(
self, self.texture_size
)
)
else:
if not isinstance(self, (FloatLayout, Screen)):
self.bind(minimum_size=self.setter("size"))
if not self.children:
self.size = (0, 0)