python-efl/examples/elementary/test_gengrid.py

347 lines
10 KiB
Python

#!/usr/bin/env python
# encoding: utf-8
import random
import os
from efl.evas import EVAS_HINT_EXPAND, EVAS_HINT_FILL, EVAS_ASPECT_CONTROL_BOTH
from efl import elementary
from efl.elementary.window import StandardWindow
from efl.elementary.background import Background
from efl.elementary.button import Button
from efl.elementary.check import Check
from efl.elementary.image import Image
from efl.elementary.gengrid import Gengrid, GengridItemClass
from efl.elementary.slider import Slider
from efl.elementary.table import Table
from efl.elementary.scroller import Scrollable
EXPAND_BOTH = EVAS_HINT_EXPAND, EVAS_HINT_EXPAND
EXPAND_HORIZ = EVAS_HINT_EXPAND, 0.0
FILL_BOTH = EVAS_HINT_FILL, EVAS_HINT_FILL
FILL_HORIZ = EVAS_HINT_FILL, 0.5
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, 800))
if obj is None:
win.callback_delete_request_add(lambda o: elementary.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()
# add the first items
for i in range(item_count):
gg.item_append(itc, i, None)
# 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()
# 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()
# show first/last
def show_clicked(bt, gg, first):
ggi = gg.first_item if first else gg.last_item
if ggi:
ggi.show()
bt = Button(win, size_hint_align=(EVAS_HINT_FILL, 0), text="Show first")
bt.callback_clicked_add(show_clicked, gg, True)
tb.pack(bt, 2, 3, 1, 1)
bt.show()
bt = Button(win, size_hint_align=(EVAS_HINT_FILL, 0), text="Show last")
bt.callback_clicked_add(show_clicked, gg, False)
tb.pack(bt, 3, 3, 1, 1)
bt.show()
# bring-in first/last
def bring_in_clicked(bt, gg, first):
ggi = gg.first_item if first else gg.last_item
if ggi:
ggi.bring_in()
bt = Button(win, size_hint_align=(EVAS_HINT_FILL, 0), text="BringIn first")
bt.callback_clicked_add(bring_in_clicked, gg, True)
tb.pack(bt, 4, 3, 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, False)
tb.pack(bt, 5, 3, 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, 4, 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, 4, 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, 4, 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, 4, 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, 5, 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, 5, 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, 5, 1, 1)
bt.show()
print(gg)
win.show()
if __name__ == "__main__":
elementary.init()
gengrid_clicked(None)
elementary.run()
elementary.shutdown()