Issues (19)

synergine/core/display/ObjectVisualizer.py (1 issue)

1
from synergine.core.config.ConfigurationManager import ConfigurationManager
2
from synergine.synergy.object.SynergyObject import SynergyObject
3
from synergine.core.exception.NotFoundError import NotFoundError
4
5
6
class ObjectVisualizer():
7
    """
8
    TODO: Il y a eu un ajout, notion de surface directement en plus des objets.
9
          Du coups c'est sale et pas DRY. A reviser.
10
    """
11
12
    def __init__(self, config: dict, context):
13
        config_manager = ConfigurationManager(config)
14
        self._visualisation_configuration = config_manager.get('objects', {})
15
        self._surface_configuration = config_manager.get('surfaces', {})
16
        self._objects_class_mapped = {}
17
        self._context = context
18
        self._callback_position = config_manager.get('callbacks.position', 0)
19
20
    def get_visual(self, obj: SynergyObject):
21
        visualisation_definition = self._get_visual_definition(obj)
22
        if 'callbacks' in visualisation_definition:
23
            for callback in visualisation_definition['callbacks']:
24
                callback_return = callback(obj, self._context)
25
                # TODO: Exception au lieu de False
26
                if callback_return is not False:
27
                    return self._apply_modifiers_on_visual(visualisation_definition, obj, callback_return)
28
        return self._apply_modifiers_on_visual(visualisation_definition, obj, visualisation_definition['default'])
29
30
    def _apply_modifiers_on_visual(self, visualisation_definition, obj, visual):
31
        new_visual = visual
32
        if 'modifiers' in visualisation_definition:
33
            for modifier in visualisation_definition['modifiers']:
34
                new_visual = modifier(obj, self._context, visual)
35
        return new_visual
36
37
    def get_surface(self, surface_name, parameters={}):
38
        surface_definition = self._get_surface_definition(surface_name)
39
        if 'callbacks' in surface_definition:
40
            for callback in surface_definition['callbacks']:
41
                callback_return = callback(parameters, self._context)
42
                # TODO: Exception au lieu de False
43
                if callback_return is not False:
44
                    return callback_return.get_surface()
45
        return surface_definition['default'].get_surface()
46
47
    def get_for_position(self, position, objects):
48
        if self._callback_position:
49
            return self._callback_position(position, objects, self._context)
50
        return None, []
51
52
    # TODO: fix bug: on doit mettre en cache dans self._objects_class_mapped le dict {default... et non pas le resultat
53
    def _get_visual_definition_for_class(self, class_name, obj):
0 ignored issues
show
Coding Style Naming introduced by
The name _get_visual_definition_for_class does not conform to the method naming conventions ([a-z_][a-z0-9_]{2,30}$).

This check looks for invalid names for a range of different identifiers.

You can set regular expressions to which the identifiers must conform if the defaults do not match your requirements.

If your project includes a Pylint configuration file, the settings contained in that file take precedence.

To find out more about Pylint, please refer to their site.

Loading history...
54
        if obj.__class__ in self._visualisation_configuration:
55
            return self._visualisation_configuration[obj.__class__]
56
        for object_visualisation_class in self._visualisation_configuration:
57
            if isinstance(obj, object_visualisation_class):
58
                return self._visualisation_configuration[object_visualisation_class]
59
        raise NotFoundError()
60
61
    def _get_default_visualisation(self):
62
        if SynergyObject not in self._visualisation_configuration:
63
            raise Exception("Enable to found SynergyObject visualisation")
64
        return self._visualisation_configuration[SynergyObject]['default']
65
66
    def _get_visual_definition(self, obj: SynergyObject):
67
        class_name = obj.__class__.__name__
68
        if class_name not in self._objects_class_mapped:
69
            try:
70
                object_visualisation_definition = self._get_visual_definition_for_class(class_name, obj)
71
            except NotFoundError:
72
                object_visualisation_definition = self._get_default_visualisation()
73
            self._objects_class_mapped[class_name] = object_visualisation_definition
74
75
        return self._objects_class_mapped[class_name]
76
77
    def _get_surface_definition(self, surface_name):
78
        return self._surface_configuration[surface_name]