filechooser: enhance filechooser to include entry_released. we have now a feedback before the item is used, because down is updating selection, up will submit it. + add it in showcase.

This commit is contained in:
Mathieu Virbel 2011-11-22 17:10:06 +01:00
parent 119c595944
commit 40b6032779
3 changed files with 40 additions and 8 deletions

View File

@ -16,6 +16,7 @@ from kivy.uix.switch import Switch
from kivy.uix.label import Label
from kivy.uix.popup import Popup
from kivy.uix.accordion import Accordion, AccordionItem
from kivy.uix.filechooser import FileChooserIconView, FileChooserListView
class Showcase(FloatLayout):
@ -60,22 +61,20 @@ class ShowcaseApp(App):
n = create_tree('Buttons')
attach_node('Standard buttons', n)
attach_node('Options buttons', n)
n = create_tree('Sliders')
attach_node('Horizontal sliders', n)
attach_node('Vertical sliders', n)
n = create_tree('Scatter')
attach_node('Scatter with image', n)
attach_node('Scatter with buttons', n)
n = create_tree('Textinput')
attach_node('Monoline textinput', n)
attach_node('Multiline textinput', n)
n = create_tree('TreeView')
attach_node('Standard treeview', n)
attach_node('Treeview without root', n)
n = create_tree('Others')
attach_node('Accordion', n)
attach_node('Popup', n)
attach_node('Switch', n)
n = create_tree('Experimentals')
attach_node('Filechooser icon', n)
attach_node('Filechooser list', n)
root.add_widget(tree)
self.content = content = BoxLayout()
root.add_widget(content)
@ -192,6 +191,12 @@ class ShowcaseApp(App):
col.add_widget(root)
return col
def show_filechooser_icon(self):
return FileChooserIconView()
def show_filechooser_list(self):
return FileChooserListView()
if __name__ in ('__main__', '__android__'):
ShowcaseApp().run()

View File

@ -201,6 +201,7 @@
# Don't allow expansion of the ../ node
is_leaf: not ctx.isdir or ctx.name.endswith('..' + ctx.sep) or self.locked
on_touch_down: self.collide_point(*args[1].pos) and ctx.controller.entry_touched(self, args[1])
on_touch_up: self.collide_point(*args[1].pos) and ctx.controller.entry_released(self, args[1])
BoxLayout:
pos: root.pos
Label:
@ -244,6 +245,7 @@
size_hint: None, None
on_touch_down: self.collide_point(*args[1].pos) and ctx.controller.entry_touched(self, args[1])
on_touch_up: self.collide_point(*args[1].pos) and ctx.controller.entry_released(self, args[1])
canvas:
Color:

View File

@ -140,6 +140,9 @@ class FileChooserController(FloatLayout):
self.register_event_type('on_submit')
super(FileChooserController, self).__init__(**kwargs)
self._items = []
self.bind(selection=self._update_item_selection)
if platform in ('darwin', 'linux2'):
self.is_hidden = is_hidden_unix
elif platform == 'win32':
@ -151,6 +154,10 @@ class FileChooserController(FloatLayout):
filters=self._trigger_update)
self._trigger_update()
def _update_item_selection(self, *args):
for item in self._items:
item.selected = item.path in self.selection
def _trigger_update(self, *args):
Clock.unschedule(self._update_files)
Clock.schedule_once(self._update_files)
@ -168,9 +175,12 @@ class FileChooserController(FloatLayout):
pass
def on_submit(self, selected, touch=None):
self.selection = []
pass
def entry_touched(self, entry, touch):
'''(internal) This method must be called by the template when an entry
is touched by the user.
'''
if self.multiselect:
if isdir(entry.path) and touch.is_double_tap:
self.open_entry(entry)
@ -181,10 +191,23 @@ class FileChooserController(FloatLayout):
self.selection.append(entry.path)
else:
if isdir(entry.path):
self.open_entry(entry)
pass
else:
self.selection = [entry.path, ]
self.dispatch('on_submit', [entry.path], touch)
def entry_released(self, entry, touch):
'''(internal) This method must be called by the template when an entry
is touched by the user.
.. versionadded:: 1.0.10
'''
if self.multiselect:
pass
else:
if isdir(entry.path):
self.open_entry(entry)
elif touch.is_double_tap:
self.dispatch('on_submit', self.selection, touch)
def open_entry(self, entry):
try:
@ -232,6 +255,7 @@ class FileChooserController(FloatLayout):
def _update_files(self, *args):
# Clear current files
self.dispatch('on_entries_cleared')
self._items = []
# Add the components that are always needed
if platform == 'win32':
@ -247,6 +271,7 @@ class FileChooserController(FloatLayout):
pardir = Builder.template(self._ENTRY_TEMPLATE, **dict(name=back,
size='', path=back, controller=self, isdir=True, parent=None,
sep=sep, get_nice_size=lambda: ''))
self._items.append(pardir)
self.dispatch('on_entry_added', pardir)
try:
self._add_files(self.path)