Skip to content

Instantly share code, notes, and snippets.

@knappador
Created September 4, 2014 01:47
Show Gist options
  • Save knappador/d48a4aff8765eabec271 to your computer and use it in GitHub Desktop.
Save knappador/d48a4aff8765eabec271 to your computer and use it in GitHub Desktop.
Property Multiplexer Example
class PropertyMultiplexer(EventDispatcher):
select = ListProperty()
def __init__(self, rule_sets, **kwargs):
super(PropertyMultiplexer, self).__init__(**kwargs)
self.rule_sets = rule_sets
default = rule_sets.default
# there must be a default in rule_sets and it
# must define a default for each possible property
for r, v in default.iteritems():
self.create_property(r)
setattr(self, r, v)
def on_select(self, instance, keys):
rsets = self.rule_sets
rules = dict(rsets.default)
# Merge from less specific to most specific
key = None
for k in keys:
if key is not None:
key = key + '_' + k
else:
key = k
rule_set = getattr(rsets, key, None)
if rule_set:
rules.update(rule_set)
for r, v in rules.iteritems():
setattr(self, r, v)
# because of button bar, many 1.6 devices will up less than 1.6 in
# portrait and more than 1.6 in landscape
LANDSCAPE_ASPECT_RATIO_CUTOFF = 1.7
PORTRAIT_ASPECT_RATIO_CUTOFF = 1.6
# this will cut off slightly over galaxy note
# physical screen major dimension, 4.49in
TABLET_SIZE_CUTOFF = 4.75
class LayoutMux(PropertyMultiplexer):
def __init__(self, **kwargs):
super(LayoutMux, self).__init__(**kwargs)
Window.bind(size=self.detect)
self.detect(Window, Window.size)
def detect(self, win, size):
w, h = map(float, size)
ratio = h / w
portrait = ratio > 1.
if portrait:
aspect = h / w
major = h / Metrics.dpi
tall = aspect > LANDSCAPE_ASPECT_RATIO_CUTOFF
else:
aspect = w / h
major = w / Metrics.dpi
tall = aspect > PORTRAIT_ASPECT_RATIO_CUTOFF
tablet = major > TABLET_SIZE_CUTOFF
orientation = 'portrait' if portrait else 'landscape'
aspect = 'tall' if tall else 'short'
size = 'tablet' if tablet else 'phone'
select = (orientation, aspect, size)
if select != self.select:
Logger.debug('portrait: {}, tall: {}, tablet: {}'.format(
orientation, aspect, size)
)
self.select = select
@devinvenable
Copy link

Nice and clean. :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment