def _create_effect_controls(self, zone, effect_options): """ Groups all options with the "effect" type and present them as larger buttons. """ widgets = [] self.btn_grps[zone] = QButtonGroup() for effect in effect_options: fx_id = effect["id"] fx_params = effect["parameters"] fx_string = effect["label"] fx_active = effect["active"] fx_colours = effect["colours"] button = QToolButton() button.setText(fx_string) button.setCheckable(True) button.setIconSize(QSize(40, 40)) button.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) button.setIcon(QIcon(common.get_icon("options", fx_id))) button.setMinimumHeight(70) button.setMinimumWidth(70) button.effect = effect button.zone = zone self.btn_grps[zone].addButton(button) if fx_active: button.setChecked(True) widgets.append(button) def _clicked_effect_button(button): effect = button.effect zone = button.zone param_count = len(effect["parameters"]) option_id = effect["id"] option_data = None colour_hex = [] # Use saved colour, if available for this effect if len(effect["parameters"]) == 0: colour_hex = effect["colours"] # For effects with parameters, the second one will be used as the first may be 'random' or 'off'. if param_count > 0: if param_count == 1: param = effect["parameters"][0] elif param_count >= 2: param = effect["parameters"][1] option_data = param["data"] colour_hex = param["colours"] self.dbg.stdout("Setting effect {0} (data: {1}) on {2} device {3} (zone: {4}, colours: {5})".format(option_id, str(option_data), self.current_backend, self.current_uid, zone, str(colour_hex)), self.dbg.action, 1) response = self.middleman.set_device_state(self.current_backend, self.current_uid, self.current_serial, zone, option_id, option_data, colour_hex) self._event_check_response(response) self.reload_device() self.btn_grps[zone].buttonClicked.connect(_clicked_effect_button) if not widgets: return None return self.widgets.create_row_widget(self._("Effect"), widgets, wrap=True)