diff --git a/Devices/Push/__init__.py b/Devices/Push/__init__.py index 7ae10c2..0429ae2 100644 --- a/Devices/Push/__init__.py +++ b/Devices/Push/__init__.py @@ -1,27 +1,35 @@ -# Embedded file name: /Users/versonator/Jenkins/live/output/mac_64_static/Release/python-bundle/MIDI Remote Scripts/Push/__init__.py -from __future__ import absolute_import, print_function -from ableton.v2.control_surface.capabilities import controller_id, inport, outport, AUTO_LOAD_KEY, CONTROLLER_ID_KEY, FIRMWARE_KEY, HIDDEN, NOTES_CC, PORTS_KEY, SCRIPT, SYNC, TYPE_KEY -from .firmware_handling import get_provided_firmware_version -from .push import Push - -from Ubermap import UbermapDevicesPatches - -def get_capabilities(): - return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[21], model_name='Ableton Push'), - PORTS_KEY: [inport(props=[HIDDEN, NOTES_CC, SCRIPT]), - inport(props=[]), - outport(props=[HIDDEN, - NOTES_CC, - SYNC, - SCRIPT]), - outport(props=[])], - TYPE_KEY: 'push', - FIRMWARE_KEY: get_provided_firmware_version(), - AUTO_LOAD_KEY: True} - -def create_instance(c_instance): - """ Creates and returns the Push script """ - - UbermapDevicesPatches.apply_ubermap_patches() - - return Push(c_instance=c_instance) +# Embedded file name: c:\Jenkins\live\output\win_64_static\Release\python-bundle\MIDI Remote Scripts\Push\__init__.py +from __future__ import absolute_import, print_function, unicode_literals +from ableton.v2.control_surface.capabilities import controller_id, inport, outport, AUTO_LOAD_KEY, CONTROLLER_ID_KEY, FIRMWARE_KEY, HIDDEN, NOTES_CC, PORTS_KEY, SCRIPT, SYNC, TYPE_KEY +from .firmware_handling import get_provided_firmware_version +from .push import Push + +#FIX TO WORK WITH CLYPHX +#from Ubermap import UbermapDevicesPatches +#END OF FIX + +def get_capabilities(): + return {CONTROLLER_ID_KEY: controller_id(vendor_id=2536, product_ids=[21], model_name=u'Ableton Push'), + PORTS_KEY: [inport(props=[HIDDEN, NOTES_CC, SCRIPT]), + inport(props=[]), + outport(props=[HIDDEN, + NOTES_CC, + SYNC, + SCRIPT]), + outport(props=[])], + TYPE_KEY: u'push', + FIRMWARE_KEY: get_provided_firmware_version(), + AUTO_LOAD_KEY: True} + + +def create_instance(c_instance): + u""" Creates and returns the Push script """ + +#FIX TO WORK WITH CLYPHX + from Ubermap import UbermapDevicesPatches +#END OF FIX +#FIX MULTIPLE VERSION BEING +# UbermapDevicesPatches.apply_ubermap_patches() + UbermapDevicesPatches.apply_ubermap_patches(True) +#FIX END + return Push(c_instance=c_instance) \ No newline at end of file diff --git a/Devices/Push/__init__.pyc b/Devices/Push/__init__.pyc new file mode 100644 index 0000000..c14f060 Binary files /dev/null and b/Devices/Push/__init__.pyc differ diff --git a/Devices/Push2/__init__.py b/Devices/Push2/__init__.py index 0154c71..f6aab12 100644 --- a/Devices/Push2/__init__.py +++ b/Devices/Push2/__init__.py @@ -1,27 +1,33 @@ -# Embedded file name: /Users/versonator/Jenkins/live/output/mac_64_static/Release/python-bundle/MIDI Remote Scripts/Push2/__init__.py -from __future__ import absolute_import, print_function - -from Ubermap import UbermapDevicesPatches - -def get_capabilities(): - from ableton.v2.control_surface import capabilities as caps - return {caps.CONTROLLER_ID_KEY: caps.controller_id(vendor_id=10626, product_ids=[6503], model_name='Ableton Push 2'), - caps.PORTS_KEY: [caps.inport(props=[caps.HIDDEN, caps.NOTES_CC, caps.SCRIPT]), - caps.inport(props=[]), - caps.outport(props=[caps.HIDDEN, - caps.NOTES_CC, - caps.SYNC, - caps.SCRIPT]), - caps.outport(props=[])], - caps.TYPE_KEY: 'push2', - caps.AUTO_LOAD_KEY: True} - - -def create_instance(c_instance): - from .push2 import Push2 - from .push2_model import Root, Sender - root = Root(sender=Sender(message_sink=c_instance.send_model_update, process_connected=c_instance.process_connected)) - - UbermapDevicesPatches.apply_ubermap_patches() - - return Push2(c_instance=c_instance, model=root) +# Embedded file name: c:\Jenkins\live\output\win_64_static\Release\python-bundle\MIDI Remote Scripts\Push2\__init__.py +from __future__ import absolute_import, print_function, unicode_literals +#FIX FOR USING WITH CLYPHX +#from Ubermap import UbermapDevicesPatches +#END OF FIX + +def get_capabilities(): + from ableton.v2.control_surface import capabilities as caps + return {caps.CONTROLLER_ID_KEY: caps.controller_id(vendor_id=10626, product_ids=[6503], model_name=u'Ableton Push 2'), + caps.PORTS_KEY: [caps.inport(props=[caps.HIDDEN, caps.NOTES_CC, caps.SCRIPT]), + caps.inport(props=[]), + caps.outport(props=[caps.HIDDEN, + caps.NOTES_CC, + caps.SYNC, + caps.SCRIPT]), + caps.outport(props=[])], + caps.TYPE_KEY: u'push2', + caps.AUTO_LOAD_KEY: True} + + +def create_instance(c_instance): + from .push2 import Push2 + from .push2_model import Root, Sender + root = Root(sender=Sender(message_sink=c_instance.send_model_update, process_connected=c_instance.process_connected)) + +#FIX FOR USING WITH CLYPHX + from Ubermap import UbermapDevicesPatches +#END OF FIX +#FIX MULTIPLE VERSION BEING + UbermapDevicesPatches.apply_ubermap_patches(False) +# UbermapDevicesPatches.apply_ubermap_patches() +#FIX END + return Push2(c_instance=c_instance, model=root) \ No newline at end of file diff --git a/Devices/Push2/__init__.pyc b/Devices/Push2/__init__.pyc new file mode 100644 index 0000000..e04aabf Binary files /dev/null and b/Devices/Push2/__init__.pyc differ diff --git a/Devices/UbermapDevices.py b/Devices/UbermapDevices.py index 3db5064..ff50838 100644 --- a/Devices/UbermapDevices.py +++ b/Devices/UbermapDevices.py @@ -6,7 +6,9 @@ class UbermapDevices: PARAMS_PER_BANK = 8 - SECTION_BANKS = 'Banks' + SECTION_BANKS = 'Banks' + SECTION_PARAMETER_VALUES = 'ParameterValues' + SECTION_PARAMETER_VALUE_TYPES = 'ParameterValueTypes' SECTION_CONFIG = 'Config' device_config_cache = {} @@ -20,6 +22,9 @@ def get_device_name(self, device): return '' name = device.class_display_name +#BBE TEST BEGIN + log.info('load device name='+device.name+' class_name='+device.class_name+' class_display_name='+device.class_display_name) +#BBE TEST END if self.cfg.get('use_md5'): params = '' for i in device.parameters[1:]: @@ -44,28 +49,14 @@ def dump_device(self, device): config = ConfigObj() config.filename = filepath - config[self.SECTION_BANKS] = {} - config[self.SECTION_CONFIG] = {} + config[self.SECTION_BANKS] = {} + config[self.SECTION_PARAMETER_VALUES] = {} + config[self.SECTION_PARAMETER_VALUE_TYPES] = {} + + config[self.SECTION_CONFIG] = {} config[self.SECTION_CONFIG]['Cache'] = False config[self.SECTION_CONFIG]['Ignore'] = True - ''' - Code to dump original ableton mapping - not working - - bank_names = parameter_bank_names(device, skip = True) - banks = parameter_banks(device, skip = True) - - count = 0 - for bank_name in bank_names: - config[SECTION_BANKS][bank_name] = {} - for param in banks[count]: - if(param): - config[SECTION_BANKS][bank_name][param.original_name] = param.original_name - count = count + 1 - #config[SECTION_BEST_OF]['Bank'] = best_of_parameter_bank(device, _ubermap_skip = True) - config[SECTION_BEST_OF]['Bank'] = config[SECTION_BANKS].itervalues().next() - ''' - count = 0 bank = 1 total_count = 1 @@ -95,6 +86,7 @@ def get_device_config(self, device): def get_custom_device_banks(self, device): device_config = self.get_device_config(device) if(not device_config): + self.dump_device(device) return False return device_config.get(self.SECTION_BANKS).keys() @@ -107,11 +99,38 @@ def get_custom_device_params(self, device, bank_name = None): if(not device_config): return False + def parse_custom_parameter_values(values): + # Split the values on || to see if we have custom value start points specified + values_split = map(lambda s: s.split('||'), values) + has_value_start_points = all(len(x) == 2 for x in values_split) + if not has_value_start_points: + return [values, None] + + return [[x[0] for x in values_split], [float(x[1]) for x in values_split]] + + def get_custom_parameter_values(parameter_name): + values = device_config.get(self.SECTION_PARAMETER_VALUES, parameter_name) + if not values: + return [None, None] + + # If we have an array, i.e. comma separated list, just use that + if isinstance(values, list): + return parse_custom_parameter_values(values) + + # Otherwise try and look up the string key in ParameterValueTypes and use that + values_type = device_config.get(self.SECTION_PARAMETER_VALUE_TYPES, values) + if values_type: + return parse_custom_parameter_values(values_type) + def get_parameter_by_name(device, nameMapping): count = 0 for i in device.parameters: if nameMapping[0] == str(count) + "_" + i.original_name or nameMapping[0] == i.original_name: + log.info("got " + nameMapping[1] + " for " + nameMapping[0]) i.custom_name = nameMapping[1] + + [i.custom_parameter_values, i.custom_parameter_start_points] = get_custom_parameter_values(nameMapping[0]) + return i count = count + 1 diff --git a/Devices/UbermapDevicesPatches.py b/Devices/UbermapDevicesPatches.py index 866b804..8a00333 100644 --- a/Devices/UbermapDevicesPatches.py +++ b/Devices/UbermapDevicesPatches.py @@ -2,36 +2,34 @@ # Applies "monkey patches" to methods within Live's Push implementation to support custom parameter mapping # https://github.com/tomduncalf/ubermap -# Ubermap imports +# Ubermap from Ubermap import UbermapDevices -from Ubermap.UbermapLibs import log - -# DeviceParameterComponent -from pushbase.device_parameter_component import DeviceParameterComponent - -# DeviceParameterBank -from pushbase.device_parameter_bank import DeviceParameterBank - -# BankingUtil -from pushbase import banking_util - -# DeviceComponent -from pushbase.device_component import DeviceComponent -from pushbase.parameter_provider import ParameterInfo - -# Logging +from Ubermap.UbermapLibs import log, config import inspect -# Create singleton UbermapDevices instance -ubermap = UbermapDevices.UbermapDevices() +#def is_v1(): +# return push_version == '1' -def apply_ubermap_patches(): +#FIX MULTIPLE VERSION BEING +#def apply_ubermap_patches(): +def apply_ubermap_patches(is_v1): +#FIX END log.info("Applying UbermapDevices patches") apply_log_method_patches() apply_banking_util_patches() - apply_device_component_patches() +#FIX MULTIPLE VERSION BEING +# apply_device_component_patches() + apply_device_component_patches(is_v1) +#FIX END apply_device_parameter_bank_patches() + apply_device_parameter_adapater_patches() + apply_device_image_filename() + +# Create singleton UbermapDevices instance +ubermap = UbermapDevices.UbermapDevices() +ubermap_config = config.load('global') +#push_version = ubermap_config.get('Push', 'Version') def apply_log_method_patches(): # Log any method calls made to the object - useful for tracing execution flow @@ -42,6 +40,11 @@ def __getattribute__(self, name): log.info('Called ' + self.__class__.__name__ + '::' + str(returned.__name__)) return returned +############################################################################################################ + +# BankingUtil +from pushbase import banking_util + def apply_banking_util_patches(): # device_bank_names - return Ubermap bank names if defined, otherwise use the default device_bank_names_orig = banking_util.device_bank_names @@ -68,23 +71,10 @@ def device_bank_count(device, bank_size = 8, definition = None, definitions = No banking_util.device_bank_count = device_bank_count -def apply_device_component_patches(): - # _get_provided_parameters - return Ubermap parameter names if defined, otherwise use the default - _get_provided_parameters_orig = DeviceComponent._get_provided_parameters - - def _get_provided_parameters(self): - ubermap_params = ubermap.get_custom_device_params(self._decorated_device) - - if ubermap_params: - param_bank = ubermap_params[self._bank.index] - #param_info = map(lambda param: ParameterInfo(parameter=param, name=param.custom_name), param_bank) - param_info = map(lambda parameter: ParameterInfo(parameter=parameter, name=parameter.custom_name, default_encoder_sensitivity=self.default_sensitivity(parameter), fine_grain_encoder_sensitivity=self.fine_sensitivity(parameter)), param_bank) - return param_info +############################################################################################################ - orig_params = _get_provided_parameters_orig(self) - return orig_params - - DeviceComponent._get_provided_parameters = _get_provided_parameters +# DeviceParameterBank +from pushbase.device_parameter_bank import DeviceParameterBank def apply_device_parameter_bank_patches(): # _collect_parameters - this method is called by _update_parameters to determine whether we should @@ -103,3 +93,121 @@ def _collect_parameters(self): return orig DeviceParameterBank._collect_parameters = _collect_parameters + +############################################################################################################ + +# DeviceComponent +from pushbase.device_component import DeviceComponent +from pushbase.parameter_provider import ParameterInfo + +#FIX MULTIPLE VERSION BEING +def apply_device_component_patches(is_v1): + # _get_provided_parameters - return Ubermap parameter names if defined, otherwise use the default + _get_provided_parameters_orig = DeviceComponent._get_provided_parameters + + if is_v1: + from Push.parameter_mapping_sensitivities import parameter_mapping_sensitivity, fine_grain_parameter_mapping_sensitivity + else: + from Push2.parameter_mapping_sensitivities import parameter_mapping_sensitivity, fine_grain_parameter_mapping_sensitivity +#FIX END + + def _get_parameter_info(self, parameter): + if not parameter: + return None + return ParameterInfo(parameter=parameter, name=parameter.custom_name, default_encoder_sensitivity=parameter_mapping_sensitivity(parameter), fine_grain_encoder_sensitivity=fine_grain_parameter_mapping_sensitivity(parameter)) + + def _get_provided_parameters(self): + ubermap_params = ubermap.get_custom_device_params(self._decorated_device) + + if ubermap_params: + param_bank = ubermap_params[self._bank.index] + param_info = map(lambda parameter: _get_parameter_info(self, parameter), param_bank) + return param_info + + orig_params = _get_provided_parameters_orig(self) + return orig_params + + DeviceComponent._get_provided_parameters = _get_provided_parameters + +############################################################################################################ + +# DeviceParameterAdapter +from ableton.v2.base import listenable_property +from Push2.model.repr import DeviceParameterAdapter +from math import floor + +def apply_device_parameter_adapater_patches(): + def name(self): + if hasattr(self._adaptee, 'custom_name'): + return self._adaptee.custom_name + else: + return self._adaptee.name + + DeviceParameterAdapter.name = listenable_property(name) + + def valueItems(self): + if getattr(self._adaptee, 'custom_parameter_values', None): + return self._adaptee.custom_parameter_values + else: + if self._adaptee.is_quantized: + return self._adaptee.value_items + return [] + + DeviceParameterAdapter.valueItems = listenable_property(valueItems) + + def value_to_start_point_index(value, start_points): + log.debug("start_points: " + str(start_points) + ", len: " + str(len(start_points)) + ", value: " + str(value)) + for index, start_point in enumerate(start_points): + log.debug("index: " + str(index) + ", start_point: " + str(start_point) + ", value: " + str(value)) + if value > start_point and (index == len(start_points) - 1 or value < start_points[index + 1]): + log.debug("Input value: " + str(value) + ", output index: " + str(index) + " with custom start points") + return index + + def value_to_index(value, parameter_values): + values_len = len(parameter_values) + value_index = floor(value * values_len) + + # If the value is 1.00 we don't want an off by one error + value_index = value_index - 1 if value_index == values_len else value_index + + log.debug("Input value: " + str(value) + ", output index: " + str(value_index)) + + return value_index + + def value(self): + if getattr(self._adaptee, 'custom_parameter_values', None): + if getattr(self._adaptee, 'custom_parameter_start_points', None): + return value_to_start_point_index(self._adaptee.value, self._adaptee.custom_parameter_start_points) + else: + return value_to_index(self._adaptee.value, self._adaptee.custom_parameter_values) + else: + return self._adaptee.value + + DeviceParameterAdapter.value = listenable_property(value) + +############################################################################################################ + +# DeviceParameterAdapter +from ableton.v2.base import liveobj_valid +from Push2.device_parameter_icons import get_image_filenames, get_image_filenames_from_ids + +def apply_device_image_filename(): + def _get_image_filenames(self, small_images = False): + device = self.canonical_parent + if not hasattr(device, u'class_name'): + return [] + else: + custom_images = None + if liveobj_valid(device): + try: + custom_images = device.get_value_item_icons(getattr(self._adaptee, u'original_parameter', self._adaptee)) +# except (AttributeError, RuntimeError): +# except (AttributeError, RuntimeError, ArgumentError): + except (AttributeError, RuntimeError): + pass + except (ArgumentError): + return [] + + if custom_images is not None: + return get_image_filenames_from_ids(custom_images, small_images) + return get_image_filenames(self.original_name, device.class_name, small_images) \ No newline at end of file diff --git a/UbermapDevicesPatches.py b/UbermapDevicesPatches.py new file mode 100644 index 0000000..8a00333 --- /dev/null +++ b/UbermapDevicesPatches.py @@ -0,0 +1,213 @@ +# Ubermap Devices patches +# Applies "monkey patches" to methods within Live's Push implementation to support custom parameter mapping +# https://github.com/tomduncalf/ubermap + +# Ubermap +from Ubermap import UbermapDevices +from Ubermap.UbermapLibs import log, config +import inspect + +#def is_v1(): +# return push_version == '1' + +#FIX MULTIPLE VERSION BEING +#def apply_ubermap_patches(): +def apply_ubermap_patches(is_v1): +#FIX END + log.info("Applying UbermapDevices patches") + + apply_log_method_patches() + apply_banking_util_patches() +#FIX MULTIPLE VERSION BEING +# apply_device_component_patches() + apply_device_component_patches(is_v1) +#FIX END + apply_device_parameter_bank_patches() + apply_device_parameter_adapater_patches() + apply_device_image_filename() + +# Create singleton UbermapDevices instance +ubermap = UbermapDevices.UbermapDevices() +ubermap_config = config.load('global') +#push_version = ubermap_config.get('Push', 'Version') + +def apply_log_method_patches(): + # Log any method calls made to the object - useful for tracing execution flow + # Use like: DeviceComponent.__getattribute__ = __getattribute__ + def __getattribute__(self, name): + returned = object.__getattribute__(self, name) + if inspect.isfunction(returned) or inspect.ismethod(returned): + log.info('Called ' + self.__class__.__name__ + '::' + str(returned.__name__)) + return returned + +############################################################################################################ + +# BankingUtil +from pushbase import banking_util + +def apply_banking_util_patches(): + # device_bank_names - return Ubermap bank names if defined, otherwise use the default + device_bank_names_orig = banking_util.device_bank_names + + def device_bank_names(device, bank_size = 8, definitions = None): + ubermap_banks = ubermap.get_custom_device_banks(device) + if ubermap_banks: + return ubermap_banks + ubermap.dump_device(device) + + return device_bank_names_orig(device, bank_size, definitions) + + banking_util.device_bank_names = device_bank_names + + # device_bank_count - return Ubermap bank count if defined, otherwise use the default + device_bank_count_orig = banking_util.device_bank_count + + def device_bank_count(device, bank_size = 8, definition = None, definitions = None): + ubermap_banks = ubermap.get_custom_device_banks(device) + if ubermap_banks: + return len(ubermap_banks) + + return device_bank_count_orig(device, bank_size, definition, definitions) + + banking_util.device_bank_count = device_bank_count + +############################################################################################################ + +# DeviceParameterBank +from pushbase.device_parameter_bank import DeviceParameterBank + +def apply_device_parameter_bank_patches(): + # _collect_parameters - this method is called by _update_parameters to determine whether we should + # notify that parameters have been updated or not, but is hardcoded to use the default bank size + # (i.e. full banks of 8), so Ubermap banks with <8 parameters cause later banks to break. Instead return + # the relevant Ubermap bank if defined, otherwise use the default. + _collect_parameters_orig = DeviceParameterBank._collect_parameters + + def _collect_parameters(self): + ubermap_banks = ubermap.get_custom_device_banks(self._device) + if ubermap_banks: + bank = ubermap_banks[self._get_index()] + return bank + + orig = _collect_parameters_orig(self) + return orig + + DeviceParameterBank._collect_parameters = _collect_parameters + +############################################################################################################ + +# DeviceComponent +from pushbase.device_component import DeviceComponent +from pushbase.parameter_provider import ParameterInfo + +#FIX MULTIPLE VERSION BEING +def apply_device_component_patches(is_v1): + # _get_provided_parameters - return Ubermap parameter names if defined, otherwise use the default + _get_provided_parameters_orig = DeviceComponent._get_provided_parameters + + if is_v1: + from Push.parameter_mapping_sensitivities import parameter_mapping_sensitivity, fine_grain_parameter_mapping_sensitivity + else: + from Push2.parameter_mapping_sensitivities import parameter_mapping_sensitivity, fine_grain_parameter_mapping_sensitivity +#FIX END + + def _get_parameter_info(self, parameter): + if not parameter: + return None + return ParameterInfo(parameter=parameter, name=parameter.custom_name, default_encoder_sensitivity=parameter_mapping_sensitivity(parameter), fine_grain_encoder_sensitivity=fine_grain_parameter_mapping_sensitivity(parameter)) + + def _get_provided_parameters(self): + ubermap_params = ubermap.get_custom_device_params(self._decorated_device) + + if ubermap_params: + param_bank = ubermap_params[self._bank.index] + param_info = map(lambda parameter: _get_parameter_info(self, parameter), param_bank) + return param_info + + orig_params = _get_provided_parameters_orig(self) + return orig_params + + DeviceComponent._get_provided_parameters = _get_provided_parameters + +############################################################################################################ + +# DeviceParameterAdapter +from ableton.v2.base import listenable_property +from Push2.model.repr import DeviceParameterAdapter +from math import floor + +def apply_device_parameter_adapater_patches(): + def name(self): + if hasattr(self._adaptee, 'custom_name'): + return self._adaptee.custom_name + else: + return self._adaptee.name + + DeviceParameterAdapter.name = listenable_property(name) + + def valueItems(self): + if getattr(self._adaptee, 'custom_parameter_values', None): + return self._adaptee.custom_parameter_values + else: + if self._adaptee.is_quantized: + return self._adaptee.value_items + return [] + + DeviceParameterAdapter.valueItems = listenable_property(valueItems) + + def value_to_start_point_index(value, start_points): + log.debug("start_points: " + str(start_points) + ", len: " + str(len(start_points)) + ", value: " + str(value)) + for index, start_point in enumerate(start_points): + log.debug("index: " + str(index) + ", start_point: " + str(start_point) + ", value: " + str(value)) + if value > start_point and (index == len(start_points) - 1 or value < start_points[index + 1]): + log.debug("Input value: " + str(value) + ", output index: " + str(index) + " with custom start points") + return index + + def value_to_index(value, parameter_values): + values_len = len(parameter_values) + value_index = floor(value * values_len) + + # If the value is 1.00 we don't want an off by one error + value_index = value_index - 1 if value_index == values_len else value_index + + log.debug("Input value: " + str(value) + ", output index: " + str(value_index)) + + return value_index + + def value(self): + if getattr(self._adaptee, 'custom_parameter_values', None): + if getattr(self._adaptee, 'custom_parameter_start_points', None): + return value_to_start_point_index(self._adaptee.value, self._adaptee.custom_parameter_start_points) + else: + return value_to_index(self._adaptee.value, self._adaptee.custom_parameter_values) + else: + return self._adaptee.value + + DeviceParameterAdapter.value = listenable_property(value) + +############################################################################################################ + +# DeviceParameterAdapter +from ableton.v2.base import liveobj_valid +from Push2.device_parameter_icons import get_image_filenames, get_image_filenames_from_ids + +def apply_device_image_filename(): + def _get_image_filenames(self, small_images = False): + device = self.canonical_parent + if not hasattr(device, u'class_name'): + return [] + else: + custom_images = None + if liveobj_valid(device): + try: + custom_images = device.get_value_item_icons(getattr(self._adaptee, u'original_parameter', self._adaptee)) +# except (AttributeError, RuntimeError): +# except (AttributeError, RuntimeError, ArgumentError): + except (AttributeError, RuntimeError): + pass + except (ArgumentError): + return [] + + if custom_images is not None: + return get_image_filenames_from_ids(custom_images, small_images) + return get_image_filenames(self.original_name, device.class_name, small_images) \ No newline at end of file