def parse_button(self, bdef, button=None):
		"""
		Parses button definition from vdf file.
		Parameter can be either string, as used in v2, or dict used in v3.
		"""
		if type(bdef) == str:
			# V2
			return self.parse_action(bdef, button)
		elif type(bdef) == list:
			# V2
			return MultiAction.make(*[ self.parse_action(x, button) for x in bdef ])
		elif "activators" in bdef:
			# V3
			act_actions = []
			for k in ("full_press", "double_press", "long_press"):
				a = NoAction()
				if k in bdef["activators"]:
					# TODO: Handle multiple bindings
					bindings = ensure_list(bdef["activators"][k])[0]
					a = self.parse_action(bindings["bindings"]["binding"], button)
					a = VDFProfile.parse_modifiers(bindings, a, Profile.RIGHT)
					# holly...
				act_actions.append(a)
			normal, double, hold = act_actions
			if not double and not hold:
				return normal
			elif hold and not double:
				return HoldModifier(hold, normal)
			else:
				action = DoubleclickModifier(double, normal)
				action.holdaction = hold
				return action
		else:
			log.warning("Failed to parse button definition: %s" % (bdef,))
	def _make_action(self):
		""" Generates and returns Action instance """
		normalaction = self._save_modemod(0)
		holdaction = self._save_modemod(1)
		dblaction = self._save_modemod(2)
		if dblaction:
			action = DoubleclickModifier(dblaction, normalaction)
			action.holdaction = holdaction
		elif holdaction:
			action = HoldModifier(holdaction, normalaction)
		else:
			action = normalaction
		action.timeout = self.builder.get_object("adjTime").get_value()
		return action
Exemple #3
0
 def _make_action(self):
     """ Generates and returns Action instance """
     normalaction = self._save_modemod(0)
     holdaction = self._save_modemod(1)
     dblaction = self._save_modemod(2)
     if dblaction:
         action = DoubleclickModifier(dblaction, normalaction)
         action.holdaction = holdaction
     elif holdaction:
         action = HoldModifier(holdaction, normalaction)
     else:
         action = normalaction
     action.timeout = self.builder.get_object("adjTime").get_value()
     return action
Exemple #4
0
 def on_btOK_clicked(self, *a):
     """ Handler for OK button """
     action = self._save_modemod(0)
     hold_action = self._save_modemod(1)
     dbl_action = self._save_modemod(2)
     if hold_action:
         action = HoldModifier(hold_action, action)
         if dbl_action:
             action.action = dbl_action
     elif dbl_action:
         action = DoubleclickModifier(hold_action, action)
     print action.to_string(True, 4)
     if self.ac_callback is not None:
         self.ac_callback(self.id, action)
     self.close()
Exemple #5
0
    def _make_action(self):
        """ Generates and returns Action instance """
        cbHoldFeedback = self.builder.get_object("cbHoldFeedback")
        sclHoldFeedback = self.builder.get_object("sclHoldFeedback")
        normalaction = self._save_modemod(0)
        holdaction = self._save_modemod(1)
        dblaction = self._save_modemod(2)
        if dblaction:
            action = DoubleclickModifier(dblaction, normalaction)
            action.holdaction = holdaction
        elif holdaction:
            action = HoldModifier(holdaction, normalaction)
        else:
            action = normalaction
        action.timeout = self.builder.get_object("adjTime").get_value()

        if cbHoldFeedback.get_active():
            action = FeedbackModifier(HapticPos.BOTH,
                                      sclHoldFeedback.get_value(), action)

        return action
Exemple #6
0
	def from_json_data(self, data, key=None):
		"""
		Converts dict stored in profile file into action.
		
		May throw ParseError.
		"""
		if key is not None:
			# Don't fail if called for non-existent key, return NoAction instead.
			# Using this is sorter than
			# calling 'if button in data["buttons"]: ...' everywhere
			if key in data:
				return self.from_json_data(data[key], None)
			else:
				return NoAction()
		
		a = NoAction()
		if "action" in data:
			a = self.restart(data["action"]).parse() or NoAction()
		if "X" in data or "Y" in data:
			# "action" is ignored if either "X" or "Y" is there
			x = self.from_json_data(data["X"]) if "X" in data else NoAction()
			y = self.from_json_data(data["Y"]) if "Y" in data else NoAction()
			a = XYAction(x, y)
		if "deadzone" in data:
			lower = data["deadzone"]["lower"] if "lower" in data["deadzone"] else STICK_PAD_MIN
			upper = data["deadzone"]["upper"] if "upper" in data["deadzone"] else STICK_PAD_MAX
			a = DeadzoneModifier(lower, upper, a)
		if "sensitivity" in data:
			args = data["sensitivity"]
			args.append(a)
			a = SensitivityModifier(*args)
		if "feedback" in data:
			args = data["feedback"]
			if hasattr(HapticPos, args[0]):
				args[0] = getattr(HapticPos, args[0])
			args.append(a)
			a = FeedbackModifier(*args)
		if "osd" in data:
			a = OSDAction(a)
			if data["osd"] is not True:
				a.timeout = float(data["osd"])
		if "click" in data:
			a = ClickModifier(a)
		if "name" in data:
			a.name = data["name"]
		if "modes" in data:
			args = []
			for button in data['modes']:
				if hasattr(SCButtons, button):
					args += [ getattr(SCButtons, button), self.from_json_data(data['modes'][button]) ]
			if a:
				args += [ a ]
			a = ModeModifier(*args)
		if "doubleclick" in data:
			args = [ self.from_json_data(data['doubleclick']), a ]
			a = DoubleclickModifier(*args)
		if "hold" in data:
			if isinstance(a, DoubleclickModifier):
				a.holdaction = self.from_json_data(data['hold'])
			else:
				args = [ self.from_json_data(data['hold']), a ]
				a = HoldModifier(*args)
		return a