class UpdatesTab(BaseTab, ThreadedObject): title = "Updates" image = "toolbarScriptReload" identifier = "updates" def setup(self): self.list = UpdateList((20, 20, -20, -60), editCallback=self.update_interface, refreshCallback=self.update_interface) self.updated_at_text = UpdatedTimeTextBox((120, -38, -20, 20), sizeStyle="small") self.update_button = UpdateButton((-160, -42, 140, 20), callback=self.in_thread.install_updates) self.refresh_button = Button((20, -42, 90, 20), "Refresh", callback=self.in_thread.update_list) if env.environment == 'production': self.refresh_button.show(False) self.update_interface() def activate(self): self.set_default_button(self.update_button) self.in_thread.update_list() @progress.each('installable') @progress.tick('repositoryWillDownload', 'Downloading {repository.repo}') @progress.tick('extensionWillInstall', 'Installing {extension.bundle.name}') def install_updates(self, sender=None): for extension in self.installable: extension.update() self.update_list(force=True) def update_list(self, force=False): if self.list.is_refreshing: return None try: self.update_progress = Overlay("Checking for updates...", (20, 20, -20, -60), opacity=0.6, offset=90) self.refresh_button.enable(False) self.list.refresh(force=force) self.enable() except UpdateList.ConnectionError: self.disable("Couldn't connect to the internet...") finally: del self.update_progress self.refresh_button.enable(True) def update_interface(self, sender=None): self.updated_at_text.update() self.update_button.update(len(self.list.selected)) def disable(self, *args, **kwargs): self.list.enable(False) super(UpdatesTab, self).disable(*args, **kwargs) def enable(self, *args, **kwargs): self.list.enable(True) super(UpdatesTab, self).enable(*args, **kwargs) @property def installable(self): return self.list.selected
class SliderGroup(Group): _callback = weakrefCallbackProperty() def __init__(self, width, sliderInfo, continuous=True, callback=None): super().__init__((0, 0, width, 0)) self._callback = callback self._continuous = continuous self._tags = [] self.setSliderInfo(sliderInfo) def _breakCycles(self): self._callback = None super()._breakCycles() def setSliderInfo(self, sliderInfo): savedState = self.get() # clear all subviews for attr, value in list(self.__dict__.items()): if isinstance(value, VanillaBaseObject): delattr(self, attr) margin = 10 y = margin self._tags = [] self._defaultValues = {} for tag, (label, minValue, defaultValue, maxValue) in sliderInfo.items(): self._tags.append(tag) self._defaultValues[tag] = defaultValue attrName = f"slider_{tag}" slider = SliderPlus((margin, y, -margin, 40), label, minValue, defaultValue, maxValue, continuous=self._continuous, callback=self._sliderChanged) setattr(self, attrName, slider) y += 50 self.resetAllButton = Button((10, y, 120, 25), "Reset all axes", self._resetAllButtonCallback) self.resetAllButton.enable(False) y += 35 posSize = (0, 0, self.getPosSize()[2], y) self.setPosSize(posSize) self._updateState(savedState) def _sliderChanged(self, sender): self.resetAllButton.enable(True) callCallback(self._callback, self) def _resetAllButtonCallback(self, sender): self.resetAllButton.enable(False) for tag in self._tags: attrName = f"slider_{tag}" slider = getattr(self, attrName) slider.set(self._defaultValues[tag]) callCallback(self._callback, self) def get(self): state = {} for tag in self._tags: attrName = f"slider_{tag}" slider = getattr(self, attrName) value = slider.get() if value is not None: if len(self._defaultValues[tag] ) != 1 or value not in self._defaultValues[tag]: state[tag] = value return state def _updateState(self, state): for tag, value in state.items(): attrName = f"slider_{tag}" slider = getattr(self, attrName, None) if slider is not None: slider.set(value) def set(self, state): if state: self.resetAllButton.enable(True) for tag in self._tags: attrName = f"slider_{tag}" slider = getattr(self, attrName) value = state.get(tag) if value is None: value = self._defaultValues[tag] slider.set(value)
class UpdatesTab(BaseTab, ThreadedObject): title = "Updates" image = "toolbarScriptReload" identifier = "updates" max_tab_size = (500, 10000) def setup(self): self.list = UpdateList((20, 20, -20, -60), editCallback=self.update_interface, refreshCallback=self.update_interface) self.updated_at_text = UpdatedTimeTextBox((120, -38, -20, 20), sizeStyle="small") self.update_button = UpdateButton( (-160, -42, 140, 20), callback=self.in_thread.install_updates) self.refresh_button = Button((20, -42, 90, 20), "Refresh", callback=self.in_thread.update_list) if env.environment == 'production': self.refresh_button.show(False) self.update_interface() def activate(self): self.set_default_button(self.update_button) self.in_thread.update_list() @progress.each('installable') @progress.tick('repositoryWillDownload', 'Downloading {repository.repo}') @progress.tick('extensionWillInstall', 'Installing {extension.bundle.name}') def install_updates(self, sender=None): for extension in self.installable: extension.update() self.update_list(force=True) def update_list(self, force=False): if self.list.is_refreshing: return None try: self.update_progress = Overlay("Checking for updates...", (20, 20, -20, -60), opacity=0.6, offset=90) self.refresh_button.enable(False) self.list.refresh(force=force) self.enable() except UpdateList.ConnectionError: self.disable("Couldn't connect to the internet...") finally: del self.update_progress self.refresh_button.enable(True) def update_interface(self, sender=None): self.updated_at_text.update() self.update_button.update(len(self.list.selected)) def disable(self, *args, **kwargs): self.list.enable(False) super(UpdatesTab, self).disable(*args, **kwargs) def enable(self, *args, **kwargs): self.list.enable(True) super(UpdatesTab, self).enable(*args, **kwargs) @property def installable(self): return self.list.selected