themes_icon_view.py
''' | |
Pythonista Forum - @Phuket2 | |
''' | |
import ui, editor, bz2, base64 | |
#_pyui_file_name = 'booking.pyui' | |
__pyui_str__ =''' | |
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 | |
''' | |
from collections import deque | |
class ViewWalker(object): | |
# JonB | |
'''simple iterator for ui.View objects, capable of depth or breadth first traversal''' | |
def __init__(self,v,breadthfirst=False): | |
self._dq=deque([v]) | |
self._breadth=breadthfirst | |
def __iter__(self): | |
'''required for iterator objects''' | |
return self | |
def __next__(self): | |
'''required for iterator objects. raise stopiteration once the queue is empty. ''' | |
if not self._dq: | |
raise StopIteration | |
#pop next view... | |
if self._breadth: | |
v=self._dq.popleft()# oldest entry (FIFO) | |
else: | |
v=self._dq.pop() # newest entry (stack) | |
#then push its subviews | |
if hasattr(v,'subviews'): | |
self._dq.extend(v.subviews) | |
return v | |
def sub_view_objects(self, breadthfirst = False): | |
self._breadth=breadthfirst | |
return [s for s in self] | |
def sub_view_names(self, breadthfirst = False): | |
self._breadth=breadthfirst | |
return [s.name for s in self] | |
def pyui_decode(str): | |
s = bz2.decompress(base64.b64decode(str)) | |
return s.decode('utf-8') | |
def WrapInstance(obj): | |
class Wrapper(obj.__class__): | |
def __new__(cls): | |
return obj | |
return Wrapper | |
class ThemeViewer(ui.View): | |
def __init__(self, pyui_str , theme, *args, **kwargs): | |
#ui.load_view(_pyui_file_name, | |
#bindings={'MyClass': WrapInstance(self), 'self': self}) | |
ui.load_view_str(pyui_str, bindings={'MyClass': WrapInstance(self), 'self': self}) | |
super().__init__(*args, **kwargs) | |
self.tc = None | |
self.set_tint_color_cheat(theme) | |
self.theme = theme | |
self.border_width=.5 | |
self.corner_radius = 6 | |
self.border_color='darkgray' | |
self.update_view() | |
def update_view(self): | |
self['lb_theme'].border_color = 'darkgray' | |
self['lb_theme'].text = self.theme | |
# attempt to set all subviews border color to the correct | |
# tint color.only shown on obects that have a border_width set | |
for sv in ViewWalker(self).sub_view_objects(): | |
sv.border_color = self.tc | |
def reset_theme(self, sender): | |
#print('in, reset_theme') | |
self.theme = sender.title | |
self.set_tint_color_cheat(self.theme) | |
editor.apply_ui_theme(self, theme_name = sender.title) | |
self.update_view() | |
def set_tint_color_cheat(self, theme): | |
# maybe this is a screw up.... | |
#return | |
btn = ui.Button() | |
editor.apply_ui_theme(btn, theme_name = theme) | |
self.tc = btn.tint_color | |
def take_screenshot(self): | |
# take a screenshot of the ui.View.bounds | |
with ui.ImageContext(self.width, self.height) as ctx: | |
self.draw_snapshot() | |
return ctx.get_image() | |
if __name__ == '__main__': | |
# initial theme | |
theme = 'Cool Glow' | |
# decode the pyui str | |
pyui_str = pyui_decode(__pyui_str__) | |
tv = ThemeViewer(theme = theme , pyui_str = pyui_str) | |
editor.present_themed(tv, theme_name=theme, style='sheet', animated=False) | |
# take a screen shot of the view, could be used to create thumbnail | |
# images for example... | |
img = tv.take_screenshot() | |
# show the image in the console | |
img.show() | |
# write the snapshot to a png file | |
bytes = img.to_png() | |
with open(theme + '.png', 'wb') as file: | |
file.write(bytes) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment