python-efl/examples/elementary/test_store.py

135 lines
4.3 KiB
Python

#!/usr/bin/env python
# encoding: utf-8
from efl.evas import EVAS_HINT_EXPAND, EVAS_HINT_FILL
from efl import elementary
from efl.elementary.genlist import Genlist, GenlistItemClass, ELM_LIST_COMPRESS
from efl.elementary.store import Store, StoreItemMappingLabel, StoreItemMappingNone
from efl.elementary.box import Box
from efl.elementary.window import StandardWindow
class My_Item(object):
sender = None
subject = None
date = None
head_content = None
# callbacks just to see user interacting with genlist
def st_selected(obj, event_info):
print("selected: %s" % event_info)
def st_double_clicked(obj, event_info):
print("double clicked: %s" % event_info)
def st_longpress(obj, event_info):
print("longpress %s" % event_info)
mapping = [
StoreItemMappingLabel("elm.title.1", 1),
StoreItemMappingLabel("elm.title.2", 2),
StoreItemMappingLabel("elm.text", 3),
StoreItemMappingNone("elm.swallow.icon", 0),
StoreItemMappingNone("elm.swallow.end", 0),
]
def st_store_list(info, *args, **kwargs):
if info.path.endswith("py"):
info.base.item_class = GenlistItemClass(item_style="default")
return True
else:
return False
# char sort_id[7];
# # create a sort id based on the filename itself assuming it is a numeric
# # value like the id number in mh mail folders which is what this test
# # uses as a data source
# file = strrchr(info.path, '/')
# if file: file++
# else file = info.path
# id = atoi(file);
# sort_id[0] = ((id >> 30) & 0x3f) + 32;
# sort_id[1] = ((id >> 24) & 0x3f) + 32;
# sort_id[2] = ((id >> 18) & 0x3f) + 32;
# sort_id[3] = ((id >> 12) & 0x3f) + 32;
# sort_id[4] = ((id >> 6) & 0x3f) + 32;
# sort_id[5] = ((id >> 0) & 0x3f) + 32;
# sort_id[6] = 0;
# info.base.sort_id = strdup(sort_id);
# # choose the item genlist item class to use (only item style should be
# # provided by the app, store will fill everything else in, so it also
# # has to be writable
# info.base.item_class = itc1; # based on item info - return the item class wanted (only style field used - rest reset to internal funcs store sets up to get label/icon etc)
# info.base.mapping = it1_mapping;
# info.base.data = NULL; # if we can already parse and load all of item here and want to - set this
# return True; # return true to include this, false not to
def st_store_fetch(sti, *args, **kwargs):
if sti.data: return
path = sti.filesystem_path
have_content = None
content = []
myit = My_Item()
with open(path, "r", encoding="UTF-8") as f:
for line in f:
if have_content is None:
if line.startswith("From:"):
myit.sender = line[5:]
elif line.startswith("Subject:"):
myit.subject = line[8:]
elif line.startswith("Date:"):
myit.date = line[5:]
elif line == "\n":
have_content = True
else:
content.append(line)
myit.head_content = content #elm_entry_utf8_to_markup(content)
sti.data = myit
def st_store_unfetch(sti, *args, **kwargs):
print("unfetch")
def store_clicked(obj):
win = StandardWindow("store", "Store")
win.autodel = True
if obj is None:
win.callback_delete_request_add(lambda o: elementary.exit())
bx = Box(win)
bx.size_hint_weight = EVAS_HINT_EXPAND, EVAS_HINT_EXPAND
win.resize_object_add(bx)
bx.show()
gl = Genlist(win)
gl.mode = ELM_LIST_COMPRESS
gl.callback_selected_add(st_selected)
gl.callback_clicked_double_add(st_double_clicked)
gl.callback_longpressed_add(st_longpress)
gl.size_hint_weight = EVAS_HINT_EXPAND, EVAS_HINT_EXPAND
gl.size_hint_align = EVAS_HINT_FILL, EVAS_HINT_FILL
bx.pack_end(gl)
gl.show()
itc1 = GenlistItemClass()
itc1.item_style = "message"
st = Store()
st.fs_list_func_set(st_store_list)
st.fetch_func_set(st_store_fetch)
#st.fetch_thread = False
#st.unfetch_func_set(st_store_unfetch)
st.items_sorted = False
st.target_genlist = gl
st.filesystem_directory = "."
win.size = 480, 800
win.show()
if __name__ == "__main__":
elementary.init()
store_clicked(None)
elementary.run()
elementary.shutdown()