Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from kivy.app import App
- from kivy.lang import Builder
- from kivy.uix.recycleview import RecycleView
- from kivy.uix.recycleview.views import RecycleDataViewBehavior
- from kivy.uix.label import Label
- from kivy.properties import BooleanProperty
- from kivy.uix.recycleboxlayout import RecycleBoxLayout
- from kivy.uix.behaviors import FocusBehavior
- from kivy.uix.recycleview.layout import LayoutSelectionBehavior
- Builder.load_string('''
- <Box>:
- Image:
- source: 'icon.png'
- size: self.texture_size
- <SelectableLabel>:
- # Draw a background to indicate selection
- canvas.before:
- Color:
- rgba: (.0, 0.9, .1, .3) if self.selected else (0, 0, 0, 1)
- Rectangle:
- pos: self.pos
- size: self.size
- <RV>:
- viewclass: 'Box'
- SelectableRecycleBoxLayout:
- default_size: None, dp(56)
- default_size_hint: 1, None
- size_hint_y: None
- height: self.minimum_height
- orientation: 'vertical'
- multiselect: True
- touch_multiselect: True
- ''')
- class Box:
- pass
- class SelectableRecycleBoxLayout(FocusBehavior, LayoutSelectionBehavior,
- RecycleBoxLayout):
- ''' Adds selection and focus behaviour to the view. '''
- class SelectableLabel(RecycleDataViewBehavior, Label):
- ''' Add selection support to the Label '''
- index = None
- selected = BooleanProperty(False)
- selectable = BooleanProperty(True)
- def refresh_view_attrs(self, rv, index, data):
- ''' Catch and handle the view changes '''
- self.index = index
- return super(SelectableLabel, self).refresh_view_attrs(
- rv, index, data)
- def on_touch_down(self, touch):
- ''' Add selection on touch down '''
- if super(SelectableLabel, self).on_touch_down(touch):
- return True
- if self.collide_point(*touch.pos) and self.selectable:
- return self.parent.select_with_touch(self.index, touch)
- def apply_selection(self, rv, index, is_selected):
- ''' Respond to the selection of items in the view. '''
- self.selected = is_selected
- if is_selected:
- print("selection changed to {0}".format(rv.data[index]))
- else:
- print("selection removed for {0}".format(rv.data[index]))
- class RV(RecycleView):
- def __init__(self, **kwargs):
- super(RV, self).__init__(**kwargs)
- self.data = [{'text': str(x)} for x in range(100)]
- class TestApp(App):
- def build(self):
- return RV()
- if __name__ == '__main__':
- TestApp().run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement