Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_menus(self):
"""
Tests if all Menu*Actions are parsed correctly from json.
"""
for cls in MENU_CLASSES:
a_str = "%s('some.menu', LEFT, X, Y, True)" % (cls.COMMAND,)
a = parser.from_json_data({ 'action' : a_str })
assert isinstance(a, cls)
assert a.control_with == HapticPos.LEFT
assert a.confirm_with == SCButtons.X
assert a.cancel_with == SCButtons.Y
assert a.show_with_release == True
def _parse_config(self, config):
self._button_map = {}
self._axis_map = {}
self._dpad_map = {}
self._calibrations = {}
for x, value in config.get("buttons", {}).iteritems():
try:
keycode = int(x)
if value in TRIGGERS:
self._axis_map[keycode] = value
else:
sc = getattr(SCButtons, value)
self._button_map[keycode] = sc
except: pass
for x, value in config.get("axes", {}).iteritems():
code, axis = int(x), value.get("axis")
if axis in EvdevControllerInput._fields:
self._calibrations[code] = parse_axis(value)
self._axis_map[code] = axis
for x, value in config.get("dpads", {}).iteritems():
code, axis = int(x), value.get("axis")
if axis in EvdevControllerInput._fields:
self._calibrations[code] = parse_axis(value)
self._dpad_map[code] = value.get("positive", False)
self._axis_map[code] = axis
if self._controller.get_flags() & ControllerFlags.NO_GRIPS == 0:
add_button(l_lines, SCButtons.LGRIP)
add_button(r_lines, SCButtons.RGRIP)
add_action(l_lines, SCButtons.LT, self.profile.triggers[LEFT])
add_action(r_lines, SCButtons.RT, self.profile.triggers[RIGHT])
for b in (SCButtons.LB, SCButtons.Y, SCButtons.X):
add_button(l_lines, b)
for b in (SCButtons.RB, SCButtons.B, SCButtons.A):
add_button(r_lines, b)
if self._controller.get_flags() & ControllerFlags.HAS_CPAD != 0:
for lst in (l_lines, r_lines):
while len(lst) > 3: lst.pop()
while len(lst) < 3: lst.append((None, ""))
add_action(r_lines, CPAD, self.profile.pads[CPAD])
add_action(l_lines, SCButtons.STICKPRESS, self.profile.stick)
self.background.set_help(l_lines, r_lines)
def __init__(self, editor, profile):
background = SVGEditor.get_element(editor, "background")
self.label_template = SVGEditor.get_element(editor, "label_template")
self.line_height = int(float(self.label_template.attrib.get("height") or 8))
self.char_width = int(float(self.label_template.attrib.get("width") or 8))
self.full_width = int(float(background.attrib.get("width") or 800))
self.full_height = int(float(background.attrib.get("height") or 800))
boxes = []
box_bcs = Box(0, self.PADDING, Align.TOP, "bcs")
box_bcs.add("BACK", Action.AC_BUTTON, profile.buttons.get(SCButtons.BACK))
box_bcs.add("C", Action.AC_BUTTON, profile.buttons.get(SCButtons.C))
box_bcs.add("START", Action.AC_BUTTON, profile.buttons.get(SCButtons.START))
boxes.append(box_bcs)
box_left = Box(self.PADDING, self.PADDING, Align.LEFT | Align.TOP, "left",
min_height = self.full_height * 0.5,
min_width = self.full_width * 0.2,
max_width = self.full_width * 0.275
)
box_left.add("LEFT", Action.AC_TRIGGER, profile.triggers.get(profile.LEFT))
box_left.add("LB", Action.AC_BUTTON, profile.buttons.get(SCButtons.LB))
box_left.add("LGRIP", Action.AC_BUTTON, profile.buttons.get(SCButtons.LGRIP))
box_left.add("LPAD", Action.AC_PAD, profile.pads.get(profile.LEFT))
boxes.append(box_left)
if not c:
# Nothing set to C button
self.buttons[SCButtons.C] = HoldModifier(
MenuAction("Default.menu"),
normalaction = MenuAction("Default.menu")
)
elif hasattr(c, "holdaction") and c.holdaction:
# Already set to something, don't overwrite it
pass
elif c.to_string().startswith("OSK."):
# Special case, don't touch this either
pass
else:
self.buttons[SCButtons.C] = HoldModifier(
MenuAction("Default.menu"),
normalaction = self.buttons[SCButtons.C]
)
if from_version < 1.1:
# Convert old scrolling wheel to new representation
from scc.modifiers import FeedbackModifier, BallModifier
from scc.actions import MouseAction, XYAction
from scc.uinput import Rels
iswheelaction = ( lambda x : isinstance(x, MouseAction) and
x.parameters[0] in (Rels.REL_HWHEEL, Rels.REL_WHEEL) )
for p in (Profile.LEFT, Profile.RIGHT):
a, feedback = self.pads[p], None
if isinstance(a, FeedbackModifier):
feedback = a.haptic.get_position()
a = a.action
if isinstance(a, XYAction):
if iswheelaction(a.x) or iswheelaction(a.y):
n = BallModifier(XYAction(a.x, a.y))
def on_background_area_click(self, trash, area):
if area in [ x.name for x in BUTTONS ]:
self.hint(None)
self.show_editor(getattr(SCButtons, area))
elif area in TRIGGERS + STICKS + PADS:
self.hint(None)
self.show_editor(area)
if event.value:
if self._dpad_map[event.code]:
# Positive
value = STICK_PAD_MAX
else:
value = STICK_PAD_MIN
cal = self._calibrations[event.code]
value = int(value * cal.scale * STICK_PAD_MAX)
else:
value = 0
axis = self._axis_map[event.code]
if not new_state.buttons & SCButtons.LPADTOUCH and axis in ("lpad_x", "lpad_y"):
b = new_state.buttons | SCButtons.LPAD | SCButtons.LPADTOUCH
need_cancel_padpressemu = True
new_state = new_state._replace(buttons=b, **{ axis : value })
elif not new_state.buttons & SCButtons.RPADTOUCH and axis in ("rpad_x", "rpad_y"):
b = new_state.buttons | SCButtons.RPADTOUCH
need_cancel_padpressemu = True
new_state = new_state._replace(buttons=b, **{ axis : value })
else:
new_state = new_state._replace(**{ axis : value })
elif event.type == ecodes.EV_KEY and event.code in self._button_map:
if event.value:
b = new_state.buttons | self._button_map[event.code]
new_state = new_state._replace(buttons=b)
else:
b = new_state.buttons & ~self._button_map[event.code]
new_state = new_state._replace(buttons=b)
elif event.type == ecodes.EV_KEY and event.code in self._axis_map:
axis = self._axis_map[event.code]
if event.value:
new_state = new_state._replace(**{ axis : TRIGGER_MAX })
def set_action(self, profile, id, action):
"""
Stores action in profile.
Returns formely stored action.
"""
before = NoAction()
if id == SCButtons.STICKPRESS and Profile.STICK in self.button_widgets:
before, profile.buttons[id] = profile.buttons[id], action
self.button_widgets[Profile.STICK].update()
elif id == SCButtons.CPADPRESS and Profile.CPAD in self.button_widgets:
before, profile.buttons[id] = profile.buttons[id], action
self.button_widgets[Profile.CPAD].update()
elif id in PRESSABLE:
before, profile.buttons[id] = profile.buttons[id], action
self.button_widgets[id.name].update()
elif id in BUTTONS:
before, profile.buttons[id] = profile.buttons[id], action
self.button_widgets[id].update()
elif id in TRIGGERS:
# TODO: Use LT and RT in profile as well
side = LEFT if id == "LT" else RIGHT
before, profile.triggers[side] = profile.triggers[side], action
self.button_widgets[id].update()
elif id in GYROS:
before, profile.gyro = profile.gyro, action
self.button_widgets[id].update()
def pressing_pad_clicks(self):
"""
Returns True if currently edited pad is set to press left mouse
button when pressed.
(yes, this is used somewhere)
"""
side = getattr(SCButtons, self.editor.get_id())
c_action = self.app.current.buttons[side]
if isinstance(c_action, ButtonAction):
return c_action.button == Keys.BTN_LEFT
return False
from gi.repository import Gtk, Gdk, GLib
import os, logging
log = logging.getLogger("ModeshiftEditor")
class ModeshiftEditor(Editor):
GLADE = "modeshift_editor.glade"
BUTTONS = ( # in order as displayed in combobox
(SCButtons.A, _('A') ),
(SCButtons.B, _('B') ),
(SCButtons.X, _('X') ),
(SCButtons.Y, _('Y') ),
(None, None),
(SCButtons.BACK, _('Back (select)') ),
(SCButtons.C, _('Center') ),
(SCButtons.START, _('Start') ),
(None, None),
(SCButtons.LGRIP, _('Left Grip') ),
(SCButtons.RGRIP, _('Right Grip') ),
(SCButtons.LB, _('Left Bumper') ),
(SCButtons.RB, _('Right Bumper') ),
(None, None),
(SCButtons.LT, _('Left Trigger (full)') ),
(SCButtons.RT, _('Right Trigger (full)') ),
("Soft LT", _('Left Trigger (soft)') ),
("Soft RT", _('Right Trigger (soft)') ),
(None, None),
(SCButtons.STICKPRESS, _('Stick Pressed') ),
(SCButtons.LPAD, _('Left Pad Pressed') ),
(SCButtons.RPAD, _('Right Pad Pressed') ),
(SCButtons.LPADTOUCH, _('Left Pad Touched') ),
(SCButtons.RPADTOUCH, _('Right Pad Touched') ),