def fullscreen(self, *largs, **kwargs): root_win = self.parent.get_parent_window() # save state for restore self.old_children = root_win.children self.old_size = self.size # set new children root_win.children = SafeList() root_win.add_widget(self.container) btn_unfullscreen = MTButton(pos=(root_win.width-50, root_win.height-50), size=(50, 50), label='Back') btn_unfullscreen.push_handlers(on_release=self.unfullscreen) root_win.add_widget(btn_unfullscreen) self.size = root_win.size self.container.size = self.size
def fullscreen(self, *largs, **kwargs): root_win = self.parent.get_parent_window() # save state for restore self.old_children = root_win.children self.old_size = self.size # set new children root_win.children = SafeList() root_win.add_widget(self.container) btn_unfullscreen = MTButton(pos=(root_win.width - 50, root_win.height - 50), size=(50, 50), label='Back') btn_unfullscreen.push_handlers(on_release=self.unfullscreen) root_win.add_widget(btn_unfullscreen) self.size = root_win.size self.container.size = self.size
class MTKineticObject(MTWidget): def __init__(self, **kwargs): '''Kinetic object, the base object for every child in kineticlist. :Parameters: `deletable`: bool, default to True Indicate if object can be deleted or not ''' kwargs.setdefault('deletable', True) super(MTKineticObject, self).__init__(**kwargs) self.deletable = kwargs.get('deletable') self.register_event_type('on_animation_complete') self.push_handlers(on_animation_complete=self.on_animation_complete) # List of attributes that can be searched self.attr_search = ['label'] # In case the widget has to move itself # while still having kinetic movement applied self.xoffset = self.yoffset = 0 # The position values that the kinetic container edits. # We do this so we can break free and move ourself it necessary self.kx = self.ky = 0 self.db_alpha = 0.0 # Set to true if you want to break free from # the grasp of a kinetic widget self.free = False # Delete Button if self.deletable: self.db = MTButton(label='', size=(40, 40), pos=(self.x + self.width-40, self.y + self.height-40), style={'bg-color':(1, 0, 0, 0)}, visible=False) self.db.push_handlers(on_press=self._delete_callback) self.add_widget(self.db) self.a_delete = Animation(width=0, height=0, xoffset=self.kx + self.width/2, yoffset=self.ky + self.height/2, duration=0.5, f='ease_in_cubic') self.a_show = Animation(db_alpha=.5, duration=0.25) self.a_hide = Animation(db_alpha=0.0, duration=0.25) def show_delete(self): if not self.deletable: return self.db.show() self.a_show.animate(self) def hide_delete(self): if not self.deletable: return self.a_hide.animate(self) def on_animation_complete(self, anim): if anim == self.a_hide: self.db.hide() elif anim == self.a_delete: try: self.parent.remove_widget(self) except: pass def update(self): if not self.free: self.pos = self.kx + self.xoffset, self.ky + self.yoffset if self.deletable: self.db.pos = (self.x + self.width-40, self.y + self.height-40) self.db.style['bg-color'] = (1, 0, 0, self.db_alpha) def on_press(self, touch): if self.db.visible and self.db.on_touch_down(touch): return True def _delete_callback(self, touch): # So it doesn't poke out at the end(we aren't scaling it) self.db.hide() self.a_delete.animate(self)
class MTKineticObject(MTWidget): def __init__(self, **kwargs): '''Kinetic object, the base object for every child in kineticlist. :Parameters: `deletable`: bool, default to True Indicate if object can be deleted or not ''' kwargs.setdefault('deletable', True) super(MTKineticObject, self).__init__(**kwargs) self.deletable = kwargs.get('deletable') self.register_event_type('on_animation_complete') self.push_handlers(on_animation_complete=self.on_animation_complete) # List of attributes that can be searched self.attr_search = ['label'] # In case the widget has to move itself # while still having kinetic movement applied self.xoffset = self.yoffset = 0 # The position values that the kinetic container edits. # We do this so we can break free and move ourself it necessary self.kx = self.ky = 0 self.db_alpha = 0.0 # Set to true if you want to break free from # the grasp of a kinetic widget self.free = False # Delete Button if self.deletable: self.db = MTButton(label='', size=(40, 40), pos=(self.x + self.width - 40, self.y + self.height - 40), style={'bg-color': (1, 0, 0, 0)}, visible=False) self.db.push_handlers(on_press=self._delete_callback) self.add_widget(self.db) self.a_delete = Animation(width=0, height=0, xoffset=self.kx + self.width / 2, yoffset=self.ky + self.height / 2, duration=0.5, f='ease_in_cubic') self.a_show = Animation(db_alpha=.5, duration=0.25) self.a_hide = Animation(db_alpha=0.0, duration=0.25) def show_delete(self): if not self.deletable: return self.db.show() self.a_show.animate(self) def hide_delete(self): if not self.deletable: return self.a_hide.animate(self) def on_animation_complete(self, anim): if anim == self.a_hide: self.db.hide() elif anim == self.a_delete: try: self.parent.remove_widget(self) except: pass def update(self): if not self.free: self.pos = self.kx + self.xoffset, self.ky + self.yoffset if self.deletable: self.db.pos = (self.x + self.width - 40, self.y + self.height - 40) self.db.style['bg-color'] = (1, 0, 0, self.db_alpha) def on_press(self, touch): if self.db.visible and self.db.on_touch_down(touch): return True def _delete_callback(self, touch): # So it doesn't poke out at the end(we aren't scaling it) self.db.hide() self.a_delete.animate(self)
class MTPopup(MTScatterWidget): '''Popup with customizable content. :Parameters: `show_cancel`: bool, default to True Show/hide the cancel button `label_cancel`: str, default to 'Cancel' Change the label of cancel button `label_submit`: str, default to 'Ok' Change the label of submit button `title`: str, default to 'PyMT popup' Title of the popup (if None, no title will be added.) `exit_on_submit`: bool, default to 'True' Title of the popup (if None, no title will be added.) :Events: `on_submit` Fired when the popup submit button is pressed. In default behavior, the widget remove himself from parent. `on_cancel` Fired when the popup cancel button is pressed. In default behavior, the widget remove himself from parent. ''' def __init__(self, **kwargs): kwargs.setdefault('do_scale', False) kwargs.setdefault('size', (400, 400)) kwargs.setdefault('show_cancel', True) kwargs.setdefault('label_cancel', 'Cancel') kwargs.setdefault('label_submit', 'Ok') kwargs.setdefault('title', 'PyMT popup') kwargs.setdefault('exit_on_submit', True) super(MTPopup, self).__init__(**kwargs) self.register_event_type('on_submit') self.register_event_type('on_cancel') self.exit_on_submit = kwargs.get('exit_on_submit') # Create layouts self.layout = MTBoxLayout(size=self.size, orientation='vertical') self.l_content = MTBoxLayout(orientation='vertical') self.l_buttons = MTBoxLayout(size_hint=(1, None), orientation='horizontal') # Titles if kwargs.get('title'): self.w_title = MTLabel(label=kwargs.get('title'), autosize=True, cls='popup-title') # Buttons self.w_submit = MTButton(label=kwargs.get('label_submit'), size_hint=(0.5, None), height=40, cls='popup-button') self.w_submit.push_handlers(on_release=curry( self._dispatch_event, 'on_submit')) self.l_buttons.add_widget(self.w_submit) if kwargs.get('show_cancel'): self.w_cancel = MTButton(label=kwargs.get('label_cancel'), size_hint=(0.5, None), height=40, cls='popup-button') self.w_cancel.push_handlers(on_release=curry( self._dispatch_event, 'on_cancel')) self.l_buttons.add_widget(self.w_cancel) # Connect if kwargs.get('title'): self.layout.add_widget(self.w_title) self.layout.add_widget(self.l_content) self.layout.add_widget(self.l_buttons) super(MTPopup, self).add_widget(self.layout) def _ensure_layout(self, force=False): while force or (self.size != self.layout.size): self.layout.do_layout() self.size = self.layout.size force = False def add_widget(self, widget, force=False): self.l_content.add_widget(widget) self._ensure_layout(force) def remove_widget(self, widget, force=False): self.l_content.remove_widget(widget) self._ensure_layout(force) def close(self): if self.exit_on_submit: self.parent.remove_widget(self) else: self.hide() def on_submit(self): self.close() def on_cancel(self): self.close() def _dispatch_event(self, event, *largs): self.dispatch_event(event) def draw(self): # draw background set_color(*self.style['bg-color']) drawCSSRectangle(size=self.size, style=self.style)