Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def _split(action):
"""
Splits passed action so it can be displayed in UI.
Returns (sucess, half, full, analog), with three actions
for each UI element.
Note that each returned action may be TriggerAction.
If passed action cannot be decoded,
'sucess' element of tuple is set to False
"""
half, full, analog = NoAction(), NoAction(), NoAction()
actions = action.actions if isinstance(action, MultiAction) else [ action ]
for a in actions:
effective = TriggerComponent._strip_trigger(a).strip()
if isinstance(effective, AxisAction):
if analog:
# UI can do only one analog action per trigger
return False, half, full, analog
analog = a
elif isinstance(effective, MouseAction):
if analog:
# UI can do only one analog action per trigger
return False, half, full, analog
analog = a
elif isinstance(a, TriggerAction):
if full and half:
# UI can handle only one full and
# one half-press action
return False, half, full, analog
if a.release_level == TRIGGER_MAX:
if full and a.press_level < full.press_level:
def _split(action):
"""
Splits passed action so it can be displayed in UI.
Returns (sucess, half, full, analog), with three actions
for each UI element.
Note that each returned action may be TriggerAction.
If passed action cannot be decoded,
'sucess' element of tuple is set to False
"""
half, full, analog = NoAction(), NoAction(), NoAction()
actions = action.actions if isinstance(action, MultiAction) else [ action ]
for a in actions:
effective = TriggerComponent._strip_trigger(a).strip()
if isinstance(effective, AxisAction):
if analog:
# UI can do only one analog action per trigger
return False, half, full, analog
analog = a
elif isinstance(effective, MouseAction):
if analog:
# UI can do only one analog action per trigger
return False, half, full, analog
analog = a
elif isinstance(a, TriggerAction):
if full and half:
# UI can handle only one full and
# one half-press action
return False, half, full, analog
if a.release_level == TRIGGER_MAX:
if full and a.press_level < full.press_level:
def add(self, mapper, dx, dy):
""" Called from BallModifier """
self.axis(mapper, clamp(STICK_PAD_MIN, dx, STICK_PAD_MAX), None)
def trigger(self, mapper, position, old_position):
p = float(position * self.speed - TRIGGER_MIN) / (TRIGGER_MAX - TRIGGER_MIN)
p = int((p * (self.max - self.min)) + self.min)
p = AxisAction.clamp_axis(self.id, p)
AxisAction.old_positions[self.id] = p
mapper.gamepad.axisEvent(self.id, p)
mapper.syn_list.add(mapper.gamepad)
class RAxisAction(AxisAction):
""" Reversed AxisAction (outputs reversed values) """
COMMAND = "raxis"
def __init__(self, id, min = None, max = None):
AxisAction.__init__(self, id, min, max)
self.min, self.max = self.max, self.min
def describe(self, context):
if self.name: return self.name
axis, neg, pos = AxisAction.get_axis_description(self.id)
if context in (Action.AC_STICK, Action.AC_PAD):
xy = "X" if self.parameters[0] in AxisAction.X else "Y"
return _("%s %s (reversed)") % (axis, xy)
return _("Reverse %s Axis") % (axis,)
def get_compatible_modifiers(self):
mods = ( Action.MOD_FEEDBACK | Action.MOD_SENSITIVITY
| Action.MOD_ROTATE | Action.MOD_SMOOTH
| self.x.get_compatible_modifiers()
| self.y.get_compatible_modifiers()
)
if isinstance(self.x, AxisAction) and isinstance(self.y, AxisAction):
if self.x.get_axis() in (Axes.ABS_X, Axes.ABS_Y, Axes.ABS_RX, Axes.ABS_RY):
mods = (mods | Action.MOD_BALL) & ~Action.MOD_SMOOTH
return mods
def handles(self, mode, action):
# Handles ButtonAction and MultiAction if all subactions are ButtonAction
if isinstance(action, (ButtonAction, NoAction, InvalidAction)):
return True
if isinstance(action, AxisAction):
return len(action.parameters) == 1
if isinstance(action, MouseAction):
if action.mouse_axis == Rels.REL_WHEEL:
return True
if isinstance(action, MultiAction):
if len(action.actions) > 0:
for a in action.actions:
if not isinstance(a, ButtonAction):
return False
return True
return False
def describe(self, context):
if self.name: return self.name
rv = []
if isinstance(self.x, AxisAction) and isinstance(self.y, AxisAction):
if (self.x.id, self.y.id) in AxisAction.AXES_PAIRS:
# Special cases for default stick bindings
desc, trash, trash = AxisAction.get_axis_description(self.x.id)
return desc
if self.x: rv.append(self.x.describe(context))
if self.y: rv.append(self.y.describe(context))
if context in (Action.AC_STICK, Action.AC_PAD):
return "\n".join(rv)
return " ".join(rv)
def on_btAnalog_clicked(self, *a):
""" 'Analog Output' handler """
b = SimpleChooser(self.app, "axis", lambda action: self.on_action_chosen("analog", action) )
b.set_title(_("Select Analog Axis"))
b.display_action(Action.AC_STICK, AxisAction(self.analog))
b.show(self.editor.window)
action = DPadAction(*keys)
elif mode == "four_buttons":
keys = []
for k in ("button_y", "button_a", "button_x", "button_b"):
if k in inputs:
keys.append(self.parse_button(inputs[k]))
else:
keys.append(NoAction())
action = DPadAction(*keys)
elif mode == "joystick_move":
if side == Profile.LEFT:
# Left
action = XYAction(AxisAction(Axes.ABS_X), AxisAction(Axes.ABS_Y))
else:
# Right
action = XYAction(AxisAction(Axes.ABS_RX), AxisAction(Axes.ABS_RY))
elif mode == "joystick_camera":
output_joystick = 0
if 'output_joystick' in settings:
output_joystick = int(settings['output_joystick'])
if output_joystick == 0:
action = BallModifier(XYAction(AxisAction(Axes.ABS_X), AxisAction(Axes.ABS_Y)))
elif output_joystick == 1:
action = BallModifier(XYAction(AxisAction(Axes.ABS_RX), AxisAction(Axes.ABS_RY)))
else:
# TODO: Absolute mouse? Doesn't seems to do anything in Steam
action = BallModifier(SensitivityModifier(0.1, 0.1, MouseAction()))
elif mode == "mouse_joystick":
action = BallModifier(XYAction(AxisAction(Axes.ABS_RX), AxisAction(Axes.ABS_RY)))
elif mode == "scrollwheel":
action = BallModifier(XYAction(MouseAction(Rels.REL_HWHEEL), MouseAction(Rels.REL_WHEEL)))
elif mode == "touch_menu":
def describe(self, context):
if self.name: return self.name
axis, neg, pos = AxisAction.get_axis_description(self.id)
if context == Action.AC_BUTTON:
for x in self.parameters:
if type(x) in (int, float):
if x > 0:
return "%s %s" % (axis, pos)
if x < 0:
return "%s %s" % (axis, neg)
if context in (Action.AC_TRIGGER, Action.AC_STICK, Action.AC_PAD):
if self.id in AxisAction.Z: # Trigger
return axis
else:
xy = "X" if self.id in AxisAction.X else "Y"
return "%s %s" % (axis, xy)
return axis
def handles(self, mode, action):
if isinstance(action, MultiAction) and len(action.actions) == 2:
# Handles combination of axis + button on fully pressed trigger
if not isinstance(action.actions[0], ButtonAction):
return False
action = action.actions[1]
return isinstance(action, (AxisAction, MouseAction))