432 lines
13 KiB
Python
432 lines
13 KiB
Python
#!/usr/bin/env python
|
|
# encoding: utf-8
|
|
|
|
import random
|
|
import os
|
|
|
|
from efl.evas import EVAS_HINT_EXPAND, EVAS_HINT_FILL, EXPAND_BOTH, FILL_BOTH, \
|
|
EXPAND_HORIZ, FILL_HORIZ, EVAS_ASPECT_CONTROL_BOTH
|
|
from efl import elementary as elm
|
|
from efl.elementary import StandardWindow, Button, Check, Entry, Image, \
|
|
Label, Gengrid, GengridItemClass, Slider, Radio, Table, Scrollable, \
|
|
ELM_GLOB_MATCH_NOCASE
|
|
|
|
|
|
script_path = os.path.dirname(os.path.abspath(__file__))
|
|
img_path = os.path.join(script_path, "images")
|
|
|
|
class ScrollableGengrid(Scrollable, Gengrid):
|
|
def __init__(self, canvas, *args, **kwargs):
|
|
Gengrid.__init__(self, canvas, *args, **kwargs)
|
|
|
|
|
|
images = ["panel_01.jpg", "plant_01.jpg", "rock_01.jpg", "rock_02.jpg",
|
|
"sky_01.jpg", "sky_02.jpg", "sky_03.jpg", "sky_04.jpg", "wood_01.jpg"]
|
|
|
|
|
|
def gg_text_get(obj, part, item_data):
|
|
return "Item # %s" % (item_data)
|
|
|
|
def gg_content_get(obj, part, data):
|
|
if part == "elm.swallow.icon":
|
|
im = Image(obj, file=os.path.join(img_path, random.choice(images)),
|
|
size_hint_aspect=(EVAS_ASPECT_CONTROL_BOTH, 1, 1))
|
|
return im
|
|
return None
|
|
|
|
def gg_state_get(obj, part, item_data):
|
|
return False
|
|
|
|
def gg_del(obj, item_data):
|
|
# commented out because this make clear() slow with many items
|
|
# print "[item del] # %d - %s" % (item_data, obj)
|
|
pass
|
|
|
|
def gg_sel(gg, ggi, *args, **kwargs):
|
|
(x, y) = ggi.pos_get()
|
|
print(("[item selected] # %d at pos %d %d" % (ggi.data, x, y)))
|
|
|
|
def gg_unsel(gg, ggi, *args, **kwargs):
|
|
print(("[item unselected] # %d" % (ggi.data)))
|
|
|
|
def gg_clicked_double(gg, ggi, *args, **kwargs):
|
|
print(("[item double clicked] # %d" % (ggi.data)))
|
|
|
|
|
|
def gengrid_clicked(obj):
|
|
|
|
global item_count
|
|
item_count = 25
|
|
|
|
win = StandardWindow("gengrid", "Gengrid", autodel=True, size=(480, 600))
|
|
if obj is None:
|
|
win.callback_delete_request_add(lambda o: elm.exit())
|
|
|
|
tb = Table(win, homogeneous=False, size_hint_weight=EXPAND_BOTH)
|
|
win.resize_object_add(tb)
|
|
tb.show()
|
|
|
|
# gengrid
|
|
itc = GengridItemClass(item_style="default",
|
|
text_get_func=gg_text_get,
|
|
content_get_func=gg_content_get,
|
|
state_get_func=gg_state_get,
|
|
del_func=gg_del)
|
|
gg = ScrollableGengrid(win, size_hint_weight=EXPAND_BOTH,
|
|
size_hint_align=FILL_BOTH, horizontal=False, bounce=(False, True),
|
|
item_size=(80, 80), align=(0.5, 0.0))
|
|
tb.pack(gg, 0, 0, 6, 1)
|
|
gg.callback_selected_add(gg_sel)
|
|
gg.callback_unselected_add(gg_unsel)
|
|
gg.callback_clicked_double_add(gg_clicked_double)
|
|
gg.show()
|
|
|
|
def tooltip_content_cb(gl, item, obj):
|
|
txt = "Tooltip <b>from callback</b> for item # %d" % item.data
|
|
return Label(gl, text=txt)
|
|
|
|
# add the first items
|
|
for i in range(item_count):
|
|
ggi = gg.item_append(itc, i, None)
|
|
if i % 2:
|
|
ggi.tooltip_text_set("Static Tooltip for item # %d" % i)
|
|
else:
|
|
ggi.tooltip_content_cb_set(tooltip_content_cb)
|
|
|
|
# multi select
|
|
def multi_select_changed(bt, gg):
|
|
gg.multi_select_set(bt.state)
|
|
print((gg.multi_select))
|
|
|
|
bt = Check(win, text="MultiSelect", state=gg.multi_select)
|
|
bt.callback_changed_add(multi_select_changed, gg)
|
|
tb.pack(bt, 0, 1, 1, 1)
|
|
bt.show()
|
|
|
|
# horizontal
|
|
def horizontal_changed(bt, gg):
|
|
gg.horizontal_set(bt.state)
|
|
|
|
bt = Check(win, text="Horizontal")
|
|
bt.callback_changed_add(horizontal_changed, gg)
|
|
tb.pack(bt, 1, 1, 1, 1)
|
|
bt.show()
|
|
|
|
# reorder mode
|
|
def reorder_mode_changed(bt, gg):
|
|
gg.reorder_mode = bt.state
|
|
|
|
bt = Check(win, text="Reorder mode enable")
|
|
bt.callback_changed_add(reorder_mode_changed, gg)
|
|
tb.pack(bt, 2, 1, 2, 1)
|
|
bt.show()
|
|
|
|
# bounce h
|
|
def bounce_h_changed(bt, gg):
|
|
(h_bounce, v_bounce) = gg.bounce_get()
|
|
gg.bounce_set(bt.state, v_bounce)
|
|
print((gg.bounce_get()))
|
|
|
|
bt = Check(win, text="BounceH")
|
|
h_bounce = gg.bounce[0]
|
|
bt.state = h_bounce
|
|
bt.callback_changed_add(bounce_h_changed, gg)
|
|
tb.pack(bt, 4, 1, 1, 1)
|
|
bt.show()
|
|
|
|
# bounce v
|
|
def bounce_v_changed(bt, gg):
|
|
(h_bounce, v_bounce) = gg.bounce_get()
|
|
gg.bounce_set(h_bounce, bt.state)
|
|
print((gg.bounce_get()))
|
|
|
|
bt = Check(win, text="BounceV")
|
|
v_bounce = gg.bounce[1]
|
|
bt.state = v_bounce
|
|
bt.callback_changed_add(bounce_v_changed, gg)
|
|
tb.pack(bt, 5, 1, 1, 1)
|
|
bt.show()
|
|
|
|
# item size
|
|
def item_size_w_changed(sl, gg):
|
|
(w, h) = gg.item_size_get()
|
|
gg.item_size_set(sl.value, h)
|
|
print((gg.item_size_get()))
|
|
|
|
def item_size_h_changed(sl, gg):
|
|
(w, h) = gg.item_size_get()
|
|
gg.item_size_set(w, sl.value)
|
|
print((gg.item_size_get()))
|
|
|
|
(w, h) = gg.item_size
|
|
sl = Slider(win, text="ItemSizeW", min_max=(0, 500),
|
|
indicator_format="%.0f", unit_format="%.0f", span_size=100, value=w)
|
|
sl.callback_changed_add(item_size_w_changed, gg)
|
|
tb.pack(sl, 0, 2, 2, 1)
|
|
sl.show()
|
|
|
|
sl = Slider(win, text="ItemSizeH", min_max=(0, 500),
|
|
indicator_format="%.0f", unit_format="%.0f", span_size=100, value=h)
|
|
sl.callback_changed_add(item_size_h_changed, gg)
|
|
tb.pack(sl, 0, 3, 2, 1)
|
|
sl.show()
|
|
|
|
# align
|
|
def alignx_changed(sl, gg):
|
|
(ax, ay) = gg.align
|
|
gg.align = sl.value, ay
|
|
print(gg.align)
|
|
|
|
def aligny_changed(sl, gg):
|
|
(ax, ay) = gg.align
|
|
gg.align = ax, sl.value
|
|
print(gg.align)
|
|
|
|
(ax, ay) = gg.align
|
|
|
|
sl = Slider(win, text="AlignX", min_max=(0.0, 1.0),
|
|
indicator_format="%.2f", unit_format="%.2f", span_size=100, value=ax)
|
|
sl.callback_changed_add(alignx_changed, gg)
|
|
tb.pack(sl, 0, 4, 2, 1)
|
|
sl.show()
|
|
|
|
sl = Slider(win, text="AlignY", min_max=(0.0, 1.0),
|
|
indicator_format="%.2f", unit_format="%.2f", span_size=100, value=ay)
|
|
sl.callback_changed_add(aligny_changed, gg)
|
|
tb.pack(sl, 0, 5, 2, 1)
|
|
sl.show()
|
|
|
|
# select first
|
|
def select_first_clicked(bt, gg):
|
|
ggi = gg.first_item
|
|
if ggi:
|
|
ggi.selected = not ggi.selected
|
|
|
|
bt = Button(win, size_hint_align=FILL_HORIZ, text="Select first")
|
|
bt.callback_clicked_add(select_first_clicked, gg)
|
|
tb.pack(bt, 2, 2, 1, 1)
|
|
bt.show()
|
|
|
|
# select last
|
|
def select_last_clicked(bt, gg):
|
|
ggi = gg.last_item
|
|
if ggi:
|
|
ggi.selected = not ggi.selected
|
|
|
|
bt = Button(win, size_hint_align=(EVAS_HINT_FILL, 0), text="Select last")
|
|
bt.callback_clicked_add(select_last_clicked, gg)
|
|
tb.pack(bt, 3, 2, 1, 1)
|
|
bt.show()
|
|
|
|
# selection del
|
|
def seldel_clicked(bt, gg):
|
|
for ggi in gg.selected_items_get():
|
|
ggi.delete()
|
|
|
|
bt = Button(win, size_hint_align=(EVAS_HINT_FILL, 0), text="Sel del")
|
|
bt.callback_clicked_add(seldel_clicked, gg)
|
|
tb.pack(bt, 4, 2, 1, 1)
|
|
bt.show()
|
|
|
|
# clear
|
|
def clear_clicked(bt, gg):
|
|
global item_count
|
|
item_count = 0
|
|
gg.clear()
|
|
|
|
bt = Button(win, size_hint_align=(EVAS_HINT_FILL, 0), text="Clear")
|
|
bt.callback_clicked_add(clear_clicked, gg)
|
|
tb.pack(bt, 5, 2, 1, 1)
|
|
bt.show()
|
|
|
|
# append
|
|
def append_clicked(bt, gg, n):
|
|
global item_count
|
|
while n:
|
|
item_count += 1
|
|
gg.item_append(itc, item_count, None)
|
|
n -= 1
|
|
|
|
bt = Button(win, size_hint_align=FILL_HORIZ, text="Append 1")
|
|
bt.callback_clicked_add(append_clicked, gg, 1)
|
|
tb.pack(bt, 2, 3, 1, 1)
|
|
bt.show()
|
|
|
|
bt = Button(win, size_hint_align=FILL_HORIZ, text="Append 100")
|
|
bt.callback_clicked_add(append_clicked, gg, 100)
|
|
tb.pack(bt, 3, 3, 1, 1)
|
|
bt.show()
|
|
|
|
bt = Button(win, size_hint_align=FILL_HORIZ, text="Append 1000")
|
|
bt.callback_clicked_add(append_clicked, gg, 1000)
|
|
tb.pack(bt, 4, 3, 1, 1)
|
|
bt.show()
|
|
|
|
bt = Button(win, size_hint_align=FILL_HORIZ, text="Append 10000 :)")
|
|
bt.callback_clicked_add(append_clicked, gg, 10000)
|
|
tb.pack(bt, 5, 3, 1, 1)
|
|
bt.show()
|
|
|
|
# prepend
|
|
def prepend_clicked(bt, gg):
|
|
global item_count
|
|
item_count += 1
|
|
gg.item_prepend(itc, item_count)
|
|
|
|
bt = Button(win, size_hint_align=FILL_HORIZ, text="Prepend")
|
|
bt.callback_clicked_add(prepend_clicked, gg)
|
|
tb.pack(bt, 2, 4, 1, 1)
|
|
bt.show()
|
|
|
|
# insert_before
|
|
def ins_before_clicked(bt, gg):
|
|
global item_count
|
|
item_count += 1
|
|
before = gg.selected_item_get()
|
|
if before:
|
|
gg.item_insert_before(itc, item_count, before)
|
|
else:
|
|
print("nothing selected")
|
|
|
|
bt = Button(win, size_hint_align=FILL_HORIZ, text="Ins before")
|
|
bt.callback_clicked_add(ins_before_clicked, gg)
|
|
tb.pack(bt, 3, 4, 1, 1)
|
|
bt.show()
|
|
|
|
# insert_after
|
|
def ins_after_clicked(bt, gg):
|
|
global item_count
|
|
item_count += 1
|
|
after = gg.selected_item_get()
|
|
if after:
|
|
gg.item_insert_after(itc, item_count, after)
|
|
else:
|
|
print("nothing selected")
|
|
|
|
bt = Button(win, size_hint_align=FILL_HORIZ, text="Ins after")
|
|
bt.callback_clicked_add(ins_after_clicked, gg)
|
|
tb.pack(bt, 4, 4, 1, 1)
|
|
bt.show()
|
|
|
|
# item content unset
|
|
def content_unset_clicked(bt, gg):
|
|
item = gg.selected_item
|
|
if item is None:
|
|
print("You must select an item first!")
|
|
else:
|
|
contents = item.all_contents_unset()
|
|
for obj in contents:
|
|
obj.pos = (0, 0)
|
|
obj.show()
|
|
# Now all the unsetted objects are orphan in the canvas,
|
|
# the user should do something with them
|
|
|
|
bt = Button(win, size_hint_align=FILL_HORIZ, text="Item content unset")
|
|
bt.callback_clicked_add(content_unset_clicked, gg)
|
|
tb.pack(bt, 5, 4, 1, 1)
|
|
bt.show()
|
|
|
|
# scroll_to methods
|
|
rdg = rd = Radio(win, text='SCROLL_IN',
|
|
state_value=elm.ELM_GENGRID_ITEM_SCROLLTO_IN)
|
|
tb.pack(rd, 2, 5, 1, 1)
|
|
rd.show()
|
|
|
|
rd = Radio(win, text='SCROLL_TOP',
|
|
state_value=elm.ELM_GENGRID_ITEM_SCROLLTO_TOP)
|
|
rd.group_add(rdg)
|
|
tb.pack(rd, 3, 5, 1, 1)
|
|
rd.show()
|
|
|
|
rd = Radio(win, text='SCROLL_MIDDLE',
|
|
state_value=elm.ELM_GENGRID_ITEM_SCROLLTO_MIDDLE)
|
|
rd.group_add(rdg)
|
|
tb.pack(rd, 4, 5, 1, 1)
|
|
rd.show()
|
|
|
|
rd = Radio(win, text='SCROLL_BOTTOM',
|
|
state_value=elm.ELM_GENGRID_ITEM_SCROLLTO_BOTTOM)
|
|
rd.group_add(rdg)
|
|
tb.pack(rd, 5, 5, 1, 1)
|
|
rd.show()
|
|
|
|
rdg.value = elm.ELM_GENGRID_ITEM_SCROLLTO_IN
|
|
|
|
# show first/last
|
|
def show_clicked(bt, gg, rdg, what):
|
|
ggi = getattr(gg, what)
|
|
if ggi:
|
|
ggi.show(rdg.value)
|
|
|
|
bt = Button(win, size_hint_align=(EVAS_HINT_FILL, 0), text="Show first")
|
|
bt.callback_clicked_add(show_clicked, gg, rdg, "first_item")
|
|
tb.pack(bt, 2, 6, 1, 1)
|
|
bt.show()
|
|
|
|
bt = Button(win, size_hint_align=(EVAS_HINT_FILL, 0), text="Show last")
|
|
bt.callback_clicked_add(show_clicked, gg, rdg, "last_item")
|
|
tb.pack(bt, 3, 6, 1, 1)
|
|
bt.show()
|
|
|
|
bt = Button(win, size_hint_align=(EVAS_HINT_FILL, 0), text="Show selected")
|
|
bt.callback_clicked_add(show_clicked, gg, rdg, "selected_item")
|
|
tb.pack(bt, 2, 7, 2, 1)
|
|
bt.show()
|
|
|
|
# bring-in first/last/selected
|
|
def bring_in_clicked(bt, gg, rdg, what):
|
|
ggi = getattr(gg, what)
|
|
if ggi:
|
|
ggi.bring_in(rdg.value)
|
|
|
|
bt = Button(win, size_hint_align=(EVAS_HINT_FILL, 0), text="BringIn first")
|
|
bt.callback_clicked_add(bring_in_clicked, gg, rdg, "first_item")
|
|
tb.pack(bt, 4, 6, 1, 1)
|
|
bt.show()
|
|
|
|
bt = Button(win, size_hint_align=(EVAS_HINT_FILL, 0), text="BringIn last")
|
|
bt.callback_clicked_add(bring_in_clicked, gg, rdg, "last_item")
|
|
tb.pack(bt, 5, 6, 1, 1)
|
|
bt.show()
|
|
|
|
bt = Button(win, size_hint_align=(EVAS_HINT_FILL, 0), text="BringIn selected")
|
|
bt.callback_clicked_add(bring_in_clicked, gg, rdg, "selected_item")
|
|
tb.pack(bt, 4, 7, 2, 1)
|
|
bt.show()
|
|
|
|
# search_by_text_item_get
|
|
def search_cb(en, gg):
|
|
flags = ELM_GLOB_MATCH_NOCASE
|
|
from_item = gg.selected_item.next if gg.selected_item else None
|
|
|
|
item = gg.search_by_text_item_get(from_item, "elm.text", en.text, flags)
|
|
if item:
|
|
item.selected = True
|
|
en.focus = True
|
|
elif gg.selected_item:
|
|
gg.selected_item.selected = False
|
|
|
|
lb = Label(win, text="Search:")
|
|
tb.pack(lb, 0, 6, 2, 1)
|
|
lb.show()
|
|
|
|
en = Entry(win, single_line=True, scrollable=True,
|
|
size_hint_weight=EXPAND_HORIZ, size_hint_align=FILL_HORIZ)
|
|
en.part_text_set("guide", "Type the search query")
|
|
en.callback_activated_add(search_cb, gg)
|
|
tb.pack(en, 0, 7, 2, 1)
|
|
en.show()
|
|
en.focus = True
|
|
|
|
|
|
print(gg)
|
|
|
|
win.show()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
gengrid_clicked(None)
|
|
|
|
elm.run()
|