python-efl/examples/elementary/test_calendar.py

269 lines
7.9 KiB
Python

#!/usr/bin/env python
# encoding: utf-8
from efl.evas import EVAS_HINT_EXPAND, EVAS_HINT_FILL, EXPAND_BOTH, FILL_BOTH
from efl import elementary
from efl.elementary.window import StandardWindow
from efl.elementary.box import Box
from efl.elementary.button import Button
from efl.elementary.calendar_elm import Calendar, \
ELM_DAY_MONDAY, ELM_DAY_THURSDAY, ELM_DAY_SATURDAY, \
ELM_CALENDAR_UNIQUE, ELM_CALENDAR_DAILY, ELM_CALENDAR_WEEKLY, \
ELM_CALENDAR_MONTHLY, ELM_CALENDAR_ANNUALLY, \
ELM_CALENDAR_SELECT_MODE_NONE, ELM_CALENDAR_SELECT_MODE_ONDEMAND
from efl.elementary.label import Label
from efl.elementary.frame import Frame
from efl.elementary.list import List
from efl.elementary.entry import Entry
from datetime import datetime, timedelta
api = {
"state" : 0, # What state we are testing
"cal" : None # box used in set_api_state
}
STATE_MARK_MONTHLY = 0
STATE_MARK_WEEKLY = 1
STATE_SUNDAY_HIGHLIGHT = 2
STATE_SELECT_DATE_DISABLED_WITH_MARKS = 3
STATE_SELECT_DATE_DISABLED_NO_MARKS = 4
API_STATE_LAST = 5
def set_api_state(api):
cal = api["cal"]
if not cal:
return
m = None
if api["state"] == STATE_MARK_MONTHLY:
cal.min_max_year = (2010, 2011)
the_time = datetime(2010, 12, 31)
m = cal.mark_add("checked", the_time, ELM_CALENDAR_MONTHLY)
cal.selected_time = the_time
elif api["state"] == STATE_MARK_WEEKLY:
the_time = datetime(2010, 12, 26)
if m is not None:
m.delete()
m = cal.mark_add("checked", the_time, ELM_CALENDAR_WEEKLY)
cal.selected_time = the_time
elif api["state"] == STATE_SUNDAY_HIGHLIGHT:
the_time = datetime(2010, 12, 25)
# elm_calendar_mark_del(m)
m = cal.mark_add("holiday", the_time, ELM_CALENDAR_WEEKLY)
cal.selected_time = the_time
elif api["state"] == STATE_SELECT_DATE_DISABLED_WITH_MARKS:
the_time = datetime(2011, 1, 1)
cal.select_mode = ELM_CALENDAR_SELECT_MODE_NONE
cal.selected_time = the_time
elif api["state"] == STATE_SELECT_DATE_DISABLED_NO_MARKS:
the_time = datetime(2011, 2, 1)
del cal.marks
cal.select_mode = ELM_CALENDAR_SELECT_MODE_NONE
cal.selected_time = the_time
elif api["state"] == API_STATE_LAST:
return
else:
return
def api_bt_clicked(bt, a):
print("clicked event on API Button: api_state=<%d>\n" % a["state"])
set_api_state(a)
a["state"] += 1
bt.text = "Next API function (%d)" % a["state"]
if a["state"] == API_STATE_LAST:
bt.disabled = True
# A simple test, just displaying calendar in it's default state
def calendar_clicked(obj, item=None):
win = StandardWindow("calendar", "Calendar", autodel=True)
bx = Box(win, size_hint_weight=EXPAND_BOTH)
win.resize_object_add(bx)
bx.show()
bt = Button(bx, text="Next API function")
bt.callback_clicked_add(api_bt_clicked, api)
bx.pack_end(bt)
if api["state"] == API_STATE_LAST:
bt.disabled = True
bt.show()
the_time = datetime(2010, 12, 31)
cal = Calendar(bx, first_day_of_week=ELM_DAY_MONDAY,
size_hint_weight=EXPAND_BOTH, selected_time=the_time,
min_max_year=(2010,2012))
api["cal"] = cal
bx.pack_end(cal)
cal.show()
win.show()
def print_cal_info(cal, en):
stm = cal.selected_time
if not stm:
return
interval = cal.interval
year_min, year_max = cal.min_max_year
sel_enabled = True if cal.select_mode != ELM_CALENDAR_SELECT_MODE_NONE else False
wds = cal.weekdays_names
info = (
" Day: %i, Mon: %i, Year %i, WeekDay: %i<br/>"
" Interval: %0.2f, Year_Min: %i, Year_Max %i, Sel Enabled : %s<br/>"
" Weekdays: %s, %s, %s, %s, %s, %s, %s<br/>" % (
stm.day, stm.month, stm.year, stm.weekday(),
interval, year_min, year_max, sel_enabled,
wds[0], wds[1], wds[2], wds[3], wds[4], wds[5], wds[6]
)
)
en.text = info
def print_cal_info_cb(obj, data):
print_cal_info(obj, data)
# def format_month_year(stm):
# return "%b %y" % stm
# A test intended to cover all the calendar api and much use cases as possible
def calendar2_clicked(obj, item=None):
weekdays = [
"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"
]
win = StandardWindow("calendar2", "Calendar 2", autodel=True)
bx = Box(win, size_hint_weight=EXPAND_BOTH)
win.resize_object_add(bx)
bx.show()
bxh = Box(bx, horizontal=True, size_hint_weight=EXPAND_BOTH,
size_hint_align=FILL_BOTH)
bxh.show()
bx.pack_end(bxh)
# Wide cal
cal = Calendar(bx, size_hint_weight=EXPAND_BOTH,
size_hint_align=FILL_BOTH, weekdays_names=weekdays,
first_day_of_week=ELM_DAY_SATURDAY, interval=0.4,
min_max_year=(2010, 2020))
cal.show()
bx.pack_end(cal)
# Top left cal
cal2 = Calendar(bxh, size_hint_weight=EXPAND_BOTH,
size_hint_align=FILL_BOTH, select_mode=ELM_CALENDAR_SELECT_MODE_NONE)
cal2.show()
bxh.pack_end(cal2)
# Top right cal
cal3 = Calendar(bxh, size_hint_weight=EXPAND_BOTH,
size_hint_align=FILL_BOTH)
selected_time = datetime.now() + timedelta(34)
cal3.selected_time = selected_time
selected_time = datetime.now() + timedelta(1)
cal3.mark_add("checked", selected_time, ELM_CALENDAR_UNIQUE)
del(cal3.marks)
selected_time = datetime.now()
cal3.mark_add("checked", selected_time, ELM_CALENDAR_DAILY)
cal3.mark_add("holiday", selected_time, ELM_CALENDAR_DAILY)
cal3.marks_draw()
cal3.show()
bxh.pack_end(cal3)
en = Entry(win, size_hint_weight=EXPAND_BOTH, size_hint_align=FILL_BOTH,
editable=False)
en.show()
bx.pack_end(en)
win.show()
cal3.min_max_year = (-1, -1)
# TODO: cal.format_function_set(format_month_year)
selected_time = datetime.now() + timedelta(4)
cal.mark_add("holiday", selected_time, ELM_CALENDAR_ANNUALLY)
selected_time = datetime.now() + timedelta(1)
cal.mark_add("checked", selected_time, ELM_CALENDAR_UNIQUE)
selected_time = datetime.now() - timedelta(363)
cal.mark_add("checked", selected_time, ELM_CALENDAR_MONTHLY)
selected_time = datetime.now() - timedelta(5)
mark = cal.mark_add("holiday", selected_time, ELM_CALENDAR_WEEKLY)
selected_time = datetime.now() + timedelta(1)
cal.mark_add("holiday", selected_time, ELM_CALENDAR_WEEKLY)
mark.delete()
cal.marks_draw()
print_cal_info(cal, en)
cal.callback_changed_add(print_cal_info_cb, en)
def calendar3_clicked(obj, item=None):
win = StandardWindow("calendar", "Calendar", autodel=True)
bxx = Box(win, size_hint_weight=EXPAND_BOTH)
win.resize_object_add(bxx)
bxx.show()
selected_time = datetime.now() + timedelta(34)
cal = Calendar(win, size_hint_weight=EXPAND_BOTH,
first_day_of_week=ELM_DAY_THURSDAY,
select_mode=ELM_CALENDAR_SELECT_MODE_ONDEMAND,
selected_time=selected_time)
bxx.pack_end(cal)
cal.show()
win.show()
if __name__ == "__main__":
win = StandardWindow("test", "python-elementary test application",
size=(320,520))
win.callback_delete_request_add(lambda o: elementary.exit())
box0 = Box(win, size_hint_weight=EXPAND_BOTH)
win.resize_object_add(box0)
box0.show()
lb = Label(win)
lb.text_set("Please select a test from the list below<br>"
"by clicking the test button to show the<br>"
"test window.")
lb.show()
fr = Frame(win, text="Information", content=lb)
box0.pack_end(fr)
fr.show()
items = [
("Calendar", calendar_clicked),
("Calendar 2", calendar2_clicked),
("Calendar 3", calendar3_clicked)
]
li = List(win, size_hint_weight=EXPAND_BOTH, size_hint_align=FILL_BOTH)
box0.pack_end(li)
li.show()
for item in items:
li.item_append(item[0], callback=item[1])
li.go()
win.show()
elementary.run()