Behavior

hgf uses the observer pattern to separate interface from behavior. hgf.model provides the base class Subject to be inherited by any class modeling the behavior of a StructuralComponent. Every Subject can set a list of features (self.state_properties) that influence the external appearance of the StructuralComponent, so that it can be redrawn only when necessary.

For example, consider a StructuralComponent representing a card in a card game. The card can be face up or face down, and the player can select it. We can use a Subject to model this behavior:

class Card(model.Subject):
    def __init__(self):
        super().__init__()
        
        self.selected = False
        self.face_up = True
        
        self.state_properties = 'selected', 'face_up'
    
    ...

Whenever the value of selected or face_up changes, the card will automatically be redrawn on screen. For any feature of the Subject that influences external appearance but doesn't have a corresponding attribute, you can define a property instead.