class Pallet(StackLayout): """Many :class:`SwatchButton`, gathered from an :class:`kivy.atlas.Atlas`.""" atlas = ObjectProperty() """:class:`kivy.atlas.Atlas` object I'll make :class:`SwatchButton` from.""" filename = StringProperty() """Path to an atlas; will construct :class:`kivy.atlas.Atlas` when set""" swatches = DictProperty({}) """:class:`SwatchButton` widgets here, keyed by name of their graphic""" swatch_width = NumericProperty(100) """Width of each and every :class:`SwatchButton` here""" swatch_height = NumericProperty(75) """Height of each and every :class:`SwatchButton` here""" swatch_size = ReferenceListProperty(swatch_width, swatch_height) """Size of each and every :class:`SwatchButton` here""" selection = ListProperty([]) """List of :class:`SwatchButton`s that are selected""" selection_mode = OptionProperty('single', options=['single', 'multiple']) """Whether to allow only a 'single' selected :class:`SwatchButton` (default), or 'multiple'""" def on_selection(self, *args): Logger.debug('Pallet: {} got selection {}'.format( self.filename, self.selection)) def on_filename(self, *args): if not self.filename: return resource = resource_find(self.filename) if not resource: raise ValueError("Couldn't find atlas: {}".format(self.filename)) self.atlas = Atlas(resource) def on_atlas(self, *args): if self.atlas is None: return self.upd_textures() self.atlas.bind(textures=self.upd_textures) def upd_textures(self, *args): """Create one :class:`SwatchButton` for each texture""" if self.canvas is None: Clock.schedule_once(self.upd_textures, 0) return for name in list(self.swatches.keys()): if name not in self.atlas.textures: self.remove_widget(self.swatches[name]) del self.swatches[name] for (name, tex) in self.atlas.textures.items(): if name in self.swatches and self.swatches[name] != tex: self.remove_widget(self.swatches[name]) if name not in self.swatches or self.swatches[name] != tex: self.swatches[name] = SwatchButton(name=name, tex=tex, size_hint=(None, None), size=self.swatch_size) self.add_widget(self.swatches[name])