class NewEventTextInput(TextInput): '''NewEventTextInput is TextInput which is used to create a new event for a widget. When event is created then on_create_event is emitted ''' __events__ = ('on_create_event',) info_message = StringProperty(None) '''Message which will be displayed in the InfoBubble :data:`info_message` is a :class:`~kivy.properties.StringProperty` ''' def on_create_event(self, *args): '''Default event handler for 'on_create_event' ''' pass def on_text_validate(self): '''Create a new event to a CustomWidget ''' if self.text[:3] == 'on_': self.dispatch('on_create_event') def on_touch_down(self, touch): '''Default handler for 'on_touch_down' event. ''' if self.collide_point(*touch.pos): self.info_bubble = InfoBubble(message=self.info_message) bubble_pos = list(self.to_window(*self.pos)) bubble_pos[1] += self.height self.info_bubble.show(bubble_pos, 1.5) return super(NewEventTextInput, self).on_touch_down(touch)
class NewEventTextInput(TextInput): '''NewEventTextInput is TextInput which is used to create a new event for a widget. When event is created then on_create_event is emitted ''' __events__ = ('on_create_event',) info_message = StringProperty(None) '''Message which will be displayed in the InfoBubble :data:`info_message` is a :class:`~kivy.properties.StringProperty` ''' def on_create_event(self, *args): pass def insert_text(self, substring, from_undo=False): if '\n' in substring: #Enter pressed create a new event substring = substring.replace('\n', '') if self.text[:3] == 'on_': self.dispatch('on_create_event') super(NewEventTextInput, self).insert_text(substring, from_undo) def on_touch_down(self, touch): if self.collide_point(*touch.pos): self.info_bubble = InfoBubble(message=self.info_message) self.info_bubble.show(self.pos, 1) return super(NewEventTextInput, self).on_touch_down(touch)
class NewEventTextInput(TextInput): '''NewEventTextInput is TextInput which is used to create a new event for a widget. When event is created then on_create_event is emitted ''' __events__ = ('on_create_event',) info_message = StringProperty(None) '''Message which will be displayed in the InfoBubble :data:`info_message` is a :class:`~kivy.properties.StringProperty` ''' def on_create_event(self, *args): '''Default event handler for 'on_create_event' ''' pass def insert_text(self, substring, from_undo=False): '''Override of 'insert_text' of :class:`kivy.uix.textinput.TextInput` ''' if '\n' in substring: # Enter pressed create a new event substring = substring.replace('\n', '') if self.text[:3] == 'on_': self.dispatch('on_create_event') super(NewEventTextInput, self).insert_text(substring, from_undo) def on_touch_down(self, touch): '''Default handler for 'on_touch_down' event. ''' if self.collide_point(*touch.pos): self.info_bubble = InfoBubble(message=self.info_message) self.info_bubble.show(self.pos, 1) return super(NewEventTextInput, self).on_touch_down(touch)
class EventHandlerTextInput(TextInput): '''EventHandlerTextInput is used to display/change/remove EventHandler for an event ''' eventwidget = ObjectProperty(None) '''Current selected widget :data:`eventwidget` is a :class:`~kivy.properties.ObjectProperty` ''' eventname = StringProperty(None) '''Name of current event :data:`eventname` is a :class:`~kivy.properties.ObjectProperty` ''' kv_code_input = ObjectProperty() '''Reference to KVLangArea :data:`kv_code_input` is a :class:`~kivy.properties.ObjectProperty` ''' text_inserted = BooleanProperty(None) '''Specifies whether text has been inserted or not :data:`text_inserted` is a :class:`~kivy.properties.ObjectProperty` ''' project_loader = ObjectProperty(None) '''Reference to ProjectLoader :data:`project_loader` is a :class:`~kivy.properties.ObjectProperty` ''' info_message = StringProperty(None) '''Message to be displayed by InfoBubble :data:`info_message` is a :class:`~kivy.properties.StringProperty` ''' dropdown = ObjectProperty(None) '''DropDown which will be displayed to show possible functions for that event :data:`dropdown` is a :class:`~kivy.properties.ObjectProperty` ''' def on_touch_down(self, touch): '''Default handler for 'on_touch_down' event ''' if self.collide_point(*touch.pos): self.info_bubble = InfoBubble(message=self.info_message) bubble_pos = list(self.to_window(*self.pos)) bubble_pos[1] += self.height self.info_bubble.show(bubble_pos, 1.5) return super(EventHandlerTextInput, self).on_touch_down(touch) def show_drop_down_for_widget(self, widget): '''Show all functions for a widget in a Dropdown. ''' self.dropdown = DropDown() list_funcs = dir(widget) for func in list_funcs: if '__' not in func and hasattr(getattr(widget, func), '__call__'): btn = Button(text=func, size_hint=(None, None), size=(100, 30), shorten=True) self.dropdown.add_widget(btn) btn.bind(on_release=lambda btn: self.dropdown.select(btn.text)) btn.text_size = [btn.size[0] - 4, btn.size[1]] btn.valign = 'middle' self.dropdown.open(self) self.dropdown.pos = (self.x, self.y) self.dropdown.bind(on_select=self._dropdown_select) def _dropdown_select(self, instance, value): '''Event handler for 'on_select' event of self.dropdown ''' self.text += value def on_text(self, instance, value): '''Default event handler for 'on_text' ''' if not self.kv_code_input: return self.kv_code_input.set_event_handler(self.eventwidget, self.eventname, self.text) if self.text and self.text[-1] == '.': if self.text == 'self.': self.show_drop_down_for_widget(self.eventwidget) elif self.text == 'root.': self.show_drop_down_for_widget( self.project_loader.root_rule.widget) else: _id = self.text.replace('.', '') root = self.project_loader.root_rule.widget widget = None if _id in root.ids: widget = root.ids[_id] if widget: self.show_drop_down_for_widget(widget) elif self.dropdown: self.dropdown.dismiss()
class EventHandlerTextInput(TextInput): '''EventHandlerTextInput is used to display/change/remove EventHandler for an event ''' eventwidget = ObjectProperty(None) '''Current selected widget :data:`eventwidget` is a :class:`~kivy.properties.ObjectProperty` ''' eventname = StringProperty(None) '''Name of current event :data:`eventname` is a :class:`~kivy.properties.ObjectProperty` ''' kv_code_input = ObjectProperty() '''Reference to KVLangArea :data:`kv_code_input` is a :class:`~kivy.properties.ObjectProperty` ''' text_inserted = BooleanProperty(None) '''Specifies whether text has been inserted or not :data:`text_inserted` is a :class:`~kivy.properties.ObjectProperty` ''' info_message = StringProperty(None) '''Message to be displayed by InfoBubble :data:`info_message` is a :class:`~kivy.properties.StringProperty` ''' dropdown = ObjectProperty(None) '''DropDown which will be displayed to show possible functions for that event :data:`dropdown` is a :class:`~kivy.properties.ObjectProperty` ''' def on_touch_down(self, touch): '''Default handler for 'on_touch_down' event ''' if self.collide_point(*touch.pos): self.info_bubble = InfoBubble(message=self.info_message) bubble_pos = list(self.to_window(*self.pos)) bubble_pos[1] += self.height self.info_bubble.show(bubble_pos, 1.5) return super(EventHandlerTextInput, self).on_touch_down(touch) def show_drop_down_for_widget(self, widget): '''Show all functions for a widget in a Dropdown. ''' self.dropdown = DropDown() list_funcs = dir(widget) for func in list_funcs: if '__' not in func and hasattr(getattr(widget, func), '__call__'): btn = Button(text=func, size_hint=(None, None), size=(100, 30), shorten=True) self.dropdown.add_widget(btn) btn.bind(on_release=lambda btn: self.dropdown.select(btn.text)) btn.text_size = [btn.size[0] - 4, btn.size[1]] btn.valign = 'middle' self.dropdown.open(self) self.dropdown.pos = (self.x, self.y) self.dropdown.bind(on_select=self._dropdown_select) def _dropdown_select(self, instance, value): '''Event handler for 'on_select' event of self.dropdown ''' self.text += value def on_text(self, instance, value): '''Default event handler for 'on_text' ''' if not self.kv_code_input: return d = get_designer() playground = d.ui_creator.playground self.kv_code_input.set_event_handler(self.eventwidget, self.eventname, self.text) if self.text and self.text[-1] == '.': if self.text == 'self.': self.show_drop_down_for_widget(self.eventwidget) ## TODO recursively call eventwidget.parent to get the root widget elif self.text == 'root.': self.show_drop_down_for_widget(playground.root) else: _id = self.text.replace('.', '') root = playground.root widget = None if _id in root.ids: widget = root.ids[_id] if widget: self.show_drop_down_for_widget(widget) elif self.dropdown: self.dropdown.dismiss()