110 lines
3.2 KiB
Python
110 lines
3.2 KiB
Python
|
""" library to display icons
|
||
|
|
||
|
http://glyph.smarticons.co/
|
||
|
"""
|
||
|
|
||
|
___license___ = "MIT"
|
||
|
___dependencies___ = ["ospath", "shared/icons/unknown.gif", "buttons"]
|
||
|
|
||
|
import ugfx, ospath
|
||
|
|
||
|
_icon_size = 50;
|
||
|
_half_icon_size = _icon_size // 2
|
||
|
_padding = 5
|
||
|
_padded_size = _icon_size + _padding * 2
|
||
|
_text_height = 30
|
||
|
|
||
|
_icon_container_style = ugfx.Style()
|
||
|
_icon_container_style.set_disabled([ugfx.BLACK, ugfx.WHITE, ugfx.WHITE, ugfx.RED])
|
||
|
_icon_container_style.set_enabled([ugfx.BLACK, ugfx.RED, ugfx.WHITE, ugfx.RED])
|
||
|
#_icon_container_style.set_background(ugfx.html_color(ugfx.WHITE))
|
||
|
|
||
|
class Icon:
|
||
|
def __init__(self, x, y, title, path_to_icon = None):
|
||
|
if path_to_icon == None or not ospath.isfile(path_to_icon):
|
||
|
path_to_icon = "shared/icons/unknown.gif"
|
||
|
self._selected = False
|
||
|
self._init_container(x, y, title, path_to_icon)
|
||
|
|
||
|
|
||
|
def _init_container(self, x, y, title, path_to_icon):
|
||
|
self.container = ugfx.Container(
|
||
|
x - _half_icon_size - _padding, y - _half_icon_size - _padding,
|
||
|
_padded_size, _padded_size + _text_height,
|
||
|
style=_icon_container_style
|
||
|
)
|
||
|
|
||
|
#This doesn't work reliably at the moment
|
||
|
#ugfx.Imagebox(
|
||
|
# _padding - 2, _padding - 2,
|
||
|
# _icon_size, _icon_size,
|
||
|
# parent=self.container, text=path_to_icon
|
||
|
#)
|
||
|
|
||
|
self.label = ugfx.Label(
|
||
|
0, _padded_size,
|
||
|
_padded_size, _text_height,
|
||
|
title, parent=self.container, justification=ugfx.Label.CENTERTOP
|
||
|
)
|
||
|
|
||
|
self.container.enabled(self._selected)
|
||
|
|
||
|
def show(self):
|
||
|
self.container.show()
|
||
|
self.refresh_image()
|
||
|
|
||
|
def refresh_image(self):
|
||
|
self.container.area(_padding, _padding, _icon_size, _icon_size, ugfx.BLACK)
|
||
|
|
||
|
@property
|
||
|
def selected(self):
|
||
|
return self._selected
|
||
|
|
||
|
@selected.setter
|
||
|
def selected(self, value):
|
||
|
self._selected = value
|
||
|
self.container.enabled(value)
|
||
|
self.refresh_image()
|
||
|
|
||
|
def __del__(self):
|
||
|
self.label.destroy()
|
||
|
self.container.destroy()
|
||
|
|
||
|
def chunks(l, n):
|
||
|
"""Yield successive n-sized chunks from l."""
|
||
|
for i in range(0, len(l), n):
|
||
|
yield l[i:i + n]
|
||
|
|
||
|
class IconGrid:
|
||
|
def __init__(self, x, y, items, controls):
|
||
|
self._x = x
|
||
|
self._y = y
|
||
|
self._pages = list(chunks(items, 9))
|
||
|
self._current_page_index = 0
|
||
|
self._current_cursor_x = 0
|
||
|
self._current_cursor_y = 0
|
||
|
self._last_state = None
|
||
|
self._refresh_page()
|
||
|
|
||
|
def _refresh_page(self):
|
||
|
state = (self._current_page_index, self._current_cursor_x, self._current_cursor_y)
|
||
|
if self._last_state == state:
|
||
|
return # nothing to do
|
||
|
self._last_state = state
|
||
|
|
||
|
self._current_icons = []
|
||
|
for i, item in enumerate(self._pages[self._current_page_index]):
|
||
|
x = i % 3
|
||
|
y = i // 3
|
||
|
icon = Icon(
|
||
|
self._x + x * 60 + 30, self._y + y * 90 + 30,
|
||
|
item['title'], item.get('icon', None)
|
||
|
)
|
||
|
icon.selected = (x == self._current_cursor_x) and (y == self._current_cursor_y)
|
||
|
icon.show()
|
||
|
self._current_icons.append(icon)
|
||
|
|
||
|
def __del__(self):
|
||
|
del self._current_icons
|
||
|
|