Created
March 24, 2023 23:08
-
-
Save tito/72a8089f1dce6335e35a7cd81a6a7317 to your computer and use it in GitHub Desktop.
Kivy Widget for showing/hidding content.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from kivy.uix.relativelayout import RelativeLayout | |
from kivy.properties import BooleanProperty, NumericProperty | |
from kivy.animation import Animation | |
class VisibleContainer(RelativeLayout): | |
visible = BooleanProperty(True) | |
animated = BooleanProperty(False) | |
duration = NumericProperty(0.2) | |
capture = BooleanProperty(False) | |
def __init__(self, **kwargs): | |
self.saved_children = [] | |
self.anim = None | |
super().__init__(**kwargs) | |
def add_widget(self, child): | |
if child not in self.saved_children: | |
self.saved_children.append(child) | |
if not self.visible: | |
return | |
super().add_widget(child) | |
def remove_widget(self, child): | |
if child in self.saved_children: | |
self.saved_children.remove(child) | |
if not self.visible: | |
return | |
super().remove_widget(child) | |
def _populate(self): | |
self._unpopulate() | |
for child in self.saved_children: | |
super().add_widget(child) | |
def _unpopulate(self): | |
for child in self.saved_children: | |
super().remove_widget(child) | |
def on_visible(self, *largs): | |
if self.visible: | |
self._populate() | |
if self.animated: | |
self.fade_in() | |
else: | |
if self.animated: | |
self.fade_out() | |
else: | |
self._unpopulate() | |
def cancel_anim(self): | |
if self.anim: | |
self.anim.cancel_all(self) | |
def fade_in(self): | |
self.cancel_anim() | |
self._populate() | |
self.opacity = 0 | |
self.anim = Animation(opacity=1, duration=self.duration) | |
self.anim.start(self) | |
def fade_out(self): | |
self.cancel_anim() | |
self._populate() | |
self.opacity = 1 | |
self.anim = Animation(opacity=0, duration=self.duration) | |
self.anim.bind(on_complete=self.on_fade_out_complete) | |
self.anim.start(self) | |
def on_fade_out_complete(self, *largs): | |
for child in self.saved_children: | |
super().remove_widget(child) | |
def on_touch_down(self, touch): | |
ret = super().on_touch_down(touch) | |
return ret or (self.capture and self.visible) | |
def on_touch_move(self, touch): | |
ret = super().on_touch_move(touch) | |
return ret or (self.capture and self.visible) | |
def on_touch_up(self, touch): | |
ret = super().on_touch_up(touch) | |
return ret or (self.capture and self.visible) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment