125 lines
3.1 KiB
Python
125 lines
3.1 KiB
Python
|
from random import sample, randint
|
||
|
from string import ascii_lowercase
|
||
|
|
||
|
from kivy.app import App
|
||
|
from kivy.lang import Builder
|
||
|
from kivy.uix.boxlayout import BoxLayout
|
||
|
|
||
|
|
||
|
kv = """
|
||
|
<Row@RecycleKVIDsDataViewBehavior+BoxLayout>:
|
||
|
canvas.before:
|
||
|
Color:
|
||
|
rgba: 0.5, 0.5, 0.5, 1
|
||
|
Rectangle:
|
||
|
size: self.size
|
||
|
pos: self.pos
|
||
|
value: ''
|
||
|
Label:
|
||
|
id: name
|
||
|
Label:
|
||
|
text: root.value
|
||
|
|
||
|
<Test>:
|
||
|
canvas:
|
||
|
Color:
|
||
|
rgba: 0.3, 0.3, 0.3, 1
|
||
|
Rectangle:
|
||
|
size: self.size
|
||
|
pos: self.pos
|
||
|
rv: rv
|
||
|
orientation: 'vertical'
|
||
|
GridLayout:
|
||
|
cols: 3
|
||
|
rows: 2
|
||
|
size_hint_y: None
|
||
|
height: dp(108)
|
||
|
padding: dp(8)
|
||
|
spacing: dp(16)
|
||
|
Button:
|
||
|
text: 'Populate list'
|
||
|
on_press: root.populate()
|
||
|
Button:
|
||
|
text: 'Sort list'
|
||
|
on_press: root.sort()
|
||
|
Button:
|
||
|
text: 'Clear list'
|
||
|
on_press: root.clear()
|
||
|
BoxLayout:
|
||
|
spacing: dp(8)
|
||
|
Button:
|
||
|
text: 'Insert new item'
|
||
|
on_press: root.insert(new_item_input.text)
|
||
|
TextInput:
|
||
|
id: new_item_input
|
||
|
size_hint_x: 0.6
|
||
|
hint_text: 'value'
|
||
|
padding: dp(10), dp(10), 0, 0
|
||
|
BoxLayout:
|
||
|
spacing: dp(8)
|
||
|
Button:
|
||
|
text: 'Update first item'
|
||
|
on_press: root.update(update_item_input.text)
|
||
|
TextInput:
|
||
|
id: update_item_input
|
||
|
size_hint_x: 0.6
|
||
|
hint_text: 'new value'
|
||
|
padding: dp(10), dp(10), 0, 0
|
||
|
Button:
|
||
|
text: 'Remove first item'
|
||
|
on_press: root.remove()
|
||
|
|
||
|
RecycleView:
|
||
|
id: rv
|
||
|
scroll_type: ['bars', 'content']
|
||
|
scroll_wheel_distance: dp(114)
|
||
|
bar_width: dp(10)
|
||
|
viewclass: 'Row'
|
||
|
RecycleBoxLayout:
|
||
|
default_size: None, dp(56)
|
||
|
default_size_hint: 1, None
|
||
|
size_hint_y: None
|
||
|
height: self.minimum_height
|
||
|
orientation: 'vertical'
|
||
|
spacing: dp(2)
|
||
|
"""
|
||
|
|
||
|
Builder.load_string(kv)
|
||
|
|
||
|
|
||
|
class Test(BoxLayout):
|
||
|
|
||
|
def populate(self):
|
||
|
self.rv.data = [
|
||
|
{'name.text': ''.join(sample(ascii_lowercase, 6)),
|
||
|
'value': str(randint(0, 2000))}
|
||
|
for x in range(50)]
|
||
|
|
||
|
def sort(self):
|
||
|
self.rv.data = sorted(self.rv.data, key=lambda x: x['name.text'])
|
||
|
|
||
|
def clear(self):
|
||
|
self.rv.data = []
|
||
|
|
||
|
def insert(self, value):
|
||
|
self.rv.data.insert(0, {
|
||
|
'name.text': value or 'default value', 'value': 'unknown'})
|
||
|
|
||
|
def update(self, value):
|
||
|
if self.rv.data:
|
||
|
self.rv.data[0]['name.text'] = value or 'default new value'
|
||
|
self.rv.refresh_from_data()
|
||
|
|
||
|
def remove(self):
|
||
|
if self.rv.data:
|
||
|
self.rv.data.pop(0)
|
||
|
|
||
|
|
||
|
class TestApp(App):
|
||
|
def build(self):
|
||
|
return Test()
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
TestApp().run()
|