# Feature.py
# By MW, Jul 2013
# GPLv3+
#
# Feature classes
#+In the end, should it use TimeTrack classes?
import logging
[docs]class Feature :
    """A generic class to define a feature"""
    def __init__(self, name, sh_name, color, descr, model=None) :
        self.typ = 'feature'
        self.name = name
        self.short_name = sh_name
        self.color = color
        self.descr = descr
        self.model = model
[docs]    def get_save_dict(self) :
        dic = {}
        dic['typ'] = {'descr' : 'Type of the feature', 'value' : self.typ}
        dic['name'] = {'descr' : 'Name of the feature', 'value' : self.name}
        dic['short_name'] = {'descr' : 'Short name of the feature', 'value' : self.short_name}
        dic['color'] = {'descr' : 'Color', 'value' : self.color}
        dic['descr'] = {'descr' : 'Description of the feature', 'value' : self.descr} # TYPO FIXED IN V6
        dic['model'] = {'descr' : 'Model associated with the feature', 'value' : self.model}
        return {'descr' : 'Class describing a feature', 'value' : dic} 
[docs]    def load_save_dict(self, dic) :
        self.typ = dic['typ']['value']
        self.name = dic['name']['value']
        self.short_name = dic['short_name']['value']
        self.color = dic['color']['value']
        self.descr = dic['descr']['value'] # TYPO FIXED IN V6
        self.model = dic['model']['value']
 
[docs]    def get_color(self) :
        return self.color 
[docs]    def get_name(self) :
        return self.name 
[docs]    def get_short_name(self) :
        return self.short_name 
[docs]    def get_type(self) :
        return self.typ
  
[docs]class Point(Feature) :
    def __init__(self, name, sh_name, color, descr, model=None) :
        Feature.__init__(self, name, sh_name, color, descr, model)
        self.typ = 'point'
        self.point = None
[docs]    def get_point(self) :
        return self.point 
[docs]    def set_point(self, frame) :
        """frame should be an integer"""
        logging.info("Setting point at frame %s", frame)
        print "point", frame
        self.point = frame 
[docs]    def get_save_dict(self) :
        dic = Feature.get_save_dict(self)
        dic['value']['point'] = {'descr' : 'frame where the feature applies', 'value' :  self.point}
        return dic 
[docs]    def load_save_dict(self, dic) :
        Feature.load_save_dict(self, dic)
        self.set_point(dic['point']['value'])
  
[docs]class Multipoint(Feature) :
    """Should multipoint inherit from Point rather than Feature?"""
    def __init__(self, name, sh_name, color, descr, model=None) :
        Feature.__init__(self, name, sh_name, color, descr, model)
        self.typ = 'multipoint'
 
[docs]class Segment(Feature) :
    def __init__(self, name, sh_name, color, descr, model=None) :
        Feature.__init__(self, name, sh_name, color, descr, model)
        self.typ = 'segment'
        self.segment = (None, None)
[docs]    def get_segment(self) :
        return self.segment 
[docs]    def set_segment(self, seg) :
        """A segment is a tuple (begin_frame, end_frame)"""
        self.segment = seg 
[docs]    def get_save_dict(self) :
        dic = Feature.get_save_dict(self)
        dic['value']['segment'] = {'descr' : 'frames where the feature applies', 'value' :  self.segment}
        return dic 
[docs]    def load_save_dict(self, dic) :
        Feature.load_save_dict(self, dic)
        #self.segment = dic['segment']['value']
        self.set_segment(dic['segment']['value'])
  
[docs]class Cell(Segment) :
    """Class to represent a Cell object"""
    def __init__(self, name, sh_name, color, descr, model=None) :
        Segment.__init__(self, name, sh_name, color, descr, model)
        self.typ = 'cell'
[docs]    def set_cell(self, c) :
        self.cell = c
        self.update() 
[docs]    def update(self) :
        self.segment = self.cell.get_bounds()
    #def get_save_dict(self) :
    #    dic = Feature.__init__(self)
    #    dic['value']['cell'] = {'descr' : 'cell', 'value' :  self.cell}
  
[docs]class Multisegment(Feature) :
    def __init__(self, name, sh_name, color, descr, model=None) :
        Feature.__init__(self, name, sh_name, color, descr, model)
        self.typ = 'multisegment'